geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/0002770000175200017530000000000012664543647020422 5ustar guillaumeguillaumegeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/Makefile0000660000175200017530000001253712664543647022071 0ustar guillaumeguillaume# $Id: Makefile,v 5.7 2009-03-11 10:53:30 ddr Exp $ PREFIX=/usr LANGDIR=$(PREFIX)/share/geneweb MANDIR=$(PREFIX)/man/man1 DESTDIR=distribution MANPAGES=ged2gwb.1 gwb2ged.1 gwc.1 gwc2.1 gwu.1 gwd.1 consang.1 gwsetup.1 include tools/Makefile.inc all:: opt out:: cd wserver; $(MAKE) all cd dag2html; $(MAKE) out cd src; $(MAKE) PREFIX=$(PREFIX) all cd ged2gwb; $(MAKE) all cd gwb2ged; $(MAKE) all cd setup; $(MAKE) all cd gwtp; $(MAKE) all opt:: cd wserver; $(MAKE) opt cd dag2html; $(MAKE) opt cd src; $(MAKE) PREFIX=$(PREFIX) opt cd ged2gwb; $(MAKE) opt cd gwb2ged; $(MAKE) opt cd setup; $(MAKE) opt cd gwtp; $(MAKE) opt install: mkdir -p $(PREFIX)/bin cp src/gwc $(PREFIX)/bin/gwc$(EXE) cp src/gwc1 $(PREFIX)/bin/gwc1$(EXE) cp src/gwc2 $(PREFIX)/bin/gwc2$(EXE) cp src/consang $(PREFIX)/bin/consang$(EXE) cp src/gwd $(PREFIX)/bin/gwd$(EXE) cp src/gwu $(PREFIX)/bin/gwu$(EXE) cp ged2gwb/ged2gwb $(PREFIX)/bin/ged2gwb$(EXE) cp ged2gwb/ged2gwb2 $(PREFIX)/bin/ged2gwb2$(EXE) cp gwb2ged/gwb2ged $(PREFIX)/bin/gwb2ged$(EXE) mkdir -p $(LANGDIR)/lang cp hd/lang/*.txt $(LANGDIR)/lang/. mkdir -p $(LANGDIR)/images mkdir -p $(LANGDIR)/images/flags cp hd/images/flags/*.jpg hd/images/flags/*.png $(LANGDIR)/images/flags/. cp hd/images/*.jpg hd/images/*.png hd/images/*.ico $(LANGDIR)/images/. mkdir -p $(LANGDIR)/etc cp -R hd/etc/* $(LANGDIR)/etc/. find $(LANGDIR)/etc/ -name .svn -type d -prune -exec rm -rf {} \; mkdir -p $(MANDIR) cd man; cp $(MANPAGES) $(MANDIR)/. uninstall: rm -f $(PREFIX)/bin/gwc$(EXE) rm -f $(PREFIX)/bin/gwc1$(EXE) rm -f $(PREFIX)/bin/gwc2$(EXE) rm -f $(PREFIX)/bin/consang$(EXE) rm -f $(PREFIX)/bin/gwd$(EXE) rm -f $(PREFIX)/bin/gwu$(EXE) rm -f $(PREFIX)/bin/ged2gwb$(EXE) rm -f $(PREFIX)/bin/gwb2ged$(EXE) rm -rf $(PREFIX)/share/geneweb cd $(MANDIR); rm -f $(MANPAGES) distrib: new_distrib wrappers wrappers: if test "$(CAMLP5F)" = "-DWIN95"; then \ echo -ne 'setlocal enableextensions\r\n' > $(DESTDIR)/gwd.bat; \ echo -ne 'md bases\r\n' >> $(DESTDIR)/gwd.bat; \ echo -ne 'endlocal\r\n' >> $(DESTDIR)/gwd.bat; \ echo -ne 'cd bases\r\n' >> $(DESTDIR)/gwd.bat; \ echo -ne 'start /MIN ..\\gw\\gwd -hd ..\\gw\r\n' >> $(DESTDIR)/gwd.bat; \ echo -ne 'setlocal enableextensions\r\n' > $(DESTDIR)/gwsetup.bat; \ echo -ne 'md bases\r\n' >> $(DESTDIR)/gwsetup.bat; \ echo -ne 'endlocal\r\n' >> $(DESTDIR)/gwsetup.bat; \ echo -ne 'cd bases\r\n' >> $(DESTDIR)/gwsetup.bat; \ echo -ne 'start /MIN ..\\gw\\gwsetup -lang fr -gd ..\\gw\r\n' >> $(DESTDIR)/gwsetup.bat; \ else \ (echo '#!/bin/sh'; \ echo 'mkdir -p bases'; \ echo 'cd bases'; \ echo 'exec ../gw/gwd -hd ../gw "$$@"') > $(DESTDIR)/gwd; \ (echo '#!/bin/sh'; \ echo 'mkdir -p bases'; \ echo 'cd bases'; \ echo 'exec ../gw/gwsetup -gd ../gw "$$@"') > $(DESTDIR)/gwsetup; \ chmod +x $(DESTDIR)/gwd $(DESTDIR)/gwsetup; \ fi new_distrib: classical_distrib mkdir t mv $(DESTDIR) t/gw mv t $(DESTDIR) mkdir $(DESTDIR)/gw/old mkdir $(DESTDIR)/gw/setup cp setup/intro.txt $(DESTDIR)/gw/setup/. mkdir $(DESTDIR)/gw/setup/lang if test "$(CAMLP5F)" = "-DWIN95"; then \ cp setup/lang/intro.txt.dos $(DESTDIR)/gw/setup/lang/intro.txt; \ else \ cp setup/lang/intro.txt $(DESTDIR)/gw/setup/lang/intro.txt; \ fi cp setup/lang/*.htm $(DESTDIR)/gw/setup/lang/. cp setup/lang/lexicon.txt $(DESTDIR)/gw/setup/lang/. cp setup/gwsetup $(DESTDIR)/gw/gwsetup$(EXE) cp LICENSE $(DESTDIR)/LICENSE.txt cp etc/START.htm $(DESTDIR)/. cp CHANGES $(DESTDIR)/CHANGES.txt echo "127.0.0.1" > $(DESTDIR)/gw/only.txt echo "-setup_link" > $(DESTDIR)/gw/gwd.arg classical_distrib: $(RM) -rf $(DESTDIR) mkdir $(DESTDIR) cp src/gwc $(DESTDIR)/gwc$(EXE) cp src/gwc1 $(DESTDIR)/gwc1$(EXE) cp src/gwc2 $(DESTDIR)/gwc2$(EXE) cp src/consang $(DESTDIR)/consang$(EXE) cp src/gwd $(DESTDIR)/gwd$(EXE) cp src/gwu $(DESTDIR)/gwu$(EXE) cp src/update_nldb $(DESTDIR)/update_nldb$(EXE) cp ged2gwb/ged2gwb $(DESTDIR)/ged2gwb$(EXE) cp ged2gwb/ged2gwb2 $(DESTDIR)/ged2gwb2$(EXE) cp gwb2ged/gwb2ged $(DESTDIR)/gwb2ged$(EXE) mkdir $(DESTDIR)/gwtp_tmp mkdir $(DESTDIR)/gwtp_tmp/lang cp gwtp/gwtp $(DESTDIR)/gwtp_tmp/gwtp$(EXE) cp gwtp/README $(DESTDIR)/gwtp_tmp/. cp gwtp/lang/*.txt $(DESTDIR)/gwtp_tmp/lang/. cp etc/a.gwf $(DESTDIR)/. mkdir $(DESTDIR)/lang cp hd/lang/*.txt $(DESTDIR)/lang/. mkdir $(DESTDIR)/images mkdir $(DESTDIR)/images/flags cp hd/images/flags/*.jpg hd/images/flags/*.png $(DESTDIR)/images/flags/. cp hd/images/*.jpg hd/images/*.png hd/images/*.ico $(DESTDIR)/images/. mkdir $(DESTDIR)/etc cp -R hd/etc/* $(DESTDIR)/etc/. find $(DESTDIR)/etc/ -name .svn -type d -prune -exec rm -rf {} \; windows_files: @for i in distribution/*.txt distribution/gw/*.txt; do \ echo "========================================="; \ echo $$i; \ cp $$i $$i~; \ sed -e 's/$$/\r/' $$i~ > $$i; \ rm $$i~; \ done clean:: cd wserver; $(MAKE) clean cd dag2html; $(MAKE) clean cd src; $(MAKE) clean cd ged2gwb; $(MAKE) clean cd gwb2ged; $(MAKE) clean cd setup; $(MAKE) clean cd gwtp; $(MAKE) clean $(RM) -rf $(DESTDIR) $(RM) -f *~ .#* clean_mismatch: rm src/pa_lock.cmo src/pa_html.cmo src/def_syn.cmo depend: cd src; $(MAKE) pr_dep.cmo def_syn.cmo gwlib.ml cd src; $(MAKE) pa_lock.cmo pa_html.cmo q_codes.cmo cd wserver; $(MAKE) depend cd src; $(MAKE) depend cd ged2gwb; $(MAKE) depend cd gwb2ged; $(MAKE) depend cd setup; $(MAKE) depend cd gwtp; $(MAKE) depend geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/gwtp/0002770000175200017530000000000012664543647021403 5ustar guillaumeguillaumegeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/gwtp/Makefile0000660000175200017530000000215212664543647023042 0ustar guillaumeguillaume# $Id: Makefile,v 5.18 2007-09-12 09:58:44 ddr Exp $ include ../tools/Makefile.inc OCAMLI=-I ../src GWTP_OTHER=../src/lock.cmo ../src/buff.cmo ../src/name.cmo ../src/iovalue.cmo ../src/adef.cmo ../src/mutil.cmo ../src/futil.cmo ../src/dutil.cmo ../src/secure.cmo ../src/btree.cmo ../src/database.cmo ../src/db2.cmo ../src/db2disk.cmo ../src/diff.cmo ../src/outbase.cmo ../src/gwdb.cmo ../src/checkItem.cmo ../src/gutil.cmo ../src/translate.cmo GWTP_OBJS=httpEnv.cmo iolight.cmo gwtp.cmo OBJS=$(GWTP_OTHER) $(GWTP_OBJS) RECOVER_OBJS=$(GWTP_OTHER) iolight.cmo recover.cmo all:: out out:: gwtp.out $(RM) gwtp cp gwtp.out gwtp opt:: gwtp.opt $(RM) gwtp cp gwtp.opt gwtp $(STRIP) gwtp recover: recover.out clean:: $(RM) gwtp gwtp.out: $(GWTP_OBJS) $(OCAMLC) -custom $(STATIC) unix.cma $(OBJS) $(LIBUNIX) -o gwtp.out gwtp.opt: $(GWTP_OBJS:.cmo=.cmx) $(OCAMLOPT) $(STATIC) unix.cmxa $(OBJS:.cmo=.cmx) $(LIBUNIX) -o gwtp.opt recover.out: $(RECOVER_OBJS) $(OCAMLC) unix.cma $(RECOVER_OBJS) $(LIBUNIX) -o $@ depend: TOP=.. ../tools/camlp5_depend.sh $(OCAMLI) *.ml > .depend.new mv .depend.new .depend include .depend geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/gwtp/lang/0002770000175200017530000000000012664543647022324 5ustar guillaumeguillaumegeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/gwtp/lang/lexicon.txt0000660000175200017530000002000112664543647024516 0ustar guillaumeguillaume# $Id: lexicon.txt,v 5.2 2007-01-19 01:53:16 ddr Exp $ # Copyright (c) 1998-2007 INRIA !languages af: af=Afrikaans/ca=Catalan/cs=Czeck/da=Deens/de=Duits/en=Engels/eo=Esperanto/es=Spaans/fi=Fins/fr=Frans/he=Hibreeus/is=Yslandies/it=Italiaans/nl=Nederlands/no=Noorweegs/pl=Pools/pt=Portugees/pt-br=Portugees-in-Brazilië/ru=Russies/sv=Sweeds/zh=Chinees bg: af=áóðñêè/bg=áúëãàðñêè/ca=êàòàëîíñêè/cs=÷åøêè/da=äàòñêè/de=íåìñêè/en=àíãëèéñêè/eo=åñïåðàíòî/es=èñïàíñêè/et=åñòîíñêè/fi=ôèíëàíäñêè/fr=ôðåíñêè/he=èâðèò/is=èñëàíäñêè/it=èòàëèàíñêè/lv=ëàòâèéñêè/nl=õîëàíäñêè/no=íîðâåæêè/pl=ïîëñêè/pt=ïîðòóãàëñêè/pt-br=áðàçèëñêî-ïîðòóãàëñêè/ro=ðóìúíñêè/ru=ðóñêè/sl=ñëîâåíñêè/sv=øâåäñêè/zh=êèòàéñêè br: af=afrikaaneg/bg=bulgareg/br=brezhoneg/ca=katalaneg/cs=tchekeg/da=daneg/de=alamaneg/en=saozneg/eo=esperanteg/es=spagnoleg/et=estonieg/fi=finneg/fr=galleg/he=hebreeg/is=islandeg/it=italianeg/lv=letoneg/nl=izelvroeg/no=norvegieg/pl=poloneg/pt=portugaleg/pt-br=portugaleg bro-Vrazil/ro=roumaneg/ru=rusianeg/sl=sloveneg/sv=svedeg/zh=sinaeg ca: af=africà/ca=català/cs=xec/da=danès/de=alemany/en=anglès/eo=esperanto/es=castellà/et=estó/fi=finlandès/fr=francès/he=hebreu/is=islandès/it=italià/lv=letó/nl=holandès/no=norueg/pl=polac/pt=portuguès/pt-br=brasiler/ru=rus/sl=eslovè/sv=suec/zh=Xinès cs: af=afrikán¹tina/bg=bulhar¹tina/cs=èe¹tina/da=dán¹tina/de=nìmèina/en=angliètina/eo=esperanto/es=¹panìl¹tina/fi=fin¹tina/fr=francouz¹tina/he=hebrej¹tina/is=island¹tina/it=ital¹tina/lv=loty¹¹tina/nl=holand¹tina/no=nor¹tina/pt=portugal¹tina/pt-br=brasil¹tina/ru=ru¹tina/sv=¹véd¹tina/zh=èín¹tina da: af=afrikaans/bg=bulgarsk/ca=katalansk/cs=tjekkisk/da=dansk/de=tysk/en=engelsk/eo=esperanto/es=spansk/et=estisk/fi=finsk/fr=fransk/he=hebraisk/is=islandsk/it=italiensk/lv=lettisk/nl=hollandsk/no=norsk/pl=polsk/pt=portugisisk/pt-br=brasiliansk-portugisisk/ro=rumænsk/ru=russisk/sl=slovensk/sv=svensk/zh=kinesisk de: af=Afrikaans/bg=Bulgarish/ca=Katalanisch/cs=Tschechisch/da=Dänisch/de=Deutsch/en=Englisch/eo=Esperanto/es=Spanisch/et=Estnisch/fi=Finnisch/fr=Französisch/he=Hebräisch/is=Isländisch/it=Italienisch/lv=Litauisch/nl=Holländisch/no=Norwegisch/pl=Polnisch/pt=Portugiesisch/pt-br=Brasil-Portugiesisch/ru=Russisch/sl=Slovenisch/sv=Schwedisch/zh=Chinesisch en: af=Afrikaans/bg=Bulgarian/br=Breton/ca=Catalan/cs=Czech/da=Danish/de=German/en=English/eo=Esperanto/es=Spanish/et=Estonian/fi=Finnish/fr=French/he=Hebrew/is=Icelandic/it=Italian/lv=Latvian/nl=Dutch/no=Norwegian/pl=Polish/pt=Portuguese/pt-br=Brazilian-Portuguese/ro=Romanian/ru=Russian/sl=Slovenian/sv=Swedish/zh=Chinese eo: bg=bulgara/en=anglo/eo=esperanto/fr=franco es: af=Afrikaans/bg=Búlgaro/ca=Catalán/cs=Checo/da=Danés/de=Alemán/en=Inglés/eo=Esperanto/es=Español/et=Estonio/fi=Finés/fr=Francés/he=Hebreo/is=Islandés/it=Italiano/lv=Lituano/nl=Neerlandés/no=Noruego/pl=Polaco/pt=Portugés/pt-br=Portugés de Brasil/ru=Ruso/sl=Esloveno/sv=Sueco/zh=Chino et: af=afrikaani/bg=bulgaaria/ca=katalaani/cs=tšehhi/da=taani/de=saksa/en=inglise/eo=esperanto/es=hispaania/et=eesti/fi=soome/fr=prantsuse/he=heebrea/is=islandi/it=itaalia/lv=läaut;ti/nl=hollandi/no=norra/pl=poola/pt=portugali/pt-br=brasiilia-portugali/ro=rumeenia/ru=vene/sl=sloveenia/sv=rootsi/zh=hiina fi: af=afrikaans/ca=katalaani/cs=tsekki/da=tanska/de=saksa/en=englanti/eo=esperanto/es=espanja/et=eesti/fi=suomi/fr=ranska/he=heprea/is=islanti/it=italia/lv=latvia/nl=hollanti/no=norja/pl=puola/pt=portugali/pt-br=brasilianportugali/ru=venäjä/sv=ruotsi/zh=kiina fr: af=afrikaans/bg=bulgare/br=breton/ca=catalan/cs=tchèque/da=danois/de=allemand/en=anglais/eo=espéranto/es=espagnol/et=estonien/fi=finnois/fr=français/he=hébreu/is=islandais/it=italien/lv=letton/nl=néerlandais/no=norvégien/pl=polonais/pt=portugais/pt-br=portugais-du-Brésil/ro=roumain/ru=russe/sl=slovène/sv=suédois/zh=chinois he: af=àôøé÷àðñ /cs=ö'ëéú /da=ãðéú /de=âøîðéú /en=àðâìéú /eo=àñôøðèå /es=ñôøãéú /fi=ôéðéú /fr=öøôúéú /he=òáøéú /is=àéñìðãéú /it=àéèì÷éú /lv=ìèååéú /no=ðåøáâéú /pt=ôåøèåâæéú /ru=øåñéú /sv=ùååãéú/zh=ñéðéú is: af=afrikanska/cs=tékkneska/da=danska/de=þýska/en=enska/eo=esperanto/es=spænska/fi=finnska/fr=franska/he=hebraska/is=íslenska/it=ítalska/lv=lettneska/nl=hollenska/no=norska/pt=portúgalska/pt-br=Brasil-portúgalska/ru=rússneska/sv=sænska/zh=kínverska it: af=afrikaans/bg=bulgaro/ca=catalano/cs=ceco/da=danese/de=tedesco/en=inglese/eo=esperanto/es=spagnolo/et=estone/fi=finlandese/fr=francese/he=ebraico/is=islandese/it=italiano/lv=lettone/nl=olandese/no=norvegese/pl=polacco/pt=portoghese/pt-br=portoghese-brasiliano/ru=russo/sl=sloveno/sv=svedese/zh=cinese lv: cs=Èehu/da=Dâòu/de=Vâcu/en=Angïu/eo=Esperanto/es=Spâòu/fi=Somu/fr=Franèu/he=Ebreju/is=Islandieðû/it=Itâïu/lv=Latvieðu/nl=Holandieðu/no=Norvçìu/pt=Portugâïu/pt-br=Brasil-Portugâïu/ru=Krievu/sv=Zviedru/zh=Íînieðu nl: af=Afrikaans/cs=Tsjechisch/da=Deens/de=Duits/en=Engels/eo=Esperanto/es=Spaans/fi=Fins/fr=Frans/he=Hebreeuws/is=IJslands/it=Italiaans/lv=Litouws/nl=Nederlands/no=Noors/pt=Portugees/pt-br=Brasil-Portugees/ru=Russisch/sv=Zweeds/zh=Chinees no: af=afrikaans/bg=bulgarsk/ca=katalansk/cs=tjekkisk/da=dansk/de=tysk/en=engelsk/eo=esperanto/es=spansk/et=estisk/fi=finsk/fr=fransk/he=hebraisk/is=islandsk/it=italiensk/lv=litauisk/nl=hollandsk/no=norsk/pl=polsk/pt=portugisisk/pt-br=Brasil-portugisisk/ru=russisk/sl=slovensk/sv=svensk/zh=kinesisk pl: af=afrikaans/bg=bu³garski/ca=kataloñski/cs=czeski/da=duñski/de=niemiecki/en=angielski/eo=esperanto/es=hiszpañski/et=estoñski/fi=fiñski/fr=francuski/he=hebrajski/is=islandzki/it=w³oski/lv=³otewski/nl=niderlandzki/no=norweski/pl=polski/pt=portugalski/pt-br=portugalski (Brazylia)/ru=rosyjski/sv=szwedzki/zh=chiñski pt: af=Afrikaans/ca=Catalã/cs=Checo/da=Dinamarquês/de=Alemão/en=Inglês/eo=Esperanto/es=Espanhol/et=Estoniano/fi=Finlandês/fr=Francês/he=Hebreu/is=Islandês/it=Italiano/lv=Lituano/nl=Holandês/no=Norueguês/pl=Polonês/pt=Português/pt-br=Português-do-Brasil/ru=Russo/sv=Sueco/zh=Chinês pt-br: af=Afrikaner/ca=Catalão/cs=Checo/da=Dinamarquês/de=Alemão/en=Inglês/eo=Esperanto/es=Espanhol/et=Estoniano/fi=Finlandês/fr=Francês/he=Hebreu/is=Islandês/it=Italiano/lv=Lituano/nl=Holandês/no=Norueguês/pl=Polonês/pt=Português/pt-br=Português-do-Brasil/ru=Russo/sv=Sueco/zh=Chinês ro: af=africaans/ca=catalana/cs=checha/da=daneza/de=germana/en=engleza/eo=esperanto/es=spaniola/fi=finlandeza/fr=franceza/he=evreiasca/is=islandeza/it=italiana/nl=olandeza/no=norvegiana/pl=poloneza/pt=potugeza/pt-br=portugeza-in-brazilia/ro=romaneste/ru=rusa/sv=suedeza/zh=chineza ru: af=àôðèêàíñêèé/bg=áîëãàðñêèé/ca=êàòàëàíñêèé/cs=÷åøñêèé/da=äàòñêèé/de=íåìåöêèé/en=àíãëèéñêèé/eo=ýñïåðàíòî/es=èñïàíñêèé/et=ýñòîíñêèé/fi=ôèíñêèé/fr=ôðàíöóçñêèé/he=èâðèò/is=èñëàíäñêèé/it=èòàëüÿíñêèé/lv=ëàòûøñêèé/nl=ãîëëàíäñêèé/no=íîðâåæñêèé/pl=ïîëüñêèé/pt=ïîðòóãàëüñêèé/pt-br=áðàçèëüñêî-ïîðòóãàëüñêèé/ru=ðóññêèé/sl=ñëàâÿíñêèé/sv=øâåäñêèé/zh=êèòàéñêèé sl: af=afrikaan¹èina/ca=katalon¹èina/cs=èe¹èina/da=dan¹èina/de=nem¹èina/en=angle¹èina/eo=esperanto/es=¹pan¹èina/et=eston¹èina/fi=fin¹èina/fr=franco¹èina/he=hebrej¹èina/is=island¹èina/it=italijan¹èina/lv=litvan¹èina/nl=nizozem¹èina/no=norve¹èina/pl=polj¹èina/pt=portugal¹èina/pt-br=brazilska-portugal¹èina/ru=ru¹èina/sl=sloven¹èina/sv=¹ved¹èina/zh=kitaj¹èina sv: af=afrikaans/bg=bulgariska/ca=katalanska/cs=tjeckiska/da=danska/de=tyska/en=engelska/eo=esperanto/es=spanska/et=estniska/fi=finska/fr=franska/he=hebreiska/is=isländska/it=italienska/lv=litauiska/nl=holländska/no=norska/pl=polska/pt=portugisiska/pt-br=brasiliansk-portugisiska/ro=rumänska/ru=ryska/sl=slovenska/sv=svenska/zh=kinesiska no de: nein en: no es: no fr: non it: no yes de: ja en: yes es: si fr: oui it: si main page en: main page fr: page principale Upload en: Upload fr: Envoyer Upload from en: Upload from fr: Envoyer à partir de database files en: database files fr: fichiers base Download en: Download fr: Recevoir geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/gwtp/lang/recv.txt0000660000175200017530000000324212664543647024024 0ustar guillaumeguillaume Gwtp - [Download] "%b"

Gwtp - [Download] "%b"

Deutsch / English / Español / Français / Italiano

[ en: First, on your computer, create a directory named %b.gwb, or any other name ending with .gwb. Then download all these files into it with the same name. es: Primero, en su ordenata, crear un directorio llamado %b.gwb, o cualquier otro nombre terminado en .gwb. Entonces tele- cargue todos estos archivos dentro de ese directorio conservando sus nombres. fr: D'abord, dans votre ordinateur, créez un répertoire nommé %b.gwb, ou de n'importe quel autre nom se terminant par .gwb. Puis téléchargez tous ces fichiers dedans en conservant leur nom. it: Create innanzitutto sul vostro computer una directory chiamata %b.gwb, oppure un qualsiasi altro nome che termini con .gwb. In seguito, scaricatevi dentro tutti i files conservando il loro nome. de: Zuerst erzeuge auf deinem Computer ein Verzeichnis namens %b.gwb oder mit einem anderen Namen, der auf .gwb endet. Dann speichere alle diese Dateien dorthin unter Beibehaltung ihres Namen. ] %d


[main page]
geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/gwtp/lang/conf.txt0000660000175200017530000002145712664543647024022 0ustar guillaumeguillaume Gwtp - [ de: Konfiguration en: configuration es: configuración fr: configuration it: configurazione ] %b

Gwtp - [ de: Konfiguration en: configuration es: configuración fr: configuration it: configurazione ] %b

Deutsch / English / Español / Français / Italiano
[ de: Freund Passwort: en: Friend password: es: Contraseña de amigo: fr: Mot de passe ami: it: Password amico: ]
[ de: Wizard Passwort: en: Wizard password: es: Contraseña de mago: fr: Mot de passe magicien: it: Password Wizard: ]
[ de: Standardsprache: en: Default language: es: Lengua estandar: fr: Langue par défaut: it: Lingua standard: ]

[ de: Body Tag Eigenschaft: en: Body tag property: es: Propiedad "body tag": fr: Propriété "body tag": it: Proprietà "body tag": ]

[ de: URL für Bilder: en: Images URL: es: URL para las imagenes: fr: URL pour les images: it: URL per le immagini: ]

[ de: Suche nach Adelstiteln auf der Startseite anbieten: en: Propose search by nobility titles in welcome page: es: Proposición para búsqueda por títulos de nobleza in la página de bienvenida: fr: Propose la recherche par titres de noblesse dans la page d'accueil: it: Propone la ricerca per titoli di nobiltà nella pagina di benvenuto: ] [yes] [no]

[ de: Private Namen verstecken: en: Hide private names: es: Esconder mensajes privados: fr: Cacher les noms privés: it: Nascondere i nomi privati: ] [yes] [no]

[ de: Verwendung des "beschränkten Zugriffssystems": en: Use the "restricted access" system (more strict): es: Usar el sistema de "área restringida" (más estricta): fr: Utiliser le système "accès restreint" (plus strict): it: Utilizzare il sistema "accesso limitato"(più rigoroso): ] [yes] [no]

[ de: Wizard gleich Freund (für temporäres Update): en: Wizard just friend (for temporary update) es: Mago sólo amigo (para actialización temporal): fr: Magiciens seulement amis (pour mises à jour temporaires): it: Wizard solo amico (per aggiornamenti temporanei): ] [yes] [no]

[ de: Zugriff auf entfernte Bilder für "normale" Besucher: en: Accesses to distant images for "normal" visitors: es: Acceder imagenes distantes para visitantes "normales": fr: Accès aux images distantes pour les visiteurs "normaux": ]
[ de: nicht erzeugen en: don't generate them es: no, no las generes fr: ne pas les générer ]
[ de: erzeugen en: generate them es: genéralas fr: les générer ]

[ de: Bei Anzeige Orte/Nachnamen zeigen die links auf: en: In display places/surnames, links point to: es: En mostrar lugares/apellidos, enlaces apuntan a: fr: Dans l'affichage lieux/patronymes, les liens vont sur: ]
[ de: ein Individuum an diesem Ort en: one individual concerned by the place es: un individuo empeñado por el lugar fr: une des personnes concernée par le lieu ]
[ de: den ganzen Nachnamen en: the whole surname es: el apellido completo fr: tout le patronyme ]

[ de: Fusstext: en: Trailer text: es: Texto para el pie de la página: fr: Texte pour le bas des pages: it: Testo per il piede di pagina: ]

[ de: Anmerkung: en: Advice: es: Aviso: fr: Remarques: it: Osservazioni: ]

[ de: Andere Konfigurationsparameter existieren, haben aber Einfluss auf die Performance des Server Computer. Frage den GeneWeb Site Administrator wenn diese geändert werden sollen. Möglicherweise wird dies nicht akzeptiert werden. en: Other configuration parameters exist, but they may have an influence on the performances of the server computer. Ask the GeneWeb site administrator if you want to change them. Be aware of the fact that your request may not be accepted. es: Otros parametros para configuracion existen, pero ellos pueden influenciar la rapidez del servidor. Pregunta al administrator de la página de GeneWeb si quieres cambiarlos. Ten presente que tu pedido puede ser ignorado. fr: D'autres paramètres de configuration existent, mais ils peuvent avoir une influence sur les performances de l'ordinateur serveur. Demandez à l'administrateur du site GeneWeb si vous voulez les changer. Soyez conscient du fait que votre requête peut ne pas être acceptée. it: Esistono altri parametri di configurazione che possono avere un'influenza sulle prestazioni del server. Se volete cambiarle, chiedete all'Amministratore del sito GeneWeb. Siate coscenti del fatto che la vostra richiesta rischia di non essere accolta. ]


[main page]
geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/gwtp/lang/send_gedcom.txt0000660000175200017530000000213112664543647025330 0ustar guillaumeguillaume Gwtp - upload %b

Gwtp - upload %b

Deutsch / English / Español / Français / Italiano

[ de: Wähle deine GEDCOM Datei: en: Select your GEDCOM file: es: Seleccionar su archivo GEDCOM: fr: Sélectionnez votre fichier GEDCOM: it: Selezionate il vostro file GEDCOM: ]



[main page]
geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/gwtp/lang/main.txt0000660000175200017530000000177312664543647024020 0ustar guillaumeguillaume Gwtp - %b

Gwtp - %b

Deutsch / English / Español / Français / Italiano

%Iw%Ic %E%E


geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/gwtp/lang/send.txt0000660000175200017530000000672512664543647024027 0ustar guillaumeguillaume Gwtp - [Upload] "%b"

Gwtp - [Upload] "%b"

Deutsch / English / Español / Français / Italiano

[ de: Vom lokalen GeneWeb Datenbankverzeichnis (%b.gwb für die Datenbank namens %b): en: From your local GeneWeb database directory (%b.gwb for the base named %b): es: Desde tu copia local del directorio GeneWeb (%b.gwb nombre base llamado %b)) fr: À partir du répertoire de votre base de données GeneWeb locale (%b.gwb pour la base nommée %b): it: A partire dalla directory della vostra base di dati GeneWeb locale (%b.gwb per la base chiamata %b): ]





[ de: Achtung: es müssen alle diese Dateien ausgewählt werden,
wenn sie existieren. Überprüfe, dass keine vergessen wurde. en: Warning: you have to select all these files when they exist.
Check that you forget none of them. es: Atencion: tu has seleccionado todos estos archivos si ellos existen.
Verifique que no olvides ninguno. fr: Attention: vous devez sélectionner tous ces fichiers s'ils existent.
Vérifiez que vous n'en oubliez aucun. it: Attenzione: dovete selezionaretutti questi files se esistono.
Controllate di non averne dimenticato nessuno. ]


[main page]
geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/gwtp/iolight.ml0000660000175200017530000001645612664543647023407 0ustar guillaumeguillaume(* $Id: iolight.ml,v 5.13 2007-01-19 01:53:16 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Dbdisk; open Def; type person = dsk_person; type ascend = dsk_ascend; type union = dsk_union; type family = dsk_family; type couple = dsk_couple; type descend = dsk_descend; value magic_gwb = "GnWb0020"; value check_magic = let b = Bytes.create (String.length magic_gwb) in fun ic -> do { really_input ic b 0 (String.length b); if b <> magic_gwb then if String.sub magic_gwb 0 4 = String.sub b 0 4 then failwith "this is a GeneWeb base, but not compatible" else failwith "this is not a GeneWeb base, or it is a very old version" else () } ; type patches = { p_person : ref (list (int * person)); p_ascend : ref (list (int * ascend)); p_union : ref (list (int * union)); p_family : ref (list (int * family)); p_couple : ref (list (int * couple)); p_descend : ref (list (int * descend)); p_string : ref (list (int * string)); p_name : ref (list (int * list iper)) } ; value rec patch_len len = fun [ [] -> len | [(i, _) :: l] -> patch_len (max len (i + 1)) l ] ; value apply_patches tab plist plen = if plist = [] then tab else do { let new_tab = if plen > Array.length tab then do { let new_tab = Array.make plen (Obj.magic 0) in Array.blit tab 0 new_tab 0 (Array.length tab); new_tab } else tab in List.iter (fun (i, v) -> new_tab.(i) := v) plist; new_tab } ; value value_header_size = 20; value array_header_size len = if len < 8 then 1 else 5; (* to turn around lack of header in some output valued arrays version 4.10 *) value input_4_10_array ic pos len = do { Printf.eprintf "*** recovering 4.10 array...\n"; flush stderr; seek_in ic (pos + value_header_size + array_header_size len); Array.init len (fun _ -> Iovalue.input ic) } ; value make_record_access ic shift array_pos patches len name = let tab = ref None in let rec array () = match tab.val with [ Some x -> x | None -> do { Printf.eprintf "*** read %s\n" name; flush stderr; seek_in ic array_pos; let v = try input_value ic with [ Failure _ -> input_4_10_array ic array_pos len ] in let t = apply_patches v patches.val r.len in tab.val := Some t; t } ] and r = {load_array () = let _ = array () in (); get i = (array ()).(i); set i v = (array ()).(i) := v; len = patch_len len patches.val; output_array oc = Mutil.output_value_no_sharing oc (array () : array _); clear_array () = tab.val := None} in r ; value input_patches bname = let patches = match try Some (open_in_bin (Filename.concat bname "patches")) with _ -> None with [ Some ic -> let p = input_value ic in do { close_in ic; p } | None -> {p_person = ref []; p_ascend = ref []; p_union = ref []; p_family = ref []; p_couple = ref []; p_descend = ref []; p_string = ref []; p_name = ref []} ] in patches ; value input bname = let bname = if Filename.check_suffix bname ".gwb" then bname else bname ^ ".gwb" in let patches = input_patches bname in let ic = let ic = open_in_bin (Filename.concat bname "base") in do { check_magic ic; ic } in let persons_len = input_binary_int ic in let families_len = input_binary_int ic in let strings_len = input_binary_int ic in let persons_array_pos = input_binary_int ic in let ascends_array_pos = input_binary_int ic in let unions_array_pos = input_binary_int ic in let families_array_pos = input_binary_int ic in let couples_array_pos = input_binary_int ic in let descends_array_pos = input_binary_int ic in let strings_array_pos = input_binary_int ic in let norigin_file = input_value ic in let shift = 0 in let persons = make_record_access ic shift persons_array_pos patches.p_person persons_len "persons" in let shift = shift + persons_len * Iovalue.sizeof_long in let ascends = make_record_access ic shift ascends_array_pos patches.p_ascend persons_len "ascends" in let shift = shift + persons_len * Iovalue.sizeof_long in let unions = make_record_access ic shift unions_array_pos patches.p_union persons_len "unions" in let shift = shift + persons_len * Iovalue.sizeof_long in let families = make_record_access ic shift families_array_pos patches.p_family families_len "families" in let shift = shift + families_len * Iovalue.sizeof_long in let couples = make_record_access ic shift couples_array_pos patches.p_couple families_len "couples" in let shift = shift + families_len * Iovalue.sizeof_long in let descends = make_record_access ic shift descends_array_pos patches.p_descend families_len "descends" in let shift = shift + families_len * Iovalue.sizeof_long in let strings = make_record_access ic shift strings_array_pos patches.p_string strings_len "strings" in let cleanup () = close_in ic in let read_notes fnotes rn_mode = let fname = if fnotes = "" then "notes" else Filename.concat "notes_d" (fnotes ^ ".txt") in match try Some (Secure.open_in (Filename.concat bname fname)) with [ Sys_error _ -> None ] with [ Some ic -> do { let str = match rn_mode with [ RnDeg -> if in_channel_length ic = 0 then "" else " " | Rn1Ln -> try input_line ic with [ End_of_file -> "" ] | RnAll -> loop 0 where rec loop len = match try Some (input_char ic) with [ End_of_file -> None ] with [ Some c -> loop (Buff.store len c) | _ -> Buff.get len ] ] in close_in ic; str } | None -> "" ] in let commit_notes fnotes s = let fname = if fnotes = "" then "notes" else do { try Unix.mkdir (Filename.concat bname "notes_d") 0o755 with _ -> (); Filename.concat "notes_d" (fnotes ^ ".txt") } in let fname = Filename.concat bname fname in do { try Sys.remove (fname ^ "~") with [ Sys_error _ -> () ]; try Sys.rename fname (fname ^ "~") with _ -> (); if s = "" then () else do { let oc = open_out fname in output_string oc s; close_out oc; } } in let bnotes = {nread = read_notes; norigin_file = norigin_file; efiles _ = []} in let base_data = {persons = persons; ascends = ascends; unions = unions; visible = { v_write = fun []; v_get = fun [] }; families = families; couples = couples; descends = descends; strings = strings; particles = []; bnotes = bnotes; bdir = bname} in let base_func = {person_of_key = fun []; persons_of_name = fun []; strings_of_fsname = fun []; persons_of_surname = {find = fun []; cursor = fun []; next = fun []}; persons_of_first_name = {find = fun []; cursor = fun []; next = fun []}; patch_person = fun []; patch_ascend = fun []; patch_union = fun []; patch_family = fun []; patch_couple = fun []; patch_descend = fun []; patch_name = fun []; insert_string = fun []; commit_patches = fun []; commit_notes = commit_notes; patched_ascends = fun []; is_patched_person _ = False; cleanup = cleanup} in {data = base_data; func = base_func} ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/gwtp/gwtp.ml0000660000175200017530000010544012664543647022721 0ustar guillaumeguillaume(* camlp5r ../src/pa_lock.cmo *) (* $Id: gwtp.ml,v 5.8 2007-09-12 09:58:44 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Dbdisk; open Printf; value gwtp_tmp = ref (Filename.concat ".." "gwtp_tmp"); value gwtp_dst = ref (Filename.concat ".." "gwtp_dst"); value gwtp_log = ref ""; value gwtp_etc = ref ""; value gw_site = ref ""; value no_upload = ref False; value token_tmout = ref 900.0; value filename_basename str = loop (String.length str - 1) where rec loop i = if i < 0 then str else match str.[i] with [ 'A'..'Z' | 'a'..'z' | '0'..'9' | '-' | '~' | '.' -> loop (i - 1) | _ -> String.sub str (i + 1) (String.length str - i - 1) ] ; (* Get CGI contents *) value read_input len = if len >= 0 then do { let buff = Bytes.create len in really_input stdin buff 0 len; buff } else do { let buff = ref "" in try while True do { let l = input_line stdin in buff.val := buff.val ^ l } with [ End_of_file -> () ]; buff.val } ; value cgi_content_type () = try Sys.getenv "CONTENT_TYPE" with [ Not_found -> "" ] ; value cgi_script_name () = try filename_basename (Sys.getenv "SCRIPT_NAME") with [ Not_found -> "gwtp" ] ; value cgi_content () = let is_post = try Sys.getenv "REQUEST_METHOD" = "POST" with [ Not_found -> False ] in if is_post then do { let len = try int_of_string (Sys.getenv "CONTENT_LENGTH") with [ Not_found -> -1 ] in set_binary_mode_in stdin True; read_input len } else try Sys.getenv "QUERY_STRING" with [ Not_found -> "" ] ; value cgi_from () = try Sys.getenv "REMOTE_HOST" with [ Not_found -> try Sys.getenv "REMOTE_ADDR" with [ Not_found -> "" ] ] ; (* Utilitaires *) value crlf () = do { flush stdout; let _ : int = Unix.write Unix.stdout "\013\n" 0 2 in () } ; value lowercase_start_with s s_ini = let len = String.length s_ini in String.length s >= len && String.lowercase (String.sub s 0 len) = s_ini ; value quote_escaped s = let rec need_code i = if i < String.length s then match s.[i] with [ '"' | '&' | '<' | '>' -> True | x -> need_code (succ i) ] else False in let rec compute_len i i1 = if i < String.length s then let i1 = match s.[i] with [ '"' -> i1 + 6 | '&' -> i1 + 5 | '<' | '>' -> i1 + 4 | _ -> succ i1 ] in compute_len (succ i) i1 else i1 in let rec copy_code_in s1 i i1 = if i < String.length s then let i1 = match s.[i] with [ '"' -> do { String.blit """ 0 s1 i1 6; i1 + 6 } | '&' -> do { String.blit "&" 0 s1 i1 5; i1 + 5 } | '<' -> do { String.blit "<" 0 s1 i1 4; i1 + 4 } | '>' -> do { String.blit ">" 0 s1 i1 4; i1 + 4 } | c -> do { Bytes.set s1 i1 c; succ i1 } ] in copy_code_in s1 (succ i) i1 else s1 in if need_code 0 then let len = compute_len 0 0 in copy_code_in (Bytes.create len) 0 0 else s ; value log_open () = let fname = Filename.concat gwtp_log.val "gwtp.log" in open_out_gen [Open_wronly; Open_creat; Open_append] 0o644 fname ; type env_val = [ Val of string | Fun of unit -> unit ]; value macro env c = match try Some (List.assoc c env) with [ Not_found -> None ] with [ Some (Val s) -> s | _ -> "%" ^ String.make 1 c ] ; value get_variable ic = loop 0 where rec loop len = match input_char ic with [ ';' -> Buff.get len | c -> loop (Buff.store len c) ] ; value get_binding ic = loop 0 where rec loop len = match input_char ic with [ '=' -> let k = Buff.get len in (k, get_variable ic) | c -> loop (Buff.store len c) ] ; value template_fname env fname = List.fold_right Filename.concat [gwtp_etc.val; "lang"] (fname ^ ".txt") ; value lindex s c = pos 0 where rec pos i = if i = String.length s then None else if s.[i] = c then Some i else pos (i + 1) ; value input_lexicon lang = let ht = Hashtbl.create 501 in do { Mutil.input_lexicon lang ht (fun () -> open_in (List.fold_right Filename.concat [gwtp_etc.val; "lang"] "lexicon.txt")); ht } ; value unfreeze_lexicon = let lexicon = ref None in fun lang -> match lexicon.val with [ Some lex -> lex | None -> let lex = input_lexicon lang in do { lexicon.val := Some lex; lex } ] ; value transl lang w = let lexicon = unfreeze_lexicon lang in try Hashtbl.find lexicon w with [ Not_found -> "[" ^ w ^ "]" ] ; value copy_template genv (varenv, filenv) env if_env fname = let lang = match HttpEnv.getenv genv "lang" with [ Some x -> x | _ -> "en" ] in let echo = ref True in let (push_echo, pop_echo) = let stack = ref [] in (fun x -> do { stack.val := [echo.val :: stack.val]; echo.val := x; }, fun () -> match stack.val with [ [x :: l] -> do { stack.val := l; echo.val := x; } | [] -> echo.val := True ]) in let ic = open_in (template_fname env fname) in let rec if_expr = fun [ 'N' -> not (if_expr (input_char ic)) | c -> try List.assoc c if_env with [ Not_found -> do { printf "!!!!!%c!!!!!" c; True } ] ] in do { try while True do { match input_char ic with [ '%' -> match input_char ic with [ 'I' -> push_echo (echo.val && if_expr (input_char ic)) | 'E' -> pop_echo () | _ when not echo.val -> () | 's' -> print_string (cgi_script_name ()) | 'c' | 'e' as x -> let (v, k) = get_binding ic in try if k = List.assoc v varenv then print_string (if x = 'c' then " checked" else " selected") else () with [ Not_found -> () ] | 'v' -> let v = get_variable ic in try print_string (quote_escaped (List.assoc v varenv)) with [ Not_found -> () ] | 'f' -> let v = get_variable ic in try print_string (quote_escaped (List.assoc v filenv)) with [ Not_found -> () ] | 'l' -> print_string lang | 'L' -> let v = get_variable ic in let lang_def = transl lang " !languages" in print_string (Translate.language_name v lang_def) | c -> match try Some (List.assoc c env) with [ Not_found -> None ] with [ Some (Val s) -> print_string s | Some (Fun f) -> f () | None -> do { print_char '%'; print_char c; } ] ] | '[' -> let s = let c = input_char ic in let s = loop 0 (if c = '\n' then input_char ic else c) where rec loop len c = if c = ']' then Buff.get len else loop (Buff.store len c) (input_char ic) in if c = '\n' then let (s, alt) = Translate.inline lang '%' (macro env) s in if alt then "[" ^ s ^ "]" else s else transl lang s in if echo.val then print_string s else () | c -> if echo.val then print_char c else () ] } with [ End_of_file -> () ]; close_in ic; } ; value variables env = let ic = open_in (template_fname env "conf") in let vlist = ref [] in let flist = ref [] in do { try while True do { match input_char ic with [ '%' -> match input_char ic with [ 'e' | 'c' -> let (v, _) = get_binding ic in if not (List.mem v vlist.val) then vlist.val := [v :: vlist.val] else () | 'v' -> let v = get_variable ic in if not (List.mem v vlist.val) then vlist.val := [v :: vlist.val] else () | 'f' -> let v = get_variable ic in if not (List.mem v vlist.val) then flist.val := [v :: flist.val] else () | _ -> () ] | _ -> () ] } with [ End_of_file -> () ]; close_in ic; (vlist.val, flist.val) } ; value sys_copy src dst = let ic = open_in src in let oc = open_out dst in do { try while True do { let c = input_char ic in output_char oc c } with [ End_of_file -> () ]; close_out oc; close_in ic; } ; value remove_dir_contents dir = let dh = Unix.opendir dir in try while True do { match Unix.readdir dh with [ "." | ".." -> () | f -> Unix.unlink (Filename.concat dir f) ] } with [ End_of_file -> Unix.closedir dh ] ; (* value html_escaped s = let s = String.escaped s in let rec loop i len = if i = String.length s then Buff.get len else let len = match s.[i] with [ '<' -> Buff.mstore len "<" | '>' -> Buff.mstore len ">" | x -> Buff.store len x ] in loop (i + 1) len in loop 0 0 ; *) value gwtp_error txt = do { printf "content-type: text/html"; crlf (); crlf (); printf "\ Error

Error

%s " (String.capitalize txt); } ; value gwtp_invalid_request str env = gwtp_error "Invalid request"; value random_self_init () = let seed = int_of_float (mod_float (Unix.time ()) (float max_int)) in let seed = seed + 256 * Unix.getpid () in Random.init seed ; random_self_init (); value mk_passwd size = loop 0 where rec loop len = if len = size then Buff.get len else let r = Random.int (26 + 26 + 10) in let v = if r < 26 then Char.code 'a' + r else if r < 52 then Char.code 'A' + r - 26 else Char.code '0' + r - 52 in loop (Buff.store len (Char.chr v)) ; (* Base configuration *) value get_base_conf env b = let fname = Filename.concat gwtp_dst.val (b ^ ".gwf") in match try Some (open_in fname) with [ Sys_error _ -> None ] with [ Some ic -> let (variables, files) = variables env in let varenv = let varenv = ref [] in let rec record line = fun [ [v :: l] -> if lowercase_start_with line (v ^ "=") then let len = String.length v + 1 in let x = String.sub line len (String.length line - len) in varenv.val := [(v, x) :: varenv.val] else record line l | [] -> () ] in do { try while True do { let line = let line = input_line ic in if String.length line > 0 && line.[String.length line - 1] = '\r' then String.sub line 0 (String.length line - 1) else line in record line variables } with [ End_of_file -> close_in ic ]; varenv.val } in let filenv = List.map (fun fsuff -> let fname = List.fold_right Filename.concat [gwtp_dst.val; "lang"] (b ^ "." ^ fsuff) in match try Some (open_in fname) with [ Sys_error _ -> None ] with [ Some ic -> let len = ref 0 in do { try while True do { len.val := Buff.store len.val (input_char ic) } with [ End_of_file -> close_in ic ]; (fsuff, Buff.get len.val) } | None -> (fsuff, "") ]) files in (varenv, filenv) | None -> ([("friend_passwd", mk_passwd 9); ("wizard_passwd", mk_passwd 9)], []) ] ; value set_base_conf b varenv = let fname = Filename.concat gwtp_dst.val (b ^ ".gwf") in let fname_out = Filename.concat gwtp_dst.val (b ^ "1.gwf") in let fname_saved = fname ^ "~" in let varenv = List.map (fun (k, v) -> (k, v, ref False)) varenv in let rec extract line = fun [ [(k, v, is_set) :: varenv] -> if lowercase_start_with line (k ^ "=") then do { is_set.val := True; k ^ "=" ^ v } else extract line varenv | [] -> line ] in let oc = open_out fname_out in let ic_opt = try Some (open_in fname) with [ Sys_error _ -> let fname = Filename.concat gwtp_etc.val "default.gwf" in try Some (open_in fname) with [ Sys_error _ -> None ] ] in do { match ic_opt with [ Some ic -> try while True do { let line = input_line ic in let line_out = extract line varenv in fprintf oc "%s\n" line_out } with [ End_of_file -> close_in ic ] | None -> () ]; List.iter (fun (k, v, is_set) -> if not is_set.val && v <> "" then fprintf oc "%s=%s\n" k v else ()) varenv; close_out oc; try Sys.remove fname_saved with [ Sys_error _ -> () ]; let bdir = Filename.concat gwtp_dst.val (b ^ ".gwb") in let b_ex = Sys.file_exists bdir in if b_ex then Sys.rename bdir (bdir ^ "~") else (); if Sys.file_exists fname then Sys.rename fname fname_saved else (); Sys.rename fname_out fname; if b_ex then Sys.rename (bdir ^ "~") bdir else (); } ; value set_base_files b filenv = List.iter (fun (k, v) -> let fname = List.fold_right Filename.concat [gwtp_dst.val; "lang"] (b ^ "." ^ k) in if v = "" then try Sys.remove fname with [ Sys_error _ -> () ] else do { let oc = open_out fname in output_string oc v; close_out oc; }) filenv ; (* Login and tokens *) value tokens_file_name () = Filename.concat gwtp_tmp.val "token"; value read_tokens fname = match try Some (open_in fname) with [ Sys_error _ -> None ] with [ Some ic -> let rec loop list = match try Some (input_line ic) with [ End_of_file -> None ] with [ Some line -> let i = String.index line ' ' in let j = String.index_from line (i + 1) ' ' in let tm = float_of_string (String.sub line 0 i) in let b = String.sub line (i + 1) (j - i - 1) in let tok = String.sub line (j + 1) (String.length line - j - 1) in loop [(tm, b, tok) :: list] | None -> do { close_in ic; List.rev list } ] in loop [] | None -> [] ] ; value write_tokens fname tokens = let oc = open_out fname in do { List.iter (fun (tm, from_b, tok) -> fprintf oc "%.0f %s %s\n" tm from_b tok) tokens; close_out oc; } ; value check_login b p = let line1 = b ^ ":" ^ p in let ic = open_in (Filename.concat gwtp_etc.val "passwd") in let login_ok = loop () where rec loop () = match try Some (input_line ic) with [ End_of_file -> None ] with [ Some line -> let line = if String.length line > 0 && line.[String.length line - 1] = '\r' then String.sub line 0 (String.length line - 1) else line in if line = line1 then True else loop () | None -> False ] in do { close_in ic; if login_ok then Some (mk_passwd 12) else do { Unix.sleep 5; None } } ; value check_token fname from b tok = let tokens = read_tokens fname in let from_b = from ^ "/" ^ b in let tm = Unix.time () in let rec loop = fun [ [(tm0, from_b0, tok0) :: tokens] -> if tm < tm0 || tm -. tm0 > token_tmout.val then loop tokens else if from_b = from_b0 && tok = tok0 then True else loop tokens | [] -> False ] in loop tokens ; value update_tokens fname from b tok = let tokens = read_tokens fname in let from_b = from ^ "/" ^ b in let tm = Unix.time () in let tokens = List.fold_right (fun ((tm0, from_b0, tok0) as token) tokens -> if tm < tm0 || tm -. tm0 > token_tmout.val then tokens else if from_b = from_b0 && tok = tok0 then tokens else [token :: tokens]) tokens [] in let tokens = [(tm, from_b, tok) :: tokens] in write_tokens fname tokens ; value set_token from b tok = let fname = tokens_file_name () in let from_b = from ^ "/" ^ b in let tokens = let tokens = read_tokens fname in let tm = Unix.time () in List.fold_right (fun (tm0, from_b0, tok0) tokens -> if from_b = from_b0 || tm < tm0 || tm -. tm0 > token_tmout.val then tokens else [(tm0, from_b0, tok0) :: tokens]) tokens [(tm, from_b, tok)] in write_tokens fname tokens ; (* Requests *) value insert_file env bdir name = let fname = HttpEnv.decode (List.assoc (name ^ "_name") env) in let fname = filename_basename fname in do { if fname = "" then () else if fname <> name then printf "You selected %s instead of %s -> ignored.\n" fname name else let contents = List.assoc name env in let i = if lowercase_start_with contents "content-type: " then String.index contents '\n' else 0 in let j = String.index_from contents (i + 1) '\n' in let len = String.length contents - j - 3 in if len > 0 then do { let oc = open_out (Filename.concat bdir name) in output oc contents (j + 1) len; flush oc; printf "File \"%s\" transfered.\n" name; close_out oc; } else (); flush stdout; } ; value make_temp env b = let bdir = Filename.concat gwtp_tmp.val (b ^ ".gwb") in do { if Sys.file_exists bdir then remove_dir_contents bdir else Unix.mkdir bdir 0o777; insert_file env bdir "base"; insert_file env bdir "notes"; insert_file env bdir "patches"; insert_file env bdir "particles.txt"; flush stdout; let base = Iolight.input bdir in printf "\n"; printf "persons: %d\n" base.data.persons.len; printf "families: %d\n\n" base.data.families.len; flush stdout; Secure.set_base_dir (Filename.dirname bdir); Outbase.output bdir base; flush stdout; } ; value copy_temp b = let bdir = Filename.concat gwtp_tmp.val (b ^ ".gwb") in let dir_old = Filename.concat gwtp_dst.val "old" in let dir_old_gwb = Filename.concat dir_old (b ^ ".gwb") in let dir_gwb = Filename.concat gwtp_dst.val (b ^ ".gwb") in do { if Sys.file_exists dir_gwb then do { if not (Sys.file_exists dir_old) then Unix.mkdir dir_old 0o777 else (); if Sys.file_exists dir_old_gwb then do { remove_dir_contents dir_old_gwb; Unix.rmdir dir_old_gwb; } else (); Sys.rename dir_gwb dir_old_gwb; let old_forum = Filename.concat dir_old_gwb "forum" in if Sys.file_exists old_forum then sys_copy old_forum (Filename.concat bdir "forum") else (); let old_wiznotes = Filename.concat dir_old_gwb "wiznotes" in if Sys.file_exists old_wiznotes then Sys.rename old_wiznotes (Filename.concat bdir "wiznotes") else () } else (); Sys.rename bdir dir_gwb; } ; value printf_link_to_main env b tok = let lang = match HttpEnv.getenv env "lang" with [ Some x -> x | _ -> "en" ] in do { printf "


\n"; printf "%s
\n" (cgi_script_name ()) b tok lang (transl lang "main page"); } ; (* Upload from GEDCOM *) value make_gedcom_file env b = let fname = Filename.concat gwtp_tmp.val (b ^ ".ged") in let oc = open_out fname in do { let contents = List.assoc "gedcom" env in let i = if lowercase_start_with contents "content-type: " then String.index contents '\n' else 0 in let j = String.index_from contents (i + 1) '\n' in let len = String.length contents - j - 3 in output_string oc (String.sub contents (j + 1) len); close_out oc; } ; value ged2gwb b = let comm = Filename.concat gwtp_etc.val "ged2gwb" ^ " " ^ Filename.concat gwtp_tmp.val (b ^ ".ged") ^ " -f -o " ^ Filename.concat gwtp_tmp.val b ^ " > " ^ Filename.concat gwtp_tmp.val (b ^ ".log") in let _ = Sys.command comm in () ; value move_gedcom_to_old b = do { let dir = Filename.concat gwtp_tmp.val "ged" in try Unix.mkdir dir 0o775 with [ Unix.Unix_error _ _ _ -> () ]; let fname_old = Filename.concat dir (b ^ ".ged") in try Sys.remove fname_old with [ Sys_error _ -> () ]; let fname = Filename.concat gwtp_tmp.val (b ^ ".ged") in Sys.rename fname fname_old; } ; value send_gedcom_file str env b tok f fname = let fname = filename_basename fname in if Filename.check_suffix fname ".ged" || Filename.check_suffix fname ".GED" then do { printf "content-type: text/html"; crlf (); crlf (); printf "\ Gwtp...

Gwtp...

";
    flush stdout;
    make_gedcom_file env b;
    printf "\nGedcom file transfered.\n";
    flush stdout;
    ged2gwb b;
    printf "New database created.\n";
    flush stdout;
    copy_temp b;
    printf "Database \"%s\" updated.\n" b;
    printf "Command output\n"
      (cgi_script_name ()) b tok;
    flush stdout;
    move_gedcom_to_old b;
    printf "
\n"; printf_link_to_main env b tok; printf "\n"; flush stdout; } else gwtp_error "This is not a gedcom file (not ending with .GED)" ; value gwtp_send_gedcom str env b t = match (HttpEnv.getenv env "gedcom", HttpEnv.getenv env "gedcom_name") with [ (Some f, Some fname) -> send_gedcom_file str env b t f (HttpEnv.decode fname) | (Some f, None) -> gwtp_error "Sorry, your browser seems not be able to send files." | _ -> gwtp_invalid_request str env ] ; value gwtp_upload_gedcom str env b tok = let bcnf = Filename.concat gwtp_dst.val (b ^ ".gwf") in if not (Sys.file_exists bcnf) then gwtp_error "no configuration file" else do { printf "content-type: text/html"; crlf (); crlf (); copy_template env ([], []) [('b', Val b); ('t', Val tok)] [] "send_gedcom"; } ; value gwtp_print_log str env b tok = do { printf "content-type: text/html"; crlf (); crlf (); printf "\ Gwtp - %s

Gwtp - %s

" b b; let fname = Filename.concat gwtp_tmp.val (b ^ ".log") in let ic = open_in fname in printf "
\n";
    try
      while True do {
        output_char stdout (input_char ic);
      }
    with
    [ End_of_file -> () ];
    printf "
\n"; close_in ic; printf_link_to_main env b tok; printf "\n"; } ; value gwtp_print_accesses of_wizards str env b tok = do { printf "content-type: text/html"; crlf (); crlf (); printf "\ Gwtp - %s

Gwtp - %s

" b b; let (varenv, filenv) = get_base_conf env b in let fname = try List.assoc (if of_wizards then "wizard_passwd_file" else "friend_passwd_file") varenv with [ Not_found -> "" ] in let fname = if fname <> "" then "" else List.fold_right Filename.concat [gwtp_dst.val; "cnt"] (b ^ (if of_wizards then "_w.txt" else "_f.txt")) in printf "
\n";
    if fname = "" then printf "[no password file]\n"
    else
      try
        do {
          let ic = open_in fname in
          try
            while True do {
              output_char stdout (input_char ic);
            }
          with
          [ End_of_file -> () ];
          close_in ic;
        }
      with
      [ Sys_error _ -> printf "[nothing]\n" ];
    printf "
\n"; printf_link_to_main env b tok; printf "\n"; } ; (* Actions *) value send_file str env b tok f fname = let fname = filename_basename fname in let lockf = Filename.concat gwtp_tmp.val (b ^ ".lck") in if fname = "base" then do { printf "content-type: text/html"; crlf (); crlf (); printf "\ Gwtp...

Gwtp...

";
    flush stdout;
    lock lockf with
    [ Accept ->
        do {
          make_temp env b;
          printf "\nTemporary database created.\n";
          flush stdout;
          copy_temp b;
          printf "Database \"%s\" updated.\n" b;
        }
    | Refuse ->
        do {
          printf "Database is already being transfered.
\n"; printf "Please try again later.\n"; } ]; flush stdout; printf "
\n"; printf_link_to_main env b tok; printf "\n"; } else do { printf "content-type: text/html"; crlf (); crlf (); printf "\ Error

Error

"; if fname = "" then printf "You must select at least the base file\n" else printf "You selected the file %s instead of base\n" fname; printf "\n"; printf_link_to_main env b tok; } ; value gwtp_send str env b t = match (HttpEnv.getenv env "base", HttpEnv.getenv env "base_name") with [ (Some f, Some fname) -> send_file str env b t f (HttpEnv.decode fname) | (Some f, None) -> gwtp_error "Sorry, your browser seems not be able to send files." | _ -> gwtp_invalid_request str env ] ; value gwtp_receive str env b tok = match HttpEnv.getenv env "f" with [ Some fname -> let fname = filename_basename fname in let bdir = Filename.concat gwtp_dst.val (b ^ ".gwb") in do { printf "content-type: bin/geneweb"; crlf (); printf "content-disposition: attachement; filename=%s" fname; crlf (); crlf (); let ic = open_in (Filename.concat bdir fname) in try while True do { let c = input_char ic in output_char stdout c } with [ End_of_file -> () ]; close_in ic; } | _ -> gwtp_invalid_request str env ] ; value acceptable_tags = ["!--"; "a"; "b"; "br"; "em"; "font"; "hr"; "i"; "img"; "li"; "ol"; "p"; "table"; "td"; "tr"; "ul"] ; value secure_html s = loop 0 0 where rec loop len i = if i = String.length s then Buff.get len else match s.[i] with [ '<' -> let i = i + 1 in let (slash, i) = if i = String.length s then (False, i) else if s.[i] = '/' then (True, i + 1) else (False, i) in let (tag, i) = loop "" i where rec loop tag i = if i = String.length s then ("", i) else match s.[i] with [ 'a'..'z' | 'A'..'Z' | '!' | '-' -> loop (tag ^ String.make 1 s.[i]) (i + 1) | _ -> (tag, i) ] in let len = if List.mem (String.lowercase tag) acceptable_tags then Buff.store len '<' else Buff.mstore len "<" in let len = if slash then Buff.store len '/' else len in loop (Buff.mstore len tag) i | c -> loop (Buff.store len c) (i + 1) ] ; value gwtp_setconf str env b tok = let (variables, files) = variables env in let varenv = List.fold_right (fun k varenv -> match HttpEnv.getenv env k with [ Some v -> [(k, v) :: varenv] | None -> varenv ]) variables [] in let filenv = List.fold_right (fun k filenv -> match HttpEnv.getenv env k with [ Some v -> [(k, secure_html v) :: filenv] | None -> filenv ]) files [] in do { printf "content-type: text/html"; crlf (); crlf (); printf "\ Gwtp - configuration %s

Gwtp - configuration %s

" b b; set_base_conf b varenv; set_base_files b filenv; printf "Configuration changed\n"; printf_link_to_main env b tok; printf "\n"; } ; value gwtp_upload str env b tok = let bcnf = Filename.concat gwtp_dst.val (b ^ ".gwf") in if not (Sys.file_exists bcnf) then gwtp_error "no configuration file" else do { printf "content-type: text/html"; crlf (); crlf (); copy_template env ([], []) [('b', Val b); ('t', Val tok)] [] "send"; } ; value gwtp_download str env b tok = let bcnf = Filename.concat gwtp_dst.val (b ^ ".gwf") in let bdir = Filename.concat gwtp_dst.val (b ^ ".gwb") in if not (Sys.file_exists bcnf) then gwtp_error "no configuration file" else do { printf "content-type: text/html"; crlf (); crlf (); if Sys.file_exists bdir then do { let print_directory () = let dh = Unix.opendir bdir in do { printf "\n"; } in copy_template env ([], []) [('b', Val b); ('t', Val tok); ('d', Fun print_directory)] [] "recv"; } else do { printf " Gwtp - download %s

Gwtp - download %s

Your database does not exist or is empty. " b b; printf_link_to_main env b tok; printf "\n"; } } ; value gwtp_config str env b tok = let (varenv, filenv) = get_base_conf env b in do { printf "content-type: text/html"; crlf (); crlf (); copy_template env (varenv, filenv) [('b', Val b); ('t', Val tok)] [] "conf"; } ; value gwtp_main str env b tok = do { printf "content-type: text/html"; crlf (); crlf (); copy_template env ([], []) [('b', Val b); ('t', Val tok); ('w', Val gw_site.val)] [('c', Sys.file_exists (Filename.concat gwtp_dst.val (b ^ ".gwf"))); ('g', Sys.file_exists (Filename.concat gwtp_etc.val "ged2gwb")); ('w', gw_site.val <> "")] "main"; } ; value gwtp_login str env = do { printf "content-type: text/html"; crlf (); crlf (); printf "\ Gwtp

Gwtp

Database:
Password:
" (cgi_script_name ()); } ; (* Wrappers *) value gwtp_check_login from str env gwtp_fun = match (HttpEnv.getenv env "b", HttpEnv.getenv env "p") with [ (Some b, Some p) -> match check_login b p with [ Some tok -> do { set_token from b tok; gwtp_fun str env b tok; } | None -> gwtp_error "Invalid login" ] | _ -> gwtp_invalid_request str env ] ; value gwtp_logged from str env gwtp_fun = match (HttpEnv.getenv env "b", HttpEnv.getenv env "t") with [ (Some b, Some t) -> let fname = tokens_file_name () in if check_token fname from b t then do { try gwtp_fun str env b t with e -> do { update_tokens fname from b t; raise e }; update_tokens fname from b t; } else gwtp_error "Login expired" | _ -> gwtp_invalid_request str env ] ; (* Main *) value log oc_log str = let tm = Unix.localtime (Unix.time ()) in let user_agent = try Sys.getenv "HTTP_USER_AGENT" with [ Not_found -> "" ] in let referer = try Sys.getenv "HTTP_REFERER" with [ Not_found -> "" ] in let from = try Sys.getenv "REMOTE_HOST" with [ Not_found -> try Sys.getenv "REMOTE_ADDR" with [ Not_found -> "" ] ] in do { fprintf oc_log "%4d-%02d-%02d %02d:%02d:%02d" (1900 + tm.Unix.tm_year) (succ tm.Unix.tm_mon) tm.Unix.tm_mday tm.Unix.tm_hour tm.Unix.tm_min tm.Unix.tm_sec; fprintf oc_log " %s?%s\n" (cgi_script_name ()) str; if from <> "" then fprintf oc_log " From: %s\n" from else (); if user_agent <> "" then fprintf oc_log " Agent: %s\n" user_agent else (); if referer <> "" then fprintf oc_log " Referer: %s\n" referer else (); } ; value gwtp () = let content_type = cgi_content_type () in let content = cgi_content () in let from = cgi_from () in let (str, env) = HttpEnv.make content_type content in let oc_log = log_open () in do { log oc_log str; flush oc_log; Unix.dup2 (Unix.descr_of_out_channel oc_log) Unix.stderr; match HttpEnv.getenv env "m" with [ Some "LOGIN" -> gwtp_check_login from str env gwtp_main | Some "MAIN" -> gwtp_logged from str env gwtp_main | Some "DNL" -> gwtp_logged from str env gwtp_download | Some "CNF" -> gwtp_logged from str env gwtp_config | Some "RECV" -> gwtp_logged from str env gwtp_receive | Some "SCNF" -> gwtp_logged from str env gwtp_setconf | Some "LOG" -> gwtp_logged from str env gwtp_print_log | Some "ACCW" -> gwtp_logged from str env (gwtp_print_accesses True) | Some "ACCF" -> gwtp_logged from str env (gwtp_print_accesses False) | Some "UPL" when not no_upload.val -> gwtp_logged from str env gwtp_upload | Some "UPG" when not no_upload.val -> gwtp_logged from str env gwtp_upload_gedcom | Some "SEND" when not no_upload.val -> gwtp_logged from str env gwtp_send | Some "SEND_GEDCOM" when not no_upload.val -> gwtp_logged from str env gwtp_send_gedcom | Some _ -> gwtp_invalid_request str env | None -> gwtp_login str env ]; flush stdout; flush oc_log; close_out oc_log; } ; value usage_msg = "Usage: gwtp"; value speclist = [("-tmp", Arg.String (fun x -> gwtp_tmp.val := x), ": directory for gwtp stuff; default: " ^ gwtp_tmp.val); ("-dst", Arg.String (fun x -> gwtp_dst.val := x), ": directory for databases; default: " ^ gwtp_dst.val); ("-log", Arg.String (fun x -> gwtp_log.val := x), ": directory for log file; default: " ^ gwtp_tmp.val); ("-etc", Arg.String (fun x -> gwtp_etc.val := x), ": directory for passwd, default.gwf and lang files; default: " ^ gwtp_tmp.val); ("-site", Arg.String (fun x -> gw_site.val := x), ": site (if any) where databases are accomodated"); ("-noup", Arg.Set no_upload, "no upload"); ("-tmout", Arg.Float (fun x -> token_tmout.val := x), ": tokens time out; default = " ^ string_of_float token_tmout.val ^ " sec") ] ; value anonfun _ = do { Arg.usage speclist usage_msg; exit 2 }; value main () = do { Arg.parse speclist anonfun usage_msg; if gwtp_log.val = "" then gwtp_log.val := gwtp_tmp.val else (); if gwtp_etc.val = "" then gwtp_etc.val := gwtp_tmp.val else (); gwtp (); } ; try main () with exc -> do { eprintf "Exception raised: %s\n" (Printexc.to_string exc); flush stderr; }; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/gwtp/httpEnv.ml0000660000175200017530000001542612664543647023374 0ustar guillaumeguillaume(* $Id: httpEnv.ml,v 5.1 2006-10-15 15:39:38 ddr Exp $ *) open Printf; (* Decode/Encode for URLs *) value hexa_val conf = match conf with [ '0'..'9' -> Char.code conf - Char.code '0' | 'a'..'f' -> Char.code conf - Char.code 'a' + 10 | 'A'..'F' -> Char.code conf - Char.code 'A' + 10 | _ -> 0 ] ; value decode s = let rec need_decode i = if i < String.length s then match s.[i] with [ '%' | '+' -> True | _ -> need_decode (succ i) ] else False in let rec compute_len i i1 = if i < String.length s then let i = match s.[i] with [ '%' when i + 2 < String.length s -> i + 3 | _ -> succ i ] in compute_len i (succ i1) else i1 in let rec copy_decode_in s1 i i1 = if i < String.length s then let i = match s.[i] with [ '%' when i + 2 < String.length s -> let v = hexa_val s.[i + 1] * 16 + hexa_val s.[i + 2] in do { Bytes.set s1 i1 (Char.chr v); i + 3 } | '+' -> do { Bytes.set s1 i1 ' '; succ i } | x -> do { Bytes.set s1 i1 x; succ i } ] in copy_decode_in s1 i (succ i1) else s1 in let rec strip_heading_and_trailing_spaces s = if String.length s > 0 then if s.[0] = ' ' then strip_heading_and_trailing_spaces (String.sub s 1 (String.length s - 1)) else if s.[String.length s - 1] = ' ' then strip_heading_and_trailing_spaces (String.sub s 0 (String.length s - 1)) else s else s in if need_decode 0 then let len = compute_len 0 0 in let s1 = Bytes.create len in strip_heading_and_trailing_spaces (copy_decode_in s1 0 0) else s ; value hexa_digit x = if x >= 10 then Char.chr (Char.code 'A' + x - 10) else Char.chr (Char.code '0' + x) ; value special = fun [ '\000'..'\031' | '\127'..'ÿ' | '<' | '>' | '"' | '#' | '%' | '{' | '}' | '|' | '\\' | '^' | '~' | '[' | ']' | '`' | ';' | '/' | '?' | ':' | '@' | '=' | '&' -> True | _ -> False ] ; value encode s = let rec need_code i = if i < String.length s then match s.[i] with [ ' ' -> True | x -> if special x then True else need_code (succ i) ] else False in let rec compute_len i i1 = if i < String.length s then let i1 = if special s.[i] then i1 + 3 else succ i1 in compute_len (succ i) i1 else i1 in let rec copy_code_in s1 i i1 = if i < String.length s then let i1 = match s.[i] with [ ' ' -> do { Bytes.set s1 i1 '+'; succ i1 } | c -> if special c then do { Bytes.set s1 i1 '%'; Bytes.set s1 (i1 + 1) (hexa_digit (Char.code c / 16)); Bytes.set s1 (i1 + 2) (hexa_digit (Char.code c mod 16)); i1 + 3 } else do { Bytes.set s1 i1 c; succ i1 } ] in copy_code_in s1 (succ i) i1 else s1 in if need_code 0 then let len = compute_len 0 0 in copy_code_in (Bytes.create len) 0 0 else s ; (* Env from a string *) value rec skip_spaces s i = if i < String.length s && s.[i] = ' ' then skip_spaces s (i + 1) else i ; value create_env s = let rec get_assoc beg i = if i = String.length s then if i = beg then [] else [String.sub s beg (i - beg)] else if s.[i] = ';' || s.[i] = '&' then let next_i = skip_spaces s (succ i) in [String.sub s beg (i - beg) :: get_assoc next_i next_i] else get_assoc beg (succ i) in let rec separate i s = if i = String.length s then (s, "") else if s.[i] = '=' then (String.sub s 0 i, String.sub s (succ i) (String.length s - succ i)) else separate (succ i) s in List.map (separate 0) (get_assoc 0 0) ; value getenv env label = try Some (decode (List.assoc label env)) with [ Not_found -> None ] ; (* Multipart env *) value is_multipart_form = let s = "multipart/form-data" in fun content_type -> let rec loop i = if i >= String.length content_type then False else if i >= String.length s then True else if content_type.[i] = Char.lowercase s.[i] then loop (i + 1) else False in loop 0 ; value extract_boundary content_type = let e = create_env content_type in List.assoc "boundary" e ; value strip_quotes s = let i0 = if String.length s > 0 && s.[0] = '"' then 1 else 0 in let i1 = if String.length s > 0 && s.[String.length s - 1] = '"' then String.length s - 1 else String.length s in String.sub s i0 (i1 - i0) ; value extract_multipart boundary str = let rec skip_nl i = if i < String.length str && str.[i] = '\r' then skip_nl (i + 1) else if i < String.length str && str.[i] = '\n' then i + 1 else i in let next_line i = let i = skip_nl i in let rec loop s i = if i = String.length str || str.[i] = '\n' || str.[i] = '\r' then (s, i) else loop (s ^ String.make 1 str.[i]) (i + 1) in loop "" i in let boundary = "--" ^ boundary in let rec loop list i = if i = String.length str then list else let (s, i) = next_line i in if s = boundary then let (s, i) = next_line i in let s = String.lowercase s in let env = create_env s in match (getenv env "name", getenv env "filename") with [ (Some var, Some filename) -> let var = strip_quotes var in let filename = strip_quotes filename in let i = skip_nl i in let i1 = loop i where rec loop i = if i < String.length str then if i > String.length boundary && String.sub str (i - String.length boundary) (String.length boundary) = boundary then i - String.length boundary else loop (i + 1) else i in let v = String.sub str i (i1 - i) in let list = [(var, v, False); (var ^ "_name", filename, True) :: list] in loop list i1 | (Some var, None) -> let var = strip_quotes var in let (s, i) = next_line i in if s = "" then let (s, i) = next_line i in loop [(var, s, True) :: list] i else loop list i | _ -> loop list i ] else if s = boundary ^ "--" then list else loop list i in let env = loop [] 0 in let (str, env, _) = List.fold_left (fun (str, env, sep) (v, x, b) -> let (str, sep) = if b then (str ^ sep ^ v ^ "=" ^ x, ";") else (str, sep) in (str, [(v, x) :: env], sep)) ("", [], "") env in (str, env) ; value make content_type str = if is_multipart_form content_type then let boundary = extract_boundary content_type in let (str, env) = extract_multipart boundary str in (str, env) else (str, create_env str) ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/gwtp/.depend0000660000175200017530000000125012664543647022640 0ustar guillaumeguillaumegwtp.cmo: ../src/buff.cmo ../src/dbdisk.cmi httpEnv.cmo iolight.cmo \ ../src/lock.cmi ../src/mutil.cmi ../src/outbase.cmi ../src/secure.cmi \ ../src/translate.cmi gwtp.cmx: ../src/buff.cmx ../src/dbdisk.cmi httpEnv.cmx iolight.cmx \ ../src/lock.cmx ../src/mutil.cmx ../src/outbase.cmx ../src/secure.cmx \ ../src/translate.cmx iolight.cmo: ../src/buff.cmo ../src/dbdisk.cmi ../src/def.cmi \ ../src/iovalue.cmi ../src/mutil.cmi ../src/secure.cmi iolight.cmx: ../src/buff.cmx ../src/dbdisk.cmi ../src/def.cmi \ ../src/iovalue.cmx ../src/mutil.cmx ../src/secure.cmx recover.cmo: iolight.cmo ../src/outbase.cmi recover.cmx: iolight.cmx ../src/outbase.cmx geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/gwtp/recover.ml0000660000175200017530000000100212664543647023372 0ustar guillaumeguillaume(* camlp5r *) (* $Id: recover.ml,v 5.3 2007-09-12 09:58:44 ddr Exp $ *) open Printf; value recover db = let base = Iolight.input db in Outbase.output "a" base ; value database = ref ""; value usage_msg = "Usage: recover base.gwb"; value speclist = []; value anonfun db = database.val := db; value main () = do { Arg.parse speclist anonfun usage_msg; recover database.val; } ; try main () with exc -> do { eprintf "Exception raised: %s\n" (Printexc.to_string exc); flush stderr; }; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/gwtp/README0000660000175200017530000000500712664543647022264 0ustar guillaumeguillaumeWhat is gwtp? Gwtp is a CGI program allowing owners of databases accomodated in a GeneWeb site to upload and download their databases on the site and change their configuration parameters. Installation on an Unix Web server In the site machine, create a directory which is *not* accessible on the Web, with any name you want. In that directory, copy the executable 'gwtp' the directory 'lang' and its contents, and create an empty file named 'passwd'. Put all read/write access rights (chmod a+rw) to that directory. Go to the cgi-bin directory and create you CGI (e.g. gwtp.cgi), holding the following lines, replacing the texts between brackets by the correct values: #!/bin/sh tmp=[the above directory holding gwtp, lang and passwd] dst=[the directory holding the GeneWeb databases] site=[the URL of the GeneWeb site] cd $tmp ./gwtp -tmp $tmp -dst $dst -site $site The above variable 'site' is the Web address of a GeneWeb database *minus* its name. Things like that: http://my.site.net/cgi-bin/geneweb.cgi?b= http://my.site.net:2317/ Make your CGI executable: chmod a+x gwtp.cgi Then, when accessing that CGI, people get a login page where they have to enter a database name and a password. Adding an user To add a new accomodated database, just add a line in the passwd file of the directory $tmp above, holding: base:passwd replacing "base" by the name of the database you want and "passwd" by a complicated enough password. Send these values to the database owner. The database owner can then access the CGI and log in. The first time, he has to configure his database parameters; once done, he can upload his database. Later, using the same login, he can at any time change his configuration, or upload or download his GeneWeb database. Removing an user Remove his entry in the passwd file, delete his GeneWeb database (directory ending with ".gwb"), and delete his database configuration file (file ending with ".gwf"). Default values If you want to set default configuration variables values, create a file named 'default.gwf' in the directory $tmp holding the default variables bindings you want (e.g. can_send_image=no). This file will be copied at the beginning of the user configuration file. Sending gedcom files By default, the cgi does not allow to send gedcom files: people have to send the contents of their database. But if you add the executable "ged2gwb" in the directory corresponding to the option -etc of gwtp, (by default, same than -tmp), a link to send gedcoms is proposed in the main menu. geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/INSTALL0000660000175200017530000000313712664543647021456 0ustar guillaumeguillaumeINSTALLATIONS INSTRUCTIONS IN UNIX or MACOSX MACHINES For the compilation, you need the Objective Caml compiler installed in your computer. The compilation works for several versions of ocaml. You also need the preprocessor camlp5. They freely distributed at address: http://caml.inria.fr/ocaml/ http://pauillac.inria.fr/~ddr/camlp5/ 1- In the top directory, do: ./configure 2- If the command ocamlc.opt is not installed, edit the file "tools/Makefile.inc" and change: OCAMLC=ocamlc.opt OCAMLOPT=ocamlopt.opt into OCAMLC=ocamlc OCAMLOPT=ocamlopt 3- If your platform has the command ocamlopt, do: make Otherwise do (warning: slower executables): make out 4- Do: make distrib This creates a directory "distribution" where all executables programs and documentation are copied. This can constitute a "distribution" directory if you want to distribute executables. 5- To use GeneWeb, move the directory "distribution" to another place, or rename it. Go to this directory and launch the command "./gwsetup". The reason why it is better to move this directory is that "make clean" deletes it, and another "make distrib" overwrites it. If you created genealogic databases inside, they would be deleted. INSTALLATIONS INSTRUCTIONS IN WINDOWS NT/95/98 You need: - The Cygnus GNU-Win32 development tool, free (search in the Web) - The Microsoft Visual C++ compiler. - The Microsoft Assembler masm. - The Objective Caml compiler. - The Camlp5 preprocessor. Follow the same instructions above than for the Unix installation. geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/.gitignore0000660000175200017530000000077212664543647022417 0ustar guillaumeguillaume*.annot *.cmo *.cma *.cmi *.a *.o *.cmx *.cmxs *.cmxa *.ppo distribution ged2gwb/ged2gwb ged2gwb/ged2gwb.opt ged2gwb/ged2gwb2 ged2gwb/ged2gwb2.opt gwb2ged/gwb2ged gwb2ged/gwb2ged.opt gwtp/gwtp gwtp/gwtp.opt setup/gwsetup setup/setup.opt src/compilation.ml src/gwlib.ml src/check_base src/check_base.opt src/consang src/consang.opt src/gwc src/gwc1 src/gwc1.opt src/gwc2 src/gwc2.opt src/gwd src/gwd.opt src/gwu src/gwu.opt src/update_nldb src/update_nldb.opt tools/Makefile.inc tools/Makefile.ocaml geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/configure0000770000175200017530000000333012664543647022326 0ustar guillaumeguillaume#!/bin/bash OCAML_MIN_VER="4.02" verge() { # osx doesn't have sort -V # [ "$2" = "`echo -e "$1\n$2" | sort -V | head -n1`" ] [ "$2" = "`echo -e "$1\n$2" | tr ' ' '\n' | sort -n | head -n1`" ] } if ocamlc -v >/dev/null 2>&1; then echo "ocamlc ... OK" else echo "You need the command ocamlc accessible in the path!" echo "Configuration script failed!" exit 1 fi OCAML_VER="`ocamlc -version`" if verge "$OCAML_VER" "$OCAML_MIN_VER"; then echo "ocamlc version $OCAML_VER >= $OCAML_MIN_VER ... OK" else echo "OCaml version $OCAML_MIN_VER or newer needed" echo "Configuration script failed!" exit 1 fi if camlp5 -v >/dev/null 2>&1; then echo "camlp5 ... OK" else echo "You need the command camlp5 accessible in the path!" echo "Configuration script failed!" exit 1 fi if [ "`echo 'print_endline Sys.os_type;;' | ocaml -stdin -noprompt`" = "Unix" ]; then echo "OS type ... Unix" cp tools/Makefile.inc.unix tools/Makefile.inc else echo "OS type ... Windows" cp tools/Makefile.inc.win tools/Makefile.inc fi D_GW_DIR=`pwd`/ if test -e "tools/Makefile.inc"; then sed "s|^\(GW_DIR=\).*|\1$D_GW_DIR|" tools/Makefile.inc > tools/Makefile.inc.tmp mv tools/Makefile.inc.tmp tools/Makefile.inc fi cp tools/Makefile.ocaml.inc tools/Makefile.ocaml if ocamlfind printconf >/dev/null 2>&1; then : else echo "Could not find ocamlfind in the path." echo "You may need to update Makefile.ocaml by hand." exit 1 fi D_CAMLP5D=`ocamlfind query camlp5`/ if test -e "tools/Makefile.ocaml"; then sed "s|^\(CAMLP5D=\).*|\1$D_CAMLP5D|" tools/Makefile.ocaml > tools/Makefile.ocaml.tmp mv tools/Makefile.ocaml.tmp tools/Makefile.ocaml fi echo "Configuration script succeeded!" geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/CHANGES0000660000175200017530000047124612664543647021432 0ustar guillaumeguillaumeGeneWeb version 6.08 -------------------- * Added scripts created by Daniel. See contrib/gwbase. * Mainly, bug fixes. GeneWeb version 6.07 -------------------- * Added a detailed history. It allows you to compare two modifications of an individual and see what have changed. * New design for the search form in the welcome page. Instead of 3 radio buttons, there is now 3 input text. The first one allow you to search by first names. The second one by names. The last one by key (first name.occ surname), public name, alias, sosa ... One trick is possible, you can enter first name(.occ) and name in the respective field and it will search by first name and surname. * Added the warning BigAgeBetweenSpouses, DeadOld (if dead after 1900 and aged of 105 years old or if dead before 1900 and aged of 100 years old), OldIndividual (if not dead and aged more than 120 years old). Specify if the warning "marriage before/after birth/death" applies to a witness or a couple. * Fix import Gedcom option for uppercase/lowercase name when using utf8. * New output : missing events. * Other small things... GeneWeb version 6.06 -------------------- * ! New ! You can try the new graphical interface of GeneWeb. It's supposed to replace gwsetup at the end. Right now, it's a beta version so every thing is not finnished yet. Feedback is welcome. * Add three new warnings : ChangedOrderOfMarriages, CloseSiblings and ParentTooOld. Activate the warning YoungForMarriage. * Change totally the way to notify and record the changes of a base. There is now only one variable in your gwf file (notify_change) so you should update your script if you were using notify_delete and notify_key. You should then test in your script notify_change the kind of action : "dp" -> delete person (see upthist.txt for the complete list of action) ... The order of the argument are : base wizard action [variable arguments] In the variable arguments, you may have : - KEY old_key new_key - VISIBLE key boolean This modification should allow in a close future to be able to see what was exactly modify in a person/family (eg: birth place, marriage date ...). * Add a "book of sources" and "book of occupations" just like the "book of places". The three functions uses the same variable in the gwf file: max_nb_updates (you should then update your gwf files). This variable allows to set up the maximum number of updates that can be done at a single time. Plus, this page is available as a template. For those who changed the values in updind and updfam template for the fields place, source, occupation, beware to put the right value in the upddata template. * Add a field in the advanced request to search in the marriage informations. This is just a small evolution, it is not meant to add other searching fields again and again. * Add the occupation in the edition of a family form. One can create a family and specify the occupation of the father/mother and the children. This is again a small evolution, it is not meant to add other fields again and again. * Add two new outputs : "liste-éclair" (Tiny tafel) and "book of ascendants". * "Better" display in the ascendants/descendants menu/list/tree and the relatives outputs. Add a few new options in the ascendants/descendants list/tree. * The way a date is displayed is now completely depedant of the "date order" in the language dictionnary. For exemple, if your date order is dd/mm/yyyy, your date will be 01/02/1880. If instead it's d/m/yyyy, it will be displayed as 1/2/1880. Format accepted now are : - dmyyyy - mmddyyyy - yyyymmdd or yymmdd - ddmmyyyy or ddmmyy * Add the evaluation functions of a date (year, month, day, prec) in the template (interpreted by perso.ml). * Display the history of updates in a table. * Other small things... GeneWeb version 6.05 -------------------- * Optimization of the sosa computing in the template. Can be 3 to 40 times faster (mainly with the option display_sosa=yes). * New organization of the relationship computing page. Cousin and Relation are now in the same page. Should be easier to use (javascript must be activated). * New ouput in the ascendants and descendants menu : display in table. * Added a link to browse in the descendants tree as in the ascendants tree. * Added a warning in case the source field is not complete. Beware, it may not behave as you think. In order not to spoil the display, the warning will be display only like this : if there is any family sources then OK (no warning) else if there is any individual sources for him AND her then OK (no warning) else Warning missing sources * Add a warning if a witness is born/dead after/before marriage. * If you define a "sosa ref" in your gwf file, then GeneWeb will keep the gwf file up to date when the user modify the base (and potentially this individual). * Added the notify_key when changing the name of the children and check if the "sosa ref" has changed. * In case of homonyms (creation of individual/family), display the spouses of the homonyms in the list. * When searching for a surname, the more there is answers the more the result will be displayed in many columns. * New template : annivmenu.txt. This page contains all the links related to an anniversary (birth, marriage, death...) * Lifting of gwsetup. I hope the menu is a bit clearer. * Some modifications in perso.txt (modify menu ...) * Add the option -add_lexicon to dictionnaries. * Add the option -nopicture in order not to import picture of GEDCOM/GW. * Added the template of the 5.02 version (named templ502). * Update copyright * Update lex_utf8.txt. * Delete file README and INSTALL that pointed to an old documentation. * Various fixes. Dominique DERAM : * Update of template A, B, C, D, F, H : ** New directory templx for the templates anclist, ancsosa, anctree. It will be used by the template a, b, c, d, f, h. ** Update copyrigth ** Various fix of minors bugs and improvements. Mickaël Rouesné: * Update of template M : ** css.txt : refactoring of the css. ** perso.txt : - Display the number of ascendants and descendant. - If misc=on (in the gwf file) or opt=misc (in the URL), then display the wiki links, index and ID (reference key) of the individual in the bottom of the page. - Vertical Family Tree with 4 generations. - Open the update individual/family form in a new page and automatic relead after clicking on the [x] at the bottom of the page. ** ancmenu, ancsosa, anclist, anctree : fix bug in evar.v. ** ancsosa : improve the surname list, add occupations, update style. GeneWeb version 6.04 -------------------- * You can now custom (more easily) the template perso by setting the right variables in the gwf files. Have a look at this page for the full documentation : http://opensource.geneanet.org/projects/geneweb/wiki/En_template#Personnaliser-les-fiches-individu * Template perso.txt : the update menu is now in the top of the page and split into : - update this person (shortcut to update this person directly) - update menu (the classic menu) * Variation of the favicon in the templates : perso, ancmenu, updmenu, relmenu, desmenu, cousmenu. Display the sex of the person as favicon. * Added the age of the individual in perso.txt * New search of the template files. This is now longer needed to copy the template files in the base. This evolution is backward compatible and works like this : - search in base/etc/mybase/name.txt - search in gw/etc/template/name.txt - search the first default template according to the template variable (gwf) * Notify_key is now called each time an individual is modified AND his key has changed. This is basically in the Modify individual and Merge individual. * Added a notify_delete that works just like notify_key * Added a nofollow option on the link in the search page (the number of branches and the 'o' to fold/unfold. * Update lex_utf8 and the particules files. The last one is now the same as the generated (by GeneWeb) one. * Added 'area' and 'map' in the default HTML tags * Added an option in the ged2gwb tool. It behaves like previously, i.e. default relation for a couple is Married. If someone prefer, one can use the option -rs_no_mention to set the relation status to NoMention. * Added a new intruction in the template langage : FOR. It is a simple instruction, and could be improved later but for now it works like this : for (i=MIN; i in template language : %for;i;MIN;MAX .... %end; You can define any variable for iterator and you can used it in the loop. This variable lives only in the loop. Thus it behaves like this : %let;i;42%in %i; %for;i:0:10; %i; %end; %i; OUTPUT => 42; 0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 42 * Added an option to *not* try a getHostByName. Could slow down on windows. One should add -no_host_address to gwd to use this feature. * New implementation of the fonction that calculate if a person has a sosa number or not. Much more efficent than the previous one ! * It is now NOT possible to add or modify a family in which the first name or the surname of a person is not specify. => It can break the generation of the gw file. * Added a return button when there had been an error in a modification of a person or a family. * Fix the wedding anniversary list only if the couple is not divorced * Added an "happy birthday" for the wedding anniversary in the individual page * Added the operator '/' (DIV) in the template language * Fix the calculs in case there is more than a thousand number in templm * Fix the duplicates of adresse in gwc2. Now the book of places if working completly in gwc1 and gwc2 Daniel de Rauglaudre: * Fix bug (limitation of the int size in OCaml). Now in 64 bits architecture, the maximum number of persons is more than 18 billions (in 64 bits only !!) * Added an option to limit the computation time of the consang Ondrej Blazo: * New language available (Slovak) thanks to him ! Ludovic Ledieu: * Fix the searching path for template in the CSS Mickaël Rouesné: * Fix the wrong display of tag
with IE. * Update of template M : ** delete file updhist.txt ** added calendar.txt : link to statistics, pyramid of age, anniversary, if calendar is republican, display the full date ** added the languages in welcome.txt ** ancsosa, deslist : added the divorce date, and state ** ancmenu, desmenu : added the first_name alias ** updfam, updind : refactoring and added javascript controller ** trl : added the link to the other templates GeneWeb version 6.03 -------------------- * Added an option to authorized or not the wizards notes. By default, notes are not allowed. One must specified authorized_wizards_notes=yes in the gwf to allowed them. * Added the tool update_nldb to update the wiki's note in the database * Fix bug in the access rights of a person's occ. It was possible to have an invalid request in a relationship calculus. * Delete some duplicates files (README/LISEZMOI/LICENCE) * Added gwc2 and ged2gwb2 in the gwsetup tool * In the advanced search, if the number of results is more than the max defined, then it display the "max first" results instead of "too many results" * Added a book of places (see a.gwf to specify the maximum number of event that can be corrected in one pass. !!! Beware !!! This functionnality is not completly functionnal when using gwc2. You can not edit twice the same place. If you want to edit more than one time one place, you have to do a consang between each modifications (because it will recalculate the indexs). * Fix the regression of rtl/ltr display in some pages * When using ged2gwb, the status of a family is now by default NoMention. * Added the sosa picture in the advance search * In the place/surname search, one can now search only for baptism or burial (which was before included in birth and death). * Display the picture of an individual inline instead of attachment * In the surname search, if the surname was not found, display the results in ncols (you can specify it directly in the URL: ncols =x). * Added spouse (if exists) in the descendants tree * various source code refactoring Ludovic Ledieu : * Fix the truncate name and uncaught exception : end of file in the forum * Interpretation of the 'is_invisible' variable in the updhist.txt template * Better management of the variable 'referer' (link to welcome and previous page) * New implementation of the 'place/surname' request that corrects the html errors * New implementation of CSS as a template (css.txt) * Tree displaying (dag and RL) compliant with XHTML * Better W3C compliance * Fix wrong display for advanced request in welcome page * rewrite old templates so that they uses common language : index.txt, moved.txt, redirect.txt, renamed.txt, robot.txt (no favicon, no image, no css since the client has no access) Dominique Deram : * Update templates a, b, c, d, f, and h Mickaël Rouesné : * Update template m GeneWeb version 6.02 -------------------- * In the population pyramid, display an image instead of  . The purpose is that it can be printed now. * Added a patch in the calculus of the sosa until the number of person in the database is well managed. * Some esthetic changes * Change "href=#" by "void" because internet explorer does'nt support it (go to the top of the page). * Fix bug (in the source code, not the template) in updating a death date from OfCourseDead to Dead if there is actually a date of death. * Deleting the documentation (DOC ans WDOC) and the associated request. * Added an option to activate/deactivate the forum. * Added an option to turn on/off the counter for visiting web pages. * Change the order of displaying the note/source in the individual page. The family note/source comes before the informations of death of the individual. * Added execution rights to configure and camlp5_comm.sh. Geneweb can now be compiled out of box (I mean after svn co). * Fix bug in the GeneWeb server in CGI mode. Should not answer 200 OK. * Fix bug in the death date by merging two individuals. * Add a function to delete bad characters (such as ':') in the first name and surname (that compose the key) and broken the links. * Added template of Dominique Deram and Mickaël Rouesné. * New implementation of the surname search function. There is now no differences between capital letters, accent ... GeneWeb version 6.01 -------------------- For this version, you will not find a tag of GeneWeb 6.01 because I forgot it. Few changes since 6.00 (which was set up to start a new developpement of GeneWeb). * Add an option to display the day of a date. * Add notes/sources in the descendants list. * Fix bug creating a loop when adding a family and creating a father and mother bug linking the child to his parent (with the same name of course !). GeneWeb version 6.00 -------------------- Sorry, I forgot to add the "new" feature for this version. Hopefully there is basically no new feature. * Add a picto sosa next to a person after a research (by first name/surname). * Fix bug in hidding individual of the same family. * Fix bug in showing individual by first name whereas there were hidden. * Use of css sheetstyle to customize the pages. GeneWeb version 5.02.0 ---------------------- * [17 Jan 2011] Fixed compilation problem if using Camlp5 version < 5.12. GeneWeb version 5.02 -------------------- * [10 Mar 2009] Fixed bug: in arch 64 bits, databases built with gwc2 did not work. * [21 Jan 2008] In merge individuals, adding warning message if the order of the siblings of the first individual has changed due to possible birth date added by the second individual. * [09 Jan 2008] Fixed bug in "relationship by marriage" when there are relations with persons of same sex and for languages having differences for the term "spouse" depending on the sex. The term was incorrect (using "husband" instead or "wife" or "wife" instead of "husband"). * [08 Jan 2008] In death cases, added case "of course dead": like "dead don't know when", but 1/ inferred when the person is very very old but don't have a death date 2/ the text "dead" is no displayed in personal pages. * [08 Jan 2008] In update family form, added ability to put "p" in the birth year field to specify "public". * [07 Jan 2008] In forum, when moderated, added displaying of wizard's messages not yet validated (in red) to allow them to possibly delete them. * ... other things added, modified or fixed. These changes were not recorded here, because lazyness... GeneWeb version 5.01 -------------------- * New database system with command gwc2. * Numerous small improvements and bug fixes. GeneWeb version 5.00 -------------------- Preliminary remark: I neglected to record the changes between January 2005 and July 2005, but there are a lot of them... I complete the missing part when I have some time (and some courage). Feb 2007 : the courage have not continued... the changes done since several months have not been recorded. This Version allows to mix pages in different languages (using utf-8 encoding). Databases version <= 4.10 can be read but still in old encoding. By re-creating the database, the new encoding is set. The new version number (5.00) is in honour of this new encoding. * New features : Wiki syntax and miscellaneous Notes - [06 Oct 05] It is now possible to use a specific ("Wiki") syntax inside database notes, individual notes, wizard notes and database forum. It is also possible to add new "miscelleneous notes". The syntax is close to the one used by Wikipedia (see Web). In database notes and wizard notes, an automatic summary is displayed. Wiki syntax and HTML syntax can be both used in the same page. The Wiki syntax is: - Lines starting with from 1 to 6 '=' and ending with the same number of '=' are section titles (1 = most important.. 6 = less important). If the text is modifiable, they can be independantly editable (a link "(modify)" is displayed to allow it). - An empty line makes a new paragraph. - Group of at least 2 lines starting with space and with an empty line before and after the group of lines are displayed are they are with a fixed size font. - Lines starting with one or several '*' are list items. The number of '*' is the list level (must start with one '*' then two '**' etc.) - Lines starting with one or several '#' are numbered list items. - Lines starting with ':' are indented. - Lines starting with ';' return to new line; if the line contain ':' the part after that ':' is displayed indented in a new line - Text between '' are displayed in Italic. - Text between ''' are displayed in Bold. - Text between ''''' are displayed in Bold-Italic. - Text between { and } is displayed with GeneWeb highlight (bold green by default). - Characters ' [ ] { } can be displayed as they are if prefixed by %. - The syntax [[first_name/surname/oc/text]] makes a link to the individual with key (firstname, surname, oc) with 'text' displayed. Simplified syntaxes: if oc = 0, [[fn/sn/t]] can be used, and [[fn/sn]] is equivalent to [[fn/sn/0/fn sn]]. - The syntax [[[name/text]]] makes a link to a "miscelleneous note" (new feature), an independant page which can be edited (if updating allowed), and using Wiki syntax also. The page name is 'name' (only letters, digits and '_' allowed) and 'text' is displayed as link. If the page does not exist, the link is displayed in red. These new pages are saved by gwu only if they did not become isolated (= no more linked by database notes, individual notes, wizard notes nor another (recursively) linked miscelleneous note). Simplified syntax [[[name]]] displays 'name' as link text. - If there is a line containing '__NOTOC__' the summary is not displayed. - If there is a line containing '__TOC__' the summary is displayed at this place instead of the default place. - If there is a line containing '__SHORT_TOC__' a short summary is displayed. * GeneWeb server or CGI (gwd) - [30 Jan 06] In displaying ancestors by tree, added the ability to have the marriage date between the spouses. - [10 Nov 05] The ancestors and descendants page displays the number of persons in the menu. - [16 Oct 05] Added a system for list of only allowed nobility titles. - [06 Oct 05] The database forum can be moderated. - [02 Sep 05] Added a "search" form in database forum. - [17 Aug 05] The pages "statistics", "history of updates", "database forum", "calendars", and some pages displaying relationship links by trees are now customizable. They resp. use the template files "stats.txt", "updhist.txt", "forum.txt", "calendar.txt" and "dag.txt". - [23 Jul 05] All "ancestors" pages are now customizable. Depending to the kind of page, they use the new template files: "ancmenu.txt", "ancsosa.txt", "anctree.txt" and "anclist.txt". - [02 Jan 05] Each complete date has a link to the calendars page. - [20 Dec 04] Fixed bug: in display places/surnames, when vars are used in base configuration file (base.gwf), the alphabetical order was done before the vars substitutions. * GeneWeb compiler (gwc) and GeneWeb uncompiler (gwu) - [13 Jul 05] Wizards notes are now saved and restored. * GeneWeb databases Transfer Program (gwtp) - [08 Jan 05] Fixed bug: databases created by version 4.10 could not be uploaded. GeneWeb version 4.10 -------------------- * Languages - [29 Jan 04] Added "Breton" (Tepod Gwilhmod, Gwenael Emelyanoff, Bertrand Yeurc'h). * GeneWeb server or CGI (gwd) - [06 Nov 04] In statistics, added displaying of oldest couples perhaps still alive and engaged. - [06 Jan 04] Fixed bug: when changing a child's name using "change children's names", the possible image was not renamed, causing its disparition. - [05 Jan 04] Added database configuration variable "show_consang": when set to "no" the possible consanguinity is not displayed in personal pages. Added also variable "fast_alphabetic": when set to "yes", the alphabetic display of surnames or first names is fast but the number of surnames of fist names is not displayed (interesting for large databases). - [04 Dec 03] Fixed bug: in case of two wizards make changes at the same time, there were (rare) cases where one of the changes erases the other one (instead of being rejected by the message "database is locked"). - [29 Nov 03] Added optional "border" and "background color" for trees displaying (relationship links, ancestors and descendants). - [28 Nov 03] Fixed bug creating sometimes dates with null month (and not null day) resulting problems with "gwu-gwc" and "cleaning up" the database by gwsetup (happened when a date was entered with month=13 which was erroneously not rejected). - [18 Jan 03] Added a system of black list for the database forum; the environment variable "forum_exclude_file" can be set to a file name containing a list of excluded IP addresses which cannot post. In the lines of this file, the joker character "*" can be used to specify any string (e.g. "*" exclude everybody). - [14 Jan 03] In form to add message in the database forum, added buttons "private/public": only "wizards" and "friend" can see "private" messages. - [06 Jan 03] In welcome page, added wizard's name (when named). * Base configuration files (base.gwf) - [19 Mar 03] Added a variable "moved" to indicate that the database has been moved. This displays the new template file "moved.txt". * Setup program (gwsetup) - [12 Nov 03] Fixed bug: the links to the documentation did not work with modern browsers. * GeneWeb uncompiler (gwu) - [12 Feb 03] Fixed bug: exporting bad format when places containing just spaces. - [11 Feb 03] Added option -maxlev to specify a maximum number of generations (descendants only) to export. * GeneWeb databases Transfer Program (gwtp) - [08 Dec 03] Added German (Falko Trojahn). - [14 Oct 03] Added Spanish (Luis Mondesi). - [03 Jan 03] Fixed bug: when wizard notes, the "send database" did not work. GeneWeb version 4.09 -------------------- * GeneWeb server or CGI (gwd) - [30 Dec 02] Fixed security hole existing since a long time. People are invited to download this new version. - [26 Dec 02] Changed the filtering of HTML tags: in version 4.08, the principle was changed so that some tags were accepted and all other ones refused. Return to previous behaviour (some tags are refused, all other ones are accepted), except for the forum of the data base where the new behaviour is maintained. GeneWeb version 4.08 -------------------- * Languages - [26 Nov 02] Added Romanian (Erich Müller). - [12 Nov 02] Added Bulgarian (Dimiter Skordev). - [11 Sep 02] Added documentation in Italian (Latino Imparato). * GeneWeb server or CGI (gwd) - [09 Dec 02] Added link "wizard/notes" in welcome page to allow each wizard to set and modify his personal notes for the database, which are visible by everybody. Works only if the wizards are defined in a file defined by the variable "wizard_passwd_file" of the database configuration file. - [01 Dec 02] Added ability for named wizards (wizards defined in a wizard password file) to remove the messages they posted. messages in the database forum. - [14 Nov 02] Fixed bug: in database notes updates, there was no check that the update form was up to date: it was then possible to submit old versions, and there was no conflict access check (that two wizards try to change the notes at the same time). - [08 Nov 02] Fixed bad (strange) displaying of French Republican and Hebrew dates when the precision is not "Sure". - [06 Nov 02] In family form, one can now set the sex of created witnesses. - [30 Oct 02] In places/surnames pages, now the surname links point to the surname, not to a person holding this surname associated with the place: it is less useful but too many people blamed me that it was a bug. Old behaviour if the base configuration variable "place_surname_link_to_ind" is set to "yes". Configurable by the gwtp interface. - [23 Oct 02] In families forms, added shortcuts for created persons' dates: one can write: "?year" to indicate "perhaps", ">year" or "year/" to indicate "after", " item type, wrongly written "disk" instead of "disc". - [05 Mar 02] Fixed bug: the navigation supposed to avoid the "reloading" of pages (proposed in bottom of welcome pages) did not work immediately after updates. - [04 Mar 02] In CGI mode, in welcome page, the wizard and friend entries are now accessible by links, like in server mode, instead of an input form. Moreover, if cookies are accepted, when navigating, there is no visible "token" in the URL. If cookies are not accepted, the behaviour does not change. - [03 Mar 02] Fixed bug (introduced in version 4.05): in CGI mode, the images (logo, background, flags) did not appear, because they were incompletely sent (a solution to turn around this bug is to use the option -images_url). There is the same problem with the "DOC" link, the same fix works also for it, but there is no way to turn around it in version 4.05. - [02 Mar 02] Fixed bug: when clicking on somebody's link, could sometimes access the wrong person, typically when the two persons had the same combination "firstname surname" cut differently, e.g. François-Victor Hugo (first name "François-Victor", surname "Hugo") and François Victor-Hugo (first name "François", surname "Victor-Hugo"). * Gedcom to GeneWeb (ged2gwb) - [08 Mar 02] Fixed bug: the import added 5 empty lines at end of each person's notes. * Setup program (gwsetup) - [06 Mar 02] Added "cancel" buttons close to some "ok" buttons. - [05 Mar 02] Updated German in templates (Thomas Omerzu). GeneWeb version 4.05 -------------------- * GeneWeb server or CGI (gwd) - [26 Feb 02] Added the ability to set the variable "motd" in the database configuration file which is displayed in the welcome page. - [26 Feb 02] Fixed bug: when updating a person whose death date was indicated as a "text", the death menu displayed "alive". - [24 Feb 02] Fixed problem of wizard and friend connections under CGI mode which sometimes did not work. Technical features: it was due to the fact that in kind of internet connections, the origin internet address can change for the same user, resulting on no more wizard or friend connection. Now the origin internet address is no more checked, only the given token is. only the given token is. - [24 Feb 02] Fixed the problem of "disconnection" when (typically) inserting children in a family. Seemed to happen more and more often with recent versions of Windows Web navigators (symptoms: doing "update", "modify family", clicking in an "insert child" button, and doing "ok": then the browser says that the server has disconnected the connection). - [14 Feb 02] Now the header and trailer files (base.hed and base.trl) can be in only one examplary for all languages in the directory lang (of databases directory) with the ability of inline translation like in start.txt. Still searches first in subdirectories of the language identifier, for compatibility. - [02 Feb 02] Fixed bug: when merging two persons, in case of fast merge applied, some fields of the second person were lost (notes, baptism). - [02 Feb 02] Added an indication "wizard" or "friend" in upper right corner of the welcome page. - [31 Jan 02] Added a system to restrict access more strict than the "hide_private_names" system. It can be set by setting the variable "use_restrict" to "yes" in the configuration file. In this context, the hidden persons are not clickable and the relationship computing cannot go through them. (Implemented by Ludovic Ledieu.) - [30 Jan 02] Fixed (hope so!) displaying of relationship by shortest path in case of half siblings: sometimes intermediate parents were missing, introducing confusion. - [21 Jan 02] Added a link to the "gwsetup" service in bottom of pages. (The command "gwd" has a new option "-setup_link" to add that). - [11 Jan 02] Fixed bug: the macros in places were not expanded in the places/surnames pages, in descendants and in ancestors pages. * Setup program (gwsetup) - [30 Jan 02] Fixed bug: if the access path to the commands (conversions from and to gedcoms or source files, initialisation of consanguinity) contained spaces, these commands failed. - [21 Jan 02] In "parameters of the data base", added the ability to configurate other useful variables: history, images_path, hide_advanced_request, and so on. - [14 Jan 02] Big cleanup in this program: now all templates files are grouped together for all languages, which saves 250 files in the distribution! This has other advantages: 1/ easier to maintain 2/ easier to add new languages 3/ easier to extend 4/ exactly same look for all languages 5/ easier to see which sentences are missing in a language. - [13 Jan 02] Proposes now both addresses localhost and 127.0.0.1. (sometimes just one of them work and not the other). * Gedcom to GeneWeb (ged2gwb) - [16 Feb 02] Added code to get all the sources from the gedcom to the person's notes (code written by Ludovic Ledieu). - [23 Jan 02] Accept now some forms of incorrect dates which do not respect the gedcom standard (e.g. @#DJULIAN@ BEF 1580, which should be BEF @#DJULIAN@ 1580). - [22 Jan 02] Added a search for godparents inside the baptism entry: it is not gedcom standard, but some (other) genealogy software exported them that way. * GeneWeb compiler (gwc) and Gedcom to GeneWeb (ged2gwb) - [15 Jan 02] Can fix now some cases of "sex not coherent with relations", e.g. when godfather and godmother are inverted. - [13 Jan 02] Fixed bug (ged2gwb): failed under Windows if there was a first name ending with a single quote (or apostrophe) (this is a typical example of the bug, but it can happen in other circumstances: the bug comes from the option -fne). The message displayed indicating this bug is: Uncaught exception: Invalid_argument("String.index_from") - [08 Jan 02] Fixed bug (ged2gwb): the divorce dates were not imported. GeneWeb version 4.04 -------------------- * GeneWeb server or CGI (gwd) - [18 Dec 01] Fixed bug: in a read-only device (e.g. a CD-ROM), the relationship computing did not work if it has not been initialized before. - [17 Dec 01] In cousins displaying, added button to include the spouses (code written by Ludovic Ledieu). - [01 Dec 01] Fixed problem in case of changing a person's name, if the new name entered in conflict with somebody elsés (same "keys"). The proposed link "click here to try again" with the first free number could fail with some browsers (technical: the request could be truncated by the browser if too long). This have been changed into a button "create" which always works (the same change had been done for family forms, for the same problem, some time ago). - [16 Nov 01] Changed the term "switch" into "invert" (English is not my native language, I made a miskake when translating it). - [14 Nov 01] Suppressed the tag used in several displayings, because it is not html standard. Its effect was to ask not to cut too large lines. - [08 Nov 01] In database forum, display 100 headers and a link to the previous messages, instead of all headers. - [20 Oct 01] In the updates forms, the order "year/month/day" in the dates now depends on the language. This is indicated in a new entry in the lexicon, "dates in form" which is "ddmmyy" for French (day/month/year) and "yymmdd" for English (year/month/day). Can be changed for the other languages. - [11 Oct 01] Improved persons merging (dates and places are merged faster). - [03 Oct 01] Fixed bug in displaying by places/surnames: the cutting of the places by "levels" worked bad. - [28 Sep 01] Macros now also apply in places displaying. - [16 Sep 01] Added variable "max_images_size" in base configuration files (base.gwf) to limit the size of the images which can be sent by the "send image" link. - [13 Sep 01] Fixed bug: dates added in "family" forms were not completely checked ("31th of September" was accepted, for example). * Setup program (gwsetup) - [21 Nov 01] Fixed bug under Windows: the selection of the root directory (e.g. "C:\") did not work. * GeneWeb to Gedcom (gwb2ged) - [06 Dec 01] Fixed bug (also in "gwu"): the option -s supposed to select surnames did not work: the whole database was selected. - [09 Nov 01] If a person has a "first name alias" containing the "first name", he is exported in the gedcom as the first name alias in the first name field, with the real first name part enclosed with double quotes. * GeneWeb uncompiler (gwu) - [19 Dec 01] Rewritten option -ad (somebody's ancestors' descendants): now much faster and using much less memory. * GeneWeb databases Transfer Program (gwtp) - [27 Oct 01] In the executable "ged2gwb" is installed in the directory corresponding to the option -etc of gwtp, the users can upload gedcom files to update their databases. - [06 Sep 01] Separated the option -tmp into -log (for the log), -etc (for passwd, default.gwf and lang directories) and -tmp (the rest). Code written by Christian Perrier. * Documentation - [31 Oct 01] Added a paragraph in the FAQ about why the sources in gedcom are sometimes not taken into account. GeneWeb version 4.03 -------------------- * Setup program (gwsetup) - [17 Jul 01] Fixed bug: files selections (with "browse" buttons) did not work with all browsers. In particular, it was sometimes not possible to select files in other directories than the one of the data bases. All these files selections have therefore been replaced by versions using hyperlinks. * GeneWeb server or CGI (gwd) - [21 Aug 01] In relationlink displaying by "shortest path", now the vertical bar under each person is clickable: this link triggers the research of the next path without that connection. In the bottom of the page, the ">>" actually corresponds to one of these links. - [16 Aug 01] Fixed bug in update family form: when updating a family with one witness, the form for a second (possible) witness displayed weird things. - [24 Jul 01] Fixed bug in update family form: when updating a family whose marriage date was in French Revolution calendar, this calendar was not selected in the menu. - [15 Jul 01] Improved alphabetical order of places in the display by places/surnames (code by Ludovic Ledieu). - [13 Jul 01] Fixed bug: in update person form, when clicking on "insert surname alias", the display became "insert first name alias". * Gedcom to GeneWeb (ged2gwb) and GeneWeb uncompiler (gwu) - [22 Aug 01] In ged2gwb, recover now some errorred situations in GEDCOMs which were rejected before: 1/ when a person is a spouse of a family but neither husband nor wife in this family (now sometimes recovered, but not always) 2/ when a father has female sex or a mother has male sex (the family gets the flag "no sexes check"). Moreover, now ged2gwb automatically put parents to isolated persons, so that the future cleanups of the database do not suppress them. - [17 Jul 01] Now, selecting surnames and ancestors/descendants is no more exclusive. It is therefore possible to select e.g. a surname *and* the ancestors of somebody. - [06 Jul 01] Fixed bug: sometimes failed when converting ansel text to ascii. * Base configuration files (base.gwf) - [28 Jun 01] Added variable "hide_private_names". If set (i.e. if the value is "yes"), the names of the private persons (less than 150 years) are not displayed: "x x" is displayed instead. To see the real names, one must be "wizard" or "friend". * Documentation - [15 Aug 01] Added documentation (English and French) about how to create a CDrom with your database. Swedish version added by Lars Gustavsson. GeneWeb version 4.02 -------------------- * GeneWeb server or CGI (gwd) - [15 Jun 01] Fixed bug in merging families: if there were a key conflict in one person, the button "Create" proposing to select a fresh key number did not work. - [12 Jun 01] In case of deleted families, the list of the latest marriages worked bad. - [07 Jun 01] (technical point) fixed problem: in case when the data base is not writable, there was no answer. Now an error message is displayed. - [02 Jun 01] Fixed bug: in family form, if surnames contained double quotes, they were incorrectly displayed. - [29 May 01] Fixed problem with option -log (traces in a log file): if the log file was not writable, all requests failed (instead of ignoring it). - [11 May 01] Improved database access speed in case when many updates have been done (and database not having been cleaned up). - [09 May 01] Fixed bug: system images with underscores did not work (may happen in cases of customization of the welcome page) - [09 May 01] Fixed bug: in family update form, if the comment contained quotes, the text was truncated. - [05 May 01] When creating or modifying a family, warn for children whose sex is undefined. - [01 May 01] In personal pages, related persons (godchildren, adoptive children, etc) are displayed in their baptism or birth order. - [19 Apr 01] Improved the sending of images. Should work better, particularly for images sent from a MacIntosh. - [11 Apr 01] The Gregorian and Julian calendars did not work for years less than 4800 BC. Fixed. * Templates files (etc/*.txt) For programmers... - [20 Jun 01] Added template file for update family forms (updfam.txt), which can then be customized. - [28 Apr 01] Added ability to use variable "cvar_x" in perso.txt, returning the value of the variable x of the base configuration file. * Setup program (gwsetup) - [11 Apr 01] Fixed security hole: if the file only.txt was not accessible or corrupted for some reason (it should not but...), the gwsetup service became potentially accessible from any outside address (but only if people could guess the gwsetup service address). It is modified: now, if this file is not accessible, only requests from 127.0.0.1 (local machine) are accepted. * GeneWeb databases Transfer Program (gwtp) - [28 Apr 01] Added option -tmout to specify the time after which unused logins expire (default is 900s = 15mn). GeneWeb version 4.01 -------------------- * Installation - [18 Mar 01] Fixed bug in Linux rpm package: the 'restart' of gwd did not work; it worked only by using 'stop' and 'start'. * Languages - [05 Apr 01] Renamed some languages codes to be in conformance with the standard (http://www.oasis-open.org/cover/iso639a.html): * Catalan: ct replaced by ca * Chinese: cn replaced by zh * Danish: dk replaced by da * Swedish: se replaced by sv But old codes are still working, thanks to an alias language file. The code of the new language, Brazilian Portuguese, is pt-br. - [14 Mar 01] Added Brazilian Portuguese (Paulo Francisco Sedrez). * GeneWeb server or CGI (gwd) - [03 Apr 01] In merge page, proposes the list of all persons having the same first name and same surname (and different number). - [30 Mar 01] In ancestors page, in long display mode, added the ability to have only the selected generation. - [25 Mar 01] Improved the displaying of phrases like "xxx is a grandchild of a nth cousin of yyy" in some languages (Swedish, Danish, French). Indeed in Swedish and Danish, the word "grandchild" is different according to the intermediate person (the child)'s sex. And in French the word "nth cousin" is different if it is a man or a woman. - [18 Mar 01] Fixed bug: the database forum did not work under Windows. - [18 Mar 01] Fixed bug: in case of automatic merge, the source field of the second person or family was lost. - [18 Mar 01] Improved displaying of sources in personal pages: the identical sources are grouped together in the same line. - [17 Mar 01] Fixed problem of displaying of history of updates: it was sometimes very very slow. - [15 Mar 01] Fixed bug: when merging two men (the problem did not happen for women), the witnesses of mariage of the second man were incompletely reported to the first one (they are indicated as witness in the first man page, but not in their own personal page in the "relation" section). - [15 Mar 01] The displaying of "John Foo of Bar, duke of Bar" ("Foo of Bar" being his complete surname) is now displayed "John Foo, duke of Bar" (was displayed like that before only for the case "John of Bar, duke of Bar"). - [14 Mar 01] Added option "-blang": if no language is specified in the request (i.e. explicitely selected by a flag, for example), choose preferably the user preferred language (the one of his browser) rather than the default database language. - [13 Mar 01] Fixed problem in displaying "anniversaries month" in Estonian: the month appeared with all its declinations. * Gedcom to GeneWeb (ged2gwb) - [07 Apr 01] Improved option -uin to move more untreated GEDCOM tags in the notes (code added by Ludovic Ledieu). - [23 Mar 01] Added option -udi x-y (Undefined Death Interval): the persons whose death part is undefined: - if before x years, are considered as alive - if after y years are considered as death - between x and y, their death value is "don't know if death" Default x is 80, y is 120. * GeneWeb uncompiler (gwu) and GeneWeb to Gedcom (gwb2ged) - [04 Apr 01] Fixed bug: the option -d to select descendants sometimes forgot people, typically when there was a couple whose both were descendant. * Lexicon (lang/lexicon.txt) and Welcome page (lang/start.txt) - [05 Apr 01] Fixed several Dutch phrases in lexicon (Herman Theys) - [26 Mar 01] (technical point) Grouped together all lang/*/start.txt in one only file lang/start.txt, easier to manipulate (at least for me!) - [14 Mar 01] Changed the French translation of "nth cousin": indeed, in French, the "nth cousin" is translated, litterally, by "cousin of the pth degree" where "p" is "n+1": e.g. a "4th cousin" is "a cousin of the 5th degree". Perhaps the same thing has to be done in other languages... - [14 Mar 01] Changed the "*nth (cousin)*" entry to directly represent what has to be used to translate the "nth". Previously, it was "indirect", looking for another entry in the lexicon, which was complicated to understand, for the GeneWeb translators. * Templates files (etc/*.txt) For programmers... - [17 Mar 01] File perso.txt: remplaced variables %length and %count by %nb_families, %family_cnt, %nb_children, %child_cnt. GeneWeb version 4.00 -------------------- The new version number (4.00) is in honour of: 1/ the new installer for Windows 2/ the new port to MacOS X. * Installation - [04 Mar 01] Added version for MacOS X. - [03 Mar 01] Changed Linux rpm package installation; it uses now another directory for databases (/home/geneweb/bases). Not removed when unstallation, it can be used for the future GeneWeb versions, without requiring it to be moved. - [23 Fev 01] Windows version: added an "installer" (therefore an installation normally easier). The databases are put in a directory different from the program, therefore not deleted when the program is uninstalled, and can be directly usable if another version is installed. * Languages - [27 Feb 01] Added Polish (Sebastian Tuszynski) - [11 Feb 01] Added Catalan (Jaume Ramisa Elias) * GeneWeb server or CGI (gwd) - [08 Mar 01] Added macro %i usable in person notes: it is replaced by firstname.num.surname (from the person key, which is used for his default image). - [28 Feb 01] In surname displaying, if several surnames match, everybody is displayed with his/her surname. Previously, the surname of the people having the first surname of the list was not displayed. - [24 Feb 01] Fixed big bug in Windows version: if the GeneWeb directory was installed in a directory which contained one or several spaces (e.g. C:/Program Files), and if the server "gwd" was used in a shortcut or in a batch file, it did not work! (this bug was due to a problem in a library for Windows in my favorite programming language). - [16 Feb 01] Fixed problem: when displaying a surname, if there were several answers, the link for displaying the first names by alphabetical order showed only the first surname. - [16 Feb 01] Fixed bug: when displaying the tree of all persons having the same nobility title, if there is no relationship links between them, the request failed. - [15 Feb 01] In forum, propose now "previous message" and "next message", instead of just "next message". - [11 Feb 01] Fixed a (small) bug: in the ancestors page, if the maximum number of generations was the authorized limit plus one, the message "maximum # generations" did not appear. - [10 Feb 01] In family update form, added button "no sexes check" allowing 1/ to create gay marriages 2/ to fix parents sex inversion without having to delete the marriage. * Templates files (etc/*.txt) For programmers... - [02 Mar 01] For the perso.txt template file, added the variables %length; (family size in a %foreach;family;) and %count; (child position in a %foreach;child;) and ability of expressions (e.g. %if;(count = length) tests if the current child is the last of the family). - [18 Feb 01] Added a template file for update person form (updind.txt), which is now user-configurable. - [10 Feb 01] For the perso.txt template file, added the variables %father_age_at_birth; and %mother_age_at_birth; * Gedcom to GeneWeb (ged2gwb) - [08 Mar 01] Recognizes now the "MACINTOSH" charset. It is not standard, but there are GEDCOMs with this encoding, sometimes. - [03 Mar 01] In case of program failure, the message is displayed in standard output or in the log file. It is therefore visible in the "traces of the last command" of gwsetup. * Lexicon (lang/lexicon.txt) and Welcome pages (lang/*/start.txt) - [07 Mar 01] The "advanced request" which works too bad, is no more proposed in welcome pages. To have it again, you have to set the variable "hide_advanced_request" to "no" in the base configuration file. - [01 Mar 01] For translators: in "person/persons" phrase, it is now possible to add a third field to say how to translate "persons" when it is after a number (e.g. 50 persons). Example with Estonian. - [01 Mar 01] Added entry "on (weekday day month year)" for the anniversary page sentence: "today, weekday day month year, etc". Necessary at least for Finnish and Estonian. - [19 Feb 01] Updated several lexicon entries in Estonian (Hanno Kuus) - [16 Feb 01] In all welcome pages, suppressed the text "or surname" in the first choice of the first case. But it goes on searching up by surname, if no complete name is found. * Base configuration files (base.gwf) - [01 Mar 00] The variable "always_surname" now applies also to pages displaying surnames by branch (no more only to descendants pages). * Setup program (gwsetup) - [24 Feb 01] Fixed big bug: when creating a database, a page displays that the database has been created. Ok. But if this page is requested again later by the browser and if it is no more in the browser cache, the action is made again overwriting the possible user changes. - [23 Feb 01] Added option -gd (gwsetup directory) to set a different directory for the gwsetup files. It allows to launch gwsetup in another directory, therefore to separate the databases from the GeneWeb files. - [20 Feb 01] Added option -lang: if provided in parameter, the lang name is not asked the user. Changed all "http://localhost:" into "http://127.0.0.1:" which always work on Windows and in all OSes. Changed all "file://localhost/..." into just "file://..." GeneWeb version 3.11 -------------------- * Languages - [04 Feb 01] Added more declinations for dates (to make Estonian work better) - [31 Jan 01] Added Estonian (Hanno Kuus) * GeneWeb server or CGI (gwd) - [01 Feb 01] In descendants display, added the occupation. - [30 Jan 01] Added a way to be able to print trees which are too wide for printers. In tree displaying, a link is proposed in the upper right corner of the page. When clicking on it, a page is proposed for a parametrizable display of the tree by slices. - [29 Jan 01] For GeneWeb sites accomodating many databases: to avoid the creation of too many files in the same directories, added the ability to put them in sub-sub-directories. A database file can be installed in a sub-directory of its first character, sub-sub-directory of its second character. For example, a file associated with the database foo can be in the directory f/o/. This is not required, but optional, and is therefore backward compatible. This applies to: * the database directory: f/o/foo.gwb * the database configuration file: f/o/foo.gwf * the associated images directory: images/f/o/foo * the associated extra images directory: src/images/f/o/foo * the associated source texts directory: src/f/o/foo/*.txt * the header: lang/f/o/foo.hed or lang/xx/f/o/foo.hed * the trailer: lang/f/o/foo.trl or lang/xx/f/o/foo.trl * the personal page template: etc/f/o/foo/perso.txt - [26 Jan 01] Under Windows, added option "-noproc" asking not to run a new process at each request. This option was added because some users under Windows reported that sometimes, the service gwd blocks after some requests and need to be stopped and restarted. This option may resolve this problem (not sure). - [25 Jan 01] When searching somebody by a name, if there are several possible answers, also display now the first names aliases (if there are some). - [23 Jan 01] Fixed bug: when changing somebody's name, in some cases there were no check that the key already existed, resulting of a double defined persons when cleaning the database. - [14 Jan 01] Complicated trees (ancestors, descendants, relationships) now work with browsers without tables (like Lynx). - [13 Jan 01] Fixed bug: when merging families, the marriage witnesses disappeared. - [10 Jan 01] In relationship computing, changed translation of the phrase "of a cousin". Indeed, in the context, it should display "of a cousin(male) or a cousin(female)". In English there is just one word, "cousin" for male cousins and female cousins, but not in many other languages (German, French, Spanish...). Now, the translation is correct for these languages. - [28 Dec 00] (detail) In short dates, for the case "don't know if dead", now print just "year" instead of "*year". Changed all FAQ about this convention of short dates. - [19 Dec 00] In update page, changed "add family" into "add marriage" because, despite the warning at end of this page, many users are mistaken by thinking it was "add a child in a family". * Template (etc/perso.txt) - [02 Feb 01] Added boolean value "has_siblings". - [20 Jan 01] In personal page template file (etc/perso.txt), the macro "%nobility_titles;" has been decomposed into "%foreach;nobility_title;" and "%nobility_title;", allowing to display the nobility titles differently (e.g. in a list
    ..
). - [27 Dec 00] The value "%witness;" refers now to the witness person himself (instead of being the text with link and dates). This allows to customize now the display of witnesses, e.g. by adding their professions, or their parents, etc. * Setup program (gwsetup) - [22 Jan 01] Added the merging of databases. Updated the documentation to remove the comments telling that this operation cannot be done under gwsetup. * Gedcom to GeneWeb (ged2gwb) - [23 Jan 01] Added a hack to turn around a bug in the GEDCOMs coming from Genealogos (fields inverted in certain lines) which created empty databases. * GeneWeb to Gedcom (gwb2ged) - [04 Feb 00] Added option "-aws" (Ancestors With Siblings), the same option than for the command "gwu", extracting somebody's ancestors, together with their siblings, siblings' spouses and siblings' spouses' parents. - [18 Jan 01] Fixed problem for names with declinations: they were exported with all their declinations; now just the 'nominative' form is exported. * Geneweb compiler (gwc) - [07 Jan 01] Put back the option "-sh #" (removed in version 3.08): it seems that some users are be still interested in this option, even with the new form "-sep". * Bases configuration files (base.gwf) - [25 Jan 01] Added variable "private_years" to specify the number of years for the visibility of personal information in normal access (i.e. neither "friend" nor "wizard"). Default = 150. - [30 Dec 00] In example file a.gwf, fixed comment about customized variables: for variable defined as var_foo, the usage in the text is %vfoo; (not %foo;). - [29 Dec 00] Added variable "always_surname" telling to always print the children surnames in descendant display, even if same than the father's (default = no). * Header and trailer files (lang/base.hed lang/base.trl) - [26 Jan 01] Added two macros usable in header or trailer files: %p which is replaced by the prefix of the current URL (the whole address up to the question mark) and %s by its suffix (after the question mark). In personal pages, this suffix is independant from the index: can therefore be used to specify a bookmarkable address. * Lexicon (lang/lexicon.txt) - [26 Jan 01] Changed entry name "(french month)" into "(french revolution month)" (which is more exact). - [30 Dec 00] Fixed German translations (Frank Komarek + Falko Trojahn) - [29 Dec 00] Fixed some Spanish translations (Frank Komarek) * Documentation - [17 Jan 01] Added French translation of "The GeneWeb source file format" (Melchior de Contades) GeneWeb version 3.10 -------------------- * GeneWeb server or CGI (gwd) - [14 Dec 00] Added a system of general macros for "sources" and "notes". You can define customized variables in the configuration file (base.gwf): their values will be replaced in the "sources" and in the "notes". The syntax in configuration file is "var_ident=value" and in the sources and notes: "%vident;". - [03 Dec 00] Fixed bug in Hebrew calendar computation (example: Hebrew day was good for Gregorian date 2001-11-30 but incorrect for the following day 2001-12-01). - [28 Nov 00] Fixed bug: it was possible to create a loop by merging somebody with one of his/her ancestor. - [25 Nov 00] Small improvements: in update page, added "back" link, in "family deleted" page, added link to return to the person. - [24 Nov 00] Fixed bug: in automatic merge steps, the database was not locked, risking to corrupt the database if two persons were making changes exactly at the same time. - [18 Nov 00] Fixed bug: while updating a person or a family, in case of keys (first name/surname/number) conflicts, if there where empty spaces (for example the ones of persons to be removed from the list), the button "create" supposed to try again with the first free number did not work. - [16 Nov 00] Fixed bug: in languages with declinations (e.g. German) some declinations structures sometimes incorrectly remained in the displayed text (e.g. "xx ist ein:d:+em Cousin") - [11 Nov 00] When updating, display now a warning in case when the person has a sex inconsistent with his/her "relation" (e.g. woman being godfather or man being godmother). Can now change a wrong or undefined sex according to these "relations". The same changes have been done in gwc (GeneWeb uncompiler) and in ged2gwb (GEDCOM to GeneWeb). Code written by Ludovic Ledieu. - [10 Nov 00] Fixed bug: when merging two persons, if the second one was a witness of a marriage, the "witness" link dispeared. - [09 Nov 00] Fixed bug: under Windows, the history of updates did not work. - [08 Nov 00] Added the ability to have associated HTML pages and images. The request "base?m=SRC;v=xxx" displays the file "src/base/xxx.txt" (interpreting the macros if any). The request "base?m=IM;s=yyy" displays the image file "src/base/images/yyy" or "src/images/yyy". Code written by Ludovic Ledieu. - [08 Nov 00] Fixed bug: when giving 0 as Sosa number, it did not answer (infinite loop in gwd). * Gedcom to GeneWeb (ged2gwb) - [04 Dec 00] Now, the option -fne works (i.e. extracts the main first name) even when the first character is a space, allowing to treat Gedcoms with for example, just a star after the main first name. * GeneWeb uncompiler (gwu) - [26 Nov 00] Added option "-aws" (Ancestors With Siblings), extracting somebody's ancestors, together with their siblings, siblings' spouses and siblings' spouses' parents. - [16 Nov 00] Fixed bug: in some circumstances, relations could be printed several times, resulting of several definitions and therefore errors when using gwc. - [15 Nov 00] Filter the non printable characters if any: now converted into spaces. * Consanguinity computing (consang) - [15 Nov 00] Improved the program: now 30% faster. * Lexicon (lang/lexicon.txt) and welcome pages (lang/*/start.txt) - [27 Nov 00] Updated Czech welcome page and lexicon (Petr Slansky) - [13 Nov 00] Deleted entry "of": using only "%1 of %2" now. Some consequences in displaying (depending on language). * GeneWeb databases Transfer Program (gwtp) - [14 Dec 00] Added a system to display pages on other languages than English. Added French version. - [07 Nov 00] Added "body_prop" (text added inside the tag "body" in generated pages, what allows to change the background, for example) among configurable variables (conf.txt). * Installation under Linux rpm - [07 Nov 00] Put logs for gwsetup and gwd on /var/log. * Documentation - [12 Dec 00] In the FAQ, in the entry "It does not work at all under Windows", added a paragraph to tell to try by replacing "localhost" by "127.0.0.1". - [27 Nov 00] Added an entry in the FAQ about the spelling correction and its possible strange results. GeneWeb version 3.09 -------------------- * GeneWeb server or CGI (gwd) - [05 Nov 00] In case of loop in database, which stops all relationship computations, the error message now displays one person who is his/her own ancestor, allowing the wizard to fix the error. - [04 Nov 00] Changed forum displaying. The main page now displays only the headers. - [04 Nov 00] Fixed bug: when merging two persons, the possible notes of the second person could disappear. - [03 Nov 00] In tree display, when "images" is selected, also display spouses' images. - [02 Nov 00] Added "subject" in forum. - [02 Nov 00] Now display French republican years in roman digits. - [01 Nov 00] In nobility title display, added a link to display the tree of their relationship links. The tree contains only six persons at the same time (and a link for the next ones). - [28 Oct 00] Added a trace of the last "wizard" accesses (in the file cnt/base_w.txt). The idea is to know if some "wizards" are no more using their connections. Applies only to wizards defined in the file of the variable "wizard_passwd_file" of the file base.gwf. - [26 Oct 00] In forum, added "..
" around messages to prevent unterminated tags to perturbate the other messages. - [24 Oct 00] In family updating, when there is a name conflict while creating a person, now proposes to try again with the first free number Lightly changed the interface for the same situation in person updating (code written by Ludovic Ledieu). - [20 Oct 00] In family updating, added a check that (created) persons are born before their death: this check was missing. - [11 Oct 00] Important improvement: added a system of template files for the personal pages. It is therefore possible to change the displaying of the personal pages, by editing the template. It is also possible, for a site accomodating several databases, to have a personal template file specific to each database. * Lexicon (lang/lexicon.txt) and welcome pages (lang/*/start.txt) - [06 Nov 00] Changed "anniversaries of death" into "anniversaries of dead people", since it's about their deaths but also their births. - [23 Oct 00] Updated Hebrew version (Jonathan B. Marder) * GeneWeb compiler (gwc) - [03 Oct 00] Fixed bug: there were an inconsistency between "gwc" and the inline updating, for persons "keys": the inline updating considered spaces in names as significant but not "gwc". Result: when cleaning up a database (gwu + gwc) or when importing a data base from an old version of GeneWeb, it could cause names conflict errors (for example if both "Anne.0 Le Blanc" and "Anne.0 Leblanc" were defined). * Gedcom to GeneWeb (ged2gwb) - [17 Oct 00] Fixed bug: problem of accessing persons with the same names when they contained declinations (Czech names, for example). * GeneWeb uncompiler (gwu) - [04 Nov 00] Added option "-ad" to select all ancestors of somebody and all descendants of his/her ancestors (code written by Ludovic Ledieu). * GeneWeb uncompiler (gwu) and GeneWeb to Gedcom (gwb2ged) - [28 Oct 00] Added option "-c " not to export people born since less than years nor their descendants (code written by Ludovic Ledieu). * GeneWeb databases Transfer Program (gwtp) - [29 Oct 00] Fixed bug: if one tried to send a database several times at the same time (by several requests), it could create a corrupted database or it could make the program fail. - [06 Oct 00] Added ability to put a trailer text. * Setup program (gwsetup) - [19 Oct 00] Updated Swedish version (Lars Gustavsson) * Documentation - [19 Oct 00] Updated Swedish documentation (Lars Gustavsson) GeneWeb version 3.08 -------------------- * Setup program (gwsetup) - [21 Sep 00] Fixed bug: in recovery from an old version, if the destination database already existed (created e.g. by a previous attempt), it could not overwrite the database, even it pretended it was going to do it. Same problem (fixed also) for the creation of a database from a GeneWeb source file. * GeneWeb Service/CGI (gwd) - [25 Sep 00] When wizard or friend access failure, now display the page without the priviliged access (instead of just saying "access failure"). - [21 Sep 00] When modifying a person, forbid now to let his/her first name or surname as just "?", because it can cause problems of linking these persons after a database cleanup. - [18 Sep 00] In family updating, when creating an unknown person (i.e. having "?" as firstname or surname), does not set the "source" field any more for this person. - [18 Sep 00] Fixed bugs: 1/ while merging persons, automatic merging sometimes used to loose the death date 2/ while merging families the comment of the 2nd family used to be ignored. - [15 Sep 00] In ascendants long display, added notes for siblings if any (they were missing). - [14 Sep 00] In update page, if the person's sex is unknown, the selection "add family" proposes now two case according to the sex. - [13 Sep 00] Fixed bug: problem of age at death in descendants page, the same bug than for personal pages fixed 16 Aug (version 3.07). - [05 Sep 00] Fixed bug: in ancestors surnames list, under Lynx (browser for alphanumeric terminals), sometimes displayed "incorrect request" when clicking on certain surnames. - [04 Sep 00] Fixed bug: in descendants with encoding, for children married several times, could sometimes display the father's name instead of a repetition of the child's name. - [01 Sep 00] Fixed short dates: "between 1935 and 1938" is displayed now "1935/1938" instead of "ca 1935/1938". - [30 Aug 00] Fixed bug: sometimes accepted two persons with the same key. E.g.: after having defined "Charles de Gaulle" and "Charles Degaulle", when changing the second person' s surname into "de Gaulle", did not display a name conflict error. - [28 Aug 00] Added option "-wjf" (= wizard just friend) to permanently prevent all wizards in all databases to make changes. - [26 Aug 00] In descendants page, added male line and female line. - [25 Aug 00] In history, added the ability to see the changes only by a given wizard. - [24 Aug 00] Fixed bug: when entering Web addresses (http://...) in notes, it generates enclosing HTML code to make links, but sometimes it did it incorrectly. For example the image insertion ? did not work because the program changed it into > * Gedcom to GeneWeb (ged2gwb) and GeneWeb to Gedcom (gwb2ged) - [31 Aug 00] All surnames aliases (instead of only the first one) are now saved and restored. * Gedcom to GeneWeb (ged2gwb) - [02 Oct 00] Fixed bug: did not treat begin or end dates in titles when defined as texts. - [28 Sep 00] Strip now possible tabulations found in the GEDCOM. - [26 Aug 00] If -epn (which is default) and -lf, tries now to lowercase the public names. * GeneWeb to Gedcom (gwb2ged) - [06 Sep 00] Fixed bug: newlines in notes were incorrectly saved, resulting that when restoring the database (ged2gwb), the lines were catenated without any spaces. * GeneWeb to Gedcom (gwb2ged) and GeneWeb uncompiler (gwu) - [02 Oct 00] Fixed problem: when selecting somebody's ancestors, links to relations (godparents, for example) were included, even if these relation were not selected. - [29 Aug 00] Now, when option "-d" (descendants of) is applied, the spouses' parents are included, except if the option "-nsp" is given. * Geneweb compiler (gwc) - [25 Sep 00] Replaced option "-sh #" by "-sep": the file following the "-sep" option is treated as separated from the rest, i.e. the numbers in persons keys are automatically shifted if in conflict with the persons of the previous files. No more need to find a "shift" number which avoids the conflicts. Simplifies the databases merging. - [27 Aug 00] Fixed bug: date e.g. "between 1300 and 1350 Julian" where printed by gwu as 1300..1350J but gwc expected 1300J..1350 and resulted in a syntax error. * GeneWeb databases Transfer Program (gwtp) - [08 Sep 00] Added small documentation (a README file) for GeneWeb Web site administrators. * Base configuration files (base.gwf) - [29 Sep 00] The change, (version 3.06, 17 Jun 00) about can_send_image supposed to be yes by default, did not work: fixed. - [20 Sep 00] Deleted the change version 3.07 (on date: 28 Jul 00) about the variable body_prop. Return to the previous behavior: defined as empty or not defined => the default GeneWeb background is used. This change was necessary 1/ by consistency with other variables 2/ to make gwtp work correctly. * Documentation: - [25..27 Sep 00] Changed in the chapters "merge.htm" and "divide.htm" the explanations about the separation of input files to avoid conflicts, using now the new option "-sep" of "gwc" instead of "-shift" (see change in gwc above, 25 Sep 00). - [09..25 Sep 00] Updated German version (Falko Trojahn). - [24 Sep 00] Added a chapter (gwformat.htm) about the GeneWeb source file format (files ending with .gw). Written by Yann Corno. English version only. - [20 Sep 00] Added another page (gwsetup.htm) to explain how to use gwsetup. Added two paragraphs in a FAQ, in the beginning of the section "it does not work at all under windows", explaining not to delete the gwsetup window! - [07 Sep 00] In the directions for use, the entry "How to start with GeneWeb" now points to a page which explains that you can start with the program gwsetup instead of typing interactive commands, which seemed not to be clear. Changed diruse.htm (link to "start"), added initial.htm, added small paragraph in start.htm. Added also a paragraph in recover.htm, merge.htm and maint.htm. - [03 Sep 00] In FAQ, changed the text about the question of missing relationship links. - Added entries in the FAQ about: * [27 Sep 00] the message "probable loop in the database", * [08 Sep 00] the research by place/surname, where only one person by surname is displayed, * [03 Sep 00] the fact that sometimes, under Windows, it does not work at all, * [01 Sep 00] the fact that information in forms sometimes disappear, * [01 Sep 00] adding more information in family forms, * [31 Aug 00] short dates displaying conventions, * [31 Aug 00] repetition of Sosa numbers for ancestors lists, * [29 Aug 00] advanced request, * [21 Aug 00] people having "?" (question mark) as first name and/or surname. GeneWeb version 3.07 -------------------- * New feature - [18 Aug 00] Added a program "gwtp" (CGI) to upload and download GeneWeb databases in a site which accomodate some (undocumented program for the moment). * Distribution - [18 Aug 00] Create files named README.htm and LISEZMOI.htm instead of README.txt and LISEZMOI.txt. * GeneWeb Service/CGI (gwd) - [16 Aug 00] In personal pages, does not display the age at death if less than one year and undefined month/day (it displayed "age at death: birth"!) - [14 Aug 00] In personal pages, sources are now printed, even for non friends, non wizards. - [11 Aug 00] In first names by alphabetic order for a given surname, now always specify the parents' names. - [09 Aug 00] Fixed a problem of missing space after "married to" in descendants page (did not happen with all browsers). - [30 Jul 00] Added an option "-conn_tmout" (available only under Unix) to specify a connection timeout for one request. If the request has not terminated after this time, it is killed. Default is 120s. - [30 Jul 00] Contribution from Ludovic Ledieu: changed displaying of ancestors trees: 1/ clicks on persons fall on their personal pages (no more for navigation) 2/ vertical bars are clickable to navigate 3/ no more bars for missing ancestors. - [28 Jul 00] Fixed problem in images displaying in personal pages and in trees. Sometimes the image was "broken", its URL being incorrect. Details: * This happened in case of local image (field "image" filled in "person" form), and when the type was not among the recognized types (i.e. presently "gif", "jpeg", "png"): in these conditions, the URL for the image was incorrect. * The fix is not completely satisfactory: this kind of image is now no more displayed at all. Indeed, "gwd" need to know its type to answer the browser request (the HTTP answer must contain the image type). * A solution if there are images with other types than the ones that "gwd" recognizes, is to use the variable "images_path" in the data base configuration file (base.gwf). See the changes version 3.05 or the distributed example file "gw/etc/a.gwf". - [26 Jul 00] Added small icon in personal page to indicate sex (Louis Granboulan's idea) - [19 Jul 00] Fixed bug in places/surnames displaying: some identical places and surnames could be displayed several times. * Gedcom to GeneWeb (ged2gwb) - [09 Aug 00] Added a consistency check: in some gedcoms (from bad genealogy softwares), it happens that a person can be noticed as "spouse" (FAMS) of a family without being however neither husband (HUSB) nor wife (WIFE) in that family. In the GeneWeb database, the symptom was that the pages concerning this "spouse" (particularly his/her personal page) stopped in the middle. Now the converter displays an error message and fixes this inconsistency in the created database. - [28 Jul 00] Fixed bug: when a person was married several times, the order of families were sometimes incorrect. Actually, the order wrongly followed the order where the families appeared in the gedcom, not the order indicated in the individual record. - [26 Jul 00] Added a lock to the database before writing it (to avoid multiple accesses which risk to damage it). * Base configuration files (base.gwf) - [28 Jul 00] Changed the behavior of the variable "body_prop" making the difference between 1/ not defined and 2/ defined as an empty string. In the first case, the default is assumed (i.e. GeneWeb's default background), in the second case, nothing is added in the tag. This implies changes in programs "gwd" and "gwsetup". * Lexicon (lang/lexicon.txt) and welcome pages (lang/*/start.txt) - [21 Jul 00] In lexicon: added the terms "Sosa"; changed "list" into "list/list (ancestors)" (specially for better translation in Swedish) - [18 Jul 00] Fixed Esperanto version (Thomas Ailleret). * Documentation: - [16 Aug 00] Added an entry in the FAQ about the displaying of ages of persons of more than 80 years old. - [21 Jul 00] Documentation updates in Swedish (Lars Gustavsson) GeneWeb version 3.06 -------------------- * Languages - [20 Jun 00] Added Latvian (Janeks Kamerovskis). * Setup program (gwsetup) - [20 Jun 00] Added Latvian version (Janeks Kamerovskis). * GeneWeb Service/CGI (gwd) - [04 Jul 00] Put all statitics in a different page (accessible only to "wizards" and "friends"). - [04 Jul 00] Added the computation of the persons who lived the longest. - [27 Jun 00] When typing a name holding a number, searches also with its equivalent in Roman digits (e.g. it is possible to type "Louis 15" to find "Louis XV"). - [26 Jun 00] Fixed bug: the images in ".png" format were not accepted. - [23 Jun 00] Added descendants displaying with d'Aboville's encoding. - [21 Jun 00] Added displaying of oldest perhaps still alive (from welcome page). - [20 Jun 00] Changed displaying of marriage witnesses in personal pages. - [20 Jun 00] Together with the link to the welcome page (up arrow), added a link to the referer page (left arrow). - [19 Jun 00] Changed page design of relationship computing. - [19 Jun 00] In latest marriages, display now only true marriages (i.e. not "relations" nor "engagements"). - [18 Jun 00] Added a link in bottom of welcome pages, useful if you have got a browser which does not automatically update the modified pages (forcing you to do "reload current document"). When clicking on it, you browse without this problem: no more need to reload the pages, they are displayed with their changes if there are some. - [18 Jun 00] Fixed little problem: the (new) fast merges of persons did not appear in the history. - [17 Jun 00] In update family forms, added a button close to the "family source": when selected, the "family source" text is automatically put (as default value) in "family source" fields in future other family updates. It avoids to have to copy it each time when it is always the same one. - [16 Jun 00] Added feature: in relationship computing, when option "shortest path" is selected, it is displayed together with a link to see the next shortest path. - [13 Jun 00] Deleted this stupid "" in welcome pages and in other pages, because it makes some browsers generate two requests and we see the page blinking. Moreover, it has no sense (even if it is standard), since the HTTP header already contains that. * General - [26 Jun 00] In programs ged2gwb (gedcom import), gwb2ged (gedcom export), consang (consanguinity initialization) and gwu (uncompiler), added an error message in case of several input files are given (these programs can treat only one file at a time). * GeneWeb compiler (gwc) and uncompiler (gwu) - [29 Jun 00] Fixed problem: persons with "relations" (e.g. adoptive children) where not saved (gwu) nor restored (gwc) when isolated (i.e. without parents nor marriages). * Base configuration files (base.gwf) - [17 Jun 00] By default now, the "can_send_image" is "yes", meaning that if you specify nothing, the "send image" is proposed in update pages. To unset it, you must now specify: can_send_image=no * Lexicon (lang/lexicon.txt) and welcome pages (lang/*/start.txt) - [20 Jun 00] Added entry !language for the translation of languages names in all languages. Used as labels associated with the flags of welcome pages. - [14 Jun 00] Completed and fixed Portuguese version (Jose Paulo Moitinho de Almeida). - [14 Jun 00] Completed Dutch lexicon (Bernard Ceurstemont). * Documentation - [26 Jun 00] In update.htm, added that images in png format are accepted, like "gif" and "jpeg" ones. GeneWeb version 3.05 -------------------- * GeneWeb Service/CGI (gwd) - [03 Jun 00] In history, added an input field before the ">>" to be able to specify a number of entries to be displayed in the next page. - [02 Jun 00] Merge of individuals faster now: can automatically merge families and individuals when they are identical in both ancestors trees. - [23 May 00] In "divorce" section, added case "separated". - [18 May 00] In displaying by places/surnames, baptism places are added with birth places and burial with death. - [17 May 00] Added an "Ok" button after the password input area in CGI mode. - [14 May 00] Added case "engaged" in "family" forms. - [14 May 00] Added option "-images_url" to give an URL to GeneWeb images (flags, logo, background, up arrow). Can be useful e.g. in cgi mode if the associated Web server answers faster than gwd. By default, the GeneWeb images are sent by gwd. - [14 May 00] Fixed bug in update forms (person or family): in case of name conflict (name already used by another person), when clicking on the "return" button, the fields containing quotes ("), less (<) or greater (>) characters were truncated. - [12 May 00] In short dates (just year), if no death date, burial date is now displayed. And in pages displaying the ages at death, take now the baptism date if no birth date and the burial date if no death date to compute this age (then prefixed by "possibly") - [10 May 00] In personal pages, the links "ancestors" and "descendants" are proposed from 2 generations (instead of 3, before). - [06..11 May 00] Added surname list from "ancestors" page. - [02 May 00] [technical] In Unix version now, each request gets the user id and the group id of the owner of the database directory (base.gwb). No error if cannot change to these ids. Deleted the gwd options -setuid and -setgid now unuseful. - [30 Apr 00] Fixed little problem with displaying by places for the ones containing several (at least two) indications between parentheses. * Gedcom to GeneWeb (ged2gwb) and GeneWeb to Gedcom (gwb2ged) - [25 May 00] Now save and restore the marriage witnesses (that was missing). * GeneWeb to Gedcom (gwb2ged) - [04 Jun 00] Fixed bug: did not save the information "not married" when no date specified. (Note: in GeneWeb, since there is no GEDCOM standard for that, the information "not married" is written as "unmarried" in the marriage place.) * Base configuration files (base.gwf) - [03 Jun 00] Added variable "propose_add_family" (default yes). If yes, propose to wizards a "add family" link in welcome page. If no, not proposed. - [25 May 00] Added variable "images_path" to specify a path to access the images defined in the "image" field (i.e *not* added by "send image"). Applies only for images not found in the image/base directory. This variable, when set, could typically start with http://... - [08 May 00] (detail) The possible trailing spaces or control-m are now stripped (allowing to move a base.gwf file from Windows to Unix without needing to remove them). * Counters (cnt/base.txt) - [28 May 00] Now, a count of "wizard", "friend" and normal accesses are added in this file, for statistics. * Documentation - [31 May 00, 06 Jun 00] Added paragraph explaining how to install GeneWeb in server mode under Windows NT (Falko Trojahn). English and German versions by Falko Trojahn. Swedish translation by Lars Gustavsson. French translation by Daniel de Rauglaudre. - [25 May 00] Updated German documentation (Falko Trojahn). - [06 May 00] Updated Swedish documentation (Lars Gustavsson). - [04 May 00] Added one item in FAQ about a possible problem in CGI mode. GeneWeb version 3.04 -------------------- * Languages - [06 Apr 00] Added Afrikaans (Louis Kruger). * Setup program (gwsetup) - [09 Apr 00] Fixed some bugs in Linux rpm package causing gwsetup to fail and the browser to answer "no output". * GeneWeb Service/CGI (gwd) - [29 Apr 00] Fixed bug in "descendants", "families with encoding": the marriage dates of grandchildren could sometime be erroneously the ones of the children. - [16 Apr 00] Fixed problem: the kde browser (Konqueror) seems not to handle the password protocol. Went around the problem by treating it as it were in CGI mode, where the password has to be given in a form. - [14 Apr 00] Fixed bug: could no more access a person by his key after having changed his name, in the case when the initial first name or surname was a question marks *and* the changed name had nevertheless the same signature. Example: before: first name = "John Smith"; surname = "?" after: first name = "John"; surname = "Smith" When doing this fix, there were no more way to access "John Smith" by his key, particularly in forms (which is rather annoying). - [13 Apr 00] Added nice display of language code when mouse over the flag (Emmanuelle Visseaux's code). - [11 Aor 00] Added optional displaying of images in descendants by tree and in relationship trees. - [03 Apr 00] In ancestor page, added horizontal displaying. - [02 Apr 00] In surname page, added ability to click on a branch number to display only that one. - [27 Mar, 05 Apr 00] Added displaying of places/surnames from welcome page. * Gedcom to GeneWeb (ged2gwb) - [11 Apr 00] Fixed bug+problem of adoptive children when they are also recorded as normal children of their adoptive parents in the GEDCOM (extracted from a genealogical software having a different logic than GeneWeb about this subject). The "bug" made the adoptive links not appear, the "problem" made the parents family not appear. - [31 Mar 00] Do not enter any more GIVN as public name if equal to first name nor SURN as surname alias if equal to surname. * GeneWeb uncompiler (gwu) and GeneWeb to gedcom (gwb2ged) - [04 Apr 00] Added option "-nn" not to save database notes. * Base configuration files (base.gwf) - [31 Mar 00] Added variable "places_inverted" (default no) to specify that places are ordered more-general-less-general (e.g. "USA, New York" instead of "New York, USA"). Important to specify correcty this variable for the new displaying by places/surnames. * Lexicon (lang/lexicon.txt) - [26 Apr 00] Changed "death age" into "age at death", "maybe" into "possibly" and "degre" into "degree". * Documentation - [20 Apr 00] Changed the title of the chapter "How to install GeneWeb as a server" into "How to install GeneWeb as a server or CGI" (English and French versions). - [20 Apr 00] Changed the chapter "How to customize the welcome page". The title becomes "How to customize the welcome page and the other pages" A section "Customization of all the pages" has been inserted at end (English and French versions). - [20 Apr 00] Added the French version of the chapter "Keeping data divided inside a database". GeneWeb version 3.03 -------------------- * Languages - [23 Jan 00] Added Russian (Konstantin Abakumov). * Setup program (gwsetup) - [07 Feb 00] Changed some Swedish files (Lars Gustavsson). - [27 Jan 00; 03 Feb 00] Added a comment in the introduction text telling not to delete the window! (English, French, Swedish versions) * GeneWeb Service/CGI (gwd) - [17 Mar 00] In CGI mode, the passwords are no more visible in the URL. Technical explanation: it works with a generated random login password with a timeout of 1800 seconds (half an hour), i.e. if you do nothing during half an hour, the login password is unactivated; this limit time is changeable by a new gwd option "-login_tmout". Note: this system does not use cookies. - [12 Mar 00] In ancestors page, added male and female lines. - [11 Mar 00] In personal pages, the images defined by external URL (i.e. accomodated in other Web sites) are now reduced as are local images. - [11 Mar 00] The information "relationship to" is no more transformed into "married to" when "non-friend" browsing (it was supposed to protect private life, but seems to have more drawbacks than advantages). - [09..10 Mar 00] In update family form, added ability to specify birth place, death date and death place for parents and children. - [08 Mar 00] Added latest marriages (accessible only by "wizards" and "friends") - [08 Mar 00] Added optional displaying of images in ancestors displaying by tree. - [05 Mar 00] In birthday anniversaries for close parents (accessible in "cousin" page for "friends" and "wizards"), the links give now the relationship trees, instead of the persons. - [04 Mar 00] In person and family forms, added input area to specify a number greater than 1 of titles and children to insert. - [24 Feb 00] In latest births and deaths pages, display monthes. - [02 Feb 00] In personal pages, relations are now displayed before notes. - [20 Jan 00] When sorting the children, use now the baptism date when there is no birth date. - [18 Jan 00] Fixed bug: when selecting no database, the default page asks for a database name, but in CGI mode when entering a database, it did not work (incorrect URL). * Gedcom to GeneWeb (ged2gwb) - [19 Feb 00] Added option "-uin" (untreated in notes) asking to put unused Gedcom tags (of indiduals) in notes. * Base configuration files (base.gwf) - [24 Feb 00] Added variable "latest_event" to give the number of latest events (births, deaths) displayed (default: 20). - [25 Jan 00] Added variable "public_if_titles": if "yes", consider persons having nobility titles as public ("public" means that their private data is displayed even if their dates is less than 150 years). Warning: the default of this variable is "no": it is a behavior change in GeneWeb, relatively to previous versions (but don't worry: with this change, private data is better protected). * Lexicon (lang/lexicon.txt) and welcome pages (lang/*/start.txt) - [10 Mar 00] Changed some Finnish translations (Antti Alfthan) - [14 Feb 00] Changed the term "place" of nobility titles into "estate" ("domaine" in French), to avoid the confusion with the "place" of "birth", "death", and so on. Changed also "all the places" into "all the estates". - [01 Feb 00] Fixed some Swedish translations (Lars Gustavsson) - [26 Jan 00] Fixed several Portuguese translations (Jose Paulo Moitinho de Almeida). - [21 Jan 00] Changed the English displaying of dates into "day month year", the displaying "month day year" being specific to the United States and not used in other English speaking countries. American users are invited to change the lexicon line for (date) if they want an American display. * Documentation - [17..25 Feb 00] Added a new chapter "Keeping data divided inside a database" (written by Lars Gustavsson: thanks, Lars!). Only English and Swedish versions for the moment. - [11 Feb 00] Changed some Swedish files (Lars Gustavsson). - [03 Feb 00] In chapter "modifications" (update.htm), section 1, added a footnote to explain that it is better to use western Europe languages encoding (iso-8859-1) for a person's "key". GeneWeb version 3.02 -------------------- * Setup program (gwsetup) - [Dec 13, 99] Fixed another problem of images displaying with still another browser (see version 3.01). * GeneWeb Service/CGI (gwd) - [Jan 12, 00] In adding or modifying family, added a specific field to indicate the source for (possibly) created persons. - [Jan 3, 00] Speeded up the displaying of anniversaries (noticeable on large databases). - [Jan 10, 00] Forbid "send image" when the person's first name or surname is "?" ("dead end" person). - [Jan 9, 00] Added birthday anniversaries for close parents (accessible in "cousin" page when wizard or friend). - [Dec 26, 99] Added the ability to add a file "foo.hed" for the base "foo", in lang directory: the file is inserted in the header of all pages (useful e.g. to add style sheets). - [Dec 21, 99] Changed display of relationship by shortest path. - [Dec 19, 99] Added option -wd to specify a (writable) directory for socket communication (required for Windows) and databases access count. Useful to use GeneWeb and databases in a CDrom. - [Dec 17, 99] Added in headers of all generated pages to be compatible with all browsers. - [Dec 16, 99] Fixed bug: the ";opt=no_index" did not work correctly when the URL hold special characters. - [Dec 15, 99] Added things to be able to translate correctly the noun complement ("x of y") in Finnish which sucks in the present version. - [Dec 14, 99] In relationship links with option "by marriage" does not display the consanguinity (0%) any more if all relations found are by marriage. - [Dec 14, 99] Fixed bug: in relationship links, with option "relationship by marriage", when several branches, sometimes did not display the persons (sometimes only the spouses, sometimes branches were missing). - [Dec 13, 99] In tree displays with several branches, add the spouse(s) of the top person(s). - [Dec 13, 99] Fixed bug: when merging two persons, the godchildren, possible children, foster children (and so on...) of the second person were not transferred to the first person (problem only with "children" relations, not "parents"). - [Dec 10, 99] In tree displays with several branches, the option "add spouses" did not work. Fixed. * GeneWeb compiler (gwc) - [Jan 15, 00] Fixed bug: did not recognize foster parents * GeneWeb uncompiler (gwu) - [Jan 15, 00] Fixed small bug: used to save notes for relations even if no notes were defined. * GeneWeb uncompiler (gwu) and GeneWeb to gedcom (gwb2ged) - [Dec 13, 99] Fixed bug: the option '-s' (extraction of a surname) also selected children with different surnames. * Gedcom to GeneWeb (ged2gwb) - [Jan 6, 00] Added option -ds (default source) to set a default source to the persons having no source data. * Lexicon (lang/lexicon.txt) and welcome pages (lang/*/start.txt) - [Jan 15, 00] Added "Julian day" for calendar page (and its value is now displayed with a thousand separator). - [Jan 13, 00] (detail) Changed phrase "not dead" into "living" - [Dec 18, 99] Fixed and completed some Norwegian phrases (Brynjulf Langballe) - [Dec 17, 99] Fixed and completed some German phrases (Marcus Zelezny) * Base configuration files (base.gwf) - [Jan 10, 00] Added variable "max_cousins", by default 2000, to specify the maximum number of cousins who can be displayed in the cousin page. - [Dec 17, 99] Added variable "highlight_color", by default #2f6400 (green), for the color often used in pages. GeneWeb version 3.01 -------------------- * Languages - [Nov 22, 99] Added Finnish (Antti Alfthan) * Setup program (gwsetup) - [Nov 29, 99] Updated French version - [Nov 29, 99] Updated German version (Thomas Omerzu) - [Nov 7, 99] Fixed problem in Windows version under Netscape: images did not appear... * GeneWeb Service/CGI (gwd) - [Dec 2..6, 99] In relationship computing, can print the complete graph (all branches in one page). Proposed (when there are no too many links) in the list of relationships for each branch type ("click here") and globally in links at end of page. - [Nov 26, 99] Faster computation of list of all titles and all places - [Nov 26, 99] Fixed a problem of sometimes displaying of a message "document contains no data" from the browser when computing relationship. - [Nov 19, 99] Added ability of customization of the page displayed when no database is given (must make a file etc/index.txt). - [Nov 16, 99] Fixed bug: some old dates failed the calendars page - [Nov 13, 99] In calendars, display the number of days since ... - [Nov 10, 99] Images are now clickable to see them in their true size - [Nov 10, 99] Added relationship computing by shortest path (Louis Granboulan). - [Nov 10, 99] Added foster parents. - [Nov 10, 99] Changed structure of databases for internal optimizations. * Lexicon (lang/lexicon.txt) and welcome pages (lang/*/start.txt) - [Nov 30, 99] Added French Revolution and Hebrew months in lexicon - [Nov 23, 99] Updated Hebrew version (Jonathan Marder) * Base configuration files (base.gwf) - [Nov 15, 99] Added variables "max_anc_tree" (default = 5) and "max_desc_tree" (default = 4) to set the maximum number of generations that can be displayed by tree. - [Nov 13, 99] Fixed bug: when setting the variable "access_by_key" to "yes", links to persons holding "?" in their names did not work. * Gedcom to GeneWeb (ged2gwb) - [Nov 28, 99] Deleted the too specific option -ta - [Nov 5, 99] Accept roman digits in years of French Republican dates. * GeneWeb to Gedcom (gwb2ged) - [Nov 18, 99] Prints a space before the slash preceeding the surname in the NAME tag. * Documentation - [Nov 10, 99] Updated German version (Thomas Omerzu). GeneWeb version 3.00 -------------------- New look for GeneWeb! Icon, default background, new structures of pages. Thanks to Emmanuelle Visseaux. * Languages - [Oct 26, 99] Added Icelandic (Ólafur Sigurgeirsson). * Setup program (gwsetup) - [Oct 28, 99] Added option -p to select another port number (defaut: 2316). * GeneWeb Service/CGI (gwd) - [Oct 24, 99] In display by surname, added a specific indication for the branches whose ancestor has parents with a different surname, in order to differentiate them with the branches whose ancestor has no parents. - [Oct 21, 99] Added message "or Sosa number relative to x" when displaying a relationship computing form if navigating with x as Sosa reference. - [Oct 21, 99] Limit local images height to some maximum number of pixels (currently 240). Not applied to distant (http://) images. - [Oct 21, 99] Fixed bug: there was no automatic "wizard" (resp. "friend") access in cgi mode when no "wizard" (resp. "friend") password was defined. - [Oct 20, 99] Added option -a to give a specific IP address for the service (must be compatible with the computer). - [Oct 19, 99] Added treatment of png images files. - [Oct 10, 99] In update form, when name conflict, added the birth and death date in the list of persons having the same name. - [Oct 8, 99] Added forum. - [Oct 5, 99] Fixed links problems in some pages from the DOC link (some problems found in the Swedish version). - [Oct 5, 99] Added displaying of number of persons in ascends (short display). - [Oct 4, 99] Fixed displaying bug in update history (spot displayed due to incorrect HTML). - [Oct 3, 99] Added week day in "calendars" page. * GeneWeb compiler (gwc) - [Oct 26, 99] Added option -f, like in ged2gwb: by default now, if the data base already exists, the program exits in error. If option -f is used the old database is overwritten. * GeneWeb uncompiler (gwu) - [Oct 24, 99] Added option -s to select all persons having a given surname (option usable several times). Added associated option -nsp, not to select the spouses' parents (what is done by default). These options has been added in command gwb2ged too. - [Oct 19, 99] Fixed bug: notes sometimes disappeared for godparents and co. - [Oct 10, 99] Fixed bug: dates represented as text where not extracted in the output file but on standard output. * Gedcom to GeneWeb (ged2gwb) - [Oct 13, 99] Added option "-fne" (for "first names enclosed"): it is possible to give two characters telling that the usual first name parts is between those characters: e.g. if they are of the form: Bernard Jean "Philippe" use -fne '""' and if they are: Bernard Jean (Philippe) use -fne '()', and so on. * GeneWeb to Gedcom (gwb2ged) - [Oct 24, 99] Added option -s to select all persons having a given surname (option usable several times). Added associated option -nsp, not to select the spouses' parents (what is done by default). These options has been added in command gwu too. - [Oct 5, 99] Changed the way the lines of notes are cut (by tag CONC). The standard GEDCOM 5.5 tells that too long lines must be cut *inside* words and not *between* words, to avoid starting or trailing spaces in CONC lines. Gwb2ged did not do that: it is fixed. To remain compatible with old GEDCOMS generated by GeneWeb, the ged2gwb program is not changed: in CONC lines, the possible starting space remains included in the note (what does not respect the standard, shame on me). * Base configuration files (base.gwf) - [Oct 30, 99] Deleted variable "enclosing_tag" defined in version 2.05 on July 18, 99. Reason: complicated the code => too many risks of operation bugs. Sorry for the ones who used it. - [Oct 29, 99] Added a variable "propose_titles" (yes by default). When set to "no", the search by (nobility) titles is not proposed in the welcome page. * Lexicon (lang/lexicon.txt) and welcome pages (lang/*/start.txt) - [Oct 31, 99] [technical point] Changed the conditional macros in the welcome pages, now between %I and %E. - [Oct 26, 99] Changed several Portuguese translations (Oscar Filipe de Oliveira Barroso). - [Oct 12, 99] Fixed and completed some Norwegian phrases (Brynjulf Langballe). - [Oct 4..10, 99] Fixed and completed some Dutch phrases (Joris Esch). - [Oct 4, 99] Fixed some German phrases (Falko Trojahn). * Documentation - [Oct 31, 99] [technical point] Updated the documentation of the macros of the welcome page. Chapter "customization of pages", section "macros". GeneWeb version 2.07 -------------------- * Setup program (gwsetup) - [Sep 16, 99] Distribute different versions of the introduction text for Windows and Unix (problems of accents). (Does not concern the Linux distribution by rpm package.) - [Sep 13, 99] Added German version (Thomas Omerzu). - [Sep 9, 99] Added Swedish version (Lars Gustavsson). - [Sep 8, 99] Fixed lot of typos and errors in English version (thanks to Lars Gustavsson). - [Sep 6, 99] Fixed problem in Windows: if the user choosed a language by writing it in uppercase letters, some phrases where displayed in English language between brackets (no matter which language was selected), indicating that the language was not found in the lexicon. * GeneWeb Service/CGI (gwd) - [Oct 1, 99] Fixed bug: the pages from the "DOC" link were sometimes not correctly displayed with certain browsers (HTTP headers were missing). - [Sep 24, 99] Added history for updates (option to be set in file base.gwf). - [Sep 23, 99] Added witnesses for marriages. - [Sep 22, 99] Fixed bug: bad display of "nth cousin" in Swedish (due to problems with the character ":" in the translation). - [Sep 21, 99] Fixed bug: the "DOC" link did not work in CGI mode. - [Sep 21, 99] Added "CREDITS" in doc, accessible from the "DOC" link too. - [Sep 20, 99] Changed gif files (flags and up arrow) into jpeg files. - [Sep 19, 99] In "search", can find someone if only one of his first names is given: e.g. can find "Marie Liesse de Rohan Chabot" if searching "Marie de Rohan Chabot" or "Liesse de Rohan Chabot". Works partially, i.e. only if the classic search failed. - [Sep 17, 99] Can use now special characters for wizard/friend passwords in CGI mode (before, it worked only in service mode). - [Sep 16, 99] Advanced search with baptism date and place did not work: fixed. - [Sep 16, 99] Changed the order of dates in modifications forms into: year/month/day and these fields are now labelled. - [Sep 15..27, 99] Added calendars for dates (Gregorian, Julian, French Republic, Hebrew). - [Sep 11..17, 99] Now, several users and passwords can be defined for "wizard" and "friend" access, by specifying authorization file names in the "base.gwf" file. - [Sep 8, 99] Fixed bug: in descendant displaying, if the person has quotes in his name, the displaying was sometimes wrong. - [Sep 8, 99] In "DOC" links, in the bottom of the pages, the links with Email addresses did not work correctly. Fixed. * Gedcom to GeneWeb (ged2gwb) - [Sep 28, 99] By default now, if a database with the same name already exists, does not erase it and exits in error. Added option -f to overwrite the old version. * Consanguinity computing (consang) - [Sep 17..19, 99] Run faster when no modifications have been done (e.g. just after the creation of the database). * Lexicon (lang/lexicon.txt) - [Sep 22, 99] Fixed some German phrases (Gerriet Backer). * Documentation - [Sep 10, 99] Updated Swedish files (Lars Gustavsson). - [Sep 7, 99] Fixed some typos in the "pcustom.htm" files (English, German and Swedish versions). GeneWeb version 2.06 -------------------- * Installation - [Sep 2, 99] Linux distribution will includes rpm packages. * Setup program (setup) and GeneWeb Service (gwd) - [Sep 2, 99] Under Unix, find the default language in the environment variables LANG or LC_CTYPE. * Setup program - [Aug 16, 99] Renamed this program "gwsetup". - [Aug 16, 99] Fixed bug: sometimes tried to display a non-existent file "warnings.htm". * GeneWeb Service/CGI (gwd) - [Aug 19, 99] Fixed bug: the "back" button which appears after error in update used to forget the selected language. - [Aug 19, 99] Added more informations (places) in descendants display by list. - [Aug 18, 99] Added a link to the documentation (close to the copyright). - [Aug 14..21, 99] Added a ility to put notes for the database itself (for a general introduction). - [Aug 14, 99] Fixed bug: send image in cgi mode under Windows did not work. - [Aug 13..21, 99] In notes, URLs and Email addresses are now clickable. - [Aug 13, 99] Added the ability to change the text of some pages: 1/ for site address redirection (gwd new option "-redirect", see below), 2/ for database name change (gwf file field "renamed") and 3/ detected robot exclusion (when option -robot_xcl has been set). - [Aug 13, 99] Fixed bug: when merging persons, the "other relations" where not included. - [Aug 8, 99] Added option "-redirect" to say to the users that the GeneWeb service has been redirected to some other address. * Gedcom to GeneWeb (ged2gwb) - [Aug 30, 99] Added option "-no_pit" (= no public if titles): do not automatically consider persons having titles as public. - [Aug 29, 99] Fixed bug on access with pointers (between '@' in the gedcom) resulting on bad errors detections. - [Aug 22, 99] The option "-no_efn" is now the default. Made the change in "setup" files too. * Base configuration files (base.gwf) - [Aug 20, 99] Added new variables "max_anc_level" and "max_desc_level" to specify the maximum level of generations that can be displayed in ancestors and descendants displaying (default resp. 8 and 12 generations). - [Aug 18, 99] Added a new variable "auth_file" in databases configuration files (files ending with ".gwf") overriding the possible authorization file set by option "-auth" of gwd. Therefore now, each database can have its specific global restricted access. See the template file "a.gwf". Works only in server (not cgi) mode. * Lexicon (lang/lexicon.txt) - [Aug 29, 99] Updated some Dutch phrases (Joris Esch). * Documentation - [Sep 1, 99] Added German version (Falko Trojahn) - [Aug 19, 99] Added new chapter "the access restrictions to databases" about wizards, friends, global access restrictions, robots, black list. GeneWeb version 2.05 -------------------- * General - [Aug 4, 99] In the distribution main directory, files README.txt (English) and LISEZMOI.txt (French), added a few lines of explanations for starting with GeneWeb. - [Jul 15, 99] Changed internal representation of strings in databases. Should not make any differences while browsing. However, as it is a major internal change in the program, problems may appear (mainly in displaying or in access by name, first name, surname, title...): please report if any problem. * Setup program - [Jul 18, 99] Added in the menu "database parameters" the ability to display the characters in the pages 1/ in bold, 2/ in italic, 3/ in smaller or bigger size (using the new key 'enclosing_tag': see below section "base configuration files"). Bold is useful, for example, if a background image is used, to make the text more readable. [Spanish version not yet translated] - [Jul 15, 99] Changed GEDCOM export menu to reflect new option "-charset" of "gwb2ged" (see below in section "GeneWeb to Gedcom"). - [Jul 2, 99] Fixed bug: importing GeneWeb base from old version passing by a GEDCOM file did not work if the current directory held spaces. - [Jul 2, 99] Changed names of html files to hold 8 characters maximum and 3 characters for the extension, to be unzippable by "pkunzip". * GeneWeb Daemon/CGI (gwd) - [Aug 6, 99] Changed order of menu in "update page": separated "delete" from "modify". - [Aug 6, 99] Restored the system of robot exclusion (had been deleted in version 1.10) with some improvements. Option "-robot_xcl". - [Aug 5, 99] Added descendants displaying by tree (doesn't work with Lynx). - [Aug 3, 99] Added ancestors displaying (and navigating) by tree. - [Aug 3, 99] In relationship by branches, found a solution to display the vertical bars correctly aligned relative to the horizontal bars (works at least with Netscape, IE, Kfm). - [Aug 2, 99] In relationship displaying, can make the difference in the lexicon between father's and mother's side (used in Swedish, where there are different words for "uncle", "aunt", "great-uncle" and "great-aunt" depending on they are on father's or mother's side). - [Aug 1, 99] Added relationships computing by marriage. - [Jul 28, 99] In "cousins" pages, added link to uncles and aunts, nephews and nieces. - [Jul 26..28, 99] Added other relations: godparents, adoptive parents, recognizing parents, candidate parents. - [Jul 22, 99] In relationship branches displaying, when the spouses are displayed, display also the marriage date. - [Jul 20, 99] In the titles displaying, sort preferably the persons by the nth rank (e.g. "nth duke of ...") when existing. - [Jul 19, 99] Fixed bug in descendants by list: displaying was incorrect when several marriages and one of them with an unknown ("? ?") person. - [Jul 18, 99] When updating families, the "sources" field is propagated into the created persons. - [Jul 18, 99] Fixed small bug for the access by subparts of surnames (it sometimes accepted too small subparts: then the "search" could give weird results). - [Jul 17, 99] In welcome page, now search by surname when search by full name fails (no need to select "surname"). Idem in relationship computing. - [Jul 17, 99] Fixed bug: could not access person after having changed his name, in some circumstances, e.g. changing the surname "L'epine" (in two words) into "Lepine" (one word). - [Jul 16, 99] Added a "back" button in case of update error (useful for browsers which loose the contents of the forms when navigating). - [Jul 15..29, 99] In relationship computing, added a long display, the ability to see the spouses in branches displaying, and the ability to cancel GeneWeb links. - [Jul 15, 99] Added system of grammar declinations (required by German, Esperanto, Czech). Changed the lexicon to use this new system. - [Jul 9, 99] Added link (upper arrow) to welcome page in displayings by first names and surnames. - [Jul 9, 99] Fixed date check for possible father when interval (i.e. was telling "incorrect" when father died between 1250 and 1260 and son born in 1255). - [Jul 3, 99] Added "af" as possible surnames particles (this is Danish) possibly ignored in "search". * Gedcom to GeneWeb (ged2gwb) - [Jul 5, 99] Fixed bug sometimes stopping the program (exception "Invalid_argument") after the detection of an error of a family whose parents are of bad sex (female father and male mother). - [Jul 2, 99] Recognizes the dates of the form "FROM..TO..". * GeneWeb to Gedcom (gwb2ged) - [Jul 15, 99] Added option "-charset" whose values can be "ANSEL" or "ASCII": "ASCII" is the default. Deleted option "-ascii" now unuseful. - [Jul 2, 99] Generate now dates of the form "FROM..TO.." for titles. * Base configuration files (base.gwf) - [Jul 18, 99] Added the key 'enclosing_tag' to enclose whole displayed text with one or several HTML tags. E.g. by setting it to 'strong', all text is displayed bold. Added comment about that in the template file "a.gwf". * Lexicon (lang/lexicon.txt) and Welcome pages (lang/*/start.txt) - [Aug 5, 99] Updated Portuguese phrases (Yves Guignard) - [Aug 5..6, 99] Updated Norwegian phrases (Brynjulf Langballe) - [Aug 3, 99] Updated Danish phrases (Hans Albeck) - [Aug 3..6, 99] Updated Dutch phrases (Joris Esch) - [Aug 3, 99] Updated German phrases (Markus Mottl) - [Aug 2, 99] Updated Italian phrases (Daniel Hirschkoff) - [Jul 23, 99] Updated Swedish phrases (Lars Gustavsson) - [Jul 23, 99] Added Czech (Hanus Adler). - [Jul 17, 99] In welcome pages, simplified the text "it is a first name and surname or public name blah blah blah...". - [Jul 17, 99] Changed French term for "surname" ("nom" changed into "patronyme" more common among French genealogists). - [Jul 8, 99] Updated Swedish phrases (Stig Petersson) - [Jul 3, 99] Updated Danish phrases (Hans Albeck) * Documentation - [Jul 27, 99] Updated Swedish documentation (Lars Gustavsson). - [Jul 23, 99] Added documentation about the languages with declinations: "How to make modifications in the database", section 8. GeneWeb version 2.04 -------------------- * Setup program - [Jun 28, 99] Fixed bug: did not work for directories holding spaces. - [Jun 19, 99] Changed GEDCOM import menu to reflect new option "-charset" of "ged2gwb" (see below in section "Gedcom to GeneWeb"). - [Jun 18, 99] Added a color combination in the provided palette whiteyellow, black, bluegreen and brown (thanks to Hans Albeck) * GeneWeb Daemon/CGI (gwd) - [Jun 30, 99] Added the ability to enter a Sosa number in the welcome page when navigating with someone as Sosa reference number (still available from its "ancestors" page). - [Jun 30, 99] In relationship links, display common ancestors in a more canonical order. - [Jun 28, 99] Due to optimization in consanguinity computing (see below), the answer time of relationship computing for persons without relationship links is generally faster (it answers: "no relationship links" faster). - [Jun 26, 99] Added the ability to access persons having composed surnames by subparts of their surname: e.g. "Josephine Tascher de La Pagerie" can now be found by typing just "Josephine Tascher" or "Josephine de La Pagerie". - [Jun 25, 99] Added short (horizontal) display for surnames by alphabetic order + ability to cancel GeneWeb links (for creation of static HTML pages). - [Jun 22, 99] Fixed bug: send image in CGI mode did not work. - [Jun 19..28, 99] Added in ancestors long display the ability to select and unselect the displaying of siblings and the displaying of notes. - [Jun 19, 99] Changed presentation of ancestors displaying main menu. * Gedcom to GeneWeb (ged2gwb) - [Jun 21, 99] Fixed bug: couples could sometimes be recorded as divorced, even if not (when there was a "1 DIV" field without DATE and PLAC in the gedcom file). - [Jun 19, 99] Can now read MSDOS accentuated characters encoding. Added option "-charset" which can be followed by "ANSEL", "ASCII" or "MSDOS". Removed options "-ansel" and "-no_ansel". Warning: in GEDCOM files, the charset "IBMPC" (which is not standard GEDCOM 5.5) is by default interpreted as "ASCII", *not* "MSDOS"; to override this default, the option "-charset MSDOS" will have to be used. * Consanguinity computing (consang) - [Jun 28, 99] Optimized code: it is twice faster (on average) now. * Lexicon (lang/lexicon.txt) - [Jun 30, 99] Translations added in Italian (Daniel Hirshkoff). - [Jun 18..Jul 1, 99] Translations improvements in Danish (Hans Albeck). * Documentation - [Jun 30, 99] Updated Dutch documentation (Joris Esch). GeneWeb version 2.03 -------------------- * Setup program - [Jun 7, 99] Added a Spanish version (Luis Castro Guzman). - [Jun 1, 99] The location to open is now always "http://localhost:2316/", independant from the selected language (no more need to end the location with "fr" or "en"): the page is displayed in the selected language. - [May 15, 99] Added deletion of ".gwo" file after then "gwc" operation. - [May 9, 99] Added predefined palette combination in "database parameters"; changed presentation of all page. - [May 9, 99] Added system to forbid non local accesses. - [May 7, 99] Fixed bug: recovering database from old version of GeneWeb did not work when the old directory held spaces. - [May 7, 99] Fixed bad behavior under Windows: "GWU.EXE" (in uppercase) was not regognized when searching for old GeneWeb versions. - [May 7, 99] Fixed bug: "cleanup" under Windows did not work. * GeneWeb aemon/CGI (gwd) - [Jun 7, 99] No more (stupid) abbreviation for "Number" in update forms: Did not work for many languages. - [Jun 3, 99] Added ability to use a new predefined term "+before" in the lexicon to specify the complement is before a verb (e.g. in German: "send" "image" is translated into "senden +before" "Bild", which gives at end: "Bild senden"; same solution for Dutch). - [May 31, 99] In ancestors only selected generation, added displaying of Sosa intervals (and "..." is displayed for non-contiguous intervals). - [May 18, 99] Added, in ancestors and descendants displaying, the ability to cancel GeneWeb links. Useful to extract a Web page for a site without GeneWeb server. - [May 16, 99] Fixed bug: in ascendants long displaying, did not display the last possible generation. - [May 15, 99] Added a "?" at end of empty requests (with just the database name) because of too smart browsers which automatically add a "/" at end of the address in this case (transforming e.g. "http://host/base" into "http://host/base/"), what makes the request not working. - [May 14, 99] Fixed bug: in personal pages, the term "died" was sometimes missing when there was only a death place but no death date. Happened for persons born more than 120 years ago. - [May 12, 99] Fixed problem in CGI mode under Windows: sometimes displayed warning texts on the page. - [May 11, 99] Fixed bug: advanced search worked bad when neither "wizard" nor "friend": did not work when only specifying e.g. a first name or a surname of an existing (non "public") person. - [May 11, 99] Fixed bug: when adding ";opt=no_index" in URLs like explained in the doc ("How to put links to your base"), the used language was missing in the new URL. - [May 10, 99] Added ability to put relationship date for non married persons. - [May 7, 99] Fixed bug visible in Danish: the AE ligature ("æ") was incorrectly capitalized. * Lexicon (lang/lexicon.txt) and welcome pages (*/start.txt) - [Jun 7, 99] Changed terms in Dutch for sentences with verb at end. - [Jun 7, 99] Added missing terms in Portuguese (Yves Guignard). - [Jun 3, 99] Added missing terms in German (Markus Mottl). - [Jun 3, 99] Added some missing terms in Italian (Daniel Hirschkoff). - [Jun 2, 99] Fixed and completed translations in Swedish (Lars Gustavsson; some help also from Stig Petersson). - [May 31, 99] Corrected and completed Spanish sentences in lexicon and Spanish welcome page (Luis Castro Guzman). * Gedcom to GeneWeb (ged2gwb) - [May 19, 99] Better catenation of continuation (CONC) notes. In particular fixes the bug which sometimes added spaces inside words. * GeneWeb to Gedcom (gwb2ged) - [May 19, 99] Fold notes lines at 255 characters (required by GEDCOM standard) adding CONC. * Consanguinity computing (consang) - [May 23, 99] Does not restart from scratch when changes: compute only what's necessary. * Documentation - [May 13..31, 99] Updated Swedish documentation (Lars Gustavsson). GeneWeb Version 2.02 -------------------- * New feature - [May 4, 99] Added a new program "setup" which will allow to use a lot of commands without having to type magic incantations in a MSdos (Windows) or Xterm (Unix) window. Everything is done in the Web navigator: creation of a database, extraction of a GEDCOM file, cleanup, etc etc. Should be convenient for non computer scientists beginners (and even for old timers computer scientists who already know GeneWeb). * General - [Apr 22, 99] Added Danish language (by Hans Albeck). * GeneWeb Daemon/CGI (gwd) - [May 6, 99] Fixed bad behavior: in "modify person" form, a person was not considered as "buried", if the only area filled was "burial place". - [May 4, 99] Added button "include missing spouses" for missing ancestors. - [May 4, 99] Suppressed trace log count in CGI mode in not redirected in a file (option "-log"). Seemed to be incorrectly displayed in the HTML page in Windows. - [Apr 30, 99] Fixed another accent problem in displaying in clicking a first name for corresponding surnames starting with an accentuated letter. - [Apr 29, 99] Accept now files in image field ending with ".jpeg" and ".JPEG" (accepted before only with ".jpg" and ".JPG"). - [Apr 29, 99] Fixed bug: when a persons first name, last name and number is the same as another person, GeneWeb shows a warning and suggests a new number. If the new number is selected, all special signs were transformed into codes. - [Apr 29, 99] Fixed small uncomfortable feature: when trying to save an image from a GeneWeb page, the browsers did not propose a correct file name to save this image (due to request syntax). - [Apr 29, 99] Added ability to change the first name and the surname of all children of a person in one only form. See new doc. - [Apr 26, 99] Fixed upload of "jpeg" files which sometimes did not work with Windows (message: "incorrect request") - [Apr 25, 99] Added space before "+" in short dates. * Lexicon (lexicon.txt) - [Apr 23, 99] Some changes in Hebrew version (by Jonathan Marder). * GeneWeb compiler (gwc) - [Apr 22, 99] Do not consider the message "notes before definition" any more as a fatal error. * GeneWeb uncompiler (gwu) - [May 3, 99] Added option "-o" for consistency with other commands. - [Apr 22, 99] Do not save notes any more for persons having "?" as first name or surname. * Documentation - [Apr 29, 99] Added doc for the new feature "change children's names": in "update.htm", modified section 3, added a point 5 (shifting the point "add parents" to number 6), added section 5.8 for explanations. GeneWeb Version 2.01 -------------------- * General - [Apr 2, 99] Added Norwegian language (Brynjulf Langballe). - [Mar 30, 99] Changed term "photo" into "image". * GeneWeb Daemon/CGI (gwd) - [Apr 20, 99] Changed suffix ".cnf" into ".gwf" for configuration files (because of confusion with that predefined suffix in Windows). - [Apr 20, 99] In short dates (just year), if no birth date, baptism date is displayed. - [Apr 19, 99] In latest births and latest deaths displaying, the dates with just the year or just the month and the year are also taken into account. - [Apr 17, 99] Improved relationship branches displaying to be readable with Lynx (terminal browser without tables). - [Apr 16, 99] When merging persons, the lowest number is proposed by default. - [Apr 16, 99] Added long display for ancestors. - [Apr 13, 99] Fixed bug in personal pages: for people having a public name, the (small) links to the first name and surname could work bad in case of accents. Fixed other bug same kind: in advanced request, research did not work if accents were used... - [Apr 6, 99] Fixed bug in personal pages, titles dates were sometimes displayed just as "...". - [Apr 2, 99] Fixed bug: in missing ancestors in alphabetic order, the accents in surnames were incorrectly displayed. - [Mar 30, 99] Added the spouses when displaying relationship links with cousins (from the "cousin" link in personal pages). - [Mar 25, 99] Added the "unmarried" case for couples. - [Mar 23, 99] Added display of number of accesses in traces. - [Mar 17, 99] In person modification form, determines whether a person is died or not (if not specified), according to his age. - [Mar 16-19, 99] The presence of images in pages does not block any more the display of the text. For example, in welcome pages, the text does not wait for the displaying of the flags to be displayed, which is much more comfortable. (This applies only for local images). - [Mar 14, 99] In anniversaries, in the list of months, the selected month is now the current month, not always January. * Gedcom to GeneWeb (ged2gwb) - [Apr 2, 99] Added the automatic computation that a person is died or not (if not indicated in the gedcom), according to the person's age, and deleted the option "-nd". - [Mar 31, 99] Added option "-log" to redirect output. - [Mar 20, 99] Added options for dates where months are represented by numbers: -dates_dm when day before month and -dates_md when month before day. - [Mar 16, 99] Did not work for gedcom files with white spaces in the beginning of the lines. Fixed. - [Mar 11, 99] Fixed horrible bug: treatment of accents worked bad for gedcom files with ascii charset (resulting problems in "a" umlaut, for example). * Consanguinity computing (consang) - [Mar 26, 99] Added option -q for quiet mode, just displaying a progress bar. * Lexicon (lexicon.txt) and Welcome files (xx/start.txt) - [Mar 10, 99] Some changes in Italian version (by Raffaele Sena). * Documentation - [Mar 24, 99] Deleted all background colors. - [Mar 18..Apr 13, 99] Swedish version updated (Lars Gustavsson). - [Mar 17, 99] Changed documentation for the new feature "automatic choice" for the "death state" (see above), file "update.htm", section 5.4 "modify a person", paragraph "Death". * Internal - [Mar 24, 99] (working Unix only) Added options "-setuid" and "-setgid" to "gwd" to change the user or group id after socket bind. This allows for example to use the port 80 (root needed) but accessing data as normal user. GeneWeb Version 2.00 -------------------- From the version 2.00, the license is GPL (GNU General Public License). The previous license still applies up to the version 1.11 included. * GeneWeb daemon/CGI (gwd) - [Mar 7, 99] Added ability to enter directly birth dates for children in families forms. - [Feb 27, 99] Added case "half-siblings" in relationship links. - [Feb 27, 99] In personal pages, titles dates when complete are displayed completely (not just year). - [Feb 26, 99] For a birth the present day, does not display "happy birthday" any more! And displayed age is "birth" and not "less than one year". - [Feb 26, 99] Displaying of first name alias in personal pages does not include the surname any more. - [Feb 23, 99] In non leap years, birthday anniversaries of February 29 are counted and celebrated March 1. - [Feb 19, 99] Replacement of "%s" by the name of the base with context, also in family comment. - [Feb 18, 99] Added deletion of photos. - [Feb 13, 99; Feb 20, 99] Added ability to send photos. - [Feb 12, 99] Improved displaying in Hebrew language. - [Feb 8, 99] Fixed bug in CGI mode under Windows: images (flags e.g.) were often truncated. * Gedcom to GeneWeb (ged2gwb) - [Feb 14, 99] Assumed wrongly that all families were defined after individuals, because it is often the case in Gedcom files. But this is not mandatory in definition Gedcom 5.5. Fixed. - [Feb 6, 99] Accept dates with "/" (20/11/1993) although it is not standard Gedcom 5.5. Interpreted as day/month/year. * GeneWeb to Gedcom (gwb2ged) - [Feb 26, 99] Fixed error: the first name alias if any was always saved in the gedcom as first name. Now saved only as first name if it starts with the first name (e.g. if first name = "John" and first name alias = "John Philip Robert"). * GeneWeb compiler (gwc) - [Feb 19, 99] The option "-cg" did not work. Fixed. * GeneWeb uncompiler (gwu) - [Feb 16, 99] Fixed bug: names holding "?" were sometimes not saved correctly, so that gwc did not work afterwards. * Lexicon - [Feb 26, 99] Small change in French translation. - [Feb 11, 99..Feb 24, 99] Some changes in Swedish version and fixed some errors in English version (Lars Gustavsson). * Documentation - [Mar 8, 99] Added a short paragraph in update.htm, section 5.2, paragraph "Filling", alinea "Create" about the fact that one can add his birth date. - [Feb 26, 99] Small change in French version (translation of "first name alias") in file update.htm, section 5.4. - [Feb 18, 99] Explained how to delete photos (new feature) in file "update.htm", (new) section 5.7. Some more changes in "start.htm", section "File a.cnf" and "update.htm" section 3 and 5.6. - [Feb 15, 99] Completed info for configuration files in file "start.htm", section "File a.cnf". Explained how to send photo (new feature) in file "update.htm": added section 5.6, completed section 3. - [Feb 11, 99..Feb 24, 99] Updated Swedish version and fixed some errors in English version (Lars Gustavsson). - [Feb 10, 99] Updated Dutch version (Joris Esch). GeneWeb Version 1.11 -------------------- * General - [Jan 27, 99] Added Hebrew (Jonathan Marder, Ruth Marder) * GeneWeb daemon/CGI (gwd) - [Jan 30, 99] Added link to welcome page after updates. - [Jan 24, 99] Added default photo names: not necessary to specify a photo for someone, a default name is searched. - [Jan 20, 99; Jan 30, 99] Added display of latest deaths. - [Jan 19, 99] Added direct links to siblings. - [Jan 18, 99] Family comment now displayed like dates (=> possible visibility by password restriction). - [Jan 18, 99] In notes and sources, the string "%s" is replaced by the name of the base in the same context. For example, in a source field, if "John Smith" is in the same database, it is possible to record it as: John Smith - [Jan 11, 99] Display declined forms (for some languages). E.g.: * in German: "x ist ein Sohn von einem Cousin von y" ("einem" instead of the inkorrect "ein"). * in Esperanto: "aldoni personon" ("personon" instead of the incorrect "persono") * GeneWeb compiler (gwc) - [Jan 26, 99] Fixed bug: failure when backslashes in source. - [Jan 18, 99] Fixed two bugs in dates parsing: 1. "x..y" (between x and y) was interpreted as "x|y" (x or y) 2. did not accept "d/m/y..y". * Gedcom to GeneWeb (ged2gwb) - [Feb 3, 99] No more message "Not implemented SUBM". - [Feb 1, 99] Accept now "BET x AND" as "AFT x" and "BET AND x" as "BEF x". - [Feb 1, 99] Fixed bug: date intervals did not work (generating "maybe"). * GeneWeb to Gedcom (gwb2ged) - [Jan 19, 99] Fixed bug: the tag "
" was converted into a new line only in lowercase form; "
" did not work. * Gedcom to GeneWeb and GeneWeb to Gedcom (ged2gwb, gwb2ged) - [Jan 18, 99] When there are several names (several records "1 NAME") for someone in Gedcom, the other become "aliases" (and vice versa for gwb2ged). * GeneWeb uncompiler (gwu) - [Feb 4, 99] Notes for persons having "?" no more saved (these persons are supposed to be deadends and this made "gwc" fail). * Lexicon file (lexicon.txt) - [Feb 3, 99] Some changes in Swedish translation (Lars Gustavsson). - [Jan 28, 99] Added section "!dir" for languages written right to left. - [Jan 28, 99] [minor] Portuguese translation now in pure ascii using HTML "&" macros instead of accents (no changes in Portuguese displaying) - [Jan 16, 99] For update forms, changed text "Date" into "Date (d/m/y)" in english version to be sure there is no ambiguity. - [Jan 16, 99] Added declined forms. - [Jan 16, 99] Fixed typos in German version (Markus Mottl). * Welcome files (xx/start.txt) - [Jan 30, 99] (en) Some changes in terms used (anniversaries). * Documentation - [Feb 3, 99] Added a paragraph (Message "socket failed") in "problems". - [Feb 1, 99] Updated Dutch version (Joris Esch). - [Jan 29, 99] Added remark at end of introduction for how to redirect the command displaying in a file. - [Jan 26, 99..Feb 3, 99] Fixed many typos in english version (Lars Gustavsson). - [Jan 25, 99] Added doc explaining consanguinity: new link in "directions for use". - [Jan 24, 99] Added doc for default photo name (new feature) in "directions for use", page "modifications", section 5.4 ("modify a person"), paragraph "Photo". - [Jan 24, 99] Fixed typo; was indicated "image" instead of "images" as directory name in this paragraph. - [Jan 22, 99] Added a few lines for "How to merge two families" in the page "modifications". - [Jan 20, 99] Added documentation for: * how to put links to GeneWeb databases. * how to customize welcome pages. - [Jan 11, 99] Swedish version (Lars Gustavsson). GeneWeb Version 1.10 -------------------- * GeneWeb daemon/CGI (gwd) - [09/01/99] Fixed bug in CGI mode: images in directory "images/base" were sometimes not found. - [08/01/99] Changed term "consanguinity" into "relationship" in relationship computing (because confusion with the usual meaning of the term "consanguinity"). - [06/01/99] Deleted Unix option "-robot_xcl": worked bad, did not detect robots, detected robots when there are not, too complicated to fix. (The normal HTTP robot exclusion remains.) - [28/12/98] Changed some http requests to hold no accents (should be continued...) - [19/12/98] Fixed bug quotes disappearing in field "first name aliases" in form Update/Person (if the value holds quotes). - [18/12/98] No more HTML "table" used in relationship links with one branch (=> more compact display and visible in browsers without tables, e.g. "lynx"). - [13/12/98] The directory cnt is no more searched in the directory where the daemon (or the CGI) is launched but in the base directory (option -bd of gwd; no difference if option -bd not used). - [13/12/98] In relationship links, display the ancestor couple (if both are ancestors). --- [12/12/98..13/12/98] Added displaying of cousins. - [11/12/98] Fixed more bugs (accents) due to new ANSEL encoding. * Gedcom to GeneWeb (ged2gwb) - [14/12/98] Fixed bug in Windows version (displaying "uncaught exception: Stream.Failure"). * GeneWeb compiler (gwc) - [02/01/99] Fixed missing accents displaying for undefined persons. * Lexicon file (lexicon.txt) - [06/01/99] Fixed and completed German version (thanks to Markus Mottl). - [15/12/98] Added some missing phrases in some languages (mainly Espagnol, Italian). - [11/12/98] Fixed and completed Dutch version (thanks to Joris Esch). * Welcome files (xx/start.txt) --- [06/01/99, 08/01/99] Wizard and Friend passwords are to be provided in a popped window (except in CGI mode). - [04/01/99, 09/01/99] (de) Fixed some typo (thanks to Markus Mottl). - [11/12/98, 04/01/99] (nl) Fixed and completed (thanks to Joris Esch). * GeneWeb uncompiler (gwu) - [12/12/98] Added option "-mem" to save memory space, but slower. * Documentation - [09/01/99] Changed link to "LICENCE" which did not always work. --- [04/01/99] Added dutch version (thanks to Joris Esch). GeneWeb Version 1.09 -------------------- * Inside databases --- Precisions of dates now apply not only for years, but for complete date. E.g. "maybe on september 1815" or "after september 23, 1815". --- In dates, added case "between": between year and another year. - Structure of databases have been changed for these two above points. - Area "comment" in families is now kept even if there are children. * Gedcom to GeneWeb (ged2gwb) - Delete of duplicated FAMS which sometimes happen in erroneous Gedcoms. - Delete families from GEDCOM when parents dont have the good sex. - Added displaying of line number when syntax errors and unrecognized dates. - Get sources if defined by pointer (but just the 1st line). - Added option "-no_nd" (no negative dates), not to interpret years preceded by a minus sign as negative dates. * GeneWeb to Gedcom (gwb2ged) - Added option "-ascii" to output in ASCII encoding instead of ANSEL. * Gedcom to GeneWeb and GeneWeb to Gedcom (ged2gwb, gwb2ged) - The GeneWeb fields "public name", "surname alias" and "photo" are now loaded from and saved to Gedcom resp. as: "2 GIVN", "2 SURN" and "1 OBJE (newline) 2 FILE". * GeneWeb daemon/CGI (gwd) --- Added alibity to specify someone as Sosa reference. Then the Sosa number is printed in navigation when displaying ancestors. Thanks to Emmanuelle Visseaux for this idea. --- Restructuration of displaying of surnames and first names by alphabetic order and frequency. Fixed bug of bad alphabetic order when first names and surnames with accents. Access in indexes faster. - In list by title places, added clickable "The whole list" giving the list of all persons associated with this place, whatever the title. - Descendants display limited to 12 generations in all cases (else too much text or too long to answer). - Added error message in relationship computing when loop in database (someone being his/her own ancestor). - In "search", added ability to write "I" instead of "Ier" (french form). Ex: "Charles I" or "Charles Ier" are both accepted. - Added ability to add ";opt=no_index" at end of requests to get an equivalent link independant from the persons' index number (useful to put direct links in Web pages). - Added text "Parents of" in top of pages of missing ancestors. - Fixed still several bugs (accents) due to new ANSEL encoding. * Base configuration files (xxx.cnf) - Added variable "wizard_just_friend" to suspend the powers of "wizards" (e.g. for maintenance): when set to "yes", they become simple "friends" (default: "no"). - Variable "renamed" can be used to specify that a database has been renamed. Generates a page giving the good URL to use. * GeneWeb compiler and Consanguinity computing (gwc, consang) - Fixed accents displaying in traces and error messages. * Welcome pages (start.txt) - Fixed wrong displaying of number of accesses in spanish (es) and portuguese (pt) versions. - Display thousand separators in numbers of accesses. * Documentation (directory doc) - Added 2 cases in FAQ. - Many small changes. GeneWeb Version 1.08 -------------------- * Added portuguese among languages (thanks to Yves Guignard). * gwd: - fixed several displaying bugs due to ANSEL - in forms, when a precision (about, maybe, before, after, or year) is given for a date, the day and month part are ignored, since its works only for years (for the moment). - photos and background in directory "images" can be installed in a subdirectory having the name of the database; ex: "images/martin" for the database "martin". - display "+" for dead people even if not known date * gwc, gwu: - added backslash as escape character for underscores * gwc: - save much much memory space while running when there are many many notes * ged2gwb: - fixed bug displaying "Uncaught exception: Stream.Error("get to eoln")" when the gedcom file did not end with a newline * consang: - more clear message when consang does not work because of loop in database * doc: - added doc for merging databases, persons and families. - added doc for databases maintenance. - small changes in diruse.htm, server.htm, start.htm GeneWeb Version 1.07 -------------------- * Added some stuff to allow chinese like languages. * Started chinese translation * Added source field for birth, baptism, death, burial, marriage. * gwd: - fixed bug, missing ancestors were printed in reverse order - fixed bug, could not find file "start.txt" in -hd directory. - fixed bug, missing persons when displaying close names - used flags for languages selection instead of tables - better displaying of dates for the miscellaneous languages - display birthdays of persons with death "don't know" (but without age) * ged2gwb: - does not stop any more when bad GEDCOM line found => warning and goes on. - added option -nd setting flag "not dead" instead of "don't know if dead" for personal records where "DEAT" exists but is empty. * gwb2ged: - start now pointers with 1 instead of 0 because some softwares seem not to accept @I0@ and @F0@. - generate always ANSEL encoding * gwu: - added option -d to select descendants like in gwb2ged GeneWeb Version 1.06 -------------------- * ged2gwb: - warning, not error now, when a person is undefined * a.cnf: - added example of setting background image GeneWeb Version 1.05 -------------------- * gwd: - added ability to merge persons and families. - added advanced requests - added year interval when displaying missing ancestors - (detail) added dates when displaying descendants indexes. - (detail) misc terms changing ("add"->"insert"; "nickname"->"qualifier"...) * gwu: - added option "-a" to select ancestors like in command "gwb2ged". * bug fixes: - Fixed a problem of blocking: the symptom was that, in some versions of Windows 95, "gwd" started normally, but when opening the site in the navigator, the site was found but the navigator was waiting and waiting forever. - When updating a person, if the "notes" field holds only a newline, the request is rejected => fixed. Moreover some browsers add this "bad" newline if the notes fields is empty => fixed. GeneWeb Version 1.04 -------------------- * gwd, ged2gwb, gwb2ged: - added baptism (separated from birth) and burial/cremation. - added sources for marriages. * gwd: - added "access" info, for infos display when dates < now - 100 years = * "If Titles" => displayed if the person has titles * "Public" => always displayed * "Private" => not displayed - added link to welcome page in personal record pages. - added option -auth: authorization file to restrict access (password) - fixed bug: in cgi mode, access to images did not work. - in welcome page, date (since ...) is printed in original language. - birthday months displayed as a menu and at the end instead of beginning * lexicon.txt: - some changes in translations GeneWeb Version 1.03 -------------------- * Added swedish version. * gwd: - in display by name, display year with precision in marriages - in missing ancestors by alphabetic order, display spouses too - in missing ancestors by Soza, shorter display of numbers - changed syntax of gwd.arg file (for cgi mode) => see doc "server" - in update person form, display "born" and "died" in neutral when language can do it (e.g. french "ne(e)", "decede(e)") - added request m=R;p=..;n=..;p1=..;n1=.. displaying relationship between two persons by their names * ged2gwb: - when converting a date with qualifier, if the date holds day or month, converts into: "ca Year". Ex: "AFT APR 1218" is read as "ABT 1218". - fixed bug: date 16/2/1964 gave "year = 16" instead of "year = 1964" * gwd, a.cnf, lang/lexicon.txt - deleted principle of "message" (was undocumented, anyway) * gwd, doc: - changed terminology "occurrence number" into just "number" (I realized that "occurrence" is mathematical jargon). * gwd, lang/*/start.txt: - displaying of total number of accesses, not only accesses in welcome page * in all commands: - options -help display message on standard output instead of standard error, allowing to use "| more" in Windows 95/NT GeneWeb Version 1.02 -------------------- * doc: - explain a solution for the problem of connection off line * ged2gwb: - ANSEL encoding is automatically detected (1 CHAR ANSEL in GEDCOM). Suppression option "-tma"; adding "-ansel" and "-no_ansel" to force or suppress the encoding, overriding the possible setting in GEDCOM. * gwd: - fixed bug: error while treating anniversaries of marriage in databases where families had been deleted: Uncaught exception: Failure("access persons out of bounds") GeneWeb Version 1.01 -------------------- New: - Command gwb2ged to export GEDCOM files. - More doc Other changes: * ged2gwb: - accept BAPM (unspecified baptism) together with CHR (christian baptism) in individual records - treat fields TITL (nobility titles) in individual records - fixed bug: families and children was bad ordered or reordered - added field SOUR (sources) (if not a pointer) for personal record; was only selected from BIRT (birth) and DEAT (death) - options -epn and -efn are now by default: options -no_epn and -no_efn added to cancel thems. - applies "-lf" after "-epn" * gwd: - changed: when deleting a person, it is now deleted also among the children of his parents. - fixed bug: when deleting a person, some fields were not erased. - added option -lang: default language - changed: displaying shortcuts when accessing by titles: for example, if there is only one king in the database, and it is "king of France", selecting "king" directy displays "kings of France". * gwb2gw has been renamed gwu. GeneWeb Version 1.0 ------------------- CGI mode is Ok. * gwd, ged2gwb, lang/lexicon.txt: - errors on dates become warnings GeneWeb Version 1.0-beta.10 --------------------------- Still intermediate version to perfect "CGI" mode. * gwd: - fixed bug: update did not work in cgi mode. - print person link after "family switch" - when using "add parents", surname is printed in child area => ability to change father's. GeneWeb Version 1.0 beta.9 -------------------------- Intermediate version to perfect "CGI" mode under Windows NT. * More documentation * gwd: - cgi is detected by the presence of environment variable QUERY_STRING. It seems that .bat files is not accepted in Web servers in Windows NT, so one must use "gwd" itself. - if "gwd" is installed in cgi directory, and is renamed, e.g. "geneweb.exe", ability to add a file named "geneweb.arg" holding some lines * the first line if existing holds the name of the directory where "lang" is installed * the second line if existing holds the name of the directory where the databases are installed * the third line, if existing, may hold the string "cgi" telling that gwd must run on "cgi" mode, even if QUERY_STRING is not set - added option -bd: bases directory - no error message now if background not found * Deleted "add/person" in update (gwd) and in welcome pages (lang/*/start.txt) => impossibility now to directly create isolated persons. This is because it often leads to manipulation errors. To add a new baby, use "modify family" from one of his parents' personal record. GeneWeb Version 1.0 beta.8 -------------------------- * Added documentation in HTML: directions for use * Added LICENCE * Deleted COMM-en.txt & COMM-fr.txt * gwd: - added cgi mode (option -cgi) - Less general for acces by approximative spelling: ex: first name "agns" will not yet answer: "Agnes" and "Gunza", but just "Agnes". - Unix version: time out limited to 120 seconds instead of 60 - Descendants by list limited to 8 instead of 5 - added missing divorce information in descendants by list - Fixed bug: Ok on "add person" did not work - Fixed bug: could not cancel a friend or wizard password, by giving an empty one in the form in starting page - Fixed bug: shift at end of page for the indexes of descendants. - Fixed bug: update of family did not work. * ged2gwb: - added divorces - suppressed sources when forward defined (code reorganizing to do). * lang/lexicon.txt: - german translation updated * lang/de/start.txt: - german translation updated GeneWeb Version 1.0 beta.7 -------------------------- * general: - changed bases representation => memory consummation reduced in gwd and in consang - negative years are treated (gwc, gwd, ged2gwb) * gwd: - the directory cnt holding counts is searched in the current directory not in the one given by option "-hd" (no difference if -hd not specified). - this directory, cnt, is created if no present - ability to add a file "foo.trl" for the base "foo", in lang directory and in its subdirectories: the file is inserted at the end of all pages after the GeneWeb copyright. Note: the files ".txt" in the subdirectories do not hold yet the final tag "". - limitation to 5 generations for descendants display in list format - fixed bug: families could be displayed twice in case of close surnames - fixed bug: displaying of lexicon worked bad in 1.0-beta.6 * gwb2gw: - memory consummation significantly reduced - added option -tnd: infer negative dates when missing minus signs in GEDCOM - added option -lf: lowercase first names - add file "command.txt" in base directory to remind the used command and arguments - fixed bug: when multiple lines with 1 NOTES, only the first was treated - fixed bug: names starting with special letters were truncated - fixed bug: better search for possible years in undecoded dates GeneWeb Version 1.0 beta.6 -------------------------- * ged2gwb: - now only shortcut for options, suppressed long versions, finally - fixed bug in option "-tma" creating sometimes strings of bad length - fixed bug sometimes omissions of recording notes - try to find a year (a number between 32 and 2500) in dates impossible to decode * gwd: - added option "-only" in version Windows 95 too. - added option "-log" in version Windows 95 to redirect log to a file. - added display of ascendants up to an ancestor in relationship computing. - while displaying ascendants, the first generation is now the person himself (which is displayed with Soza number 1), not his parents - accept local ".GIF" files as photos (up to now, it was only ".gif", ".jpg" and ".JPG"). - local photo files are searched in (new) directory "images" - added copyright (c) * gwc - options described in english - added "unnamed" in statistics (option -stats) * lang/lexicon.txt: - some fixes in dutch version * lang/version: - added copyright (c) * lang/*/start.txt: - added form at end of pages to allow entering password for other entries. GeneWeb Version 1.0 beta.5 -------------------------- Main changes * ged2gwb: - added option "-translate_msdos_accents" - added shortcuts for options => -ls -efn -epn -tma - errors go to standard output instead of standard error * gwd: - missing ancestors: o added alphabetic order o no more display of spouses o proposed for all entries (not only for wizard one) - added "From inet_addr" in traces in Windows NT/95. - added date of service start in starting files. - fixed bug: internal error after: relationship computing => selection by name => alphabetic order * lang/lexicon.txt - completed translations in german and spanish Secondary changes * gwd: - added more explicit messages for some system errors. - changed the text "numbers" into "Soza numbers" in ancestors. - changed surnames display in alphabetic order (particles after) - improve messages in relationship links ("click here to see the first branch") - signature version of GeneWeb in default starting pages GeneWeb Version 1.0 beta.4 -------------------------- * ged2gwb: - fixed bug: tag DEAT generated "dead" in some wrong cases. - options "-extract_first_name" and "-extract_public_name" more separated and working better * gwd: - There was another problem of blocking. Fixed (supposed to!). * a.cnf: - palette of colors is proposed GeneWeb Version 1.0 beta.3 -------------------------- * ged2gwb: Options - option "-uncapitalize" is renamed "-lowercase_surnames" - Added options "-extract_first_names" and "-extract_public_names" Behaviour: - Newlines (
) added in notes when CONT. - Field NAME of the form "/ NAME / first name" correctly treated - Field CHR (baptism) taken into account. - Several fields "1 OCCU" treated. - Field SOUR is now only if directly in the line (not reference) * consang: - recompute all consanguinity in base if family updates has been done * gwd: - added possibility of nth in titles (ex: 3rd earl of ...) - displaying of baptism in short dates, if not birth date - thousand separation in numbers depending on the language (comma in english, dot in french, etc). - fixed bug in Win 95 version: blocks from time to time geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/ged2gwb/0002770000175200017530000000000012664543647021743 5ustar guillaumeguillaumegeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/ged2gwb/Makefile0000660000175200017530000000371112664543647023404 0ustar guillaumeguillaume# $Id: Makefile,v 5.24 2008-01-15 17:12:01 ddr Exp $ include ../tools/Makefile.inc OCAMLI=-I ../src OBJS=../src/argl.cmo ../src/adef.cmo ../src/iovalue.cmo ../src/buff.cmo ../src/name.cmo ../src/ansel.cmo ../src/mutil.cmo ../src/futil.cmo ../src/dutil.cmo ../src/secure.cmo ../src/btree.cmo ../src/database.cmo ../src/db2.cmo ../src/db2disk.cmo ../src/diff.cmo ../src/outbase.cmo ../src/gwdb.cmo ../src/checkItem.cmo ../src/calendar.cmo ../src/lock.cmo ../src/progrBar.cmo ../src/consang.cmo ../src/consangAll.cmo ../src/check.cmo utf8.cmo ged2gwb.cmo OBJS2=../src/buff.cmo ../src/argl.cmo ../src/secure.cmo ../src/adef.cmo ../src/iovalue.cmo ../src/name.cmo ../src/mutil.cmo ../src/ansel.cmo ../src/calendar.cmo ../src/iochan.cmo ../src/db2.cmo ../src/progrBar.cmo ../src/futil.cmo ../src/notesLinks.cmo ../src/db2out.cmo ../src/db2disk.cmo ../src/dutil.cmo ../src/btree.cmo ../src/database.cmo ../src/gwdb.cmo ../src/consang.cmo ../src/consangAll.cmo ../src/checkItem.cmo ../src/check.cmo ../src/db2link.cmo ../src/lock.cmo utf8.cmo ged2gwb2.cmo all:: out out:: ged2gwb.out ged2gwb2.out $(RM) ged2gwb ged2gwb2 cp ged2gwb.out ged2gwb cp ged2gwb2.out ged2gwb2 opt:: ged2gwb.opt ged2gwb2.opt $(RM) ged2gwb ged2gwb2 cp ged2gwb.opt ged2gwb cp ged2gwb2.opt ged2gwb2 $(STRIP) ged2gwb ged2gwb2 clean:: $(RM) ged2gwb ged2gwb2 ged2gwb.out: $(OBJS) $(OCAMLC) -custom $(STATIC) $(OCAMLD) unix.cma str.cma $(LIBUNIX) -I $(CAMLP5D) gramlib.cma $(OBJS) -o ged2gwb.out ged2gwb.opt: $(OBJS:.cmo=.cmx) $(OCAMLOPT) $(STATIC) unix.cmxa str.cmxa $(LIBUNIX) -I $(CAMLP5D) gramlib.cmxa $(OBJS:.cmo=.cmx) -o ged2gwb.opt ged2gwb2.out: $(OBJS2) $(OCAMLC) -custom $(STATIC) $(OCAMLD) unix.cma str.cma $(LIBUNIX) -I $(CAMLP5D) gramlib.cma $(OBJS2) -o ged2gwb2.out ged2gwb2.opt: $(OBJS2:.cmo=.cmx) $(OCAMLOPT) $(STATIC) unix.cmxa str.cmxa $(LIBUNIX) -I $(CAMLP5D) gramlib.cmxa $(OBJS2:.cmo=.cmx) -o ged2gwb2.opt depend: TOP=.. ../tools/camlp5_depend.sh $(OCAMLI) *.ml* > .depend include .depend geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/ged2gwb/utf8.ml0000660000175200017530000062723312664543647023177 0ustar guillaumeguillaume(* camlp5r *) (* $Id: utf8.ml,v 0.1 2012-01-17 17:58:44 flh Exp $ *) (* This is a huge utf-8 table converted as (encoding, name) list. For sure, this is not an optimal solution but it's only used in the process of converting "first name" and "surname" from a Gedcom file (-lf -ls -us). *) value utf8_list = [("/x41", "LATIN CAPITAL LETTER A"); ("/x42", "LATIN CAPITAL LETTER B"); ("/x43", "LATIN CAPITAL LETTER C"); ("/x44", "LATIN CAPITAL LETTER D"); ("/x45", "LATIN CAPITAL LETTER E"); ("/x46", "LATIN CAPITAL LETTER F"); ("/x47", "LATIN CAPITAL LETTER G"); ("/x48", "LATIN CAPITAL LETTER H"); ("/x49", "LATIN CAPITAL LETTER I"); ("/x4a", "LATIN CAPITAL LETTER J"); ("/x4b", "LATIN CAPITAL LETTER K"); ("/x4c", "LATIN CAPITAL LETTER L"); ("/x4d", "LATIN CAPITAL LETTER M"); ("/x4e", "LATIN CAPITAL LETTER N"); ("/x4f", "LATIN CAPITAL LETTER O"); ("/x50", "LATIN CAPITAL LETTER P"); ("/x51", "LATIN CAPITAL LETTER Q"); ("/x52", "LATIN CAPITAL LETTER R"); ("/x53", "LATIN CAPITAL LETTER S"); ("/x54", "LATIN CAPITAL LETTER T"); ("/x55", "LATIN CAPITAL LETTER U"); ("/x56", "LATIN CAPITAL LETTER V"); ("/x57", "LATIN CAPITAL LETTER W"); ("/x58", "LATIN CAPITAL LETTER X"); ("/x59", "LATIN CAPITAL LETTER Y"); ("/x5a", "LATIN CAPITAL LETTER Z"); ("/x61", "LATIN SMALL LETTER A"); ("/x62", "LATIN SMALL LETTER B"); ("/x63", "LATIN SMALL LETTER C"); ("/x64", "LATIN SMALL LETTER D"); ("/x65", "LATIN SMALL LETTER E"); ("/x66", "LATIN SMALL LETTER F"); ("/x67", "LATIN SMALL LETTER G"); ("/x68", "LATIN SMALL LETTER H"); ("/x69", "LATIN SMALL LETTER I"); ("/x6a", "LATIN SMALL LETTER J"); ("/x6b", "LATIN SMALL LETTER K"); ("/x6c", "LATIN SMALL LETTER L"); ("/x6d", "LATIN SMALL LETTER M"); ("/x6e", "LATIN SMALL LETTER N"); ("/x6f", "LATIN SMALL LETTER O"); ("/x70", "LATIN SMALL LETTER P"); ("/x71", "LATIN SMALL LETTER Q"); ("/x72", "LATIN SMALL LETTER R"); ("/x73", "LATIN SMALL LETTER S"); ("/x74", "LATIN SMALL LETTER T"); ("/x75", "LATIN SMALL LETTER U"); ("/x76", "LATIN SMALL LETTER V"); ("/x77", "LATIN SMALL LETTER W"); ("/x78", "LATIN SMALL LETTER X"); ("/x79", "LATIN SMALL LETTER Y"); ("/x7a", "LATIN SMALL LETTER Z"); ("/xc3/x80", "LATIN CAPITAL LETTER A WITH GRAVE"); ("/xc3/x81", "LATIN CAPITAL LETTER A WITH ACUTE"); ("/xc3/x82", "LATIN CAPITAL LETTER A WITH CIRCUMFLEX"); ("/xc3/x83", "LATIN CAPITAL LETTER A WITH TILDE"); ("/xc3/x84", "LATIN CAPITAL LETTER A WITH DIAERESIS"); ("/xc3/x85", "LATIN CAPITAL LETTER A WITH RING ABOVE"); ("/xc3/x86", "LATIN CAPITAL LETTER AE"); ("/xc3/x87", "LATIN CAPITAL LETTER C WITH CEDILLA"); ("/xc3/x88", "LATIN CAPITAL LETTER E WITH GRAVE"); ("/xc3/x89", "LATIN CAPITAL LETTER E WITH ACUTE"); ("/xc3/x8a", "LATIN CAPITAL LETTER E WITH CIRCUMFLEX"); ("/xc3/x8b", "LATIN CAPITAL LETTER E WITH DIAERESIS"); ("/xc3/x8c", "LATIN CAPITAL LETTER I WITH GRAVE"); ("/xc3/x8d", "LATIN CAPITAL LETTER I WITH ACUTE"); ("/xc3/x8e", "LATIN CAPITAL LETTER I WITH CIRCUMFLEX"); ("/xc3/x8f", "LATIN CAPITAL LETTER I WITH DIAERESIS"); ("/xc3/x90", "LATIN CAPITAL LETTER ETH"); ("/xc3/x91", "LATIN CAPITAL LETTER N WITH TILDE"); ("/xc3/x92", "LATIN CAPITAL LETTER O WITH GRAVE"); ("/xc3/x93", "LATIN CAPITAL LETTER O WITH ACUTE"); ("/xc3/x94", "LATIN CAPITAL LETTER O WITH CIRCUMFLEX"); ("/xc3/x95", "LATIN CAPITAL LETTER O WITH TILDE"); ("/xc3/x96", "LATIN CAPITAL LETTER O WITH DIAERESIS"); ("/xc3/x98", "LATIN CAPITAL LETTER O WITH STROKE"); ("/xc3/x99", "LATIN CAPITAL LETTER U WITH GRAVE"); ("/xc3/x9a", "LATIN CAPITAL LETTER U WITH ACUTE"); ("/xc3/x9b", "LATIN CAPITAL LETTER U WITH CIRCUMFLEX"); ("/xc3/x9c", "LATIN CAPITAL LETTER U WITH DIAERESIS"); ("/xc3/x9d", "LATIN CAPITAL LETTER Y WITH ACUTE"); ("/xc3/x9e", "LATIN CAPITAL LETTER THORN"); ("/xc3/x9f", "LATIN SMALL LETTER SHARP S"); ("/xc3/xa0", "LATIN SMALL LETTER A WITH GRAVE"); ("/xc3/xa1", "LATIN SMALL LETTER A WITH ACUTE"); ("/xc3/xa2", "LATIN SMALL LETTER A WITH CIRCUMFLEX"); ("/xc3/xa3", "LATIN SMALL LETTER A WITH TILDE"); ("/xc3/xa4", "LATIN SMALL LETTER A WITH DIAERESIS"); ("/xc3/xa5", "LATIN SMALL LETTER A WITH RING ABOVE"); ("/xc3/xa6", "LATIN SMALL LETTER AE"); ("/xc3/xa7", "LATIN SMALL LETTER C WITH CEDILLA"); ("/xc3/xa8", "LATIN SMALL LETTER E WITH GRAVE"); ("/xc3/xa9", "LATIN SMALL LETTER E WITH ACUTE"); ("/xc3/xaa", "LATIN SMALL LETTER E WITH CIRCUMFLEX"); ("/xc3/xab", "LATIN SMALL LETTER E WITH DIAERESIS"); ("/xc3/xac", "LATIN SMALL LETTER I WITH GRAVE"); ("/xc3/xad", "LATIN SMALL LETTER I WITH ACUTE"); ("/xc3/xae", "LATIN SMALL LETTER I WITH CIRCUMFLEX"); ("/xc3/xaf", "LATIN SMALL LETTER I WITH DIAERESIS"); ("/xc3/xb0", "LATIN SMALL LETTER ETH"); ("/xc3/xb1", "LATIN SMALL LETTER N WITH TILDE"); ("/xc3/xb2", "LATIN SMALL LETTER O WITH GRAVE"); ("/xc3/xb3", "LATIN SMALL LETTER O WITH ACUTE"); ("/xc3/xb4", "LATIN SMALL LETTER O WITH CIRCUMFLEX"); ("/xc3/xb5", "LATIN SMALL LETTER O WITH TILDE"); ("/xc3/xb6", "LATIN SMALL LETTER O WITH DIAERESIS"); ("/xc3/xb8", "LATIN SMALL LETTER O WITH STROKE"); ("/xc3/xb9", "LATIN SMALL LETTER U WITH GRAVE"); ("/xc3/xba", "LATIN SMALL LETTER U WITH ACUTE"); ("/xc3/xbb", "LATIN SMALL LETTER U WITH CIRCUMFLEX"); ("/xc3/xbc", "LATIN SMALL LETTER U WITH DIAERESIS"); ("/xc3/xbd", "LATIN SMALL LETTER Y WITH ACUTE"); ("/xc3/xbe", "LATIN SMALL LETTER THORN"); ("/xc3/xbf", "LATIN SMALL LETTER Y WITH DIAERESIS"); ("/xc4/x80", "LATIN CAPITAL LETTER A WITH MACRON"); ("/xc4/x81", "LATIN SMALL LETTER A WITH MACRON"); ("/xc4/x82", "LATIN CAPITAL LETTER A WITH BREVE"); ("/xc4/x83", "LATIN SMALL LETTER A WITH BREVE"); ("/xc4/x84", "LATIN CAPITAL LETTER A WITH OGONEK"); ("/xc4/x85", "LATIN SMALL LETTER A WITH OGONEK"); ("/xc4/x86", "LATIN CAPITAL LETTER C WITH ACUTE"); ("/xc4/x87", "LATIN SMALL LETTER C WITH ACUTE"); ("/xc4/x88", "LATIN CAPITAL LETTER C WITH CIRCUMFLEX"); ("/xc4/x89", "LATIN SMALL LETTER C WITH CIRCUMFLEX"); ("/xc4/x8a", "LATIN CAPITAL LETTER C WITH DOT ABOVE"); ("/xc4/x8b", "LATIN SMALL LETTER C WITH DOT ABOVE"); ("/xc4/x8c", "LATIN CAPITAL LETTER C WITH CARON"); ("/xc4/x8d", "LATIN SMALL LETTER C WITH CARON"); ("/xc4/x8e", "LATIN CAPITAL LETTER D WITH CARON"); ("/xc4/x8f", "LATIN SMALL LETTER D WITH CARON"); ("/xc4/x90", "LATIN CAPITAL LETTER D WITH STROKE"); ("/xc4/x91", "LATIN SMALL LETTER D WITH STROKE"); ("/xc4/x92", "LATIN CAPITAL LETTER E WITH MACRON"); ("/xc4/x93", "LATIN SMALL LETTER E WITH MACRON"); ("/xc4/x94", "LATIN CAPITAL LETTER E WITH BREVE"); ("/xc4/x95", "LATIN SMALL LETTER E WITH BREVE"); ("/xc4/x96", "LATIN CAPITAL LETTER E WITH DOT ABOVE"); ("/xc4/x97", "LATIN SMALL LETTER E WITH DOT ABOVE"); ("/xc4/x98", "LATIN CAPITAL LETTER E WITH OGONEK"); ("/xc4/x99", "LATIN SMALL LETTER E WITH OGONEK"); ("/xc4/x9a", "LATIN CAPITAL LETTER E WITH CARON"); ("/xc4/x9b", "LATIN SMALL LETTER E WITH CARON"); ("/xc4/x9c", "LATIN CAPITAL LETTER G WITH CIRCUMFLEX"); ("/xc4/x9d", "LATIN SMALL LETTER G WITH CIRCUMFLEX"); ("/xc4/x9e", "LATIN CAPITAL LETTER G WITH BREVE"); ("/xc4/x9f", "LATIN SMALL LETTER G WITH BREVE"); ("/xc4/xa0", "LATIN CAPITAL LETTER G WITH DOT ABOVE"); ("/xc4/xa1", "LATIN SMALL LETTER G WITH DOT ABOVE"); ("/xc4/xa2", "LATIN CAPITAL LETTER G WITH CEDILLA"); ("/xc4/xa3", "LATIN SMALL LETTER G WITH CEDILLA"); ("/xc4/xa4", "LATIN CAPITAL LETTER H WITH CIRCUMFLEX"); ("/xc4/xa5", "LATIN SMALL LETTER H WITH CIRCUMFLEX"); ("/xc4/xa6", "LATIN CAPITAL LETTER H WITH STROKE"); ("/xc4/xa7", "LATIN SMALL LETTER H WITH STROKE"); ("/xc4/xa8", "LATIN CAPITAL LETTER I WITH TILDE"); ("/xc4/xa9", "LATIN SMALL LETTER I WITH TILDE"); ("/xc4/xaa", "LATIN CAPITAL LETTER I WITH MACRON"); ("/xc4/xab", "LATIN SMALL LETTER I WITH MACRON"); ("/xc4/xac", "LATIN CAPITAL LETTER I WITH BREVE"); ("/xc4/xad", "LATIN SMALL LETTER I WITH BREVE"); ("/xc4/xae", "LATIN CAPITAL LETTER I WITH OGONEK"); ("/xc4/xaf", "LATIN SMALL LETTER I WITH OGONEK"); ("/xc4/xb0", "LATIN CAPITAL LETTER I WITH DOT ABOVE"); ("/xc4/xb1", "LATIN SMALL LETTER DOTLESS I"); ("/xc4/xb2", "LATIN CAPITAL LIGATURE IJ"); ("/xc4/xb3", "LATIN SMALL LIGATURE IJ"); ("/xc4/xb4", "LATIN CAPITAL LETTER J WITH CIRCUMFLEX"); ("/xc4/xb5", "LATIN SMALL LETTER J WITH CIRCUMFLEX"); ("/xc4/xb6", "LATIN CAPITAL LETTER K WITH CEDILLA"); ("/xc4/xb7", "LATIN SMALL LETTER K WITH CEDILLA"); ("/xc4/xb8", "LATIN SMALL LETTER KRA"); ("/xc4/xb9", "LATIN CAPITAL LETTER L WITH ACUTE"); ("/xc4/xba", "LATIN SMALL LETTER L WITH ACUTE"); ("/xc4/xbb", "LATIN CAPITAL LETTER L WITH CEDILLA"); ("/xc4/xbc", "LATIN SMALL LETTER L WITH CEDILLA"); ("/xc4/xbd", "LATIN CAPITAL LETTER L WITH CARON"); ("/xc4/xbe", "LATIN SMALL LETTER L WITH CARON"); ("/xc4/xbf", "LATIN CAPITAL LETTER L WITH MIDDLE DOT"); ("/xc5/x80", "LATIN SMALL LETTER L WITH MIDDLE DOT"); ("/xc5/x81", "LATIN CAPITAL LETTER L WITH STROKE"); ("/xc5/x82", "LATIN SMALL LETTER L WITH STROKE"); ("/xc5/x83", "LATIN CAPITAL LETTER N WITH ACUTE"); ("/xc5/x84", "LATIN SMALL LETTER N WITH ACUTE"); ("/xc5/x85", "LATIN CAPITAL LETTER N WITH CEDILLA"); ("/xc5/x86", "LATIN SMALL LETTER N WITH CEDILLA"); ("/xc5/x87", "LATIN CAPITAL LETTER N WITH CARON"); ("/xc5/x88", "LATIN SMALL LETTER N WITH CARON"); ("/xc5/x89", "LATIN SMALL LETTER N PRECEDED BY APOSTROPHE"); ("/xc5/x8a", "LATIN CAPITAL LETTER ENG"); ("/xc5/x8b", "LATIN SMALL LETTER ENG"); ("/xc5/x8c", "LATIN CAPITAL LETTER O WITH MACRON"); ("/xc5/x8d", "LATIN SMALL LETTER O WITH MACRON"); ("/xc5/x8e", "LATIN CAPITAL LETTER O WITH BREVE"); ("/xc5/x8f", "LATIN SMALL LETTER O WITH BREVE"); ("/xc5/x90", "LATIN CAPITAL LETTER O WITH DOUBLE ACUTE"); ("/xc5/x91", "LATIN SMALL LETTER O WITH DOUBLE ACUTE"); ("/xc5/x92", "LATIN CAPITAL LIGATURE OE"); ("/xc5/x93", "LATIN SMALL LIGATURE OE"); ("/xc5/x94", "LATIN CAPITAL LETTER R WITH ACUTE"); ("/xc5/x95", "LATIN SMALL LETTER R WITH ACUTE"); ("/xc5/x96", "LATIN CAPITAL LETTER R WITH CEDILLA"); ("/xc5/x97", "LATIN SMALL LETTER R WITH CEDILLA"); ("/xc5/x98", "LATIN CAPITAL LETTER R WITH CARON"); ("/xc5/x99", "LATIN SMALL LETTER R WITH CARON"); ("/xc5/x9a", "LATIN CAPITAL LETTER S WITH ACUTE"); ("/xc5/x9b", "LATIN SMALL LETTER S WITH ACUTE"); ("/xc5/x9c", "LATIN CAPITAL LETTER S WITH CIRCUMFLEX"); ("/xc5/x9d", "LATIN SMALL LETTER S WITH CIRCUMFLEX"); ("/xc5/x9e", "LATIN CAPITAL LETTER S WITH CEDILLA"); ("/xc5/x9f", "LATIN SMALL LETTER S WITH CEDILLA"); ("/xc5/xa0", "LATIN CAPITAL LETTER S WITH CARON"); ("/xc5/xa1", "LATIN SMALL LETTER S WITH CARON"); ("/xc5/xa2", "LATIN CAPITAL LETTER T WITH CEDILLA"); ("/xc5/xa3", "LATIN SMALL LETTER T WITH CEDILLA"); ("/xc5/xa4", "LATIN CAPITAL LETTER T WITH CARON"); ("/xc5/xa5", "LATIN SMALL LETTER T WITH CARON"); ("/xc5/xa6", "LATIN CAPITAL LETTER T WITH STROKE"); ("/xc5/xa7", "LATIN SMALL LETTER T WITH STROKE"); ("/xc5/xa8", "LATIN CAPITAL LETTER U WITH TILDE"); ("/xc5/xa9", "LATIN SMALL LETTER U WITH TILDE"); ("/xc5/xaa", "LATIN CAPITAL LETTER U WITH MACRON"); ("/xc5/xab", "LATIN SMALL LETTER U WITH MACRON"); ("/xc5/xac", "LATIN CAPITAL LETTER U WITH BREVE"); ("/xc5/xad", "LATIN SMALL LETTER U WITH BREVE"); ("/xc5/xae", "LATIN CAPITAL LETTER U WITH RING ABOVE"); ("/xc5/xaf", "LATIN SMALL LETTER U WITH RING ABOVE"); ("/xc5/xb0", "LATIN CAPITAL LETTER U WITH DOUBLE ACUTE"); ("/xc5/xb1", "LATIN SMALL LETTER U WITH DOUBLE ACUTE"); ("/xc5/xb2", "LATIN CAPITAL LETTER U WITH OGONEK"); ("/xc5/xb3", "LATIN SMALL LETTER U WITH OGONEK"); ("/xc5/xb4", "LATIN CAPITAL LETTER W WITH CIRCUMFLEX"); ("/xc5/xb5", "LATIN SMALL LETTER W WITH CIRCUMFLEX"); ("/xc5/xb6", "LATIN CAPITAL LETTER Y WITH CIRCUMFLEX"); ("/xc5/xb7", "LATIN SMALL LETTER Y WITH CIRCUMFLEX"); ("/xc5/xb8", "LATIN CAPITAL LETTER Y WITH DIAERESIS"); ("/xc5/xb9", "LATIN CAPITAL LETTER Z WITH ACUTE"); ("/xc5/xba", "LATIN SMALL LETTER Z WITH ACUTE"); ("/xc5/xbb", "LATIN CAPITAL LETTER Z WITH DOT ABOVE"); ("/xc5/xbc", "LATIN SMALL LETTER Z WITH DOT ABOVE"); ("/xc5/xbd", "LATIN CAPITAL LETTER Z WITH CARON"); ("/xc5/xbe", "LATIN SMALL LETTER Z WITH CARON"); ("/xc5/xbf", "LATIN SMALL LETTER LONG S"); ("/xc6/x80", "LATIN SMALL LETTER B WITH STROKE"); ("/xc6/x81", "LATIN CAPITAL LETTER B WITH HOOK"); ("/xc6/x82", "LATIN CAPITAL LETTER B WITH TOPBAR"); ("/xc6/x83", "LATIN SMALL LETTER B WITH TOPBAR"); ("/xc6/x84", "LATIN CAPITAL LETTER TONE SIX"); ("/xc6/x85", "LATIN SMALL LETTER TONE SIX"); ("/xc6/x86", "LATIN CAPITAL LETTER OPEN O"); ("/xc6/x87", "LATIN CAPITAL LETTER C WITH HOOK"); ("/xc6/x88", "LATIN SMALL LETTER C WITH HOOK"); ("/xc6/x89", "LATIN CAPITAL LETTER AFRICAN D"); ("/xc6/x8a", "LATIN CAPITAL LETTER D WITH HOOK"); ("/xc6/x8b", "LATIN CAPITAL LETTER D WITH TOPBAR"); ("/xc6/x8c", "LATIN SMALL LETTER D WITH TOPBAR"); ("/xc6/x8d", "LATIN SMALL LETTER TURNED DELTA"); ("/xc6/x8e", "LATIN CAPITAL LETTER REVERSED E"); ("/xc6/x8f", "LATIN CAPITAL LETTER SCHWA"); ("/xc6/x90", "LATIN CAPITAL LETTER OPEN E"); ("/xc6/x91", "LATIN CAPITAL LETTER F WITH HOOK"); ("/xc6/x92", "LATIN SMALL LETTER F WITH HOOK"); ("/xc6/x93", "LATIN CAPITAL LETTER G WITH HOOK"); ("/xc6/x94", "LATIN CAPITAL LETTER GAMMA"); ("/xc6/x95", "LATIN SMALL LETTER HV"); ("/xc6/x96", "LATIN CAPITAL LETTER IOTA"); ("/xc6/x97", "LATIN CAPITAL LETTER I WITH STROKE"); ("/xc6/x98", "LATIN CAPITAL LETTER K WITH HOOK"); ("/xc6/x99", "LATIN SMALL LETTER K WITH HOOK"); ("/xc6/x9a", "LATIN SMALL LETTER L WITH BAR"); ("/xc6/x9b", "LATIN SMALL LETTER LAMBDA WITH STROKE"); ("/xc6/x9c", "LATIN CAPITAL LETTER TURNED M"); ("/xc6/x9d", "LATIN CAPITAL LETTER N WITH LEFT HOOK"); ("/xc6/x9e", "LATIN SMALL LETTER N WITH LONG RIGHT LEG"); ("/xc6/x9f", "LATIN CAPITAL LETTER O WITH MIDDLE TILDE"); ("/xc6/xa0", "LATIN CAPITAL LETTER O WITH HORN"); ("/xc6/xa1", "LATIN SMALL LETTER O WITH HORN"); ("/xc6/xa2", "LATIN CAPITAL LETTER OI"); ("/xc6/xa3", "LATIN SMALL LETTER OI"); ("/xc6/xa4", "LATIN CAPITAL LETTER P WITH HOOK"); ("/xc6/xa5", "LATIN SMALL LETTER P WITH HOOK"); ("/xc6/xa7", "LATIN CAPITAL LETTER TONE TWO"); ("/xc6/xa8", "LATIN SMALL LETTER TONE TWO"); ("/xc6/xa9", "LATIN CAPITAL LETTER ESH"); ("/xc6/xab", "LATIN SMALL LETTER T WITH PALATAL HOOK"); ("/xc6/xac", "LATIN CAPITAL LETTER T WITH HOOK"); ("/xc6/xad", "LATIN SMALL LETTER T WITH HOOK"); ("/xc6/xae", "LATIN CAPITAL LETTER T WITH RETROFLEX HOOK"); ("/xc6/xaf", "LATIN CAPITAL LETTER U WITH HORN"); ("/xc6/xb0", "LATIN SMALL LETTER U WITH HORN"); ("/xc6/xb1", "LATIN CAPITAL LETTER UPSILON"); ("/xc6/xb2", "LATIN CAPITAL LETTER V WITH HOOK"); ("/xc6/xb3", "LATIN CAPITAL LETTER Y WITH HOOK"); ("/xc6/xb4", "LATIN SMALL LETTER Y WITH HOOK"); ("/xc6/xb5", "LATIN CAPITAL LETTER Z WITH STROKE"); ("/xc6/xb6", "LATIN SMALL LETTER Z WITH STROKE"); ("/xc6/xb7", "LATIN CAPITAL LETTER EZH"); ("/xc6/xb8", "LATIN CAPITAL LETTER EZH REVERSED"); ("/xc6/xb9", "LATIN SMALL LETTER EZH REVERSED"); ("/xc6/xba", "LATIN SMALL LETTER EZH WITH TAIL"); ("/xc6/xbc", "LATIN CAPITAL LETTER TONE FIVE"); ("/xc6/xbd", "LATIN SMALL LETTER TONE FIVE"); ("/xc7/x84", "LATIN CAPITAL LETTER DZ WITH CARON"); ("/xc7/x85", "LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON"); ("/xc7/x86", "LATIN SMALL LETTER DZ WITH CARON"); ("/xc7/x87", "LATIN CAPITAL LETTER LJ"); ("/xc7/x88", "LATIN CAPITAL LETTER L WITH SMALL LETTER J"); ("/xc7/x89", "LATIN SMALL LETTER LJ"); ("/xc7/x8a", "LATIN CAPITAL LETTER NJ"); ("/xc7/x8b", "LATIN CAPITAL LETTER N WITH SMALL LETTER J"); ("/xc7/x8c", "LATIN SMALL LETTER NJ"); ("/xc7/x8d", "LATIN CAPITAL LETTER A WITH CARON"); ("/xc7/x8e", "LATIN SMALL LETTER A WITH CARON"); ("/xc7/x8f", "LATIN CAPITAL LETTER I WITH CARON"); ("/xc7/x90", "LATIN SMALL LETTER I WITH CARON"); ("/xc7/x91", "LATIN CAPITAL LETTER O WITH CARON"); ("/xc7/x92", "LATIN SMALL LETTER O WITH CARON"); ("/xc7/x93", "LATIN CAPITAL LETTER U WITH CARON"); ("/xc7/x94", "LATIN SMALL LETTER U WITH CARON"); ("/xc7/x95", "LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON"); ("/xc7/x96", "LATIN SMALL LETTER U WITH DIAERESIS AND MACRON"); ("/xc7/x97", "LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE"); ("/xc7/x98", "LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE"); ("/xc7/x99", "LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON"); ("/xc7/x9a", "LATIN SMALL LETTER U WITH DIAERESIS AND CARON"); ("/xc7/x9b", "LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE"); ("/xc7/x9c", "LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE"); ("/xc7/x9d", "LATIN SMALL LETTER TURNED E"); ("/xc7/x9e", "LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON"); ("/xc7/x9f", "LATIN SMALL LETTER A WITH DIAERESIS AND MACRON"); ("/xc7/xa0", "LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON"); ("/xc7/xa1", "LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON"); ("/xc7/xa2", "LATIN CAPITAL LETTER AE WITH MACRON"); ("/xc7/xa3", "LATIN SMALL LETTER AE WITH MACRON"); ("/xc7/xa4", "LATIN CAPITAL LETTER G WITH STROKE"); ("/xc7/xa5", "LATIN SMALL LETTER G WITH STROKE"); ("/xc7/xa6", "LATIN CAPITAL LETTER G WITH CARON"); ("/xc7/xa7", "LATIN SMALL LETTER G WITH CARON"); ("/xc7/xa8", "LATIN CAPITAL LETTER K WITH CARON"); ("/xc7/xa9", "LATIN SMALL LETTER K WITH CARON"); ("/xc7/xaa", "LATIN CAPITAL LETTER O WITH OGONEK"); ("/xc7/xab", "LATIN SMALL LETTER O WITH OGONEK"); ("/xc7/xac", "LATIN CAPITAL LETTER O WITH OGONEK AND MACRON"); ("/xc7/xad", "LATIN SMALL LETTER O WITH OGONEK AND MACRON"); ("/xc7/xae", "LATIN CAPITAL LETTER EZH WITH CARON"); ("/xc7/xaf", "LATIN SMALL LETTER EZH WITH CARON"); ("/xc7/xb0", "LATIN SMALL LETTER J WITH CARON"); ("/xc7/xb1", "LATIN CAPITAL LETTER DZ"); ("/xc7/xb2", "LATIN CAPITAL LETTER D WITH SMALL LETTER Z"); ("/xc7/xb3", "LATIN SMALL LETTER DZ"); ("/xc7/xb4", "LATIN CAPITAL LETTER G WITH ACUTE"); ("/xc7/xb5", "LATIN SMALL LETTER G WITH ACUTE"); ("/xc7/xb6", "LATIN CAPITAL LETTER HWAIR"); ("/xc7/xb7", "LATIN CAPITAL LETTER WYNN"); ("/xc7/xb8", "LATIN CAPITAL LETTER N WITH GRAVE"); ("/xc7/xb9", "LATIN SMALL LETTER N WITH GRAVE"); ("/xc7/xba", "LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE"); ("/xc7/xbb", "LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE"); ("/xc7/xbc", "LATIN CAPITAL LETTER AE WITH ACUTE"); ("/xc7/xbd", "LATIN SMALL LETTER AE WITH ACUTE"); ("/xc7/xbe", "LATIN CAPITAL LETTER O WITH STROKE AND ACUTE"); ("/xc7/xbf", "LATIN SMALL LETTER O WITH STROKE AND ACUTE"); ("/xc8/x80", "LATIN CAPITAL LETTER A WITH DOUBLE GRAVE"); ("/xc8/x81", "LATIN SMALL LETTER A WITH DOUBLE GRAVE"); ("/xc8/x82", "LATIN CAPITAL LETTER A WITH INVERTED BREVE"); ("/xc8/x83", "LATIN SMALL LETTER A WITH INVERTED BREVE"); ("/xc8/x84", "LATIN CAPITAL LETTER E WITH DOUBLE GRAVE"); ("/xc8/x85", "LATIN SMALL LETTER E WITH DOUBLE GRAVE"); ("/xc8/x86", "LATIN CAPITAL LETTER E WITH INVERTED BREVE"); ("/xc8/x87", "LATIN SMALL LETTER E WITH INVERTED BREVE"); ("/xc8/x88", "LATIN CAPITAL LETTER I WITH DOUBLE GRAVE"); ("/xc8/x89", "LATIN SMALL LETTER I WITH DOUBLE GRAVE"); ("/xc8/x8a", "LATIN CAPITAL LETTER I WITH INVERTED BREVE"); ("/xc8/x8b", "LATIN SMALL LETTER I WITH INVERTED BREVE"); ("/xc8/x8c", "LATIN CAPITAL LETTER O WITH DOUBLE GRAVE"); ("/xc8/x8d", "LATIN SMALL LETTER O WITH DOUBLE GRAVE"); ("/xc8/x8e", "LATIN CAPITAL LETTER O WITH INVERTED BREVE"); ("/xc8/x8f", "LATIN SMALL LETTER O WITH INVERTED BREVE"); ("/xc8/x90", "LATIN CAPITAL LETTER R WITH DOUBLE GRAVE"); ("/xc8/x91", "LATIN SMALL LETTER R WITH DOUBLE GRAVE"); ("/xc8/x92", "LATIN CAPITAL LETTER R WITH INVERTED BREVE"); ("/xc8/x93", "LATIN SMALL LETTER R WITH INVERTED BREVE"); ("/xc8/x94", "LATIN CAPITAL LETTER U WITH DOUBLE GRAVE"); ("/xc8/x95", "LATIN SMALL LETTER U WITH DOUBLE GRAVE"); ("/xc8/x96", "LATIN CAPITAL LETTER U WITH INVERTED BREVE"); ("/xc8/x97", "LATIN SMALL LETTER U WITH INVERTED BREVE"); ("/xc8/x98", "LATIN CAPITAL LETTER S WITH COMMA BELOW"); ("/xc8/x99", "LATIN SMALL LETTER S WITH COMMA BELOW"); ("/xc8/x9a", "LATIN CAPITAL LETTER T WITH COMMA BELOW"); ("/xc8/x9b", "LATIN SMALL LETTER T WITH COMMA BELOW"); ("/xc8/x9c", "LATIN CAPITAL LETTER YOGH"); ("/xc8/x9d", "LATIN SMALL LETTER YOGH"); ("/xc8/x9e", "LATIN CAPITAL LETTER H WITH CARON"); ("/xc8/x9f", "LATIN SMALL LETTER H WITH CARON"); ("/xc8/xa0", "LATIN CAPITAL LETTER N WITH LONG RIGHT LEG"); ("/xc8/xa1", "LATIN SMALL LETTER D WITH CURL"); ("/xc8/xa2", "LATIN CAPITAL LETTER OU"); ("/xc8/xa3", "LATIN SMALL LETTER OU"); ("/xc8/xa4", "LATIN CAPITAL LETTER Z WITH HOOK"); ("/xc8/xa5", "LATIN SMALL LETTER Z WITH HOOK"); ("/xc8/xa6", "LATIN CAPITAL LETTER A WITH DOT ABOVE"); ("/xc8/xa7", "LATIN SMALL LETTER A WITH DOT ABOVE"); ("/xc8/xa8", "LATIN CAPITAL LETTER E WITH CEDILLA"); ("/xc8/xa9", "LATIN SMALL LETTER E WITH CEDILLA"); ("/xc8/xaa", "LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON"); ("/xc8/xab", "LATIN SMALL LETTER O WITH DIAERESIS AND MACRON"); ("/xc8/xac", "LATIN CAPITAL LETTER O WITH TILDE AND MACRON"); ("/xc8/xad", "LATIN SMALL LETTER O WITH TILDE AND MACRON"); ("/xc8/xae", "LATIN CAPITAL LETTER O WITH DOT ABOVE"); ("/xc8/xaf", "LATIN SMALL LETTER O WITH DOT ABOVE"); ("/xc8/xb0", "LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON"); ("/xc8/xb1", "LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON"); ("/xc8/xb2", "LATIN CAPITAL LETTER Y WITH MACRON"); ("/xc8/xb3", "LATIN SMALL LETTER Y WITH MACRON"); ("/xc8/xb4", "LATIN SMALL LETTER L WITH CURL"); ("/xc8/xb5", "LATIN SMALL LETTER N WITH CURL"); ("/xc8/xb6", "LATIN SMALL LETTER T WITH CURL"); ("/xc8/xb7", "LATIN SMALL LETTER DOTLESS J"); ("/xc8/xb8", "LATIN SMALL LETTER DB DIGRAPH"); ("/xc8/xb9", "LATIN SMALL LETTER QP DIGRAPH"); ("/xc8/xba", "LATIN CAPITAL LETTER A WITH STROKE"); ("/xc8/xbb", "LATIN CAPITAL LETTER C WITH STROKE"); ("/xc8/xbc", "LATIN SMALL LETTER C WITH STROKE"); ("/xc8/xbd", "LATIN CAPITAL LETTER L WITH BAR"); ("/xc8/xbe", "LATIN CAPITAL LETTER T WITH DIAGONAL STROKE"); ("/xc8/xbf", "LATIN SMALL LETTER S WITH SWASH TAIL"); ("/xc9/x80", "LATIN SMALL LETTER Z WITH SWASH TAIL"); ("/xc9/x81", "LATIN CAPITAL LETTER GLOTTAL STOP"); ("/xc9/x82", "LATIN SMALL LETTER GLOTTAL STOP"); ("/xc9/x83", "LATIN CAPITAL LETTER B WITH STROKE"); ("/xc9/x84", "LATIN CAPITAL LETTER U BAR"); ("/xc9/x85", "LATIN CAPITAL LETTER TURNED V"); ("/xc9/x86", "LATIN CAPITAL LETTER E WITH STROKE"); ("/xc9/x87", "LATIN SMALL LETTER E WITH STROKE"); ("/xc9/x88", "LATIN CAPITAL LETTER J WITH STROKE"); ("/xc9/x89", "LATIN SMALL LETTER J WITH STROKE"); ("/xc9/x8a", "LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL"); ("/xc9/x8b", "LATIN SMALL LETTER Q WITH HOOK TAIL"); ("/xc9/x8c", "LATIN CAPITAL LETTER R WITH STROKE"); ("/xc9/x8d", "LATIN SMALL LETTER R WITH STROKE"); ("/xc9/x8e", "LATIN CAPITAL LETTER Y WITH STROKE"); ("/xc9/x8f", "LATIN SMALL LETTER Y WITH STROKE"); ("/xc9/x90", "LATIN SMALL LETTER TURNED A"); ("/xc9/x91", "LATIN SMALL LETTER ALPHA"); ("/xc9/x92", "LATIN SMALL LETTER TURNED ALPHA"); ("/xc9/x93", "LATIN SMALL LETTER B WITH HOOK"); ("/xc9/x94", "LATIN SMALL LETTER OPEN O"); ("/xc9/x95", "LATIN SMALL LETTER C WITH CURL"); ("/xc9/x96", "LATIN SMALL LETTER D WITH TAIL"); ("/xc9/x97", "LATIN SMALL LETTER D WITH HOOK"); ("/xc9/x98", "LATIN SMALL LETTER REVERSED E"); ("/xc9/x99", "LATIN SMALL LETTER SCHWA"); ("/xc9/x9a", "LATIN SMALL LETTER SCHWA WITH HOOK"); ("/xc9/x9b", "LATIN SMALL LETTER OPEN E"); ("/xc9/x9c", "LATIN SMALL LETTER REVERSED OPEN E"); ("/xc9/x9d", "LATIN SMALL LETTER REVERSED OPEN E WITH HOOK"); ("/xc9/x9e", "LATIN SMALL LETTER CLOSED REVERSED OPEN E"); ("/xc9/x9f", "LATIN SMALL LETTER DOTLESS J WITH STROKE"); ("/xc9/xa0", "LATIN SMALL LETTER G WITH HOOK"); ("/xc9/xa1", "LATIN SMALL LETTER SCRIPT G"); ("/xc9/xa2", "LATIN LETTER SMALL CAPITAL G"); ("/xc9/xa3", "LATIN SMALL LETTER GAMMA"); ("/xc9/xa4", "LATIN SMALL LETTER RAMS HORN"); ("/xc9/xa5", "LATIN SMALL LETTER TURNED H"); ("/xc9/xa6", "LATIN SMALL LETTER H WITH HOOK"); ("/xc9/xa7", "LATIN SMALL LETTER HENG WITH HOOK"); ("/xc9/xa8", "LATIN SMALL LETTER I WITH STROKE"); ("/xc9/xa9", "LATIN SMALL LETTER IOTA"); ("/xc9/xaa", "LATIN LETTER SMALL CAPITAL I"); ("/xc9/xab", "LATIN SMALL LETTER L WITH MIDDLE TILDE"); ("/xc9/xac", "LATIN SMALL LETTER L WITH BELT"); ("/xc9/xad", "LATIN SMALL LETTER L WITH RETROFLEX HOOK"); ("/xc9/xae", "LATIN SMALL LETTER LEZH"); ("/xc9/xaf", "LATIN SMALL LETTER TURNED M"); ("/xc9/xb0", "LATIN SMALL LETTER TURNED M WITH LONG LEG"); ("/xc9/xb1", "LATIN SMALL LETTER M WITH HOOK"); ("/xc9/xb2", "LATIN SMALL LETTER N WITH LEFT HOOK"); ("/xc9/xb3", "LATIN SMALL LETTER N WITH RETROFLEX HOOK"); ("/xc9/xb4", "LATIN LETTER SMALL CAPITAL N"); ("/xc9/xb5", "LATIN SMALL LETTER BARRED O"); ("/xc9/xb6", "LATIN LETTER SMALL CAPITAL OE"); ("/xc9/xb7", "LATIN SMALL LETTER CLOSED OMEGA"); ("/xc9/xb8", "LATIN SMALL LETTER PHI"); ("/xc9/xb9", "LATIN SMALL LETTER TURNED R"); ("/xc9/xba", "LATIN SMALL LETTER TURNED R WITH LONG LEG"); ("/xc9/xbb", "LATIN SMALL LETTER TURNED R WITH HOOK"); ("/xc9/xbc", "LATIN SMALL LETTER R WITH LONG LEG"); ("/xc9/xbd", "LATIN SMALL LETTER R WITH TAIL"); ("/xc9/xbe", "LATIN SMALL LETTER R WITH FISHHOOK"); ("/xc9/xbf", "LATIN SMALL LETTER REVERSED R WITH FISHHOOK"); ("/xca/x80", "LATIN LETTER SMALL CAPITAL R"); ("/xca/x81", "LATIN LETTER SMALL CAPITAL INVERTED R"); ("/xca/x82", "LATIN SMALL LETTER S WITH HOOK"); ("/xca/x83", "LATIN SMALL LETTER ESH"); ("/xca/x84", "LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK"); ("/xca/x85", "LATIN SMALL LETTER SQUAT REVERSED ESH"); ("/xca/x86", "LATIN SMALL LETTER ESH WITH CURL"); ("/xca/x87", "LATIN SMALL LETTER TURNED T"); ("/xca/x88", "LATIN SMALL LETTER T WITH RETROFLEX HOOK"); ("/xca/x89", "LATIN SMALL LETTER U BAR"); ("/xca/x8a", "LATIN SMALL LETTER UPSILON"); ("/xca/x8b", "LATIN SMALL LETTER V WITH HOOK"); ("/xca/x8c", "LATIN SMALL LETTER TURNED V"); ("/xca/x8d", "LATIN SMALL LETTER TURNED W"); ("/xca/x8e", "LATIN SMALL LETTER TURNED Y"); ("/xca/x8f", "LATIN LETTER SMALL CAPITAL Y"); ("/xca/x90", "LATIN SMALL LETTER Z WITH RETROFLEX HOOK"); ("/xca/x91", "LATIN SMALL LETTER Z WITH CURL"); ("/xca/x92", "LATIN SMALL LETTER EZH"); ("/xca/x93", "LATIN SMALL LETTER EZH WITH CURL"); ("/xca/x99", "LATIN LETTER SMALL CAPITAL B"); ("/xca/x9a", "LATIN SMALL LETTER CLOSED OPEN E"); ("/xca/x9b", "LATIN LETTER SMALL CAPITAL G WITH HOOK"); ("/xca/x9c", "LATIN LETTER SMALL CAPITAL H"); ("/xca/x9d", "LATIN SMALL LETTER J WITH CROSSED-TAIL"); ("/xca/x9e", "LATIN SMALL LETTER TURNED K"); ("/xca/x9f", "LATIN LETTER SMALL CAPITAL L"); ("/xca/xa0", "LATIN SMALL LETTER Q WITH HOOK"); ("/xca/xa3", "LATIN SMALL LETTER DZ DIGRAPH"); ("/xca/xa4", "LATIN SMALL LETTER DEZH DIGRAPH"); ("/xca/xa5", "LATIN SMALL LETTER DZ DIGRAPH WITH CURL"); ("/xca/xa6", "LATIN SMALL LETTER TS DIGRAPH"); ("/xca/xa7", "LATIN SMALL LETTER TESH DIGRAPH"); ("/xca/xa8", "LATIN SMALL LETTER TC DIGRAPH WITH CURL"); ("/xca/xa9", "LATIN SMALL LETTER FENG DIGRAPH"); ("/xca/xaa", "LATIN SMALL LETTER LS DIGRAPH"); ("/xca/xab", "LATIN SMALL LETTER LZ DIGRAPH"); ("/xca/xae", "LATIN SMALL LETTER TURNED H WITH FISHHOOK"); ("/xca/xaf", "LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL"); ("/xca/xb0", "MODIFIER LETTER SMALL H"); ("/xca/xb1", "MODIFIER LETTER SMALL H WITH HOOK"); ("/xca/xb2", "MODIFIER LETTER SMALL J"); ("/xca/xb3", "MODIFIER LETTER SMALL R"); ("/xca/xb4", "MODIFIER LETTER SMALL TURNED R"); ("/xca/xb5", "MODIFIER LETTER SMALL TURNED R WITH HOOK"); ("/xca/xb6", "MODIFIER LETTER SMALL CAPITAL INVERTED R"); ("/xca/xb7", "MODIFIER LETTER SMALL W"); ("/xca/xb8", "MODIFIER LETTER SMALL Y"); ("/xcb/x9c", "SMALL TILDE"); ("/xcb/xa0", "MODIFIER LETTER SMALL GAMMA"); ("/xcb/xa1", "MODIFIER LETTER SMALL L"); ("/xcb/xa2", "MODIFIER LETTER SMALL S"); ("/xcb/xa3", "MODIFIER LETTER SMALL X"); ("/xcb/xa4", "MODIFIER LETTER SMALL REVERSED GLOTTAL STOP"); ("/xcd/xa3", "COMBINING LATIN SMALL LETTER A"); ("/xcd/xa4", "COMBINING LATIN SMALL LETTER E"); ("/xcd/xa5", "COMBINING LATIN SMALL LETTER I"); ("/xcd/xa6", "COMBINING LATIN SMALL LETTER O"); ("/xcd/xa7", "COMBINING LATIN SMALL LETTER U"); ("/xcd/xa8", "COMBINING LATIN SMALL LETTER C"); ("/xcd/xa9", "COMBINING LATIN SMALL LETTER D"); ("/xcd/xaa", "COMBINING LATIN SMALL LETTER H"); ("/xcd/xab", "COMBINING LATIN SMALL LETTER M"); ("/xcd/xac", "COMBINING LATIN SMALL LETTER R"); ("/xcd/xad", "COMBINING LATIN SMALL LETTER T"); ("/xcd/xae", "COMBINING LATIN SMALL LETTER V"); ("/xcd/xaf", "COMBINING LATIN SMALL LETTER X"); ("/xcd/xb0", "GREEK CAPITAL LETTER HETA"); ("/xcd/xb1", "GREEK SMALL LETTER HETA"); ("/xcd/xb2", "GREEK CAPITAL LETTER ARCHAIC SAMPI"); ("/xcd/xb3", "GREEK SMALL LETTER ARCHAIC SAMPI"); ("/xcd/xb6", "GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA"); ("/xcd/xb7", "GREEK SMALL LETTER PAMPHYLIAN DIGAMMA"); ("/xcd/xbb", "GREEK SMALL REVERSED LUNATE SIGMA SYMBOL"); ("/xcd/xbc", "GREEK SMALL DOTTED LUNATE SIGMA SYMBOL"); ("/xcd/xbd", "GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL"); ("/xce/x86", "GREEK CAPITAL LETTER ALPHA WITH TONOS"); ("/xce/x88", "GREEK CAPITAL LETTER EPSILON WITH TONOS"); ("/xce/x89", "GREEK CAPITAL LETTER ETA WITH TONOS"); ("/xce/x8a", "GREEK CAPITAL LETTER IOTA WITH TONOS"); ("/xce/x8c", "GREEK CAPITAL LETTER OMICRON WITH TONOS"); ("/xce/x8e", "GREEK CAPITAL LETTER UPSILON WITH TONOS"); ("/xce/x8f", "GREEK CAPITAL LETTER OMEGA WITH TONOS"); ("/xce/x90", "GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS"); ("/xce/x91", "GREEK CAPITAL LETTER ALPHA"); ("/xce/x92", "GREEK CAPITAL LETTER BETA"); ("/xce/x93", "GREEK CAPITAL LETTER GAMMA"); ("/xce/x94", "GREEK CAPITAL LETTER DELTA"); ("/xce/x95", "GREEK CAPITAL LETTER EPSILON"); ("/xce/x96", "GREEK CAPITAL LETTER ZETA"); ("/xce/x97", "GREEK CAPITAL LETTER ETA"); ("/xce/x98", "GREEK CAPITAL LETTER THETA"); ("/xce/x99", "GREEK CAPITAL LETTER IOTA"); ("/xce/x9a", "GREEK CAPITAL LETTER KAPPA"); ("/xce/x9b", "GREEK CAPITAL LETTER LAMDA"); ("/xce/x9c", "GREEK CAPITAL LETTER MU"); ("/xce/x9d", "GREEK CAPITAL LETTER NU"); ("/xce/x9e", "GREEK CAPITAL LETTER XI"); ("/xce/x9f", "GREEK CAPITAL LETTER OMICRON"); ("/xce/xa0", "GREEK CAPITAL LETTER PI"); ("/xce/xa1", "GREEK CAPITAL LETTER RHO"); ("/xce/xa3", "GREEK CAPITAL LETTER SIGMA"); ("/xce/xa4", "GREEK CAPITAL LETTER TAU"); ("/xce/xa5", "GREEK CAPITAL LETTER UPSILON"); ("/xce/xa6", "GREEK CAPITAL LETTER PHI"); ("/xce/xa7", "GREEK CAPITAL LETTER CHI"); ("/xce/xa8", "GREEK CAPITAL LETTER PSI"); ("/xce/xa9", "GREEK CAPITAL LETTER OMEGA"); ("/xce/xaa", "GREEK CAPITAL LETTER IOTA WITH DIALYTIKA"); ("/xce/xab", "GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA"); ("/xce/xac", "GREEK SMALL LETTER ALPHA WITH TONOS"); ("/xce/xad", "GREEK SMALL LETTER EPSILON WITH TONOS"); ("/xce/xae", "GREEK SMALL LETTER ETA WITH TONOS"); ("/xce/xaf", "GREEK SMALL LETTER IOTA WITH TONOS"); ("/xce/xb0", "GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS"); ("/xce/xb1", "GREEK SMALL LETTER ALPHA"); ("/xce/xb2", "GREEK SMALL LETTER BETA"); ("/xce/xb3", "GREEK SMALL LETTER GAMMA"); ("/xce/xb4", "GREEK SMALL LETTER DELTA"); ("/xce/xb5", "GREEK SMALL LETTER EPSILON"); ("/xce/xb6", "GREEK SMALL LETTER ZETA"); ("/xce/xb7", "GREEK SMALL LETTER ETA"); ("/xce/xb8", "GREEK SMALL LETTER THETA"); ("/xce/xb9", "GREEK SMALL LETTER IOTA"); ("/xce/xba", "GREEK SMALL LETTER KAPPA"); ("/xce/xbb", "GREEK SMALL LETTER LAMDA"); ("/xce/xbc", "GREEK SMALL LETTER MU"); ("/xce/xbd", "GREEK SMALL LETTER NU"); ("/xce/xbe", "GREEK SMALL LETTER XI"); ("/xce/xbf", "GREEK SMALL LETTER OMICRON"); ("/xcf/x80", "GREEK SMALL LETTER PI"); ("/xcf/x81", "GREEK SMALL LETTER RHO"); ("/xcf/x82", "GREEK SMALL LETTER FINAL SIGMA"); ("/xcf/x83", "GREEK SMALL LETTER SIGMA"); ("/xcf/x84", "GREEK SMALL LETTER TAU"); ("/xcf/x85", "GREEK SMALL LETTER UPSILON"); ("/xcf/x86", "GREEK SMALL LETTER PHI"); ("/xcf/x87", "GREEK SMALL LETTER CHI"); ("/xcf/x88", "GREEK SMALL LETTER PSI"); ("/xcf/x89", "GREEK SMALL LETTER OMEGA"); ("/xcf/x8a", "GREEK SMALL LETTER IOTA WITH DIALYTIKA"); ("/xcf/x8b", "GREEK SMALL LETTER UPSILON WITH DIALYTIKA"); ("/xcf/x8c", "GREEK SMALL LETTER OMICRON WITH TONOS"); ("/xcf/x8d", "GREEK SMALL LETTER UPSILON WITH TONOS"); ("/xcf/x8e", "GREEK SMALL LETTER OMEGA WITH TONOS"); ("/xcf/x8f", "GREEK CAPITAL KAI SYMBOL"); ("/xcf/x99", "GREEK SMALL LETTER ARCHAIC KOPPA"); ("/xcf/x9b", "GREEK SMALL LETTER STIGMA"); ("/xcf/x9d", "GREEK SMALL LETTER DIGAMMA"); ("/xcf/x9f", "GREEK SMALL LETTER KOPPA"); ("/xcf/xa1", "GREEK SMALL LETTER SAMPI"); ("/xcf/xa2", "COPTIC CAPITAL LETTER SHEI"); ("/xcf/xa3", "COPTIC SMALL LETTER SHEI"); ("/xcf/xa4", "COPTIC CAPITAL LETTER FEI"); ("/xcf/xa5", "COPTIC SMALL LETTER FEI"); ("/xcf/xa6", "COPTIC CAPITAL LETTER KHEI"); ("/xcf/xa7", "COPTIC SMALL LETTER KHEI"); ("/xcf/xa8", "COPTIC CAPITAL LETTER HORI"); ("/xcf/xa9", "COPTIC SMALL LETTER HORI"); ("/xcf/xaa", "COPTIC CAPITAL LETTER GANGIA"); ("/xcf/xab", "COPTIC SMALL LETTER GANGIA"); ("/xcf/xac", "COPTIC CAPITAL LETTER SHIMA"); ("/xcf/xad", "COPTIC SMALL LETTER SHIMA"); ("/xcf/xae", "COPTIC CAPITAL LETTER DEI"); ("/xcf/xaf", "COPTIC SMALL LETTER DEI"); ("/xcf/xb4", "GREEK CAPITAL THETA SYMBOL"); ("/xcf/xb7", "GREEK CAPITAL LETTER SHO"); ("/xcf/xb8", "GREEK SMALL LETTER SHO"); ("/xcf/xb9", "GREEK CAPITAL LUNATE SIGMA SYMBOL"); ("/xcf/xba", "GREEK CAPITAL LETTER SAN"); ("/xcf/xbb", "GREEK SMALL LETTER SAN"); ("/xcf/xbd", "GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL"); ("/xcf/xbe", "GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL"); ("/xcf/xbf", "GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL"); ("/xd0/x80", "CYRILLIC CAPITAL LETTER IE WITH GRAVE"); ("/xd0/x81", "CYRILLIC CAPITAL LETTER IO"); ("/xd0/x82", "CYRILLIC CAPITAL LETTER DJE"); ("/xd0/x83", "CYRILLIC CAPITAL LETTER GJE"); ("/xd0/x84", "CYRILLIC CAPITAL LETTER UKRAINIAN IE"); ("/xd0/x85", "CYRILLIC CAPITAL LETTER DZE"); ("/xd0/x86", "CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I"); ("/xd0/x87", "CYRILLIC CAPITAL LETTER YI"); ("/xd0/x88", "CYRILLIC CAPITAL LETTER JE"); ("/xd0/x89", "CYRILLIC CAPITAL LETTER LJE"); ("/xd0/x8a", "CYRILLIC CAPITAL LETTER NJE"); ("/xd0/x8b", "CYRILLIC CAPITAL LETTER TSHE"); ("/xd0/x8c", "CYRILLIC CAPITAL LETTER KJE"); ("/xd0/x8d", "CYRILLIC CAPITAL LETTER I WITH GRAVE"); ("/xd0/x8e", "CYRILLIC CAPITAL LETTER SHORT U"); ("/xd0/x8f", "CYRILLIC CAPITAL LETTER DZHE"); ("/xd0/x90", "CYRILLIC CAPITAL LETTER A"); ("/xd0/x91", "CYRILLIC CAPITAL LETTER BE"); ("/xd0/x92", "CYRILLIC CAPITAL LETTER VE"); ("/xd0/x93", "CYRILLIC CAPITAL LETTER GHE"); ("/xd0/x94", "CYRILLIC CAPITAL LETTER DE"); ("/xd0/x95", "CYRILLIC CAPITAL LETTER IE"); ("/xd0/x96", "CYRILLIC CAPITAL LETTER ZHE"); ("/xd0/x97", "CYRILLIC CAPITAL LETTER ZE"); ("/xd0/x98", "CYRILLIC CAPITAL LETTER I"); ("/xd0/x99", "CYRILLIC CAPITAL LETTER SHORT I"); ("/xd0/x9a", "CYRILLIC CAPITAL LETTER KA"); ("/xd0/x9b", "CYRILLIC CAPITAL LETTER EL"); ("/xd0/x9c", "CYRILLIC CAPITAL LETTER EM"); ("/xd0/x9d", "CYRILLIC CAPITAL LETTER EN"); ("/xd0/x9e", "CYRILLIC CAPITAL LETTER O"); ("/xd0/x9f", "CYRILLIC CAPITAL LETTER PE"); ("/xd0/xa0", "CYRILLIC CAPITAL LETTER ER"); ("/xd0/xa1", "CYRILLIC CAPITAL LETTER ES"); ("/xd0/xa2", "CYRILLIC CAPITAL LETTER TE"); ("/xd0/xa3", "CYRILLIC CAPITAL LETTER U"); ("/xd0/xa4", "CYRILLIC CAPITAL LETTER EF"); ("/xd0/xa5", "CYRILLIC CAPITAL LETTER HA"); ("/xd0/xa6", "CYRILLIC CAPITAL LETTER TSE"); ("/xd0/xa7", "CYRILLIC CAPITAL LETTER CHE"); ("/xd0/xa8", "CYRILLIC CAPITAL LETTER SHA"); ("/xd0/xa9", "CYRILLIC CAPITAL LETTER SHCHA"); ("/xd0/xaa", "CYRILLIC CAPITAL LETTER HARD SIGN"); ("/xd0/xab", "CYRILLIC CAPITAL LETTER YERU"); ("/xd0/xac", "CYRILLIC CAPITAL LETTER SOFT SIGN"); ("/xd0/xad", "CYRILLIC CAPITAL LETTER E"); ("/xd0/xae", "CYRILLIC CAPITAL LETTER YU"); ("/xd0/xaf", "CYRILLIC CAPITAL LETTER YA"); ("/xd0/xb0", "CYRILLIC SMALL LETTER A"); ("/xd0/xb1", "CYRILLIC SMALL LETTER BE"); ("/xd0/xb2", "CYRILLIC SMALL LETTER VE"); ("/xd0/xb3", "CYRILLIC SMALL LETTER GHE"); ("/xd0/xb4", "CYRILLIC SMALL LETTER DE"); ("/xd0/xb5", "CYRILLIC SMALL LETTER IE"); ("/xd0/xb6", "CYRILLIC SMALL LETTER ZHE"); ("/xd0/xb7", "CYRILLIC SMALL LETTER ZE"); ("/xd0/xb8", "CYRILLIC SMALL LETTER I"); ("/xd0/xb9", "CYRILLIC SMALL LETTER SHORT I"); ("/xd0/xba", "CYRILLIC SMALL LETTER KA"); ("/xd0/xbb", "CYRILLIC SMALL LETTER EL"); ("/xd0/xbc", "CYRILLIC SMALL LETTER EM"); ("/xd0/xbd", "CYRILLIC SMALL LETTER EN"); ("/xd0/xbe", "CYRILLIC SMALL LETTER O"); ("/xd0/xbf", "CYRILLIC SMALL LETTER PE"); ("/xd1/x80", "CYRILLIC SMALL LETTER ER"); ("/xd1/x81", "CYRILLIC SMALL LETTER ES"); ("/xd1/x82", "CYRILLIC SMALL LETTER TE"); ("/xd1/x83", "CYRILLIC SMALL LETTER U"); ("/xd1/x84", "CYRILLIC SMALL LETTER EF"); ("/xd1/x85", "CYRILLIC SMALL LETTER HA"); ("/xd1/x86", "CYRILLIC SMALL LETTER TSE"); ("/xd1/x87", "CYRILLIC SMALL LETTER CHE"); ("/xd1/x88", "CYRILLIC SMALL LETTER SHA"); ("/xd1/x89", "CYRILLIC SMALL LETTER SHCHA"); ("/xd1/x8a", "CYRILLIC SMALL LETTER HARD SIGN"); ("/xd1/x8b", "CYRILLIC SMALL LETTER YERU"); ("/xd1/x8c", "CYRILLIC SMALL LETTER SOFT SIGN"); ("/xd1/x8d", "CYRILLIC SMALL LETTER E"); ("/xd1/x8e", "CYRILLIC SMALL LETTER YU"); ("/xd1/x8f", "CYRILLIC SMALL LETTER YA"); ("/xd1/x90", "CYRILLIC SMALL LETTER IE WITH GRAVE"); ("/xd1/x91", "CYRILLIC SMALL LETTER IO"); ("/xd1/x92", "CYRILLIC SMALL LETTER DJE"); ("/xd1/x93", "CYRILLIC SMALL LETTER GJE"); ("/xd1/x94", "CYRILLIC SMALL LETTER UKRAINIAN IE"); ("/xd1/x95", "CYRILLIC SMALL LETTER DZE"); ("/xd1/x96", "CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I"); ("/xd1/x97", "CYRILLIC SMALL LETTER YI"); ("/xd1/x98", "CYRILLIC SMALL LETTER JE"); ("/xd1/x99", "CYRILLIC SMALL LETTER LJE"); ("/xd1/x9a", "CYRILLIC SMALL LETTER NJE"); ("/xd1/x9b", "CYRILLIC SMALL LETTER TSHE"); ("/xd1/x9c", "CYRILLIC SMALL LETTER KJE"); ("/xd1/x9d", "CYRILLIC SMALL LETTER I WITH GRAVE"); ("/xd1/x9e", "CYRILLIC SMALL LETTER SHORT U"); ("/xd1/x9f", "CYRILLIC SMALL LETTER DZHE"); ("/xd1/xa0", "CYRILLIC CAPITAL LETTER OMEGA"); ("/xd1/xa1", "CYRILLIC SMALL LETTER OMEGA"); ("/xd1/xa2", "CYRILLIC CAPITAL LETTER YAT"); ("/xd1/xa3", "CYRILLIC SMALL LETTER YAT"); ("/xd1/xa4", "CYRILLIC CAPITAL LETTER IOTIFIED E"); ("/xd1/xa5", "CYRILLIC SMALL LETTER IOTIFIED E"); ("/xd1/xa6", "CYRILLIC CAPITAL LETTER LITTLE YUS"); ("/xd1/xa7", "CYRILLIC SMALL LETTER LITTLE YUS"); ("/xd1/xa8", "CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS"); ("/xd1/xa9", "CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS"); ("/xd1/xaa", "CYRILLIC CAPITAL LETTER BIG YUS"); ("/xd1/xab", "CYRILLIC SMALL LETTER BIG YUS"); ("/xd1/xac", "CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS"); ("/xd1/xad", "CYRILLIC SMALL LETTER IOTIFIED BIG YUS"); ("/xd1/xae", "CYRILLIC CAPITAL LETTER KSI"); ("/xd1/xaf", "CYRILLIC SMALL LETTER KSI"); ("/xd1/xb0", "CYRILLIC CAPITAL LETTER PSI"); ("/xd1/xb1", "CYRILLIC SMALL LETTER PSI"); ("/xd1/xb2", "CYRILLIC CAPITAL LETTER FITA"); ("/xd1/xb3", "CYRILLIC SMALL LETTER FITA"); ("/xd1/xb4", "CYRILLIC CAPITAL LETTER IZHITSA"); ("/xd1/xb5", "CYRILLIC SMALL LETTER IZHITSA"); ("/xd1/xb6", "CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT"); ("/xd1/xb7", "CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT"); ("/xd1/xb8", "CYRILLIC CAPITAL LETTER UK"); ("/xd1/xb9", "CYRILLIC SMALL LETTER UK"); ("/xd1/xba", "CYRILLIC CAPITAL LETTER ROUND OMEGA"); ("/xd1/xbb", "CYRILLIC SMALL LETTER ROUND OMEGA"); ("/xd1/xbc", "CYRILLIC CAPITAL LETTER OMEGA WITH TITLO"); ("/xd1/xbd", "CYRILLIC SMALL LETTER OMEGA WITH TITLO"); ("/xd1/xbe", "CYRILLIC CAPITAL LETTER OT"); ("/xd1/xbf", "CYRILLIC SMALL LETTER OT"); ("/xd2/x80", "CYRILLIC CAPITAL LETTER KOPPA"); ("/xd2/x81", "CYRILLIC SMALL LETTER KOPPA"); ("/xd2/x8a", "CYRILLIC CAPITAL LETTER SHORT I WITH TAIL"); ("/xd2/x8b", "CYRILLIC SMALL LETTER SHORT I WITH TAIL"); ("/xd2/x8c", "CYRILLIC CAPITAL LETTER SEMISOFT SIGN"); ("/xd2/x8d", "CYRILLIC SMALL LETTER SEMISOFT SIGN"); ("/xd2/x8e", "CYRILLIC CAPITAL LETTER ER WITH TICK"); ("/xd2/x8f", "CYRILLIC SMALL LETTER ER WITH TICK"); ("/xd2/x90", "CYRILLIC CAPITAL LETTER GHE WITH UPTURN"); ("/xd2/x91", "CYRILLIC SMALL LETTER GHE WITH UPTURN"); ("/xd2/x92", "CYRILLIC CAPITAL LETTER GHE WITH STROKE"); ("/xd2/x93", "CYRILLIC SMALL LETTER GHE WITH STROKE"); ("/xd2/x94", "CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK"); ("/xd2/x95", "CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK"); ("/xd2/x96", "CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER"); ("/xd2/x97", "CYRILLIC SMALL LETTER ZHE WITH DESCENDER"); ("/xd2/x98", "CYRILLIC CAPITAL LETTER ZE WITH DESCENDER"); ("/xd2/x99", "CYRILLIC SMALL LETTER ZE WITH DESCENDER"); ("/xd2/x9a", "CYRILLIC CAPITAL LETTER KA WITH DESCENDER"); ("/xd2/x9b", "CYRILLIC SMALL LETTER KA WITH DESCENDER"); ("/xd2/x9c", "CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE"); ("/xd2/x9d", "CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE"); ("/xd2/x9e", "CYRILLIC CAPITAL LETTER KA WITH STROKE"); ("/xd2/x9f", "CYRILLIC SMALL LETTER KA WITH STROKE"); ("/xd2/xa0", "CYRILLIC CAPITAL LETTER BASHKIR KA"); ("/xd2/xa1", "CYRILLIC SMALL LETTER BASHKIR KA"); ("/xd2/xa2", "CYRILLIC CAPITAL LETTER EN WITH DESCENDER"); ("/xd2/xa3", "CYRILLIC SMALL LETTER EN WITH DESCENDER"); ("/xd2/xa4", "CYRILLIC CAPITAL LIGATURE EN GHE"); ("/xd2/xa5", "CYRILLIC SMALL LIGATURE EN GHE"); ("/xd2/xa6", "CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK"); ("/xd2/xa7", "CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK"); ("/xd2/xa8", "CYRILLIC CAPITAL LETTER ABKHASIAN HA"); ("/xd2/xa9", "CYRILLIC SMALL LETTER ABKHASIAN HA"); ("/xd2/xaa", "CYRILLIC CAPITAL LETTER ES WITH DESCENDER"); ("/xd2/xab", "CYRILLIC SMALL LETTER ES WITH DESCENDER"); ("/xd2/xac", "CYRILLIC CAPITAL LETTER TE WITH DESCENDER"); ("/xd2/xad", "CYRILLIC SMALL LETTER TE WITH DESCENDER"); ("/xd2/xae", "CYRILLIC CAPITAL LETTER STRAIGHT U"); ("/xd2/xaf", "CYRILLIC SMALL LETTER STRAIGHT U"); ("/xd2/xb0", "CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE"); ("/xd2/xb1", "CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE"); ("/xd2/xb2", "CYRILLIC CAPITAL LETTER HA WITH DESCENDER"); ("/xd2/xb3", "CYRILLIC SMALL LETTER HA WITH DESCENDER"); ("/xd2/xb4", "CYRILLIC CAPITAL LIGATURE TE TSE"); ("/xd2/xb5", "CYRILLIC SMALL LIGATURE TE TSE"); ("/xd2/xb6", "CYRILLIC CAPITAL LETTER CHE WITH DESCENDER"); ("/xd2/xb7", "CYRILLIC SMALL LETTER CHE WITH DESCENDER"); ("/xd2/xb8", "CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE"); ("/xd2/xb9", "CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE"); ("/xd2/xba", "CYRILLIC CAPITAL LETTER SHHA"); ("/xd2/xbb", "CYRILLIC SMALL LETTER SHHA"); ("/xd2/xbc", "CYRILLIC CAPITAL LETTER ABKHASIAN CHE"); ("/xd2/xbd", "CYRILLIC SMALL LETTER ABKHASIAN CHE"); ("/xd2/xbe", "CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER"); ("/xd2/xbf", "CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER"); ("/xd3/x81", "CYRILLIC CAPITAL LETTER ZHE WITH BREVE"); ("/xd3/x82", "CYRILLIC SMALL LETTER ZHE WITH BREVE"); ("/xd3/x83", "CYRILLIC CAPITAL LETTER KA WITH HOOK"); ("/xd3/x84", "CYRILLIC SMALL LETTER KA WITH HOOK"); ("/xd3/x85", "CYRILLIC CAPITAL LETTER EL WITH TAIL"); ("/xd3/x86", "CYRILLIC SMALL LETTER EL WITH TAIL"); ("/xd3/x87", "CYRILLIC CAPITAL LETTER EN WITH HOOK"); ("/xd3/x88", "CYRILLIC SMALL LETTER EN WITH HOOK"); ("/xd3/x89", "CYRILLIC CAPITAL LETTER EN WITH TAIL"); ("/xd3/x8a", "CYRILLIC SMALL LETTER EN WITH TAIL"); ("/xd3/x8b", "CYRILLIC CAPITAL LETTER KHAKASSIAN CHE"); ("/xd3/x8c", "CYRILLIC SMALL LETTER KHAKASSIAN CHE"); ("/xd3/x8d", "CYRILLIC CAPITAL LETTER EM WITH TAIL"); ("/xd3/x8e", "CYRILLIC SMALL LETTER EM WITH TAIL"); ("/xd3/x8f", "CYRILLIC SMALL LETTER PALOCHKA"); ("/xd3/x90", "CYRILLIC CAPITAL LETTER A WITH BREVE"); ("/xd3/x91", "CYRILLIC SMALL LETTER A WITH BREVE"); ("/xd3/x92", "CYRILLIC CAPITAL LETTER A WITH DIAERESIS"); ("/xd3/x93", "CYRILLIC SMALL LETTER A WITH DIAERESIS"); ("/xd3/x94", "CYRILLIC CAPITAL LIGATURE A IE"); ("/xd3/x95", "CYRILLIC SMALL LIGATURE A IE"); ("/xd3/x96", "CYRILLIC CAPITAL LETTER IE WITH BREVE"); ("/xd3/x97", "CYRILLIC SMALL LETTER IE WITH BREVE"); ("/xd3/x98", "CYRILLIC CAPITAL LETTER SCHWA"); ("/xd3/x99", "CYRILLIC SMALL LETTER SCHWA"); ("/xd3/x9a", "CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS"); ("/xd3/x9b", "CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS"); ("/xd3/x9c", "CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS"); ("/xd3/x9d", "CYRILLIC SMALL LETTER ZHE WITH DIAERESIS"); ("/xd3/x9e", "CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS"); ("/xd3/x9f", "CYRILLIC SMALL LETTER ZE WITH DIAERESIS"); ("/xd3/xa0", "CYRILLIC CAPITAL LETTER ABKHASIAN DZE"); ("/xd3/xa1", "CYRILLIC SMALL LETTER ABKHASIAN DZE"); ("/xd3/xa2", "CYRILLIC CAPITAL LETTER I WITH MACRON"); ("/xd3/xa3", "CYRILLIC SMALL LETTER I WITH MACRON"); ("/xd3/xa4", "CYRILLIC CAPITAL LETTER I WITH DIAERESIS"); ("/xd3/xa5", "CYRILLIC SMALL LETTER I WITH DIAERESIS"); ("/xd3/xa6", "CYRILLIC CAPITAL LETTER O WITH DIAERESIS"); ("/xd3/xa7", "CYRILLIC SMALL LETTER O WITH DIAERESIS"); ("/xd3/xa8", "CYRILLIC CAPITAL LETTER BARRED O"); ("/xd3/xa9", "CYRILLIC SMALL LETTER BARRED O"); ("/xd3/xaa", "CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS"); ("/xd3/xab", "CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS"); ("/xd3/xac", "CYRILLIC CAPITAL LETTER E WITH DIAERESIS"); ("/xd3/xad", "CYRILLIC SMALL LETTER E WITH DIAERESIS"); ("/xd3/xae", "CYRILLIC CAPITAL LETTER U WITH MACRON"); ("/xd3/xaf", "CYRILLIC SMALL LETTER U WITH MACRON"); ("/xd3/xb0", "CYRILLIC CAPITAL LETTER U WITH DIAERESIS"); ("/xd3/xb1", "CYRILLIC SMALL LETTER U WITH DIAERESIS"); ("/xd3/xb2", "CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE"); ("/xd3/xb3", "CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE"); ("/xd3/xb4", "CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS"); ("/xd3/xb5", "CYRILLIC SMALL LETTER CHE WITH DIAERESIS"); ("/xd3/xb6", "CYRILLIC CAPITAL LETTER GHE WITH DESCENDER"); ("/xd3/xb7", "CYRILLIC SMALL LETTER GHE WITH DESCENDER"); ("/xd3/xb8", "CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS"); ("/xd3/xb9", "CYRILLIC SMALL LETTER YERU WITH DIAERESIS"); ("/xd3/xba", "CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK"); ("/xd3/xbb", "CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK"); ("/xd3/xbc", "CYRILLIC CAPITAL LETTER HA WITH HOOK"); ("/xd3/xbd", "CYRILLIC SMALL LETTER HA WITH HOOK"); ("/xd3/xbe", "CYRILLIC CAPITAL LETTER HA WITH STROKE"); ("/xd3/xbf", "CYRILLIC SMALL LETTER HA WITH STROKE"); ("/xd4/x80", "CYRILLIC CAPITAL LETTER KOMI DE"); ("/xd4/x81", "CYRILLIC SMALL LETTER KOMI DE"); ("/xd4/x82", "CYRILLIC CAPITAL LETTER KOMI DJE"); ("/xd4/x83", "CYRILLIC SMALL LETTER KOMI DJE"); ("/xd4/x84", "CYRILLIC CAPITAL LETTER KOMI ZJE"); ("/xd4/x85", "CYRILLIC SMALL LETTER KOMI ZJE"); ("/xd4/x86", "CYRILLIC CAPITAL LETTER KOMI DZJE"); ("/xd4/x87", "CYRILLIC SMALL LETTER KOMI DZJE"); ("/xd4/x88", "CYRILLIC CAPITAL LETTER KOMI LJE"); ("/xd4/x89", "CYRILLIC SMALL LETTER KOMI LJE"); ("/xd4/x8a", "CYRILLIC CAPITAL LETTER KOMI NJE"); ("/xd4/x8b", "CYRILLIC SMALL LETTER KOMI NJE"); ("/xd4/x8c", "CYRILLIC CAPITAL LETTER KOMI SJE"); ("/xd4/x8d", "CYRILLIC SMALL LETTER KOMI SJE"); ("/xd4/x8e", "CYRILLIC CAPITAL LETTER KOMI TJE"); ("/xd4/x8f", "CYRILLIC SMALL LETTER KOMI TJE"); ("/xd4/x90", "CYRILLIC CAPITAL LETTER REVERSED ZE"); ("/xd4/x91", "CYRILLIC SMALL LETTER REVERSED ZE"); ("/xd4/x92", "CYRILLIC CAPITAL LETTER EL WITH HOOK"); ("/xd4/x93", "CYRILLIC SMALL LETTER EL WITH HOOK"); ("/xd4/x94", "CYRILLIC CAPITAL LETTER LHA"); ("/xd4/x95", "CYRILLIC SMALL LETTER LHA"); ("/xd4/x96", "CYRILLIC CAPITAL LETTER RHA"); ("/xd4/x97", "CYRILLIC SMALL LETTER RHA"); ("/xd4/x98", "CYRILLIC CAPITAL LETTER YAE"); ("/xd4/x99", "CYRILLIC SMALL LETTER YAE"); ("/xd4/x9a", "CYRILLIC CAPITAL LETTER QA"); ("/xd4/x9b", "CYRILLIC SMALL LETTER QA"); ("/xd4/x9c", "CYRILLIC CAPITAL LETTER WE"); ("/xd4/x9d", "CYRILLIC SMALL LETTER WE"); ("/xd4/x9e", "CYRILLIC CAPITAL LETTER ALEUT KA"); ("/xd4/x9f", "CYRILLIC SMALL LETTER ALEUT KA"); ("/xd4/xa0", "CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK"); ("/xd4/xa1", "CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK"); ("/xd4/xa2", "CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK"); ("/xd4/xa3", "CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK"); ("/xd4/xb1", "ARMENIAN CAPITAL LETTER AYB"); ("/xd4/xb2", "ARMENIAN CAPITAL LETTER BEN"); ("/xd4/xb3", "ARMENIAN CAPITAL LETTER GIM"); ("/xd4/xb4", "ARMENIAN CAPITAL LETTER DA"); ("/xd4/xb5", "ARMENIAN CAPITAL LETTER ECH"); ("/xd4/xb6", "ARMENIAN CAPITAL LETTER ZA"); ("/xd4/xb7", "ARMENIAN CAPITAL LETTER EH"); ("/xd4/xb8", "ARMENIAN CAPITAL LETTER ET"); ("/xd4/xb9", "ARMENIAN CAPITAL LETTER TO"); ("/xd4/xba", "ARMENIAN CAPITAL LETTER ZHE"); ("/xd4/xbb", "ARMENIAN CAPITAL LETTER INI"); ("/xd4/xbc", "ARMENIAN CAPITAL LETTER LIWN"); ("/xd4/xbd", "ARMENIAN CAPITAL LETTER XEH"); ("/xd4/xbe", "ARMENIAN CAPITAL LETTER CA"); ("/xd4/xbf", "ARMENIAN CAPITAL LETTER KEN"); ("/xd5/x80", "ARMENIAN CAPITAL LETTER HO"); ("/xd5/x81", "ARMENIAN CAPITAL LETTER JA"); ("/xd5/x82", "ARMENIAN CAPITAL LETTER GHAD"); ("/xd5/x83", "ARMENIAN CAPITAL LETTER CHEH"); ("/xd5/x84", "ARMENIAN CAPITAL LETTER MEN"); ("/xd5/x85", "ARMENIAN CAPITAL LETTER YI"); ("/xd5/x86", "ARMENIAN CAPITAL LETTER NOW"); ("/xd5/x87", "ARMENIAN CAPITAL LETTER SHA"); ("/xd5/x88", "ARMENIAN CAPITAL LETTER VO"); ("/xd5/x89", "ARMENIAN CAPITAL LETTER CHA"); ("/xd5/x8a", "ARMENIAN CAPITAL LETTER PEH"); ("/xd5/x8b", "ARMENIAN CAPITAL LETTER JHEH"); ("/xd5/x8c", "ARMENIAN CAPITAL LETTER RA"); ("/xd5/x8d", "ARMENIAN CAPITAL LETTER SEH"); ("/xd5/x8e", "ARMENIAN CAPITAL LETTER VEW"); ("/xd5/x8f", "ARMENIAN CAPITAL LETTER TIWN"); ("/xd5/x90", "ARMENIAN CAPITAL LETTER REH"); ("/xd5/x91", "ARMENIAN CAPITAL LETTER CO"); ("/xd5/x92", "ARMENIAN CAPITAL LETTER YIWN"); ("/xd5/x93", "ARMENIAN CAPITAL LETTER PIWR"); ("/xd5/x94", "ARMENIAN CAPITAL LETTER KEH"); ("/xd5/x95", "ARMENIAN CAPITAL LETTER OH"); ("/xd5/x96", "ARMENIAN CAPITAL LETTER FEH"); ("/xd5/xa1", "ARMENIAN SMALL LETTER AYB"); ("/xd5/xa2", "ARMENIAN SMALL LETTER BEN"); ("/xd5/xa3", "ARMENIAN SMALL LETTER GIM"); ("/xd5/xa4", "ARMENIAN SMALL LETTER DA"); ("/xd5/xa5", "ARMENIAN SMALL LETTER ECH"); ("/xd5/xa6", "ARMENIAN SMALL LETTER ZA"); ("/xd5/xa7", "ARMENIAN SMALL LETTER EH"); ("/xd5/xa8", "ARMENIAN SMALL LETTER ET"); ("/xd5/xa9", "ARMENIAN SMALL LETTER TO"); ("/xd5/xaa", "ARMENIAN SMALL LETTER ZHE"); ("/xd5/xab", "ARMENIAN SMALL LETTER INI"); ("/xd5/xac", "ARMENIAN SMALL LETTER LIWN"); ("/xd5/xad", "ARMENIAN SMALL LETTER XEH"); ("/xd5/xae", "ARMENIAN SMALL LETTER CA"); ("/xd5/xaf", "ARMENIAN SMALL LETTER KEN"); ("/xd5/xb0", "ARMENIAN SMALL LETTER HO"); ("/xd5/xb1", "ARMENIAN SMALL LETTER JA"); ("/xd5/xb2", "ARMENIAN SMALL LETTER GHAD"); ("/xd5/xb3", "ARMENIAN SMALL LETTER CHEH"); ("/xd5/xb4", "ARMENIAN SMALL LETTER MEN"); ("/xd5/xb5", "ARMENIAN SMALL LETTER YI"); ("/xd5/xb6", "ARMENIAN SMALL LETTER NOW"); ("/xd5/xb7", "ARMENIAN SMALL LETTER SHA"); ("/xd5/xb8", "ARMENIAN SMALL LETTER VO"); ("/xd5/xb9", "ARMENIAN SMALL LETTER CHA"); ("/xd5/xba", "ARMENIAN SMALL LETTER PEH"); ("/xd5/xbb", "ARMENIAN SMALL LETTER JHEH"); ("/xd5/xbc", "ARMENIAN SMALL LETTER RA"); ("/xd5/xbd", "ARMENIAN SMALL LETTER SEH"); ("/xd5/xbe", "ARMENIAN SMALL LETTER VEW"); ("/xd5/xbf", "ARMENIAN SMALL LETTER TIWN"); ("/xd6/x80", "ARMENIAN SMALL LETTER REH"); ("/xd6/x81", "ARMENIAN SMALL LETTER CO"); ("/xd6/x82", "ARMENIAN SMALL LETTER YIWN"); ("/xd6/x83", "ARMENIAN SMALL LETTER PIWR"); ("/xd6/x84", "ARMENIAN SMALL LETTER KEH"); ("/xd6/x85", "ARMENIAN SMALL LETTER OH"); ("/xd6/x86", "ARMENIAN SMALL LETTER FEH"); ("/xd6/x87", "ARMENIAN SMALL LIGATURE ECH YIWN"); ("/xd8/x95", "ARABIC SMALL HIGH TAH"); ("/xd8/x96", "ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH"); ("/xd8/x97", "ARABIC SMALL HIGH ZAIN"); ("/xd8/x98", "ARABIC SMALL FATHA"); ("/xd8/x99", "ARABIC SMALL DAMMA"); ("/xd8/x9a", "ARABIC SMALL KASRA"); ("/xd9/x9a", "ARABIC VOWEL SIGN SMALL V ABOVE"); ("/xd9/x9b", "ARABIC VOWEL SIGN INVERTED SMALL V ABOVE"); ("/xda/x8b", "ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH"); ("/xda/x92", "ARABIC LETTER REH WITH SMALL V"); ("/xda/x95", "ARABIC LETTER REH WITH SMALL V BELOW"); ("/xda/xb5", "ARABIC LETTER LAM WITH SMALL V"); ("/xdb/x8e", "ARABIC LETTER YEH WITH SMALL V"); ("/xdb/x96", "ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA"); ("/xdb/x97", "ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA"); ("/xdb/x98", "ARABIC SMALL HIGH MEEM INITIAL FORM"); ("/xdb/x99", "ARABIC SMALL HIGH LAM ALEF"); ("/xdb/x9a", "ARABIC SMALL HIGH JEEM"); ("/xdb/x9b", "ARABIC SMALL HIGH THREE DOTS"); ("/xdb/x9c", "ARABIC SMALL HIGH SEEN"); ("/xdb/x9f", "ARABIC SMALL HIGH ROUNDED ZERO"); ("/xdb/xa0", "ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO"); ("/xdb/xa1", "ARABIC SMALL HIGH DOTLESS HEAD OF KHAH"); ("/xdb/xa2", "ARABIC SMALL HIGH MEEM ISOLATED FORM"); ("/xdb/xa3", "ARABIC SMALL LOW SEEN"); ("/xdb/xa4", "ARABIC SMALL HIGH MADDA"); ("/xdb/xa5", "ARABIC SMALL WAW"); ("/xdb/xa6", "ARABIC SMALL YEH"); ("/xdb/xa7", "ARABIC SMALL HIGH YEH"); ("/xdb/xa8", "ARABIC SMALL HIGH NOON"); ("/xdb/xad", "ARABIC SMALL LOW MEEM"); ("/xdd/x95", "ARABIC LETTER BEH WITH INVERTED SMALL V BELOW"); ("/xdd/x96", "ARABIC LETTER BEH WITH SMALL V"); ("/xdd/x99", "ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH"); ("/xdd/x9a", "ARABIC LETTER DAL WITH INVERTED SMALL V BELOW"); ("/xdd/xa8", "ARABIC LETTER NOON WITH SMALL TAH"); ("/xdd/xa9", "ARABIC LETTER NOON WITH SMALL V"); ("/xdd/xae", "ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH BELOW"); ("/xdd/xaf", "ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH AND TWO DOTS"); ("/xdd/xb0", "ARABIC LETTER SEEN WITH SMALL ARABIC LETTER TAH AND TWO DOTS"); ("/xdd/xb1", "ARABIC LETTER REH WITH SMALL ARABIC LETTER TAH AND TWO DOTS"); ("/xdd/xb2", "ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH ABOVE"); ("/xe1/x82/xa0", "GEORGIAN CAPITAL LETTER AN"); ("/xe1/x82/xa1", "GEORGIAN CAPITAL LETTER BAN"); ("/xe1/x82/xa2", "GEORGIAN CAPITAL LETTER GAN"); ("/xe1/x82/xa3", "GEORGIAN CAPITAL LETTER DON"); ("/xe1/x82/xa4", "GEORGIAN CAPITAL LETTER EN"); ("/xe1/x82/xa5", "GEORGIAN CAPITAL LETTER VIN"); ("/xe1/x82/xa6", "GEORGIAN CAPITAL LETTER ZEN"); ("/xe1/x82/xa7", "GEORGIAN CAPITAL LETTER TAN"); ("/xe1/x82/xa8", "GEORGIAN CAPITAL LETTER IN"); ("/xe1/x82/xa9", "GEORGIAN CAPITAL LETTER KAN"); ("/xe1/x82/xaa", "GEORGIAN CAPITAL LETTER LAS"); ("/xe1/x82/xab", "GEORGIAN CAPITAL LETTER MAN"); ("/xe1/x82/xac", "GEORGIAN CAPITAL LETTER NAR"); ("/xe1/x82/xad", "GEORGIAN CAPITAL LETTER ON"); ("/xe1/x82/xae", "GEORGIAN CAPITAL LETTER PAR"); ("/xe1/x82/xaf", "GEORGIAN CAPITAL LETTER ZHAR"); ("/xe1/x82/xb0", "GEORGIAN CAPITAL LETTER RAE"); ("/xe1/x82/xb1", "GEORGIAN CAPITAL LETTER SAN"); ("/xe1/x82/xb2", "GEORGIAN CAPITAL LETTER TAR"); ("/xe1/x82/xb3", "GEORGIAN CAPITAL LETTER UN"); ("/xe1/x82/xb4", "GEORGIAN CAPITAL LETTER PHAR"); ("/xe1/x82/xb5", "GEORGIAN CAPITAL LETTER KHAR"); ("/xe1/x82/xb6", "GEORGIAN CAPITAL LETTER GHAN"); ("/xe1/x82/xb7", "GEORGIAN CAPITAL LETTER QAR"); ("/xe1/x82/xb8", "GEORGIAN CAPITAL LETTER SHIN"); ("/xe1/x82/xb9", "GEORGIAN CAPITAL LETTER CHIN"); ("/xe1/x82/xba", "GEORGIAN CAPITAL LETTER CAN"); ("/xe1/x82/xbb", "GEORGIAN CAPITAL LETTER JIL"); ("/xe1/x82/xbc", "GEORGIAN CAPITAL LETTER CIL"); ("/xe1/x82/xbd", "GEORGIAN CAPITAL LETTER CHAR"); ("/xe1/x82/xbe", "GEORGIAN CAPITAL LETTER XAN"); ("/xe1/x82/xbf", "GEORGIAN CAPITAL LETTER JHAN"); ("/xe1/x83/x80", "GEORGIAN CAPITAL LETTER HAE"); ("/xe1/x83/x81", "GEORGIAN CAPITAL LETTER HE"); ("/xe1/x83/x82", "GEORGIAN CAPITAL LETTER HIE"); ("/xe1/x83/x83", "GEORGIAN CAPITAL LETTER WE"); ("/xe1/x83/x84", "GEORGIAN CAPITAL LETTER HAR"); ("/xe1/x83/x85", "GEORGIAN CAPITAL LETTER HOE"); ("/xe1/xa4/xb0", "LIMBU SMALL LETTER KA"); ("/xe1/xa4/xb1", "LIMBU SMALL LETTER NGA"); ("/xe1/xa4/xb2", "LIMBU SMALL LETTER ANUSVARA"); ("/xe1/xa4/xb3", "LIMBU SMALL LETTER TA"); ("/xe1/xa4/xb4", "LIMBU SMALL LETTER NA"); ("/xe1/xa4/xb5", "LIMBU SMALL LETTER PA"); ("/xe1/xa4/xb6", "LIMBU SMALL LETTER MA"); ("/xe1/xa4/xb7", "LIMBU SMALL LETTER RA"); ("/xe1/xa4/xb8", "LIMBU SMALL LETTER LA"); ("/xe1/xb4/x80", "LATIN LETTER SMALL CAPITAL A"); ("/xe1/xb4/x81", "LATIN LETTER SMALL CAPITAL AE"); ("/xe1/xb4/x82", "LATIN SMALL LETTER TURNED AE"); ("/xe1/xb4/x83", "LATIN LETTER SMALL CAPITAL BARRED B"); ("/xe1/xb4/x84", "LATIN LETTER SMALL CAPITAL C"); ("/xe1/xb4/x85", "LATIN LETTER SMALL CAPITAL D"); ("/xe1/xb4/x86", "LATIN LETTER SMALL CAPITAL ETH"); ("/xe1/xb4/x87", "LATIN LETTER SMALL CAPITAL E"); ("/xe1/xb4/x88", "LATIN SMALL LETTER TURNED OPEN E"); ("/xe1/xb4/x89", "LATIN SMALL LETTER TURNED I"); ("/xe1/xb4/x8a", "LATIN LETTER SMALL CAPITAL J"); ("/xe1/xb4/x8b", "LATIN LETTER SMALL CAPITAL K"); ("/xe1/xb4/x8c", "LATIN LETTER SMALL CAPITAL L WITH STROKE"); ("/xe1/xb4/x8d", "LATIN LETTER SMALL CAPITAL M"); ("/xe1/xb4/x8e", "LATIN LETTER SMALL CAPITAL REVERSED N"); ("/xe1/xb4/x8f", "LATIN LETTER SMALL CAPITAL O"); ("/xe1/xb4/x90", "LATIN LETTER SMALL CAPITAL OPEN O"); ("/xe1/xb4/x91", "LATIN SMALL LETTER SIDEWAYS O"); ("/xe1/xb4/x92", "LATIN SMALL LETTER SIDEWAYS OPEN O"); ("/xe1/xb4/x93", "LATIN SMALL LETTER SIDEWAYS O WITH STROKE"); ("/xe1/xb4/x94", "LATIN SMALL LETTER TURNED OE"); ("/xe1/xb4/x95", "LATIN LETTER SMALL CAPITAL OU"); ("/xe1/xb4/x96", "LATIN SMALL LETTER TOP HALF O"); ("/xe1/xb4/x97", "LATIN SMALL LETTER BOTTOM HALF O"); ("/xe1/xb4/x98", "LATIN LETTER SMALL CAPITAL P"); ("/xe1/xb4/x99", "LATIN LETTER SMALL CAPITAL REVERSED R"); ("/xe1/xb4/x9a", "LATIN LETTER SMALL CAPITAL TURNED R"); ("/xe1/xb4/x9b", "LATIN LETTER SMALL CAPITAL T"); ("/xe1/xb4/x9c", "LATIN LETTER SMALL CAPITAL U"); ("/xe1/xb4/x9d", "LATIN SMALL LETTER SIDEWAYS U"); ("/xe1/xb4/x9e", "LATIN SMALL LETTER SIDEWAYS DIAERESIZED U"); ("/xe1/xb4/x9f", "LATIN SMALL LETTER SIDEWAYS TURNED M"); ("/xe1/xb4/xa0", "LATIN LETTER SMALL CAPITAL V"); ("/xe1/xb4/xa1", "LATIN LETTER SMALL CAPITAL W"); ("/xe1/xb4/xa2", "LATIN LETTER SMALL CAPITAL Z"); ("/xe1/xb4/xa3", "LATIN LETTER SMALL CAPITAL EZH"); ("/xe1/xb4/xa6", "GREEK LETTER SMALL CAPITAL GAMMA"); ("/xe1/xb4/xa7", "GREEK LETTER SMALL CAPITAL LAMDA"); ("/xe1/xb4/xa8", "GREEK LETTER SMALL CAPITAL PI"); ("/xe1/xb4/xa9", "GREEK LETTER SMALL CAPITAL RHO"); ("/xe1/xb4/xaa", "GREEK LETTER SMALL CAPITAL PSI"); ("/xe1/xb4/xab", "CYRILLIC LETTER SMALL CAPITAL EL"); ("/xe1/xb4/xac", "MODIFIER LETTER CAPITAL A"); ("/xe1/xb4/xad", "MODIFIER LETTER CAPITAL AE"); ("/xe1/xb4/xae", "MODIFIER LETTER CAPITAL B"); ("/xe1/xb4/xaf", "MODIFIER LETTER CAPITAL BARRED B"); ("/xe1/xb4/xb0", "MODIFIER LETTER CAPITAL D"); ("/xe1/xb4/xb1", "MODIFIER LETTER CAPITAL E"); ("/xe1/xb4/xb2", "MODIFIER LETTER CAPITAL REVERSED E"); ("/xe1/xb4/xb3", "MODIFIER LETTER CAPITAL G"); ("/xe1/xb4/xb4", "MODIFIER LETTER CAPITAL H"); ("/xe1/xb4/xb5", "MODIFIER LETTER CAPITAL I"); ("/xe1/xb4/xb6", "MODIFIER LETTER CAPITAL J"); ("/xe1/xb4/xb7", "MODIFIER LETTER CAPITAL K"); ("/xe1/xb4/xb8", "MODIFIER LETTER CAPITAL L"); ("/xe1/xb4/xb9", "MODIFIER LETTER CAPITAL M"); ("/xe1/xb4/xba", "MODIFIER LETTER CAPITAL N"); ("/xe1/xb4/xbb", "MODIFIER LETTER CAPITAL REVERSED N"); ("/xe1/xb4/xbc", "MODIFIER LETTER CAPITAL O"); ("/xe1/xb4/xbd", "MODIFIER LETTER CAPITAL OU"); ("/xe1/xb4/xbe", "MODIFIER LETTER CAPITAL P"); ("/xe1/xb4/xbf", "MODIFIER LETTER CAPITAL R"); ("/xe1/xb5/x80", "MODIFIER LETTER CAPITAL T"); ("/xe1/xb5/x81", "MODIFIER LETTER CAPITAL U"); ("/xe1/xb5/x82", "MODIFIER LETTER CAPITAL W"); ("/xe1/xb5/x83", "MODIFIER LETTER SMALL A"); ("/xe1/xb5/x84", "MODIFIER LETTER SMALL TURNED A"); ("/xe1/xb5/x85", "MODIFIER LETTER SMALL ALPHA"); ("/xe1/xb5/x86", "MODIFIER LETTER SMALL TURNED AE"); ("/xe1/xb5/x87", "MODIFIER LETTER SMALL B"); ("/xe1/xb5/x88", "MODIFIER LETTER SMALL D"); ("/xe1/xb5/x89", "MODIFIER LETTER SMALL E"); ("/xe1/xb5/x8a", "MODIFIER LETTER SMALL SCHWA"); ("/xe1/xb5/x8b", "MODIFIER LETTER SMALL OPEN E"); ("/xe1/xb5/x8c", "MODIFIER LETTER SMALL TURNED OPEN E"); ("/xe1/xb5/x8d", "MODIFIER LETTER SMALL G"); ("/xe1/xb5/x8e", "MODIFIER LETTER SMALL TURNED I"); ("/xe1/xb5/x8f", "MODIFIER LETTER SMALL K"); ("/xe1/xb5/x90", "MODIFIER LETTER SMALL M"); ("/xe1/xb5/x91", "MODIFIER LETTER SMALL ENG"); ("/xe1/xb5/x92", "MODIFIER LETTER SMALL O"); ("/xe1/xb5/x93", "MODIFIER LETTER SMALL OPEN O"); ("/xe1/xb5/x94", "MODIFIER LETTER SMALL TOP HALF O"); ("/xe1/xb5/x95", "MODIFIER LETTER SMALL BOTTOM HALF O"); ("/xe1/xb5/x96", "MODIFIER LETTER SMALL P"); ("/xe1/xb5/x97", "MODIFIER LETTER SMALL T"); ("/xe1/xb5/x98", "MODIFIER LETTER SMALL U"); ("/xe1/xb5/x99", "MODIFIER LETTER SMALL SIDEWAYS U"); ("/xe1/xb5/x9a", "MODIFIER LETTER SMALL TURNED M"); ("/xe1/xb5/x9b", "MODIFIER LETTER SMALL V"); ("/xe1/xb5/x9c", "MODIFIER LETTER SMALL AIN"); ("/xe1/xb5/x9d", "MODIFIER LETTER SMALL BETA"); ("/xe1/xb5/x9e", "MODIFIER LETTER SMALL GREEK GAMMA"); ("/xe1/xb5/x9f", "MODIFIER LETTER SMALL DELTA"); ("/xe1/xb5/xa0", "MODIFIER LETTER SMALL GREEK PHI"); ("/xe1/xb5/xa1", "MODIFIER LETTER SMALL CHI"); ("/xe1/xb5/xa2", "LATIN SUBSCRIPT SMALL LETTER I"); ("/xe1/xb5/xa3", "LATIN SUBSCRIPT SMALL LETTER R"); ("/xe1/xb5/xa4", "LATIN SUBSCRIPT SMALL LETTER U"); ("/xe1/xb5/xa5", "LATIN SUBSCRIPT SMALL LETTER V"); ("/xe1/xb5/xa6", "GREEK SUBSCRIPT SMALL LETTER BETA"); ("/xe1/xb5/xa7", "GREEK SUBSCRIPT SMALL LETTER GAMMA"); ("/xe1/xb5/xa8", "GREEK SUBSCRIPT SMALL LETTER RHO"); ("/xe1/xb5/xa9", "GREEK SUBSCRIPT SMALL LETTER PHI"); ("/xe1/xb5/xaa", "GREEK SUBSCRIPT SMALL LETTER CHI"); ("/xe1/xb5/xab", "LATIN SMALL LETTER UE"); ("/xe1/xb5/xac", "LATIN SMALL LETTER B WITH MIDDLE TILDE"); ("/xe1/xb5/xad", "LATIN SMALL LETTER D WITH MIDDLE TILDE"); ("/xe1/xb5/xae", "LATIN SMALL LETTER F WITH MIDDLE TILDE"); ("/xe1/xb5/xaf", "LATIN SMALL LETTER M WITH MIDDLE TILDE"); ("/xe1/xb5/xb0", "LATIN SMALL LETTER N WITH MIDDLE TILDE"); ("/xe1/xb5/xb1", "LATIN SMALL LETTER P WITH MIDDLE TILDE"); ("/xe1/xb5/xb2", "LATIN SMALL LETTER R WITH MIDDLE TILDE"); ("/xe1/xb5/xb3", "LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE"); ("/xe1/xb5/xb4", "LATIN SMALL LETTER S WITH MIDDLE TILDE"); ("/xe1/xb5/xb5", "LATIN SMALL LETTER T WITH MIDDLE TILDE"); ("/xe1/xb5/xb6", "LATIN SMALL LETTER Z WITH MIDDLE TILDE"); ("/xe1/xb5/xb7", "LATIN SMALL LETTER TURNED G"); ("/xe1/xb5/xb9", "LATIN SMALL LETTER INSULAR G"); ("/xe1/xb5/xba", "LATIN SMALL LETTER TH WITH STRIKETHROUGH"); ("/xe1/xb5/xbb", "LATIN SMALL CAPITAL LETTER I WITH STROKE"); ("/xe1/xb5/xbc", "LATIN SMALL LETTER IOTA WITH STROKE"); ("/xe1/xb5/xbd", "LATIN SMALL LETTER P WITH STROKE"); ("/xe1/xb5/xbe", "LATIN SMALL CAPITAL LETTER U WITH STROKE"); ("/xe1/xb5/xbf", "LATIN SMALL LETTER UPSILON WITH STROKE"); ("/xe1/xb6/x80", "LATIN SMALL LETTER B WITH PALATAL HOOK"); ("/xe1/xb6/x81", "LATIN SMALL LETTER D WITH PALATAL HOOK"); ("/xe1/xb6/x82", "LATIN SMALL LETTER F WITH PALATAL HOOK"); ("/xe1/xb6/x83", "LATIN SMALL LETTER G WITH PALATAL HOOK"); ("/xe1/xb6/x84", "LATIN SMALL LETTER K WITH PALATAL HOOK"); ("/xe1/xb6/x85", "LATIN SMALL LETTER L WITH PALATAL HOOK"); ("/xe1/xb6/x86", "LATIN SMALL LETTER M WITH PALATAL HOOK"); ("/xe1/xb6/x87", "LATIN SMALL LETTER N WITH PALATAL HOOK"); ("/xe1/xb6/x88", "LATIN SMALL LETTER P WITH PALATAL HOOK"); ("/xe1/xb6/x89", "LATIN SMALL LETTER R WITH PALATAL HOOK"); ("/xe1/xb6/x8a", "LATIN SMALL LETTER S WITH PALATAL HOOK"); ("/xe1/xb6/x8b", "LATIN SMALL LETTER ESH WITH PALATAL HOOK"); ("/xe1/xb6/x8c", "LATIN SMALL LETTER V WITH PALATAL HOOK"); ("/xe1/xb6/x8d", "LATIN SMALL LETTER X WITH PALATAL HOOK"); ("/xe1/xb6/x8e", "LATIN SMALL LETTER Z WITH PALATAL HOOK"); ("/xe1/xb6/x8f", "LATIN SMALL LETTER A WITH RETROFLEX HOOK"); ("/xe1/xb6/x90", "LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK"); ("/xe1/xb6/x91", "LATIN SMALL LETTER D WITH HOOK AND TAIL"); ("/xe1/xb6/x92", "LATIN SMALL LETTER E WITH RETROFLEX HOOK"); ("/xe1/xb6/x93", "LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK"); ("/xe1/xb6/x94", "LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK"); ("/xe1/xb6/x95", "LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK"); ("/xe1/xb6/x96", "LATIN SMALL LETTER I WITH RETROFLEX HOOK"); ("/xe1/xb6/x97", "LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK"); ("/xe1/xb6/x98", "LATIN SMALL LETTER ESH WITH RETROFLEX HOOK"); ("/xe1/xb6/x99", "LATIN SMALL LETTER U WITH RETROFLEX HOOK"); ("/xe1/xb6/x9a", "LATIN SMALL LETTER EZH WITH RETROFLEX HOOK"); ("/xe1/xb6/x9b", "MODIFIER LETTER SMALL TURNED ALPHA"); ("/xe1/xb6/x9c", "MODIFIER LETTER SMALL C"); ("/xe1/xb6/x9d", "MODIFIER LETTER SMALL C WITH CURL"); ("/xe1/xb6/x9e", "MODIFIER LETTER SMALL ETH"); ("/xe1/xb6/x9f", "MODIFIER LETTER SMALL REVERSED OPEN E"); ("/xe1/xb6/xa0", "MODIFIER LETTER SMALL F"); ("/xe1/xb6/xa1", "MODIFIER LETTER SMALL DOTLESS J WITH STROKE"); ("/xe1/xb6/xa2", "MODIFIER LETTER SMALL SCRIPT G"); ("/xe1/xb6/xa3", "MODIFIER LETTER SMALL TURNED H"); ("/xe1/xb6/xa4", "MODIFIER LETTER SMALL I WITH STROKE"); ("/xe1/xb6/xa5", "MODIFIER LETTER SMALL IOTA"); ("/xe1/xb6/xa6", "MODIFIER LETTER SMALL CAPITAL I"); ("/xe1/xb6/xa7", "MODIFIER LETTER SMALL CAPITAL I WITH STROKE"); ("/xe1/xb6/xa8", "MODIFIER LETTER SMALL J WITH CROSSED-TAIL"); ("/xe1/xb6/xa9", "MODIFIER LETTER SMALL L WITH RETROFLEX HOOK"); ("/xe1/xb6/xaa", "MODIFIER LETTER SMALL L WITH PALATAL HOOK"); ("/xe1/xb6/xab", "MODIFIER LETTER SMALL CAPITAL L"); ("/xe1/xb6/xac", "MODIFIER LETTER SMALL M WITH HOOK"); ("/xe1/xb6/xad", "MODIFIER LETTER SMALL TURNED M WITH LONG LEG"); ("/xe1/xb6/xae", "MODIFIER LETTER SMALL N WITH LEFT HOOK"); ("/xe1/xb6/xaf", "MODIFIER LETTER SMALL N WITH RETROFLEX HOOK"); ("/xe1/xb6/xb0", "MODIFIER LETTER SMALL CAPITAL N"); ("/xe1/xb6/xb1", "MODIFIER LETTER SMALL BARRED O"); ("/xe1/xb6/xb2", "MODIFIER LETTER SMALL PHI"); ("/xe1/xb6/xb3", "MODIFIER LETTER SMALL S WITH HOOK"); ("/xe1/xb6/xb4", "MODIFIER LETTER SMALL ESH"); ("/xe1/xb6/xb5", "MODIFIER LETTER SMALL T WITH PALATAL HOOK"); ("/xe1/xb6/xb6", "MODIFIER LETTER SMALL U BAR"); ("/xe1/xb6/xb7", "MODIFIER LETTER SMALL UPSILON"); ("/xe1/xb6/xb8", "MODIFIER LETTER SMALL CAPITAL U"); ("/xe1/xb6/xb9", "MODIFIER LETTER SMALL V WITH HOOK"); ("/xe1/xb6/xba", "MODIFIER LETTER SMALL TURNED V"); ("/xe1/xb6/xbb", "MODIFIER LETTER SMALL Z"); ("/xe1/xb6/xbc", "MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK"); ("/xe1/xb6/xbd", "MODIFIER LETTER SMALL Z WITH CURL"); ("/xe1/xb6/xbe", "MODIFIER LETTER SMALL EZH"); ("/xe1/xb6/xbf", "MODIFIER LETTER SMALL THETA"); ("/xe1/xb7/x8a", "COMBINING LATIN SMALL LETTER R BELOW"); ("/xe1/xb7/x93", "COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE"); ("/xe1/xb7/x94", "COMBINING LATIN SMALL LETTER AE"); ("/xe1/xb7/x95", "COMBINING LATIN SMALL LETTER AO"); ("/xe1/xb7/x96", "COMBINING LATIN SMALL LETTER AV"); ("/xe1/xb7/x97", "COMBINING LATIN SMALL LETTER C CEDILLA"); ("/xe1/xb7/x98", "COMBINING LATIN SMALL LETTER INSULAR D"); ("/xe1/xb7/x99", "COMBINING LATIN SMALL LETTER ETH"); ("/xe1/xb7/x9a", "COMBINING LATIN SMALL LETTER G"); ("/xe1/xb7/x9b", "COMBINING LATIN LETTER SMALL CAPITAL G"); ("/xe1/xb7/x9c", "COMBINING LATIN SMALL LETTER K"); ("/xe1/xb7/x9d", "COMBINING LATIN SMALL LETTER L"); ("/xe1/xb7/x9e", "COMBINING LATIN LETTER SMALL CAPITAL L"); ("/xe1/xb7/x9f", "COMBINING LATIN LETTER SMALL CAPITAL M"); ("/xe1/xb7/xa0", "COMBINING LATIN SMALL LETTER N"); ("/xe1/xb7/xa1", "COMBINING LATIN LETTER SMALL CAPITAL N"); ("/xe1/xb7/xa2", "COMBINING LATIN LETTER SMALL CAPITAL R"); ("/xe1/xb7/xa3", "COMBINING LATIN SMALL LETTER R ROTUNDA"); ("/xe1/xb7/xa4", "COMBINING LATIN SMALL LETTER S"); ("/xe1/xb7/xa5", "COMBINING LATIN SMALL LETTER LONG S"); ("/xe1/xb7/xa6", "COMBINING LATIN SMALL LETTER Z"); ("/xe1/xb8/x80", "LATIN CAPITAL LETTER A WITH RING BELOW"); ("/xe1/xb8/x81", "LATIN SMALL LETTER A WITH RING BELOW"); ("/xe1/xb8/x82", "LATIN CAPITAL LETTER B WITH DOT ABOVE"); ("/xe1/xb8/x83", "LATIN SMALL LETTER B WITH DOT ABOVE"); ("/xe1/xb8/x84", "LATIN CAPITAL LETTER B WITH DOT BELOW"); ("/xe1/xb8/x85", "LATIN SMALL LETTER B WITH DOT BELOW"); ("/xe1/xb8/x86", "LATIN CAPITAL LETTER B WITH LINE BELOW"); ("/xe1/xb8/x87", "LATIN SMALL LETTER B WITH LINE BELOW"); ("/xe1/xb8/x88", "LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE"); ("/xe1/xb8/x89", "LATIN SMALL LETTER C WITH CEDILLA AND ACUTE"); ("/xe1/xb8/x8a", "LATIN CAPITAL LETTER D WITH DOT ABOVE"); ("/xe1/xb8/x8b", "LATIN SMALL LETTER D WITH DOT ABOVE"); ("/xe1/xb8/x8c", "LATIN CAPITAL LETTER D WITH DOT BELOW"); ("/xe1/xb8/x8d", "LATIN SMALL LETTER D WITH DOT BELOW"); ("/xe1/xb8/x8e", "LATIN CAPITAL LETTER D WITH LINE BELOW"); ("/xe1/xb8/x8f", "LATIN SMALL LETTER D WITH LINE BELOW"); ("/xe1/xb8/x90", "LATIN CAPITAL LETTER D WITH CEDILLA"); ("/xe1/xb8/x91", "LATIN SMALL LETTER D WITH CEDILLA"); ("/xe1/xb8/x92", "LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW"); ("/xe1/xb8/x93", "LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW"); ("/xe1/xb8/x94", "LATIN CAPITAL LETTER E WITH MACRON AND GRAVE"); ("/xe1/xb8/x95", "LATIN SMALL LETTER E WITH MACRON AND GRAVE"); ("/xe1/xb8/x96", "LATIN CAPITAL LETTER E WITH MACRON AND ACUTE"); ("/xe1/xb8/x97", "LATIN SMALL LETTER E WITH MACRON AND ACUTE"); ("/xe1/xb8/x98", "LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW"); ("/xe1/xb8/x99", "LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW"); ("/xe1/xb8/x9a", "LATIN CAPITAL LETTER E WITH TILDE BELOW"); ("/xe1/xb8/x9b", "LATIN SMALL LETTER E WITH TILDE BELOW"); ("/xe1/xb8/x9c", "LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE"); ("/xe1/xb8/x9d", "LATIN SMALL LETTER E WITH CEDILLA AND BREVE"); ("/xe1/xb8/x9e", "LATIN CAPITAL LETTER F WITH DOT ABOVE"); ("/xe1/xb8/x9f", "LATIN SMALL LETTER F WITH DOT ABOVE"); ("/xe1/xb8/xa0", "LATIN CAPITAL LETTER G WITH MACRON"); ("/xe1/xb8/xa1", "LATIN SMALL LETTER G WITH MACRON"); ("/xe1/xb8/xa2", "LATIN CAPITAL LETTER H WITH DOT ABOVE"); ("/xe1/xb8/xa3", "LATIN SMALL LETTER H WITH DOT ABOVE"); ("/xe1/xb8/xa4", "LATIN CAPITAL LETTER H WITH DOT BELOW"); ("/xe1/xb8/xa5", "LATIN SMALL LETTER H WITH DOT BELOW"); ("/xe1/xb8/xa6", "LATIN CAPITAL LETTER H WITH DIAERESIS"); ("/xe1/xb8/xa7", "LATIN SMALL LETTER H WITH DIAERESIS"); ("/xe1/xb8/xa8", "LATIN CAPITAL LETTER H WITH CEDILLA"); ("/xe1/xb8/xa9", "LATIN SMALL LETTER H WITH CEDILLA"); ("/xe1/xb8/xaa", "LATIN CAPITAL LETTER H WITH BREVE BELOW"); ("/xe1/xb8/xab", "LATIN SMALL LETTER H WITH BREVE BELOW"); ("/xe1/xb8/xac", "LATIN CAPITAL LETTER I WITH TILDE BELOW"); ("/xe1/xb8/xad", "LATIN SMALL LETTER I WITH TILDE BELOW"); ("/xe1/xb8/xae", "LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE"); ("/xe1/xb8/xaf", "LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE"); ("/xe1/xb8/xb0", "LATIN CAPITAL LETTER K WITH ACUTE"); ("/xe1/xb8/xb1", "LATIN SMALL LETTER K WITH ACUTE"); ("/xe1/xb8/xb2", "LATIN CAPITAL LETTER K WITH DOT BELOW"); ("/xe1/xb8/xb3", "LATIN SMALL LETTER K WITH DOT BELOW"); ("/xe1/xb8/xb4", "LATIN CAPITAL LETTER K WITH LINE BELOW"); ("/xe1/xb8/xb5", "LATIN SMALL LETTER K WITH LINE BELOW"); ("/xe1/xb8/xb6", "LATIN CAPITAL LETTER L WITH DOT BELOW"); ("/xe1/xb8/xb7", "LATIN SMALL LETTER L WITH DOT BELOW"); ("/xe1/xb8/xb8", "LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON"); ("/xe1/xb8/xb9", "LATIN SMALL LETTER L WITH DOT BELOW AND MACRON"); ("/xe1/xb8/xba", "LATIN CAPITAL LETTER L WITH LINE BELOW"); ("/xe1/xb8/xbb", "LATIN SMALL LETTER L WITH LINE BELOW"); ("/xe1/xb8/xbc", "LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW"); ("/xe1/xb8/xbd", "LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW"); ("/xe1/xb8/xbe", "LATIN CAPITAL LETTER M WITH ACUTE"); ("/xe1/xb8/xbf", "LATIN SMALL LETTER M WITH ACUTE"); ("/xe1/xb9/x80", "LATIN CAPITAL LETTER M WITH DOT ABOVE"); ("/xe1/xb9/x81", "LATIN SMALL LETTER M WITH DOT ABOVE"); ("/xe1/xb9/x82", "LATIN CAPITAL LETTER M WITH DOT BELOW"); ("/xe1/xb9/x83", "LATIN SMALL LETTER M WITH DOT BELOW"); ("/xe1/xb9/x84", "LATIN CAPITAL LETTER N WITH DOT ABOVE"); ("/xe1/xb9/x85", "LATIN SMALL LETTER N WITH DOT ABOVE"); ("/xe1/xb9/x86", "LATIN CAPITAL LETTER N WITH DOT BELOW"); ("/xe1/xb9/x87", "LATIN SMALL LETTER N WITH DOT BELOW"); ("/xe1/xb9/x88", "LATIN CAPITAL LETTER N WITH LINE BELOW"); ("/xe1/xb9/x89", "LATIN SMALL LETTER N WITH LINE BELOW"); ("/xe1/xb9/x8a", "LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW"); ("/xe1/xb9/x8b", "LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW"); ("/xe1/xb9/x8c", "LATIN CAPITAL LETTER O WITH TILDE AND ACUTE"); ("/xe1/xb9/x8d", "LATIN SMALL LETTER O WITH TILDE AND ACUTE"); ("/xe1/xb9/x8e", "LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS"); ("/xe1/xb9/x8f", "LATIN SMALL LETTER O WITH TILDE AND DIAERESIS"); ("/xe1/xb9/x90", "LATIN CAPITAL LETTER O WITH MACRON AND GRAVE"); ("/xe1/xb9/x91", "LATIN SMALL LETTER O WITH MACRON AND GRAVE"); ("/xe1/xb9/x92", "LATIN CAPITAL LETTER O WITH MACRON AND ACUTE"); ("/xe1/xb9/x93", "LATIN SMALL LETTER O WITH MACRON AND ACUTE"); ("/xe1/xb9/x94", "LATIN CAPITAL LETTER P WITH ACUTE"); ("/xe1/xb9/x95", "LATIN SMALL LETTER P WITH ACUTE"); ("/xe1/xb9/x96", "LATIN CAPITAL LETTER P WITH DOT ABOVE"); ("/xe1/xb9/x97", "LATIN SMALL LETTER P WITH DOT ABOVE"); ("/xe1/xb9/x98", "LATIN CAPITAL LETTER R WITH DOT ABOVE"); ("/xe1/xb9/x99", "LATIN SMALL LETTER R WITH DOT ABOVE"); ("/xe1/xb9/x9a", "LATIN CAPITAL LETTER R WITH DOT BELOW"); ("/xe1/xb9/x9b", "LATIN SMALL LETTER R WITH DOT BELOW"); ("/xe1/xb9/x9c", "LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON"); ("/xe1/xb9/x9d", "LATIN SMALL LETTER R WITH DOT BELOW AND MACRON"); ("/xe1/xb9/x9e", "LATIN CAPITAL LETTER R WITH LINE BELOW"); ("/xe1/xb9/x9f", "LATIN SMALL LETTER R WITH LINE BELOW"); ("/xe1/xb9/xa0", "LATIN CAPITAL LETTER S WITH DOT ABOVE"); ("/xe1/xb9/xa1", "LATIN SMALL LETTER S WITH DOT ABOVE"); ("/xe1/xb9/xa2", "LATIN CAPITAL LETTER S WITH DOT BELOW"); ("/xe1/xb9/xa3", "LATIN SMALL LETTER S WITH DOT BELOW"); ("/xe1/xb9/xa4", "LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE"); ("/xe1/xb9/xa5", "LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE"); ("/xe1/xb9/xa6", "LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE"); ("/xe1/xb9/xa7", "LATIN SMALL LETTER S WITH CARON AND DOT ABOVE"); ("/xe1/xb9/xa8", "LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE"); ("/xe1/xb9/xa9", "LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE"); ("/xe1/xb9/xaa", "LATIN CAPITAL LETTER T WITH DOT ABOVE"); ("/xe1/xb9/xab", "LATIN SMALL LETTER T WITH DOT ABOVE"); ("/xe1/xb9/xac", "LATIN CAPITAL LETTER T WITH DOT BELOW"); ("/xe1/xb9/xad", "LATIN SMALL LETTER T WITH DOT BELOW"); ("/xe1/xb9/xae", "LATIN CAPITAL LETTER T WITH LINE BELOW"); ("/xe1/xb9/xaf", "LATIN SMALL LETTER T WITH LINE BELOW"); ("/xe1/xb9/xb0", "LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW"); ("/xe1/xb9/xb1", "LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW"); ("/xe1/xb9/xb2", "LATIN CAPITAL LETTER U WITH DIAERESIS BELOW"); ("/xe1/xb9/xb3", "LATIN SMALL LETTER U WITH DIAERESIS BELOW"); ("/xe1/xb9/xb4", "LATIN CAPITAL LETTER U WITH TILDE BELOW"); ("/xe1/xb9/xb5", "LATIN SMALL LETTER U WITH TILDE BELOW"); ("/xe1/xb9/xb6", "LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW"); ("/xe1/xb9/xb7", "LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW"); ("/xe1/xb9/xb8", "LATIN CAPITAL LETTER U WITH TILDE AND ACUTE"); ("/xe1/xb9/xb9", "LATIN SMALL LETTER U WITH TILDE AND ACUTE"); ("/xe1/xb9/xba", "LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS"); ("/xe1/xb9/xbb", "LATIN SMALL LETTER U WITH MACRON AND DIAERESIS"); ("/xe1/xb9/xbc", "LATIN CAPITAL LETTER V WITH TILDE"); ("/xe1/xb9/xbd", "LATIN SMALL LETTER V WITH TILDE"); ("/xe1/xb9/xbe", "LATIN CAPITAL LETTER V WITH DOT BELOW"); ("/xe1/xb9/xbf", "LATIN SMALL LETTER V WITH DOT BELOW"); ("/xe1/xba/x80", "LATIN CAPITAL LETTER W WITH GRAVE"); ("/xe1/xba/x81", "LATIN SMALL LETTER W WITH GRAVE"); ("/xe1/xba/x82", "LATIN CAPITAL LETTER W WITH ACUTE"); ("/xe1/xba/x83", "LATIN SMALL LETTER W WITH ACUTE"); ("/xe1/xba/x84", "LATIN CAPITAL LETTER W WITH DIAERESIS"); ("/xe1/xba/x85", "LATIN SMALL LETTER W WITH DIAERESIS"); ("/xe1/xba/x86", "LATIN CAPITAL LETTER W WITH DOT ABOVE"); ("/xe1/xba/x87", "LATIN SMALL LETTER W WITH DOT ABOVE"); ("/xe1/xba/x88", "LATIN CAPITAL LETTER W WITH DOT BELOW"); ("/xe1/xba/x89", "LATIN SMALL LETTER W WITH DOT BELOW"); ("/xe1/xba/x8a", "LATIN CAPITAL LETTER X WITH DOT ABOVE"); ("/xe1/xba/x8b", "LATIN SMALL LETTER X WITH DOT ABOVE"); ("/xe1/xba/x8c", "LATIN CAPITAL LETTER X WITH DIAERESIS"); ("/xe1/xba/x8d", "LATIN SMALL LETTER X WITH DIAERESIS"); ("/xe1/xba/x8e", "LATIN CAPITAL LETTER Y WITH DOT ABOVE"); ("/xe1/xba/x8f", "LATIN SMALL LETTER Y WITH DOT ABOVE"); ("/xe1/xba/x90", "LATIN CAPITAL LETTER Z WITH CIRCUMFLEX"); ("/xe1/xba/x91", "LATIN SMALL LETTER Z WITH CIRCUMFLEX"); ("/xe1/xba/x92", "LATIN CAPITAL LETTER Z WITH DOT BELOW"); ("/xe1/xba/x93", "LATIN SMALL LETTER Z WITH DOT BELOW"); ("/xe1/xba/x94", "LATIN CAPITAL LETTER Z WITH LINE BELOW"); ("/xe1/xba/x95", "LATIN SMALL LETTER Z WITH LINE BELOW"); ("/xe1/xba/x96", "LATIN SMALL LETTER H WITH LINE BELOW"); ("/xe1/xba/x97", "LATIN SMALL LETTER T WITH DIAERESIS"); ("/xe1/xba/x98", "LATIN SMALL LETTER W WITH RING ABOVE"); ("/xe1/xba/x99", "LATIN SMALL LETTER Y WITH RING ABOVE"); ("/xe1/xba/x9a", "LATIN SMALL LETTER A WITH RIGHT HALF RING"); ("/xe1/xba/x9b", "LATIN SMALL LETTER LONG S WITH DOT ABOVE"); ("/xe1/xba/x9c", "LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE"); ("/xe1/xba/x9d", "LATIN SMALL LETTER LONG S WITH HIGH STROKE"); ("/xe1/xba/x9e", "LATIN CAPITAL LETTER SHARP S"); ("/xe1/xba/x9f", "LATIN SMALL LETTER DELTA"); ("/xe1/xba/xa0", "LATIN CAPITAL LETTER A WITH DOT BELOW"); ("/xe1/xba/xa1", "LATIN SMALL LETTER A WITH DOT BELOW"); ("/xe1/xba/xa2", "LATIN CAPITAL LETTER A WITH HOOK ABOVE"); ("/xe1/xba/xa3", "LATIN SMALL LETTER A WITH HOOK ABOVE"); ("/xe1/xba/xa4", "LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE"); ("/xe1/xba/xa5", "LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE"); ("/xe1/xba/xa6", "LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE"); ("/xe1/xba/xa7", "LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE"); ("/xe1/xba/xa8", "LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE"); ("/xe1/xba/xa9", "LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE"); ("/xe1/xba/xaa", "LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE"); ("/xe1/xba/xab", "LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE"); ("/xe1/xba/xac", "LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW"); ("/xe1/xba/xad", "LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW"); ("/xe1/xba/xae", "LATIN CAPITAL LETTER A WITH BREVE AND ACUTE"); ("/xe1/xba/xaf", "LATIN SMALL LETTER A WITH BREVE AND ACUTE"); ("/xe1/xba/xb0", "LATIN CAPITAL LETTER A WITH BREVE AND GRAVE"); ("/xe1/xba/xb1", "LATIN SMALL LETTER A WITH BREVE AND GRAVE"); ("/xe1/xba/xb2", "LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE"); ("/xe1/xba/xb3", "LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE"); ("/xe1/xba/xb4", "LATIN CAPITAL LETTER A WITH BREVE AND TILDE"); ("/xe1/xba/xb5", "LATIN SMALL LETTER A WITH BREVE AND TILDE"); ("/xe1/xba/xb6", "LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW"); ("/xe1/xba/xb7", "LATIN SMALL LETTER A WITH BREVE AND DOT BELOW"); ("/xe1/xba/xb8", "LATIN CAPITAL LETTER E WITH DOT BELOW"); ("/xe1/xba/xb9", "LATIN SMALL LETTER E WITH DOT BELOW"); ("/xe1/xba/xba", "LATIN CAPITAL LETTER E WITH HOOK ABOVE"); ("/xe1/xba/xbb", "LATIN SMALL LETTER E WITH HOOK ABOVE"); ("/xe1/xba/xbc", "LATIN CAPITAL LETTER E WITH TILDE"); ("/xe1/xba/xbd", "LATIN SMALL LETTER E WITH TILDE"); ("/xe1/xba/xbe", "LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE"); ("/xe1/xba/xbf", "LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE"); ("/xe1/xbb/x80", "LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE"); ("/xe1/xbb/x81", "LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE"); ("/xe1/xbb/x82", "LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE"); ("/xe1/xbb/x83", "LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE"); ("/xe1/xbb/x84", "LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE"); ("/xe1/xbb/x85", "LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE"); ("/xe1/xbb/x86", "LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW"); ("/xe1/xbb/x87", "LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW"); ("/xe1/xbb/x88", "LATIN CAPITAL LETTER I WITH HOOK ABOVE"); ("/xe1/xbb/x89", "LATIN SMALL LETTER I WITH HOOK ABOVE"); ("/xe1/xbb/x8a", "LATIN CAPITAL LETTER I WITH DOT BELOW"); ("/xe1/xbb/x8b", "LATIN SMALL LETTER I WITH DOT BELOW"); ("/xe1/xbb/x8c", "LATIN CAPITAL LETTER O WITH DOT BELOW"); ("/xe1/xbb/x8d", "LATIN SMALL LETTER O WITH DOT BELOW"); ("/xe1/xbb/x8e", "LATIN CAPITAL LETTER O WITH HOOK ABOVE"); ("/xe1/xbb/x8f", "LATIN SMALL LETTER O WITH HOOK ABOVE"); ("/xe1/xbb/x90", "LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE"); ("/xe1/xbb/x91", "LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE"); ("/xe1/xbb/x92", "LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE"); ("/xe1/xbb/x93", "LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE"); ("/xe1/xbb/x94", "LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE"); ("/xe1/xbb/x95", "LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE"); ("/xe1/xbb/x96", "LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE"); ("/xe1/xbb/x97", "LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE"); ("/xe1/xbb/x98", "LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW"); ("/xe1/xbb/x99", "LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW"); ("/xe1/xbb/x9a", "LATIN CAPITAL LETTER O WITH HORN AND ACUTE"); ("/xe1/xbb/x9b", "LATIN SMALL LETTER O WITH HORN AND ACUTE"); ("/xe1/xbb/x9c", "LATIN CAPITAL LETTER O WITH HORN AND GRAVE"); ("/xe1/xbb/x9d", "LATIN SMALL LETTER O WITH HORN AND GRAVE"); ("/xe1/xbb/x9e", "LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE"); ("/xe1/xbb/x9f", "LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE"); ("/xe1/xbb/xa0", "LATIN CAPITAL LETTER O WITH HORN AND TILDE"); ("/xe1/xbb/xa1", "LATIN SMALL LETTER O WITH HORN AND TILDE"); ("/xe1/xbb/xa2", "LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW"); ("/xe1/xbb/xa3", "LATIN SMALL LETTER O WITH HORN AND DOT BELOW"); ("/xe1/xbb/xa4", "LATIN CAPITAL LETTER U WITH DOT BELOW"); ("/xe1/xbb/xa5", "LATIN SMALL LETTER U WITH DOT BELOW"); ("/xe1/xbb/xa6", "LATIN CAPITAL LETTER U WITH HOOK ABOVE"); ("/xe1/xbb/xa7", "LATIN SMALL LETTER U WITH HOOK ABOVE"); ("/xe1/xbb/xa8", "LATIN CAPITAL LETTER U WITH HORN AND ACUTE"); ("/xe1/xbb/xa9", "LATIN SMALL LETTER U WITH HORN AND ACUTE"); ("/xe1/xbb/xaa", "LATIN CAPITAL LETTER U WITH HORN AND GRAVE"); ("/xe1/xbb/xab", "LATIN SMALL LETTER U WITH HORN AND GRAVE"); ("/xe1/xbb/xac", "LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE"); ("/xe1/xbb/xad", "LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE"); ("/xe1/xbb/xae", "LATIN CAPITAL LETTER U WITH HORN AND TILDE"); ("/xe1/xbb/xaf", "LATIN SMALL LETTER U WITH HORN AND TILDE"); ("/xe1/xbb/xb0", "LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW"); ("/xe1/xbb/xb1", "LATIN SMALL LETTER U WITH HORN AND DOT BELOW"); ("/xe1/xbb/xb2", "LATIN CAPITAL LETTER Y WITH GRAVE"); ("/xe1/xbb/xb3", "LATIN SMALL LETTER Y WITH GRAVE"); ("/xe1/xbb/xb4", "LATIN CAPITAL LETTER Y WITH DOT BELOW"); ("/xe1/xbb/xb5", "LATIN SMALL LETTER Y WITH DOT BELOW"); ("/xe1/xbb/xb6", "LATIN CAPITAL LETTER Y WITH HOOK ABOVE"); ("/xe1/xbb/xb7", "LATIN SMALL LETTER Y WITH HOOK ABOVE"); ("/xe1/xbb/xb8", "LATIN CAPITAL LETTER Y WITH TILDE"); ("/xe1/xbb/xb9", "LATIN SMALL LETTER Y WITH TILDE"); ("/xe1/xbb/xba", "LATIN CAPITAL LETTER MIDDLE-WELSH LL"); ("/xe1/xbb/xbb", "LATIN SMALL LETTER MIDDLE-WELSH LL"); ("/xe1/xbb/xbc", "LATIN CAPITAL LETTER MIDDLE-WELSH V"); ("/xe1/xbb/xbd", "LATIN SMALL LETTER MIDDLE-WELSH V"); ("/xe1/xbb/xbe", "LATIN CAPITAL LETTER Y WITH LOOP"); ("/xe1/xbb/xbf", "LATIN SMALL LETTER Y WITH LOOP"); ("/xe1/xbc/x80", "GREEK SMALL LETTER ALPHA WITH PSILI"); ("/xe1/xbc/x81", "GREEK SMALL LETTER ALPHA WITH DASIA"); ("/xe1/xbc/x82", "GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA"); ("/xe1/xbc/x83", "GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA"); ("/xe1/xbc/x84", "GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA"); ("/xe1/xbc/x85", "GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA"); ("/xe1/xbc/x86", "GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI"); ("/xe1/xbc/x87", "GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI"); ("/xe1/xbc/x88", "GREEK CAPITAL LETTER ALPHA WITH PSILI"); ("/xe1/xbc/x89", "GREEK CAPITAL LETTER ALPHA WITH DASIA"); ("/xe1/xbc/x8a", "GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA"); ("/xe1/xbc/x8b", "GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA"); ("/xe1/xbc/x8c", "GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA"); ("/xe1/xbc/x8d", "GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA"); ("/xe1/xbc/x8e", "GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI"); ("/xe1/xbc/x8f", "GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI"); ("/xe1/xbc/x90", "GREEK SMALL LETTER EPSILON WITH PSILI"); ("/xe1/xbc/x91", "GREEK SMALL LETTER EPSILON WITH DASIA"); ("/xe1/xbc/x92", "GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA"); ("/xe1/xbc/x93", "GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA"); ("/xe1/xbc/x94", "GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA"); ("/xe1/xbc/x95", "GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA"); ("/xe1/xbc/x98", "GREEK CAPITAL LETTER EPSILON WITH PSILI"); ("/xe1/xbc/x99", "GREEK CAPITAL LETTER EPSILON WITH DASIA"); ("/xe1/xbc/x9a", "GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA"); ("/xe1/xbc/x9b", "GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA"); ("/xe1/xbc/x9c", "GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA"); ("/xe1/xbc/x9d", "GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA"); ("/xe1/xbc/xa0", "GREEK SMALL LETTER ETA WITH PSILI"); ("/xe1/xbc/xa1", "GREEK SMALL LETTER ETA WITH DASIA"); ("/xe1/xbc/xa2", "GREEK SMALL LETTER ETA WITH PSILI AND VARIA"); ("/xe1/xbc/xa3", "GREEK SMALL LETTER ETA WITH DASIA AND VARIA"); ("/xe1/xbc/xa4", "GREEK SMALL LETTER ETA WITH PSILI AND OXIA"); ("/xe1/xbc/xa5", "GREEK SMALL LETTER ETA WITH DASIA AND OXIA"); ("/xe1/xbc/xa6", "GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI"); ("/xe1/xbc/xa7", "GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI"); ("/xe1/xbc/xa8", "GREEK CAPITAL LETTER ETA WITH PSILI"); ("/xe1/xbc/xa9", "GREEK CAPITAL LETTER ETA WITH DASIA"); ("/xe1/xbc/xaa", "GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA"); ("/xe1/xbc/xab", "GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA"); ("/xe1/xbc/xac", "GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA"); ("/xe1/xbc/xad", "GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA"); ("/xe1/xbc/xae", "GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI"); ("/xe1/xbc/xaf", "GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI"); ("/xe1/xbc/xb0", "GREEK SMALL LETTER IOTA WITH PSILI"); ("/xe1/xbc/xb1", "GREEK SMALL LETTER IOTA WITH DASIA"); ("/xe1/xbc/xb2", "GREEK SMALL LETTER IOTA WITH PSILI AND VARIA"); ("/xe1/xbc/xb3", "GREEK SMALL LETTER IOTA WITH DASIA AND VARIA"); ("/xe1/xbc/xb4", "GREEK SMALL LETTER IOTA WITH PSILI AND OXIA"); ("/xe1/xbc/xb5", "GREEK SMALL LETTER IOTA WITH DASIA AND OXIA"); ("/xe1/xbc/xb6", "GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI"); ("/xe1/xbc/xb7", "GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI"); ("/xe1/xbc/xb8", "GREEK CAPITAL LETTER IOTA WITH PSILI"); ("/xe1/xbc/xb9", "GREEK CAPITAL LETTER IOTA WITH DASIA"); ("/xe1/xbc/xba", "GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA"); ("/xe1/xbc/xbb", "GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA"); ("/xe1/xbc/xbc", "GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA"); ("/xe1/xbc/xbd", "GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA"); ("/xe1/xbc/xbe", "GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI"); ("/xe1/xbc/xbf", "GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI"); ("/xe1/xbd/x80", "GREEK SMALL LETTER OMICRON WITH PSILI"); ("/xe1/xbd/x81", "GREEK SMALL LETTER OMICRON WITH DASIA"); ("/xe1/xbd/x82", "GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA"); ("/xe1/xbd/x83", "GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA"); ("/xe1/xbd/x84", "GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA"); ("/xe1/xbd/x85", "GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA"); ("/xe1/xbd/x88", "GREEK CAPITAL LETTER OMICRON WITH PSILI"); ("/xe1/xbd/x89", "GREEK CAPITAL LETTER OMICRON WITH DASIA"); ("/xe1/xbd/x8a", "GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA"); ("/xe1/xbd/x8b", "GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA"); ("/xe1/xbd/x8c", "GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA"); ("/xe1/xbd/x8d", "GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA"); ("/xe1/xbd/x90", "GREEK SMALL LETTER UPSILON WITH PSILI"); ("/xe1/xbd/x91", "GREEK SMALL LETTER UPSILON WITH DASIA"); ("/xe1/xbd/x92", "GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA"); ("/xe1/xbd/x93", "GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA"); ("/xe1/xbd/x94", "GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA"); ("/xe1/xbd/x95", "GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA"); ("/xe1/xbd/x96", "GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI"); ("/xe1/xbd/x97", "GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI"); ("/xe1/xbd/x99", "GREEK CAPITAL LETTER UPSILON WITH DASIA"); ("/xe1/xbd/x9b", "GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA"); ("/xe1/xbd/x9d", "GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA"); ("/xe1/xbd/x9f", "GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI"); ("/xe1/xbd/xa0", "GREEK SMALL LETTER OMEGA WITH PSILI"); ("/xe1/xbd/xa1", "GREEK SMALL LETTER OMEGA WITH DASIA"); ("/xe1/xbd/xa2", "GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA"); ("/xe1/xbd/xa3", "GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA"); ("/xe1/xbd/xa4", "GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA"); ("/xe1/xbd/xa5", "GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA"); ("/xe1/xbd/xa6", "GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI"); ("/xe1/xbd/xa7", "GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI"); ("/xe1/xbd/xa8", "GREEK CAPITAL LETTER OMEGA WITH PSILI"); ("/xe1/xbd/xa9", "GREEK CAPITAL LETTER OMEGA WITH DASIA"); ("/xe1/xbd/xaa", "GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA"); ("/xe1/xbd/xab", "GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA"); ("/xe1/xbd/xac", "GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA"); ("/xe1/xbd/xad", "GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA"); ("/xe1/xbd/xae", "GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI"); ("/xe1/xbd/xaf", "GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI"); ("/xe1/xbd/xb0", "GREEK SMALL LETTER ALPHA WITH VARIA"); ("/xe1/xbd/xb1", "GREEK SMALL LETTER ALPHA WITH OXIA"); ("/xe1/xbd/xb2", "GREEK SMALL LETTER EPSILON WITH VARIA"); ("/xe1/xbd/xb3", "GREEK SMALL LETTER EPSILON WITH OXIA"); ("/xe1/xbd/xb4", "GREEK SMALL LETTER ETA WITH VARIA"); ("/xe1/xbd/xb5", "GREEK SMALL LETTER ETA WITH OXIA"); ("/xe1/xbd/xb6", "GREEK SMALL LETTER IOTA WITH VARIA"); ("/xe1/xbd/xb7", "GREEK SMALL LETTER IOTA WITH OXIA"); ("/xe1/xbd/xb8", "GREEK SMALL LETTER OMICRON WITH VARIA"); ("/xe1/xbd/xb9", "GREEK SMALL LETTER OMICRON WITH OXIA"); ("/xe1/xbd/xba", "GREEK SMALL LETTER UPSILON WITH VARIA"); ("/xe1/xbd/xbb", "GREEK SMALL LETTER UPSILON WITH OXIA"); ("/xe1/xbd/xbc", "GREEK SMALL LETTER OMEGA WITH VARIA"); ("/xe1/xbd/xbd", "GREEK SMALL LETTER OMEGA WITH OXIA"); ("/xe1/xbe/x80", "GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI"); ("/xe1/xbe/x81", "GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI"); ("/xe1/xbe/x82", "GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI"); ("/xe1/xbe/x83", "GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI"); ("/xe1/xbe/x84", "GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI"); ("/xe1/xbe/x85", "GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI"); ("/xe1/xbe/x86", "GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI"); ("/xe1/xbe/x87", "GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI"); ("/xe1/xbe/x88", "GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI"); ("/xe1/xbe/x89", "GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI"); ("/xe1/xbe/x8a", "GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI"); ("/xe1/xbe/x8b", "GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI"); ("/xe1/xbe/x8c", "GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI"); ("/xe1/xbe/x8d", "GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI"); ("/xe1/xbe/x8e", "GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI"); ("/xe1/xbe/x8f", "GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI"); ("/xe1/xbe/x90", "GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI"); ("/xe1/xbe/x91", "GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI"); ("/xe1/xbe/x92", "GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI"); ("/xe1/xbe/x93", "GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI"); ("/xe1/xbe/x94", "GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI"); ("/xe1/xbe/x95", "GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI"); ("/xe1/xbe/x96", "GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI"); ("/xe1/xbe/x97", "GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI"); ("/xe1/xbe/x98", "GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI"); ("/xe1/xbe/x99", "GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI"); ("/xe1/xbe/x9a", "GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI"); ("/xe1/xbe/x9b", "GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI"); ("/xe1/xbe/x9c", "GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI"); ("/xe1/xbe/x9d", "GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI"); ("/xe1/xbe/x9e", "GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI"); ("/xe1/xbe/x9f", "GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI"); ("/xe1/xbe/xa0", "GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI"); ("/xe1/xbe/xa1", "GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI"); ("/xe1/xbe/xa2", "GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI"); ("/xe1/xbe/xa3", "GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI"); ("/xe1/xbe/xa4", "GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI"); ("/xe1/xbe/xa5", "GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI"); ("/xe1/xbe/xa6", "GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI"); ("/xe1/xbe/xa7", "GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI"); ("/xe1/xbe/xa8", "GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI"); ("/xe1/xbe/xa9", "GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI"); ("/xe1/xbe/xaa", "GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI"); ("/xe1/xbe/xab", "GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI"); ("/xe1/xbe/xac", "GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI"); ("/xe1/xbe/xad", "GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI"); ("/xe1/xbe/xae", "GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI"); ("/xe1/xbe/xaf", "GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI"); ("/xe1/xbe/xb0", "GREEK SMALL LETTER ALPHA WITH VRACHY"); ("/xe1/xbe/xb1", "GREEK SMALL LETTER ALPHA WITH MACRON"); ("/xe1/xbe/xb2", "GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI"); ("/xe1/xbe/xb3", "GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI"); ("/xe1/xbe/xb4", "GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI"); ("/xe1/xbe/xb6", "GREEK SMALL LETTER ALPHA WITH PERISPOMENI"); ("/xe1/xbe/xb7", "GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI"); ("/xe1/xbe/xb8", "GREEK CAPITAL LETTER ALPHA WITH VRACHY"); ("/xe1/xbe/xb9", "GREEK CAPITAL LETTER ALPHA WITH MACRON"); ("/xe1/xbe/xba", "GREEK CAPITAL LETTER ALPHA WITH VARIA"); ("/xe1/xbe/xbb", "GREEK CAPITAL LETTER ALPHA WITH OXIA"); ("/xe1/xbe/xbc", "GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI"); ("/xe1/xbf/x82", "GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI"); ("/xe1/xbf/x83", "GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI"); ("/xe1/xbf/x84", "GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI"); ("/xe1/xbf/x86", "GREEK SMALL LETTER ETA WITH PERISPOMENI"); ("/xe1/xbf/x87", "GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI"); ("/xe1/xbf/x88", "GREEK CAPITAL LETTER EPSILON WITH VARIA"); ("/xe1/xbf/x89", "GREEK CAPITAL LETTER EPSILON WITH OXIA"); ("/xe1/xbf/x8a", "GREEK CAPITAL LETTER ETA WITH VARIA"); ("/xe1/xbf/x8b", "GREEK CAPITAL LETTER ETA WITH OXIA"); ("/xe1/xbf/x8c", "GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI"); ("/xe1/xbf/x90", "GREEK SMALL LETTER IOTA WITH VRACHY"); ("/xe1/xbf/x91", "GREEK SMALL LETTER IOTA WITH MACRON"); ("/xe1/xbf/x92", "GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA"); ("/xe1/xbf/x93", "GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA"); ("/xe1/xbf/x96", "GREEK SMALL LETTER IOTA WITH PERISPOMENI"); ("/xe1/xbf/x97", "GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI"); ("/xe1/xbf/x98", "GREEK CAPITAL LETTER IOTA WITH VRACHY"); ("/xe1/xbf/x99", "GREEK CAPITAL LETTER IOTA WITH MACRON"); ("/xe1/xbf/x9a", "GREEK CAPITAL LETTER IOTA WITH VARIA"); ("/xe1/xbf/x9b", "GREEK CAPITAL LETTER IOTA WITH OXIA"); ("/xe1/xbf/xa0", "GREEK SMALL LETTER UPSILON WITH VRACHY"); ("/xe1/xbf/xa1", "GREEK SMALL LETTER UPSILON WITH MACRON"); ("/xe1/xbf/xa2", "GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA"); ("/xe1/xbf/xa3", "GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA"); ("/xe1/xbf/xa4", "GREEK SMALL LETTER RHO WITH PSILI"); ("/xe1/xbf/xa5", "GREEK SMALL LETTER RHO WITH DASIA"); ("/xe1/xbf/xa6", "GREEK SMALL LETTER UPSILON WITH PERISPOMENI"); ("/xe1/xbf/xa7", "GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI"); ("/xe1/xbf/xa8", "GREEK CAPITAL LETTER UPSILON WITH VRACHY"); ("/xe1/xbf/xa9", "GREEK CAPITAL LETTER UPSILON WITH MACRON"); ("/xe1/xbf/xaa", "GREEK CAPITAL LETTER UPSILON WITH VARIA"); ("/xe1/xbf/xab", "GREEK CAPITAL LETTER UPSILON WITH OXIA"); ("/xe1/xbf/xac", "GREEK CAPITAL LETTER RHO WITH DASIA"); ("/xe1/xbf/xb2", "GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI"); ("/xe1/xbf/xb3", "GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI"); ("/xe1/xbf/xb4", "GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI"); ("/xe1/xbf/xb6", "GREEK SMALL LETTER OMEGA WITH PERISPOMENI"); ("/xe1/xbf/xb7", "GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI"); ("/xe1/xbf/xb8", "GREEK CAPITAL LETTER OMICRON WITH VARIA"); ("/xe1/xbf/xb9", "GREEK CAPITAL LETTER OMICRON WITH OXIA"); ("/xe1/xbf/xba", "GREEK CAPITAL LETTER OMEGA WITH VARIA"); ("/xe1/xbf/xbb", "GREEK CAPITAL LETTER OMEGA WITH OXIA"); ("/xe1/xbf/xbc", "GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI"); ("/xe2/x81/xb1", "SUPERSCRIPT LATIN SMALL LETTER I"); ("/xe2/x81/xbf", "SUPERSCRIPT LATIN SMALL LETTER N"); ("/xe2/x82/x90", "LATIN SUBSCRIPT SMALL LETTER A"); ("/xe2/x82/x91", "LATIN SUBSCRIPT SMALL LETTER E"); ("/xe2/x82/x92", "LATIN SUBSCRIPT SMALL LETTER O"); ("/xe2/x82/x93", "LATIN SUBSCRIPT SMALL LETTER X"); ("/xe2/x82/x94", "LATIN SUBSCRIPT SMALL LETTER SCHWA"); ("/xe2/x84/x82", "DOUBLE-STRUCK CAPITAL C"); ("/xe2/x84/x8a", "SCRIPT SMALL G"); ("/xe2/x84/x8b", "SCRIPT CAPITAL H"); ("/xe2/x84/x8c", "BLACK-LETTER CAPITAL H"); ("/xe2/x84/x8d", "DOUBLE-STRUCK CAPITAL H"); ("/xe2/x84/x90", "SCRIPT CAPITAL I"); ("/xe2/x84/x91", "BLACK-LETTER CAPITAL I"); ("/xe2/x84/x92", "SCRIPT CAPITAL L"); ("/xe2/x84/x93", "SCRIPT SMALL L"); ("/xe2/x84/x95", "DOUBLE-STRUCK CAPITAL N"); ("/xe2/x84/x98", "SCRIPT CAPITAL P"); ("/xe2/x84/x99", "DOUBLE-STRUCK CAPITAL P"); ("/xe2/x84/x9a", "DOUBLE-STRUCK CAPITAL Q"); ("/xe2/x84/x9b", "SCRIPT CAPITAL R"); ("/xe2/x84/x9c", "BLACK-LETTER CAPITAL R"); ("/xe2/x84/x9d", "DOUBLE-STRUCK CAPITAL R"); ("/xe2/x84/xa4", "DOUBLE-STRUCK CAPITAL Z"); ("/xe2/x84/xa8", "BLACK-LETTER CAPITAL Z"); ("/xe2/x84/xa9", "TURNED GREEK SMALL LETTER IOTA"); ("/xe2/x84/xac", "SCRIPT CAPITAL B"); ("/xe2/x84/xad", "BLACK-LETTER CAPITAL C"); ("/xe2/x84/xaf", "SCRIPT SMALL E"); ("/xe2/x84/xb0", "SCRIPT CAPITAL E"); ("/xe2/x84/xb1", "SCRIPT CAPITAL F"); ("/xe2/x84/xb2", "TURNED CAPITAL F"); ("/xe2/x84/xb3", "SCRIPT CAPITAL M"); ("/xe2/x84/xb4", "SCRIPT SMALL O"); ("/xe2/x84/xba", "ROTATED CAPITAL Q"); ("/xe2/x84/xbc", "DOUBLE-STRUCK SMALL PI"); ("/xe2/x84/xbd", "DOUBLE-STRUCK SMALL GAMMA"); ("/xe2/x84/xbe", "DOUBLE-STRUCK CAPITAL GAMMA"); ("/xe2/x84/xbf", "DOUBLE-STRUCK CAPITAL PI"); ("/xe2/x85/x81", "TURNED SANS-SERIF CAPITAL G"); ("/xe2/x85/x82", "TURNED SANS-SERIF CAPITAL L"); ("/xe2/x85/x83", "REVERSED SANS-SERIF CAPITAL L"); ("/xe2/x85/x84", "TURNED SANS-SERIF CAPITAL Y"); ("/xe2/x85/x85", "DOUBLE-STRUCK ITALIC CAPITAL D"); ("/xe2/x85/x86", "DOUBLE-STRUCK ITALIC SMALL D"); ("/xe2/x85/x87", "DOUBLE-STRUCK ITALIC SMALL E"); ("/xe2/x85/x88", "DOUBLE-STRUCK ITALIC SMALL I"); ("/xe2/x85/x89", "DOUBLE-STRUCK ITALIC SMALL J"); ("/xe2/x85/x8e", "TURNED SMALL F"); ("/xe2/x85/xb0", "SMALL ROMAN NUMERAL ONE"); ("/xe2/x85/xb1", "SMALL ROMAN NUMERAL TWO"); ("/xe2/x85/xb2", "SMALL ROMAN NUMERAL THREE"); ("/xe2/x85/xb3", "SMALL ROMAN NUMERAL FOUR"); ("/xe2/x85/xb4", "SMALL ROMAN NUMERAL FIVE"); ("/xe2/x85/xb5", "SMALL ROMAN NUMERAL SIX"); ("/xe2/x85/xb6", "SMALL ROMAN NUMERAL SEVEN"); ("/xe2/x85/xb7", "SMALL ROMAN NUMERAL EIGHT"); ("/xe2/x85/xb8", "SMALL ROMAN NUMERAL NINE"); ("/xe2/x85/xb9", "SMALL ROMAN NUMERAL TEN"); ("/xe2/x85/xba", "SMALL ROMAN NUMERAL ELEVEN"); ("/xe2/x85/xbb", "SMALL ROMAN NUMERAL TWELVE"); ("/xe2/x85/xbc", "SMALL ROMAN NUMERAL FIFTY"); ("/xe2/x85/xbd", "SMALL ROMAN NUMERAL ONE HUNDRED"); ("/xe2/x85/xbe", "SMALL ROMAN NUMERAL FIVE HUNDRED"); ("/xe2/x85/xbf", "SMALL ROMAN NUMERAL ONE THOUSAND"); ("/xe2/x86/x84", "LATIN SMALL LETTER REVERSED C"); ("/xe2/x87/xb4", "RIGHT ARROW WITH SMALL CIRCLE"); ("/xe2/x88/x8a", "SMALL ELEMENT OF"); ("/xe2/x88/x8d", "SMALL CONTAINS AS MEMBER"); ("/xe2/x8b/xb4", "SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE"); ("/xe2/x8b/xb7", "SMALL ELEMENT OF WITH OVERBAR"); ("/xe2/x8b/xbc", "SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE"); ("/xe2/x8b/xbe", "SMALL CONTAINS WITH OVERBAR"); ("/xe2/x92/x9c", "PARENTHESIZED LATIN SMALL LETTER A"); ("/xe2/x92/x9d", "PARENTHESIZED LATIN SMALL LETTER B"); ("/xe2/x92/x9e", "PARENTHESIZED LATIN SMALL LETTER C"); ("/xe2/x92/x9f", "PARENTHESIZED LATIN SMALL LETTER D"); ("/xe2/x92/xa0", "PARENTHESIZED LATIN SMALL LETTER E"); ("/xe2/x92/xa1", "PARENTHESIZED LATIN SMALL LETTER F"); ("/xe2/x92/xa2", "PARENTHESIZED LATIN SMALL LETTER G"); ("/xe2/x92/xa3", "PARENTHESIZED LATIN SMALL LETTER H"); ("/xe2/x92/xa4", "PARENTHESIZED LATIN SMALL LETTER I"); ("/xe2/x92/xa5", "PARENTHESIZED LATIN SMALL LETTER J"); ("/xe2/x92/xa6", "PARENTHESIZED LATIN SMALL LETTER K"); ("/xe2/x92/xa7", "PARENTHESIZED LATIN SMALL LETTER L"); ("/xe2/x92/xa8", "PARENTHESIZED LATIN SMALL LETTER M"); ("/xe2/x92/xa9", "PARENTHESIZED LATIN SMALL LETTER N"); ("/xe2/x92/xaa", "PARENTHESIZED LATIN SMALL LETTER O"); ("/xe2/x92/xab", "PARENTHESIZED LATIN SMALL LETTER P"); ("/xe2/x92/xac", "PARENTHESIZED LATIN SMALL LETTER Q"); ("/xe2/x92/xad", "PARENTHESIZED LATIN SMALL LETTER R"); ("/xe2/x92/xae", "PARENTHESIZED LATIN SMALL LETTER S"); ("/xe2/x92/xaf", "PARENTHESIZED LATIN SMALL LETTER T"); ("/xe2/x92/xb0", "PARENTHESIZED LATIN SMALL LETTER U"); ("/xe2/x92/xb1", "PARENTHESIZED LATIN SMALL LETTER V"); ("/xe2/x92/xb2", "PARENTHESIZED LATIN SMALL LETTER W"); ("/xe2/x92/xb3", "PARENTHESIZED LATIN SMALL LETTER X"); ("/xe2/x92/xb4", "PARENTHESIZED LATIN SMALL LETTER Y"); ("/xe2/x92/xb5", "PARENTHESIZED LATIN SMALL LETTER Z"); ("/xe2/x92/xb6", "CIRCLED LATIN CAPITAL LETTER A"); ("/xe2/x92/xb7", "CIRCLED LATIN CAPITAL LETTER B"); ("/xe2/x92/xb8", "CIRCLED LATIN CAPITAL LETTER C"); ("/xe2/x92/xb9", "CIRCLED LATIN CAPITAL LETTER D"); ("/xe2/x92/xba", "CIRCLED LATIN CAPITAL LETTER E"); ("/xe2/x92/xbb", "CIRCLED LATIN CAPITAL LETTER F"); ("/xe2/x92/xbc", "CIRCLED LATIN CAPITAL LETTER G"); ("/xe2/x92/xbd", "CIRCLED LATIN CAPITAL LETTER H"); ("/xe2/x92/xbe", "CIRCLED LATIN CAPITAL LETTER I"); ("/xe2/x92/xbf", "CIRCLED LATIN CAPITAL LETTER J"); ("/xe2/x93/x80", "CIRCLED LATIN CAPITAL LETTER K"); ("/xe2/x93/x81", "CIRCLED LATIN CAPITAL LETTER L"); ("/xe2/x93/x82", "CIRCLED LATIN CAPITAL LETTER M"); ("/xe2/x93/x83", "CIRCLED LATIN CAPITAL LETTER N"); ("/xe2/x93/x84", "CIRCLED LATIN CAPITAL LETTER O"); ("/xe2/x93/x85", "CIRCLED LATIN CAPITAL LETTER P"); ("/xe2/x93/x86", "CIRCLED LATIN CAPITAL LETTER Q"); ("/xe2/x93/x87", "CIRCLED LATIN CAPITAL LETTER R"); ("/xe2/x93/x88", "CIRCLED LATIN CAPITAL LETTER S"); ("/xe2/x93/x89", "CIRCLED LATIN CAPITAL LETTER T"); ("/xe2/x93/x8a", "CIRCLED LATIN CAPITAL LETTER U"); ("/xe2/x93/x8b", "CIRCLED LATIN CAPITAL LETTER V"); ("/xe2/x93/x8c", "CIRCLED LATIN CAPITAL LETTER W"); ("/xe2/x93/x8d", "CIRCLED LATIN CAPITAL LETTER X"); ("/xe2/x93/x8e", "CIRCLED LATIN CAPITAL LETTER Y"); ("/xe2/x93/x8f", "CIRCLED LATIN CAPITAL LETTER Z"); ("/xe2/x93/x90", "CIRCLED LATIN SMALL LETTER A"); ("/xe2/x93/x91", "CIRCLED LATIN SMALL LETTER B"); ("/xe2/x93/x92", "CIRCLED LATIN SMALL LETTER C"); ("/xe2/x93/x93", "CIRCLED LATIN SMALL LETTER D"); ("/xe2/x93/x94", "CIRCLED LATIN SMALL LETTER E"); ("/xe2/x93/x95", "CIRCLED LATIN SMALL LETTER F"); ("/xe2/x93/x96", "CIRCLED LATIN SMALL LETTER G"); ("/xe2/x93/x97", "CIRCLED LATIN SMALL LETTER H"); ("/xe2/x93/x98", "CIRCLED LATIN SMALL LETTER I"); ("/xe2/x93/x99", "CIRCLED LATIN SMALL LETTER J"); ("/xe2/x93/x9a", "CIRCLED LATIN SMALL LETTER K"); ("/xe2/x93/x9b", "CIRCLED LATIN SMALL LETTER L"); ("/xe2/x93/x9c", "CIRCLED LATIN SMALL LETTER M"); ("/xe2/x93/x9d", "CIRCLED LATIN SMALL LETTER N"); ("/xe2/x93/x9e", "CIRCLED LATIN SMALL LETTER O"); ("/xe2/x93/x9f", "CIRCLED LATIN SMALL LETTER P"); ("/xe2/x93/xa0", "CIRCLED LATIN SMALL LETTER Q"); ("/xe2/x93/xa1", "CIRCLED LATIN SMALL LETTER R"); ("/xe2/x93/xa2", "CIRCLED LATIN SMALL LETTER S"); ("/xe2/x93/xa3", "CIRCLED LATIN SMALL LETTER T"); ("/xe2/x93/xa4", "CIRCLED LATIN SMALL LETTER U"); ("/xe2/x93/xa5", "CIRCLED LATIN SMALL LETTER V"); ("/xe2/x93/xa6", "CIRCLED LATIN SMALL LETTER W"); ("/xe2/x93/xa7", "CIRCLED LATIN SMALL LETTER X"); ("/xe2/x93/xa8", "CIRCLED LATIN SMALL LETTER Y"); ("/xe2/x93/xa9", "CIRCLED LATIN SMALL LETTER Z"); ("/xe2/x96/xa3", "WHITE SQUARE CONTAINING BLACK SMALL SQUARE"); ("/xe2/x96/xaa", "BLACK SMALL SQUARE"); ("/xe2/x96/xab", "WHITE SMALL SQUARE"); ("/xe2/x96/xb4", "BLACK UP-POINTING SMALL TRIANGLE"); ("/xe2/x96/xb5", "WHITE UP-POINTING SMALL TRIANGLE"); ("/xe2/x96/xb8", "BLACK RIGHT-POINTING SMALL TRIANGLE"); ("/xe2/x96/xb9", "WHITE RIGHT-POINTING SMALL TRIANGLE"); ("/xe2/x96/xbe", "BLACK DOWN-POINTING SMALL TRIANGLE"); ("/xe2/x96/xbf", "WHITE DOWN-POINTING SMALL TRIANGLE"); ("/xe2/x97/x82", "BLACK LEFT-POINTING SMALL TRIANGLE"); ("/xe2/x97/x83", "WHITE LEFT-POINTING SMALL TRIANGLE"); ("/xe2/x97/x88", "WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND"); ("/xe2/x97/xbd", "WHITE MEDIUM SMALL SQUARE"); ("/xe2/x97/xbe", "BLACK MEDIUM SMALL SQUARE"); ("/xe2/x9a/xac", "MEDIUM SMALL WHITE CIRCLE"); ("/xe2/x9f/x81", "WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE"); ("/xe2/xa5/x88", "LEFT RIGHT ARROW THROUGH SMALL CIRCLE"); ("/xe2/xa5/x89", "UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE"); ("/xe2/xa6/xb2", "EMPTY SET WITH SMALL CIRCLE ABOVE"); ("/xe2/xa7/x82", "CIRCLE WITH SMALL CIRCLE TO THE RIGHT"); ("/xe2/xa7/x87", "SQUARED SMALL CIRCLE"); ("/xe2/xa8/xa2", "PLUS SIGN WITH SMALL CIRCLE ABOVE"); ("/xe2/xa9/xa1", "SMALL VEE WITH UNDERBAR"); ("/xe2/xaa/xaa", "SMALLER THAN"); ("/xe2/xaa/xac", "SMALLER THAN OR EQUAL TO"); ("/xe2/xac/x9d", "BLACK VERY SMALL SQUARE"); ("/xe2/xac/x9e", "WHITE VERY SMALL SQUARE"); ("/xe2/xac/xa9", "BLACK SMALL DIAMOND"); ("/xe2/xac/xaa", "BLACK SMALL LOZENGE"); ("/xe2/xac/xab", "WHITE SMALL LOZENGE"); ("/xe2/xac/xb0", "LEFT ARROW WITH SMALL CIRCLE"); ("/xe2/xad/x91", "BLACK SMALL STAR"); ("/xe2/xad/x92", "WHITE SMALL STAR"); ("/xe2/xb0/x80", "GLAGOLITIC CAPITAL LETTER AZU"); ("/xe2/xb0/x81", "GLAGOLITIC CAPITAL LETTER BUKY"); ("/xe2/xb0/x82", "GLAGOLITIC CAPITAL LETTER VEDE"); ("/xe2/xb0/x83", "GLAGOLITIC CAPITAL LETTER GLAGOLI"); ("/xe2/xb0/x84", "GLAGOLITIC CAPITAL LETTER DOBRO"); ("/xe2/xb0/x85", "GLAGOLITIC CAPITAL LETTER YESTU"); ("/xe2/xb0/x86", "GLAGOLITIC CAPITAL LETTER ZHIVETE"); ("/xe2/xb0/x87", "GLAGOLITIC CAPITAL LETTER DZELO"); ("/xe2/xb0/x88", "GLAGOLITIC CAPITAL LETTER ZEMLJA"); ("/xe2/xb0/x89", "GLAGOLITIC CAPITAL LETTER IZHE"); ("/xe2/xb0/x8a", "GLAGOLITIC CAPITAL LETTER INITIAL IZHE"); ("/xe2/xb0/x8b", "GLAGOLITIC CAPITAL LETTER I"); ("/xe2/xb0/x8c", "GLAGOLITIC CAPITAL LETTER DJERVI"); ("/xe2/xb0/x8d", "GLAGOLITIC CAPITAL LETTER KAKO"); ("/xe2/xb0/x8e", "GLAGOLITIC CAPITAL LETTER LJUDIJE"); ("/xe2/xb0/x8f", "GLAGOLITIC CAPITAL LETTER MYSLITE"); ("/xe2/xb0/x90", "GLAGOLITIC CAPITAL LETTER NASHI"); ("/xe2/xb0/x91", "GLAGOLITIC CAPITAL LETTER ONU"); ("/xe2/xb0/x92", "GLAGOLITIC CAPITAL LETTER POKOJI"); ("/xe2/xb0/x93", "GLAGOLITIC CAPITAL LETTER RITSI"); ("/xe2/xb0/x94", "GLAGOLITIC CAPITAL LETTER SLOVO"); ("/xe2/xb0/x95", "GLAGOLITIC CAPITAL LETTER TVRIDO"); ("/xe2/xb0/x96", "GLAGOLITIC CAPITAL LETTER UKU"); ("/xe2/xb0/x97", "GLAGOLITIC CAPITAL LETTER FRITU"); ("/xe2/xb0/x98", "GLAGOLITIC CAPITAL LETTER HERU"); ("/xe2/xb0/x99", "GLAGOLITIC CAPITAL LETTER OTU"); ("/xe2/xb0/x9a", "GLAGOLITIC CAPITAL LETTER PE"); ("/xe2/xb0/x9b", "GLAGOLITIC CAPITAL LETTER SHTA"); ("/xe2/xb0/x9c", "GLAGOLITIC CAPITAL LETTER TSI"); ("/xe2/xb0/x9d", "GLAGOLITIC CAPITAL LETTER CHRIVI"); ("/xe2/xb0/x9e", "GLAGOLITIC CAPITAL LETTER SHA"); ("/xe2/xb0/x9f", "GLAGOLITIC CAPITAL LETTER YERU"); ("/xe2/xb0/xa0", "GLAGOLITIC CAPITAL LETTER YERI"); ("/xe2/xb0/xa1", "GLAGOLITIC CAPITAL LETTER YATI"); ("/xe2/xb0/xa2", "GLAGOLITIC CAPITAL LETTER SPIDERY HA"); ("/xe2/xb0/xa3", "GLAGOLITIC CAPITAL LETTER YU"); ("/xe2/xb0/xa4", "GLAGOLITIC CAPITAL LETTER SMALL YUS"); ("/xe2/xb0/xa5", "GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL"); ("/xe2/xb0/xa6", "GLAGOLITIC CAPITAL LETTER YO"); ("/xe2/xb0/xa7", "GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS"); ("/xe2/xb0/xa8", "GLAGOLITIC CAPITAL LETTER BIG YUS"); ("/xe2/xb0/xa9", "GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS"); ("/xe2/xb0/xaa", "GLAGOLITIC CAPITAL LETTER FITA"); ("/xe2/xb0/xab", "GLAGOLITIC CAPITAL LETTER IZHITSA"); ("/xe2/xb0/xac", "GLAGOLITIC CAPITAL LETTER SHTAPIC"); ("/xe2/xb0/xad", "GLAGOLITIC CAPITAL LETTER TROKUTASTI A"); ("/xe2/xb0/xae", "GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE"); ("/xe2/xb0/xb0", "GLAGOLITIC SMALL LETTER AZU"); ("/xe2/xb0/xb1", "GLAGOLITIC SMALL LETTER BUKY"); ("/xe2/xb0/xb2", "GLAGOLITIC SMALL LETTER VEDE"); ("/xe2/xb0/xb3", "GLAGOLITIC SMALL LETTER GLAGOLI"); ("/xe2/xb0/xb4", "GLAGOLITIC SMALL LETTER DOBRO"); ("/xe2/xb0/xb5", "GLAGOLITIC SMALL LETTER YESTU"); ("/xe2/xb0/xb6", "GLAGOLITIC SMALL LETTER ZHIVETE"); ("/xe2/xb0/xb7", "GLAGOLITIC SMALL LETTER DZELO"); ("/xe2/xb0/xb8", "GLAGOLITIC SMALL LETTER ZEMLJA"); ("/xe2/xb0/xb9", "GLAGOLITIC SMALL LETTER IZHE"); ("/xe2/xb0/xba", "GLAGOLITIC SMALL LETTER INITIAL IZHE"); ("/xe2/xb0/xbb", "GLAGOLITIC SMALL LETTER I"); ("/xe2/xb0/xbc", "GLAGOLITIC SMALL LETTER DJERVI"); ("/xe2/xb0/xbd", "GLAGOLITIC SMALL LETTER KAKO"); ("/xe2/xb0/xbe", "GLAGOLITIC SMALL LETTER LJUDIJE"); ("/xe2/xb0/xbf", "GLAGOLITIC SMALL LETTER MYSLITE"); ("/xe2/xb1/x80", "GLAGOLITIC SMALL LETTER NASHI"); ("/xe2/xb1/x81", "GLAGOLITIC SMALL LETTER ONU"); ("/xe2/xb1/x82", "GLAGOLITIC SMALL LETTER POKOJI"); ("/xe2/xb1/x83", "GLAGOLITIC SMALL LETTER RITSI"); ("/xe2/xb1/x84", "GLAGOLITIC SMALL LETTER SLOVO"); ("/xe2/xb1/x85", "GLAGOLITIC SMALL LETTER TVRIDO"); ("/xe2/xb1/x86", "GLAGOLITIC SMALL LETTER UKU"); ("/xe2/xb1/x87", "GLAGOLITIC SMALL LETTER FRITU"); ("/xe2/xb1/x88", "GLAGOLITIC SMALL LETTER HERU"); ("/xe2/xb1/x89", "GLAGOLITIC SMALL LETTER OTU"); ("/xe2/xb1/x8a", "GLAGOLITIC SMALL LETTER PE"); ("/xe2/xb1/x8b", "GLAGOLITIC SMALL LETTER SHTA"); ("/xe2/xb1/x8c", "GLAGOLITIC SMALL LETTER TSI"); ("/xe2/xb1/x8d", "GLAGOLITIC SMALL LETTER CHRIVI"); ("/xe2/xb1/x8e", "GLAGOLITIC SMALL LETTER SHA"); ("/xe2/xb1/x8f", "GLAGOLITIC SMALL LETTER YERU"); ("/xe2/xb1/x90", "GLAGOLITIC SMALL LETTER YERI"); ("/xe2/xb1/x91", "GLAGOLITIC SMALL LETTER YATI"); ("/xe2/xb1/x92", "GLAGOLITIC SMALL LETTER SPIDERY HA"); ("/xe2/xb1/x93", "GLAGOLITIC SMALL LETTER YU"); ("/xe2/xb1/x94", "GLAGOLITIC SMALL LETTER SMALL YUS"); ("/xe2/xb1/x95", "GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL"); ("/xe2/xb1/x96", "GLAGOLITIC SMALL LETTER YO"); ("/xe2/xb1/x97", "GLAGOLITIC SMALL LETTER IOTATED SMALL YUS"); ("/xe2/xb1/x98", "GLAGOLITIC SMALL LETTER BIG YUS"); ("/xe2/xb1/x99", "GLAGOLITIC SMALL LETTER IOTATED BIG YUS"); ("/xe2/xb1/x9a", "GLAGOLITIC SMALL LETTER FITA"); ("/xe2/xb1/x9b", "GLAGOLITIC SMALL LETTER IZHITSA"); ("/xe2/xb1/x9c", "GLAGOLITIC SMALL LETTER SHTAPIC"); ("/xe2/xb1/x9d", "GLAGOLITIC SMALL LETTER TROKUTASTI A"); ("/xe2/xb1/x9e", "GLAGOLITIC SMALL LETTER LATINATE MYSLITE"); ("/xe2/xb1/xa0", "LATIN CAPITAL LETTER L WITH DOUBLE BAR"); ("/xe2/xb1/xa1", "LATIN SMALL LETTER L WITH DOUBLE BAR"); ("/xe2/xb1/xa2", "LATIN CAPITAL LETTER L WITH MIDDLE TILDE"); ("/xe2/xb1/xa3", "LATIN CAPITAL LETTER P WITH STROKE"); ("/xe2/xb1/xa4", "LATIN CAPITAL LETTER R WITH TAIL"); ("/xe2/xb1/xa5", "LATIN SMALL LETTER A WITH STROKE"); ("/xe2/xb1/xa6", "LATIN SMALL LETTER T WITH DIAGONAL STROKE"); ("/xe2/xb1/xa7", "LATIN CAPITAL LETTER H WITH DESCENDER"); ("/xe2/xb1/xa8", "LATIN SMALL LETTER H WITH DESCENDER"); ("/xe2/xb1/xa9", "LATIN CAPITAL LETTER K WITH DESCENDER"); ("/xe2/xb1/xaa", "LATIN SMALL LETTER K WITH DESCENDER"); ("/xe2/xb1/xab", "LATIN CAPITAL LETTER Z WITH DESCENDER"); ("/xe2/xb1/xac", "LATIN SMALL LETTER Z WITH DESCENDER"); ("/xe2/xb1/xad", "LATIN CAPITAL LETTER ALPHA"); ("/xe2/xb1/xae", "LATIN CAPITAL LETTER M WITH HOOK"); ("/xe2/xb1/xaf", "LATIN CAPITAL LETTER TURNED A"); ("/xe2/xb1/xb1", "LATIN SMALL LETTER V WITH RIGHT HOOK"); ("/xe2/xb1/xb2", "LATIN CAPITAL LETTER W WITH HOOK"); ("/xe2/xb1/xb3", "LATIN SMALL LETTER W WITH HOOK"); ("/xe2/xb1/xb4", "LATIN SMALL LETTER V WITH CURL"); ("/xe2/xb1/xb5", "LATIN CAPITAL LETTER HALF H"); ("/xe2/xb1/xb6", "LATIN SMALL LETTER HALF H"); ("/xe2/xb1/xb7", "LATIN SMALL LETTER TAILLESS PHI"); ("/xe2/xb1/xb8", "LATIN SMALL LETTER E WITH NOTCH"); ("/xe2/xb1/xb9", "LATIN SMALL LETTER TURNED R WITH TAIL"); ("/xe2/xb1/xba", "LATIN SMALL LETTER O WITH LOW RING INSIDE"); ("/xe2/xb1/xbb", "LATIN LETTER SMALL CAPITAL TURNED E"); ("/xe2/xb1/xbc", "LATIN SUBSCRIPT SMALL LETTER J"); ("/xe2/xb1/xbd", "MODIFIER LETTER CAPITAL V"); ("/xe2/xb2/x80", "COPTIC CAPITAL LETTER ALFA"); ("/xe2/xb2/x81", "COPTIC SMALL LETTER ALFA"); ("/xe2/xb2/x82", "COPTIC CAPITAL LETTER VIDA"); ("/xe2/xb2/x83", "COPTIC SMALL LETTER VIDA"); ("/xe2/xb2/x84", "COPTIC CAPITAL LETTER GAMMA"); ("/xe2/xb2/x85", "COPTIC SMALL LETTER GAMMA"); ("/xe2/xb2/x86", "COPTIC CAPITAL LETTER DALDA"); ("/xe2/xb2/x87", "COPTIC SMALL LETTER DALDA"); ("/xe2/xb2/x88", "COPTIC CAPITAL LETTER EIE"); ("/xe2/xb2/x89", "COPTIC SMALL LETTER EIE"); ("/xe2/xb2/x8a", "COPTIC CAPITAL LETTER SOU"); ("/xe2/xb2/x8b", "COPTIC SMALL LETTER SOU"); ("/xe2/xb2/x8c", "COPTIC CAPITAL LETTER ZATA"); ("/xe2/xb2/x8d", "COPTIC SMALL LETTER ZATA"); ("/xe2/xb2/x8e", "COPTIC CAPITAL LETTER HATE"); ("/xe2/xb2/x8f", "COPTIC SMALL LETTER HATE"); ("/xe2/xb2/x90", "COPTIC CAPITAL LETTER THETHE"); ("/xe2/xb2/x91", "COPTIC SMALL LETTER THETHE"); ("/xe2/xb2/x92", "COPTIC CAPITAL LETTER IAUDA"); ("/xe2/xb2/x93", "COPTIC SMALL LETTER IAUDA"); ("/xe2/xb2/x94", "COPTIC CAPITAL LETTER KAPA"); ("/xe2/xb2/x95", "COPTIC SMALL LETTER KAPA"); ("/xe2/xb2/x96", "COPTIC CAPITAL LETTER LAULA"); ("/xe2/xb2/x97", "COPTIC SMALL LETTER LAULA"); ("/xe2/xb2/x98", "COPTIC CAPITAL LETTER MI"); ("/xe2/xb2/x99", "COPTIC SMALL LETTER MI"); ("/xe2/xb2/x9a", "COPTIC CAPITAL LETTER NI"); ("/xe2/xb2/x9b", "COPTIC SMALL LETTER NI"); ("/xe2/xb2/x9c", "COPTIC CAPITAL LETTER KSI"); ("/xe2/xb2/x9d", "COPTIC SMALL LETTER KSI"); ("/xe2/xb2/x9e", "COPTIC CAPITAL LETTER O"); ("/xe2/xb2/x9f", "COPTIC SMALL LETTER O"); ("/xe2/xb2/xa0", "COPTIC CAPITAL LETTER PI"); ("/xe2/xb2/xa1", "COPTIC SMALL LETTER PI"); ("/xe2/xb2/xa2", "COPTIC CAPITAL LETTER RO"); ("/xe2/xb2/xa3", "COPTIC SMALL LETTER RO"); ("/xe2/xb2/xa4", "COPTIC CAPITAL LETTER SIMA"); ("/xe2/xb2/xa5", "COPTIC SMALL LETTER SIMA"); ("/xe2/xb2/xa6", "COPTIC CAPITAL LETTER TAU"); ("/xe2/xb2/xa7", "COPTIC SMALL LETTER TAU"); ("/xe2/xb2/xa8", "COPTIC CAPITAL LETTER UA"); ("/xe2/xb2/xa9", "COPTIC SMALL LETTER UA"); ("/xe2/xb2/xaa", "COPTIC CAPITAL LETTER FI"); ("/xe2/xb2/xab", "COPTIC SMALL LETTER FI"); ("/xe2/xb2/xac", "COPTIC CAPITAL LETTER KHI"); ("/xe2/xb2/xad", "COPTIC SMALL LETTER KHI"); ("/xe2/xb2/xae", "COPTIC CAPITAL LETTER PSI"); ("/xe2/xb2/xaf", "COPTIC SMALL LETTER PSI"); ("/xe2/xb2/xb0", "COPTIC CAPITAL LETTER OOU"); ("/xe2/xb2/xb1", "COPTIC SMALL LETTER OOU"); ("/xe2/xb2/xb2", "COPTIC CAPITAL LETTER DIALECT-P ALEF"); ("/xe2/xb2/xb3", "COPTIC SMALL LETTER DIALECT-P ALEF"); ("/xe2/xb2/xb4", "COPTIC CAPITAL LETTER OLD COPTIC AIN"); ("/xe2/xb2/xb5", "COPTIC SMALL LETTER OLD COPTIC AIN"); ("/xe2/xb2/xb6", "COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE"); ("/xe2/xb2/xb7", "COPTIC SMALL LETTER CRYPTOGRAMMIC EIE"); ("/xe2/xb2/xb8", "COPTIC CAPITAL LETTER DIALECT-P KAPA"); ("/xe2/xb2/xb9", "COPTIC SMALL LETTER DIALECT-P KAPA"); ("/xe2/xb2/xba", "COPTIC CAPITAL LETTER DIALECT-P NI"); ("/xe2/xb2/xbb", "COPTIC SMALL LETTER DIALECT-P NI"); ("/xe2/xb2/xbc", "COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI"); ("/xe2/xb2/xbd", "COPTIC SMALL LETTER CRYPTOGRAMMIC NI"); ("/xe2/xb2/xbe", "COPTIC CAPITAL LETTER OLD COPTIC OOU"); ("/xe2/xb2/xbf", "COPTIC SMALL LETTER OLD COPTIC OOU"); ("/xe2/xb3/x80", "COPTIC CAPITAL LETTER SAMPI"); ("/xe2/xb3/x81", "COPTIC SMALL LETTER SAMPI"); ("/xe2/xb3/x82", "COPTIC CAPITAL LETTER CROSSED SHEI"); ("/xe2/xb3/x83", "COPTIC SMALL LETTER CROSSED SHEI"); ("/xe2/xb3/x84", "COPTIC CAPITAL LETTER OLD COPTIC SHEI"); ("/xe2/xb3/x85", "COPTIC SMALL LETTER OLD COPTIC SHEI"); ("/xe2/xb3/x86", "COPTIC CAPITAL LETTER OLD COPTIC ESH"); ("/xe2/xb3/x87", "COPTIC SMALL LETTER OLD COPTIC ESH"); ("/xe2/xb3/x88", "COPTIC CAPITAL LETTER AKHMIMIC KHEI"); ("/xe2/xb3/x89", "COPTIC SMALL LETTER AKHMIMIC KHEI"); ("/xe2/xb3/x8a", "COPTIC CAPITAL LETTER DIALECT-P HORI"); ("/xe2/xb3/x8b", "COPTIC SMALL LETTER DIALECT-P HORI"); ("/xe2/xb3/x8c", "COPTIC CAPITAL LETTER OLD COPTIC HORI"); ("/xe2/xb3/x8d", "COPTIC SMALL LETTER OLD COPTIC HORI"); ("/xe2/xb3/x8e", "COPTIC CAPITAL LETTER OLD COPTIC HA"); ("/xe2/xb3/x8f", "COPTIC SMALL LETTER OLD COPTIC HA"); ("/xe2/xb3/x90", "COPTIC CAPITAL LETTER L-SHAPED HA"); ("/xe2/xb3/x91", "COPTIC SMALL LETTER L-SHAPED HA"); ("/xe2/xb3/x92", "COPTIC CAPITAL LETTER OLD COPTIC HEI"); ("/xe2/xb3/x93", "COPTIC SMALL LETTER OLD COPTIC HEI"); ("/xe2/xb3/x94", "COPTIC CAPITAL LETTER OLD COPTIC HAT"); ("/xe2/xb3/x95", "COPTIC SMALL LETTER OLD COPTIC HAT"); ("/xe2/xb3/x96", "COPTIC CAPITAL LETTER OLD COPTIC GANGIA"); ("/xe2/xb3/x97", "COPTIC SMALL LETTER OLD COPTIC GANGIA"); ("/xe2/xb3/x98", "COPTIC CAPITAL LETTER OLD COPTIC DJA"); ("/xe2/xb3/x99", "COPTIC SMALL LETTER OLD COPTIC DJA"); ("/xe2/xb3/x9a", "COPTIC CAPITAL LETTER OLD COPTIC SHIMA"); ("/xe2/xb3/x9b", "COPTIC SMALL LETTER OLD COPTIC SHIMA"); ("/xe2/xb3/x9c", "COPTIC CAPITAL LETTER OLD NUBIAN SHIMA"); ("/xe2/xb3/x9d", "COPTIC SMALL LETTER OLD NUBIAN SHIMA"); ("/xe2/xb3/x9e", "COPTIC CAPITAL LETTER OLD NUBIAN NGI"); ("/xe2/xb3/x9f", "COPTIC SMALL LETTER OLD NUBIAN NGI"); ("/xe2/xb3/xa0", "COPTIC CAPITAL LETTER OLD NUBIAN NYI"); ("/xe2/xb3/xa1", "COPTIC SMALL LETTER OLD NUBIAN NYI"); ("/xe2/xb3/xa2", "COPTIC CAPITAL LETTER OLD NUBIAN WAU"); ("/xe2/xb3/xa3", "COPTIC SMALL LETTER OLD NUBIAN WAU"); ("/xe2/xb4/x80", "GEORGIAN SMALL LETTER AN"); ("/xe2/xb4/x81", "GEORGIAN SMALL LETTER BAN"); ("/xe2/xb4/x82", "GEORGIAN SMALL LETTER GAN"); ("/xe2/xb4/x83", "GEORGIAN SMALL LETTER DON"); ("/xe2/xb4/x84", "GEORGIAN SMALL LETTER EN"); ("/xe2/xb4/x85", "GEORGIAN SMALL LETTER VIN"); ("/xe2/xb4/x86", "GEORGIAN SMALL LETTER ZEN"); ("/xe2/xb4/x87", "GEORGIAN SMALL LETTER TAN"); ("/xe2/xb4/x88", "GEORGIAN SMALL LETTER IN"); ("/xe2/xb4/x89", "GEORGIAN SMALL LETTER KAN"); ("/xe2/xb4/x8a", "GEORGIAN SMALL LETTER LAS"); ("/xe2/xb4/x8b", "GEORGIAN SMALL LETTER MAN"); ("/xe2/xb4/x8c", "GEORGIAN SMALL LETTER NAR"); ("/xe2/xb4/x8d", "GEORGIAN SMALL LETTER ON"); ("/xe2/xb4/x8e", "GEORGIAN SMALL LETTER PAR"); ("/xe2/xb4/x8f", "GEORGIAN SMALL LETTER ZHAR"); ("/xe2/xb4/x90", "GEORGIAN SMALL LETTER RAE"); ("/xe2/xb4/x91", "GEORGIAN SMALL LETTER SAN"); ("/xe2/xb4/x92", "GEORGIAN SMALL LETTER TAR"); ("/xe2/xb4/x93", "GEORGIAN SMALL LETTER UN"); ("/xe2/xb4/x94", "GEORGIAN SMALL LETTER PHAR"); ("/xe2/xb4/x95", "GEORGIAN SMALL LETTER KHAR"); ("/xe2/xb4/x96", "GEORGIAN SMALL LETTER GHAN"); ("/xe2/xb4/x97", "GEORGIAN SMALL LETTER QAR"); ("/xe2/xb4/x98", "GEORGIAN SMALL LETTER SHIN"); ("/xe2/xb4/x99", "GEORGIAN SMALL LETTER CHIN"); ("/xe2/xb4/x9a", "GEORGIAN SMALL LETTER CAN"); ("/xe2/xb4/x9b", "GEORGIAN SMALL LETTER JIL"); ("/xe2/xb4/x9c", "GEORGIAN SMALL LETTER CIL"); ("/xe2/xb4/x9d", "GEORGIAN SMALL LETTER CHAR"); ("/xe2/xb4/x9e", "GEORGIAN SMALL LETTER XAN"); ("/xe2/xb4/x9f", "GEORGIAN SMALL LETTER JHAN"); ("/xe2/xb4/xa0", "GEORGIAN SMALL LETTER HAE"); ("/xe2/xb4/xa1", "GEORGIAN SMALL LETTER HE"); ("/xe2/xb4/xa2", "GEORGIAN SMALL LETTER HIE"); ("/xe2/xb4/xa3", "GEORGIAN SMALL LETTER WE"); ("/xe2/xb4/xa4", "GEORGIAN SMALL LETTER HAR"); ("/xe2/xb4/xa5", "GEORGIAN SMALL LETTER HOE"); ("/xe2/xba/x8c", "CJK RADICAL SMALL ONE"); ("/xe2/xba/x8d", "CJK RADICAL SMALL TWO"); ("/xe2/xbc/xa9", "KANGXI RADICAL SMALL"); ("/xe3/x81/x81", "HIRAGANA LETTER SMALL A"); ("/xe3/x81/x83", "HIRAGANA LETTER SMALL I"); ("/xe3/x81/x85", "HIRAGANA LETTER SMALL U"); ("/xe3/x81/x87", "HIRAGANA LETTER SMALL E"); ("/xe3/x81/x89", "HIRAGANA LETTER SMALL O"); ("/xe3/x81/xa3", "HIRAGANA LETTER SMALL TU"); ("/xe3/x82/x83", "HIRAGANA LETTER SMALL YA"); ("/xe3/x82/x85", "HIRAGANA LETTER SMALL YU"); ("/xe3/x82/x87", "HIRAGANA LETTER SMALL YO"); ("/xe3/x82/x8e", "HIRAGANA LETTER SMALL WA"); ("/xe3/x82/x95", "HIRAGANA LETTER SMALL KA"); ("/xe3/x82/x96", "HIRAGANA LETTER SMALL KE"); ("/xe3/x82/xa1", "KATAKANA LETTER SMALL A"); ("/xe3/x82/xa3", "KATAKANA LETTER SMALL I"); ("/xe3/x82/xa5", "KATAKANA LETTER SMALL U"); ("/xe3/x82/xa7", "KATAKANA LETTER SMALL E"); ("/xe3/x82/xa9", "KATAKANA LETTER SMALL O"); ("/xe3/x83/x83", "KATAKANA LETTER SMALL TU"); ("/xe3/x83/xa3", "KATAKANA LETTER SMALL YA"); ("/xe3/x83/xa5", "KATAKANA LETTER SMALL YU"); ("/xe3/x83/xa7", "KATAKANA LETTER SMALL YO"); ("/xe3/x83/xae", "KATAKANA LETTER SMALL WA"); ("/xe3/x83/xb5", "KATAKANA LETTER SMALL KA"); ("/xe3/x83/xb6", "KATAKANA LETTER SMALL KE"); ("/xe3/x87/xb0", "KATAKANA LETTER SMALL KU"); ("/xe3/x87/xb1", "KATAKANA LETTER SMALL SI"); ("/xe3/x87/xb2", "KATAKANA LETTER SMALL SU"); ("/xe3/x87/xb3", "KATAKANA LETTER SMALL TO"); ("/xe3/x87/xb4", "KATAKANA LETTER SMALL NU"); ("/xe3/x87/xb5", "KATAKANA LETTER SMALL HA"); ("/xe3/x87/xb6", "KATAKANA LETTER SMALL HI"); ("/xe3/x87/xb7", "KATAKANA LETTER SMALL HU"); ("/xe3/x87/xb8", "KATAKANA LETTER SMALL HE"); ("/xe3/x87/xb9", "KATAKANA LETTER SMALL HO"); ("/xe3/x87/xba", "KATAKANA LETTER SMALL MU"); ("/xe3/x87/xbb", "KATAKANA LETTER SMALL RA"); ("/xe3/x87/xbc", "KATAKANA LETTER SMALL RI"); ("/xe3/x87/xbd", "KATAKANA LETTER SMALL RU"); ("/xe3/x87/xbe", "KATAKANA LETTER SMALL RE"); ("/xe3/x87/xbf", "KATAKANA LETTER SMALL RO"); ("/xe3/x8f/x8e", "SQUARE KM CAPITAL"); ("/xe3/x8f/x94", "SQUARE MB SMALL"); ("/xe4/xb7/x88", "HEXAGRAM FOR SMALL TAMING"); ("/xe4/xb7/xbd", "HEXAGRAM FOR SMALL PREPONDERANCE"); ("/xea/x99/x80", "CYRILLIC CAPITAL LETTER ZEMLYA"); ("/xea/x99/x81", "CYRILLIC SMALL LETTER ZEMLYA"); ("/xea/x99/x82", "CYRILLIC CAPITAL LETTER DZELO"); ("/xea/x99/x83", "CYRILLIC SMALL LETTER DZELO"); ("/xea/x99/x84", "CYRILLIC CAPITAL LETTER REVERSED DZE"); ("/xea/x99/x85", "CYRILLIC SMALL LETTER REVERSED DZE"); ("/xea/x99/x86", "CYRILLIC CAPITAL LETTER IOTA"); ("/xea/x99/x87", "CYRILLIC SMALL LETTER IOTA"); ("/xea/x99/x88", "CYRILLIC CAPITAL LETTER DJERV"); ("/xea/x99/x89", "CYRILLIC SMALL LETTER DJERV"); ("/xea/x99/x8a", "CYRILLIC CAPITAL LETTER MONOGRAPH UK"); ("/xea/x99/x8b", "CYRILLIC SMALL LETTER MONOGRAPH UK"); ("/xea/x99/x8c", "CYRILLIC CAPITAL LETTER BROAD OMEGA"); ("/xea/x99/x8d", "CYRILLIC SMALL LETTER BROAD OMEGA"); ("/xea/x99/x8e", "CYRILLIC CAPITAL LETTER NEUTRAL YER"); ("/xea/x99/x8f", "CYRILLIC SMALL LETTER NEUTRAL YER"); ("/xea/x99/x90", "CYRILLIC CAPITAL LETTER YERU WITH BACK YER"); ("/xea/x99/x91", "CYRILLIC SMALL LETTER YERU WITH BACK YER"); ("/xea/x99/x92", "CYRILLIC CAPITAL LETTER IOTIFIED YAT"); ("/xea/x99/x93", "CYRILLIC SMALL LETTER IOTIFIED YAT"); ("/xea/x99/x94", "CYRILLIC CAPITAL LETTER REVERSED YU"); ("/xea/x99/x95", "CYRILLIC SMALL LETTER REVERSED YU"); ("/xea/x99/x96", "CYRILLIC CAPITAL LETTER IOTIFIED A"); ("/xea/x99/x97", "CYRILLIC SMALL LETTER IOTIFIED A"); ("/xea/x99/x98", "CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS"); ("/xea/x99/x99", "CYRILLIC SMALL LETTER CLOSED LITTLE YUS"); ("/xea/x99/x9a", "CYRILLIC CAPITAL LETTER BLENDED YUS"); ("/xea/x99/x9b", "CYRILLIC SMALL LETTER BLENDED YUS"); ("/xea/x99/x9c", "CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS"); ("/xea/x99/x9d", "CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS"); ("/xea/x99/x9e", "CYRILLIC CAPITAL LETTER YN"); ("/xea/x99/x9f", "CYRILLIC SMALL LETTER YN"); ("/xea/x99/xa2", "CYRILLIC CAPITAL LETTER SOFT DE"); ("/xea/x99/xa3", "CYRILLIC SMALL LETTER SOFT DE"); ("/xea/x99/xa4", "CYRILLIC CAPITAL LETTER SOFT EL"); ("/xea/x99/xa5", "CYRILLIC SMALL LETTER SOFT EL"); ("/xea/x99/xa6", "CYRILLIC CAPITAL LETTER SOFT EM"); ("/xea/x99/xa7", "CYRILLIC SMALL LETTER SOFT EM"); ("/xea/x99/xa8", "CYRILLIC CAPITAL LETTER MONOCULAR O"); ("/xea/x99/xa9", "CYRILLIC SMALL LETTER MONOCULAR O"); ("/xea/x99/xaa", "CYRILLIC CAPITAL LETTER BINOCULAR O"); ("/xea/x99/xab", "CYRILLIC SMALL LETTER BINOCULAR O"); ("/xea/x99/xac", "CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O"); ("/xea/x99/xad", "CYRILLIC SMALL LETTER DOUBLE MONOCULAR O"); ("/xea/x9a/x80", "CYRILLIC CAPITAL LETTER DWE"); ("/xea/x9a/x81", "CYRILLIC SMALL LETTER DWE"); ("/xea/x9a/x82", "CYRILLIC CAPITAL LETTER DZWE"); ("/xea/x9a/x83", "CYRILLIC SMALL LETTER DZWE"); ("/xea/x9a/x84", "CYRILLIC CAPITAL LETTER ZHWE"); ("/xea/x9a/x85", "CYRILLIC SMALL LETTER ZHWE"); ("/xea/x9a/x86", "CYRILLIC CAPITAL LETTER CCHE"); ("/xea/x9a/x87", "CYRILLIC SMALL LETTER CCHE"); ("/xea/x9a/x88", "CYRILLIC CAPITAL LETTER DZZE"); ("/xea/x9a/x89", "CYRILLIC SMALL LETTER DZZE"); ("/xea/x9a/x8a", "CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK"); ("/xea/x9a/x8b", "CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK"); ("/xea/x9a/x8c", "CYRILLIC CAPITAL LETTER TWE"); ("/xea/x9a/x8d", "CYRILLIC SMALL LETTER TWE"); ("/xea/x9a/x8e", "CYRILLIC CAPITAL LETTER TSWE"); ("/xea/x9a/x8f", "CYRILLIC SMALL LETTER TSWE"); ("/xea/x9a/x90", "CYRILLIC CAPITAL LETTER TSSE"); ("/xea/x9a/x91", "CYRILLIC SMALL LETTER TSSE"); ("/xea/x9a/x92", "CYRILLIC CAPITAL LETTER TCHE"); ("/xea/x9a/x93", "CYRILLIC SMALL LETTER TCHE"); ("/xea/x9a/x94", "CYRILLIC CAPITAL LETTER HWE"); ("/xea/x9a/x95", "CYRILLIC SMALL LETTER HWE"); ("/xea/x9a/x96", "CYRILLIC CAPITAL LETTER SHWE"); ("/xea/x9a/x97", "CYRILLIC SMALL LETTER SHWE"); ("/xea/x9c/xa2", "LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF"); ("/xea/x9c/xa3", "LATIN SMALL LETTER EGYPTOLOGICAL ALEF"); ("/xea/x9c/xa4", "LATIN CAPITAL LETTER EGYPTOLOGICAL AIN"); ("/xea/x9c/xa5", "LATIN SMALL LETTER EGYPTOLOGICAL AIN"); ("/xea/x9c/xa6", "LATIN CAPITAL LETTER HENG"); ("/xea/x9c/xa7", "LATIN SMALL LETTER HENG"); ("/xea/x9c/xa8", "LATIN CAPITAL LETTER TZ"); ("/xea/x9c/xa9", "LATIN SMALL LETTER TZ"); ("/xea/x9c/xaa", "LATIN CAPITAL LETTER TRESILLO"); ("/xea/x9c/xab", "LATIN SMALL LETTER TRESILLO"); ("/xea/x9c/xac", "LATIN CAPITAL LETTER CUATRILLO"); ("/xea/x9c/xad", "LATIN SMALL LETTER CUATRILLO"); ("/xea/x9c/xae", "LATIN CAPITAL LETTER CUATRILLO WITH COMMA"); ("/xea/x9c/xaf", "LATIN SMALL LETTER CUATRILLO WITH COMMA"); ("/xea/x9c/xb0", "LATIN LETTER SMALL CAPITAL F"); ("/xea/x9c/xb1", "LATIN LETTER SMALL CAPITAL S"); ("/xea/x9c/xb2", "LATIN CAPITAL LETTER AA"); ("/xea/x9c/xb3", "LATIN SMALL LETTER AA"); ("/xea/x9c/xb4", "LATIN CAPITAL LETTER AO"); ("/xea/x9c/xb5", "LATIN SMALL LETTER AO"); ("/xea/x9c/xb6", "LATIN CAPITAL LETTER AU"); ("/xea/x9c/xb7", "LATIN SMALL LETTER AU"); ("/xea/x9c/xb8", "LATIN CAPITAL LETTER AV"); ("/xea/x9c/xb9", "LATIN SMALL LETTER AV"); ("/xea/x9c/xba", "LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR"); ("/xea/x9c/xbb", "LATIN SMALL LETTER AV WITH HORIZONTAL BAR"); ("/xea/x9c/xbc", "LATIN CAPITAL LETTER AY"); ("/xea/x9c/xbd", "LATIN SMALL LETTER AY"); ("/xea/x9c/xbe", "LATIN CAPITAL LETTER REVERSED C WITH DOT"); ("/xea/x9c/xbf", "LATIN SMALL LETTER REVERSED C WITH DOT"); ("/xea/x9d/x80", "LATIN CAPITAL LETTER K WITH STROKE"); ("/xea/x9d/x81", "LATIN SMALL LETTER K WITH STROKE"); ("/xea/x9d/x82", "LATIN CAPITAL LETTER K WITH DIAGONAL STROKE"); ("/xea/x9d/x83", "LATIN SMALL LETTER K WITH DIAGONAL STROKE"); ("/xea/x9d/x84", "LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE"); ("/xea/x9d/x85", "LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE"); ("/xea/x9d/x86", "LATIN CAPITAL LETTER BROKEN L"); ("/xea/x9d/x87", "LATIN SMALL LETTER BROKEN L"); ("/xea/x9d/x88", "LATIN CAPITAL LETTER L WITH HIGH STROKE"); ("/xea/x9d/x89", "LATIN SMALL LETTER L WITH HIGH STROKE"); ("/xea/x9d/x8a", "LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY"); ("/xea/x9d/x8b", "LATIN SMALL LETTER O WITH LONG STROKE OVERLAY"); ("/xea/x9d/x8c", "LATIN CAPITAL LETTER O WITH LOOP"); ("/xea/x9d/x8d", "LATIN SMALL LETTER O WITH LOOP"); ("/xea/x9d/x8e", "LATIN CAPITAL LETTER OO"); ("/xea/x9d/x8f", "LATIN SMALL LETTER OO"); ("/xea/x9d/x90", "LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER"); ("/xea/x9d/x91", "LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER"); ("/xea/x9d/x92", "LATIN CAPITAL LETTER P WITH FLOURISH"); ("/xea/x9d/x93", "LATIN SMALL LETTER P WITH FLOURISH"); ("/xea/x9d/x94", "LATIN CAPITAL LETTER P WITH SQUIRREL TAIL"); ("/xea/x9d/x95", "LATIN SMALL LETTER P WITH SQUIRREL TAIL"); ("/xea/x9d/x96", "LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER"); ("/xea/x9d/x97", "LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER"); ("/xea/x9d/x98", "LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE"); ("/xea/x9d/x99", "LATIN SMALL LETTER Q WITH DIAGONAL STROKE"); ("/xea/x9d/x9a", "LATIN CAPITAL LETTER R ROTUNDA"); ("/xea/x9d/x9b", "LATIN SMALL LETTER R ROTUNDA"); ("/xea/x9d/x9c", "LATIN CAPITAL LETTER RUM ROTUNDA"); ("/xea/x9d/x9d", "LATIN SMALL LETTER RUM ROTUNDA"); ("/xea/x9d/x9e", "LATIN CAPITAL LETTER V WITH DIAGONAL STROKE"); ("/xea/x9d/x9f", "LATIN SMALL LETTER V WITH DIAGONAL STROKE"); ("/xea/x9d/xa0", "LATIN CAPITAL LETTER VY"); ("/xea/x9d/xa1", "LATIN SMALL LETTER VY"); ("/xea/x9d/xa2", "LATIN CAPITAL LETTER VISIGOTHIC Z"); ("/xea/x9d/xa3", "LATIN SMALL LETTER VISIGOTHIC Z"); ("/xea/x9d/xa4", "LATIN CAPITAL LETTER THORN WITH STROKE"); ("/xea/x9d/xa5", "LATIN SMALL LETTER THORN WITH STROKE"); ("/xea/x9d/xa6", "LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER"); ("/xea/x9d/xa7", "LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER"); ("/xea/x9d/xa8", "LATIN CAPITAL LETTER VEND"); ("/xea/x9d/xa9", "LATIN SMALL LETTER VEND"); ("/xea/x9d/xaa", "LATIN CAPITAL LETTER ET"); ("/xea/x9d/xab", "LATIN SMALL LETTER ET"); ("/xea/x9d/xac", "LATIN CAPITAL LETTER IS"); ("/xea/x9d/xad", "LATIN SMALL LETTER IS"); ("/xea/x9d/xae", "LATIN CAPITAL LETTER CON"); ("/xea/x9d/xaf", "LATIN SMALL LETTER CON"); ("/xea/x9d/xb1", "LATIN SMALL LETTER DUM"); ("/xea/x9d/xb2", "LATIN SMALL LETTER LUM"); ("/xea/x9d/xb3", "LATIN SMALL LETTER MUM"); ("/xea/x9d/xb4", "LATIN SMALL LETTER NUM"); ("/xea/x9d/xb5", "LATIN SMALL LETTER RUM"); ("/xea/x9d/xb6", "LATIN LETTER SMALL CAPITAL RUM"); ("/xea/x9d/xb7", "LATIN SMALL LETTER TUM"); ("/xea/x9d/xb8", "LATIN SMALL LETTER UM"); ("/xea/x9d/xb9", "LATIN CAPITAL LETTER INSULAR D"); ("/xea/x9d/xba", "LATIN SMALL LETTER INSULAR D"); ("/xea/x9d/xbb", "LATIN CAPITAL LETTER INSULAR F"); ("/xea/x9d/xbc", "LATIN SMALL LETTER INSULAR F"); ("/xea/x9d/xbd", "LATIN CAPITAL LETTER INSULAR G"); ("/xea/x9d/xbe", "LATIN CAPITAL LETTER TURNED INSULAR G"); ("/xea/x9d/xbf", "LATIN SMALL LETTER TURNED INSULAR G"); ("/xea/x9e/x80", "LATIN CAPITAL LETTER TURNED L"); ("/xea/x9e/x81", "LATIN SMALL LETTER TURNED L"); ("/xea/x9e/x82", "LATIN CAPITAL LETTER INSULAR R"); ("/xea/x9e/x83", "LATIN SMALL LETTER INSULAR R"); ("/xea/x9e/x84", "LATIN CAPITAL LETTER INSULAR S"); ("/xea/x9e/x85", "LATIN SMALL LETTER INSULAR S"); ("/xea/x9e/x86", "LATIN CAPITAL LETTER INSULAR T"); ("/xea/x9e/x87", "LATIN SMALL LETTER INSULAR T"); ("/xea/x9e/x8b", "LATIN CAPITAL LETTER SALTILLO"); ("/xea/x9e/x8c", "LATIN SMALL LETTER SALTILLO"); ("/xea/xa1/x96", "PHAGS-PA LETTER SMALL A"); ("/xef/xac/x80", "LATIN SMALL LIGATURE FF"); ("/xef/xac/x81", "LATIN SMALL LIGATURE FI"); ("/xef/xac/x82", "LATIN SMALL LIGATURE FL"); ("/xef/xac/x83", "LATIN SMALL LIGATURE FFI"); ("/xef/xac/x84", "LATIN SMALL LIGATURE FFL"); ("/xef/xac/x85", "LATIN SMALL LIGATURE LONG S T"); ("/xef/xac/x86", "LATIN SMALL LIGATURE ST"); ("/xef/xac/x93", "ARMENIAN SMALL LIGATURE MEN NOW"); ("/xef/xac/x94", "ARMENIAN SMALL LIGATURE MEN ECH"); ("/xef/xac/x95", "ARMENIAN SMALL LIGATURE MEN INI"); ("/xef/xac/x96", "ARMENIAN SMALL LIGATURE VEW NOW"); ("/xef/xac/x97", "ARMENIAN SMALL LIGATURE MEN XEH"); ("/xef/xb9/x90", "SMALL COMMA"); ("/xef/xb9/x91", "SMALL IDEOGRAPHIC COMMA"); ("/xef/xb9/x92", "SMALL FULL STOP"); ("/xef/xb9/x94", "SMALL SEMICOLON"); ("/xef/xb9/x95", "SMALL COLON"); ("/xef/xb9/x96", "SMALL QUESTION MARK"); ("/xef/xb9/x97", "SMALL EXCLAMATION MARK"); ("/xef/xb9/x98", "SMALL EM DASH"); ("/xef/xb9/x99", "SMALL LEFT PARENTHESIS"); ("/xef/xb9/x9a", "SMALL RIGHT PARENTHESIS"); ("/xef/xb9/x9b", "SMALL LEFT CURLY BRACKET"); ("/xef/xb9/x9c", "SMALL RIGHT CURLY BRACKET"); ("/xef/xb9/x9d", "SMALL LEFT TORTOISE SHELL BRACKET"); ("/xef/xb9/x9e", "SMALL RIGHT TORTOISE SHELL BRACKET"); ("/xef/xb9/x9f", "SMALL NUMBER SIGN"); ("/xef/xb9/xa0", "SMALL AMPERSAND"); ("/xef/xb9/xa1", "SMALL ASTERISK"); ("/xef/xb9/xa2", "SMALL PLUS SIGN"); ("/xef/xb9/xa3", "SMALL HYPHEN-MINUS"); ("/xef/xb9/xa4", "SMALL LESS-THAN SIGN"); ("/xef/xb9/xa5", "SMALL GREATER-THAN SIGN"); ("/xef/xb9/xa6", "SMALL EQUALS SIGN"); ("/xef/xb9/xa8", "SMALL REVERSE SOLIDUS"); ("/xef/xb9/xa9", "SMALL DOLLAR SIGN"); ("/xef/xb9/xaa", "SMALL PERCENT SIGN"); ("/xef/xb9/xab", "SMALL COMMERCIAL AT"); ("/xef/xbc/xa1", "FULLWIDTH LATIN CAPITAL LETTER A"); ("/xef/xbc/xa2", "FULLWIDTH LATIN CAPITAL LETTER B"); ("/xef/xbc/xa3", "FULLWIDTH LATIN CAPITAL LETTER C"); ("/xef/xbc/xa4", "FULLWIDTH LATIN CAPITAL LETTER D"); ("/xef/xbc/xa5", "FULLWIDTH LATIN CAPITAL LETTER E"); ("/xef/xbc/xa6", "FULLWIDTH LATIN CAPITAL LETTER F"); ("/xef/xbc/xa7", "FULLWIDTH LATIN CAPITAL LETTER G"); ("/xef/xbc/xa8", "FULLWIDTH LATIN CAPITAL LETTER H"); ("/xef/xbc/xa9", "FULLWIDTH LATIN CAPITAL LETTER I"); ("/xef/xbc/xaa", "FULLWIDTH LATIN CAPITAL LETTER J"); ("/xef/xbc/xab", "FULLWIDTH LATIN CAPITAL LETTER K"); ("/xef/xbc/xac", "FULLWIDTH LATIN CAPITAL LETTER L"); ("/xef/xbc/xad", "FULLWIDTH LATIN CAPITAL LETTER M"); ("/xef/xbc/xae", "FULLWIDTH LATIN CAPITAL LETTER N"); ("/xef/xbc/xaf", "FULLWIDTH LATIN CAPITAL LETTER O"); ("/xef/xbc/xb0", "FULLWIDTH LATIN CAPITAL LETTER P"); ("/xef/xbc/xb1", "FULLWIDTH LATIN CAPITAL LETTER Q"); ("/xef/xbc/xb2", "FULLWIDTH LATIN CAPITAL LETTER R"); ("/xef/xbc/xb3", "FULLWIDTH LATIN CAPITAL LETTER S"); ("/xef/xbc/xb4", "FULLWIDTH LATIN CAPITAL LETTER T"); ("/xef/xbc/xb5", "FULLWIDTH LATIN CAPITAL LETTER U"); ("/xef/xbc/xb6", "FULLWIDTH LATIN CAPITAL LETTER V"); ("/xef/xbc/xb7", "FULLWIDTH LATIN CAPITAL LETTER W"); ("/xef/xbc/xb8", "FULLWIDTH LATIN CAPITAL LETTER X"); ("/xef/xbc/xb9", "FULLWIDTH LATIN CAPITAL LETTER Y"); ("/xef/xbc/xba", "FULLWIDTH LATIN CAPITAL LETTER Z"); ("/xef/xbd/x81", "FULLWIDTH LATIN SMALL LETTER A"); ("/xef/xbd/x82", "FULLWIDTH LATIN SMALL LETTER B"); ("/xef/xbd/x83", "FULLWIDTH LATIN SMALL LETTER C"); ("/xef/xbd/x84", "FULLWIDTH LATIN SMALL LETTER D"); ("/xef/xbd/x85", "FULLWIDTH LATIN SMALL LETTER E"); ("/xef/xbd/x86", "FULLWIDTH LATIN SMALL LETTER F"); ("/xef/xbd/x87", "FULLWIDTH LATIN SMALL LETTER G"); ("/xef/xbd/x88", "FULLWIDTH LATIN SMALL LETTER H"); ("/xef/xbd/x89", "FULLWIDTH LATIN SMALL LETTER I"); ("/xef/xbd/x8a", "FULLWIDTH LATIN SMALL LETTER J"); ("/xef/xbd/x8b", "FULLWIDTH LATIN SMALL LETTER K"); ("/xef/xbd/x8c", "FULLWIDTH LATIN SMALL LETTER L"); ("/xef/xbd/x8d", "FULLWIDTH LATIN SMALL LETTER M"); ("/xef/xbd/x8e", "FULLWIDTH LATIN SMALL LETTER N"); ("/xef/xbd/x8f", "FULLWIDTH LATIN SMALL LETTER O"); ("/xef/xbd/x90", "FULLWIDTH LATIN SMALL LETTER P"); ("/xef/xbd/x91", "FULLWIDTH LATIN SMALL LETTER Q"); ("/xef/xbd/x92", "FULLWIDTH LATIN SMALL LETTER R"); ("/xef/xbd/x93", "FULLWIDTH LATIN SMALL LETTER S"); ("/xef/xbd/x94", "FULLWIDTH LATIN SMALL LETTER T"); ("/xef/xbd/x95", "FULLWIDTH LATIN SMALL LETTER U"); ("/xef/xbd/x96", "FULLWIDTH LATIN SMALL LETTER V"); ("/xef/xbd/x97", "FULLWIDTH LATIN SMALL LETTER W"); ("/xef/xbd/x98", "FULLWIDTH LATIN SMALL LETTER X"); ("/xef/xbd/x99", "FULLWIDTH LATIN SMALL LETTER Y"); ("/xef/xbd/x9a", "FULLWIDTH LATIN SMALL LETTER Z"); ("/xef/xbd/xa7", "HALFWIDTH KATAKANA LETTER SMALL A"); ("/xef/xbd/xa8", "HALFWIDTH KATAKANA LETTER SMALL I"); ("/xef/xbd/xa9", "HALFWIDTH KATAKANA LETTER SMALL U"); ("/xef/xbd/xaa", "HALFWIDTH KATAKANA LETTER SMALL E"); ("/xef/xbd/xab", "HALFWIDTH KATAKANA LETTER SMALL O"); ("/xef/xbd/xac", "HALFWIDTH KATAKANA LETTER SMALL YA"); ("/xef/xbd/xad", "HALFWIDTH KATAKANA LETTER SMALL YU"); ("/xef/xbd/xae", "HALFWIDTH KATAKANA LETTER SMALL YO"); ("/xef/xbd/xaf", "HALFWIDTH KATAKANA LETTER SMALL TU"); ("/xf0/x90/x87/xbb", "PHAISTOS DISC SIGN SMALL AXE"); ("/xf0/x90/x90/x80", "DESERET CAPITAL LETTER LONG I"); ("/xf0/x90/x90/x81", "DESERET CAPITAL LETTER LONG E"); ("/xf0/x90/x90/x82", "DESERET CAPITAL LETTER LONG A"); ("/xf0/x90/x90/x83", "DESERET CAPITAL LETTER LONG AH"); ("/xf0/x90/x90/x84", "DESERET CAPITAL LETTER LONG O"); ("/xf0/x90/x90/x85", "DESERET CAPITAL LETTER LONG OO"); ("/xf0/x90/x90/x86", "DESERET CAPITAL LETTER SHORT I"); ("/xf0/x90/x90/x87", "DESERET CAPITAL LETTER SHORT E"); ("/xf0/x90/x90/x88", "DESERET CAPITAL LETTER SHORT A"); ("/xf0/x90/x90/x89", "DESERET CAPITAL LETTER SHORT AH"); ("/xf0/x90/x90/x8a", "DESERET CAPITAL LETTER SHORT O"); ("/xf0/x90/x90/x8b", "DESERET CAPITAL LETTER SHORT OO"); ("/xf0/x90/x90/x8c", "DESERET CAPITAL LETTER AY"); ("/xf0/x90/x90/x8d", "DESERET CAPITAL LETTER OW"); ("/xf0/x90/x90/x8e", "DESERET CAPITAL LETTER WU"); ("/xf0/x90/x90/x8f", "DESERET CAPITAL LETTER YEE"); ("/xf0/x90/x90/x90", "DESERET CAPITAL LETTER H"); ("/xf0/x90/x90/x91", "DESERET CAPITAL LETTER PEE"); ("/xf0/x90/x90/x92", "DESERET CAPITAL LETTER BEE"); ("/xf0/x90/x90/x93", "DESERET CAPITAL LETTER TEE"); ("/xf0/x90/x90/x94", "DESERET CAPITAL LETTER DEE"); ("/xf0/x90/x90/x95", "DESERET CAPITAL LETTER CHEE"); ("/xf0/x90/x90/x96", "DESERET CAPITAL LETTER JEE"); ("/xf0/x90/x90/x97", "DESERET CAPITAL LETTER KAY"); ("/xf0/x90/x90/x98", "DESERET CAPITAL LETTER GAY"); ("/xf0/x90/x90/x99", "DESERET CAPITAL LETTER EF"); ("/xf0/x90/x90/x9a", "DESERET CAPITAL LETTER VEE"); ("/xf0/x90/x90/x9b", "DESERET CAPITAL LETTER ETH"); ("/xf0/x90/x90/x9c", "DESERET CAPITAL LETTER THEE"); ("/xf0/x90/x90/x9d", "DESERET CAPITAL LETTER ES"); ("/xf0/x90/x90/x9e", "DESERET CAPITAL LETTER ZEE"); ("/xf0/x90/x90/x9f", "DESERET CAPITAL LETTER ESH"); ("/xf0/x90/x90/xa0", "DESERET CAPITAL LETTER ZHEE"); ("/xf0/x90/x90/xa1", "DESERET CAPITAL LETTER ER"); ("/xf0/x90/x90/xa2", "DESERET CAPITAL LETTER EL"); ("/xf0/x90/x90/xa3", "DESERET CAPITAL LETTER EM"); ("/xf0/x90/x90/xa4", "DESERET CAPITAL LETTER EN"); ("/xf0/x90/x90/xa5", "DESERET CAPITAL LETTER ENG"); ("/xf0/x90/x90/xa6", "DESERET CAPITAL LETTER OI"); ("/xf0/x90/x90/xa7", "DESERET CAPITAL LETTER EW"); ("/xf0/x90/x90/xa8", "DESERET SMALL LETTER LONG I"); ("/xf0/x90/x90/xa9", "DESERET SMALL LETTER LONG E"); ("/xf0/x90/x90/xaa", "DESERET SMALL LETTER LONG A"); ("/xf0/x90/x90/xab", "DESERET SMALL LETTER LONG AH"); ("/xf0/x90/x90/xac", "DESERET SMALL LETTER LONG O"); ("/xf0/x90/x90/xad", "DESERET SMALL LETTER LONG OO"); ("/xf0/x90/x90/xae", "DESERET SMALL LETTER SHORT I"); ("/xf0/x90/x90/xaf", "DESERET SMALL LETTER SHORT E"); ("/xf0/x90/x90/xb0", "DESERET SMALL LETTER SHORT A"); ("/xf0/x90/x90/xb1", "DESERET SMALL LETTER SHORT AH"); ("/xf0/x90/x90/xb2", "DESERET SMALL LETTER SHORT O"); ("/xf0/x90/x90/xb3", "DESERET SMALL LETTER SHORT OO"); ("/xf0/x90/x90/xb4", "DESERET SMALL LETTER AY"); ("/xf0/x90/x90/xb5", "DESERET SMALL LETTER OW"); ("/xf0/x90/x90/xb6", "DESERET SMALL LETTER WU"); ("/xf0/x90/x90/xb7", "DESERET SMALL LETTER YEE"); ("/xf0/x90/x90/xb8", "DESERET SMALL LETTER H"); ("/xf0/x90/x90/xb9", "DESERET SMALL LETTER PEE"); ("/xf0/x90/x90/xba", "DESERET SMALL LETTER BEE"); ("/xf0/x90/x90/xbb", "DESERET SMALL LETTER TEE"); ("/xf0/x90/x90/xbc", "DESERET SMALL LETTER DEE"); ("/xf0/x90/x90/xbd", "DESERET SMALL LETTER CHEE"); ("/xf0/x90/x90/xbe", "DESERET SMALL LETTER JEE"); ("/xf0/x90/x90/xbf", "DESERET SMALL LETTER KAY"); ("/xf0/x90/x91/x80", "DESERET SMALL LETTER GAY"); ("/xf0/x90/x91/x81", "DESERET SMALL LETTER EF"); ("/xf0/x90/x91/x82", "DESERET SMALL LETTER VEE"); ("/xf0/x90/x91/x83", "DESERET SMALL LETTER ETH"); ("/xf0/x90/x91/x84", "DESERET SMALL LETTER THEE"); ("/xf0/x90/x91/x85", "DESERET SMALL LETTER ES"); ("/xf0/x90/x91/x86", "DESERET SMALL LETTER ZEE"); ("/xf0/x90/x91/x87", "DESERET SMALL LETTER ESH"); ("/xf0/x90/x91/x88", "DESERET SMALL LETTER ZHEE"); ("/xf0/x90/x91/x89", "DESERET SMALL LETTER ER"); ("/xf0/x90/x91/x8a", "DESERET SMALL LETTER EL"); ("/xf0/x90/x91/x8b", "DESERET SMALL LETTER EM"); ("/xf0/x90/x91/x8c", "DESERET SMALL LETTER EN"); ("/xf0/x90/x91/x8d", "DESERET SMALL LETTER ENG"); ("/xf0/x90/x91/x8e", "DESERET SMALL LETTER OI"); ("/xf0/x90/x91/x8f", "DESERET SMALL LETTER EW"); ("/xf0/x90/xa9/x91", "KHAROSHTHI PUNCTUATION SMALL CIRCLE"); ("/xf0/x9d/x8c/x8a", "TETRAGRAM FOR KEEPING SMALL"); ("/xf0/x9d/x90/x80", "MATHEMATICAL BOLD CAPITAL A"); ("/xf0/x9d/x90/x81", "MATHEMATICAL BOLD CAPITAL B"); ("/xf0/x9d/x90/x82", "MATHEMATICAL BOLD CAPITAL C"); ("/xf0/x9d/x90/x83", "MATHEMATICAL BOLD CAPITAL D"); ("/xf0/x9d/x90/x84", "MATHEMATICAL BOLD CAPITAL E"); ("/xf0/x9d/x90/x85", "MATHEMATICAL BOLD CAPITAL F"); ("/xf0/x9d/x90/x86", "MATHEMATICAL BOLD CAPITAL G"); ("/xf0/x9d/x90/x87", "MATHEMATICAL BOLD CAPITAL H"); ("/xf0/x9d/x90/x88", "MATHEMATICAL BOLD CAPITAL I"); ("/xf0/x9d/x90/x89", "MATHEMATICAL BOLD CAPITAL J"); ("/xf0/x9d/x90/x8a", "MATHEMATICAL BOLD CAPITAL K"); ("/xf0/x9d/x90/x8b", "MATHEMATICAL BOLD CAPITAL L"); ("/xf0/x9d/x90/x8c", "MATHEMATICAL BOLD CAPITAL M"); ("/xf0/x9d/x90/x8d", "MATHEMATICAL BOLD CAPITAL N"); ("/xf0/x9d/x90/x8e", "MATHEMATICAL BOLD CAPITAL O"); ("/xf0/x9d/x90/x8f", "MATHEMATICAL BOLD CAPITAL P"); ("/xf0/x9d/x90/x90", "MATHEMATICAL BOLD CAPITAL Q"); ("/xf0/x9d/x90/x91", "MATHEMATICAL BOLD CAPITAL R"); ("/xf0/x9d/x90/x92", "MATHEMATICAL BOLD CAPITAL S"); ("/xf0/x9d/x90/x93", "MATHEMATICAL BOLD CAPITAL T"); ("/xf0/x9d/x90/x94", "MATHEMATICAL BOLD CAPITAL U"); ("/xf0/x9d/x90/x95", "MATHEMATICAL BOLD CAPITAL V"); ("/xf0/x9d/x90/x96", "MATHEMATICAL BOLD CAPITAL W"); ("/xf0/x9d/x90/x97", "MATHEMATICAL BOLD CAPITAL X"); ("/xf0/x9d/x90/x98", "MATHEMATICAL BOLD CAPITAL Y"); ("/xf0/x9d/x90/x99", "MATHEMATICAL BOLD CAPITAL Z"); ("/xf0/x9d/x90/x9a", "MATHEMATICAL BOLD SMALL A"); ("/xf0/x9d/x90/x9b", "MATHEMATICAL BOLD SMALL B"); ("/xf0/x9d/x90/x9c", "MATHEMATICAL BOLD SMALL C"); ("/xf0/x9d/x90/x9d", "MATHEMATICAL BOLD SMALL D"); ("/xf0/x9d/x90/x9e", "MATHEMATICAL BOLD SMALL E"); ("/xf0/x9d/x90/x9f", "MATHEMATICAL BOLD SMALL F"); ("/xf0/x9d/x90/xa0", "MATHEMATICAL BOLD SMALL G"); ("/xf0/x9d/x90/xa1", "MATHEMATICAL BOLD SMALL H"); ("/xf0/x9d/x90/xa2", "MATHEMATICAL BOLD SMALL I"); ("/xf0/x9d/x90/xa3", "MATHEMATICAL BOLD SMALL J"); ("/xf0/x9d/x90/xa4", "MATHEMATICAL BOLD SMALL K"); ("/xf0/x9d/x90/xa5", "MATHEMATICAL BOLD SMALL L"); ("/xf0/x9d/x90/xa6", "MATHEMATICAL BOLD SMALL M"); ("/xf0/x9d/x90/xa7", "MATHEMATICAL BOLD SMALL N"); ("/xf0/x9d/x90/xa8", "MATHEMATICAL BOLD SMALL O"); ("/xf0/x9d/x90/xa9", "MATHEMATICAL BOLD SMALL P"); ("/xf0/x9d/x90/xaa", "MATHEMATICAL BOLD SMALL Q"); ("/xf0/x9d/x90/xab", "MATHEMATICAL BOLD SMALL R"); ("/xf0/x9d/x90/xac", "MATHEMATICAL BOLD SMALL S"); ("/xf0/x9d/x90/xad", "MATHEMATICAL BOLD SMALL T"); ("/xf0/x9d/x90/xae", "MATHEMATICAL BOLD SMALL U"); ("/xf0/x9d/x90/xaf", "MATHEMATICAL BOLD SMALL V"); ("/xf0/x9d/x90/xb0", "MATHEMATICAL BOLD SMALL W"); ("/xf0/x9d/x90/xb1", "MATHEMATICAL BOLD SMALL X"); ("/xf0/x9d/x90/xb2", "MATHEMATICAL BOLD SMALL Y"); ("/xf0/x9d/x90/xb3", "MATHEMATICAL BOLD SMALL Z"); ("/xf0/x9d/x90/xb4", "MATHEMATICAL ITALIC CAPITAL A"); ("/xf0/x9d/x90/xb5", "MATHEMATICAL ITALIC CAPITAL B"); ("/xf0/x9d/x90/xb6", "MATHEMATICAL ITALIC CAPITAL C"); ("/xf0/x9d/x90/xb7", "MATHEMATICAL ITALIC CAPITAL D"); ("/xf0/x9d/x90/xb8", "MATHEMATICAL ITALIC CAPITAL E"); ("/xf0/x9d/x90/xb9", "MATHEMATICAL ITALIC CAPITAL F"); ("/xf0/x9d/x90/xba", "MATHEMATICAL ITALIC CAPITAL G"); ("/xf0/x9d/x90/xbb", "MATHEMATICAL ITALIC CAPITAL H"); ("/xf0/x9d/x90/xbc", "MATHEMATICAL ITALIC CAPITAL I"); ("/xf0/x9d/x90/xbd", "MATHEMATICAL ITALIC CAPITAL J"); ("/xf0/x9d/x90/xbe", "MATHEMATICAL ITALIC CAPITAL K"); ("/xf0/x9d/x90/xbf", "MATHEMATICAL ITALIC CAPITAL L"); ("/xf0/x9d/x91/x80", "MATHEMATICAL ITALIC CAPITAL M"); ("/xf0/x9d/x91/x81", "MATHEMATICAL ITALIC CAPITAL N"); ("/xf0/x9d/x91/x82", "MATHEMATICAL ITALIC CAPITAL O"); ("/xf0/x9d/x91/x83", "MATHEMATICAL ITALIC CAPITAL P"); ("/xf0/x9d/x91/x84", "MATHEMATICAL ITALIC CAPITAL Q"); ("/xf0/x9d/x91/x85", "MATHEMATICAL ITALIC CAPITAL R"); ("/xf0/x9d/x91/x86", "MATHEMATICAL ITALIC CAPITAL S"); ("/xf0/x9d/x91/x87", "MATHEMATICAL ITALIC CAPITAL T"); ("/xf0/x9d/x91/x88", "MATHEMATICAL ITALIC CAPITAL U"); ("/xf0/x9d/x91/x89", "MATHEMATICAL ITALIC CAPITAL V"); ("/xf0/x9d/x91/x8a", "MATHEMATICAL ITALIC CAPITAL W"); ("/xf0/x9d/x91/x8b", "MATHEMATICAL ITALIC CAPITAL X"); ("/xf0/x9d/x91/x8c", "MATHEMATICAL ITALIC CAPITAL Y"); ("/xf0/x9d/x91/x8d", "MATHEMATICAL ITALIC CAPITAL Z"); ("/xf0/x9d/x91/x8e", "MATHEMATICAL ITALIC SMALL A"); ("/xf0/x9d/x91/x8f", "MATHEMATICAL ITALIC SMALL B"); ("/xf0/x9d/x91/x90", "MATHEMATICAL ITALIC SMALL C"); ("/xf0/x9d/x91/x91", "MATHEMATICAL ITALIC SMALL D"); ("/xf0/x9d/x91/x92", "MATHEMATICAL ITALIC SMALL E"); ("/xf0/x9d/x91/x93", "MATHEMATICAL ITALIC SMALL F"); ("/xf0/x9d/x91/x94", "MATHEMATICAL ITALIC SMALL G"); ("/xf0/x9d/x91/x96", "MATHEMATICAL ITALIC SMALL I"); ("/xf0/x9d/x91/x97", "MATHEMATICAL ITALIC SMALL J"); ("/xf0/x9d/x91/x98", "MATHEMATICAL ITALIC SMALL K"); ("/xf0/x9d/x91/x99", "MATHEMATICAL ITALIC SMALL L"); ("/xf0/x9d/x91/x9a", "MATHEMATICAL ITALIC SMALL M"); ("/xf0/x9d/x91/x9b", "MATHEMATICAL ITALIC SMALL N"); ("/xf0/x9d/x91/x9c", "MATHEMATICAL ITALIC SMALL O"); ("/xf0/x9d/x91/x9d", "MATHEMATICAL ITALIC SMALL P"); ("/xf0/x9d/x91/x9e", "MATHEMATICAL ITALIC SMALL Q"); ("/xf0/x9d/x91/x9f", "MATHEMATICAL ITALIC SMALL R"); ("/xf0/x9d/x91/xa0", "MATHEMATICAL ITALIC SMALL S"); ("/xf0/x9d/x91/xa1", "MATHEMATICAL ITALIC SMALL T"); ("/xf0/x9d/x91/xa2", "MATHEMATICAL ITALIC SMALL U"); ("/xf0/x9d/x91/xa3", "MATHEMATICAL ITALIC SMALL V"); ("/xf0/x9d/x91/xa4", "MATHEMATICAL ITALIC SMALL W"); ("/xf0/x9d/x91/xa5", "MATHEMATICAL ITALIC SMALL X"); ("/xf0/x9d/x91/xa6", "MATHEMATICAL ITALIC SMALL Y"); ("/xf0/x9d/x91/xa7", "MATHEMATICAL ITALIC SMALL Z"); ("/xf0/x9d/x91/xa8", "MATHEMATICAL BOLD ITALIC CAPITAL A"); ("/xf0/x9d/x91/xa9", "MATHEMATICAL BOLD ITALIC CAPITAL B"); ("/xf0/x9d/x91/xaa", "MATHEMATICAL BOLD ITALIC CAPITAL C"); ("/xf0/x9d/x91/xab", "MATHEMATICAL BOLD ITALIC CAPITAL D"); ("/xf0/x9d/x91/xac", "MATHEMATICAL BOLD ITALIC CAPITAL E"); ("/xf0/x9d/x91/xad", "MATHEMATICAL BOLD ITALIC CAPITAL F"); ("/xf0/x9d/x91/xae", "MATHEMATICAL BOLD ITALIC CAPITAL G"); ("/xf0/x9d/x91/xaf", "MATHEMATICAL BOLD ITALIC CAPITAL H"); ("/xf0/x9d/x91/xb0", "MATHEMATICAL BOLD ITALIC CAPITAL I"); ("/xf0/x9d/x91/xb1", "MATHEMATICAL BOLD ITALIC CAPITAL J"); ("/xf0/x9d/x91/xb2", "MATHEMATICAL BOLD ITALIC CAPITAL K"); ("/xf0/x9d/x91/xb3", "MATHEMATICAL BOLD ITALIC CAPITAL L"); ("/xf0/x9d/x91/xb4", "MATHEMATICAL BOLD ITALIC CAPITAL M"); ("/xf0/x9d/x91/xb5", "MATHEMATICAL BOLD ITALIC CAPITAL N"); ("/xf0/x9d/x91/xb6", "MATHEMATICAL BOLD ITALIC CAPITAL O"); ("/xf0/x9d/x91/xb7", "MATHEMATICAL BOLD ITALIC CAPITAL P"); ("/xf0/x9d/x91/xb8", "MATHEMATICAL BOLD ITALIC CAPITAL Q"); ("/xf0/x9d/x91/xb9", "MATHEMATICAL BOLD ITALIC CAPITAL R"); ("/xf0/x9d/x91/xba", "MATHEMATICAL BOLD ITALIC CAPITAL S"); ("/xf0/x9d/x91/xbb", "MATHEMATICAL BOLD ITALIC CAPITAL T"); ("/xf0/x9d/x91/xbc", "MATHEMATICAL BOLD ITALIC CAPITAL U"); ("/xf0/x9d/x91/xbd", "MATHEMATICAL BOLD ITALIC CAPITAL V"); ("/xf0/x9d/x91/xbe", "MATHEMATICAL BOLD ITALIC CAPITAL W"); ("/xf0/x9d/x91/xbf", "MATHEMATICAL BOLD ITALIC CAPITAL X"); ("/xf0/x9d/x92/x80", "MATHEMATICAL BOLD ITALIC CAPITAL Y"); ("/xf0/x9d/x92/x81", "MATHEMATICAL BOLD ITALIC CAPITAL Z"); ("/xf0/x9d/x92/x82", "MATHEMATICAL BOLD ITALIC SMALL A"); ("/xf0/x9d/x92/x83", "MATHEMATICAL BOLD ITALIC SMALL B"); ("/xf0/x9d/x92/x84", "MATHEMATICAL BOLD ITALIC SMALL C"); ("/xf0/x9d/x92/x85", "MATHEMATICAL BOLD ITALIC SMALL D"); ("/xf0/x9d/x92/x86", "MATHEMATICAL BOLD ITALIC SMALL E"); ("/xf0/x9d/x92/x87", "MATHEMATICAL BOLD ITALIC SMALL F"); ("/xf0/x9d/x92/x88", "MATHEMATICAL BOLD ITALIC SMALL G"); ("/xf0/x9d/x92/x89", "MATHEMATICAL BOLD ITALIC SMALL H"); ("/xf0/x9d/x92/x8a", "MATHEMATICAL BOLD ITALIC SMALL I"); ("/xf0/x9d/x92/x8b", "MATHEMATICAL BOLD ITALIC SMALL J"); ("/xf0/x9d/x92/x8c", "MATHEMATICAL BOLD ITALIC SMALL K"); ("/xf0/x9d/x92/x8d", "MATHEMATICAL BOLD ITALIC SMALL L"); ("/xf0/x9d/x92/x8e", "MATHEMATICAL BOLD ITALIC SMALL M"); ("/xf0/x9d/x92/x8f", "MATHEMATICAL BOLD ITALIC SMALL N"); ("/xf0/x9d/x92/x90", "MATHEMATICAL BOLD ITALIC SMALL O"); ("/xf0/x9d/x92/x91", "MATHEMATICAL BOLD ITALIC SMALL P"); ("/xf0/x9d/x92/x92", "MATHEMATICAL BOLD ITALIC SMALL Q"); ("/xf0/x9d/x92/x93", "MATHEMATICAL BOLD ITALIC SMALL R"); ("/xf0/x9d/x92/x94", "MATHEMATICAL BOLD ITALIC SMALL S"); ("/xf0/x9d/x92/x95", "MATHEMATICAL BOLD ITALIC SMALL T"); ("/xf0/x9d/x92/x96", "MATHEMATICAL BOLD ITALIC SMALL U"); ("/xf0/x9d/x92/x97", "MATHEMATICAL BOLD ITALIC SMALL V"); ("/xf0/x9d/x92/x98", "MATHEMATICAL BOLD ITALIC SMALL W"); ("/xf0/x9d/x92/x99", "MATHEMATICAL BOLD ITALIC SMALL X"); ("/xf0/x9d/x92/x9a", "MATHEMATICAL BOLD ITALIC SMALL Y"); ("/xf0/x9d/x92/x9b", "MATHEMATICAL BOLD ITALIC SMALL Z"); ("/xf0/x9d/x92/x9c", "MATHEMATICAL SCRIPT CAPITAL A"); ("/xf0/x9d/x92/x9e", "MATHEMATICAL SCRIPT CAPITAL C"); ("/xf0/x9d/x92/x9f", "MATHEMATICAL SCRIPT CAPITAL D"); ("/xf0/x9d/x92/xa2", "MATHEMATICAL SCRIPT CAPITAL G"); ("/xf0/x9d/x92/xa5", "MATHEMATICAL SCRIPT CAPITAL J"); ("/xf0/x9d/x92/xa6", "MATHEMATICAL SCRIPT CAPITAL K"); ("/xf0/x9d/x92/xa9", "MATHEMATICAL SCRIPT CAPITAL N"); ("/xf0/x9d/x92/xaa", "MATHEMATICAL SCRIPT CAPITAL O"); ("/xf0/x9d/x92/xab", "MATHEMATICAL SCRIPT CAPITAL P"); ("/xf0/x9d/x92/xac", "MATHEMATICAL SCRIPT CAPITAL Q"); ("/xf0/x9d/x92/xae", "MATHEMATICAL SCRIPT CAPITAL S"); ("/xf0/x9d/x92/xaf", "MATHEMATICAL SCRIPT CAPITAL T"); ("/xf0/x9d/x92/xb0", "MATHEMATICAL SCRIPT CAPITAL U"); ("/xf0/x9d/x92/xb1", "MATHEMATICAL SCRIPT CAPITAL V"); ("/xf0/x9d/x92/xb2", "MATHEMATICAL SCRIPT CAPITAL W"); ("/xf0/x9d/x92/xb3", "MATHEMATICAL SCRIPT CAPITAL X"); ("/xf0/x9d/x92/xb4", "MATHEMATICAL SCRIPT CAPITAL Y"); ("/xf0/x9d/x92/xb5", "MATHEMATICAL SCRIPT CAPITAL Z"); ("/xf0/x9d/x92/xb6", "MATHEMATICAL SCRIPT SMALL A"); ("/xf0/x9d/x92/xb7", "MATHEMATICAL SCRIPT SMALL B"); ("/xf0/x9d/x92/xb8", "MATHEMATICAL SCRIPT SMALL C"); ("/xf0/x9d/x92/xb9", "MATHEMATICAL SCRIPT SMALL D"); ("/xf0/x9d/x92/xbb", "MATHEMATICAL SCRIPT SMALL F"); ("/xf0/x9d/x92/xbd", "MATHEMATICAL SCRIPT SMALL H"); ("/xf0/x9d/x92/xbe", "MATHEMATICAL SCRIPT SMALL I"); ("/xf0/x9d/x92/xbf", "MATHEMATICAL SCRIPT SMALL J"); ("/xf0/x9d/x93/x80", "MATHEMATICAL SCRIPT SMALL K"); ("/xf0/x9d/x93/x81", "MATHEMATICAL SCRIPT SMALL L"); ("/xf0/x9d/x93/x82", "MATHEMATICAL SCRIPT SMALL M"); ("/xf0/x9d/x93/x83", "MATHEMATICAL SCRIPT SMALL N"); ("/xf0/x9d/x93/x85", "MATHEMATICAL SCRIPT SMALL P"); ("/xf0/x9d/x93/x86", "MATHEMATICAL SCRIPT SMALL Q"); ("/xf0/x9d/x93/x87", "MATHEMATICAL SCRIPT SMALL R"); ("/xf0/x9d/x93/x88", "MATHEMATICAL SCRIPT SMALL S"); ("/xf0/x9d/x93/x89", "MATHEMATICAL SCRIPT SMALL T"); ("/xf0/x9d/x93/x8a", "MATHEMATICAL SCRIPT SMALL U"); ("/xf0/x9d/x93/x8b", "MATHEMATICAL SCRIPT SMALL V"); ("/xf0/x9d/x93/x8c", "MATHEMATICAL SCRIPT SMALL W"); ("/xf0/x9d/x93/x8d", "MATHEMATICAL SCRIPT SMALL X"); ("/xf0/x9d/x93/x8e", "MATHEMATICAL SCRIPT SMALL Y"); ("/xf0/x9d/x93/x8f", "MATHEMATICAL SCRIPT SMALL Z"); ("/xf0/x9d/x93/x90", "MATHEMATICAL BOLD SCRIPT CAPITAL A"); ("/xf0/x9d/x93/x91", "MATHEMATICAL BOLD SCRIPT CAPITAL B"); ("/xf0/x9d/x93/x92", "MATHEMATICAL BOLD SCRIPT CAPITAL C"); ("/xf0/x9d/x93/x93", "MATHEMATICAL BOLD SCRIPT CAPITAL D"); ("/xf0/x9d/x93/x94", "MATHEMATICAL BOLD SCRIPT CAPITAL E"); ("/xf0/x9d/x93/x95", "MATHEMATICAL BOLD SCRIPT CAPITAL F"); ("/xf0/x9d/x93/x96", "MATHEMATICAL BOLD SCRIPT CAPITAL G"); ("/xf0/x9d/x93/x97", "MATHEMATICAL BOLD SCRIPT CAPITAL H"); ("/xf0/x9d/x93/x98", "MATHEMATICAL BOLD SCRIPT CAPITAL I"); ("/xf0/x9d/x93/x99", "MATHEMATICAL BOLD SCRIPT CAPITAL J"); ("/xf0/x9d/x93/x9a", "MATHEMATICAL BOLD SCRIPT CAPITAL K"); ("/xf0/x9d/x93/x9b", "MATHEMATICAL BOLD SCRIPT CAPITAL L"); ("/xf0/x9d/x93/x9c", "MATHEMATICAL BOLD SCRIPT CAPITAL M"); ("/xf0/x9d/x93/x9d", "MATHEMATICAL BOLD SCRIPT CAPITAL N"); ("/xf0/x9d/x93/x9e", "MATHEMATICAL BOLD SCRIPT CAPITAL O"); ("/xf0/x9d/x93/x9f", "MATHEMATICAL BOLD SCRIPT CAPITAL P"); ("/xf0/x9d/x93/xa0", "MATHEMATICAL BOLD SCRIPT CAPITAL Q"); ("/xf0/x9d/x93/xa1", "MATHEMATICAL BOLD SCRIPT CAPITAL R"); ("/xf0/x9d/x93/xa2", "MATHEMATICAL BOLD SCRIPT CAPITAL S"); ("/xf0/x9d/x93/xa3", "MATHEMATICAL BOLD SCRIPT CAPITAL T"); ("/xf0/x9d/x93/xa4", "MATHEMATICAL BOLD SCRIPT CAPITAL U"); ("/xf0/x9d/x93/xa5", "MATHEMATICAL BOLD SCRIPT CAPITAL V"); ("/xf0/x9d/x93/xa6", "MATHEMATICAL BOLD SCRIPT CAPITAL W"); ("/xf0/x9d/x93/xa7", "MATHEMATICAL BOLD SCRIPT CAPITAL X"); ("/xf0/x9d/x93/xa8", "MATHEMATICAL BOLD SCRIPT CAPITAL Y"); ("/xf0/x9d/x93/xa9", "MATHEMATICAL BOLD SCRIPT CAPITAL Z"); ("/xf0/x9d/x93/xaa", "MATHEMATICAL BOLD SCRIPT SMALL A"); ("/xf0/x9d/x93/xab", "MATHEMATICAL BOLD SCRIPT SMALL B"); ("/xf0/x9d/x93/xac", "MATHEMATICAL BOLD SCRIPT SMALL C"); ("/xf0/x9d/x93/xad", "MATHEMATICAL BOLD SCRIPT SMALL D"); ("/xf0/x9d/x93/xae", "MATHEMATICAL BOLD SCRIPT SMALL E"); ("/xf0/x9d/x93/xaf", "MATHEMATICAL BOLD SCRIPT SMALL F"); ("/xf0/x9d/x93/xb0", "MATHEMATICAL BOLD SCRIPT SMALL G"); ("/xf0/x9d/x93/xb1", "MATHEMATICAL BOLD SCRIPT SMALL H"); ("/xf0/x9d/x93/xb2", "MATHEMATICAL BOLD SCRIPT SMALL I"); ("/xf0/x9d/x93/xb3", "MATHEMATICAL BOLD SCRIPT SMALL J"); ("/xf0/x9d/x93/xb4", "MATHEMATICAL BOLD SCRIPT SMALL K"); ("/xf0/x9d/x93/xb5", "MATHEMATICAL BOLD SCRIPT SMALL L"); ("/xf0/x9d/x93/xb6", "MATHEMATICAL BOLD SCRIPT SMALL M"); ("/xf0/x9d/x93/xb7", "MATHEMATICAL BOLD SCRIPT SMALL N"); ("/xf0/x9d/x93/xb8", "MATHEMATICAL BOLD SCRIPT SMALL O"); ("/xf0/x9d/x93/xb9", "MATHEMATICAL BOLD SCRIPT SMALL P"); ("/xf0/x9d/x93/xba", "MATHEMATICAL BOLD SCRIPT SMALL Q"); ("/xf0/x9d/x93/xbb", "MATHEMATICAL BOLD SCRIPT SMALL R"); ("/xf0/x9d/x93/xbc", "MATHEMATICAL BOLD SCRIPT SMALL S"); ("/xf0/x9d/x93/xbd", "MATHEMATICAL BOLD SCRIPT SMALL T"); ("/xf0/x9d/x93/xbe", "MATHEMATICAL BOLD SCRIPT SMALL U"); ("/xf0/x9d/x93/xbf", "MATHEMATICAL BOLD SCRIPT SMALL V"); ("/xf0/x9d/x94/x80", "MATHEMATICAL BOLD SCRIPT SMALL W"); ("/xf0/x9d/x94/x81", "MATHEMATICAL BOLD SCRIPT SMALL X"); ("/xf0/x9d/x94/x82", "MATHEMATICAL BOLD SCRIPT SMALL Y"); ("/xf0/x9d/x94/x83", "MATHEMATICAL BOLD SCRIPT SMALL Z"); ("/xf0/x9d/x94/x84", "MATHEMATICAL FRAKTUR CAPITAL A"); ("/xf0/x9d/x94/x85", "MATHEMATICAL FRAKTUR CAPITAL B"); ("/xf0/x9d/x94/x87", "MATHEMATICAL FRAKTUR CAPITAL D"); ("/xf0/x9d/x94/x88", "MATHEMATICAL FRAKTUR CAPITAL E"); ("/xf0/x9d/x94/x89", "MATHEMATICAL FRAKTUR CAPITAL F"); ("/xf0/x9d/x94/x8a", "MATHEMATICAL FRAKTUR CAPITAL G"); ("/xf0/x9d/x94/x8d", "MATHEMATICAL FRAKTUR CAPITAL J"); ("/xf0/x9d/x94/x8e", "MATHEMATICAL FRAKTUR CAPITAL K"); ("/xf0/x9d/x94/x8f", "MATHEMATICAL FRAKTUR CAPITAL L"); ("/xf0/x9d/x94/x90", "MATHEMATICAL FRAKTUR CAPITAL M"); ("/xf0/x9d/x94/x91", "MATHEMATICAL FRAKTUR CAPITAL N"); ("/xf0/x9d/x94/x92", "MATHEMATICAL FRAKTUR CAPITAL O"); ("/xf0/x9d/x94/x93", "MATHEMATICAL FRAKTUR CAPITAL P"); ("/xf0/x9d/x94/x94", "MATHEMATICAL FRAKTUR CAPITAL Q"); ("/xf0/x9d/x94/x96", "MATHEMATICAL FRAKTUR CAPITAL S"); ("/xf0/x9d/x94/x97", "MATHEMATICAL FRAKTUR CAPITAL T"); ("/xf0/x9d/x94/x98", "MATHEMATICAL FRAKTUR CAPITAL U"); ("/xf0/x9d/x94/x99", "MATHEMATICAL FRAKTUR CAPITAL V"); ("/xf0/x9d/x94/x9a", "MATHEMATICAL FRAKTUR CAPITAL W"); ("/xf0/x9d/x94/x9b", "MATHEMATICAL FRAKTUR CAPITAL X"); ("/xf0/x9d/x94/x9c", "MATHEMATICAL FRAKTUR CAPITAL Y"); ("/xf0/x9d/x94/x9e", "MATHEMATICAL FRAKTUR SMALL A"); ("/xf0/x9d/x94/x9f", "MATHEMATICAL FRAKTUR SMALL B"); ("/xf0/x9d/x94/xa0", "MATHEMATICAL FRAKTUR SMALL C"); ("/xf0/x9d/x94/xa1", "MATHEMATICAL FRAKTUR SMALL D"); ("/xf0/x9d/x94/xa2", "MATHEMATICAL FRAKTUR SMALL E"); ("/xf0/x9d/x94/xa3", "MATHEMATICAL FRAKTUR SMALL F"); ("/xf0/x9d/x94/xa4", "MATHEMATICAL FRAKTUR SMALL G"); ("/xf0/x9d/x94/xa5", "MATHEMATICAL FRAKTUR SMALL H"); ("/xf0/x9d/x94/xa6", "MATHEMATICAL FRAKTUR SMALL I"); ("/xf0/x9d/x94/xa7", "MATHEMATICAL FRAKTUR SMALL J"); ("/xf0/x9d/x94/xa8", "MATHEMATICAL FRAKTUR SMALL K"); ("/xf0/x9d/x94/xa9", "MATHEMATICAL FRAKTUR SMALL L"); ("/xf0/x9d/x94/xaa", "MATHEMATICAL FRAKTUR SMALL M"); ("/xf0/x9d/x94/xab", "MATHEMATICAL FRAKTUR SMALL N"); ("/xf0/x9d/x94/xac", "MATHEMATICAL FRAKTUR SMALL O"); ("/xf0/x9d/x94/xad", "MATHEMATICAL FRAKTUR SMALL P"); ("/xf0/x9d/x94/xae", "MATHEMATICAL FRAKTUR SMALL Q"); ("/xf0/x9d/x94/xaf", "MATHEMATICAL FRAKTUR SMALL R"); ("/xf0/x9d/x94/xb0", "MATHEMATICAL FRAKTUR SMALL S"); ("/xf0/x9d/x94/xb1", "MATHEMATICAL FRAKTUR SMALL T"); ("/xf0/x9d/x94/xb2", "MATHEMATICAL FRAKTUR SMALL U"); ("/xf0/x9d/x94/xb3", "MATHEMATICAL FRAKTUR SMALL V"); ("/xf0/x9d/x94/xb4", "MATHEMATICAL FRAKTUR SMALL W"); ("/xf0/x9d/x94/xb5", "MATHEMATICAL FRAKTUR SMALL X"); ("/xf0/x9d/x94/xb6", "MATHEMATICAL FRAKTUR SMALL Y"); ("/xf0/x9d/x94/xb7", "MATHEMATICAL FRAKTUR SMALL Z"); ("/xf0/x9d/x94/xb8", "MATHEMATICAL DOUBLE-STRUCK CAPITAL A"); ("/xf0/x9d/x94/xb9", "MATHEMATICAL DOUBLE-STRUCK CAPITAL B"); ("/xf0/x9d/x94/xbb", "MATHEMATICAL DOUBLE-STRUCK CAPITAL D"); ("/xf0/x9d/x94/xbc", "MATHEMATICAL DOUBLE-STRUCK CAPITAL E"); ("/xf0/x9d/x94/xbd", "MATHEMATICAL DOUBLE-STRUCK CAPITAL F"); ("/xf0/x9d/x94/xbe", "MATHEMATICAL DOUBLE-STRUCK CAPITAL G"); ("/xf0/x9d/x95/x80", "MATHEMATICAL DOUBLE-STRUCK CAPITAL I"); ("/xf0/x9d/x95/x81", "MATHEMATICAL DOUBLE-STRUCK CAPITAL J"); ("/xf0/x9d/x95/x82", "MATHEMATICAL DOUBLE-STRUCK CAPITAL K"); ("/xf0/x9d/x95/x83", "MATHEMATICAL DOUBLE-STRUCK CAPITAL L"); ("/xf0/x9d/x95/x84", "MATHEMATICAL DOUBLE-STRUCK CAPITAL M"); ("/xf0/x9d/x95/x86", "MATHEMATICAL DOUBLE-STRUCK CAPITAL O"); ("/xf0/x9d/x95/x8a", "MATHEMATICAL DOUBLE-STRUCK CAPITAL S"); ("/xf0/x9d/x95/x8b", "MATHEMATICAL DOUBLE-STRUCK CAPITAL T"); ("/xf0/x9d/x95/x8c", "MATHEMATICAL DOUBLE-STRUCK CAPITAL U"); ("/xf0/x9d/x95/x8d", "MATHEMATICAL DOUBLE-STRUCK CAPITAL V"); ("/xf0/x9d/x95/x8e", "MATHEMATICAL DOUBLE-STRUCK CAPITAL W"); ("/xf0/x9d/x95/x8f", "MATHEMATICAL DOUBLE-STRUCK CAPITAL X"); ("/xf0/x9d/x95/x90", "MATHEMATICAL DOUBLE-STRUCK CAPITAL Y"); ("/xf0/x9d/x95/x92", "MATHEMATICAL DOUBLE-STRUCK SMALL A"); ("/xf0/x9d/x95/x93", "MATHEMATICAL DOUBLE-STRUCK SMALL B"); ("/xf0/x9d/x95/x94", "MATHEMATICAL DOUBLE-STRUCK SMALL C"); ("/xf0/x9d/x95/x95", "MATHEMATICAL DOUBLE-STRUCK SMALL D"); ("/xf0/x9d/x95/x96", "MATHEMATICAL DOUBLE-STRUCK SMALL E"); ("/xf0/x9d/x95/x97", "MATHEMATICAL DOUBLE-STRUCK SMALL F"); ("/xf0/x9d/x95/x98", "MATHEMATICAL DOUBLE-STRUCK SMALL G"); ("/xf0/x9d/x95/x99", "MATHEMATICAL DOUBLE-STRUCK SMALL H"); ("/xf0/x9d/x95/x9a", "MATHEMATICAL DOUBLE-STRUCK SMALL I"); ("/xf0/x9d/x95/x9b", "MATHEMATICAL DOUBLE-STRUCK SMALL J"); ("/xf0/x9d/x95/x9c", "MATHEMATICAL DOUBLE-STRUCK SMALL K"); ("/xf0/x9d/x95/x9d", "MATHEMATICAL DOUBLE-STRUCK SMALL L"); ("/xf0/x9d/x95/x9e", "MATHEMATICAL DOUBLE-STRUCK SMALL M"); ("/xf0/x9d/x95/x9f", "MATHEMATICAL DOUBLE-STRUCK SMALL N"); ("/xf0/x9d/x95/xa0", "MATHEMATICAL DOUBLE-STRUCK SMALL O"); ("/xf0/x9d/x95/xa1", "MATHEMATICAL DOUBLE-STRUCK SMALL P"); ("/xf0/x9d/x95/xa2", "MATHEMATICAL DOUBLE-STRUCK SMALL Q"); ("/xf0/x9d/x95/xa3", "MATHEMATICAL DOUBLE-STRUCK SMALL R"); ("/xf0/x9d/x95/xa4", "MATHEMATICAL DOUBLE-STRUCK SMALL S"); ("/xf0/x9d/x95/xa5", "MATHEMATICAL DOUBLE-STRUCK SMALL T"); ("/xf0/x9d/x95/xa6", "MATHEMATICAL DOUBLE-STRUCK SMALL U"); ("/xf0/x9d/x95/xa7", "MATHEMATICAL DOUBLE-STRUCK SMALL V"); ("/xf0/x9d/x95/xa8", "MATHEMATICAL DOUBLE-STRUCK SMALL W"); ("/xf0/x9d/x95/xa9", "MATHEMATICAL DOUBLE-STRUCK SMALL X"); ("/xf0/x9d/x95/xaa", "MATHEMATICAL DOUBLE-STRUCK SMALL Y"); ("/xf0/x9d/x95/xab", "MATHEMATICAL DOUBLE-STRUCK SMALL Z"); ("/xf0/x9d/x95/xac", "MATHEMATICAL BOLD FRAKTUR CAPITAL A"); ("/xf0/x9d/x95/xad", "MATHEMATICAL BOLD FRAKTUR CAPITAL B"); ("/xf0/x9d/x95/xae", "MATHEMATICAL BOLD FRAKTUR CAPITAL C"); ("/xf0/x9d/x95/xaf", "MATHEMATICAL BOLD FRAKTUR CAPITAL D"); ("/xf0/x9d/x95/xb0", "MATHEMATICAL BOLD FRAKTUR CAPITAL E"); ("/xf0/x9d/x95/xb1", "MATHEMATICAL BOLD FRAKTUR CAPITAL F"); ("/xf0/x9d/x95/xb2", "MATHEMATICAL BOLD FRAKTUR CAPITAL G"); ("/xf0/x9d/x95/xb3", "MATHEMATICAL BOLD FRAKTUR CAPITAL H"); ("/xf0/x9d/x95/xb4", "MATHEMATICAL BOLD FRAKTUR CAPITAL I"); ("/xf0/x9d/x95/xb5", "MATHEMATICAL BOLD FRAKTUR CAPITAL J"); ("/xf0/x9d/x95/xb6", "MATHEMATICAL BOLD FRAKTUR CAPITAL K"); ("/xf0/x9d/x95/xb7", "MATHEMATICAL BOLD FRAKTUR CAPITAL L"); ("/xf0/x9d/x95/xb8", "MATHEMATICAL BOLD FRAKTUR CAPITAL M"); ("/xf0/x9d/x95/xb9", "MATHEMATICAL BOLD FRAKTUR CAPITAL N"); ("/xf0/x9d/x95/xba", "MATHEMATICAL BOLD FRAKTUR CAPITAL O"); ("/xf0/x9d/x95/xbb", "MATHEMATICAL BOLD FRAKTUR CAPITAL P"); ("/xf0/x9d/x95/xbc", "MATHEMATICAL BOLD FRAKTUR CAPITAL Q"); ("/xf0/x9d/x95/xbd", "MATHEMATICAL BOLD FRAKTUR CAPITAL R"); ("/xf0/x9d/x95/xbe", "MATHEMATICAL BOLD FRAKTUR CAPITAL S"); ("/xf0/x9d/x95/xbf", "MATHEMATICAL BOLD FRAKTUR CAPITAL T"); ("/xf0/x9d/x96/x80", "MATHEMATICAL BOLD FRAKTUR CAPITAL U"); ("/xf0/x9d/x96/x81", "MATHEMATICAL BOLD FRAKTUR CAPITAL V"); ("/xf0/x9d/x96/x82", "MATHEMATICAL BOLD FRAKTUR CAPITAL W"); ("/xf0/x9d/x96/x83", "MATHEMATICAL BOLD FRAKTUR CAPITAL X"); ("/xf0/x9d/x96/x84", "MATHEMATICAL BOLD FRAKTUR CAPITAL Y"); ("/xf0/x9d/x96/x85", "MATHEMATICAL BOLD FRAKTUR CAPITAL Z"); ("/xf0/x9d/x96/x86", "MATHEMATICAL BOLD FRAKTUR SMALL A"); ("/xf0/x9d/x96/x87", "MATHEMATICAL BOLD FRAKTUR SMALL B"); ("/xf0/x9d/x96/x88", "MATHEMATICAL BOLD FRAKTUR SMALL C"); ("/xf0/x9d/x96/x89", "MATHEMATICAL BOLD FRAKTUR SMALL D"); ("/xf0/x9d/x96/x8a", "MATHEMATICAL BOLD FRAKTUR SMALL E"); ("/xf0/x9d/x96/x8b", "MATHEMATICAL BOLD FRAKTUR SMALL F"); ("/xf0/x9d/x96/x8c", "MATHEMATICAL BOLD FRAKTUR SMALL G"); ("/xf0/x9d/x96/x8d", "MATHEMATICAL BOLD FRAKTUR SMALL H"); ("/xf0/x9d/x96/x8e", "MATHEMATICAL BOLD FRAKTUR SMALL I"); ("/xf0/x9d/x96/x8f", "MATHEMATICAL BOLD FRAKTUR SMALL J"); ("/xf0/x9d/x96/x90", "MATHEMATICAL BOLD FRAKTUR SMALL K"); ("/xf0/x9d/x96/x91", "MATHEMATICAL BOLD FRAKTUR SMALL L"); ("/xf0/x9d/x96/x92", "MATHEMATICAL BOLD FRAKTUR SMALL M"); ("/xf0/x9d/x96/x93", "MATHEMATICAL BOLD FRAKTUR SMALL N"); ("/xf0/x9d/x96/x94", "MATHEMATICAL BOLD FRAKTUR SMALL O"); ("/xf0/x9d/x96/x95", "MATHEMATICAL BOLD FRAKTUR SMALL P"); ("/xf0/x9d/x96/x96", "MATHEMATICAL BOLD FRAKTUR SMALL Q"); ("/xf0/x9d/x96/x97", "MATHEMATICAL BOLD FRAKTUR SMALL R"); ("/xf0/x9d/x96/x98", "MATHEMATICAL BOLD FRAKTUR SMALL S"); ("/xf0/x9d/x96/x99", "MATHEMATICAL BOLD FRAKTUR SMALL T"); ("/xf0/x9d/x96/x9a", "MATHEMATICAL BOLD FRAKTUR SMALL U"); ("/xf0/x9d/x96/x9b", "MATHEMATICAL BOLD FRAKTUR SMALL V"); ("/xf0/x9d/x96/x9c", "MATHEMATICAL BOLD FRAKTUR SMALL W"); ("/xf0/x9d/x96/x9d", "MATHEMATICAL BOLD FRAKTUR SMALL X"); ("/xf0/x9d/x96/x9e", "MATHEMATICAL BOLD FRAKTUR SMALL Y"); ("/xf0/x9d/x96/x9f", "MATHEMATICAL BOLD FRAKTUR SMALL Z"); ("/xf0/x9d/x96/xa0", "MATHEMATICAL SANS-SERIF CAPITAL A"); ("/xf0/x9d/x96/xa1", "MATHEMATICAL SANS-SERIF CAPITAL B"); ("/xf0/x9d/x96/xa2", "MATHEMATICAL SANS-SERIF CAPITAL C"); ("/xf0/x9d/x96/xa3", "MATHEMATICAL SANS-SERIF CAPITAL D"); ("/xf0/x9d/x96/xa4", "MATHEMATICAL SANS-SERIF CAPITAL E"); ("/xf0/x9d/x96/xa5", "MATHEMATICAL SANS-SERIF CAPITAL F"); ("/xf0/x9d/x96/xa6", "MATHEMATICAL SANS-SERIF CAPITAL G"); ("/xf0/x9d/x96/xa7", "MATHEMATICAL SANS-SERIF CAPITAL H"); ("/xf0/x9d/x96/xa8", "MATHEMATICAL SANS-SERIF CAPITAL I"); ("/xf0/x9d/x96/xa9", "MATHEMATICAL SANS-SERIF CAPITAL J"); ("/xf0/x9d/x96/xaa", "MATHEMATICAL SANS-SERIF CAPITAL K"); ("/xf0/x9d/x96/xab", "MATHEMATICAL SANS-SERIF CAPITAL L"); ("/xf0/x9d/x96/xac", "MATHEMATICAL SANS-SERIF CAPITAL M"); ("/xf0/x9d/x96/xad", "MATHEMATICAL SANS-SERIF CAPITAL N"); ("/xf0/x9d/x96/xae", "MATHEMATICAL SANS-SERIF CAPITAL O"); ("/xf0/x9d/x96/xaf", "MATHEMATICAL SANS-SERIF CAPITAL P"); ("/xf0/x9d/x96/xb0", "MATHEMATICAL SANS-SERIF CAPITAL Q"); ("/xf0/x9d/x96/xb1", "MATHEMATICAL SANS-SERIF CAPITAL R"); ("/xf0/x9d/x96/xb2", "MATHEMATICAL SANS-SERIF CAPITAL S"); ("/xf0/x9d/x96/xb3", "MATHEMATICAL SANS-SERIF CAPITAL T"); ("/xf0/x9d/x96/xb4", "MATHEMATICAL SANS-SERIF CAPITAL U"); ("/xf0/x9d/x96/xb5", "MATHEMATICAL SANS-SERIF CAPITAL V"); ("/xf0/x9d/x96/xb6", "MATHEMATICAL SANS-SERIF CAPITAL W"); ("/xf0/x9d/x96/xb7", "MATHEMATICAL SANS-SERIF CAPITAL X"); ("/xf0/x9d/x96/xb8", "MATHEMATICAL SANS-SERIF CAPITAL Y"); ("/xf0/x9d/x96/xb9", "MATHEMATICAL SANS-SERIF CAPITAL Z"); ("/xf0/x9d/x96/xba", "MATHEMATICAL SANS-SERIF SMALL A"); ("/xf0/x9d/x96/xbb", "MATHEMATICAL SANS-SERIF SMALL B"); ("/xf0/x9d/x96/xbc", "MATHEMATICAL SANS-SERIF SMALL C"); ("/xf0/x9d/x96/xbd", "MATHEMATICAL SANS-SERIF SMALL D"); ("/xf0/x9d/x96/xbe", "MATHEMATICAL SANS-SERIF SMALL E"); ("/xf0/x9d/x96/xbf", "MATHEMATICAL SANS-SERIF SMALL F"); ("/xf0/x9d/x97/x80", "MATHEMATICAL SANS-SERIF SMALL G"); ("/xf0/x9d/x97/x81", "MATHEMATICAL SANS-SERIF SMALL H"); ("/xf0/x9d/x97/x82", "MATHEMATICAL SANS-SERIF SMALL I"); ("/xf0/x9d/x97/x83", "MATHEMATICAL SANS-SERIF SMALL J"); ("/xf0/x9d/x97/x84", "MATHEMATICAL SANS-SERIF SMALL K"); ("/xf0/x9d/x97/x85", "MATHEMATICAL SANS-SERIF SMALL L"); ("/xf0/x9d/x97/x86", "MATHEMATICAL SANS-SERIF SMALL M"); ("/xf0/x9d/x97/x87", "MATHEMATICAL SANS-SERIF SMALL N"); ("/xf0/x9d/x97/x88", "MATHEMATICAL SANS-SERIF SMALL O"); ("/xf0/x9d/x97/x89", "MATHEMATICAL SANS-SERIF SMALL P"); ("/xf0/x9d/x97/x8a", "MATHEMATICAL SANS-SERIF SMALL Q"); ("/xf0/x9d/x97/x8b", "MATHEMATICAL SANS-SERIF SMALL R"); ("/xf0/x9d/x97/x8c", "MATHEMATICAL SANS-SERIF SMALL S"); ("/xf0/x9d/x97/x8d", "MATHEMATICAL SANS-SERIF SMALL T"); ("/xf0/x9d/x97/x8e", "MATHEMATICAL SANS-SERIF SMALL U"); ("/xf0/x9d/x97/x8f", "MATHEMATICAL SANS-SERIF SMALL V"); ("/xf0/x9d/x97/x90", "MATHEMATICAL SANS-SERIF SMALL W"); ("/xf0/x9d/x97/x91", "MATHEMATICAL SANS-SERIF SMALL X"); ("/xf0/x9d/x97/x92", "MATHEMATICAL SANS-SERIF SMALL Y"); ("/xf0/x9d/x97/x93", "MATHEMATICAL SANS-SERIF SMALL Z"); ("/xf0/x9d/x97/x94", "MATHEMATICAL SANS-SERIF BOLD CAPITAL A"); ("/xf0/x9d/x97/x95", "MATHEMATICAL SANS-SERIF BOLD CAPITAL B"); ("/xf0/x9d/x97/x96", "MATHEMATICAL SANS-SERIF BOLD CAPITAL C"); ("/xf0/x9d/x97/x97", "MATHEMATICAL SANS-SERIF BOLD CAPITAL D"); ("/xf0/x9d/x97/x98", "MATHEMATICAL SANS-SERIF BOLD CAPITAL E"); ("/xf0/x9d/x97/x99", "MATHEMATICAL SANS-SERIF BOLD CAPITAL F"); ("/xf0/x9d/x97/x9a", "MATHEMATICAL SANS-SERIF BOLD CAPITAL G"); ("/xf0/x9d/x97/x9b", "MATHEMATICAL SANS-SERIF BOLD CAPITAL H"); ("/xf0/x9d/x97/x9c", "MATHEMATICAL SANS-SERIF BOLD CAPITAL I"); ("/xf0/x9d/x97/x9d", "MATHEMATICAL SANS-SERIF BOLD CAPITAL J"); ("/xf0/x9d/x97/x9e", "MATHEMATICAL SANS-SERIF BOLD CAPITAL K"); ("/xf0/x9d/x97/x9f", "MATHEMATICAL SANS-SERIF BOLD CAPITAL L"); ("/xf0/x9d/x97/xa0", "MATHEMATICAL SANS-SERIF BOLD CAPITAL M"); ("/xf0/x9d/x97/xa1", "MATHEMATICAL SANS-SERIF BOLD CAPITAL N"); ("/xf0/x9d/x97/xa2", "MATHEMATICAL SANS-SERIF BOLD CAPITAL O"); ("/xf0/x9d/x97/xa3", "MATHEMATICAL SANS-SERIF BOLD CAPITAL P"); ("/xf0/x9d/x97/xa4", "MATHEMATICAL SANS-SERIF BOLD CAPITAL Q"); ("/xf0/x9d/x97/xa5", "MATHEMATICAL SANS-SERIF BOLD CAPITAL R"); ("/xf0/x9d/x97/xa6", "MATHEMATICAL SANS-SERIF BOLD CAPITAL S"); ("/xf0/x9d/x97/xa7", "MATHEMATICAL SANS-SERIF BOLD CAPITAL T"); ("/xf0/x9d/x97/xa8", "MATHEMATICAL SANS-SERIF BOLD CAPITAL U"); ("/xf0/x9d/x97/xa9", "MATHEMATICAL SANS-SERIF BOLD CAPITAL V"); ("/xf0/x9d/x97/xaa", "MATHEMATICAL SANS-SERIF BOLD CAPITAL W"); ("/xf0/x9d/x97/xab", "MATHEMATICAL SANS-SERIF BOLD CAPITAL X"); ("/xf0/x9d/x97/xac", "MATHEMATICAL SANS-SERIF BOLD CAPITAL Y"); ("/xf0/x9d/x97/xad", "MATHEMATICAL SANS-SERIF BOLD CAPITAL Z"); ("/xf0/x9d/x97/xae", "MATHEMATICAL SANS-SERIF BOLD SMALL A"); ("/xf0/x9d/x97/xaf", "MATHEMATICAL SANS-SERIF BOLD SMALL B"); ("/xf0/x9d/x97/xb0", "MATHEMATICAL SANS-SERIF BOLD SMALL C"); ("/xf0/x9d/x97/xb1", "MATHEMATICAL SANS-SERIF BOLD SMALL D"); ("/xf0/x9d/x97/xb2", "MATHEMATICAL SANS-SERIF BOLD SMALL E"); ("/xf0/x9d/x97/xb3", "MATHEMATICAL SANS-SERIF BOLD SMALL F"); ("/xf0/x9d/x97/xb4", "MATHEMATICAL SANS-SERIF BOLD SMALL G"); ("/xf0/x9d/x97/xb5", "MATHEMATICAL SANS-SERIF BOLD SMALL H"); ("/xf0/x9d/x97/xb6", "MATHEMATICAL SANS-SERIF BOLD SMALL I"); ("/xf0/x9d/x97/xb7", "MATHEMATICAL SANS-SERIF BOLD SMALL J"); ("/xf0/x9d/x97/xb8", "MATHEMATICAL SANS-SERIF BOLD SMALL K"); ("/xf0/x9d/x97/xb9", "MATHEMATICAL SANS-SERIF BOLD SMALL L"); ("/xf0/x9d/x97/xba", "MATHEMATICAL SANS-SERIF BOLD SMALL M"); ("/xf0/x9d/x97/xbb", "MATHEMATICAL SANS-SERIF BOLD SMALL N"); ("/xf0/x9d/x97/xbc", "MATHEMATICAL SANS-SERIF BOLD SMALL O"); ("/xf0/x9d/x97/xbd", "MATHEMATICAL SANS-SERIF BOLD SMALL P"); ("/xf0/x9d/x97/xbe", "MATHEMATICAL SANS-SERIF BOLD SMALL Q"); ("/xf0/x9d/x97/xbf", "MATHEMATICAL SANS-SERIF BOLD SMALL R"); ("/xf0/x9d/x98/x80", "MATHEMATICAL SANS-SERIF BOLD SMALL S"); ("/xf0/x9d/x98/x81", "MATHEMATICAL SANS-SERIF BOLD SMALL T"); ("/xf0/x9d/x98/x82", "MATHEMATICAL SANS-SERIF BOLD SMALL U"); ("/xf0/x9d/x98/x83", "MATHEMATICAL SANS-SERIF BOLD SMALL V"); ("/xf0/x9d/x98/x84", "MATHEMATICAL SANS-SERIF BOLD SMALL W"); ("/xf0/x9d/x98/x85", "MATHEMATICAL SANS-SERIF BOLD SMALL X"); ("/xf0/x9d/x98/x86", "MATHEMATICAL SANS-SERIF BOLD SMALL Y"); ("/xf0/x9d/x98/x87", "MATHEMATICAL SANS-SERIF BOLD SMALL Z"); ("/xf0/x9d/x98/x88", "MATHEMATICAL SANS-SERIF ITALIC CAPITAL A"); ("/xf0/x9d/x98/x89", "MATHEMATICAL SANS-SERIF ITALIC CAPITAL B"); ("/xf0/x9d/x98/x8a", "MATHEMATICAL SANS-SERIF ITALIC CAPITAL C"); ("/xf0/x9d/x98/x8b", "MATHEMATICAL SANS-SERIF ITALIC CAPITAL D"); ("/xf0/x9d/x98/x8c", "MATHEMATICAL SANS-SERIF ITALIC CAPITAL E"); ("/xf0/x9d/x98/x8d", "MATHEMATICAL SANS-SERIF ITALIC CAPITAL F"); ("/xf0/x9d/x98/x8e", "MATHEMATICAL SANS-SERIF ITALIC CAPITAL G"); ("/xf0/x9d/x98/x8f", "MATHEMATICAL SANS-SERIF ITALIC CAPITAL H"); ("/xf0/x9d/x98/x90", "MATHEMATICAL SANS-SERIF ITALIC CAPITAL I"); ("/xf0/x9d/x98/x91", "MATHEMATICAL SANS-SERIF ITALIC CAPITAL J"); ("/xf0/x9d/x98/x92", "MATHEMATICAL SANS-SERIF ITALIC CAPITAL K"); ("/xf0/x9d/x98/x93", "MATHEMATICAL SANS-SERIF ITALIC CAPITAL L"); ("/xf0/x9d/x98/x94", "MATHEMATICAL SANS-SERIF ITALIC CAPITAL M"); ("/xf0/x9d/x98/x95", "MATHEMATICAL SANS-SERIF ITALIC CAPITAL N"); ("/xf0/x9d/x98/x96", "MATHEMATICAL SANS-SERIF ITALIC CAPITAL O"); ("/xf0/x9d/x98/x97", "MATHEMATICAL SANS-SERIF ITALIC CAPITAL P"); ("/xf0/x9d/x98/x98", "MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q"); ("/xf0/x9d/x98/x99", "MATHEMATICAL SANS-SERIF ITALIC CAPITAL R"); ("/xf0/x9d/x98/x9a", "MATHEMATICAL SANS-SERIF ITALIC CAPITAL S"); ("/xf0/x9d/x98/x9b", "MATHEMATICAL SANS-SERIF ITALIC CAPITAL T"); ("/xf0/x9d/x98/x9c", "MATHEMATICAL SANS-SERIF ITALIC CAPITAL U"); ("/xf0/x9d/x98/x9d", "MATHEMATICAL SANS-SERIF ITALIC CAPITAL V"); ("/xf0/x9d/x98/x9e", "MATHEMATICAL SANS-SERIF ITALIC CAPITAL W"); ("/xf0/x9d/x98/x9f", "MATHEMATICAL SANS-SERIF ITALIC CAPITAL X"); ("/xf0/x9d/x98/xa0", "MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y"); ("/xf0/x9d/x98/xa1", "MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z"); ("/xf0/x9d/x98/xa2", "MATHEMATICAL SANS-SERIF ITALIC SMALL A"); ("/xf0/x9d/x98/xa3", "MATHEMATICAL SANS-SERIF ITALIC SMALL B"); ("/xf0/x9d/x98/xa4", "MATHEMATICAL SANS-SERIF ITALIC SMALL C"); ("/xf0/x9d/x98/xa5", "MATHEMATICAL SANS-SERIF ITALIC SMALL D"); ("/xf0/x9d/x98/xa6", "MATHEMATICAL SANS-SERIF ITALIC SMALL E"); ("/xf0/x9d/x98/xa7", "MATHEMATICAL SANS-SERIF ITALIC SMALL F"); ("/xf0/x9d/x98/xa8", "MATHEMATICAL SANS-SERIF ITALIC SMALL G"); ("/xf0/x9d/x98/xa9", "MATHEMATICAL SANS-SERIF ITALIC SMALL H"); ("/xf0/x9d/x98/xaa", "MATHEMATICAL SANS-SERIF ITALIC SMALL I"); ("/xf0/x9d/x98/xab", "MATHEMATICAL SANS-SERIF ITALIC SMALL J"); ("/xf0/x9d/x98/xac", "MATHEMATICAL SANS-SERIF ITALIC SMALL K"); ("/xf0/x9d/x98/xad", "MATHEMATICAL SANS-SERIF ITALIC SMALL L"); ("/xf0/x9d/x98/xae", "MATHEMATICAL SANS-SERIF ITALIC SMALL M"); ("/xf0/x9d/x98/xaf", "MATHEMATICAL SANS-SERIF ITALIC SMALL N"); ("/xf0/x9d/x98/xb0", "MATHEMATICAL SANS-SERIF ITALIC SMALL O"); ("/xf0/x9d/x98/xb1", "MATHEMATICAL SANS-SERIF ITALIC SMALL P"); ("/xf0/x9d/x98/xb2", "MATHEMATICAL SANS-SERIF ITALIC SMALL Q"); ("/xf0/x9d/x98/xb3", "MATHEMATICAL SANS-SERIF ITALIC SMALL R"); ("/xf0/x9d/x98/xb4", "MATHEMATICAL SANS-SERIF ITALIC SMALL S"); ("/xf0/x9d/x98/xb5", "MATHEMATICAL SANS-SERIF ITALIC SMALL T"); ("/xf0/x9d/x98/xb6", "MATHEMATICAL SANS-SERIF ITALIC SMALL U"); ("/xf0/x9d/x98/xb7", "MATHEMATICAL SANS-SERIF ITALIC SMALL V"); ("/xf0/x9d/x98/xb8", "MATHEMATICAL SANS-SERIF ITALIC SMALL W"); ("/xf0/x9d/x98/xb9", "MATHEMATICAL SANS-SERIF ITALIC SMALL X"); ("/xf0/x9d/x98/xba", "MATHEMATICAL SANS-SERIF ITALIC SMALL Y"); ("/xf0/x9d/x98/xbb", "MATHEMATICAL SANS-SERIF ITALIC SMALL Z"); ("/xf0/x9d/x98/xbc", "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A"); ("/xf0/x9d/x98/xbd", "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B"); ("/xf0/x9d/x98/xbe", "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C"); ("/xf0/x9d/x98/xbf", "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D"); ("/xf0/x9d/x99/x80", "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E"); ("/xf0/x9d/x99/x81", "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F"); ("/xf0/x9d/x99/x82", "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G"); ("/xf0/x9d/x99/x83", "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H"); ("/xf0/x9d/x99/x84", "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I"); ("/xf0/x9d/x99/x85", "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J"); ("/xf0/x9d/x99/x86", "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K"); ("/xf0/x9d/x99/x87", "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L"); ("/xf0/x9d/x99/x88", "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M"); ("/xf0/x9d/x99/x89", "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N"); ("/xf0/x9d/x99/x8a", "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O"); ("/xf0/x9d/x99/x8b", "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P"); ("/xf0/x9d/x99/x8c", "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q"); ("/xf0/x9d/x99/x8d", "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R"); ("/xf0/x9d/x99/x8e", "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S"); ("/xf0/x9d/x99/x8f", "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T"); ("/xf0/x9d/x99/x90", "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U"); ("/xf0/x9d/x99/x91", "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V"); ("/xf0/x9d/x99/x92", "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W"); ("/xf0/x9d/x99/x93", "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X"); ("/xf0/x9d/x99/x94", "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y"); ("/xf0/x9d/x99/x95", "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z"); ("/xf0/x9d/x99/x96", "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A"); ("/xf0/x9d/x99/x97", "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B"); ("/xf0/x9d/x99/x98", "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C"); ("/xf0/x9d/x99/x99", "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D"); ("/xf0/x9d/x99/x9a", "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E"); ("/xf0/x9d/x99/x9b", "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F"); ("/xf0/x9d/x99/x9c", "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G"); ("/xf0/x9d/x99/x9d", "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H"); ("/xf0/x9d/x99/x9e", "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I"); ("/xf0/x9d/x99/x9f", "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J"); ("/xf0/x9d/x99/xa0", "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K"); ("/xf0/x9d/x99/xa1", "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L"); ("/xf0/x9d/x99/xa2", "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M"); ("/xf0/x9d/x99/xa3", "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N"); ("/xf0/x9d/x99/xa4", "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O"); ("/xf0/x9d/x99/xa5", "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P"); ("/xf0/x9d/x99/xa6", "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q"); ("/xf0/x9d/x99/xa7", "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R"); ("/xf0/x9d/x99/xa8", "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S"); ("/xf0/x9d/x99/xa9", "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T"); ("/xf0/x9d/x99/xaa", "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U"); ("/xf0/x9d/x99/xab", "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V"); ("/xf0/x9d/x99/xac", "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W"); ("/xf0/x9d/x99/xad", "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X"); ("/xf0/x9d/x99/xae", "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y"); ("/xf0/x9d/x99/xaf", "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z"); ("/xf0/x9d/x99/xb0", "MATHEMATICAL MONOSPACE CAPITAL A"); ("/xf0/x9d/x99/xb1", "MATHEMATICAL MONOSPACE CAPITAL B"); ("/xf0/x9d/x99/xb2", "MATHEMATICAL MONOSPACE CAPITAL C"); ("/xf0/x9d/x99/xb3", "MATHEMATICAL MONOSPACE CAPITAL D"); ("/xf0/x9d/x99/xb4", "MATHEMATICAL MONOSPACE CAPITAL E"); ("/xf0/x9d/x99/xb5", "MATHEMATICAL MONOSPACE CAPITAL F"); ("/xf0/x9d/x99/xb6", "MATHEMATICAL MONOSPACE CAPITAL G"); ("/xf0/x9d/x99/xb7", "MATHEMATICAL MONOSPACE CAPITAL H"); ("/xf0/x9d/x99/xb8", "MATHEMATICAL MONOSPACE CAPITAL I"); ("/xf0/x9d/x99/xb9", "MATHEMATICAL MONOSPACE CAPITAL J"); ("/xf0/x9d/x99/xba", "MATHEMATICAL MONOSPACE CAPITAL K"); ("/xf0/x9d/x99/xbb", "MATHEMATICAL MONOSPACE CAPITAL L"); ("/xf0/x9d/x99/xbc", "MATHEMATICAL MONOSPACE CAPITAL M"); ("/xf0/x9d/x99/xbd", "MATHEMATICAL MONOSPACE CAPITAL N"); ("/xf0/x9d/x99/xbe", "MATHEMATICAL MONOSPACE CAPITAL O"); ("/xf0/x9d/x99/xbf", "MATHEMATICAL MONOSPACE CAPITAL P"); ("/xf0/x9d/x9a/x80", "MATHEMATICAL MONOSPACE CAPITAL Q"); ("/xf0/x9d/x9a/x81", "MATHEMATICAL MONOSPACE CAPITAL R"); ("/xf0/x9d/x9a/x82", "MATHEMATICAL MONOSPACE CAPITAL S"); ("/xf0/x9d/x9a/x83", "MATHEMATICAL MONOSPACE CAPITAL T"); ("/xf0/x9d/x9a/x84", "MATHEMATICAL MONOSPACE CAPITAL U"); ("/xf0/x9d/x9a/x85", "MATHEMATICAL MONOSPACE CAPITAL V"); ("/xf0/x9d/x9a/x86", "MATHEMATICAL MONOSPACE CAPITAL W"); ("/xf0/x9d/x9a/x87", "MATHEMATICAL MONOSPACE CAPITAL X"); ("/xf0/x9d/x9a/x88", "MATHEMATICAL MONOSPACE CAPITAL Y"); ("/xf0/x9d/x9a/x89", "MATHEMATICAL MONOSPACE CAPITAL Z"); ("/xf0/x9d/x9a/x8a", "MATHEMATICAL MONOSPACE SMALL A"); ("/xf0/x9d/x9a/x8b", "MATHEMATICAL MONOSPACE SMALL B"); ("/xf0/x9d/x9a/x8c", "MATHEMATICAL MONOSPACE SMALL C"); ("/xf0/x9d/x9a/x8d", "MATHEMATICAL MONOSPACE SMALL D"); ("/xf0/x9d/x9a/x8e", "MATHEMATICAL MONOSPACE SMALL E"); ("/xf0/x9d/x9a/x8f", "MATHEMATICAL MONOSPACE SMALL F"); ("/xf0/x9d/x9a/x90", "MATHEMATICAL MONOSPACE SMALL G"); ("/xf0/x9d/x9a/x91", "MATHEMATICAL MONOSPACE SMALL H"); ("/xf0/x9d/x9a/x92", "MATHEMATICAL MONOSPACE SMALL I"); ("/xf0/x9d/x9a/x93", "MATHEMATICAL MONOSPACE SMALL J"); ("/xf0/x9d/x9a/x94", "MATHEMATICAL MONOSPACE SMALL K"); ("/xf0/x9d/x9a/x95", "MATHEMATICAL MONOSPACE SMALL L"); ("/xf0/x9d/x9a/x96", "MATHEMATICAL MONOSPACE SMALL M"); ("/xf0/x9d/x9a/x97", "MATHEMATICAL MONOSPACE SMALL N"); ("/xf0/x9d/x9a/x98", "MATHEMATICAL MONOSPACE SMALL O"); ("/xf0/x9d/x9a/x99", "MATHEMATICAL MONOSPACE SMALL P"); ("/xf0/x9d/x9a/x9a", "MATHEMATICAL MONOSPACE SMALL Q"); ("/xf0/x9d/x9a/x9b", "MATHEMATICAL MONOSPACE SMALL R"); ("/xf0/x9d/x9a/x9c", "MATHEMATICAL MONOSPACE SMALL S"); ("/xf0/x9d/x9a/x9d", "MATHEMATICAL MONOSPACE SMALL T"); ("/xf0/x9d/x9a/x9e", "MATHEMATICAL MONOSPACE SMALL U"); ("/xf0/x9d/x9a/x9f", "MATHEMATICAL MONOSPACE SMALL V"); ("/xf0/x9d/x9a/xa0", "MATHEMATICAL MONOSPACE SMALL W"); ("/xf0/x9d/x9a/xa1", "MATHEMATICAL MONOSPACE SMALL X"); ("/xf0/x9d/x9a/xa2", "MATHEMATICAL MONOSPACE SMALL Y"); ("/xf0/x9d/x9a/xa3", "MATHEMATICAL MONOSPACE SMALL Z"); ("/xf0/x9d/x9a/xa4", "MATHEMATICAL ITALIC SMALL DOTLESS I"); ("/xf0/x9d/x9a/xa5", "MATHEMATICAL ITALIC SMALL DOTLESS J"); ("/xf0/x9d/x9a/xa8", "MATHEMATICAL BOLD CAPITAL ALPHA"); ("/xf0/x9d/x9a/xa9", "MATHEMATICAL BOLD CAPITAL BETA"); ("/xf0/x9d/x9a/xaa", "MATHEMATICAL BOLD CAPITAL GAMMA"); ("/xf0/x9d/x9a/xab", "MATHEMATICAL BOLD CAPITAL DELTA"); ("/xf0/x9d/x9a/xac", "MATHEMATICAL BOLD CAPITAL EPSILON"); ("/xf0/x9d/x9a/xad", "MATHEMATICAL BOLD CAPITAL ZETA"); ("/xf0/x9d/x9a/xae", "MATHEMATICAL BOLD CAPITAL ETA"); ("/xf0/x9d/x9a/xaf", "MATHEMATICAL BOLD CAPITAL THETA"); ("/xf0/x9d/x9a/xb0", "MATHEMATICAL BOLD CAPITAL IOTA"); ("/xf0/x9d/x9a/xb1", "MATHEMATICAL BOLD CAPITAL KAPPA"); ("/xf0/x9d/x9a/xb2", "MATHEMATICAL BOLD CAPITAL LAMDA"); ("/xf0/x9d/x9a/xb3", "MATHEMATICAL BOLD CAPITAL MU"); ("/xf0/x9d/x9a/xb4", "MATHEMATICAL BOLD CAPITAL NU"); ("/xf0/x9d/x9a/xb5", "MATHEMATICAL BOLD CAPITAL XI"); ("/xf0/x9d/x9a/xb6", "MATHEMATICAL BOLD CAPITAL OMICRON"); ("/xf0/x9d/x9a/xb7", "MATHEMATICAL BOLD CAPITAL PI"); ("/xf0/x9d/x9a/xb8", "MATHEMATICAL BOLD CAPITAL RHO"); ("/xf0/x9d/x9a/xb9", "MATHEMATICAL BOLD CAPITAL THETA SYMBOL"); ("/xf0/x9d/x9a/xba", "MATHEMATICAL BOLD CAPITAL SIGMA"); ("/xf0/x9d/x9a/xbb", "MATHEMATICAL BOLD CAPITAL TAU"); ("/xf0/x9d/x9a/xbc", "MATHEMATICAL BOLD CAPITAL UPSILON"); ("/xf0/x9d/x9a/xbd", "MATHEMATICAL BOLD CAPITAL PHI"); ("/xf0/x9d/x9a/xbe", "MATHEMATICAL BOLD CAPITAL CHI"); ("/xf0/x9d/x9a/xbf", "MATHEMATICAL BOLD CAPITAL PSI"); ("/xf0/x9d/x9b/x80", "MATHEMATICAL BOLD CAPITAL OMEGA"); ("/xf0/x9d/x9b/x82", "MATHEMATICAL BOLD SMALL ALPHA"); ("/xf0/x9d/x9b/x83", "MATHEMATICAL BOLD SMALL BETA"); ("/xf0/x9d/x9b/x84", "MATHEMATICAL BOLD SMALL GAMMA"); ("/xf0/x9d/x9b/x85", "MATHEMATICAL BOLD SMALL DELTA"); ("/xf0/x9d/x9b/x86", "MATHEMATICAL BOLD SMALL EPSILON"); ("/xf0/x9d/x9b/x87", "MATHEMATICAL BOLD SMALL ZETA"); ("/xf0/x9d/x9b/x88", "MATHEMATICAL BOLD SMALL ETA"); ("/xf0/x9d/x9b/x89", "MATHEMATICAL BOLD SMALL THETA"); ("/xf0/x9d/x9b/x8a", "MATHEMATICAL BOLD SMALL IOTA"); ("/xf0/x9d/x9b/x8b", "MATHEMATICAL BOLD SMALL KAPPA"); ("/xf0/x9d/x9b/x8c", "MATHEMATICAL BOLD SMALL LAMDA"); ("/xf0/x9d/x9b/x8d", "MATHEMATICAL BOLD SMALL MU"); ("/xf0/x9d/x9b/x8e", "MATHEMATICAL BOLD SMALL NU"); ("/xf0/x9d/x9b/x8f", "MATHEMATICAL BOLD SMALL XI"); ("/xf0/x9d/x9b/x90", "MATHEMATICAL BOLD SMALL OMICRON"); ("/xf0/x9d/x9b/x91", "MATHEMATICAL BOLD SMALL PI"); ("/xf0/x9d/x9b/x92", "MATHEMATICAL BOLD SMALL RHO"); ("/xf0/x9d/x9b/x93", "MATHEMATICAL BOLD SMALL FINAL SIGMA"); ("/xf0/x9d/x9b/x94", "MATHEMATICAL BOLD SMALL SIGMA"); ("/xf0/x9d/x9b/x95", "MATHEMATICAL BOLD SMALL TAU"); ("/xf0/x9d/x9b/x96", "MATHEMATICAL BOLD SMALL UPSILON"); ("/xf0/x9d/x9b/x97", "MATHEMATICAL BOLD SMALL PHI"); ("/xf0/x9d/x9b/x98", "MATHEMATICAL BOLD SMALL CHI"); ("/xf0/x9d/x9b/x99", "MATHEMATICAL BOLD SMALL PSI"); ("/xf0/x9d/x9b/x9a", "MATHEMATICAL BOLD SMALL OMEGA"); ("/xf0/x9d/x9b/xa2", "MATHEMATICAL ITALIC CAPITAL ALPHA"); ("/xf0/x9d/x9b/xa3", "MATHEMATICAL ITALIC CAPITAL BETA"); ("/xf0/x9d/x9b/xa4", "MATHEMATICAL ITALIC CAPITAL GAMMA"); ("/xf0/x9d/x9b/xa5", "MATHEMATICAL ITALIC CAPITAL DELTA"); ("/xf0/x9d/x9b/xa6", "MATHEMATICAL ITALIC CAPITAL EPSILON"); ("/xf0/x9d/x9b/xa7", "MATHEMATICAL ITALIC CAPITAL ZETA"); ("/xf0/x9d/x9b/xa8", "MATHEMATICAL ITALIC CAPITAL ETA"); ("/xf0/x9d/x9b/xa9", "MATHEMATICAL ITALIC CAPITAL THETA"); ("/xf0/x9d/x9b/xaa", "MATHEMATICAL ITALIC CAPITAL IOTA"); ("/xf0/x9d/x9b/xab", "MATHEMATICAL ITALIC CAPITAL KAPPA"); ("/xf0/x9d/x9b/xac", "MATHEMATICAL ITALIC CAPITAL LAMDA"); ("/xf0/x9d/x9b/xad", "MATHEMATICAL ITALIC CAPITAL MU"); ("/xf0/x9d/x9b/xae", "MATHEMATICAL ITALIC CAPITAL NU"); ("/xf0/x9d/x9b/xaf", "MATHEMATICAL ITALIC CAPITAL XI"); ("/xf0/x9d/x9b/xb0", "MATHEMATICAL ITALIC CAPITAL OMICRON"); ("/xf0/x9d/x9b/xb1", "MATHEMATICAL ITALIC CAPITAL PI"); ("/xf0/x9d/x9b/xb2", "MATHEMATICAL ITALIC CAPITAL RHO"); ("/xf0/x9d/x9b/xb3", "MATHEMATICAL ITALIC CAPITAL THETA SYMBOL"); ("/xf0/x9d/x9b/xb4", "MATHEMATICAL ITALIC CAPITAL SIGMA"); ("/xf0/x9d/x9b/xb5", "MATHEMATICAL ITALIC CAPITAL TAU"); ("/xf0/x9d/x9b/xb6", "MATHEMATICAL ITALIC CAPITAL UPSILON"); ("/xf0/x9d/x9b/xb7", "MATHEMATICAL ITALIC CAPITAL PHI"); ("/xf0/x9d/x9b/xb8", "MATHEMATICAL ITALIC CAPITAL CHI"); ("/xf0/x9d/x9b/xb9", "MATHEMATICAL ITALIC CAPITAL PSI"); ("/xf0/x9d/x9b/xba", "MATHEMATICAL ITALIC CAPITAL OMEGA"); ("/xf0/x9d/x9b/xbc", "MATHEMATICAL ITALIC SMALL ALPHA"); ("/xf0/x9d/x9b/xbd", "MATHEMATICAL ITALIC SMALL BETA"); ("/xf0/x9d/x9b/xbe", "MATHEMATICAL ITALIC SMALL GAMMA"); ("/xf0/x9d/x9b/xbf", "MATHEMATICAL ITALIC SMALL DELTA"); ("/xf0/x9d/x9c/x80", "MATHEMATICAL ITALIC SMALL EPSILON"); ("/xf0/x9d/x9c/x81", "MATHEMATICAL ITALIC SMALL ZETA"); ("/xf0/x9d/x9c/x82", "MATHEMATICAL ITALIC SMALL ETA"); ("/xf0/x9d/x9c/x83", "MATHEMATICAL ITALIC SMALL THETA"); ("/xf0/x9d/x9c/x84", "MATHEMATICAL ITALIC SMALL IOTA"); ("/xf0/x9d/x9c/x85", "MATHEMATICAL ITALIC SMALL KAPPA"); ("/xf0/x9d/x9c/x86", "MATHEMATICAL ITALIC SMALL LAMDA"); ("/xf0/x9d/x9c/x87", "MATHEMATICAL ITALIC SMALL MU"); ("/xf0/x9d/x9c/x88", "MATHEMATICAL ITALIC SMALL NU"); ("/xf0/x9d/x9c/x89", "MATHEMATICAL ITALIC SMALL XI"); ("/xf0/x9d/x9c/x8a", "MATHEMATICAL ITALIC SMALL OMICRON"); ("/xf0/x9d/x9c/x8b", "MATHEMATICAL ITALIC SMALL PI"); ("/xf0/x9d/x9c/x8c", "MATHEMATICAL ITALIC SMALL RHO"); ("/xf0/x9d/x9c/x8d", "MATHEMATICAL ITALIC SMALL FINAL SIGMA"); ("/xf0/x9d/x9c/x8e", "MATHEMATICAL ITALIC SMALL SIGMA"); ("/xf0/x9d/x9c/x8f", "MATHEMATICAL ITALIC SMALL TAU"); ("/xf0/x9d/x9c/x90", "MATHEMATICAL ITALIC SMALL UPSILON"); ("/xf0/x9d/x9c/x91", "MATHEMATICAL ITALIC SMALL PHI"); ("/xf0/x9d/x9c/x92", "MATHEMATICAL ITALIC SMALL CHI"); ("/xf0/x9d/x9c/x93", "MATHEMATICAL ITALIC SMALL PSI"); ("/xf0/x9d/x9c/x94", "MATHEMATICAL ITALIC SMALL OMEGA"); ("/xf0/x9d/x9c/x9c", "MATHEMATICAL BOLD ITALIC CAPITAL ALPHA"); ("/xf0/x9d/x9c/x9d", "MATHEMATICAL BOLD ITALIC CAPITAL BETA"); ("/xf0/x9d/x9c/x9e", "MATHEMATICAL BOLD ITALIC CAPITAL GAMMA"); ("/xf0/x9d/x9c/x9f", "MATHEMATICAL BOLD ITALIC CAPITAL DELTA"); ("/xf0/x9d/x9c/xa0", "MATHEMATICAL BOLD ITALIC CAPITAL EPSILON"); ("/xf0/x9d/x9c/xa1", "MATHEMATICAL BOLD ITALIC CAPITAL ZETA"); ("/xf0/x9d/x9c/xa2", "MATHEMATICAL BOLD ITALIC CAPITAL ETA"); ("/xf0/x9d/x9c/xa3", "MATHEMATICAL BOLD ITALIC CAPITAL THETA"); ("/xf0/x9d/x9c/xa4", "MATHEMATICAL BOLD ITALIC CAPITAL IOTA"); ("/xf0/x9d/x9c/xa5", "MATHEMATICAL BOLD ITALIC CAPITAL KAPPA"); ("/xf0/x9d/x9c/xa6", "MATHEMATICAL BOLD ITALIC CAPITAL LAMDA"); ("/xf0/x9d/x9c/xa7", "MATHEMATICAL BOLD ITALIC CAPITAL MU"); ("/xf0/x9d/x9c/xa8", "MATHEMATICAL BOLD ITALIC CAPITAL NU"); ("/xf0/x9d/x9c/xa9", "MATHEMATICAL BOLD ITALIC CAPITAL XI"); ("/xf0/x9d/x9c/xaa", "MATHEMATICAL BOLD ITALIC CAPITAL OMICRON"); ("/xf0/x9d/x9c/xab", "MATHEMATICAL BOLD ITALIC CAPITAL PI"); ("/xf0/x9d/x9c/xac", "MATHEMATICAL BOLD ITALIC CAPITAL RHO"); ("/xf0/x9d/x9c/xad", "MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL"); ("/xf0/x9d/x9c/xae", "MATHEMATICAL BOLD ITALIC CAPITAL SIGMA"); ("/xf0/x9d/x9c/xaf", "MATHEMATICAL BOLD ITALIC CAPITAL TAU"); ("/xf0/x9d/x9c/xb0", "MATHEMATICAL BOLD ITALIC CAPITAL UPSILON"); ("/xf0/x9d/x9c/xb1", "MATHEMATICAL BOLD ITALIC CAPITAL PHI"); ("/xf0/x9d/x9c/xb2", "MATHEMATICAL BOLD ITALIC CAPITAL CHI"); ("/xf0/x9d/x9c/xb3", "MATHEMATICAL BOLD ITALIC CAPITAL PSI"); ("/xf0/x9d/x9c/xb4", "MATHEMATICAL BOLD ITALIC CAPITAL OMEGA"); ("/xf0/x9d/x9c/xb6", "MATHEMATICAL BOLD ITALIC SMALL ALPHA"); ("/xf0/x9d/x9c/xb7", "MATHEMATICAL BOLD ITALIC SMALL BETA"); ("/xf0/x9d/x9c/xb8", "MATHEMATICAL BOLD ITALIC SMALL GAMMA"); ("/xf0/x9d/x9c/xb9", "MATHEMATICAL BOLD ITALIC SMALL DELTA"); ("/xf0/x9d/x9c/xba", "MATHEMATICAL BOLD ITALIC SMALL EPSILON"); ("/xf0/x9d/x9c/xbb", "MATHEMATICAL BOLD ITALIC SMALL ZETA"); ("/xf0/x9d/x9c/xbc", "MATHEMATICAL BOLD ITALIC SMALL ETA"); ("/xf0/x9d/x9c/xbd", "MATHEMATICAL BOLD ITALIC SMALL THETA"); ("/xf0/x9d/x9c/xbe", "MATHEMATICAL BOLD ITALIC SMALL IOTA"); ("/xf0/x9d/x9c/xbf", "MATHEMATICAL BOLD ITALIC SMALL KAPPA"); ("/xf0/x9d/x9d/x80", "MATHEMATICAL BOLD ITALIC SMALL LAMDA"); ("/xf0/x9d/x9d/x81", "MATHEMATICAL BOLD ITALIC SMALL MU"); ("/xf0/x9d/x9d/x82", "MATHEMATICAL BOLD ITALIC SMALL NU"); ("/xf0/x9d/x9d/x83", "MATHEMATICAL BOLD ITALIC SMALL XI"); ("/xf0/x9d/x9d/x84", "MATHEMATICAL BOLD ITALIC SMALL OMICRON"); ("/xf0/x9d/x9d/x85", "MATHEMATICAL BOLD ITALIC SMALL PI"); ("/xf0/x9d/x9d/x86", "MATHEMATICAL BOLD ITALIC SMALL RHO"); ("/xf0/x9d/x9d/x87", "MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA"); ("/xf0/x9d/x9d/x88", "MATHEMATICAL BOLD ITALIC SMALL SIGMA"); ("/xf0/x9d/x9d/x89", "MATHEMATICAL BOLD ITALIC SMALL TAU"); ("/xf0/x9d/x9d/x8a", "MATHEMATICAL BOLD ITALIC SMALL UPSILON"); ("/xf0/x9d/x9d/x8b", "MATHEMATICAL BOLD ITALIC SMALL PHI"); ("/xf0/x9d/x9d/x8c", "MATHEMATICAL BOLD ITALIC SMALL CHI"); ("/xf0/x9d/x9d/x8d", "MATHEMATICAL BOLD ITALIC SMALL PSI"); ("/xf0/x9d/x9d/x8e", "MATHEMATICAL BOLD ITALIC SMALL OMEGA"); ("/xf0/x9d/x9d/x96", "MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA"); ("/xf0/x9d/x9d/x97", "MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA"); ("/xf0/x9d/x9d/x98", "MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA"); ("/xf0/x9d/x9d/x99", "MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA"); ("/xf0/x9d/x9d/x9a", "MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON"); ("/xf0/x9d/x9d/x9b", "MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA"); ("/xf0/x9d/x9d/x9c", "MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA"); ("/xf0/x9d/x9d/x9d", "MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA"); ("/xf0/x9d/x9d/x9e", "MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA"); ("/xf0/x9d/x9d/x9f", "MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA"); ("/xf0/x9d/x9d/xa0", "MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA"); ("/xf0/x9d/x9d/xa1", "MATHEMATICAL SANS-SERIF BOLD CAPITAL MU"); ("/xf0/x9d/x9d/xa2", "MATHEMATICAL SANS-SERIF BOLD CAPITAL NU"); ("/xf0/x9d/x9d/xa3", "MATHEMATICAL SANS-SERIF BOLD CAPITAL XI"); ("/xf0/x9d/x9d/xa4", "MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON"); ("/xf0/x9d/x9d/xa5", "MATHEMATICAL SANS-SERIF BOLD CAPITAL PI"); ("/xf0/x9d/x9d/xa6", "MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO"); ("/xf0/x9d/x9d/xa7", "MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL"); ("/xf0/x9d/x9d/xa8", "MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA"); ("/xf0/x9d/x9d/xa9", "MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU"); ("/xf0/x9d/x9d/xaa", "MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON"); ("/xf0/x9d/x9d/xab", "MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI"); ("/xf0/x9d/x9d/xac", "MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI"); ("/xf0/x9d/x9d/xad", "MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI"); ("/xf0/x9d/x9d/xae", "MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA"); ("/xf0/x9d/x9d/xb0", "MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA"); ("/xf0/x9d/x9d/xb1", "MATHEMATICAL SANS-SERIF BOLD SMALL BETA"); ("/xf0/x9d/x9d/xb2", "MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA"); ("/xf0/x9d/x9d/xb3", "MATHEMATICAL SANS-SERIF BOLD SMALL DELTA"); ("/xf0/x9d/x9d/xb4", "MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON"); ("/xf0/x9d/x9d/xb5", "MATHEMATICAL SANS-SERIF BOLD SMALL ZETA"); ("/xf0/x9d/x9d/xb6", "MATHEMATICAL SANS-SERIF BOLD SMALL ETA"); ("/xf0/x9d/x9d/xb7", "MATHEMATICAL SANS-SERIF BOLD SMALL THETA"); ("/xf0/x9d/x9d/xb8", "MATHEMATICAL SANS-SERIF BOLD SMALL IOTA"); ("/xf0/x9d/x9d/xb9", "MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA"); ("/xf0/x9d/x9d/xba", "MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA"); ("/xf0/x9d/x9d/xbb", "MATHEMATICAL SANS-SERIF BOLD SMALL MU"); ("/xf0/x9d/x9d/xbc", "MATHEMATICAL SANS-SERIF BOLD SMALL NU"); ("/xf0/x9d/x9d/xbd", "MATHEMATICAL SANS-SERIF BOLD SMALL XI"); ("/xf0/x9d/x9d/xbe", "MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON"); ("/xf0/x9d/x9d/xbf", "MATHEMATICAL SANS-SERIF BOLD SMALL PI"); ("/xf0/x9d/x9e/x80", "MATHEMATICAL SANS-SERIF BOLD SMALL RHO"); ("/xf0/x9d/x9e/x81", "MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA"); ("/xf0/x9d/x9e/x82", "MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA"); ("/xf0/x9d/x9e/x83", "MATHEMATICAL SANS-SERIF BOLD SMALL TAU"); ("/xf0/x9d/x9e/x84", "MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON"); ("/xf0/x9d/x9e/x85", "MATHEMATICAL SANS-SERIF BOLD SMALL PHI"); ("/xf0/x9d/x9e/x86", "MATHEMATICAL SANS-SERIF BOLD SMALL CHI"); ("/xf0/x9d/x9e/x87", "MATHEMATICAL SANS-SERIF BOLD SMALL PSI"); ("/xf0/x9d/x9e/x88", "MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA"); ("/xf0/x9d/x9e/x90", "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA"); ("/xf0/x9d/x9e/x91", "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA"); ("/xf0/x9d/x9e/x92", "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA"); ("/xf0/x9d/x9e/x93", "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA"); ("/xf0/x9d/x9e/x94", "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON"); ("/xf0/x9d/x9e/x95", "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA"); ("/xf0/x9d/x9e/x96", "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA"); ("/xf0/x9d/x9e/x97", "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA"); ("/xf0/x9d/x9e/x98", "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA"); ("/xf0/x9d/x9e/x99", "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA"); ("/xf0/x9d/x9e/x9a", "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA"); ("/xf0/x9d/x9e/x9b", "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU"); ("/xf0/x9d/x9e/x9c", "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU"); ("/xf0/x9d/x9e/x9d", "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI"); ("/xf0/x9d/x9e/x9e", "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON"); ("/xf0/x9d/x9e/x9f", "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI"); ("/xf0/x9d/x9e/xa0", "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO"); ("/xf0/x9d/x9e/xa1", "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL"); ("/xf0/x9d/x9e/xa2", "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA"); ("/xf0/x9d/x9e/xa3", "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU"); ("/xf0/x9d/x9e/xa4", "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON"); ("/xf0/x9d/x9e/xa5", "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI"); ("/xf0/x9d/x9e/xa6", "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI"); ("/xf0/x9d/x9e/xa7", "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI"); ("/xf0/x9d/x9e/xa8", "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA"); ("/xf0/x9d/x9e/xaa", "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA"); ("/xf0/x9d/x9e/xab", "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA"); ("/xf0/x9d/x9e/xac", "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA"); ("/xf0/x9d/x9e/xad", "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA"); ("/xf0/x9d/x9e/xae", "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON"); ("/xf0/x9d/x9e/xaf", "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA"); ("/xf0/x9d/x9e/xb0", "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA"); ("/xf0/x9d/x9e/xb1", "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA"); ("/xf0/x9d/x9e/xb2", "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA"); ("/xf0/x9d/x9e/xb3", "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA"); ("/xf0/x9d/x9e/xb4", "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA"); ("/xf0/x9d/x9e/xb5", "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU"); ("/xf0/x9d/x9e/xb6", "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU"); ("/xf0/x9d/x9e/xb7", "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI"); ("/xf0/x9d/x9e/xb8", "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON"); ("/xf0/x9d/x9e/xb9", "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI"); ("/xf0/x9d/x9e/xba", "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO"); ("/xf0/x9d/x9e/xbb", "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA"); ("/xf0/x9d/x9e/xbc", "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA"); ("/xf0/x9d/x9e/xbd", "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU"); ("/xf0/x9d/x9e/xbe", "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON"); ("/xf0/x9d/x9e/xbf", "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI"); ("/xf0/x9d/x9f/x80", "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI"); ("/xf0/x9d/x9f/x81", "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI"); ("/xf0/x9d/x9f/x82", "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA"); ("/xf0/x9d/x9f/x8a", "MATHEMATICAL BOLD CAPITAL DIGAMMA"); ("/xf0/x9d/x9f/x8b", "MATHEMATICAL BOLD SMALL DIGAMMA"); ("/xf3/xa0/x81/x81", "TAG LATIN CAPITAL LETTER A"); ("/xf3/xa0/x81/x82", "TAG LATIN CAPITAL LETTER B"); ("/xf3/xa0/x81/x83", "TAG LATIN CAPITAL LETTER C"); ("/xf3/xa0/x81/x84", "TAG LATIN CAPITAL LETTER D"); ("/xf3/xa0/x81/x85", "TAG LATIN CAPITAL LETTER E"); ("/xf3/xa0/x81/x86", "TAG LATIN CAPITAL LETTER F"); ("/xf3/xa0/x81/x87", "TAG LATIN CAPITAL LETTER G"); ("/xf3/xa0/x81/x88", "TAG LATIN CAPITAL LETTER H"); ("/xf3/xa0/x81/x89", "TAG LATIN CAPITAL LETTER I"); ("/xf3/xa0/x81/x8a", "TAG LATIN CAPITAL LETTER J"); ("/xf3/xa0/x81/x8b", "TAG LATIN CAPITAL LETTER K"); ("/xf3/xa0/x81/x8c", "TAG LATIN CAPITAL LETTER L"); ("/xf3/xa0/x81/x8d", "TAG LATIN CAPITAL LETTER M"); ("/xf3/xa0/x81/x8e", "TAG LATIN CAPITAL LETTER N"); ("/xf3/xa0/x81/x8f", "TAG LATIN CAPITAL LETTER O"); ("/xf3/xa0/x81/x90", "TAG LATIN CAPITAL LETTER P"); ("/xf3/xa0/x81/x91", "TAG LATIN CAPITAL LETTER Q"); ("/xf3/xa0/x81/x92", "TAG LATIN CAPITAL LETTER R"); ("/xf3/xa0/x81/x93", "TAG LATIN CAPITAL LETTER S"); ("/xf3/xa0/x81/x94", "TAG LATIN CAPITAL LETTER T"); ("/xf3/xa0/x81/x95", "TAG LATIN CAPITAL LETTER U"); ("/xf3/xa0/x81/x96", "TAG LATIN CAPITAL LETTER V"); ("/xf3/xa0/x81/x97", "TAG LATIN CAPITAL LETTER W"); ("/xf3/xa0/x81/x98", "TAG LATIN CAPITAL LETTER X"); ("/xf3/xa0/x81/x99", "TAG LATIN CAPITAL LETTER Y"); ("/xf3/xa0/x81/x9a", "TAG LATIN CAPITAL LETTER Z"); ("/xf3/xa0/x81/xa1", "TAG LATIN SMALL LETTER A"); ("/xf3/xa0/x81/xa2", "TAG LATIN SMALL LETTER B"); ("/xf3/xa0/x81/xa3", "TAG LATIN SMALL LETTER C"); ("/xf3/xa0/x81/xa4", "TAG LATIN SMALL LETTER D"); ("/xf3/xa0/x81/xa5", "TAG LATIN SMALL LETTER E"); ("/xf3/xa0/x81/xa6", "TAG LATIN SMALL LETTER F"); ("/xf3/xa0/x81/xa7", "TAG LATIN SMALL LETTER G"); ("/xf3/xa0/x81/xa8", "TAG LATIN SMALL LETTER H"); ("/xf3/xa0/x81/xa9", "TAG LATIN SMALL LETTER I"); ("/xf3/xa0/x81/xaa", "TAG LATIN SMALL LETTER J"); ("/xf3/xa0/x81/xab", "TAG LATIN SMALL LETTER K"); ("/xf3/xa0/x81/xac", "TAG LATIN SMALL LETTER L"); ("/xf3/xa0/x81/xad", "TAG LATIN SMALL LETTER M"); ("/xf3/xa0/x81/xae", "TAG LATIN SMALL LETTER N"); ("/xf3/xa0/x81/xaf", "TAG LATIN SMALL LETTER O"); ("/xf3/xa0/x81/xb0", "TAG LATIN SMALL LETTER P"); ("/xf3/xa0/x81/xb1", "TAG LATIN SMALL LETTER Q"); ("/xf3/xa0/x81/xb2", "TAG LATIN SMALL LETTER R"); ("/xf3/xa0/x81/xb3", "TAG LATIN SMALL LETTER S"); ("/xf3/xa0/x81/xb4", "TAG LATIN SMALL LETTER T"); ("/xf3/xa0/x81/xb5", "TAG LATIN SMALL LETTER U"); ("/xf3/xa0/x81/xb6", "TAG LATIN SMALL LETTER V"); ("/xf3/xa0/x81/xb7", "TAG LATIN SMALL LETTER W"); ("/xf3/xa0/x81/xb8", "TAG LATIN SMALL LETTER X"); ("/xf3/xa0/x81/xb9", "TAG LATIN SMALL LETTER Y"); ("/xf3/xa0/x81/xba", "TAG LATIN SMALL LETTER Z")] ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/ged2gwb/.depend0000660000175200017530000000216412664543647023205 0ustar guillaumeguillaumeged2gwb2.cmo: ../src/adef.cmi ../src/ansel.cmo ../src/argl.cmo \ ../src/buff.cmo ../src/calendar.cmi ../src/db2link.cmi ../src/def.cmi \ ../src/futil.cmi ../src/gwcomp.cmi ../src/lock.cmi ../src/mutil.cmi \ ../src/name.cmi ../src/secure.cmi ./utf8.cmi ged2gwb2.cmx: ../src/adef.cmx ../src/ansel.cmx ../src/argl.cmx \ ../src/buff.cmx ../src/calendar.cmx ../src/db2link.cmx ../src/def.cmi \ ../src/futil.cmx ../src/gwcomp.cmx ../src/lock.cmx ../src/mutil.cmx \ ../src/name.cmx ../src/secure.cmx ./utf8.cmx ged2gwb.cmo: ../src/adef.cmi ../src/ansel.cmo ../src/argl.cmo \ ../src/buff.cmo ../src/calendar.cmi ../src/check.cmi \ ../src/checkItem.cmi ../src/dbdisk.cmi ../src/def.cmi ../src/gwdb.cmi \ ../src/lock.cmi ../src/mutil.cmi ../src/name.cmi ../src/outbase.cmi \ ../src/secure.cmi ./utf8.cmi ged2gwb.cmx: ../src/adef.cmx ../src/ansel.cmx ../src/argl.cmx \ ../src/buff.cmx ../src/calendar.cmx ../src/check.cmx \ ../src/checkItem.cmx ../src/dbdisk.cmi ../src/def.cmi ../src/gwdb.cmx \ ../src/lock.cmx ../src/mutil.cmx ../src/name.cmx ../src/outbase.cmx \ ../src/secure.cmx ./utf8.cmx geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/ged2gwb/ged2gwb.ml0000660000175200017530000030443412664543647023625 0ustar guillaumeguillaume(* camlp5r pa_extend.cmo ../src/pa_lock.cmo *) (* $Id: ged2gwb.ml,v 5.53 2007-09-12 09:58:44 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Dbdisk; open Def; open Mutil; open Printf; type person = dsk_person; type ascend = dsk_ascend; type union = dsk_union; type family = dsk_family; type couple = dsk_couple; type descend = dsk_descend; value get_access p = p.Def.access; value get_aliases p = p.Def.aliases; value get_baptism p = p.Def.baptism; value get_baptism_place p = p.Def.baptism_place; value get_baptism_src p = p.Def.baptism_src; value get_birth p = p.Def.birth; value get_birth_place p = p.Def.birth_place; value get_birth_src p = p.Def.birth_src; value get_burial p = p.Def.burial; value get_burial_place p = p.Def.burial_place; value get_burial_src p = p.Def.burial_src; value get_death p = p.Def.death; value get_death_place p = p.Def.death_place; value get_death_src p = p.Def.death_src; value get_first_name p = p.Def.first_name; value get_first_names_aliases p = p.Def.first_names_aliases; value get_image p = p.Def.image; value get_key_index p = p.Def.key_index; value get_notes p = p.Def.notes; value get_occ p = p.Def.occ; value get_occupation p = p.Def.occupation; value get_psources p = p.Def.psources; value get_public_name p = p.Def.public_name; value get_qualifiers p = p.Def.qualifiers; value get_related p = p.Def.related; value get_rparents p = p.Def.rparents; value get_sex p = p.Def.sex; value get_surname p = p.Def.surname; value get_surnames_aliases p = p.Def.surnames_aliases; value get_titles p = p.Def.titles; value person_with_key p fn sn oc = {(p) with first_name = fn; surname = sn; occ = oc} ; value person_with_related p r = {(p) with related = r}; value person_with_rparents p r = {(p) with rparents = r}; value person_with_sex p s = {(p) with sex = s}; value person_of_gen_person p = p; value gen_person_of_person p = p; value get_consang a = a.Def.consang; value get_parents a = a.Def.parents; value ascend_with_parents a p = {parents = p; consang = a.consang}; value ascend_of_gen_ascend a = a; value get_family u = u.Def.family; value union_of_gen_union u = u; value get_comment f = f.Def.comment; value get_divorce f = f.Def.divorce; value get_fam_index f = f.Def.fam_index; value get_fsources f = f.Def.fsources; value get_marriage f = f.Def.marriage; value get_marriage_place f = f.Def.marriage_place; value get_marriage_src f = f.Def.marriage_src; value get_origin_file f = f.Def.origin_file; value get_relation f = f.Def.relation; value get_witnesses f = f.Def.witnesses; value family_of_gen_family f = f; value gen_family_of_family f = f; value get_father c = Adef.father c; value get_mother c = Adef.mother c; value get_parent_array c = Adef.parent_array c; value gen_couple_of_couple c = c; value couple_of_gen_couple c = c; value get_children d = d.Def.children; value descend_of_gen_descend d = d; value gen_descend_of_descend d = d; value poi base i = base.data.persons.get (Adef.int_of_iper i); value aoi base i = base.data.ascends.get (Adef.int_of_iper i); value uoi base i = base.data.unions.get (Adef.int_of_iper i); value foi base i = base.data.families.get (Adef.int_of_ifam i); value coi base i = base.data.couples.get (Adef.int_of_ifam i); value doi base i = base.data.descends.get (Adef.int_of_ifam i); value sou base i = base.data.strings.get (Adef.int_of_istr i); value p_first_name base p = nominative (sou base p.first_name); value p_surname base p = nominative (sou base p.surname); value designation base p = let prenom = p_first_name base p in let nom = p_surname base p in prenom ^ "." ^ string_of_int p.occ ^ " " ^ nom ; value couple _ x y = Adef.couple x y; value strictly_after = CheckItem.strictly_after; value strictly_before_dmy = CheckItem.strictly_before_dmy; value date_of_death = CheckItem.date_of_death; value year_of d = d.year; value log_oc = ref stdout; type record = { rlab : string; rval : string; rcont : string; rsons : list record; rpos : int; rused : mutable bool } ; type choice3 'a 'b 'c 'd = [ Left3 of 'a | Right3 of 'b and 'c and 'd ] ; type month_number_dates = [ MonthDayDates | DayMonthDates | NoMonthNumberDates | MonthNumberHappened of string ] ; type charset = [ Ansel | Ascii | Msdos | MacIntosh | Utf8 ] ; type case = [ NoCase | LowerCase | UpperCase ] ; value lowercase_first_names = ref False; value case_surnames = ref NoCase; value extract_first_names = ref False; value extract_public_names = ref True; value charset_option = ref None; value charset = ref Ascii; value alive_years = ref 80; value dead_years = ref 120; value try_negative_dates = ref False; value no_negative_dates = ref False; value month_number_dates = ref NoMonthNumberDates; value no_public_if_titles = ref False; value first_names_brackets = ref None; value untreated_in_notes = ref False; value force = ref False; value default_source = ref ""; value relation_status = ref Married; value no_picture = ref False; value do_check = ref True; (* Reading input *) value line_cnt = ref 1; value in_file = ref ""; value print_location pos = fprintf log_oc.val "File \"%s\", line %d:\n" in_file.val pos ; value rec skip_eol = parser [ [: `'\010' | '\013'; _ = skip_eol :] -> () | [: :] -> () ] ; value rec get_to_eoln len = parser [ [: `'\010' | '\013'; _ = skip_eol :] -> Buff.get len | [: `'\t'; s :] -> get_to_eoln (Buff.store len ' ') s | [: `c; s :] -> get_to_eoln (Buff.store len c) s | [: :] -> Buff.get len ] ; value rec skip_to_eoln = parser [ [: `'\010' | '\013'; _ = skip_eol :] -> () | [: `_; s :] -> skip_to_eoln s | [: :] -> () ] ; value eol_chars = ['\010'; '\013']; value rec get_ident len = parser [ [: `' ' | '\t' :] -> Buff.get len | [: `c when not (List.mem c eol_chars); s :] -> get_ident (Buff.store len c) s | [: :] -> Buff.get len ] ; value skip_space = parser [ [: `' ' | '\t' :] -> () | [: :] -> () ] ; value rec line_start num = parser [ [: `' '; s :] -> line_start num s | [: `x when x = num :] -> () ] ; value ascii_of_msdos s = let s' = Bytes.create (String.length s) in do { for i = 0 to String.length s - 1 do { let cc = match Char.code s.[i] with [ 0o200 -> 0o307 | 0o201 -> 0o374 | 0o202 -> 0o351 | 0o203 -> 0o342 | 0o204 -> 0o344 | 0o205 -> 0o340 | 0o206 -> 0o345 | 0o207 -> 0o347 | 0o210 -> 0o352 | 0o211 -> 0o353 | 0o212 -> 0o350 | 0o213 -> 0o357 | 0o214 -> 0o356 | 0o215 -> 0o354 | 0o216 -> 0o304 | 0o217 -> 0o305 | 0o220 -> 0o311 | 0o221 -> 0o346 | 0o222 -> 0o306 | 0o223 -> 0o364 | 0o224 -> 0o366 | 0o225 -> 0o362 | 0o226 -> 0o373 | 0o227 -> 0o371 | 0o230 -> 0o377 | 0o231 -> 0o326 | 0o232 -> 0o334 | 0o233 -> 0o242 | 0o234 -> 0o243 | 0o235 -> 0o245 | 0o240 -> 0o341 | 0o241 -> 0o355 | 0o242 -> 0o363 | 0o243 -> 0o372 | 0o244 -> 0o361 | 0o245 -> 0o321 | 0o246 -> 0o252 | 0o247 -> 0o272 | 0o250 -> 0o277 | 0o252 -> 0o254 | 0o253 -> 0o275 | 0o254 -> 0o274 | 0o255 -> 0o241 | 0o256 -> 0o253 | 0o257 -> 0o273 | 0o346 -> 0o265 | 0o361 -> 0o261 | 0o366 -> 0o367 | 0o370 -> 0o260 | 0o372 -> 0o267 | 0o375 -> 0o262 | c -> c ] in Bytes.set s' i (Char.chr cc) }; s' } ; value ascii_of_macintosh s = let s' = Bytes.create (String.length s) in do { for i = 0 to String.length s - 1 do { let cc = match Char.code s.[i] with [ 0o200 -> 0o304 | 0o201 -> 0o305 | 0o202 -> 0o307 | 0o203 -> 0o311 | 0o204 -> 0o321 | 0o205 -> 0o326 | 0o206 -> 0o334 | 0o207 -> 0o341 | 0o210 -> 0o340 | 0o211 -> 0o342 | 0o212 -> 0o344 | 0o213 -> 0o343 | 0o214 -> 0o345 | 0o215 -> 0o347 | 0o216 -> 0o351 | 0o217 -> 0o350 | 0o220 -> 0o352 | 0o221 -> 0o353 | 0o222 -> 0o355 | 0o223 -> 0o354 | 0o224 -> 0o356 | 0o225 -> 0o357 | 0o226 -> 0o361 | 0o227 -> 0o363 | 0o230 -> 0o362 | 0o231 -> 0o364 | 0o232 -> 0o366 | 0o233 -> 0o365 | 0o234 -> 0o372 | 0o235 -> 0o371 | 0o236 -> 0o373 | 0o237 -> 0o374 | 0o241 -> 0o260 | 0o244 -> 0o247 | 0o245 -> 0o267 | 0o246 -> 0o266 | 0o247 -> 0o337 | 0o250 -> 0o256 | 0o256 -> 0o306 | 0o257 -> 0o330 | 0o264 -> 0o245 | 0o273 -> 0o252 | 0o274 -> 0o272 | 0o276 -> 0o346 | 0o277 -> 0o370 | 0o300 -> 0o277 | 0o301 -> 0o241 | 0o302 -> 0o254 | 0o307 -> 0o253 | 0o310 -> 0o273 | 0o312 -> 0o040 | 0o313 -> 0o300 | 0o314 -> 0o303 | 0o315 -> 0o325 | 0o320 -> 0o255 | 0o326 -> 0o367 | 0o330 -> 0o377 | 0o345 -> 0o302 | 0o346 -> 0o312 | 0o347 -> 0o301 | 0o350 -> 0o313 | 0o351 -> 0o310 | 0o352 -> 0o315 | 0o353 -> 0o316 | 0o354 -> 0o317 | 0o355 -> 0o314 | 0o356 -> 0o323 | 0o357 -> 0o324 | 0o361 -> 0o322 | 0o362 -> 0o332 | 0o363 -> 0o333 | 0o364 -> 0o331 | c -> c ] in Bytes.set s' i (Char.chr cc) }; s' } ; value utf8_of_string s = match charset.val with [ Ansel -> utf_8_of_iso_8859_1 (Ansel.to_iso_8859_1 s) | Ascii -> Mutil.utf_8_of_iso_8859_1 s | Msdos -> Mutil.utf_8_of_iso_8859_1 (ascii_of_msdos s) | MacIntosh -> Mutil.utf_8_of_iso_8859_1 (ascii_of_macintosh s) | Utf8 -> s ] ; value rec get_lev n = parser [: _ = line_start n; _ = skip_space; r1 = get_ident 0; strm :] -> let (rlab, rval, rcont, l) = if String.length r1 > 0 && r1.[0] = '@' then parse_address n r1 strm else parse_text n r1 strm in {rlab = rlab; rval = utf8_of_string rval; rcont = utf8_of_string rcont; rsons = List.rev l; rpos = line_cnt.val; rused = False} and parse_address n r1 = parser [: r2 = get_ident 0; r3 = get_to_eoln 0 ? "get to eoln"; l = get_lev_list [] (Char.chr (Char.code n + 1)) ? "get lev list" :] -> (r2, r1, r3, l) and parse_text n r1 = parser [: r2 = get_to_eoln 0; l = get_lev_list [] (Char.chr (Char.code n + 1)) ? "get lev list" :] -> (r1, r2, "", l) and get_lev_list l n = parser [ [: x = get_lev n; s :] -> get_lev_list [x :: l] n s | [: :] -> l ] ; (* Error *) value bad_dates_warned = ref False; value print_bad_date pos d = if bad_dates_warned.val then () else do { bad_dates_warned.val := True; print_location pos; fprintf log_oc.val "Can't decode date %s\n" d; flush log_oc.val } ; value check_month m = if m < 1 || m > 12 then do { fprintf log_oc.val "Bad (numbered) month in date: %d\n" m; flush log_oc.val } else () ; value warning_month_number_dates () = match month_number_dates.val with [ MonthNumberHappened s -> do { fprintf log_oc.val " Warning: the file holds dates with numbered months (like: 12/05/1912). GEDCOM standard *requires* that months in dates be identifiers. The correct form for this example would be 12 MAY 1912 or 5 DEC 1912. Consider restarting with option \"-dates_dm\" or \"-dates_md\". Use option -help to see what they do. (example found in gedcom: \"%s\") " s; flush log_oc.val } | _ -> () ] ; (* Decoding fields *) value rec skip_spaces = parser [ [: `' '; s :] -> skip_spaces s | [: :] -> () ] ; value rec ident_slash len = parser [ [: `'/' :] -> Buff.get len | [: `'\t'; a = ident_slash (Buff.store len ' ') :] -> a | [: `c; a = ident_slash (Buff.store len c) :] -> a | [: :] -> Buff.get len ] ; value strip c str = let start = loop 0 where rec loop i = if i = String.length str then i else if str.[i] = c then loop (i + 1) else i in let stop = loop (String.length str - 1) where rec loop i = if i = -1 then i + 1 else if str.[i] = c then loop (i - 1) else i + 1 in if start = 0 && stop = String.length str then str else if start >= stop then "" else String.sub str start (stop - start) ; value strip_spaces = strip ' '; value strip_newlines = strip '\n'; value less_greater_escaped s = let rec need_code i = if i < String.length s then match s.[i] with [ '<' | '>' -> True | x -> need_code (succ i) ] else False in let rec compute_len i i1 = if i < String.length s then let i1 = match s.[i] with [ '<' | '>' -> i1 + 4 | _ -> succ i1 ] in compute_len (succ i) i1 else i1 in let rec copy_code_in s1 i i1 = if i < String.length s then let i1 = match s.[i] with [ '<' -> do { String.blit "<" 0 s1 i1 4; i1 + 4 } | '>' -> do { String.blit ">" 0 s1 i1 4; i1 + 4 } | c -> do { Bytes.set s1 i1 c; succ i1 } ] in copy_code_in s1 (succ i) i1 else s1 in if need_code 0 then let len = compute_len 0 0 in copy_code_in (Bytes.create len) 0 0 else s ; value parse_name = parser [: _ = skip_spaces; invert = parser [ [: `'/' :] -> True | [: :] -> False ]; f = ident_slash 0; _ = skip_spaces; s = ident_slash 0 :] -> let (f, s) = if invert then (s, f) else (f, s) in let f = strip_spaces f in let s = strip_spaces s in (if f = "" then "x" else f, if s = "" then "?" else s) ; value rec find_field lab = fun [ [r :: rl] -> if r.rlab = lab then do { r.rused := True; Some r } else find_field lab rl | [] -> None ] ; value rec find_all_fields lab = fun [ [r :: rl] -> if r.rlab = lab then do { r.rused := True; [r :: find_all_fields lab rl] } else find_all_fields lab rl | [] -> [] ] ; value rec find_field_with_value lab v = fun [ [r :: rl] -> if r.rlab = lab && r.rval = v then do { r.rused := True; True } else find_field_with_value lab v rl | [] -> False ] ; value rec lexing_date = parser [ [: `('0'..'9' as c); n = number (Buff.store 0 c) :] -> ("INT", n) | [: `('A'..'Z' as c); i = ident (Buff.store 0 c) :] -> ("ID", i) | [: `'('; len = text 0 :] -> ("TEXT", Buff.get len) | [: `'.' :] -> ("", ".") | [: `' ' | '\t' | '\013'; s :] -> lexing_date s | [: _ = Stream.empty :] -> ("EOI", "") | [: `x :] -> ("", String.make 1 x) ] and number len = parser [ [: `('0'..'9' as c); a = number (Buff.store len c) :] -> a | [: :] -> Buff.get len ] and ident len = parser [ [: `('A'..'Z' as c); a = ident (Buff.store len c) :] -> a | [: :] -> Buff.get len ] and text len = parser [ [: `')' :] -> len | [: `'('; len = text (Buff.store len '('); s :] -> text (Buff.store len ')') s | [: `c; s :] -> text (Buff.store len c) s | [: :] -> len ] ; value make_date_lexing s = Stream.from (fun _ -> Some (lexing_date s)); value tparse = Token.default_match; value using_token (p_con, p_prm) = match p_con with [ "" | "INT" | "ID" | "TEXT" | "EOI" -> () | _ -> raise (Token.Error ("the constructor \"" ^ p_con ^ "\" is not recognized by the lexer")) ] ; value date_lexer = {Token.tok_func s = (make_date_lexing s, fun _ -> Token.dummy_loc); Token.tok_using = using_token; Token.tok_removing _ = (); Token.tok_match = tparse; Token.tok_text _ = ""; Token.tok_comm = None} ; type range 'a = [ Begin of 'a | End of 'a | BeginEnd of 'a and 'a ] ; value date_g = Grammar.gcreate date_lexer; value date_value = Grammar.Entry.create date_g "date value"; value date_interval = Grammar.Entry.create date_g "date interval"; value date_value_recover = Grammar.Entry.create date_g "date value"; value is_roman_int x = try let _ = Mutil.arabian_of_roman x in True with [ Not_found -> False ] ; value start_with_int x = try let s = String.sub x 0 1 in let _ = int_of_string s in True with [ _ -> False ] ; value roman_int = let p = parser [: `("ID", x) when is_roman_int x :] -> Mutil.arabian_of_roman x in Grammar.Entry.of_parser date_g "roman int" p ; value date_str = ref ""; value make_date n1 n2 n3 = let n3 = if no_negative_dates.val then match n3 with [ Some n3 -> Some (abs n3) | None -> None ] else n3 in match (n1, n2, n3) with [ (Some d, Some m, Some y) -> let (d, m) = match m with [ Right m -> (d, m) | Left m -> match month_number_dates.val with [ DayMonthDates -> do { check_month m; (d, m) } | MonthDayDates -> do { check_month d; (m, d) } | _ -> if d >= 1 && m >= 1 && d <= 31 && m <= 31 then if d > 13 && m <= 13 then (d, m) else if m > 13 && d <= 13 then (m, d) else if d > 13 && m > 13 then (0, 0) else do { month_number_dates.val := MonthNumberHappened date_str.val; (0, 0) } else (0, 0) ] ] in let (d, m) = if m < 1 || m > 13 then (0, 0) else (d, m) in {day = d; month = m; year = y; prec = Sure; delta = 0} | (None, Some m, Some y) -> let m = match m with [ Right m -> m | Left m -> m ] in {day = 0; month = m; year = y; prec = Sure; delta = 0} | (None, None, Some y) -> {day = 0; month = 0; year = y; prec = Sure; delta = 0} | (Some y, None, None) -> {day = 0; month = 0; year = y; prec = Sure; delta = 0} | _ -> raise (Stream.Error "bad date") ] ; value recover_date cal = fun [ Dgreg d Dgregorian -> let d = match cal with [ Dgregorian -> d | Djulian -> Calendar.gregorian_of_julian d | Dfrench -> Calendar.gregorian_of_french d | Dhebrew -> Calendar.gregorian_of_hebrew d ] in Dgreg d cal | d -> d ] ; EXTEND GLOBAL: date_value date_interval date_value_recover; date_value: [ [ d = date_or_text; EOI -> d ] ] ; date_value_recover: [ [ "@"; "#"; ID "DGREGORIAN"; "@"; d = date_value -> recover_date Dgregorian d | "@"; "#"; ID "DJULIAN"; "@"; d = date_value -> recover_date Djulian d | "@"; "#"; ID "DFRENCH"; ID "R"; "@"; d = date_value -> recover_date Dfrench d | "@"; "#"; ID "DHEBREW"; "@"; d = date_value -> recover_date Dhebrew d ] ] ; date_interval: [ [ ID "BEF"; dt = date_or_text; EOI -> End dt | ID "AFT"; dt = date_or_text; EOI -> Begin dt | ID "BET"; dt = date_or_text; ID "AND"; dt1 = date_or_text; EOI -> BeginEnd dt dt1 | ID "TO"; dt = date_or_text; EOI -> End dt | ID "FROM"; dt = date_or_text; EOI -> Begin dt | ID "FROM"; dt = date_or_text; ID "TO"; dt1 = date_or_text; EOI -> BeginEnd dt dt1 | dt = date_or_text; EOI -> Begin dt ] ] ; date_or_text: [ [ dr = date_range -> match dr with [ Begin (d, cal) -> Dgreg {(d) with prec = After} cal | End (d, cal) -> Dgreg {(d) with prec = Before} cal | BeginEnd (d1, cal1) (d2, cal2) -> let y2 = match cal2 with [ Dgregorian -> d2.year | Djulian -> (Calendar.julian_of_gregorian d2).year | Dfrench -> (Calendar.french_of_gregorian d2).year | Dhebrew -> (Calendar.hebrew_of_gregorian d2).year ] in Dgreg {(d1) with prec = YearInt y2} cal1 ] | (d, cal) = date -> Dgreg d cal | s = TEXT -> Dtext s ] ] ; date_range: [ [ ID "BEF"; dt = date -> End dt | ID "AFT"; dt = date -> Begin dt | ID "BET"; dt = date; ID "AND"; dt1 = date -> BeginEnd dt dt1 | ID "TO"; dt = date -> End dt | ID "FROM"; dt = date -> Begin dt | ID "FROM"; dt = date; ID "TO"; dt1 = date -> BeginEnd dt dt1 ] ] ; date: [ [ ID "ABT"; (d, cal) = date_calendar -> ({(d) with prec = About}, cal) | ID "ENV"; (d, cal) = date_calendar -> ({(d) with prec = About}, cal) | ID "EST"; (d, cal) = date_calendar -> ({(d) with prec = Maybe}, cal) | ID "AFT"; (d, cal) = date_calendar -> ({(d) with prec = Before}, cal) | ID "BEF"; (d, cal) = date_calendar -> ({(d) with prec = After}, cal) | (d, cal) = date_calendar -> (d, cal) ] ] ; date_calendar: [ [ "@"; "#"; ID "DGREGORIAN"; "@"; d = date_greg -> (d, Dgregorian) | "@"; "#"; ID "DJULIAN"; "@"; d = date_greg -> (Calendar.gregorian_of_julian d, Djulian) | "@"; "#"; ID "DFRENCH"; ID "R"; "@"; d = date_fren -> (Calendar.gregorian_of_french d, Dfrench) | "@"; "#"; ID "DHEBREW"; "@"; d = date_hebr -> (Calendar.gregorian_of_hebrew d, Dhebrew) | d = date_greg -> (d, Dgregorian) ] ] ; date_greg: [ [ LIST0 "."; n1 = OPT int; LIST0 [ "." | "/" ]; n2 = OPT gen_month; LIST0 [ "." | "/" ]; n3 = OPT int; LIST0 "." -> make_date n1 n2 n3 ] ] ; date_fren: [ [ LIST0 "."; n1 = int; (n2, n3) = date_fren_kont -> make_date (Some n1) n2 n3 | LIST0 "."; n1 = year_fren -> make_date (Some n1) None None | LIST0 "."; (n2, n3) = date_fren_kont -> make_date None n2 n3 ] ] ; date_fren_kont: [ [ LIST0 [ "." | "/" ]; n2 = OPT gen_french; LIST0 [ "." | "/" ]; n3 = OPT year_fren; LIST0 "." -> (n2, n3) ] ] ; date_hebr: [ [ LIST0 "."; n1 = OPT int; LIST0 [ "." | "/" ]; n2 = OPT gen_hebr; LIST0 [ "." | "/" ]; n3 = OPT int; LIST0 "." -> make_date n1 n2 n3 ] ] ; gen_month: [ [ i = int -> Left (abs i) | m = month -> Right m ] ] ; month: [ [ ID "JAN" -> 1 | ID "FEB" -> 2 | ID "MAR" -> 3 | ID "APR" -> 4 | ID "MAY" -> 5 | ID "JUN" -> 6 | ID "JUL" -> 7 | ID "AUG" -> 8 | ID "SEP" -> 9 | ID "OCT" -> 10 | ID "NOV" -> 11 | ID "DEC" -> 12 ] ] ; gen_french: [ [ m = french -> Right m ] ] ; french: [ [ ID "VEND" -> 1 | ID "BRUM" -> 2 | ID "FRIM" -> 3 | ID "NIVO" -> 4 | ID "PLUV" -> 5 | ID "VENT" -> 6 | ID "GERM" -> 7 | ID "FLOR" -> 8 | ID "PRAI" -> 9 | ID "MESS" -> 10 | ID "THER" -> 11 | ID "FRUC" -> 12 | ID "COMP" -> 13 ] ] ; year_fren: [ [ i = int -> i | ID "AN"; i = roman_int -> i | i = roman_int -> i ] ] ; gen_hebr: [ [ m = hebr -> Right m ] ] ; hebr: [ [ ID "TSH" -> 1 | ID "CSH" -> 2 | ID "KSL" -> 3 | ID "TVT" -> 4 | ID "SHV" -> 5 | ID "ADR" -> 6 | ID "ADS" -> 7 | ID "NSN" -> 8 | ID "IYR" -> 9 | ID "SVN" -> 10 | ID "TMZ" -> 11 | ID "AAV" -> 12 | ID "ELL" -> 13 ] ] ; int: [ [ i = INT -> try int_of_string i with [ Failure _ -> raise Stream.Failure ] | "-"; i = INT -> try (- int_of_string i) with [ Failure _ -> raise Stream.Failure ] ] ] ; END; value date_of_field pos d = if d = "" then None else do { let s = Stream.of_string (String.uppercase d) in date_str.val := d; try Some (Grammar.Entry.parse date_value s) with [ Ploc.Exc loc (Stream.Error _) -> let s = Stream.of_string (String.uppercase d) in try Some (Grammar.Entry.parse date_value_recover s) with [ Ploc.Exc loc (Stream.Error _) -> Some (Dtext d) ] ] } ; (* Creating base *) type tab 'a = { arr : mutable array 'a; tlen : mutable int }; type gen = { g_per : tab (choice3 string person ascend union); g_fam : tab (choice3 string family couple descend); g_str : tab string; g_bnot : mutable string; g_ic : in_channel; g_not : Hashtbl.t string int; g_src : Hashtbl.t string int; g_hper : Hashtbl.t string Adef.iper; g_hfam : Hashtbl.t string Adef.ifam; g_hstr : Hashtbl.t string dsk_istr; g_hnam : Hashtbl.t string (ref int); g_adop : Hashtbl.t string (Adef.iper * string); g_godp : mutable list (Adef.iper * Adef.iper); g_witn : mutable list (Adef.ifam * Adef.iper) } ; value assume_tab name tab none = if tab.tlen = Array.length tab.arr then do { let new_len = 2 * Array.length tab.arr + 1 in let new_arr = Array.make new_len none in Array.blit tab.arr 0 new_arr 0 (Array.length tab.arr); tab.arr := new_arr } else () ; value add_string gen s = try Hashtbl.find gen.g_hstr s with [ Not_found -> let i = gen.g_str.tlen in do { assume_tab "gen.g_str" gen.g_str ""; gen.g_str.arr.(i) := s; gen.g_str.tlen := gen.g_str.tlen + 1; Hashtbl.add gen.g_hstr s (Adef.istr_of_int i); Adef.istr_of_int i } ] ; value extract_addr addr = if String.length addr > 0 && addr.[0] = '@' then try let r = String.index_from addr 1 '@' in String.sub addr 0 (r + 1) with [ Not_found -> addr ] else addr ; value per_index gen lab = let lab = extract_addr lab in try Hashtbl.find gen.g_hper lab with [ Not_found -> let i = gen.g_per.tlen in do { assume_tab "gen.g_per" gen.g_per (Left3 ""); gen.g_per.arr.(i) := Left3 lab; gen.g_per.tlen := gen.g_per.tlen + 1; Hashtbl.add gen.g_hper lab (Adef.iper_of_int i); Adef.iper_of_int i } ] ; value fam_index gen lab = let lab = extract_addr lab in try Hashtbl.find gen.g_hfam lab with [ Not_found -> let i = gen.g_fam.tlen in do { assume_tab "gen.g_fam" gen.g_fam (Left3 ""); gen.g_fam.arr.(i) := Left3 lab; gen.g_fam.tlen := gen.g_fam.tlen + 1; Hashtbl.add gen.g_hfam lab (Adef.ifam_of_int i); Adef.ifam_of_int i } ] ; value string_empty = Adef.istr_of_int 0; value string_quest = Adef.istr_of_int 1; value string_x = Adef.istr_of_int 2; value unknown_per gen i sex = let empty = string_empty in let what = string_quest in let p = person_of_gen_person {first_name = what; surname = what; occ = i; public_name = empty; image = empty; qualifiers = []; aliases = []; first_names_aliases = []; surnames_aliases = []; titles = []; rparents = []; related = []; occupation = empty; sex = sex; access = IfTitles; birth = Adef.codate_None; birth_place = empty; birth_src = empty; baptism = Adef.codate_None; baptism_place = empty; baptism_src = empty; death = DontKnowIfDead; death_place = empty; death_src = empty; burial = UnknownBurial; burial_place = empty; burial_src = empty; notes = empty; psources = empty; key_index = Adef.iper_of_int i} and a = ascend_of_gen_ascend {parents = None; consang = Adef.fix (-1)} and u = union_of_gen_union {family = [| |]} in (p, a, u) ; value phony_per gen sex = let i = gen.g_per.tlen in let (person, ascend, union) = unknown_per gen i sex in do { assume_tab "gen.g_per" gen.g_per (Left3 ""); gen.g_per.tlen := gen.g_per.tlen + 1; gen.g_per.arr.(i) := Right3 person ascend union; Adef.iper_of_int i } ; value unknown_fam gen i = let empty = string_empty in let father = phony_per gen Male in let mother = phony_per gen Female in let f = family_of_gen_family {marriage = Adef.codate_None; marriage_place = empty; marriage_src = empty; witnesses = [| |]; relation = relation_status.val; divorce = NotDivorced; comment = empty; origin_file = empty; fsources = empty; fam_index = Adef.ifam_of_int i} and c = couple_of_gen_couple (couple False father mother) and d = descend_of_gen_descend {children = [| |]} in (f, c, d) ; value phony_fam gen = let i = gen.g_fam.tlen in let (fam, cpl, des) = unknown_fam gen i in do { assume_tab "gen.g_fam" gen.g_fam (Left3 ""); gen.g_fam.tlen := gen.g_fam.tlen + 1; gen.g_fam.arr.(i) := Right3 fam cpl des; Adef.ifam_of_int i } ; value this_year = let tm = Unix.localtime (Unix.time ()) in tm.Unix.tm_year + 1900 ; value infer_death birth bapt = match (birth, bapt) with [ (Some (Dgreg d _), _) -> let a = this_year - d.year in if a > dead_years.val then DeadDontKnowWhen else if a <= alive_years.val then NotDead else DontKnowIfDead | (_, Some (Dgreg d _)) -> let a = this_year - d.year in if a > dead_years.val then DeadDontKnowWhen else if a <= alive_years.val then NotDead else DontKnowIfDead | _ -> DontKnowIfDead ] ; (* Fonctions utiles pour la mise en forme des noms. *) (* Hashtbl (utf8.ml) qui font la correspondance entre : *) (* - l'encoding -> le nom *) (* - le nom -> l'encoding *) value (ht_e_n, ht_n_e) = do { let ht_e_n = Hashtbl.create 5003 in let ht_n_e = Hashtbl.create 5003 in List.iter (fun (encoding, name) -> do { Hashtbl.add ht_n_e name encoding; Hashtbl.add ht_e_n encoding name; }) Utf8.utf8_list; (ht_e_n, ht_n_e) }; value string_ini_eq s1 i s2 = loop i 0 where rec loop i j = if j = String.length s2 then True else if i = String.length s1 then False else if s1.[i] = s2.[j] then loop (i + 1) (j + 1) else False ; value particle s i = let particles = ["af "; "d'"; "d’"; "dal "; "de "; "des "; "di "; "du "; "of "; "van "; "von und zu "; "von "; "y "; "zu "; "zur "; "AF "; "D'"; "D’"; "DAL "; "DE "; "DES "; "DI "; "DU "; "OF "; "VAN "; "VON UND ZU "; "VON "; "Y "; "ZU "; "ZUR "] in List.exists (string_ini_eq s i) particles ; value look_like_a_number s = loop 0 where rec loop i = if i = String.length s then True else match s.[i] with [ '0'..'9' -> loop (i + 1) | _ -> False ] ; value is_a_name_char = fun [ 'A'..'Z' | 'a'..'z' | '0'..'9' | '-' | ''' -> True | c -> Char.code c > 127 ] ; value rec next_word_pos s i = if i = String.length s then i else if is_a_name_char s.[i] then i else next_word_pos s (i + 1) ; value rec next_sep_pos s i = if i = String.length s then String.length s else if is_a_name_char s.[i] then next_sep_pos s (i + 1) else i ; value public_name_word = ["Ier"; "Ière"; "der"; "den"; "die"; "el"; "le"; "la"; "the"] ; value rec is_a_public_name s i = let i = next_word_pos s i in if i = String.length s then False else let j = next_sep_pos s i in if j > i then let w = String.sub s i (j - i) in if look_like_a_number w then True else if is_roman_int w then True else if List.mem w public_name_word then True else is_a_public_name s j else False ; value gen_lowercase_uppercase_utf8_letter lower s = (* liste des code hexa correspondant à l'encodage du caractère e. *) let list_of_encodings e = let rec loop len e l = if e = "" then l else let i = String.index e '/' in let j = try String.index_from e (i+1) '/' with [ Not_found -> String.length e ] in let k = "0" ^ String.sub e (i+1) (j-1) in loop (len+1) (String.sub e j (String.length e - j)) [int_of_string k :: l] in let l = loop 0 e [] in List.rev l in (* l'encodage du caractère s. *) let encoding = loop 0 s "" where rec loop i s e = if i = String.length s then e else let e = e ^ Printf.sprintf "/x%x" (Char.code s.[i]) in loop (i + 1) s e in try let name = Hashtbl.find ht_e_n encoding in let name = if lower then Str.replace_first (Str.regexp "CAPITAL") "SMALL" name else Str.replace_first (Str.regexp "SMALL") "CAPITAL" name in let new_encoding = Hashtbl.find ht_n_e name in let (el, len) = let l = list_of_encodings new_encoding in (l, List.length l) in let s = Bytes.create len in loop 0 el s where rec loop i el s = match el with [ [] -> s | [e :: ell] -> let _s = Bytes.set s i (Char.chr e) in loop (i + 1) ell s ] with [ Not_found -> s ] ; value lowercase_utf8_letter = gen_lowercase_uppercase_utf8_letter True; value uppercase_utf8_letter = gen_lowercase_uppercase_utf8_letter False; value capitalize_word s = let s = Bytes.copy s in copy False 0 0 (particle s 0) where rec copy special i len uncap = if i = String.length s then Buff.get len else match s.[i] with [ 'a'..'z' as c -> let c = if uncap then c else Char.chr (Char.code c - Char.code 'a' + Char.code 'A') in copy False (i + 1) (Buff.store len c) True | 'A'..'Z' as c -> let c = if not uncap then c else Char.chr (Char.code c - Char.code 'A' + Char.code 'a') in copy False (i + 1) (Buff.store len c) True | c -> if Char.code c < 128 then copy False (i + 1) (Buff.store len c) (particle s (i+1)) else let nbc = Name.nbc s.[i] in if nbc = 1 || nbc < 0 || i + nbc > String.length s then copy False (i + 1) (Buff.store len s.[i]) True else let s = String.sub s i nbc in let s = if not uncap then uppercase_utf8_letter s else lowercase_utf8_letter s in let (t, j) = (s, i + nbc) in copy False j (Buff.mstore len t) True ] ; value uppercase_word s = let s = Bytes.copy s in copy False 0 0 (particle s 0) where rec copy special i len uncap = if i = String.length s then Buff.get len else match s.[i] with [ 'a'..'z' as c -> let c = if uncap then c else Char.chr (Char.code c - Char.code 'a' + Char.code 'A') in copy False (i + 1) (Buff.store len c) uncap | 'A'..'Z' as c -> let c = if not uncap then c else Char.chr (Char.code c - Char.code 'A' + Char.code 'a') in copy False (i + 1) (Buff.store len c) uncap | c -> if Char.code c < 128 then copy False (i + 1) (Buff.store len c) (particle s (i+1)) else let nbc = Name.nbc s.[i] in if nbc = 1 || nbc < 0 || i + nbc > String.length s then copy False (i + 1) (Buff.store len s.[i]) False else let s = String.sub s i nbc in let s = if uncap then s else uppercase_utf8_letter s in let (t, j) = (s, i + nbc) in copy False j (Buff.mstore len t) False ] ; module Buff2 = Buff.Make (struct value buff = ref (Bytes.create 80); end); value capitalize_name s = (* On initialise le buffer à la valeur de s. *) let _ = Buff2.mstore 0 s in loop 0 0 where rec loop len k = let i = next_word_pos s k in if i = String.length s then Buff2.get (String.length s) else let j = next_sep_pos s i in if j > i then let w = String.sub s i (j - i) in let w = if is_roman_int w || particle s i || List.mem w public_name_word || start_with_int w then w else capitalize_word w in let len = loop len k where rec loop len k = if k = i then len else loop (Buff2.store len s.[k]) (k + 1) in loop (Buff2.mstore len w) j else Buff2.get len ; value uppercase_name s = (* On initialise le buffer à la valeur de s. *) let _ = Buff2.mstore 0 s in loop 0 0 where rec loop len k = let i = next_word_pos s k in if i = String.length s then Buff2.get (String.length s) else let j = next_sep_pos s i in if j > i then let w = String.sub s i (j - i) in let w = if is_roman_int w || particle s i || List.mem w public_name_word || start_with_int w then w else uppercase_word w in let len = loop len k where rec loop len k = if k = i then len else loop (Buff2.store len s.[k]) (k + 1) in loop (Buff2.mstore len w) j else Buff2.get len ; value get_lev0 = parser [: _ = line_start '0'; _ = skip_space; r1 = get_ident 0; r2 = get_ident 0; r3 = get_to_eoln 0 ? "get to eoln"; l = get_lev_list [] '1' ? "get lev list" :] -> let (rlab, rval) = if r2 = "" then (r1, "") else (r2, r1) in let rval = utf8_of_string rval in let rcont = utf8_of_string r3 in {rlab = rlab; rval = rval; rcont = rcont; rsons = List.rev l; rpos = line_cnt.val; rused = False} ; value find_notes_record gen addr = match try Some (Hashtbl.find gen.g_not addr) with [ Not_found -> None ] with [ Some i -> do { seek_in gen.g_ic i; try Some (get_lev0 (Stream.of_channel gen.g_ic)) with [ Stream.Failure | Stream.Error _ -> None ] } | None -> None ] ; value find_sources_record gen addr = match try Some (Hashtbl.find gen.g_src addr) with [ Not_found -> None ] with [ Some i -> do { seek_in gen.g_ic i; try Some (get_lev '0' (Stream.of_channel gen.g_ic)) with [ Stream.Failure | Stream.Error _ -> None ] } | None -> None ] ; value rec flatten_notes = fun [ [r :: rl] -> let n = flatten_notes rl in match r.rlab with [ "CONC" | "CONT" | "NOTE" -> [(r.rlab, r.rval) :: flatten_notes r.rsons @ n] | _ -> n ] | [] -> [] ] ; value extract_notes gen rl = List.fold_right (fun r lines -> List.fold_right (fun r lines -> do { r.rused := True; if r.rlab = "NOTE" && r.rval <> "" && r.rval.[0] = '@' then let addr = extract_addr r.rval in match find_notes_record gen addr with [ Some r -> let l = flatten_notes r.rsons in [("NOTE", r.rcont) :: l @ lines] | None -> do { print_location r.rpos; fprintf log_oc.val "Note %s not found\n" addr; flush log_oc.val; lines } ] else [(r.rlab, r.rval) :: lines] }) [r :: r.rsons] lines) rl [] ; value rebuild_text r = let s = strip_spaces r.rval in List.fold_left (fun s e -> let _ = do { e.rused := True } in let n = e.rval in let end_spc = if String.length n > 1 && n.[String.length n - 1] = ' ' then " " else "" in let n = strip_spaces n in match e.rlab with [ "CONC" -> s ^ n ^ end_spc | "CONT" -> s ^ "
\n" ^ n ^ end_spc | _ -> s ]) s r.rsons ; value notes_from_source_record rl = let title = match find_field "TITL" rl with [ Some l -> let s = rebuild_text l in if s = "" then "" else "" ^ s ^"" | None -> "" ] in let text = match find_field "TEXT" rl with [ Some l -> let s = rebuild_text l in if title = "" then s else "
\n" ^ s | None -> "" ] in title ^ text ; value treat_notes gen rl = let lines = extract_notes gen rl in let buf = Buffer.create (List.length lines) in let () = List.iter (fun (lab, n) -> let spc = String.length n > 0 && n.[0] = ' ' in let end_spc = String.length n > 1 && n.[String.length n - 1] = ' ' in let n = strip_spaces n in if Buffer.length buf = 0 then do { Buffer.add_string buf n; Buffer.add_string buf (if end_spc then " " else "") } else if lab = "CONT" || lab = "NOTE" then do { Buffer.add_string buf "
\n"; Buffer.add_string buf n; Buffer.add_string buf (if end_spc then " " else "") } else if n = "" then () else do { Buffer.add_string buf (if spc then "\n" else ""); Buffer.add_string buf n; Buffer.add_string buf (if end_spc then " " else "") }) lines in strip_newlines (Buffer.contents buf) ; value source gen r = match find_field "SOUR" r.rsons with [ Some r -> if String.length r.rval > 0 && r.rval.[0] = '@' then match find_sources_record gen r.rval with [ Some v -> (strip_spaces v.rcont, v.rsons) | None -> do { print_location r.rpos; fprintf log_oc.val "Source %s not found\n" r.rval; flush log_oc.val; ("", []) } ] else (strip_spaces r.rval, r.rsons) | _ -> ("", []) ] ; value p_index_from s i c = if i >= String.length s then String.length s else try String.index_from s i c with [ Not_found -> String.length s ] ; value strip_sub s beg len = strip_spaces (String.sub s beg len); value decode_title s = let i1 = p_index_from s 0 ',' in let i2 = p_index_from s (i1 + 1) ',' in let title = strip_sub s 0 i1 in let (place, nth) = if i1 = String.length s then ("", 0) else if i2 = String.length s then let s1 = strip_sub s (i1 + 1) (i2 - i1 - 1) in try ("", int_of_string s1) with [ Failure _ -> (s1, 0) ] else let s1 = strip_sub s (i1 + 1) (i2 - i1 - 1) in let s2 = strip_sub s (i2 + 1) (String.length s - i2 - 1) in try (s1, int_of_string s2) with [ Failure _ -> (strip_sub s i1 (String.length s - i1), 0) ] in (title, place, nth) ; value list_of_string s = loop 0 0 [] where rec loop i len list = if i = String.length s then List.rev [Buff.get len :: list] else match s.[i] with [ ',' -> loop (i + 1) 0 [Buff.get len :: list] | c -> loop (i + 1) (Buff.store len c) list ] ; value purge_list list = List.fold_right (fun s list -> match strip_spaces s with [ "" -> list | s -> [s :: list] ]) list [] ; value decode_date_interval pos s = let strm = Stream.of_string s in try match Grammar.Entry.parse date_interval strm with [ BeginEnd d1 d2 -> (Some d1, Some d2) | Begin d -> (Some d, None) | End d -> (None, Some d) ] with [ Ploc.Exc _ _ | Not_found -> do { print_bad_date pos s; (None, None) } ] ; value treat_indi_title gen public_name r = let (title, place, nth) = decode_title r.rval in let (date_start, date_end) = match find_field "DATE" r.rsons with [ Some r -> decode_date_interval r.rpos r.rval | None -> (None, None) ] in let (name, title, place) = match find_field "NOTE" r.rsons with [ Some r -> if title = "" then (Tnone, strip_spaces r.rval, "") else if r.rval = public_name then (Tmain, title, place) else (Tname (add_string gen (strip_spaces r.rval)), title, place) | None -> (Tnone, title, place) ] in {t_name = name; t_ident = add_string gen title; t_place = add_string gen place; t_date_start = Adef.codate_of_od date_start; t_date_end = Adef.codate_of_od date_end; t_nth = nth} ; value forward_adop gen ip lab which_parent = let which_parent = match which_parent with [ Some r -> r.rval | _ -> "" ] in let which_parent = if which_parent = "" then "BOTH" else which_parent in Hashtbl.add gen.g_adop lab (ip, which_parent) ; value adop_parent gen ip r = let i = per_index gen r.rval in match gen.g_per.arr.(Adef.int_of_iper i) with [ Left3 _ -> None | Right3 p a u -> do { if List.mem ip (get_related p) then () else let p = person_with_related p [ip :: get_related p] in gen.g_per.arr.(Adef.int_of_iper i) := Right3 p a u; Some (get_key_index p) } ] ; value set_adop_fam gen ip which_parent fath moth = match gen.g_per.arr.(Adef.int_of_iper ip) with [ Left3 _ -> () | Right3 per asc uni -> let r_fath = match (which_parent, fath) with [ ("HUSB" | "BOTH", Some r) -> adop_parent gen ip r | _ -> None ] in let r_moth = match (which_parent, moth) with [ ("WIFE" | "BOTH", Some r) -> adop_parent gen ip r | _ -> None ] in let r = {r_type = Adoption; r_fath = r_fath; r_moth = r_moth; r_sources = string_empty} in let per = person_with_rparents per [r :: get_rparents per] in gen.g_per.arr.(Adef.int_of_iper ip) := Right3 per asc uni ] ; value forward_godp gen ip rval = let ipp = per_index gen rval in do { gen.g_godp := [(ipp, ip) :: gen.g_godp]; ipp } ; value forward_witn gen ip rval = let ifam = fam_index gen rval in do { gen.g_witn := [(ifam, ip) :: gen.g_witn]; ifam } ; value glop = ref []; value indi_lab = fun [ "ADOP" | "ASSO" | "BAPM" | "BIRT" | "BURI" | "CHR" | "CREM" | "DEAT" | "FAMC" | "FAMS" | "NAME" | "NOTE" | "OBJE" | "OCCU" | "SEX" | "SOUR" | "TITL" -> True | c -> do { if List.mem c glop.val then () else do { glop.val := [c :: glop.val]; eprintf "untreated tag %s -> in notes\n" c; flush stderr }; False } ] ; value html_text_of_tags text rl = let rec tot len lev r = let len = Buff.mstore len (string_of_int lev) in let len = Buff.store len ' ' in let len = Buff.mstore len r.rlab in let len = if r.rval = "" then len else Buff.mstore (Buff.store len ' ') r.rval in let len = if r.rcont = "" then len else Buff.mstore (Buff.store len ' ') r.rcont in totl len (lev + 1) r.rsons and totl len lev rl = List.fold_left (fun len r -> let len = Buff.store len '\n' in tot len lev r) len rl in let title = if text = "" then "-- GEDCOM --" else "-- GEDCOM (" ^ text ^ ") --" in let len = 0 in let len = Buff.mstore len title in let len = totl len 1 rl in Buff.get len ; value rec find_all_rela nl = fun [ [] -> [] | [r :: rl] -> match find_field "RELA" r.rsons with [ Some r1 -> loop nl where rec loop = fun [ [n :: nl1] -> let len = String.length n in if String.length r1.rval >= len && String.lowercase (String.sub r1.rval 0 len) = n then [(n, r.rval) :: find_all_rela nl rl] else loop nl1 | [] -> find_all_rela nl rl ] | None -> find_all_rela nl rl ] ] ; value rec build_remain_tags = fun [ [] -> [] | [r :: rest] -> let rsons = build_remain_tags r.rsons in let rest = build_remain_tags rest in if r.rused = True && rsons = [] then rest else [{rlab = r.rlab; rval = r.rval; rcont = r.rcont; rsons = rsons; rpos = r.rpos; rused = r.rused} :: rest] ] ; value applycase_surname s = match case_surnames.val with [ NoCase -> s | LowerCase -> capitalize_name s | UpperCase -> if charset.val = Utf8 then uppercase_name s else String.uppercase s ] ; value add_indi gen r = let ip = per_index gen r.rval in let name_sons = find_field "NAME" r.rsons in let givn = match name_sons with [ Some n -> match find_field "GIVN" n.rsons with [ Some r -> r.rval | None -> "" ] | None -> "" ] in let (first_name, surname, occ, public_name, first_names_aliases) = match name_sons with [ Some n -> let (f, s) = parse_name (Stream.of_string n.rval) in let pn = "" in let fal = if givn = f then [] else [givn] in let (f, fal) = match first_names_brackets.val with (* [ Some (' ', eb) -> let first_enclosed f = let j = String.index f eb in let i = try String.rindex_from f (j - 1) ' ' with [ Not_found -> -1 ] in let fn = String.sub f (i + 1) (j - i - 1) in let fa = String.sub f 0 j ^ String.sub f (j + 1) (String.length f - j - 1) in (fn, fa) in loop True f "" where rec loop first ff accu = try let (fn, fa) = first_enclosed ff in let accu = if first then fn else if fn <> "" then accu ^ " " ^ fn else accu in loop False fa accu with [ Not_found -> if f = ff then (f, fal) else (accu, [ff :: fal]) ] *) [ Some (bb, eb) -> let first_enclosed f = let i = String.index f bb in let j = if i + 2 >= String.length f then raise Not_found else String.index_from f (i + 2) eb in let fn = String.sub f (i + 1) (j - i - 1) in let fa = String.sub f 0 i ^ fn ^ String.sub f (j + 1) (String.length f - j - 1) in (fn, fa) in loop True f "" where rec loop first ff accu = try let (fn, fa) = first_enclosed ff in let accu = if first then fn else if fn <> "" then accu ^ " " ^ fn else accu in loop False fa accu with [ Not_found -> if f = ff then (f, fal) else (accu, [ff :: fal]) ] | None -> (f, fal) ] in let (f, pn, fal) = if extract_public_names.val || extract_first_names.val then let i = next_word_pos f 0 in let j = next_sep_pos f i in if j = String.length f then (f, pn, fal) else let fn = String.sub f i (j - i) in if pn = "" && extract_public_names.val then if is_a_public_name f j then (fn, f, fal) else if extract_first_names.val then (fn, "", [f :: fal]) else (f, "", fal) else (fn, pn, [f :: fal]) else (f, pn, fal) in let f = if lowercase_first_names.val then capitalize_name f else f in let fal = if lowercase_first_names.val then List.map capitalize_name fal else fal in let pn = if capitalize_name pn = f then "" else pn in let pn = if lowercase_first_names.val then capitalize_name pn else pn in let fal = List.fold_right (fun fa fal -> if fa = pn then fal else [fa :: fal]) fal [] in let s = applycase_surname s in let r = let key = Name.strip_lower (nominative f ^ " " ^ nominative s) in try Hashtbl.find gen.g_hnam key with [ Not_found -> let r = ref (-1) in do { Hashtbl.add gen.g_hnam key r; r } ] in do { incr r; (f, s, r.val, pn, fal) } | None -> ("?", "?", Adef.int_of_iper ip, givn, []) ] in (* S'il y a des caractères interdits, on les supprime *) let (first_name, surname) = (Name.strip_c first_name ':', Name.strip_c surname ':') in let qualifier = match name_sons with [ Some n -> match find_field "NICK" n.rsons with [ Some r -> r.rval | None -> "" ] | None -> "" ] in let surname_aliases = match name_sons with [ Some n -> match find_field "SURN" n.rsons with [ Some r -> let list = purge_list (list_of_string r.rval) in List.fold_right (fun x list -> let x = applycase_surname x in if x <> surname then [x :: list] else list) list [] | _ -> [] ] | None -> [] ] in let aliases = match find_all_fields "NAME" r.rsons with [ [_ :: l] -> List.map (fun r -> r.rval) l | _ -> [] ] in let sex = match find_field "SEX" r.rsons with [ Some {rval = "M"} -> Male | Some {rval = "F"} -> Female | _ -> Neuter ] in let image = match find_field "OBJE" r.rsons with [ Some r -> match find_field "FILE" r.rsons with [ Some r -> if no_picture.val then "" else r.rval | None -> "" ] | None -> "" ] in let parents = match find_field "FAMC" r.rsons with [ Some r -> Some (fam_index gen r.rval) | None -> None ] in let occupation = match find_all_fields "OCCU" r.rsons with [ [r :: rl] -> List.fold_left (fun s r -> s ^ ", " ^ strip_spaces r.rval) (strip_spaces r.rval) rl | [] -> "" ] in let notes = match find_all_fields "NOTE" r.rsons with [ [] -> "" | rl -> treat_notes gen rl ] in let titles = List.map (treat_indi_title gen public_name) (find_all_fields "TITL" r.rsons) in let family = let rl = find_all_fields "FAMS" r.rsons in let rvl = List.fold_right (fun r rvl -> if List.mem r.rval rvl then rvl else [r.rval :: rvl]) rl [] in List.map (fun r -> fam_index gen r) rvl in let rasso = find_all_fields "ASSO" r.rsons in let rparents = let godparents = find_all_rela ["godf"; "godm"; "godp"] rasso in let godparents = if godparents = [] then let ro = match find_field "BAPM" r.rsons with [ None -> find_field "CHR" r.rsons | x -> x ] in match ro with [ Some r -> find_all_rela ["godf"; "godm"; "godp"] rasso | None -> [] ] else godparents in loop godparents where rec loop rl = if rl <> [] then let (r_fath, rl) = match rl with [ [("godf", r) :: rl] -> (Some (forward_godp gen ip r), rl) | _ -> (None, rl) ] in let (r_moth, rl) = match rl with [ [("godm", r) :: rl] -> (Some (forward_godp gen ip r), rl) | _ -> (None, rl) ] in let (r_fath, r_moth, rl) = if r_fath <> None || r_moth <> None then (r_fath, r_moth, rl) else let (r_fath, rl) = match rl with [ [("godp", r) :: rl] -> (Some (forward_godp gen ip r), rl) | _ -> (None, rl) ] in (r_fath, None, rl) in let r = {r_type = GodParent; r_fath = r_fath; r_moth = r_moth; r_sources = string_empty} in [r :: loop rl] else [] in let witn = find_all_rela ["witness"] rasso in let _ = List.map (fun (n, rval) -> forward_witn gen ip rval) witn in let (birth, birth_place, (birth_src, birth_nt)) = match find_field "BIRT" r.rsons with [ Some r -> let d = match find_field "DATE" r.rsons with [ Some r -> date_of_field r.rpos r.rval | _ -> None ] in let p = match find_field "PLAC" r.rsons with [ Some r -> strip_spaces r.rval | _ -> "" ] in (d, p, source gen r) | None -> (None, "", ("", [])) ] in let (bapt, bapt_place, (bapt_src, bapt_nt)) = let ro = match find_field "BAPM" r.rsons with [ None -> find_field "CHR" r.rsons | x -> x ] in match ro with [ Some r -> let d = match find_field "DATE" r.rsons with [ Some r -> date_of_field r.rpos r.rval | _ -> None ] in let p = match find_field "PLAC" r.rsons with [ Some r -> strip_spaces r.rval | _ -> "" ] in (d, p, source gen r) | None -> (None, "", ("", [])) ] in let (death, death_place, (death_src, death_nt)) = match find_field "DEAT" r.rsons with [ Some r -> if r.rsons = [] then if r.rval = "Y" then (DeadDontKnowWhen, "", ("", [])) else (infer_death birth bapt, "", ("", [])) else let d = match find_field "DATE" r.rsons with [ Some r -> match date_of_field r.rpos r.rval with [ Some d -> Death Unspecified (Adef.cdate_of_date d) | None -> DeadDontKnowWhen ] | _ -> DeadDontKnowWhen ] in let p = match find_field "PLAC" r.rsons with [ Some r -> strip_spaces r.rval | _ -> "" ] in (d, p, source gen r) | None -> (infer_death birth bapt, "", ("", [])) ] in let (burial, burial_place, (burial_src, burial_nt)) = let (buri, buri_place, (buri_src, buri_nt)) = match find_field "BURI" r.rsons with [ Some r -> if r.rsons = [] then if r.rval = "Y" then (Buried Adef.codate_None, "", ("", [])) else (UnknownBurial, "", ("", [])) else let d = match find_field "DATE" r.rsons with [ Some r -> date_of_field r.rpos r.rval | _ -> None ] in let p = match find_field "PLAC" r.rsons with [ Some r -> strip_spaces r.rval | _ -> "" ] in (Buried (Adef.codate_of_od d), p, source gen r) | None -> (UnknownBurial, "", ("", [])) ] in let (crem, crem_place, (crem_src, crem_nt)) = match find_field "CREM" r.rsons with [ Some r -> if r.rsons = [] then if r.rval = "Y" then (Cremated Adef.codate_None, "", ("", [])) else (UnknownBurial, "", ("", [])) else let d = match find_field "DATE" r.rsons with [ Some r -> date_of_field r.rpos r.rval | _ -> None ] in let p = match find_field "PLAC" r.rsons with [ Some r -> strip_spaces r.rval | _ -> "" ] in (Cremated (Adef.codate_of_od d), p, source gen r) | None -> (UnknownBurial, "", ("", [])) ] in match (buri, crem) with [ (UnknownBurial, Cremated _) -> (crem, crem_place, (crem_src, crem_nt)) | _ -> (buri, buri_place, (buri_src, buri_nt)) ] in let birth = Adef.codate_of_od birth in let bapt = Adef.codate_of_od bapt in let (psources, psources_nt) = let (s, s_nt) = source gen r in if s = "" then (default_source.val, s_nt) else (s, s_nt) in let ext_notes = let concat_text s1 s2 s_sep = let s = if s1 = "" && notes = "" || s2 = "" then "" else s_sep in s1 ^ s ^ s2 in let text = concat_text "" (notes_from_source_record birth_nt) "
\n" in let text = concat_text text (notes_from_source_record bapt_nt) "
\n" in let text = concat_text text (notes_from_source_record death_nt) "
\n" in let text = concat_text text (notes_from_source_record burial_nt) "
\n" in let text = concat_text text (notes_from_source_record psources_nt) "
\n" in if untreated_in_notes.val then let remain_tags_in_notes text init rtl = let rtl = build_remain_tags rtl in if rtl = [] then init else concat_text init (html_text_of_tags text rtl) "\n" in let nt = remain_tags_in_notes "INDI" "" r.rsons in let nt = remain_tags_in_notes "BIRT SOUR" nt birth_nt in let nt = remain_tags_in_notes "BAPT SOUR" nt bapt_nt in let nt = remain_tags_in_notes "DEAT SOUR" nt death_nt in let nt = remain_tags_in_notes "BURI/CREM SOUR" nt burial_nt in let nt = remain_tags_in_notes "SOUR SOUR" nt psources_nt in if nt = "" then text else text ^ "
\n" ^ nt ^ "\n
" else text in let person = person_of_gen_person {first_name = add_string gen first_name; surname = add_string gen surname; occ = occ; public_name = add_string gen public_name; image = add_string gen image; qualifiers = if qualifier <> "" then [add_string gen qualifier] else []; aliases = List.map (add_string gen) aliases; first_names_aliases = List.map (add_string gen) first_names_aliases; surnames_aliases = List.map (add_string gen) surname_aliases; titles = titles; rparents = rparents; related = []; occupation = add_string gen occupation; sex = sex; access = if no_public_if_titles.val && titles <> [] then Private else IfTitles; birth = birth; birth_place = add_string gen birth_place; birth_src = add_string gen birth_src; baptism = bapt; baptism_place = add_string gen bapt_place; baptism_src = add_string gen bapt_src; death = death; death_place = add_string gen death_place; death_src = add_string gen death_src; burial = burial; burial_place = add_string gen burial_place; burial_src = add_string gen burial_src; notes = add_string gen (notes ^ ext_notes); psources = add_string gen psources; key_index = ip} in let ascend = ascend_of_gen_ascend {parents = parents; consang = Adef.fix (-1)} in let union = union_of_gen_union {family = Array.of_list family} in do { gen.g_per.arr.(Adef.int_of_iper ip) := Right3 person ascend union; match find_field "ADOP" r.rsons with [ Some r -> match find_field "FAMC" r.rsons with [ Some r -> forward_adop gen ip r.rval (find_field "ADOP" r.rsons) | _ -> () ] | _ -> () ]; r.rused := True } ; value add_fam_norm gen r adop_list = let i = fam_index gen r.rval in let (fath, moth, gay) = match (find_all_fields "HUSB" r.rsons, find_all_fields "WIFE" r.rsons) with [ ([f1], [m1]) -> (per_index gen f1.rval, per_index gen m1.rval, False) | ([f1; f2 :: []], []) -> (per_index gen f1.rval, per_index gen f2.rval, True) | ([], [m1; m2 :: []]) -> (per_index gen m1.rval, per_index gen m2.rval, True) | _ -> let fath = match find_field "HUSB" r.rsons with [ Some r -> per_index gen r.rval | None -> phony_per gen Male ] in let moth = match find_field "WIFE" r.rsons with [ Some r -> per_index gen r.rval | None -> phony_per gen Female ] in (fath, moth, False) ] in do { match gen.g_per.arr.(Adef.int_of_iper fath) with [ Left3 lab -> () | Right3 p a u -> let u = if not (List.mem i (Array.to_list (get_family u))) then union_of_gen_union {family = Array.append (get_family u) [| i |]} else u in let p = if get_sex p = Neuter then person_with_sex p Male else p in gen.g_per.arr.(Adef.int_of_iper fath) := Right3 p a u ]; match gen.g_per.arr.(Adef.int_of_iper moth) with [ Left3 lab -> () | Right3 p a u -> let u = if not (List.mem i (Array.to_list (get_family u))) then union_of_gen_union {family = Array.append (get_family u) [| i |]} else u in let p = if get_sex p = Neuter then person_with_sex p Female else p in gen.g_per.arr.(Adef.int_of_iper moth) := Right3 p a u ]; let children = let rl = find_all_fields "CHIL" r.rsons in List.fold_right (fun r ipl -> let ip = per_index gen r.rval in if List.mem_assoc ip adop_list then match gen.g_per.arr.(Adef.int_of_iper ip) with [ Right3 p a u -> match get_parents a with [ Some ifam -> if ifam = i then do { let a = ascend_with_parents a None in gen.g_per.arr.(Adef.int_of_iper ip) := Right3 p a u; ipl } else [ip :: ipl] | None -> [ip :: ipl] ] | _ -> [ip :: ipl] ] else [ip :: ipl]) rl [] in let (relation, marr, marr_place, (marr_src, marr_nt), witnesses) = let (relation, sons) = match find_field "MARR" r.rsons with [ Some r -> if gay then (NoSexesCheckMarried, Some r) else (Married, Some r) | None -> match find_field "ENGA" r.rsons with [ Some r -> (Engaged, Some r) | None -> (relation_status.val, None) ] ] in match sons with [ Some r -> let (u, p) = match find_all_fields "PLAC" r.rsons with [ [r :: rl] -> if String.uncapitalize r.rval = "unmarried" then (NotMarried, "") else let p = strip_spaces r.rval in loop rl where rec loop = fun [ [r :: rl] -> if String.uncapitalize r.rval = "unmarried" then (NotMarried, p) else loop rl | [] -> (relation, p) ] | [] -> (relation, "") ] in let u = match find_field "TYPE" r.rsons with [ Some r -> if String.uncapitalize r.rval = "gay" then NoSexesCheckNotMarried else u | None -> u ] in let d = match find_field "DATE" r.rsons with [ Some r -> date_of_field r.rpos r.rval | _ -> None ] in let rec heredis_witnesses = fun [ [] -> [] | [ r :: asso_l ] -> if find_field_with_value "RELA" "Witness" r.rsons && find_field_with_value "TYPE" "INDI" r.rsons then let witness = per_index gen r.rval in [ witness :: heredis_witnesses asso_l ] else do { r.rused := False; heredis_witnesses asso_l } ] in let witnesses = match find_all_fields "ASSO" r.rsons with [ [] -> [] | wl -> heredis_witnesses wl ] in (u, d, p, source gen r, witnesses) | None -> (relation, None, "", ("", []), []) ] in let witnesses = Array.of_list witnesses in let div = match find_field "DIV" r.rsons with [ Some r -> match find_field "DATE" r.rsons with [ Some d -> Divorced (Adef.codate_of_od (date_of_field d.rpos d.rval)) | _ -> match find_field "PLAC" r.rsons with [ Some _ -> Divorced Adef.codate_None | _ -> if r.rval = "Y" then Divorced Adef.codate_None else NotDivorced ] ] | None -> NotDivorced ] in let comment = match find_all_fields "NOTE" r.rsons with [ [] -> "" | rl -> treat_notes gen rl ] in let (fsources, fsources_nt) = let (s, s_nt) = source gen r in if s = "" then (default_source.val, s_nt) else (s, s_nt) in let concat_text s1 s2 s_sep = let s = if s1 = "" then "" else s_sep in s1 ^ s ^ s2 in let ext_sources = let text = concat_text "" (notes_from_source_record marr_nt) "
\n" in concat_text text (notes_from_source_record fsources_nt) "
\n" in let ext_notes = if untreated_in_notes.val then let remain_tags_in_notes text init rtl = let rtl = build_remain_tags rtl in if rtl = [] then init else concat_text init (html_text_of_tags text rtl) "\n" in let nt = remain_tags_in_notes "FAM" "" r.rsons in let nt = remain_tags_in_notes "MARR SOUR" nt marr_nt in let nt = remain_tags_in_notes "SOUR SOUR" nt fsources_nt in if nt = "" then "" else "
\n" ^ nt ^ "\n
" else "" in let add_in_person_notes iper = match gen.g_per.arr.(Adef.int_of_iper iper) with [ Left3 _ -> () | Right3 p a u -> let notes = gen.g_str.arr.(Adef.int_of_istr (get_notes p)) in let notes = if notes = "" then ext_sources ^ ext_notes else if ext_sources = "" then notes ^ "\n" ^ ext_notes else notes ^ "
\n" ^ ext_sources ^ ext_notes in let new_notes = add_string gen notes in let p = person_of_gen_person {(gen_person_of_person p) with notes = new_notes} in gen.g_per.arr.(Adef.int_of_iper iper) := Right3 p a u ] in let _ = if ext_notes = "" then () else do { add_in_person_notes fath; add_in_person_notes moth; } in let fam = family_of_gen_family {marriage = Adef.codate_of_od marr; marriage_place = add_string gen marr_place; marriage_src = add_string gen marr_src; witnesses = witnesses; relation = relation; divorce = div; comment = add_string gen comment; origin_file = string_empty; fsources = add_string gen fsources; fam_index = i} and cpl = couple_of_gen_couple (couple False fath moth) and des = descend_of_gen_descend {children = Array.of_list children} in gen.g_fam.arr.(Adef.int_of_ifam i) := Right3 fam cpl des } ; value add_fam gen r = let list = Hashtbl.find_all gen.g_adop r.rval in match list with [ [] -> add_fam_norm gen r [] | list -> let husb = find_field "HUSB" r.rsons in let wife = find_field "WIFE" r.rsons in do { List.iter (fun (ip, which_parent) -> set_adop_fam gen ip which_parent husb wife) list; match find_field "CHIL" r.rsons with [ Some _ -> add_fam_norm gen r list | _ -> () ] } ] ; value treat_header2 gen r = match charset_option.val with [ Some v -> charset.val := v | None -> match find_field "CHAR" r.rsons with [ Some r -> match r.rval with [ "ANSEL" -> charset.val := Ansel | "ASCII" | "IBMPC" -> charset.val := Ascii | "MACINTOSH" -> charset.val := MacIntosh | "UTF-8" -> charset.val := Utf8 | _ -> charset.val := Ascii ] | None -> () ] ] ; value treat_header3 gen r = match find_all_fields "NOTE" r.rsons with [ [] -> () | rl -> gen.g_bnot := treat_notes gen rl ] ; value turn_around_genealogos_bug r = if String.length r.rlab > 0 && r.rlab.[0] = '@' then {(r) with rlab = r.rval; rval = r.rlab} else r ; value make_gen2 gen r = let r = turn_around_genealogos_bug r in match r.rlab with [ "HEAD" -> treat_header2 gen r | "INDI" -> add_indi gen r | _ -> () ] ; value make_gen3 gen r = let r = turn_around_genealogos_bug r in match r.rlab with [ "HEAD" -> treat_header3 gen r | "SUBM" -> () | "INDI" -> () | "FAM" -> add_fam gen r | "NOTE" -> () | "SOUR" -> () | "TRLR" -> do { eprintf "*** Trailer ok\n"; flush stderr } | s -> do { fprintf log_oc.val "Not implemented typ = %s\n" s; flush log_oc.val } ] ; value rec sortable_by_date proj = fun [ [] -> True | [e :: el] -> match proj e with [ Some d -> sortable_by_date proj el | None -> False ] ] ; value sort_by_date proj list = if sortable_by_date proj list then List.sort (fun e1 e2 -> match (proj e1, proj e2) with [ (Some d1, Some d2) -> if not (strictly_after d1 d2) then -1 else 1 | _ -> 1 ]) list else list ; value find_lev0 = parser bp [: _ = line_start '0'; _ = skip_space; r1 = get_ident 0; r2 = get_ident 0; _ = skip_to_eoln :] -> (bp, r1, r2) ; value pass1 gen fname = let ic = open_in_bin fname in let strm = Stream.of_channel ic in let rec loop () = match try Some (find_lev0 strm) with [ Stream.Failure -> None ] with [ Some (bp, r1, r2) -> do { match r2 with [ "NOTE" -> Hashtbl.add gen.g_not r1 bp | "SOUR" -> Hashtbl.add gen.g_src r1 bp | _ -> () ]; loop () } | None -> match strm with parser [ [: `_ :] -> do { skip_to_eoln strm; loop () } | [: :] -> () ] ] in do { loop (); close_in ic } ; value pass2 gen fname = let ic = open_in_bin fname in do { line_cnt.val := 0; let strm = Stream.from (fun i -> try let c = input_char ic in do { if c = '\n' then incr line_cnt else (); Some c } with [ End_of_file -> None ]) in let rec loop () = match try Some (get_lev0 strm) with [ Stream.Failure -> None ] with [ Some r -> do { make_gen2 gen r; loop () } | None -> match strm with parser [ [: `'1'..'9' :] -> let _ : string = get_to_eoln 0 strm in loop () | [: `_ :] -> let _ : string = get_to_eoln 0 strm in loop () | [: :] -> () ] ] in loop (); List.iter (fun (ipp, ip) -> match gen.g_per.arr.(Adef.int_of_iper ipp) with [ Right3 p a u -> if List.mem ip (get_related p) then () else let p = person_with_related p [ip :: get_related p] in gen.g_per.arr.(Adef.int_of_iper ipp) := Right3 p a u | _ -> () ]) gen.g_godp; close_in ic } ; value pass3 gen fname = let ic = open_in_bin fname in do { line_cnt.val := 0; let strm = Stream.from (fun i -> try let c = input_char ic in do { if c = '\n' then incr line_cnt else (); Some c } with [ End_of_file -> None ]) in let rec loop () = match try Some (get_lev0 strm) with [ Stream.Failure -> None ] with [ Some r -> do { make_gen3 gen r; loop () } | None -> match strm with parser [ [: `'1'..'9' :] -> let _ : string = get_to_eoln 0 strm in loop () | [: `_ :] -> do { print_location line_cnt.val; fprintf log_oc.val "Strange input.\n"; flush log_oc.val; let _ : string = get_to_eoln 0 strm in loop () } | [: :] -> () ] ] in loop (); List.iter (fun (ifam, ip) -> match gen.g_fam.arr.(Adef.int_of_ifam ifam) with [ Right3 fam cpl des -> match (gen.g_per.arr.(Adef.int_of_iper (get_father cpl)), gen.g_per.arr.(Adef.int_of_iper ip)) with [ (Right3 pfath _ _, Right3 p a u) -> do { if List.mem (get_father cpl) (get_related p) then () else let p = person_with_related p [get_father cpl :: get_related p] in gen.g_per.arr.(Adef.int_of_iper ip) := Right3 p a u; if List.mem ip (Array.to_list (get_witnesses fam)) then () else let fam = family_of_gen_family {(gen_family_of_family fam) with witnesses = Array.append (get_witnesses fam) [| ip |]} in gen.g_fam.arr.(Adef.int_of_ifam ifam) := Right3 fam cpl des } | _ -> () ] | _ -> () ]) gen.g_witn; close_in ic } ; value check_undefined gen = do { for i = 0 to gen.g_per.tlen - 1 do { match gen.g_per.arr.(i) with [ Right3 _ _ _ -> () | Left3 lab -> let (p, a, u) = unknown_per gen i Neuter in do { fprintf log_oc.val "Warning: undefined person %s\n" lab; gen.g_per.arr.(i) := Right3 p a u } ] }; for i = 0 to gen.g_fam.tlen - 1 do { match gen.g_fam.arr.(i) with [ Right3 _ _ _ -> () | Left3 lab -> let (f, c, d) = unknown_fam gen i in do { fprintf log_oc.val "Warning: undefined family %s\n" lab; gen.g_fam.arr.(i) := Right3 f c d } ] } } ; value add_parents_to_isolated gen = let ht_missing_children = Hashtbl.create 1001 in (* Parfois, l'enfant n'a pas de tag FAMC, mais il est bien présent dans la famille. Du coup, si on lui ajoute des parents tout de suite, lors du finish base, on va se rendre compte qu'il est en trop dans sa "vraie" famille et on va le supprimer, alors qu'on veut re-créer la liaison. *) let () = loop 0 where rec loop i = if i = gen.g_fam.tlen then () else match gen.g_fam.arr.(i) with [ Right3 _ _ des -> do { Array.iter (fun ip -> Hashtbl.add ht_missing_children ip True) des.children; loop (i + 1) } | Left3 _ -> loop (i + 1) ] in for i = 0 to gen.g_per.tlen - 1 do { match gen.g_per.arr.(i) with [ Right3 p a u -> if get_parents a = None && Array.length (get_family u) = 0 && get_rparents p = [] && get_related p = [] && not (Hashtbl.mem ht_missing_children (get_key_index p)) then let fn = gen.g_str.arr.(Adef.int_of_istr (get_first_name p)) in let sn = gen.g_str.arr.(Adef.int_of_istr (get_surname p)) in if fn = "?" && sn = "?" then () else do { fprintf log_oc.val "Adding parents to isolated person: %s.%d %s\n" fn (get_occ p) sn; let ifam = phony_fam gen in match gen.g_fam.arr.(Adef.int_of_ifam ifam) with [ Right3 fam cpl des -> do { let des = descend_of_gen_descend {children = [| get_key_index p |]} in gen.g_fam.arr.(Adef.int_of_ifam ifam) := Right3 fam cpl des; let a = ascend_with_parents a (Some ifam) in gen.g_per.arr.(i) := Right3 p a u } | _ -> () ]; } else () | Left3 _ -> () ] } ; value make_arrays in_file = let fname = if Filename.check_suffix in_file ".ged" then in_file else if Filename.check_suffix in_file ".GED" then in_file else in_file ^ ".ged" in let gen = {g_per = {arr = [| |]; tlen = 0}; g_fam = {arr = [| |]; tlen = 0}; g_str = {arr = [| |]; tlen = 0}; g_bnot = ""; g_ic = open_in_bin fname; g_not = Hashtbl.create 3001; g_src = Hashtbl.create 3001; g_hper = Hashtbl.create 3001; g_hfam = Hashtbl.create 3001; g_hstr = Hashtbl.create 3001; g_hnam = Hashtbl.create 3001; g_adop = Hashtbl.create 3001; g_godp = []; g_witn = []} in do { assert (add_string gen "" = string_empty); assert (add_string gen "?" = string_quest); assert (add_string gen "x" = string_x); eprintf "*** pass 1 (note)\n"; flush stderr; pass1 gen fname; eprintf "*** pass 2 (indi)\n"; flush stderr; pass2 gen fname; eprintf "*** pass 3 (fam)\n"; flush stderr; pass3 gen fname; close_in gen.g_ic; check_undefined gen; add_parents_to_isolated gen; (gen.g_per, gen.g_fam, gen.g_str, gen.g_bnot) } ; value make_subarrays (g_per, g_fam, g_str, g_bnot) = let persons = let pa = Array.make g_per.tlen (Obj.magic 0) in let aa = Array.make g_per.tlen (Obj.magic 0) in let ua = Array.make g_per.tlen (Obj.magic 0) in do { for i = 0 to g_per.tlen - 1 do { match g_per.arr.(i) with [ Right3 p a u -> do { pa.(i) := p; aa.(i) := a; ua.(i) := u } | Left3 lab -> failwith ("undefined person " ^ lab) ] }; (pa, aa, ua) } in let families = let fa = Array.make g_fam.tlen (Obj.magic 0) in let ca = Array.make g_fam.tlen (Obj.magic 0) in let da = Array.make g_fam.tlen (Obj.magic 0) in do { for i = 0 to g_fam.tlen - 1 do { match g_fam.arr.(i) with [ Right3 f c d -> do { fa.(i) := f; ca.(i) := c; da.(i) := d } | Left3 lab -> failwith ("undefined family " ^ lab) ] }; (fa, ca, da) } in let strings = Array.sub g_str.arr 0 g_str.tlen in (persons, families, strings, g_bnot) ; value record_access_of tab = {load_array () = (); get i = tab.(i); set i v = tab.(i) := v; output_array oc = output_value_no_sharing oc (tab : array _); len = Array.length tab; clear_array () = ()} ; value make_base (persons, families, strings, bnotes) bdir = let (persons, ascends, unions) = persons in let (families, couples, descends) = families in let bnotes = {nread s _ = if s = "" then bnotes else ""; norigin_file = ""; efiles _ = []} in let base_data = {persons = record_access_of persons; ascends = record_access_of ascends; unions = record_access_of unions; families = record_access_of families; visible = { v_write = fun []; v_get = fun [] }; couples = record_access_of couples; descends = record_access_of descends; strings = record_access_of strings; particles = []; bnotes = bnotes; bdir = bdir} in let base_func = {person_of_key = fun []; persons_of_name = fun []; strings_of_fsname = fun []; persons_of_surname = {find = fun []; cursor = fun []; next = fun []}; persons_of_first_name = {find = fun []; cursor = fun []; next = fun []}; patch_person = fun []; patch_ascend = fun []; patch_union = fun []; patch_family = fun []; patch_couple = fun []; patch_descend = fun []; patch_name = fun []; insert_string = fun []; commit_patches = fun []; commit_notes = fun []; patched_ascends = fun []; is_patched_person _ = False; cleanup () = ()} in {data = base_data; func = base_func} ; value array_memq x a = loop 0 where rec loop i = if i = Array.length a then False else if x = a.(i) then True else loop (i + 1) ; value check_parents_children base ascends unions couples descends = let to_delete = ref [] in let fam_to_delete = ref [] in do { for i = 0 to base.data.persons.len - 1 do { let a = ascends.(i) in match get_parents a with [ Some ifam -> let fam = foi base ifam in if get_fam_index fam = Adef.ifam_of_int (-1) then ascends.(i) := ascend_with_parents a None else let cpl = coi base ifam in let des = doi base ifam in if array_memq (Adef.iper_of_int i) (get_children des) then () else do { let p = poi base (Adef.iper_of_int i) in fprintf log_oc.val "%s is not the child of his/her parents\n" (designation base p); fprintf log_oc.val "- %s\n" (designation base (poi base (get_father cpl))); fprintf log_oc.val "- %s\n" (designation base (poi base (get_mother cpl))); fprintf log_oc.val "=> no more parents for him/her\n"; fprintf log_oc.val "\n"; flush log_oc.val; ascends.(i) := ascend_with_parents a None } | None -> () ]; fam_to_delete.val := []; let u = unions.(i) in for j = 0 to Array.length (get_family u) - 1 do { let cpl = couples.(Adef.int_of_ifam (get_family u).(j)) in if Adef.iper_of_int i <> get_father cpl && Adef.iper_of_int i <> get_mother cpl then do { fprintf log_oc.val "%s is spouse in this family but neither husband nor wife:\n" (designation base (poi base (Adef.iper_of_int i))); fprintf log_oc.val "- %s\n" (designation base (poi base (get_father cpl))); fprintf log_oc.val "- %s\n" (designation base (poi base (get_mother cpl))); let fath = poi base (get_father cpl) in let moth = poi base (get_mother cpl) in let ffn = sou base (get_first_name fath) in let fsn = sou base (get_surname fath) in let mfn = sou base (get_first_name moth) in let msn = sou base (get_surname moth) in if ffn = "?" && fsn = "?" && mfn <> "?" && msn <> "?" then do { fprintf log_oc.val "However, the husband is unknown, I set him as husband\n"; unions.(Adef.int_of_iper (get_father cpl)) := union_of_gen_union {family = [| |]}; let cpl = couple_of_gen_couple (couple False (Adef.iper_of_int i) (get_mother cpl)) in couples.(Adef.int_of_ifam (get_family u).(j)) := cpl; } else if mfn = "?" && msn = "?" && ffn <> "?" && fsn <> "?" then do { fprintf log_oc.val "However, the wife is unknown, I set her as wife\n"; unions.(Adef.int_of_iper (get_mother cpl)) := union_of_gen_union {family = [| |]}; let cpl = couple_of_gen_couple (couple False (get_father cpl) (Adef.iper_of_int i)) in couples.(Adef.int_of_ifam (get_family u).(j)) := cpl; } else do { fprintf log_oc.val "=> deleted this family for him/her\n"; fam_to_delete.val := [j :: fam_to_delete.val]; }; fprintf log_oc.val "\n"; flush log_oc.val } else () }; if fam_to_delete.val <> [] then let (list, _) = List.fold_left (fun (list, i) x -> if List.mem i fam_to_delete.val then (list, i + 1) else ([x :: list], i + 1)) ([], 0) (Array.to_list (get_family u)) in unions.(i) := union_of_gen_union {family = Array.of_list (List.rev list)} else () }; for i = 0 to base.data.families.len - 1 do { to_delete.val := []; let fam = foi base (Adef.ifam_of_int i) in let cpl = coi base (Adef.ifam_of_int i) in let des = descends.(i) in for j = 0 to Array.length (get_children des) - 1 do { let a = ascends.(Adef.int_of_iper (get_children des).(j)) in let p = poi base (get_children des).(j) in match get_parents a with [ Some ifam -> if Adef.int_of_ifam ifam <> i then do { fprintf log_oc.val "Other parents for %s\n" (designation base p); fprintf log_oc.val "- %s\n" (designation base (poi base (get_father cpl))); fprintf log_oc.val "- %s\n" (designation base (poi base (get_mother cpl))); fprintf log_oc.val "=> deleted in this family\n"; fprintf log_oc.val "\n"; flush log_oc.val; to_delete.val := [get_key_index p :: to_delete.val] } else () | None -> do { fprintf log_oc.val "%s has no parents but is the child of\n" (designation base p); fprintf log_oc.val "- %s\n" (designation base (poi base (get_father cpl))); fprintf log_oc.val "- %s\n" (designation base (poi base (get_mother cpl))); fprintf log_oc.val "=> added parents\n"; fprintf log_oc.val "\n"; flush log_oc.val; let a = ascend_with_parents a (Some (get_fam_index fam)) in ascends.(Adef.int_of_iper (get_children des).(j)) := a } ] }; if to_delete.val <> [] then let l = List.fold_right (fun ip l -> if List.mem ip to_delete.val then l else [ip :: l]) (Array.to_list (get_children des)) [] in descends.(i) := descend_of_gen_descend {children = Array.of_list l} else () } } ; value string_of_sex = fun [ Male -> "M" | Female -> "F" | Neuter -> "N" ] ; value check_parents_sex base persons families = for i = 0 to base.data.couples.len - 1 do { let cpl = coi base (Adef.ifam_of_int i) in let fam = families.(i) in let ifath = get_father cpl in let imoth = get_mother cpl in let fath = poi base ifath in let moth = poi base imoth in if get_relation fam = NoSexesCheckNotMarried || get_relation fam = NoSexesCheckMarried then () else if get_sex fath = Female || get_sex moth = Male then do { if get_sex fath = Female then fprintf log_oc.val "Warning - husband with female sex: %s\n" (designation base fath) else (); if get_sex moth = Male then fprintf log_oc.val "Warning - wife with male sex: %s\n" (designation base moth) else (); flush log_oc.val; let fam = family_of_gen_family {(gen_family_of_family fam) with relation = NoSexesCheckNotMarried} in families.(i) := fam; } else do { persons.(Adef.int_of_iper ifath) := person_with_sex fath Male; persons.(Adef.int_of_iper imoth) := person_with_sex moth Female; } } ; value neg_year_dmy = fun [ {day = d; month = m; year = y; prec = OrYear y2} -> {day = d; month = m; year = - abs y; prec = OrYear (- abs y2); delta = 0} | {day = d; month = m; year = y; prec = YearInt y2} -> {day = d; month = m; year = - abs y; prec = YearInt (- abs y2); delta = 0} | {day = d; month = m; year = y; prec = p} -> {day = d; month = m; year = - abs y; prec = p; delta = 0} ] ; value neg_year = fun [ Dgreg d cal -> Dgreg (neg_year_dmy d) cal | x -> x ] ; value neg_year_cdate cd = Adef.cdate_of_date (neg_year (Adef.date_of_cdate cd)) ; value rec negative_date_ancestors base persons families i = do { let p = persons.(i) in let p = person_of_gen_person {(gen_person_of_person p) with birth = match Adef.od_of_codate (get_birth p) with [ Some d1 -> Adef.codate_of_od (Some (neg_year d1)) | _ -> get_birth p ]; death = match get_death p with [ Death dr cd2 -> Death dr (neg_year_cdate cd2) | _ -> get_death p ]} in persons.(i) := p; let u = uoi base (get_key_index p) in for i = 0 to Array.length (get_family u) - 1 do { let j = Adef.int_of_ifam (get_family u).(i) in let fam = families.(j) in match Adef.od_of_codate (get_marriage fam) with [ Some d -> let fam = family_of_gen_family {(gen_family_of_family fam) with marriage = Adef.codate_of_od (Some (neg_year d))} in families.(j) := fam | None -> () ] }; let a = aoi base (get_key_index p) in match get_parents a with [ Some ifam -> let cpl = coi base ifam in do { negative_date_ancestors base persons families (Adef.int_of_iper (get_father cpl)); negative_date_ancestors base persons families (Adef.int_of_iper (get_mother cpl)) } | _ -> () ] }; value negative_dates base persons families = for i = 0 to base.data.persons.len - 1 do { let p = persons.(i) in match (Adef.od_of_codate (get_birth p), date_of_death (get_death p)) with [ (Some (Dgreg d1 _), Some (Dgreg d2 _)) -> if year_of d1 > 0 && year_of d2 > 0 && strictly_before_dmy d2 d1 then negative_date_ancestors base persons families i else () | _ -> () ] } ; value finish_base base (persons, families, _, _) = do { let (persons, ascends, unions) = persons in let (families, couples, descends) = families in for i = 0 to Array.length descends - 1 do { let des = descends.(i) in let children = sort_by_date (fun ip -> Adef.od_of_codate (get_birth persons.(Adef.int_of_iper ip))) (Array.to_list (get_children des)) in descends.(i) := descend_of_gen_descend {children = Array.of_list children} }; for i = 0 to Array.length unions - 1 do { let u = unions.(i) in let family = sort_by_date (fun ifam -> Adef.od_of_codate (get_marriage families.(Adef.int_of_ifam ifam))) (Array.to_list (get_family u)) in unions.(i) := union_of_gen_union {family = Array.of_list family} }; for i = 0 to Array.length persons - 1 do { let p = persons.(i) in let a = ascends.(i) in let u = unions.(i) in if get_parents a <> None && Array.length (get_family u) != 0 || get_notes p <> string_empty then let (fn, occ) = if sou base (get_first_name p) = "?" then (string_x, i) else (get_first_name p, get_occ p) in let (sn, occ) = if sou base (get_surname p) = "?" then (string_x, i) else (get_surname p, occ) in persons.(i) := person_with_key p fn sn occ else () }; check_parents_sex base persons families; check_parents_children base ascends unions couples descends; if try_negative_dates.val then negative_dates base persons families else (); let base = Gwdb.base_of_base1 base in if do_check.val then Check.check_base base (fun x -> do { Check.print_base_error log_oc.val base x; fprintf log_oc.val "\n" }) (fun [ UndefinedSex _ -> () | x -> do { Check.print_base_warning log_oc.val base x; fprintf log_oc.val "\n" } ]) (fun _ -> True) (fun _ -> ()) False else (); flush log_oc.val }; value output_command_line bname = let bdir = if Filename.check_suffix bname ".gwb" then bname else bname ^ ".gwb" in let oc = open_out (Filename.concat bdir "command.txt") in do { fprintf oc "%s" Sys.argv.(0); for i = 1 to Array.length Sys.argv - 1 do { fprintf oc " %s" Sys.argv.(i) }; fprintf oc "\n"; close_out oc } ; value set_undefined_death_interval s = try match Stream.of_string s with parser [ [: a = number 0; `'-'; b = number 0 :] -> do { eprintf "ay %s dy %s\n" a b; flush stderr; let a = if a = "" then alive_years.val else int_of_string a in let b = max a (if b = "" then dead_years.val else int_of_string b) in alive_years.val := a; dead_years.val := b; eprintf "ay %d dy %d\n" a b; flush stderr } ] with [ Stream.Error _ -> raise (Arg.Bad "bad parameter for -udi") | e -> raise e ] ; (* Main *) value out_file = ref "a"; value speclist = [("-o", Arg.String (fun s -> out_file.val := s), "\n Output database (default: \"a\")."); ("-f", Arg.Set force, "\n Remove database if already existing"); ("-log", Arg.String (fun s -> log_oc.val := open_out s), "\n Redirect log trace to this file."); ("-lf", Arg.Set lowercase_first_names, " \ - Lowercase first names - Convert first names to lowercase letters, with initials in uppercase."); ("-ls", Arg.Unit (fun () -> case_surnames.val := LowerCase), " \ - Lowercase surnames - Convert surnames to lowercase letters, with initials in uppercase. Try to keep lowercase particles."); ("-us", Arg.Unit (fun () -> case_surnames.val := UpperCase), " \ - Uppercase surnames - Convert surnames to uppercase letters."); ("-fne", Arg.String (fun s -> if String.length s = 2 then first_names_brackets.val := Some (s.[0], s.[1]) else raise (Arg.Bad "-fne option must be followed by a 2 characters string")), "\ be - First names enclosed - When creating a person, if the GEDCOM first name part holds a part between 'b' (any character) and 'e' (any character), it is considered to be the usual first name: e.g. -fne '\"\"' or -fne \"()\"."); ("-efn", Arg.Set extract_first_names, " \ - Extract first names - When creating a person, if the GEDCOM first name part holds several names, the first of this names becomes the person \"first name\" and the complete GEDCOM first name part a \"first name alias\"."); ("-no_efn", Arg.Clear extract_first_names, " \ - Dont extract first names - [default] Cancels the previous option."); ("-epn", Arg.Set extract_public_names, " \ - Extract public names - [default] When creating a person, if the GEDCOM first name part looks like a public name, i.e. holds: * a number or a roman number, supposed to be a number of a nobility title, * one of the words: \"der\", \"den\", \"die\", \"el\", \"le\", \"la\", \"the\", supposed to be the beginning of a qualifier, then the GEDCOM first name part becomes the person \"public name\" and its first word his \"first name\"."); ("-no_epn", Arg.Clear extract_public_names, "\n Cancels the previous option."); ("-no_pit", Arg.Set no_public_if_titles, " \ - No public if titles - Do not consider persons having titles as public"); ("-tnd", Arg.Set try_negative_dates, " \ - Try negative dates - Set negative dates when inconsistency (e.g. birth after death)"); ("-no_nd", Arg.Set no_negative_dates, " \ - No negative dates - Don't interpret a year preceded by a minus sign as a negative year"); ("-nc", Arg.Clear do_check, "\n No consistency check"); ("-nopicture", Arg.Set no_picture, " \ - Don't extract individual picture."); ("-udi", Arg.String set_undefined_death_interval, "\ x-y - Undefined death interval - Set the interval for persons whose death part is undefined: - if before x years, they are considered as alive - if after y year, they are considered as death - between x and y year, they are considered as \"don't know\" Default x is " ^ string_of_int alive_years.val ^ " and y is " ^ string_of_int dead_years.val); ("-uin", Arg.Set untreated_in_notes, " - Untreated in notes -\n Put untreated GEDCOM tags in notes"); ("-ds", Arg.String (fun s -> default_source.val := s), " \ - Default source - Set the source field for persons and families without source data"); ("-dates_dm", Arg.Unit (fun () -> month_number_dates.val := DayMonthDates), "\n Interpret months-numbered dates as day/month/year"); ("-dates_md", Arg.Unit (fun () -> month_number_dates.val := MonthDayDates), "\n Interpret months-numbered dates as month/day/year"); ("-rs_no_mention", Arg.Unit (fun () -> relation_status.val := NoMention), "\n Force relation status to NoMention (default is Married)"); ("-charset", Arg.String (fun [ "ANSEL" -> charset_option.val := Some Ansel | "ASCII" -> charset_option.val := Some Ascii | "MSDOS" -> charset_option.val := Some Msdos | _ -> raise (Arg.Bad "bad -charset value") ]), "\ [ANSEL|ASCII|MSDOS] - charset decoding - Force given charset decoding, overriding the possible setting in GEDCOM")] ; value anonfun s = if in_file.val = "" then in_file.val := s else raise (Arg.Bad "Cannot treat several GEDCOM files") ; value errmsg = "Usage: ged2gwb [] [options] where options are:"; value main () = do { Argl.parse speclist anonfun errmsg; Secure.set_base_dir (Filename.dirname out_file.val); let bdir = if Filename.check_suffix out_file.val ".gwb" then out_file.val else out_file.val ^ ".gwb" in if not force.val && Sys.file_exists bdir then do { printf "\ The database \"%s\" already exists. Use option -f to overwrite it. " out_file.val; flush stdout; exit 2 } else (); let arrays = make_arrays in_file.val in Gc.compact (); let arrays = make_subarrays arrays in let base = make_base arrays bdir in finish_base base arrays; lock Mutil.lock_file out_file.val with [ Accept -> do { Outbase.output out_file.val base; output_command_line out_file.val } | Refuse -> do { printf "Base is locked: cannot write it\n"; flush stdout; exit 2 } ]; warning_month_number_dates (); if log_oc.val != stdout then close_out log_oc.val else () } ; try main () with e -> let e = match e with [ Ploc.Exc _ e -> e | _ -> e ] in do { fprintf log_oc.val "Uncaught exception: %s\n" (Printexc.to_string e); if log_oc.val != stdout then close_out log_oc.val else (); exit 2 }; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/ged2gwb/ged2gwb2.ml0000660000175200017530000024660612664543647023715 0ustar guillaumeguillaume(* camlp5r pa_extend.cmo ../src/pa_lock.cmo *) (* $Id: ged2gwb2.ml,v 5.7 2008-01-14 03:51:54 ddr Exp $ *) (* Copyright (c) 1998-2008 INRIA *) open Def; open Mutil; open Printf; type person = gen_person iper Adef.istr; type ascend = gen_ascend ifam; type union = gen_union ifam; type family = gen_family iper Adef.istr; type couple = gen_couple iper; type descend = gen_descend iper; value get_first_name p = p.Def.first_name; value get_key_index p = p.Def.key_index; value get_notes p = p.Def.notes; value get_occ p = p.Def.occ; value get_related p = p.Def.related; value get_rparents p = p.Def.rparents; value get_sex p = p.Def.sex; value get_surname p = p.Def.surname; value person_with_related p r = {(p) with related = r}; value person_with_rparents p r = {(p) with rparents = r}; value person_with_sex p s = {(p) with sex = s}; value person_of_gen_person p = p; value gen_person_of_person p = p; value get_parents a = a.Def.parents; value ascend_with_parents a p = {parents = p; consang = a.consang}; value ascend_of_gen_ascend a = a; value get_family u = u.Def.family; value union_of_gen_union u = u; value get_witnesses f = f.Def.witnesses; value family_of_gen_family f = f; value gen_family_of_family f = f; value get_father c = Adef.father c; value couple_of_gen_couple c = c; value descend_of_gen_descend d = d; value couple _ x y = Adef.couple x y; value log_oc = ref stdout; type record = { rlab : string; rval : string; rcont : string; rsons : list record; rpos : int; rused : mutable bool } ; type choice3 'a 'b 'c 'd = [ Left3 of 'a | Right3 of 'b and 'c and 'd ] ; type month_number_dates = [ MonthDayDates | DayMonthDates | NoMonthNumberDates | MonthNumberHappened of string ] ; type charset = [ Ansel | Ascii | Msdos | MacIntosh | Utf8 ] ; type case = [ NoCase | LowerCase | UpperCase ] ; value lowercase_first_names = ref False; value case_surnames = ref NoCase; value extract_first_names = ref False; value extract_public_names = ref True; value charset_option = ref None; value charset = ref Ascii; value alive_years = ref 80; value dead_years = ref 120; value try_negative_dates = ref False; value no_negative_dates = ref False; value month_number_dates = ref NoMonthNumberDates; value no_public_if_titles = ref False; value first_names_brackets = ref None; value untreated_in_notes = ref False; value force = ref False; value default_source = ref ""; value default_name = ref "?"; value relation_status = ref Married; value no_picture = ref False; (* Reading input *) value line_cnt = ref 1; value in_file = ref ""; value print_location pos = fprintf log_oc.val "File \"%s\", line %d:\n" in_file.val pos ; value rec skip_eol = parser [ [: `'\010' | '\013'; _ = skip_eol :] -> () | [: :] -> () ] ; value rec get_to_eoln len = parser [ [: `'\010' | '\013'; _ = skip_eol :] -> Buff.get len | [: `'\t'; s :] -> get_to_eoln (Buff.store len ' ') s | [: `c; s :] -> get_to_eoln (Buff.store len c) s | [: :] -> Buff.get len ] ; value rec skip_to_eoln = parser [ [: `'\010' | '\013'; _ = skip_eol :] -> () | [: `_; s :] -> skip_to_eoln s | [: :] -> () ] ; value eol_chars = ['\010'; '\013']; value rec get_ident len = parser [ [: `' ' | '\t' :] -> Buff.get len | [: `c when not (List.mem c eol_chars); s :] -> get_ident (Buff.store len c) s | [: :] -> Buff.get len ] ; value skip_space = parser [ [: `' ' | '\t' :] -> () | [: :] -> () ] ; value rec line_start num = parser [ [: `' '; s :] -> line_start num s | [: `x when x = num :] -> () ] ; value ascii_of_msdos s = let s' = Bytes.create (String.length s) in do { for i = 0 to String.length s - 1 do { let cc = match Char.code s.[i] with [ 0o200 -> 0o307 | 0o201 -> 0o374 | 0o202 -> 0o351 | 0o203 -> 0o342 | 0o204 -> 0o344 | 0o205 -> 0o340 | 0o206 -> 0o345 | 0o207 -> 0o347 | 0o210 -> 0o352 | 0o211 -> 0o353 | 0o212 -> 0o350 | 0o213 -> 0o357 | 0o214 -> 0o356 | 0o215 -> 0o354 | 0o216 -> 0o304 | 0o217 -> 0o305 | 0o220 -> 0o311 | 0o221 -> 0o346 | 0o222 -> 0o306 | 0o223 -> 0o364 | 0o224 -> 0o366 | 0o225 -> 0o362 | 0o226 -> 0o373 | 0o227 -> 0o371 | 0o230 -> 0o377 | 0o231 -> 0o326 | 0o232 -> 0o334 | 0o233 -> 0o242 | 0o234 -> 0o243 | 0o235 -> 0o245 | 0o240 -> 0o341 | 0o241 -> 0o355 | 0o242 -> 0o363 | 0o243 -> 0o372 | 0o244 -> 0o361 | 0o245 -> 0o321 | 0o246 -> 0o252 | 0o247 -> 0o272 | 0o250 -> 0o277 | 0o252 -> 0o254 | 0o253 -> 0o275 | 0o254 -> 0o274 | 0o255 -> 0o241 | 0o256 -> 0o253 | 0o257 -> 0o273 | 0o346 -> 0o265 | 0o361 -> 0o261 | 0o366 -> 0o367 | 0o370 -> 0o260 | 0o372 -> 0o267 | 0o375 -> 0o262 | c -> c ] in Bytes.set s' i (Char.chr cc) }; s' } ; value ascii_of_macintosh s = let s' = Bytes.create (String.length s) in do { for i = 0 to String.length s - 1 do { let cc = match Char.code s.[i] with [ 0o200 -> 0o304 | 0o201 -> 0o305 | 0o202 -> 0o307 | 0o203 -> 0o311 | 0o204 -> 0o321 | 0o205 -> 0o326 | 0o206 -> 0o334 | 0o207 -> 0o341 | 0o210 -> 0o340 | 0o211 -> 0o342 | 0o212 -> 0o344 | 0o213 -> 0o343 | 0o214 -> 0o345 | 0o215 -> 0o347 | 0o216 -> 0o351 | 0o217 -> 0o350 | 0o220 -> 0o352 | 0o221 -> 0o353 | 0o222 -> 0o355 | 0o223 -> 0o354 | 0o224 -> 0o356 | 0o225 -> 0o357 | 0o226 -> 0o361 | 0o227 -> 0o363 | 0o230 -> 0o362 | 0o231 -> 0o364 | 0o232 -> 0o366 | 0o233 -> 0o365 | 0o234 -> 0o372 | 0o235 -> 0o371 | 0o236 -> 0o373 | 0o237 -> 0o374 | 0o241 -> 0o260 | 0o244 -> 0o247 | 0o245 -> 0o267 | 0o246 -> 0o266 | 0o247 -> 0o337 | 0o250 -> 0o256 | 0o256 -> 0o306 | 0o257 -> 0o330 | 0o264 -> 0o245 | 0o273 -> 0o252 | 0o274 -> 0o272 | 0o276 -> 0o346 | 0o277 -> 0o370 | 0o300 -> 0o277 | 0o301 -> 0o241 | 0o302 -> 0o254 | 0o307 -> 0o253 | 0o310 -> 0o273 | 0o312 -> 0o040 | 0o313 -> 0o300 | 0o314 -> 0o303 | 0o315 -> 0o325 | 0o320 -> 0o255 | 0o326 -> 0o367 | 0o330 -> 0o377 | 0o345 -> 0o302 | 0o346 -> 0o312 | 0o347 -> 0o301 | 0o350 -> 0o313 | 0o351 -> 0o310 | 0o352 -> 0o315 | 0o353 -> 0o316 | 0o354 -> 0o317 | 0o355 -> 0o314 | 0o356 -> 0o323 | 0o357 -> 0o324 | 0o361 -> 0o322 | 0o362 -> 0o332 | 0o363 -> 0o333 | 0o364 -> 0o331 | c -> c ] in Bytes.set s' i (Char.chr cc) }; s' } ; value utf8_of_string s = match charset.val with [ Ansel -> utf_8_of_iso_8859_1 (Ansel.to_iso_8859_1 s) | Ascii -> Mutil.utf_8_of_iso_8859_1 s | Msdos -> Mutil.utf_8_of_iso_8859_1 (ascii_of_msdos s) | MacIntosh -> Mutil.utf_8_of_iso_8859_1 (ascii_of_macintosh s) | Utf8 -> s ] ; value rec get_lev n = parser [: _ = line_start n; _ = skip_space; r1 = get_ident 0; strm :] -> let (rlab, rval, rcont, l) = if String.length r1 > 0 && r1.[0] = '@' then parse_address n r1 strm else parse_text n r1 strm in {rlab = rlab; rval = utf8_of_string rval; rcont = utf8_of_string rcont; rsons = List.rev l; rpos = line_cnt.val; rused = False} and parse_address n r1 = parser [: r2 = get_ident 0; r3 = get_to_eoln 0 ? "get to eoln"; l = get_lev_list [] (Char.chr (Char.code n + 1)) ? "get lev list" :] -> (r2, r1, r3, l) and parse_text n r1 = parser [: r2 = get_to_eoln 0; l = get_lev_list [] (Char.chr (Char.code n + 1)) ? "get lev list" :] -> (r1, r2, "", l) and get_lev_list l n = parser [ [: x = get_lev n; s :] -> get_lev_list [x :: l] n s | [: :] -> l ] ; (* Error *) value bad_dates_warned = ref False; value print_bad_date pos d = if bad_dates_warned.val then () else do { bad_dates_warned.val := True; print_location pos; fprintf log_oc.val "Can't decode date %s\n" d; flush log_oc.val } ; value check_month m = if m < 1 || m > 12 then do { fprintf log_oc.val "Bad (numbered) month in date: %d\n" m; flush log_oc.val } else () ; value warning_month_number_dates () = match month_number_dates.val with [ MonthNumberHappened s -> do { fprintf log_oc.val " Warning: the file holds dates with numbered months (like: 12/05/1912). GEDCOM standard *requires* that months in dates be identifiers. The correct form for this example would be 12 MAY 1912 or 5 DEC 1912. Consider restarting with option \"-dates_dm\" or \"-dates_md\". Use option -help to see what they do. (example found in gedcom: \"%s\") " s; flush log_oc.val } | _ -> () ] ; (* Decoding fields *) value rec skip_spaces = parser [ [: `' '; s :] -> skip_spaces s | [: :] -> () ] ; value rec ident_slash len = parser [ [: `'/' :] -> Buff.get len | [: `'\t'; a = ident_slash (Buff.store len ' ') :] -> a | [: `c; a = ident_slash (Buff.store len c) :] -> a | [: :] -> Buff.get len ] ; value strip c str = let start = loop 0 where rec loop i = if i = String.length str then i else if str.[i] = c then loop (i + 1) else i in let stop = loop (String.length str - 1) where rec loop i = if i = -1 then i + 1 else if str.[i] = c then loop (i - 1) else i + 1 in if start = 0 && stop = String.length str then str else if start >= stop then "" else String.sub str start (stop - start) ; value strip_spaces = strip ' '; value strip_newlines = strip '\n'; value parse_name = parser [: _ = skip_spaces; invert = parser [ [: `'/' :] -> True | [: :] -> False ]; f = ident_slash 0; _ = skip_spaces; s = ident_slash 0 :] -> let (f, s) = if invert then (s, f) else (f, s) in let f = strip_spaces f in let s = strip_spaces s in (if f = "" then "x" else f, if s = "" then "?" else s) ; value rec find_field lab = fun [ [r :: rl] -> if r.rlab = lab then do { r.rused := True; Some r } else find_field lab rl | [] -> None ] ; value rec find_all_fields lab = fun [ [r :: rl] -> if r.rlab = lab then do { r.rused := True; [r :: find_all_fields lab rl] } else find_all_fields lab rl | [] -> [] ] ; value rec find_field_with_value lab v = fun [ [r :: rl] -> if r.rlab = lab && r.rval = v then do { r.rused := True; True } else find_field_with_value lab v rl | [] -> False ] ; value rec lexing_date = parser [ [: `('0'..'9' as c); n = number (Buff.store 0 c) :] -> ("INT", n) | [: `('A'..'Z' as c); i = ident (Buff.store 0 c) :] -> ("ID", i) | [: `'('; len = text 0 :] -> ("TEXT", Buff.get len) | [: `'.' :] -> ("", ".") | [: `' ' | '\t' | '\013'; s :] -> lexing_date s | [: _ = Stream.empty :] -> ("EOI", "") | [: `x :] -> ("", String.make 1 x) ] and number len = parser [ [: `('0'..'9' as c); a = number (Buff.store len c) :] -> a | [: :] -> Buff.get len ] and ident len = parser [ [: `('A'..'Z' as c); a = ident (Buff.store len c) :] -> a | [: :] -> Buff.get len ] and text len = parser [ [: `')' :] -> len | [: `'('; len = text (Buff.store len '('); s :] -> text (Buff.store len ')') s | [: `c; s :] -> text (Buff.store len c) s | [: :] -> len ] ; value make_date_lexing s = Stream.from (fun _ -> Some (lexing_date s)); value tparse = Token.default_match; value using_token (p_con, p_prm) = match p_con with [ "" | "INT" | "ID" | "TEXT" | "EOI" -> () | _ -> raise (Token.Error ("the constructor \"" ^ p_con ^ "\" is not recognized by the lexer")) ] ; value date_lexer = {Token.tok_func s = (make_date_lexing s, fun _ -> Token.dummy_loc); Token.tok_using = using_token; Token.tok_removing _ = (); Token.tok_match = tparse; Token.tok_text _ = ""; Token.tok_comm = None} ; type range 'a = [ Begin of 'a | End of 'a | BeginEnd of 'a and 'a ] ; value date_g = Grammar.gcreate date_lexer; value date_value = Grammar.Entry.create date_g "date value"; value date_interval = Grammar.Entry.create date_g "date interval"; value date_value_recover = Grammar.Entry.create date_g "date value"; value is_roman_int x = try let _ = Mutil.arabian_of_roman x in True with [ Not_found -> False ] ; value start_with_int x = try let s = String.sub x 0 1 in let _ = int_of_string s in True with [ _ -> False ] ; value roman_int = let p = parser [: `("ID", x) when is_roman_int x :] -> Mutil.arabian_of_roman x in Grammar.Entry.of_parser date_g "roman int" p ; value date_str = ref ""; value make_date n1 n2 n3 = let n3 = if no_negative_dates.val then match n3 with [ Some n3 -> Some (abs n3) | None -> None ] else n3 in match (n1, n2, n3) with [ (Some d, Some m, Some y) -> let (d, m) = match m with [ Right m -> (d, m) | Left m -> match month_number_dates.val with [ DayMonthDates -> do { check_month m; (d, m) } | MonthDayDates -> do { check_month d; (m, d) } | _ -> if d >= 1 && m >= 1 && d <= 31 && m <= 31 then if d > 13 && m <= 13 then (d, m) else if m > 13 && d <= 13 then (m, d) else if d > 13 && m > 13 then (0, 0) else do { month_number_dates.val := MonthNumberHappened date_str.val; (0, 0) } else (0, 0) ] ] in let (d, m) = if m < 1 || m > 13 then (0, 0) else (d, m) in {day = d; month = m; year = y; prec = Sure; delta = 0} | (None, Some m, Some y) -> let m = match m with [ Right m -> m | Left m -> m ] in {day = 0; month = m; year = y; prec = Sure; delta = 0} | (None, None, Some y) -> {day = 0; month = 0; year = y; prec = Sure; delta = 0} | (Some y, None, None) -> {day = 0; month = 0; year = y; prec = Sure; delta = 0} | _ -> raise (Stream.Error "bad date") ] ; value recover_date cal = fun [ Dgreg d Dgregorian -> let d = match cal with [ Dgregorian -> d | Djulian -> Calendar.gregorian_of_julian d | Dfrench -> Calendar.gregorian_of_french d | Dhebrew -> Calendar.gregorian_of_hebrew d ] in Dgreg d cal | d -> d ] ; EXTEND GLOBAL: date_value date_interval date_value_recover; date_value: [ [ d = date_or_text; EOI -> d ] ] ; date_value_recover: [ [ "@"; "#"; ID "DGREGORIAN"; "@"; d = date_value -> recover_date Dgregorian d | "@"; "#"; ID "DJULIAN"; "@"; d = date_value -> recover_date Djulian d | "@"; "#"; ID "DFRENCH"; ID "R"; "@"; d = date_value -> recover_date Dfrench d | "@"; "#"; ID "DHEBREW"; "@"; d = date_value -> recover_date Dhebrew d ] ] ; date_interval: [ [ ID "BEF"; dt = date_or_text; EOI -> End dt | ID "AFT"; dt = date_or_text; EOI -> Begin dt | ID "BET"; dt = date_or_text; ID "AND"; dt1 = date_or_text; EOI -> BeginEnd dt dt1 | ID "TO"; dt = date_or_text; EOI -> End dt | ID "FROM"; dt = date_or_text; EOI -> Begin dt | ID "FROM"; dt = date_or_text; ID "TO"; dt1 = date_or_text; EOI -> BeginEnd dt dt1 | dt = date_or_text; EOI -> Begin dt ] ] ; date_or_text: [ [ dr = date_range -> match dr with [ Begin (d, cal) -> Dgreg {(d) with prec = After} cal | End (d, cal) -> Dgreg {(d) with prec = Before} cal | BeginEnd (d1, cal1) (d2, cal2) -> let y2 = match cal2 with [ Dgregorian -> d2.year | Djulian -> (Calendar.julian_of_gregorian d2).year | Dfrench -> (Calendar.french_of_gregorian d2).year | Dhebrew -> (Calendar.hebrew_of_gregorian d2).year ] in Dgreg {(d1) with prec = YearInt y2} cal1 ] | (d, cal) = date -> Dgreg d cal | s = TEXT -> Dtext s ] ] ; date_range: [ [ ID "BEF"; dt = date -> End dt | ID "AFT"; dt = date -> Begin dt | ID "BET"; dt = date; ID "AND"; dt1 = date -> BeginEnd dt dt1 | ID "TO"; dt = date -> End dt | ID "FROM"; dt = date -> Begin dt | ID "FROM"; dt = date; ID "TO"; dt1 = date -> BeginEnd dt dt1 ] ] ; date: [ [ ID "ABT"; (d, cal) = date_calendar -> ({(d) with prec = About}, cal) | ID "ENV"; (d, cal) = date_calendar -> ({(d) with prec = About}, cal) | ID "EST"; (d, cal) = date_calendar -> ({(d) with prec = Maybe}, cal) | ID "AFT"; (d, cal) = date_calendar -> ({(d) with prec = Before}, cal) | ID "BEF"; (d, cal) = date_calendar -> ({(d) with prec = After}, cal) | (d, cal) = date_calendar -> (d, cal) ] ] ; date_calendar: [ [ "@"; "#"; ID "DGREGORIAN"; "@"; d = date_greg -> (d, Dgregorian) | "@"; "#"; ID "DJULIAN"; "@"; d = date_greg -> (Calendar.gregorian_of_julian d, Djulian) | "@"; "#"; ID "DFRENCH"; ID "R"; "@"; d = date_fren -> (Calendar.gregorian_of_french d, Dfrench) | "@"; "#"; ID "DHEBREW"; "@"; d = date_hebr -> (Calendar.gregorian_of_hebrew d, Dhebrew) | d = date_greg -> (d, Dgregorian) ] ] ; date_greg: [ [ LIST0 "."; n1 = OPT int; LIST0 [ "." | "/" ]; n2 = OPT gen_month; LIST0 [ "." | "/" ]; n3 = OPT int; LIST0 "." -> make_date n1 n2 n3 ] ] ; date_fren: [ [ LIST0 "."; n1 = int; (n2, n3) = date_fren_kont -> make_date (Some n1) n2 n3 | LIST0 "."; n1 = year_fren -> make_date (Some n1) None None | LIST0 "."; (n2, n3) = date_fren_kont -> make_date None n2 n3 ] ] ; date_fren_kont: [ [ LIST0 [ "." | "/" ]; n2 = OPT gen_french; LIST0 [ "." | "/" ]; n3 = OPT year_fren; LIST0 "." -> (n2, n3) ] ] ; date_hebr: [ [ LIST0 "."; n1 = OPT int; LIST0 [ "." | "/" ]; n2 = OPT gen_hebr; LIST0 [ "." | "/" ]; n3 = OPT int; LIST0 "." -> make_date n1 n2 n3 ] ] ; gen_month: [ [ i = int -> Left (abs i) | m = month -> Right m ] ] ; month: [ [ ID "JAN" -> 1 | ID "FEB" -> 2 | ID "MAR" -> 3 | ID "APR" -> 4 | ID "MAY" -> 5 | ID "JUN" -> 6 | ID "JUL" -> 7 | ID "AUG" -> 8 | ID "SEP" -> 9 | ID "OCT" -> 10 | ID "NOV" -> 11 | ID "DEC" -> 12 ] ] ; gen_french: [ [ m = french -> Right m ] ] ; french: [ [ ID "VEND" -> 1 | ID "BRUM" -> 2 | ID "FRIM" -> 3 | ID "NIVO" -> 4 | ID "PLUV" -> 5 | ID "VENT" -> 6 | ID "GERM" -> 7 | ID "FLOR" -> 8 | ID "PRAI" -> 9 | ID "MESS" -> 10 | ID "THER" -> 11 | ID "FRUC" -> 12 | ID "COMP" -> 13 ] ] ; year_fren: [ [ i = int -> i | ID "AN"; i = roman_int -> i | i = roman_int -> i ] ] ; gen_hebr: [ [ m = hebr -> Right m ] ] ; hebr: [ [ ID "TSH" -> 1 | ID "CSH" -> 2 | ID "KSL" -> 3 | ID "TVT" -> 4 | ID "SHV" -> 5 | ID "ADR" -> 6 | ID "ADS" -> 7 | ID "NSN" -> 8 | ID "IYR" -> 9 | ID "SVN" -> 10 | ID "TMZ" -> 11 | ID "AAV" -> 12 | ID "ELL" -> 13 ] ] ; int: [ [ i = INT -> try int_of_string i with [ Failure _ -> raise Stream.Failure ] | "-"; i = INT -> try (- int_of_string i) with [ Failure _ -> raise Stream.Failure ] ] ] ; END; value date_of_field pos d = if d = "" then None else do { let s = Stream.of_string (String.uppercase d) in date_str.val := d; try Some (Grammar.Entry.parse date_value s) with [ Ploc.Exc loc (Stream.Error _) -> let s = Stream.of_string (String.uppercase d) in try Some (Grammar.Entry.parse date_value_recover s) with [ Ploc.Exc loc (Stream.Error _) -> Some (Dtext d) ] ] } ; (* Creating base *) type tab 'a = { arr : mutable array 'a; tlen : mutable int }; type gen = { g_per : tab (choice3 string person ascend union); g_fam : tab (choice3 string family couple descend); g_str : tab string; g_bnot : mutable string; g_ic : in_channel; g_not : Hashtbl.t string int; g_src : Hashtbl.t string int; g_hper : Hashtbl.t string Adef.iper; g_hfam : Hashtbl.t string Adef.ifam; g_hstr : Hashtbl.t string Adef.istr; g_hnam : Hashtbl.t string (ref int); g_adop : Hashtbl.t string (Adef.iper * string); g_godp : mutable list (Adef.iper * Adef.iper); g_witn : mutable list (Adef.ifam * Adef.iper) } ; value assume_tab name tab none = if tab.tlen = Array.length tab.arr then do { let new_len = 2 * Array.length tab.arr + 1 in let new_arr = Array.make new_len none in Array.blit tab.arr 0 new_arr 0 (Array.length tab.arr); tab.arr := new_arr } else () ; value add_string gen s = try Hashtbl.find gen.g_hstr s with [ Not_found -> let i = gen.g_str.tlen in do { assume_tab "gen.g_str" gen.g_str ""; gen.g_str.arr.(i) := s; gen.g_str.tlen := gen.g_str.tlen + 1; Hashtbl.add gen.g_hstr s (Adef.istr_of_int i); Adef.istr_of_int i } ] ; value extract_addr addr = if String.length addr > 0 && addr.[0] = '@' then try let r = String.index_from addr 1 '@' in String.sub addr 0 (r + 1) with [ Not_found -> addr ] else addr ; value per_index gen lab = let lab = extract_addr lab in try Hashtbl.find gen.g_hper lab with [ Not_found -> let i = gen.g_per.tlen in do { assume_tab "gen.g_per" gen.g_per (Left3 ""); gen.g_per.arr.(i) := Left3 lab; gen.g_per.tlen := gen.g_per.tlen + 1; Hashtbl.add gen.g_hper lab (Adef.iper_of_int i); Adef.iper_of_int i } ] ; value fam_index gen lab = let lab = extract_addr lab in try Hashtbl.find gen.g_hfam lab with [ Not_found -> let i = gen.g_fam.tlen in do { assume_tab "gen.g_fam" gen.g_fam (Left3 ""); gen.g_fam.arr.(i) := Left3 lab; gen.g_fam.tlen := gen.g_fam.tlen + 1; Hashtbl.add gen.g_hfam lab (Adef.ifam_of_int i); Adef.ifam_of_int i } ] ; value string_empty = Adef.istr_of_int 0; value string_quest = Adef.istr_of_int 1; value string_x = Adef.istr_of_int 2; value unknown_per gen i sex = let empty = string_empty in let what = string_quest in let p = person_of_gen_person {first_name = what; surname = what; occ = i; public_name = empty; image = empty; qualifiers = []; aliases = []; first_names_aliases = []; surnames_aliases = []; titles = []; rparents = []; related = []; occupation = empty; sex = sex; access = IfTitles; birth = Adef.codate_None; birth_place = empty; birth_src = empty; baptism = Adef.codate_None; baptism_place = empty; baptism_src = empty; death = DontKnowIfDead; death_place = empty; death_src = empty; burial = UnknownBurial; burial_place = empty; burial_src = empty; notes = empty; psources = empty; key_index = Adef.iper_of_int i} and a = ascend_of_gen_ascend {parents = None; consang = Adef.fix (-1)} and u = union_of_gen_union {family = [| |]} in (p, a, u) ; value phony_per gen sex = let i = gen.g_per.tlen in let (person, ascend, union) = unknown_per gen i sex in do { assume_tab "gen.g_per" gen.g_per (Left3 ""); gen.g_per.tlen := gen.g_per.tlen + 1; gen.g_per.arr.(i) := Right3 person ascend union; Adef.iper_of_int i } ; value unknown_fam gen i = let empty = string_empty in let father = phony_per gen Male in let mother = phony_per gen Female in let f = family_of_gen_family {marriage = Adef.codate_None; marriage_place = empty; marriage_src = empty; witnesses = [| |]; relation = relation_status.val; divorce = NotDivorced; comment = empty; origin_file = empty; fsources = empty; fam_index = Adef.ifam_of_int i} and c = couple_of_gen_couple (couple False father mother) and d = descend_of_gen_descend {children = [| |]} in (f, c, d) ; value phony_fam gen = let i = gen.g_fam.tlen in let (fam, cpl, des) = unknown_fam gen i in do { assume_tab "gen.g_fam" gen.g_fam (Left3 ""); gen.g_fam.tlen := gen.g_fam.tlen + 1; gen.g_fam.arr.(i) := Right3 fam cpl des; Adef.ifam_of_int i } ; value this_year = let tm = Unix.localtime (Unix.time ()) in tm.Unix.tm_year + 1900 ; value infer_death birth bapt = match (birth, bapt) with [ (Some (Dgreg d _), _) -> let a = this_year - d.year in if a > dead_years.val then DeadDontKnowWhen else if a <= alive_years.val then NotDead else DontKnowIfDead | (_, Some (Dgreg d _)) -> let a = this_year - d.year in if a > dead_years.val then DeadDontKnowWhen else if a <= alive_years.val then NotDead else DontKnowIfDead | _ -> DontKnowIfDead ] ; (* Fonctions utiles pour la mise en forme des noms. *) (* Hashtbl (utf8.ml) qui font la correspondance entre : *) (* - l'encoding -> le nom *) (* - le nom -> l'encoding *) value (ht_e_n, ht_n_e) = do { let ht_e_n = Hashtbl.create 5003 in let ht_n_e = Hashtbl.create 5003 in List.iter (fun (encoding, name) -> do { Hashtbl.add ht_n_e name encoding; Hashtbl.add ht_e_n encoding name; }) Utf8.utf8_list; (ht_e_n, ht_n_e) }; value string_ini_eq s1 i s2 = loop i 0 where rec loop i j = if j = String.length s2 then True else if i = String.length s1 then False else if s1.[i] = s2.[j] then loop (i + 1) (j + 1) else False ; value particle s i = let particles = ["af "; "d'"; "d’"; "dal "; "de "; "des "; "di "; "du "; "of "; "van "; "von und zu "; "von "; "y "; "zu "; "zur "; "AF "; "D'"; "D’"; "DAL "; "DE "; "DES "; "DI "; "DU "; "OF "; "VAN "; "VON UND ZU "; "VON "; "Y "; "ZU "; "ZUR "] in List.exists (string_ini_eq s i) particles ; value look_like_a_number s = loop 0 where rec loop i = if i = String.length s then True else match s.[i] with [ '0'..'9' -> loop (i + 1) | _ -> False ] ; value is_a_name_char = fun [ 'A'..'Z' | 'a'..'z' | '0'..'9' | '-' | ''' -> True | c -> Char.code c > 127 ] ; value rec next_word_pos s i = if i = String.length s then i else if is_a_name_char s.[i] then i else next_word_pos s (i + 1) ; value rec next_sep_pos s i = if i = String.length s then String.length s else if is_a_name_char s.[i] then next_sep_pos s (i + 1) else i ; value public_name_word = ["Ier"; "Ière"; "der"; "den"; "die"; "el"; "le"; "la"; "the"] ; value rec is_a_public_name s i = let i = next_word_pos s i in if i = String.length s then False else let j = next_sep_pos s i in if j > i then let w = String.sub s i (j - i) in if look_like_a_number w then True else if is_roman_int w then True else if List.mem w public_name_word then True else is_a_public_name s j else False ; value gen_lowercase_uppercase_utf8_letter lower s = (* liste des code hexa correspondant à l'encodage du caractère e. *) let list_of_encodings e = let rec loop len e l = if e = "" then l else let i = String.index e '/' in let j = try String.index_from e (i+1) '/' with [ Not_found -> String.length e ] in let k = "0" ^ String.sub e (i+1) (j-1) in loop (len+1) (String.sub e j (String.length e - j)) [int_of_string k :: l] in let l = loop 0 e [] in List.rev l in (* l'encodage du caractère s. *) let encoding = loop 0 s "" where rec loop i s e = if i = String.length s then e else let e = e ^ Printf.sprintf "/x%x" (Char.code s.[i]) in loop (i + 1) s e in try let name = Hashtbl.find ht_e_n encoding in let name = if lower then Str.replace_first (Str.regexp "CAPITAL") "SMALL" name else Str.replace_first (Str.regexp "SMALL") "CAPITAL" name in let new_encoding = Hashtbl.find ht_n_e name in let (el, len) = let l = list_of_encodings new_encoding in (l, List.length l) in let s = Bytes.create len in loop 0 el s where rec loop i el s = match el with [ [] -> s | [e :: ell] -> let _s = Bytes.set s i (Char.chr e) in loop (i + 1) ell s ] with [ Not_found -> s ] ; value lowercase_utf8_letter = gen_lowercase_uppercase_utf8_letter True; value uppercase_utf8_letter = gen_lowercase_uppercase_utf8_letter False; value capitalize_word s = let s = Bytes.copy s in copy False 0 0 (particle s 0) where rec copy special i len uncap = if i = String.length s then Buff.get len else match s.[i] with [ 'a'..'z' as c -> let c = if uncap then c else Char.chr (Char.code c - Char.code 'a' + Char.code 'A') in copy False (i + 1) (Buff.store len c) True | 'A'..'Z' as c -> let c = if not uncap then c else Char.chr (Char.code c - Char.code 'A' + Char.code 'a') in copy False (i + 1) (Buff.store len c) True | c -> if Char.code c < 128 then copy False (i + 1) (Buff.store len c) (particle s (i+1)) else let nbc = Name.nbc s.[i] in if nbc = 1 || nbc < 0 || i + nbc > String.length s then copy False (i + 1) (Buff.store len s.[i]) True else let s = String.sub s i nbc in let s = if not uncap then uppercase_utf8_letter s else lowercase_utf8_letter s in let (t, j) = (s, i + nbc) in copy False j (Buff.mstore len t) True ] ; value uppercase_word s = let s = Bytes.copy s in copy False 0 0 (particle s 0) where rec copy special i len uncap = if i = String.length s then Buff.get len else match s.[i] with [ 'a'..'z' as c -> let c = if uncap then c else Char.chr (Char.code c - Char.code 'a' + Char.code 'A') in copy False (i + 1) (Buff.store len c) uncap | 'A'..'Z' as c -> let c = if not uncap then c else Char.chr (Char.code c - Char.code 'A' + Char.code 'a') in copy False (i + 1) (Buff.store len c) uncap | c -> if Char.code c < 128 then copy False (i + 1) (Buff.store len c) (particle s (i+1)) else let nbc = Name.nbc s.[i] in if nbc = 1 || nbc < 0 || i + nbc > String.length s then copy False (i + 1) (Buff.store len s.[i]) False else let s = String.sub s i nbc in let s = if uncap then s else uppercase_utf8_letter s in let (t, j) = (s, i + nbc) in copy False j (Buff.mstore len t) False ] ; module Buff2 = Buff.Make (struct value buff = ref (Bytes.create 80); end); value capitalize_name s = (* On initialise le buffer à la valeur de s. *) let _ = Buff2.mstore 0 s in loop 0 0 where rec loop len k = let i = next_word_pos s k in if i = String.length s then Buff2.get (String.length s) else let j = next_sep_pos s i in if j > i then let w = String.sub s i (j - i) in let w = if is_roman_int w || particle s i || List.mem w public_name_word || start_with_int w then w else capitalize_word w in let len = loop len k where rec loop len k = if k = i then len else loop (Buff2.store len s.[k]) (k + 1) in loop (Buff2.mstore len w) j else Buff2.get len ; value uppercase_name s = (* On initialise le buffer à la valeur de s. *) let _ = Buff2.mstore 0 s in loop 0 0 where rec loop len k = let i = next_word_pos s k in if i = String.length s then Buff2.get (String.length s) else let j = next_sep_pos s i in if j > i then let w = String.sub s i (j - i) in let w = if is_roman_int w || particle s i || List.mem w public_name_word || start_with_int w then w else uppercase_word w in let len = loop len k where rec loop len k = if k = i then len else loop (Buff2.store len s.[k]) (k + 1) in loop (Buff2.mstore len w) j else Buff2.get len ; value get_lev0 = parser [: _ = line_start '0'; _ = skip_space; r1 = get_ident 0; r2 = get_ident 0; r3 = get_to_eoln 0 ? "get to eoln"; l = get_lev_list [] '1' ? "get lev list" :] -> let (rlab, rval) = if r2 = "" then (r1, "") else (r2, r1) in let rval = utf8_of_string rval in let rcont = utf8_of_string r3 in {rlab = rlab; rval = rval; rcont = rcont; rsons = List.rev l; rpos = line_cnt.val; rused = False} ; value find_notes_record gen addr = match try Some (Hashtbl.find gen.g_not addr) with [ Not_found -> None ] with [ Some i -> do { seek_in gen.g_ic i; try Some (get_lev0 (Stream.of_channel gen.g_ic)) with [ Stream.Failure | Stream.Error _ -> None ] } | None -> None ] ; value find_sources_record gen addr = match try Some (Hashtbl.find gen.g_src addr) with [ Not_found -> None ] with [ Some i -> do { seek_in gen.g_ic i; try Some (get_lev '0' (Stream.of_channel gen.g_ic)) with [ Stream.Failure | Stream.Error _ -> None ] } | None -> None ] ; value rec flatten_notes = fun [ [r :: rl] -> let n = flatten_notes rl in match r.rlab with [ "CONC" | "CONT" | "NOTE" -> [(r.rlab, r.rval) :: flatten_notes r.rsons @ n] | _ -> n ] | [] -> [] ] ; value extract_notes gen rl = List.fold_right (fun r lines -> List.fold_right (fun r lines -> do { r.rused := True; if r.rlab = "NOTE" && r.rval <> "" && r.rval.[0] = '@' then let addr = extract_addr r.rval in match find_notes_record gen addr with [ Some r -> let l = flatten_notes r.rsons in [("NOTE", r.rcont) :: l @ lines] | None -> do { print_location r.rpos; fprintf log_oc.val "Note %s not found\n" addr; flush log_oc.val; lines } ] else [(r.rlab, r.rval) :: lines] }) [r :: r.rsons] lines) rl [] ; value rebuild_text r = let s = strip_spaces r.rval in List.fold_left (fun s e -> let _ = do { e.rused := True } in let n = e.rval in let end_spc = if String.length n > 1 && n.[String.length n - 1] = ' ' then " " else "" in let n = strip_spaces n in match e.rlab with [ "CONC" -> s ^ n ^ end_spc | "CONT" -> s ^ "
\n" ^ n ^ end_spc | _ -> s ]) s r.rsons ; value notes_from_source_record rl = let title = match find_field "TITL" rl with [ Some l -> let s = rebuild_text l in if s = "" then "" else "" ^ s ^"" | None -> "" ] in let text = match find_field "TEXT" rl with [ Some l -> let s = rebuild_text l in if title = "" then s else "
\n" ^ s | None -> "" ] in title ^ text ; value treat_notes gen rl = let lines = extract_notes gen rl in let notes = List.fold_left (fun s (lab, n) -> let spc = String.length n > 0 && n.[0] = ' ' in let end_spc = String.length n > 1 && n.[String.length n - 1] = ' ' in let n = strip_spaces n in if s = "" then n ^ (if end_spc then " " else "") else if lab = "CONT" || lab = "NOTE" then s ^ "
\n" ^ n ^ (if end_spc then " " else "") else if n = "" then s else s ^ (if spc then "\n" else "") ^ n ^ (if end_spc then " " else "")) "" lines in strip_newlines notes ; value source gen r = match find_field "SOUR" r.rsons with [ Some r -> if String.length r.rval > 0 && r.rval.[0] = '@' then match find_sources_record gen r.rval with [ Some v -> (strip_spaces v.rcont, v.rsons) | None -> do { print_location r.rpos; fprintf log_oc.val "Source %s not found\n" r.rval; flush log_oc.val; ("", []) } ] else (strip_spaces r.rval, r.rsons) | _ -> ("", []) ] ; value p_index_from s i c = if i >= String.length s then String.length s else try String.index_from s i c with [ Not_found -> String.length s ] ; value strip_sub s beg len = strip_spaces (String.sub s beg len); value decode_title s = let i1 = p_index_from s 0 ',' in let i2 = p_index_from s (i1 + 1) ',' in let title = strip_sub s 0 i1 in let (place, nth) = if i1 = String.length s then ("", 0) else if i2 = String.length s then let s1 = strip_sub s (i1 + 1) (i2 - i1 - 1) in try ("", int_of_string s1) with [ Failure _ -> (s1, 0) ] else let s1 = strip_sub s (i1 + 1) (i2 - i1 - 1) in let s2 = strip_sub s (i2 + 1) (String.length s - i2 - 1) in try (s1, int_of_string s2) with [ Failure _ -> (strip_sub s i1 (String.length s - i1), 0) ] in (title, place, nth) ; value list_of_string s = loop 0 0 [] where rec loop i len list = if i = String.length s then List.rev [Buff.get len :: list] else match s.[i] with [ ',' -> loop (i + 1) 0 [Buff.get len :: list] | c -> loop (i + 1) (Buff.store len c) list ] ; value purge_list list = List.fold_right (fun s list -> match strip_spaces s with [ "" -> list | s -> [s :: list] ]) list [] ; value decode_date_interval pos s = let strm = Stream.of_string s in try match Grammar.Entry.parse date_interval strm with [ BeginEnd d1 d2 -> (Some d1, Some d2) | Begin d -> (Some d, None) | End d -> (None, Some d) ] with [ Ploc.Exc _ _ | Not_found -> do { print_bad_date pos s; (None, None) } ] ; value treat_indi_title gen public_name r = let (title, place, nth) = decode_title r.rval in let (date_start, date_end) = match find_field "DATE" r.rsons with [ Some r -> decode_date_interval r.rpos r.rval | None -> (None, None) ] in let (name, title, place) = match find_field "NOTE" r.rsons with [ Some r -> if title = "" then (Tnone, strip_spaces r.rval, "") else if r.rval = public_name then (Tmain, title, place) else (Tname (add_string gen (strip_spaces r.rval)), title, place) | None -> (Tnone, title, place) ] in {t_name = name; t_ident = add_string gen title; t_place = add_string gen place; t_date_start = Adef.codate_of_od date_start; t_date_end = Adef.codate_of_od date_end; t_nth = nth} ; value forward_adop gen ip lab which_parent = let which_parent = match which_parent with [ Some r -> r.rval | _ -> "" ] in let which_parent = if which_parent = "" then "BOTH" else which_parent in Hashtbl.add gen.g_adop lab (ip, which_parent) ; value adop_parent gen ip r = let i = per_index gen r.rval in match gen.g_per.arr.(Adef.int_of_iper i) with [ Left3 _ -> None | Right3 p a u -> do { if List.mem ip (get_related p) then () else let p = person_with_related p [ip :: get_related p] in gen.g_per.arr.(Adef.int_of_iper i) := Right3 p a u; Some (get_key_index p) } ] ; value set_adop_fam gen ip which_parent fath moth = match gen.g_per.arr.(Adef.int_of_iper ip) with [ Left3 _ -> () | Right3 per asc uni -> let r_fath = match (which_parent, fath) with [ ("HUSB" | "BOTH", Some r) -> adop_parent gen ip r | _ -> None ] in let r_moth = match (which_parent, moth) with [ ("WIFE" | "BOTH", Some r) -> adop_parent gen ip r | _ -> None ] in let r = {r_type = Adoption; r_fath = r_fath; r_moth = r_moth; r_sources = string_empty} in let per = person_with_rparents per [r :: get_rparents per] in gen.g_per.arr.(Adef.int_of_iper ip) := Right3 per asc uni ] ; value forward_godp gen ip rval = let ipp = per_index gen rval in do { gen.g_godp := [(ipp, ip) :: gen.g_godp]; ipp } ; value forward_witn gen ip rval = let ifam = fam_index gen rval in do { gen.g_witn := [(ifam, ip) :: gen.g_witn]; ifam } ; value html_text_of_tags text rl = let rec tot len lev r = let len = Buff.mstore len (string_of_int lev) in let len = Buff.store len ' ' in let len = Buff.mstore len r.rlab in let len = if r.rval = "" then len else Buff.mstore (Buff.store len ' ') r.rval in let len = if r.rcont = "" then len else Buff.mstore (Buff.store len ' ') r.rcont in totl len (lev + 1) r.rsons and totl len lev rl = List.fold_left (fun len r -> let len = Buff.store len '\n' in tot len lev r) len rl in let title = if text = "" then "-- GEDCOM --" else "-- GEDCOM (" ^ text ^ ") --" in let len = 0 in let len = Buff.mstore len title in let len = totl len 1 rl in Buff.get len ; value rec find_all_rela nl = fun [ [] -> [] | [r :: rl] -> match find_field "RELA" r.rsons with [ Some r1 -> loop nl where rec loop = fun [ [n :: nl1] -> let len = String.length n in if String.length r1.rval >= len && String.lowercase (String.sub r1.rval 0 len) = n then [(n, r.rval) :: find_all_rela nl rl] else loop nl1 | [] -> find_all_rela nl rl ] | None -> find_all_rela nl rl ] ] ; value rec build_remain_tags = fun [ [] -> [] | [r :: rest] -> let rsons = build_remain_tags r.rsons in let rest = build_remain_tags rest in if r.rused = True && rsons = [] then rest else [{rlab = r.rlab; rval = r.rval; rcont = r.rcont; rsons = rsons; rpos = r.rpos; rused = r.rused} :: rest] ] ; value applycase_surname s = match case_surnames.val with [ NoCase -> s | LowerCase -> capitalize_name s | UpperCase -> if charset.val = Utf8 then uppercase_name s else String.uppercase s ] ; value add_indi gen r = let ip = per_index gen r.rval in let name_sons = find_field "NAME" r.rsons in let givn = match name_sons with [ Some n -> match find_field "GIVN" n.rsons with [ Some r -> r.rval | None -> "" ] | None -> "" ] in let (first_name, surname, occ, public_name, first_names_aliases) = match name_sons with [ Some n -> let (f, s) = parse_name (Stream.of_string n.rval) in let pn = "" in let fal = if givn = f then [] else [givn] in let (f, fal) = match first_names_brackets.val with (* [ Some (' ', eb) -> let first_enclosed f = let j = String.index f eb in let i = try String.rindex_from f (j - 1) ' ' with [ Not_found -> -1 ] in let fn = String.sub f (i + 1) (j - i - 1) in let fa = String.sub f 0 j ^ fn ^ String.sub f (j + 1) (String.length f - j - 1) in (fn, fa) in loop True f "" where rec loop first ff accu = try let (fn, fa) = first_enclosed ff in let accu = if first then fn else if fn <> "" then accu ^ " " ^ fn else accu in loop False fa accu with [ Not_found -> if f = ff then (f, fal) else (accu, [ff :: fal]) ] *) [ Some (bb, eb) -> let first_enclosed f = let i = String.index f bb in let j = if i + 2 >= String.length f then raise Not_found else String.index_from f (i + 2) eb in let fn = String.sub f (i + 1) (j - i - 1) in let fa = String.sub f 0 i ^ fn ^ String.sub f (j + 1) (String.length f - j - 1) in (fn, fa) in loop True f "" where rec loop first ff accu = try let (fn, fa) = first_enclosed ff in let accu = if first then fn else if fn <> "" then accu ^ " " ^ fn else accu in loop False fa accu with [ Not_found -> if f = ff then (f, fal) else (accu, [ff :: fal]) ] | None -> (f, fal) ] in let (f, pn, fal) = if extract_public_names.val || extract_first_names.val then let i = next_word_pos f 0 in let j = next_sep_pos f i in if j = String.length f then (f, pn, fal) else let fn = String.sub f i (j - i) in if pn = "" && extract_public_names.val then if is_a_public_name f j then (fn, f, fal) else if extract_first_names.val then (fn, "", [f :: fal]) else (f, "", fal) else (fn, pn, [f :: fal]) else (f, pn, fal) in let f = if lowercase_first_names.val then capitalize_name f else f in let fal = if lowercase_first_names.val then List.map capitalize_name fal else fal in let pn = if capitalize_name pn = f then "" else pn in let pn = if lowercase_first_names.val then capitalize_name pn else pn in let fal = List.fold_right (fun fa fal -> if fa = pn then fal else [fa :: fal]) fal [] in let s = applycase_surname s in let r = let key = Name.strip_lower (nominative f ^ " " ^ nominative s) in try Hashtbl.find gen.g_hnam key with [ Not_found -> let r = ref (-1) in do { Hashtbl.add gen.g_hnam key r; r } ] in do { incr r; (f, s, r.val, pn, fal) } | None -> ("?", "?", Adef.int_of_iper ip, givn, []) ] in (* S'il y a des caractères interdits, on les supprime *) let (first_name, surname) = (Name.strip_c first_name ':', Name.strip_c surname ':') in (* Si le prénom ou le nom est vide *) let (first_name, surname) = (if first_name = "" then default_name.val else first_name, if surname = "" then default_name.val else surname) in let qualifier = match name_sons with [ Some n -> match find_field "NICK" n.rsons with [ Some r -> r.rval | None -> "" ] | None -> "" ] in let surname_aliases = match name_sons with [ Some n -> match find_field "SURN" n.rsons with [ Some r -> let list = purge_list (list_of_string r.rval) in List.fold_right (fun x list -> let x = applycase_surname x in if x <> surname then [x :: list] else list) list [] | _ -> [] ] | None -> [] ] in let aliases = match find_all_fields "NAME" r.rsons with [ [_ :: l] -> List.map (fun r -> r.rval) l | _ -> [] ] in let sex = match find_field "SEX" r.rsons with [ Some {rval = "M"} -> Male | Some {rval = "F"} -> Female | _ -> Neuter ] in let image = match find_field "OBJE" r.rsons with [ Some r -> match find_field "FILE" r.rsons with [ Some r -> if no_picture.val then "" else r.rval | None -> "" ] | None -> "" ] in let parents = match find_field "FAMC" r.rsons with [ Some r -> Some (fam_index gen r.rval) | None -> None ] in let occupation = match find_all_fields "OCCU" r.rsons with [ [r :: rl] -> List.fold_left (fun s r -> s ^ ", " ^ strip_spaces r.rval) (strip_spaces r.rval) rl | [] -> "" ] in let notes = match find_all_fields "NOTE" r.rsons with [ [] -> "" | rl -> treat_notes gen rl ] in let titles = List.map (treat_indi_title gen public_name) (find_all_fields "TITL" r.rsons) in let family = let rl = find_all_fields "FAMS" r.rsons in let rvl = List.fold_right (fun r rvl -> if List.mem r.rval rvl then rvl else [r.rval :: rvl]) rl [] in List.map (fun r -> fam_index gen r) rvl in let rasso = find_all_fields "ASSO" r.rsons in let rparents = let godparents = find_all_rela ["godf"; "godm"; "godp"] rasso in let godparents = if godparents = [] then let ro = match find_field "BAPM" r.rsons with [ None -> find_field "CHR" r.rsons | x -> x ] in match ro with [ Some r -> find_all_rela ["godf"; "godm"; "godp"] rasso | None -> [] ] else godparents in loop godparents where rec loop rl = if rl <> [] then let (r_fath, rl) = match rl with [ [("godf", r) :: rl] -> (Some (forward_godp gen ip r), rl) | _ -> (None, rl) ] in let (r_moth, rl) = match rl with [ [("godm", r) :: rl] -> (Some (forward_godp gen ip r), rl) | _ -> (None, rl) ] in let (r_fath, r_moth, rl) = if r_fath <> None || r_moth <> None then (r_fath, r_moth, rl) else let (r_fath, rl) = match rl with [ [("godp", r) :: rl] -> (Some (forward_godp gen ip r), rl) | _ -> (None, rl) ] in (r_fath, None, rl) in let r = {r_type = GodParent; r_fath = r_fath; r_moth = r_moth; r_sources = string_empty} in [r :: loop rl] else [] in let witn = find_all_rela ["witness"] rasso in let _ = List.map (fun (n, rval) -> forward_witn gen ip rval) witn in let (birth, birth_place, (birth_src, birth_nt)) = match find_field "BIRT" r.rsons with [ Some r -> let d = match find_field "DATE" r.rsons with [ Some r -> date_of_field r.rpos r.rval | _ -> None ] in let p = match find_field "PLAC" r.rsons with [ Some r -> strip_spaces r.rval | _ -> "" ] in (d, p, source gen r) | None -> (None, "", ("", [])) ] in let (bapt, bapt_place, (bapt_src, bapt_nt)) = let ro = match find_field "BAPM" r.rsons with [ None -> find_field "CHR" r.rsons | x -> x ] in match ro with [ Some r -> let d = match find_field "DATE" r.rsons with [ Some r -> date_of_field r.rpos r.rval | _ -> None ] in let p = match find_field "PLAC" r.rsons with [ Some r -> strip_spaces r.rval | _ -> "" ] in (d, p, source gen r) | None -> (None, "", ("", [])) ] in let (death, death_place, (death_src, death_nt)) = match find_field "DEAT" r.rsons with [ Some r -> if r.rsons = [] then if r.rval = "Y" then (DeadDontKnowWhen, "", ("", [])) else (infer_death birth bapt, "", ("", [])) else let d = match find_field "DATE" r.rsons with [ Some r -> match date_of_field r.rpos r.rval with [ Some d -> Death Unspecified (Adef.cdate_of_date d) | None -> DeadDontKnowWhen ] | _ -> DeadDontKnowWhen ] in let p = match find_field "PLAC" r.rsons with [ Some r -> strip_spaces r.rval | _ -> "" ] in (d, p, source gen r) | None -> (infer_death birth bapt, "", ("", [])) ] in let (burial, burial_place, (burial_src, burial_nt)) = let (buri, buri_place, (buri_src, buri_nt)) = match find_field "BURI" r.rsons with [ Some r -> if r.rsons = [] then if r.rval = "Y" then (Buried Adef.codate_None, "", ("", [])) else (UnknownBurial, "", ("", [])) else let d = match find_field "DATE" r.rsons with [ Some r -> date_of_field r.rpos r.rval | _ -> None ] in let p = match find_field "PLAC" r.rsons with [ Some r -> strip_spaces r.rval | _ -> "" ] in (Buried (Adef.codate_of_od d), p, source gen r) | None -> (UnknownBurial, "", ("", [])) ] in let (crem, crem_place, (crem_src, crem_nt)) = match find_field "CREM" r.rsons with [ Some r -> if r.rsons = [] then if r.rval = "Y" then (Cremated Adef.codate_None, "", ("", [])) else (UnknownBurial, "", ("", [])) else let d = match find_field "DATE" r.rsons with [ Some r -> date_of_field r.rpos r.rval | _ -> None ] in let p = match find_field "PLAC" r.rsons with [ Some r -> strip_spaces r.rval | _ -> "" ] in (Cremated (Adef.codate_of_od d), p, source gen r) | None -> (UnknownBurial, "", ("", [])) ] in match (buri, crem) with [ (UnknownBurial, Cremated _) -> (crem, crem_place, (crem_src, crem_nt)) | _ -> (buri, buri_place, (buri_src, buri_nt)) ] in let birth = Adef.codate_of_od birth in let bapt = Adef.codate_of_od bapt in let (psources, psources_nt) = let (s, s_nt) = source gen r in if s = "" then (default_source.val, s_nt) else (s, s_nt) in let ext_notes = let concat_text s1 s2 s_sep = let s = if s1 = "" && notes = "" || s2 = "" then "" else s_sep in s1 ^ s ^ s2 in let text = concat_text "" (notes_from_source_record birth_nt) "
\n" in let text = concat_text text (notes_from_source_record bapt_nt) "
\n" in let text = concat_text text (notes_from_source_record death_nt) "
\n" in let text = concat_text text (notes_from_source_record burial_nt) "
\n" in let text = concat_text text (notes_from_source_record psources_nt) "
\n" in if untreated_in_notes.val then let remain_tags_in_notes text init rtl = let rtl = build_remain_tags rtl in if rtl = [] then init else concat_text init (html_text_of_tags text rtl) "\n" in let nt = remain_tags_in_notes "INDI" "" r.rsons in let nt = remain_tags_in_notes "BIRT SOUR" nt birth_nt in let nt = remain_tags_in_notes "BAPT SOUR" nt bapt_nt in let nt = remain_tags_in_notes "DEAT SOUR" nt death_nt in let nt = remain_tags_in_notes "BURI/CREM SOUR" nt burial_nt in let nt = remain_tags_in_notes "SOUR SOUR" nt psources_nt in if nt = "" then text else text ^ "
\n" ^ nt ^ "\n
" else text in let person = person_of_gen_person {first_name = add_string gen first_name; surname = add_string gen surname; occ = occ; public_name = add_string gen public_name; image = add_string gen image; qualifiers = if qualifier <> "" then [add_string gen qualifier] else []; aliases = List.map (add_string gen) aliases; first_names_aliases = List.map (add_string gen) first_names_aliases; surnames_aliases = List.map (add_string gen) surname_aliases; titles = titles; rparents = rparents; related = []; occupation = add_string gen occupation; sex = sex; access = if no_public_if_titles.val && titles <> [] then Private else IfTitles; birth = birth; birth_place = add_string gen birth_place; birth_src = add_string gen birth_src; baptism = bapt; baptism_place = add_string gen bapt_place; baptism_src = add_string gen bapt_src; death = death; death_place = add_string gen death_place; death_src = add_string gen death_src; burial = burial; burial_place = add_string gen burial_place; burial_src = add_string gen burial_src; notes = add_string gen (notes ^ ext_notes); psources = add_string gen psources; key_index = ip} in let ascend = ascend_of_gen_ascend {parents = parents; consang = Adef.fix (-1)} in let union = union_of_gen_union {family = Array.of_list family} in do { gen.g_per.arr.(Adef.int_of_iper ip) := Right3 person ascend union; match find_field "ADOP" r.rsons with [ Some r -> match find_field "FAMC" r.rsons with [ Some r -> forward_adop gen ip r.rval (find_field "ADOP" r.rsons) | _ -> () ] | _ -> () ]; r.rused := True } ; value add_fam_norm gen r adop_list = let i = fam_index gen r.rval in let (fath, moth, gay) = match (find_all_fields "HUSB" r.rsons, find_all_fields "WIFE" r.rsons) with [ ([f1], [m1]) -> (per_index gen f1.rval, per_index gen m1.rval, False) | ([f1; f2 :: []], []) -> (per_index gen f1.rval, per_index gen f2.rval, True) | ([], [m1; m2 :: []]) -> (per_index gen m1.rval, per_index gen m2.rval, True) | _ -> let fath = match find_field "HUSB" r.rsons with [ Some r -> per_index gen r.rval | None -> phony_per gen Male ] in let moth = match find_field "WIFE" r.rsons with [ Some r -> per_index gen r.rval | None -> phony_per gen Female ] in (fath, moth, False) ] in do { match gen.g_per.arr.(Adef.int_of_iper fath) with [ Left3 lab -> () | Right3 p a u -> let u = if not (List.mem i (Array.to_list (get_family u))) then union_of_gen_union {family = Array.append (get_family u) [| i |]} else u in let p = if get_sex p = Neuter then person_with_sex p Male else p in gen.g_per.arr.(Adef.int_of_iper fath) := Right3 p a u ]; match gen.g_per.arr.(Adef.int_of_iper moth) with [ Left3 lab -> () | Right3 p a u -> let u = if not (List.mem i (Array.to_list (get_family u))) then union_of_gen_union {family = Array.append (get_family u) [| i |]} else u in let p = if get_sex p = Neuter then person_with_sex p Female else p in gen.g_per.arr.(Adef.int_of_iper moth) := Right3 p a u ]; let children = let rl = find_all_fields "CHIL" r.rsons in List.fold_right (fun r ipl -> let ip = per_index gen r.rval in if List.mem_assoc ip adop_list then match gen.g_per.arr.(Adef.int_of_iper ip) with [ Right3 p a u -> match get_parents a with [ Some ifam -> if ifam = i then do { let a = ascend_with_parents a None in gen.g_per.arr.(Adef.int_of_iper ip) := Right3 p a u; ipl } else [ip :: ipl] | None -> [ip :: ipl] ] | _ -> [ip :: ipl] ] else [ip :: ipl]) rl [] in let (relation, marr, marr_place, (marr_src, marr_nt), witnesses) = let (relation, sons) = match find_field "MARR" r.rsons with [ Some r -> if gay then (NoSexesCheckMarried, Some r) else (Married, Some r) | None -> match find_field "ENGA" r.rsons with [ Some r -> (Engaged, Some r) | None -> (relation_status.val, None) ] ] in match sons with [ Some r -> let (u, p) = match find_all_fields "PLAC" r.rsons with [ [r :: rl] -> if String.uncapitalize r.rval = "unmarried" then (NotMarried, "") else let p = strip_spaces r.rval in loop rl where rec loop = fun [ [r :: rl] -> if String.uncapitalize r.rval = "unmarried" then (NotMarried, p) else loop rl | [] -> (relation, p) ] | [] -> (relation, "") ] in let u = match find_field "TYPE" r.rsons with [ Some r -> if String.uncapitalize r.rval = "gay" then NoSexesCheckNotMarried else u | None -> u ] in let d = match find_field "DATE" r.rsons with [ Some r -> date_of_field r.rpos r.rval | _ -> None ] in let rec heredis_witnesses = fun [ [] -> [] | [ r :: asso_l ] -> if find_field_with_value "RELA" "Witness" r.rsons && find_field_with_value "TYPE" "INDI" r.rsons then let witness = per_index gen r.rval in [ witness :: heredis_witnesses asso_l ] else do { r.rused := False; heredis_witnesses asso_l } ] in let witnesses = match find_all_fields "ASSO" r.rsons with [ [] -> [] | wl -> heredis_witnesses wl ] in (u, d, p, source gen r, witnesses) | None -> (relation, None, "", ("", []), []) ] in let witnesses = Array.of_list witnesses in let div = match find_field "DIV" r.rsons with [ Some r -> match find_field "DATE" r.rsons with [ Some d -> Divorced (Adef.codate_of_od (date_of_field d.rpos d.rval)) | _ -> match find_field "PLAC" r.rsons with [ Some _ -> Divorced Adef.codate_None | _ -> if r.rval = "Y" then Divorced Adef.codate_None else NotDivorced ] ] | None -> NotDivorced ] in let comment = match find_all_fields "NOTE" r.rsons with [ [] -> "" | rl -> treat_notes gen rl ] in let (fsources, fsources_nt) = let (s, s_nt) = source gen r in if s = "" then (default_source.val, s_nt) else (s, s_nt) in let concat_text s1 s2 s_sep = let s = if s1 = "" then "" else s_sep in s1 ^ s ^ s2 in let ext_sources = let text = concat_text "" (notes_from_source_record marr_nt) "
\n" in concat_text text (notes_from_source_record fsources_nt) "
\n" in let ext_notes = if untreated_in_notes.val then let remain_tags_in_notes text init rtl = let rtl = build_remain_tags rtl in if rtl = [] then init else concat_text init (html_text_of_tags text rtl) "\n" in let nt = remain_tags_in_notes "FAM" "" r.rsons in let nt = remain_tags_in_notes "MARR SOUR" nt marr_nt in let nt = remain_tags_in_notes "SOUR SOUR" nt fsources_nt in if nt = "" then "" else "
\n" ^ nt ^ "\n
" else "" in let add_in_person_notes iper = match gen.g_per.arr.(Adef.int_of_iper iper) with [ Left3 _ -> () | Right3 p a u -> let notes = gen.g_str.arr.(Adef.int_of_istr (get_notes p)) in let notes = if notes = "" then ext_sources ^ ext_notes else if ext_sources = "" then notes ^ "\n" ^ ext_notes else notes ^ "
\n" ^ ext_sources ^ ext_notes in let new_notes = add_string gen notes in let p = person_of_gen_person {(gen_person_of_person p) with notes = new_notes} in gen.g_per.arr.(Adef.int_of_iper iper) := Right3 p a u ] in let _ = if ext_notes = "" then () else do { add_in_person_notes fath; add_in_person_notes moth; } in let fam = family_of_gen_family {marriage = Adef.codate_of_od marr; marriage_place = add_string gen marr_place; marriage_src = add_string gen marr_src; witnesses = witnesses; relation = relation; divorce = div; comment = add_string gen comment; origin_file = string_empty; fsources = add_string gen fsources; fam_index = i} and cpl = couple_of_gen_couple (couple False fath moth) and des = descend_of_gen_descend {children = Array.of_list children} in gen.g_fam.arr.(Adef.int_of_ifam i) := Right3 fam cpl des } ; value add_fam gen r = let list = Hashtbl.find_all gen.g_adop r.rval in match list with [ [] -> add_fam_norm gen r [] | list -> let husb = find_field "HUSB" r.rsons in let wife = find_field "WIFE" r.rsons in do { List.iter (fun (ip, which_parent) -> set_adop_fam gen ip which_parent husb wife) list; match find_field "CHIL" r.rsons with [ Some _ -> add_fam_norm gen r list | _ -> () ] } ] ; value treat_header2 gen r = match charset_option.val with [ Some v -> charset.val := v | None -> match find_field "CHAR" r.rsons with [ Some r -> match r.rval with [ "ANSEL" -> charset.val := Ansel | "ASCII" | "IBMPC" -> charset.val := Ascii | "MACINTOSH" -> charset.val := MacIntosh | "UTF-8" -> charset.val := Utf8 | _ -> charset.val := Ascii ] | None -> () ] ] ; value treat_header3 gen r = match find_all_fields "NOTE" r.rsons with [ [] -> () | rl -> gen.g_bnot := treat_notes gen rl ] ; value turn_around_genealogos_bug r = if String.length r.rlab > 0 && r.rlab.[0] = '@' then {(r) with rlab = r.rval; rval = r.rlab} else r ; value make_gen2 gen r = let r = turn_around_genealogos_bug r in match r.rlab with [ "HEAD" -> treat_header2 gen r | "INDI" -> add_indi gen r | _ -> () ] ; value make_gen3 gen r = let r = turn_around_genealogos_bug r in match r.rlab with [ "HEAD" -> treat_header3 gen r | "SUBM" -> () | "INDI" -> () | "FAM" -> add_fam gen r | "NOTE" -> () | "SOUR" -> () | "TRLR" -> do { eprintf "*** Trailer ok\n"; flush stderr } | s -> do { fprintf log_oc.val "Not implemented typ = %s\n" s; flush log_oc.val } ] ; value find_lev0 = parser bp [: _ = line_start '0'; _ = skip_space; r1 = get_ident 0; r2 = get_ident 0; _ = skip_to_eoln :] -> (bp, r1, r2) ; value pass1 gen fname = let ic = open_in_bin fname in let strm = Stream.of_channel ic in let rec loop () = match try Some (find_lev0 strm) with [ Stream.Failure -> None ] with [ Some (bp, r1, r2) -> do { match r2 with [ "NOTE" -> Hashtbl.add gen.g_not r1 bp | "SOUR" -> Hashtbl.add gen.g_src r1 bp | _ -> () ]; loop () } | None -> match strm with parser [ [: `_ :] -> do { skip_to_eoln strm; loop () } | [: :] -> () ] ] in do { loop (); close_in ic } ; value pass2 gen fname = let ic = open_in_bin fname in do { line_cnt.val := 0; let strm = Stream.from (fun i -> try let c = input_char ic in do { if c = '\n' then incr line_cnt else (); Some c } with [ End_of_file -> None ]) in let rec loop () = match try Some (get_lev0 strm) with [ Stream.Failure -> None ] with [ Some r -> do { make_gen2 gen r; loop () } | None -> match strm with parser [ [: `'1'..'9' :] -> let _ : string = get_to_eoln 0 strm in loop () | [: `_ :] -> let _ : string = get_to_eoln 0 strm in loop () | [: :] -> () ] ] in loop (); List.iter (fun (ipp, ip) -> match gen.g_per.arr.(Adef.int_of_iper ipp) with [ Right3 p a u -> if List.mem ip (get_related p) then () else let p = person_with_related p [ip :: get_related p] in gen.g_per.arr.(Adef.int_of_iper ipp) := Right3 p a u | _ -> () ]) gen.g_godp; close_in ic } ; value pass3 gen fname = let ic = open_in_bin fname in do { line_cnt.val := 0; let strm = Stream.from (fun i -> try let c = input_char ic in do { if c = '\n' then incr line_cnt else (); Some c } with [ End_of_file -> None ]) in let rec loop () = match try Some (get_lev0 strm) with [ Stream.Failure -> None ] with [ Some r -> do { make_gen3 gen r; loop () } | None -> match strm with parser [ [: `'1'..'9' :] -> let _ : string = get_to_eoln 0 strm in loop () | [: `_ :] -> do { print_location line_cnt.val; fprintf log_oc.val "Strange input.\n"; flush log_oc.val; let _ : string = get_to_eoln 0 strm in loop () } | [: :] -> () ] ] in loop (); List.iter (fun (ifam, ip) -> match gen.g_fam.arr.(Adef.int_of_ifam ifam) with [ Right3 fam cpl des -> match (gen.g_per.arr.(Adef.int_of_iper (get_father cpl)), gen.g_per.arr.(Adef.int_of_iper ip)) with [ (Right3 pfath _ _, Right3 p a u) -> do { if List.mem (get_father cpl) (get_related p) then () else let p = person_with_related p [get_father cpl :: get_related p] in gen.g_per.arr.(Adef.int_of_iper ip) := Right3 p a u; if List.mem ip (Array.to_list (get_witnesses fam)) then () else let fam = family_of_gen_family {(gen_family_of_family fam) with witnesses = Array.append (get_witnesses fam) [| ip |]} in gen.g_fam.arr.(Adef.int_of_ifam ifam) := Right3 fam cpl des } | _ -> () ] | _ -> () ]) gen.g_witn; close_in ic } ; value check_undefined gen = do { for i = 0 to gen.g_per.tlen - 1 do { match gen.g_per.arr.(i) with [ Right3 _ _ _ -> () | Left3 lab -> let (p, a, u) = unknown_per gen i Neuter in do { fprintf log_oc.val "Warning: undefined person %s\n" lab; gen.g_per.arr.(i) := Right3 p a u } ] }; for i = 0 to gen.g_fam.tlen - 1 do { match gen.g_fam.arr.(i) with [ Right3 _ _ _ -> () | Left3 lab -> let (f, c, d) = unknown_fam gen i in do { fprintf log_oc.val "Warning: undefined family %s\n" lab; gen.g_fam.arr.(i) := Right3 f c d } ] } } ; value add_parents_to_isolated gen = for i = 0 to gen.g_per.tlen - 1 do { match gen.g_per.arr.(i) with [ Right3 p a u -> if get_parents a = None && Array.length (get_family u) = 0 && get_rparents p = [] && get_related p = [] then let fn = gen.g_str.arr.(Adef.int_of_istr (get_first_name p)) in let sn = gen.g_str.arr.(Adef.int_of_istr (get_surname p)) in if fn = "?" && sn = "?" then () else do { fprintf log_oc.val "Adding parents to isolated person: %s.%d %s\n" fn (get_occ p) sn; let ifam = phony_fam gen in match gen.g_fam.arr.(Adef.int_of_ifam ifam) with [ Right3 fam cpl des -> do { let des = descend_of_gen_descend {children = [| get_key_index p |]} in gen.g_fam.arr.(Adef.int_of_ifam ifam) := Right3 fam cpl des; let a = ascend_with_parents a (Some ifam) in gen.g_per.arr.(i) := Right3 p a u } | _ -> () ]; } else () | Left3 _ -> () ] } ; value make_arrays in_file = let fname = if Filename.check_suffix in_file ".ged" then in_file else if Filename.check_suffix in_file ".GED" then in_file else in_file ^ ".ged" in let gen = {g_per = {arr = [| |]; tlen = 0}; g_fam = {arr = [| |]; tlen = 0}; g_str = {arr = [| |]; tlen = 0}; g_bnot = ""; g_ic = open_in_bin fname; g_not = Hashtbl.create 3001; g_src = Hashtbl.create 3001; g_hper = Hashtbl.create 3001; g_hfam = Hashtbl.create 3001; g_hstr = Hashtbl.create 3001; g_hnam = Hashtbl.create 3001; g_adop = Hashtbl.create 3001; g_godp = []; g_witn = []} in do { assert (add_string gen "" = string_empty); assert (add_string gen "?" = string_quest); assert (add_string gen "x" = string_x); eprintf "*** pass 1 (note)\n"; flush stderr; pass1 gen fname; eprintf "*** pass 2 (indi)\n"; flush stderr; pass2 gen fname; eprintf "*** pass 3 (fam)\n"; flush stderr; pass3 gen fname; close_in gen.g_ic; check_undefined gen; add_parents_to_isolated gen; (gen.g_per, gen.g_fam, gen.g_str, gen.g_bnot) } ; value make_subarrays (g_per, g_fam, g_str, g_bnot) = let persons = let pa = Array.make g_per.tlen (Obj.magic 0) in let aa = Array.make g_per.tlen (Obj.magic 0) in let ua = Array.make g_per.tlen (Obj.magic 0) in do { for i = 0 to g_per.tlen - 1 do { match g_per.arr.(i) with [ Right3 p a u -> do { pa.(i) := p; aa.(i) := a; ua.(i) := u } | Left3 lab -> failwith ("undefined person " ^ lab) ] }; (pa, aa, ua) } in let families = let fa = Array.make g_fam.tlen (Obj.magic 0) in let ca = Array.make g_fam.tlen (Obj.magic 0) in let da = Array.make g_fam.tlen (Obj.magic 0) in do { for i = 0 to g_fam.tlen - 1 do { match g_fam.arr.(i) with [ Right3 f c d -> do { fa.(i) := f; ca.(i) := c; da.(i) := d } | Left3 lab -> failwith ("undefined family " ^ lab) ] }; (fa, ca, da) } in let strings = Array.sub g_str.arr 0 g_str.tlen in (persons, families, strings, g_bnot) ; (* Converting to Gwcomp.gw_syntax *) value key_of_person sa p = {Gwcomp.pk_first_name = sa.(Adef.int_of_istr p.first_name); pk_surname = sa.(Adef.int_of_istr p.surname); pk_occ = p.occ} ; value somebody_of_person def pa sa ip = let p = pa.(Adef.int_of_iper ip) in let somebody = if def.(Adef.int_of_iper ip) then let pk = key_of_person sa p in Gwcomp.Undefined pk else do { let p = {(p) with rparents = []; related = []; notes = string_empty} in let p = Futil.map_person_ps (fun p -> failwith "somebody_of_person") (fun i -> sa.(Adef.int_of_istr i)) p in def.(Adef.int_of_iper ip) := True; Gwcomp.Defined p } in (somebody, p.sex) ; value string_person_of_person pa sa ip = Futil.map_person_ps (fun p -> p) (fun i -> sa.(Adef.int_of_istr i)) pa.(Adef.int_of_iper ip) ; value make_gwsyntax ((pa, aa, ua), (fa, ca, da), sa, g_bnot) = do { let rev_list = ref [] in let def = Array.make (Array.length pa) False in for ifam = 0 to Array.length fa - 1 do { let des = da.(ifam) in for i = 0 to Array.length des.children - 1 do { def.(Adef.int_of_iper des.children.(i)) := True }; }; for ifam = 0 to Array.length fa - 1 do { let cpl = ca.(ifam) in let (fath, s1) = somebody_of_person def pa sa (Adef.father cpl) in let (moth, s2) = somebody_of_person def pa sa (Adef.mother cpl) in let cpl = Adef.couple fath moth in let witn = List.map (somebody_of_person def pa sa) (Array.to_list fa.(ifam).witnesses) in let fam = let fam = {(fa.(ifam)) with witnesses = [| |]} in Futil.map_family_ps (fun p -> failwith "make_gwsyntax 1") (fun i -> sa.(Adef.int_of_istr i)) fam in let des = Futil.map_descend_p (string_person_of_person pa sa) da.(ifam) in rev_list.val := [Gwcomp.Family cpl s1 s2 witn fam des :: rev_list.val] }; for i = 0 to Array.length pa - 1 do { match pa.(i).rparents with [ [] -> () | rl -> let (x, sex) = somebody_of_person def pa sa (Adef.iper_of_int i) in let rl = List.map (fun r -> Futil.map_relation_ps (fun ip -> fst (somebody_of_person def pa sa ip)) (fun i -> sa.(Adef.int_of_istr i)) r) rl in rev_list.val := [Gwcomp.Relations x sex rl :: rev_list.val] ]; }; for i = 0 to Array.length pa - 1 do { let p = pa.(i) in let n = sa.(Adef.int_of_istr p.notes) in if n = "" then () else let pk = key_of_person sa p in rev_list.val := [Gwcomp.Notes pk n :: rev_list.val]; }; if g_bnot = "" then () else rev_list.val := [Gwcomp.Bnotes "" g_bnot :: rev_list.val]; List.rev rev_list.val }; (* Providing gw_syntax stream *) value next_family_fun_templ gw_syntax in_file fi = do { fi.Db2link.f_curr_gwo_file := in_file; let gw_syntax = ref gw_syntax in fun () -> match gw_syntax.val with [ [x :: l] -> do { gw_syntax.val := l; Some x } | [] -> None ] }; (* Main *) value set_undefined_death_interval s = try match Stream.of_string s with parser [ [: a = number 0; `'-'; b = number 0 :] -> do { eprintf "ay %s dy %s\n" a b; flush stderr; let a = if a = "" then alive_years.val else int_of_string a in let b = max a (if b = "" then dead_years.val else int_of_string b) in alive_years.val := a; dead_years.val := b; eprintf "ay %d dy %d\n" a b; flush stderr } ] with [ Stream.Error _ -> raise (Arg.Bad "bad parameter for -udi") | e -> raise e ] ; value out_file = ref "a"; value speclist = [("-o", Arg.String (fun s -> out_file.val := s), "\n Output database (default: \"a\")."); ("-f", Arg.Set force, "\n Remove database if already existing"); ("-log", Arg.String (fun s -> log_oc.val := open_out s), "\n Redirect log trace to this file."); ("-lf", Arg.Set lowercase_first_names, " \ - Lowercase first names - Convert first names to lowercase letters, with initials in uppercase."); ("-ls", Arg.Unit (fun () -> case_surnames.val := LowerCase), " \ - Lowercase surnames - Convert surnames to lowercase letters, with initials in uppercase. Try to keep lowercase particles."); ("-us", Arg.Unit (fun () -> case_surnames.val := UpperCase), " \ - Uppercase surnames - Convert surnames to uppercase letters."); ("-fne", Arg.String (fun s -> if String.length s = 2 then first_names_brackets.val := Some (s.[0], s.[1]) else raise (Arg.Bad "-fne option must be followed by a 2 characters string")), "\ be - First names enclosed - When creating a person, if the GEDCOM first name part holds a part between 'b' (any character) and 'e' (any character), it is considered to be the usual first name: e.g. -fne '\"\"' or -fne \"()\"."); ("-efn", Arg.Set extract_first_names, " \ - Extract first names - When creating a person, if the GEDCOM first name part holds several names, the first of this names becomes the person \"first name\" and the complete GEDCOM first name part a \"first name alias\"."); ("-no_efn", Arg.Clear extract_first_names, " \ - Dont extract first names - [default] Cancels the previous option."); ("-epn", Arg.Set extract_public_names, " \ - Extract public names - [default] When creating a person, if the GEDCOM first name part looks like a public name, i.e. holds: * a number or a roman number, supposed to be a number of a nobility title, * one of the words: \"der\", \"den\", \"die\", \"el\", \"le\", \"la\", \"the\", supposed to be the beginning of a qualifier, then the GEDCOM first name part becomes the person \"public name\" and its first word his \"first name\"."); ("-no_epn", Arg.Clear extract_public_names, "\n Cancels the previous option."); ("-no_pit", Arg.Set no_public_if_titles, " \ - No public if titles - Do not consider persons having titles as public"); ("-tnd", Arg.Set try_negative_dates, " \ - Try negative dates - Set negative dates when inconsistency (e.g. birth after death)"); ("-no_nd", Arg.Set no_negative_dates, " \ - No negative dates - Don't interpret a year preceded by a minus sign as a negative year"); ("-nc", Arg.Clear Db2link.do_check, "\n No consistency check"); ("-nopicture", Arg.Set no_picture, " \ - Don't extract individual picture."); ("-udi", Arg.String set_undefined_death_interval, "\ x-y - Undefined death interval - Set the interval for persons whose death part is undefined: - if before x years, they are considered as alive - if after y year, they are considered as death - between x and y year, they are considered as \"don't know\" Default x is " ^ string_of_int alive_years.val ^ " and y is " ^ string_of_int dead_years.val); ("-uin", Arg.Set untreated_in_notes, " - Untreated in notes -\n Put untreated GEDCOM tags in notes"); ("-ds", Arg.String (fun s -> default_source.val := s), " \ - Default source - Set the source field for persons and families without source data"); ("-dn", Arg.String (fun s -> default_name.val := s), " \ - Default name - Set the first name or surname field for persons without name"); ("-dates_dm", Arg.Unit (fun () -> month_number_dates.val := DayMonthDates), "\n Interpret months-numbered dates as day/month/year"); ("-dates_md", Arg.Unit (fun () -> month_number_dates.val := MonthDayDates), "\n Interpret months-numbered dates as month/day/year"); ("-rs_no_mention", Arg.Unit (fun () -> relation_status.val := NoMention), "\n Force relation status to NoMention (default is Married)"); ("-charset", Arg.String (fun [ "ANSEL" -> charset_option.val := Some Ansel | "ASCII" -> charset_option.val := Some Ascii | "MSDOS" -> charset_option.val := Some Msdos | _ -> raise (Arg.Bad "bad -charset value") ]), "\ [ANSEL|ASCII|MSDOS] - charset decoding - Force given charset decoding, overriding the possible setting in GEDCOM")] ; value anonfun s = if in_file.val = "" then in_file.val := s else raise (Arg.Bad "Cannot treat several GEDCOM files") ; value errmsg = "Usage: ged2gwb2 [] [options] where options are:"; value main () = do { Argl.parse speclist anonfun errmsg; Secure.set_base_dir (Filename.dirname out_file.val); let bdir = if Filename.check_suffix out_file.val ".gwb" then out_file.val else out_file.val ^ ".gwb" in if not force.val && Sys.file_exists bdir then do { printf "\ The database \"%s\" already exists. Use option -f to overwrite it. " out_file.val; flush stdout; exit 2 } else (); let gw_syntax = do { let arrays = make_arrays in_file.val in Gc.compact (); let arrays = make_subarrays arrays in flush log_oc.val; make_gwsyntax arrays } in lock Mutil.lock_file out_file.val with [ Accept -> let next_family_fun = next_family_fun_templ gw_syntax in_file.val in if Db2link.link next_family_fun bdir then () else do { eprintf "*** database not created\n"; flush stderr; exit 2; } | Refuse -> do { printf "Base is locked: cannot write it\n"; flush stdout; exit 2 } ]; (* finish_base base arrays; *) warning_month_number_dates (); if log_oc.val != stdout then close_out log_oc.val else () } ; try main () with e -> let e = match e with [ Ploc.Exc _ e -> e | _ -> e ] in do { fprintf log_oc.val "Uncaught exception: %s\n" (Printexc.to_string e); if log_oc.val != stdout then close_out log_oc.val else (); exit 2 }; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/LICENSE0000660000175200017530000004312712664543647021435 0ustar guillaumeguillaume GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/0002770000175200017530000000000012664543647021015 5ustar guillaumeguillaumegeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/lang/0002770000175200017530000000000012664543647021736 5ustar guillaumeguillaumegeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/lang/lex_utf8.txt0000660000175200017530000134715612664543647024255 0ustar guillaumeguillaume !dates order af: yyyymmdd ar: ddmmyyyy bg: ddmmyyyy br: ddmmyyyy ca: ddmmyyyy cs: yyyymmdd da: ddmmyyyy de: ddmmyyyy en: mmddyyyy eo: ddmmyyyy es: ddmmyyyy et: ddmmyyyy fi: ddmmyyyy fr: ddmmyyyy he: ddmmyyyy is: ddmmyyyy it: ddmmyyyy lv: ddmmyyyy nl: ddmmyyyy no: ddmmyyyy oc: ddmmyyyy pl: ddmmyyyy pt: ddmmyyyy ro: ddmmyyyy ru: ddmmyyyy sk: ddmmyyyy sl: ddmmyyyy sv: ddmmyyyy !dir ar: rtl he: rtl !languages af: af=Afrikaans/ca=Catalan/cs=Czeck/da=Deens/de=Duits/en=Engels/eo=Esperanto/es=Spaans/fi=Fins/fr=Frans/he=Hibreeus/is=Yslandies/it=Italiaans/nl=Nederlands/no=Noorweegs/oc=Oksitaans/pl=Pools/pt=Portugees/pt-br=Portugees-in-Brazilië/ru=Russies/sv=Sweeds/zh=Chinees bg: af=бурÑки/bg=българÑки/br=бретонÑки/ca=каталонÑки/cs=чешки/da=датÑки/de=немÑки/en=английÑки/eo=еÑперанто/es=иÑпанÑки/et=еÑтонÑки/fi=финландÑки/fr=френÑки/he=иврит/is=иÑландÑки/it=италианÑки/lv=латвийÑки/nl=холандÑки/no=норвежки/oc=окÑитанÑки/pl=полÑки/pt=португалÑки/pt-br=бразилÑко-португалÑки/ro=румънÑки/ru=руÑки/sl=ÑловенÑки/sv=шведÑки/zh=китайÑки br: af=afrikaaneg/bg=bulgareg/br=brezhoneg/ca=katalaneg/cs=tchekeg/da=daneg/de=alamaneg/en=saozneg/eo=esperanteg/es=spagnoleg/et=estonieg/fi=finneg/fr=galleg/he=hebreeg/is=islandeg/it=italianeg/lv=letoneg/nl=izelvroeg/no=norvegieg/oc=okitaneg/pl=poloneg/pt=portugaleg/pt-br=portugaleg bro-Vrazil/ro=roumaneg/ru=rusianeg/sl=sloveneg/sv=svedeg/zh=sinaeg ca: af=africà/ca=català/cs=xec/da=danès/de=alemany/en=anglès/eo=esperanto/es=castellà/et=estó/fi=finlandès/fr=francès/he=hebreu/is=islandès/it=italià/lv=letó/nl=holandès/no=norueg/oc=occità/pl=polac/pt=portuguès/pt-br=brasiler/ru=rus/sl=eslovè/sv=suec/zh=Xinès cs: af=afrikánÅ¡tina/bg=bulharÅ¡tina/cs=ÄeÅ¡tina/da=dánÅ¡tina/de=nÄ›mÄina/en=angliÄtina/eo=esperanto/es=Å¡panÄ›lÅ¡tina/fi=finÅ¡tina/fr=francouzÅ¡tina/he=hebrejÅ¡tina/is=islandÅ¡tina/it=italÅ¡tina/lv=lotyšština/nl=holandÅ¡tina/no=norÅ¡tina/oc=okcitánÅ¡tina/pt=portugalÅ¡tina/pt-br=brasilÅ¡tina/ru=ruÅ¡tina/sv=Å¡védÅ¡tina/zh=ÄínÅ¡tina da: af=afrikaans/bg=bulgarsk/br=bretonsk/ca=katalansk/cs=tjekkisk/da=dansk/de=tysk/en=engelsk/eo=esperanto/es=spansk/et=estisk/fi=finsk/fr=fransk/he=hebraisk/is=islandsk/it=italiensk/lv=lettisk/nl=hollandsk/no=norsk/oc=occitansk/pl=polsk/pt=portugisisk/pt-br=brasiliansk-portugisisk/ro=rumænsk/ru=russisk/sl=slovensk/sv=svensk/zh=kinesisk de: af=Afrikaans/bg=Bulgarish/br=Bretonisch/ca=Katalanisch/cs=Tschechisch/da=Dänisch/de=Deutsch/en=Englisch/eo=Esperanto/es=Spanisch/et=Estnisch/fi=Finnisch/fr=Französisch/he=Hebräisch/is=Isländisch/it=Italienisch/lv=Litauisch/nl=Holländisch/no=Norwegisch/oc=Okzitanisch/pl=Polnisch/pt=Portugiesisch/pt-br=Brasil-Portugiesisch/ro=Rumänisch/ru=Russisch/sl=Slovenisch/sv=Schwedisch/zh=Chinesisch en: af=Afrikaans/bg=Bulgarian/br=Breton/ca=Catalan/cs=Czech/da=Danish/de=German/en=English/eo=Esperanto/es=Spanish/et=Estonian/fi=Finnish/fr=French/he=Hebrew/is=Icelandic/it=Italian/lv=Latvian/nl=Dutch/no=Norwegian/oc=Occitan/pl=Polish/pt=Portuguese/pt-br=Brazilian-Portuguese/ro=Romanian/ru=Russian/sl=Slovenian/sv=Swedish/zh=Chinese eo: bg=bulgara/en=anglo/eo=esperanto/fr=franco es: af=Afrikaans/bg=Búlgaro/br=Bretón/ca=Catalán/cs=Checo/da=Danés/de=Alemán/en=Inglés/eo=Esperanto/es=Español/et=Estonio/fi=Finés/fr=Francés/he=Hebreo/is=Islandés/it=Italiano/lv=Lituano/nl=Neerlandés/no=Noruego/oc=Occitano/pl=Polaco/pt=Portugés/pt-br=Portugés de Brasil/ro=Rumano/ru=Ruso/sl=Esloveno/sv=Sueco/zh=Chino et: af=afrikaani/bg=bulgaaria/br=bretooni/ca=katalaani/cs=tÅ¡ehhi/da=taani/de=saksa/en=inglise/eo=esperanto/es=hispaania/et=eesti/fi=soome/fr=prantsuse/he=heebrea/is=islandi/it=itaalia/lv=läti/nl=hollandi/no=norra/oc=oksitaani/pl=poola/pt=portugali/pt-br=brasiilia-portugali/ro=rumeenia/ru=vene/sl=sloveenia/sv=rootsi/zh=hiina fi: af=afrikaans/ca=katalaani/cs=tsekki/da=tanska/de=saksa/en=englanti/eo=esperanto/es=espanja/et=eesti/fi=suomi/fr=ranska/he=heprea/is=islanti/it=italia/lv=latvia/nl=hollanti/no=norja/pl=puola/oc=oksitaani/pt=portugali/pt-br=brasilianportugali/ru=venäjä/sv=ruotsi/zh=kiina fr: af=afrikaans/bg=bulgare/br=breton/ca=catalan/cs=tchèque/da=danois/de=allemand/en=anglais/eo=espéranto/es=espagnol/et=estonien/fi=finnois/fr=français/he=hébreu/is=islandais/it=italien/lv=letton/nl=néerlandais/no=norvégien/oc=occitan/pl=polonais/pt=portugais/pt-br=portugais du Brésil/ro=roumain/ru=russe/sl=slovène/sv=suédois/zh=chinois he: af=×פריק×נס /cs=צ'כית /da=דנית /de=גרמנית /en=×נגלית /eo=×ספרנטו /es=ספרדית /fi=פינית /fr=צרפתית /he=עברית /is=×יסלנדית /it=×יטלקית /lv=לטווית /no=נורבגית /oc=×וקסיטנית /pt=פורטוגזית /ru=רוסית /sv=שוודית/zh=סינית is: af=afrikanska/cs=tékkneska/da=danska/de=þýska/en=enska/eo=esperanto/es=spænska/fi=finnska/fr=franska/he=hebraska/is=íslenska/it=ítalska/lv=lettneska/nl=hollenska/no=norska/oc=oksítanska/pt=portúgalska/pt-br=Brasil-portúgalska/ru=rússneska/sv=sænska/zh=kínverska it: af=afrikaans/bg=bulgaro/ca=catalano/cs=ceco/da=danese/de=tedesco/en=inglese/eo=esperanto/es=spagnolo/et=estone/fi=finlandese/fr=francese/he=ebraico/is=islandese/it=italiano/lv=lettone/nl=olandese/no=norvegese/oc=occitano/pl=polacco/pt=portoghese/pt-br=portoghese-brasiliano/ru=russo/sl=sloveno/sv=svedese/zh=cinese lv: cs=ÄŒehu/da=DÄņu/de=VÄcu/en=Angļu/eo=Esperanto/es=SpÄņu/fi=Somu/fr=FranÄu/he=Ebreju/is=Islandiešū/it=ItÄļu/lv=LatvieÅ¡u/nl=HolandieÅ¡u/no=Norvēģu/oc=OksitÄņu/pt=PortugÄļu/pt-br=Brasil-PortugÄļu/ru=Krievu/sv=Zviedru/zh=ĶīnieÅ¡u nl: af=Afrikaans/cs=Tsjechisch/da=Deens/de=Duits/en=Engels/eo=Esperanto/es=Spaans/fi=Fins/fr=Frans/he=Hebreeuws/is=IJslands/it=Italiaans/lv=Litouws/nl=Nederlands/no=Noors/oc=Occitaans/pt=Portugees/pt-br=Brasil-Portugees/ru=Russisch/sv=Zweeds/zh=Chinees no: af=afrikaans/bg=bulgarsk/br=bretonsk/ca=katalansk/cs=tjekkisk/da=dansk/de=tysk/en=engelsk/eo=esperanto/es=spansk/et=estisk/fi=finsk/fr=fransk/he=hebraisk/is=islandsk/it=italiensk/lv=litauisk/nl=hollandsk/no=norsk/oc=oksitansk/pl=polsk/pt=portugisisk/pt-br=Brasil-portugisisk/ro=rumensk/ru=russisk/sl=slovensk/sv=svensk/zh=kinesisk oc=afrikaans/ca=catalan/cs=chèc/da=danés/de=alemand/en=anglés/eo=esperanto/es=espanhòl/et=estonian/fi=finnés/fr=francés/he=ebrieu/is=islandés/it=italian/lv=leton/nl=neerlandés/no=noruèc/oc=occitan/pl=polonés/pt=portugués/pt-br=portugués brasilièr/ru=rus/sl=eslovèn/sv=suèc/zh=chinés pl: af=afrikaans/bg=buÅ‚garski/ca=kataloÅ„ski/cs=czeski/da=duÅ„ski/de=niemiecki/en=angielski/eo=esperanto/es=hiszpaÅ„ski/et=estoÅ„ski/fi=fiÅ„ski/fr=francuski/he=hebrajski/is=islandzki/it=wÅ‚oski/lv=Å‚otewski/nl=niderlandzki/no=norweski/oc=oksytaÅ„ski/pl=polski/pt=portugalski/pt-br=portugalski (Brazylia)/ru=rosyjski/sv=szwedzki/zh=chiÅ„ski pt: af=Afrikaans/ca=Catalã/cs=Checo/da=Dinamarquês/de=Alemão/en=Inglês/eo=Esperanto/es=Espanhol/et=Estoniano/fi=Finlandês/fr=Francês/he=Hebreu/is=Islandês/it=Italiano/lv=Lituano/nl=Holandês/no=Norueguês/oc=Occitano/pl=Polonês/pt=Português/pt-br=Português-do-Brasil/ru=Russo/sv=Sueco/zh=Chinês pt-br: af=Afrikaner/ca=Catalão/cs=Checo/da=Dinamarquês/de=Alemão/en=Inglês/eo=Esperanto/es=Espanhol/et=Estoniano/fi=Finlandês/fr=Francês/he=Hebreu/is=Islandês/it=Italiano/lv=Lituano/nl=Holandês/no=Norueguês/oc=Occitano/pl=Polonês/pt=Português/pt-br=Português-do-Brasil/ru=Russo/sv=Sueco/zh=Chinês ro: af=africaans/ca=catalana/cs=checha/da=daneza/de=germana/en=engleza/eo=esperanto/es=spaniola/fi=finlandeza/fr=franceza/he=evreiasca/is=islandeza/it=italiana/nl=olandeza/no=norvegiana/oc=occitana/pl=poloneza/pt=potugeza/pt-br=portugeza-in-brazilia/ro=romaneste/ru=rusa/sv=suedeza/zh=chineza ru: af=африканÑкий/bg=болгарÑкий/ca=каталанÑкий/cs=чешÑкий/da=датÑкий/de=немецкий/en=английÑкий/eo=ÑÑперанто/es=иÑпанÑкий/et=ÑÑтонÑкий/fi=финÑкий/fr=французÑкий/he=иврит/is=иÑландÑкий/it=итальÑнÑкий/lv=латышÑкий/nl=голландÑкий/no=норвежÑкий/oc=окÑитанÑкий/pl=польÑкий/pt=португальÑкий/pt-br=бразильÑко-португальÑкий/ru=руÑÑкий/sl=ÑлавÑнÑкий/sv=шведÑкий/zh=китайÑкий sk: af=afrikánÄina/bg=bulharÄina/cs=ÄeÅ¡tina/da=dánÄina/de=nemÄina/en=angliÄtina/eo=esperanto/es=Å¡panielÄina/fi=fínÅ¡tina/fr=francúzÅ¡tina/he=hebrejÄina/is=islandÄina/it=talianÄina/lv=lotyÅ¡tina/nl=holandÄina/no=nórÄina/oc=okcitánÄina/pt=portugalÄina/pt-br=brazílÄina/ru=ruÅ¡tina/sv=Å¡védÄina/zh=ÄínÅ¡tina sl: af=afrikaanÅ¡Äina/ca=katalonÅ¡Äina/cs=ÄeÅ¡Äina/da=danÅ¡Äina/de=nemÅ¡Äina/en=angleÅ¡Äina/eo=esperanto/es=Å¡panÅ¡Äina/et=estonÅ¡Äina/fi=finÅ¡Äina/fr=francoÅ¡Äina/he=hebrejÅ¡Äina/is=islandÅ¡Äina/it=italijanÅ¡Äina/lv=litvanÅ¡Äina/nl=nizozemÅ¡Äina/no=norveÅ¡Äina/oc=okcitanÅ¡Äina/pl=poljÅ¡Äina/pt=portugalÅ¡Äina/pt-br=brazilska-portugalÅ¡Äina/ru=ruÅ¡Äina/sl=slovenÅ¡Äina/sv=Å¡vedÅ¡Äina/zh=kitajÅ¡Äina sv: af=afrikaans/bg=bulgariska/br=bretonska/ca=katalanska/cs=tjeckiska/da=danska/de=tyska/en=engelska/eo=esperanto/es=spanska/et=estniska/fi=finska/fr=franska/he=hebreiska/is=isländska/it=italienska/lv=litauiska/nl=holländska/no=norska/oc=occitanska/pl=polska/pt=portugisiska/pt-br=brasiliansk-portugisiska/ro=rumänska/ru=ryska/sl=slovenska/sv=svenska/zh=kinesiska zh: fr=法语/zh=中文/oc=奥克语 the first branch af: om die eerste staak te sien bg: за да видите Ð¿ÑŠÑ€Ð²Ð¸Ñ ÐºÐ»Ð¾Ð½ br: evit gwelout ar skourr kentañ ca: per veure la primera branca cs: abyste vidÄ›li první da: for at se den første de: Erster Zweig en: first line eo: por vidi la unuan branĉon es: la primera rama et: esimese haru vaatamiseks fi: ensimmäinen sukuhaara fr: la première he: לר×ות ×ת ×”×¢× ×£ הר×שון is: til að sjá fyrstu grein it: il primo ramo lv: skatÄ«t pirmo zaru nl: de eerste tak no: den første grenen oc: la primièra branca pl: aby zobaczyć pierwszÄ… liniÄ™ (gałąź) pt: para ver o primeiro ramo ro: pentru a vedea primul ru: чтобы увидеть первую ветку sk: aby ste videli prvú vetvu sl: za prikaz prve veje sv: den första grenen to see the first branch af: om die eerste staak te sien bg: за да видите Ð¿ÑŠÑ€Ð²Ð¸Ñ ÐºÐ»Ð¾Ð½ br: evit gwelout ar skourr kentañ ca: per veure la primera branca cs: abyste vidÄ›li první da: for at se den første de: , um den ersten zu sehen en: to see the first one eo: por vidi la unuan branĉon es: para ver la primera rama et: esimese haru vaatamiseks fi: nähdäksesi ensimmäisen haaran fr: pour voir la première he: לר×ות ×ת ×”×¢× ×£ הר×שון is: til að sjá fyrstu grein it: per vedere il primo lv: skatÄ«t pirmo zaru nl: om de eerste tak te zien no: for Ã¥ se den første oc: per veire la primièra branca pl: aby zobaczyć pierwszÄ… liniÄ™ (gałąź) pt: para ver o primeiro ramo ro: pentru a vedea primul ru: чтобы увидеть первую ветку sk: aby ste videli prvú vetvu sl: za prikaz prve veje sv: för att se den första to see the first relationship link af: om die eerste te sien bg: за да видите първата родÑтвена връзка br: evit gwelout al liamm kentañ ca: per veure el primer vincle de parentesc cs: zobrazit první da: for at se det første de: , um die erste zu sehen en: to see the first one eo: por vidi la unuan ligon de parenceco es: para ver el primer vínculo de parentesco et: esimese sugulussuhte vaatamiseks fi: nähdäksesi ensimmäisen sukulaisuuden fr: pour voir le premier he: לר×ות ×ת הקשר המשפחתי הר×שון is: til að sjá fyrstu tengsl it: per vedere il primo lv: skatÄ«t pirmo attiecÄ«bu saiti nl: om de eerste te zien no: for Ã¥ se den første oc: per veire lo primièr ligam de parentatge pl: aby zobaczyć pierwszÄ… liniÄ™ pokrewieÅ„stwa pt: para ver o primeiro link ro: pentru a vedea prima relatie ru: чтобы увидеть первую ÑвÑзь Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ sk: zobraziÅ¥ prvý vzÅ¥ah sl: za prikaz prve sorodstvene povezave sv: för att se den första to try again with this number af: om weer te probeer met die nommer bg: за опит Ñ Ñ‚Ð¾Ð·Ð¸ номер br: evit esaiñ en-dro gant an niverenn-se ca: per tornar a provar aquest número cs: zkusit znovu s tímto Äíslem da: for at forsøge igen med dette nummer de: , um es mit dieser Nummer nochmals zu versuchen en: to try again with this number eo: por reprovi kun ĉi tiu numero es: para ensayar de nuevo con este número et: , proovimaks uuesti selle numbriga fi: yrittääksesi uudelleen tällä numerolla fr: pour réessayer avec ce numéro he: לנסות שוב ×¢× ×”×ž×¡×¤×¨ ×”×–×” is: til að reyna þetta aftur með þessu númeri it: per provare di nuovo con questo numero lv: mēģiniet vÄ“lreiz ar Å¡o nummuru nl: , om dit nummer weer te proberen no: for Ã¥ prøve igjen med dette nummeret oc: per tornar ensajar amb aquel numèro pl: aby ponowić z tym numerem pt: para tentar novamente com este número ro: incearca din nou cu acest numar ru: Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы пытатьÑÑ Ñнова Ñ Ñтим чиÑлом sk: skúsiÅ¥ znovu s týmto Äíslom sl: za ponoven poskus s to Å¡tevilko sv: för att försöka igen med detta nummer %1 of %2 af: %1 van %2 bg: %1 на :a:%2 br: %1 eus %2 ca: %1 de %2 cs: %1 :g:%2 da: %1 til %2 de: %1 von :d:%2 en: %1 of %2 eo: %1 de %2 es: %1 de %2 et: :g:%2 %1 fi: :g:%2 %1 fr: %1 d[e']%2 he: %1 של %2 is: %1 %2 it: %1 d[i']%2 lv: %1 -> %2 nl: %1 van %2 no: %1 til %2/%1 av %2 oc: %1 de %2 pl: %1 :g:%2 pt: %1 de %2 ro: %1 pentru %2 ru: %1 :g:%2 sk: %1 :g:%2 sl: %1 od :g:%2 sv: %1 till %2 %d %s starting with %s de: %d %s beginnend mit "%s" en: %d %s starting with "%s" es: %d %s comenzando con "%s" fi: %d %s ensimmäisenä "%s" fr: %d %s commençant par "%s" it: %d %s partendo da "%s" nl: %d %s beginnend met "%s" no: %d %s som starter med "%s" oc: %d %s que comença amb "%s" pt: %d %s começados por '%s' sv: %d %s som börjar med "%s" %d years ago af: %d jaar gelede bg: преди %d години br: %d vloaz 'zo ca: fa %d anys cs: pÅ™ed %d rokem;lety da: for %d Ã¥r siden de: vor %d Jahren en: %d years ago eo: antaù %d jaroj es: hace %d años et: %d aastat tagasi fi: %d vuotta sitten fr: il y a %d ans he: לפני %d ×©× ×™× is: fyrir %d árum síðan it: ha %d anni lv: %d gadus atpakaļ nl: %d jaar geleden no: %d Ã¥r siden oc: %d ans fa pl: przed %d laty pt: há %d anos ro: de %d ani ru: %d лет назад sk: pred %d rokmi sl: pred %d leti sv: %d Ã¥r sedan %s access cancelled for that page bg: отменен доÑтъп като %s за тази Ñтраница cs: pristup pro tuto stranku byl zruseny de: Zugang für %s wurde gelöscht en: %s access cancelled for that page eo: %s aliro ne estas ebla por la paÄo es: acceso %s anulado para esta página et: %s: ligipääs sellele lehele on keelatud fi: %s pääsy sivulle peruttu fr: accès %s annulé pour cette page he: דף ×–×” ×—×¡×•× ×‘×¤× ×™×š. הגישה מוגבלת %s ×“×¤×™× it: accesso %s annullato per questa pagina lv: %s piekļuve Å¡ai lapai ir pÄrtraukta nl: %s toegang gewist voor deze pagina no: du har ikke lenger tilgang til denne siden %s oc: accès %s anullat per aquela pagina pl: dostÄ™p %s anulowany dla tej strony pt: acesso %s cancelado para aquela página ro: %s acces anulat la această pagină ru: доÑтуп %s к Ñтой Ñтранице запрещён sl: %s nima dostopa do te strani sv: du har inte längre tillträde till denna sida %s %s cousins af: neefs en niggies %s geslagte verwyder bg: %sи братовчеди br: kendirvi en %s derez ca: cosins de %s grau cs: %s bratranci/sestÅ™enice da: fætre og kusiner af %s grad de: Cousins %s Grades en: %s cousins eo: %s gradaj gekuzoj es: primos de %s grado et: %s nõod fi: %s serkut fr: cousins au %s degré he: בני ×“×•×“×™× ×œ×“×¨×’×” ×”%s is: skyld í %s lið it: cugini di %s grado lv: %s brÄlÄ“ni/mÄsÄ«cas nl: neven en nichten in de %s graad no: %s søskenbarn oc: cosins del %s gra pl: kuzyni %s stopnia pt: primos em %s grau ro: veri de gradul %s ru: %s кузены sk: %s bratranci/sesternice sl: %s bratranci/sestriÄne sv: %smänningar %s forbidden char da: forkert karakter (%s) brugt i efternavn/fornavn de: ungültiges Zeichen (%s) im nachname/vorname en: invalid character (%s) used in surname/first name es: carácter inválido (%) en la apellido/nombre fi: olet kättänyt sopimatonta merkkiä (%s) sukunimi/etunimi fr: caractères interdits (%s) dans le patronyme/prénom it: carattere non valido (%s) nella cognome/nome nl: ongeldig karakter (%s) in familienaam/voornaam no: etternavn/fornavn du skrev inn, inneholder ugyldige tegn (%s) oc: caractèrs enebits (%s) dins lo nom o lo prenom sv: Ogiltigt tecken (%s) i efternamn/förnamn %s modified de: %s geändert en: %s modified es: %s modificada fi: %s muokattu fr: %s modifié it: %s modificata nl: %s veranderd no: %s er endret oc: %s modificat/da pt: %s modificado sv: %s ändrad %s, it is %s of af: %s, dit is %s van bg: %s, е %s на br: %s, bez ez eo %s eus ca: %s, és %s de cs: %s, je %s da: %s, er det %s til de: %s ist %s von en: %s, is %s of eo: %s, estas %s de es: %s, es %s de et: %s, on %s fi: %s, on %s fr: %s, c’est %s de he: %s, ×–×” %s של is: %s, er %s it: %s, è %s di lv: %s, tas ir %s nl: %s is het %s van no: %s, er det %s til oc: %s, es %s de pl: %s, jest %s pt: %s, é %s de ro: %s, este %s pentru ru: %s, Ñто %s sk: %s, je %s sl: %s, je %s od sv: %s, är det %s till %s, it will be %s of af: %s, dit sal wees %s van bg: %s, ще бъде %s на br: %s, bez e vo %s eus ca: %s, serà %s de cs: %s, bude %s da: %s, er det %s til de: %s ist %s von en: %s, will be %s of eo: %s, estos %s de es: %s, será %s de et: %s, on %s fi: %s, on %s fr: %s, ce sera %s de he: %s , ×™×”×™×” %s של is: %s, verða %s it: %s, sarà %s di lv: %s, tas bÅ«s %s nl: %s zal het %s zijn van no: %s, vil det bli %s til oc: %s, serà %s de pl: %s, bÄ™dzie %s pt: %s, será %s de ro: %s, va fi %s pentru ru: %s, Ñто будет %s sk: %s, bude %s sl: %s, bo %s od sv: %s, är det %s till %t already has parents af: %t het reeds ouers bg: %t вече има родители br: %t en deus kerent endeo ca: els pares de %t ja existeixen cs: %t už má rodiÄe da: %t har allerede forældre de: %t hat schon Eltern en: %t already has parents eo: %t havas jam gepatrojn es: los padres de %t ya existen et: isikul %t on juba vanemad fi: henkilöllä %t on jo vanhemmat fr: %t a déjà des parents he: ל- %t יש כבר ×”×•×¨×™× is: %t er þegar með foreldra it: %t ha già dei genitori lv: %t jau ir vecÄki nl: %t heeft al ouders no: %t har allerede foreldre oc: los parents de %t existisson ja pl: %t już ma rodziców pt: os pais de %t já existem ro: %t are deja parinti ru: %t уже имеет родителей sk: %t už má rodiÄov sl: %t že ima starÅ¡e sv: %t har redan föräldrar %t died before his/her birth af: %t is dood voor sy/haar geboorte bg: %t умира преди раждането Ñи br: %t zo marv a-raok e c'h(he g)anedigezh ca: %t va morir abans del seu naixement cs: %t zemÅ™el pÅ™ed svým narozením/zemÅ™ela pÅ™ed svým narozením da: %t er døde før fødslen de: %t ist vor der Geburt gestorben en: %t died before his/her birth eo: %t mortis antaù sia naskiÄo es: %t ha muerto antes de su nacimiento et: %t suri enne oma sündi fi: %t on kuollut ennen syntymäänsä fr: %t est mort(e) avant sa naissance he: %t מת לפני הולדתו/הולדתה is: %t lést áður en hann/hún fæddist it: %t sarebbe morto prima della sua nascita lv: %t miris pirms viņš/viņa dzimusi nl: %t zou dood zijn voor zijn/haar geboorte no: %t døde før sin fødsel oc: %t moriguèt abans la naissença pl: %t zmarÅ‚ przed swymi narodzinami/zmarÅ‚a przed swymi narodzinami pt: %t morreu antes de nascer ro: %t a murit inaninte de nastere ru: %t умер перед его/ее рождением sk: %t zomrel pred svojim narodením/zomrela pred svojim narodením sl: %t je umrl pred svojim rojstvom/umrla pred svojim rojstvom sv: %t dog före sin egen födelse %t has incorrect title dates: %t af: %t die datum voor sy titel is verkeerd: %t bg: %t има некоректни данни за титла: %t br: %t en(he) deus deiziadoù-tiltloù direizh : %t ca: %t té les dates d'un títol incorrectes cs: %t má nesprávné údaje o titulech: %t da: %t har ukorrekte titeldatoangivelser: %t de: die Datumsangaben eines Titels von %t sind falsch: %t en: %t has incorrect title dates: %t eo: la nobeltitolaj datoj de %t estas malkorektaj: %t es: las fechas de un título de %t son incorrectas: %t et: isiku %t tiitli kuupäev %t on vigane fi: henkilön %t arvonimen päivämäärässä %t on virhe fr: %t a des dates de titre incorrectes : %t he: ת××¨×™×›×™× ×œ×ª××¨×™× ×©×œ %t ××™× × × ×›×•× ×™×: %t is: %t hefur vitlausa dagsetningu %t it: alcune date dei titoli di %t sono incorrette: %t lv: %t ir nekorekti datumi: %t nl: %t de data voor titels zijn niet correct no: %t har feil titeldato %t oc: %t a las datas d'un títol incorrèctas: %t pl: %t ma wpisane nieprawidÅ‚owe daty używania tytuÅ‚u pt: as datas de um título de %t não estão correctas pt-br: as datas de um título de %t não estão corretas ro: %t are data de titlu incorrecta %t ru: %t имеет неправильное название даты: %t sk: %t má nesprávne údaje o tituloch: %t sl: %t ima napaÄne datume naslova sv: %t har felaktiga titeldatum: %t %t is born after the death of his/her mother %t af: %t is gebore na die afsterwe van sy/haar moeder %t bg: %t ражда Ñе Ñлед Ñмъртта на майка Ñи %t br: %t a zo bet ganet goude marv e vamm (he mamm) %t ca: %t va néixer després de la mort de la seva mare cs: %t narozen/narozena po smrti své matky %t da: %t er født efter moderens død %t de: %t ist nach dem Tod der Mutter %t geboren en: %t is born after the death of his/her mother %t eo: %t naskiÄis post la morto de sia patrino %t es: %t ha nacido después de la muerte de su madre %t et: %t on sündinud pärast oma ema %t surma fi: %t on syntynyt äitinsä kuoleman jälkeen %t fr: %t est né(e) après la mort de sa mère %t he: %t נלד(×”) ×חרי מוות ×”×× is: %t er fædd(ur) eftir andlát móður sinnar %t it: %t sarebbe nato dopo la morte di sua madre %t lv: %t dzimis pÄ“c viņa/viņas mÄtes nÄves %t nl: %t zou geboren zijn na de dood van zijn/haar moeder %t no: %t er født etter sin mors død %t oc: %t es nascut/da après la mòrt de la maire pl: %t urodziÅ‚ siÄ™/urodziÅ‚a siÄ™ po Å›mierci swojej matki: %t pt: %t nasceu depois do óbito da mãe ro: %t e nascut dupa decesul mamei ru: %t родилÑÑ Ð¿Ð¾Ñле Ñмерти его/ее матери %t sk: %t narodený/narodená po smrti svojej matky %t sl: %t je rojen(a) po smrti svoje matere sv: %t är född efter att sin egen mor dog %t %t is born more than 2 years after the death of his/her father %t af: %t is gebore meer as 2 jaar na die afsterwe van sy/haar vader %t bg: %t Ñе ражда по-къÑно от две години Ñлед Ñмъртта на баща Ñи %t br: %t a zo bet ganet ouzhpenn daou vloaz goude marv e dad (he zad) %t ca: %t va néixer més de dos anys després de la mort del seu pare cs: %t narozen/narozena více než dva roky po smrti svého otce: %t da: %t er født senere end 2 Ã¥ efter faderens død %t de: %t ist mehr als 2 Jahre nach dem Tod des Vaters %t geboren en: %t is born more than 2 years after the death of his/her father %t eo: %t naskiÄis pli ol 2 jaroj post la morto de sia patro %t es: %t ha nacido más de 2 años después de la muerte de su padre % et: %t on sündinud enam kui 2 aastat pärast oma isa %t surma fi: %t on syntynyt yli 2 vuotta isänsä kuoleman jälkeen %t fr: %t est né(e) plus de 2 ans après la mort de son père %t he: %t נלד(×”) יותר ×ž×©× ×ª×™×™× ×חרי מוות ×”×ב is: %t er fædd(ur) meira en 2 árum eftir andlát föður síns %t it: %t sarebbe nato più di 2 anni dopo la morte di suo padre %t lv: %t ir dzimis vairÄk kÄ 2 gadus pÄ“c sava tÄ“va nÄves %t nl: %t is geboren meer dan twee jaar na de dood van zijn/haar vader no: %t er født mer enn 2 Ã¥r etter sin fars død %t oc: %t es nascut/da mai de dos ans après la mòrt del paire pl: %t urodziÅ‚ siÄ™/urodziÅ‚a siÄ™ ponad 2 lata po Å›mierci swojego ojca: %t pt: %t nasceu mais de 2 anos depois do óbito do pai ro: %t e nascut mai mult de doi ani dupa decesul tatalui ru: %t родилÑÑ Ð±Ð¾Ð»ÐµÐµ, чем через 2 года поÑле Ñмерти его/ее отца %t sk: %t narodený/narodená viac ako dva roky po smrti svojho otca: %t sl: %t je rojen(a) veÄ kot 2 leti po smrti svojega oÄeta sv: %t är född mer än 2 Ã¥r efter att sin egen far dog %t %t was witness after his/her death de: %t war Zeitzeuge nach seinem Tod en: %t was a witness after their death es: %t era testigo tras su muerte fi: %t oli todistaja hänen kuolemansa jälkeen fr: %t était témoin après sa mort it: %t era testimone dopo la sua morte nl: %t was getuige na zijn overlijden no: %t var vitne etter deres død oc: %t foguèt testimòni après la mòrt pt: %t foi testemunha após a sua morte sv: %t var vittne vid hennes/hans död %t was witness before his/her birth de: %t war Zeitzeuge vor seiner Geburt en: %t was a witness before their birth es: %t era testigo antes de su nacimiento fi: %t oli todistaja ennen hänen syntymäänsä fr: %t était témoin avant sa naissance it: %t era testimone prima della sua nascita nl: %t was getuige voor zijn geboorte no: %t var vitne før deres fødsel oc: %t foguèt testimòni abans la naissença pt: %t foi testemunha antes do seu nascimento sv: %t var vittne innan hennes/hans död %t's sex is not coherent with his/her relations af: %t se geslag stem nie ooreen met sy/haar verwantskap nie bg: полът на %t не Ñе ÑъглаÑува Ñ Ð¿Ð¾Ñочените Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ br: reizh %t ne glot ket gant al liammoù anezhañ(anezhi) ca: el sexe de %t no és coherent amb les seves relacions cs: pohlaví %t se neshoduje s jeho/jejími vztahy da: %t's køn er ikke kohærent med hans/hendes forbindelser de: %t's Geschlecht stimmt nicht mit ihren/seinen Beziehungen überein en: %t's sex is not coherent with his/her relations eo: la sekso de %t ne koheras kun siaj rilatoj es: el género de %t es incoherente con sus relaciones et: isiku %t sugu ei sobi tema suhetega fi: henkilön %t sukupuoli ja hänen suhteensa eivät täsmää fr: le sexe de %t n’est pas cohérent avec ses relations he: המין של %t ×œ× ×ž×ª××™× ×œ×™×—×¡×™×•/ליחסיה is: kyn %t er ekki í samræmi við skyldleika it: il sesso di %t non e' coerente con le sue relazioni lv: personas %t neatbilst viņa/viņas attiecÄ«bÄm nl: het geslacht van %t klopt niet met zijn/haar relaties no: %ts kjønn er uforenlig med forbindelsene hans/hennes oc: lo sèxe de %t es pas coerent amb las relacions pl: %t: jego/jej pÅ‚eć nie odpowiada jego/jej zwiÄ…zkom pt: o sexo de %t não é coerente com suas relações ro: %t are genul incoerent cu relatia ru: пол %t не ÑтыкуетÑÑ Ñ ÐµÐ³Ð¾/ее взаимоотношениÑми sk: pohlavie %t sa nezhodnuje s jeho/jej vzÅ¥ahmi sl: spol %t ni usklajen z zvezami sv: %ts kön stämmer inte överens med sina relationer (date) af: 1 %m %y/%d %m %y/%m %y/%y ar: 1 %m %y/%d %m %y/%m %y/%y bg: 1 %m %y/%d %m %y/%m %y/%y br: 1añ %m %y/%d %m %y/%m %y/%y ca: 1 d[e']%m de %y/%d d[e']%m de %y/%m de %y/%y cs: 1. %m %y/%d. %m %y/%m %y/%y da: 1. %m %y/%d. %m %y/%m %y/%y de: 1. %m %y/%d. %m %y/%m %y/%y en: 1 %m %y/%d %m %y/%m %y/%y eo: 1an de %m %y/%da de %m %y/%m %y/%y es: 1 de %m %y/%d de %m %y/%m %y/%y et: 1. %m %y/%d. %m %y/%m %y/%y fi: 1. %mta %y/%d. %mta %y/%mssa %y/%y fr: 1er %m %y/%d %m %y/%m %y/%y he: 1 %m %y/%d %m %y/%m %y/%y is: 1 %m %y/%d %m %y/%m %y/%y it: 1o %m %y/%d %m %y/%m %y/%y lv: 1. %m %y/%y.gada %d.%m/%y %m/%y nl: 1 %m %y/%d %m %y/%m %y/%y no: 1. %m %y/%d. %m %y/%m %y/%y oc: 1èr d[e']%m de %y/%d d[e']%m de %y/%m de %y/%y pl: 1 %m %y/%d %m %y/%m %y/%y pt: 1 de %m de %y/%d de %m de %y/%m %y/%y ro: 1 %m %y/%d. %m %y/%m %y/%y ru: 1 %m %y/%d %m %y/%m %y/%y sk: 1. %m %y/%d. %m %y/%m %y/%y sl: 1. %m %y/%d. %m %y/%m %y/%y sv: 1 %m %y/%d %m %y/%m %y/%y zh: %yå¹´%m1æ—¥/%yå¹´%m%dæ—¥/%yå¹´%m/%yå¹´ (decimal separator) af: , bg: , br: , ca: , cs: , da: , de: , en: . eo: , es: , et: , fi: , fr: , he: . is: , it: , lv: , nl: , no: , oc: , pl: , pt: , ro: , ru: . sk: , sl: , sv: , (french revolution month) bg: вандемиер/брюмер/фример/нивоз/плювиоз/вантоз/жерминал/флореал/прериал/меÑидор/термидор/фруктидор/добавка br: miz ar vañdech (vañdemier)/miz brumer/miz frimer/miz an erc'h (nivoz)/miz ar glav (pluvioz)/miz vañtoz/miz ar sev (jerminal)/miz ar bleuñv (floreal)/miz ar pradeier (prerial)/miz an eost (mesidor)/miz termidor/miz fruktidor/miz komplemanter ca: vendémiaire/brumaire/frimaire/nivôse/pluviôse/ventôse/germinal/floréal/prairial/messidor/thermidor/fructidor/complémentaire cs: Vendémiaire/Brumaire/Frimaire/Nivôse/Pluviôse/Ventôse/Germinal/Floréal/Prairial/Messidor/Thermidor/Fructidor/Complémentaire da: vendémiaire/brumaire/frimaire/nivôse/pluviôse/ventôse/germinal/floréal/prairial/messidor/thermidor/fructidor/complémentaire de: Vendemiaire/Brumaire/Frimaire/Nivose/Pluviose/Ventose/Germinal/Floreal/Prairial/Messidor/Thermidor/Fructidor/Extra en: Vendemiaire/Brumaire/Frimaire/Nivose/Pluviose/Ventose/Germinal/Floreal/Prairial/Messidor/Thermidor/Fructidor/Extra eo: vendemjero/brumero/frimero/nivozo/pluvjozo/ventozo/germinalo/florealo/prerialo/mesidoro/termindoro/fructidoro/suplemento es: vendimiario/brumario/frimario/nevoso/pluvioso/ventoso/germinal/floreal/pradial/mesidor/termidor/fructidor/complementario et: vandemjäär/brümäär/frimäär/nivoos/plüvioos/vantoos/žerminaal/floreaal/preriaal/messidoor/termidoor/früktidoor/komplementäär fi: vendémiaire/brumaire/frimaire/nivôse/pluviôse/ventôse/germinal/floréal/prairial/messidor/thermidor/fructidor/complémentaire fr: vendémiaire/brumaire/frimaire/nivôse/pluviôse/ventôse/germinal/floréal/prairial/messidor/thermidor/fructidor/complémentaire he: וונדמי××™×ר / ברומ××™×ר / פרימ××™×ר / ניבוז / פלוביוז / ×’'רמינ×ל / פלורי×ל / פר×רי×ל / מסידור / תרמידור / פרוקטידור / נוסף is: vínyrkjumánuður/þokumánuður/hrímmánuður/snjómánuður/regnmánuður/vindmánuður/frjóangamánuður/blómmánuður/engmánuður/uppskerumánuður/hitamánuður/aldinmánuður/hlaupársdagar it: vendemmiaio/brumaio/frimaio/nevoso/piovioso/ventoso/germinale/fiorile/pratile/ messidoro/termidoro/fruttidoro/complementare lv: vendemiaire/brumaire/frimaire/nivose/pluviose/ventose/germinal/floreal/prairial/messidor/thermidor/fructidor/complementaire nl: vendémiaire/brumaire/frimaire/nivôse/pluviôse/ventôse/germinal/floréal/prairial/messidor/thermidor/fructidor/complémentaire no: vendémiaire/brumaire/frimaire/nivôse/pluviôse/ventôse/germinal/floréal/prairial/messidor/thermidor/fructidor/complémentaire oc: vendémiaire/brumaire/frimaire/nivôse/pluviôse/ventôse/germinal/floréal/prairial/messidor/thermidor/fructidor/complémentaire pl: Vendemiaire/Brumaire/Frimaire/Nivose/Pluviose/Ventose/Germinal/Floreal/Prairial/Messidor/Thermidor/Fructidor/Extra pt: Vindimiário/Brumário/Frimário/Nevoso/Pluvioso/Ventoso/Germinal/Floreal/Pradial/Messidor/Termidor/Frutidor/Complementar ro: Vendemiaire/Brumaire/Frimaire/Nivose/Pluviose/Ventose/Germinal/Floreal/Prairial/Messidor/Thermidor/Fructidor/Extra ru: Вандемиер/БрюмÑÑ€/ФримÑÑ€/Ðивоз/Плювиоз/Вантоз/Жерминаль/Флореаль/ПрериÑль/МеÑÑидор/ТÑрмидор/Фрюктидор sk: Vendémiaire/Brumaire/Frimaire/Nivôse/Pluviôse/Ventôse/Germinal/Floréal/Prairial/Messidor/Thermidor/Fructidor/Complémentaire sl: vendémiaire/brumaire/frimaire/nivôse/pluviôse/ventôse/germinal/floréal/prairial/messidor/thermidor/fructidor/complémentaire sv: vendémiaire/brumaire/frimaire/nivôse/pluviôse/ventôse/germinal/floréal/prairial/messidor/thermidor/fructidor/komplementär (hebrew month) af: Tisjri/Hesjvan/Kislev/Tevet/Sjevat/Adar I/Adar II/Nisan/Ijjar/Sivan/Tammus/Av/Elul bg: тишри/хешван/киÑлев/тевет/шеват/адар I/адар II/ниÑан/иÑÑ€/Ñиван/тамуз/ав/елул br: tichri/marhechvan/kislev/tevet/chevat/adar 1/adar 2/nissan/iyar/sivan/tamouz/av/eloul ca: tichri/marhechvan/kislev/tevet/chevat/adar 1/adar 2/nissan/iyar/sivan/tamouz/av/eloul cs: Tishri/Heshvan/Kislev/Tevet/Shevat/Adar I/Adar II/Nisan/Iyyar/Sivan/Tammuz/Av/Elul da: tishri/heshvan/kislev/tevet/shevat/adar I/adar II/nisan/iyyar/sivan/tammuz/av/elul de: Tischri/Marcheschwan/Kislev/Tebet/Schebat/Adar/WeAdar/Nisan/Ijar/Siwan/Tammuz/Ab/Elul en: Tishri/Heshvan/Kislev/Tevet/Shevat/Adar I/Adar II/Nisan/Iyyar/Sivan/Tammuz/Av/Elul eo: tiÅrio/heÅvano/kislevo/teveto/Åevato/adaro 1/adaro 2/nisano/ijaro/sivano/tamuzo/avo/elulo es: tishri/marjeshvan o jeshvan/kislev/tevet/shevat/adar /( + adar sheni, adar bet o ve-adar)/nisan/iyar/sivan/tamuz/av/elul et: tishrei/chesvan/kislev/tevet/shvat/adar I/adar II/nisan/iyyar/sivan/tammuz/av/elul fi: TiÅ¡rì/HeÅ¡ván/Kislév/Tevét/Sevat/Adár/Adár II/Nisán/Ijjár/Siván/Tammúz/Ab/Elúl fr: tichri/marhechvan/kislev/tevet/chevat/adar 1/adar 2/nissan/iyar/sivan/tamouz/av/eloul he: תשרי/ חשון/ כסלו/ טבת/ שבט/ ×דר ×'/ ×דר ב'/ ניסן/ ×ייר/ סיון/ תמוז/ ×ב/ ×לול is: tísrí/marhesvan/kíslev/tebet/sebat/adar 1/adar 2/nísan/ijjar/sívan/tammús/ab/elúl it: Tishri/Heshvan/Kislev/Tevet/Shevat/Adar 1/Adar 2/Nisan/Iyar/Sivan/Tammuz/Av/Elul lv: Tishri/Heshvan/Kislev/Tevet/Shevat/Adar I/Adar II/Nisan/Iyyar/Sivan/Tammuz/Av/Elul nl: Tishri/Marcheswan/Kislew/Tebeth/Shebat/Adar/Adar2/Niesan/Ijjar/Siwan/Tammuz/Ab/Elul no: tishri/heshvan/kislev/tevet/shevat/adar I/adar II/nisan/iyyar/sivan/tammuz/av/elul oc: tichri/marhechvan/kislev/tevet/chevat/adar 1/adar 2/nissan/iyar/sivan/tamouz/av/elol pl: tishri/heshvan/kislev/tevet/shevat/adar I/adar II/nisan/iyyar/sivan/tammuz/av/elul pt: Tishrei/Cheshvan/Kislev/Tevet/Shevat/Adar I/Adar II/Nissan/Iyar/Sivan/Tamuz/Av/Elul ro: Tischri/Marcheschwan/Kislev/Tebet/Schebat/Adar/WeAdar/Nisan/Ijar/Siwan/Tammuz/Ab/Elul ru: Тишри/Хешван/КиÑлев/Тевет/Шеват/Ðдар 1/Ðдар 2/ÐиÑан/ИÑÑ€/Сиван/Таммуз/Ðв/Элюль sk: Tishri/Heshvan/Kislev/Tevet/Shevat/Adar I/Adar II/Nisan/Iyyar/Sivan/Tammuz/Av/Elul sl: tichri/marhechvan/kislev/tevet/chevat/adar 1/adar 2/nissan/iyar/sivan/tamouz/av/eloul sv: tishri/heshvan/kislev/tevet/shevat/adar I/adar II/nisan/iyyar/sivan/tammuz/av/elul (month) af: Januarie/Februarie/Maart/April/Mei/Junie/Julie/Augustus/September/Oktober/November/Desember ar: جانÙÙŠ/ÙÙŠÙØ±ÙŠ/مارس/Ø£ÙØ±ÙŠÙ„/ماي/جوان/جويلية/أوت/سبتمبر/أكتوبر/نوÙمبر/ديسمبر bg: Ñнуари/февруари/март/април/май/юни/юли/авгуÑÑ‚/Ñептември/октомври/ноември/декември br: genver/c'hwevrer/meurzh/ebrel/mae/mezheven/gouere/eost/gwengolo/here/du/kerzu ca: gener/febrer/març/abril/maig/juny/juliol/agost/setembre/octubre/novembre/desembre cs: ledna/února/bÅ™ezna/dubna/kvÄ›tna/Äervna/Äervence/srpna/září/října/listopadu/prosince da: januar/februar/marts/april/maj/juni/juli/august/september/oktober/november/december de: Januar/Februar/März/April/Mai/Juni/Juli/August/September/Oktober/November/Dezember en: January/February/March/April/May/June/July/August/September/October/November/December eo: januaro/februaro/marto/aprilo/majo/junio/julio/aÅ­gusto/septembro/oktobro/novembro/decembro es: enero/febrero/marzo/abril/mayo/junio/julio/agosto/septiembre/octubre/noviembre/diciembre et: jaanuar:i:+il:s:+is:p:+i/veebruar:i:+il:s:+is:p:+i/märts:i:+il:s:+is:p:+i/aprill:i:+il:s:+is:p:+i/mai:i:+l:s:+s:p:+d/juuni:i:+l:s:+s:p:+t/juuli:i:+l:s:+s:p:+t/august:i:+il:s:+is:p:+it/september:i:--ril:s:--ris:p:--rit/oktoober:i:--ril:s:--ris:p:--rit/november:i:--ril:s:--ris:p:--rit/detsember:i:--ril:s:--ris:p:--rit fi: tammikuu/helmikuu/maaliskuu/huhtikuu/toukokuu/kesäkuu/heinäkuu/elokuu/syyskuu/lokakuu/marraskuu/joulukuu fr: janvier/février/mars/avril/mai/juin/juillet/août/septembre/octobre/novembre/décembre he: ינו×ר/ פברו×ר/ מרץ/ ×פריל/ מ××™/ יוני/ יולי/ ×וגוסט/ ספטמבר/ ×וקטובר/ נובמבר/ דצמבר is: janúar/febrúar/mars/apríl/mai/júní/júlí/ágúst/september/oktober/nóvember/desember it: gennaio/febbraio/marzo/aprile/maggio/giugno/luglio/agosto/settembre/ottobre/novembre/dicembre lv: janvÄris/februÄris/marts/aprÄ«lis/maijs/jÅ«nijs/jÅ«lijs/augusts/septembris/oktobris/novembris/decembris nl: januari/februari/maart/april/mei/juni/juli/augustus/september/oktober/november/december no: januar/februar/mars/april/mai/juni/juli/august/september/oktober/november/desember oc: genièr/febrièr/març/abril/mai/junh/julhet/agost/setembre/octobre/novembre/decembre pl: I/II/III/IV/V/VI/VII/VIII/IX/X/XI/XII pt: Janeiro/Fevereiro/Março/Abril/Maio/Junho/Julho/Agosto/Setembro/Outubro/Novembro/Dezembro ro: januarie/februarie/martie/aprilie/mai/junie/julie/august/septembrie/octombrie/noiembrie/decembrie ru: ЯнварÑ/февралÑ/марта/апрелÑ/маÑ/июнÑ/июлÑ/авгуÑта/ÑентÑбрÑ/октÑбрÑ/ноÑбрÑ/Ð´ÐµÐºÐ°Ð±Ñ€Ñ sk: január/február/marec/apríl/máj/jún/júl/august/september/október/november/december sl: januarja/februarja/marca/aprila/maja/junija/julija/avgusta/septembra/oktobra/novembra/decembra sv: januari/februari/mars/april/maj/juni/juli/augusti/september/oktober/november/december zh: 1月/2月/3月/4月/5月/6月/7月/8月/9月/10月/11月/12月 (thousand separator) af:   ar: . bg:   br: . ca: . cs:   da: . de: . en: , eo: . es: . et:   fi: . fr:   he: , is: . it: . lv: ' nl: . no: . oc:   pl: . pt: . ro: . ru: ' sk:   sl: . sv: . zh: . (week day) af: Sondag/Maandag/Dinsdag/Woensdag/Donderdag/Vrydag/Saterdag ar: يوم الإثنين/يوم الثلاثاء/يوم الأربعاء/يوم الخميس/يوم الجمعة/يوم السّبت/يوم ا bg: неделÑ/понеделник/вторник/ÑÑ€Ñда/четвъртък/петък/Ñъбота br: sul/lun/meurzh/merc'her/yaou/gwener/sadorn ca: diumenge/dilluns/dimarts/dimecres/dijous/divendres/dissabte cs: nedÄ›le/pondÄ›lí/úterý/stÅ™eda/Ätvrtek/pátek/sobota da: søndag/mandag/tirsdag/onsdag/torsdag/fredag/lørdag de: Sonntag/Montag/Dienstag/Mittwoch/Donnerstag/Freitag/Samstag en: Sunday/Monday/Tuesday/Wednesday/Thursday/Friday/Saturday eo: dimanĉo/lundo/mardo/merkredo/jaùdo/vendredo/sabato es: domingo/lunes/martes/miércoles/jueves/viernes/sábado et: pühapäev:i:+al/esmaspäev:i:+al/teisipäev:i:+al/kolmapäev:i:+al/neljapäev:i:+al/reede:i:+l/laupäev:i:+al fi: sunnuntai:e:+na/maanantai:e:+na/tiistai:e:+na/keskiviikko:e:+na/torstai:e:+na/perjantai:e:+na/lauantai:e:+na fr: dimanche/lundi/mardi/mercredi/jeudi/vendredi/samedi he: ×™×•× ×'/ ×™×•× ×‘'/ ×™×•× ×’'/ ×™×•× ×“'/ ×™×•× ×”'/ ×™×•× ×•'/ שבת is: sunnudagur/mánudagur/þriðjudagur/miðvikudagur/fimmtudagur/föstudagur/laugardagur it: domenica/lunedì/martedì/mercoledì/giovedì/venerdì/sabato lv: svÄ“tdiena/pirmdiena/otrdiena/treÅ¡diena/ceturdiena/piekdiena/sesdiena nl: zondag/maandag/dinsdag/woensdag/donderdag/vrijdag/zaterdag no: søndag/mandag/tirsdag/onsdag/torsdag/fredag/lørdag oc: dimenge/diluns/dimars/dimècres/dijòus/divendres/dissabte pl: niedziela:a:-Ä™/poniedziaÅ‚ek/wtorek/Å›roda:a:-Ä™/czwartek/piÄ…tek/sobota:a:-Ä™ pt: domingo/segunda-feira/terça-feira/quarta-feira/quinta-feira/sexta-feira/sábado ro: duminica/luni/marti/miercuri/joi/vineri/simbata ru: воÑкреÑенье/понедельник/вторник/Ñреда/четверг/пÑтница sk: nedeľa/pondelok/utorok/streda/Å¡tvrtok/piatok/sobota sl: nedelja/ponedeljek/torek/sreda/Äetrtek/petek/sobota sv: söndag/mÃ¥ndag/tisdag/onsdag/torsdag/fredag/lördag 2nd cousins af: kleinneef/kleinniggie bg: втори братовчеди br: kendirvi kompez bihan ca: cosins de segon grau cs: bratraneci/sestÅ™enice z druhého kolena da: fætre og kusiner af 2. grad de: Cousins 2. Grades en: 2nd cousins eo: rektaj geprakuzoj es: primos en segundo grado et: teise astme nõod fi: pikkuserkut fr: cousins issus de germains he: בני ×“×•×“×™× ×©× ×™×™× is: tremenningar it: cugini di 2o grado lv: otrÄs pakÄpes brÄlÄ“ns/mÄsÄ«ca nl: neven en nichten in de 2de graad no: tremenninger oc: cosins de segond gra pl: kuzyni drugiego stopnia pt: primos em 2º grau ro: var de gradul doi ru: троюродные братьÑ/троюродные ÑеÑтры sk: bratranci/sesternice z druhého kolena sl: bratranec/sestriÄna v drugem kolenu sv: sysslingar 3rd cousins af: agterkleinneef/agterkleinniggie bg: трети братовчеди br: kendirvi kompez bihan-bihan ca: cosins de 3er grau cs: bratraneci/sestÅ™enice z tÅ™etího kolena da: fætre og kusiner af 3. grad de: Cousins 3. Grades en: 3rd cousins eo: 3aj gradaj gekuzoj es: primos en tercer grado et: kolmanda astme nõod fi: kolmannet serkut fr: cousins issus d’issus de germains he: בני ×“×•×“×™× ×©×œ×™×©×™×™× is: fjórmenningar it: cugini di 3o grado lv: treÅ¡Äs pakÄpes brÄlÄ“ns mÄsÄ«ca nl: neven en nichten in de 3e graad no: firmenninger oc: cosins de 3en gra pl: kuzyni trzeciego stopnia pt: primos em 3º grau ro: var de gradul trei ru: троюродные кузены/троюродные кузины sk: bratranci/sesternice z tretieho kolena sl: bratranec/sestriÄna v tretjem kolenu sv: bryllingar Sosa number relative to %t af: Sosa nommer relatief tot %t bg: чиÑло на СоÑа отноÑно %t br: niverenn Sosa e keñver %t ca: número "Sosa"relatiu a %t cs: "Sosa" Äíslo vztažené k %t da: Sosa-nummer, refererende til %t de: Ahnenkennziffer relativ zu %t en: Sosa number relative to %t eo: numero Sosa relative al %t es: número Sosa respecto a %t et: Sosa number %t suhtes fi: Sosa-numero %t suhteen fr: numéro Sosa par rapport à %t he: מספר Sosa ביחס ל- %t is: Sosa númer tengt %t it: Numero Sosa relativo a %t lv: SOSA pakÄpe attiecÄ«bÄ pret %t nl: Sosa nummer ten opzichte van %t no: Anenummer i forhold til %t oc: numèro Sosarelatiu a %t pl: numer "Sosa", odnoszÄ…cy siÄ™ do: %t pt: número Sosa em relação a %t ro: numar Sosa in relatie cu ru: Sosa номер отноÑительно %t sk: "Sosa" Äíslo vo vzÅ¥ahu k %t sl: Å¡tevilka"Sosa", v odnosu z %t sv: annummer med %t som proband (Kekules system) a %s cousin af: 'n neef in die %s -de geslag/'n niggie in die %s -de geslag bg: %sи братовчед/%sа братовчедка br: ur c'henderv a live an %s derez/ur geniterv a live an %s derez/ ur c'h(g)enderv(ez) a live an %s derez ca: un cosí de %s grau/una cosina de %s grau/un(a) cosí(na) de %s grau cs: bratranec z %s kolena/sestÅ™enice z %s kolena da: en fætter af %s grad/en kusine af %s grad de: ein:d:+em Cousin %s Grades/eine:d:+r Cousine %s Grades en: a %s cousin eo: %s grada kuzo/%s grada kuzino/%s grada kuz(in)o es: un primo en %s grado/una prima en %s grado/un(a) primo(a) en %s grado et: %s astme nõbu:g:--o fi: %s serkku:g:--un fr: un cousin au %s degré/une cousine au %s degré/un(e) cousin(e) au %s degré he: בן-דוד לדרגה %s/ בת-דוד לדרגה %s is: systkynabarn %s it: un cugino di %s grado/una cugina di %s grado/un(a) cugino(a) di %s grado lv: %s brÄlÄ“ns/mÄsÄ«ca nl: een neef in de %s generatie/een nicht in de %s generatie no: %smenning oc: un cosin del %s gra/una cosina del %s gra/un(a) cosi(na) del %s gra pl: kuzyn %s-tego stopnia/kuzynka %s-tego stopnia pt: um primo em %s grau/uma prima em %s grau/um(a) primo(a) em %s grau ro: un var de gradul %s ru: %s-ий кузен/%s-Ñ ÐºÑƒÐ·Ð¸Ð½Ð° sk: bratranec/sesternica z %s kolena sl: bratranec v %s kolenu/sestriÄna v %s kolenu sv: %smänning a 2nd cousin af: 'n kleinneef/'n kleinniggie bg: втори братовчед/втора братовчедка br: ur c'hevenderv/ur gevendervez/ur c'h(g)evenderv(ez) ca: un cosí segon/una cosina segona/un(a) cosí(na) segon(a) cs: bratranec z druhého kolena/sestÅ™enice z druhého kolena da: en fætter af 2. grad/en kusine af 2. grad de: ein:d:+em Cousin 2. Grades/eine:d:+r Cousine 2. Grades en: a 2nd cousin eo: rekta prakuzo/rekta prakuzino/rekta kuz(in)o es: un primo nacido de primos hermanos/una prima nacida de primos hermanos/un(a) primo(a) nacido(a) de primos hermanos et: teise astme nõbu:g:--o fi: pikkuserkku:g:--un fr: un cousin issu de germains/une cousine issue de germains/un(e) cousin(e) issu(e) de germains he: בן-דוד שני/ בת-דוד שניה is: tremenningur it: un cugino di 2o grado/una cugina di 2o grado/un(a) cugino(a) di 2o grado lv: otrais brÄlÄ“ns/mÄsÄ«ca nl: een neef in de tweede generatie/een nicht in de tweede generatie no: en tremenning oc: un cosin eissit de germans/una cosina eissida de germans/un(a) cosin(a) eissit(da) de germans pl: kuzyn/kuzynka drugiego stopnia pt: um primo em 2º grau/uma prima em 2º grau/um(a) primo(a) em 2º grau ro: un var de gradul doi ru: троюродный брат/Ñ‚Ñ€Ð¾ÑŽÑ€Ð¾Ð´Ð½Ð°Ñ ÑеÑтра sk: bratranec/sesternica z druhého kolena sl: bratranec iz drugega kolena/sestriÄna iz drugega kolena sv: en syssling a 3rd cousin af: 'n agterkleinneef/'n agterkleinniggie bg: трети братовчед/трета братовчедка br: ur c'hevniant/ur gevniantez/ur c'h(g)evniant(ez) ca: un cosí 3er/una cosina 3a/un(a) cosí(na) 3er(a) cs: bratranec z tÅ™etího kolena/sestÅ™enice z tÅ™etího kolena da: en fætter af 3. grad/en kusine af 3. grad de: ein:d:+em Cousin 3. Grades/eine:d:+r Cousine 3. Grades en: a 3rd cousin eo: 3a grada kuzo/3a grada kuzino/3a grada kuz(in)o es: un primo 3ro/una prima 3ro/un(a) primo(a) 3ro et: kolmanda astme nõbu:g:--o fi: kolmas serkku:g:nnen serkun fr: un cousin issu d’issus de germains/une cousine issue d’issus de germains/un(e) cousin(e) issu(e) d’issus de germains he: בן-דוד שלישי/ בת-דוד שלישית is: fjórmenningur it: un cugino di 3o grado/una cugina di 3o grado/un(a) cugino(a) di 3o grado lv: treÅ¡ais brÄlÄ“ns/mÄsÄ«ca nl: een neef in de derde generatie/een nicht in de derde generatie no: en firmenning oc: un cosin eissit d'eissits de germans/una cosina eissida d'eissits de germans/un(a) cosin(a) eissit(da) d'eissits de germans pl: kuzyn/kuzynka trzeciego stopnia pt: um primo em 3º grau/uma prima em 3º grau/um(a) primo(a) em 3º grau ro: un var de gradul trei ru: троюродный кузен/Ñ‚Ñ€Ð¾ÑŽÑ€Ð¾Ð´Ð½Ð°Ñ ÐºÑƒÐ·Ð¸Ð½Ð° sk: bratranec/sesternica z tretieho kolena sl: bratranec v tretjem kolenu/sestriÄna v tretjem kolenu sv: en brylling a brother-in-law/a sister-in-law af: 'n swaer/'n skoonsuster bg: ÑеÑтрин Ñъпруг, шурей или баджанак/братова Ñъпруга, шуренайка или балдъза/ÑеÑтрин Ñъпруг, Ñъпруг на зълва или девер/братова Ñъпруга, зълва или етърва br: ur breur-kaer/ur c'hoar-gaer ca: un cunyat/una cunyada cs: Å¡vagr/Å¡vagrová da: en svoger/en svigerinde de: ein Schwager/eine Schwägerin en: a brother-in-law/a sister-in-law eo: bofrato/bofratino es: un cuñado/una cuñada et: küdi või nääl:g:+u või õemees:g:--he/nadu või käli või vennanaine:g:--se fi: lanko:g:--gon/käly:g:+n fr: un beau-frère/une belle-sÅ“ur he: גיס/ גיסה is: mágur/mágkona it: un cognato/una cognata lv: svainis/svaine nl: een schoonbroer(zwager)/een schoonzuster no: svoger/svigerinne oc: un conhat/una conhada pl: szwagier/szwagierka pt: um cunhado/uma cunhada ro: un cumnat/o cumnata ru: деверь-шурин/заловка-ÑвоÑченица sk: Å¡vagor/Å¡vagriná sl: svak/svakinja sv: en svÃ¥ger/en svägerska a brother/a sister/a sibling af: 'n broer/'n sister/'n sibbe bg: брат/ÑеÑтра/брат или ÑеÑтра br: ur breur/ur c'hoar/ur breur pe ur c'hoar ca: un germà/una germana/un(a) germà(na) cs: bratr/sestra/sourozenec da: en broder/en søster/en broder eller en søster de: ein Bruder/eine Schwester/ein Bruder oder eine Schwester en: a brother/a sister/a sibling eo: frato/fratino/frat(in)o es: un hermano/una hermana/un(a) hermano(a) et: vend:g:-na/õde:g:--e/õde:g:--e või vend:g:-na fi: veli:g:-jen/sisar:g:+en/sisarus:g:-ksen fr: un frère/une sÅ“ur/un frère ou une sÅ“ur he: ××—/ ×חות/ ××—(ות) is: bróðir/systir/systkyn it: un fratello/una sorella/un fratello o una sorella lv: brÄlis/mÄsa/a sibling nl: een broer/een zuster/een broer of een zuster no: bror/søster/søsken oc: un fraire/una sòrre/un fraire o una sòrre pl: brat/siostra/brat lub siostra pt: um irmão/uma irmã/um(a) irmão(ã) ro: frate/sora/un frate sau o sora ru: брат/ÑеÑтра/брат или ÑеÑтра sk: brat/sestra/súrodenec sl: brat/sestra/brat ali sestra sv: en bror/en syster/ett syskon a cousin af: 'n neef/'n niggie bg: първи братовчед/първа братовчедка br: ur c'henderv/ur geniterv ca: un cosí/una cosina cs: bratranec/sestÅ™enice da: en fætter/en kusine de: ein:d:+em Cousin/eine:d:+r Cousine en: a cousin eo: kuzo/kuzino es: un primo/una prima et: nõbu:g:--o fi: serkku:g:--un fr: un cousin/une cousine he: בן-דוד/ בת-דוד is: systkynabarn it: un cugino/una cugina lv: brÄlÄ“ns/mÄsÄ«ca nl: een neef/een nicht no: et søskenbarn oc: un cosin/una cosina pl: kuzyn/kuzynka pt: um primo/uma prima ro: un var ru: кузен/кузина sk: bratranec/sesternica sl: bratranec/sestriÄna sv: en kusin a descendant af: 'n afstammeling bg: потомък br: un diskennad/ un diskennadez ca: un descendent/una descendent cs: potomek da: en efterkommer de: ein:d:+em Nachkomme:d:+n en: a descendant eo: posteulo es: un descendiente/una descendiente et: järglane:g:--se fi: jälkeläinen:g:---sen fr: un descendant/une descendante he: צ×צ×/ צ×צ××” is: afkomandi it: un discendente/una discendente lv: pÄ“cnÄcÄ“js nl: een afstammeling no: en etterkommer oc: un descendent/una descendenta pl: potomek pt: um descendente/uma descendente ro: un descendent ru: потомок sk: potomok sl: potomec sv: en ättling a grandfather/a grandmother/a grandparent af: 'n oupa/'n ouma/'n grootouer bg: дÑдо/баба/дÑдо или баба br: un tad-kozh/ur vamm-gozh/un den-kar-kozh ca: un avi/una àvia/un(a) avi(a) cs: dÄ›deÄek/babiÄka/prarodiÄ da: en bedstefader/en bedstemoder/en bedsteforælder de: ein:d:+em Großvater/eine:d:+r Großmutter/ein:d:+em Großelternteil en: a grandfather/a grandmother/a grandparent eo: avo/avino/av(in)o es: un abuelo/una abuela/un(a) abuelo(a) et: vanaisa/vanaema/vanavanem:g:+a fi: isoisä:g:+n/isoäiti:g:--din/isovanhempi:g:--man fr: un grand-père/une grand-mère/un grand-parent he: סב×/ ×¡×‘×ª× is: afi/amma/afi og amma it: un nonno/una nonna/un(a) nonno(a) lv: vectÄ“vs/vecmamma/vecvecÄki nl: een grootvader/een grootmoeder/een grootouder no: bestefar/bestemor/en av besteforeldrene oc: un grand/una grand/un(a) grand pl: dziadek/babka/dziadkowie pt: um avô/uma avó/um(a) avô(ó) ro: un bunic/o bunica/bunici ru: дедушка/бабушка/прародитель sk: dedo/babka/prarodiÄ sl: dedka/babice/starega starÅ¡a sv: farfar/farmor/en farförälder/morfar/mormor/en morförälder a grandson/a granddaughter/a grandchild af: 'n kleinseun/'n kleindogter/'n kleinkind bg: внук/внучка/внук или внучка br: ur mab bihan/ur verc'h vihan/ur bugel bihan ca: un net/una neta/un(a) net(a) cs: vnuk/vnuÄka/vnouÄe da: en sønne-søn/en sønne-datter/et barnebarn/en datter-søn/en datter-datter/et barnebarn de: ein:d:+em Enkel/eine:d:+r Enkelin/ein:d:+em Enkelkind en: a grandson/a granddaughter/a grandchild eo: nepo/nepino/nep(in)o es: un nieto/una nieta/un(a) nieto(a) et: poja- või tütrepoeg:g:--ja/poja- või tütretütar:g:--re/lapselaps:g:+e fi: pojan tai tyttären poika:g:---jan/pojan tai tyttären tytär:g:--tären/lapsenlapsi:g:-en fr: un petit-fils/une petite-fille/un petit-enfant he: נכד/ נכדה is: barnabarn/barnabarn/barnabarn it: un nipote/una nipote/un(a) nipote lv: mazdÄ“ls/mazmeita/mazbÄ“rns nl: een kleinzoon/een kleindochter/een kleinkind no: barnebarn/barnebarn/barnebarn oc: un felen/una felena/un(a) felen(a) pl: wnuk/wnuczka/wnuki pt: um neto/uma neta/um(a) neto(a) ro: nepot/nepoata/nepoti ru: внук/внучка/ребенок детей sk: vnuk/vnuÄka/vnúÄa sl: vnuk/vnukinja/pravnuk ali pravnukinja sv: en sonson/en sondotter/ett barnbarn/en dotterson/en dotterdotter/ett barnbarn a great-grandfather/a great-grandmother/a great-grandparent af: 'n oupagrootjie/'n oumagrootjie/'n grootjie bg: прадÑдо/прабаба/прадÑдо или прабаба br: un tad kuñv/ur vamm-guñv/ un den-kar-kozh-kuñv ca: un besavi/una besàvia/un(a) besavi(a) cs: pradÄ›deÄek/prababiÄka/praprarodiÄ da: en oldefader/en oldemoder/en oldeforælder de: ein:d:+em Urgroßvater/eine:d:+r Urgroßmutter/ein:d:+em Urgroßelternteil en: a great-grandfather/a great-grandmother/a great-grandparent eo: praavo/praavino/praav(in)o es: un bisabuelo/una bisabuela/un(a) bisabuelo(a) et: vanavanaisa/vanavanaema/vanavanavanem:g:+a fi: iso-isoisä:g:+n/iso-isoäiti:g:--din/iso-isovanhempi:g:--man fr: un arrière-grand-père/une arrière-grand-mère/un arrière-grand-parent he: רב-סב×/ רב-×¡×‘×ª× is: langafi/langamma/langafi og langamma it: un bisnonno/una bisnonna/un(a) bisnonno(a) lv: vecvectÄ“vs/vecvecmamma/vecvecvecÄki nl: een overgrootvader/een overgrootmoeder/een overgrootouder no: en oldefar/en oldemor/en av oldeforeldrene oc: un rèiregrand/una rèiregrand/un(a) rèiregrand pl: pradziadek/prababka/pradziadkowie pt: um bisavô/uma bisavó/um(a) bisavô(ó) ro: un strabunic/o strabunica/strabunici ru: прапрадед/прапрабабка/прапрапрародитель sk: pradedo/prababka/praprarodiÄ sl: pradedek/prababica/prastari starÅ¡ sv: en gammel-farfar/en gammel-farmor/en gammel-farförälder/en gammel-morfar/en gammel-mormor/en gammel-morförälder a great-grandson/a great-granddaughter/a great-grandchild af: 'n agterkleinseun/'n agterkleindogter/'n agterkleinkind bg: правнук/правнучка/правнук или правнучка br: ur mab-kuñv /ur verc'h guñv/ ur bugel-kuñv ca: un besnet/una besneta/un(a) besnet(a) cs: pravnuk/pravnuÄka/pravnouÄata da: en oldesøn/en oldedatter/et oldebarn de: ein:d:+em Urenkel/eine:d:+r Urenkelin/ein:d:+em Urenkelkind en: a great-grandson/a great-granddaughter/a great-grandchild eo: pranepo/pranepino/pranep(in)o es: un bisnieto/una bisnieta/un(a) bisnieto(a) et: lapselapse poeg:g:--ja/lapselapse tütar:g:--re/lapselapselaps:g:+e fi: lapsenlapsen poika:g:---jan/lapsenlapsen tytär:g:--tären/lapsenlapsen lapsi:g:-en fr: un arrière-petit-fils/une arrière-petite-fille/un arrière-petit-enfant he: נין/ × ×™× ×” is: barnabarnabarn/barnabarnabarn/barnabarnabarn it: un pronipote/una pronipote/un(a) pronipote lv: mazmazdÄ“ls/mazmazmeita/mazmazbÄ“rni nl: een achterkleinzoon/een achterkleindochter/een achterkleinkind no: et oldebarn oc: un rèirefelen/una rèirefelena/un(a) rèirefelen(a) pl: prawnuk/prawnuczka/prawnuki pt: um bisneto/uma bisneta/um(a) bisneto(a) ro: stranepot/stranepoata/stranepoti ru: праправнук/праправнучка/праправнук sk: pravnuk/pravnuÄka/pravnúÄa sl: pravnuk/pravnukinja/pravnuk ali pravnukinja sv: en sonsons son/en sonsons dotter/ett barnbarns barn/en sondotters son/en sondotters dotter/ett barnbarns barn/en dottersons son/en dottersons dotter/ett barnbarns barn/en dotterdotters son/en dotterdotters dotter/ett barnbarns barn a great-nephew/a great-niece af: 'n agterneef/'n agterniggie bg: внук на брат или ÑеÑтра/внучка на брат или ÑеÑтра br: un niz bihan/ur verc'h vihan ca: un besnebot/una besneboda cs: prasynovec/praneteÅ™ da: en grandnevø/en grandniece de: ein:d:+em Großneffe:d:+n/eine:d:+r Großnichte en: a great-nephew/a great-niece eo: pranevo/pranevino es: un sobrino nieto/una sobrina nieta et: venna- või õelapse poeg:g:--ja/venna- või õelapse tütar:g:--re fi: veljen- tai sisarenlapsen poika:g:---jan/veljen- tai sisarenlapsen tytär:g:--tären fr: un petit neveu/une petite nièce he: בן ×”×חיין/ בת ×”×חיין is: frændi/frænka it: un pronipote/una pronipote lv: brÄļa/mÄsas mazdÄ“ls/mazmeita nl: een achterneef/een achternicht no: en grandnevø/en grandniese oc: un rèirenebot/una rèireneboda pl: wnuk brata lub siostry/wnuczka brata lub siostry pt: um sobrinho-neto/uma sobrinha-neta ro: stranepot/stranepoata/stranepoti ru: внучатый племÑнник/Ð²Ð½ÑƒÑ‡Ð°Ñ‚Ð°Ñ Ð¿Ð»ÐµÐ¼Ñнница sk: prasynovec/praneter sl: praneÄak/praneÄakinja sv: en gammel-nevö/en gammel-niece a great-uncle/a great-aunt af: 'n grootoom/'n groottante bg: чичо на родител/Ð»ÐµÐ»Ñ Ð½Ð° родител/вуйчо на родител/Ð»ÐµÐ»Ñ Ð½Ð° родител br: un eontr-kuñv /ur voereb guñv ca: un oncle avi/una tia àvia cs: prastrýc/prateta da: en grandonkel/en grandtante de: ein:d:+em Großonkel/eine:d:+r Großtante en: a great-uncle/a great-aunt eo: praonklo/praonklino es: un tio abuelo/una tia abuela et: vanaonu/vanatädi fi: isosetä:g:--dän/isotäti:g:--din fr: un grand-oncle/une grand-tante he: דוד-סב/ דודה-סבה is: afa(ömmu)bróðir/afa(ömmu)systir it: un prozio/una prozia lv: vectÄ“va/vecmamas brÄlis/mÄsa nl: een oudoom/een oudtante no: en grandonkel/en grandtante oc: un rèironcle/una rèiretanta pl: brat dziadka lub babki/siostra dziadka lub babki pt: um tio-avô/uma tia-avó ro: frate de bunici/sara de bunici ru: дÑÐ´Ñ Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ñ/Ñ‚ÐµÑ‚Ñ Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ñ sk: prastrýko/prateta sl: prastric/prateta sv: en gammel-farbror/en gammel-faster/en gammel-morbror/en gammel-moster a half-brother/a half-sister/a half-sibling af: 'n stiefbroer/'n stiefsuster/'n stiefbroer of -suster bg: полубрат/полуÑеÑтра/полубрат или полуÑеÑтра br: ul lezvreur/ul lezc'hoar/un hanter-breur pe -c'hoar ca: un germanastre/una germanastra/un(a) germanastre(a) cs: nevlastní bratr/nevlastní sestra/nevlastní sourozenec da: en halvbroder/en halvsøster/en halvsøskende de: ein:d:+em Halbbruder/eine:d:+r Halbschwester/ein:d:+em Halbbruder oder eine:d:+r Halbschwester en: a half-brother/a half-sister/a half-sibling eo: duonfrato/duonfratino/duonfrat(in)o es: un medio hermano/una medio hermana/un(a) medio(a) hermano(a) et: poolvend:g:-na/poolõde:g:--e/poolõde:g:--e või poolvend:g:-na fi: velipuoli:g:-en/sisarpuoli:g:-en/isä- tai äitipuolen lapsi:g:-en fr: un demi-frère/une demi-sÅ“ur/un demi-frère ou une demi-sÅ“ur he: חצי ××—/ חצי ×חות/ חצי ××—(ות) is: hálfbróðir/hálfsystir/hálfsystkin it: un fratello/una sorella/un fratello o una sorella lv: pusbrÄlis/pusmÄsa/pusbÄ“rns nl: een halfbroer/een halfzuster/een halfbroer of halfzuster no: en halvbror/en halvsøster/en halvsøsken oc: un frairastre/una sorrastra/un frairastre o una sorrastra pl: brat przyrodni/siostra przyrodnia/przyrodni brat lub siostra pt: um meio-irmão/uma meia-irmã/um(a) meio(a) irmão(ã) ro: frate vitreg/sora vitrega/surori sau frati vitregi ru: полуродной брат/Ð¿Ð¾Ð»ÑƒÑ€Ð¾Ð´Ð½Ð°Ñ ÑеÑтра/полуродной брат sk: nevlastný brat/nevlastná sestra/ nevlastný súrodenec sl: polbrata/polsestra/polbrat ali polsestra sv: en halvbror/en halvsyster/ett halvsyskon a nephew/a niece af: 'n broerskind/'n susterskind bg: племенник/племенница br: un niz/un nizez ca: un nebot/una neboda cs: synovec/neteÅ™ da: en nevø/en niece de: ein:d:+em Neffe:d:+n/eine:d:+r Nichte en: a nephew/a niece eo: nevo/nevino es: un sobrino/a sobrina et: venna- või õepoeg:g:--ja/venna- või õetütar:g:--re fi: veljen- tai sisarenpoika:g:---jan/veljen- tai sisarentytär:g:--tären fr: un neveu/une nièce he: ×חיין/ ×חיינית is: bróður(systur)sonur/bróður(systur)dóttir it: un nipote/una nipote lv: brÄļa/mÄsas dÄ“ls/meita nl: een neef/een nicht (oom- of tantezegger) no: nevø/niese oc: un nebot/una neboda pl: bratanek lub siostrzeniec/bratanica lub siostrzenica pt: um sobrinho/uma sobrinha ro: nepot/nepoata/nepoti ru: племÑнник/племÑнница sk: synovec/neter sl: neÄak/neÄakinja/neÄak ali neÄakinja sv: en nevö/en niece a son-in-law/a daughter-in-law af: 'n skoonseun/'n skoondogter bg: Ñъпруг на дъщерÑ/Ñъпруга на Ñин br: mabeg/merc'heg ca: un gendre/una jove cs: zeÅ¥/snacha da: en svigersøn/en svigerdatter de: ein Schwiegersohn/eine Schwiegertochter en: a son-in-law/a daughter-in-law eo: bofilo/bofilino es: un yerno/una nuera et: väimees:g:--he/minia fi: vävy:g:+n/miniä:g:+n fr: un beau-fils/une belle-fille he: חתן/ כלה is: tengdasonur/tengdadóttir it: un genero/una nuora lv: znots/vedekla nl: schoonzoon/schoondochter no: svigersønn/svigerdatter oc: un gendre/una nòra pl: zięć/synowa pt: um genro/uma nora ro: ginere/nora ru: зÑть/невеÑтка sk: zaÅ¥/nevesta sl: zet/snaha sv: en mÃ¥g/en svärdotter a son/a daughter/a child af: 'n seun/'n dogter/'n kind bg: Ñин/дъщерÑ/дете br: ur mab/ur verc'h/ur bugel ca: un fill/una filla/un(a) fill(a) cs: syn/dcera/dítÄ› da: en søn/en datter/et barn de: ein:d:+em Sohn/eine:d:+r Tochter/ein:d:+em Kind en: a son/a daughter/a child eo: filo/filino/ido es: un hijo/una hija/un(a) hijo(a) et: poeg:g:--ja/tütar:g:--re/laps:g:+e fi: poika:g:---jan/tytär:g:--tären/lapsi:g:-en fr: un fils/une fille/un enfant he: בן/ בת/ ילד is: sonur/dóttir/barn it: un figlio/una figlia/un(a) figlio(a) lv: dÄ“ls/meita/bÄ“rns nl: een zoon/een dochter/een kind no: sønn/datter/barn oc: un filh/una filha/un(a) filh(a) pl: syn/córka/dziecko pt: um filho/uma filha/um(a) filho(a) ro: fiu/fica/copil ru: Ñын/дочь/ребенок sk: syn/dcéra/dieÅ¥a sl: sin/hÄerka/otrok sv: en son/en dotter/ett barn about (date) af: ongeveer bg: около br: war-dro ca: al voltant de cs: kolem da: omkring de: ca. en: about eo: ĉirkaù es: alrededor de et: umbes :i: fi: noin fr: vers he: בערך is: um it: circa lv: ap nl: circa no: ca oc: circa pl: okoÅ‚o pt: cerca ro: circa ru: около sk: okolo sl: približno sv: omkring about (short date) af: ca bg: ca br: ca ca: ca cs: ca da: ca de: ca en: ca eo: ca es: ca et: ca fi: ca fr: ca he: ca is: ca it: ca lv: ca nl: ca no: ca oc: ca pl: ca pt: ca pt-br: ca ro: ca ru: ca sk: ca sl: ca sv: ca zh: ca access af: toegang bg: доÑтъп br: mont-e-barzh ca: accés cs: přístup da: adgang de: Zugriff en: access eo: eniro es: acceso et: ligipääs fi: pääsy fr: accès he: כניסה is: aðgangur it: accesso lv: piekļuve/atslÄ“ga nl: toegang no: tilgang oc: accès pl: dostÄ™p pt: acesso ro: acces ru: доÑтуп sk: prístup sl: dostop sv: tillträde add af: byvoeg bg: добавÑне на br: ouzhpennañ ca: afegir cs: pÅ™idat :a: da: tilføj de: hinzufügen +before en: add eo: aldoni :a: es: agregar et: lisa fi: lisää fr: ajouter he: הוספה is: bæta við it: aggiungere lv: pievienot nl: invoeren +before no: tilføy oc: apondre pl: dodaj :a: pt: acrescentar ro: adauga ru: добавить :a: sk: pridaÅ¥ :a: sl: dodaj sv: lägg till add base notes af: byvoeg notas bg: добавÑне на бележки br: ouzhpennañ notennoù ca: afegir notes cs: pÅ™idat :a: poznámky da: tilføj noter de: hinzufügen Notizen en: add notes eo: aldoni :a: notoj:a:+n es: agregar notas et: lisa märkused:g:-id fi: lisää lisätietoja fr: saisir une chronique he: הערות הוספה is: bæta við athugasemdum it: aggiungere note lv: pievienot piezÄ«me(s) nl: invoeren notities no: tilføy notater oc: apondre de nòtas pl: dodaj :a: uwagi pt: acrescentar notas ro: adauga note ru: добавить :a: заметки sk: pridaÅ¥ :a: poznámky sl: dodaj zapiski sv: lägg till noteringar add picture af: byvoeg prent bg: добавÑне на изображение br: ouzhpennañ skeudenn ca: afegir imatge cs: pÅ™idat :a: obrázek da: tilføj billede de: hinzufügen Bild en: add Picture eo: aldoni :a: bildo:a:+n es: agregar imagen et: lisa pilt fi: lisää kuva fr: ajouter portrait he: תמונה הוספה is: bæta við mynd it: aggiungere immagine lv: pievienot attÄ“li nl: invoeren beeld no: tilføy bilde oc: apondre un imatge pl: dodaj :a: ilustracja:a:-Ä™ pt: acrescentar imagem ro: adauga imagine ru: добавить :a: картинку sl: dodaj slika sv: lägg till bild adoptive father/adoptive mother/adoptive parents af: aangenome vader/angenome moeder/aangenome ouers bg: оÑиновител/оÑиновителка/оÑиновители br: adtad/advamm/adkerent ca: pare adoptiu/mare adoptiva/pares adoptius cs: adoptivní otec/adoptivní matka/adoptivní rodiÄe da: adoptivfader/adoptivmoder/adoptivforældre de: Adoptivvater/Adoptivmutter/Adoptiveltern en: adoptive father/adoptive mother/adoptive parents eo: adoptinta patro/adoptinta patrino/adoptintaj gepatroj es: padre adoptivo/madre adoptiva/padres adoptivos et: adoptiivisa/adoptiivema/adoptiivvanemad fi: ottoisä/ottoäiti/ottovanhemmat fr: père adoptif/mère adoptive/parents adoptifs he: ×ב חורג/ ×× ×—×•×¨×’×ª/ ×”×•×¨×™× ×—×•×¨×’×™× is: kjörfaðir/kjörmóðir/kjörforeldrar it: padre adottivo/madre adottiva/genitori adottivi lv: patÄ“vs/pamÄte/pavecÄki adoptive parents nl: adoptiefvader/adoptiefmoeder/adoptiefouders no: adoptivfar/adoptivmor/adoptivforeldre oc: paire adoptiu/maire adoptiva/parents adoptius pl: przybrany ojciec/przybrana matka/przybrani rodzice pt: pai adoptivo/mãe adoptiva/pais adoptivos pt-br: pai adotivo/mãe adotiva/pais adotivos ro: tatal adoptiv/mama adoptiva/parinti adoptivi ru: приемный отец/Ð¿Ñ€Ð¸ÐµÐ¼Ð½Ð°Ñ Ð¼Ð°Ñ‚ÑŒ/приемные родители sk: adoptívny otec/adoptnívna matka/adoptívny rodiÄia sl: posvojitveni oÄe/posvojitvena mati/posvojitveni starÅ¡i sv: adoptivfar/adoptivmor/adoptivföräldrar adoptive son/adoptive daughter/adoptive child af: aangenome seun/aangenome dogter/aangenome kind bg: оÑиновен Ñин/оÑиновена дъщерÑ/оÑиновено дете br: advab/adverc'h/advugel ca: fill adoptiu/filla adoptiva/fill(a) adoptiu(iva) cs: adoptivní syn/adoptivní dcera/adoptivní dítÄ› da: adoptivsøn/adoptivdatter/adoptivbarn de: Adoptivsohn/Adoptivtochter/Adoptivkind en: adoptive son/adoptive daughter/adoptive child eo: adoptita filo/adoptita filino/adoptita ido es: hijo adoptivo/hija adoptiva/hijo(a) adoptivo(a) et: adopteeritud poeg/adopteeritud tütar/adopteeritud laps fi: ottopoika/ottotytär/ottolapsi fr: fils adoptif/fille adoptive/enfant adoptif he: בן חורג/ בת חורגת/ ילד חורג is: kjörsonur/kjördóttir/kjörbarn it: figlio adottivo/figlia adottiva/figlio addotivo lv: padÄ“ls/pameita/pabÄ“rns nl: adoptiefzoon/adoptiefdochter/adoptiefkind no: adoptivsønn/adoptivdatter/adoptivbarn oc: filh adoptiu/filha adoptiva/filh(a) adoptiu(iva) pl: syn adoptowany/córka adoptowana/dziecko adoptowane pt: filho adoptivo/filha adoptiva/filho(a) adoptivo(a) pt-br: filho adotivo/filha adotiva/filho(a) adotivo(a) ro: fiu adoptiv/fica adoptiva/copil adoptiv ru: приемный Ñын/Ð¿Ñ€Ð¸ÐµÐ¼Ð½Ð°Ñ Ð´Ð¾Ñ‡ÑŒ/приемны ребенок sk: adoptívny syn/adoptívna dcéra/adoptívne dieÅ¥a sl: posvojenec/posvojenka/posvojeni otrok sv: adoptivson/adoptivdotter/adoptivbarn advanced request af: gevorderde versoek bg: разширена заÑвка br: klask araokaet ca: recerca avançada cs: rozšířený dotaz da: avanceret søgning de: Erweiterte Suche en: advanced request eo: serĉo pli preciza es: consulta avanzada et: laiendatud päring fi: erityishaku fr: requête évoluée he: בקשה מתקדמת is: nákvæmari leit it: richiesta avanzata lv: paplaÅ¡inÄtÄ meklēšana pÄ“c: nl: gedetailleerd zoeken no: avansert søk oc: recèrca avançada pl: wyszukiwanie zaawansowane pt: pesquisa complexa ro: consultatie avansata ru: раÑширенный Ð·Ð°Ð¿Ñ€Ð¾Ñ sk: rozšírená požiadavka sl: napredno iskanje sv: avancerad sökning zh: 高级访问请求 after af: na bg: Ñлед br: goude ca: després de cs: po da: efter de: nach en: after eo: post es: después et: pärast fi: jälkeen fr: après he: ×חרי is: eftir it: dopo lv: pÄ“c nl: na no: etter oc: après pl: po pt: depois ro: dupa ru: поÑле sk: po sl: po sv: efter after (date) af: na bg: Ñлед br: goude ca: després de cs: po da: efter de: nach en: after eo: post es: después de et: pärast :p: fi: jälkeen fr: après he: ×חרי is: eftir it: dopo lv: pÄ“c nl: na no: etter oc: après pl: po pt: depois de ro: dupa ru: поÑле sk: po sl: po sv: efter age af: ouderdom ar: عمر bg: възраÑÑ‚ br: oad ca: edat cs: vÄ›k da: alder de: Alter en: age eo: aÄo es: edad et: vanus fi: ikä fr: âge he: גיל is: aldur it: età lv: vecums nl: leeftijd no: alder oc: atge pl: wiek pt: idade ro: etate ru: возраÑÑ‚ sk: vek sl: starost sv: Ã¥lder zh: 年龄 age at %s birth date de: Alter bei der Geburt von %s en: Age at birth of %s es: edad al nacimiento de %s fi: Ikä %s :n syntyessä fr: âge à la naissance de %s it: età alla nascita di %s nl: leeftijd bij de geboorte van %s no: Alder ved fødsel til %s oc: atge a la naissença de %s pt: idade aquando do nascimento de %s sv: Ã¥lder vid %s födelsedatum age at death af: ouderdom by afsterwe bg: на възраÑÑ‚ br: p'edo ca: a l'edat de cs: vÄ›k v dobÄ› úmrtí da: alder ved død de: Alter zum Todeszeitpunkt en: age at death eo: mortaÄo es: Edad de defunción et: vanus surres fi: elinikä fr: âge au décès he: גיל במותו/מותה is: dánaraldur it: età alla morte lv: mirÅ¡anas vecums nl: leeftijd bij overlijden no: Livslengde oc: atge al decès pl: wiek pt: com a idade de ro: etate la deces ru: в возраÑте sk: vek v dobe úmrtia sl: Livslängd sv: livslängd zh: 享年 age at death: af: ouderdom by afsterwe: bg: на възраÑÑ‚ br: p'edo ca: a l'edat de cs: vÄ›k v dobÄ› úmrtí da: alder ved død: de: Alter: en: age at death: eo: mortaÄo es: a la edad de et: vanus surres fi: ikä kuollessa fr: à l’âge de he: גיל במותו/מותה is: dánaraldur it: all'età di lv: mirÅ¡anas vecums: nl: leeftijd bij overlijden: no: alder oc: a l'atge de pl: wiek: pt: com a idade de ro: etate la deces ru: в возраÑте sk: vek v dobe úmrtia sl: živel(a) sv: livslängd: zh: 享年 alias af: alias bg: именува Ñе още br: alias ca: àlies cs: alias da: alias de: Alias en: alias eo: aliasa:a:+n es: alias et: hüüdnimi fi: alias fr: alias he: ×©× × ×•×¡×£ is: aukanafn it: alias lv: pieņemtais vÄrds nl: alias no: alias oc: escaissat(da) pl: alias pt: alias pt-br: apelido ro: alias ru: пÑевдоним sk: alias sl: alias sv: alias alive af: in die lewe bg: жив/жива/жив(а) br: bev c'hoazh ca: viu/viva/viu(va) cs: žijící da: levende de: nicht verstorben en: alive eo: vivanta es: no fallecido/no fallecida/no fallecido(a) et: elus fi: elossa fr: vivant/vivante/vivant(e) he: ×‘×—×™×™× is: ekki látin(n) it: non deceduto/non deceduta/non deceduto(a) lv: dzÄ«vs nl: niet overleden no: lever oc: viu/viva/viu(va) pl: osoba żyjÄ…ca pt: não falecido/não falecida/não falecido(a) ro: in viata ru: живой sk: žijúci sl: živi sv: lever all the estates af: alle plase bg: вÑички меÑÑ‚Ð¾ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ br: an holl zomanioù ca: tots els llocs cs: vÅ¡echna místa da: alle ophav de: alle Orte en: all the fiefs eo: ĉiuj nobelbienoj es: todos los lugares et: kõik valdused fi: kaikki paikat fr: tous les domaines he: כל המקומות is: alla staði it: tutti i luoghi lv: visi Ä«paÅ¡umi nl: alle plaatsen no: alle steder oc: totes los domenis pl: wszystkie domeny pt: todos os lugares ro: toate localitatile ru: вÑе меÑта sk: vÅ¡etky miesta sl: vsa posestva sv: alla platser all the titles af: al die titels bg: вÑички титли br: an holl ditloù ca: tots els títols cs: vÅ¡echny tituly da: alle titler de: alle Titel en: all the titles eo: ĉiuj nobeltitoloj es: todos los títulos et: kõik tiitlid fi: kaikki arvonimet fr: tous les titres he: כל הת××¨×™× is: alla titla it: tutti i titoli lv: visi tituli nl: alle titels no: alle titler oc: totes los títols pl: wszystkie tytuÅ‚y pt: todos os títulos ro: toate titlurile ru: вÑе титулы sk: vÅ¡etky tituly sl: vsi nazivi sv: alla titlar alphabetic order af: alfabetiese volgorde bg: азбучен ред br: urzh al lizherenneg ca: ordre alfabètic cs: v abecedním poÅ™adí da: alfabetisk orden de: alphabetische Ordnung en: alphabetical order eo: alfabeta ordo es: orden alfabético et: tähestikuline järjekord fi: aakkosjärjestys fr: ordre alphabétique he: סדר ×לף-בת is: stafrófsröð it: ordine alfabetico lv: alfabÄ“tiskÄ kÄrtÄ«bÄ nl: alfabetische volgorde no: alfabetisk rekkefølge oc: òrdre alfabetic pl: alfabetycznie pt: ordem alfabética ro: alfabetica ru: алфавитный порÑдок sk: v abecednom poradí sl: abecedni red sv: bokstavsordning also af: ook bg: Ñъщо br: ivez ca: també cs: také da: ogsÃ¥ de: auch en: also eo: ankaù es: también et: ka fi: myös fr: aussi he: ×’× is: líka it: anche lv: arÄ« nl: ook no: ogsÃ¥ oc: tanben pl: także pt: também ro: si ru: также sk: tiež sl: tudi sv: ocksÃ¥ an ancestor af: 'n voorsaat bg: един от предците br: un hendad/un henvamm ca: un avantpassat cs: pÅ™edek da: en forfader de: ein:d:+em Vorfahre:d:+n/eine:d:+r Vorfahrin en: an ancestor eo: prapatro/prapatrino es: un ancestro et: esivanem:g:+a fi: esi-isä:g:+n/esiäiti:g:--din fr: un ancêtre/une ancêtre he: ×ב קדמון is: forfaðir it: un antenato/un'antenata lv: sencis nl: een voorouder no: en ane oc: un aujòl pl: przodek pt: um antepassado/uma antepassada ro: un strabun ru: предок sk: predok sl: prednik sv: en ana an uncle/an aunt af: 'n oom/'n tante bg: чичо/лелÑ/вуйчо/Ð»ÐµÐ»Ñ br: un eontr/ur voereb ca: un oncle/una tia cs: strýc/teta da: en onkel/en tante de: ein:d:+em Onkel/eine:d:+r Tante en: an uncle/an aunt eo: onklo/onklino es: un tío/una tía et: onu/tädi fi: setä:g:--dän/täti:g:--din/eno:g:+n/täti:g:--din fr: un oncle/une tante he: דוד/ דודה is: föður(móður)bróðir/föður(móður)systir it: uno zio/una zia lv: onkulis/tante nl: een oom/een tante no: onkel/tante oc: un oncle/una tanta pl: stryj lub wuj/ciotka pt: um tio/uma tia ro: un unchi/o matusa ru: дÑдÑ/Ñ‚ÐµÑ‚Ñ sk: strýc/teta sl: stric/teta sv: en farbror/en faster/en morbror/en moster ancestors af: voorouers bg: предци br: hendadoù ca: ascendents cs: pÅ™edkové da: forfædre de: Vorfahren en: ancestry eo: prapatro es: ascendientes et: esivanemad fi: esivanhemmat fr: ascendants he: ×”×בות is: forfeður it: antenati lv: senÄi nl: voorouders no: forfedre oc: ascendents pl: przodkowie pt: antepassados ro: strabuni ru: предки sk: predkovia sl: predniki sv: anor zh: 祖先 ancestors (some) af: voorsate bg: предци br: hendadoù ca: avantpassats cs: pÅ™edkové da: forfædre de: Vorfahren en: ancestors eo: geprapatroj es: ancestros et: esivanemad fi: esivanhempia fr: des ancêtres he: ×בות is: forfeður it: antenati lv: senÄi nl: voorouders no: forfedre oc: d'aujòls pl: przodkowie pt: antepassados ro: strabuni ru: возможные предки sk: predkovia sl: predniki sv: anor and af: en ar: Ùˆ bg: и br: ha ca: i cs: a da: og de: und en: and eo: kaj es: y/e  et: ja fi: ja fr: et he: ו- is: og it: e lv: un nl: en no: og oc: e pl: i pt: e ro: si ru: и sk: a sl: in sv: och zh: å’Œ anniversaries af: herdenkinge bg: годишнини br: deizioù-ha-bloaz ca: aniversaris cs: výroÄí da: Ã¥rsdage de: Jahrestage en: anniversaries eo: datrevenoj es: aniversarios et: aastapäevad fi: merkkipäiviä fr: anniversaires he: ימי שנה is: merkisdagar it: anniversari lv: gadadienas nl: verjaardagen no: merkedager oc: aniversaris pl: rocznice pt: aniversários ro: aniversare ru: годовщины sk: výroÄia sl: obletnice sv: Ã¥rsdagar anniversaries of birth af: verjaarsdae bg: рождени дни br: deizioù ganedigezh ca: aniversaris cs: narozeniny da: fødselsdage de: Geburtstage en: birthdays eo: datrevenoj de naskiÄo es: cumpleaños et: sünnipäevad fi: syntymäpäiviä fr: anniversaires de naissance he: ימי הולדת is: afmælisdagar it: compleanni lv: dzimÅ¡anas dienas nl: verjaardagen no: fødselsdager oc: aniversaris de naissença pl: urodziny pt: aniversários pt-br: aniversários de nascimento ro: zi de nastere ru: дни Ñ€Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ sk: narodeniny sl: rojstni dnevi sv: födelsedagar zh: 出生于今日的记录 anniversaries of dead people af: herdenkings van afsterwe bg: годишнини на починали хора br: deizioù-ha-bloaz an dud varv ca: aniversaris de defunció cs: výroÄí zemÅ™elých osob da: Ã¥rsdage for døde personer de: Jahrestage der verstorbenen Personen en: anniversaries of dead people eo: mortotagaj datrevenoj es: aniversarios de las personas fallecidas et: surnud inimeste mälestuspäevad fi: kuolleiden vuosipäiviä fr: anniversaires des personnes décédées he: ימי שנה למוות is: ártíðir it: anniversari delle persone decedute lv: mirÅ¡anas piemiņas dienas nl: verjaardagen van overleden mensen no: merkedager for avdøde personer oc: aniversaris de mond defuntats pl: rocznice urodzin i Å›mierci osób nieżyjÄ…cych pt: aniversários das pessoas falecidas ro: aniversare a persoanelor decedate ru: годовщины Ñмерти sk: výroÄia zomretých osôb sl: obletnice umrlih oseb sv: Ã¥rsdagar för avlidna personer zh: 死亡于今日的记录 anniversaries of marriage af: huweliksherdenkinge bg: годишнини от Ñватба br: deizioù-ha-bloaz eured ca: aniversaris de casament cs: výroÄí sňatků da: Ã¥rsdage for bryllupper de: Hochzeitstage en: wedding Anniversaries eo: datrevenoj de edziÄo es: aniversarios de casamiento et: pulma-aastapäevad fi: hääpäiviä fr: anniversaires de mariage he: ימי נישו×ין is: brúðkaupsafmæli it: anniversari di matrimonio lv: kÄzu dienas nl: huwelijksverjaardagen no: bryllupsdager oc: aniversaris de maridatge pl: rocznice Å›lubów pt: aniversários de casamento ro: aniversare de mariaj ru: годовщины брака sk: výroÄia svadieb sl: obletnice porok sv: bröllopsdagar zh: 结婚于今日的记录 any individual in the base de: jede beliebige Person im Stammbaum en: any individual in the family tree es: cualquier individuo del árbol fi: yksi henkilö sukupuussasi fr: n'importe quel individu de l'arbre it: un qualsiasi individuo dell’albero nl: om het even welk individu van de stamboom no: en person i ditt tre oc: quin individú que siá dins l'arbre pt: qualquer pessoa da árvore sv: en person i ditt träd are af: is bg: Ñа br: a zo ca: són cs: jsou da: er de: sind en: are eo: estas es: son et: on fi: ovat fr: sont he: ×”× is: eru it: sono lv: ir nl: zijn no: er oc: son pl: to pt: são ro: sint ru: еÑть sk: sú sl: so sv: är area code de: Ortskennziffer en: Code es: Código postal fi: Postinumero fr: Code Ville it: CAP nl: Postcode stad no: Postnummer oc: còde de comuna pt: Código postal sv: Postnummer ascendants tree de: Stammbaum der Vorfahren en: Family Tree es: árbol de ascendencia fi: Esipolvitaulu fr: arbre d’ascendance it: albero d'ascendenza nl: Stamboom voorouders no: Slektstre oc: arbre d’ascendéncia pt: árvore de ascendência sv: Antavla at the same time af: ter selfdertyd bg: едновременно br: war un dro ca: alhora cs: souÄasnÄ› da: pÃ¥ en gang de: zugleich en: at the same time eo: samtempe es: a la vez et: samal ajal fi: samaan aikaan fr: en même temps he: ×’× is: einnig it: nello stesso tempo lv: vienlaicÄ«gi nl: tegelijkertijd no: samtidig oc: a l'encòp pl: zarazem pt: ao mesmo tempo ro: in acelas timp ru: в то же Ñамое Ð²Ñ€ÐµÐ¼Ñ sk: v tom istom Äase sl: soÄasno sv: samtidigt average age at death bg: Ñредна продължителноÑÑ‚ на живота cs: priemerny vek umrtia da: gennemsnitlig alder ved død de: Durchschnittliches Sterbealter en: average age at death eo: meza aÄo dum la morto es: edad promedio de deceso et: keskmine eluiga fi: keskimääräinen kuolinikä fr: âge moyen de décès he: גיל פטירה ממוצע it: età media di morte lv: vidÄ“jais dzÄ«ves ilgums nl: gemiddelde leeftijd bij overlijden no: gjennomsnittsalder ved død oc: atge mejan de décès pl: Å›redni wiek Å›mierci pt: idade média ao morrer ro: virsta media la deces ru: примерный возраÑÑ‚ Ñмерти sk: priemerný vek v Äase úmrtia sl: povpreÄna starost ob smrti sv: medelÃ¥lder vid dödstillfället back af: terug bg: обратно br: distreiñ ca: tornar cs: zpÄ›t da: tilbage de: zurück en: back eo: reveno es: regreso et: tagasi fi: takaisin fr: retour he: חזרה is: til baka it: torna indietro lv: atpakaļ nl: terug no: tilbake oc: enrè pl: wstecz pt: voltar ro: inapoi ru: назад sk: späť sl: nazaj sv: tillbaka baptism af: doop bg: кръщение br: badeziant ca: bateig cs: kÅ™est da: dÃ¥b de: Taufe en: baptism eo: bapto es: bautismo et: ristimine fi: kaste fr: baptême he: תבילה is: skírn it: battesimo ks: krst lv: baptisms nl: doop no: dÃ¥p oc: baptisme pl: chrzest pt: baptismo pt-br: batismo ro: botez ru: крещение sl: krst sv: dop baptism place de: Ort der Taufe en: Place of baptism es: lugar de bautismo fi: Kastepaikka fr: lieu de baptême it: luogo del battesimo nl: doopplaats no: DÃ¥pssted oc: lòc de baptisme pt: local de batismo sv: dopplats baptism src de: Ort der Taufe en: Place of baptism es: lugar de bautismo fi: Kastepaikka fr: lieu de baptême it: luogo del battesimo nl: doopplaats no: DÃ¥pssted oc: lòc de baptisme pt: local de batismo sv: dop baptized af: gedoop bg: кръÑтен/кръÑтена/кръÑтен(а) br: badezet ca: batejat/batejada/batejat(ada) cs: pokÅ™tÄ›n/pokÅ™tÄ›na da: døbt de: getauft en: baptized eo: baptita es: bautizado/bautizada/bautizado(a) et: ristitud fi: kastettu fr: baptisé/baptisée/baptisé(e) he: לנצרות / נטבלה לנצרות נטבל is: skírð(ur) it: battezzato/battezzata/battezzato(a) lv: baptized nl: gedoopt no: døpt oc: batejat/batejada/batejat(ada) pl: chrzest pt: baptizado/baptizada/baptizado(a) pt-br: batizado/batizada/batizado(a) ro: botezat/botezata/botezat ru: крещеный sk: pokrstený/pokrstená sl: krÅ¡Äen/krÅ¡Äena sv: döpt base index notes af: notas ar: بطاقات bg: бележки br: notennoù ca: notes cs: poznámky da: noter de: Notizen en: notes eo: notoj:a:+n es: notas et: märkused:g:-id fi: lisätietoja fr: index des notes he: הערות is: athugasemdum it: note lv: piezÄ«me(s) nl: notities no: notater oc: nòtas pl: uwagi pt: notas ro: note ru: заметки sk: poznámky sl: zapiski sv: noteringar zh: 备注 base notes af: notas ar: بطاقات bg: бележки br: notennoù ca: notes cs: poznámky da: noter de: Notizen en: notes eo: notoj:a:+n es: notas et: märkused:g:-id fi: lisätietoja fr: chronique familiale he: הערות is: athugasemdum it: note lv: piezÄ«me(s) nl: notities no: notater oc: cronica familiala pl: uwagi pt: notas ro: note ru: заметки sk: poznámky sl: zapiski sv: noteringar zh: 备注 base wizard notes af: Medewerkers notas bg: админиÑтратори бележки br: strobinellerien notennoù ca: administrador notes cs: wizards notes da: bidragydere noter de: Meisters Notizen en: wizards notes eo: sorĉistoj notoj:a:+n es: magos notas et: teadmamehed märkused:g:-id fi: velho lisätietoja fr: notes magiciens he: הערות ×›×’×ון is: uppfæra athugasemdum it: wizard note lv: wizard piezÄ«me(s) nl: beheerder notities no: administratorer notater oc: nòtas dels fachilhièrs pl: wizard uwagi pt: feiticeiros notas ro: magician note ru: wizard заметки sk: wizards poznámky sl: Äarovnik zapiski sv: administratörer noteringar bat mitzvah de: bat Mizwa en: Bat Mitzvah es: bat mitzvah fi: Bar Mitzvah fr: bat mitzvah it: bat mitzvah (ebraico) nl: Bat Mitswa no: Bat Mitzvah oc: bar mitzvah pt: bar mitzvah sv: Bat Mitzvah before af: voor bg: преди br: a-raok ca: abans de cs: pÅ™ed da: før de: vor en: before eo: antaù es: antes et: enne fi: ennen fr: avant he: לפני is: áður it: prima lv: pirms nl: voor no: før oc: abans pl: przed pt: antes ro: inainte ru: перед sk: pred sl: pred sv: före before (date) af: voor bg: преди br: a-raok ca: abans de cs: pÅ™ed da: før de: vor en: before eo: antaù es: antes de et: enne :p: fi: ennen fr: avant he: לפני is: fyrir it: prima del lv: pirms nl: voor no: før oc: abans pl: przed pt: antes de ro: inainte de ru: до sk: pred sl: pred sv: före begin af: begin bg: започване br: deroù ca: començament cs: zaÄátek da: pÃ¥begyndelse de: Anfang en: begin eo: komenco es: principio et: algus fi: alku fr: début he: התחיל is: byrja it: inizio lv: sÄkums (begin) nl: begin no: start oc: començament pl: poczÄ…tek pt: começo ro: inceput ru: Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ sk: zaÄiatok sl: zaÄetek sv: börjar between (date) af: tussen bg: между br: etre ca: entre el cs: mezi da: mellem de: zwischen en: between eo: inter es: entre et: vahemikus fi: välillä fr: entre he: בין is: milli it: tra lv: starp nl: tussen no: mellom oc: entre pl: miÄ™dzy pt: entre ro: intre ru: между sk: medzi sl: med sv: mellan bibliography bg: Ð±Ð¸Ð±Ð»Ð¸Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ñ de: Bibliographie en: bibliography es: bibliografía fi: bibliografia fr: bibliographie it: bibliografia nl: bibliografie no: bibliografi oc: bibliografia pt: bibliografia sv: Bibliografi birth af: geboorte bg: раждане br: ganedigezh ca: naixement cs: narození da: fødsel de: Geburt en: birth eo: naskiÄo es: nacimiento et: sünd fi: syntymä fr: naissance he: לידה is: fæðing it: nascita lv: dzimÅ¡ana nl: geboorte no: fødsel oc: naissença pl: urodzenie pt: nascimento ro: nastere ru: рождение sk: narodenie sl: rojstva sv: födelse birth date and birth place de: Datum und Ort der Geburt en: Date & Place of birth es: fecha y lugar de nacimiento fi: Syntymäaika ja -paikka fr: date et lieu de naissance it: data e luogo di nascita nl: plaats en datum van geboorte no: Fødselsdato og fødselssted oc: data e lòc de naissença pt: data e local de nascimento sv: Födelsedatum och -plats birth place de: Ort der Geburt en: Place of birth es: lugar de nacimiento fi: Syntymäpaikka fr: lieu de naissance it: luogo di nascita nl: geboorteplaats no: Fødselssted oc: lòc de naissença pt: local de nascimento sv: Födelseplats birth src de: Ouellenangabe-Geburt en: Source of birth es: fuente nacimiento fi: Syntymätietojen lähde fr: source naissance it: fonte della nascita nl: bron geboorte no: Fødselskilde oc: font de la naissença pt: fonte nascimento sv: Födelse birthdays af: verjaarsdae bg: рождени дни br: deizioù ganedigezh ca: aniversaris cs: narozeniny da: fødselsdage de: Geburtstage en: birthdays eo: datrevenoj de naskiÄo es: cumpleaños et: sünnipäevad fi: syntymäpäiviä fr: anniversaires he: ימי הולדת is: afmælisdagar it: compleanni lv: dzimÅ¡anas dienas nl: verjaardagen no: fødselsdager oc: aniversaris pl: urodziny pt: aniversários pt-br: aniversários de nascimento ro: zi de nastere ru: дни Ñ€Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ sk: narodeniny sl: rojstni dnevi sv: födelsedagar zh: 出生于今日的记录 book of %s de: %s en: %s es: lista de %s fi: lista %s fr: liste des %s it: lista dei %s nl: lijst der %s no: liste over %s oc: lista dels %s pt: lista de %s sv: %s seznam book of ascendants de: Buch der Vorfahren en: Ancestry Book es: libro de ascendencia fi: Esivanhempainkirja fr: livre d’ascendance it: libro d’ascendenza nl: boek met voorouders no: forfedre-bok oc: libre d'ascendéncia pt: livro de ascendência sv: Förfädersbok border af: rand bg: рамка br: bord ca: contorn cs: okraj da: ramme de: Rand en: border eo: limo es: marcos et: ääris fi: rajaus fr: bordure he: מסגרת is: jaðar it: bordo lv: mala nl: omranding no: kantlinje oc: bordadura pl: granica pt: borda ro: bordura ru: рамка sk: okraj sl: okvir sv: kantlinje born af: gebore ar: ولد bg: роден/родена/роден(а) br: bet ganet ca: nascut/nascuda/nascut(uda) cs: narozen/narozena da: født de: geboren en: born eo: naskiÄinta es: nacido/nacida/nacido(a) et: sündinud fi: syntynyt fr: né/née/né(e) he: נלד/ נלדה is: fædd(ur) it: nato/nata/nato(a) lv: dzimÅ¡anas nl: geboren no: født oc: nascut/nascuda/nascut(uda) pl: urodzony/urodzona/urodzone pt: nascido/nascida/nascido(a) ro: născut/născută/născut ru: родилÑÑ/родилаÑÑŒ sk: narodený/narodená sl: rojen/rojena sv: född zh: 出生 branch/branches af: tak/takke bg: клон/клонове br: skourr/skourroù ca: branca/branques cs: vÄ›tev/vÄ›tve da: gren/grene de: Ast/Äste en: line/lines eo: branĉo/branĉoj es: rama/ramas et: haru/harud fi: sukuhaara/sukuhaarat fr: branche/branches he: ×¢× ×£/ ×¢× ×¤×™× is: grein/greinar it: ramo/rami lv: zars/zari nl: tak/takken no: gren/grener oc: branca/brancas pl: linia/linie pt: ramo/ramos ro: ramura ru: ветвь/ветви sk: vetva/vetvy sl: veja/veje sv: anlinje/anlinjer burial af: begrawe bg: погребение br: beziadur ca: enterrament cs: pohÅ™eb da: begravelse de: Beisetzung en: burial eo: entombigo es: entierro et: matus fi: hautaus fr: inhumation he: קבורה is: útför it: sepoltura lv: bÄ“res nl: begrafenis no: begravelse oc: sepultura pl: pogrzeb pt: enterro ro: inmormintare ru: похороны sk: pohreb sl: pogreb sv: begravning burial place de: Ort der Bestattung en: Place of burial es: lugar de inhumación fi: Hautauspaikka fr: lieu d'inhumation it: luogo di sepoltura nl: begraafplaats no: Begravelsessted oc: lòc de sepultura pt: local de sepultamento sv: Begravningsplats burial src de: Ouellenangabe-Bestattung en: Source of burial es: fuente inhumación fi: Hautaustietojen lähde fr: source inhumation it: fonte della sepoltura nl: bron begrafenis no: Begravelseskilde oc: font de la sepultura pt: fonte de sepultamento sv: Begravning buried af: begrawe bg: погребан/погребана br: douaridigezh ca: enterrat/enterrada/enterrat(ada) cs: pohÅ™ben/pohÅ™bena da: begravet de: beigesetzt en: buried eo: entombigita es: enterrado/enterrada/enterrado(a) et: maetud fi: haudattu fr: inhumé/inhumée/inhumé(e) he: קבור/ קבורה is: grafin(n) it: sepolto/sepolta/sepolto(a) lv: apbedÄ«ts nl: begraven no: begravet oc: enterrat/enterrada/enterrat(ada) pl: pochowany/pochowana/pochówek pt: enterrado/enterrada/enterrado(a) ro: inmormintat ru: похоронен/похоронена sk: pochovaný/pochovaná sl: pokopan/pokopana/pokopani sv: begravd calendar/calendars af: kalender/kalenders ar: تقويم/تقاويم bg: календар/календари br: deiziadur ca: calendari/calendaris cs: kalendář/kalendáře da: kalender/kalendere de: Kalender en: calendar/calendars eo: kalendaro/kalendaroj es: calendario/calendarios et: kalender/kalendrid fi: kalenteri/kalenterit fr: calendrier/calendriers he: לוח שנה/ לוחות שנה is: dagatal/dagatöl it: calendario/calendarii lv: kalendÄrs/kalendÄri nl: kalender/kalenders no: kalender/kalendere oc: calendièr/calendièrs pl: kalendarz/kalendarze pt: calendário/calendários ro: calendar/calendare ru: календарь/календари sk: kalendár/kalendáre sl: koledar/koledarji sv: kalender cancel GeneWeb links af: stop GeneWeb-skakels bg: без GeneWeb-линкове br: nulañ al liammoù GeneWeb ca: anul·lar els lligams GeneWeb cs: zruÅ¡it spoje GeneWebu da: uden GeneWeb-links de: GeneWeb-Links entfernen en: without GeneWeb links eo: nuligi GeneWeb-ajn ligilojn es: anular los lazos GeneWeb et: ilma GeneWebi viideteta fi: ei GeneWeb-linkkejä fr: annuler les liens GeneWeb he: בטל קשרי GeneWeb is: án GeneWeb tengla it: annullare i links lv: nerÄdÄ«t GeneWeb saites nl: zonder GeneWeb links no: uten GeneWeb koblinger oc: anullar los ligams GeneWeb pl: pomiÅ„ łącza GeneWeb pt: cancelar os links Geneweb ro: anuleaza conexiuni GeneWeb ru: без GeneWeb ÑÑылок sk: zruÅ¡iÅ¥ GeneWeb spojenia sl: brez GeneWeb povezav sv: inga GeneWeb länkar candidate father/candidate mother/candidate parents af: moontlike vader/moontlike moeder/moontlike ouers bg: възможен баща/възможна майка/възможни родители br: a c'hell bezañ tad/a c'hell bezañ mamm/a c'hell bezañ tud ca: possible pare/possible mare/possibles pares cs: pravdÄ›podobný otec/pravdÄ›podobná matka/pravdÄ›podobní rodiÄe da: mulig fader/mulig moder/mulige forældre de: möglicher Vater/mögliche Mutter/mögliche Eltern en: may be father/may be mother/may be parents eo: ebla patro/ebla patrino/eblaj gepatroj es: padre posible/madre posible/padres posibles et: oletatav isa/oletatav ema/oletatavad vanemad fi: mahdollinen isä/mahdollinen äiti/mahdolliset vanhemmat fr: père possible/mère possible/parents possibles he: ×ב ×פשרי/ ×× ×פשרית/ ×”×•×¨×™× ××¤×©×¨×™×™× is: sennilegur faðir/sennileg móðir/sennilegir foreldrar it: padre presunto/madre presunta/genitori presunti lv: iespeejamais tÄ“vs/iespÄ“jamÄ mÄte/iespÄ“jamie vecÄki nl: kandidaat vader/kandidaat moeder/kandidaat ouders no: mulig far/mulig mor/mulige foreldre oc: paire possible/maire possibla/parents possibles pl: prawdopodobny ojciec/prawdopodobna matka/prawdopodobni rodzice pt: suposto pai/suposta mãe/supostos pais ro: tata posibil/mama posibila/parinti posibili ru: возможный отец/Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð°Ñ Ð¼Ð°Ñ‚ÑŒ/возможные родители sk: pravdepodobný otec/pravdepodobná matka/pravdepodobní rodiÄia sl: možen oÄe/možna mati/možni starÅ¡i sv: möjlig far/möjlig mor/möjliga föräldrar candidate son/candidate daughter/candidate child af: moontlike seun/moontlike dogter/moontlike kind bg: възможен Ñин/възможна дъщерÑ/възможно дете br: a c'hell bezañ mab/a c'hell bezañ merc'h/ a c'hell bezañ bugel ca: possible fill/possible filla/possible fill(a) cs: pravdÄ›podobný syn/pravdÄ›podobná dcera/pravdÄ›podobné dítÄ› da: mulig søn/mulig datter/muligt barn de: möglicher Sohn/mögliche Tochter/mögliches Kind en: candidate son/candidate daughter/candidate child eo: ebla filo/ebla filino/eblaj idoj es: hijo posible/hija posible/hijo(a) posible et: oletatav poeg/oletatav tütar/oletatav laps fi: mahdollinen poika/mahdollinen tytär/mahdollinen lapsi fr: fils possible/fille possible/enfant possible he: בן ×פשרי/ בת ×פשרית/ ילד ×פשר is: sennilega sonur/sennilega dóttir/sennilega barn it: figlio presunto/figlia presunta/figlio presunto lv: iespÄ“jamais dÄ“ls/iespÄ“jamÄ meita/iespÄ“jamais bÄ“rns nl: kandidaat zoon/kandidaat dochter/kandidaat kind no: mulig sønn/mulig datter/mulig barn oc: filh possible/filha possibla/enfants possibles pl: prawdopodobny syn/prawdopodobna córka/prawdopodobne dzieci pt: suposto filho/suposta filha/supostos filhos ro: fiu posibil/fica posibila/copil posibil ru: возможный Ñын/Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð°Ñ Ð´Ð¾Ñ‡ÑŒ/возможный ребенок sk: pravdepodobný syn/pravdepodobná dcéra/pravdepodobné dieÅ¥a sl: možen sine/možna hÄerka/možni otroci sv: möjlig son/möjlig dotter/möjliga barn cannot access base af: databasis ontoeganklik bg: нÑма доÑтъп до базата br: n'eus tu ebet da vont e-barzh an bon roadoù ca: impossible accedir a la base cs: databáze je nepřístupná da: kan ikke nÃ¥ databasen de: Datenbank nicht erreichbar en: cannot access base eo: ne eblas eniri la bazon es: acceso a la base imposible et: ei saa pöörduda andmebaasi poole fi: tietokantaan ei pääse fr: impossible d’accéder à la base he: ×ין כניסה למ×גר המידע is: get ekki tengst gagnagrunni it: accesso alla base impossibile lv: nav iespÄ“jams piekļūt datu bÄzei nl: geen toegang tot bestand no: kan ikke nÃ¥ databasen oc: se pòt pas accedir a la basa pl: dostÄ™p do bazy jest niemożliwy pt: não se pode aceder à base pt-br: não pode acessar a base ro: nu pot accesa baza de date ru: нет доÑтупа к базе sk: databáza je neprístupná sl: baza podatkov ni dostopna sv: kan inte nÃ¥ databasen cannot change sex of a married person af: kan die geslag van 'n getroude persoon nie verander nie bg: не може да Ñе промени полът на човек в брак br: n'heller ket kemm reizh unan euredet ca: no es pot canviar el sexe d'una persona casada cs: nemohu zmÄ›nit pohlaví ženatého muže/nemohu zmÄ›nit pohlaví vdané ženy da: kan ikke ændre køn for en gift person de: kann das Geschlecht einer verheirateten Person nicht ändern en: cannot change sex of a married person eo: ne eblas aliigi sekson de edziÄinta persono es: no puede modificarse el sexo de una persona casada et: ei saa muuta abiellunud inimese sugu fi: et voi vaihtaa naimisissa olevan henkilön sukupuolta fr: on ne peut pas changer le sexe d’une personne mariée he: ×ין ×פשרות לשנות מין של ××“× × ×©×•×™ is: getur ekki breytt kyni giftrar manneskju it: non si può cambiare il sesso di una persona sposata lv: precÄ“tai personai nevar mainÄ«t dzimumu nl: kan het geslacht van een gehuwd persoon niet veranderen no: kan ikke endre kjønn til en gift person oc: se pòt pas cambiar lo sèxe d'una persona maridada pl: zmiana pÅ‚ci osoby pozostajÄ…cej w zwiÄ…zku małżeÅ„skim jest niemożliwa pt: não se pode modificar o sexo de uma pessoa casada ro: nu pot schimba sexul unei persoane casatorite ru: Ð½ÐµÐ»ÑŒÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ пол Ñупруга sk: nemožno zmeniÅ¥ pohlavie zosobášenej osoby sl: ne da se spremeniti spol poroÄene osebe sv: kan inte ändra kön pÃ¥ en gift person celebrities bg: знаменити хора ca: Celebritats de: Bekannte Persönlichkeiten en: Famous people es: Personas Famosas fi: Kuuluisat henkilöt fr: Personnes célèbres it: Personaggi Celebri nl: Bekende personen no: Berømte personer oc: Celebritats pt: pessoas célebres sv: Celebriteter change children's names af: verander kinders se name bg: да Ñе промени име на дете br: kemm anvioù ar vugale ca: canviar els noms dels fills cs: zmÄ›nit jména dÄ›tí da: ændre børns navne de: Namen der Kinder ändern en: update name of children eo: ÅanÄi nomojn de la idoj es: cambiar los nombres de los hijos et: muuda laste nimed fi: muuta lasten nimiä fr: changer noms des enfants he: עדכן שמות ×”×™×œ×“×™× is: breyta nafni barna it: cambiare i nomi dei figli lv: mainÄ«t bÄ“rnu vÄrdus nl: namen van kinderen wijzigen no: endre barnas navn oc: cambiar los noms dels enfants pl: zmieÅ„ imiona dzieci pt: alterar os nomes dos filhos ro: schimba numele copiilor ru: изменение имени ребенка sk: zmeniÅ¥ mená detí sl: spremeni imena otrok sv: ändra barnens namn change it (the number) yourself af: verander dit self bg: променете Ñами номера br: dibabit un niver all ca: elegiu-ne un altre cs: zmÄ›nit Äíslo da: vælg et andet de: ändere die Nummer selbst en: change it yourself eo: kaj ÅanÄu ion mem es: escoja otro et: muuda number ise fi: muuta se itse fr: choisissez-en un autre he: ולשנות בעצמך is: og breyttu því sjálf(ur) it: scieglietene un'altro lv: nomainiet to nl: verander het nummer zelf no: endre det selv oc: causissètz-vo'n autre pl: zmieÅ„ numer wÅ‚asnorÄ™cznie pt: escolha outro ro: schimba numarul tu insasi ru: измените его Ñами sk: zmeniÅ¥ Äíslo sl: spremenite sami sv: ändra det själv change name de: Namenswechsel en: Change of Name es: cambio de apellido fi: Nimen muuttaminen fr: changement de nom it: cambiamento di cognome nl: Naamsverandering no: Navneendring oc: cambiament de nom pt: modificar nome sv: Namnbyte changed order of children af: verander die volgorde van kinders bg: промÑна в поÑледователноÑтта на децата br: kemm urzh ar vugale ca: canvi de l'ordre dels fills cs: zmÄ›nit poÅ™adí dÄ›tí da: ændret rækkefølge for børn de: Reihenfolge der Kinder gewechselt en: changed order of children eo: ÅanÄo de la ordo de la idoj es: cambio del orden de los hijos et: laste järjekord muudetud fi: lasten järjestystä on muutettu fr: changement de l’ordre des enfants he: סדר ×”×™×œ×“×™× ×”×©×ª× ×” is: breytti röð barna it: ordine dei figli cambiato lv: mainÄ«t bÄ“rnu secÄ«bu nl: volgorde van de kinderen veranderd no: rekkefølgen er endret for barna til oc: cambiament de l'òrdre dels enfants pl: kolejność dzieci zostaÅ‚a zmieniona pt: mudar a ordem dos filhos ro: sa schimbat ordinea copiilor ru: изменÑющий порÑдок детей sk: zmeniÅ¥ poradie detí sl: zamenjan vrstni red otrok sv: ändrade ordningen för barnen changed order of family's events de: ändern der Reihenfolge familiäre Ereignisse en: change order of family facts es: cambio del orden de los acontecimientos familiares fr: changement de l'ordre des évènements familiaux it: modifica dell'ordine degli eventi di famiglia oc: cambiament de l'òrdre dels eveniments familials pt: modificar a ordem dos eventos familiares changed order of marriages de: Die Reihenfolge der Ehen wurde geändert en: Ordering of marriages has been changed es: el orden de los matrimonios ha sido cambiado fi: Avioliittojen järjestys on muuttunut fr: changement de l’ordre des unions it: modifica dell'ordine delle unioni nl: rangorde huwelijken wijzigen no: Rekkefølge av ekteskap er endret oc: cambiament de l'òrdre de las unions pt: modificar ordem das uniões sv: Utbytt ordning för bröllop changed order of person's events de: ändern der Reihenfolge bei Ereignissen des Individuums en: change order of individual facts es: cambio del orden de los acontecimientos del individuo fr: changement de l'ordre des évènements individu it: modifica dell'ordine degli eventi individuo oc: cambiament de l'òrdre dels eveniments d'un individú pt: modificar ordem dos eventos da pessoa child/children af: kind/kinders ar: Ø·Ùلة/Ø£Ø·ÙØ§Ù„ bg: дете/деца br: bugel/bugale ca: fill/fills cs: dítÄ›/dÄ›ti da: barn/børn de: Kind/Kinder en: child/children eo: ido:a:+n/idoj:a:+n es: hijo/hijos et: laps:g:+e/lapsed fi: lapsi/lapset fr: enfant/enfants he: ילד/ ×™×œ×“×™× is: barn/börn it: figlio/figli lv: bÄ“rns:a:-u/bÄ“rni nl: kind/kinderen no: barn/barn oc: enfant/enfants pl: dziecko/dzieci pt: filho/filhos ro: copil/copii ru: ребенок:g:--ка:a:--ка/дети sk: dieÅ¥a/deti sl: otrok/otroci sv: barn/barn zh: å­å¥³ children's names changed af: kinders se name is verander bg: името на детето е променено br: anvioù ar vugale a zo kemmet ca: noms dels fills canviats cs: jména dÄ›tí zmÄ›nÄ›na da: børns navne ændret de: Namen der Kinder geändert en: children's names changed eo: nomoj de la idoj ÅanÄitaj es: nombres de los hijos cambiados et: laste nimed muudetud fi: lasten nimiä on muutettu fr: noms des enfants changés he: שמות ×”×™×œ×“×™× ×”×•×—×œ×¤×• is: nafni barns breytt it: nomi dei figli cambiati lv: bÄ“rnu vÄrdi mainÄ«ti nl: namen van kinderen gewijzigd no: barnas navn endret oc: noms dels enfants cambiat pl: imiona dzieci zostaÅ‚y zmienione pt: nomes das crianças foram alterados ro: numele copiilor sa schimbat ru: Ð¸Ð¼Ñ Ñ€ÐµÐ±ÐµÐ½ÐºÐ° изменено sk: mená detí zmenené sl: spremenjena imena otrok sv: barnens namn ändrade click af: druk bg: щракнете br: klikit ca: premeu cs: kliknÄ›te da: klik de: klicke en: click eo: kliku es: cliquear et: klõpsa fi: napsauta fr: cliquez he: לחץ is: Ãtið it: seleziona lv: spiest nl: klik no: klikk oc: clicatz pl: kliknij pt: clicar ro: clic ru: нажмите sk: klik sl: kliknite sv: klicka click on "%s" af: druk "%s" bg: щракнете на "%s" br: klikit war "%s" ca: premeu sobre "%s" cs: kliknÄ›te "%s" da: klik "%s" de: klicke auf "%s" en: click on "%s" eo: kliku "%s" es: cliquear "%s" et: klõpsa "%s" fi: napsauta "%s" fr: cliquez sur « %s » he: לחץ "%s" is: Ãtið "%s" it: seleziona "%s" lv: spiest "%s" nl: klik "%s" no: klikk "%s" oc: clicatz sus "%s" pl: kliknij "%s" pt: clicar "%s" ro: clicheaza pe %s ru: нажмите "%s" sk: poklepte na "%s" sl: kliknite na "%s" sv: klicka "%s" close family de: naher Angehöriger en: a parent es: un amigo fi: sukulainen fr: un proche it: un parente nl: een naaste no: en slektning oc: un tanhent pt: familiar próximo sv: en släkting color af: kleur bg: цвÑÑ‚ br: liv ca: color cs: barva da: farve de: Farbe en: colour en-us: color eo: koloro es: color et: värv fi: väri fr: couleur he: צבע is: litur it: colore lv: krÄsa nl: kleur no: farge oc: color pl: kolor pt: côr ro: culoare ru: цвет sk: farba sl: barva sv: färg comment af: kommentaar bg: коментар br: addispleg ca: comentari cs: komentář da: kommentar de: Kommentar en: comment eo: komento:a:+n es: comentario et: kommentaar fi: kommentti fr: commentaire he: הערה is: athugasemd it: commento lv: piebilde nl: commentaar no: kommentar oc: comentari pl: uwagi pt: comentário ro: comentar ru: комментарий sk: komentár sl: komentar sv: kommentar compare de: vergleichen en: Compare es: comparar fi: Vertaa fr: comparer it: paragonare nl: vergelijken no: Sammenlign oc: comparar pt: comparar sv: Jämför compare selected revisions de: die ausgewählten Revisionen vergleichen en: View revision history es: comparar las revisiones seleccionadas fi: Näytä tarkistushistoria fr: comparer les révisions sélectionnées it: paragonare le versioni selezionate nl: geselecteerde revisies vergelijken no: Vis revisjonshistorikk oc: comparar las revisions seleccionadas pt: comparar as revisões selecionadas sv: Jämför utvalda revisioner compute all marriages de: Lebenspartner mit einschließen en: Include spouses es: incluir todos los cónyuges fi: Sisällytä puolisot fr: inclure tous les conjoints it: includere tutti i coniugi nl: inbegrepen alle partners no: Inkluder ektefeller oc: inclusir totes los conjunts pt: incluir todos os cônjuges sv: Jämför alla giftermÃ¥l compute approximatives dates de: ungefähre Daten berücksichtigen en: Include unsure dates es: tener en cuenta las fechas aproximadas fi: Sisällytä epävarmat päivämäärät fr: prendre en compte les dates approximatives it: prendere in considerazione le date approssimative nl: rekening houden met approximatieve data no: Inkluder usikre datoer oc: inclusir totes los conjunts pt: ter em conta as datas aproximadas sv: Jämför approxamativa datum connections bg: потребителÑки връзки cs: spojenia da: forbindelser de: Verbindungen en: connections eo: konektoj es: conexiones et: ühendused fi: yhteydet fr: connexions he: ×§×™×©×•×¨×™× it: connessioni lv: radniecÄ«ba nl: connecties no: koblinger oc: conneccions pl: połączenie pt: conexões ro: conexiuni ru: ÑвÑзи sk: spojenia sl: povpreÄna starost ob smrti sv: kopplingar consanguinity af: bloedverwantskap bg: кръвно родÑтво br: kenwadelezh ca: consanguinitat cs: pokrevenství da: blodsslægtskab de: Blutsverwandtschaft en: consanguinity eo: samsangeco es: consanguinidad et: veresugulus fi: verisukulaisuus fr: consanguinité he: קוסנגוויניות is: skyldleiki it: consanguineità lv: asinsradniecÄ«ba nl: bloedverwantschap no: blodsbÃ¥nd oc: consanguinitat pl: pokrewieÅ„stwo pt: consanguinidade ro: consanguinitate ru: родÑтво sk: pokrvenstvo sl: krvno sorodstvo sv: blodsband continue correcting af: gaan voort met die samevoeging bg: да продължи обединÑването br: derc'hel da gendeuziñ ca: continuar la fusió cs: pokraÄovat ve spojování da: fortsæt sammenføjning de: Zusammenführung fortsetzen en: continue merging eo: daùrigu la kuniÄon es: continuar la fusión et: jätka ühendamist fi: jatka yhdistämistä fr: continuer à corriger ? he: להמשיך ל×חד is: halda áfram að sameina it: continua la fusione lv: turpinÄt apvienoÅ¡anu nl: doorgaan met samenvoegen no: fortsett sammenslÃ¥ing oc: contunhar la fusion pl: kontynuuj scalanie pt: continuar a fusão ro: continua unificarea ru: продолжить объединение sl: nadaljuj z združevanjem sv: fortsätt slÃ¥ samman continue merging af: gaan voort met die samevoeging bg: да продължи обединÑването br: derc'hel da gendeuziñ ca: continuar la fusió cs: pokraÄovat ve spojování da: fortsæt sammenføjning de: Zusammenführung fortsetzen en: continue merging eo: daùrigu la kuniÄon es: continuar la fusión et: jätka ühendamist fi: jatka yhdistämistä fr: continuer à fusionner he: להמשיך ל×חד is: halda áfram að sameina it: continua la fusione lv: turpinÄt apvienoÅ¡anu nl: doorgaan met samenvoegen no: fortsett sammenslÃ¥ing oc: contunhar la fusion pl: kontynuuj scalanie pt: continuar a fusão ro: continua unificarea ru: продолжить объединение sk: pokraÄovaÅ¥ v spájaní sl: nadaljuj z združevanjem sv: fortsätt slÃ¥ samman continued bg: Ñледва cs: pokraÄuje da: fortsat de: fortgesetzt en: continued eo: continuigo es: continúa et: jätkub fi: jatkuu fr: suite he: המשך it: continua lv: nepÄrtraukts nl: vervolgd no: fortsatt oc: seguida pl: ciÄ…g dalszy pt: continuação ro: continuare ru: продолжено sk: pokraÄovaÅ¥ sl: nadaljevano sv: forts country de: Land en: Country es: País fi: Maa fr: Pays it: Stato nl: Land no: Land oc: País pt: País sv: Land county de: Regierungsbezirk en: County es: Subregión fi: Piirikunta fr: Sous-Région it: Provincia nl: Sub-regio no: Kommune oc: Departament pt: Distrito sv: Kommun cousins af: neefs/niggies bg: първи братовчеди br: kendirvi ca: cosins cs: bratranci/sestÅ™enice da: fætre og kusiner de: Cousins en: cousins eo: gekuzoj es: primos et: nõod fi: serkut fr: cousins he: בני ×“×•×“×™× is: systkynabörn it: cugini lv: brÄlÄ“ni/mÄsÄ«cas nl: neven en nichten no: fettere og kusiner oc: cosins/cosinas pl: kuzyni/kuzynki pt: primos ro: veri ru: кузены sk: bratranci/sesternice sl: bratranci/sestriÄne sv: kusiner cousins (general term) af: neefs en niggies bg: братовчеди br: kendirvi ca: cosins cs: pokrevní příbuzní da: fætre og kusiner de: Cousins en: cousins eo: gekuzoj es: primos et: kaimud fi: serkut fr: cousins he: בני ×“×•×“×™× is: frændfólk it: cugini lv: brÄlÄ“ni/mÄsÄ«cas nl: neven en nichten no: søskenbarn og flermenninger oc: cosins pl: kuzyni pt: primos ro: veri ru: кузены sk: pokrvní príbuzní sl: bratranci/sestriÄne sv: kusiner och flermänningar create af: skep bg: да Ñе Ñъздаде br: sevel ca: crear cs: vytvoÅ™it da: opret de: erzeugen en: create eo: krei es: crear et: loo fi: luo fr: créer he: עשה is: búa til it: creare lv: izveidot nl: aanmaken no: opprett oc: crear pl: utwórz pt: criar ro: creaza ru: Ñоздать sk: vytvor sl: ustvari sv: skapa cremated af: veras bg: кремиран/кремирана br: devet ca: incinerat/incinerada/incinerat(ada) cs: zpopelnÄ›n/zpopelnÄ›na da: bisat de: eingeäschert en: cremated eo: cindrigita es: incinerado/incinerada/incinerado(a) et: kremeeritud fi: polttohaudattu fr: incinéré/incinérée/incinéré(e) he: נשרפה גווייה is: brennd(ur) it: cremato/cremata/cremato(a) lv: kremÄ“ts(a) nl: gecremeerd no: kremert oc: incinerat/incinerada/incinerat(ada) pl: kremacja pt: cremado/cremada/cremado(a) ro: incinerat/incinerata/incinerati ru: кремирован/кремирована sk: spopolnený/spopolnená sl: ustvarjeno sv: kremerad database forum af: databasis forum bg: форум на базата от данни br: forum ar bon roadoù ca: fòrum de la base de dades cs: databázové fórum da: database-forum de: Datenbankforum en: database forum eo: datenbankforumo es: foro de la base de datos et: andmebaasi foorum fi: tietokantafoorumi fr: forum de la base de données he: דייון על מ×גר המידה התולדותי is: umræður it: forum della base di dati lv: datu bÄzes "ziņojumu dÄ“lis" nl: databank forum no: database forum oc: fòrum de la basa de donadas pl: forum bazy pt: fórum da base de dados ro: forumul basei de date ru: форум базы данных sk: databázové fórum sl: forum baze podatkov sv: databas forum date begin de: Anfangsdatum en: From es: fecha de inicio fi: Alkaen fr: date de début it: data d'inizio nl: begindatum no: Fra oc: data de començament pt: data de início sv: Datum frÃ¥n date end de: Enddatum en: To es: fecha final fi: Saakka fr: date de fin it: data di fine nl: einddatum no: Til oc: data de fin pt: data de fim sv: Datum slutar date of birth de: Geburtsdatum en: date of birth es: fecha de nacimiento fi: syntymäpäivämäärä fr: date de naissance it: data di nascita nl: geboortedatum no: fødselsdato oc: data de naissença pt: data de nascimento sv: födelsedatum date of death de: Todestag en: date of death es: fecha de defunción fi: kuolinpäivämäärä fr: date de décès it: data di morte nl: datum overlijden no: dødsdato oc: data de decès pt: data de óbito sv: dödsdatum date of marriage de: Hochzeitstag en: Date of marriage es: fecha de matrimonio fi: vihkipäivämäärä fr: date de l'union it: data dell'unione nl: huwelijksdatum no: dato for vielse oc: data de maridatge pt: data de casamento sv: vigseldatum date/dates af: datum bg: дата br: deiziad ca: data/dates cs: datum/data da: dato de: Datum en: date/dates eo: dato/datoj es: fecha/fechas et: kuupäev fi: päivämäärä fr: date/dates he: ת×ריך is: dagsetning it: data lv: datums nl: datum no: dato oc: data/datas pl: data pt: data/datas ro: data ru: дата sk: dátum/dáta sl: datum sv: datum days old af: dae oud bg: дни br: deiz ca: dies cs: dnů starý/dnů stará da: dage gammel de: Tage alt en: days old eo: tagoj es: días et: päeva fi: päivää vanha fr: jours he: ×™×ž×™× is: daga gamall it: giorni lv: dienas vecs nl: dagen oud no: dager gammel oc: jorns pl: dni pt: dias ro: zile ru: лет sk: dňov starý/dňov stará sl: dni star/dni stara sv: dagar death af: oorlede bg: Ñмърт br: marv ca: defunció cs: úmrtí da: død de: Tod en: death eo: morto es: muerte et: surm fi: kuolema fr: décès he: מוות is: látin(n) it: morte lv: nÄve nl: overleden no: død oc: decès pl: zgon pt: morte ro: deces ru: Ñмерть sk: úmrtie sl: smrti sv: död death date and death place de: Datum und Ort des Ablebens en: Date & Place of death es: fecha y lugar de defunción fi: Kuolinpäivä ja -paikka fr: date et lieu de décès it: data e luogo della morte nl: datum en plaats van overlijden no: Dødsdati og dødssted oc: data e lòc de decès pt: data e local do óbito sv: Dödsdatum och dödsplats death place de: Sterbeort en: Place of death es: lugar de defunción fi: Kuolinpaikka fr: lieu de décès it: luogo di morte nl: plaats van overlijden no: Dødssted oc: lòc de decès pt: local do óbito sv: Dödsplats death src de: Ouellenangabe-Ableben en: Source of death es: fuente defunción fi: Kuolintietojen lähde fr: source décès it: fonte della morte nl: bron overlijden no: Dødskilde oc: font del decès pt: fonte do óbito sv: Död delete af: verwyder bg: да нÑма br: lemel ca: esborrar cs: smazat da: slet de: löschen +before en: delete eo: detrui :a: es: borrar et: kustuta fi: poista fr: supprimer he: מחיקה is: eyða it: cancellare lv: izmest :a: nl: verwijderen +before no: fjern oc: escafar pl: usuÅ„ :a: pt: apagar ro: sterge ru: удалить :a: sk: zmazaÅ¥ sl: izbriÅ¡i sv: ta bort descendants af: Afstammelinge bg: потомци br: diskennidi ca: descendents cs: potomci da: efterkommere de: Nachkommen en: descendants eo: posteuloj es: descendientes et: järeltulijad fi: jälkeläiset fr: descendants he: צ×צ××™× is: afkomendur it: discendenti lv: pÄ“cteÄi nl: afstammelingen no: etterkommere oc: descendents pl: potomkowie pt: descendentes ro: descendenti ru: потомки sk: potomkovia sl: potomci sv: ättlingar zh: åŽä»£ descendants at the generation de: Generation der Nachkommen ... en: List by name es: descendientes en la generación... fi: Nimilista fr: descendants à la génération... it: discendenti fino alla generazione... nl: nakomelingen tot de ... generatie no: Liste etter navn oc: descendents a la ... generacion pt: descendentes na geração... sv: Ättlingar frÃ¥n denna generation died af: oorlede ar: توÙÙŠ bg: починал/починала/починал(а) br: marvet ca: mort/morta/mort(a) cs: zemÅ™el/zemÅ™ela/zemÅ™eli da: død de: verstorben en: died eo: mortinta es: fallecido/fallecida/fallecido(a) et: surnud fi: kuollut fr: décédé/décédée/décédé(e) he: נפטר/ נפטרה is: dó it: deceduto/deceduta/deceduto(a) lv: mirÅ¡anas nl: overleden no: død oc: mòrt/mòrta/mòrt(a) pl: zmarÅ‚/zmarÅ‚a/zgon pt: falecido/falecida/falecido(a) ro: a decedat ru: умер/умерла sk: zomrel/zomrela sl: umrl/umrla sv: död zh: æ­» died at an advanced age de: ist in hohem Alter verstorben en: Deceased of old age es: ha fallecido a una edad avanzada fi: kuollut vanhuuteen fr: est décédé à un âge avancé/est décédée à un âge avancé/est décédé(e) à un âge avancé it: è morto ad un'età avanzata/è morta ad un'età avanzata/è morto/a ad un'età avanzata nl: is overleden op gevorderde leeftijd no: død gammel oc: es mòrt plan vièlh/es mòrta plan vièlha/es mòrt(a) plan vièlh(a) pt: faleceu com uma idade avançada sv: Dog vid en hög Ã¥lder died young af: jonk oorlede bg: починал млад/починала млада/починал(а) млад(а) br: marvet ent-yaouank ca: mort jove/morta jove/mort(a) jove cs: zemÅ™el mladý/zemÅ™ela mladá/zemÅ™eli mladí da: død som ung de: jung gestorben en: dead as an infant eo: june mortinta es: muerto joven/muerta joven/muerto(a) joven et: suri noorelt fi: kuollut nuorena fr: mort jeune/morte jeune/mort(e) jeune he: נפטר בגיל צעיר/ נפטרה בגיל צעיר is: dó ung(ur) it: morto giovane lv: miris jauns nl: jong gestorven no: død ung oc: mòrt jove/mòrta jova/mòrt(a) jove(a) pl: zmarÅ‚ mÅ‚odo/zmarÅ‚a mÅ‚odo/zm.mÅ‚odo pt: morreu jovem ro: a decedat tinar ru: умер в детÑтве sk: zomrel mladý/zomrela mladá sl: umrl mlad/umrla mlada/umrl(a) mlad(a) sv: dog ung difference between the two revisions de: Unterschied zwischen den zwei Revisionen en: Revision history es: diferencia entre las dos revisiones fi: Tarkistushistoria fr: différence entre les deux révisions it: divario tra le due versioni nl: verschil tussen de twee revisies no: Revisjonshistorikk oc: diferéncia entre las doas revisions pt: diferença entre as duas revisões sv: skillnad mellan tvÃ¥ uppdateringar direct ancestor of %s de: direkter Vorfahre von %s en: direct ancestor of %s es: antepasado directo de %s fi: %s:n suora esivanhempi fr: ancêtre direct de %s it: antenato diretto di %s nl: rechtstreeks voorouder van %s no: direkte stamfar til %s oc: aujòl dirèct de %s pt: antepassado direto de %s sv: direkt förfader till %s disappeared af: verdwyn bg: изчезнал/изчезнала/изчезнал(а) br: steuzet ca: desaparegut/desapareguda/desaparegut(uda) cs: zmizel/zmizela/zmizeli da: forsvundet de: verschollen en: disappeared eo: malaperita es: desaparecido/desaparecida/desaparecido(a) et: kadunud fi: kadonnut fr: disparu/disparue/disparu(e) he: נעל×/ נעלמה is: hvarf it: scomparso/scomparsa/scomparso(a) lv: pazudis(usi) bez vÄ“sts nl: vermist no: forsvunnet oc: desaparegut/desapareguda/desaparegut(uda) pl: zaginÄ…Å‚/zaginęła/zaginiÄ™cie pt: desaparecido/desaparecida/desaparecido(a) ro: a disparut ru: иÑчез/иÑчезла sk: zmiznutý/zmiznutá sl: izginil/izginila/izginil(a) sv: försvunnen disconnect bg: да Ñе прекъÑне връзката cs: odpojené da: afbryd de: abmelden en: log out eo: diskonekti es: desconectar et: logi välja fi: yhteyskatko fr: déconnecter he: התנתק it: disconnettere lv: atvienot nl: uitloggen no: logg ut oc: desconnectar pl: rozłącz pt: desconectar ro: deconectare ru: отключить sk: odpojené sl: prekinjeno sv: logga ut display Aboville number de: Sosa/Kekule-Nummer anzeigen en: Display Sosa number es: editar la numeración de Aboville fi: Näytä sosa-numero fr: afficher la numérotation d’Aboville it: visualizzare la numerazione d'Aboville nl: de d'Aboville nummering tonen no: Vis Sosa nummer oc: afichar la numerotacion d'Aboville pt: exibir a numeração de Aboville sv: Visa Aboville nummer display border tree de: rahmen in den Bäumen zeigen en: display frame es: editar los marcos a los árboles fi: näytä rajat fr: afficher les bordures aux arbres it: visualizzare i bordi degli alberi nl: rand van de stambomen tonen no: vis kantlinje oc: afichar las bordadura dels arbres sv: visa kantlinje display by slices/slice width/overlap/total width af: weergawe per gedeelte/gedeelte breedte/oorvleul/totale breedte bg: да Ñе покаже на чаÑти/широчина на чаÑтите/заÑтъпване/обща широчина br: diskouez dre rannnoù/ledander ar rann/etrekolonennadur/ledander en holl ca: visualitzar per seccions/llargada de la secció/encavalcament/llargada total cs: zobraz po segmentech/šířka segmentu/pÅ™ekrytí/celková šířka da: vis ved delte sider/sidebredde/overlapning/total bredde de: Anzeige in Segmenten/Segmentbreite/Überlappung/Gesamtbreite en: display by slices/slice width/overlap/total width eo: montro intervale/amplekso de la intervalo/supermeto/tutamplekso es: mostrar en segmentos/ancho de segmento/superpuesto/ancho total et: kuva osadena/osa laius/ülekate/kogulaius fi: näytä jaettuna kaistoihin/kaistan leveys/ylitys/koko leveys fr: affichage par tranches/largeur de la tranche/chevauchement/largeur totale he: הצג רצועות / רוחב רצועות / חפיפה / ס"×” רוחב is: sýnt í hlutum/breidd hlutans/skörun hlutanna/öll breiddin it: visualizzare per segmenti/larghezza del segmento/sovrapposizione/larghezza totale lv: rÄdÄ«t pa loksnÄ“m/loksnes platums/pÄrklÄjums/kopÄ“jais platums nl: weergave per segment/segmentbreedte/overlapping/totale breedte no: vis med delte sider/sidebredde/overlapping/total bredde oc: afichar per seccions/largor de la seccion/cavalcament/largor totala pl: wyÅ›wietl w segmentach/szerokość segmentu/szerokość pokrywania siÄ™/szerokość caÅ‚kowita pt: resultados por fracções/largura da fracção/sobreposição/largura total ro: resultat segmentat/largimea segmentului/acoperire/largimea totala ru: отображать чаÑтами/ширина чаÑти/перекрытие/Ð¾Ð±Ñ‰Ð°Ñ ÑˆÐ¸Ñ€Ð¸Ð½Ð° sk: zobraz po segmentoch/šírka segmentu/prekrytie/celková šírka sl: prikaži s pomoÄjo izsekov/Å¡irina izseka/prekrivanje/skupna Å¡irina sv: visa genom att dela sidan/sidbredd/överlappning/global bredd display by/branch/alphabetic order de: anzuzeigen/nach Zweigen/alphabetisch geordnet en: display by:/line/alphabetical order es: edición por:/ramas/orden alfabético fi: näytetään:/sukuhaaroittain/aakkosjärjestyksessä fr: affichage par :/branches/ordre alphabétique it: visualizzazione per:/rami/ordine alfabetico nl: tonen per:/tak/alfabetische volgorde no: vises etter:/grener/alfabetisk orden oc: afichatge per:/brancas/òrdre alfabetic pt: exibir por:/ramos/ordem alfabética sv: visas efter:/grenar/alfabetisk ordning display empty picture de: Bilder immer anzeigen en: Display picture es: editar siempre las imágenes fi: Näytä kuva fr: toujours afficher les images it: visualizzare sempre le immagini nl: altijd beelden tonen no: Vis bilde oc: sempre afichar los images pt: exibir sempre as imagens sv: Visa tom bild display generation de: nummer der Generation anzeigen en: display generation es: editar el número de generación fi: näytä sukupolvinumero fr: afficher les générations it: pubblicare il numero di generazioni nl: nummer van de generatie tonen no: vis generasjonsnummer oc: afichar los numèros de generacion pt: exibir as gerações sv: visa generations nummer display marriage date de: Hochzeitstag anzeigen en: Display date of marriage es: editar la fecha de casamiento fr: afficher la date de mariage it: visualizzare la data del matrimonio oc: afichar la data de maridatge display notes/sources inline de: einschließen der Notizen/Quellen und Inhalt en: Add notes & sources es: incluir las notas/fuentes en el contenido fr: inclure les notes/sources au contenu it: includere le note/fonti al contenuto oc: apondre las nòtas dins lo contengut display picture de: Porträt zeigen en: display family picture es: editar retrato fi: näytä kuvat fr: afficher les photos it: visualizzare il ritratto nl: de foto's tonen no: vis bilder oc: afichar las fòtos pt: exibir as fotos sv: visa bilder display smallest sosa number relative to ancestor de: Implexe anzeigen en: display pedigree collapse es: editar las implexiones fi: näytä sukupolvikato fr: afficher les implexes it: pubblicare il antenati consanguinei nl: kwartierherhaling tonen no: vis anesammenfallet (anetapet) oc: afichar los implèxes pt: exibir os implexos sv: visa anförlusten display spouse de: ehepartner anzeigen en: display spouse es: editar cónyuge fi: näytä puolisot fr: afficher conjoint it: visualizzare il coniuge nl: partner tonen no: vis ektefeller oc: afichar lo conjunt pt: exibir cônjuge sv: visa makar display this marriage in this order de: diese Verbindung an seine Position setzen en: Change order of marriage es: colocar esta unión en posición fi: Vaihda avioliiton järjestystä fr: placer cette union en position it: sistemare quest'unione in posizione nl: dit huwelijk plaatsen als aangeduid no: Endre sortering av ekteskap oc: plaçar aquela union en posicion pt: colocar esta união em posição sv: Byt ordning pÃ¥ vigsel divorce af: geskei bg: развод br: dibriedelezh ca: divorci cs: rozvod da: skilsmisse de: Scheidung en: divorce eo: eksedziÄo es: divorcio et: lahutus fi: avioero fr: divorce he: גירושין is: skilja it: divorzio lv: šķirÅ¡anÄs nl: scheiding no: skilsmisse oc: divòrci pl: rozwód pt: divórcio ro: divort ru: развод sk: rozvod sl: loÄitev sv: skilsmässa divorced af: geskei bg: разведени br: dibriedet ca: divorciats cs: rozvedeni da: skilt de: geschieden en: divorced eo: eksedziÄintaj es: divorciados et: lahutatud fi: eronneet fr: divorcés he: ×’×¨×•×©×™× is: skildi it: divorziati lv: šķīruÅ¡ies nl: gescheiden no: skilt oc: divorciats pl: rozwiedzeni pt: divorciados ro: divortati ru: в разводе sk: rozvedení sl: loÄena sv: skilda don't group the common branches together af: moet nie takke van ooreenstemende oorsprong saamvoeg nie bg: да не Ñе обединÑват общите клонове br: n'eo ket dav kendastum ar skourroù boutin ca: no reagrupar les branques comunes cs: nespojovat spolecné vetve da: slÃ¥ ikke fælles anelinier sammen de: gemeinsame Zweige nicht zusammenfassen en: don't group the common branches together eo: ne grupigu la branĉojn komunajn es: no agrupar las ramas comunes et: ära grupeeri ühiseid harusid fi: älä kokoa yhteisiä sukuhaaroja yhteen fr: ne pas regrouper les branches communes he: ×œ× ×œ×©×œ×‘ ענפי משפחה ×ž×©×•×ª×¤×™× is: ekki slá saman sameiginlegum ættingjum it: non raggruppare i rami comuni lv: negrupÄ“t kopÄ“jos zarus kopÄ nl: voeg de gemeenschappelijke takken niet samen no: sammenfallende anelinjer skal ikke slÃ¥s sammen oc: agropar pas las brancas comunas pl: nie grupuj wspólnych linii razem pt: não reagrupar os ramos comuns ro: nu grupa ramuri comune inpreuna ru: не группировать оÑновные ветви вмеÑте sk: nespájaÅ¥ spoloÄné vetvy sl: ne zbiraj skupnih vej sv: gruppera inte ihop de gemensamma anlinjerna don't know af: onbekend bg: не Ñе знае br: n'ouzon ca: no se sap cs: není známo da: ved ikke de: unbekannt en: unknown eo: ne scias es: desconocido et: pole teada fi: ei tiedossa fr: ne sais pas he: ×œ× ×™×•×“×¢ is: veit ekki it: non si sa lv: nav zinÄms nl: onbekend no: vet ikke oc: sap pas pl: nie wiadomo pt: não sei ro: nu stiu ru: не извеÑтен sk: nie je známe sl: ni znano sv: vet ej end af: einde bg: край br: echu eo ca: fi cs: konec da: ophør de: Ende en: end eo: fino es: fin et: lõpp fi: loppu fr: fin he: סוף is: endar it: fine lv: beigas nl: einde no: slutt oc: fin pl: koniec pt: fim ro: sfirsit ru: ÐºÐ¾Ð½Ñ‡Ð°Ñ sk: koniec sl: konec sv: slutar engaged af: verloof bg: Ñгодени br: dimezet ca: promesos cs: snoubenci da: forlovet de: verlobt en: engaged eo: gefianĉigintaj es: comprometidos et: kihlatud fi: kihloissa fr: fiancés he: מ××•×¨×¡×™× is: trúlofuð it: fidanzati lv: saderinÄti nl: verloofd no: forlovet oc: promesos pl: zarÄ™czyny pt: Noivos ro: logodit ru: помолвлены sk: snúbenci sl: zaroka sv: förlovad engaged%t to af: verloof%t aan bg: Ñгоден%t Ñ/Ñгодена%t Ñ br: dimezet%t gant ca: promès%t amb/promesa%t amb cs: zasnoubený s/zasnoubená s da: forlovet%t med de: verlobt%t mit en: engaged%t to eo: fianĉigita%t kun/fianĉinigita%t kun es: comprometido%t con/comprometida%t con et: kihlatud%t fi: kihloissa%t kanssa fr: fiancé%t avec/fiancée%t avec he: הת×רס %t ×¢×/ הת×רסה %t ×¢× is: trúlofaðist%t it: fidanzato%t con/fidanzata%t con lv: saderinÄts%t ar nl: verloofd%t met no: forlovet%t med oc: promés%t amb/promesa%t amb pl: zarÄ™czony%t z:/zarÄ™czona%t z: pt: noivo%t de/noiva%t de ro: logodit%t cu/logodita%t cu ru: %t помолвлен Ñ sk: zasnúbený %t s/zasnúbená %t s sl: zaroÄen z %/zaroÄena z sv: förlovad%t med error af: fout bg: грешка br: fazi ca: error cs: chyba da: fejl de: Fehler en: error eo: eraro es: error et: viga fi: virhe fr: erreur he: שגי××” is: villa it: errore lv: kļūda nl: fout no: feil oc: error pl: błąd pt: erro ro: eroare ru: ошибка sk: chyba sl: napaka sv: fel estate af: landgoed bg: меÑтоуказание към титлата br: domani ca: lloc cs: místo da: ophav de: Ort en: fief eo: nobelbieno es: lugar et: valdus fi: tila fr: domaine he: ×ž×§×•× is: staður it: luogo lv: Ä«paÅ¡ums nl: plaats no: sted oc: domeni pl: domena pt: lugar pt-br: localidade ro: localitate ru: меÑто sk: miesto sl: posestvo sv: plats zh: 地点 exact af: presies bg: точно br: rik-ha-rik ca: exacte cs: pÅ™esnÄ› da: nøjagtigt de: genau en: exact eo: korekta es: exacto et: täpselt fi: tarkka fr: exact he: מדויק is: nákvæmlega it: esatto lv: tieÅ¡s nl: precies no: eksakt oc: exacte pl: dokÅ‚adnie pt: exacta pt-br: exata ro: exact ru: в точноÑти sk: presne sl: toÄno sv: exakt executed (legally killed) af: teregsgestel bg: екзекутиран/екзекутирана/екзекутиран(а) br: lakaet d'ar marv ca: executat/executada/executat(ada) cs: popraven/popravena/popraven(a) da: henrettet de: hingerichtet en: executed eo: ekzekutita es: ejecutado/ejecutada/ejecutado(a) et: hukatud fi: teloitettu fr: exécuté/exécutée/exécuté(e) he: ×”×•×¦× ×œ×”×•×¨×’/ הוצ××” להורג is: líflátin(n) it: giustiziato/giustiziato/giustiziato(a) lv: sodÄ«ts(a) ar nÄvi nl: geëxecuteerd no: henrettet oc: executat/executada/executat(ada) pl: egzekucja pt: executado/executada/executado(a) ro: executat ru: казнен/казнена sk: popravený/popravená/popravený(á) sl: usmrÄen/usmrÄena/usmrÄen(a) sv: avrättad families with encoding af: gekodeerde families bg: ÑемейÑтва Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð°Ð½Ðµ br: tiegezhioù gant bonegadur ca: famílies amb codi cs: rodiny s kódy da: familier med kodning de: Familien mit Kodierung en: families with encoding eo: familioj kun kodaĵo es: familias con código et: pered koos kodeeringuga fi: perheet koodeineen fr: familles avec codage he: משפחות ×¢× ×§×•×“×™× is: fjölskyldur með táknum it: famiglia con codice lv: Å¡ifrÄ“tÄs Ä£imenes nl: gezinnen met code no: familier med kode oc: familhas amb codatge pl: rodziny z kodowaniem pt: famílias com código ro: familie cu codare ru: Ñемейные коды sk: rodiny s kódmi sl: družine s kodami sv: familjer med kod family added af: familie bygevoeg bg: cемейÑтвото е добавено br: tiegezh ouzhpennet ca: família afegida cs: rodina pÅ™idána da: familie tilføjet de: Familie hinzugefügt en: family has been added eo: familio aldonita es: familia agregada et: pere lisatud fi: perhe lisätty fr: famille ajoutée he: משפחה הוספה is: fjölskyldu bætt við it: famiglia aggiunta lv: Ä£imene pievienota nl: gezin toegevoegd no: ny familie opprettet oc: familha aponduda pl: rodzina zostaÅ‚a dodana pt: família adicionada ro: familie adaugata ru: cÐµÐ¼ÑŒÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð½Ð° sk: rodina pridaná sl: družina dodana sv: ny familj tillagd family birthday de: Geburtstage naher Angehöriger en: family birthday es: cumpleaños de amigos fi: syntymäpäivät fr: anniversaires des proches it: compleanni dei parenti nl: verjaardagen van de naasten no: fødselsdager oc: aniversaris dins la familha pt: aniversários na família sv: födelsedagar family deleted af: familie uitgevee bg: данните за cемейÑтвото Ñа премахнати br: tiegezh lamet ca: família esborrada cs: rodina smazána da: familie slettet de: Familie gelöscht en: family has been deleted eo: familio nuligita es: familia borrada et: pere kustutatud fi: perhe poistettu fr: famille supprimée he: משפמה נמחקה is: fjölskyldu eytt it: famiglia cancellata lv: Ä£imene izdzÄ“sta nl: gezin verwijderd no: familie fjernet oc: familha escafada pl: rodzina zostaÅ‚a usuniÄ™ta pt: família suprimida ro: familie suprimata ru: cÐµÐ¼ÑŒÑ ÑƒÐ´Ð°Ð»ÐµÐ½Ð° sk: rodina zmazaná sl: družina izbrisana sv: familj borttagen family history de: rund um den Stammbaum en: family History es: acerca del árbol fi: sukupuun lisäksi fr: autour de l’arbre it: attorno all'albero nl: rond de stamboom no: tillegg til slektstreet oc: subre l'arbre pt: autor da árvore sv: utöver släktträdet family modified af: familie verander bg: данните за cемейÑтвото Ñа променени br: tiegezh kemmet ca: família modificada cs: rodina zmÄ›nÄ›na da: familie ændret de: Familie geändert en: family modified eo: familio modifita es: familia modificada et: pere muudetud fi: perhettä muokattu fr: famille modifiée he: משפחה העודכנה is: fjölskyldu breytt it: famiglia modificata lv: Ä£imene labota nl: gezin veranderd no: familie endret oc: familha modificada pl: rodzina zostaÅ‚a zmodyfikowana pt: família modificada ro: familie modificata ru: cÐµÐ¼ÑŒÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð° sk: rodina zmazaná sl: družina spremenjena sv: familj ändrad family source de: Quellenangabe-Familie en: Source es: fuente familiar fi: Lähde fr: source famille it: fonte di famiglia nl: bron familie no: Kilde oc: font de la familha pt: fonte familiar sv: Familjekällor family/families af: familie/families bg: данни за ÑемейÑтвото br: tiegezh/tiegezhioù ca: família/famílies cs: rodina:a:-u/rodiny da: familie/familier de: Familie/Familien en: family/families eo: familio:a:+n/familioj:a:+n es: familia/familias et: pere/pered fi: perhe/perheet fr: famille/familles he: משפחה/ משפחות is: fjölskyldu/fjölskyldum it: famiglia/famiglie lv: Ä£imeni/Ä£imenes nl: gezin/gezinnen no: familie/familier oc: familha/familhas pl: rodzina:a:-Ä™/rodziny pt: família/famílias ro: familie/fmalilii ru: ÑемьÑ:a:-ÑŽ:g:-и/Ñемьи sk: rodina:a:-u/rodiny sl: družina/družine sv: familj/familjer father/mother af: vader/moeder bg: баща/майка br: tad/mamm ca: pare/mare cs: otec/matka da: fader/moder de: Vater/Mutter en: father/mother eo: patro/patrino es: padre/madre et: isa/ema fi: isä/äiti fr: père/mère he: ×ב/ ×× is: faðir/móðir it: padre/madre lv: tÄ“vs/mÄte nl: vader/moeder no: far/mor oc: paire/maire pl: ojciec/matka pt: pai/mãe ro: tata/mama ru: отец/мать sk: otec/matka sl: oÄe/mati sv: far/mor field required de: Angabe obligatorisch en: Required es: introducción obligatoria fr: saisie obligatoire it: inserimento obbligatorio oc: sasida obligatòria pt: campo obrigatório file af: lêer bg: файл br: fichennaoueg ca: fitxer cs: soubor da: fil de: Datei en: file eo: sliparo es: fichero et: fail fi: tiedosto fr: fichier he: קובץ is: skrá it: file lv: datne nl: bestand no: fil oc: fichièr pl: plik pt: ficheiro pt-br: arquivo ro: fisier ru: файл sk: súbor sl: datoteka sv: fil first free number af: eerste beskikbare nommer bg: пръв Ñвободен номер br: niverenn frank kentañ ca: primer número lliure cs: první volné Äíslo da: første ledige løbenummer de: erste freie Nummer en: first free number eo: unua dispona nombro es: primer número libre et: esimene vaba number fi: ensimmäinen vapaa numero fr: premier numéro libre he: המספר החופשי הר×שון is: fyrsta lausa númer it: primo numero disponibile lv: pirmais brÄ«vais skaitlis nl: eerste beschikbare nummer no: første ledige nummer oc: primièr numèro disponible pl: najniższy wolny numer pt: primeiro número livre ro: primul numar liber ru: первый Ñвободный номер sk: prvé voľné Äíslo sl: prva prosta Å¡tevilka sv: första lediga nummer first name alias af: bynaam bg: друго ÑобÑтвено име br: lezanv ca: àlies del nom cs: alias kÅ™estního jména da: fornavns alias de: Vornamen-Alias en: alternate First Name eo: aliasa:a:+n propra:a:+n nomo:a:+n es: nombre alias et: muu eesnimi fi: etunimen alias fr: prénom alias he: ×©× ×¤×¨×˜×™ ×חר is: gælunafn á fornafni it: alias del nome lv: iesaukas vÄrds nl: alias voor voornaam no: fornavn alias oc: escais del prenom pl: alias imienia pt: alias do nome pt-br: apelido do prenome ro: alias de prenume ru: Ð¸Ð¼Ñ Ð¾Ñ‚Ñ‡ÐµÑтво sk: alias mena sl: drugo osebno ime sv: förnamns alias first name missing af: voornaam ontbreek bg: ÑобÑтвеното име липÑва br: raganv o tioueriñ ca: falta el nom cs: kÅ™estní jméno chybí da: fornavn mangler de: fehlender Vorname en: first name missing eo: propra nomo mankanta es: falta el nombre et: eesnimi puudub fi: etunimi puuttuu fr: prénom manquant he: ×©× ×¤×¨×˜×™ חסר is: fornafn vantar it: manca il nome lv: trÅ«kst vÄrda nl: voornaam ontbreekt no: fornavn mangler oc: manca lo prenom pl: brak imienia pt: falta o nome pt-br: falta o prenome ro: numele lipseste ru: Ð¸Ð¼Ñ Ð¿Ñ€Ð¾Ð¿ÑƒÑ‰ÐµÐ½Ð¾ sk: chýba meno sl: manjka osebno ime sv: förnamn saknas first name not found af: voornaam nie gevind nie bg: ÑобÑтвеното име не е намерено br: n'eo ket bet kavet ar raganv ca: nom no localitzat cs: kÅ™estní jméno nebylo nalezeno da: fornavn ikke fundet de: Vorname nicht gefunden en: first name not found eo: propra nomo ne trovita es: nombre no encontrado et: eesnime ei leitud fi: etunimeä ei löydy fr: prénom pas trouvé he: ×©× ×¤×¨×˜×™ ×œ× × ×ž×¦× is: fornafn finnst ekki it: nome non trovato lv: vÄrds nav atrasts nl: voornaam niet gevonden no: finner ikke fornavn oc: prenom pas trobat pl: imiÄ™ nie zostaÅ‚o znalezione pt: nome não encontrado pt-br: prenome não encontrado ro: nu am gasit prenumele ru: Ð¸Ð¼Ñ Ð½Ðµ найденно sk: meno nenájdené sl: osebno ime ni najdeno sv: hittar inte förnamn first name/first names af: voornaam/voorname ar: الإسم bg: ÑобÑтвено име/ÑобÑтвени имена br: raganv/raganvioù ca: nom/noms cs: kÅ™estní jméno/kÅ™estní jména da: fornavn/fornavne de: Vorname/Vornamen en: first name/first names eo: propra nomo/propraj nomoj es: nombre/nombres et: eesnimi/eesnimed fi: etunimi/etunimet fr: prénom/prénoms he: ×©× ×¤×¨×˜×™/ שמות ×¤×¨×˜×™×™× is: fornafn/fornöfn it: nome/nomi lv: vÄrds/vÄrdi nl: voornaam/voornamen no: fornavn/fornavn oc: prenom/prenoms pl: imiÄ™/imiona pt: nome/nomes pt-br: prenome/prenomes ro: prenume ru: имÑ/имена sk: meno/mená sl: osebno ime/osebna imena sv: förnamn/förnamn zh: å for the first names by alphabetic order af: om die voorname in alfabetiese volgorde te kry bg: за ÑобÑтвените имена по азбучен ред br: evit ar raganvioù dre urzh al lizherenneg ca: per veure els noms en ordre alfabètic cs: pro kÅ™estní jména v abecedním pořádku da: for fornavnene i alfabetisk orden de: für die Vornamen in alphabetischer Ordnung en: to display the results list by alphabetical order of first names eo: por la propraj nomoj laù la alfabeta ordo es: por los nombres en orden alfabético et: et järjestada eesnimed tähestiku järgi fi: etunimien mukaan aakkosjärjestyksessä fr: pour les prénoms par ordre alphabétique he: לשמות ×”×¤×¨×˜×™×™× ×‘×¡×“×¨ ×לף-בת is: fornöfn í stafrófsröð it: per il primo nome in ordine alfabetico lv: pa vÄrdiem alfabÄ“tiskÄ kÄrtÄ«bÄ nl: voor de voornamen in alfabetische volgorde no: alfabetisk pÃ¥ fornavn oc: pels prenoms per òrdre alfabetic pl: aby zobaczyć imiona w porzÄ…dku alfabetycznym pt: para obter os nomes próprios por ordem alfabética pt-br: para obter os prenomes por ordem alfabética ro: prenume in ordine alfabetica ru: чтобы упорÑдочить имена по алфавиту sk: podľa mena v abecednom poradí sl: za lastna imena po abecednem redu sv: för förnamnen i bokstavsordning for the list ordered by the date of the last modification bg: за ÑпиÑъка по дати на поÑледно изменение cs: pre vypis podla datumu poslednej zmeny da: for en liste sorteret efter datoen for seneste ændring de: für eine, nach dem Datum der letzten Änderung geordnete Liste en: for the list ordered by the date of the last modification eo: por la listo ordita laÇ” la dato de la lasta modifigo es: para la lista ordenada por fecha de la última modificación et: sorteerimaks nimekirja viimase muudatuse tegemise aja järgi fi: viimeisimmän muokkauspäivämäärän mukaan järjestettyä listaa varten fr: pour la liste par date de dernière modification he: לרשימה, ממוינת על פי ת×ריך עדכון ×חרון it: per la lista ordinata secondo la data dell'ultima modifica lv: sarakstam, kas sakÄrtots pÄ“c pÄ“dÄ“jo izmaiņu datumiem nl: voor de lijst, gesorteerd op datum van de laatste wijziging no: for listen sortert pÃ¥ siste endringsdato oc: per la lista triada per la darrièra modificacion pl: aby oglÄ…dać listÄ™ wedÅ‚ug daty ostatniej modyfikacji pt: para a lista ordenada por data da última modificação ro: pentru listă, după data ultimei modificări ru: Ð´Ð»Ñ ÑпиÑка отÑортированного по дате поÑледнего Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ sk: pre zoznam podľa dátumu poslednej zmeny sl: za seznam razvrÅ¡Äen po datumu zadnje spremembe sv: för listan över sista ändringsdatum foster father/foster mother/foster parents af: pleegvader/pleegmoeder/pleegouers bg: наÑтойник/наÑтойница/наÑтойници br: tad-mager/mamm-vagerezh/kerent magerien ca: pare adoptiu/mare adoptiva/pares adoptius cs: pÄ›stoun/pÄ›stounka/pÄ›stouni da: plejefader/plejemoder/plejeforældre de: Pflegevater/Pflegemutter/Pflegeeltern en: foster father/foster mother/foster parents eo: nutrinta patro/nutrinta patrino/nutrintaj gepatroj es: padre tutelar/madre tutelar/padres tutelares et: kasuisa/kasuema/kasuvanemad fi: kasvatusisä/kasvatusäiti/kasvatusvanhemmat fr: père nourricier/mère nourricière/parents nourriciers he: ×ב חורג/ ×× ×—×•×¨×’×ª/ ×”×•×¨×™× ×—×•×¨×’×™× is: fóstur foreldri it: padre facente funzioni/madre facente funzioni/genitori facenti funzioni lv: audþu tÄ“vs/mÄte/vecÄki nl: pleegvader/pleegmoeder/pleegouders no: fosterfar/fostermor/fosterforeldre oc: paire noiriguièr/maire noiriguièra/parents noiriguièrs pl: opiekun/opiekunka/opiekunowie pt: pai adoptivo/mãe adoptiva/pais adoptivos pt-br: pai de criação/mãe de criação/pais de criação ro: tata tutelar/mama tutelara/parinti tutelari ru: приемный отец/Ð¿Ñ€Ð¸ÐµÐ¼Ð½Ð°Ñ Ð¼Ð°Ñ‚ÑŒ/приемный родитель sk: pestún/pestúnka/pestúni sl: rejnik/rejnica/rejniki sv: fosterfar/fostermor/fosterföräldrar foster son/foster daughter/foster child af: pleegseun/pleegdogter/pleegkind bg: храненик/храненица/храненик или храненица br: mab desavet/merc'h desavet/bugel desavet ca: fill adoptiu/filla adoptiva/fills adoptius cs: schovanec/schovanka/schovanec da: plejesøn/plejedatter/plejebarn de: Pflegesohn/Pflegetochter/Pflegekind en: foster son/foster daughter/foster child eo: nutrita filo/nutrita filino/nutrita ido es: hijo acogido/hija acogida/niño(a) acogido(a) et: kasupoeg/kasutütar/kasulaps fi: kasvattipoika/kasvattitytär/kasvattilapsi fr: fils élevé/fille élevée/enfant élevé he: בן חורג/ בת חורגת/ ילד חורג is: fóstur sonur/dóttir fóstur barn it: figlio allevato/figlia allevato/bambino allevato lv: audþu dÄ“ls/meita/bÄ“rns nl: pleegzoon/pleegdochter/pleegkind no: fostersønn/fosterdatter/fosterbarn oc: filh noirit/filha noirida/enfants noirits pl: wychowanek/wychowanica/wychowankowie pt: filho adoptivo/filha adoptiva/filho(a) adoptivo(a) pt-br: filho de criação/filha de criação/filho(a) de criação ro: fiu tutelar/fica/tutelara/copil tutelar ru: приемный Ñын/Ð¿Ñ€Ð¸ÐµÐ¼Ð½Ð°Ñ Ð´Ð¾Ñ‡ÑŒ/приемный ребенок sk: opatrovanec/opatrovankyňa/opatrovanec sl: rejenec/rejenka/rejenec sv: fosterson/fosterdotter/fosterbarn full siblings af: broers en susters bg: Ð±Ñ€Ð°Ñ‚Ñ Ð¸ ÑеÑтри br: breudeur ha c'hoarezed ca: germans i germanes cs: sourozenci da: søskende de: Geschwister en: siblings eo: gefratoj es: hermanos y hermanas et: õed ja vennad fi: sisarukset fr: fratrie he: ××—×™× is: systkyni it: fratelli lv: brÄļi/mÄsas nl: broers en zusters no: søsken oc: fraires e sòrres pl: rodzeÅ„stwo pt: irmãos e irmãs ro: frati/surori ru: Ð±Ñ€Ð°Ñ‚ÑŒÑ Ð¸Ð»Ð¸ ÑеÑты sk: súrodenci sl: bratje in sestre sv: syskon generation/generations af: geslag/geslagte bg: поколение/Ð¿Ð¾ÐºÐ¾Ð»ÐµÐ½Ð¸Ñ br: rummad-tud/rummadoù-tud ca: generació/generacions cs: generace da: generation/generationer de: Generation/Generationen en: generation/generations eo: generacio:a:+n/generacioj es: generación/generaciones et: sugupõlv/sugupõlved fi: sukupolvi/sukupolvet fr: génération/générations he: דור / דורות is: kynslóð/kynslóðir it: generazione/generazioni lv: paaudzi/paaudzes nl: generatie/generaties no: generasjon/generasjoner oc: generacion/generacions pl: pokolenie/pokolenia pt: geração/gerações ro: generatie/generatii ru: поколение/поколений sk: generácia:a:-u/generácie sl: generacija/generacije sv: generation/generationer godfather/godmother/godparents af: peetpa/peetma/peetouers bg: кръÑтник/кръÑтница/кръÑтници br: paeron/maeronez/paeron ha maeronez ca: padrí/padrina/padrins cs: kmotr/kmotra/kmotr a kmotra da: gudfader/gudmoder/gudfader og gudmoder de: Taufzeuge/Taufzeugin/Taufzeuge und Taufzeugin en: godfather/godmother/godparents eo: baptopatro/baptopatrino/gebaptopatroj es: padrino/madrina/padrinos et: ristiisa/ristiema/ristivanemad fi: kummisetä/kummitäti/kummit fr: parrain/marraine/parrain et marraine he: סנדק/ סנדקית/ ×¡× ×“×§×™× is: guðfaðir/guðmóðir/guðforeldrar it: padrino/madrina/padrini lv: krustÄ“vs/krustmÄte/krustvecÄki nl: peter/meter/peetouders no: gudfar/gudmor/gudfedre oc: pairin/mairina/pairin e mairina pl: ojciec chrzestny/matka chrzestna/rodzice chrzestni pt: padrinho/madrinha/padrinhos ro: nas/nasa/nasi ru: креÑтный отец/креÑÑ‚Ð½Ð°Ñ Ð¼Ð°Ñ‚ÑŒ/креÑтный sk: krstný otec/krstná matka/krstní rodiÄia sl: boter/botra/botri sv: gudfar/gudmor/gudföräldrar godson/goddaughter/godchild af: peetseun/peetdogter/peetkind bg: кръщелник/кръщелница/кръщелник или кръщелница br: filhor/filhorez/filhor(ez) ca: fillol/fillola/fillol(a) cs: kmotÅ™enec/kmotÅ™enka/kmotÅ™enec da: gudsøn/guddatter/gudbarn de: Patensohn/Patentochter/Patenkind en: godson/goddaughter/godchild eo: baptofilo/baptofilino/baptofil(in)o es: ahijado/ahijada/ahijado(a) et: ristipoeg/ristitütar/ristilaps fi: kummipoika/kummityttö/kummilapsi fr: filleul/filleule/filleul(e) he: בן סנדק×ות/ בת סנדק×ות/ ילד סנדק×ות is: guðsonur/guðdóttir/guðbarn it: figlioccio/figlioccia/figlioccio lv: krustdÄ“ls/krustmeita/krustbÄ“rns nl: peetzoon/peetdochter/petekind no: gudsønn/guddatter/gudbarn oc: filhòl/filhòla/filhòl(a) pl: chrzeÅ›niak/chrzeÅ›niaczka/chrzeÅ›niak pt: afilhado/afilhada/afilhado(a) ro: finu/fina/finii ru: креÑтник/креÑтница/креÑтник sk: krstný syn/krstná dcéra/krstné deti sl: krÅ¡Äenec/krÅ¡Äenka/krÅ¡Äenci sv: gudson/guddotter/gudbarn grand-parents af: grootouers bg: дÑдо и баба br: an dud-kozh ca: avis cs: prarodiÄe da: bedsteforældre de: Großeltern en: grand-parents eo: geavoj es: abuelos et: vanavanemad fi: isovanhemmat fr: des grands-parents he: ×¡×‘×™× is: afi og amma it: nonni lv: vecvecÄki nl: grootouders no: besteforeldre oc: aujòls pl: dziadkowie pt: avós ro: bunici ru: прародители sk: prarodiÄia sl: stari starÅ¡i sv: farföräldrar/morföräldrar great-grand-parents af: oorgrootouers bg: прадÑдо и прабаба br: an dud-kuñv ca: besavis cs: praprarodiÄe da: oldeforældre de: Urgroßeltern en: great-grand-parents eo: gepraavoj es: bisabuelos et: vanavanavanemad fi: iso-isovanhemmat fr: des arrière-grands-parents he: רב-×¡×‘×™× is: langafi og langamma it: bisnonni lv: vecvecvecÄki nl: overgrootouders no: oldeforeldre oc: rèire-grands pl: pradziadkowie pt: bisavós ro: strabunici ru: прапрародители sk: praprastarí rodiÄia sl: prastari starÅ¡i sv: gammel-farföräldrar/gammel-morföräldrar gregorian/julian/french/hebrew af: gregoriaans/juliaans/frans/hebreeus bg: по нов Ñтил/по Ñтар Ñтил/френÑки/еврейÑки br: gregorian/juluan/republikan/hebrean ca: gregorià/julià/francès/hebreu cs: gregoriánský/juliánský/francouzský/židovský da: gregoriansk/juliansk/fransk rep./jødisk de: Gregorianisch/Julianisch/Französisch/Hebräisch en: Gregorian/Julian/French Republican/Hebrew eo: gregoriana/juliana/franca/hebra es: gregoriano/juliano/francés/hebreo et: gregooriuse/juuliuse/prantsuse revolutsiooni/juudi fi: gregoriaaninen/juliaaninen/Ranskan vallankumouksen/heprealainen fr: grégorien/julien/républicain/hébreu he: גרגורי/ יולי×× ×™/ צרפתי/ עברי is: gregorísk/julian/franskt/hebreskt it: gregoriano/giuliano/francese/ebraico lv: gregoriÄņu/jÅ«lija/franÄu/senebreju nl: gregoriaans/juliaans/Frans/Hebreeuws no: gregoriansk/juliansk/fransk rep./jødisk oc: gregorian/julian/republican/josieu pl: gregoriaÅ„ski/juliaÅ„ski/rewolucyjny francuski/hebrajski pt: gregoriano/juliano/francês/hebraico ro: gregorian/julian/francez/evreiesc ru: грегорианÑкий/юлианÑкий/французÑкий/еврейÑкий sk: gregoránsky/juliánsky/francúzsky/židovský sl: gregorijanski/julijanski/francoski/hebrejski sv: gregoriansk/juliansk/franska rep./hebreisk groom/bride af: man/vrou bg: Ñъпруг/Ñъпруга br: pried/pried ca: marit/muller cs: manžel/manželka da: mand/hustru de: Ehegatte/Ehefrau en: groom/bride eo: edzo/edzino es: esposo/esposa et: mees/naine fi: puoliso/puoliso fr: époux/épouse he: בעל/ ×שה is: eiginmaður/eiginkona it: sposo/sposa lv: vÄ«rs/sieva nl: echtgenoot/echtgenote no: mann/hustru oc: marit/molhèr pl: mąż/żona pt: marido/esposa ro: sot/sotie ru: муж/жена sk: manžel/manželka sl: mož/žena sv: partner/partner half siblings de: halbbrüder und-schwestern en: half-siblings es: hermanastros y hermanastras fi: puolisisarukset fr: demi frères et demi sÅ“urs it: fratellastri e sorellastre nl: half broers en zusters no: halvbrødre/halvsøstre/halvsøsken oc: frairastres e sorrastras pt: meios irmãos e meias irmãs sv: halvbröder och halvsystrar half-siblings de: Halbgeschwister en: Half-siblings es: hermanastros/as fi: Puolisisarukset fr: demi frères et demi sÅ“urs it: fratellastri e sorellastre nl: half broers en zusters no: Halvsøsken oc: frairastres e sorrastras pt: meios irmãos e irmãs sv: Halvsyskon happy birthday to them! de: Herzlichen Glückwunsch zum Geburtstag! en: happy birthday to them! es: ¡Feliz cumpleaños! fi: hyvää syntymäpäivää! fr: bon anniversaire ! it: buon compleanno! nl: van harte gefeliciteerd met Uw verjaardag! no: gratulerer med dagen! oc: lo bon aniversari! pt: feliz aniversário! sv: gratulerar pÃ¥ födelsedagen! happy birthday to you! af: Geluk met jou verjaarsdag! bg: ЧеÑтит рожден ден! br: kalz a vloavezhioù all deoc'h! ca: per molts anys cs: vÅ¡echno nejlepší k narozeninám! da: til lykke med fødselsdagen! de: Herzlichen Glückwunsch zum Geburtstag! en: happy birthday to you! eo: feliĉan datrevenon! es: ¡Feliz cumpleaños! et: palju õnne sünnipäevaks! fi: hyvää syntymäpäivää! fr: bon anniversaire! he: ×™×•× ×”×•×œ×“×ª שמח is: til hamingju með afmælið ! it: buon compleanno! lv: LaimÄ«gu dzimÅ¡anas dienu! nl: van harte gefeliciteerd met Uw verjaardag! no: gratulerer med dagen! oc: lo bon aniversari! pl: wszystkiego najlepszego w dniu urodzin! pt: feliz aniversário! ro: la multi ani! ru: Ñ Ð´Ð½ÐµÐ¼ Ñ€Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ñ‚ÐµÐ±Ñ! sk: vÅ¡etko najlepÅ¡ie k narodeninám! sl: sreÄen rojstni dan! sv: gratulerar pÃ¥ födelsedagen! having a family de: hat einen Lebenspartner und/oder Kinder en: Spouse and children are known es: tiene un cónyuge y/o hijos fi: Puoliso ja lapset tunnetaan fr: ayant une famille it: con coniuge e/o figli nl: met een familie no: Ektefelle og barn er kjent oc: amb una familha pt: tem um cônjuge e/ou filhos sv: Har en familj having as children af: met as kinders bg: деца br: anezho ez eo bet ganet bugale ca: fills cs: mÄ›li spolu dÄ›ti da: børn de: ihre Kinder en: with eo: havis ido(j)n es: con et: lapsed fi: lapset fr: dont he: ×¢× ×™×œ×“×™× is: börn it: da cui lv: bÄ“rni: nl: en hun kinderen no: barn oc: enfants pl: dzieci pt: tiveram ro: cu copii ru: имели детей sk: mali spolu deti sl: otroci sv: barn zh: 生有å­å¥³ having no family de: hat weder Kinder noch einen Lebenspartner en: Spouse and children are unknown es: no tiene hijos ni cónyuge fi: Puoliso ja lapset tuntemattomia fr: n'ayant pas de famille it: senza figli né coniuge nl: zonder familie no: Ektefell og barn er ukjent oc: sens familha pt: não tem cônjuge nem filhos sv: Har ingen familj help modify data de: Klicken Sie auf das zu korrigierende "Listen-Element": alle Dateien Ihres Baumes werden sofort korrigiert en: Click 'Update' to edit and your entire family tree will be automatically updated es: Pulse en "el elemento de la lista" que desee corregir: todas las fichas de su árbol se corregirán instantáneamente fi: Napsauta 'Päivitä' ja koko sukupuusi päivitetään automaattisesti fr: Cliquez sur l’élément de la liste que vous souhaitez corriger : l’ensemble des fiches de votre arbre sera instantanément corrigé it: Clicca su « l’elemento della lista » che vuoi correggere : l'insieme delle schede del tuo albero saranno istantaneamente corrette nl: Kliop op het 'lijstelement" dat gewijzigd moet worden: het geheel van de fichen van uw stamboom zullen onmiddellijk verbeterd worden no: Klikk 'Oppdater' for Ã¥ editere og hele ditt slektstre vil automatisk bli oppdatert oc: CLicatz sus l'element de modificar e totas las fichas del seu arbre seràn corregidas sulpic pt: Clique sobre o elemento da lista que pretende corrigir: a totalidade das fichas da sua árvore serão instantaneamente corrigidas sv: Hjälp att modifiera data help surname branch de: um die Zweige Ihres Stammbaums zu den Nachnamen zu erhalten, klicken Sie auf die Zahlenangabe der Baumzweige en: click a number to view family tree es: para obtener el árbol de las ramas patrónimicas, pulse en el número de las ramas fi: napsauta numeroa katsoksesi sukupuuta fr: pour obtenir l'arbre des branches patronymiques, cliquez sur le nombre de branches it: per ottenere l'albero dei rami patronimici, clicca sul numero di rami nl: om het aantal familietakken te bekomen, klikken op het aantal takken no: klikk pÃ¥ et nummer for Ã¥ se slektstre pc: per obténer l'arbre de las brancas patronimicas, clicatz sul nombre de brancas pt: para obter a árvore dos ramos patronímicos, clique no número dos ramos sv: Hjälp att hitta förnamn here af: hier bg: тук br: amañ ca: aquí cs: zde da: her de: hier en: here eo: tie es: aquí et: siia fi: tästä fr: ici he: ×›×ן is: hér it: qui lv: Å¡eit nl: hier no: her oc: aicí pl: tutaj pt: aqui ro: aici ru: здеÑÑŒ sk: tu sl: tukaj sv: här him/her af: sy/haar bg: мъж/жена br: eñ/hi ca: ell/ella cs: on/ona da: han/hun de: er/sie en: father or individual/mother or individual eo: li/Åi es: él/ella et: mees/naine fi: mies/nainen fr: lui/elle he: ×ותו/ ×ותה is: hans/hennar it: lui/lei lv: viņam/viņai nl: zijn/haar no: han/henne oc: el/ela pl: on/ona pt: ele/ela ro: el/ea ru: он/она sk: on/ona sl: on/ona sv: honom/henne history de: Verlauf en: History es: histórico fi: Historia fr: historique it: cronistoria nl: historiek no: Historikk oc: istoric pt: histórico sv: Historia history of updates af: bywerkingsgeskiedenis bg: иÑÑ‚Ð¾Ñ€Ð¸Ñ Ð½Ð° изменениÑта br: dezrevell an hizivadurioù ca: històric de les actualitzacions cs: historie zmÄ›n da: opdateringers historie de: verlauf der Updates en: history of Updates eo: historio de la Äisdatigoj es: histórico de las actualizaciones et: muudatuste ajalugu fi: Historia päivtetty fr: historique des mises à jour he: רשימת ×”×¢×“×›×•× ×™× is: uppfærslusaga it: cronistoria degli aggiornamenti lv: labojumu vÄ“sture nl: geschiedenis van de wijzigingen no: oppdateringshistorie oc: istoric dels cambiaments pl: rejestr zmian pt: historial das actualizações pt-br: histórico das atualizações ro: istoria de actualizare ru: иÑÑ‚Ð¾Ñ€Ð¸Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ð¹ sk: história zmien sl: zgodovina sprememb sv: lista över uppdateringarna horizontally af: horisontaal bg: хоризонтално дърво br: a-led ca: horitzontalment cs: horizontálnÄ› da: vandret de: horizontal en: horizontally eo: horizontale es: horizontal et: horisontaalselt fi: vaakasuoraan fr: horizontalement he: ×ופקי is: lárétt it: orizzontalmente lv: horizontÄli nl: horizontaal no: horisontalt oc: orizontalament pl: w poziomie pt: horizontalmente ro: orizontal ru: горизонтально sk: horizontálne sl: vodoravno sv: horisontellt husband/wife af: man/vrou bg: Ñъпруг/Ñъпруга br: pried/pried ca: marit/muller cs: manžel/manželka da: mand/hustru de: Ehemann/Ehefrau en: husband/wife eo: edzo/edzino es: esposo/esposa et: mees/naine fi: aviomies/aviovaimo fr: époux/épouse he: בעל/ ×שה is: eiginmaður/eiginkona it: marito/moglie lv: vÄ«rs/sieva nl: echtgenoot/echtgenote no: mann/hustru oc: marit/molhèr pl: mąż/żona pt: marido/esposa ro: sot/sotie ru: муж/жена sk: manžel/manželka sl: mož/žena sv: make/maka ident/email/subject af: ident/e-pos/onderwerp bg: идентификатор/e-mail/тема br: anv/postel/danvez ca: ident/email/tema cs: ident/email/pÅ™edmÄ›t (osoba?) da: navn/e-post/emne de: Name/E-Mail/Betreff en: ident/e-mail/subject eo: ident/email/objekto es: Nombre/Email/asunto et: nimi/e-post/teema fi: nimi/sähköposti/aihe fr: nom/e-mail/sujet he: ident/email/ × ×•×©× is: ident/email/um it: ident/email/oggetto lv: vÄrds/e-pasts/subjekts nl: identiteit/e-mail/onderwerp no: ident/epost/emne oc: nom/corric/subjècte pl: ident/email/temat pt: ident/email/assunto ro: identitate/email/subiect ru: идентификатор/email/тема sk: ident/email/predmet sl: ime/e-poÅ¡ta/vsebina sv: ident/email/ämne if titles af: as titels bg: ограничен br: ma vez titloù ca: si títols cs: jsou-li tituly da: hvis titler de: eingeschränkt en: if nobility titles eo: se nobeltitoloj es: si títulos et: kui on tiitlid fi: jos arvonimiä fr: si titres he: ×× ×‘×¢×œ(ת) תו×ר is: ef titlar it: se titoli lv: ja ir tituli nl: indien titels no: hvis titler oc: si i a de títols pl: jeÅ›li z tytuÅ‚em pt: se títulos ro: are titlu ru: еÑли титул sk: ak sú tituly sl: Äe so nazivi sv: om titlar iftitles/public/private de: Adelstitel/öffendlich/privat en: If titles/Public/Private es: si hay títulos/público/privado fr: si titres/public/privé it: se titoli/pubblico/privato oc: si i a de títols/public/privat image deleted af: prent ontbreek bg: изображението е премахнато br: skeudenn lamet ca: imatge esborrada cs: obrázek smazán da: billede slettet de: Bild gelöscht en: picture has been deleted eo: bildo detruita es: imagen suprimida et: pilt kustutatud fi: kuva tuhottu fr: image supprimée he: תמונה נמחקה is: mynd eytt it: immagine cancellata lv: attÄ“ls izmests nl: beeld verwijderd no: bildet er fjernet oc: imatge escafat pl: ilustracja zostaÅ‚a usuniÄ™ta pt: imagem suprimida ro: imagine suprimata ru: картинка удалена sk: obrázok zmazaný sl: slika izbrisana sv: bilden borttagen image received af: prent ontvang bg: изображението е получено br: skeudenn resevet ca: imatge rebuda cs: obrázek pÅ™ijat da: billede indsat de: Bild erhalten en: picture has been uploaded eo: bildo ricevita es: imagen recibida et: pilt vastu võetud fi: kuva vastaanotettu fr: image reçue he: התמונה התקבלה is: mynd móttekin it: immagine ricevuta lv: attÄ“ls saņemts nl: beeld ontvangen no: bildet er mottatt oc: imatge recebut pl: ilustracja zostaÅ‚a dołączona pt: imagem recebida ro: imagine receptionata ru: картинка получена sk: obrázok prijatý sl: slika sprejeta sv: bilden mottagen image/images af: prent/prente bg: изображение/Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ br: skeudenn/skeudennoù ca: imatge/imatges cs: obrázek/obrázky da: billede/billeder de: Bild/Bilder en: a picture/pictures eo: bildo:a:+n/bildoj es: imagen/imágenes et: pilt/pildid fi: kuva fr: image/images he: תמונה is: mynd it: immagine/immagini lv: attÄ“li nl: beeld/beelden no: bilde oc: imatge/imatges pl: ilustracja:a:-Ä™/ilustracje pt: imagem/imagens ro: imagine/imagini ru: картинку sk: obrázok/obrázky sl: slika/slike sv: bild/bilder in (month year) af: in bg: през br: e ca: el/l' cs: v da: i de: im en: in eo: en es: en et: :s: fi: fr: en he: ב- is: í it: nel lv: mÄ“nesÄ« nl: in no: i oc: en pl: w pt: em ro: in ru: в sk: v sl: v sv: i zh: 于 in (place) de: in en: in es: en fi: fr: à it: a nl: te no: i oc: a pt: em sv: i in (year) af: in bg: през br: e ca: el cs: v da: i de: im Jahre en: in eo: en es: en et: fi: fr: en he: ב- is:   it: nel lv: gads: nl: in no: i oc: en pl: w roku pt: em ro: in anul ru: в sk: v sl: v letu sv: zh: 于 include missing spouses af: ontbrekende ouers ingesluit bg: включително липÑващите Ñъпрузи и Ñъпруги br: enklozañ ar priedoù a vank ca: incloure els cònjuges que falten cs: vÄetnÄ› chybÄ›jících manželů/manželek da: medtag ukendte ægtefæller de: Fehlende Ehegatten einbeziehen en: include unknown spouses eo: inkludi mankantajn edz(in)ojn es: incluir los cónyuges faltantes et: kaasa puuduvad abikaasad fi: sisällytä puuttuvat puolisot fr: inclure les conjoints manquants he: כלל בני זוג ×”×—×¡×¨×™× is: meðtaldir makar sem vantar it: includere i coniugi mancanti lv: ieskaitot iztrÅ«kstoÅ¡os dzÄ«vesbiedrus nl: inclusief ontbrekende echtgenoten no: inkluder savnede ektefeller oc: inclure los conjunts que mancan pl: pokaż brakujÄ…cych małżonków pt: incluir os cônjugues que faltam ro: include soti necunoscuti ru: Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ð¿Ð¾Ñ‚ÐµÑ€Ñнных Ñупругов sk: vrátane chýbajúcich manželov/manželiek sl: vkljuÄi manjkajoÄe može/žene sv: inkludera makar som saknas include spouses af: eggenote ingesluit bg: включително Ñъпрузите и Ñъпругите br: enklozañ ar priedoù ca: incloure el cònjuges cs: vÄetnÄ› manželů/manželek da: medtag ægtefæller de: Ehegatten einbeziehen en: include spouses eo: inkludi edz(in)ojn es: incluir los cónyuges et: kaasa abikaasad fi: sisällytä puolisot fr: inclure les conjoints he: בלל is: meðtaldar makar it: includere i coniugi lv: ieskaitot dzÄ«vesbiedrus nl: inclusief echtgenoten no: inkluder ektefeller pl: pokaż małżonków oc: inclure los conjunts pt: incluir os cônjugues ro: include soti ru: Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ñупругов sk: vrátane manželov/manželiek sl: pokaži može/žene sv: inkludera makar incompatible sexes af: botsende geslagte bg: неÑъвмеÑтими полове br: reizhoù n'hellont ket klotañ ca: sexes incompatibles cs: nesprávné pohlaví da: køn inkompatible de: unverträgliche Geschlechter en: incompatible sexes eo: seksoj neakordigeblaj es: sexos incompatibles et: sobimatud sood fi: sukupuolet eivät täsmää fr: sexes incompatibles he: ××™ הת×מה ×‘×ž×™× ×™× is: kyn passa ekki it: sessi incompatibili lv: nesavietojami dzimumi nl: geslacht klopt niet no: uforenlig kjønn oc: sèxes incompatibles pl: niezgodne pÅ‚cie pt: sexos incompatíveis ro: sex incompatibil ru: неÑовмеÑтимый пол sk: nesprávne pohlavie sl: napaÄna spola sv: oförenliga kön incorrect date af: verkeerde datum bg: некоректна дата br: deiziad direizh ca: data incorrecta cs: nesprávné datum da: forkert dato de: falsches Datum en: incorrect date eo: nekorekta dato es: fecha incorrecta et: vigane kuupäev fi: virheellinen päivämäärä fr: date incorrecte he: בת×ריך שגוי is: vitlaus dagsetning it: data incorretta lv: nepareizs datums nl: incorrecte datum no: ugyldig dato oc: data incorrècta pl: nieprawidÅ‚owa data pt: data incorrecta pt-br: data incorreta ro: data incorecta ru: Ð½ÐµÐ¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð°Ñ Ð´Ð°Ñ‚Ð° sk: nesprávny dátum sl: napaÄen datum sv: fel datum incorrect request af: verkeerde navraag bg: некоректна заÑвка br: klask direizh ca: consulta incorrecta cs: nesprávný požadavek da: forkert anmodning de: falsche Anfrage en: incorrect request eo: nekorekta serĉado es: consulta incorrecta et: vigane päring fi: virheellinen pyyntö fr: requête incorrecte he: בקשה שגויה is: beiðni ekki rétt it: richiesta incorretta lv: kļūdains pieprasÄ«jums nl: incorrect verzoek no: ugyldig forespørsel oc: demanda incorrècta pl: nieprawidÅ‚owe wyszukiwanie pt: consulta incorrecta pt-br: consulta incorreta ro: consultatie incorecta ru: некорректный Ð·Ð°Ð¿Ñ€Ð¾Ñ sk: nesprávna požiadavka sl: napaÄna zahteva sv: fel förfrÃ¥gan indeed, af: inderdaad, bg: фактичеÑки br: ez wir, ca: en efecte cs: ve skuteÄnosti da: faktisk, de: weil en: indeed, eo: ja, es: en efecto, et: muidugi, fi: aivan, fr: en effet, he: לכן is: jú, it: infatti, lv: patieÅ¡Äm, nl: immers: no: faktisk oc: en efièch pl: Å›ciÅ›lej biorÄ…c, pt: com efeito, ro: pentru ru: на Ñамом деле, sk: v skutoÄnosti sl: torej sv: faktiskt, index of the descendants af: nasaatindeks bg: ÑпиÑък на потомците br: roll an diskennidi ca: índex dels descendents cs: seznam potomků da: fortegnelse over efterkommerne de: Index der Nachkommen en: index of descendants eo: indekso de la posteuloj es: índice de los descendientes et: järglaste loetelu fi: luettelo jälkeläisistä fr: index des descendants he: מפתח הצ×צ××™× is: skrá afkomenda it: indice dei discendenti lv: pÄ“cnÄcÄ“ju saraksts nl: index van afstammelingen no: fortegnelse over etterkommere oc: indèx dels descendents pl: lista potomków pt: índice dos descendentes ro: indice de descendenti ru: Ð¸Ð½Ð´ÐµÐºÑ Ð¿Ð¾Ñ‚Ð¾Ð¼ÐºÐ¾Ð² sk: zoznam potomkov sl: seznam potomcev sv: förteckning över ättlingarna index of the spouses (non descendants) af: eggenootindeks (na verwant) bg: ÑпиÑък на Ñъпрузите и Ñъпругите (без потомците) br: roll ar priedoù (nann-diskennidi) ca: índex dels cònjuges (no descendents) cs: seznam manželů/manželek (ne potomků) da: fortegnelse over ægtefællerne (ikke efterkommere) de: Index der Ehegatten (nicht Nachkommen) en: index of spouses (non descendants) eo: indekso de la geedzoj (ne posteuloj) es: índice de los cónyuges (no descendientes) et: abikaasade loetelu (pole järglased) fi: luettelo puolisoista (ei jälkeläisiä) fr: index des conjoints (non descendants) he: מפתח בני הזוג ש××™× × ×¦×צ××™× is: skrá make (ekki afkomenda) it: indice dei coniugi (non discendenti) lv: dzÄ«vesbiedru saraksts (bez pÄ“cnÄcÄ“jiem) nl: index van echtgenoten (geen afstammelingen) no: fortegnelse over ektefeller (ikke etterkommere) oc: indèx dels conjunts (pas descendents) pl: lista małżonków (nie bÄ™dÄ…cych potomkami) pt: índice dos cônjuges (não descendentes) ro: indice de soti (nedescendenti) ru: Ð¸Ð½Ð´ÐµÐºÑ Ñупругов (не потомков) sk: zoznam manželov/manželiek (bez potomkov) sl: seznam mož/žena (brez potomcev) sv: förteckning över makarna (icke ättlingar) individual notes de: Hinweis zur Person en: individual Note es: nota individual fi: merkintöjä henkilöstä fr: notes individuelles it: nota dell’individuo nl: Aantekeningen no: notater om personen oc: nòtas individualas pt: notas individuais sv: anteckningar om personen insert af: invoeg bg: вмъкване на br: ensoc'hañ ca: insertar cs: vložit da: indsæt de: einfügen +before en: add eo: enmeti :a: es: insertar et: lisa fi: lisää väliin fr: insérer he: להכניס is: setja inn it: inserire lv: pievienot :a: nl: invoegen +before no: sett inn oc: inserir pl: dodaj :a: pt: inserir ro: intercaleaza ru: вÑтавить :a: sk: vložiÅ¥ sl: vstavi sv: infoga insufficient revision history for %s de: der Versionsverlauf von %s ist nicht ausreichend um Vergleiche anzustellen en: No history found for %s es: el histórico de las revisiones de %s es insuficiente para realizar comparaciones fi: Tarkistushistoriaa ei löydetty kohteelle %s fr: l'historique des révisions de %s est insuffisant pour réaliser des comparaisons it: la cronistoria delle revisioni delle %s è insufficente per realizzare dei paragoni nl: historiek van de revisies van %s is onvoldoende om vergelijkingen uit te voeren no: Ingen revisjonshistorikk funnet for %s oc: l'istoric de las revisions de %s es pas pro per realizar de comparasons pt: o histórico das revisões de %s é insuficiente para realizar comparações inversion done af: omgeruil bg: обръщането извършено br: eilpennadur kaset da benn ca: inversió realitzada cs: prohození dokonÄeno da: rækkefølge omvendt de: umgekehrt en: reversed eo: interÅanÄo farita es: inversión realizada et: vahetatud fi: järjestys vaihdettu fr: permutation effectuée he: ההחלפה בוצעה is: breyting gerð it: scambio fatto lv: pÄrslÄ“gÅ¡ana izpildÄ«ta nl: verwisseld/veranderd no: rekkefølgen endret oc: permutacion efectuada pl: kolejność zostaÅ‚a zmieniona pt: inversão efectuada pt-br: inversão feita ro: inversiune executata ru: переключение завершено sk: výmena dokonÄená sl: zamenjano sv: omflyttning klar invert af: omruil bg: да Ñе Ñмени подредбата br: eilpennañ ca: invertir cs: prohodit da: omvend rækkefølge de: umkehren en: reverse eo: interÅanÄi :a: es: invertir et: vaheta fi: vaihda järjestys fr: permuter he: החלפה is: breyta röð it: scambiare lv: pÄrslÄ“gt(?) nl: verwisselen no: endre rekkefølge oc: permutar pl: zmieÅ„ kolejność pt: inverter ro: inverseaza ru: переключить sk: vymeniÅ¥ sl: zamenjaj sv: byt ordning invert the order of the following families af: ruil die orde van die families om bg: да Ñе Ñмени подредбата на Ñледните ÑемейÑтва br: eilpennañ urzh an tiegezhioù da heul ca: invertir l'ordre de les famílies següents cs: prohodit poÅ™adí následujících rodin da: omvend rækkefølgen for de følgende familier de: die Reihenfolge der folgenden Familien umkehren en: reverse the order of the following families eo: interÅanÄi la ordon de la familioj sekvantaj es: invertir el orden de las familias siguientes et: vaheta järgmiste perede järjekord fi: vaihda seuraavien perheiden järjestystä fr: permuter l’ordre des familles suivantes he: לשנות סדר המשפחות הב×ות is: breyta röð eftirfarandi fjölskyldna it: scambiare l'ordine delle famiglie seguenti lv: pÄrslÄ“gt sekojoÅ¡o Ä£imeņu secÄ«bu (?) nl: verwissel de volgorde van de volgende gezinnen no: endre rekkefølgen pÃ¥ følgende familier oc: permutar l'òrdre d'aquelas familhas pl: czy zmienić kolejność nastepujÄ…cych małżeÅ„stw lub zwiÄ…zków? pt: inverter a ordem das famílias seguintes ro: inverseaza ordinea urmatoarelor familii ru: изменить порÑдок Ñледующих Ñемей sk: zmeň poradie nasledujúcich rodín sl: zamenjaj vrstni red naslednjih družin sv: ändra ordningen pÃ¥ de följande familjerna is af: is bg: е br: a zo ca: és cs: je da: er de: ist en: is eo: estas es: es et: on fi: on fr: est he: is: er it: è lv: ir nl: is no: er oc: es pl: to pt: é ro: este ru: sk: je sl: je sv: är is a very old parent de: ist ein sehr alter Verwandter en: is old es: es un padre muy viejo fi: on vanha fr: est vraiment un parent très âgé it: è un parente molto anziano nl: is een familielid op zeer oude leeftijd no: er gammel oc: es un parent plan tròp vièlh pt: é um pai muito velho sv: Är en mycket gammal förälder is a very young parent af: is 'n baie jong ouer bg: твърде млад родител br: a zo un tad pe ur vamm gwall yaouank ca: és un pare massa jove cs: je velmi mladý otec/je velmi mladá matka da: er en meget ung forælder de: ist ein(e) sehr junge(r) Vater/Mutter en: is a very young parent eo: estas treege juna patr(in)o es: es un padre demasiado joven et: on väga noor lapsevanem fi: on kovin nuori vanhempi fr: est vraiment un parent très jeune he: הורה מ×וד צעיר is: er mjög ungt foreldri it: è veramente un genitore molto giovane lv: ir ļoti jauns vecÄks nl: is werkelijk een zeer jonge ouder no: er en svært ung foreldre oc: es un parent plan tròp jove pl: jest bardzo mÅ‚odym ojcem/jest bardzo mÅ‚odÄ… matkÄ… pt: é um pai demasiado jovem pt-br: é um pai jovem demais ro: este un parinte foarte tinar ru: очень молодые родители sk: je veľmi mladý rodiÄ sl: je zelo mlad oÄe/je zelo mlada mamica sv: är en väldigt ung förälder is born after his/her child af: is gebore voor sy/haar kind bg: роден Ñлед Ñвое дете/родена Ñлед Ñвое дете br: a zo bet ganet goude e(he) v(b)ugel ca: ha nascut després del seu fill cs: se narodil až po svém dítÄ›ti/se narodila až po svém dítÄ›ti da: er født efter hans/hendes barn de: ist nach seinem/ihrem Kind geboren en: is born after his/her child eo: naskiÄis post sia infano es: ha nacido después de su hijo(a) et: on sündinud oma lapsest hiljem fi: on syntynyt myöhemmin kuin lapsensa fr: est né(e) après son enfant he: נלד ×חרי ילדו/ נלדה ×חרי ילדה is: er fædd eftir barn sitt it: sarebbe nato/a dopo i suoi figli lv: ir dzimis(usi) pÄ“c saviem bÄ“rniem nl: werd geboren na zijn/haar kind no: er født etter sitt barn oc: es nascut(da) après son enfant pl: jest urodzony/urodzona później niż swoje dziecko pt: nasceu depois do seu filho ro: este nascut dup copil ru: рожден поÑле его/ее ребенка sk: narodila/narodila sa po svojom dieÅ¥ati sl: je rojen po tem, ko je imel otroka/je rojena po tem, ko je imela otroka sv: är född efter sitt barn it is the same person! af: is dieselfde persoon! bg: това е ÑъщиÑÑ‚ човек! br: a zo an hevelep den ! ca: és la mateixa persona cs: je ta samá osoba! da: det er den samme person! de: es ist die selbe Person! en: it is the same person! eo: estas la sama persono! es: ¡es la misma persona! et: see on ju sama isik! fi: yksi ja sama henkilö! fr: c’est la même personne ! he: ×ותו ×”××“× is: þetta er sama manneskjan ! it: è la stessa persona! lv: tÄ ir viena un tÄ pati persona! nl: is dezelfde persoon! no: det er samme person! oc: es la meteissa persona pl: to jest ta sama osoba! pt: é a mesma pessoa! ro: este aceiasi persoana! ru: Ñто тот же человек! sk: je to tá istá osoba! sl: je ena in ista oseba! sv: det är samma person! julian day af: juliaanse dag bg: юлианÑки ден br: deiz juluan ca: dia julià cs: juliánský den da: juliansk dag de: Julianisch en: Julian Day eo: tago juliana es: día julian et: juuliuse päev fi: juliaaninen päivä fr: jour julien he: ×™×•× ×™×•×œ×™×× ×™ is: julian dagur it: giorno giuliano lv: pÄ“c JÅ«lija kalendÄra nl: juliaanse dag no: juliansk dag oc: jorn julian pl: dzieÅ„ w kalendarzu juliaÅ„skim pt: dia juliano ro: zi juliana ru: юлианÑкий день sk: juliánsky deň sl: julijanski dan sv: julianskdag killed (in action) af: gesneuwel bg: загинал/загинала/загинал(а) br: bet lazhet ca: mort/morta/mort(a) cs: zabit/zabita/zabiti da: faldet de: gefallen en: killed eo: mortigita es: caído/caída/caído(a) et: tapetud fi: kaatunut fr: tué/tuée/tué(e) he: נפל/ נפלה is: lést it: ucciso/uccisa/ucciso(a) lv: nogalinÄts(a) (negadÄ«jumÄ) nl: gesneuveld no: drept i strid oc: tuat/tuada/tuat(ada) pl: zginÄ…Å‚/zginęła pt: morto/morta/morto(a) ro: cazut in lupta ru: убит в /убита в sk: zabitý/zabitá sl: ubit/ubita/ubit(a) sv: stupat less than one month old af: minder as 'n maand oud bg: на по-малко от меÑец br: n'eo ket koshoc'h eget miz ca: menys d'un mes cs: ménÄ› než mÄ›síc starý/ménÄ› než mÄ›síc stará da: mindre end en mÃ¥ned gammel de: weniger als einen Monat alt en: less than one month old eo: malpli ol unu monato es: menos de un mes et: alla kuu vanune fi: alle kuukauden ikäinen fr: moins d’un mois he: פחות מחודש בגיל is: minna en mánaðar gamalt it: meno di un mese lv: mazÄk kÄ vienu mÄ“nesi vecs(a) nl: minder dan een maand oud no: mindre enn en mÃ¥ned gammel oc: mens d'un mes pl: mÅ‚odszy niż 1 miesiÄ…c/mÅ‚odsza niż 1 miesiÄ…c pt: menos de um mês ro: mai putin de o luna ru: менее чем меÑÑчный/менее чем меÑÑÑ‡Ð½Ð°Ñ sk: mladší ako jeden mesiac sl: star manj kot en mesec/stara manj kot en mesec sv: mindre än en mÃ¥nad link af: koppel bg: да Ñе Ñвърже br: liammañ ca: reunir cs: link da: forbind de: verbinden en: link eo: bindi es: reunir et: viita fi: linkitä fr: relier he: קשר is: tengsl it: link lv: saite nl: connectie no: koble oc: ligar pl: link pt: ligar ro: uneste ru: ÑвÑзать sk: spojenie sl: poveži sv: länk link between af: mense tussen bg: родÑтво между br: liamm etre ca: lligam entre cs: vztah mezi da: slægtskab mellem de: Beziehung zwischen en: relationship between eo: bindo inter es: relación entre et: nendevaheline seos: fi: sukulaisuussuhde henkilöiden välillä fr: lien entre he: קשר בין is: tengsl á milli it: legame tra lv: saite starp nl: verband tussen no: slektskap mellom oc: ligam entre pl: wiÄ™zy pokrewieÅ„stwa pomiÄ™dzy pt: relação entre ro: relatie intre ru: ÑвÑзь между sk: vzÅ¥ah medzi sl: sorodstvo med sv: släktskap emellan link to use de: Link zu verwenden en: link to use fr: lien à utiliser it: link da usare oc: ligam d'utilizar linked pages bg: Ñвързани Ñтраници ca: enllaços cs: spojený stránky da: lænkede sider de: verknüpfte Seiten en: linked pages eo: linkitaj paÄoj es: páginas enlazadas et: seotud leheküljed fi: linkitettyjä sivuja fr: pages liées he: ×“×¤×™× ×ž×§×•×©×¨×™× it: pagine collegate lv: saistÄ«tÄs lapas nl: verbonden pagina's no: koblede sider oc: ligams pl: linki pt: páginas ligadas pt-br: página associadas ro: pagini legate ru: ÑвÑзанные Ñтраницы sk: spojené stránky sl: povezane strani sv: länkade sidor list eclair de: Blitzliste en: List by name, place & date es: lista rápida fi: Index fr: liste-éclair it: lista lampo nl: overzichtslijst no: Index oc: lista rapida pt: listar por nome, local e data sv: Index list/list (ancestors) af: lys bg: ÑпиÑък br: roll ca: llistat cs: seznam da: liste de: Liste en: list eo: tabelo es: lista et: nimekiri fi: lista fr: liste he: רשימה is: listi it: lista lv: saraksts nl: lijst no: liste oc: lista pl: lista pt: lista ro: lista ru: ÑпиÑок sk: zoznam sl: seznam sv: lista/trädlista lists and charts de: Stammbäume, Listen und Zustände en: Charts and Lists es: árboles, listas y estados fi: Listat fr: arbres, listes et états it: alberi, liste e distinte nl: Lijsten no: Tavler og lister oc: listas, arbres e estats pt: listas e gráficos sv: Tavlor och listor lists of books fr: liste des dictionnaires oc: lista dels diccionaris living after %s de: lebte nach %s en: lived after %s es: vivo después de %s fi: eli jälkeen %s fr: vivant après %s it: in vita dopo il %s nl: nog in leven na %s no: levde etter %s oc: viu(va) après %s pt: vivo/a após %s sv: Lever efter %s living before %s de: lebte vor %s en: lived before %s es: vivo antes de %s fi: elänyt ennen %s fr: vivant avant %s it: in vita prima del %s nl: nog in leven voor %s no: levde før %s oc: viu(va) abans %s pt: vivo/a antes de %s sv: Lever innan %s living between %s and %s de: lebte von %s bis %s en: lived from %s to %s es: vivo desde %s a %s fi: eli %s lähtien %s asti fr: vivant de %s à %s it: vivente dal %s al %s nl: levend van %s tot %s no: levde fra %s til %s oc: viu(va) entre %s e %s pt: vivo/a entre %s e %s sv: Lever mellan %s och %s living from/to de: lebte von/bis en: lived from/to es: vivo de/a fi: elänyt lähtien/asti fr: vivant de/à it: vivente dal/al nl: leefde van/tot no: levde fra/til oc: viu(va) de/entrò pt: vivo/a de/até sv: Lever frÃ¥n/till long display af: uitgebreide weergawe bg: подробни резултати br: gwereadur hir ca: presentació extensa cs: dlouhý seznam da: udvidet rapport de: Lange Ansicht en: full eo: longa afiÅado es: presentación extensa et: põhjalik raport fi: laaja esitys fr: affichage long he: תצוגה ×רוכה is: löng skýrsla it: display esteso lv: garÄ attÄ“loÅ¡ana nl: uitgebreide weergave no: utvidet rapport oc: afichatge long pl: peÅ‚na postać pt: resultados detalhados ro: resultat detaliat ru: подробно sk: dlhý zoznam sl: dolg seznam sv: utökad rapport looking for de: zu suchende Elemente en: Check es: elementos a buscar fi: Katso fr: éléments à rechercher it: elementi da ricercare nl: op te zoeken elementen no: Sjekk oc: elements de recercar pt: elementos a pesquisar sv: Leta efter loop in database: %s is his/her own ancestor af: fout in die databasis: %s sy/haar eie voorvader bg: зациклÑне в базата от данни br: dol er bon roadoù : % a zo e/he hendad dezhañ/i e/hec'h-unan ca: bucle a la base de dades: %s és avantpassat d'ell mateix cs: smyÄka v databázi: %s je svůj pÅ™edek da: loop i databasen: %s er sin egen ane de: Schleife in der Datenbank: %s ist sein/ihr eigener Vorfahr en: loop in database: %s is his/her own ancestor eo: estas maÅo en la datenbazo: %s estas sia propra avo es: referencia circulár en la base de datos: %s es su propio ancestro et: silmus andmebaasis: %s on iseenda esivanem fi: silmukka tietokannassa: %s on oma esivanhempansa fr: boucle dans la base de données : %s est son propre ancêtre he: מעגל במ×גר הנתוני×: %s צ×צ×(×”) ל×צמו/ל×צמה is: villa í gagnagrunni: %s er sinn eigin forfaðir/afkomandi it: loop nel data-base: %s è antenato(a) di se stesso(a) lv: cilpa datu bÄzÄ“: %s ir viņa/viņas paÅ¡as secis nl: circulaire referentie in de database: %s is zijn/haar eigen voorouder no: loop i databasen: %s er sin egen ane oc: bloca dins la basa de donadas: %s es son/sa quite(a) aujòl(a) pl: pÄ™tla w bazie: %s jest swoim wÅ‚asnym przodkiem pt: referência circular no banco de dados: %s é seu próprio ancestral ro: referinta circulara: %s este propriul stramos ru: Ð¿ÐµÑ‚Ð»Ñ Ð² базе данных: %s его/ее ÑовÑтвенный предок sk: sluÄka v databáze: %s je svoj predok sl: krog v bazi podatkov: %s je svoj(a) prednik sv: loop i databasen: %s är sin egen ana M/F af: M/V bg: М/Ж br: Gour/Maouez ca: M/F cs: M/Ž da: M/K de: M/F en: M/F eo: Maskla/Ina es: M/F et: M/N fi: M/N fr: H/F he: ×–/×  is: KK/KvK it: M/F lv: V/S nl: M/V no: M/K oc: M/F pl: M/Å» pt: M/F ro: M/F ru: М/Ж sk: M/Ž sl: M/Ž sv: M/K main title af: hooftitel bg: главна титла br: titl pennañ ca: títol principal cs: hlavní titul da: hovedtitel de: Haupttitel en: main title eo: ĉefa nobeltitolo es: título principal et: peamine tiitel fi: ensisijainen arvonimi fr: titre principal he: תו×ר ר×שית is: aðal titill it: titolo principale lv: galvenais tituls nl: voornaamste titel no: hovedtitel oc: títol principal pl: główny tytuÅ‚ pt: título principal ro: titlu principal ru: главный заголовок sk: hlavný titul sl: glavni naziv sv: huvudtitel male line/female line af: manlike lyn/vroulike lyn bg: мъжка линиÑ/женÑка Ð»Ð¸Ð½Ð¸Ñ br: lignez ar wazed/lignez ar maouezed ca: línia masculina/línia femenina cs: mužská linie/ženská linie da: mandlige linie/kvindelige linie de: väterlicherseits/mütterlicherseits en: male line/female line eo: vira linio /virina linio es: línea masculina/línea femenina et: meesliin/naisliin fi: mieslinja/naislinja fr: lignée agnatique (homme)/lignée cognatique (femme) he: קו זכרי / קו נקבי is: karllegg/kvenlegg it: linea agnatizia/linea cognatizia lv: tÄ“va lÄ«nija/mÄtes lÄ«nija nl: mannelijke lijn/vrouwelijke lijn no: mannlig linje/kvinnelig linje oc: linha masculina/linha femenina pl: linia mÄ™ska/linia żeÅ„ska pt: linha masculina (agnatícia)/linha feminina (cognática) ro: linie masculina/linia feminina ru: мужÑÐºÐ°Ñ Ð»Ð¸Ð½Ð¸Ñ/женÑÐºÐ°Ñ Ð»Ð¸Ð½Ð¸Ñ sk: mužská línia/ženská línia sl: moÅ¡ka linija/ženska linija sv: manliga linjen/kvinnliga linjen male/female/neuter de: Mann/Frau/Unbekannt en: Male/Female/Unknown es: hombre/mujer/no específicado fi: mies/nainen/tuntematon fr: homme/femme/non spécifié it: maschio/femmina/non specificato nl: man/vrouw/onbepaald no: Man/Kvinne/Ukjent oc: òme/femna/se sap pas pt: masculino/feminino/não especificado sv: manling/kvinnlig/okänt marriage date de: Hochzeitstag en: Date of marriage es: fecha de matrimonio fi: Vihkiaika fr: date de l'union it: data dell'unione nl: huwelijksdatum no: Ekteskapsdato oc: data del maridatge pt: data de casamento sv: Datum för giftermÃ¥l marriage had occured after the death of %t af: huwelik plaasgevind het nadat %t dood bg: е Ñключен бракът мÑÑто Ñлед Ñмъртта на %t ca: el matrimoni es va dur a terme després de la mort de %t cs: manželství se konalo po smrti %t da: ægteskabet fandt sted efter %t død de: die Ehe wurde nach dem Tod von %t geschlossen en: marriage had occured after the death of %t eo: geedzeco okazis post %t morto es: matrimonio después de la muerte de %t et: abiellusid pärast %t surma fi: avioliitto on solmittu jälkeen %t kuoleman fr: mariage a eu lieu après la mort de %t is: hjónaband átti sér stað eftir %t dauða it: matrimonio celebrato dopo la morte di %t jp: çµå©šã¯%tã®æ­»ã®å¾Œã«é–‹å‚¬ã•れã¾ã—㟠kr: 결혼 %t ì‚¬ë§ ì´í›„ì— ë°œìƒí•œ lv: laulÄ«bas notika pÄ“c %t nÄves nl: huwelijk vond plaats na de dood van %t no: ekteskap fant sted etter %t døden oc: data del maridatge après la mòrt de %t pl: małżeÅ„stwo miaÅ‚o miejsce po Å›mierci %t pt: casamento ocorreu após a morte %t ro: căsătoria a avut loc după moartea %t ru: Ñвадьба ÑоÑтоÑлаÑÑŒ поÑле Ñмерти %t sk: Manželstvo sa konalo po smrti %t sl: poroka je potekala po smrti %t sv: äktenskapet ägde rum efter %t döden zh: çµå©šå¾Œ%t死亡的地方 marriage had occured before the birth of %t af: huwelik plaasgevind het voor %t geboorte bg: е Ñключен бракът преди раждането на %t ca: el matrimoni es va dur a terme abans del naixement de %t cs: manželství bylo uzavÅ™eno pÅ™ed narozením %t da: Ægteskabet fandt sted før %t fødslen de: die Ehe wurde vor der Geburt von %t geschlossen en: marriage had occured before the birth of %t eo: geedzeco okazis antaÅ­ ol %t naskiÄo es: matrimonio antes del nacimiento de %t et: abielu toimus enne %t sündi fi: avioliitto on solmittu ennen %t syntymää fr: mariage a eu lieu avant la naissance de %t is: hjónaband átti sér stað áður en %t fæðingu it: matrimonio celebrato prima della nascita di %t jp: çµå©šã¯%tã®å‡ºç”Ÿå‰ã«è¡Œã‚れ㟠kr: 결혼 %t 출산 ì „ì— ë°œìƒí•œ lv: laulÄ«ba tika noslÄ“gta pirms %t dzimÅ¡anas nl: huwelijk vond plaats vóór de geboorte van %t no: ekteskap fant sted før %t fødsel oc: data del maridatge abans la naissença de %t pl: małżeÅ„stwo zostaÅ‚o zawarte przed urodzeniem %t pt: casamento ocorreu antes do nascimento %t ro: căsătoria a avut loc înainte de naÅŸtere %t ru: Свадьба ÑоÑтоÑлаÑÑŒ до Ñ€Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ %t sk: manželstvo bolo uzavreté pred narodením %t sl: sklenjena zakonska zveza pred rojstvom %t sv: äktenskapet ägde rum före %t födseln zh: çµå©šå‰%t出生的地方 marriage notes de: notizen zu den Ehen en: marriage Notes es: notas de matrionios fi: lisämerkintöjä vihkimisestä fr: notes concernant l'union it: note di matrimoni nl: Aantekeningen no: notater om ekteskapet oc: nòtas sul maridatge pt: notas de casamento sv: anteckningar om vigseln marriage of %t after his/her death af: huwelik van %t na sy/haar afsterwe bg: брак на %t Ñлед неговата/нейната Ñмърт br: eured %t goude e/he v/marv ca: casament de %t després de la seva mort cs: sňatek s %t po své smrti da: giftermÃ¥l af %t efter hans/hendes død de: Heirat von %t nach seinem/ihrem Tod en: marriage of %t after his/her death eo: edz(in)iÄo de %t post sia morto es: casamiento de %t después de su muerte et: %t abiellus pärast oma surma fi: %t olisi naitu vainajana fr: mariage de %t après sa mort he: נישו×ין של %t ×חרי מותו/מותה is: giftist %t eftir andlát hans/hennar it: matrimonio di %t dopo la sua morte lv: %t kÄzas pÄ“c viņa(s) nÄves nl: huwelijk van %t na zijn/haar dood no: ekteskap med %t etter ektefellens død oc: maridatge de %t après la mòrt pl: małżeÅ„stwo z %t po Å›mierci pt: casamento de %t depois da sua morte ro: casatoria %t este dupa deces ru: брак %t поÑле его/ее Ñмерти sk: svadba s t% po svojej smrti sl: %t se je poroÄil(a) po svoji smrti sv: äktenskap med %t före makens/makans död marriage of %t before his/her birth af: huwelik van %t voor sy/haar geboorte bg: брак на %t преди неговото/нейното раждане br: eured %t a-raok e/he c'h/ganedigezh ca: casament de %t abans del seu naixement cs: sňatek s %t pÅ™ed svým narozením da: giftermÃ¥l af %t før hans/hendes fødsel de: Heirat von %t vor seiner/ihrer Geburt en: marriage of %t before his/her birth eo: edz(in)iÄo de %t antaù sia naskiÄo es: casamiento de %t antes de su nacimiento et: %t abiellus enne oma sündi fi: %t olisi naitu ennen syntymää fr: mariage de %t avant sa naissance he: נישו×ין של %t לפני הולדתו/הולדתה is: gistist %t fyrir fæðingu hans/hennar it: matrimonio di %t prima della sua nascita lv: %t kÄzas pirms viņa(s) dzimÅ¡anas nl: huwelijk van %t voor zijn/haar geboorte no: ekteskap med %t før ektefellens fødsel oc: maridatge de %t abans la naissença pl: małżeÅ„stwo z %t przed narodzeniem pt: casamento de %t antes do seu nascimento ro: casatoria %t inaninte de nastere ru: брак %t перед его/ее рождением sk: sobáš s %t pred svojim narodením sl: %t se je poroÄil(a) pred svojim rojstvom sv: äktenskap med %t före makens/makans födelse marriage place de: Ort der Eheschließung en: Place of marriage es: lugar de matrimonio fi: Vihkipaikka fr: lieu de l'union it: luogo dell'unione nl: huwelijksplaats no: Ekteskapssted oc: lòc de maridatge pt: local de casamento sv: Plats för giftermÃ¥l marriage src de: Ouellenangabe-Eheschließung en: Source of marriage es: fuente matrimonio fi: Vihkitietojen lähde fr: source mariage it: fonte del matrimonio nl: bron huwelijk no: Ekteskapskilde oc: font sul maridatge pt: fonte casamento sv: GiftermÃ¥l marriage with de: Eheschließung mit en: Marriage with es: casamiento(s) fi: aviopuoliso(t) fr: union avec it: unione con nl: huwelijk met no: giftermÃ¥l oc: maridatge amb pt: casamento com sv: vigslar marriage/marriages af: huwelik/huwelike ar: زواج/زواجات bg: брак/бракове br: eured/euredoù ca: casament/casaments cs: manželství da: giftermÃ¥l/giftermÃ¥l de: Heirat/Heiraten en: spouse/spouses eo: edziÄo:a:+n/edziÄoj es: casamiento/casamientos et: abielu/abielud fi: avioliitto/avioliitot fr: mariage/mariages he: נישו×ין is: gifting/giftingar it: matrimonio/matrimoni lv: Ä£imene nl: huwelijk/huwelijken no: ekteskap/ekteskap oc: maridatge/maridatges pl: Å›lub/Å›luby pt: casamento/casamentos ro: casatorie/casatorii ru: брак/браки sk: manželstvo/manželstvá sl: poroke/poroke sv: äktenskap/äktenskap married af: getroud bg: в брак br: euredet ca: casats cs: manželé da: gift de: verheiratet en: married eo: edziÄintaj es: casados et: abielus fi: vihitty fr: mariés he: נשו××™× is: gift it: sposati lv: precÄ«bu nl: gehuwd no: gift oc: maridats pl: małżeÅ„stwo pt: casados ro: casatorit ru: в браке sk: manželia sl: poroka sv: gift married at age %t af: getroud op ouderdom %t bg: в брак от %t-годишна възраÑÑ‚ br: euredet d'an oad a %t ca: casat a l'edat de %t cs: oženil se ve vÄ›ku %t/vdala se ve vÄ›ku %t da: gift i alderen %t de: verheiratet mit %t Jahren en: married at age %t eo: edziÄinta je la aÄo de %t jaroj es: casado a la edad de %t et: abiellus %t aastasena fi: vihitty %t vuoden ikäisenä fr: marié(e) à l’âge de %t he: התחתן בגיל %t is: giftist %t ára it: sposato(a) all'età di %t lv: precÄ“jies %t gadu vecumÄ nl: gehuwd op de leeftijd van %t no: gift %t Ã¥r gammel oc: maridat(da) a %t ans pl: ożeniÅ‚ siÄ™ w wieku %t lat/wyszÅ‚a za mąż w wieku %t lat pt: casado com a idade de %t ro: casatorit la virsta de %t ru: в браке Ñ %t лет sk: oženil sa vo veku %t/vydala sa vo veku %t sl: se je poroÄil ko je imel %t/se je poroÄila ko je imela %t sv: gift vid %t Ã¥lder married%t to af: getroud met %t bg: вÑтъпва в брак%t Ñ br: euredet %t gant ca: casat%t amb/casada%t amb cs: %t si vzal/%t si vzala da: gift%t med de: verheiratet%t mit en: married%t to eo: edziÄinta%t kun es: casado%t con/casada%t con et: abielu%t fi: puoliso%t fr: marié%t avec/mariée%t avec he: התחתן %t ×¢×/ התחתנה %t ×¢× is: giftist%t it: sposato%t con/sposata%t con lv: precÄ«bu %t precÄ“jies ar /precÄ«bu %t precÄ“jusies ar nl: gehuwd%t met no: gift%t med oc: maridat amb/maridada amb pl: żona (Å›lub: %t):/mąż (Å›lub: %t): pt: casado%t com/casada%t com ro: casatorit%t cu ru: в браке Ñ%t sk: %t si vzal/%t si vzala sl: %t se je poroÄil z/%t se je poroÄila z sv: gift%t med zh: %té…å¶æ˜¯ maternal grand-parents de: Großeltern mütterlicherseits en: Mother's parents es: abuelos maternos fi: äidin puolen isovanhemmat fr: grands parents maternels it: nonni materni nl: grootouders langs moederszijde no: mormor og morfar oc: parents de la maire pt: avós maternos sv: mormor och morfar maximum af: maksimum bg: най-много br: d'ar muiañ ca: màxim cs: maximum da: maksimalt de: Maximal en: maximum eo: maksimume es: máximo et: maksimaalselt fi: enintään fr: maximum he: ×ž×§×¡×™×ž×•× is: hámark it: massimo lv: maksimums nl: maximaal no: maksimalt oc: al mai pl: maksymalnie pt: máximo ro: maximum ru: макÑимально sk: maximum sl: najveÄ sv: maximalt merge af: saamvoeg bg: да Ñе обединÑÑ‚ br: kendeuziñ ca: fusionar cs: spojit da: sammenlæg de: zusammenführen +before en: merge eo: kunigi :a: es: fusionar et: ühenda fi: yhdistä fr: fusionner he: ×יחוד is: sameina it: fondere lv: apvienot nl: samenvoegen no: slÃ¥ sammen oc: fusionar pl: scal pt: fusão ro: unifica ru: объединить sk: spojiÅ¥ sl: združi sv: slÃ¥ samman merge done af: saamgevoeg bg: обединÑването извършено br: echu eo ar c'hendeuziñ ca: fusió acabada cs: spojení dokonÄeno da: sammenlægning udført de: Zusammenführung abgeschlossen en: merge done eo: kunigo farita es: fusión terminada et: ühendatud fi: yhdistetty fr: fusion terminée he: ×”×יחוד בוצע is: sameiningu lokið it: fusione terminata lv: apvienoÅ¡ana paveikta nl: samenvoeging is uitgevoerd no: sammenslÃ¥ing utført oc: fusion acabada pl: scalenie zostaÅ‚o dokonane pt: fusão terminada ro: executat fuzionarea ru: объединение завершено sk: spojenie dokonÄené sl: združitev konÄana sv: sammanslagning klar message added af: boodskap bygevoeg bg: Ñъобщението добавено br: kemenn ouzhpennet ca: missatge afegit cs: zpráva pÅ™idána da: meddelelse tilføjet de: Nachricht hinzugefügt en: message added eo: mesaÄo almetita es: mensaje agregado et: teade lisatud fi: viesti lisätty fr: message ajouté he: הוספה הודעה is: skilaboðum bætt við it: messaggio aggiunto lv: ziņa pievienota nl: bericht toegevoegd no: melding tilføyet oc: messatge apondut pl: wiadomość zostaÅ‚a dodana pt: mensagem adicionada ro: adaugat mesajul ru: Ñообщение добавлено sk: správa pridaná sl: sporoÄilo dodano sv: meddelande inlagt message deleted af: boodskap gedeleer bg: Ñъобщението е изтрито br: kemenn lamet kuit ca: missatge suprimit cs: zpráva smazána da: meddelelse slettet de: Nachricht gelöscht en: message deleted eo: mesaÄo nuligita es: mensaje borrado et: teade kustutatud fi: viesti tuhottu fr: message supprimé he: הודעה נמחקה is: skilaboðum eytt it: messaggio cancellato lv: izdzÄ“sta ziņa nl: bericht verwijderd no: melding fjernet oc: messatge escafat pl: wiadomość usuniÄ™ta pt: mensagem eliminada ro: mesajul este suprimat ru: уппвÑеойе хдбмеоп sk: správa vymazaná sl: sporoÄilo izbrisano sv: meddelandet borttaget message/previous message/previous messages/next message af: boodskap/vorige boodskap/vorige boodskappe/volgende boodskap bg: Ñъобщение/предходното Ñъобщение/предходните ÑъобщениÑ/Ñледващото Ñъобщение br: kemenn/kemenn kent/kemennoù kent/kemenn da heul ca: missatge/missate anterior//missate anterior/missate següent cs: zpráva:a:-u/pÅ™edchozí zpráva/pÅ™edchozí zprávy/následující zpráva da: meddelelse/foregÃ¥ende meddelelse/foregÃ¥ende meddelelse/næste meddelelse de: Nachricht/vorherige Nachricht/vorherige Nachricht/nächste Nachricht en: message/previous message/previous messages/next message eo: mesaÄo:a:+n/antaùa mesaÄo/antaùa mesaÄo/sekvanta mesaÄo es: mensaje/mansaje anterior/mansaje anterior/mensaje siguiente et: teade/eelmine teade/eelmised teated/järgmine teade fi: viesti/edellinen viesti/edellinen viesti/seuraava viesti fr: message/message précédent/messages précédents/message suivant he: הודעה / הודעה קודמת / הודעה קודמת / הודעה הב××” is: skilaboð/fyrri skilaboð/fyrri skilaboð/næstu skilaboð it: messaggio/messaggio precedente/messaggi precedenti/messaggio seguente lv: ziņa/iepriekšējÄ ziņa/iepriekšējÄ ziņa/nÄkoÅ¡Ä ziņa nl: bericht/vorig bericht/vorig bericht/volgend bericht no: melding/forrige melding/forrige melding/neste melding oc: messatge/messatge precedent/messatges precedents/messatge seguent pl: wiadomość/poprzednia wiadomość/poprzednia wiadomość/nastÄ™pna wiadomość pt: mensagem/mensagem anterior/mensagem anterior/mensagem seguinte ro: mesaj/mesajul anterior/mesajele anterioare/mesajele urmatoara ru: Ñообщение/предыдущее Ñообщение/предыдущие ÑообщениÑ/Ñледующее Ñообщение sk: správa:a:-u/predchádzajúca správa/predchádzajúce správy/nasledujúca správa sl: sporoÄilo/prejÅ¡nje sporoÄilo/prejÅ¡nja sporoÄila/naslednje sporoÄilo sv: meddelande/föregÃ¥ende meddelande/föregÃ¥ende meddelande/nästa meddelande miscellaneous de: Verschiedenes en: Misc es: Varios fi: Eri fr: divers it: varie nl: diversen no: Øvrig oc: divèrs pt: diversos sv: Övrigt miscellaneous information de: verschiedene Felder en: other field es: campo diversos fi: muut kentät fr: champs divers it: voci diverse nl: verscheidene velden no: øvrige felt oc: informacions divèrsas pt: campos diversos sv: övriga fält miscellaneous notes bg: разни бележки ca: miscel·lània cs: rozmanitý poznámky da: diverse noter de: diverse Notizen en: miscellaneous notes eo: diversaĵoj es: notas diversas et: mitmesugused märkused fi: sekalaisia huomautuksia fr: notes diverses he: הערות שונות it: note varie lv: dažÄdas piezÄ«mes nl: diverse aantekeningen no: diverse notater oc: nòtas divèrsas pl: pozostaÅ‚e uwagi pt: notas diversas ro: insemnari diverse ru: дополнительные заметки sk: rôzne poznámky sl: razni zaznamki sv: blandade noteringar missing ancestors af: ontbrekende voorsate bg: липÑващи предци br: lod eus e hendadoù a vank ca: ascendents que falten cs: chybÄ›jící pÅ™edkové da: manglende forfædre de: fehlende Vorfahren en: unknown ancestors eo: mankintaj antaùeuloj es: ascendientes que faltan et: puuduvad esivanemad fi: puuttuvat esivanhemmat fr: ascendants manquants he: ×בות ×—×¡×¨×™× is: vantar forfeður it: antenati mancanti lv: bez tÄlakiem senÄiem nl: ontbrekende voorouders no: manglende forfedre oc: ascendents que mancan pl: brakujÄ…cy przodkowie pt: ascendentes que faltam ro: stramosi necunoscuti ru: потерÑнные предки sk: chýbajúci predkovia sl: manjkajoÄi predniki sv: anor som saknas missing events de: Fehlende Ereignisse en: missing facts es: faltan eventos fi: Puuttuvat asiatiedot fr: événements manquants it: eventi mancanti nl: ontbrekende evenementen no: manglende hendelser oc: eveniments que mancan pt: eventos em falta sv: Saknade händelser missing parents de: Eltern fehlen en: Parents unknown es: faltan padres fi: Vanhemmat tuntemattomia fr: parents manquants it: genitori mancanti nl: ontbrekende ouders no: Foreldre ukjent oc: parents que mancan pt: pais em falta sv: Saknade föräldrar missing sosa de: Fehlende SOSA en: Sosa Number es: falta sosa fi: Sosa-numero fr: sosa manquants it: sosa mancante nl: ontbrekende sosa's no: Sosa-nummer oc: Sosa que mancan pt: sosa em falta sv: Saknade sosa missing sources de: fehlende Quellenangaben en: missing sources es: faltan fuentes fi: puuttuvat lähteet fr: sources manquantes it: senza fonte nl: ontbrekende bronnen no: savnede kilder oc: fonts que mancan pt: fontes em falta sv: saknade källor missing spouse de: Lebenspartner fehlt en: Spouse unknown es: falta cónyuge fi: Puoliso tuntematon fr: conjoint manquant it: coniuge mancante nl: ontbrekend partner no: Ektefelle ukjent oc: conjunt que manca pt: cônjuge em falta sv: saknade maka/make modification successful de: Änderung durchgeführt en: Successfully updated es: hecha modificación fi: muutos suoritettu fr: modification effectuée it: modifica effettuata nl: wijziging uitgevoerd no: Oppdatering fullført oc: modification acabada pt: modificação bem sucedida sv: ändring slutförd modification/modifications de: Änderung/Änderungen en: update/updates es: modificación/modificaciónes fi: muutos/muutokset fr: modification/modifications it: modifica/modifiche nl: wijziging/wijzigingen no: oppdatering/oppdateringer oc: modificacion/modificacions pt: modificação/modificações sv: ändring/ändringar modify af: wysig bg: да Ñе променÑÑ‚ br: kemmañ ca: modificar cs: zmÄ›nit :a: da: ændre de: ändern +before en: update eo: modifi :a: es: modificar et: muuda :g: fi: muokkaa fr: modifier he: לשנות is: breyta it: modificare lv: izmainÄ«t nl: wijzigen +before no: endre oc: modificar pl: zaktualizuj :a: pt: modificar ro: modifica ru: изменить :a: sk: zmeniÅ¥ :a: sl: spremeni sv: ändra modify %s af: wysig bg: да Ñе променÑÑ‚ br: kemmañ ca: modificar cs: zmÄ›nit :a: da: ændre de: ändern +before en: edit eo: modifi :a: es: modificar et: muuda :g: fi: muokkaa fr: modifier %s he: לשנות is: breyta it: modificare lv: izmainÄ«t nl: wijzigen +before no: endre oc: modificar %s pl: zaktualizuj :a: pt: modificar ro: modifica ru: изменить :a: sk: zmeniÅ¥ :a: sl: spremeni sv: ändra modify picture af: wysig prent bg: да Ñе променÑÑ‚ изображение br: kemmañ skeudenn ca: modificar imatge cs: zmÄ›nit :a: obrázek da: ændre billede de: ändern +before Bild en: update Picture eo: modifi :a: bildo:a:+n es: modificar imagen et: muuda :g: pilt fi: muokkaa kuva fr: modifier portrait he: תמונה לשנות is: breyta mynd it: modificare immagine lv: izmainÄ«t attÄ“li nl: wijzigen beeld no: endre bilde oc: modificar l'imatge pl: zaktualizuj :a: ilustracja:a:-Ä™ pt: modificar imagem ro: modifica imagine ru: изменить :a: картинку sl: spremeni slika sv: ändra bild months old af: maande oud bg: меÑеца br: miz kozh ca: mesos cs: mÄ›síců starý/mÄ›síců stará da: mÃ¥neder gammel de: Monate alt en: months old eo: monatoj es: meses et: kuud fi: kuukautta vanha fr: mois he: ×—×•×“×©×™× is: mánaðar gamall it: mesi lv: mÄ“neÅ¡us vecs nl: maanden oud no: mÃ¥neder gammel oc: meses pl: miesiÄ™cy pt: meses ro: luni ru: меÑÑцы sk: mesiacov starý/mesiacov stará sl: mesecev star/mesecev stara sv: mÃ¥nader moon age/new moon/first quarter/full moon/last quarter af: maanfase/nuwemaan/eerste kwartier/volmaan/laaste kwartier bg: лунна фаза/новолуние/първа четвърт/пълнолуние/поÑледна четвърт ca: fase lunar/lluna nova/quart creixent/lluna plena/quart minvant cs: mÄ›síÄní fáze/nov/první Ätvrt'/úplnÄ›k/poslední Ätvrt' da: mÃ¥nefase/nymÃ¥ne/tiltagende mÃ¥ne/fuldmÃ¥ne/aftagende mÃ¥ne de: Mondalter/Neumond/erstes Viertel/Vollmond/letztes Viertel en: number of days after new moon/new moon/first quarter/full moon/last quarter eo: ago de la luno/novluno/unua lunkvarono/plenluno/lasta lunkvarono es: edad de la luna/luna nueva/cuarto cresciente/luna llena/cuarto menguante et: kuu vanus/noorkuu/esimene veerand/täiskuu/viimane veerand fi: kuun kierto/uusi kuu/ensimmäinen neljännes/täysikuu/viimeinen neljännes fr: âge de la lune/nouvelle lune/premier quartier/pleine lune/dernier quartier he: גיל הירח/ירח חדש/רביע ר×שון/ירח מל×/רביע ×חרון is: tunglaldur/nýtt tungl/vaxandi tungl/fullt tungl/minnkandi tungl it: fasi della luna/luna nuova/primo quarto/luna piena/ultimo quarto lv: MÄ“ness fÄze/jauns MÄ“ness/pirmais ceturksnis/pilns MÄ“ness/pÄ“dÄ“jais ceturksnis nl: maansouderdom/nieuwemaan/eerste kwartier/vollemaan/laatste kwartier no: mÃ¥nealder/nymÃ¥ne/første kvarter/fullmÃ¥ne/siste kvarter oc: fasa de la luna/luna novèla/primièr quartièr/tresluc/luna vièlha pl: faza księżyca/nów/pierwsza kwadra/peÅ‚nia/trzecia kwadra pt: dia do mês lunar/lua nova/quarto crescente/lua cheia/quarto minguante pt-br: idade lunar/lua nova/lua crescente/lua cheia/lua minguante ro: etatea Lunii/Luna noua/primul patrar/Luna plina/ultimul patrar ru: фаза луны/новолуние/Ð¿ÐµÑ€Ð²Ð°Ñ Ñ‡ÐµÑ‚Ð²ÐµÑ€Ñ‚ÑŒ/полнолуние/Ñ‡ÐµÑ‚Ð²ÐµÑ€Ñ‚Ð°Ñ Ñ‡ÐµÑ‚Ð²ÐµÑ€Ñ‚ÑŒ sk: mesaÄná fáza/nov/prvá Å¡tvrÅ¥/spln/posledná Å¡tvrÅ¥ sl: lunine mene/ mlada luna/prvi krajec/polna luna/zadnji krajec sv: mÃ¥nÃ¥lder/nymÃ¥ne/första kvarter/fullmÃ¥ne/sista kvarter more than %d answers af: meer as %d antwoorde bg: повече от %d отговори br: ouzhpenn %d respont ca: més de %d respostes cs: více než %d odpovÄ›dí da: mere end %d svar de: mehr als %d Antworten en: more than %d answers eo: pli ol %d respondoj es: más de %d respuestas et: enam kui %d vastust fi: yli %d vastausta fr: plus de %d réponses he: יותר מ-%d תשובות is: fleiri en %d svör it: più di %d risposte lv: vairÄk nekÄ %d atbildes nl: meer dan %d antwoorden no: mer enn %d svar oc: mai de %d responsas pl: wiÄ™cej niż %d odpowiedzi pt: mais de %d respostas ro: mai mult de %s raspunsuri ru: более, чем %d ответы sk: viac ako %d odpovedí sl: veÄ kot %d zadetkov sv: fler än %d svar msg error disconnected de: sorry, Sie können nur Familien hinzufügen die mit dem Rest in Verbindung stehen.
Diese Einschränkung wurde durch den Eigentümer der Datenbank hinzugefügt. en: sorry, you can add only families connected to the rest.
This restriction has been added by this database owner. fr: désolé, vous ne pouvez ajouter que des familles connectées au reste.
Cette restriction a été ajoutée par le propriétaire de cette base de données. it: spiacenti, puoi aggiungere solo delle famiglie collegate al resto.
Questa restrizione è stata aggiunta dal proprietario del data base oc: o planhi, mas podètz pas apondre que de familhas ligadas.
Aquela restriccion foguèt aponduda pel proprietari d'aquela basa. murdered af: vermoor bg: убит/убита/убит(а) br: muntret ca: assessinat/assessinada/assessinat(ada) cs: zavraždÄ›n/zavraždÄ›na da: myrdet de: ermordet en: murdered eo: murdigita es: asesinado/asesinada/asesinado(a) et: mõrvatud fi: murhattu fr: assassiné/assassinée/assassiné(e) he: נרצח/ נרצחה is: myrtur it: assassinato/assassinata/assassinato(a) lv: noslepkavots nl: vermoord no: myrdet oc: assassinat/assassinada/assassinat(ada) pl: zamordowany/zamordowana/morderstwo pt: assassinado/assassinada/assassinado(a) ro: ucis ru: убит/убита sk: zavraždený/zavraždená sl: umorjen/umorjena sv: mördad name af: naam bg: име br: anv ca: cognom cs: jméno da: navn de: Name en: name eo: nomo es: apellido et: nimi fi: nimi fr: nom he: ×©× is: nafn it: nome lv: vÄrds nl: naam no: navn oc: nom pl: imiÄ™ pt: apelido pt-br: nome ro: nume ru: название sk: meno sl: ime sv: namn name %s already used by %tthis person%t af: %s is reeds gebruik deur %t bg: името %s вече е използвано %tза друг човек%t br: anv %s implijet endeo gant %tan den-mañ%t ca: nom %s ja utilitzat per %taquesta persona%t cs: jméno %s už má tato %tosoba%t da: navn %s er allerede anvendt af %tdenne person%t de: Name %s wird schon bei %tdieser Person%t benutzt en: name %s already used by %tthis person%t eo: nomo %s jam uzita de %ttiu persono%t es: nombre %s ya utilizado por %testa persona%t et: nimi %s on juba kasutuses %tsellel inimesel%t fi: nimi %s on jo käytössä %ttällä henkilöllä%t fr: nom %s déjà utilisé par %tcette personne%t he: ×”×©× %s בשימוש כבר ×¢"×™ %t××“× ×–×”%t is: nafnið %s er þegar í %tnotkun af%t it: nome %s già utilizzato da %tquesta persona%t lv: vÄrds - %s jau ir %tÅ¡ai personai%t nl: de naam %s is al gebruikt door deze persoon%t no: navn %s brukes allerede av %tdenne personen%t oc: nom %s ja utilizat per %taquela persona%t pl: imiÄ™ %s jest już używane przez %ttÄ™ osobÄ™%t pt: apelido %s já utilizado por %testa pessoa%t pt-br: nome %s já utilizado por %testa pessoa%t ro: numele %s est in uz de %taceasta persoana%t ru: Ð¸Ð¼Ñ %s уже иÑпользовано %tÑтим человеком%t sk: meno %s už má táto %tosoba%t sl: ime %s že uporablja %tta oseba%t sv: namn %s används redan av %tdenna person%t navigation af: stap met bg: Ð½Ð°Ð²Ð¸Ð³Ð°Ñ†Ð¸Ñ br: merdeadur ca: navegació cs: prohlížení da: navigering de: navigation en: navigation eo: navigado es: navegación et: navigeerimine fi: navigointi fr: navigation he: ניוות is: leiðsögn it: percorso lv: meklÄ“t nl: navigatie no: navigering oc: navigacion pl: nawigacja pt: navegação ro: navigatie ru: Ð½Ð°Ð²Ð¸Ð³Ð°Ñ†Ð¸Ñ sl: pregled sv: navigering navigation with %t as Sosa reference af: stap met %t as Sosa verwysing bg: Ð½Ð°Ð²Ð¸Ð³Ð°Ñ†Ð¸Ñ Ñ‡Ñ€ÐµÐ· чиÑла на СоÑа отноÑно %t br: merdeadur gant %t 'vel dave Sosa ca: navegació amb %t amb referència de "número Sosa" cs: prohlížení s %t jako "sosa" referencí da: navigering med %t som reference for fortløbende anenummerering (Sosa o.a.) de: Navigation mit %t als Proband für die Ahnenkennziffern en: browse using %t as Family Tree Root eo: navigado kun %t kiel Sosa referenco es: navegación con %t como referencia de Sosa et: navigeerimine kasutades %t Sosa viidet fi: navigointi käyttäen %t Sosa-viitteenä fr: navigation avec %t comme référence Sosa he: ניוות ×¢× %t ×›×זכור Sosa is: leiðsögn með %t sem Sosa tilvísun it: percorso con %t come riferimento Sosa lv: meklÄ“t senÄus -> %t pÄ“c Sosa pakÄpes nl: navigatie met %t als proband no: navigering med %t som Anenummer oc: navigacion amb %t coma numèro Sosa de referéncia pl: nawigacja z numerami "Sosa" odnoszÄ…cymi siÄ™ do osoby: %t pt: navegação com %t como a referência Sosa ro: navigatie cu %t referinta Sosa ru: Ð½Ð°Ð²Ð¸Ð³Ð°Ñ†Ð¸Ñ Ñ %t как ÑÑылка Sosa sk: prezeranie s %t ako referenciou "Sosa" sl: pregled z %t kot Sosa sv: navigering med %t som proband (Kekules system) nb branches de: Zweige en: Lines es: núm. ramas fi: Sukulinjat fr: nb. branches it: n° rami nl: aantal takken no: Grener oc: nbre brancas pt: nº ramos sv: nb grenar nb children de: Kinder en: Children es: núm. hijos fi: Lapset fr: nb. enfants it: n° figli nl: aantal kinderen no: Barn oc: nbre enfants pt: nº filhos sv: nb barn nb events de: Ereignisse en: Facts es: núm. eventos fi: Tapahtumat fr: nb. événements it: n° eventi nl: aantal evenementen no: Hendelser oc: nbre eveniments pt: nº eventos sv: nb händelser nb individuals de: Individuen en: Individuals es: núm. individuos fi: Henkilöiden lukumäärä fr: nb. individus it: n° individui nl: aantal personen no: Individer oc: nbre individús pt: nº pessoas sv: nb individer NB: you should try another relationship computing mode de: zögern Sie nicht eine neue Berechnung auf einer anderen Basis zu beginnen en: you can try another computing option es: puede relanzar un cálculo eligiendo otro modo de cálculo fi: valitse toinen laskutapa ja laske uudelleen fr: n'hésitez pas à recommencer en utilisant un autre mode de calcul it: non esitare a riavviare un calcolo scegliendo un altro modo di calcolo nl: aarzel niet opnieuw te berekenen via een andere berekeningswijze no: velg en annen utregningsmÃ¥te og beregn pÃ¥ny oc: podètz ensajar amb un autre metòde de calcul de relacion sv: välj ett annat uträkningssätt och räkna ut igen nephews and nieces af: broers- en susterskinders bg: племенници и племеннички br: nized ha nizezed ca: nebots i nebodes cs: synovci a neteÅ™e da: nevøer og niecer de: Neffen und Nichten en: nephews and nieces eo: nevoj kaj nevinoj es: sobrinos y sobrinas et: venna- ja õelapsed fi: sisarusten lapset fr: neveux et nièces he: ××—×™×™× ×™× is: bræðra og systrabörn it: nipoti lv: brÄļadÄ“li/mÄsasdÄ“li un brÄļameitas/mÄsasmeitas nl: neven en nichten (oom-, tantezegger) no: nevøer og nieser oc: nebots e nebodas pl: bratankowie lub siostrzeÅ„cy/bratanice lub siostrzenice pt: sobrinhos e sobrinhas ro: nepoti si nepoate ru: племÑнники и племÑнницы sk: synovci a netere sl: neÄaki in neÄakinje sv: nevöer och niecer new modification de: hier klicken um eine neue Korrektion durchzuführen en: Continue edit es: pulse aquí para hacer una nueva corrección fi: Jatka muokkaamista fr: cliquez ici pour effectuer une nouvelle correction it: clicca qui per una nuova correzione nl: hier klikken om een nieuwe correctie uit te voeren no: Fortsett editering oc: persegre la modificacion pt: continuar a edição sv: Ny uppdatering next relationship path de: nächster Verwandtschaftsgrad en: Next relationship path es: siguiente ruta de parentesco fr: chemin suivant it: percorso seguente oc: camin seguent next sibling af: volgende broer/volgende suster/volgende broer of suster bg: Ñледващ брат/Ñледваща ÑеÑтра/Ñледващ брат или Ñледваща ÑеÑтра br: Breur da heul/c'hoar da heul/breur pe c'hoar da heul ca: germà següent/germana següent/germà(ana) següent cs: následující sourozenec da: næste søskende de: folgender Bruder/folgende Schwester/folgende Geschwister en: next sibling eo: sekvanta frato/sekvanta fratino/sekvanta frat(in)o es: hermano siguiente/hermana siguiente/hermano(a) siguiente et: järgmine vend/järgmine õde/järgmine õde või vend fi: seuraava veli/seuraava sisar/seuraava sisaruksista fr: frère suivant/sÅ“ur suivante/frère ou sÅ“ur suivant he: ××—(ות) צעיר(×”) is: næsta systkyni it: fratello seguente/sorella seguente/fratello o sorella seguente lv: nÄkoÅ¡ais brÄlis/nÄkoÅ¡ais mÄsa nl: volgende broer/volgende zuster/volgende broer of zuster no: neste bror/neste søster/neste søsken oc: fraire/sòrre seguent(a) pl: nastÄ™pny brat lub siostra pt: irmão seguinte/irmã seguinte/irmã(o) seguinte ro: urmatorul frate/urmatoarea sora/ urmatoarele frati si surori ru: Ñледующий брат/ÑÐ»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ ÑеÑтра sk: mladší brat/mladÅ¡ia sestra/mladší súrodenec sl: mlajÅ¡i brat/mlajÅ¡a sestra sv: nästa bror/nästa syster/nästa syskon no anniversary af: geen herdenking bg: нÑма годишнина br: deiz-ha-bloaz ebet ca: no hi ha cap aniversari cs: žádné výroÄí da: ingen Ã¥rsdag de: kein Jahrestag en: no anniversary eo: neniu datreveno es: ningún aniversario et: pole ühtegi aastapäeva fi: ei vuosipäivää fr: pas d’anniversaire he: ×ין ת×ריך ×™×•× ×”×©× ×” is: engir merkisdagar it: nessun anniversario lv: nav gadadienas nl: geen verjaardag no: ingen merkedager oc: pas cap d'aniversari pl: nie ma żadnej rocznicy pt: nenhum aniversário ro: nu e aniversare ru: нет годовщин sk: žiadne výroÄie sl: nobene obletnice sv: ingen Ã¥rsdag no birthday af: geen verjaarsdag bg: нÑма рожден ден br: deiz ganedigezh ebet ca: no hi ha cap aniversari cs: žádné narozeniny da: ingen fødselsdag de: kein Geburtstag en: no birthday eo: neniu naskiÄtago es: ningún cumpleaños et: pole ühtegi sünnipäeva fi: ei syntymäpäivää fr: pas d’anniversaire he: ×ין ×™×•× ×”×•×œ×“×ª is: engir afmælisdagar it: nessun compleanno lv: nav dzimÅ¡anas dienas nl: geen verjaardag no: ingen fødselsdag oc: pas cap d'aniversari pl: nie ma żadnej rocznicy urodzin pt: nenhum aniversário de nascimento ro: nu e zi de nastere ru: нет дней рождений sk: žiadne narodeniny sl: nobenega rojstnega dneva sv: ingen födelsedag no descendants de: Ohne Nachkommen en: Without posterity es: sin descendencia fi: ilman jälkeläisiä fr: sans descendants it: senza ascendenti nl: zonder afstammelingen no: uten etterkommere oc: pas cap de descendent pt: sem descendentes sv: utan ättlingar no known relationship link between %s and %s af: geen bekende verwantskap tussen %s en %s bg: нÑма данни за родÑтво между %s и %s br: ne gaver ket al liamm a gerentiezh etre %s ha %s ca: cap lligam de parentesc conegut entre %s i %s cs: žádný známý vztah mezi :i:%s a :i:%s da: intet kendt slægtskab mellem %s og %s de: %s und %s sind anscheinend nicht verwandt en: no known relationship link between %s and %s eo: neniu sciita ligo de parenceco inter %s kaj %s es: ningún grado de parentesco conocido entre %s y %s et: %s ja %s vahel pole teadaolevat sugulussuhet fi: ei todettua sukulaisuutta %s ja %s välillä fr: pas de lien de parenté connu entre %s et %s he: ×ין קשר ×“× ×‘×™×Ÿ %s ו-%s is: engin þekkt tengsl milli %s og %s it: nessun legame di parentela conosciuto tra %s e %s lv: nav radniecÄ«bas saiÅ¡u starp %s un %s nl: er is geen bekende verwantschap tussen %s en %s no: ikke kjent slektskap mellom %s og %s oc: pas cap de relacion coneguda entre %s e %s pl: nie sÄ… znane żadne wiÄ™zy pokrewieÅ„stwa pomiÄ™dzy osobami: %s i %s pt: nenhum grau de parentesco conhecido entre %s e %s ro: nici o relatie intre %s si %s ru: неизвеÑтно о родÑтвенных ÑвÑзÑÑ… между %s и %s sk: žiadny známy vzÅ¥ah medzi %s a %s sl: Brez znane zveze med %s in %s sv: ingen känd släktskap emellan %s och %s no marriage event de: unverheiratet en: Partners es: no casados fi: Avopuolisot fr: non mariés it: Non sposati nl: Partners no: Foreldre oc: pas maridats pt: não casados sv: Sambo no match af: geen passing bg: нÑма паÑващи данни br: respont ebet ca: cap resposta cs: nenalezena shoda da: intet resultat af søgningen de: keine passenden Einträge en: no results found eo: neniu respondo es: ninguna respuesta et: ei leitud fi: ei löytynyt fr: pas de réponses he: ×ין דבר דומה is: engin fannst it: nessuna risposta lv: nav atbilstÄ«bas (nav precÄ“juÅ¡ies?) nl: niets gevonden no: ingen treff oc: ges de responsa pl: brak pasujÄ…cej odpowiedzi pt: nenhuma resposta ro: nici un rezultat ru: нет Ñовпадений sk: nenájdená zhoda sl: brez sv: inga träffar no mention af: geen vermelding bg: не Ñе Ñпоменава br: meneg ebet ca: no esmentat cs: bez zmínky da: andet de: nicht erwähnt en: no mention eo: neniu mencio es: sin información et: pole mainitud fi: ei mainintaa fr: pas de mention he: ×ין ×זכור is: óþekkt it: senza menzione lv: nav minÄ“ts nl: geen vermelding no: ikke nevnt oc: pas de mencion pl: bez wzmianki pt: sem informação ro: nementionat ru: нет упоминаний sk: žiadna zmienka sl: ni omembe sv: inte nämnd no modification de: Keine Änderungen en: No changes es: ninguna modificación fi: Ei muutoksia fr: aucune modification it: nessuna modifica nl: geen wijziging no: Ingen endringer oc: pas de modificacion pt: nenhuma modificação sv: Ingen uppdatering no sexes check af: geslag word nie aangedui nie bg: без проверка за пол br: n'eo ket bet gwiriekaet ar reizh ca: no verificar els sexes cs: bez kontroly pohlaví da: ingen verificering af kønnene de: homosexuelles paar (keine Überprüfung des geschlechts) en: same sex couple eo: sen kontrolo pri seksoj es: pareja homosexual (sin comprobación de sexo) et: ära kontrolli sugude sobivust fi: samaa sukupuolta oleva pariskunta (sukupuolta ei vahvistettu) fr: union homosexuelle (pas de vérification des sexes) he: בלי ×œ×•×•×“× ×ž×™×Ÿ is: ekki athuga kyn it: coppia omosessuale (senza verifica del sesso) lv: nepÄbaudÄ«t dzimumus nl: homokoppel (geen nazicht op de geslachten) no: ingen kjønnssjekk oc: contarotlar pas lo sèxe pl: ta sama pÅ‚eć pt: não verificar os sexos ro: fara control de gen ru: не проверÑть пол sk: bez kontroly pohlavia sl: ne glede na spol sv: enkönig vigsel (ingen könskontroll) not divorced af: nie geskei nie bg: неразведени br: n'int ket dibriedet ca: no divorciat cs: nerozvedeni da: ikke skilt de: nicht geschieden en: not divorced eo: ne eksedziÄintaj es: no divorciado et: pole lahutatud fi: eivät ole eronneet fr: non divorcés he: ×œ× ×’×¨×•×©×™× is: ekki skilin it: non divorziati lv: nav šķīruÅ¡ies nl: niet gescheiden no: ikke skilt oc: pas divorciats pl: nie rozwiedzeni pt: não divorciado ro: nedivortat ru: не разведены sk: nerozvedení sl: brez loÄitve sv: inte skilda not found af: niks gekry nie bg: нÑма резултат от търÑенето br: n'eo ket bet kavet ca: no localitzat cs: nenalezeno da: ikke fundet de: nicht gefunden en: not found eo: ne trovita es: no encontrado et: ei leitud fi: ei löydy fr: pas trouvé he: ×œ× × ×ž×¦× is: fannst ekki it: non trovato lv: nav atrodams nl: niet gevonden no: ikke funnet oc: pas trobat(da) pl: nie znaleziono: pt: não encontrado ro: negasit ru: не найден sk: nenájdený sl: ni najdeno sv: hittar inte not married af: Ongetroud bg: без брак br: nann euredet ca: no casats cs: svobodní da: ikke gift de: nicht verheiratet en: not married eo: ne edziÄintaj es: no casados et: pole abielus fi: eivät naimisissa fr: non mariés he: ×œ× × ×©×•××™× is: ógift it: non sposati lv: nav precÄ“juÅ¡ies nl: niet gehuwd no: ugift oc: pas maridats pl: bez Å›lubu pt: não casados ro: necasatorit ru: не в браке sk: slobodný sl: brez poroke sv: ogifta note/notes af: nota/notas ar: بطاقة/بطاقات bg: бележка/бележки br: notenn/notennoù ca: nota/notes cs: poznámka/poznámky da: note/noter de: Notiz/Notizen en: note/notes eo: noto/notoj:a:+n es: nota/notas et: märkus/märkused:g:-id fi: lisäys/lisätietoja fr: note/notes he: הערה/ הערות is: athugasemd/athugasemdum it: nota/note lv: piezÄ«me(s) nl: notitie/notities no: notat/notater oc: nòta/nòtas pl: uwagi pt: nota/notas ro: nota/note ru: заметка/заметки sk: poznámka/poznámky sl: zapisek/zapiski sv: notering/noteringar zh: 备注 notes modified af: aantekeninge gewysig bg: бележките Ñа променени br: notennoù kemmet ca: notes modificades cs: poznámky zmÄ›nÄ›ny da: noter ændret de: geänderte Notizen en: notes modified eo: notoj modifitaj es: notas modificadas et: märkused muudetud fi: muistiinpanoja muokattu fr: notes modifiées he: רשימות עודכנו is: athugasemd gerð it: note modificate lv: pÄrveidotas piezÄ«mes nl: notities veranderd no: notater er endret oc: nòtas modificadas pl: uwagi zmodyfikowane pt: notas modificadas ro: nota modificata ru: заметки изменены sk: poznámky zmenené sl: zaznamek spremenjen sv: noteringar modifierade notes summary bg: резюме на бележките de: Zusammenfassung sonstiger Notizen en: Notes es: sumario de notas diversas fi: Merkinnät fr: Sommaire des notes diverses it: Sommario delle diverse note nl: Overzicht van diverse notities no: Merknader oc: Ensenhador de las nòtas divèrsas pt: sumário de notas diversas sv: Summerade noteringar nth af: n-de/1ste/2de/3de/4de/5de/6de/7de/8ste/9de/10de/11de/12de/13de/14de/15de/16de/17de/18de/19de/20ste/21ste/22ste/23ste/24ste/25ste/26ste/27ste/28ste/29ste/30de/31ste/32ste/33ste/34ste/35ste/36ste/37ste/38ste/39ste/40ste/41ste/42ste/43ste/44ste/45ste/46ste/47ste/48ste/49ste/50ste/51ste/52ste/53ste/54ste/55ste/56ste/57ste/58ste/59ste/60ste/61ste/62ste/63ste/64ste/65ste/66ste/67ste/68ste/69ste/70ste/71ste/72ste/73ste/74ste/75ste/76ste/77ste/78ste/79ste/80ste/81ste/82ste/83ste/84ste/85ste/86ste/87ste/88ste/89ste/90ste/91ste/92ste/93ste/94ste/95ste/96ste/97ste/98ste/99ste bg: n-ти/първи/втори/трети/четвърти/пети/шеÑти/Ñедми/оÑми/девети/деÑети/единадеÑети/дванадеÑети/тринадеÑети/четиринадеÑети/петнадеÑети/шеÑтнадеÑети/ÑедемнадеÑети/оÑемнадеÑети/деветнадеÑети/двадеÑети/21-и/22-и/23-и/24-и/25-и/26-и/27-и/28-и/29-и/30-и/31-и/32-и/33-и/34-и/35-и/36-и/37-и/38-и/39-и/40-и/41-и/42-и/43-и/44-и/45-и/46-и/47-и/48-и/49-и/50-и/51-и/52-и/53-и/54-и/55-и/56-и/57-и/58-и/59-и/60-и/61-и/62-и/63-и/64-и/65-и/66-и/67-и/68-и/69-и/70-и/71-и/72-и/73-и/74-и/75-и/76-и/77-и/78-и/79-и/80-и/81-и/82-и/83-и/84-и/85-и/86-и/87-и/88-и/89-и/90-и/91-и/92-и/93-и/94-и/95-и/96-и/97-и/98-и/99-и br: n-vet/1añ/eil/3de/4re/5vet/6vet/7vet/8vet/9vet/10vet/11vet/12vet/13vet/14vet/15vet/16vet/17vet/18vet/19vet/20vet/21vet/22vet/23vet/24vet/25vet/26vet/27vet/28vet/29vet/30vet/31vet/32vet/33vet/34vet/35vet/36vet/37vet/38vet/39vet/40vet/41vet/42vet/43vet/44vet/45vet/46vet/47vet/48vet/49vet/50vet/51vet/52vet/53vet/54vet/55vet/56vet/57vet/58vet/59vet/60vet/61vet/62vet/63vet/64vet/65vet/66vet/67vet/68vet/69vet/70vet/71vet/72vet/73vet/74vet/75vet/76vet/77vet/78vet/79vet/80vet/81vet/82vet/83vet/84vet/85vet/86vet/87vet/88vet/89vet/90vet/91vet/92vet/93vet/94vet/95vet/96vet/97vet/98vet/99vet/100vet/101vet/102vet/103vet/104vet ca: n-èssim/1er/2on/3er/4rt/5è/6è/7è/8è/9è/10è/11è/12è/13è/14è/15è/16è/17è/18è/19è/20è/21è/22mo/23è/24è/25è/26è/27è/28è/29è/30è/31è/32è/33è/34è/35è/36è/37è/38è/39è/40è/41è/42è/43è/44è/45è/46è/47è/48è/49è/50è/51è/52è/53è/54è/55è/56è/57è/58è/59è/60è/61è/62è/63è/64è/65è/66è/67è/68è/69è/70è/71è/72è/73è/74è/75è/76è/77è/78è/79è/80è/81è/82è/83è/84è/85è/86è/87è/88è/89è/90è/91è/92è/93è/94è/95è/96è/97è/98è/99è cs: n-tý/1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. da: ordenstal/1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. de: n-ten/1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. en: rank/1st/2nd/3rd/4th/5th/6th/7th/8th/9th/10th/11th/12th/13th/14th/15th/16th/17th/18th/19th/20th/21st/22nd/23rd/24th/25th/26th/27th/28th/29th/30th/31st/32nd/33rd/34th/35th/36th/37th/38th/39th/40th/41st/42nd/43rd/44th/45th/46th/47th/48th/49th/50th/51st/52nd/53rd/54th/55th/56th/57th/58th/59th/60th/61st/62nd/63rd/64th/65th/66th/67th/68th/69th/70th/71st/72nd/73rd/74th/75th/76th/77th/78th/79th/80th/81st/82nd/83rd/84th/85th/86th/87th/88th/89th/90th/91st/92nd/93rd/94th/95th/96th/97th/98th/99th eo: n-a/1a/2a/3a/4a/5a/6a/7a/8a/9a/10a/11a/12a/13a/14a/15a/16a/17a/18a/19a/20a/21a/22a/23a/24a/25a/26a/27a/28a/29a/30a/31a/32a/33a/34a/35a/36a/37a/38a/39a/40a/41a/42a/43a/44a/45a/46a/47a/48a/49a/50a/51a/52a/53a/54a/55a/56a/57a/58a/59a/60a/61a/62a/63a/64a/65a/66a/67a/68a/69a/70a/71a/72a/73a/74a/75a/76a/77a/78a/79a/80a/81a/82a/83a/84a/85a/86a/87a/88a/89a/90a/91a/92a/93a/94a/95a/96a/97a/98a/99a es: n-ésimo/1ro/2ndo/3ro/4to/5to/6to/7mo/8vo/9no/10mo/11ro/12ndo/13ro/14to/15to/16to/17mo/18vo/19no/20mo/21ro/22ndo/23ro/24to/25to/26to/27mo/28vo/29no/30mo/31ro/32ndo/33ro/34to/35to/36to/37mo/38vo/39no/40mo/41ro/42ndo/43ro/44to/45to/46to/47mo/48vo/49no/50mo/51ro/52ndo/53ro/54to/55to/56to/57mo/58vo/59no/60mo/61ro/62ndo/63ro/64to/65to/66to/67mo/68vo/69no/70mo/71ro/72ndo/73ro/74to/75to/76to/77mo/78vo/79no/80mo/81ro/82ndo/83ro/84to/85to/86to/87mo/88vo/89no/90mo/91ro/92ndo/93ro/94to/95to/96to/97mo/98vo/99na et: n-s/esimene/teine/kolmas/neljas/viies/kuues/seitsmes/kaheksas/üheksas/kümnes/üheteistkümnes/kaheteistkümnes/kolmeteistkümnes/neljateistkümnes/viieteistkümnes/kuueteistkümnes/seitsmeteistkümnes/kaheksateistkümnes/üheksateistkümnes/kahekümnes/kahekümne esimene/22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. fi: n./ensimmäinen/toinen/kolmas/neljäs/viides/kuudes/seitsemäs/kahdeksas/yhdeksäs/kymmenes/yhdestoista/kahdestoista/kolmastoista/neljästoista/viidestoista/kuudestoista/seitsämästoista/kahdeksastoista/yhdeksästoista/kahdeskymmenes/kahdeskymmenesensimmäinen/22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. fr: n-ième/1er/2e/3e/4e/5e/6e/7e/8e/9e/10e/11e/12e/13e/14e/15e/16e/17e/18e/19e/20e/21e/22e/23e/24e/25e/26e/27e/28e/29e/30e/31e/32e/33e/34e/35e/36e/37e/38e/39e/40e/41e/42e/43e/44e/45e/46e/47e/48e/49e/50e/51e/52e/53e/54e/55e/56e/57e/58e/59e/60e/61e/62e/63e/64e/65e/66e/67e/68e/69e/70e/71e/72e/73e/74e/75e/76e/77e/78e/79e/80e/81e/82e/83e/84e/85e/86e/87e/88e/89e/90e/91e/92e/93e/94e/95e/96e/97e/98e/99e/100e/101e/102e/103e/104e he: ×”n/ר×שון/ שני/ שלישי/ רביעי/ חמשי/ שישי/ שביעי/ שמיני/ תשיעי/ עשירי/11/12/13/14/15/16/17/18/19/20/21/22/23/24/25/26/27/8/29/30/31/32/33/34/35/36/37/38/39/40/41/42/43/44/45/46/47/48/49/50/51/52/53/54/55/56/57/58/59/60/61/62/63/64/65/66/67/68/69/70/71/72/73/74/75/76/77/78/79/80/81/82/83/84/85/86/87/88/89/90/91/92/93/94/95/96/97/98/99 is: n./1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. it: n-esimo/1o/2o/3o/4o/5o/6o/7o/8o/9o/10o/11o/12o/13o/14o/15o/16o/17o/18o/19o/20o/21o/22o/23o/24o/25o/26o/27o/28o/29o/30o/31o/32o/33o/34o/35o/36o/37o/38o/39o/40o/41o/42o/43o/44o/45o/46o/47o/48o/49o/50o/51o/52o/53o/54o/55o/56o/57o/58o/59o/60o/61o/62o/63o/64o/65o/66o/67o/68o/69o/70o/71o/72o/73o/74o/75o/76o/77o/78o/79o/80o/81o/82o/83o/84o/85o/86o/87o/88o/89o/90o/91o/92o/93o/94o/95o/96o/97o/98o/99o lv: /1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. nl: n-de/1ste/2de/3de/4de/5de/6de/7de/8ste/9de/10de/11de/12de/13de/14de/15de/16de/17de/18de/19de/20ste/21ste/22ste/23ste/24ste/25ste/26ste/27ste/28ste/29ste/30de/31ste/32ste/33ste/34ste/35ste/36ste/37ste/38ste/39ste/40ste/41ste/42ste/43ste/44ste/45ste/46ste/47ste/48ste/49ste/50ste/51ste/52ste/53ste/54ste/55ste/56ste/57ste/58ste/59ste/60ste/61ste/62ste/63ste/64ste/65ste/66ste/67ste/68ste/69ste/70ste/71ste/72ste/73ste/74ste/75ste/76ste/77ste/78ste/79ste/80ste/81ste/82ste/83ste/84ste/85ste/86ste/87ste/88ste/89ste/90ste/91ste/92ste/93ste/94ste/95ste/96ste/97ste/98ste/99ste no: n./første/andre/tredje/fjerde/femte/sjette/syvende/Ã¥ttende/niende/tiende/ellevte/tolvte/trettende/fjortende/femtende/sekstende/søttende/attende/nittende/tyvende/21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99./100./101./102./103./104./105./106./107./108./109./110./111./112./113./114./115./116./117./118./119./120./121./122./123./124./125./126./127./128./129./130. oc: n-en/1èr/2nd/3en/4en/5en/6en/7en/8en/9en/10en/11en/12en/13en/14en/15en/16en/17en/18en/19en/20en/21en/22en/23en/24en/25en/26en/27en/28en/29en/30en/31en/32en/33en/34en/35en/36en/37en/38en/39en/40en/41en/42en/43en/44en/45en/46en/47en/48en/49en/50en/51en/52en/53en/54en/55en/56en/57en/58en/59en/60en/61en/62en/63en/64en/65en/66en/67en/68en/69en/70en/71en/72en/73en/74en/75en/76en/77en/78en/79en/80en/81en/82en/83en/84en/85en/86en/87en/88en/89en/90en/91en/92en/93en/94en/95en/96en/97en/98en/99en pl: n./1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. pt: n-ésimo/1ro/2ndo/3ro/4rto/5to/6to/7mo/8vo/9no/10mo/11ro/12ndo/13ro/14rto/15to/16to/17mo/18vo/19no/20mo/21ro/22ndo/23ro/24rto/25to/26to/27mo/28vo/29no/30mo/31ro/32ndo/33ro/34rto/35to/36to/37mo/38vo/39no/40mo/41ro/42ndo/43ro/44rto/45to/46to/47mo/48vo/49no/50mo/51ro/52ndo/53ro/54rto/55to/56to/57mo/58vo/59no/60mo/61ro/62ndo/63ro/64rto/65to/66to/67mo/68vo/69no/70mo/71ro/72ndo/73ro/74rto/75to/76to/77mo/78vo/79no/80mo/81ro/82ndo/83ro/84rto/85to/86to/87mo/88vo/89no/90mo/91ro/92ndo/93ro/94rto/95to/96to/97mo/98vo/99no pt-br: n-ésimo/1º/2º/3º/4º/5º/6º/7º/8º/9º/10º/11º/12º/13º/14º/15º/16º/17º/18º/19º/20º/21º/22º/23º/24º/25º/26º/27º/28º/29º/30º/31º/32º/33º/34º/35º/36º/37º/38º/39º/40º/41º/42º/43º/44º/45º/46º/47º/48º/49º/50º/51º/52º/53º/54º/55º/56º/57º/58º/59º/60º/61º/62º/63º/64º/65º/66º/67º/68º/69º/70º/71º/72º/73º/74º/75º/76º/77º/78º/79º/80º/81º/82º/83º/84º/85º/86º/87º/88º/89º/90º/91º/92º/93º/94º/95º/96º/97º/98º/99º ro: n./1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. ru: Ñнный/1-й/2-й/3-й/4-й/5-й/6-й/-7й/8-й/9-й/10-й/11-й/11-й/12-й/13-й/14-й/15-й/16-й/17-й/18-й/19-й/20-й sk: n-tý/1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. sl: Å¡t./1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. sv: n:te/1:a/2:a/3:e/4:e/5:e/6:e/7:e/8:e/9:e/10:e/11:e/12:e/13:e/14:e/15:e/16:e/17:e/18:e/19:e/20:e/21:a/22:a/23:e/24:e/25:e/26:e/27:e/28:e/29:e/30:e/31:a/32:a/33:e/34:e/35:e/36e/37:e/38:e/39:e/40:e/41:a/42:a/43:e/44:e/45:e/46:e/47:e/48:e/49:e/50:e/51:a/52:a/53:e/54:e/55:e/56:e/57:e/58:e/59:e/60:e/61:a/62:a/63:e/64:e/65:e/66:e/67:e/68:e/69:e/70:e/71:a/72:a/73:e/74:e/75:e/76:e/77:e/78:e/79:e/80:e/81:a/82:a/83:e/84:e/85:e/86:e/87:e/88:e/89:e/90:e/91:a/92:a/93:e/94:e/95:e/96:e/97:e/98:e/99:e/100:e/101:a/102:a/103:e/104:e/105:e/106:e/107:e/108:e/109:e/110:e/111:e/112:e/113:e/114:e/115:e/116:e/117:e/118:e/119:e/120:e/121:a/122:a/123:e/124:e/125:e/126:e/127:e/128:e/129:e/130:e nth (cousin) af: n/1/2/3/4/5/6/7/8/9/10/11/12/13/14/15/16/17/18/19/20/21/22/23/24/25/26/27/28/29/30/31/32/33/34/35/36/37/38/39/40/41/42/43/44/45/46/47/48/49/50/51/52/53/54/55/56/57/58/59/60/61/62/63/64/65/66/67/68/69/70/71/72/73/74/75/76/77/78/79/80/81/82/83/84/85/86/87/88/89/90/91/92/93/94/95/96/97/98/99 bg: n-Ñ‚/първ/втор/трет/четвърт/пет/шеÑÑ‚/Ñедм/оÑм/девет/деÑет/единадеÑет/дванадеÑет/тринадеÑет/четиринадеÑет/петнадеÑет/шеÑтнадеÑет/ÑедемнадеÑет/оÑемнадеÑет/деветнадеÑет/двадеÑет/21-/22-/23-/24-/25-/26-/27-/28-/29-/30-/31-/32-/33-/34-/35-/36-/37-/38-/39-/40-/41-/42-/43-/44-/45-/46-/47-/48-/49-/50-/51-/52-/53-/54-/55-/56-/57-/58-/59-/60-/61-/62-/63-/64-/65-/66-/67-/68-/69-/70-/71-/72-/73-/74-/75-/76-/77-/78-/79-/80-/81-/82-/83-/84-/85-/86-/87-/88-/89-/90-/91-/92-/93-/94-/95-/96-/97-/98-/99- br: n-vet/eil/3de/4re/5vet/6vet/7vet/8vet/9vet/10vet/11vet/12vet/13vet/14vte/15vte/16vet/17vet/18vet/19vet/20vet/21vet/22vet/23vet/24vet/25vet/26vet/27vet/28vet/29vet/30vet/31vet/32vet/33vet/34vet/35vet/36vet/37vet/38vet/39vet/40vet/41vet/42vet/43vet/44vet/45vet/46vet/47vet/48vet/49vet/50vet/51vet/52vet/53vet/54vet/55vet/56vet/57vet/58vet/59vet/60vet/61vet/62vet/63vet/64vet/65vet/66vet/67vet/68vet/69vet/70vet/71vet/72vet/73vet/74vet/75vet/76vet/77vet/78vet/79vet/80vet/81vet/82vet/83vet/84vet/85vet/86vet/87vet/88vet/89vet/90vet/91vet/92vet/93vet/94vet/95vet/96vet/97vet/98vet/99vet ca: n-èssim/1er/2on/3er/4rt/5è/6è/7è/8è/9è/10è/11è/12è/13è/14è/15è/16è/17è/18è/19è/20è/21è/22mo/23è/24è/25è/26è/27è/28è/29è/30è/31è/32è/33è/34è/35è/36è/37è/38è/39è/40è/41è/42è/43è/44è/45è/46è/47è/48è/49è/50è/51è/52è/53è/54è/55è/56è/57è/58è/59è/60è/61è/62è/63è/64è/65è/66è/67è/68è/69è/70è/71è/72è/73è/74è/75è/76è/77è/78è/79è/80è/81è/82è/83è/84è/85è/86è/87è/88è/89è/90è/91è/92è/93è/94è/95è/96è/97è/98è/99è cs: n-tý/1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. da: nte/1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. de: n-ten/1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. en: nth/1st/2nd/3rd/4th/5th/6th/7th/8th/9th/10th/11th/12th/13th/14th/15th/16th/17th/18th/19th/20th/21st/22nd/23rd/24th/25th/26th/27th/28th/29th/30th/31st/32nd/33rd/34th/35th/36th/37th/38th/39th/40th/41st/42nd/43rd/44th/45th/46th/47th/48th/49th/50th/51st/52nd/53rd/54th/55th/56th/57th/58th/59th/60th/61st/62nd/63rd/64th/65th/66th/67th/68th/69th/70th/71st/72nd/73rd/74th/75th/76th/77th/78th/79th/80th/81st/82nd/83rd/84th/85th/86th/87th/88th/89th/90th/91st/92nd/93rd/94th/95th/96th/97th/98th/99th eo: n-a/1a/2a/3a/4a/5a/6a/7a/8a/9a/10a/11a/12a/13a/14a/15a/16a/17a/18a/19a/20a/21a/22a/23a/24a/25a/26a/27a/28a/29a/30a/31a/32a/33a/34a/35a/36a/37a/38a/39a/40a/41a/42a/43a/44a/45a/46a/47a/48a/49a/50a/51a/52a/53a/54a/55a/56a/57a/58a/59a/60a/61a/62a/63a/64a/65a/66a/67a/68a/69a/70a/71a/72a/73a/74a/75a/76a/77a/78a/79a/80a/81a/82a/83a/84a/85a/86a/87a/88a/89a/90a/91a/92a/93a/94a/95a/96a/97a/98a/99a es: n-ésima/1ra/2nda/3ra/4ta/5ta/6ta/7ma/8va/9na/10ma/11ra/12nda/13ra/14ta/15ta/16ta/17ma/18va/19na/20ma/21ra/22nda/23ra/24ta/25ta/26ta/27ma/28va/29na/30ma/31ra/32nda/33ra/34ta/35ta/36ta/37ma/38va/39na/40ma/41ra/42nda/43ra/44ta/45ta/46ta/47ma/48va/49na/50ma/51ra/52nda/53ra/54ta/55ta/56ta/57ma/58va/59na/60ma/61ra/62nda/63ra/64ta/65ta/66ta/67ma/68va/69na/70ma/71ra/72nda/73ra/74ta/75ta/76ta/77ma/78va/79na/80ma/81ra/82nda/83ra/84ta/85ta/86ta/87ma/88va/89na/90ma/91ra/92nda/93ra/94ta/95ta/96ta/97ma/98va/99na et: n-s/1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. fi: n./1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. fr: n-ième/2e/3e/4e/5e/6e/7e/8e/9e/10e/11e/12e/13e/14e/15e/16e/17e/18e/19e/20e/21e/22e/23e/24e/25e/26e/27e/28e/29e/30e/31e/32e/33e/34e/35e/36e/37e/38e/39e/40e/41e/42e/43e/44e/45e/46e/47e/48e/49e/50e/51e/52e/53e/54e/55e/56e/57e/58e/59e/60e/61e/62e/63e/64e/65e/66e/67e/68e/69e/70e/71e/72e/73e/74e/75e/76e/77e/78e/79e/80e/81e/82e/83e/84e/85e/86e/87e/88e/89e/90e/91e/92e/93e/94e/95e/96e/97e/98e/99e he: ×”n/ר×שונה/ שנית/ שלישית/ רביעית/ חמשית/ שישית/ שביעית/ שמינית/ תשיעית/ עשירית/11/12/13/14/15/16/17/18/19/20/21/22/23/24/25/26/27/8/29/30/31/32/33/34/35/36/37/38/39/40/41/42/43/44/45/46/47/48/49/50/51/52/53/54/55/56/57/58/59/60/61/62/63/64/65/66/67/68/69/70/71/72/73/74/75/76/77/78/79/80/81/82/83/84/85/86/87/88/89/90/91/92/93/94/95/96/97/98/99 is: n./1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. it: n-esimo/1o/2o/3o/4o/5o/6o/7o/8o/9o/10o/11o/12o/13o/14o/15o/16o/17o/18o/19o/20o/21o/22o/23o/24o/25o/26o/27o/28o/29o/30o/31o/32o/33o/34o/35o/36o/37o/38o/39o/40o/41o/42o/43o/44o/45o/46o/47o/48o/49o/50o/51o/52o/53o/54o/55o/56o/57o/58o/59o/60o/61o/62o/63o/64o/65o/66o/67o/68o/69o/70o/71o/72o/73o/74o/75o/76o/77o/78o/79o/80o/81o/82o/83o/84o/85o/86o/87o/88o/89o/90o/91o/92o/93o/94o/95o/96o/97o/98o/99o lv: /1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. nl: n/1/2/3/4/5/6/7/8/9/10/11/12/13/14/15/16/17/18/19/20/21/22/23/24/25/26/27/28/29/30/31/32/33/34/35/36/37/38/39/40/41/42/43/44/45/46/47/48/49/50/51/52/53/54/55/56/57/58/59/60/61/62/63/64/65/66/67/68/69/70/71/72/73/74/75/76/77/78/79/80/81/82/83/84/85/86/87/88/89/90/91/92/93/94/95/96/97/98/99 no: n/to/tre/fir/fem/seks/syv/Ã¥tte/ni/ti/elleve/tolv/tretten/fjorten/femten/seksten/søtten/atten/nitten/tyve/21/22/23/24/25/26/27/28/29/30/31/32/33/34/35/36/37/38/39/40/41/42/43/44/45/46/47/48/49/50/51/52/53/54/55/56/57/58/59/60/61/62/63/64/65/66/67/68/69/70/71/72/73/74/75/76/77/78/79/80/81/82/83/84/85/86/87/88/89/90/91/92/93/94/95/96/97/98/99 oc: n-en/1èr/2nd/3en/4en/5en/6en/7en/8en/9en/10en/11en/12en/13en/14en/15en/16en/17en/18en/19en/20en/21en/22en/23en/24en/25en/26en/27en/28en/29en/30en/31en/32en/33en/34en/35en/36en/37en/38en/39en/40en/41en/42en/43en/44en/45en/46en/47en/48en/49en/50en/51en/52en/53en/54en/55en/56en/57en/58en/59en/60en/61en/62en/63en/64en/65en/66en/67en/68en/69en/70en/71en/72en/73en/74en/75en/76en/77en/78en/79en/80en/81en/82en/83en/84en/85en/86en/87en/88en/89en/90en/91en/92en/93en/94en/95en/96en/97en/98en/99en pl: n-tego/1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. pt: n-ésimo/1ro/2ndo/3ro/4rto/5to/6to/7mo/8vo/9no/10mo/11ro/12ndo/13ro/14rto/15to/16to/17mo/18vo/19no/20mo/21ro/22ndo/23ro/24rto/25to/26to/27mo/28vo/29no/30mo/31ro/32ndo/33ro/34rto/35to/36to/37mo/38vo/39no/40mo/41ro/42ndo/43ro/44rto/45to/46to/47mo/48vo/49no/50mo/51ro/52ndo/53ro/54rto/55to/56to/57mo/58vo/59no/60mo/61ro/62ndo/63ro/64rto/65to/66to/67mo/68vo/69no/70mo/71ro/72ndo/73ro/74rto/75to/76to/77mo/78vo/79no/80mo/81ro/82ndo/83ro/84rto/85to/86to/87mo/88vo/89no/90mo/91ro/92ndo/93ro/94rto/95to/96to/97mo/98vo/99no pt-br: n-ésimo/1º/2º/3º/4º/5º/6º/7º/8º/9º/10º/11º/12º/13º/14º/15º/16º/17º/18º/19º/20º/21º/22º/23º/24º/25º/26º/27º/28º/29º/30º/31º/32º/33º/34º/35º/36º/37º/38º/39º/40º/41º/42º/43º/44º/45º/46º/47º/48º/49º/50º/51º/52º/53º/54º/55º/56º/57º/58º/59º/60º/61º/62º/63º/64º/65º/66º/67º/68º/69º/70º/71º/72º/73º/74º/75º/76º/77º/78º/79º/80º/81º/82º/83º/84º/85º/86º/87º/88º/89º/90º/91º/92º/93º/94º/95º/96º/97º/98º/99º ro: n-elea/primar/de gradul 2/de gradul 3/de gradul 4/de gardul 5/de gradul 6/de gradul 7/de gradul 8/de gradul 9/de gradul 10 ru: Ñнный/1-й/2-й/3-й/4-й/5-й/6-й/-7й/8-й/9-й/10-й/11-й/11-й/12-й/13-й/14-й/15-й/16-й/17-й/18-й/19-й/20-й sk: n-tý/1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. sl: /1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. sv: n/tvÃ¥/tre/fyra/fem/sex/sju/Ã¥tta/nio/tio/elva/tolv/tretton/fjorton/femton/sexton/sjutton/arton/nitton/tjugo/21/22/23/24/25/26/27/28/29/30/31/32/33/34/35/36/37/38/39/40/41/42/43/44/45/46/47/48/49/50/51/52/53/54/55/56/57/58/59/60/61/62/63/64/65/66/67/68/69/70/71/72/73/74/75/76/77/78/79/80/81/82/83/84/85/86/87/88/89/90/91/92/93/94/95/96/97/98/99/100/101/102/103/104/105/106/107/108/109/110/111/112/113/114/115/116/117/118/119/120/121/122/123/124/125/126/127/128/129/130 nth (generation) af: n-te/1ste/2de/3de/4de/5de/6de/7de/8ste/9de/10de/11de/12de/13de/14de/15de/16de/17de/18de/19de/20ste/21ste/22ste/23ste/24ste/25ste/26ste/27ste/28ste/29ste/30de/31ste/32ste/33ste/34ste/35ste/36ste/37ste/38ste/39ste/40ste/41ste/42ste/43ste/44ste/45ste/46ste/47ste/48ste/49ste/50ste/51ste/52ste/53ste/54ste/55ste/56ste/57ste/58ste/59ste/60ste/61ste/62ste/63ste/64ste/65ste/66ste/67ste/68ste/69ste/70ste/71ste/72ste/73ste/74ste/75ste/76ste/77ste/78ste/79ste/80ste/81ste/82ste/83ste/84ste/85ste/86ste/87ste/88ste/89ste/90ste/91ste/92ste/93ste/94ste/95ste/96ste/97ste/98ste/99ste bg: n-то/първо/второ/трето/четвърто/пето/шеÑто/Ñедмо/оÑмо/девето/деÑето/единадеÑето/дванадеÑето/тринадеÑето/четиринадеÑето/петнадеÑето/шеÑтнадеÑето/ÑедемнадеÑето/оÑемнадеÑето/деветнадеÑето/двадеÑето/21-о/22-о/23-о/24-о/25-о/26-о/27-о/28-о/29-о/30-о/31-о/32-о/33-о/34-о/35-о/36-о/37-о/38-о/39-о/40-о/41-о/42-о/43-о/44-о/45-о/46-о/47-о/48-о/49-о/50-о/51-о/52-о/53-о/54-о/55-о/56-о/57-о/58-о/59-о/60-о/61-о/62-о/63-о/64-о/65-о/66-о/67-о/68-о/69-о/70-о/71-о/72-о/73-о/74-о/75-о/76-о/77-о/78-о/79-о/80-о/81-о/82-о/83-о/84-о/85-о/86-о/87-о/88-о/89-о/90-о/91-о/92-о/93-о/94-о/95-о/96-о/97-о/98-о/99-о br: n-vet/1añ/eil/3de/4re/5vet/6vet/7vet/8vet/9vet/10vet/11vet/12vet/13vet/14vet/15vet/16vet/17vet/18vet/19vet/20vet/21vet/22vet/23vet/24vet/25vet/26vet/27vet/28vet/29vet/30vet/31vet/32vet/33vet/34vet/35vet/36vet/37vet/38vet/39vet/40vet/41vet/42vet/43vet/44vet/45vet/46vet/47vet/48vet/49vet/50vet/51vet/52vet/53vet/54vet/55vet/56vet/57vet/58vet/59vet/60vet/61vet/62vet/63vet/64vet/65vet/66vet/67vet/68vet/69vet/70vet/71vet/72vet/73vet/74vet/75vet/76vet/77vet/78vet/79vet/80vet/81vet/82vet/83vet/84vet/85vet/86vet/87vet/88vet/89vet/90vet/91vet/92vet/93vet/94vet/95vet/96vet/97vet/98vet/99vet/100vet/101vet/102vet/103vet/104vet ca: n-èssima/1a/2a/3a/4a/5a/6a/7a/8a/9a/10a/11a/12a/13a/14a/15a/16a/17a/18a/19a/20a/21a/22a/23a/24a/25a/26a/27a/28a/29a/30a/31a/32a/33a/34a/35a/36a/37a/38a/39a/40a/41a/42a/43a/44a/45a/46a/47a/48a/49a/50a/51a/52a/53a/54a/55a/56a/57a/58a/59a/60a/61a/62a/63a/64a/65a/66a/67a/68a/69a/70a/71a/72a/73a/74a/75a/76a/77a/78a/79a/80a/81a/82a/83a/84a/85a/86a/87a/88a/89a/90a/91a/92a/93a/94a/95a/96a/97a/98a/99a cs: n-tý/1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. da: nte/1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. de: n-ten/1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. en: nth/1st/2nd/3rd/4th/5th/6th/7th/8th/9th/10th/11th/12th/13th/14th/15th/16th/17th/18th/19th/20th/21st/22nd/23rd/24th/25th/26th/27th/28th/29th/30th/31st/32nd/33rd/34th/35th/36th/37th/38th/39th/40th/41st/42nd/43rd/44th/45th/46th/47th/48th/49th/50th/51st/52nd/53rd/54th/55th/56th/57th/58th/59th/60th/61st/62nd/63rd/64th/65th/66th/67th/68th/69th/70th/71st/72nd/73rd/74th/75th/76th/77th/78th/79th/80th/81st/82nd/83rd/84th/85th/86th/87th/88th/89th/90th/91st/92nd/93rd/94th/95th/96th/97th/98th/99th eo: n-a/1a/2a/3a/4a/5a/6a/7a/8a/9a/10a/11a/12a/13a/14a/15a/16a/17a/18a/19a/20a/21a/22a/23a/24a/25a/26a/27a/28a/29a/30a/31a/32a/33a/34a/35a/36a/37a/38a/39a/40a/41a/42a/43a/44a/45a/46a/47a/48a/49a/50a/51a/52a/53a/54a/55a/56a/57a/58a/59a/60a/61a/62a/63a/64a/65a/66a/67a/68a/69a/70a/71a/72a/73a/74a/75a/76a/77a/78a/79a/80a/81a/82a/83a/84a/85a/86a/87a/88a/89a/90a/91a/92a/93a/94a/95a/96a/97a/98a/99a es: n-ésima/1ra/2nda/3ra/4ta/5ta/6ta/7ma/8va/9na/10ma/11ra/12nda/13ra/14ta/15ta/16ta/17ma/18va/19na/20ma/21ra/22nda/23ra/24ta/25ta/26ta/27ma/28va/29na/30ma/31ra/32nda/33ra/34ta/35ta/36ta/37ma/38va/39na/40ma/41ra/42nda/43ra/44ta/45ta/46ta/47ma/48va/49na/50ma/51ra/52nda/53ra/54ta/55ta/56ta/57ma/58va/59na/60ma/61ra/62nda/63ra/64ta/65ta/66ta/67ma/68va/69na/70ma/71ra/72nda/73ra/74ta/75ta/76ta/77ma/78va/79na/80ma/81ra/82nda/83ra/84ta/85ta/86ta/87ma/88va/89na/90ma/91ra/92nda/93ra/94ta/95ta/96ta/97ma/98va/99na et: n-s/1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. fi: n./1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. fr: n-ième/1ère/2e/3e/4e/5e/6e/7e/8e/9e/10e/11e/12e/13e/14e/15e/16e/17e/18e/19e/20e/21e/22e/23e/24e/25e/26e/27e/28e/29e/30e/31e/32e/33e/34e/35e/36e/37e/38e/39e/40e/41e/42e/43e/44e/45e/46e/47e/48e/49e/50e/51e/52e/53e/54e/55e/56e/57e/58e/59e/60e/61e/62e/63e/64e/65e/66e/67e/68e/69e/70e/71e/72e/73e/74e/75e/76e/77e/78e/79e/80e/81e/82e/83e/84e/85e/86e/87e/88e/89e/90e/91e/92e/93e/94e/95e/96e/97e/98e/99e/100e/101e/102e/103e/104e/105e/106e/107e/108e/109e/110e/111e/112e/113e/114e/115e/116e/117e/118e/119e/120e/121e/122e/123e/124e/125e he: ×”n/ר×שון/ שני/ שלישי/ רביעי/ חמשי/ שישי/ שביעי/ שמיני/ תשיעי/ עשירי/11/12/13/14/15/16/17/18/19/20/21/22/23/24/25/26/27/8/29/30/31/32/33/34/35/36/37/38/39/40/41/42/43/44/45/46/47/48/49/50/51/52/53/54/55/56/57/58/59/60/61/62/63/64/65/66/67/68/69/70/71/72/73/74/75/76/77/78/79/80/81/82/83/84/85/86/87/88/89/90/91/92/93/94/95/96/97/98/99 is: /1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. it: n-esima/1a/2a/3a/4a/5a/6a/7a/8a/9a/10a/11a/12a/13a/14a/15a/16a/17a/18a/19a/20a/21a/22a/23a/24a/25a/26a/27a/28a/29a/30a/31a/32a/33a/34a/35a/36a/37a/38a/39a/40a/41a/42a/43a/44a/45a/46a/47a/48a/49a/50a/51a/52a/53a/54a/55a/56a/57a/58a/59a/60a/61a/62a/63a/64a/65a/66a/67a/68a/69a/70a/71a/72a/73a/74a/75a/76a/77a/78a/79a/80a/81a/82a/83a/84a/85a/86a/87a/88a/89a/90a/91a/92a/93a/94a/95a/96a/97a/98a/99a lv: /1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. nl: n-de/1ste/2de/3de/4de/5de/6de/7de/8ste/9de/10de/11de/12de/13de/14de/15de/16de/17de/18de/19de/20ste/21ste/22ste/23ste/24ste/25ste/26ste/27ste/28ste/29ste/30de/31ste/32ste/33ste/34ste/35ste/36ste/37ste/38ste/39ste/40ste/41ste/42ste/43ste/44ste/45ste/46ste/47ste/48ste/49ste/50ste/51ste/52ste/53ste/54ste/55ste/56ste/57ste/58ste/59ste/60ste/61ste/62ste/63ste/64ste/65ste/66ste/67ste/68ste/69ste/70ste/71ste/72ste/73ste/74ste/75ste/76ste/77ste/78ste/79ste/80ste/81ste/82ste/83ste/84ste/85ste/86ste/87ste/88ste/89ste/90ste/91ste/92ste/93ste/94ste/95ste/96ste/97ste/98ste/99ste no: n./første/andre/tredje/fjerde/femte/sjette/syvende/Ã¥ttende/niende/tiende/ellevte/tolvte/trettende/fjortende/femtende/sekstende/søttende/attende/nittende/tyvende/21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99./100./101./102./103./104./105./106./107./108./109./110./111./112./113./114./115./116./117./118./119./120./121./122./123./124./125./126./127./128./129./130. oc: n-ena/1èra/2nda/3ena/4ena/5ena/6ena/7ena/8ena/9ena/10ena/11ena/12ena/13ena/14ena/15ena/16ena/17ena/18ena/19ena/20ena/21ena/22ena/23ena/24ena/25ena/26ena/27ena/28ena/29ena/30ena/31ena/32ena/33ena/34ena/35ena/36ena/37ena/38ena/39ena/40ena/41ena/42ena/43ena/44ena/45ena/46ena/47ena/48ena/49ena/50ena/51ena/52ena/53ena/54ena/55ena/56ena/57ena/58ena/59ena/60ena/61ena/62ena/63ena/64ena/65ena/66ena/67ena/68ena/69ena/70ena/71ena/72ena/73ena/74ena/75ena/76ena/77ena/78ena/79ena/80ena/81ena/82ena/83ena/84ena/85ena/86ena/87ena/88ena/89ena/90ena/91ena/92ena/93ena/94ena/95ena/96ena/97ena/98ena/99ena pl: n/1/2/3/4/5/6/7/8/9/10/11/12/13/14/15/16/17/18/19/20/21/22/23/24/25/26/27/28/29/30/31/32/33/34/35/36/37/38/39/40/41/42/43/44/45/46/47/48/49/50/51/52/53/54/55/56/57/58/59/60/61/62/63/64/65/66/67/68/69/70/71/72/73/74/75/76/77/78/79/80/81/82/83/84/85/86/87/88/89/90/91/92/93/94/95/96/97/98/99 pt: n-ésima/1ra/2nda/3ra/4ta/5ta/6ta/7ma/8va/9na/10ma/11ra/12nda/13ra/14ta/15ta/16ta/17ma/18va/19na/20ma/21ra/22nda/23ra/24ta/25ta/26ta/27ma/28va/29na/30ma/31ra/32nda/33ra/34ta/35ta/36ta/37ma/38va/39na/40ma/41ra/42nda/43ra/44ta/45ta/46ta/47ma/48va/49na/50ma/51ra/52nda/53ra/54ta/55ta/56ta/57ma/58va/59na/60ma/61ra/62nda/63ra/64ta/65ta/66ta/67ma/68va/69na/70ma/71ra/72nda/73ra/74ta/75ta/76ta/77ma/78va/79na/80ma/81ra/82nda/83ra/84ta/85ta/86ta/87ma/88va/89na/90ma/91ra/92nda/93ra/94ta/95ta/96ta/97ma/98va/99na pt-br: n-ésima/1º/2º/3º/4º/5º/6º/7º/8º/9º/10º/11º/12º/13º/14º/15º/16º/17º/18º/19º/20º/21º/22º/23º/24º/25º/26º/27º/28º/29º/30º/31º/32º/33º/34º/35º/36º/37º/38º/39º/40º/41º/42º/43º/44º/45º/46º/47º/48º/49º/50º/51º/52º/53º/54º/55º/56º/57º/58º/59º/60º/61º/62º/63º/64º/65º/66º/67º/68º/69º/70º/71º/72º/73º/74º/75º/76º/77º/78º/79º/80º/81º/82º/83º/84º/85º/86º/87º/88º/89º/90º/91º/92º/93º/94º/95º/96º/97º/98º/99º ro: n./1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. ru: Ñнного/1-го/2-го/3-го/4-го/5-го/6-го/7-го/8-го/9-го/10-го/11-го/12-го/13-го/14-го/15-го/16-го/17-го/18-го/19-го/20-го/10-го/11-го/12-го/13-го/14-го/15-го/16-го/17-го/18-го/19-го/10-го/21-го/22-го/23-го/24-го/25-го/26-го/27-го/28-го/29-го/30-го/31-го/32-го/33-го/34-го/35-го/36-го/37-го/38-го/39-го/40-го/41-го/42-го/43-го/44-го/45-го/46-го/47-го/48-го/49-го/50-го/51-го/52-го/53-го/54-го/55-го/56-го/57-го/58-го/59-го/60-го/61-го/62-го/63-го/64-го/65-го/66-го/67-го/68-го/69-го/70-го/71-го/72-го/73-го/74-го/75-го/76-го/77-го/78-го/79-го/80-го/81-го/82-го/83-го/84-го/85-го/86-го/87-го/88-го/89-го/90-го/91-го/92-го/93-го/94-го/95-го/96-го/97-го/98-го/99-го sk: n-tý/1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. sl: /1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. sv: n:te/1:a/2:a/3:e/4:e/5:e/6:e/7:e/8:e/9:e/10:e/11:e/12:e/13:e/14:e/15:e/16:e/17:e/18:e/19:e/20:e/21:a/22:a/23:e/24:e/25:e/26:e/27:e/28:e/29:e/30:e/31:a/32:a/33:e/34:e/35:e/36e/37:e/38:e/39:e/40:e/41:a/42:a/43:e/44:e/45:e/46:e/47:e/48:e/49:e/50:e/51:a/52:a/53:e/54:e/55:e/56:e/57:e/58:e/59:e/60:e/61:a/62:a/63:e/64:e/65:e/66:e/67:e/68:e/69:e/70:e/71:a/72:a/73:e/74:e/75:e/76:e/77:e/78:e/79:e/80:e/81:a/82:a/83:e/84:e/85:e/86:e/87:e/88:e/89:e/90:e/91:a/92:a/93:e/94:e/95:e/96:e/97:e/98:e/99:e/100:e/101:a/102:a/103:e/104:e/105:e/106:e/107:e/108:e/109:e/110:e/111:e/112:e/113:e/114:e/115:e/116:e/117:e/118:e/119:e/120:e/121:a/122:a/123:e/124:e/125:e/126:e/127:e/128:e/129:e/130:e number af: nommer bg: номер br: niverenn ca: número cs: Äíslo da: løbenummer de: Nummer en: number eo: nombro es: número et: number fi: numero fr: numéro he: מספר is: númer it: numero lv: nummurs nl: nummer no: nummer oc: numèro pl: numer pt: número ro: numar ru: чиÑло sk: Äíslo sl: Å¡tevilka sv: nummer number of branches af: aantal stake bg: брой на клоновете br: niver ar skourroù ca: nombre de branques cs: poÄet vÄ›tví da: antal grene de: Anzahl der Äste en: number of lines eo: nombro da branĉoj es: número de ramas et: harude arv fi: Sukuhaarojen lukumäärä fr: nombre de branches he: מספר ×¢× ×¤×™× is: fjöldi greina it: numero di rami lv: zaru skaits nl: aantal takken no: antall grener oc: nombre de brancas pl: liczba linii (gałęzi) pt: número de ramos ro: numar de ramuri ru: чиÑло ветвей sk: poÄet vetví sl: Å¡tevilo vej sv: antal grenar number of children de: Anzahl der Kinder en: Number of children es: número de hijos fi: Lasten lukumäärä fr: nombre d’enfants it: numero di figli nl: aantal kinderen no: Antall barn oc: nombre d'enfants pt: número de filhos sv: Antal barn number of events de: Anzahl der Ereignisse en: Number of Facts es: número de eventos fi: Tapahtumien lukumäärä fr: nombre d'événements it: numero d'eventi nl: aantal evenementen no: Antall hendelser oc: nombre d'eveniments pt: número de eventos sv: Antal händelser number of individuals de: Anzahl der Individuen en: Number of Individuals es: número de individuos fi: Henkilöiden lukumäärä fr: nombre d'individus it: numero d'individui nl: aantal personen no: Antall individer oc: nombre d'individus pt: número de pessoas sv: Antal individer number of living persons: bg: брой на живите лица: cs: pocet zijucich osob: da: antal nulevende personer: de: Anzahl der lebenden Personen: en: number of living individuals: eo: nombro de la vivantaj personoj: es: número de personas vivas: et: elavaid inimesi: fi: elossa olevien lukumäärä: fr: nombre de personnes vivantes : he: מספר ×”×× ×©×™× ×©×¢×•×“× ×‘×—×™×™× it: numero di persone viventi: lv: dzÄ«vo personu skaits: nl: aantal personen in leven: no: antall personer i live: oc: nombre de personas vivas: pl: liczba osób żyjÄ…cych: pt: número de pessoas vivas : ro: numarul de persoane in viata: ru: количеÑтво живых перÑон sk: poÄet žijúcich osôb sl: Å¡tevilo živih oseb sv: antal levande personer: n° d'Aboville de: Nr. Aboville en: d'Aboville System number es: N° de Aboville fi: Numero fr: n° d’Aboville it: N° d’Aboville nl: Abovillenummer no: nummer oc: n° d'Aboville pt: n° de Aboville sv: nummer n° Sosa de: Nr. SOSA en: Sosa es: nº Sosa fi: Sosa-viite fr: n° Sosa it: n° Sosa nl: Sosa nr. no: Anenummer oc: n° de Sosa sv: Annummer n° Sosa relative to af: Sosa nommer relatief tot bg: чиÑло на СоÑа отноÑно br: niverenn Sosa e keñver ca: número "Sosa"relatiu a cs: "Sosa" Äíslo vztažené k da: Sosa-nummer, refererende til de: Ahnenkennziffer relativ zu en: Sosa relative to eo: numero Sosa relative al es: número Sosa respecto a et: Sosa number suhtes fi: Sosa-numero suhteen fr: n° Sosa par rapport à he: מספר Sosa ביחס ל- is: Sosa númer tengt it: Numero Sosa relativo a lv: SOSA pakÄpe attiecÄ«bÄ pret nl: Sosa nummer ten opzichte van no: Anenummer i forhold til oc: n° de Sosa relatiu a pl: numer "Sosa", odnoszÄ…cy siÄ™ do: pt: número Sosa em relação a ro: numar Sosa in relatie cu ru: Sosa номер отноÑительно sk: "Sosa" Äíslo vo vzÅ¥ahu k sl: Å¡tevilka"Sosa", v odnosu z sv: annummer med som proband (Kekules system) occupation/occupations af: beroep bg: занÑтие br: micher ca: ocupació cs: zamÄ›stnání da: stilling de: Beruf/Berufe en: occupation/occupations eo: okupado es: profesión/profesións et: amet fi: ammatti/ammatti fr: profession/professions he: מקצוע is: starf it: professione/professioni lv: nodarboÅ¡anÄs nl: beroep/beroepen no: yrke/yrke oc: ocupacion pl: zawód pt: ocupação ro: ocupatie ru: занÑтие sk: povolanie sl: poklic sv: yrke/yrke of course dead af: oorlede ar: توÙÙŠ bg: починал br: marvet ca: mort cs: zemÅ™el da: død de: sicherlich bereits verstorben en: may be dead eo: mortinta es: fallecido/a (fecha desconocida) et: surnud fi: varmuudella kuollut fr: certainement décédé he: נפטר is: dó it: sicuramente morto lv: mirÅ¡anas nl: zeker overleden no: helt sikkert avgÃ¥tt ved døden oc: segurament mòrt(a) pl: zmarÅ‚ pt: falecido ro: a decedat ru: умер sl: umrl sv: helt säkert avliden zh: æ­» of the %s generation af: uit die %s geslag bg: от %s поколение br: eus an %s rummad ca: a la %s generació cs: %s. generace da: af den %s generation de: der %s Generation en: of the %s generation eo: el la %s generacio es: de la %s generación et: (%s sugupõlv) fi: %s sukupolvea fr: à la %s génération he: לדור %s is: af %s kynslóð it: della %s generazione lv: %s-Ä paaudzÄ“ nl: van de %s generatie no: av den %s generasjon ca: a la %s generacion pl: w %s. pokoleniu pt: da %s geração ro: de generatia %s ru: %s Ð¿Ð¾ÐºÐ¾Ð»ÐµÐ½Ð¸Ñ sk: zo %s generácie sl: %s generacije sv: av den %s generationen on %s's side af: aan die kant van %s bg: от Ñтрана на %s br: eus tu %s ca: per part de %s cs: ze strany :g:%s da: fra %s's side de: von %ss Seite en: on %s's side eo: de la flanko de %s es: por parte de %s et: %s poolt fi: henkilön %s puolelta fr: du côté de %s he: בצד של %s is: á %s hlið it: dalla parte di %s lv: %s-jÄ pusÄ“ nl: van %s's kant no: fra %ss slektside oc: de la part de %s pl: ze strony osoby: %s pt: pelo lado de %s ro: de partea %s ru: Ñо Ñтороны %s sk: zo strany :g:%s sl: po strani %s sv: frÃ¥n %ss släktsida on (day month year) af: op ar: يوم bg: на br: d'an ca: el cs: dne da: den de: am en: eo: la es: el et: :i: fi: :e: fr: le he: ב- is:   it: il lv: datums: nl: op no: den oc: lo pl: dnia pt: a ro: la ru: sk: dňa sl: sv: den zh: 于 on (weekday day month year) af: bg: br: d'ar ca: cs: da: de: en: eo: es: et: :i: fi: :e: fr: he: is: it: lv: nl: no: oc: lo pl: w :a: pt: ro: ru: sk: sl: sv: zh: one day old af: een dag oud bg: на един ден br: un devezh ca: un dia cs: jeden den starý/jeden den stará da: en dag gammel de: einen Tag alt en: one day old eo: unu tago es: un día et: üks päev fi: päivän ikäisenä fr: un jour he: בן/בת ×™×•× is: dagsgamalt it: un giorno lv: vienu dienu vecs nl: één dag oud no: en dag gammel oc: un jorn pl: w wieku 1 dnia pt: um dia ro: o zi ru: однодневный sk: starý jeden deň/stará jeden deň sl: star en dan sv: en dag one month old af: een maand oud bg: на един меÑец br: ur mizvezh ca: un mes cs: jeden mÄ›síc starý/jeden mÄ›síc stará da: en mÃ¥ned gammel de: einen Monat alt en: one month old eo: unu monato es: un mes et: üks kuu fi: kuukauden ikäinen fr: un mois he: בן/בת חודש is: mánaðar gamalt it: un mese lv: vienu mÄ“nesi vecs nl: één maand oud no: en mÃ¥ned gammel oc: un mes pl: w wieku 1 miesiÄ…ca pt: um mês ro: o luna ru: меÑÑчный sk: starý jeden mesiac/stará jeden mesiac sl: star en mesec sv: en mÃ¥nad one year old af: een jaar oud bg: на една година br: ur bloavezh ca: un any cs: jeden rok starý/jeden rok stará da: et Ã¥r gammel de: ein Jahr alt en: one year old eo: unu jaro es: un año et: üks aasta fi: vuoden ikäinen fr: un an he: בן/בת שנה is: ársgamalt it: un anno lv: vienu gadu vecs nl: één jaar oud no: ett Ã¥r gammel oc: un an pl: w wieku 1 roku pt: um ano ro: un an ru: до года sk: starý jeden rok/stará jeden rok sl: star eno leto sv: ett Ã¥r only the generation selected af: net die gekose geslag bg: Ñамо избраното поколение br: ar rummad-tud dibabet hepken ca: només la generació elegida cs: pouze zvolená generace da: kun den valgte generation de: nur die ausgewählte Generation en: only the selected generation eo: nur la elektita generacio es: solamente la generación elegida et: ainult valitud sugupõlv fi: vain valittu sukupolvi fr: seulement la génération sélectionnée he: דור הנבכר בלבד is: aðeins valda kynslóðin it: soltanto la generazione selezionata lv: tikai izvÄ“lÄ“tajai paaudzei nl: alleen de geselecteerde generatie no: bare den valgte generasjonen oc: sonque la generacion causida pl: tylko wybrane pokolenie pt: só a geração selecionada ro: numai generatia aleasa ru: только выбранное поколение sk: iba zvolená generácia sl: samo izbrana generacija sv: endast den valda generationen optional af: opsioneel bg: по желание br: diret ca: opcional cs: volitelnÄ› da: efter behag de: optional en: optional eo: nedeviga es: opcional et: vabatahtlik fi: valittavissa fr: facultatif he: על פי בחירה is: má velja it: opzionale lv: neobligÄts nl: optioneel no: valgfritt oc: facultatiu pl: opcjonalnie pt: opcional ro: optional ru: дополнительно sk: voľba sl: po želji sv: valfritt or af: of ar: أو bg: или br: pe ca: o cs: nebo da: eller de: oder en: or eo: aù es: o et: või fi: tai fr: ou he: ×ו is: eða it: o lv: vai nl: of no: eller oc: o pl: lub pt: ou ro: sau ru: или sk: alebo sl: ali sv: eller other action af: ander stappe bg: други дейÑÑ‚Ð²Ð¸Ñ cs: další akce da: anden handling de: andere Aktion en: other action eo: alia ago es: otra acción et: muud toimingud fi: muut toimet fr: autre action is: aðrar aðgerðir it: altra azione lv: cita darbÄ«ba nl: andere acties no: andre tiltak oc: autra accion pl: inne dziaÅ‚ania pt: outra ação ro: alte măsuri ru: другие дейÑÑ‚Ð²Ð¸Ñ sk: ÄalÅ¡ie akcie sl: druge dejavnosti sv: andra Ã¥tgärder zh: 其他行動 parents af: ouers ar: والد bg: родители br: kerent ca: pares cs: rodiÄe da: forældre de: Eltern en: parents eo: gepatroj:a:+n es: padres et: vanemad fi: vanhemmat fr: parents he: ×”×•×¨×™× is: foreldrar it: genitori lv: vecÄki nl: ouders no: foreldre oc: parents pl: rodzice:a:-ów pt: pais ro: parinti ru: родители sk: rodiÄia sl: starÅ¡i sv: föräldrar zh: çˆ¶æ¯ paternal grand-parents de: Großeltern väterlicherseits en: Father's parents es: abuelos paternos fi: isän puolen isovanhemmat fr: grands parents paternels it: nonni paterni nl: grootouders langs vaderszijde no: farmor og farfar oc: grands paternals pt: avós paternos sv: farmor och farfar person added af: persoon bygevoeg bg: данните за лицето Ñа добавени br: den ouzhpennet ca: persona afegida cs: osoba pÅ™idána da: person tilføjet de: Person hinzugefügt en: person added eo: persono aldonita es: persona agregada et: isik lisatud fi: henkilö lisätty fr: personne ajoutée he: ××“× ×”×•×¡×£ is: einstaklingi bætt við it: persona aggiunta lv: persona pievienota nl: persoon toegevoegd no: person opprettet oc: persona aponduda pl: osoba zostaÅ‚a dodana pt: pessoa acrescentada ro: persoana adaugata ru: человек добавлен sk: osoba pridaná sl: oseba dodana sv: person tillagd person deleted af: persoon verwyder bg: данните за лицето Ñа премахнати br: den lamet kuit ca: persona esborrada cs: osoba smazána da: person slettet de: Person gelöscht en: individual has been deleted eo: persono nuligita es: persona borrada et: isik kustutatud fi: henkilön tiedot tuhottu fr: personne supprimée he: ××“× × ×ž×—×§ is: einstaklingi eytt it: persona cancellata lv: persona izdzÄ“sta nl: persoon verwijderd no: person fjernet oc: persona escafada pl: osoba zostaÅ‚a usunieta pt: pessoa suprimida ro: persoana suprimata ru: человек удален sk: osoba zmazaná sl: oseba izbrisana sv: person borttagen person modified af: persoon verander bg: данните за лицето Ñа променени br: den kemmet ca: persona modificada cs: osoba zmÄ›nÄ›na da: person ændret de: Person geändert en: person modified eo: persono modifita es: persona modificada et: isik muudetud fi: henkilöä muokattu fr: personne modifiée he: ××“× ×ž×¢×•×“×›×Ÿ is: einstaklingi breytt it: persona modificata lv: personas dati mainÄ«ti nl: persoon veranderd no: person endret oc: persona modificada pl: dane poniższej osoby zostaÅ‚y zaktualizowane pt: pessoa modificada ro: persoana modificata ru: человек изменен sk: osoba zmenená sl: oseba spremenjena sv: person ändrad person source de: Quellenangabe-Individuum en: Source of individual es: fuente individuo fi: Henkilön lähdetiedot fr: source individu it: fonte individuo nl: bron persoon no: Kilde til individ oc: font de la persona pt: fonte pessoa sv: Personkälla person/persons af: persoon/persone bg: данни за лицето/ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð·Ð° лица br: den/tud ca: persona/persones cs: osoba/osob da: person/personer de: Person/Personen en: individual/individuals eo: persono:a:+n/personoj:a:+n es: persona/personas et: isik/isiku@(c?t:d) fi: henkilö/henkilöä fr: personne/personnes he: ×ד×/ ×× ×©×™× is: einstaklingur/einstaklingar it: persona/persone lv: persona(s) nl: persoon/personen no: person/personer oc: persona/personas pl: osoba:a:-Ä™/osoby pt: pessoa/pessoas ro: persoana/persoane ru: Человека/Человек sk: osoba/osoby sl: oseba/oseb sv: person/personer persons having the same name af: persone met dieselfde nommer bg: лице ÑÑŠÑ Ñъщото име br: tud a zo an hevelep anv dezho ca: persones amb el mateix nom cs: osoby mají stejné jméno da: personer som har samme navn de: Personen haben denselben Namen en: persons having the same name eo: personoj samnomaj es: personas con el mismo nombre et: samanimelised isikud fi: samannimisiä henkilöitä fr: personnes ayant le même nom he: ×× ×©×™× ×¢× ×ותו ×”×©× is: fólk með sama nafn it: persone con lo stesso nome lv: peronas ar vienÄdiem vÄrdiem nl: personen met dezelfde naam no: personer som har samme navn oc: personas del nom identic pl: osoby o tym samym imieniu i nazwisku pt: pessoas com o mesmo apelido pt-br: pessoas com o mesmo nome ro: persoane cu acelas nume ru: человек Ñ Ñ‚ÐµÐ¼ же именем sk: osoby majúce to isté meno sl: osebe z istim imenom sv: personer som har samma namn photos & documents de: Fotos & Dokumente en: Archive & Pictures es: Fotos & documentos fi: Arkisto & Kuvat fr: Photos & Documents it: Foto & Documenti nl: Archief en foto's no: Arkiv & Bilder oc: fotos e documents pt: Arquivo & Imagens sv: Arkiv & Bilder place af: plek bg: мÑÑто br: lec'h ca: lloc cs: místo da: sted de: Ort en: place eo: loko es: lugar et: koht fi: paikka fr: lieu he: ×ž×§×•× is: staður it: luogo lv: vieta nl: plaats no: sted oc: lòc pl: miejsce pt: lugar ro: localitate ru: меÑто sk: miesto sl: kraj sv: plats places de: orte en: places es: lugares fi: paikoista fr: lieux it: luoghi nl: plaatsen no: steder oc: lòcs pt: locais sv: orternas plus de: Mehr en: More es: Más fi: Lisää fr: plus it: In più nl: Meer no: Mer oc: Mai pt: Mais sv: Mer population pyramid bg: възраÑтова пирамида cs: populacna pyramida da: befolkningspyramide de: Alterspyramide en: population pyramid eo: laÇ”aÄa piramido es: gráfico por edades et: rahvastikupüramiid fi: väestöpyramidi fr: pyramide des âges he: פירמידת גיל××™× it: piramide della popolazione lv: paaudžu piramÄ«da nl: bevolkingspiramide no: befolkningspyramide oc: piramida de las edats pl: piramida wieku pt: pirâmide populacional ro: piramida demografică ru: пирамида популÑции sk: populaÄná pyramída sl: populacijska piramida sv: befolkningspyramid possible duplications bg: възможни Ð´ÑƒÐ±Ð»Ð¸Ñ€Ð°Ð½Ð¸Ñ cs: mozna duplikacia de: mögliche Doppel en: possible duplications eo: ebla duobligo es: posible duplicación et: võimalikud duplikaadid fi: mahdolliset kaksoiskappaleet fr: doublons éventuels he: ייתכנו כפילויות it: eventuali doppioni lv: iespÄ“jama dublēšanÄs nl: eventuele dubbels no: mulige dubletter oc: dobles possibles pl: możliwe duplikaty pt: eventual duplicidade ro: posibile dublete ru: возможные дубликаты sk: možné duplikácie sl: možno podvajanje sv: möjliga dubbletter possibly (date) af: miskien bg: може би br: marteze ca: possiblement cs: snad da: mÃ¥ske de: vielleicht en: possibly eo: eble es: posiblemente et: võib-olla :i: fi: ehkä fr: peut-être he: ×ולי is: kannski it: forse lv: iespÄ“jams nl: mogelijkerwijze no: muligens oc: possiblament pl: prawdopodobnie pt: possivelmente ro: poate ru: возможно sk: možno sl: verjetno sv: kanske precision af: akkuraatheid bg: точноÑÑ‚ br: resisadur ca: precisió cs: pÅ™esnÄ› da: præcisering de: Genauigkeit en: precision eo: precizeco es: precisión et: täpsus fi: tarkennus fr: précision he: דייוק is: nákvæmni it: precisione lv: precizitÄte nl: precisie no: nøyaktighet oc: precision pl: dokÅ‚adność pt: precisão ro: precizie ru: точно sk: presne sl: natanÄnost sv: precision preview family tree de: überblick vom Stammbaum en: Preview Family Tree es: ver ärbol fi: Yleiskatsaus sukutauluun fr: aperçu de l'arbre it: anteprima dell’albero nl: overzicht van de stamboom no: oversikt over oc: vista de l'arbre pt: ver árvore sv: översikt över previous sibling af: vorige broer/vorige suster/vorige broer of suster bg: предхождащ брат/предхождаща ÑеÑтра/предхождащ брат или предхождаща ÑеÑтра br: breur kent/c'hoar kent/breur pe c'hoar kent ca: germà anterior/germana anterior/germà(ana) anterior cs: pÅ™edchozí sourozenec da: foregÃ¥ende søskende de: vorhergehender Bruder/vorhergehende Schwester/vorhergehende Geschwister en: previous sibling eo: antaùa frato/antaùa fratino/antaùa frat(in)o es: hermano anterior/hermana anterior/hermano (a) anterior et: eelmine vend/eelmine õde/eelmine õde või vend fi: edellinen veli/edellinen sisar/edellinen sisaruksista fr: frère précédent/sÅ“ur précédente/frère ou sÅ“ur précédent he: ××—(ות) הגדול(×”) is: fyrra systkyn it: fratello precedente/sorella precedente/fratello o sorella precedente lv: iepriekšējais brÄlis/iepriekšējais mÄsa nl: vorige broer/vorige zuster/vorige broer of zuster no: forrige bror/forrige søster/forrige søsken oc: fraire precedent/sòrre precedenta/fraire o sòrre/precedent(a) pl: poprzedni brat lub siostra pt: irmão precedente/irmã precedente/irmã(o) precedente ro: frate precedent/soraprecedenta/frati sau surori precedente ru: предшеÑтвующий брат/предшеÑÑ‚Ð²ÑƒÑŽÑ‰Ð°Ñ ÑеÑтра sk: starší brat/starÅ¡ia sestra/starší súrodenec sl: starejÅ¡i brat/starejÅ¡a sestra sv: föregÃ¥ende bror/föregÃ¥ende syster/föregÃ¥ende syskon private af: privaat bg: ЧаÑтен br: prevez ca: privat cs: soukromé da: privat de: privat en: private eo: privata es: privado et: privaatne fi: yksityinen fr: privé he: פרטי is: einka it: riservato lv: privÄts nl: persoonlijk no: privat oc: privat pl: bez danych osobowych pt: privado ro: privat ru: ЧаÑтный sk: súkromé sl: zasebno sv: privat public af: openbare bg: общ br: er renabloù a-berzh Stad ca: públic cs: veÅ™ejné da: offentlig de: öffentlich en: public eo: publika es: público et: avalik fi: julkinen fr: public he: ציבורי is: opinbert it: pubblico lv: publisks nl: publieke no: offentlig oc: public pl: bez ograniczeÅ„ pt: público ro: public ru: общий sk: verejné sl: javno sv: offentligt public name af: Noemnaam bg: официално име br: anv a-berzh Stad ca: nom públic cs: veÅ™ejné jméno da: officielt navn de: öffentlicher Name en: nickname eo: publika nomo es: sobrenombre et: esindusnimi fi: julkinen nimi fr: nom public he: ×©× ×‘×¦×™×‘×•×¨ is: opinbert nafn it: appellativo pubblico lv: publiskais vÄrds nl: publieke naam no: offisielt navn oc: nom public pl: imiÄ™ oficjalne pt: nome público ro: nume public ru: извеÑтен как sk: verejné meno sl: uradno ime sv: officiellt namn qualifier af: bynaam bg: почетен епитет към името br: adanv ca: qualificatiu cs: přívlastek da: tilnavn de: Beiname en: title eo: kromnomo:a:+n es: calificativo et: lisanimi fi: lisänimi fr: sobriquet he: כינוי is: uppnefni it: soprannome lv: paskaidrojuma vÄrds nl: bijnaam no: kallenavn oc: qualificatiu pl: przydomek pt: alcunha ro: calificativ ru: прозвище sk: prívlastok sl: oznaka sv: smeknamn recognized son/recognized daughter/recognized child af: aanvaarde seun/aanvaarde dogter/aanvaarde kind bg: припознат Ñин/припозната дъщерÑ/припознато дете br: mab anavezet/merc'h anavezet/bugel anavezet ca: fill reconegut/filla reconeguda/fills reconeguts cs: uznaný syn/uznaná dcera/uznané dítÄ› da: anerkendt søn/anerkendt datter/anerkendt barn de: anerkannter Sohn/anerkannte Tochter/anerkanntes Kind en: recognized son/recognized daughter/recognized child eo: agnoskita filo/agnoskita filino/agnoskita ido es: hijo reconocido/hija reconocida/hijos reconocidos et: omakstunnistatud poeg/omakstunnistatud tütar/omakstunnistatud laps fi: tunnustettu poika/tunnustettu tytär/tunnustettu lapsi fr: fils reconnu/fille reconnue/enfant reconnu he: בן ידוע/ בת ידועה/ ילד ידוע is: viðurkendur sonur/viðurkend dóttir/viðurkent barn it: figlio riconosciuto/figlia riconosciuta/figlio riconosciuto lv: atzÄ«ts dÄ“ls/mÄsa/bÄ“rns (?) nl: erkende zoon/erkende dochter/erkend kind no: bekrefteter far/bekrefteter mor/bekrefter foreldre oc: filh reconegut/filha reconeguda/enfants reconeguts pl: uznany syn/uznana córka/uznane dziecko pt: filho reconhecido/filha reconhecida/filhos reconhecidos ro: fiu recunoscut/fica recunoscuta/copil recunoscut ru: уÑыновлен/удочерена/признанный ребенок sk: uznaný syn/uznaná dcéra/uznaný potomok sl: znan sin/znana hÄerka/znani otroci sv: erkänd son/erkänd dotter/erkänt barn recognizing father/recognizing mother/recognizing parents af: erkennende vader/erkennende moeder/erkennende ouders bg: припознал баща/припознала майка/припознали родители br: an tad en deus e(hec'h) anavezet/ar vamm he deus e(hec'h) anavezet/ar gerent o deus e (hec'h) anavezet ca: pare reconegut/mare reconeguda/pares reconeguts cs: uznaný otec/uznaná matka/uznaní rodiÄe da: sig vedkendende fader/sig vedkendende moder/sig vedkendende forældre de: anerkennender Vater/anerkennende Mutter/anerkennende Eltern en: recognized by father/recognized by mother/recognized by eo: agnoskinta patro/agnoskinta patrino/agnoskintaj gepatroj es: padre reconocido/madre reconocida/padres reconocidos et: omakstunnistanud isa/omakstunnistanud ema/omakstunnistanud vanemad fi: tunnustanut isä/tunnustanut äiti/tunnustaneet vanhemmat fr: père l’ayant reconnu/mère l’ayant reconnu/parents l’ayant reconnu he: ×ב מכיר / ×× ×ž×›×™×¨×” / ×”×•×¨×™× ×ž×›×™×¨×™× is: viðurkenndur faðir/viðurkennd móðir/viðurkennd foreldri it: padre che ha riconosciuto/madre che ha riconosciuto/genitori che hanno riconosciuto lv: atzÄ«ts tÄ“vs/mÄte/vecÄki (?) nl: erkennende vader/erkennende moeder/erkennende ouders no: bekreftet far/bekreftet mor/bekreftede foreldre oc: paire reconegut/maire reconeguda/parents reconeguts pl: uznajÄ…cy ojciec/uznajÄ…ca matka/uznajÄ…cy rodzice pt: pai que o reconheceu/mãe que o reconheceu/pais que o reconheceram ro: tata recunoscator/mama recunoscatoare/parinti recunoscatori ru: признанный отец/Ð¿Ñ€Ð¸Ð·Ð½Ð°Ð½Ð½Ð°Ñ Ð¼Ð°Ñ‚ÑŒ/признаный родитель sk: uznaný otec/uznaná matka/uznaný rodiÄ sl: znani oÄe/znana mati/znani starÅ¡i sv: erkännande far/erkännande mor/erkännande föräldrar reference key de: referenz en: ID es: referencia fi: referenssi fr: référence it: riferimento nl: referentie no: referanse oc: referéncia pt: referência sv: referens region de: Region en: Region es: Región fi: Alue fr: Région it: Provincia nl: Regio no: Fylke oc: Region pt: Região sv: Län relation/relations af: verwant/verwante bg: взаимоотношение/Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ br: kar/kerent ca: relació/relacions cs: vztah/vztahy da: forbindelse/forbindelser de: Beziehung/Beziehungen en: relationship/relationships eo: konato:a:+n/konatoj es: relación/relaciones et: suhe/suhted fi: sukulaisuus/sukulaisuudet fr: relation/relations he: ×™×—×¡×™× is: skyldleiki/skyldleikar it: relazione/relazioni lv: saistÄ«ba/saistÄ«bas nl: verwantschap/verwantschappen no: relasjon/relasjoner oc: relacion/relacions pl: inne wiÄ™zy pt: relação/relações ro: relatie/relatii ru: отношениÑ/Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ sk: vzÅ¥ah/vzÅ¥ahy sl: razmerje/razmerja sv: relation/relationer relationship af: verwantskap bg: родÑтво br: kerentiezh ca: parentesc cs: vztah da: slægtskab de: Verwandtschaft en: relationship eo: parenceco es: parentesco et: sugulus fi: sukulaisuus fr: parenté he: קשר משפחתי is: skyldleikar it: parentela lv: radniecÄ«ba nl: verwantschap no: slektskap oc: parentat pl: pokrewieÅ„stwo pt: parentesco ro: relatie ru: родÑтво sk: vzÅ¥ah sl: zveza sv: släktskap relationship by ancestors de: Direkte Vorfahren en: ancestry es: ascendientes directos fi: esipolvet fr: ascendants directs it: ascendenti diretti nl: rechtstreekse voorouders no: aner oc: ascendents dirèctes pt: ascendentes diretos sv: anor relationship by marriage af: aangetroude verwantskappe bg: родÑтво чрез брак br: liammoù a gerentiezh dre euredennoù ca: parentiu polític cs: příbuzenské vztahy pÅ™es svatby da: slægtskaber ved giftermÃ¥l de: Heiratsbeziehungen en: relatives by marriage eo: ligoj per edziÄo es: parentescos políticos et: sugulus abielu kaudu fi: sukulaisuus avioliiton kautta fr: liens de parenté par alliance he: ×§×©×¨×™× ×“×¨×š נשו×ין is: tengjast með giftingu it: parentele per matrimonio lv: precÄ«bu saites nl: verwant door huwelijk no: relasjon gjennom ekteskap oc: ligams per maridatge pl: powinowactwo pt: relações por casamento ro: relatie prin mariaj ru: ÑвÑзь браком sk: príbuzenské vzÅ¥ahy cez svadby sl: sorodstvo preko poroke sv: släktskap genom äktenskap relationship computing af: bereken verwantskappe bg: определÑне на родÑтво br: jediñ ar gerentiezh ca: càlcul de parentesc cs: nalezení vztahů da: slægtskabsberegning de: Verwandtschaft ermitteln en: relationship computing eo: kalkulo de parenceco es: cálculo de parentesco et: suguluse leidmine fi: sukulaisuuslaskelma fr: calcul de parenté he: חישוב יחס משפחתי is: reikna tengsl it: calcolo della parentela lv: radniecÄ«bas aprēķinÄÅ¡ana nl: verwantschap bepalen no: slektskapsberegning oc: calcul de parentat pl: szukanie pokrewieÅ„stwa pt: cálculo de parentesco ro: calcul de relatii ru: кому приходитÑÑ sk: nájdenie vzÅ¥ahov sl: pregled sorodstva sv: släktskapsberäkning zh: 相关查询 relationship computing mode de: berechnungsart en: Mode es: modo de cálculo fi: laskutapa fr: mode de calcul it: modo di calcolo nl: berekeningswijze no: utregningsmÃ¥te oc: mòde de calcul pt: modo de cálculo sv: uträkningssätt relationship display options de: anzeigeoptionen der Verwandtschafts-Bäume: en: options: es: opciones de edición de los árboles de parentesco: fi: näyttötapa: fr: options d’affichage des arbres de parenté : it: opzioni di visualizzazione degli alberi di parentela: nl: toonopties van de verwantschapsstambomen no: visningsmÃ¥te oc: opcions d’afichatge dels arbres de parentat: pt: opções de edição das árvores de parentesco: sv: sätt att visa relationship link between de: verwandt mit ... en: family link with... es: parentesco con... fi: sukulaisuus henkilön kanssa... fr: lien de parenté avec... it: imparentato con... nl: verwantschapsband met... no: i slekt med... oc: ligam de parentat amb... pt: parentesco com... sv: släktskap med... relationship link/relationship links af: verwantskap/verwantskappe bg: родÑтвена връзка/родÑтвени връзки br: liamm a gerentiezh/liammoù a gerentiezh ca: grau de parentesc/graus de parentesc cs: vztah/vztahy da: slægtskabsforbindelse/slægtskabsforbindelser de: Verwandtschaft/Verwandtschaften en: relationship/relationships eo: ligo de parenceco/ligoj de parenceco es: grado de parentesco/grados de parentesco et: sugulussuhe/sugulussuhet fi: sukulaisuuskytkentä/sukulaisuuskytkentää fr: lien de parenté/liens de parenté he: קשר משפחתי/ קשרי משפחה is: skyldleika tengsl/skyldleika tengsli it: grado di parentela/gradi di parentela lv: radniecÄ«bas saite(s) nl: verwantschap/verwantschappen no: slektslinje/slektslinjer oc: ligam de parentat/ligams de parentat pl: linia pokrewieÅ„stwa/linie pokrewieÅ„stwa pt: grau de parentesco/graus de parentesco ro: linie de relatii ru: родÑÑ‚Ð²ÐµÐ½Ð½Ð°Ñ ÑвÑзь/родÑтвенные ÑвÑзи sk: príbuzenský vzÅ¥ah/príbuzenské vzÅ¥ahy sl: sorodnik/sorodnikov sv: anlinje/anlinjer relationship shortcut de: Verknüpfungen : en: Shortcuts: es: atajos : fi: oikotie: fr: raccourcis : it: scorciatoie : nl: binnenweg : no: snarvei: oc: acorchas: relationship%t to af: verwantskap%t met bg: има връзка%t Ñ br: kerentiezh %t gant ca: parentesc%t amb cs: %t vztah s da: forbindelse%t med de: in einer Beziehung%t mit en: relationship%t to eo: rilato%t kun es: parentesco%t con et: kooselu%t fi: suhde%t ja fr: relation%t avec he: קירבה is: sambúð%t með it: legame%t con lv: %t attiecÄ«bas ar nl: verbonden%t met no: familie%t med oc: parentat%t avec pl: zwiÄ…zek%t z: pt: relacionado%t com/relacionada%t com pt-br: junto%t com ro: relatia%t cu ru: приходитÑÑ%t sk: vzÅ¥ah %t s sl: zveza z %t sv: förhÃ¥llande%t med retired de: Ruhestand en: Retirement es: jubilación fi: Eläkkeelle jäänti fr: retraite it: pensione nl: Pensionering no: Pensjonering oc: retirat pt: reforma sv: Pesnionering revision history de: Verlauf der Revisionen en: Revision history es: histórico de las revisiones fi: Tarkastushistoria fr: historique des révisions it: cronistoria delle revisioni nl: historiek revisies no: Revisjonshistorikk oc: istoric de las revisions pt: histórico das revisões sv: Uppdateringshistoria revision of de: Revision von en: Revision date es: revisión del fi: Tarkastuspäivämäärä fr: révision du it: revisione del nl: revisie van no: Revisjonsdato oc: revision del pt: revisão de sv: Uppdatering gjord same ancestor as n° Sosa de: identisch mit Sosa Nr. en: Same as Sosa # es: idéntico al nº Sosa fi: Sama kuin Sosa # fr: identique au n° Sosa it: identico al n° Sosa nl: identiek met sosa nr no: Samme som Sosa # oc: identic(a) al n° Sosa # pt: idêntico ao nº Sosa sv: Samma ättling som n° Sosa search/case sensitive bg: търÑене/Ñ Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð°Ð²Ð°Ð½Ðµ на главни и малки букви ca: recerca/coincidir maj_min cs: hledat/citlivý na velikost písma da: søg/følsom overfor store og smÃ¥ bogstaver de: suchen/Groß- & Kleinschreibung beachten en: search/case sensitive eo: search/dependema de la grandaj-malgrandaj literoj es: buscar/fijarse en mayúsculas/menúsculas et: otsi/tõstutundlik fi: haku/merkkikokoriippuvainen fr: rechercher/sensible à la casse he: חיפוש/case sensitive it: ricerca/sensibile a maiuscole e minuscole lv: meklēšana/reÄ£istrjÅ«tÄ«ga nl: zoeken/hoofdlettergevoelig no: søk/skiller mellom store og smÃ¥ bokstaver oc: recèrca/en téner compte de las majusculas pl: szukaj/wielkość liter ma znaczenie pt: pesquisar/sensível à capitulação pt-br: procurar/diferencia maiúsculas ro: cautare/sensibila la caz ru: поиÑк/региÑтрозавиÑимый sk: hľadaÅ¥/citlivý na veľkosÅ¥ písma sl: iskanje/razlikovanje VELIKIH-malih Ärk sv: sök/skiftlägeskänslig searching all de: suche alle en: Search es: buscar todos los fi: Hae kaikki fr: recherche tous les it: ricercare tutti i nl: zoek alle no: Søk oc: recercar totes los pt: pesquisar todos os sv: Sök alla see af: sien bg: вж. br: gwelout ca: veure cs: viz da: se de: siehe en: see eo: vidu :a: es: ver et: vaata fi: katso fr: voir he: לר×ות is: sjá it: vedi lv: sakatÄ«t nl: zie no: se oc: veire pl: zobacz pt: ver ro: vezi ru: Ñмотри sk: pozri sl: glej sv: se see above af: kyk hierbo bg: вж. по-горе br: gwelout amañ a-us ca: veure més amunt cs: viz výše da: se ovenfor de: siehe oben en: see above eo: vidu ĉi-supre es: ver más arriba et: vaata ülalt fi: katso yllä fr: voir ci-dessus he: ×”× "ל is: sjá að ofan it: vedi sopra lv: skatÄ«t iepriekÅ¡ nl: zie hierboven no: se ovenfor oc: veire çai sus pl: zobacz wyżej pt: ver encima pt-br: ver acima ro: vezi antecedenta ru: Ñмотри выше sk: pozri vyššie sl: glej zgoraj sv: se ovan see also de: siehe auch en: see also es: ver también fi: näytä myös fr: à voir aussi it: vedi anche nl: ook te bekijken no: vis ogsÃ¥ oc: tanben veire pt: ver também sv: visa ocksÃ¥ see ascendants notes/sources de: siehe Notizen/Quellen en: View notes/sources es: ver las notas/fuentes fi: Katso merkinnät/lähteet fr: voir les notes & les sources it: vedere le note/fonti nl: notities & bronnen bekijken no: Se pÃ¥ merknader/kilder oc: veire las nòtas e las fonts pt: ver notas & fontes sv: Se kommande generations noteringar och källor see ascendants pictures de: siehe Porträts en: View pictures es: ver los retratos fi: Näytä kuvat fr: voir les photos it: vedere i ritratti nl: foto's bekijken no: Se pÃ¥ bilder oc: veire las fòtos pt: ver fotos sv: Se kommande generations bilder see descendants notes/sources de: siehe Notizen/Quellen en: View notes/sources es: ver las notas/fuentes fi: Näytä merkinnät/lähteet fr: voir les notes & les sources it: vedere le note/fonti nl: notities & bronnen bekijken no: Se pÃ¥ merknader/kilder oc: veire las nòtas e las fonts pt: ver notas & fontes sv: Se efterföljandes noteringar och källor see descendants pictures de: siehe Porträts en: View pictures es: ver los retratos fi: Näytä kuvat fr: voir les photos it: vedere i ritratti nl: foto's bekijken no: Se pÃ¥ bilder oc: veire las fòtos pt: ver fotos sv: Se efterföljandes bilder see further af: kyk verder bg: вж. по-долу br: gwelout pelloc'h ca: veure tot seguit cs: viz dále da: se nedenfor de: siehe unten en: see further eo: vidu ĉi-malsupre es: ver a continuación et: vaata altpoolt fi: katso tarkemmin fr: voir plus loin he: כדלקמן is: sjá nánar it: vedi di seguito lv: skatÄ«t tÄlÄk nl: zie verder no: se videre oc: veire çai jos pl: zobacz niżej pt: ver a continuação ro: vezi urmatoarea ru: Ñмотри дальше sk: pozri Äalej sl: nadalje glej sv: se vidare see person de: Familienstand en: Individual es: Registro Civil fi: Henkilö fr: état civil it: anagrafe nl: burgerlijke stand no: Individuell oc: estat civil pt: ver pessoa sv: Individ select de: auswählen : en: select: es: elegir: fi: valitse: fr: choisir : it: scegliere: nl: kiezen: no: velg oc: causir: pt: selecionar: sv: välj select a letter de: wählen Sie einen Buchstaben en: Select a letter es: elija una letra fi: valitse kirjain fr: choisissez une lettre it: scegli una lettera nl: kies een letter no: Velg en bokstav oc: causissètz-vos una letra pt: selecione uma letra sv: välj en bokstav select a month to see all the anniversaries de: zum zeigen der Geburtstage den Monat auswählen en: select month es: elegir un mes para ver todos los cumpleaños fi: valitse kuukausi nähdäksesi kaikki syntymäpäivät fr: sélectionnez un mois pour voir tous les anniversaires it: scegliere un mese per vedere tutti i comlpeanni nl: een maand kiezen om alle verjaardagen te zien no: velg en mÃ¥ned for Ã¥ vise alle fødselsdager oc: causissètz-vos un mes per veire los aniversaris pt: selecione um mês para ver todos os aniversários sv: välj en mÃ¥nad för att visa alla födelsedagar select a spouse de: Partner auswählen en: Select spouse es: elija un cónyuge fi: Valitse puoliso fr: choisissez un conjoint : it: scegli un coniuge nl: kies een partner no: Velg ektefelle oc: causissètz-vos un conjunt: pt: selecione um cônjuge: sv: Välj maka/make select person to compute relationship de: auf die Person klicken, zu der Sie das Verwandtschaftsverhältnis berechnen möchten en: click an individual below to calculate the family link es: pulse en la persona con la que quiere realizar un cálculo de parentesco fi: napsauta henkilöä, jonka sukulaisuusasteen haluat laskea fr: cliquez sur la personne avec laquelle vous souhaitez réaliser un calcul de parenté it: clicca sulla persona per la quale vuoi fare un calcolo di parentela nl: op de persoon klikken van waaruit u een verwantschapsberekening wenst no: klikk pÃ¥ personen som du vil beregne slektskapsgraden til oc: causissètz-vos la persona de calcular la parentat pt: selecione a pessoa sobre a qual pretende realizar um cálculo de parentesco sv: klicka pÃ¥ personen som du vill räkna ut släktskapsgraden med select the two revisions you want to compare de: wählen Sie zwei zu vergleichende Revisionen en: Select revisions to view history es: seleccione las dos revisiones que quiere comparar fi: Valitse kaksi vertailtavaa versiota fr: sélectionnez les deux révisions que vous voulez comparer it: seleziona le due versioni da paragonare nl: selecteer de twee revisies die u wenst te vergelijken no: Velg revisjoner for Ã¥ se pÃ¥ historikk oc: causissètz-vos las doás revisions de comparar pt: selecione as duas revisões que pretende comparar sv: Välj de tvÃ¥ uppdateringar Du vill jämföra send af: stuur bg: да Ñе изпрати br: kas ca: enviar cs: odeslat da: indsæt de: senden +before en: upload eo: sendi :a: es: enviar et: saada fi: lähetä fr: envoyer he: שלח is: senda it: inviare lv: sÅ«tÄ«t nl: zenden +before no: send oc: mandar pl: dołącz :a: pt: enviar ro: trimite ru: поÑлать sk: poÅ¡li sl: poÅ¡lji sv: skicka separated af: separated bg: разделени br: dispartïet ca: separats cs: odlouÄeni da: separeret de: getrennt lebend en: separated eo: apartigitaj es: separados et: elavad lahus fi: asumuserossa fr: séparés he: נפרדו is: skilin it: separati lv: nedzÄ«vo kopÄ nl: gescheiden no: separert oc: separats pl: w separacji pt: separados ro: despartiti ru: разделены sk: odlúÄení sl: živela narazen sv: separerat several answers af: verskeie antwoorde bg: нÑколко отговора br: meur a respont ca: vàries respostes cs: více odpovÄ›dí da: flere svar de: mehrere Antworten en: several answers eo: pluraj respondoj es: varias respuestas et: mitmed vastused fi: useita vastauksia fr: plusieurs réponses he: כמה תשובות is: mörg svör it: parecchie risposte lv: vairÄkas atbildes nl: meerdere antwoorden no: flere svar oc: mai d'una responsa pl: wiÄ™cej niż jedna odpowiedź pt: várias respostas ro: mai multe raspunsuri ru: неÑколько ответов sk: viac odpovedí sl: veÄ reÅ¡itev sv: flera svar sex af: geslag bg: пол br: reizh ca: sexe cs: pohlaví da: køn de: Geschlecht en: sex eo: sekso es: sexo et: sugu fi: sukupuoli fr: sexe he: מין is: kyn it: sesso lv: dzimums nl: geslacht no: kjønn oc: sèxe pl: pÅ‚eć pt: sexo ro: sex ru: пол sk: pohlavie sl: spol sv: kön short display af: beknopte weergawe bg: кратко br: gwereadur berr ca: presentació curta cs: krátký výpis da: standardrapport de: kurze Ansicht en: short display eo: mallonga afiÅado es: presentación corta et: lühiraport fi: lyhyt esitys fr: affichage court he: תצוגה מקוצרת is: stutt sýn it: display corto lv: saÄ«sinÄtais attÄ“lojums nl: beknopte weergave no: kort rapport oc: afichatge cort pl: postać skrócona pt: resultados sucintos ro: resultat scurt ru: кратко sk: krátky výpis sl: kratek seznam sv: kort rapport shortest path af: kortste pad bg: най-кратък път br: ar berrañ hent ca: drecera cs: nejkratší cesta da: korteste vej de: Auf kürzestem Weg en: shortest path eo: vojo plej mallonga es: atajo et: lühim tee fi: lyhyin reitti fr: chemin le plus court he: קשר ×”×›×™ קרוב is: stysta leið it: legame più diretto lv: Ä«sÄkais ceļš nl: kortste weg no: korteste vei oc: camin mai cort pl: najkrótsza linia pt: caminho mais curto ro: drumul cel mai scurt ru: кратчайший путь sk: najkratÅ¡ia cesta sl: najkrajÅ¡a vez sv: kortaste vägen should be female af: behoort vroulik te wees bg: би трÑбвало да е жена br: a rankfe bezañ benel he reizh ca: hauria de ser de sexe femení cs: mÄ›la by být ženského pohlaví da: burde være kvinde de: müsste weiblichen Geschlechts sein en: should be female eo: devus esti ina es: debería ser de sexo feminino et: peaks olema naissoost fi: pitäisi olla naispuolinen fr: devrait être de sexe féminin he: צריכה להיות נקבה is: ætti að vera kvenkyns it: dovrebbe essere di sesso femminile lv: jÄbÅ«t sievietei nl: moet vrouwelijk zijn no: kjønn burde være kvinne oc: deuriá èsser de sèxe femenin pl: powinna być kobietÄ… pt: teria que ser de sexo feminino ro: ar trebui sa fie feminin ru: должна быть женщиной sk: mala by byÅ¥ žena sl: bi moral biti ženska sv: borde vara kvinna should be male af: behoort manlik te wees bg: би трÑбвало да е мъж br: a rankfe bezañ gourel e reizh ca: hauria de ser de sexe masculí cs: mÄ›l by být mužského pohlaví da: burde være mand de: müsste männlichen Geschlechts sein en: should be male eo: devus esti maskla es: debería ser de sexo masculino et: peaks olema meessoost fi: pitäisi olla miespuolinen fr: devrait être de sexe masculin he: צריך להיות זכר is: ætti að vera karlkyns it: dovrebbe essere di sesso maschile lv: jÄbÅ«t vÄ«rietim nl: moet mannelijk zijn no: kjønn burde være mann oc: deuriá èsser de sèxe masculin pl: powinna być mężczyznÄ… pt: teria que ser de sexo masculino ro: ar trebui sa fie masculin ru: должен быть мужчиной sk: mal by byÅ¥ muž sl: bi morala biti moÅ¡ki sv: borde vara man siblings af: broers en susters bg: Ð±Ñ€Ð°Ñ‚Ñ Ð¸ ÑеÑтри br: breudeur ha c'hoarezed ca: germans i germanes cs: sourozenci da: søskende de: Geschwister en: siblings eo: gefratoj es: hermanos y hermanas et: õed ja vennad fi: sisarukset fr: frères et sÅ“urs he: ××—×™× is: systkyni it: fratelli lv: brÄļi/mÄsas nl: broers en zusters no: søsken oc: faires e sòrres pl: rodzeÅ„stwo pt: irmãos e irmãs ro: frati/surori ru: Ð±Ñ€Ð°Ñ‚ÑŒÑ Ð¸Ð»Ð¸ ÑеÑты sk: súrodenci sl: bratje in sestre sv: syskon since the last click bg: от поÑледното щракване cs: este posledne kliknutie da: siden det sidste klik de: seit dem letzten click en: since the last click eo: depost la lasta kliko es: desde el último click et: alates viimasest klõpsust fi: edellisestä napsautuksesta fr: depuis le dernier clic he: מ××– הלחיצה ×”×חרונה it: dall'ultimo click lv: kopÅ¡ pÄ“dÄ“jÄ klikšķa nl: sinds de laatste klik no: siden siste klikk oc: dempuèi lo darrièr clic pl: od ostatniego klikniÄ™cia pt: desde o último clique ro: de la ultimul click ru: Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ‚Ð° поÑледнего щелчка sk: od posledného poklepania sl: od zadnjega klika sv: frÃ¥n senaste klick son/daughter/child af: seun/dogter/kind bg: Ñин/дъщерÑ/деца br: mab/merc'h/bugel ca: fill/filla/fill(a) cs: je synem/je dcerou/je dítÄ›tem da: søn/datter/barn de: Sohn/Tochter/Kind en: son/daughter/child eo: filo/filino/ido es: hijo/hija/hijo(a) et: poeg/tütar/laps fi: poika/tytär/lapsi fr: fils/fille/enfant he: בן/ בת is: sonur/dóttir/barn it: figlio/figlia/figlio(a) lv: dÄ“ls/meita/bÄ“rns nl: zoon/dochter/kind no: sønn/datter/barn oc: filh/filha/enfant pl: syn/córka/dziecko pt: filho/filha/filho(a) ro: fiu/fica/copil ru: Ñын/дочь/дети sk: syn/dcéra/dieÅ¥a sl: sin/hÄerka/otrok sv: son/dotter/barn sort by/branch/alphabetic order de: sortieren nach: /Zweige/Alphabet en: Sort by:/Line/Alphabetical order es: organizar por: ramas/orden alfabético fi: Lajittelu:/Sukulinja/Aakkosjärjestys fr: trier par :/branches/ordre alphabétique it: smistare per :/rami/ordine alfabetico nl: tonen per:/tak/alfabetische volgorde no: vises etter:/grener/alfabetisk orden oc: triar per:/branca/òrdre alfabetic pt: ordenar por:/ramo/ordem alfabética sv: visas efter:/grenar/alfabetisk ordning sort by/date begin/alphabetic order/nb individuals/nb events de: sortieren nach: /Anfangsdatum/Alphabet/Anzahl der Individuen/Anzahl der Ereignisse en: Sort by:/Date/Alphabetical order/Number of individuals/Number of facts es: organizar por: fecha de inicio/orden alfabético/numero de individuos/número de eventos fi: Lajittelu:/Päivämäärä/Aakkosjärjestys/Henkilöiden lukumäärä/Tapahtumien lukumäärä fr: trier par:/date de début/ordre alphabétique/nombre d'individus/nombre d'événements it: smistare per : data d'inizio/ordine alfabetico/numero d'individui/numero d'eventi nl: sorteren per:/begindatum/alfabetisch/aantal personen/aantal evenementen no: Sorter etter:/Dato/alfabetisk rekkefølge/antall individer/antall hendelser oc: triar per:/date de debuta/òrdre alfabetic/nombre de personas/nombre d'eveniments pt: ordenar por:/data de início/ordem alfabética/número de pessoas/número de eventos sv: Sortera efter datum börja alfabetisk ordning/nb individer/nb haändelser sort by/generation/alphabetic order de: sortieren nach: /Generationen/Alphabet en: Sort by:/Generation/Alphabetical order es: organizar por: generación/orden alfabético fi: Lajittelu:/Sukupolvi/Aakkosjärjestys fr: trier par:/génération/ordre alphabétique it: smistare per : /generazione/ordine alfabetico nl: tonen per:/tak/alfabetische volgorde no: vises etter:/grener/alfabetisk orden oc: triar per:/generacion/òrdre alfabetic pt: ordenar por:/geração/ordem alfabética sv: visas efter:/grenar/alfabetisk ordning Sosa af: Sosa bg: ЧиÑло на СоÑа br: Sosa ca: número "Sosa" cs: "Sosa" da: Sosa de: Ahnenkennziffer en: Sosa eo: Sosa es: Sosa et: Sosa fi: Sosa fr: Sosa he: Sosa is: Sosa it: Sosa lv: SOSA nl: Sosa no: Anenummer oc: numèro de Sosa pl: "Sosa" pt: Sosa ro: Sosa ru: Sosa sk: Sosa sl: Å¡tevilka Sosa sv: annummer Sosa reference: %t af: Sosa verwysing: %t ca: referència de "número Sosa": %t de: Sosa Referenz: %t en: Family Tree Root: %t eo: Sosa referenco: %t es: referencia Sosa: %t et: Sosa viidet: %t fi: Sosa-viitteenä: %t fr: référence Sosa : %t he: ×›×זכור Sosa: %t it: riferimento Sosa : %t lv: Sosa pakÄpes: %t nl: Sosareferentie : %t oc: referéncia de Sosa: %t pt: referência Sosa: %t ro: referinta Sosa: %t sk: referenciou "Sosa": %t source/sources af: bron/bronne bg: източник/източници br: mammenn/mammennoù ca: font/fonts cs: zdroj/zdroje da: kilde/kilder de: Quelle/Quellen en: source/sources eo: fonto/fontoj es: fuente/fuentes et: allikas/allikad fi: lähde/lähteet fr: source/sources he: מקור/ מקורות is: heimild/heimildir it: fonte/fonti lv: avots/avoti (pirmsÄkums?) nl: bron/bronnen no: kilde/kilder oc: font/fonts pl: źródÅ‚o/źródÅ‚a pt: fonte/fontes ro: sursa/surse ru: иÑточник/иÑточники sk: zdroj/zdroje sl: vir/viri sv: källa/källor specify af: dui aan bg: уточнете br: resisait ca: especificar cs: zvol da: præciser de: Auswahl der en: select eo: specifu :a: es: especificar et: täpsusta fi: tarkenna fr: précisez he: פרט is: tilgreina it: specificare lv: noteikt nl: specificeer no: velg oc: especificatz pl: wybierz pt: especificar ro: specifica ru: укажите sk: upresni sl: doloÄi sv: välj zh: ä»Žä¸‹åˆ—é€‰å– spouse/spouses de: ehepartner/partner en: spouse/spouses es: cónyuge/cónyuges fi: puoliso/puoliso fr: conjoint/conjoints it: coniuge/coniugi nl: partner/partners no: partner/partners oc: conjunt/conjunts pt: cônjuge/cônjuges sv: partner/partners spouses not included af: eggenote weggelaat bg: без да Ñе включват Ñъпрузите/Ñъпругите br: ar priedoù n'int ket enklozet ca: cònjuges no inclosos cs: manželé/manželky nejsou zahrnuty da: eksklusive ægtefæller de: exklusive Ehegatten en: spouses not included eo: geedzoj ne inkluzivitaj es: cónyuges no incluidos et: ilma abikaasadeta fi: puolisot ei sisällytetty fr: conjoints non compris he: ×œ× ×›×•×œ×œ בני זוג is: undanskildir makar it: coniugi esclusi lv: laulÄtie nav ietverti nl: zonder echtgenoten no: ektefeller utelatt oc: sens los conjunts pl: bez wliczania małżonków pt: cônjuges não incluídos ro: conjugati exclusi ru: Ñупругов не включать sk: manželia/manželky nie sú zahrnuté sl: brez mož/žena sv: exklusive makar starting with af: beginnende met bg: Ñ Ð¿ÑŠÑ€Ð²Ð° буква br: o kregiñ gant ca: començant per cs: poÄínaje da: som begynder med de: beginnend mit en: begin with eo: komencante kun es: comenzando con et: algusega fi: ensimmäisenä fr: commençant par he: להתחיל מ- is: sem byrjar á it: partendo da lv: sÄkot ar nl: beginnend met no: som starter med oc: començant per pl: zaczynajÄ…c od: pt: começando com ro: incepind cu ru: начинаютÑÑ Ñ sk: zaÄaÅ¥ s sl: zaÄenÅ¡i z sv: som börjar med statistics af: statistiek bg: ÑтатиÑтика br: stadegoù ca: estadístiques cs: statistika da: statistikker de: Statistiken en: statistics eo: statistikoj es: estadísticas et: statistika fi: tilastotietoja fr: statistiques he: × ×ª×•× ×™× ×¡×˜×˜×™×¡×˜×™× is: staða it: statistiche lv: statistika nl: statistieken no: statistikk oc: estatisticas pl: zestawienia pt: estatísticas ro: statistici ru: ÑтатиÑтика sk: Å¡tatistika sl: statistike sv: statistik statistics and anniversaries bg: ÑтатиÑтика и годишнини de: Statistik und Geburtstage en: Statistics and Family Facts es: Estadísticas y aniversarios fi: tilastot ja vuosipäivät fr: Statistiques et anniversaires it: Statistiche e compleanni nl: Statistieken en verjaardagen no: Statistikk og familehendelser oc: Estatisticas e aniversaris pt: Estatísticas e aniversários sv: Statistik och Ã¥rsdagar subdivision de: Ort en: Suburb es: Lugar llamado fi: Kylä fr: Lieu-dit it: Località nl: Gehucht no: Sted oc: Lòc pt: Localidade sv: Ort summary book ascendants de: liste der Dateien en: list of individuals es: lista de fichas fi: kaikki perhetietokortit fr: liste des fiches it: lista delle schede nl: lijst van de fichen no: sammendrag oc: lista de las personas pt: lista de fichas sv: lista över ansedlar surname alias af: van alias bg: друго фамилно име br: lezanv-tud (alias) ca: nom de casa cs: alias příjmení da: efternavns alias de: Nachnamen-Alias en: alternate Surname eo: familia:a:+n nomo:a:+n aliasa:a:+n es: apellido alias et: muu perekonnanimi fi: sukunimi alias fr: patronyme alias he: ×©× ×ž×©×¤×—×” ×חר is: auka eftirnafn it: alias del cognome lv: otrs uzvÄrds nl: alias voor familienaam no: alias for etternavn oc: escais del nom de familha pl: alias nazwiska pt: alias do apelido pt-br: apelido do sobrenome ro: alias de nume ru: новаÑ:a:--ую фамилиÑ:a:-ÑŽ sk: alias priezviska sl: drug priimek sv: efternamns alias surname missing af: van ontbreek bg: фамилното име липÑва br: an anv-tud a vank ca: falta el cognom cs: příjmení schází da: efternavn mangler de: fehlender Nachname en: surname missing eo: familia nomo mankanta es: falta apellido et: perekonnanimi puudub fi: sukunimi puuttuu fr: patronyme manquant he: ×©× ×ž×©×¤×—×” חסר is: eftirnafn vantar it: cognome mancante lv: trÅ«kst uzvÄrds nl: familienaam ontbreekt no: etternavn mangler oc: manca lo nom de familha pl: brak nazwiska pt: falta o apelido pt-br: falta o sobrenome ro: prenumele lipseste ru: Ñ„Ð°Ð¼Ð¸Ð»Ð¸Ñ ÑƒÑ‚Ñ€Ð°Ñ‡ÐµÐ½Ð° sk: priezvisko chýba sl: manjka priimek sv: efternamn saknas surname not found af: van nie gevind nie bg: фамилното име не бе намерено br: an anv-familh n'eo ket bet kavet ca: cognom no localitzat cs: příjmení nenalezeno da: efternavn ikke fundet de: Nachname nicht gefunden en: surname not found eo: familia nomo ne trovita es: apellido no encontrado et: perekonnanime ei leitud fi: sukunimeä ei löydy fr: patronyme pas trouvé he: ×©× ×ž×©×¤×—×” ×œ× × ×ž×¦× is: finn ekki eftirnafn it: cognome non trovato lv: uzvÄrds nav atrodams nl: familienaam niet gevonden no: finner ikke etternavnet oc: nom de familha pas trobat pl: nazwisko nie zostaÅ‚o znalezione pt: apelido não foi encontrado pt-br: sobrenome não foi encontrado ro: nume negasit ru: Ñ„Ð°Ð¼Ð¸Ð»Ð¸Ñ Ð½Ðµ найдена sk: priezvisko nenájdené sl: priimek ni najden sv: hittar inte efternamn surname/surnames af: van/vanne ar: اللقب bg: фамилно име/фамилни имена br: anv-familh/anvioù-familh ca: cognom/cognoms cs: příjmení da: efternavn/efternavne de: Nachname/Nachnamen en: surname/surnames eo: familia nomo/familiaj nomoj es: apellido/apellidos et: perekonnanimi/perekonnanimed:k:+ega fi: sukunimi/sukunimet fr: patronyme/patronymes fr-cr: nom-fan-mille he: ×©× ×ž×©×¤×—×”/ שמות משפחה is: eftirnafn/eftirnöfn it: cognome/cognomi lv: uzvÄrds/uzvÄrdi nl: familienaam/familienamen no: etternavn/etternavn oc: nom de familha/noms de familha pl: nazwisko/nazwiska pt: apelido/apelidos pt-br: sobrenome/sobrenomes ro: nume de familie ru: фамилиÑ/фамилии sk: priezvisko/priezviská sl: priimek/priimki sv: efternamn/efternamn zh: å§“ surnames branch de: zweige der Familiennamen en: lines by name es: ramas de apellidos fi: sukuhaarat fr: branches patronymiques it: rami per cognome nl: naamstakken no: grener oc: brancas patronimicas pt: ramos patronímicos sv: grenar surnames list af: vanne lys bg: ÑпиÑък на фамилните имена br: roll an anvioù-tud ca: llistat de cognoms cs: seznam příjmení da: efternavnsoversigt de: Nachnamen-Liste en: surnames list eo: listo de la familiaj nomoj es: lista de apellidos et: perekonnanimede nimekiri fi: sukunimiluettelo fr: liste éclair he: רשימת שמות משפחה is: eftirnafna listi it: lista dei cognomi lv: uzvÄrdu saraksts nl: lijst van familienamen no: liste over etternavn oc: lista dels noms de familha pl: lista nazwisk pt: lista de apelidos pt-br: lista de sobrenomes ro: lista de nume de familie ru: ÑпиÑок фамилий sk: zoznam priezvísk sl: seznam priimkov sv: efternamns lista table de: tabelle en: table es: tabla fi: taulukko fr: tableau it: tabella nl: tabel no: tabell oc: taula pt: tabela sv: tabell text af: teks bg: текÑÑ‚ br: testenn ca: text cs: text da: tekst de: Text en: text eo: teksto es: texto et: tekst fi: teksti fr: texte he: כתוב is: texti it: testo lv: teksts nl: tekst no: tekst oc: tèxte pl: tekst pt: texto ro: text ru: текÑÑ‚ sk: text sl: tekst sv: text the %d first names af: die %d voorname bg: %d ÑобÑтвени имена br: ar %d raganv ca: els %d noms cs: %d kÅ™estních jmen da: de %d fornavne de: die %d Vornamen en: the %d first names eo: la %d unuaj nomoj es: los %d nombres et: %d eesnime fi: %d etunimeä fr: les %d prénoms he: %d שמות ×”×¤×¨×˜×™×™× is: %d fyrstu fornöfnin it: i %d nomi lv: %d personvÄrdi nl: de %d voornamen no: de %d fornavnene oc: los %d prenoms pl: %d imion pt: os %d nomes pt-br: os %d prenomes ro: %d prenume ru: %d имён sk: %d mien sl: %d lastnih imen sv: de %d förnamnen the %d oldest couples perhaps still alive and engaged af: die %d oudste pare moontlik nog in lewe en verloof bg: най-отдавнашните %d двойки от евентуално още живи и Ñгодени лица ca: les parelles més grans potser encara vives i juntes cs: %d nejstarších párů pravdÄ›podobnÄ› žijících a zadaných da: og de %d ældste par muligvis stadig i live og forlovede de: die %d ältesten verlobten und möglicherweise noch lebenden Paare en: the %d oldest couples perhaps still alive and engaged eo: versajne la %d plej altaj paroj ankorau vivas kaj estas fiancigitaj es: los novios más viejos y quizás todavía vivos et: %d vanimat kihlatud ja võib-olla veel elus olevat paari fi: %d vanhinta mahdollisesti elossa olevaa kihlaparia fr: les %d couples les plus anciens peut-être encore vivants et fiancés he: יתכן ש-%d הזוגות ×”×ž×‘×•×’×¨×™× ×‘×™×•×ª×¨ ×¢×•×“× ×‘×—×™×™× ×•×¢×•×“× ×ž××•×¨×¡×™× is: %d elstu pörin eru hugsanlega enn saman og á lífi it: le %d coppie più anziane forse ancora viventi e fidanzate lv: % iespÄ“jams vÄ“l dzÄ«vu un saderÄ«nÄtu vecÄko pÄru nl: De %d oudste, mogelijk nog in leven zijnde, verloofde paren no: Det % eldste par som kanskje fremdeles er i live og forlovet oc: los %d parelhs mai vièlhs benlèu encara vius e promés pl: %d najstarszych par prawdopodobnie jeszcze zyjÄ…cych i pozostajÄ…cych zarÄ™czeni pt: o %d mais velho casal talvez ainda vivo e noivado pt-br: os %d mais velhos casais talvez ainda vivos ro: Cei %d mai virstnici perechi logoditi probabil inca in viata ru: Ñтарейшие %d возможно живых Ñупругов или помолвленных sk: %d najstarších párov pravdepodobne žijúcich a zadaných sl: %d najstarejÅ¡ih morda Å¡e živih in zaroÄenih parov sv: de %d äldsta nu levande paren som kanske fortfarande är förlovade the %d oldest perhaps still alive af: die %d oudstes wat nog leef bg: най-Ñтарите %d евентуално още живи лица br: ar %d den koshañ bev c'hoazh marteze ca: les %d persones més grans, potser encara vives cs: %d nejstarších snad jeÅ¡tÄ› žijících osob da: de %d ældste af de muligt levende de: die %d ältesten vermutlich noch lebenden Personen en: the %d oldest perhaps still alive eo: la %d plej maljunaj eble ankoraù vivantaj es: los %s más viejos quizás todovía vivo et: %d vanimat, kes võib-olla on veel elus fi: %d vanhinta ehkä vielä elävää fr: les %d les plus âgés peut-être encore vivants he: הזקן ×” %d ש×ולי עוד ×‘×—×™×™× is: %d elsti sem kann að vera á lífi it: %d più anziani che possono essere ancora viventi lv: %d visvecÄkie iespÄ“jams vÄ“l ir dzÄ«vi nl: de %d oudste, mogelijk nog in leven zijnde, personen no: de %d eldste som muligens lever oc: las %d personas encara vivas pl: %d najstarszych osób (prawdopodobnie) żyjÄ…cych pt: os %d mais velhos talvez ainda vivos ro: %d cei mai batrini posibil mai in viata ru: %d Ñамых Ñтарых еще живущих sk: %d najstaších, snÃ¡Ä eÅ¡te žijúcich osôb sl: %d najstarejÅ¡ih, morda Å¡e živeÄih sv: de %d äldsta personerna som kanske lever the %d surnames af: die %d vanne bg: %d фамилни имена br: ar %d anv-familh ca: els %d cognoms cs: %d příjmení da: de %d efternavne de: die %d Nachnamen en: the %d surnames eo: la %d familiaj nomoj es: los %d apellidos et: %d perekonnanime fi: %d sukunimeä fr: les %d patronymes he: %d שמות המשפחה is: %d fyrstu eftirnöfnin it: i %d cognomi lv: %d uzvÄrdi nl: de %d familienamen no: de %d etternavnene oc: los %d noms de familha pl: %d nazwisk pt: os %d apelidos pt-br: os %d sobrenomes ro: %d nume de familie ru: %d фамилий sk: %d priezvísk sl: %d priimkov sv: de %d efternamnen the %d who lived the longest af: die %d wat die langste gelewe het bg: най-дълго живелите %d лица br: ar %d o deus bevet ar pellañ ca: les %d persones que han viscut més anys cs: %d osob které žili nejdéle da: de %d som har levet længst de: die %d Personen, die am längsten lebten en: the %d who lived the longest eo: la %d, kiuj vivis plejlonge es: los %d que han vivido más mucho tiempo et: %d kõige kauem elanut fi: %d pisimpään elänyttä fr: les %d ayant vécu le plus longtemps he: ×” %d ב×ריכות ×™×ž×™× is: %d sem lifði lengst it: i %d che hanno vissuto più a lungo lv: %d, kuri dzÄ«vojuÅ¡i visilgÄk nl: de %d personen die het langst geleefd hebben no: de %d som har levd lengst oc: las %d personas qu'an viscut mai longtemps pl: %d osób, które żyÅ‚y najdÅ‚użej pt: os %d que mais viveram ro: %d cei mai in virsta ru: %d проживших дольше вÑех sk: %d osôb, ktoré žili najdlhÅ¡ie sl: %d oseb, ki so živele najdlje sv: de %d personerna som har levt längst the %s generation af: die %s geslag bg: %s поколение br: ar %s rummad-tud ca: la %s generació cs: %s. generace da: den %s generation de: die %s Generation en: the %s generation eo: la %s generacio es: la %s generación et: %s. sugupõlv fi: %s. sukupolvi fr: la %s génération he: דור ×”%s is: %s kynslóð it: la %s generazione lv: %s. paaudze nl: de %s generatie no: %s generasjon oc: la %s generacion pl: %s pokolenie pt: a %s geração ro: generatia %s ru: %s-е поколение sk: %s. generácia sl: %s. generacija sv: den %s generationen the anniversary af: die herdenking bg: годишнината br: an deiz-ha-bloaz ca: l'aniversari cs: výroÄí da: Ã¥rsdagen de: der Jahrestag en: the anniversary eo: la datreveno es: el aniversario et: aastapäev fi: vuosipäivä fr: l’anniversaire he: ×™×•× ×”×©× ×” is: afmælisdagar it: l'anniversario lv: gadadiena nl: de verjaardag no: merkedagen oc: l'aniversari pl: rocznica pt: o aniversário ro: aniversarea ru: годовщина sk: výroÄie sl: obletnica sv: Ã¥rsdagen the anniversary of marriage af: die huweliksherdenking bg: годишнината на брака br: deiz-ha-bloaz an eured ca: l'aniversari de bodes cs: výroÄí svatby da: bryllupsdagen de: der Hochzeitstag en: the wedding anniversary eo: la datreveno de edziÄo es: el aniversario de casamiento et: pulma-aastapäev fi: hääpäivä fr: l’anniversaire de mariage he: ×™×•× ×”× ×™×©×•×ין is: brúðkaupsafmæli it: l'anniversario di matrimonio lv: kÄzu diena nl: de huwelijksverjaardag no: bryllupsdagen oc: aniversari de maridatge pl: rocznica Å›lubu pt: o aniversário de casamento ro: aniversatia de mariaj ru: годовщина брака sk: výroÄie svadby sl: obletnica poroke sv: bröllopsdagen the base has changed; do "back", "reload", and refill the form af: die databasis het verander; gaan "terug", "herlaai" en vul die vorm weer in bg: базата от данни е променена; натиÑнете "back" и "reload" и попълнете отново формулÑра br: ar bon roadoù a zo kemmet : distroit d'ar bajenn a-raok, grit "hizivaat ar bajenn", ha grit en-dro ar reolskrid ca: la base ha canviat, fer "back", "reload" i completeu novament el formulari cs: databáze se zmÄ›nila; vraÅ¥te se zpÄ›t (back), znovu naÄtÄ›te stránku (reload) a vyplňte formulář da: databasen er ændret; gÃ¥ tilbage, klik for opdatering og udfyld formularen igen de: die Datenbank wurde verändert; drücke bitte "zurück (back)", "neu laden (reload)" und fülle das Formular neu aus en: the base has changed; do "back", "reload", and refill the form eo: la bazo Åangis; faru "malantaÅ­e", "reÅargi", kaj replenigu la formularon es: la base ha cambiado: hacer "back", "reload" y completar nuevamente el formulario et: andmebaas on mutunud: mine tagasi, värskenda lehekülg ja täida vorm uuesti fi: tietokanta on muuttunut; valitse "takaisin", "lataa uudelleen" ja täytä lomake uudelleen fr: la base a changé : revenez à la page précédente, actualisez la et resaisissez le formulaire he: מ×גר המידה השתנה: לעשות "back" ו-"reload" ×•×œ×ž×œ× ×ž×—×“×© ×ת הטופס is: gagnagrunnurinn hefur breyst; gerðu "Back", "Reload", og settu aftur í formið it: la base è cambiata; fate "back", "reload" e rifate la scheda lv: datu bÄzÄ“ ir veiktas izmaiņas; nospiediet "back", "reload", un aizpildiet formu nl: het bestand is veranderd; klik "back", "reload" en vul de details nogmaals in no: databasen er endret; gÃ¥ tilbake, klikk "oppfrisk", og fyll ut formularet pÃ¥ nytt oc: la basa foguèt modificada, tornatz enrè e tornatz cargar e tornatz editar la ficha pl: w bazie zostaÅ‚y dokonane zmiany; kliknij "wstecz" i "odÅ›wież", a nastÄ™pnie ponownie wprowadź dane pt: a base mudou: fazer "back", "reload" e preencher novamente o formulário ro: basa de date a fost schimbata; mergi inapoi, ceri formularul si intra datele din nou ru: база изменилаÑÑŒ; нажмите "назад", "перечитать" и заполните Ñнова форму sk: databáza sa zmenila; vráťte se späť (back), znovu naÄítajte stránku (reload) a vyplňte formulár sl: baza podatkov se je spremenila: kliknite "back" in "reload" ter ponovno vpiÅ¡ite podatke sv: databasen har ändrats; gÃ¥ tillbaka, klicka uppdatera och fyll i formuläret igen the birthday af: die verjaarsdag bg: рождениÑÑ‚ ден br: deiz-ganedigezh ca: l'aniversari cs: narozeniny da: fødselsdagen de: der Geburtstag en: the birthday eo: la naskiÄdatreveno es: el cumpleaños et: sünnipäev fi: syntymäpäivä fr: l’anniversaire he: ×™×•× ×”×”×•×œ×“×ª is: afmælisdagur it: il compleanno lv: dzimÅ¡anas diena nl: de verjaardag no: fødselsdagen oc: l'aniversari pl: urodziny pt: o aniversário de nascimento ro: aniversarea zilei de nastere ru: день Ñ€Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ sk: narodeniny sl: rojstni dan sv: födelsedagen the children af: die kinders bg: децата br: ar vugale ca: els fills cs: dÄ›ti da: børnene de: die Kinder en: the children eo: la idoj es: los hijos et: lapsed fi: lapset fr: les enfants he: ×”×™×œ×“×™× is: börnin it: i figli lv: bÄ“rns nl: de kinderen no: barna oc: los enfants pl: dzieci pt: os filhos ro: copii ru: ребенок sk: deti sl: otroci sv: barnen the day after tomorrow af: oormôre bg: вдругиден br: an deiz goude warc'hoazh ca: demà passat cs: pozítří da: i overmorgen de: übermorgen en: the day after tomorrow eo: postmorgaù es: pasado mañana et: ülehomme fi: ylihuomenna fr: après-demain he: ×ž×—×¨×ª×™×™× is: næsta dag it: dopo domani lv: parÄ«t nl: overmorgen no: i overmorgen oc: deman passat pl: pojutrze pt: depois de amanhã ro: poimaine ru: поÑлезавтра sk: pozajtra sl: pojutriÅ¡nem sv: i övermorgon the difference of age between %t and %t is quite important de: der Altersunterschied zwischen %t und %t ist sehr groß en: Date of birth of %t and %t are too far together es: la diferencia de edad entre %t y %t es grande fi: Henkilöiden %t ja %t ikäero on liian suuri fr: la différence d’âge entre %t et %t est assez importante it: il divario d'età tra %t e %t è importante nl: leeftijdsverschil tussen %t en %t is vrij belangrijk no: Fødselsdato til %t og %t er for langt fra hverandre oc: la diferéncia d’atge entre %t e %t es pro importanta pt: a diferença de idade entre %t e %t é bastante importante sv: Skillnaden i Ã¥lder mellan %t och %t är mycket viktig the father-in-law/the mother-in-law af: die skoonpa/die skoonma bg: тъÑтът:a:--а/тъщата/Ñвекърът:a:--а/Ñвекървата br: an tad-kaer/ar vamm-gaer ca: el sogre/la sogra cs: tchán/tchýnÄ› da: svigerfaderen/svigermoderen de: der:d:dem Schwiegervater/die:d:der Schwiegermutter en: the father-in-law/the mother-in-law eo: bopatro/bopatrino es: el suegro/la suegra et: äi/ämm fi: appi/anoppi fr: le beau-père/la belle-mère he: ×”×—×/ החמות is: tengdafaðir/tengdamóðir it: il suocero/la suocera lv: vÄ«ratÄ“vs/sievastÄ“vs/vÄ«ramÄte/sievasmÄte nl: de schoonvader/de schoonmoeder no: svigerfaren/svigermoren oc: lo sògre/la sògra pl: teść/teÅ›ciowa pt: o sogro/a sogra ro: socrul/soacra ru: Ñвекор-теÑть/Ñвекровь-теща sk: svokor/svokra sl: tast/taÅ¡Äa sv: svärfadern/svärmodern the father/the mother/a parent af: die pa/die ma/'n ouer bg: бащата/майката/родител br: an tad/ar vamm/un tad pe ur vamm ca: el pare/la mare/un pare cs: otec/matka/rodiÄe da: faderen/moderen/en forælder de: der:d:dem Vater/die:d:der Mutter/ein:d:+em Elternteil en: the father/the mother/a parent eo: la patro/la patrino/unu el la gepatroj es: el padre/la madre/un padre et: isa/ema/vanem:g:+a fi: isä:g:+n/äiti:g:--din/vanhempi:g:--man fr: le père/la mère/un parent he: ×”×ב/ ×”××/ הורה is: faðir/móðir/foreldri it: il padre/la madre/un genitore lv: tÄ“vs/mÄte/vecÄks nl: de vader/de moeder/een ouder no: faren/moren/en av foreldrene oc: lo paire/la maire/un parent pl: ojciec/matka/rodzic pt: o pai/a mãe/um dos pais ro: tatal/mama/parinti ru: мать/отец/родители sk: otec/matka/rodiÄ sl: oÄe/mati/starÅ¡ sv: fadern/modern/en förälder zh: 父/ æ¯/a parent the file is temporarily locked: please try again af: die lêer is tydelik gesluit: probeer asseblief later weer bg: файлът е временно заключен; опитайте отново. Ðко това не помага, изчакайте малко преди да опитате пак br: ar fichennaoueg a zo morailhet evit ar poent: klaskit ober ur wech c'hoazh. Ma ne da ket en-dro, gortozit un tamm a-raok adkregiñ ganti ca: la base està temporalment tancada: provar de nou. Si això no funciona, espereu uns moments abans de tornar a provar cs: soubor je doÄasnÄ› uzamÄen: zkuste to znova. Pokud to stále nefunguje, chvíli poÄkejte a pak to zkuste znovu. da: filen er midlertidigt lÃ¥st: prøv igen. Hvis dette gentagne gange ikke fungerer, da vent lidt inden næste forsøg de: die Datei ist z.Z. geschützt: versuche es bitte nochmal. Wenn das nicht funktioniert, bitte eine Weile warten und nochmal probieren. en: the file is temporarily locked: please try again. If it still does not work, wait a while before trying again eo: la sliparo estas provizore riglata: provu denove. Se tio ne funkcios, atendu iomete kaj provu ankoraù unufoje es: la base está temporalmente cerrada: ensayar de nuevo. Si no funciona, espere un instante antes de ensayar nuevamente et: fail on ajutiselt lukustatud: proovi uuesti fi: tiedosto on lukkiutunut, yritä hetken kuluttua uudelleen fr: le fichier est temporairement verrouillé : essayez encore. Si cela ne fonctionne toujours pas, attendez quelques instants avant de réessayer he: הקובץ נעול זמנית: לחקות ולנסות שוב is: skjalið er læst í augnablikinu, reyndu aftur it: l'archivio è temporaneamente locked: prego prova ancora. Se ancora non funziona, attendere un istante prima di provare ancora lv: datne pagaidÄm ir slÄ“gta: lÅ«dzu mēģiniet vÄ“lreiz nl: het bestand is tijdelijk niet toegankelijk: probeer later weer eens no: filen er midlertidig lÃ¥st: Vennligst vent og prøv igjen oc: la basa es temporarament varrolhada: ensajatz tornar. Se marcha pas, esperatz un pauc mai de temps pl: plik jest chwilowo niedostÄ™pny; spróbuj później, ewentualnie chwilÄ™ odczekaj pt: a base está temporariamente inacessível: por favor tente novamente. Se não funcionar, espere um momento ro: fisierul este blocat; incearca mai tirziu din nou ru: файл временно заблокирован: пожалуйÑта попытайтеÑÑŒ Ñнова sk: súbor je uzamknutý, skúste znova. sl: ta datoteka je zaÄasno zaklenjena: prosimo poskusite znova. ÄŒe Å¡e vedno ne deluje, prosimo poÄakajte trenutek sv: filen är temporärt lÃ¥st: försök igen. Om det ändÃ¥ inte fungerar, vänta ett tag innan nästa försök the following children of %t and %t are born very close de: das Geburtsdatum der Kinder %t und %t liegt sehr nah beieinander en: Date of birth of the children of %t and %t are too close together es: las fechas de nacimiento de los siguientes hijos de %t y de %t son muy próximas fi: Henkilöiden %t ja %t lasten syntymäajat ovat liian lähellä toisiaan fr: les enfants suivants de %t et de %t sont nés très rapprochés it: le date di nascita dei seguenti figli di %t e di %t sono vicinissime nl: volgende kinderen van %t en van %t zijn zeer kort na elkaar geboren no: Fødselsdato til barnet til %t og %t er for nærme hverandre oc: aqueles enfants de %t e %t son nascuts plan trop apressats pt: os seguintes filhos de %t e de %t nasceram muito próximos sv: Följande barn till %t och %t är födda mycket tätt the following children of %t and %t are not in order af: die volgende kinders van %t and %t is nie in die regte volgorde nie bg: Ñледните деца на %t и %t не Ñа в хронологичен ред br: ar vugale-mañ, re %t ha %t n'int ket en urzh mat ca: els fills següents de %t i %t no estan en ordre cronològic cs: následující dÄ›ti rodiÄů %t a %t nejsou v chronologickém poÅ™adí da: de følgende børn af %t og %t er ikke i kronologisk orden de: die folgenden Kinder von %t und %t sind nicht geordnet en: the following children of %t and %t are not in chronological order eo: la sekvantaj infanoj de %t kaj %t ne estas orde es: los hijos siguientes de %t y %t no están presentados en orden et: %t ja %t lastest järgnevad ei ole vanuse järjekorras fi: %t ja %t lapsista seuraavat eivät ole ikäjärjestyksessä fr: les enfants suivants de %t et de %t ne sont pas dans l’ordre he: ×”×™×œ×“×™× ×©×œ %t ו-%t ×œ× ×‘×¡×“×¨ נכון is: þessi börn %t og %t eru ekki í röð it: i seguenti figli di %t and %t non sono in ordine d'età lv: %t un %t sekojoÅ¡ais bÄ“rns nav secÄ«bÄ nl: de kinderen van %t en %t staan niet in de goede volgorde no: følgende barn av %t og %t er ikke i kronologisk rekkefølge oc: los enfants %t e %t son pas dins l'òrdre cronologic pl: nastepujÄ…ce dzieci (rodzice: %t i %t) nie sÄ… uÅ‚ożone w porzÄ…dku chronologicznym pt: os seguintes filhos de %t e %t não estão apresentados em ordem ro: urmatori copii a lui %t si %t nu sint in ordine cronologica ru: Ñледующие дети %t и %t - идут не по порÑдку sk: nasledujúce deti rodiÄov %t a %t nie sú chronologicky sl: naslednji otroci od %t in %t niso po vrstnem redu sv: de följande barnen till %t och %t är inte i kronologiskordning the grandchildren af: die kleinkinders bg: внуците br: ar vugale vihan ca: els nets cs: vnouÄata da: børnebørnene de: die Enkelkinder en: the grandchildren eo: la genepoj es: los nietos et: lapselapsed fi: lapsenlapset fr: les petits enfants he: ×”× ×›×“×™× is: barnabörnin it: i nipoti lv: mazbÄ“rns nl: de kleinkinderen no: barnebarna oc: los felens pl: wnuki pt: os netos ro: nepoti ru: правнуки sk: vnúÄatá sl: vnuki sv: barnbarnen the grandparents af: die grootouers bg: дÑдовците и бабите br: an dud-kozh ca: els avis cs: prarodiÄe da: bedsteforældrene de: die Großeltern en: the grandparents eo: la geavoj es: los abuelos et: vanavanemad fi: isovanhemmat fr: les grands-parents he: ×”×¡×‘×™× is: afi og amma it: i nonni lv: vecvecÄki nl: de grootouders no: besteforeldrene oc: los grands pl: dziadkowie pt: os avós ro: bunici ru: прародитель sk: prarodiÄia sl: stari starÅ¡i sv: den 3:e generationen the great-grandchildren af: die agterkleinkinders bg: правнуците br: ar vugale guñv ca: els besnets cs: pravnouÄata da: oldebørnene de: die Urenkel en: the great-grandchildren eo: la gepranepoj es: los bisnietos et: lastelastelapsed fi: lastenlastenlapset fr: les arrière-petits-enfants he: ×”× ×™× ×™× is: barnabarnabörnin it: i pronipoti lv: mazmazbÄ“rni nl: de achterkleinkinderen no: oldebarna oc: los rèirefelens pl: prawnuki pt: os bisnetos ro: stranepoti ru: праправнук sk: pravnúÄatá sl: pravnuki sv: barnbarns barnen the great-grandparents af: die oorgrootouers bg: прадÑдовците и прабабите br: ar gerent-kuñv ca: els besavis cs: praprarodiÄe da: oldeforældrene de: die Urgroßeltern en: the great-grandparents eo: la gepraavoj es: los bisabuelos et: vanavanavanemad fi: isoisovanhemmat fr: les arrière-grands-parents he: ×”×•×¨×™× ×”×©×™×œ×©×™× is: langafi og langamma it: i bisnonni lv: vecvecvecÄki nl: de overgrootouders no: oldeforeldrene oc: los rèiregrands pl: pradziadkowie pt: os bisavós ro: strabunici ru: прапрародитель sk: praprarodiÄia sl: prastari starÅ¡i sv: den 4:e generationen the latest %d births af: die laaste %d geboortes bg: поÑледните %d Ñ€Ð°Ð¶Ð´Ð°Ð½Ð¸Ñ br: ar %d ganedigezh diwezhañ ca: els %d naixements més recents cs: posledních %d narození da: de seneste %d fødsler de: die letzten %d Geburten en: latest %d births eo: la lastaj %d naskiÄoj es: los %d últimos nacimientos et: viimased %d sündi fi: viimeiset %d syntymää fr: %d dernières naissances he: %d הלידות ×”×חרונות is: síðustu %d fæðingar it: le ultime %d nascite lv: pÄ“dÄ“jie %d dzimuÅ¡ie nl: de jongste %d geboorten no: de siste %d fødte oc: las %d darrièras naissenças pl: %d ostatnich narodzin pt: os %d nascimentos mais recentes ro: ultimile %d nascuti ru: %d поÑледних рождений sk: posledných %d narodení sl: zadnjih %d rojstev sv: de senaste %d födslarna the latest %d celebrated marriages bg: поÑледните %d чеÑтвувани Ñватби de: die %d letzten gefeierten Hochzeiten en: Last %d marriages (Date of marriage) es: los %d últimos matrimonios célebres fi: Viimeiset %d avioliittoa (vihkipäivämäärä) fr: les %d dernières unions célébrées it: i %d ultime unioni celebrate nl: de %d laatste uitgevoerde huwelijken no: Siste %d ekteskap (Ekteskapsdato) oc: las %d darrièras unions celebradas pt: as últimas %d uniões celebradas sv: Det senaste %d firade bröllopet the latest %d marriages af: die laaste %d huwelike bg: поÑледните %d брака br: ar %d euredoù diwezhañ ca: els %d matrimonis més recents cs: posledních %d svateb da: de seneste %d bryllupper de: die letzten %d Heiraten en: latest %d marriages eo: la lastaj %d edziÄoj es: los %d últimos casamientos et: viimased %d pulma fi: viimeiset %d avioliittoa fr: les %d derniers mariages he: %d הנישו××™× ×”××—×¨×•× ×™× is: síðast giftist %d it: gli ultimi %d matrimoni lv: pÄ“dÄ“jÄs %d laulÄ«bas nl: de %d jongste huwelijken no: de %d sist gifte oc: las %d darrièras unions pl: %d ostatnich Å›lubów pt: os %d casamentos mais recentes ro: ultimi %d insurati ru: поÑледние %d браков sk: posledných %d sobášov sl: zadnjih %d porok sv: de senaste %d äktenskapen the latest %d registered marriages bg: поÑледните %d региÑтрирани Ñватби de: die %d letzten eingetragenen Hochzeiten en: Last %d marriages (Date of entry) es: los %d últimos matrimonios registrados fi: Viimeiset %d rekisteröityä avioliittoa (syöttämispäivämäärä) fr: les %d dernières unions enregistrées it: le %d ultime unioni inserite nl: de %d laatste uitgevoerde huwelijken no: Siste %d ekteskap (Registreringsdato) oc: las %d darrièras unions enregistradas pt: as últimas %d uniões registadas sv: Det senast %d registreade äktenskapet the latest %t deaths af: die laaste %t afsterwes bg: поÑледните %t ÑƒÐ¼Ð¸Ñ€Ð°Ð½Ð¸Ñ br: ar %t tremenvan diwezhañ ca: les %t defunciones cs: posledních %t úmrtí da: de seneste %t dødsfald de: die letzten %t Ableben en: latest %t deaths eo: la lastaj %t mortoj es: las %t últimas defunciones et: viimased %t surma fi: viimeiset %t kuolemantapausta fr: les %t derniers décès he: %t ×”×ž×ª×™× ×”××—×¨×•× ×™× is: síðustu %t andlát it: le ultime %t morti lv: pÄ“dÄ“jie %t miruÅ¡ie nl: de %t recentste overledenen no: de siste %t døde oc: los %t darrièrs decèsses pl: %t ostatnich zgonów pt: os %t óbitos mais recentes ro: ultimi %t decedati ru: %t поÑледних Ñмертей sk: posledných %t úmrtí sl: zadnjih %t smrti sv: de senaste %t avlidna the modification impacted %d persons de: die Änderung ist erfolgt: %d Datei(en) wurden korrigiert en: %d entries have been successfully updated es: la modificación ha sido hecha: %d ficha/s corregida/s fi: %d tietuetta on onnistuneesti päivitetty fr: la modification a bien été effectuée : %d fiche(s) corrigée(s) it: la modifica è stata effettuata : %d scheda/e corretta/e nl: wijziging goed uitgevoerd : %d fiche(n) verbeterd no: %d registreringer er blitt oppdatert oc: la modification se faguèt: %s fichas modificadas pt: a alteração decorreu com sucesso: %d ficha(s) corrigida(s) sv: Modifiering av inklämda %d personer the parents af: die ouers bg: родителите br: ar gerent ca: els pares cs: rodiÄe da: forældrene de: die Eltern en: the parents eo: la gepatroj es: los padres et: vanemad fi: vanhemmat fr: les parents he: ×”×”×•×¨×™× is: foreldrar it: i genitori lv: vecÄki nl: de ouders no: foreldrene oc: los parents pl: rodzice pt: os pais ro: parinti ru: родители sk: rodiÄia sl: starÅ¡i sv: föräldrarna the spouse af: die eggenoot/die eggenote bg: Ñъпругът:a:--а/Ñъпругата br: ar pried/ar bried ca: el marit/la muller cs: manžel/manželka da: ægtefællen de: der:d:dem Ehemann/die:d:der Ehefrau en: the spouse eo: la edzo/la edzino es: el esposo/la esposa et: abikaasa fi: puoliso fr: l’époux/l’épouse he: בן הזוג/ בת הזוג is: maki it: lo sposo/la sposa lv: laulÄtais nl: echtgenoot/echtgenote no: ektefellen oc: lo marit/la molhèr pl: mąż/żona pt: o marido/a esposa ro: sotul/sotia ru: муж/жена sk: manžel/manželka sl: mož/žena sv: maken/makan the whole list af: die hele lys bg: целиÑÑ‚ ÑпиÑък br: ar roll en e bezh ca: tot el llistat cs: kompletní seznam da: hele listen de: die ganze Liste en: full list eo: la tuta tabelo es: toda la lista et: kogu nimekiri fi: koko lista fr: toute la liste he: כל הרשימה is: allan listann it: la lista intera lv: viss saraksts nl: de volledige lijst no: hele listen oc: tota la lista pl: peÅ‚na lista pt: toda a lista ro: toata lista ru: целый ÑпиÑок sk: celý zoznam sl: celoten seznam sv: hela listan this forum is moderated bg: този форум Ñе модерира ca: aquest fòrum té moderador cs: fórum je umírnìný da: dette forum er ændret de: dieses Forum wird moderiert en: this forum is moderated eo: tio-ĉi forumo estas moderata es: este foro está moderato et: see foorum on modereeritav fi: tämä foorumi on valvottu fr: ce forum est modéré he: ×”×¤×•×¨×•× ×”×™× ×• מונחה it: questo forum è moderato lv: Å¡is forums tiek kontrolÄ“ts nl: dit forum wordt gemodereerd no: dette forumet er endret oc: aquel fòrum es moderat pl: forum jest moderowane pt: este fórum é moderado ro: acest forum este moderat ru: Ñтот форум модерируетÑÑ sl: forum moderira sv: detta forum är ändrat title/titles af: titel/titels bg: титла/титли br: titl/titloù ca: títol/títols cs: titul/tituly da: titel/titler (nob.) de: Titel/Titel en: title/titles eo: nobeltitolo:a:+n/nobeltitoloj:a:+n es: título/títulos et: tiitel/tiitlid fi: arvonimi/arvonimet fr: titre/titres he: תו×ר/ ת××¨×™× is: titill/titlar it: titolo/titoli lv: tituls/tituli nl: titel/titels no: tittel/titler oc: títol/títols pl: tytuÅ‚/tytuÅ‚y pt: título/títulos ro: titlu/titluri ru: титул/титулы sk: titul/tituly sl: naziv/nazivi sv: titel/titlar to add a child to a family, use "%s" af: om 'n kind by te voeg by 'n familie, gebruik "%s" bg: за да добавите дете към ÑемейÑтво, използвайте "%s" br: evit ouzhpennañ ur bugel d'un tiegezh e ranker implij "%s" ca: per afegir un fill a una família, utilitzeu "%s" cs: pro pÅ™idání dítÄ›te do rodiny použij "%s" da: brug "%s" for at føje et barn til en familie de: um ein Kind zu einer Familie hinzuzufügen, benutze "%s" en: to add a child to a family, use "%s" eo: por aldoni infanon al familio, uzu "%s" es: para agregar un hijo a una familia, utiliza "%s" et: lapse lisamiseks perre kasuta "%st" fi: lisätäksesi perheeseen lapsen käytä "%s" fr: pour ajouter un enfant à une famille, utiliser « %s » he: להוסיף ילד למשפחה, השתמש ב-"%s" is: til að bæta barni við fjölskyldu, notaðu "%s" it: per aggiungere un figlio ad una famiglia, scegliere "%s" lv: lai pievienotu bÄ“rnu Ä£imenei, lietojiet "%s" nl: gebruik "%s" om een kind aan een gezin toe te voegen no: for Ã¥ knytte et barn til en familie, bruk "%s" oc: per apondre un enfant a una familha, utilizatz "%s" pl: aby dodać dziecko do pary rodziców użyj "%s" pt: para acrescentar um filho a uma família utilizar "%s" ro: pentru a adauga un copil utilizeaza "%s" ru: чтобы добавить ребенка к Ñемье, иÑпользуй "%s" sk: pre pridanie dieÅ¥aÅ¥a do rodiny použi "%s" sl: da bi dodal otroka k družini, uporabite "%s" sv: för att lägga till ett barn i en familj, använd "%s" to change de: zum wechseln en: Edit es: para cambiar et: muutmiseks fi: muuttaaksesi fr: pour changer it: per modificare nl: om te wijzigen no: Editer oc: per cambiar pt: para modificar sv: för att ändra to come de: in Erwartung en: to come es: pronto fi: tulevat tapahtumat fr: à venir it: da venire nl: te komen no: kommende hendelser oc: a venir pt: brevemente sv: kommande händelser to the %s generation af: tot die %s geslag bg: до %s поколение br: betek ar %s rummad-tud ca: fins a la %s generació cs: až do %s generace da: til den %s generation de: bis zur %s Generation en: up to the %s generation eo: Äis la %s generacio es: hasta la %s generación et: %s sugupõlveni fi: %s sukupolveen fr: jusqu'à la %s génération he: לדור ×”%s is: til %s kynslóðar it: fino alla %s generazione lv: lÄ«dz %s. paaudzei nl: tot de %s generatie no: til %s generasjon oc: entrò la %s generacion pl: do %s pokolenia pt: até à %s geração ro: pina la generatia %s ru: до %s Ð¿Ð¾ÐºÐ¾Ð»ÐµÐ½Ð¸Ñ sk: do %s generácie sl: do %s generacije sv: till den %s generationen to the children af: tot die kinders bg: до децата br: betek ar vugale ca: fins els fills cs: k dÄ›tem da: til børnene de: bis zu den Kindern en: up to the children eo: Äis la idoj es: hasta los hijos et: lasteni fi: lapsiin fr: jusqu’aux enfants he: עד ×”×™×œ×“×™× is: til barnsins it: fino ai figli lv: lÄ«dz bÄ“rnam nl: tot de kinderen no: til barna oc: entrò los enfants pl: tylko dzieci pt: até aos filhos ro: pina la copii ru: до детей sk: k deÅ¥om sl: do otrok sv: till barnen to the grandchildren af: tot die kleinkinders bg: до внуците br: betek ar vugale vihan ca: fins els nets cs: k vnouÄatům da: til børnebørnene de: bis zu den Enkeln en: up to the grandchildren eo: Äis la genepoj es: hasta los nietos et: lastelasteni fi: lapsenlapsiin fr: jusqu’aux petits-enfants he: עד ×”× ×›×“×™× is: til barnabarna it: fino ai nipoti lv: lÄ«dz mazbÄ“rnam nl: tot de kleinkinderen no: til barnebarna oc: entrò los felens pl: dzieci i wnuki pt: até aos netos ro: pina la nepoti ru: до внуков sk: k vnúÄatám sl: do vnukov sv: till barnbarnen to the grandparents af: tot die grootouers bg: до дÑдовците и бабите br: betek an dud-kozh ca: fins els avis cs: k prarodiÄům da: til bedsteforældrene de: bis zu den Großeltern en: up to the grandparents eo: Äis la geavoj es: hasta los abuelos et: vanavanemateni fi: isovanhempiin fr: jusqu’aux grands-parents he: עד ×”×¡×‘×™× is: til afa og ömmu it: fino ai nonni lv: lÄ«dz vecvecÄkiem nl: tot de grootouders no: til besteforeldrene oc: entrò los grands pl: rodzice i dziadkowie pt: até aos avós ro: pina la bunici ru: до прадедов sk: k prarodiÄom sl: do starih starÅ¡ev sv: till den 3:e generationen to the great-grandchildren af: tot die agterkleinkinders bg: до правнуците br: betek ar vugale guñv ca: fins els besnets cs: k pravnouÄatům da: til oldebørnene de: bis zu den Urenkeln en: up to the great-grandchildren eo: Äis la gepranepoj es: hasta los bisnietos et: lastelastelasteni fi: lapsenlapsenlapsiin fr: jusqu’aux arrière-petits-enfants he: עד ×”× ×™× ×™× is: til barnabarnabarna it: fino ai pronipoti lv: lÄ«dz mazmazbÄ“rniem nl: tot de achterkleinkinderen no: til oldebarna oc: entrò los rèire-felens pl: do prawnuków pt: até aos bisnetos ro: pina la stranepoti ru: до праправнуков sk: k pravnúÄatám sl: do pravnukov sv: till barnbarns barnen to the great-grandparents af: tot die oorgrootouers bg: до прадÑдовците и прабабите br: betek ar an dud-kuñv ca: fins els besavis cs: k praprarodiÄům da: til oldeforældrene de: bis zu den Urgroßeltern en: up to the great-grandparents eo: Äis la gepraavoj es: hasta los bisabuelos et: vanavanavanemateni fi: isoisovanhempiin fr: jusqu’aux arrière-grands-parents he: עד ×”×”×•×¨×™× ×”×©×™×œ×©×™× is: til langlangafa og ömmu it: fino ai bisnonni lv: lÄ«dz vecvecvecÄkiem nl: tot de overgrootouders no: til oldeforeldrene oc: entrò los rèiregrands pl: do pradziadków pt: até aos bisavós ro: pina la strabunici ru: до прапрародителей sk: k praprarodiÄom sl: do prastarih starÅ¡ev sv: till den 4:e generationen to the parents af: tot die ouers bg: до родителите br: betek ar gerent ca: fins els pares cs: k rodiÄům da: til forældrene de: bis zu den Eltern en: up to the parents eo: Äis la gepatroj es: hasta los padres et: vanemateni fi: vanhempiin fr: jusqu’aux parents he: עד ×”×”×•×¨×™× is: til foreldra it: fino ai genitori lv: lÄ«dz vecÄkiem nl: tot de ouders no: til foreldrene oc: entrò los parents pl: tylko rodzice pt: até aos pais ro: pina la parinti ru: до родителей sk: k rodiÄom sl: do starÅ¡ev sv: till föräldrarna today af: vandag bg: Ð´Ð½ÐµÑ br: hiziv an deiz ca: avui cs: dnes da: i dag de: heute en: today eo: hodiaù es: hoy et: täna fi: tänään fr: aujourd’hui he: ×”×™×•× is: í dag it: oggi lv: Å¡odien nl: vandaag no: i dag oc: uèi pl: dzisiaj pt: hoje ro: astazi ru: ÑÐµÐ³Ð¾Ð´Ð½Ñ sk: dnes sl: danes sv: i dag tomorrow af: môre bg: утре br: warc'hoazh ca: demà cs: zítra da: i morgen de: morgen en: tomorrow eo: morgaù es: mañana et: homme fi: huomenna fr: demain he: מחר is: á morgun it: domani lv: rÄ«t nl: morgen no: i morgen oc: deman pl: jutro pt: amanhã ro: maine ru: завтра sk: zajtra sl: jutri sv: i morgon tools de: hilfsmittel en: tools es: herramientas fi: työkalut fr: outils it: utilitari nl: nuttige zaken no: verktøy oc: aisinas pt: ferramentas sv: verktyg total af: totaal bg: общо br: en holl ca: total cs: celkem da: totalt de: Summe en: total eo: tuto es: total et: kokku fi: yhteensä fr: total he: סה'×› is: alls it: totale lv: kopÄ nl: totaal no: totalt oc: total pl: łącznie pt: total ro: in total ru: вÑего sk: spolu sl: skupaj sv: totalt town de: Gemeinde en: Town es: Lugar fi: Pitäjä fr: Commune it: Comune nl: Gemeente no: Sogn oc: Comuna pt: Localidade sv: Socken tree af: boom bg: вертикално дърво br: gwezenn ca: arbre cs: strom da: træ de: Baum en: tree eo: arbo es: árbol et: puu fi: puu fr: arbre he: ××¥ is: tré it: albero lv: koks nl: boom no: tre oc: arbre pl: drzewo pt: árvore ro: arbore ru: дерево sk: strom sl: drevo sv: träd trees & lists de: Bäume & Listen en: Charts & Lists es: Ãrboles & listas fi: Kaaviot & Listat fr: Arbres & Listes it: Alberi & Elenchi nl: Grafieken en lijsten no: Tavler & Lister oc: Arbres e Listas pt: Tabelas & Listas sv: Diagram & Listor try again bg: опитайте отново da: prøv igen de: Nocheinmal versuchen en: retry es: volver a intentar et: proovi uuesti fi: yritä uudestaan fr: réessayer it: riprovare nl: terug proberen no: prøv igjen oc: tornar ensajar pt: tente novamente sk: skús znovu sv: försöka igen try another/relationship computing de: Klicken Sie hier / um eine andere Berechnungsmethode zu versuchen en: try another computing option es: Pulse aquí/para intentar un modo de cálculo diferente fi: Napsauta tästä kokeillaksesi toista laskentavaihtoehtoa fr: Cliquez ici/pour essayer un mode de calcul différent it: Clicca qui/per provare un altro modo di calcolo nl: Hier klikken om een andere berekeningswijze te proberen no: forsøk en annen kalkuleringsmulighet oc: Clicatz aicí/per ensajar un autre mòde de calcul pt: Clique aqui/para tentar um modo de cálculo diferente sv: Försök ett annat programmeringssätt uncles and aunts af: ooms en tantes bg: вуйчовци, чичовци и лели br: eontred ha moerebed ca: oncles i ties cs: strýcové a tety da: onkler og tanter de: Onkel und Tanten en: uncles and aunts eo: onkloj kaj onklinoj es: tíos y tías et: onud ja tädid fi: sedät, enot ja tädit fr: oncles et tantes he: ×“×•×“×™× is: föður(móður)systur og föður(móður)bræður it: zii e zie lv: onkuļi un tantes nl: ooms en tantes no: onkler og tanter oc: oncles e tantas pl: stryjowie lub wujowie oraz ciotki pt: tios e tias ro: unchi/matuse ru: дÑди и тети sk: strýkovia a tety sl: strici in tete sv: farbröder-morbröder och fastrar-mostrar undefined sex for %t af: geslag onbekend vir %t bg: не е определен полът на %t br: ar reizh n'eo ket termenet evit %t ca: no s'ha definit el sexe de %t cs: neznámé pohlaví pro %t da: udefineret køn for %t de: Geschlecht nicht definiert für %t en: undefined sex for %t eo: sekso nedifinita por %t es: sexo no definido por %t et: %t sugu on määratlemata fi: henkilön %t sukupuoli tuntematon fr: sexe indéfini pour %t he: המין של %t ×œ× ×ž×•×’×“×¨ is: kyn ekki skilgreint fyrir %t it: sesso indefinito per %t lv: nenoskaidrots dzimums personai %t nl: onbepaald geslacht voor %t no: udefinert kjønn for %t oc: sèxe pas definit per %t pl: %t ma nieokreÅ›lonÄ… pÅ‚eć pt: sexo indefinido para %t ro: gen nedefinit pentru %t ru: неизвеÑтный пол у %t sk: nedefinované pohlavie pre %t sl: %t nima doloÄenega spola sv: odefinierat kön för %t unknown person af: onbekende persoon bg: неизвеÑтно лице br: den dianav ca: persona desconeguda cs: neznámá osoba da: ukendt person de: unbekannte Person en: unknown person eo: nekonata persono es: persona desconocida et: tundmatu isik fi: tuntematon henkilö fr: personne inconnue he: ××“× ×œ× ×™×“×•×¢ is: óþekktur einstaklingur it: persona sconosciuta lv: nezinÄma persona nl: onbekend persoon no: ukjent person oc: persona desconeguda pl: osoba nieznana pt: pessoa desconhecida ro: persoana necunoscuta ru: неизвеÑтный человек sk: neznáma osoba sl: neznana oseba sv: okänd person unspecified af: nie gemeld nie bg: неуточнено br: n'eo ket resisaet ca: no especificat cs: nespecifikováno da: uspecificeret de: nicht präzisiert en: unspecified eo: ne specifita es: no especificado et: täpsustamata fi: määrittelemätön fr: non précisé he: ×œ× ×ž×¤×•×¨×˜ is: ótilgreint it: non specificato lv: nenoteikts nl: niet gespecificeerd no: uspesifisert oc: pas especificat pl: nieokreÅ›lone pt: não especificado ro: nespecificata ru: неопределенный sk: neurÄené sl: nedoloÄeno sv: ospecificerad up to af: tot by bg: до br: betek ca: fins a cs: až po :a: da: op til de: bis en: up to eo: Äis es: hasta et: kuni fi: saakka fr: jusqu’à he: עד is: upp að it: fino a lv: lÄ«dz nl: tot aan no: opp til oc: entrò pl: do pt: até ro: pina la ru: вплоть до sk: až po :a: sl: do sv: upp till update af: bywerk bg: промÑна br: hizivadur ca: actualització cs: upravit da: opdater de: Aktualisieren en: update eo: Äisdatigo es: revisión et: täienda fi: päivitä fr: mise à jour he: עדכן is: uppfæra it: aggiornamento lv: informÄcijas papildinÄÅ¡ana nl: actualiseer no: oppdater oc: mesa a jorn pl: aktualizacja pt: actualizar pt-br: atualizar ro: actualizare ru: изменить sk: upraviÅ¥ sl: spremeni sv: uppdatera zh: æ›´æ–° update family de: Lebensgemeinschaften verwalten en: Edit Family es: administrar las uniones fi: Muokata perhe fr: gérer les unions it: gestire le unioni nl: huwelijken beheren no: Redigere familie oc: gerir las unions pt: atualizar família sv: Redigera familje use "link" instead of "create" af: gebruik "koppel" eerder as "skep" bg: използвайте "да Ñе Ñвърже" вмеÑто "да Ñе Ñъздаде" br: implijit "liammañ" kentoc'h eget "sevel" ca: utilitzeu "reunir" en lloc de "crear" cs: použij "svázat" namísto "vytvoÅ™it" da: anvend "forbind" i stedet for "opret" de: benutze "verbinden" an Stelle von "erzeugen" en: use "link" instead of "create" eo: uzu "bindi" anstataù ol "krei" es: utilise "reunir" en lugar de "crear" et: vali "loo" asemel "viita" fi: käytä toimintoa "linkitä" toiminnon "luo" sijaan fr: utilisez « relier » au lieu de « créer » he: להשתמש ב-"קשר" ×‘×ž×§×•× "עשה" is: notaðu "tengja" í stað "búa til" it: usare "link" invece di "create" lv: "izveidot" vietÄ lietojiet "saite" nl: gebruik "connectie" inplaats van "creëren" no: bruk "koble" istedet for "opprett" oc: utilizatz "religar" al lòc de "crear" pl: użyj "link" zamiast "utwórz" pt: use "ligar" em lugar de "criar" ro: utilizeaza "reuneste" in loc de "creaza" ru: иÑпользуйте "ÑвÑзать" вмеÑто "Ñоздать" sk: použi "spojenie" namiesto "vytvorenia" sl: uporabite "povezava" namesto "ustvari" sv: använd "länk" istället för "skapa" user/password/cancel bg: ползвател/парола/отказване br: implijer/tremenger/nulañ da: bruger/adgangskode/annuller de: Benutzer/Passwort/Abbruch en: user/password/cancel es: usuario/contraseña/cancelar et: kasutaja/parool/tühista fi: käyttajä/salasana/peruuta fr: utilisateur/mot de passe/annuler he: משתמש / סיסמה / ביטול it: utilizzatore/password/annullare lv: lietotÄjs/parole/atcelt nl: gebruiker/wachtwoord/annuleren no: bruker/passord/avbryt oc: utilizaire/mot de Sta Clara/anullar pl: użytkownik/hasÅ‚o/anuluj pt: utilizador/palavra passe/anular ro: utilizator/parola/anulare sl: uporabnik/geslo/prekliÄi sv: användare/passord/avbryt validate/delete bg: да Ñе потвърди/да Ñе изтрие ca: validar/eliminar cs: ovìøit/výmaz da: valider/slet de: Bestätigen/Verwerfen en: submit/delete es: validar/borrar et: kinnita/kustuta fi: tarkista/hylkää fr: valider/supprimer it: conferma/elimina nl: valideer/verwijder no: verifiser/slett oc: validar/escafar pl: sprawdź/usuÅ„ pt: validar/eliminar ro: valideaza/sterge ru: проверить/удалить sk: potvrdiÅ¥/zmazaÅ¥ sv: giltligt/tas bort version de: Version en: Version es: versión fr: version it: versione nl: versie oc: version view source de: siehe Quelle en: view source es: ver fuente et: vaata lähteteksti fi: katso lähde fr: voir source it: vedere fonte nl: zie bron no: se kilde oc: veire la font sk: pozri zdroj sv: se källa visualize/show/hide/summary bg: да Ñе визуализира/да Ñе покаже/да Ñе Ñкрие/резюме ca: visualtza/mostra/sumari cs: zviditelnit/ukázat/souhrnný da: visualiser/vis/gem/opsummere de: veranschaulichen/einblenden/ausblenden/Zusammenfassung en: view/display/hide/summary es: visualizar/mostrar/ocultar/resumen et: kuva/näita/peida/kokkuvõte fi: kuvaa/näytä/piilota/yhteenveto fr: visualiser/afficher/masquer/sommaire it: visualizza/mostra/nascondi/riassunto nl: visualiseren/tonen/verbergen/samenvatting no: visualiser/vis/skjul/summarisk oc: visualiza/aficha/escond/somari pl: wyÅ›wietl/pokaż/ukryj/podsumowanie pt: visualizar/mostrar/esconder/sumário ro: vizualizeaza/arata/ascunde/sumar ru: поÑтроить/показать/Ñкрыть/Ð¾Ð±Ñ‰Ð°Ñ sk: vizualizovaÅ¥/ukázaÅ¥/schovaÅ¥/sumarizovaÅ¥ sv: visualisera/visa/göm/summering vital record de: Individuum en: Individual es: Individuo fi: Henkilö fr: fiche it: Persona nl: Persoon no: Individ oc: Persona pt: Pessoa sv: Individ warnings af: waarskuwings bg: Ð¿Ñ€ÐµÐ´ÑƒÐ¿Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ñ br: evezhiadennoù ca: advertències cs: varování da: advarsler de: Warnungen en: warnings eo: avertoj es: advertencias et: hoiatused fi: varoituksia fr: remarques he: ×זהרות is: athugið it: avvertenze lv: brÄ«dinÄjumi nl: waarschuwingen no: advarsler oc: avertiments pl: uwaga! pt: avisos ro: avertisment ru: внимание sk: varovanie sl: opozorila sv: varningar where born de: Geburtsort en: where born es: lugar de nacimiento fi: syntymäpaikka fr: lieu de naissance it: luogo di nascita nl: geboorteplaats no: fødested oc: lòc de naissença pt: local de nascimento sv: födelseort where dead de: Sterbeort en: where dead es: lugar de defunción fi: kuolinpaikka fr: lieu de décès it: luogo della morte nl: plaats overlijden no: dødssted oc: lòc de decès pt: local do óbito sv: dödsort where married de: Ort der Trauung en: Where married es: lugar de matrimonio fi: vihkipaikka fr: lieu de l'union it: luogo dell'unione nl: huwelijksplaats no: sted for vigsel oc: lòc de l'union pt: local da união sv: vigselort with af: met bg: Ñ br: gant ca: amb cs: s :i: da: med de: mit en: with eo: kun es: con et: koos :k: fi: sekä fr: avec he: ×¢× is: með it: con lv: ar nl: met no: med oc: amb pl: z: pt: com ro: cu ru: Ñ sk: s :i: sl: z sv: med witness at marriage of %s and %s af: getuie by die troue van %s met %s bg: Ñвидетел при брака на %s и %s br: test e eured %s gant %s ca: testimoni en el matrimoni de %s i %s cs: svÄ›dek na svatbÄ›: %s a %s da: vidne ved brylluppet mellem %s og %s de: Trauzeugen bei der Hochzeit von %s und %s en: witness at marriage of %s and %s eo: atestant(in)o pri la edziÄo de %s kaj %s es: testigo en el casamiento de %s y %s et: %s ja %s abielu tunnistaja fi: %s ja %s avioliiton todistaja fr: témoin au mariage de %s et de %s he: ××“×™× ×‘×—×ª×•× ×” של %s ו-%s is: vitni að giftingu %s og %s it: testimone al matrimonio di %s e %s lv: liecinieks %s un %s laulÄ«bÄs nl: getuige bij het huwelijk van %s en %s no: forlover ved ekteskap mellom %s og %s oc: testimòni al maridatge de %s e %s pl: Å›wiadek małżeÅ„stwa pomiÄ™dzy osobami: %s i %s pt: testemunha do casamento de %s e %s ro: martor la mariajul lui %s cu %s ru: Ñвидетель в браке %s и %s sk: svedok na svadbe %s a %s sl: priÄa pri poroki med %s in %s sv: vittne vid äktenskap mellan %s och %s witness/witnesses af: getuie/getuies bg: Ñвидетел/Ñвидетели br: test/testoù ca: testimoni/testimonis cs: svÄ›dek/svÄ›dkové da: vidne/vidner de: Trauzeuge/Trauzeugen en: witness/witnesses eo: atestanto:a:+n/atestantoj es: testigo/testigos et: tunnistaja/tunnistajad fi: todistaja/todistajat fr: témoin/témoins he: ×ד/ ××“×™× is: vitni/vitni it: testimone/testimoni lv: liecinieks:a:-u/liecinieki nl: getuige/getuigen no: forlover/forlovere oc: testimòni/testimònis pl: Å›wiadek:a:--ka/Å›wiadkowie pt: testemunha/testemunhas ro: martor/martori ru: Ñвидетель:g:-Ñ:a:-Ñ/Ñвидетели sk: svedok:g:--ka/svedkovia sl: priÄa/priÄe sv: vittne/vittnen wizard/wizards/friend/friends/exterior af: Medewerkers/Medewerkers/vriend/vriend/exterior bg: админиÑтратор/админиÑтратори/приÑтел/приÑтели/външен потребител br: strobineller/strobinellerien/mignon/mignon/exterior ca: administrador/administrador/amic/amic/exterior cs: wizard/wizards/friend/friends/exterior da: bidragyder/bidragydere/betroet/betroet/exterior de: Meister/Meisters/Freund/Freunde/exterior en: wizard/wizards/friend/friends/exterior eo: sorĉisto/sorĉistoj/amiko/amikoj/exterior es: mago/magos/amigo/amigos/exterior et: teadmamees/teadmamehed/sõber/sõbrad/tavakasutaja fi: velho/velho/valittu/valittu/exterior fr: magicien/magiciens/ami/amis/extérieur he: ×›×’×ון / ×›×’×ון / מיוחסת / מיוחסת /exterior is: uppfæra/uppfæra/vinur/vinur/exterior it: wizard/wizard/amico/amico/exterior lv: wizard/wizard/friend/friends/exterior nl: beheerder/beheerder/gast/gast/exterior no: administrator/administratorer/venn/venner/eksteriør oc: fachilhièr/fachilhièr/amic/amic/exterior pl: wizard/wizard/friend/friends/exterior pt: feiticeiro/feiticeiros/amigo/amigos/exterior ro: magician/magician/amic/amic/exterior ru: wizard/wizard/друг/друг/exterior sk: wizard/wizards/friend/friends/exterior sl: Äarovnik/Äarovnik/prijatelj/prijatelj/exterior sv: administratör/administratörer/vän/vän/exterior would be his/her own ancestor af: sal sy/haar eie voorganger wees bg: ще Ñе окаже един от ÑобÑтвените Ñи предци br: a vefe e/he hendad ca: seria el seu propi avantpassat cs: byl by svůj vlastní pÅ™edek da: skal være sin egen forfader de: würde sein/ihr eigener Vorfahre sein en: would be his/her own ancestor eo: estus sia propra prapatro es: sería su propio ancestro et: oleks iseenda esivanem fi: olisi oma esivanhempansa fr: serait son propre ancêtre he: ×”×™×” ×ב-קדמון לעצמו/לעצמה is: myndi verða sinn eigin forfaðir it: sarebbe antenato(a) di se stesso(a) lv: varÄ“tu bÅ«t viņa/viņas priekÅ¡tecis nl: zou zijn/haar eigen voorouder zijn no: ville være sin egen ane oc: seriá son/sa quite(a) aujòl(a) pl: byÅ‚by/byÅ‚aby swoim wÅ‚asnym przodkiem pt: seria seu própio antepassado ro: ar fi propriul stramos ru: было бы его/ее ÑобÑтвенным предком sk: bol/bola by svoj vlastný predok sl: bi bil svoj lasten prednik sv: skulle vara sin egen ana Y/N af: J/N bg: Д/Ð br: Ya/N'eo ket ca: S/N cs: A/N da: J/N de: J/N en: Y/N eo: J/N es: S/N et: J/E fi: K/E fr: O/N he: ×§/ל is: J/N it: S/N lv: J/N nl: J/N no: J/N oc: O/N pt: S/N ro: da/nu ru: Д/Ð sk: áno/nie sl: da/ne sv: J/N year/month/day af: jaar/maand/dag ar: سنة/شهر/يوم bg: година/меÑец/ден br: bloaz/miz/deiz ca: any/mes/dia cs: rok/mÄ›síc/den da: Ã¥r/mÃ¥ned/dag de: Jahr/Monat/Tag en: year/month/day eo: jaro/monato/tago es: año/mes/día et: aasta/kuu/päev fi: vuosi/kuukausi/päivä fr: année/mois/jour/an he: שנה/ חודש/ ×™×•× is: ár/mánuður/dagur it: anno/mese/giorno lv: gads/mÄ“nesis/diena nl: jaar/maand/dag no: Ã¥r/mÃ¥ned/dag oc: an/mes/jorn pl: rok/miesiÄ…c/dzieÅ„ pt: ano/mês/dia ro: anul/luna/ziua ru: год/меÑÑц/день sk: rok/mesiac/deň sl: leto/mesec/dan sv: Ã¥r/mÃ¥nad/dag years old af: jaar. ar: سنة bg: години br: bloaz ca: anys cs: let da: Ã¥r de: Jahre alt en: years old eo: jaroj es: años et: aastat fi: vuotta vanha fr: ans he: ×©× ×™× is: ára it: anni lv: gadi nl: jaar oud no: Ã¥r oc: ans pl: lat pt: anos ro: ani ru: лет sk: rokov sl: let sv: Ã¥r zh: å² you are visible/you are not visible de: sie sind sichtbar/sie sind unsichtbar en: you are visible/you are invisible es: es visible/no es visible et: sa oled nähtav/sa ei ole nähtav fi: olet näkyvissä/olet nakymaton fr: vous êtes visible/vous n’êtes pas visible it: sei visibile/sei invisibile nl: u bent zichtbaar / u bent niet zichbaar no: du er synlig/du er usynlig oc: sètz vesedor(a)/sètz pas vesedor(a) pt: você é visível/você não é visível ro: tu esti vizibil/tu nu esti vizibil sv: du är synlig/du är ej synlig you must first merge af: jy moet eers saamvoeg bg: първо трÑбва да обедините br: kendeuziñ a rankit da gentañ-penn ca: abans heu de fusionar cs: nejdřív musíte spojovat da: du skal først sammenlægge de: bitte erst zusammenführen en: you must first merge eo: vi devas unue kunigi es: antes Ud. debe fusionar et: kõigepealt pead ühendama fi: yhdistä ensin fr: vous devez d’abord fusionner he: צריך ל×חד ×§×•×“× is: þú þarft fyrst að sameina it: dovete in primo luogo fondere lv: Jums vispirms ir jÄapvieno nl: eerst samenvoegen no: du mÃ¥ først slÃ¥ sammen oc: devètz primièr fusionar pl: musisz najpierw dokonać scalenia pt: tem que fundir primeiro ro: trebuia intai sa unesti ru: вы должны Ñначала объединить sk: najprv musíš spojiÅ¥ sl: naprej morate združiti sv: du mÃ¥ste först slÃ¥ samman you must first merge the 2 families af: jy moet eers die twee families saamvoeg bg: първо трÑбва да обедините двете ÑемейÑтва br: kendeuziñ an daou diegezh a rankit da gentañ-penn ca: abans heu de fusionar les dues famílies cs: nejdřív musíte spojit tyto dvÄ› rodiny da: du skal først sammenlægge de 2 familier de: bitte erst beide Familien zusammenführen en: you must first merge the 2 families eo: vi devas unue kunigi la 2 familiojn es: debe primero fusionar las 2 familias et: kõigepealt peab ühendama mõlemad pered fi: yhdistä ensin molemmat perheet fr: vous devez d’abord fusionner les 2 familles he: צריך ל×חד ×§×•×“× ×ת 2 המשפחות is: þú verður fyrst að sameina þessar 2 fjölskyldur it: dovete in primo luogo fondere le 2 famiglie lv: Jums vispirms ir jÄpvieno 2 Ä£imenes nl: eerst de twee gezinnen samenvoegen no: du mÃ¥ først slÃ¥ sammen de 2 familiene oc: devètz primièr fusionar las 2 familhas pl: musisz najpierw scalić 2 rodziny pt: primeiro tem que fundir as 2 famílias ro: trebuie intai sa unesti cele doua familii ru: вы должны Ñначала объединить 2 Ñемьи sk: najprv musíš spojiÅ¥ tieto dbe rodiny sl: najprej morate združiti obe družini sv: du mÃ¥ste först slÃ¥ samman de 2 familjerna your message is waiting for validation bg: Ñъобщението Ви очаква потвърждение ca: el vostre missatge està pendent de validació cs: tvojá zpráva je èekající na potvrzení da: din meddelelse venter pÃ¥ validering de: deine Nachricht wartet auf ihre Überprüfung en: your message is waiting for validation es: tu mensaje espera su validación et: teade ootab kinnitamist fi: viestisi odottaa tarkistusta fr: votre message est en attente de validation it: il vostro messaggio è in attesa di convalida nl: uw bericht wacht op validatie no: Beskjeden din venter pÃ¥ validering oc: vòstre messatge es en espèra de validacion pl: twoja wiadomość czeka na potwierdzenie pt: a sua mensagem aguarda validação ro: mesajul dvs. asteapta sa fie validat ru: ваше Ñообщение ожидает проверки sk: tvoja správa Äaká na potvrdenie sv: ditt meddelande väntar pÃ¥ giltighet geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/lang/lexicon.txt0000660000175200017530000100512612664543647024144 0ustar guillaumeguillaume# $Id: lexicon.txt,v 5.7 2007-01-19 01:53:16 ddr Exp $ # Copyright (c) 1998-2007 INRIA # This file is kept by compatibility to allow displaying databases # created before version 5.00. !charset af: iso-8859-1 bg: windows-1251 br: iso-8859-1 ca: iso-8859-1 cs: iso-8859-2 da: iso-8859-1 de: iso-8859-1 en: iso-8859-1 eo: iso-8859-1 es: iso-8859-1 et: iso-8859-15 fi: iso-8859-1 fr: iso-8859-1 he: iso-8859-8-i is: iso-8859-1 it: iso-8859-1 lv: iso-8859-1 nl: iso-8859-1 no: iso-8859-1 pl: iso-8859-2 pt: iso-8859-1 ro: iso-8859-2 ru: windows-1251 sl: iso-8859-2 sv: iso-8859-1 zh: gb2312 !dates order af: yymmdd bg: ddmmyy br: ddmmyy ca: ddmmyy cs: yymmdd da: ddmmyy de: ddmmyy en: yymmdd eo: ddmmyy es: ddmmyy et: ddmmyy fi: ddmmyy fr: ddmmyy he: ddmmyy is: ddmmyy it: ddmmyy lv: ddmmyy nl: ddmmyy no: ddmmyy pl: ddmmyy pt: ddmmyy ro: ddmmyy ru: ddmmyy sl: ddmmyy sv: ddmmyy !dir he: rtl !languages af: af=Afrikaans/ca=Catalan/cs=Czeck/da=Deens/de=Duits/en=Engels/eo=Esperanto/es=Spaans/fi=Fins/fr=Frans/he=Hibreeus/is=Yslandies/it=Italiaans/nl=Nederlands/no=Noorweegs/pl=Pools/pt=Portugees/pt-br=Portugees-in-Brazilië/ru=Russies/sv=Sweeds/zh=Chinees bg: af=áóðñêè/bg=áúëãàðñêè/br=áðåòîíñêè/ca=êàòàëîíñêè/cs=÷åøêè/da=äàòñêè/de=íåìñêè/en=àíãëèéñêè/eo=åñïåðàíòî/es=èñïàíñêè/et=åñòîíñêè/fi=ôèíëàíäñêè/fr=ôðåíñêè/he=èâðèò/is=èñëàíäñêè/it=èòàëèàíñêè/lv=ëàòâèéñêè/nl=õîëàíäñêè/no=íîðâåæêè/pl=ïîëñêè/pt=ïîðòóãàëñêè/pt-br=áðàçèëñêî-ïîðòóãàëñêè/ro=ðóìúíñêè/ru=ðóñêè/sl=ñëîâåíñêè/sv=øâåäñêè/zh=êèòàéñêè br: af=afrikaaneg/bg=bulgareg/br=brezhoneg/ca=katalaneg/cs=tchekeg/da=daneg/de=alamaneg/en=saozneg/eo=esperanteg/es=spagnoleg/et=estonieg/fi=finneg/fr=galleg/he=hebreeg/is=islandeg/it=italianeg/lv=letoneg/nl=izelvroeg/no=norvegieg/pl=poloneg/pt=portugaleg/pt-br=portugaleg bro-Vrazil/ro=roumaneg/ru=rusianeg/sl=sloveneg/sv=svedeg/zh=sinaeg ca: af=africà/ca=català/cs=xec/da=danès/de=alemany/en=anglès/eo=esperanto/es=castellà/et=estó/fi=finlandès/fr=francès/he=hebreu/is=islandès/it=italià/lv=letó/nl=holandès/no=norueg/pl=polac/pt=portuguès/pt-br=brasiler/ru=rus/sl=eslovè/sv=suec/zh=Xinès cs: af=afrikán¹tina/bg=bulhar¹tina/cs=èe¹tina/da=dán¹tina/de=nìmèina/en=angliètina/eo=esperanto/es=¹panìl¹tina/fi=fin¹tina/fr=francouz¹tina/he=hebrej¹tina/is=island¹tina/it=ital¹tina/lv=loty¹¹tina/nl=holand¹tina/no=nor¹tina/pt=portugal¹tina/pt-br=brasil¹tina/ru=ru¹tina/sv=¹véd¹tina/zh=èín¹tina da: af=afrikaans/bg=bulgarsk/br=bretonsk/ca=katalansk/cs=tjekkisk/da=dansk/de=tysk/en=engelsk/eo=esperanto/es=spansk/et=estisk/fi=finsk/fr=fransk/he=hebraisk/is=islandsk/it=italiensk/lv=lettisk/nl=hollandsk/no=norsk/pl=polsk/pt=portugisisk/pt-br=brasiliansk-portugisisk/ro=rumænsk/ru=russisk/sl=slovensk/sv=svensk/zh=kinesisk de: af=Afrikaans/bg=Bulgarish/br=Bretonisch/ca=Katalanisch/cs=Tschechisch/da=Dänisch/de=Deutsch/en=Englisch/eo=Esperanto/es=Spanisch/et=Estnisch/fi=Finnisch/fr=Französisch/he=Hebräisch/is=Isländisch/it=Italienisch/lv=Litauisch/nl=Holländisch/no=Norwegisch/pl=Polnisch/pt=Portugiesisch/pt-br=Brasil-Portugiesisch/ro=Rumänisch/ru=Russisch/sl=Slovenisch/sv=Schwedisch/zh=Chinesisch en: af=Afrikaans/bg=Bulgarian/br=Breton/ca=Catalan/cs=Czech/da=Danish/de=German/en=English/eo=Esperanto/es=Spanish/et=Estonian/fi=Finnish/fr=French/he=Hebrew/is=Icelandic/it=Italian/lv=Latvian/nl=Dutch/no=Norwegian/pl=Polish/pt=Portuguese/pt-br=Brazilian-Portuguese/ro=Romanian/ru=Russian/sl=Slovenian/sv=Swedish/zh=Chinese eo: bg=bulgara/en=anglo/eo=esperanto/fr=franco es: af=Afrikaans/bg=Búlgaro/br=Bretón/ca=Catalán/cs=Checo/da=Danés/de=Alemán/en=Inglés/eo=Esperanto/es=Español/et=Estonio/fi=Finés/fr=Francés/he=Hebreo/is=Islandés/it=Italiano/lv=Lituano/nl=Neerlandés/no=Noruego/pl=Polaco/pt=Portugés/pt-br=Portugés de Brasil/ro=Rumano/ru=Ruso/sl=Esloveno/sv=Sueco/zh=Chino et: af=afrikaani/bg=bulgaaria/br=bretooni/ca=katalaani/cs=t¨ehhi/da=taani/de=saksa/en=inglise/eo=esperanto/es=hispaania/et=eesti/fi=soome/fr=prantsuse/he=heebrea/is=islandi/it=itaalia/lv=läti/nl=hollandi/no=norra/pl=poola/pt=portugali/pt-br=brasiilia-portugali/ro=rumeenia/ru=vene/sl=sloveenia/sv=rootsi/zh=hiina fi: af=afrikaans/ca=katalaani/cs=tsekki/da=tanska/de=saksa/en=englanti/eo=esperanto/es=espanja/et=eesti/fi=suomi/fr=ranska/he=heprea/is=islanti/it=italia/lv=latvia/nl=hollanti/no=norja/pl=puola/pt=portugali/pt-br=brasilianportugali/ru=venäjä/sv=ruotsi/zh=kiina fr: af=afrikaans/bg=bulgare/br=breton/ca=catalan/cs=tchèque/da=danois/de=allemand/en=anglais/eo=espéranto/es=espagnol/et=estonien/fi=finnois/fr=français/he=hébreu/is=islandais/it=italien/lv=letton/nl=néerlandais/no=norvégien/pl=polonais/pt=portugais/pt-br=portugais du Brésil/ro=roumain/ru=russe/sl=slovène/sv=suédois/zh=chinois he: af=àôøé÷àðñ /cs=ö'ëéú /da=ãðéú /de=âøîðéú /en=àðâìéú /eo=àñôøðèå /es=ñôøãéú /fi=ôéðéú /fr=öøôúéú /he=òáøéú /is=àéñìðãéú /it=àéèì÷éú /lv=ìèååéú /no=ðåøáâéú /pt=ôåøèåâæéú /ru=øåñéú /sv=ùååãéú/zh=ñéðéú is: af=afrikanska/cs=tékkneska/da=danska/de=þýska/en=enska/eo=esperanto/es=spænska/fi=finnska/fr=franska/he=hebraska/is=íslenska/it=ítalska/lv=lettneska/nl=hollenska/no=norska/pt=portúgalska/pt-br=Brasil-portúgalska/ru=rússneska/sv=sænska/zh=kínverska it: af=afrikaans/bg=bulgaro/ca=catalano/cs=ceco/da=danese/de=tedesco/en=inglese/eo=esperanto/es=spagnolo/et=estone/fi=finlandese/fr=francese/he=ebraico/is=islandese/it=italiano/lv=lettone/nl=olandese/no=norvegese/pl=polacco/pt=portoghese/pt-br=portoghese-brasiliano/ru=russo/sl=sloveno/sv=svedese/zh=cinese lv: cs=Èehu/da=Dâòu/de=Vâcu/en=Angïu/eo=Esperanto/es=Spâòu/fi=Somu/fr=Franèu/he=Ebreju/is=Islandieðû/it=Itâïu/lv=Latvieðu/nl=Holandieðu/no=Norvçìu/pt=Portugâïu/pt-br=Brasil-Portugâïu/ru=Krievu/sv=Zviedru/zh=Íînieðu nl: af=Afrikaans/cs=Tsjechisch/da=Deens/de=Duits/en=Engels/eo=Esperanto/es=Spaans/fi=Fins/fr=Frans/he=Hebreeuws/is=IJslands/it=Italiaans/lv=Litouws/nl=Nederlands/no=Noors/pt=Portugees/pt-br=Brasil-Portugees/ru=Russisch/sv=Zweeds/zh=Chinees no: af=afrikaans/bg=bulgarsk/br=bretonsk/ca=katalansk/cs=tjekkisk/da=dansk/de=tysk/en=engelsk/eo=esperanto/es=spansk/et=estisk/fi=finsk/fr=fransk/he=hebraisk/is=islandsk/it=italiensk/lv=litauisk/nl=hollandsk/no=norsk/pl=polsk/pt=portugisisk/pt-br=Brasil-portugisisk/ro=rumensk/ru=russisk/sl=slovensk/sv=svensk/zh=kinesisk pl: af=afrikaans/bg=bu³garski/ca=kataloñski/cs=czeski/da=duñski/de=niemiecki/en=angielski/eo=esperanto/es=hiszpañski/et=estoñski/fi=fiñski/fr=francuski/he=hebrajski/is=islandzki/it=w³oski/lv=³otewski/nl=niderlandzki/no=norweski/pl=polski/pt=portugalski/pt-br=portugalski (Brazylia)/ru=rosyjski/sv=szwedzki/zh=chiñski pt: af=Afrikaans/ca=Catalã/cs=Checo/da=Dinamarquês/de=Alemão/en=Inglês/eo=Esperanto/es=Espanhol/et=Estoniano/fi=Finlandês/fr=Francês/he=Hebreu/is=Islandês/it=Italiano/lv=Lituano/nl=Holandês/no=Norueguês/pl=Polonês/pt=Português/pt-br=Português-do-Brasil/ru=Russo/sv=Sueco/zh=Chinês pt-br: af=Afrikaner/ca=Catalão/cs=Checo/da=Dinamarquês/de=Alemão/en=Inglês/eo=Esperanto/es=Espanhol/et=Estoniano/fi=Finlandês/fr=Francês/he=Hebreu/is=Islandês/it=Italiano/lv=Lituano/nl=Holandês/no=Norueguês/pl=Polonês/pt=Português/pt-br=Português-do-Brasil/ru=Russo/sv=Sueco/zh=Chinês ro: af=africaans/ca=catalana/cs=checha/da=daneza/de=germana/en=engleza/eo=esperanto/es=spaniola/fi=finlandeza/fr=franceza/he=evreiasca/is=islandeza/it=italiana/nl=olandeza/no=norvegiana/pl=poloneza/pt=potugeza/pt-br=portugeza-in-brazilia/ro=romaneste/ru=rusa/sv=suedeza/zh=chineza ru: af=àôðèêàíñêèé/bg=áîëãàðñêèé/ca=êàòàëàíñêèé/cs=÷åøñêèé/da=äàòñêèé/de=íåìåöêèé/en=àíãëèéñêèé/eo=ýñïåðàíòî/es=èñïàíñêèé/et=ýñòîíñêèé/fi=ôèíñêèé/fr=ôðàíöóçñêèé/he=èâðèò/is=èñëàíäñêèé/it=èòàëüÿíñêèé/lv=ëàòûøñêèé/nl=ãîëëàíäñêèé/no=íîðâåæñêèé/pl=ïîëüñêèé/pt=ïîðòóãàëüñêèé/pt-br=áðàçèëüñêî-ïîðòóãàëüñêèé/ru=ðóññêèé/sl=ñëàâÿíñêèé/sv=øâåäñêèé/zh=êèòàéñêèé sl: af=afrikaan¹èina/ca=katalon¹èina/cs=èe¹èina/da=dan¹èina/de=nem¹èina/en=angle¹èina/eo=esperanto/es=¹pan¹èina/et=eston¹èina/fi=fin¹èina/fr=franco¹èina/he=hebrej¹èina/is=island¹èina/it=italijan¹èina/lv=litvan¹èina/nl=nizozem¹èina/no=norve¹èina/pl=polj¹èina/pt=portugal¹èina/pt-br=brazilska-portugal¹èina/ru=ru¹èina/sl=sloven¹èina/sv=¹ved¹èina/zh=kitaj¹èina sv: af=afrikaans/bg=bulgariska/br=bretonska/ca=katalanska/cs=tjeckiska/da=danska/de=tyska/en=engelska/eo=esperanto/es=spanska/et=estniska/fi=finska/fr=franska/he=hebreiska/is=isländska/it=italienska/lv=litauiska/nl=holländska/no=norska/pl=polska/pt=portugisiska/pt-br=brasiliansk-portugisiska/ro=rumänska/ru=ryska/sl=slovenska/sv=svenska/zh=kinesiska zh: fr=·¨Óï/zh=ÖÐÎÄ to change en: to change fr: pour changer it: per cambiare to see the first branch af: om die eerste staak te sien bg: çà äà âèäèòå ïúðâèÿ êëîí br: evit gwelout ar skourr kentañ ca: per veure la primera branca cs: abyste vidìli první da: for at se den første de: , um den ersten zu sehen en: to see the first one eo: por vidi la unuan brancxon es: para ver la primera rama et: esimese haru vaatamiseks fi: nähdäksesi ensimmäisen haaran fr: pour voir la première he: ìøàåú àú äòðó äøàùåï is: til að sjá fyrstu grein it: per vedere il primo lv: skatît pirmo zaru nl: om de eerste tak te zien no: for å se den første pl: aby zobaczyæ pierwsz± liniê (ga³±¼) pt: para ver o primeiro ramo ro: pentru a vedea primul ru: ÷òîáû óâèäåòü ïåðâóþ âåòêó sl: za prikaz prve veje sv: för att se den första to see the first relationship link af: om die eerste te sien bg: çà äà âèäèòå ïúðâàòà ðîäñòâåíà âðúçêà br: evit gwelout al liamm kentañ ca: per veure el primer vincle de parentesc cs: zobrazit první da: for at se det første de: , um die erste zu sehen en: to see the first one eo: por vidi la unuan ligon de parenceco es: para ver el primer vínculo de parentesco et: esimese sugulussuhte vaatamiseks fi: nähdäksesi ensimmäisen sukulaisuuden fr: pour voir le premier he: ìøàåú àú ä÷ùø äîùôçúé äøàùåï is: til að sjá fyrstu tengsl it: per vedere il primo lv: skatît pirmo attiecîbu saiti nl: om de eerste te zien no: for å se den første pl: aby zobaczyæ pierwsz± liniê pokrewieñstwa pt: para ver o primeiro link ro: pentru a vedea prima relatie ru: ÷òîáû óâèäåòü ïåðâóþ ñâÿçü îòíîøåíèÿ sl: za prikaz prve sorodstvene povezave sv: för att se den första to try again with this number af: om weer te probeer met die nommer bg: çà îïèò ñ òîçè íîìåð br: evit esaiñ en-dro gant an niverenn-se ca: per tornar a provar aquest número cs: zkusit znovu s tímto èíslem da: for at forsøge igen med dette nummer de: , um es mit dieser Nummer nochmals zu versuchen en: to try again with this number eo: por reprovi kun cxi tiu numero es: para ensayar de nuevo con este número et: , proovimaks uuesti selle numbriga fi: yrittääksesi uudelleen tällä numerolla fr: pour réessayer avec ce numéro he: ìðñåú ùåá òí äîñôø äæä is: til að reyna þetta aftur með þessu númeri it: per provare di nuovo con questo numero lv: mçìiniet vçlreiz ar ðo nummuru nl: , om dit nummer weer te proberen no: for å prøve igjen med dette nummeret pl: aby ponowiæ z tym numerem pt: para tentar novamente com este número ro: incearca din nou cu acest numar ru: äëÿ òîãî, ÷òîáû ïûòàòüñÿ ñíîâà ñ ýòèì ÷èñëîì sl: za ponoven poskus s to ¹tevilko sv: för att försöka igen med detta nummer %1 of %2 af: %1 van %2 bg: %1 íà :a:%2 br: %1 eus %2 ca: %1 de %2 cs: %1 :g:%2 da: %1 til %2 de: %1 von :d:%2 en: %1 of %2 eo: %1 de %2 es: %1 de %2 et: :g:%2 %1 fi: :g:%2 %1 fr: %1 d[e']%2 he: %1 ùì %2 is: %1 %2 it: %1 d[i']%2 lv: %1 -> %2 nl: %1 van %2 no: %1 til %2/%1 av %2 pl: %1 :g:%2 pt: %1 de %2 ro: %1 pentru %2 ru: %1 :g:%2 sl: %1 od :g:%2 sv: %1 till %2 %d years ago af: %d jaar gelede bg: ïðåäè %d ãîäèíè br: %d vloaz 'zo ca: fa %d anys cs: pøed %d rokem;lety da: for %d år siden de: vor %d Jahren en: %d years ago eo: antaù %d jaroj es: hace %d años et: %d aastat tagasi fi: %d vuotta sitten fr: il y a %d ans he: ìôðé %d ùðéí is: fyrir %d árum síðan it: ha %d anni lv: %d gadus atpakaï nl: %d jaar geleden no: %d år siden pl: przed %d laty pt: há %d anos ro: de %d ani ru: %d ëåò íàçàä sl: pred %d leti sv: %d år sedan %s access cancelled for that page en: %s access cancelled for that page fr: accès %s annulé pour cette page %s cousins af: neefs en niggies %s geslagte verwyder bg: %sè áðàòîâ÷åäè br: kendirvi en %s derez ca: cosins de %s grau cs: %s bratranci/sestøenice da: fætre og kusiner af %s grad de: Cousins %s Grades en: %s cousins eo: %s gradaj gekuzoj es: primos de %s grado et: %s nõod fi: %s serkut fr: cousins au %s degré he: áðé ãåãéí ìãøâä ä%s is: skyld í %s lið it: cugini di %s grado lv: %s brâlçni/mâsîcas nl: neven en nichten in de %s graad no: %smenninger pl: kuzyni %s stopnia pt: primos em %s grau ro: veri de gradul %s ru: %s êóçåíû sl: %s bratranci/sestriène sv: %smänningar %s, it is %s of af: %s, dit is %s van bg: %s, å %s íà br: %s, bez ez eo %s eus ca: %s, és %s de cs: %s, je %s da: %s, er det %s til de: %s ist %s von en: %s, it is %s of eo: %s, estas %s de es: %s, es %s de et: %s, on %s fi: %s, on %s fr: %s, c'est %s de he: %s, æä %s ùì is: %s, er %s it: %s, è %s di lv: %s, tas ir %s nl: %s is het %s van no: %s, er det %s til pl: %s, jest %s pt: %s, é %s de ro: %s, este %s pentru ru: %s, ýòî %s sl: %s, je %s od sv: %s, är det %s till %s, it will be %s of af: %s, dit sal wees %s van bg: %s, ùå áúäå %s íà br: %s, bez e vo %s eus ca: %s, serà %s de cs: %s, bude %s da: %s, er det %s til de: %s ist %s von en: %s, it will be %s of eo: %s, estos %s de es: %s, será %s de et: %s, on %s fi: %s, on %s fr: %s, ce sera %s de he: %s , éäéä %s ùì is: %s, verða %s it: %s, sarà %s di lv: %s, tas bûs %s nl: %s zal het %s zijn van no: %s, vil det bli %s til pl: %s, bêdzie %s pt: %s, será %s de ro: %s, va fi %s pentru ru: %s, ýòî áóäåò %s sl: %s, bo %s od sv: %s, är det %s till %t already has parents af: %t het reeds ouers bg: %t âå÷å èìà ðîäèòåëè br: %t en deus kerent endeo ca: els pares de %t ja existeixen cs: %t u¾ má rodièe da: %t har allerede forældre de: %t hat schon Eltern en: %t already has parents eo: %t havas jam gepatrojn es: los padres de %t ya existen et: isikul %t on juba vanemad fi: henkilöllä %t on jo vanhemmat fr: %t a déjà des parents he: ì- %t éù ëáø äåøéí is: %t er þegar með foreldra it: %t ha già dei genitori lv: %t jau ir vecâki nl: %t heeft al ouders no: %t har allerede foreldre pl: %t ju¿ ma rodziców pt: os pais de %t já existem ro: %t are deja parinti ru: %t óæå èìååò ðîäèòåëåé sl: %t ¾e ima star¹e sv: %t har redan föräldrar %t died before his/her birth af: %t is dood voor sy/haar geboorte bg: %t óìèðà ïðåäè ðàæäàíåòî ñè br: %t zo marv a-raok e c'h(he g)anedigezh ca: %t va morir abans del seu naixement cs: %t zemøel pøed svým narozením/zemøela pøed svým narozením da: %t er døde før fødslen de: %t ist vor der Geburt gestorben en: %t died before his/her birth eo: %t mortis antaù sia naskigxo es: %t ha muerto antes de su nacimiento et: %t suri enne oma sündi fi: %t on kuollut ennen syntymäänsä fr: %t est mort(e) avant sa naissance he: %t îú ìôðé äåìãúå/äåìãúä is: %t lést áður en hann/hún fæddist it: %t sarebbe morto prima della sua nascita lv: %t miris pirms viòð/viòa dzimusi nl: %t zou dood zijn voor zijn/haar geboorte no: %t døde før sin fødsel pl: %t zmar³ przed swymi narodzinami/zmar³a przed swymi narodzinami pt: %t morreu antes de nascer ro: %t a murit inaninte de nastere ru: %t óìåð ïåðåä åãî/åå ðîæäåíèåì sl: %t je umrl pred svojim rojstvom/umrla pred svojim rojstvom sv: %t dog före sin egen födelse %t has incorrect title dates: %t af: %t die datum voor sy titel is verkeerd: %t bg: %t èìà íåêîðåêòíè äàííè çà òèòëà: %t br: %t en(he) deus deiziadoù-tiltloù direizh : %t ca: %t té les dates d'un títol incorrectes cs: %t má nesprávné údaje o titulech: %t da: %t har ukorrekte titeldatoangivelser: %t de: die Datumsangaben eines Titels von %t sind falsch: %t en: %t has incorrect title dates: %t eo: la nobeltitolaj datoj de %t estas malkorektaj: %t es: las fechas de un título de %t son incorrectas: %t et: isiku %t tiitli kuupäev %t on vigane fi: henkilön %t arvonimen päivämäärässä %t on virhe fr: %t a des dates de titre incorrectes: %t he: úàøéëéí ìúàøéí ùì %t àéðí ðëåðéí: %t is: %t hefur vitlausa dagsetningu %t it: alcune date dei titoli di %t sono incorrette: %t lv: %t ir nekorekti datumi: %t nl: %t de data voor titels zijn niet correct no: %t har feil titeldato %t pl: %t ma wpisane nieprawid³owe daty u¿ywania tytu³u pt: as datas de um título de %t não estão correctas pt-br: as datas de um título de %t não estão corretas ro: %t are data de titlu incorrecta %t ru: %t èìååò íåïðàâèëüíîå íàçâàíèå äàòû: %t sl: %t ima napaène datume naslova sv: %t har felaktiga titeldatum: %t %t is born after the death of his/her mother %t af: %t is gebore na die afsterwe van sy/haar moeder %t bg: %t ðàæäà ñå ñëåä ñìúðòòà íà ìàéêà ñè %t br: %t a zo bet ganet goude marv e vamm (he mamm) %t ca: %t va néixer després de la mort de la seva mare cs: %t narozen/narozena po smrti své matky %t da: %t er født efter moderens død %t de: %t ist nach dem Tod der Mutter %t geboren en: %t is born after the death of his/her mother %t eo: %t naskigxis post la morto de sia patrino %t es: %t ha nacido después de la muerte de su madre %t et: %t on sündinud pärast oma ema %t surma fi: %t on syntynyt äitinsä kuoleman jälkeen fr: %t est né(e) après la mort de sa mère %t he: %t ðìã(ä) àçøé îååú äàí is: %t er fædd(ur) eftir andlát móður sinnar %t it: %t sarebbe nato dopo la morte di sua madre %t lv: %t dzimis pçc viòa/viòas mâtes nâves %t nl: %t zou geboren zijn na de dood van zijn/haar moeder %t no: %t er født etter sin mors død %t pl: %t urodzi³ siê/urodzi³a siê po ¶mierci swojej matki: %t pt: %t nasceu depois do óbito da mãe ro: %t e nascut dupa decesul mamei ru: %t ðîäèëñÿ ïîñëå ñìåðòè åãî/åå ìàòåðè %t sl: %t je rojen(a) po smrti svoje matere sv: %t är född efter att sin egen mor dog %t %t is born more than 2 years after the death of his/her father %t af: %t is gebore meer as 2 jaar na die afsterwe van sy/haar vader %t bg: %t ñå ðàæäà ïî-êúñíî îò äâå ãîäèíè ñëåä ñìúðòòà íà áàùà ñè %t br: %t a zo bet ganet ouzhpenn daou vloaz goude marv e dad (he zad) %t ca: %t va néixer més de dos anys després de la mort del seu pare cs: %t narozen/narozena více ne¾ dva roky po smrti svého otce: %t da: %t er født senere end 2 å efter faderens død %t de: %t ist mehr als 2 Jahre nach dem Tod des Vaters %t geboren en: %t is born more than 2 years after the death of his/her father %t eo: %t naskigxis pli ol 2 jaroj post la morto de sia patro %t es: %t ha nacido más de 2 años después de la muerte de su padre % et: %t on sündinud enam kui 2 aastat pärast oma isa %t surma fi: %t on syntynyt yli 2 vuotta isänsä kuoleman jälkeen fr: %t est né(e) plus de 2 ans après la mort de son père %t he: %t ðìã(ä) éåúø îùðúééí àçøé îååú äàá is: %t er fædd(ur) meira en 2 árum eftir andlát föður síns %t it: %t sarebbe nato più di 2 anni dopo la morte di suo padre %t lv: %t ir dzimis vairâk kâ 2 gadus pçc sava tçva nâves %t nl: %t is geboren meer dan twee jaar na de dood van zijn/haar vader no: %t er født mer enn 2 år etter sin fars død %t pl: %t urodzi³ siê/urodzi³a siê ponad 2 lata po ¶mierci swojego ojca: %t pt: %t nasceu mais de 2 anos depois do óbito do pai ro: %t e nascut mai mult de doi ani dupa decesul tatalui ru: %t ðîäèëñÿ áîëåå, ÷åì ÷åðåç 2 ãîäà ïîñëå ñìåðòè åãî/åå îòöà %t sl: %t je rojen(a) veè kot 2 leti po smrti svojega oèeta sv: %t är född mer än 2 år efter att sin egen far dog %t %t's sex is not coherent with his/her relations af: %t se geslag stem nie ooreen met sy/haar verwantskap nie bg: ïîëúò íà %t íå ñå ñúãëàñóâà ñ ïîñî÷åíèòå âçàèìîîòíîøåíèÿ br: reizh %t ne glot ket gant al liammoù anezhañ(anezhi) ca: el sexe de %t no és coherent amb les seves relacions cs: pohlaví %t se neshoduje s jeho/jejími vztahy da: %t's køn er ikke kohærent med hans/hendes forbindelser de: %t's Geschlecht stimmt nicht mit ihren/seinen Beziehungen überein en: %t's sex is not coherent with his/her relations eo: la sekso de %t ne koheras kun siaj rilatoj es: el género de %t es incoherente con sus relaciones et: isiku %t sugu ei sobi tema suhetega fi: henkilön %t sukupuoli ja hänen suhteensa eivät täsmää fr: le sexe de %t n'est pas cohérent avec ses relations he: äîéï ùì %t ìà îúàéí ìéçñéå/ìéçñéä is: kyn %t er ekki í samræmi við skyldleika it: il sesso di %t non e' coerente con le sue relazioni lv: personas %t neatbilst viòa/viòas attiecîbâm nl: het geslacht van %t klopt niet met zijn/haar relaties no: %ts kjønn er uforenlig med forbindelsene hans/hennes pl: %t: jego/jej p³eæ nie odpowiada jego/jej zwi±zkom pt: o sexo de %t não é coerente com suas relações ro: %t are genul incoerent cu relatia ru: ïîë %t íå ñòûêóåòñÿ ñ åãî/åå âçàèìîîòíîøåíèÿìè sl: spol %t ni usklajen z zvezami sv: %ts kön stämmer inte överens med sina relationer (date) af: 1 %m %y/%d %m %y/%m %y/%y bg: 1 %m %y/%d %m %y/%m %y/%y br: 1añ %m %y/%d %m %y/%m %y/%y ca: 1 d[e']%m de %y/%d d[e']%m de %y/%m de %y/%y cs: 1. %m %y/%d. %m %y/%m %y/%y da: 1. %m %y/%d. %m %y/%m %y/%y de: 1. %m %y/%d. %m %y/%m %y/%y en: 1 %m %y/%d %m %y/%m %y/%y eo: 1an de %m %y/%da de %m %y/%m %y/%y es: 1 de %m %y/%d de %m %y/%m %y/%y et: 1. %m %y/%d. %m %y/%m %y/%y fi: 1. %mta %y/%d. %mta %y/%mssa %y/%y fr: 1er %m %y/%d %m %y/%m %y/%y he: 1 %m %y/%d %m %y/%m %y/%y is: 1 %m %y/%d %m %y/%m %y/%y it: 1o %m %y/%d %m %y/%m %y/%y lv: 1. %m %y/%y.gada %d.%m/%y %m/%y nl: 1 %m %y/%d %m %y/%m %y/%y no: 1. %m %y/%d. %m %y/%m %y/%y pl: 1 %m %y/%d %m %y/%m %y/%y pt: 1 de %m de %y/%d de %m de %y/%m %y/%y ro: 1 %m %y/%d. %m %y/%m %y/%y ru: 1 %m %y/%d %m %y/%m %y/%y sl: 1. %m %y/%d. %m %y/%m %y/%y sv: 1 %m %y/%d %m %y/%m %y/%y zh: %yÄê%m1ÈÕ/%yÄê%m%dÈÕ/%yÄê%m/%yÄê (decimal separator) af: , bg: , br: , ca: , cs: , da: , de: , en: . eo: , es: , et: , fi: , fr: , he: . is: , it: , lv: , nl: , no: , pl: , pt: , ro: , ru: . sl: , sv: , (french revolution month) bg: âàíäåìèåð/áðþìåð/ôðèìåð/íèâîç/ïëþâèîç/âàíòîç/æåðìèíàë/ôëîðåàë/ïðåðèàë/ìåñèäîð/òåðìèäîð/ôðóêòèäîð/äîáàâêà br: miz ar vañdech (vañdemier)/miz brumer/miz frimer/miz an erc'h (nivoz)/miz ar glav (pluvioz)/miz vañtoz/miz ar sev (jerminal)/miz ar bleuñv (floreal)/miz ar pradeier (prerial)/miz an eost (mesidor)/miz termidor/miz fruktidor/miz komplemanter ca: vendémiaire/brumaire/frimaire/nivôse/pluviôse/ventôse/germinal/floréal/prairial/messidor/thermidor/fructidor/complémentaire cs: Vendémiaire/Brumaire/Frimaire/Nivôse/Pluviôse/Ventôse/Germinal/Floréal/Prairial/Messidor/Thermidor/Fructidor/Complémentaire da: vendémiaire/brumaire/frimaire/nivôse/pluviôse/ventôse/germinal/floréal/prairial/messidor/thermidor/fructidor/complémentaire de: Vendemiaire/Brumaire/Frimaire/Nivose/Pluviose/Ventose/Germinal/Floreal/Prairial/Messidor/Thermidor/Fructidor/Extra en: Vendemiaire/Brumaire/Frimaire/Nivose/Pluviose/Ventose/Germinal/Floreal/Prairial/Messidor/Thermidor/Fructidor/Extra eo: vendemjero/brumero/frimero/nivozo/pluvjozo/ventozo/germinalo/florealo/prerialo/mesidoro/termindoro/fructidoro/suplemento es: vendimiario/brumario/frimario/nevoso/pluvioso/ventoso/germinal/floreal/pradial/mesidor/termidor/fructidor/complementario et: vandemjäär/brümäär/frimäär/nivoos/plüvioos/vantoos/¸erminaal/floreaal/preriaal/messidoor/termidoor/früktidoor/komplementäär fi: vendémiaire/brumaire/frimaire/nivôse/pluviôse/ventôse/germinal/floréal/prairial/messidor/thermidor/fructidor/complémentaire fr: vendémiaire/brumaire/frimaire/nivôse/pluviôse/ventôse/germinal/floréal/prairial/messidor/thermidor/fructidor/complémentaire he: ååðãîéàéàø / áøåîàéàø / ôøéîàéàø / ðéáåæ / ôìåáéåæ / â'øîéðàì / ôìåøéàì / ôøàøéàì / îñéãåø / úøîéãåø / ôøå÷èéãåø / ðåñó is: vínyrkjumánuður/þokumánuður/hrímmánuður/snjómánuður/regnmánuður/vindmánuður/frjóangamánuður/blómmánuður/engmánuður/uppskerumánuður/hitamánuður/aldinmánuður/hlaupársdagar it: vendemmiaio/brumaio/frimaio/nevoso/piovioso/ventoso/germinale/fiorile/pratile/ messidoro/termidoro/fruttidoro/complementare lv: vendemiaire/brumaire/frimaire/nivose/pluviose/ventose/germinal/floreal/prairial/messidor/thermidor/fructidor/complementaire nl: vendémiaire/brumaire/frimaire/nivôse/pluviôse/ventôse/germinal/floréal/prairial/messidor/thermidor/fructidor/complémentaire no: vendémiaire/brumaire/frimaire/nivôse/pluviôse/ventôse/germinal/floréal/prairial/messidor/thermidor/fructidor/complémentaire pl: Vendemiaire/Brumaire/Frimaire/Nivose/Pluviose/Ventose/Germinal/Floreal/Prairial/Messidor/Thermidor/Fructidor/Extra pt: Vindimiário/Brumário/Frimário/Nevoso/Pluvioso/Ventoso/Germinal/Floreal/Pradial/Messidor/Termidor/Frutidor/Complementar ro: Vendemiaire/Brumaire/Frimaire/Nivose/Pluviose/Ventose/Germinal/Floreal/Prairial/Messidor/Thermidor/Fructidor/Extra ru: Âàíäåìèåð/Áðþìýð/Ôðèìýð/Íèâîç/Ïëþâèîç/Âàíòîç/Æåðìèíàëü/Ôëîðåàëü/Ïðåðèÿëü/Ìåññèäîð/Òýðìèäîð/Ôðþêòèäîð sl: vendémiaire/brumaire/frimaire/nivôse/pluviôse/ventôse/germinal/floréal/prairial/messidor/thermidor/fructidor/complémentaire sv: vendémiaire/brumaire/frimaire/nivôse/pluviôse/ventôse/germinal/floréal/prairial/messidor/thermidor/fructidor/komplementär (hebrew month) af: Tisjri/Hesjvan/Kislev/Tevet/Sjevat/Adar I/Adar II/Nisan/Ijjar/Sivan/Tammus/Av/Elul bg: òèøðè/õåøâàí/êèñëåâ/òåâåò/øåâàò/àäàð I/àäàð II/íèñàí/èÿð/ñèâàí/òàìóç/àâ/åëóë br: tichri/marhechvan/kislev/tevet/chevat/adar 1/adar 2/nissan/iyar/sivan/tamouz/av/eloul ca: tichri/marhechvan/kislev/tevet/chevat/adar 1/adar 2/nissan/iyar/sivan/tamouz/av/eloul cs: Tishri/Heshvan/Kislev/Tevet/Shevat/Adar I/Adar II/Nisan/Iyyar/Sivan/Tammuz/Av/Elul da: tishri/heshvan/kislev/tevet/shevat/adar I/adar II/nisan/iyyar/sivan/tammuz/av/elul de: Tischri/Marcheschwan/Kislev/Tebet/Schebat/Adar/WeAdar/Nisan/Ijar/Siwan/Tammuz/Ab/Elul en: Tishri/Heshvan/Kislev/Tevet/Shevat/Adar I/Adar II/Nisan/Iyyar/Sivan/Tammuz/Av/Elul eo: tisxrio/hesxvano/kislevo/teveto/sxevato/adaro 1/adaro 2/nisano/ijaro/sivano/tamuzo/avo/elulo es: tishri/marjeshvan o jeshvan/kislev/tevet/shevat/adar /( + adar sheni, adar bet o ve-adar)/nisan/iyar/sivan/tamuz/av/elul et: tishrei/chesvan/kislev/tevet/shvat/adar I/adar II/nisan/iyyar/sivan/tammuz/av/elul fi: tichri/marhechvan/kislev/tevet/chevat/adar 1/adar 2/nissan/iyar/sivan/tamouz/av/eloul fr: tichri/marhechvan/kislev/tevet/chevat/adar 1/adar 2/nissan/iyar/sivan/tamouz/av/eloul he: úùøé/ çùåï/ ëñìå/ èáú/ ùáè/ àãø à'/ àãø á'/ ðéñï/ àééø/ ñéåï/ úîåæ/ àá/ àìåì is: tísrí/marhesvan/kíslev/tebet/sebat/adar 1/adar 2/nísan/ijjar/sívan/tammús/ab/elúl it: Tishri/Heshvan/Kislev/Tevet/Shevat/Adar 1/Adar 2/Nisan/Iyar/Sivan/Tammuz/Av/Elul lv: Tishri/Heshvan/Kislev/Tevet/Shevat/Adar I/Adar II/Nisan/Iyyar/Sivan/Tammuz/Av/Elul nl: Tishri/Marcheswan/Kislew/Tebeth/Shebat/Adar/Adar2/Niesan/Ijjar/Siwan/Tammuz/Ab/Elul no: tishri/heshvan/kislev/tevet/shevat/adar I/adar II/nisan/iyyar/sivan/tammuz/av/elul pl: tishri/heshvan/kislev/tevet/shevat/adar I/adar II/nisan/iyyar/sivan/tammuz/av/elul pt: Tishrei/Cheshvan/Kislev/Tevet/Shevat/Adar I/Adar II/Nissan/Iyar/Sivan/Tamuz/Av/Elul ro: Tischri/Marcheschwan/Kislev/Tebet/Schebat/Adar/WeAdar/Nisan/Ijar/Siwan/Tammuz/Ab/Elul ru: Òèøðè/Õåøâàí/Êèñëåâ/Òåâåò/Øåâàò/Àäàð 1/Àäàð 2/Íèñàí/Èÿð/Ñèâàí/Òàììóç/Àâ/Ýëþëü sl: tichri/marhechvan/kislev/tevet/chevat/adar 1/adar 2/nissan/iyar/sivan/tamouz/av/eloul sv: tishri/heshvan/kislev/tevet/shevat/adar I/adar II/nisan/iyyar/sivan/tammuz/av/elul (month) af: Januarie/Februarie/Maart/April/Mei/Junie/Julie/Augustus/September/Oktober/November/Desember bg: ÿíóàðè/ôåâðóàðè/ìàðò/àïðèë/ìàé/þíè/þëè/àâãóñò/ñåïòåìâðè/îêòîìâðè/íîåìâðè/äåêåìâðè br: genver/c'hwevrer/meurzh/ebrel/mae/mezheven/gouere/eost/gwengolo/here/du/kerzu ca: gener/febrer/març/abril/maig/juny/juliol/agost/setembre/octubre/novembre/desembre cs: ledna/února/bøezna/dubna/kvìtna/èervna/èervence/srpna/záøí/øíjna/listopadu/prosince da: januar/februar/marts/april/maj/juni/juli/august/september/oktober/november/december de: Januar/Februar/März/April/Mai/Juni/Juli/August/September/Oktober/November/Dezember en: January/February/March/April/May/June/July/August/September/October/November/December eo: januaro/februaro/marto/aprilo/majo/junio/julio/auxgusto/septembro/oktobro/novembro/decembro es: enero/febrero/marzo/abril/mayo/junio/julio/agosto/septiembre/octubre/noviembre/diciembre et: jaanuar:i:+il:s:+is:p:+i/veebruar:i:+il:s:+is:p:+i/märts:i:+il:s:+is:p:+i/aprill:i:+il:s:+is:p:+i/mai:i:+l:s:+s:p:+d/juuni:i:+l:s:+s:p:+t/juuli:i:+l:s:+s:p:+t/august:i:+il:s:+is:p:+it/september:i:--ril:s:--ris:p:--rit/oktoober:i:--ril:s:--ris:p:--rit/november:i:--ril:s:--ris:p:--rit/detsember:i:--ril:s:--ris:p:--rit fi: tammikuu/helmikuu/maaliskuu/huhtikuu/toukokuu/kesäkuu/heinäkuu/elokuu/syyskuu/lokakuu/marraskuu/joulukuu fr: janvier/février/mars/avril/mai/juin/juillet/août/septembre/octobre/novembre/décembre he: éðåàø/ ôáøåàø/ îøõ/ àôøéì/ îàé/ éåðé/ éåìé/ àåâåñè/ ñôèîáø/ àå÷èåáø/ ðåáîáø/ ãöîáø is: Janúar/febrúar/mars/apríl/mai/júní/júlí/ágúst/september/oktober/nóvember/desember it: gennaio/febbraio/marzo/aprile/maggio/giugno/luglio/agosto/settembre/ottobre/novembre/dicembre lv: janvâris/februâris/marts/aprîlis/maijs/jûnijs/jûlijs/augusts/septembris/oktobris/novembris/decembris nl: januari/februari/maart/april/mei/juni/juli/augustus/september/oktober/november/december no: januar/februar/mars/april/mai/juni/juli/august/september/oktober/november/desember pl: I/II/III/IV/V/VI/VII/VIII/IX/X/XI/XII pt: Janeiro/Fevereiro/Março/Abril/Maio/Junho/Julho/Agosto/Setembro/Outubro/Novembro/Dezembro ro: januarie/februarie/martie/aprilie/mai/junie/julie/august/septembrie/octombrie/noiembrie/decembrie ru: ßíâàðÿ/ôåâðàëÿ/ìàðòà/àïðåëÿ/ìàÿ/èþíÿ/èþëÿ/àâãóñòà/ñåíòÿáðÿ/îêòÿáðÿ/íîÿáðÿ/äåêàáðÿ sl: januarja/februarja/marca/aprila/maja/junija/julija/avgusta/septembra/oktobra/novembra/decembra sv: januari/februari/mars/april/maj/juni/juli/augusti/september/oktober/november/december zh: 1ÔÂ/2ÔÂ/3ÔÂ/4ÔÂ/5ÔÂ/6ÔÂ/7ÔÂ/8ÔÂ/9ÔÂ/10ÔÂ/11ÔÂ/12Ô (thousand separator) af:   bg:   br: . ca: . cs:   da: . de: . en: , eo: . es: . et:   fi: . fr:   he: , is: . it: . lv: ' nl: . no: . pl: . pt: . ro: . ru: ' sl: . sv: . zh: . (week day) af: Sondag/Maandag/Dinsdag/Woensdag/Donderdag/Vrydag/Saterdag bg: íåäåëÿ/ïîíåäåëíèê/âòîðíèê/ñðÿäà/÷åòâúðòúê/ïåòúê/ñúáîòà br: sul/lun/meurzh/merc'her/yaou/gwener/sadorn ca: diumenge/dilluns/dimarts/dimecres/dijous/divendres/dissabte cs: nedìle/pondìlí/úterý/støeda/ètvrtek/pátek/sobota da: søndag/mandag/tirsdag/onsdag/torsdag/fredag/lørdag de: Sonntag/Montag/Dienstag/Mittwoch/Donnerstag/Freitag/Samstag en: Sunday/Monday/Tuesday/Wednesday/Thursday/Friday/Saturday eo: dimancxo/lundo/mardo/merkredo/jaùdo/vendredo/sabato es: domingo/lunes/martes/miércoles/jueves/viernes/sábado et: pühapäev:i:+al/esmaspäev:i:+al/teisipäev:i:+al/kolmapäev:i:+al/neljapäev:i:+al/reede:i:+l/laupäev:i:+al fi: sunnuntai:e:+na/maanantai:e:+na/tiistai:e:+na/keskiviikko:e:+na/torstai:e:+na/perjantai:e:+na/lauantai:e:+na fr: dimanche/lundi/mardi/mercredi/jeudi/vendredi/samedi he: éåí à'/ éåí á'/ éåí â'/ éåí ã'/ éåí ä'/ éåí å'/ ùáú is: sunnudagur/mánudagur/þriðjudagur/miðvikudagur/fimmtudagur/föstudagur/laugardagur it: domenica/lunedì/martedì/mercoledì/giovedì/venerdì/sabato lv: svçtdiena/pirmdiena/otrdiena/treðdiena/ceturdiena/piekdiena/sesdiena nl: zondag/maandag/dinsdag/woensdag/donderdag/vrijdag/zaterdag no: søndag/mandag/tirsdag/onsdag/torsdag/fredag/lørdag pl: niedziela:a:-ê/poniedzia³ek/wtorek/¶roda:a:-ê/czwartek/pi±tek/sobota:a:-ê pt: domingo/segunda-feira/terça-feira/quarta-feira/quinta-feira/sexta-feira/sábado ro: duminica/luni/marti/miercuri/joi/vineri/simbata ru: âîñêðåñåíüå/ïîíåäåëüíèê/âòîðíèê/ñðåäà/÷åòâåðã/ïÿòíèöà sl: nedelja/ponedeljek/torek/sreda/èetrtek/petek/sobota sv: söndag/måndag/tisdag/onsdag/torsdag/fredag/lördag 2nd cousins af: kleinneef/kleinniggie bg: âòîðè áðàòîâ÷åäè br: kendirvi kompez bihan ca: cosins de segon grau cs: bratraneci/sestøenice z druhého kolena da: fætre og kusiner af 2. grad de: Cousins 2. Grades en: 2nd cousins eo: rektaj geprakuzoj es: primos en segundo grado et: teise astme nõod fi: pikkuserkut fr: cousins issus de germains he: áðé ãåãéí ùðééí is: tremenningar it: cugini di 2o grado lv: otrâs pakâpes brâlçns/mâsîca nl: neven en nichten in de 2de graad no: tremenninger pl: kuzyni drugiego stopnia pt: primos em 2º grau ro: var de gradul doi ru: òðîþðîäíûå áðàòüÿ/òðîþðîäíûå ñåñòðû sl: bratranec/sestrièna v drugem kolenu sv: sysslingar 3rd cousins af: agterkleinneef/agterkleinniggie bg: òðåòè áðàòîâ÷åäè br: kendirvi kompez bihan-bihan ca: cosins de 3er grau cs: bratraneci/sestøenice z tøetího kolena da: fætre og kusiner af 3. grad de: Cousins 3. Grades en: 3rd cousins eo: 3aj gradaj gekuzoj es: primos en tercer grado et: kolmanda astme nõod fi: kolmannet serkut fr: cousins issus d'issus de germains he: áðé ãåãéí ùìéùééí is: fjórmenningar it: cugini di 3o grado lv: treðâs pakâpes brâlçns mâsîca nl: neven en nichten in de 3e graad no: firmenninger pl: kuzyni trzeciego stopnia pt: primos em 3º grau ro: var de gradul trei ru: òðîþðîäíûå êóçåíû/òðîþðîäíûå êóçèíû sl: bratranec/sestrièna v tretjem kolenu sv: bryllingar Sosa number relative to %t af: Sosa nommer relatief tot %t bg: ÷èñëî íà Ñîñà îòíîñíî %t br: niverenn Sosa e keñver %t ca: número "Sosa"relatiu a %t cs: "Sosa" èíslo vzta¾ené k %t da: Sosa-nummer, refererende til %t de: Ahnenkennziffer relativ zu %t en: Sosa number relative to %t eo: numero Sosa relative al %t es: número Sosa respecto a %t et: Sosa number %t suhtes fi: Sosa-numero %t suhteen fr: numéro Sosa par rapport à %t he: îñôø Sosa áéçñ ì- %t is: Sosa númer tengt %t it: Numero Sosa relativo a %t lv: SOSA pakâpe attiecîbâ pret %t nl: Sosa nummer ten opzichte van %t no: Sosa nummer i forhold til %t pl: numer "Sosa", odnosz±cy siê do: %t pt: número Sosa em relação a %t ro: numar Sosa in relatie cu ru: Sosa íîìåð îòíîñèòåëüíî %t sl: ¹tevilka"Sosa", v odnosu z %t sv: annummer med %t som proband (Kekules system) M/F af: M/V bg: Ì/Æ br: Gour/Maouez ca: M/F cs: M/® da: M/K de: M/F en: M/F eo: Maskla/Ina es: M/F et: M/N fi: M/N fr: H/F he: æ/ð is: KK/KvK it: M/F lv: V/S nl: M/V no: M/K pl: M/¯ pt: M/F ro: M/F ru: Ì/Æ sl: M/® sv: M/K Sosa af: Sosa bg: ×èñëî íà Ñîñà br: Sosa ca: número "Sosa" cs: "Sosa" da: Sosa de: Ahnenkennziffer en: Sosa eo: Sosa es: Sosa et: Sosa fi: Sosa fr: Sosa he: Sosa is: Sosa it: Sosa lv: SOSA nl: Sosa no: Sosa pl: "Sosa" pt: Sosa ro: Sosa ru: Sosa sl: ¹tevilka Sosa sv: annummer Y/N af: J/N bg: Ä/Í br: Ya/N'eo ket ca: S/N cs: A/N da: J/N de: J/N en: Y/N eo: J/N es: S/N et: J/E fi: K/E fr: O/N he: ÷/ì is: J/N it: S/N lv: J/N nl: J/N no: J/N pl: T/N pt: S/N ro: da/nu ru: Ä/Í sl: da/ne sv: J/N a %s cousin af: 'n neef in die %s -de geslag/'n niggie in die %s -de geslag bg: %sè áðàòîâ÷åä/%sà áðàòîâ÷åäêà br: ur c'henderv a live an %s derez/ur geniterv a live an %s derez/ ur c'h(g)enderv(ez) a live an %s derez ca: un cosí de %s grau/una cosina de %s grau/un(a) cosí(na) de %s grau cs: bratranec z %s kolena/sestøenice z %s kolena da: en fætter af %s grad/en kusine af %s grad de: ein:d:+em Cousin %s Grades/eine:d:+r Cousine %s Grades en: a %s cousin eo: %s grada kuzo/%s grada kuzino/%s grada kuz(in)o es: un primo en %s grado/una prima en %s grado/un(a) primo(a) en %s grado et: %s astme nõbu:g:--o fi: %s serkku:g:--un fr: un cousin au %s degré/une cousine au %s degré/un(e) cousin(e) au %s degré he: áï-ãåã ìãøâä %s/ áú-ãåã ìãøâä %s is: systkynabarn %s it: un cugino di %s grado/una cugina di %s grado/un(a) cugino(a) di %s grado lv: %s brâlçns/mâsîca nl: een neef in de %s generatie/een nicht in de %s generatie no: %smenning pl: kuzyn %s-tego stopnia/kuzynka %s-tego stopnia pt: um primo em %s grau/uma prima em %s grau/um(a) primo(a) em %s grau ro: un var de gradul %s ru: %s-èé êóçåí/%s-ÿ êóçèíà sl: bratranec v %s kolenu/sestrièna v %s kolenu sv: %smänning a 2nd cousin af: 'n kleinneef/'n kleinniggie bg: âòîðè áðàòîâ÷åä/âòîðà áðàòîâ÷åäêà br: ur c'hevenderv/ur gevendervez/ur c'h(g)evenderv(ez) ca: un cosí segon/una cosina segona/un(a) cosí(na) segon(a) cs: bratranec z druhého kolena/sestøenice z druhého kolena da: en fætter af 2. grad/en kusine af 2. grad de: ein:d:+em Cousin 2. Grades/eine:d:+r Cousine 2. Grades en: a 2nd cousin eo: rekta prakuzo/rekta prakuzino/rekta kuz(in)o es: un primo nacido de primos hermanos/una prima nacida de primos hermanos/un(a) primo(a) nacido(a) de primos hermanos et: teise astme nõbu:g:--o fi: pikkuserkku:g:--un fr: un cousin issu de germains/une cousine issue de germains/un(e) cousin(e) issu(e) de germains he: áï-ãåã ùðé/ áú-ãåã ùðéä is: tremenningur it: un cugino di 2o grado/una cugina di 2o grado/un(a) cugino(a) di 2o grado lv: otrais brâlçns/mâsîca nl: een neef in de tweede generatie/een nicht in de tweede generatie no: tremenning pl: kuzyn/kuzynka drugiego stopnia pt: um primo em 2º grau/uma prima em 2º grau/um(a) primo(a) em 2º grau ro: un var de gradul doi ru: òðîþðîäíûé áðàò/òðîþðîäíàÿ ñåñòðà sl: bratranec iz drugega kolena/sestrièna iz drugega kolena sv: en syssling a 3rd cousin af: 'n agterkleinneef/'n agterkleinniggie bg: òðåòè áðàòîâ÷åä/òðåòà áðàòîâ÷åäêà br: ur c'hevniant/ur gevniantez/ur c'h(g)evniant(ez) ca: un cosí 3er/una cosina 3a/un(a) cosí(na) 3er(a) cs: bratranec z tøetího kolena/sestøenice z tøetího kolena da: en fætter af 3. grad/en kusine af 3. grad de: ein:d:+em Cousin 3. Grades/eine:d:+r Cousine 3. Grades en: a 3rd cousin eo: 3a grada kuzo/3a grada kuzino/3a grada kuz(in)o es: un primo 3ro/una prima 3ro/un(a) primo(a) 3ro et: kolmanda astme nõbu:g:--o fi: kolmas serkku:g:nnen serkun fr: un cousin issu d'issus de germains/une cousine issue d'issus de germains/un(e) cousin(e) issu(e) d'issus de germains he: áï-ãåã ùìéùé/ áú-ãåã ùìéùéú is: fjórmenningur it: un cugino di 3o grado/una cugina di 3o grado/un(a) cugino(a) di 3o grado lv: treðais brâlçns/mâsîca nl: een neef in de derde generatie/een nicht in de derde generatie no: firmenning pl: kuzyn/kuzynka trzeciego stopnia pt: um primo em 3º grau/uma prima em 3º grau/um(a) primo(a) em 3º grau ro: un var de gradul trei ru: òðîþðîäíûé êóçåí/òðîþðîäíàÿ êóçèíà sl: bratranec v tretjem kolenu/sestrièna v tretjem kolenu sv: en brylling a brother-in-law/a sister-in-law af: 'n swaer/'n skoonsuster bg: ñåñòðèí ñúïðóã, øóðåé èëè áàäæàíàê/áðàòîâà ñúïðóãà, øóðåíàéêà èëè áàëäúçà/ñåñòðèí ñúïðóã, ñúïðóã íà çúëâà èëè äåâåð/áðàòîâà ñúïðóãà, çúëâà èëè åòúðâà br: ur breur-kaer/ur c'hoar-gaer ca: un cunyat/una cunyada cs: ¹vagr/¹vagrová da: en svoger/en svigerinde de: ein Schwager/eine Schwägerin en: a brother-in-law/a sister-in-law eo: bofrato/bofratino es: un cuñado/una cuñada et: küdi või nääl:g:+u või õemees:g:--he/nadu või käli või vennanaine:g:--se fi: lanko:g:--gon/käly:g:+n fr: un beau-frère/une belle-soeur he: âéñ/ âéñä is: mágur/mágkona it: un cognato/una cognata lv: svainis/svaine nl: een schoonbroer(zwager)/een schoonzuster no: svoger/svigerinne pl: szwagier/szwagierka pt: um cunhado/uma cunhada ro: un cumnat/o cumnata ru: äåâåðü-øóðèí/çàëîâêà-ñâîÿ÷åíèöà sl: svak/svakinja sv: en svåger/en svägerska a brother/a sister/a sibling af: 'n broer/'n sister/'n sibbe bg: áðàò/ñåñòðà/áðàò èëè ñåñòðà br: ur breur/ur c'hoar/ur breur pe ur c'hoar ca: un germà/una germana/un(a) germà(na) cs: bratr/sestra/sourozenec da: en broder/en søster/en broder eller en søster de: ein Bruder/eine Schwester/ein Bruder oder eine Schwester en: a brother/a sister/a sibling eo: frato/fratino/frat(in)o es: un hermano/una hermana/un(a) hermano(a) et: vend:g:-na/õde:g:--e/õde:g:--e või vend:g:-na fi: veli:g:-jen/sisar:g:+en/sisarus:g:-ksen fr: un frère/une soeur/un frère ou une soeur he: àç/ àçåú/ àç(åú) is: bróðir/systir/systkyn it: un fratello/una sorella/un fratello o una sorella lv: brâlis/mâsa/a sibling nl: een broer/een zuster/een broer of een zuster no: bror/søster/søsken pl: brat/siostra/brat lub siostra pt: um irmão/uma irmã/um(a) irmão(ã) ro: frate/sora/un frate sau o sora ru: áðàò/ñåñòðà/áðàò èëè ñåñòðà sl: brat/sestra/brat ali sestra sv: en bror/en syster/ett syskon a cousin af: 'n neef/'n niggie bg: ïúðâè áðàòîâ÷åä/ïúðâà áðàòîâ÷åäêà br: ur c'henderv/ur geniterv ca: un cosí/una cosina cs: bratranec/sestøenice da: en fætter/en kusine de: ein:d:+em Cousin/eine:d:+r Cousine en: a cousin eo: kuzo/kuzino es: un primo/una prima et: nõbu:g:--o fi: serkku:g:--un fr: un cousin/une cousine he: áï-ãåã/ áú-ãåã is: systkynabarn it: un cugino/una cugina lv: brâlçns/mâsîca nl: een neef/een nicht no: fetter/kusine pl: kuzyn/kuzynka pt: um primo/uma prima ro: un var ru: êóçåí/êóçèíà sl: bratranec/sestrièna sv: en kusin a descendant af: 'n afstammeling bg: ïîòîìúê br: un diskennad/ un diskennadez ca: un descendent/una descendent cs: potomek da: en efterkommer de: ein:d:+em Nachkomme:d:+n en: a descendant eo: posteulo es: un descendiente/una descendiente et: järglane:g:--se fi: jälkeläinen:g:---sen fr: un descendant/une descendante he: öàöà/ öàöàä is: afkomandi it: un discendente/una discendente lv: pçcnâcçjs nl: een afstammeling no: etterkommer pl: potomek pt: um descendente/uma descendente ro: un descendent ru: ïîòîìîê sl: potomec sv: en ättling a grandfather/a grandmother/a grandparent af: 'n oupa/'n ouma/'n grootouer bg: äÿäî/áàáà/äÿäî èëè áàáà br: un tad-kozh/ur vamm-gozh/un den-kar-kozh ca: un avi/una àvia/un(a) avi(a) cs: dìdeèek/babièka/prarodiè da: en bedstefader/en bedstemoder/en bedsteforælder de: ein:d:+em Großvater/eine:d:+r Großmutter/ein:d:+em Großelternteil en: a grandfather/a grandmother/a grandparent eo: avo/avino/av(in)o es: un abuelo/una abuela/un(a) abuelo(a) et: vanaisa/vanaema/vanavanem:g:+a fi: isoisä:g:+n/isoäiti:g:--din/isovanhempi:g:--man fr: un grand-père/une grand-mère/un grand-parent he: ñáà/ ñáúà is: afi/amma/afi og amma it: un nonno/una nonna/un(a) nonno(a) lv: vectçvs/vecmamma/vecvecâki nl: een grootvader/een grootmoeder/een grootouder no: bestefar/bestemor/en av besteforeldrene pl: dziadek/babka/dziadkowie pt: um avô/uma avó/um(a) avô(ó) ro: un bunic/o bunica/bunici ru: äåäóøêà/áàáóøêà/ïðàðîäèòåëü sl: dedka/babice/starega star¹a sv: farfar/farmor/en farförälder/morfar/mormor/en morförälder a grandson/a granddaughter/a grandchild af: 'n kleinseun/'n kleindogter/'n kleinkind bg: âíóê/âíó÷êà/âíóê èëè âíó÷êà br: ur mab bihan/ur verc'h vihan/ur bugel bihan ca: un net/una neta/un(a) net(a) cs: vnuk/vnuèka/vnouèe da: en sønne-søn/en sønne-datter/et barnebarn/en datter-søn/en datter-datter/et barnebarn de: ein:d:+em Enkel/eine:d:+r Enkelin/ein:d:+em Enkelkind en: a grandson/a granddaughter/a grandchild eo: nepo/nepino/nep(in)o es: un nieto/una nieta/un(a) nieto(a) et: poja- või tütrepoeg:g:--ja/poja- või tütretütar:g:--re/lapselaps:g:+e fi: pojan tai tyttären poika:g:---jan/pojan tai tyttären tytär:g:--tären/lapsenlapsi:g:-en fr: un petit fils/une petite fille/un petit enfant he: ðëã/ ðëãä is: barnabarn/barnabarn/barnabarn it: un nipote/una nipote/un(a) nipote lv: mazdçls/mazmeita/mazbçrns nl: een kleinzoon/een kleindochter/een kleinkind no: barnebarn/barnebarn/barnebarn pl: wnuk/wnuczka/wnuki pt: um neto/uma neta/um(a) neto(a) ro: nepot/nepoata/nepoti ru: âíóê/âíó÷êà/ðåáåíîê äåòåé sl: vnuk/vnukinja/pravnuk ali pravnukinja sv: en sonson/en sondotter/ett barnbarn/en dotterson/en dotterdotter/ett barnbarn a great-grandfather/a great-grandmother/a great-grandparent af: 'n oupagrootjie/'n oumagrootjie/'n grootjie bg: ïðàäÿäî/ïðàáàáà/ïðàäÿäî èëè ïðàáàáà br: un tad kuñv/ur vamm-guñv/ un den-kar-kozh-kuñv ca: un besavi/una besàvia/un(a) besavi(a) cs: pradìdeèek/prababièka/praprarodiè da: en oldefader/en oldemoder/en oldeforælder de: ein:d:+em Urgroßvater/eine:d:+r Urgroßmutter/ein:d:+em Urgroßelternteil en: a great-grandfather/a great-grandmother/a great-grandparent eo: praavo/praavino/praav(in)o es: un bisabuelo/una bisabuela/un(a) bisabuelo(a) et: vanavanaisa/vanavanaema/vanavanavanem:g:+a fi: iso-isoisä:g:+n/iso-isoäiti:g:--din/iso-isovanhempi:g:--man fr: un arrière-grand-père/une arrière-grand-mère/un arrière-grand-parent he: øá-ñáà/ øá-ñáúà is: langafi/langamma/langafi og langamma it: un bisnonno/una bisnonna/un(a) bisnonno(a) lv: vecvectçvs/vecvecmamma/vecvecvecâki nl: een overgrootvader/een overgrootmoeder/een overgrootouder no: oldefar/oldemor/en av oldeforeldrene pl: pradziadek/prababka/pradziadkowie pt: um bisavô/uma bisavó/um(a) bisavô(ó) ro: un strabunic/o strabunica/strabunici ru: ïðàïðàäåä/ïðàïðàáàáêà/ïðàïðàïðàðîäèòåëü sl: pradedek/prababica/prastari star¹ sv: en gammel-farfar/en gammel-farmor/en gammel-farförälder/en gammel-morfar/en gammel-mormor/en gammel-morförälder a great-grandson/a great-granddaughter/a great-grandchild af: 'n agterkleinseun/'n agterkleindogter/'n agterkleinkind bg: ïðàâíóê/ïðàâíó÷êà/ïðàâíóê èëè ïðàâíó÷êà br: ur mab-kuñv /ur verc'h guñv/ ur bugel-kuñv ca: un besnet/una besneta/un(a) besnet(a) cs: pravnuk/pravnuèka/pravnouèata da: en oldesøn/en oldedatter/et oldebarn de: ein:d:+em Urenkel/eine:d:+r Urenkelin/ein:d:+em Urenkelkind en: a great-grandson/a great-granddaughter/a great-grandchild eo: pranepo/pranepino/pranep(in)o es: un bisnieto/una bisnieta/un(a) bisnieto(a) et: lapselapse poeg:g:--ja/lapselapse tütar:g:--re/lapselapselaps:g:+e fi: lapsenlapsen poika:g:---jan/lapsenlapsen tytär:g:--tären/lapsenlapsen lapsi:g:-en fr: un arrière-petit-fils/une arrière-petite-fille/un arrière-petit-enfant he: ðéï/ ðéðä is: barnabarnabarn/barnabarnabarn/barnabarnabarn it: un pronipote/una pronipote/un(a) pronipote lv: mazmazdçls/mazmazmeita/mazmazbçrni nl: een achterkleinzoon/een achterkleindochter/een achterkleinkind no: oldebarn pl: prawnuk/prawnuczka/prawnuki pt: um bisneto/uma bisneta/um(a) bisneto(a) ro: stranepot/stranepoata/stranepoti ru: ïðàïðàâíóê/ïðàïðàâíó÷êà/ïðàïðàâíóê sl: pravnuk/pravnukinja/pravnuk ali pravnukinja sv: en sonsons son/en sonsons dotter/ett barnbarns barn/en sondotters son/en sondotters dotter/ett barnbarns barn/en dottersons son/en dottersons dotter/ett barnbarns barn/en dotterdotters son/en dotterdotters dotter/ett barnbarns barn a great-nephew/a great-niece af: 'n agterneef/'n agterniggie bg: âíóê íà áðàò èëè ñåñòðà/âíó÷êà íà áðàò èëè ñåñòðà br: un niz bihan/ur verc'h vihan ca: un besnebot/una besneboda cs: prasynovec/praneteø da: en grandnevø/en grandniece de: ein:d:+em Großneffe:d:+n/eine:d:+r Großnichte en: a great-nephew/a great-niece eo: pranevo/pranevino es: un sobrino nieto/una sobrina nieta et: venna- või õelapse poeg:g:--ja/venna- või õelapse tütar:g:--re fi: veljen- tai sisarenlapsen poika:g:---jan/veljen- tai sisarenlapsen tytär:g:--tären fr: un petit neveu/une petite nièce he: áï äàçééï/ áú äàçééï is: frændi/frænka it: un pronipote/una pronipote lv: brâïa/mâsas mazdçls/mazmeita nl: een achterneef/een achternicht no: grandnevø/grandniese pl: wnuk brata lub siostry/wnuczka brata lub siostry pt: um sobrinho-neto/uma sobrinha-neta ro: stranepot/stranepoata/stranepoti ru: âíó÷àòûé ïëåìÿííèê/âíó÷àòàÿ ïëåìÿííèöà sl: praneèak/praneèakinja sv: en gammel-nevö/en gammel-niece a great-uncle/a great-aunt af: 'n grootoom/'n groottante bg: ÷è÷î íà ðîäèòåë/ëåëÿ íà ðîäèòåë/âóé÷î íà ðîäèòåë/ëåëÿ íà ðîäèòåë br: un eontr-kuñv /ur voereb guñv ca: un oncle avi/una tia àvia cs: prastrýc/prateta da: en grandonkel/en grandtante de: ein:d:+em Großonkel/eine:d:+r Großtante en: a great-uncle/a great-aunt eo: praonklo/praonklino es: un tio abuelo/una tia abuela et: vanaonu/vanatädi fi: isosetä:g:--dän/isotäti:g:--din fr: un grand-oncle/une grand-tante he: ãåã-ñá/ ãåãä-ñáä is: afa(ömmu)bróðir/afa(ömmu)systir it: un prozio/una prozia lv: vectçva/vecmamas brâlis/mâsa nl: een oudoom/een oudtante no: en grandonkel/en grandtante pl: brat dziadka lub babki/siostra dziadka lub babki pt: um tio-avô/uma tia-avó ro: frate de bunici/sara de bunici ru: äÿäÿ ðîäèòåëÿ/òåòÿ ðîäèòåëÿ sl: prastric/prateta sv: en gammel-farbror/en gammel-faster/en gammel-morbror/en gammel-moster a half-brother/a half-sister/a half-sibling af: 'n stiefbroer/'n stiefsuster/'n stiefbroer of -suster bg: ïîëóáðàò/ïîëóñåñòðà/ïîëóáðàò èëè ïîëóñåñòðà br: ul lezvreur/ul lezc'hoar/un hanter-breur pe -c'hoar ca: un germanastre/una germanastra/un(a) germanastre(a) cs: nevlastní bratr/nevlastní sestra/nevlastní sourozenec da: en halvbroder/en halvsøster/en halvsøskende de: ein:d:+em Halbbruder/eine:d:+r Halbschwester/ein:d:+em Halbbruder oder eine:d:+r Halbschwester en: a half-brother/a half-sister/a half-sibling eo: duonfrato/duonfratino/duonfrat(in)o es: un medio hermano/una medio hermana/un(a) medio(a) hermano(a) et: poolvend:g:-na/poolõde:g:--e/poolõde:g:--e või poolvend:g:-na fi: velipuoli:g:-en/sisarpuoli:g:-en/isä- tai äitipuolen lapsi:g:-en fr: un demi-frère/une demi-soeur/un demi-frère ou une demi-soeur he: çöé àç/ çöé àçåú/ çöé àç(åú) is: hálfbróðir/hálfsystir/hálfsystkin it: un fratello/una sorella/un fratello o una sorella lv: pusbrâlis/pusmâsa/pusbçrns nl: een halfbroer/een halfzuster/een halfbroer of halfzuster no: halvbror/halvsøster/halvsøsken pl: brat przyrodni/siostra przyrodnia/przyrodni brat lub siostra pt: um meio-irmão/uma meia-irmã/um(a) meio(a) irmão(ã) ro: frate vitreg/sora vitrega/surori sau frati vitregi ru: ïîëóðîäíîé áðàò/ïîëóðîäíàÿ ñåñòðà/ïîëóðîäíîé áðàò sl: polbrata/polsestra/polbrat ali polsestra sv: en halvbror/en halvsyster/ett halvsyskon a nephew/a niece af: 'n broerskind/'n susterskind bg: ïëåìåííèê/ïëåìåííèöà br: un niz/un nizez ca: un nebot/una neboda cs: synovec/neteø da: en nevø/en niece de: ein:d:+em Neffe:d:+n/eine:d:+r Nichte en: a nephew/a niece eo: nevo/nevino es: un sobrino/a sobrina et: venna- või õepoeg:g:--ja/venna- või õetütar:g:--re fi: veljen- tai sisarenpoika:g:---jan/veljen- tai sisarentytär:g:--tären fr: un neveu/une nièce he: àçééï/ àçééðéú is: bróður(systur)sonur/bróður(systur)dóttir it: un nipote/una nipote lv: brâïa/mâsas dçls/meita nl: een neef/een nicht (oom- of tantezegger) no: nevø/niese pl: bratanek lub siostrzeniec/bratanica lub siostrzenica pt: um sobrinho/uma sobrinha ro: nepot/nepoata/nepoti ru: ïëåìÿííèê/ïëåìÿííèöà sl: neèak/neèakinja/neèak ali neèakinja sv: en nevö/en niece a son-in-law/a daughter-in-law af: 'n skoonseun/'n skoondogter bg: ñúïðóã íà äúùåðÿ/ñúïðóãà íà ñèí br: mabeg/merc'heg ca: un gendre/una jove cs: ze»/snacha da: en svigersøn/en svigerdatter de: ein Schwiegersohn/eine Schwiegertochter en: a son-in-law/a daughter-in-law eo: bofilo/bofilino es: un yerno/una nuera et: väimees:g:--he/minia fi: vävy:g:+n/miniä:g:+n fr: un beau-fils/une belle-fille he: çúï/ ëìä is: tengdasonur/tengdadóttir it: un genero/una nuora lv: znots/vedekla nl: schoonzoon/schoondochter no: svigersønn/svigerdatter pl: ziêæ/synowa pt: um genro/uma nora ro: ginere/nora ru: çÿòü/íåâåñòêà sl: zet/snaha sv: en måg/en svärdotter a son/a daughter/a child af: 'n seun/'n dogter/'n kind bg: ñèí/äúùåðÿ/äåòå br: ur mab/ur verc'h/ur bugel ca: un fill/una filla/un(a) fill(a) cs: syn/dcera/dítì da: en søn/en datter/et barn de: ein:d:+em Sohn/eine:d:+r Tochter/ein:d:+em Kind en: a son/a daughter/a child eo: filo/filino/ido es: un hijo/una hija/un(a) hijo(a) et: poeg:g:--ja/tütar:g:--re/laps:g:+e fi: poika:g:---jan/tytär:g:--tären/lapsi:g:-en fr: un fils/une fille/un enfant he: áï/ áú/ éìã is: sonur/dóttir/barn it: un figlio/una figlia/un(a) figlio(a) lv: dçls/meita/bçrns nl: een zoon/een dochter/een kind no: sønn/datter/barn pl: syn/córka/dziecko pt: um filho/uma filha/um(a) filho(a) ro: fiu/fica/copil ru: ñûí/äî÷ü/ðåáåíîê sl: sin/hèerka/otrok sv: en son/en dotter/ett barn about (date) af: ongeveer bg: îêîëî br: war-dro ca: al voltant de cs: kolem da: omkring de: ca. en: about eo: cxirkaù es: alrededor de et: umbes :i: fi: noin fr: vers he: áòøê is: um it: circa lv: ap nl: circa no: ca pl: oko³o pt: cerca ro: circa ru: îêîëî sl: pribli¾no sv: omkring access af: toegang bg: äîñòúï br: mont-e-barzh ca: accés cs: pøístup da: adgang de: Zugriff en: access eo: eniro es: acceso et: ligipääs fi: pääsy fr: accès he: ëðéñä is: aðgangur it: accesso lv: piekïuve/atslçga nl: toegang no: tilgang pl: dostêp pt: acesso ro: acces ru: äîñòóï sl: dostop sv: tillträde add af: byvoeg bg: äîáàâÿíå íà br: ouzhpennañ ca: afegir cs: pøidat :a: da: tilføj de: hinzufügen +before en: add eo: aldoni :a: es: agregar et: lisa fi: lisää fr: ajouter he: äåñôä is: bæta við it: aggiungere lv: pievienot nl: invoeren +before no: tilføy pl: dodaj :a: pt: acrescentar ro: adauga ru: äîáàâèòü :a: sl: dodaj sv: lägg till adoptive father/adoptive mother/adoptive parents af: aangenome vader/angenome moeder/aangenome ouers bg: îñèíîâèòåë/îñèíîâèòåëêà/îñèíîâèòåëè br: adtad/advamm/adkerent ca: pare adoptiu/mare adoptiva/pares adoptius cs: adoptivní otec/adoptivní matka/adoptivní rodièe da: adoptivfader/adoptivmoder/adoptivforældre de: Adoptivvater/Adoptivmutter/Adoptiveltern en: adoptive father/adoptive mother/adoptive parents eo: adoptinta patro/adoptinta patrino/adoptintaj gepatroj es: padre adoptivo/madre adoptiva/padres adoptivos et: adoptiivisa/adoptiivema/adoptiivvanemad fi: ottoisä/ottoäiti/ottovanhemmat fr: père adoptif/mère adoptive/parents adoptifs he: àá çåøâ/ àí çåøâú/ äåøéí çåøâéí is: kjörfaðir/kjörmóðir/kjörforeldrar it: padre adottivo/madre adottiva/genitori adottivi lv: patçvs/pamâte/pavecâki adoptive parents nl: adoptiefvader/adoptiefmoeder/adoptiefouders no: adoptivfar/adoptivmor/adoptivforeldre pl: przybrany ojciec/przybrana matka/przybrani rodzice pt: pai adoptivo/mãe adoptiva/pais adoptivos pt-br: pai adotivo/mãe adotiva/pais adotivos ro: tatal adoptiv/mama adoptiva/parinti adoptivi ru: ïðèåìíûé îòåö/ïðèåìíàÿ ìàòü/ïðèåìíûå ðîäèòåëè sl: posvojitveni oèe/posvojitvena mati/posvojitveni star¹i sv: adoptivfar/adoptivmor/adoptivföräldrar adoptive son/adoptive daughter/adoptive child af: aangenome seun/aangenome dogter/aangenome kind bg: îñèíîâåí ñèí/îñèíîâåíà äúùåðÿ/îñèíîâåíî äåòå br: advab/adverc'h/advugel ca: fill adoptiu/filla adoptiva/fill(a) adoptiu(iva) cs: adoptivní syn/adoptivní dcera/adoptivní dítì da: adoptivsøn/adoptivdatter/adoptivbarn de: Adoptivsohn/Adoptivtochter/Adoptivkind en: adoptive son/adoptive daughter/adoptive child eo: adoptita filo/adoptita filino/adoptita ido es: hijo adoptivo/hija adoptiva/hijo(a) adoptivo(a) et: adopteeritud poeg/adopteeritud tütar/adopteeritud laps fi: ottopoika/ottotytär/ottolapsi fr: fils adoptif/fille adoptive/enfant adoptif he: áï çåøâ/ áú çåøâú/ éìã çåøâ is: kjörsonur/kjördóttir/kjörbarn it: figlio adottivo/figlia adottiva/figlio addotivo lv: padçls/pameita/pabçrns nl: adoptiefzoon/adoptiefdochter/adoptiefkind no: adoptivsønn/adoptivdatter/adoptivbarn pl: syn adoptowany/córka adoptowana/dziecko adoptowane pt: filho adoptivo/filha adoptiva/filho(a) adoptivo(a) pt-br: filho adotivo/filha adotiva/filho(a) adotivo(a) ro: fiu adoptiv/fica adoptiva/copil adoptiv ru: ïðèåìíûé ñûí/ïðèåìíàÿ äî÷ü/ïðèåìíû ðåáåíîê sl: posvojenec/posvojenka/posvojeni otrok sv: adoptivson/adoptivdotter/adoptivbarn advanced request af: gevorderde versoek bg: ðàçøèðåíà çàÿâêà br: klask araokaet ca: recerca avançada cs: roz¹íøený dotaz da: avanceret søgning de: Erweiterte Suche en: advanced request eo: sercxo pli preciza es: consulta avanzada et: laiendatud päring fi: erityishaku fr: requête évoluée he: á÷ùä îú÷ãîú is: nákvæmari leit it: richiesta avanzata lv: paplaðinâtâ meklçðana pçc: nl: gedetailleerd zoeken no: avansert søk pl: wyszukiwanie zaawansowane pt: pesquisa complexa ro: consultatie avansata ru: ðàñøèðåííûé çàïðîñ sl: napredno iskanje sv: avancerad sökning zh: ¸ß¼¶·ÃÎÊÇëÇó after af: na bg: ñëåä br: goude ca: després de cs: po da: efter de: nach en: after eo: post es: después et: pärast fi: jälkeen fr: après he: àçøé is: eftir it: dopo lv: pçc nl: na no: etter pl: po pt: depois ro: dupa ru: ïîñëå sl: po sv: efter after (date) af: na bg: ñëåä br: goude ca: després de cs: po da: efter de: nach en: after eo: post es: después de et: pärast :p: fi: jälkeen fr: après he: àçøé is: eftir it: dopo lv: pçc nl: na no: etter pl: po pt: depois de ro: dupa ru: ïîñëå sl: po sv: efter age af: ouderdom bg: âúçðàñò br: oad ca: edat cs: vìk da: alder de: Alter en: age eo: agxo es: edad et: vanus fi: ikä fr: âge he: âéì is: aldur it: età lv: vecums nl: leeftijd no: alder pl: wiek pt: idade ro: etate ru: âîçðàñò sl: starost sv: ålder zh: ÄêÁä age at death: af: ouderdom by afsterwe: bg: íà âúçðàñò br: p'edo ca: a l'edat de cs: vìk v dobì úmrtí da: alder ved død: de: Alter: en: age at death: eo: mortagxo es: a la edad de et: vanus surres fi: ikä kuollessa fr: à l'âge de he: âéì áîåúå/îåúä is: dánaraldur it: all'età di lv: mirðanas vecums: nl: leeftijd bij overlijden: no: alder pl: wiek: pt: com a idade de ro: etate la deces ru: â âîçðàñòå sl: ¾ivel(a) sv: livslängd: zh: ÏíÄê alias af: alias bg: èìåíóâà ñå îùå br: alias ca: àlies cs: alias da: alias de: Alias en: alias eo: aliasa:a:+n es: alias et: hüüdnimi fi: kutsumanimi fr: alias he: ùí ðåñó is: aukanafn it: alias lv: pieòemtais vârds nl: alias no: alias pl: alias pt: alias pt-br: apelido ro: alias ru: ïñåâäîíèì sl: alias sv: alias alive af: in die lewe bg: æèâ/æèâà/æèâ(à) br: bev c'hoazh ca: viu/viva/viu(va) cs: ¾ijící da: levende de: nicht verstorben en: alive eo: vivanta es: no fallecido/no fallecida/no fallecido(a) et: elus fi: elää fr: vivant/vivante/vivant(e) he: áçééí is: ekki látin(n) it: non deceduto/non deceduta/non deceduto(a) lv: dzîvs nl: niet overleden no: ikke død pl: osoba ¿yj±ca pt: não falecido/não falecida/não falecido(a) ro: in viata ru: æèâîé sl: ¾ivi sv: lever all the estates af: alle plase bg: âñè÷êè ìåñòîóêàçàíèÿ br: an holl zomanioù ca: tots els llocs cs: v¹echna místa da: alle ophav de: alle Orte en: all the estates eo: cxiuj nobelbienoj es: todos los lugares et: kõik valdused fi: kaikki paikat fr: tous les domaines he: ëì äî÷åîåú is: alla staði it: tutti i luoghi lv: visi îpaðumi nl: alle plaatsen no: alle steder pl: wszystkie domeny pt: todos os lugares ro: toate localitatile ru: âñå ìåñòà sl: vsa posestva sv: alla platser all the titles af: al die titels bg: âñè÷êè òèòëè br: an holl ditloù ca: tots els títols cs: v¹echny tituly da: alle titler de: alle Titel en: all the titles eo: cxiuj nobeltitoloj es: todos los títulos et: kõik tiitlid fi: kaikki arvonimet fr: tous les titres he: ëì äúàøéí is: alla titla it: tutti i titoli lv: visi tituli nl: alle titels no: alle titler pl: wszystkie tytu³y pt: todos os títulos ro: toate titlurile ru: âñå òèòóëû sl: vsi nazivi sv: alla titlar alphabetic order af: alfabetiese volgorde bg: àçáó÷åí ðåä br: urzh al lizherenneg ca: ordre alfabètic cs: v abecedním poøadí da: alfabetisk orden de: alphabetische Ordnung en: alphabetic order eo: alfabeta ordo es: orden alfabético et: tähestikuline järjekord fi: aakkosjärjestys fr: ordre alphabétique he: ñãø àìó-áú is: stafrófsröð it: ordine alfabetico lv: alfabçtiskâ kârtîbâ nl: alfabetische volgorde no: alfabetisk pl: alfabetycznie pt: ordem alfabética ro: alfabetica ru: àëôàâèòíûé ïîðÿäîê sl: abecedni red sv: bokstavsordning also af: ook bg: ñúùî br: ivez ca: també cs: také da: også de: auch en: also eo: ankaù es: también et: ka fi: myös fr: aussi he: âí is: líka it: anche lv: arî nl: ook no: også pl: tak¿e pt: também ro: si ru: òàêæå sl: tudi sv: också an ancestor af: 'n voorsaat bg: åäèí îò ïðåäöèòå br: un hendad/un henvamm ca: un avantpassat cs: pøedek da: en forfader de: ein:d:+em Vorfahre:d:+n/eine:d:+r Vorfahrin en: an ancestor eo: prapatro/prapatrino es: un ancestro et: esivanem:g:+a fi: esi-isä:g:+n/esiäiti:g:--din fr: un ancêtre/une ancêtre he: àá ÷ãîåï is: forfaðir it: un antenato/un'antenata lv: sencis nl: een voorouder no: ane pl: przodek pt: um antepassado/uma antepassada ro: un strabun ru: ïðåäîê sl: prednik sv: en ana an uncle/an aunt af: 'n oom/'n tante bg: ÷è÷î/ëåëÿ/âóé÷î/ëåëÿ br: un eontr/ur voereb ca: un oncle/una tia cs: strýc/teta da: en onkel/en tante de: ein:d:+em Onkel/eine:d:+r Tante en: an uncle/an aunt eo: onklo/onklino es: un tío/una tía et: onu/tädi fi: setä:g:--dän/täti:g:--din/eno:g:+n/täti:g:--din fr: un oncle/une tante he: ãåã/ ãåãä is: föður(móður)bróðir/föður(móður)systir it: uno zio/una zia lv: onkulis/tante nl: een oom/een tante no: onkel/tante pl: stryj lub wuj/ciotka pt: um tio/uma tia ro: un unchi/o matusa ru: äÿäÿ/òåòÿ sl: stric/teta sv: en farbror/en faster/en morbror/en moster ancestors af: voorouers bg: ïðåäöè br: hendadoù ca: ascendents cs: pøedkové da: forfædre de: Vorfahren en: ancestors eo: prapatro es: ascendientes et: esivanemad fi: esivanhemmat fr: ascendants he: äàáåú is: forfeður it: antenati lv: senèi nl: voorouders no: forfedre pl: przodkowie pt: antepassados ro: strabuni ru: ïðåäêè sl: predniki sv: anor zh: ׿ÏÈ ancestors (some) af: voorsate bg: ïðåäöè br: hendadoù ca: avantpassats cs: pøedkové da: forfædre de: Vorfahren en: ancestors eo: geprapatroj es: ancestros et: esivanemad fi: esivanhempia fr: des ancêtres he: àáåú is: forfeður it: antenati lv: senèi nl: voorouders no: forfedre pl: przodkowie pt: antepassados ro: strabuni ru: âîçìîæíûå ïðåäêè sl: predniki sv: anor and af: en bg: è br: ha ca: i cs: a da: og de: und en: and eo: kaj es: y/e  et: ja fi: ja fr: et he: å- is: og it: e lv: un nl: en no: og pl: i pt: e ro: si ru: è sl: in sv: och zh: ºÍ anniversaries af: herdenkinge bg: ãîäèøíèíè br: deizioù-ha-bloaz ca: aniversaris cs: výroèí da: årsdage de: Jahrestage en: anniversaries eo: datrevenoj es: aniversarios et: aastapäevad fi: merkkipäiviä fr: anniversaires he: éîé ùðä is: merkisdagar it: anniversari lv: gadadienas nl: verjaardagen no: årsdager pl: rocznice pt: aniversários ro: aniversare ru: ãîäîâùèíû sl: obletnice sv: årsdagar anniversaries of dead people af: herdenkings van afsterwe bg: ãîäèøíèíè íà ïî÷èíàëè õîðà br: deizioù-ha-bloaz an dud varv ca: aniversaris de defunció cs: výroèí zemøelých osob da: årsdage for døde personer de: Jahrestage der verstorbenen Personen en: anniversaries of dead people eo: mortotagaj datrevenoj es: aniversarios de las personas fallecidas et: surnud inimeste mälestuspäevad fi: vainajien muistopäiviä fr: anniversaires des personnes décédées he: éîé ùðä ìîååú is: ártíðir it: anniversari delle persone decedute lv: mirðanas piemiòas dienas nl: verjaardagen van overleden mensen no: årsdager for avdøde personer pl: rocznice urodzin i ¶mierci osób nie¿yj±cych pt: aniversários das pessoas falecidas ro: aniversare a persoanelor decedate ru: ãîäîâùèíû ñìåðòè sl: obletnice umrlih oseb sv: årsdagar för avlidna personer zh: ËÀÍöÓÚ½ñÈյļǼ anniversaries of marriage af: huweliksherdenkinge bg: ãîäèøíèíè îò ñâàòáà br: deizioù-ha-bloaz eured ca: aniversaris de casament cs: výroèí sòatkù da: årsdage for bryllupper de: Hochzeitstage en: anniversaries of marriage eo: datrevenoj de edzigxo es: aniversarios de casamiento et: pulma-aastapäevad fi: hääpäiviä fr: anniversaires de mariage he: éîé ðéùåàéï is: brúðkaupsafmæli it: anniversari di matrimonio lv: kâzu dienas nl: huwelijksverjaardagen no: bryllupsdager pl: rocznice ¶lubów pt: aniversários de casamento ro: aniversare de mariaj ru: ãîäîâùèíû áðàêà sl: obletnice porok sv: bröllopsdagar zh: ½á»éÓÚ½ñÈյļǼ are af: is bg: ñà br: a zo ca: són cs: jsou da: er de: sind en: are eo: estas es: son et: on fi: ovat fr: sont he: äí is: eru it: sono lv: ir nl: zijn no: er pl: to pt: são ro: sint ru: åñòü sl: so sv: är at the same time af: ter selfdertyd bg: åäíîâðåìåííî br: war un dro ca: alhora cs: souèasnì da: på en gang de: zugleich en: at the same time eo: samtempe es: a la vez et: samal ajal fi: samaan aikaan fr: en même temps he: âí is: einnig it: nello stesso tempo lv: vienlaicîgi nl: tegelijkertijd no: samtidig pl: zarazem pt: ao mesmo tempo ro: in acelas timp ru: â òî æå ñàìîå âðåìÿ sl: soèasno sv: samtidigt average age at death bg: ñðåäíà ïðîäúëæèòåëíîñò íà æèâîòà da: gennemsnitlig alder ved død de: Durchschnittliches Sterbealter en: average age at death es: edad promedio de deceso et: keskmine eluiga fr: âge moyen de décès it: età media di morte nl: gemiddelde leeftijd bij overlijden pl: ¶redni wiek ¶mierci pt: idade média ao morrer ro: virsta media la deces sl: povpreèna starost ob smrti sv: medelålder vid dödstillfället back af: terug bg: îáðàòíî br: distreiñ ca: tornar cs: zpìt da: tilbage de: zurück en: back eo: reveno es: regreso et: tagasi fi: takaisin fr: retour he: çæøä is: til baka it: torna indietro lv: atpakaï nl: terug no: tilbake pl: wstecz pt: voltar ro: inapoi ru: íàçàä sl: nazaj sv: tillbaka baptism af: doop bg: êðúùåíèå br: badeziant ca: bateig cs: køest da: dåb de: Taufe en: baptism eo: bapto es: bautismo et: ristimine fi: kaste fr: baptême he: úáéìä is: skírn it: battesimo lv: baptisms nl: doop no: dåp pl: chrzest pt: baptismo pt-br: batismo ro: botez ru: êðåùåíèå sl: krst sv: dop baptized af: gedoop bg: êðúñòåí/êðúñòåíà/êðúñòåí(à) br: badezet ca: batejat/batejada/batejat(ada) cs: pokøtìn/pokøtìna da: døbt de: getauft en: baptized eo: baptita es: bautizado/bautizada/bautizado(a) et: ristitud fi: kastettu fr: baptisé/baptisée/baptisé(e) he: ìðöøåú / ðèáìä ìðöøåú ðèáì is: skírð(ur) it: battezzato/battezzata/battezzato(a) lv: baptized nl: gedoopt no: døpt pl: chrzest pt: baptizado/baptizada/baptizado(a) pt-br: batizado/batizada/batizado(a) ro: botezat/botezata/botezat ru: êðåùåíûé sl: kr¹èen/kr¹èena sv: döpt before af: voor bg: ïðåäè br: a-raok ca: abans de cs: pøed da: før de: vor en: before eo: antaù es: antes et: enne fi: ennen fr: avant he: ìôðé is: áður it: prima lv: pirms nl: voor no: før pl: przed pt: antes ro: inainte ru: ïåðåä sl: pred sv: före before (date) af: voor bg: ïðåäè br: a-raok ca: abans de cs: pøed da: før de: vor en: before eo: antaù es: antes de et: enne :p: fi: ennen fr: avant he: ìôðé is: fyrir it: prima del lv: pirms nl: voor no: før pl: przed pt: antes de ro: inainte de ru: äî sl: pred sv: före begin af: begin bg: çàïî÷âàíå br: deroù ca: començament cs: zaèátek da: påbegyndelse de: Anfang en: begin eo: komenco es: principio et: algus fi: alku fr: début he: äúçéì is: byrja it: inizio lv: sâkums (begin) nl: begin no: start pl: pocz±tek pt: começo ro: inceput ru: íà÷èíàÿ ñ sl: zaèetek sv: börjar between (date) af: tussen bg: ìåæäó br: etre ca: entre el cs: mezi da: mellem de: zwischen en: between eo: inter es: entre et: vahemikus fi: välillä fr: entre he: áéï is: milli it: tra lv: starp nl: tussen no: mellom pl: miêdzy pt: entre ro: intre ru: ìåæäó sl: med sv: mellan birth af: geboorte bg: ðàæäàíå br: ganedigezh ca: naixement cs: narození da: fødsel de: Geburt en: birth eo: naskigxo es: nacimiento et: sünd fi: syntymä fr: naissance he: ìéãä is: fæðing it: nascita lv: dzimðana nl: geboorte no: født pl: urodzenie pt: nascimento ro: nastere ru: ðîæäåíèå sl: rojstva sv: födelse birthdays af: verjaarsdae bg: ðîæäåíè äíè br: deizioù ganedigezh ca: aniversaris cs: narozeniny da: fødselsdage de: Geburtstage en: birthdays eo: datrevenoj de naskigxo es: cumpleaños et: sünnipäevad fi: syntymäpäiviä fr: anniversaires he: éîé äåìãú is: afmælisdagar it: compleanni lv: dzimðanas dienas nl: verjaardagen no: fødselsdager pl: urodziny pt: aniversários pt-br: aniversários de nascimento ro: zi de nastere ru: äíè ðîæäåíèÿ sl: rojstni dnevi sv: födelsedagar zh: ³öÉúÓÚ½ñÈյļǼ border af: rand bg: ðàìêà br: bord ca: contorn cs: okraj da: ramme de: Rand en: border eo: limo es: borde et: ääris fi: raja fr: bordure he: îñâøú is: jaðar it: bordo lv: mala nl: omranding no: ramme pl: granica pt: borda ro: bordura ru: ðàìêà sl: okvir sv: kantlinje born af: gebore bg: ðîäåí/ðîäåíà/ðîäåí(à) br: bet ganet ca: nascut/nascuda/nascut(uda) cs: narozen/narozena da: født de: geboren en: born eo: naskigxinta es: nacido/nacida/nacido(a) et: sündinud fi: syntynyt fr: né/née/né(e) he: ðìã/ ðìãä is: fædd(ur) it: nato/nata/nato(a) lv: dzimðanas nl: geboren no: født pl: urodzony/urodzona/urodzone pt: nascido/nascida/nascido(a) ro: născut/născută/născut ru: ðîäèëñÿ/ðîäèëàñü sl: rojen/rojena sv: född zh: ³öÉú branch/branches af: tak/takke bg: êëîí/êëîíîâå br: skourr/skourroù ca: branca/branques cs: vìtev/vìtve da: gren/grene de: Ast/Äste en: branch/branches eo: brancxo/brancxoj es: rama/ramas et: haru/harud fi: haara/haaraa fr: branche/branches he: òðó/ òðôéí is: grein/greinar it: ramo/rami lv: zars/zari nl: tak/takken no: gren/grener pl: linia/linie pt: ramo/ramos ro: ramura ru: âåòâü/âåòâè sl: veja/veje sv: anlinje/anlinjer burial af: begrawe bg: ïîãðåáåíèå br: beziadur ca: enterrament cs: pohøeb da: begravelse de: Beisetzung en: burial eo: entombigo es: entierro et: matus fi: hautaus fr: enterrement he: ÷áåøä is: útför it: sepoltura lv: bçres nl: begrafenis no: begravelse pl: pogrzeb pt: enterro ro: inmormintare ru: ïîõîðîíû sl: pogreb sv: begravning buried af: begrawe bg: ïîãðåáàí/ïîãðåáàíà br: douaridigezh ca: enterrat/enterrada/enterrat(ada) cs: pohøben/pohøbena da: begravet de: beigesetzt en: buried eo: entombigita es: enterrado/enterrada/enterrado(a) et: maetud fi: haudattu fr: inhumé/inhumée/inhumé(e) he: ÷áåø/ ÷áåøä is: grafin(n) it: sepolto/sepolta/sepolto(a) lv: apbedîts nl: begraven no: begravet pl: pochowany/pochowana/pochówek pt: enterrado/enterrada/enterrado(a) ro: inmormintat ru: ïîõîðîíåí/ïîõîðîíåíà sl: pokopan/pokopana/pokopani sv: begravd calendar/calendars af: kalender/kalenders bg: êàëåíäàð/êàëåíäàðè br: deiziadur ca: calendari/calendaris cs: kalendáø/kalendáøe da: kalender/kalendere de: Kalender en: calendar/calendars eo: kalendaro/kalendaroj es: calendario/calendarios et: kalender/kalendrid fi: kalenteri/kalenterit fr: calendrier/calendriers he: ìåç ùðä/ ìåçåú ùðä is: dagatal/dagatöl it: calendario/calendarii lv: kalendârs/kalendâri nl: kalender/kalenders no: kalender/kalendere pl: kalendarz/kalendarze pt: calendário/calendários ro: calendar/calendare ru: êàëåíäàðü/êàëåíäàðè sl: koledar/koledarji sv: kalender cancel GeneWeb links af: stop GeneWeb-skakels bg: áåç GeneWeb-ëèíêîâå br: nulañ al liammoù GeneWeb ca: anul·lar els lligams GeneWeb cs: zru¹it spoje GeneWebu da: uden GeneWeb-links de: GeneWeb-Links entfernen en: cancel GeneWeb links eo: nuligi GeneWeb-ajn ligilojn es: anular los lazos GeneWeb et: ilma GeneWebi viideteta fi: ei GeneWeb-linkkejä fr: annuler les liens GeneWeb he: áèì ÷ùøé GeneWeb is: án GeneWeb tengla it: annullare i links lv: nerâdît GeneWeb saites nl: zonder GeneWeb links no: uten GeneWeb koblinger pl: pomiñ ³±cza GeneWeb pt: cancelar os links Geneweb ro: anuleaza conexiuni GeneWeb ru: áåç GeneWeb ññûëîê sl: brez GeneWeb povezav sv: inga GeneWeb länkar candidate father/candidate mother/candidate parents af: moontlike vader/moontlike moeder/moontlike ouers bg: âúçìîæåí áàùà/âúçìîæíà ìàéêà/âúçìîæíè ðîäèòåëè br: a c'hell bezañ tad/a c'hell bezañ mamm/a c'hell bezañ tud ca: possible pare/possible mare/possibles pares cs: pravdìpodobný otec/pravdìpodobná matka/pravdìpodobní rodièe da: mulig fader/mulig moder/mulige forældre de: möglicher Vater/mögliche Mutter/mögliche Eltern en: candidate father/candidate mother/candidate parents eo: ebla patro/ebla patrino/eblaj gepatroj es: padre posible/madre posible/padres posibles et: oletatav isa/oletatav ema/oletatavad vanemad fi: mahdollinen isä/mahdollinen äiti/mahdolliset vanhemmat fr: père possible/mère possible/parents possibles he: àá àôùøé/ àí àôùøéú/ äåøéí àôùøééí is: sennilegur faðir/sennileg móðir/sennilegir foreldrar it: padre presunto/madre presunta/genitori presunti lv: iespeejamais tçvs/iespçjamâ mâte/iespçjamie vecâki nl: kandidaat vader/kandidaat moeder/kandidaat ouders no: mulig far/mulig mor/mulige foreldre pl: prawdopodobny ojciec/prawdopodobna matka/prawdopodobni rodzice pt: suposto pai/suposta mãe/supostos pais ro: tata posibil/mama posibila/parinti posibili ru: âîçìîæíûé îòåö/âîçìîæíàÿ ìàòü/âîçìîæíûå ðîäèòåëè sl: mo¾en oèe/mo¾na mati/mo¾ni star¹i sv: möjlig far/möjlig mor/möjliga föräldrar candidate son/candidate daughter/candidate child af: moontlike seun/moontlike dogter/moontlike kind bg: âúçìîæåí ñèí/âúçìîæíà äúùåðÿ/âúçìîæíî äåòå br: a c'hell bezañ mab/a c'hell bezañ merc'h/ a c'hell bezañ bugel ca: possible fill/possible filla/possible fill(a) cs: pravdìpodobný syn/pravdìpodobná dcera/pravdìpodobné dítì da: mulig søn/mulig datter/muligt barn de: möglicher Sohn/mögliche Tochter/mögliches Kind en: candidate son/candidate daughter/candidate child eo: ebla filo/ebla filino/eblaj idoj es: hijo posible/hija posible/hijo(a) posible et: oletatav poeg/oletatav tütar/oletatav laps fi: mahdollinen poika/mahdollinen tytär/mahdollinen lapsi fr: fils possible/fille possible/enfant possible he: áï àôùøé/ áú àôùøéú/ éìã àôùø is: sennilega sonur/sennilega dóttir/sennilega barn it: figlio presunto/figlia presunta/figlio presunto lv: iespçjamais dçls/iespçjamâ meita/iespçjamais bçrns nl: kandidaat zoon/kandidaat dochter/kandidaat kind no: mulig sønn/mulig datter/mulig barn pl: prawdopodobny syn/prawdopodobna córka/prawdopodobne dzieci pt: suposto filho/suposta filha/supostos filhos ro: fiu posibil/fica posibila/copil posibil ru: âîçìîæíûé ñûí/âîçìîæíàÿ äî÷ü/âîçìîæíûé ðåáåíîê sl: mo¾en sine/mo¾na hèerka/mo¾ni otroci sv: möjlig son/möjlig dotter/möjliga barn cannot access base af: databasis ontoeganklik bg: íÿìà äîñòúï äî áàçàòà br: n'eus tu ebet da vont e-barzh an bon roadoù ca: impossible accedir a la base cs: databáze je nepøístupná da: kan ikke nå databasen de: Datenbank nicht erreichbar en: cannot access base eo: ne eblas eniri la bazon es: acceso a la base imposible et: ei saa pöörduda andmebaasi poole fi: tietokantaan ei pääse fr: impossible d'accéder à la base he: àéï ëðéñä ìîàâø äîéãò is: get ekki tengst gagnagrunni it: accesso alla base impossibile lv: nav iespçjams piekïût datu bâzei nl: geen toegang tot bestand no: kan ikke nå databasen pl: dostêp do bazy jest niemo¿liwy pt: não se pode aceder à base pt-br: não pode acessar a base ro: nu pot accesa baza de date ru: íåò äîñòóïà ê áàçå sl: baza podatkov ni dostopna sv: kan inte nå databasen cannot change sex of a married person af: kan die geslag van 'n getroude persoon nie verander nie bg: íå ìîæå äà ñå ïðîìåíè ïîëúò íà ÷îâåê â áðàê br: n'heller ket kemm reizh unan euredet ca: no es pot canviar el sexe d'una persona casada cs: nemohu zmìnit pohlaví ¾enatého mu¾e/nemohu zmìnit pohlaví vdané ¾eny da: kan ikke ændre køn for en gift person de: kann das Geschlecht einer verheirateten Person nicht ändern en: cannot change sex of a married person eo: ne eblas aliigi sekson de edzigxinta persono es: no puede modificarse el sexo de una persona casada et: ei saa muuta abiellunud inimese sugu fi: et voi vaihtaa naimisissa olevan henkilön sukupuolta fr: on ne peut pas changer le sexe d'une personne mariée he: àéï àôùøåú ìùðåú îéï ùì àãí ðùåé is: getur ekki breytt kyni giftrar manneskju it: non si può cambiare il sesso di una persona sposata lv: precçtai personai nevar mainît dzimumu nl: kan het geslacht van een gehuwd persoon niet veranderen no: kan ikke endre kjønn til en gift person pl: zmiana p³ci osoby pozostaj±cej w zwi±zku ma³¿eñskim jest niemo¿liwa pt: não se pode modificar o sexo de uma pessoa casada ro: nu pot schimba sexul unei persoane casatorite ru: íåëüÿ èçìåíèòü ïîë ñóïðóãà sl: ne da se spremeniti spol poroèene osebe sv: kan inte ändra kön på en gift person change children's names af: verander kinders se name bg: äà ñå ïðîìåíè èìå íà äåòå br: kemm anvioù ar vugale ca: canviar els noms dels fills cs: zmìnit jména dìtí da: ændre børns navne de: Namen der Kinder ändern en: change children's names eo: sxangxi nomojn de la idoj es: cambiar los nombres de los hijos et: muuda laste nimed fi: muuta lasten nimiä fr: changer noms des enfants he: òãëï ùîåú äéìãéí is: breyta nafni barna it: cambiare i nomi dei figli lv: mainît bçrnu vârdus nl: namen van kinderen wijzigen no: endre barnas navn pl: zmieñ imiona dzieci pt: alterar os nomes dos filhos ro: schimba numele copiilor ru: èçìåíåíèå èìåíè ðåáåíêà sl: spremeni imena otrok sv: ändra barnens namn change it (the number) yourself af: verander dit self bg: ïðîìåíåòå ñàìè íîìåðà br: dibabit un niver all ca: elegiu-ne un altre cs: zmìnit èíslo da: vælg et andet de: ändere die Nummer selbst en: change it yourself eo: kaj sxangxu ion mem es: escoja otro et: muuda number ise fi: muuta se itse fr: choisissez-en un autre he: åìùðåú áòöîê is: og breyttu því sjálf(ur) it: scieglietene un'altro lv: nomainiet to nl: verander het nummer zelf no: endre det selv pl: zmieñ numer w³asnorêcznie pt: escolha outro ro: schimba numarul tu insasi ru: èçìåíèòå åãî ñàìè sl: spremenite sami sv: ändra det själv changed order of children af: verander die volgorde van kinders bg: ïðîìÿíà â ïîñëåäîâàòåëíîñòòà íà äåöàòà br: kemm urzh ar vugale ca: canvi de l'ordre dels fills cs: zmìnit poøadí dìtí da: ændret rækkefølge for børn de: Reihenfolge der Kinder gewechselt en: changed order of children eo: sxangxo de la ordo de la idoj es: cambio del orden de los hijos et: laste järjekord muudetud fi: lasten järjestystä on muutettu fr: changement de l'ordre des enfants he: ñãø äéìãéí äùúðä is: breytti röð barna it: ordine dei figli cambiato lv: mainît bçrnu secîbu nl: volgorde van de kinderen veranderd no: rekkefølgen er endret for barna til pl: kolejno¶æ dzieci zosta³a zmieniona pt: mudar a ordem dos filhos ro: sa schimbat ordinea copiilor ru: èçìåíÿþùèé ïîðÿäîê äåòåé sl: zamenjan vrstni red otrok sv: ändrade ordningen för barnen child/children af: kind/kinders bg: äåòå/äåöà br: bugel/bugale ca: fill/fills cs: dítì/dìti da: barn/børn de: Kind/Kinder en: child/children eo: ido:a:+n/idoj:a:+n es: hijo/hijos et: laps:g:+e/lapsed fi: lapsi/lapset fr: enfant/enfants he: éìã/ éìãéí is: barn/börn it: figlio/figli lv: bçrns:a:-u/bçrni nl: kind/kinderen no: barn/barn pl: dziecko/dzieci pt: filho/filhos ro: copil/copii ru: ðåáåíîê:g:--êà:a:--êà/äåòè sl: otrok/otroci sv: barn/barn zh: ×ÓÅ® children's names changed af: kinders se name is verander bg: èìåòî íà äåòåòî å ïðîìåíåíî br: anvioù ar vugale a zo kemmet ca: noms dels fills canviats cs: jména dìtí zmìnìna da: børns navne ændret de: Namen der Kinder geändert en: children's names changed eo: nomoj de la idoj sxangxitaj es: nombres de los hijos cambiados et: laste nimed muudetud fi: lasten nimiä on muutettu fr: noms des enfants changés he: ùîåú äéìãéí äåçìôå is: nafni barns breytt it: nomi dei figli cambiati lv: bçrnu vârdi mainîti nl: namen van kinderen gewijzigd no: barnas navn er endret pl: imiona dzieci zosta³y zmienione pt: nomes das crianças foram alterados ro: numele copiilor sa schimbat ru: èìÿ ðåáåíêà èçìåíåíî sl: spremenjena imena otrok sv: barnens namn ändrade click af: druk bg: ùðàêíåòå br: klikit ca: premeu cs: kliknìte da: klik de: klicke en: click eo: kliku es: cliquear et: klõpsa fi: klikkaa fr: cliquez he: ìçõ is: Ýtið it: seleziona lv: spiest nl: klik no: klikk pl: kliknij pt: clicar ro: clic ru: íàæìèòå sl: kliknite sv: klicka click on "%s" af: druk "%s" bg: ùðàêíåòå íà "%s" br: klikit war "%s" ca: premeu sobre "%s" cs: kliknìte "%s" da: klik "%s" de: klicke auf "%s" en: click on "%s" eo: kliku "%s" es: cliquear "%s" et: klõpsa "%s" fi: klikkaa "%s" fr: cliquez sur "%s" he: ìçõ "%s" is: Ýtið "%s" it: seleziona "%s" lv: spiest "%s" nl: klik "%s" no: klikk "%s" pl: kliknij "%s" pt: clicar "%s" ro: clicheaza pe %s ru: íàæìèòå "%s" sl: kliknite na "%s" sv: klicka "%s" color af: kleur bg: öâÿò br: liv ca: color cs: barva da: farve de: Farbe en: colour en-us: color eo: koloro es: color et: värv fi: väri fr: couleur he: öáò is: litur it: colore lv: krâsa nl: kleur no: farge pl: kolor pt: côr ro: culoare ru: öâåò sl: barva sv: färg comment af: kommentaar bg: êîìåíòàð br: addispleg ca: comentari cs: komentáø da: kommentar de: Kommentar en: comment eo: komento:a:+n es: comentario et: kommentaar fi: huomautus fr: commentaire he: äòøä is: athugasemd it: commento lv: piebilde nl: commentaar no: kommentar pl: uwagi pt: comentário ro: comentar ru: êîììåíòàðèé sl: komentar sv: kommentar connections bg: ïîòðåáèòåëñêè âðúçêè da: forbindelser de: Verbindungen en: connections es: conexiones et: ühendused fi: yhteyksien määrä fr: connexions it: connessioni nl: connecties pl: po³±czenie pt: conexões sl: povpreèna starost ob smrti sv: kopplingar consanguinity af: bloedverwantskap bg: êðúâíî ðîäñòâî br: kenwadelezh ca: consanguinitat cs: pokrevenství da: blodsslægtskab de: Blutsverwandtschaft en: consanguinity eo: samsangeco es: consanguinidad et: veresugulus fi: verisukulaisuus fr: consanguinité he: ÷åñðâååéðéåú is: skyldleiki it: consanguineità lv: asinsradniecîba nl: bloedverwantschap no: blodsbånd pl: pokrewieñstwo pt: consanguinidade ro: consanguinitate ru: ðîäñòâî sl: krvno sorodstvo sv: blodsband continue merging af: gaan voort met die samevoeging bg: äà ïðîäúëæè îáåäèíÿâàíåòî br: derc'hel da gendeuziñ ca: continuar la fusió cs: pokraèovat ve spojování da: fortsæt sammenføjning de: Zusammenführung fortsetzen en: continue merging eo: daùrigu la kunigxon es: continuar la fusión et: jätka ühendamist fi: jatka yhdistämistä fr: continuer à fusionner he: ìäîùéê ìàçã is: halda áfram að sameina it: continua la fusione lv: turpinât apvienoðanu nl: doorgaan met samenvoegen no: fortsett sammenslåing pl: kontynuuj scalanie pt: continuar a fusão ro: continua unificarea ru: ïðîäîëæèòü îáúåäèíåíèå sl: nadaljuj z zdru¾evanjem sv: fortsätt slå samman continued bg: ñëåäâà da: fortsat de: fortgesetzt en: continued es: continúa fr: suite it: continua nl: vervolgd pl: ci±g dalszy pt: continuação sl: nadaljevano sv: forts cousins af: neefs/niggies bg: ïúðâè áðàòîâ÷åäè br: kendirvi ca: cosins cs: bratranci/sestøenice da: fætre og kusiner de: Cousins en: cousins eo: gekuzoj es: primos et: nõod fi: serkut fr: cousins he: áðé ãåãéí is: systkynabörn it: cugini lv: brâlçni/mâsîcas nl: neven en nichten no: fettere og kusiner pl: kuzyni/kuzynki pt: primos ro: veri ru: êóçåíû sl: bratranci/sestriène sv: kusiner cousins (general term) af: neefs en niggies bg: áðàòîâ÷åäè br: kendirvi ca: cosins cs: pokrevní pøíbuzní da: fætre og kusiner de: Cousins en: cousins eo: gekuzoj es: primos et: kaimud fi: serkuksia fr: cousins he: áðé ãåãéí is: frændfólk it: cugini lv: brâlçni/mâsîcas nl: neven en nichten no: søskenbarn og flermenninger pl: kuzyni pt: primos ro: veri ru: êóçåíû sl: bratranci/sestriène sv: kusiner och flermänningar create af: skep bg: äà ñå ñúçäàäå br: sevel ca: crear cs: vytvoøit da: opret de: erzeugen en: create eo: krei es: crear et: loo fi: luo fr: créer he: òùä is: búa til it: creare lv: izveidot nl: aanmaken no: opprett pl: utwórz pt: criar ro: creaza ru: ñîçäàòü sl: ustvari sv: skapa cremated af: veras bg: êðåìèðàí/êðåìèðàíà br: devet ca: incinerat/incinerada/incinerat(ada) cs: zpopelnìn/zpopelnìna da: bisat de: eingeäschert en: cremated eo: cindrigita es: incinerado/incinerada/incinerado(a) et: kremeeritud fi: polttohaudattu fr: incinéré/incinérée/incinéré(e) he: ðùøôä âååééä is: brennd(ur) it: cremato/cremata/cremato(a) lv: kremçts(a) nl: gecremeerd no: kremert pl: kremacja pt: cremado/cremada/cremado(a) ro: incinerat/incinerata/incinerati ru: êðåìèðîâàí/êðåìèðîâàíà sl: ustvarjeno sv: kremerad database forum af: databasis forum bg: ôîðóì íà áàçàòà îò äàííè br: forum ar bon roadoù ca: fòrum de la base de dades cs: databázové fórum da: database-forum de: Datenbankforum en: database forum eo: datenbankforumo es: foro de la base de datos et: andmebaasi foorum fi: tietokantafoorumi fr: forum de la base de données he: ãééåï òì îàâø äîéãä äúåìãåúé is: umræður it: forum della base di dati lv: datu bâzes "ziòojumu dçlis" nl: databank forum no: database forum pl: forum bazy pt: fórum da base de dados ro: forumul basei de date ru: ôîðóì áàçû äàííûõ sl: forum baze podatkov sv: databas forum date af: datum bg: äàòà br: deiziad ca: data cs: datum da: dato de: Datum en: date eo: dato es: fecha et: kuupäev fi: päivämäärä fr: date he: úàøéê is: dagsetning it: data lv: datums nl: datum no: dato pl: data pt: data ro: data ru: äàòà sl: datum sv: datum days old af: dae oud bg: äíè br: deiz ca: dies cs: dnù starý/dnù stará da: dage gammel de: Tage alt en: days old eo: tagoj es: días et: päeva fi: päivää vanha fr: jours he: éîéí is: daga gamall it: giorni lv: dienas vecs nl: dagen oud no: dager gammel pl: dni pt: dias ro: zile ru: ëåò sl: dni star/dni stara sv: dagar death af: oorlede bg: ñìúðò br: marv ca: defunció cs: úmrtí da: død de: Tod en: death eo: morto es: muerte et: surm fi: kuolema fr: décès he: îååú is: látin(n) it: morte lv: nâve nl: overleden no: død pl: zgon pt: morte ro: deces ru: ñìåðòü sl: smrti sv: död delete af: verwyder bg: äà íÿìà br: lemel ca: esborrar cs: smazat da: slet de: löschen +before en: delete eo: detrui :a: es: borrar et: kustuta fi: poista fr: supprimer he: îçé÷ä is: eyða it: cancellare lv: izmest :a: nl: verwijderen +before no: fjern pl: usuñ :a: pt: apagar ro: sterge ru: óäàëèòü :a: sl: izbri¹i sv: ta bort descendants af: Afstammelinge bg: ïîòîìöè br: diskennidi ca: descendents cs: potomci da: efterkommere de: Nachkommen en: descendants eo: posteuloj es: descendientes et: järeltulijad fi: jälkeläisiä fr: descendants he: öàöàéí is: afkomendur it: discendenti lv: pçcteèi nl: afstammelingen no: etterkommere pl: potomkowie pt: descendentes ro: descendenti ru: ïîòîìêè sl: potomci sv: ättlingar zh: ºó´ú died af: oorlede bg: ïî÷èíàë/ïî÷èíàëà/ïî÷èíàë(à) br: marvet ca: mort/morta/mort(a) cs: zemøel/zemøela/zemøeli da: død de: verstorben en: died eo: mortinta es: fallecido/fallecida/fallecido(a) et: surnud fi: kuollut fr: décédé/décédée/décédé(e) he: ðôèø/ ðôèøä is: dó it: deceduto/deceduta/deceduto(a) lv: mirðanas nl: gestorven no: død pl: zmar³/zmar³a/zgon pt: falecido/falecida/falecido(a) ro: a decedat ru: óìåð/óìåðëà sl: umrl/umrla sv: död zh: ËÀ died young af: jonk oorlede bg: ïî÷èíàë ìëàä/ïî÷èíàëà ìëàäà/ïî÷èíàë(à) ìëàä(à) br: marvet ent-yaouank ca: mort jove/morta jove/mort(a) jove cs: zemøel mladý/zemøela mladá/zemøeli mladí da: død som ung de: jung gestorben en: died young eo: june mortinta es: muerto joven/muerta joven/muerto(a) joven et: suri noorelt fi: kuollut nuorena fr: mort jeune/morte jeune/mort(e) jeune he: ðôèø áâéì öòéø/ ðôèøä áâéì öòéø is: dó ung(ur) it: morto giovane lv: miris jauns nl: jong gestorven no: død ung pl: zmar³ m³odo/zmar³a m³odo/zm.m³odo pt: morreu jovem ro: a decedat tinar ru: óìåð â äåòñòâå sl: umrl mlad/umrla mlada/umrl(a) mlad(a) sv: dog ung disappeared af: verdwyn bg: èç÷åçíàë/èç÷åçíàëà/èç÷åçíàë(à) br: steuzet ca: desaparegut/desapareguda/desaparegut(uda) cs: zmizel/zmizela/zmizeli da: forsvundet de: verschollen en: disappeared eo: malaperita es: desaparecido/desaparecida/desaparecido(a) et: kadunud fi: kadonnut fr: disparu/disparue/disparu(e) he: ðòìí/ ðòìîä is: hvarf it: scomparso/scomparsa/scomparso(a) lv: pazudis(usi) bez vçsts nl: vermist no: forsvunnet pl: zagin±³/zaginê³a/zaginiêcie pt: desaparecido/desaparecida/desaparecido(a) ro: a disparut ru: èñ÷åç/èñ÷åçëà sl: izginil/izginila/izginil(a) sv: försvunnen disconnect bg: äà ñå ïðåêúñíå âðúçêàòà da: afbryd de: abmelden en: disconnect es: desconectar fr: déconnecter nl: ontkoppelen pt: desconectar ro: deconectare sl: prekinjeno sv: koppla från display by slices/slice width/overlap/total width af: weergawe per gedeelte/gedeelte breedte/oorvleul/totale breedte bg: äà ñå ïîêàæå íà ÷àñòè/øèðî÷èíà íà ÷àñòèòå/çàñòúïâàíå/îáùà øèðî÷èíà br: diskouez dre rannnoù/ledander ar rann/etrekolonennadur/ledander en holl ca: visualitzar per seccions/llargada de la secció/encavalcament/llargada total cs: zobraz po segmentech/¹íøka segmentu/pøekrytí/celková ¹íøka da: vis ved delte sider/sidebredde/overlapning/total bredde de: Anzeige in Segmenten/Segmentbreite/Überlappung/Gesamtbreite en: display by slices/slice width/overlap/total width eo: montro intervale/amplekso de la intervalo/supermeto/tutamplekso es: mostrar en segmentos/ancho de segmento/superpuesto/ancho total et: kuva osadena/osa laius/ülekate/kogulaius fi: näytä jaettuna kaistoihin/kaistan leveys/ylitys/koko leveys fr: affichage par tranches/largeur de la tranche/chevauchement/largeur totale he: äöâ øöåòåú / øåçá øöåòåú / çôéôä / ñ"ä øåçá is: sýnt í hlutum/breidd hlutans/skörun hlutanna/öll breiddin it: visualizzare per segmenti/larghezza del segmento/sovrapposizione/larghezza totale lv: râdît pa loksnçm/loksnes platums/pârklâjums/kopçjais platums nl: weergave per segment/segmentbreedte/overlapping/totale breedte no: vis med delte sider/valgt sidebredde/valgt overlapping/global bredde pl: wy¶wietl w segmentach/szeroko¶æ segmentu/szeroko¶æ pokrywania siê/szeroko¶æ ca³kowita pt: resultados por fracções/largura da fracção/sobreposição/largura total ro: resultat segmentat/largimea segmentului/acoperire/largimea totala ru: îòîáðàæàòü ÷àñòàìè/øèðèíà ÷àñòè/ïåðåêðûòèå/îáùàÿ øèðèíà sl: prika¾i s pomoèjo izsekov/¹irina izseka/prekrivanje/skupna ¹irina sv: visa genom att dela sidan/sidbredd/överlappning/global bredd divorce af: geskei bg: ðàçâîä br: dibriedelezh ca: divorci cs: rozvod da: skilsmisse de: Scheidung en: divorce eo: eksedzigxo es: divorcio et: lahutus fi: avioero fr: divorce he: âéøåùéï is: skilja it: divorzio lv: ðíirðanâs nl: scheiding no: skilsmisse pl: rozwód pt: divórcio ro: divort ru: ðàçâîä sl: loèitev sv: skilsmässa divorced af: geskei bg: ðàçâåäåíè br: dibriedet ca: divorciats cs: rozvedeni da: skilt de: geschieden en: divorced eo: eksedzigxintaj es: divorciados et: lahutatud fi: eronneet fr: divorcés he: âøåùéí is: skildi it: divorziati lv: ðíîruðies nl: gescheiden no: skilt pl: rozwiedzeni pt: divorciados ro: divortati ru: â ðàçâîäå sl: loèena sv: skilda don't group the common branches together af: moet nie takke van ooreenstemende oorsprong saamvoeg nie bg: äà íå ñå îáåäèíÿâàò îáùèòå êëîíîâå br: n'eo ket dav kendastum ar skourroù boutin ca: no reagrupar les branques comunes cs: nespojovat spolecné vetve da: slå ikke fælles anelinier sammen de: gemeinsame Zweige nicht zusammenfassen en: don't group the common branches together eo: ne grupigu la brancxojn komunajn es: no agrupar las ramas comunes et: ära grupeeri ühiseid harusid fi: ei yhteisten sukuhaarojen ryhmittelyä fr: ne pas regrouper les branches communes he: ìà ìùìá òðôé îùôçä îùåúôéí is: ekki slá saman sameiginlegum ættingjum it: non raggruppare i rami comuni lv: negrupçt kopçjos zarus kopâ nl: voeg de gemeenschappelijke takken niet samen no: sammenfallende anelinjer skal ikke slås sammen pl: nie grupuj wspólnych linii razem pt: não reagrupar os ramos comuns ro: nu grupa ramuri comune inpreuna ru: íå ãðóïïèðîâàòü îñíîâíûå âåòâè âìåñòå sl: ne zbiraj skupnih vej sv: gruppera inte ihop de gemensamma anlinjerna don't know af: onbekend bg: íå ñå çíàå br: n'ouzon ca: no se sap cs: není známo da: ved ikke de: unbekannt en: don't know eo: ne scias es: desconocido et: pole teada fi: ei tiedossa fr: ne sais pas he: ìà éåãò is: veit ekki it: non si sa lv: nav zinâms nl: onbekend no: ukjent pl: nie wiadomo pt: não sei ro: nu stiu ru: íå èçâåñòåí sl: ni znano sv: vet ej end af: einde bg: êðàé br: echu eo ca: fi cs: konec da: ophør de: Ende en: end eo: fino es: fin et: lõpp fi: loppu fr: fin he: ñåó is: endar it: fine lv: beigas nl: einde no: slutt pl: koniec pt: fim ro: sfirsit ru: êîí÷àÿ sl: konec sv: slutar engaged af: verloof bg: ñãîäåíè br: dimezet ca: promesos cs: snoubenci da: forlovet de: verlobt en: engaged eo: gefiancxigintaj es: comprometidos et: kihlatud fi: kihloissa fr: fiancés he: îàåøñéí is: trúlofuð it: fidanzati lv: saderinâti nl: verloofd no: forlovet pl: zarêczyny pt: Noivos ro: logodit ru: ïîìîëâëåíû sl: zaroka sv: förlovad engaged%t to af: verloof%t aan bg: ñãîäåí%t ñ/ñãîäåíà%t ñ br: dimezet%t gant ca: promès%t amb/promesa%t amb cs: zasnoubený s/zasnoubená s da: forlovet%t med de: verlobt%t mit en: engaged%t to eo: fiancxigita%t kun/fiancxinigita%t kun es: comprometido%t con/comprometida%t con et: kihlatud%t fi: kihlattu%t fr: fiancé%t avec/fiancée%t avec he: äúàøñ %t òí/ äúàøñä %t òí is: trúlofaðist%t it: fidanzato%t con/fidanzata%t con lv: saderinâts%t ar nl: verloofd%t met no: forlovet%t med pl: zarêczony%t z:/zarêczona%t z: pt: noivo%t de/noiva%t de ro: logodit%t cu/logodita%t cu ru: %t ïîìîëâëåí ñ sl: zaroèen z %/zaroèena z sv: förlovad%t med error af: fout bg: ãðåøêà br: fazi ca: error cs: chyba da: fejl de: Fehler en: error eo: eraro es: error et: viga fi: virhe fr: erreur he: ùâéàä is: villa it: errore lv: kïûda nl: fout no: feil pl: b³±d pt: erro ro: eroare ru: îøèáêà sl: napaka sv: fel estate af: landgoed bg: ìåñòîóêàçàíèå êúì òèòëàòà br: domani ca: lloc cs: místo da: ophav de: Ort en: estate eo: nobelbieno es: lugar et: valdus fi: paikka fr: domaine he: î÷åí is: staður it: luogo lv: îpaðums nl: plaats no: sted pl: domena pt: lugar pt-br: localidade ro: localitate ru: ìåñòî sl: posestvo sv: plats zh: µØµã exact af: presies bg: òî÷íî br: rik-ha-rik ca: exacte cs: pøesnì da: nøjagtigt de: genau en: exact eo: korekta es: exacto et: täpselt fi: tarkka fr: exact he: îãåé÷ is: nákvæmlega it: esatto lv: tieðs nl: precies no: eksakt pl: dok³adnie pt: exacta pt-br: exata ro: exact ru: â òî÷íîñòè sl: toèno sv: exakt executed (legally killed) af: teregsgestel bg: åêçåêóòèðàí/åêçåêóòèðàíà/åêçåêóòèðàí(à) br: lakaet d'ar marv ca: executat/executada/executat(ada) cs: popraven da: henrettet de: hingerichtet en: executed eo: ekzekutita es: ejecutado/ejecutada/ejecutado(a) et: hukatud fi: teloitettu fr: exécuté/exécutée/exécuté(e) he: äåöà ìäåøâ/ äåöàä ìäåøâ is: líflátin(n) it: giustiziato/giustiziato/giustiziato(a) lv: sodîts(a) ar nâvi nl: geëxecuteerd no: henrettet pl: egzekucja pt: executado/executada/executado(a) ro: executat ru: êàçíåí/êàçíåíà sl: usmrèen/usmrèena/usmrèen(a) sv: avrättad families with encoding af: gekodeerde families bg: ñåìåéñòâà ñ êîäèðàíå br: tiegezhioù gant bonegadur ca: famílies amb codi cs: rodiny s kódy da: familier med kodning de: Familien mit Kodierung en: families with encoding eo: familioj kun kodajxo es: familias con código et: pered koos kodeeringuga fi: perheet koodeineen fr: familles avec codage he: îùôçåú òí ÷åãéí is: fjölskyldur með táknum it: famiglia con codice lv: ðifrçtâs ìimenes nl: gezinnen met code no: familier med kode pl: rodziny z kodowaniem pt: famílias com código ro: familie cu codare ru: ñåìåéíûå êîäû sl: dru¾ine s kodami sv: familjer med kod family added af: familie bygevoeg bg: cåìåéñòâîòî å äîáàâåíî br: tiegezh ouzhpennet ca: família afegida cs: rodina pøidána da: familie tilføjet de: Familie hinzugefügt en: family added eo: familio aldonita es: familia agregada et: pere lisatud fi: perhe lisätty fr: famille ajoutée he: îùôçä äåñôä is: fjölskyldu bætt við it: famiglia aggiunta lv: ìimene pievienota nl: gezin toegevoegd no: ny familie opprettet pl: rodzina zosta³a dodana pt: família adicionada ro: familie adaugata ru: cåìüÿ äîáàâëåííà sl: dru¾ina dodana sv: ny familj tillagd family deleted af: familie uitgevee bg: äàííèòå çà cåìåéñòâîòî ñà ïðåìàõíàòè br: tiegezh lamet ca: família esborrada cs: rodina smazána da: familie slettet de: Familie gelöscht en: family deleted eo: familio nuligita es: familia borrada et: pere kustutatud fi: perhe poistettu fr: famille supprimée he: îùôîä ðîç÷ä is: fjölskyldu eytt it: famiglia cancellata lv: ìimene izdzçsta nl: gezin verwijderd no: familie fjernet pl: rodzina zosta³a usuniêta pt: família suprimida ro: familie suprimata ru: cåìüÿ óäàëåíà sl: dru¾ina izbrisana sv: familj borttagen family modified af: familie verander bg: äàííèòå çà cåìåéñòâîòî ñà ïðîìåíåíè br: tiegezh kemmet ca: família modificada cs: rodina zmìnìna da: familie ændret de: Familie geändert en: family modified eo: familio modifita es: familia modificada et: pere muudetud fi: perhettä muutettu fr: famille modifiée he: îùôçä äòåãëðä is: fjölskyldu breytt it: famiglia modificata lv: ìimene labota nl: gezin veranderd no: familie endret pl: rodzina zosta³a zmodyfikowana pt: família modificada ro: familie modificata ru: cåìüÿ èçìåíåíà sl: dru¾ina spremenjena sv: familj ändrad family/families af: familie/families bg: äàííè çà ñåìåéñòâîòî br: tiegezh/tiegezhioù ca: família/famílies cs: rodina:a:-u/rodiny da: familie/familier de: Familie/Familien en: family/families eo: familio:a:+n/familioj:a:+n es: familia/familias et: pere/pered fi: perhe/perheet fr: famille/familles he: îùôçä/ îùôçåú is: fjölskyldu/fjölskyldum it: famiglia/famiglie lv: ìimeni/ìimenes nl: gezin/gezinnen no: familie/familier pl: rodzina:a:-ê/rodziny pt: família/famílias ro: familie/fmalilii ru: ñåìüÿ:a:-þ:g:-è/ñåìüè sl: dru¾ina/dru¾ine sv: familj/familjer father/mother af: vader/moeder bg: áàùà/ìàéêà br: tad/mamm ca: pare/mare cs: otec/matka da: fader/moder de: Vater/Mutter en: father/mother eo: patro/patrino es: padre/madre et: isa/ema fi: isä/äiti fr: père/mère he: àá/ àí is: faðir/móðir it: padre/madre lv: tçvs/mâte nl: vader/moeder no: far/mor pl: ojciec/matka pt: pai/mãe ro: tata/mama ru: îòåö/ìàòü sl: oèe/mati sv: far/mor file af: lêer bg: ôàéë br: fichennaoueg ca: fitxer cs: soubor da: fil de: Datei en: file eo: sliparo es: fichero et: fail fi: tiedosto fr: fichier he: ÷åáõ is: skrá it: file lv: datne nl: bestand no: fil pl: plik pt: ficheiro pt-br: arquivo ro: fisier ru: ôàéë sl: datoteka sv: fil first free number af: eerste beskikbare nommer bg: ïðúâ ñâîáîäåí íîìåð br: niverenn frank kentañ ca: primer número lliure cs: první volné èíslo da: første ledige løbenummer de: erste freie Nummer en: first free number eo: unua dispona nombro es: primer número libre et: esimene vaba number fi: ensimmäinen vapaa numero fr: premier numéro libre he: äîñôø äçåôùé äøàùåï is: fyrsta lausa númer it: primo numero disponibile lv: pirmais brîvais skaitlis nl: eerste beschikbare nummer no: første ledige nummer pl: najni¿szy wolny numer pt: primeiro número livre ro: primul numar liber ru: ïåðâûé ñâîáîäíûé íîìåð sl: prva prosta ¹tevilka sv: första lediga nummer first name alias af: bynaam bg: äðóãî ñîáñòâåíî èìå br: lezanv ca: àlies del nom cs: alias køestního jména da: fornavns alias de: Vornamen-Alias en: first name alias eo: aliasa:a:+n propra:a:+n nomo:a:+n es: nombre alias et: muu eesnimi fi: muu etunimi fr: prénom alias he: ùí ôøèé àçø is: gælunafn á fornafni it: alias del nome lv: iesaukas vârds nl: alias voor voornaam no: alias fornavn pl: alias imienia pt: alias do nome pt-br: apelido do prenome ro: alias de prenume ru: èìÿ îò÷åñòâî sl: drugo osebno ime sv: förnamns alias first name missing af: voornaam ontbreek bg: ñîáñòâåíîòî èìå ëèïñâà br: raganv o tioueriñ ca: falta el nom cs: køestní jméno chybí da: fornavn mangler de: fehlender Vorname en: first name missing eo: propra nomo mankanta es: falta el nombre et: eesnimi puudub fi: etunimi puuttuu fr: prénom manquant he: ùí ôøèé çñø is: fornafn vantar it: manca il nome lv: trûkst vârda nl: voornaam ontbreekt no: fornavn mangler pl: brak imienia pt: falta o nome pt-br: falta o prenome ro: numele lipseste ru: èìÿ ïðîïóùåíî sl: manjka osebno ime sv: förnamn saknas first name not found af: voornaam nie gevind nie bg: ñîáñòâåíîòî èìå íå å íàìåðåíî br: n'eo ket bet kavet ar raganv ca: nom no localitzat cs: køestní jméno nebylo nalezeno da: fornavn ikke fundet de: Vorname nicht gefunden en: first name not found eo: propra nomo ne trovita es: nombre no encontrado et: eesnime ei leitud fi: etunimeä ei löydy fr: prénom pas trouvé he: ùí ôøèé ìà ðîöà is: fornafn finnst ekki it: nome non trovato lv: vârds nav atrasts nl: voornaam niet gevonden no: finner ikke fornavn pl: imiê nie zosta³o znalezione pt: nome não encontrado pt-br: prenome não encontrado ro: nu am gasit prenumele ru: èìÿ íå íàéäåííî sl: osebno ime ni najdeno sv: hittar inte förnamn first name/first names af: voornaam/voorname bg: ñîáñòâåíî èìå/ñîáñòâåíè èìåíà br: raganv/raganvioù ca: nom/noms cs: køestní jméno/køestní jména da: fornavn/fornavne de: Vorname/Vornamen en: first name/first names eo: propra nomo/propraj nomoj es: nombre/nombres et: eesnimi/eesnimed fi: etunimi/etunimet fr: prénom/prénoms he: ùí ôøèé/ ùîåú ôøèééí is: fornafn/fornöfn it: nome/nomi lv: vârds/vârdi nl: voornaam/voornamen no: fornavn/fornavn pl: imiê/imiona pt: nome/nomes pt-br: prenome/prenomes ro: prenume ru: èìÿ/èìåíà sl: osebno ime/osebna imena sv: förnamn/förnamn zh: Ãû for the first names by alphabetic order af: om die voorname in alfabetiese volgorde te kry bg: çà ñîáñòâåíèòå èìåíà ïî àçáó÷åí ðåä br: evit ar raganvioù dre urzh al lizherenneg ca: per veure els noms en ordre alfabètic cs: pro køestní jména v abecedním poøádku da: for fornavnene i alfabetisk orden de: für die Vornamen in alphabetischer Ordnung en: for the first names by alphabetic order eo: por la propraj nomoj laù la alfabeta ordo es: por los nombres en orden alfabético et: et järjestada eesnimed tähestiku järgi fi: etunimien mukaan aakkosjärjestyksessä fr: pour les prénoms par ordre alphabétique he: ìùîåú äôøèééí áñãø àìó-áú is: fornöfn í stafrófsröð it: per il primo nome in ordine alfabetico lv: pa vârdiem alfabçtiskâ kârtîbâ nl: voor de voornamen in alfabetische volgorde no: alfabetisk på fornavn pl: aby zobaczyæ imiona w porz±dku alfabetycznym pt: para obter os nomes próprios por ordem alfabética pt-br: para obter os prenomes por ordem alfabética ro: prenume in ordine alfabetica ru: ÷òîáû óïîðÿäî÷èòü èìåíà ïî àëôàâèòó sl: za lastna imena po abecednem redu sv: för förnamnen i bokstavsordning for the list ordered by the date of the last modification bg: çà ñïèñúêà ïî äàòè íà ïîñëåäíî èçìåíåíèå da: for en liste sorteret efter datoen for seneste ændring de: für eine, nach dem Datum der letzten Änderung geordnete Liste en: for the list ordered by the date of the last modification es: para la lista ordenada por fecha de la última modificación fr: pour la liste par date de dernière modification it: per la lista ordinata secondo la data dell'ultima modifica nl: voor de lijst, gesorteerd op datum van de laatste wijziging pl: aby ogl±daæ listê wed³ug daty ostatniej modyfikacji pt: para a lista ordenada por data da última modificação sl: za seznam razvr¹èen po datumu zadnje spremembe sv: för listan över sista ändringsdatum foster father/foster mother/foster parents af: pleegvader/pleegmoeder/pleegouers bg: íàñòîéíèê/íàñòîéíèöà/íàñòîéíèöè br: tad-mager/mamm-vagerezh/kerent magerien ca: pare adoptiu/mare adoptiva/pares adoptius cs: pìstoun/pìstounka/pìstouni da: plejefader/plejemoder/plejeforældre de: Pflegevater/Pflegemutter/Pflegeeltern en: foster father/foster mother/foster parents eo: nutrinta patro/nutrinta patrino/nutrintaj gepatroj es: padre tutelar/madre tutelar/padres tutelares et: kasuisa/kasuema/kasuvanemad fi: kasvatusisä/kasvatusäiti/kasvatusvanhemmat fr: père nourricier/mère nourricière/parents nourriciers he: àá çåøâ/ àí çåøâú/ äåøéí çåøâéí is: fóstur foreldri it: padre facente funzioni/madre facente funzioni/genitori facenti funzioni lv: audþu tçvs/mâte/vecâki nl: pleegvader/pleegmoeder/pleegouders no: fosterfar/fostermor/fosterforeldre pl: opiekun/opiekunka/opiekunowie pt: pai adoptivo/mãe adoptiva/pais adoptivos pt-br: pai de criação/mãe de criação/pais de criação ro: tata tutelar/mama tutelara/parinti tutelari ru: ïðèåìíûé îòåö/ïðèåìíàÿ ìàòü/ïðèåìíûé ðîäèòåëü sl: rejnik/rejnica/rejniki sv: fosterfar/fostermor/fosterföräldrar foster son/foster daughter/foster child af: pleegseun/pleegdogter/pleegkind bg: õðàíåíèê/õðàíåíèöà/õðàíåíèê èëè õðàíåíèöà br: mab desavet/merc'h desavet/bugel desavet ca: fill adoptiu/filla adoptiva/fills adoptius cs: schovanec/schovanka/schovanec da: plejesøn/plejedatter/plejebarn de: Pflegesohn/Pflegetochter/Pflegekind en: foster son/foster daughter/foster child eo: nutrita filo/nutrita filino/nutrita ido es: hijo acogido/hija acogida/niño(a) acogido(a) et: kasupoeg/kasutütar/kasulaps fi: kasvattipoika/kasvattitytär/kasvattilapsi fr: fils élevé/fille élevée/enfant élevé he: áï çåøâ/ áú çåøâú/ éìã çåøâ is: fóstur sonur/dóttir fóstur barn it: figlio allevato/figlia allevato/bambino allevato lv: audþu dçls/meita/bçrns nl: pleegzoon/pleegdochter/pleegkind no: fostersønn/fosterdatter/fosterbarn pl: wychowanek/wychowanica/wychowankowie pt: filho adoptivo/filha adoptiva/filho(a) adoptivo(a) pt-br: filho de criação/filha de criação/filho(a) de criação ro: fiu tutelar/fica/tutelara/copil tutelar ru: ïðèåìíûé ñûí/ïðèåìíàÿ äî÷ü/ïðèåìíûé ðåáåíîê sl: rejenec/rejenka/rejenec sv: fosterson/fosterdotter/fosterbarn generation/generations af: geslag/geslagte bg: ïîêîëåíèå/ïîêîëåíèÿ br: rummad-tud/rummadoù-tud ca: generació/generacions cs: generace da: generation/generationer de: Generation/Generationen en: generation/generations eo: generacio:a:+n/generacioj es: generación/generaciones et: sugupõlv/sugupõlved fi: sukupolvi/sukupolvea fr: génération/générations he: ãåø / ãåøåú is: kynslóð/kynslóðir it: generazione/generazioni lv: paaudzi/paaudzes nl: generatie/generaties no: generasjon/generasjoner pl: pokolenie/pokolenia pt: geração/gerações ro: generatie/generatii ru: ïîêîëåíèå/ïîêîëåíèé sl: generacija/generacije sv: generation/generationer godfather/godmother/godparents af: peetpa/peetma/peetouers bg: êðúñòíèê/êðúñòíèöà/êðúñòíèöè br: paeron/maeronez/paeron ha maeronez ca: padrí/padrina/padrins cs: kmotr/kmotra/kmotr a kmotra da: gudfader/gudmoder/gudfader og gudmoder de: Taufzeuge/Taufzeugin/Taufzeuge und Taufzeugin en: godfather/godmother/godparents eo: baptopatro/baptopatrino/gebaptopatroj es: padrino/madrina/padrinos et: ristiisa/ristiema/ristivanemad fi: kummisetä/kummitäti/kummit fr: parrain/marraine/parrain et marraine he: ñðã÷/ ñðã÷éú/ ñðã÷éí is: guðfaðir/guðmóðir/guðforeldrar it: padrino/madrina/padrini lv: krustçvs/krustmâte/krustvecâki nl: peter/meter/peetouders no: gudfar/gudmor/gudfedre pl: ojciec chrzestny/matka chrzestna/rodzice chrzestni pt: padrinho/madrinha/padrinhos ro: nas/nasa/nasi ru: êðåñòíûé îòåö/êðåñòíàÿ ìàòü/êðåñòíûé sl: boter/botra/botri sv: gudfar/gudmor/gudföräldrar godson/goddaughter/godchild af: peetseun/peetdogter/peetkind bg: êðúùåëíèê/êðúùåëíèöà/êðúùåëíèê èëè êðúùåëíèöà br: filhor/filhorez/filhor(ez) ca: fillol/fillola/fillol(a) cs: kmotøenec/kmotøenka/kmotøenec da: gudsøn/guddatter/gudbarn de: Patensohn/Patentochter/Patenkind en: godson/goddaughter/godchild eo: baptofilo/baptofilino/baptofil(in)o es: ahijado/ahijada/ahijado(a) et: ristipoeg/ristitütar/ristilaps fi: kummipoika/kummityttö/kummilapsi fr: filleul/filleule/filleul(e) he: áï ñðã÷àåú/ áú ñðã÷àåú/ éìã ñðã÷àåú is: guðsonur/guðdóttir/guðbarn it: figlioccio/figlioccia/figlioccio lv: krustdçls/krustmeita/krustbçrns nl: peetzoon/peetdochter/petekind no: gudsønn/guddatter/gudbarn pl: chrze¶niak/chrze¶niaczka/chrze¶niak pt: afilhado/afilhada/afilhado(a) ro: finu/fina/finii ru: êðåñòíèê/êðåñòíèöà/êðåñòíèê sl: kr¹èenec/kr¹èenka/kr¹èenci sv: gudson/guddotter/gudbarn grand-parents af: grootouers bg: äÿäî è áàáà br: an dud-kozh ca: avis cs: prarodièe da: bedsteforældre de: Großeltern en: grand-parents eo: geavoj es: abuelos et: vanavanemad fi: isovanhemmat fr: des grands-parents he: ñáéí is: afi og amma it: nonni lv: vecvecâki nl: grootouders no: besteforeldre pl: dziadkowie pt: avós ro: bunici ru: ïðàðîäèòåëè sl: stari star¹i sv: farföräldrar/morföräldrar great-grand-parents af: oorgrootouers bg: ïðàäÿäî è ïðàáàáà br: an dud-kuñv ca: besavis cs: praprarodièe da: oldeforældre de: Urgroßeltern en: great-grand-parents eo: gepraavoj es: bisabuelos et: vanavanavanemad fi: iso-isovanhemmat fr: des arrière-grands-parents he: øá-ñáéí is: langafi og langamma it: bisnonni lv: vecvecvecâki nl: overgrootouders no: oldeforeldre pl: pradziadkowie pt: bisavós ro: strabunici ru: ïðàïðàðîäèòåëè sl: prastari star¹i sv: gammel-farföräldrar/gammel-morföräldrar gregorian/julian/french/hebrew af: gregoriaans/juliaans/frans/hebreeus bg: ïî íîâ ñòèë/ïî ñòàð ñòèë/ôðåíñêè/åâðåéñêè br: gregorian/juluan/republikan/hebrean ca: gregorià/julià/francès/hebreu cs: gregoriánský/juliánský/francouzský/¾idovský da: gregoriansk/juliansk/fransk rep./jødisk de: Gregorianisch/Julianisch/Französisch/Hebräisch en: Gregorian/Julian/French/Hebrew eo: gregoriana/juliana/franca/hebra es: gregoriano/juliano/francés/hebreo et: gregooriuse/juuliuse/prantsuse revolutsiooni/juudi fi: gregoriaaninen/juliaaninen/Ranskan vallankumouksen/heprealainen fr: grégorien/julien/républicain/hébreu he: âøâåøé/ éåìéàðé/ öøôúé/ òáøé is: gregorísk/julian/franskt/hebreskt it: gregoriano/giuliano/francese/ebraico lv: gregoriâòu/jûlija/franèu/senebreju nl: gregoriaans/juliaans/Frans/Hebreeuws no: gregoriansk/juliansk/fransk rep./jødisk pl: gregoriañski/juliañski/rewolucyjny francuski/hebrajski pt: gregoriano/juliano/francês/hebraico ro: gregorian/julian/francez/evreiesc ru: ãðåãîðèàíñêèé/þëèàíñêèé/ôðàíöóçñêèé/åâðåéñêèé sl: gregorijanski/julijanski/francoski/hebrejski sv: gregoriansk/juliansk/franska rep./hebreisk happy birthday to you! af: Geluk met jou verjaarsdag! bg: ×åñòèò ðîæäåí äåí! br: kalz a vloavezhioù all deoc'h! ca: per molts anys cs: v¹echno nejlep¹í k narozeninám! da: til lykke med fødselsdagen! de: Herzlichen Glückwunsch zum Geburtstag! en: happy birthday to you! eo: felicxan datrevenon! es: ¡Feliz cumpleaños! et: palju õnne sünnipäevaks! fi: hyvää syntymäpäivää! fr: bon anniversaire! he: éåí äåìãú ùîç is: til hamingju með afmælið ! it: buon compleanno! lv: Laimîgu dzimðanas dienu! nl: van harte gefeliciteerd met Uw verjaardag! no: gratulerer med dagen! pl: wszystkiego najlepszego w dniu urodzin! pt: feliz aniversário! ro: la multi ani! ru: ñ äíåì ðîæäåíèÿ òåáÿ! sl: sreèen rojstni dan! sv: gratulerar på födelsedagen! having as children af: met as kinders:- bg: äåöà: br: anezho ez eo bet ganet bugale ca: fills: cs: mìli spolu dìti da: børn de: mit en: with eo: havis ido(j)n es: con et: lapsed fi: lapset fr: dont he: òí éìãéí is: börn it: da cui lv: bçrni: nl: en hun kinderen: no: barn pl: dzieci: pt: tiveram ro: cu copii ru: èìåëè äåòåé sl: otroci: sv: barn zh: ÉúÓÐ×ÓÅ® here af: hier bg: òóê br: amañ ca: aquí cs: zde da: her de: hier en: here eo: tie es: aquí et: siia fi: tässä fr: ici he: ëàï is: hér it: qui lv: ðeit nl: hier no: her pl: tutaj pt: aqui ro: aici ru: çäåñü sl: tukaj sv: här him/her af: sy/haar bg: ìúæ/æåíà br: eñ/hi ca: ell/ella cs: on/ona da: han/hun de: er/sie en: him/her eo: li/sxi es: él/ella et: mees/naine fi: mies/nainen fr: lui/elle he: àåúå/ àåúä is: hans/hennar it: lui/lei lv: viòam/viòai nl: zijn/haar no: han/henne pl: on/ona pt: ele/ela ro: el/ea ru: îí/îíà sl: on/ona sv: honom/henne history of updates af: bywerkingsgeskiedenis bg: èñòîðèÿ íà èçìåíåíèÿòà br: dezrevell an hizivadurioù ca: històric de les actualitzacions cs: historie zmìn da: opdateringers historie de: Chronik der Aktualisierungen en: history of updates eo: historio de la gxisdatigoj es: historia de las actualizaciones et: muudatuste ajalugu fi: päivityshistoria fr: historique des mises à jour he: øùéîú äòãëåðéí is: uppfærslusaga it: riassunto degli aggiornamenti lv: labojumu vçsture nl: chroniek van wijzigingen no: oppdateringshistorie pl: rejestr zmian pt: historial das actualizações pt-br: histórico das atualizações ro: istoria de actualizare ru: èñòîðèÿ îáíîâëåíèé sl: zgodovina sprememb sv: uppdateringarnas historia horizontally af: horisontaal bg: õîðèçîíòàëíî äúðâî br: a-led ca: horitzontalment cs: horizontálnì da: vandret de: horizontal en: horizontally eo: horizontale es: horizontal et: horisontaalselt fi: vaakasuoraan fr: horizontalement he: àåô÷é is: lárétt it: orizzontalmente lv: horizontâli nl: horizontaal no: horisontal pl: w poziomie pt: horizontalmente ro: orizontal ru: ãîðèçîíòàëüíî sl: vodoravno sv: horisontellt husband/wife af: man/vrou bg: ñúïðóã/ñúïðóãà br: pried/pried ca: marit/muller cs: man¾el/man¾elka da: mand/hustru de: Ehemann/Ehefrau en: husband/wife eo: edzo/edzino es: esposo/esposa et: mees/naine fi: mies/vaimo fr: époux/épouse he: áòì/ àùä is: eiginmaður/eiginkona it: marito/moglie lv: vîrs/sieva nl: echtgenoot/echtgenote no: mann/hustru pl: m±¿/¿ona pt: marido/esposa ro: sot/sotie ru: ìóæ/æåíà sl: mo¾/¾ena sv: make/maka ident/email/subject af: ident/e-pos/onderwerp bg: èäåíòèôèêàòîð/e-mail/òåìà br: anv/postel/danvez ca: ident/email/tema cs: ident/email/pøedmìt (osoba?) da: navn/e-post/emne de: Name/E-Mail/Betreff en: ident/e-mail/subject eo: ident/email/objekto es: Nombre/Email/asunto et: nimi/e-post/teema fi: ident/email/kohde fr: nom/courriel/sujet he: ident/email/ ðåùà is: ident/email/um it: ident/email/oggetto lv: vârds/e-pasts/subjekts nl: identiteit/e-mail/onderwerp no: ident/email/emne pl: ident/email/temat pt: ident/email/assunto ro: identitate/email/subiect ru: èäåíòèôèêàòîð/email/òåìà sl: ime/e-po¹ta/vsebina sv: ident/email/ämne if titles af: as titels bg: îãðàíè÷åí br: ma vez titloù ca: si títols cs: jsou-li tituly da: hvis titler de: eingeschränkt en: if titles eo: se nobeltitoloj es: si títulos et: kui on tiitlid fi: jos arvonimiä fr: si titres he: àí áòì(ú) úåàø is: ef titlar it: se titoli lv: ja ir tituli nl: indien titels no: hvis titler pl: je¶li z tytu³em pt: se títulos ro: are titlu ru: åñëè òèòóë sl: èe so nazivi sv: om titlar image deleted af: prent ontbreek bg: èçîáðàæåíèåòî å ïðåìàõíàòî br: skeudenn lamet ca: imatge esborrada cs: obrázek smazán da: billede slettet de: Bild gelöscht en: image deleted eo: bildo detruita es: imagen suprimida et: pilt kustutatud fi: kuva poistettu fr: image supprimée he: úîåðä ðîç÷ä is: mynd eytt it: immagine cancellata lv: attçls izmests nl: beeld verwijderd no: bildet er fjernet pl: ilustracja zosta³a usuniêta pt: imagem suprimida ro: imagine suprimata ru: êàðòèíêà óäàëåíà sl: slika izbrisana sv: bilden borttagen image received af: prent ontvang bg: èçîáðàæåíèåòî å ïîëó÷åíî br: skeudenn resevet ca: imatge rebuda cs: obrázek pøijat da: billede indsat de: Bild erhalten en: image received eo: bildo ricevita es: imagen recibida et: pilt vastu võetud fi: kuva saatu fr: image reçue he: äúîåðä äú÷áìä is: mynd móttekin it: immagine ricevuta lv: attçls saòemts nl: beeld ontvangen no: bildet er mottatt pl: ilustracja zosta³a do³±czona pt: imagem recebida ro: imagine receptionata ru: êàðòèíêà ïîëó÷åíà sl: slika sprejeta sv: bilden mottagen image/images af: prent/prente bg: èçîáðàæåíèå/èçîáðàæåíèÿ br: skeudenn/skeudennoù ca: imatge/imatges cs: obrázek/obrázky da: billede/billeder de: Bild/Bilder en: image/images eo: bildo:a:+n/bildoj es: imagen/imágenes et: pilt/pildid fi: kuva fr: image/images he: úîåðä is: mynd it: immagine/immagini lv: attçli nl: beeld/beelden no: bilde pl: ilustracja:a:-ê/ilustracje pt: imagem/imagens ro: imagine/imagini ru: êàðòèíêó sl: slika/slike sv: bild/bilder in (month year) af: in bg: ïðåç br: e ca: el/l' cs: v da: i de: im en: in eo: en es: en et: :s: fi: fr: en he: á- is: í it: nel lv: mçnesî nl: in no: i pl: w pt: em ro: in ru: â sl: v sv: i zh: ÓÚ in (year) af: in bg: ïðåç br: e ca: el cs: v da: i de: im Jahre en: in eo: en es: en et: fi: fr: en he: á- is:   it: nel lv: gads: nl: in no: i pl: w roku pt: em ro: in anul ru: â sl: v letu sv: zh: ÓÚ include missing spouses af: ontbrekende ouers ingesluit bg: âêëþ÷èòåëíî ëèïñâàùèòå ñúïðóçè è ñúïðóãè br: enklozañ ar priedoù a vank ca: incloure els cònjuges que falten cs: vèetnì chybìjících man¾elù/man¾elek da: medtag ukendte ægtefæller de: Fehlende Ehegatten einbeziehen en: include missing spouses eo: inkludi mankantajn edz(in)ojn es: incluir los cónyuges faltantes et: kaasa puuduvad abikaasad fi: lue mukaan puuttuvat puolisot fr: inclure les conjoints manquants he: ëìì áðé æåâ äçñøéí is: meðtaldir makar sem vantar it: includere i coniugi mancanti lv: ieskaitot iztrûkstoðos dzîvesbiedrus nl: inclusief ontbrekende echtgenoten no: inkluder ukjente maker pl: poka¿ brakuj±cych ma³¿onków pt: incluir os cônjugues que faltam ro: include soti necunoscuti ru: âêëþ÷àÿ ïîòåðÿííûõ ñóïðóãîâ sl: vkljuèi manjkajoèe mo¾e/¾ene sv: inkludera makar som saknas include spouses af: eggenote ingesluit bg: âêëþ÷èòåëíî ñúïðóçèòå è ñúïðóãèòå br: enklozañ ar priedoù ca: incloure el cònjuges cs: vèetnì man¾elù/man¾elek da: medtag ægtefæller de: Ehegatten einbeziehen en: include spouses eo: inkludi edz(in)ojn es: incluir los cónyuges et: kaasa abikaasad fi: mukaanlue puolisot fr: inclure les conjoints he: áìì is: meðtaldar makar it: includere i coniugi lv: ieskaitot dzîvesbiedrus nl: inclusief echtgenoten no: inkluder maker pl: poka¿ ma³¿onków pt: incluir os cônjugues ro: include soti ru: âêëþ÷àÿ ñóïðóãîâ sl: poka¾i mo¾e/¾ene sv: inkludera makar incompatible sexes af: botsende geslagte bg: íåñúâìåñòèìè ïîëîâå br: reizhoù n'hellont ket klotañ ca: sexes incompatibles cs: nesprávné pohlaví da: køn inkompatible de: unverträgliche Geschlechter en: incompatible sexes eo: seksoj neakordigeblaj es: sexos incompatibles et: sobimatud sood fi: sukupuolet eivät täsmää fr: sexes incompatibles he: àé äúàîä áîéðéí is: kyn passa ekki it: sessi incompatibili lv: nesavietojami dzimumi nl: geslacht klopt niet no: uforenlig kjønn pl: niezgodne p³cie pt: sexos incompatíveis ro: sex incompatibil ru: íåñîâìåñòèìûé ïîë sl: napaèna spola sv: oförenliga kön incorrect date af: verkeerde datum bg: íåêîðåêòíà äàòà br: deiziad direizh ca: data incorrecta cs: nesprávné datum da: forkert dato de: falsches Datum en: incorrect date eo: nekorekta dato es: fecha incorrecta et: vigane kuupäev fi: virheellinen päivämäärä fr: date incorrecte he: áúàøéê ùâåé is: vitlaus dagsetning it: data incorretta lv: nepareizs datums nl: incorrecte datum no: ugyldig dato pl: nieprawid³owa data pt: data incorrecta pt-br: data incorreta ro: data incorecta ru: íåïðàâèëüíàÿ äàòà sl: napaèen datum sv: fel datum incorrect request af: verkeerde navraag bg: íåêîðåêòíà çàÿâêà br: klask direizh ca: consulta incorrecta cs: nesprávný po¾adavek da: forkert anmodning de: falsche Anfrage en: incorrect request eo: nekorekta sercxado es: consulta incorrecta et: vigane päring fi: väärin kysytty fr: requête incorrecte he: á÷ùä ùâåéä is: beiðni ekki rétt it: richiesta incorretta lv: kïûdains pieprasîjums nl: incorrect verzoek no: ugyldig forespørsel pl: nieprawid³owe wyszukiwanie pt: consulta incorrecta pt-br: consulta incorreta ro: consultatie incorecta ru: íåêîððåêòíûé çàïðîñ sl: napaèna zahteva sv: fel förfrågan indeed, af: inderdaad, bg: ôàêòè÷åñêè br: ez wir, ca: en efecte cs: ve skuteènosti da: faktisk, de: weil en: indeed, eo: ja, es: en efecto, et: muidugi, fi: aivan, fr: en effet, he: ìëï is: jú, it: infatti, lv: patieðâm, nl: immers: no: felles forfedre, pl: ¶ci¶lej bior±c, pt: com efeito, ro: pentru ru: íà ñàìîì äåëå, sl: torej sv: faktiskt, index of the descendants af: nasaatindeks bg: ñïèñúê íà ïîòîìöèòå br: roll an diskennidi ca: índex dels descendents cs: seznam potomkù da: fortegnelse over efterkommerne de: Index der Nachkommen en: index of the descendants eo: indekso de la posteuloj es: índice de los descendientes et: järglaste loetelu fi: luettelo jälkeläisistä fr: index des descendants he: îôúç äöàöàéí is: skrá afkomenda it: indice dei discendenti lv: pçcnâcçju saraksts nl: index van afstammelingen no: etterkommerindeks pl: lista potomków pt: índice dos descendentes ro: indice de descendenti ru: èíäåêñ ïîòîìêîâ sl: seznam potomcev sv: förteckning över ättlingarna index of the spouses (non descendants) af: eggenootindeks (na verwant) bg: ñïèñúê íà ñúïðóçèòå è ñúïðóãèòå (áåç ïîòîìöèòå) br: roll ar priedoù (nann-diskennidi) ca: índex dels cònjuges (no descendents) cs: seznam man¾elù/man¾elek (ne potomkù) da: fortegnelse over ægtefællerne (ikke efterkommere) de: Index der Ehegatten (nicht Nachkommen) en: index of the spouses (non descendants) eo: indekso de la geedzoj (ne posteuloj) es: índice de los cónyuges (no descendientes) et: abikaasade loetelu (pole järglased) fi: luettelo puolisoista (ei jälkeläisiä) fr: index des conjoints (non descendants) he: îôúç áðé äæåâ ùàéðí öàöàéí is: skrá make (ekki afkomenda) it: indice dei coniugi (non discendenti) lv: dzîvesbiedru saraksts (bez pçcnâcçjiem) nl: index van echtgenoten (geen afstammelingen) no: ektefelleindeks pl: lista ma³¿onków (nie bêd±cych potomkami) pt: índice dos cônjuges (não descendentes) ro: indice de soti (nedescendenti) ru: èíäåêñ ñóïðóãîâ (íå ïîòîìêîâ) sl: seznam mo¾/¾ena (brez potomcev) sv: förteckning över makarna (icke ättlingar) insert af: invoeg bg: âìúêâàíå íà br: ensoc'hañ ca: insertar cs: vlo¾it da: indsæt de: einfügen +before en: insert eo: enmeti :a: es: insertar et: lisa fi: lisää väliin fr: insérer he: ìäëðéñ is: setja inn it: inserire lv: pievienot :a: nl: invoegen +before no: skyt inn pl: dodaj :a: pt: inserir ro: intercaleaza ru: âñòàâèòü :a: sl: vstavi sv: infoga inversion done af: omgeruil bg: îáðúùàíåòî èçâúðøåíî br: eilpennadur kaset da benn ca: inversió realitzada cs: prohození dokonèeno da: rækkefølge omvendt de: umgekehrt en: inversion done eo: intersxangxo farita es: inversión realizada et: vahetatud fi: vaihto tehty fr: permutation effectuée he: ääçìôä áåöòä is: breyting gerð it: scambio fatto lv: pârslçgðana izpildîta nl: verwisseld/veranderd no: rekkefølgen er endret pl: kolejno¶æ zosta³a zmieniona pt: inversão efectuada pt-br: inversão feita ro: inversiune executata ru: ïåðåêëþ÷åíèå çàâåðøåíî sl: zamenjano sv: omflyttning klar invert af: omruil bg: äà ñå ñìåíè ïîäðåäáàòà br: eilpennañ ca: invertir cs: prohodit da: omvend rækkefølge de: umkehren en: invert eo: intersxangxi :a: es: invertir et: vaheta fi: vaihda fr: permuter he: äçìôä is: breyta röð it: scambiare lv: pârslçgt(?) nl: verwisselen no: bytt rekkefølge pl: zmieñ kolejno¶æ pt: inverter ro: inverseaza ru: ïåðåêëþ÷èòü sl: zamenjaj sv: byt ordning invert the order of the following families af: ruil die orde van die families om bg: äà ñå ñìåíè ïîäðåäáàòà íà ñëåäíèòå ñåìåéñòâà br: eilpennañ urzh an tiegezhioù da heul ca: invertir l'ordre de les famílies següents cs: prohodit poøadí následujících rodin da: omvend rækkefølgen for de følgende familier de: die Reihenfolge der folgenden Familien umkehren en: invert the order of the following families eo: intersxangxi la ordon de la familioj sekvantaj es: invertir el orden de las familias siguientes et: vaheta järgmiste perede järjekord fi: vaihda seuraavien perheiden järjestystä fr: permuter l'ordre des familles suivantes he: ìùðåú ñãø äîùôçåú äáàåú is: breyta röð eftirfarandi fjölskyldna it: scambiare l'ordine delle famiglie seguenti lv: pârslçgt sekojoðo ìimeòu secîbu (?) nl: verwissel de volgorde van de volgende gezinnen no: bytt rekkefølgen til følgende familier pl: czy zmieniæ kolejno¶æ nastepuj±cych ma³¿eñstw lub zwi±zków? pt: inverter a ordem das famílias seguintes ro: inverseaza ordinea urmatoarelor familii ru: èçìåíèòü ïîðÿäîê ñëåäóþùèõ ñåìåé sl: zamenjaj vrstni red naslednjih dru¾in sv: ändra ordningen på de följande familjerna is af: is bg: å br: a zo ca: és cs: je da: er de: ist en: is eo: estas es: es et: on fi: on fr: est he: is: er it: è lv: ir nl: is no: er pl: to pt: é ro: este ru: sl: je sv: är is a very young parent af: is 'n baie jong ouer bg: òâúðäå ìëàä ðîäèòåë br: a zo un tad pe ur vamm gwall yaouank ca: és un pare massa jove cs: je velmi mladý otec/je velmi mladá matka da: er en meget ung forælder de: ist ein(e) sehr junge(r) Vater/Mutter en: is a very young parent eo: estas treege juna patr(in)o es: es un padre demasiado joven et: on väga noor lapsevanem fi: on kovin nuori isä tai äiti fr: est vraiment un parent très jeune he: äåøä îàåã öòéø is: er mjög ungt foreldri it: è veramente un genitore molto giovane lv: ir ïoti jauns vecâks nl: is werkelijk een zeer jonge ouder no: er en svært ung far/mor pl: jest bardzo m³odym ojcem/jest bardzo m³od± matk± pt: é um pai demasiado jovem pt-br: é um pai jovem demais ro: este un parinte foarte tinar ru: î÷åíü ìîëîäûå ðîäèòåëè sl: je zelo mlad oèe/je zelo mlada mamica sv: är en väldigt ung förälder is born after his/her child af: is gebore voor sy/haar kind bg: ðîäåí ñëåä ñâîå äåòå/ðîäåíà ñëåä ñâîå äåòå br: a zo bet ganet goude e(he) v(b)ugel ca: ha nascut després del seu fill cs: se narodil a¾ po svém dítìti/se narodila a¾ po svém dítìti da: er født efter hans/hendes barn de: ist nach seinem/ihrem Kind geboren en: is born after his/her child eo: naskigxis post sia infano es: ha nacido después de su hijo(a) et: on sündinud oma lapsest hiljem fi: on syntynyt myöhemmin kuin lapsensa fr: est né(e) après son enfant he: ðìã àçøé éìãå/ ðìãä àçøé éìãä is: er fædd eftir barn sitt it: sarebbe nato/a dopo i suoi figli lv: ir dzimis(usi) pçc saviem bçrniem nl: werd geboren na zijn/haar kind no: er født etter sitt barn pl: jest urodzony/urodzona pó¼niej ni¿ swoje dziecko pt: nasceu depois do seu filho ro: este nascut dup copil ru: ðîæäåí ïîñëå åãî/åå ðåáåíêà sl: je rojen po tem, ko je imel otroka/je rojena po tem, ko je imela otroka sv: är född efter sitt barn it is the same person! af: is dieselfde persoon! bg: òîâà å ñúùèÿò ÷îâåê! br: a zo an hevelep den ! ca: és la mateixa persona cs: je ta samá osoba! da: det er den samme person! de: es ist die selbe Person! en: it is the same person! eo: estas la sama persono! es: ¡es la misma persona! et: see on ju sama isik! fi: yksi ja sama henkilö! fr: c'est la même personne! he: àåúå äàãí is: þetta er sama manneskjan ! it: è la stessa persona! lv: tâ ir viena un tâ pati persona! nl: is dezelfde persoon! no: det er samme person! pl: to jest ta sama osoba! pt: é a mesma pessoa! ro: este aceiasi persoana! ru: ýòî òîò æå ÷åëîâåê! sl: je ena in ista oseba! sv: det är samma person! julian day af: juliaanse dag bg: þëèàíñêè äåí br: deiz juluan ca: dia julià cs: juliánský den da: juliansk dag de: Julianisch en: Julian day eo: tago juliana es: día julian et: juuliuse päev fi: juliaaninen päivä fr: jour julien he: éåí éåìéàðé is: julian dagur it: giorno giuliano lv: pçc Jûlija kalendâra nl: juliaanse dag no: juliansk dag pl: dzieñ w kalendarzu juliañskim pt: dia juliano ro: zi juliana ru: þëèàíñêèé äåíü sl: julijanski dan sv: julianskdag killed (in action) af: gesneuwel bg: çàãèíàë/çàãèíàëà/çàãèíàë(à) br: bet lazhet ca: mort/morta/mort(a) cs: zabit/zabita/zabiti da: faldet de: gefallen en: killed eo: mortigita es: caído/caída/caído(a) et: tapetud fi: kaatunut fr: tué/tuée/tué(e) he: ðôì/ ðôìä is: lést it: ucciso/uccisa/ucciso(a) lv: nogalinâts(a) (negadîjumâ) nl: gesneuveld no: falt pl: zgin±³/zginê³a pt: morto/morta/morto(a) ro: cazut in lupta ru: óáèò â /óáèòà â sl: ubit/ubita/ubit(a) sv: stupat less than one month old af: minder as 'n maand oud bg: íà ïî-ìàëêî îò ìåñåö br: n'eo ket koshoc'h eget miz ca: menys d'un mes cs: ménì ne¾ mìsíc starý/ménì ne¾ mìsíc stará da: mindre end en måned gammel de: weniger als einen Monat alt en: less than one month old eo: malpli ol unu monato es: menos de un mes et: alla kuu vanune fi: alle kuukauden ikäinen fr: moins d'un mois he: ôçåú îçåãù áâéì is: minna en mánaðar gamalt it: meno di un mese lv: mazâk kâ vienu mçnesi vecs(a) nl: minder dan een maand oud no: mindre enn en måned gammel pl: m³odszy ni¿ 1 miesi±c/m³odsza ni¿ 1 miesi±c pt: menos de um mês ro: mai putin de o luna ru: ìåíåå ÷åì ìåñÿ÷íûé/ìåíåå ÷åì ìåñÿ÷íàÿ sl: star manj kot en mesec/stara manj kot en mesec sv: mindre än en månad link af: koppel bg: äà ñå ñâúðæå br: liammañ ca: reunir cs: link da: forbind de: verbinden en: link eo: bindi es: reunir et: viita fi: linkkaa fr: relier he: ÷ùø is: tengsl it: link lv: saite nl: connectie no: koble pl: link pt: ligar ro: uneste ru: ñâÿçàòü sl: pove¾i sv: länk link between af: mense tussen bg: ðîäñòâî ìåæäó br: liamm etre ca: lligam entre cs: vztah mezi da: slægtskab mellem de: Beziehung zwischen en: link between eo: bindo inter es: relación entre et: nendevaheline seos: fi: näiden välinen yhteys fr: lien entre he: ÷ùø áéï is: tengsl á milli it: legame tra lv: saite starp nl: verband tussen no: slektskap mellom pl: wiêzy pokrewieñstwa pomiêdzy pt: relação entre ro: relatie intre ru: ñâÿçü ìåæäó sl: sorodstvo med sv: släktskap emellan linked pages bg: ñâúðçàíè ñòðàíèöè ca: enllaços cs: spojený stránky da: lænkede sider de: verknüpfte Seiten en: linked pages es: páginas enlazadas et: seotud leheküljed fi: linkkisivuja fr: pages liées it: pagine collegate nl: verbonden pagina's no: linkede sider pl: linki pt: páginas ligadas pt-br: página associadas ro: pagini legate ru: ñâÿçàííûå ñòðàíèöû sl: povezane strani sv: länkade sidor list/list (ancestors) af: lys bg: ñïèñúê br: roll ca: llistat cs: seznam da: liste de: Liste en: list eo: tabelo es: lista et: nimekiri fi: lista fr: liste he: øùéîä is: listi it: lista lv: saraksts nl: lijst no: liste pl: lista pt: lista ro: lista ru: ñïèñîê sl: seznam sv: lista/trädlista long display af: uitgebreide weergawe bg: ïîäðîáíè ðåçóëòàòè br: gwereadur hir ca: presentació extensa cs: dlouhý seznam da: udvidet rapport de: Lange Ansicht en: long display eo: longa afisxado es: presentación extensa et: põhjalik raport fi: laaja raportti fr: affichage long he: úöåâä àøåëä is: löng skýrsla it: display esteso lv: garâ attçloðana nl: uitgebreide weergave no: utvidet rapport pl: pe³na postaæ pt: resultados detalhados ro: resultat detaliat ru: ïîäðîáíî sl: dolg seznam sv: utökad rapport loop in database: %s is his/her own ancestor af: fout in die databasis: %s sy/haar eie voorvader bg: çàöèêëÿíå â áàçàòà îò äàííè br: dol er bon roadoù : % a zo e/he hendad dezhañ/i e/hec'h-unan ca: bucle a la base de dades: %s és avantpassat d'ell mateix cs: smyèka v databázi: %s je svùj pøedek da: loop i databasen: %s er sin egen ane de: Schleife in der Datenbank: %s ist sein/ihr eigener Vorfahr en: loop in database: %s is his/her own ancestor eo: estas masxo en la datenbazo: %s estas sia propra avo es: referencia circulár en la base de datos: %s es su propio ancestro et: silmus andmebaasis: %s on iseenda esivanem fi: silmukka tietokannassa: %s on oma esivanhempansa fr: boucle dans la base de données: %s est son propre ancêtre he: îòâì áîàâø äðúåðéí: %s öàöà(ä) ìàöîå/ìàöîä is: villa í gagnagrunni: %s er sinn eigin forfaðir/afkomandi it: loop nel data-base: %s è antenato(a) di se stesso(a) lv: cilpa datu bâzç: %s ir viòa/viòas paðas secis nl: circulaire referentie in de database: %s is zijn/haar eigen voorouder no: loop i databasen: %s er sin egen etterkommer pl: pêtla w bazie: %s jest swoim w³asnym przodkiem pt: referência circular no banco de dados: %s é seu próprio ancestral ro: referinta circulara: %s este propriul stramos ru: ïåòëÿ â áàçå äàííûõ: %s åãî/åå ñîâñòâåííûé ïðåäîê sl: krog v bazi podatkov: %s je svoj(a) prednik sv: loop i databasen: %s är sin egen ana main title af: hooftitel bg: ãëàâíà òèòëà br: titl pennañ ca: títol principal cs: hlavní titul da: hovedtitel de: Haupttitel en: main title eo: cxefa nobeltitolo es: título principal et: peamine tiitel fi: pääarvonimi fr: titre principal he: úåàø øàùéú is: aðal titill it: titolo principale lv: galvenais tituls nl: voornaamste titel no: hovedtitel pl: g³ówny tytu³ pt: título principal ro: titlu principal ru: ãëàâíûé çàãîëîâîê sl: glavni naziv sv: huvudtitel male line/female line af: manlike lyn/vroulike lyn bg: ìúæêà ëèíèÿ/æåíñêà ëèíèÿ br: lignez ar wazed/lignez ar maouezed ca: línia masculina/línia femenina cs: mu¾ská linie/¾enská linie da: mandlige linie/kvindelige linie de: väterlicherseits/mütterlicherseits en: male line/female line eo: vira linio /virina linio es: línea masculina/línea femenina et: meesliin/naisliin fi: miehen puoleinen linja/naisen puoleinen linja fr: lignée agnatique/lignée cognatique he: ÷å æëøé / ÷å ð÷áé is: karllegg/kvenlegg it: linea agnatizia/linea cognatizia lv: tçva lînija/mâtes lînija nl: mannelijke lijn/vrouwelijke lijn no: mannlig linje/kvinnelig linje pl: linia mêska/linia ¿eñska pt: linha masculina (agnatícia)/linha feminina (cognática) ro: linie masculina/linia feminina ru: ìóæñêàÿ ëèíèÿ/æåíñêàÿ ëèíèÿ sl: mo¹ka linija/¾enska linija sv: manliga linjen/kvinnliga linjen marriage of %t after his/her death af: huwelik van %t na sy/haar afsterwe bg: áðàê íà %t ñëåä íåãîâàòà/íåéíàòà ñìúðò br: eured %t goude e/he v/marv ca: casament de %t després de la seva mort cs: sòatek s %t po své smrti da: giftermål af %t efter hans/hendes død de: Heirat von %t nach seinem/ihrem Tod en: marriage of %t after his/her death eo: edz(in)igxo de %t post sia morto es: casamiento de %t después de su muerte et: %t abiellus pärast oma surma fi: %t olisi naitu vainajana fr: mariage de %t après sa mort he: ðéùåàéï ùì %t àçøé îåúå/îåúä is: giftist %t eftir andlát hans/hennar it: matrimonio di %t dopo la sua morte lv: %t kâzas pçc viòa(s) nâves nl: huwelijk van %t na zijn/haar dood no: ekteskap med %t etter ektefellens død pl: ma³¿eñstwo z %t po ¶mierci pt: casamento de %t depois da sua morte ro: casatoria %t este dupa deces ru: áðàê %t ïîñëå åãî/åå ñìåðòè sl: %t se je poroèil(a) po svoji smrti sv: äktenskap med %t före makens/makans död marriage of %t before his/her birth af: huwelik van %t voor sy/haar geboorte bg: áðàê íà %t ïðåäè íåãîâîòî/íåéíîòî ðàæäàíå br: eured %t a-raok e/he c'h/ganedigezh ca: casament de %t abans del seu naixement cs: sòatek s %t pøed svým narozením da: giftermål af %t før hans/hendes fødsel de: Heirat von %t vor seiner/ihrer Geburt en: marriage of %t before his/her birth eo: edz(in)igxo de %t antaù sia naskigxo es: casamiento de %t antes de su nacimiento et: %t abiellus enne oma sündi fi: %t olisi naitu ennen syntymää fr: mariage de %t avant sa naissance he: ðéùåàéï ùì %t ìôðé äåìãúå/äåìãúä is: gistist %t fyrir fæðingu hans/hennar it: matrimonio di %t prima della sua nascita lv: %t kâzas pirms viòa(s) dzimðanas nl: huwelijk van %t voor zijn/haar geboorte no: ekteskap med %t før ektefellens fødsel pl: ma³¿eñstwo z %t przed narodzeniem pt: casamento de %t antes do seu nascimento ro: casatoria %t inaninte de nastere ru: áðàê %t ïåðåä åãî/åå ðîæäåíèåì sl: %t se je poroèil(a) pred svojim rojstvom sv: äktenskap med %t före makens/makans födelse marriage/marriages af: huwelik/huwelike bg: áðàê/áðàêîâå br: eured/euredoù ca: casament/casaments cs: man¾elství da: giftermål/giftermål de: Heirat/Heiraten en: marriage/marriages eo: edzigxo:a:+n/edzigxoj es: casamiento/casamientos et: abielu/abielud fi: avioliitto/avioliitot fr: mariage/mariages he: ðéùåàéï is: gifting/giftingar it: matrimonio/matrimoni lv: ìimene nl: huwelijk/huwelijken no: ekteskap/ekteskap pl: ¶lub/¶luby pt: casamento/casamentos ro: casatorie/casatorii ru: áðàê/áðàêè sl: poroke/poroke sv: äktenskap/äktenskap married af: getroud bg: â áðàê br: euredet ca: casats cs: man¾elé da: gift de: verheiratet en: married eo: edzigxintaj es: casados et: abielus fi: vihitty fr: mariés he: ðùåàéí is: gift it: sposati lv: precîbu nl: gehuwd no: gift pl: ma³¿eñstwo pt: casados ro: casatorit ru: â áðàêå sl: poroka sv: gift married at age %t af: getroud op ouderdom %t bg: â áðàê îò %t-ãîäèøíà âúçðàñò br: euredet d'an oad a %t ca: casat a l'edat de %t cs: o¾enil se ve vìku %t/vdala se ve vìku %t da: gift i alderen %t de: verheiratet mit %t Jahren en: married at age %t eo: edzigxinta je la agxo de %t jaroj es: casado a la edad de %t et: abiellus %t aastasena fi: vihitty %t ikäisenä fr: marié(e) à l'àge de %t he: äúçúï áâéì %t is: giftist %t ára it: sposato(a) all'età di %t lv: precçjies %t gadu vecumâ nl: gehuwd op de leeftijd van %t no: gift %t år gammel pl: o¿eni³ siê w wieku %t lat/wysz³a za m±¿ w wieku %t lat pt: casado com a idade de %t ro: casatorit la virsta de %t ru: â áðàêå ñ %t ëåò sl: se je poroèil ko je imel %t/se je poroèila ko je imela %t sv: gift vid %t ålder married%t to af: getroud met %t bg: âñòúïâà â áðàê%t ñ br: euredet %t gant ca: casat%t amb/casada%t amb cs: %t si vzal/%t si vzala da: gift%t med de: verheiratet%t mit en: married%t to eo: edzigxinta%t kun es: casado%t con/casada%t con et: abielu%t fi: puoliso%t fr: marié%t avec/mariée%t avec he: äúçúï %t òí/ äúçúðä %t òí is: giftist%t it: sposato%t con/sposata%t con lv: precîbu %t precçjies ar /precîbu %t precçjusies ar nl: gehuwd%t met no: gift%t med pl: ¿ona (¶lub: %t):/m±¿ (¶lub: %t): pt: casado%t com/casada%t com ro: casatorit%t cu ru: â áðàêå ñ%t sl: %t se je poroèil z/%t se je poroèila z sv: gift%t med zh: %tÅäżÊÇ maximum af: maksimum bg: íàé-ìíîãî br: d'ar muiañ ca: màxim cs: maximum da: maksimalt de: Maximal en: maximum eo: maksimume es: máximo et: maksimaalselt fi: korkeintaan fr: maximum he: î÷ñéîåí is: hámark it: massimo lv: maksimums nl: maximaal no: maksimalt pl: maksymalnie pt: máximo ro: maximum ru: ìàêñèìàëüíî sl: najveè sv: maximalt merge af: saamvoeg bg: äà ñå îáåäèíÿò br: kendeuziñ ca: fusionar cs: spojit da: sammenlæg de: zusammenführen +before en: merge eo: kunigi :a: es: fusionar et: ühenda fi: yhdistä fr: fusionner he: àéçåã is: sameina it: fondere lv: apvienot nl: samenvoegen no: slå sammen pl: scal pt: fusão ro: unifica ru: îáúåäèíèòü sl: zdru¾i sv: slå samman merge done af: saamgevoeg bg: îáåäèíÿâàíåòî èçâúðøåíî br: echu eo ar c'hendeuziñ ca: fusió acabada cs: spojení dokonèeno da: sammenlægning udført de: Zusammenführung abgeschlossen en: merge done eo: kunigo farita es: fusión terminada et: ühendatud fi: yhdistetty fr: fusion terminée he: äàéçåã áåöò is: sameiningu lokið it: fusione terminata lv: apvienoðana paveikta nl: samenvoeging is uitgevoerd no: er slått sammen pl: scalenie zosta³o dokonane pt: fusão terminada ro: executat fuzionarea ru: îáúåäèíåíèå çàâåðøåíî sl: zdru¾itev konèana sv: sammanslagning klar message added af: boodskap bygevoeg bg: ñúîáùåíèåòî äîáàâåíî br: kemenn ouzhpennet ca: missatge afegit cs: zpráva pøidána da: meddelelse tilføjet de: Nachricht hinzugefügt en: message added eo: mesagxo almetita es: mensaje agregado et: teade lisatud fi: viesti lisätty fr: message ajouté he: äåñôä äåãòä is: skilaboðum bætt við it: messaggio aggiunto lv: ziòa pievienota nl: bericht toegevoegd no: melding tilføyet pl: wiadomo¶æ zosta³a dodana pt: mensagem adicionada ro: adaugat mesajul ru: ñîîáùåíèå äîáàâëåíî sl: sporoèilo dodano sv: meddelande inlagt message deleted af: boodskap gedeleer bg: ñúîáùåíèåòî å èçòðèòî br: kemenn lamet kuit ca: missatge suprimit cs: zpráva smazána da: meddelelse slettet de: Nachricht gelöscht en: message deleted eo: mesagxo nuligita es: mensaje borrado et: teade kustutatud fi: viesti poistettu fr: message supprimé he: äåãòä ðîç÷ä is: skilaboðum eytt it: messaggio cancellato lv: izdzçsta ziòa nl: bericht verwijderd no: melding fjernet pl: wiadomo¶æ usuniêta pt: mensagem eliminada ro: mesajul este suprimat ru: óïïâýåîéå õäáìåîï sl: sporoèilo izbrisano sv: meddelandet borttaget message/previous message/previous messages/next message af: boodskap/vorige boodskap/vorige boodskappe/volgende boodskap bg: ñúîáùåíèå/ïðåäõîäíîòî ñúîáùåíèå/ïðåäõîäíèòå ñúîáùåíèÿ/ñëåäâàùîòî ñúîáùåíèå br: kemenn/kemenn kent/kemennoù kent/kemenn da heul ca: missatge/missate anterior//missate anterior/missate següent cs: zpráva:a:-u/pøedchozí zpráva/pøedchozí zprávy/následující zpráva da: meddelelse/foregående meddelelse/foregående meddelelse/næste meddelelse de: Nachricht/vorherige Nachricht/vorherige Nachricht/nächste Nachricht en: message/previous message/previous messages/next message eo: mesagxo:a:+n/antaùa mesagxo/antaùa mesagxo/sekvanta mesagxo es: mensaje/mansaje anterior/mansaje anterior/mensaje siguiente et: teade/eelmine teade/eelmised teated/järgmine teade fi: viesti/edellinen viesti/edellinen viesti/seuraava viesti fr: message/message précédent/messages précédents/message suivant he: äåãòä / äåãòä ÷åãîú / äåãòä ÷åãîú / äåãòä äáàä is: skilaboð/fyrri skilaboð/fyrri skilaboð/næstu skilaboð it: messaggio/messaggio precedente/messaggi precedenti/messaggio seguente lv: ziòa/iepriekðçjâ ziòa/iepriekðçjâ ziòa/nâkoðâ ziòa nl: bericht/vorig bericht/vorig bericht/volgend bericht no: melding/forrige melding/forrige melding/neste melding pl: wiadomo¶æ/poprzednia wiadomo¶æ/poprzednia wiadomo¶æ/nastêpna wiadomo¶æ pt: mensagem/mensagem anterior/mensagem anterior/mensagem seguinte ro: mesaj/mesajul anterior/mesajele anterioare/mesajele urmatoara ru: ñîîáùåíèå/ïðåäûäóùåå ñîîáùåíèå/ïðåäûäóùèå ñîîáùåíèÿ/ñëåäóþùåå ñîîáùåíèå sl: sporoèilo/prej¹nje sporoèilo/prej¹nja sporoèila/naslednje sporoèilo sv: meddelande/föregående meddelande/föregående meddelande/nästa meddelande miscellaneous notes bg: ðàçíè áåëåæêè ca: miscel·lània cs: rozmanitý poznámky da: diverse noter de: diverse Notizen en: miscellaneous notes es: notas diversas et: mitmesugused märkused fi: sekalaisia huomautuksia fr: notes diverses it: note varie nl: diverse aantekeningen no: diverse notater pl: pozosta³e uwagi pt: notas diversas ro: insemnari diverse ru: äîïîëíèòåëüíûå çàìåòêè sl: razni zaznamki sv: blandade noteringar missing ancestors af: ontbrekende voorsate bg: ëèïñâàùè ïðåäöè br: lod eus e hendadoù a vank ca: ascendents que falten cs: chybìjící pøedkové da: manglende forfædre de: fehlende Vorfahren en: missing ancestors eo: mankintaj antaùeuloj es: ascendientes que faltan et: puuduvad esivanemad fi: puuttuvat esivanhemmat fr: ascendants manquants he: àáåú çñøéí is: vantar forfeður it: antenati mancanti lv: bez tâlakiem senèiem nl: ontbrekende voorouders no: manglende forfedre pl: brakuj±cy przodkowie pt: ascendentes que faltam ro: stramosi necunoscuti ru: ïîòåðÿííûå ïðåäêè sl: manjkajoèi predniki sv: anor som saknas modify af: wysig bg: äà ñå ïðîìåíÿò br: kemmañ ca: modificar cs: zmìnit :a: da: ændre de: ändern +before en: modify eo: modifi :a: es: modificar et: muuda :g: fi: muokkaa fr: modifier he: ìùðåú is: breyta it: modificare lv: izmainît nl: wijzigen +before no: endre pl: zaktualizuj :a: pt: modificar ro: modifica ru: èçìåíèòü :a: sl: spremeni sv: ändra months old af: maande oud bg: ìåñåöà br: miz kozh ca: mesos cs: mìsícù starý/mìsícù stará da: måneder gammel de: Monate alt en: months old eo: monatoj es: meses et: kuud fi: kuukautta fr: mois he: çåãùéí is: mánaðar gamall it: mesi lv: mçneðus vecs nl: maanden oud no: måneder gammel pl: miesiêcy pt: meses ro: luni ru: ìåñÿöû sl: mesecev star/mesecev stara sv: månader moon age/new moon/first quarter/full moon/last quarter af: maanfase/nuwemaan/eerste kwartier/volmaan/laaste kwartier bg: ëóííà ôàçà/íîâîëóíèå/ïúðâà ÷åòâúðò/ïúëíîëóíèå/ïîñëåäíà ÷åòâúðò ca: fase lunar/lluna nova/quart creixent/lluna plena/quart minvant cs: mìsíèní fáze/nov/první ètvrt'/úplnìk/poslední ètvrt' da: månefase/nymåne/tiltagende måne/fuldmåne/aftagende måne de: Mondalter/Neumond/erstes Viertel/Vollmond/letztes Viertel en: moon age/new moon/first quarter/full moon/last quarter eo: ago de la luno/novluno/unua lunkvarono/plenluno/lasta lunkvarono es: edad de la luna/luna nueva/cuarto cresciente/luna llena/cuarto menguante et: kuu vanus/noorkuu/esimene veerand/täiskuu/viimane veerand fi: kuun kierto/uusi kuu/ensimmäinen neljännes/täysikuu/viimeinen neljännes fr: âge de la lune/nouvelle lune/premier quartier/pleine lune/dernier quartier he: âéì äéøç/ éøç çãù/ øáéò øàùåï/ éøç îìà/ øáéò àçøåï is: tunglaldur/nýtt tungl/vaxandi tungl/fullt tungl/minnkandi tungl it: fasi della luna/luna nuova/primo quarto/luna piena/ultimo quarto lv: Mçness fâze/jauns Mçness/pirmais ceturksnis/pilns Mçness/pçdçjais ceturksnis nl: maansouderdom/nieuwemaan/eerste kwartier/vollemaan/laatste kwartier no: månefaser/nymåne/første kvarter/fullmåne/siste kvarter pl: faza ksiê¿yca/nów/pierwsza kwadra/pe³nia/trzecia kwadra pt: dia do mês lunar/lua nova/quarto crescente/lua cheia/quarto minguante pt-br: idade lunar/lua nova/lua crescente/lua cheia/lua minguante ro: etatea Lunii/Luna noua/primul patrar/Luna plina/ultimul patrar ru: ôàçà ëóíû/íîâîëóíèå/ïåðâàÿ ÷åòâåðòü/ïîëíîëóíèå/÷åòâåðòàÿ ÷åòâåðòü sl: lunine mene/ mlada luna/prvi krajec/polna luna/zadnji krajec sv: månålder/nymåne/första kvarter/fullmåne/sista kvarter more than %d answers af: meer as %d antwoorde bg: ïîâå÷å îò %d îòãîâîðè br: ouzhpenn %d respont ca: més de %d respostes cs: více ne¾ %d odpovìdí da: mere end %d svar de: mehr als %d Antworten en: more than %d answers eo: pli ol %d respondoj es: más de %d respuestas et: enam kui %d vastust fi: yli %d vastausta fr: plus de %d réponses he: éåúø î-%d úùåáåú is: fleiri en %d svör it: più di %d risposte lv: vairâk nekâ %d atbildes nl: meer dan %d antwoorden no: fler enn %d svar pl: wiêcej ni¿ %d odpowiedzi pt: mais de %d respostas ro: mai mult de %s raspunsuri ru: áîëåå, ÷åì %d îòâåòû sl: veè kot %d zadetkov sv: fler än %d svar murdered af: vermoor bg: óáèò/óáèòà/óáèò(à) br: muntret ca: assessinat/assessinada/assessinat(ada) cs: zavra¾dìn/zavra¾dìna da: myrdet de: ermordet en: murdered eo: murdigita es: asesinado/asesinada/asesinado(a) et: mõrvatud fi: murhattu fr: assassiné/assassinée/assassiné(e) he: ðøöç/ ðøöçä is: myrtur it: assassinato/assassinata/assassinato(a) lv: noslepkavots nl: vermoord no: myrdet pl: zamordowany/zamordowana/morderstwo pt: assassinado/assassinada/assassinado(a) ro: ucis ru: óáèò/óáèòà sl: umorjen/umorjena sv: mördad n pl: n/1/2/3/4/5/6/7/8/9/10/11/12/13/14/15/16/17/18/19/20/21/22/23/24/25/26/27/28/29/30/31/32/33/34/35/36/37/38/39/40/41/42/43/44/45/46/47/48/49/50/51/52/53/54/55/56/57/58/59/60/61/62/63/64/65/66/67/68/69/70/71/72/73/74/75/76/77/78/79/80/81/82/83/84/85/86/87/88/89/90/91/92/93/94/95/96/97/98/99 name af: naam bg: èìå br: anv ca: cognom cs: jméno da: navn de: Name en: name eo: nomo es: nombre et: nimi fi: nimi fr: nom he: ùí is: nafn it: nome lv: vârds nl: naam no: navn pl: imiê pt: apelido pt-br: nome ro: nume ru: íàçâàíèå sl: ime sv: namn name %s already used by %tthis person%t af: %s is reeds gebruik deur %t bg: èìåòî %s âå÷å å èçïîëçâàíî %tçà äðóã ÷îâåê%t br: anv %s implijet endeo gant %tan den-mañ%t ca: nom %s ja utilitzat per %taquesta persona%t cs: jméno %s u¾ má tato %tosoba%t da: navn %s er allerede anvendt af %tdenne person%t de: Name %s wird schon bei %tdieser Person%t benutzt en: name %s already used by %tthis person%t eo: nomo %s jam uzita de %ttiu persono%t es: nombre %s ya utilizado por %testa persona%t et: nimi %s on juba kasutuses %tsellel inimesel%t fi: nimi %s on jo käytössä %ttällä henkilöllä%t fr: nom %s déjà utilisé par %tcette personne%t he: äùí %s áùéîåù ëáø ò"é %tàãí æä%t is: nafnið %s er þegar í %tnotkun af%t it: nome %s già utilizzato da %tquesta persona%t lv: vârds - %s jau ir %tðai personai%t nl: de naam %s is al gebruikt door deze persoon%t no: navnet %s er alt i bruk av %tdenne personen%t pl: imiê %s jest ju¿ u¿ywane przez %ttê osobê%t pt: apelido %s já utilizado por %testa pessoa%t pt-br: nome %s já utilizado por %testa pessoa%t ro: numele %s est in uz de %taceasta persoana%t ru: èìÿ %s óæå èñïîëüçîâàíî %týòèì ÷åëîâåêîì%t sl: ime %s ¾e uporablja %tta oseba%t sv: namn %s används redan av %tdenna person%t navigation with %t as Sosa reference af: stap met %t as Sosa verwysing bg: íàâèãàöèÿ ÷ðåç ÷èñëà íà Ñîñà îòíîñíî %t br: merdeadur gant %t 'vel dave Sosa ca: navegació amb %t amb referència de "número Sosa" cs: prohlí¾ení s %t jako "sosa" referencí da: navigering med %t som reference for fortløbende anenummerering (Sosa o.a.) de: Navigation mit %t als Proband für die Ahnenkennziffern en: navigation with %t as Sosa reference eo: navigado kun %t kiel Sosa referenco es: navegación con %t como referencia de Sosa et: navigeerimine kasutades %t Sosa viidet fi: navigointi %t Sosa-viitteenä fr: navigation avec %t comme référence Sosa he: ðéååú òí %t ëàæëåø Sosa is: leiðsögn með %t sem Sosa tilvísun it: percorso con %t come riferimento Sosa lv: meklçt senèus -> %t pçc Sosa pakâpes nl: navigatie met %t als proband no: navigering med %t som Sosa referanse pl: nawigacja z numerami "Sosa" odnosz±cymi siê do osoby: %t pt: navegação com %t como a referência Sosa ro: navigatie cu %t referinta Sosa ru: íàâèãàöèÿ ñ %t êàê ññûëêà Sosa sl: pregled z %t kot Sosa sv: navigering med %t som proband (Kekules system) nephews and nieces af: broers- en susterskinders bg: ïëåìåííèöè è ïëåìåííè÷êè br: nized ha nizezed ca: nebots i nebodes cs: synovci a neteøe da: nevøer og niecer de: Neffen und Nichten en: nephews and nieces eo: nevoj kaj nevinoj es: sobrinos y sobrinas et: venna- ja õelapsed fi: sisarusten lapset fr: neveux et nièces he: àçééðéí is: bræðra og systrabörn it: nipoti lv: brâïadçli/mâsasdçli un brâïameitas/mâsasmeitas nl: neven en nichten (oom-, tantezegger) no: nevøer og nieser pl: bratankowie lub siostrzeñcy/bratanice lub siostrzenice pt: sobrinhos e sobrinhas ro: nepoti si nepoate ru: ïëåìÿííèêè è ïëåìÿííèöû sl: neèaki in neèakinje sv: nevöer och niecer next sibling af: volgende broer/volgende suster/volgende broer of suster bg: ñëåäâàù áðàò/ñëåäâàùà ñåñòðà/ñëåäâàù áðàò èëè ñëåäâàùà ñåñòðà br: Breur da heul/c'hoar da heul/breur pe c'hoar da heul ca: germà següent/germana següent/germà(ana) següent cs: následující sourozenec da: næste søskende de: folgender Bruder/folgende Schwester/folgende Geschwister en: next sibling eo: sekvanta frato/sekvanta fratino/sekvanta frat(in)o es: hermano siguiente/hermana siguiente/hermano(a) siguiente et: järgmine vend/järgmine õde/järgmine õde või vend fi: seuraava veli/seuraava sisar/seuraava sisaruksista fr: frère suivant/soeur suivante/frère ou soeur suivant he: àç(åú) öòéø(ä) is: næsta systkyni it: fratello seguente/sorella seguente/fratello o sorella seguente lv: nâkoðais brâlis/nâkoðais mâsa nl: volgende broer/volgende zuster/volgende broer of zuster no: neste bror/neste søster/neste søsken pl: nastêpny brat lub siostra pt: irmão seguinte/irmã seguinte/irmã(o) seguinte ro: urmatorul frate/urmatoarea sora/ urmatoarele frati si surori ru: ñëåäóþùèé áðàò/ñëåäóþùàÿ ñåñòðà sl: mlaj¹i brat/mlaj¹a sestra sv: nästa bror/nästa syster/nästa syskon no anniversary af: geen herdenking bg: íÿìà ãîäèøíèíà br: deiz-ha-bloaz ebet ca: no hi ha cap aniversari cs: ¾ádné výroèí da: ingen årsdag de: kein Jahrestag en: no anniversary eo: neniu datreveno es: ningún aniversario et: pole ühtegi aastapäeva fi: ei vuosipäivää fr: pas d'anniversaire he: àéï úàøéê éåí äùðä is: engir merkisdagar it: nessun anniversario lv: nav gadadienas nl: geen verjaardag no: ingen årsdager pl: nie ma ¿adnej rocznicy pt: nenhum aniversário ro: nu e aniversare ru: íåò ãîäîâùèí sl: nobene obletnice sv: ingen årsdag no birthday af: geen verjaarsdag bg: íÿìà ðîæäåí äåí br: deiz ganedigezh ebet ca: no hi ha cap aniversari cs: ¾ádné narozeniny da: ingen fødselsdag de: kein Geburtstag en: no birthday eo: neniu naskigxtago es: ningún cumpleaños et: pole ühtegi sünnipäeva fi: ei syntymäpäivää fr: pas d'anniversaire he: àéï éåí äåìãú is: engir afmælisdagar it: nessun compleanno lv: nav dzimðanas dienas nl: geen verjaardag no: ingen fødselsdager pl: nie ma ¿adnej rocznicy urodzin pt: nenhum aniversário de nascimento ro: nu e zi de nastere ru: íåò äíåé ðîæäåíèé sl: nobenega rojstnega dneva sv: ingen födelsedag no known relationship link between %s and %s af: geen bekende verwantskap tussen %s en %s bg: íÿìà äàííè çà ðîäñòâî ìåæäó %s è %s br: ne gaver ket al liamm a gerentiezh etre %s ha %s ca: cap lligam de parentesc conegut entre %s i %s cs: ¾ádný známý vztah mezi :i:%s a :i:%s da: intet kendt slægtskab mellem %s og %s de: %s und %s sind anscheinend nicht verwandt en: no known relationship link between %s and %s eo: neniu sciita ligo de parenceco inter %s kaj %s es: ningún grado de parentesco conocido entre %s y %s et: %s ja %s vahel pole teadaolevat sugulussuhet fi: ei todettua sukulaisuutta %s ja %s välillä fr: pas de lien de parenté connu entre %s et %s he: àéï ÷ùø ãí áéï %s å-%s is: engin þekkt tengsl milli %s og %s it: nessun legame di parentela conosciuto tra %s e %s lv: nav radniecîbas saiðu starp %s un %s nl: er is geen bekende verwantschap tussen %s en %s no: ikke kjent slektskap mellom %s og %s pl: nie s± znane ¿adne wiêzy pokrewieñstwa pomiêdzy osobami: %s i %s pt: nenhum grau de parentesco conhecido entre %s e %s ro: nici o relatie intre %s si %s ru: íåèçâåñòíî î ðîäñòâåííûõ ñâÿçÿõ ìåæäó %s è %s sl: Brez znane zveze med %s in %s sv: ingen känd släktskap emellan %s och %s no match af: geen passing bg: íÿìà ïàñâàùè äàííè br: respont ebet ca: cap resposta cs: nenalezena shoda da: intet resultat af søgningen de: keine passenden Einträge en: no match eo: neniu respondo es: ninguna respuesta et: ei leitud fi: ei löytynyt fr: aucune réponse he: àéï ãáø ãåîä is: engin fannst it: nessuna risposta lv: nav atbilstîbas (nav precçjuðies?) nl: niets gevonden no: ingen treff pl: brak pasuj±cej odpowiedzi pt: nenhuma resposta ro: nici un rezultat ru: íåò ñîâïàäåíèé sl: brez sv: inga träffar no mention af: geen vermelding bg: íå ñå ñïîìåíàâà br: meneg ebet ca: no esmentat cs: bez zmínky da: andet de: nicht erwähnt en: no mention eo: neniu mencio es: sin información et: pole mainitud fi: ei mainintaa fr: pas de mention he: àéï àæëåø is: óþekkt it: senza menzione lv: nav minçts nl: geen vermelding no: ukjent familieforhold pl: bez wzmianki pt: sem informação ro: nementionat ru: íåò óïîìèíàíèé sl: ni omembe sv: inte nämnd no sexes check af: geslag word nie aangedui nie bg: áåç ïðîâåðêà çà ïîë br: n'eo ket bet gwiriekaet ar reizh ca: no verificar els sexes cs: bez kontroly pohlaví da: ingen verificering af kønnene de: keine Kontrolle des Geschlechts en: no sexes check eo: sen kontrolo pri seksoj es: sin comprobacion de sexo et: ära kontrolli sugude sobivust fi: ei sukupuolitarkistusta fr: pas de vérification des sexes he: áìé ìååãà îéï is: ekki athuga kyn it: senza verifica del sesso lv: nepâbaudît dzimumus nl: geslacht niet geverifiëerd no: ikke kontroll av kjønn pl: ta sama p³eæ pt: não verificar os sexos ro: fara control de gen ru: íå ïðîâåðÿòü ïîë sl: ne glede na spol sv: ingen kontroll av könen not divorced af: nie geskei nie bg: íåðàçâåäåíè br: n'int ket dibriedet ca: no divorciat cs: nerozvedeni da: ikke skilt de: nicht geschieden en: not divorced eo: ne eksedzigxintaj es: no divorciado et: pole lahutatud fi: eivät eronneita fr: non divorcés he: ìà âøåùéí is: ekki skilin it: non divorziati lv: nav ðíîruðies nl: niet gescheiden no: ikke skilt pl: nie rozwiedzeni pt: não divorciado ro: nedivortat ru: íå ðàçâåäåíû sl: brez loèitve sv: inte skilda not found af: niks gekry nie bg: íÿìà ðåçóëòàò îò òúðñåíåòî br: n'eo ket bet kavet ca: no localitzat cs: nenalezeno da: ikke fundet de: nicht gefunden en: not found eo: ne trovita es: no encontrado et: ei leitud fi: ei löydy fr: pas trouvé he: ìà ðîöà is: fannst ekki it: non trovato lv: nav atrodams nl: niet gevonden no: ikke funnet pl: nie znaleziono: pt: não encontrado ro: negasit ru: íå íàéäåí sl: ni najdeno sv: hittar inte not married af: Ongetroud bg: áåç áðàê br: nann euredet ca: no casats cs: svobodní da: ikke gift de: nicht verheiratet en: not married eo: ne edzigxintaj es: no casados et: pole abielus fi: eivät naimisissa fr: non mariés he: ìà ðùåàéí is: ógift it: non sposati lv: nav precçjuðies nl: niet gehuwd no: ugift pl: bez ¶lubu pt: não casados ro: necasatorit ru: íå â áðàêå sl: brez poroke sv: ogifta note/notes af: nota/notas bg: áåëåæêà/áåëåæêè br: notenn/notennoù ca: nota/notes cs: poznámka/poznámky da: note/noter de: Notiz/Notizen en: note/notes eo: noto/notoj:a:+n es: nota/notas et: märkus/märkused:g:-id fi: lisäys/lisätietoja fr: note/notes he: äòøä/ äòøåú is: athugasemd/athugasemdum it: nota/note lv: piezîme(s) nl: notitie/notities no: notat/notater pl: uwagi pt: nota/notas ro: nota/note ru: çàìåòêà/çàìåòêè sl: zapisek/zapiski sv: notering/noteringar zh: ±¸×¢ notes modified af: aantekeninge gewysig bg: áåëåæêèòå ñà ïðîìåíåíè br: notennoù kemmet ca: notes modificades cs: poznámky zmìnìny da: noter ændret de: geänderte Notizen en: notes modified eo: notoj modifitaj es: notas modificadas et: märkused muudetud fi: muistiinpanoja muokattu fr: notes modifiées he: øùéîåú òåãëðå is: athugasemd gerð it: note modificate lv: pârveidotas piezîmes nl: notities veranderd no: notater er endret pl: uwagi zmodyfikowane pt: notas modificadas ro: nota modificata ru: çàìåòêè èçìåíåíû sl: zaznamek spremenjen sv: noteringar modifierade nth af: n-de/1ste/2de/3de/4de/5de/6de/7de/8ste/9de/10de/11de/12de/13de/14de/15de/16de/17de/18de/19de/20ste/21ste/22ste/23ste/24ste/25ste/26ste/27ste/28ste/29ste/30de/31ste/32ste/33ste/34ste/35ste/36ste/37ste/38ste/39ste/40ste/41ste/42ste/43ste/44ste/45ste/46ste/47ste/48ste/49ste/50ste/51ste/52ste/53ste/54ste/55ste/56ste/57ste/58ste/59ste/60ste/61ste/62ste/63ste/64ste/65ste/66ste/67ste/68ste/69ste/70ste/71ste/72ste/73ste/74ste/75ste/76ste/77ste/78ste/79ste/80ste/81ste/82ste/83ste/84ste/85ste/86ste/87ste/88ste/89ste/90ste/91ste/92ste/93ste/94ste/95ste/96ste/97ste/98ste/99ste bg: n-òè/ïúðâè/âòîðè/òðåòè/÷åòâúðòè/ïåòè/øåñòè/ñåäìè/îñìè/äåâåòè/äåñåòè/åäèíàäåñåòè/äâàíàäåñåòè/òðèíàäåñåòè/÷åòèðèíàäåñåòè/ïåòíàäåñåòè/øåñòíàäåñåòè/ñåäåìíàäåñåòè/îñåìíàäåñåòè/äåâåòíàäåñåòè/äâàäåñåòè/21-è/22-è/23-è/24-è/25-è/26-è/27-è/28-è/29-è/30-è/31-è/32-è/33-è/34-è/35-è/36-è/37-è/38-è/39-è/40-è/41-è/42-è/43-è/44-è/45-è/46-è/47-è/48-è/49-è/50-è/51-è/52-è/53-è/54-è/55-è/56-è/57-è/58-è/59-è/60-è/61-è/62-è/63-è/64-è/65-è/66-è/67-è/68-è/69-è/70-è/71-è/72-è/73-è/74-è/75-è/76-è/77-è/78-è/79-è/80-è/81-è/82-è/83-è/84-è/85-è/86-è/87-è/88-è/89-è/90-è/91-è/92-è/93-è/94-è/95-è/96-è/97-è/98-è/99-è br: n-vet/1añ/eil/3de/4re/5vet/6vet/7vet/8vet/9vet/10vet/11vet/12vet/13vet/14vet/15vet/16vet/17vet/18vet/19vet/20vet/21vet/22vet/23vet/24vet/25vet/26vet/27vet/28vet/29vet/30vet/31vet/32vet/33vet/34vet/35vet/36vet/37vet/38vet/39vet/40vet/41vet/42vet/43vet/44vet/45vet/46vet/47vet/48vet/49vet/50vet/51vet/52vet/53vet/54vet/55vet/56vet/57vet/58vet/59vet/60vet/61vet/62vet/63vet/64vet/65vet/66vet/67vet/68vet/69vet/70vet/71vet/72vet/73vet/74vet/75vet/76vet/77vet/78vet/79vet/80vet/81vet/82vet/83vet/84vet/85vet/86vet/87vet/88vet/89vet/90vet/91vet/92vet/93vet/94vet/95vet/96vet/97vet/98vet/99vet/100vet/101vet/102vet/103vet/104vet ca: n-èssim/1er/2on/3er/4rt/5è/6è/7è/8è/9è/10è/11è/12è/13è/14è/15è/16è/17è/18è/19è/20è/21è/22mo/23è/24è/25è/26è/27è/28è/29è/30è/31è/32è/33è/34è/35è/36è/37è/38è/39è/40è/41è/42è/43è/44è/45è/46è/47è/48è/49è/50è/51è/52è/53è/54è/55è/56è/57è/58è/59è/60è/61è/62è/63è/64è/65è/66è/67è/68è/69è/70è/71è/72è/73è/74è/75è/76è/77è/78è/79è/80è/81è/82è/83è/84è/85è/86è/87è/88è/89è/90è/91è/92è/93è/94è/95è/96è/97è/98è/99è cs: n-tý/1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. da: ordenstal/1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. de: n-ten/1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. en: nth/1st/2nd/3rd/4th/5th/6th/7th/8th/9th/10th/11th/12th/13th/14th/15th/16th/17th/18th/19th/20th/21st/22nd/23rd/24th/25th/26th/27th/28th/29th/30th/31st/32nd/33rd/34th/35th/36th/37th/38th/39th/40th/41st/42nd/43rd/44th/45th/46th/47th/48th/49th/50th/51st/52nd/53rd/54th/55th/56th/57th/58th/59th/60th/61st/62nd/63rd/64th/65th/66th/67th/68th/69th/70th/71st/72nd/73rd/74th/75th/76th/77th/78th/79th/80th/81st/82nd/83rd/84th/85th/86th/87th/88th/89th/90th/91st/92nd/93rd/94th/95th/96th/97th/98th/99th eo: n-a/1a/2a/3a/4a/5a/6a/7a/8a/9a/10a/11a/12a/13a/14a/15a/16a/17a/18a/19a/20a/21a/22a/23a/24a/25a/26a/27a/28a/29a/30a/31a/32a/33a/34a/35a/36a/37a/38a/39a/40a/41a/42a/43a/44a/45a/46a/47a/48a/49a/50a/51a/52a/53a/54a/55a/56a/57a/58a/59a/60a/61a/62a/63a/64a/65a/66a/67a/68a/69a/70a/71a/72a/73a/74a/75a/76a/77a/78a/79a/80a/81a/82a/83a/84a/85a/86a/87a/88a/89a/90a/91a/92a/93a/94a/95a/96a/97a/98a/99a es: n-ésimo/1ro/2ndo/3ro/4to/5to/6to/7mo/8vo/9no/10mo/11ro/12ndo/13ro/14to/15to/16to/17mo/18vo/19no/20mo/21ro/22ndo/23ro/24to/25to/26to/27mo/28vo/29no/30mo/31ro/32ndo/33ro/34to/35to/36to/37mo/38vo/39no/40mo/41ro/42ndo/43ro/44to/45to/46to/47mo/48vo/49no/50mo/51ro/52ndo/53ro/54to/55to/56to/57mo/58vo/59no/60mo/61ro/62ndo/63ro/64to/65to/66to/67mo/68vo/69no/70mo/71ro/72ndo/73ro/74to/75to/76to/77mo/78vo/79no/80mo/81ro/82ndo/83ro/84to/85to/86to/87mo/88vo/89no/90mo/91ro/92ndo/93ro/94to/95to/96to/97mo/98vo/99na et: n-s/esimene/teine/kolmas/neljas/viies/kuues/seitsmes/kaheksas/üheksas/kümnes/üheteistkümnes/kaheteistkümnes/kolmeteistkümnes/neljateistkümnes/viieteistkümnes/kuueteistkümnes/seitsmeteistkümnes/kaheksateistkümnes/üheksateistkümnes/kahekümnes/kahekümne esimene/22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. fi: n./ensimmäinen/toinen/kolmas/neljäs/viides/kuudes/seitsemäs/kahdeksas/yhdeksäs/kymmenes/yhdestoista/kahdestoista/kolmastoista/neljästoista/viidestoista/kuudestoista/seitsämästoista/kahdeksastoista/yhdeksästoista/kahdeskymmenes/kahdeskymmenesensimmäinen/22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. fr: n-ième/1er/2e/3e/4e/5e/6e/7e/8e/9e/10e/11e/12e/13e/14e/15e/16e/17e/18e/19e/20e/21e/22e/23e/24e/25e/26e/27e/28e/29e/30e/31e/32e/33e/34e/35e/36e/37e/38e/39e/40e/41e/42e/43e/44e/45e/46e/47e/48e/49e/50e/51e/52e/53e/54e/55e/56e/57e/58e/59e/60e/61e/62e/63e/64e/65e/66e/67e/68e/69e/70e/71e/72e/73e/74e/75e/76e/77e/78e/79e/80e/81e/82e/83e/84e/85e/86e/87e/88e/89e/90e/91e/92e/93e/94e/95e/96e/97e/98e/99e/100e/101e/102e/103e/104e he: än/ øàùåï/ ùðé/ ùìéùé/ øáéòé/ çîùé/ ùéùé/ ùáéòé/ ùîéðé/ úùéòé/ òùéøé/11/12/13/14/15/16/17/18/19/20/21/22/23/24/25/26/27/8/29/30/31/32/33/34/35/36/37/38/39/40/41/42/43/44/45/46/47/48/49/50/51/52/53/54/55/56/57/58/59/60/61/62/63/64/65/66/67/68/69/70/71/72/73/74/75/76/77/78/79/80/81/82/83/84/85/86/87/88/89/90/91/92/93/94/95/96/97/98/99 is: n./1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. it: n-esimo/1o/2o/3o/4o/5o/6o/7o/8o/9o/10o/11o/12o/13o/14o/15o/16o/17o/18o/19o/20o/21o/22o/23o/24o/25o/26o/27o/28o/29o/30o/31o/32o/33o/34o/35o/36o/37o/38o/39o/40o/41o/42o/43o/44o/45o/46o/47o/48o/49o/50o/51o/52o/53o/54o/55o/56o/57o/58o/59o/60o/61o/62o/63o/64o/65o/66o/67o/68o/69o/70o/71o/72o/73o/74o/75o/76o/77o/78o/79o/80o/81o/82o/83o/84o/85o/86o/87o/88o/89o/90o/91o/92o/93o/94o/95o/96o/97o/98o/99o lv: /1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. nl: n-de/1ste/2de/3de/4de/5de/6de/7de/8ste/9de/10de/11de/12de/13de/14de/15de/16de/17de/18de/19de/20ste/21ste/22ste/23ste/24ste/25ste/26ste/27ste/28ste/29ste/30de/31ste/32ste/33ste/34ste/35ste/36ste/37ste/38ste/39ste/40ste/41ste/42ste/43ste/44ste/45ste/46ste/47ste/48ste/49ste/50ste/51ste/52ste/53ste/54ste/55ste/56ste/57ste/58ste/59ste/60ste/61ste/62ste/63ste/64ste/65ste/66ste/67ste/68ste/69ste/70ste/71ste/72ste/73ste/74ste/75ste/76ste/77ste/78ste/79ste/80ste/81ste/82ste/83ste/84ste/85ste/86ste/87ste/88ste/89ste/90ste/91ste/92ste/93ste/94ste/95ste/96ste/97ste/98ste/99ste no: n./første/andre/tredje/fjerde/femte/sjette/syvende/åttende/niende/tiende/ellevte/tolvte/trettende/fjortende/femtende/sekstende/søttende/attende/nittende/tyvende/21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99./100./101./102./103./104./105./106./107./108./109./110./111./112./113./114./115./116./117./118./119./120./121./122./123./124./125./126./127./128./129./130. pl: n./1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. pt: n-ésimo/1ro/2ndo/3ro/4rto/5to/6to/7mo/8vo/9no/10mo/11ro/12ndo/13ro/14rto/15to/16to/17mo/18vo/19no/20mo/21ro/22ndo/23ro/24rto/25to/26to/27mo/28vo/29no/30mo/31ro/32ndo/33ro/34rto/35to/36to/37mo/38vo/39no/40mo/41ro/42ndo/43ro/44rto/45to/46to/47mo/48vo/49no/50mo/51ro/52ndo/53ro/54rto/55to/56to/57mo/58vo/59no/60mo/61ro/62ndo/63ro/64rto/65to/66to/67mo/68vo/69no/70mo/71ro/72ndo/73ro/74rto/75to/76to/77mo/78vo/79no/80mo/81ro/82ndo/83ro/84rto/85to/86to/87mo/88vo/89no/90mo/91ro/92ndo/93ro/94rto/95to/96to/97mo/98vo/99no pt-br: n-ésimo/1º/2º/3º/4º/5º/6º/7º/8º/9º/10º/11º/12º/13º/14º/15º/16º/17º/18º/19º/20º/21º/22º/23º/24º/25º/26º/27º/28º/29º/30º/31º/32º/33º/34º/35º/36º/37º/38º/39º/40º/41º/42º/43º/44º/45º/46º/47º/48º/49º/50º/51º/52º/53º/54º/55º/56º/57º/58º/59º/60º/61º/62º/63º/64º/65º/66º/67º/68º/69º/70º/71º/72º/73º/74º/75º/76º/77º/78º/79º/80º/81º/82º/83º/84º/85º/86º/87º/88º/89º/90º/91º/92º/93º/94º/95º/96º/97º/98º/99º ro: n./1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. ru: ýííûé/1-é/2-é/3-é/4-é/5-é/6-é/-7é/8-é/9-é/10-é/11-é/11-é/12-é/13-é/14-é/15-é/16-é/17-é/18-é/19-é/20-é sl: ¹t./1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. sv: n:te/1:a/2:a/3:e/4:e/5:e/6:e/7:e/8:e/9:e/10:e/11:e/12:e/13:e/14:e/15:e/16:e/17:e/18:e/19:e/20:e/21:a/22:a/23:e/24:e/25:e/26:e/27:e/28:e/29:e/30:e/31:a/32:a/33:e/34:e/35:e/36e/37:e/38:e/39:e/40:e/41:a/42:a/43:e/44:e/45:e/46:e/47:e/48:e/49:e/50:e/51:a/52:a/53:e/54:e/55:e/56:e/57:e/58:e/59:e/60:e/61:a/62:a/63:e/64:e/65:e/66:e/67:e/68:e/69:e/70:e/71:a/72:a/73:e/74:e/75:e/76:e/77:e/78:e/79:e/80:e/81:a/82:a/83:e/84:e/85:e/86:e/87:e/88:e/89:e/90:e/91:a/92:a/93:e/94:e/95:e/96:e/97:e/98:e/99:e/100:e/101:a/102:a/103:e/104:e/105:e/106:e/107:e/108:e/109:e/110:e/111:e/112:e/113:e/114:e/115:e/116:e/117:e/118:e/119:e/120:e/121:a/122:a/123:e/124:e/125:e/126:e/127:e/128:e/129:e/130:e nth (cousin) af: n/1/2/3/4/5/6/7/8/9/10/11/12/13/14/15/16/17/18/19/20/21/22/23/24/25/26/27/28/29/30/31/32/33/34/35/36/37/38/39/40/41/42/43/44/45/46/47/48/49/50/51/52/53/54/55/56/57/58/59/60/61/62/63/64/65/66/67/68/69/70/71/72/73/74/75/76/77/78/79/80/81/82/83/84/85/86/87/88/89/90/91/92/93/94/95/96/97/98/99 bg: n-ò/ïúðâ/âòîð/òðåò/÷åòâúðò/ïåò/øåñò/ñåäì/îñì/äåâåò/äåñåò/åäèíàäåñåò/äâàíàäåñåò/òðèíàäåñåò/÷åòèðèíàäåñåò/ïåòíàäåñåò/øåñòíàäåñåò/ñåäåìíàäåñåò/îñåìíàäåñåò/äåâåòíàäåñåò/äâàäåñåò/21-/22-/23-/24-/25-/26-/27-/28-/29-/30-/31-/32-/33-/34-/35-/36-/37-/38-/39-/40-/41-/42-/43-/44-/45-/46-/47-/48-/49-/50-/51-/52-/53-/54-/55-/56-/57-/58-/59-/60-/61-/62-/63-/64-/65-/66-/67-/68-/69-/70-/71-/72-/73-/74-/75-/76-/77-/78-/79-/80-/81-/82-/83-/84-/85-/86-/87-/88-/89-/90-/91-/92-/93-/94-/95-/96-/97-/98-/99- br: n-vet/eil/3de/4re/5vet/6vet/7vet/8vet/9vet/10vet/11vet/12vet/13vet/14vte/15vte/16vet/17vet/18vet/19vet/20vet/21vet/22vet/23vet/24vet/25vet/26vet/27vet/28vet/29vet/30vet/31vet/32vet/33vet/34vet/35vet/36vet/37vet/38vet/39vet/40vet/41vet/42vet/43vet/44vet/45vet/46vet/47vet/48vet/49vet/50vet/51vet/52vet/53vet/54vet/55vet/56vet/57vet/58vet/59vet/60vet/61vet/62vet/63vet/64vet/65vet/66vet/67vet/68vet/69vet/70vet/71vet/72vet/73vet/74vet/75vet/76vet/77vet/78vet/79vet/80vet/81vet/82vet/83vet/84vet/85vet/86vet/87vet/88vet/89vet/90vet/91vet/92vet/93vet/94vet/95vet/96vet/97vet/98vet/99vet ca: n-èssim/1er/2on/3er/4rt/5è/6è/7è/8è/9è/10è/11è/12è/13è/14è/15è/16è/17è/18è/19è/20è/21è/22mo/23è/24è/25è/26è/27è/28è/29è/30è/31è/32è/33è/34è/35è/36è/37è/38è/39è/40è/41è/42è/43è/44è/45è/46è/47è/48è/49è/50è/51è/52è/53è/54è/55è/56è/57è/58è/59è/60è/61è/62è/63è/64è/65è/66è/67è/68è/69è/70è/71è/72è/73è/74è/75è/76è/77è/78è/79è/80è/81è/82è/83è/84è/85è/86è/87è/88è/89è/90è/91è/92è/93è/94è/95è/96è/97è/98è/99è cs: n-tý/1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. da: nte/1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. de: n-ten/1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. en: nth/1st/2nd/3rd/4th/5th/6th/7th/8th/9th/10th/11th/12th/13th/14th/15th/16th/17th/18th/19th/20th/21st/22nd/23rd/24th/25th/26th/27th/28th/29th/30th/31st/32nd/33rd/34th/35th/36th/37th/38th/39th/40th/41st/42nd/43rd/44th/45th/46th/47th/48th/49th/50th/51st/52nd/53rd/54th/55th/56th/57th/58th/59th/60th/61st/62nd/63rd/64th/65th/66th/67th/68th/69th/70th/71st/72nd/73rd/74th/75th/76th/77th/78th/79th/80th/81st/82nd/83rd/84th/85th/86th/87th/88th/89th/90th/91st/92nd/93rd/94th/95th/96th/97th/98th/99th eo: n-a/1a/2a/3a/4a/5a/6a/7a/8a/9a/10a/11a/12a/13a/14a/15a/16a/17a/18a/19a/20a/21a/22a/23a/24a/25a/26a/27a/28a/29a/30a/31a/32a/33a/34a/35a/36a/37a/38a/39a/40a/41a/42a/43a/44a/45a/46a/47a/48a/49a/50a/51a/52a/53a/54a/55a/56a/57a/58a/59a/60a/61a/62a/63a/64a/65a/66a/67a/68a/69a/70a/71a/72a/73a/74a/75a/76a/77a/78a/79a/80a/81a/82a/83a/84a/85a/86a/87a/88a/89a/90a/91a/92a/93a/94a/95a/96a/97a/98a/99a es: n-ésima/1ra/2nda/3ra/4ta/5ta/6ta/7ma/8va/9na/10ma/11ra/12nda/13ra/14ta/15ta/16ta/17ma/18va/19na/20ma/21ra/22nda/23ra/24ta/25ta/26ta/27ma/28va/29na/30ma/31ra/32nda/33ra/34ta/35ta/36ta/37ma/38va/39na/40ma/41ra/42nda/43ra/44ta/45ta/46ta/47ma/48va/49na/50ma/51ra/52nda/53ra/54ta/55ta/56ta/57ma/58va/59na/60ma/61ra/62nda/63ra/64ta/65ta/66ta/67ma/68va/69na/70ma/71ra/72nda/73ra/74ta/75ta/76ta/77ma/78va/79na/80ma/81ra/82nda/83ra/84ta/85ta/86ta/87ma/88va/89na/90ma/91ra/92nda/93ra/94ta/95ta/96ta/97ma/98va/99na et: n-s/1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. fi: n./1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. fr: n-ième/2e/3e/4e/5e/6e/7e/8e/9e/10e/11e/12e/13e/14e/15e/16e/17e/18e/19e/20e/21e/22e/23e/24e/25e/26e/27e/28e/29e/30e/31e/32e/33e/34e/35e/36e/37e/38e/39e/40e/41e/42e/43e/44e/45e/46e/47e/48e/49e/50e/51e/52e/53e/54e/55e/56e/57e/58e/59e/60e/61e/62e/63e/64e/65e/66e/67e/68e/69e/70e/71e/72e/73e/74e/75e/76e/77e/78e/79e/80e/81e/82e/83e/84e/85e/86e/87e/88e/89e/90e/91e/92e/93e/94e/95e/96e/97e/98e/99e he: än/ øàùåðä/ ùðéú/ ùìéùéú/ øáéòéú/ çîùéú/ ùéùéú/ ùáéòéú/ ùîéðéú/ úùéòéú/ òùéøéú/11/12/13/14/15/16/17/18/19/20/21/22/23/24/25/26/27/8/29/30/31/32/33/34/35/36/37/38/39/40/41/42/43/44/45/46/47/48/49/50/51/52/53/54/55/56/57/58/59/60/61/62/63/64/65/66/67/68/69/70/71/72/73/74/75/76/77/78/79/80/81/82/83/84/85/86/87/88/89/90/91/92/93/94/95/96/97/98/99 is: n./1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. it: n-esimo/1o/2o/3o/4o/5o/6o/7o/8o/9o/10o/11o/12o/13o/14o/15o/16o/17o/18o/19o/20o/21o/22o/23o/24o/25o/26o/27o/28o/29o/30o/31o/32o/33o/34o/35o/36o/37o/38o/39o/40o/41o/42o/43o/44o/45o/46o/47o/48o/49o/50o/51o/52o/53o/54o/55o/56o/57o/58o/59o/60o/61o/62o/63o/64o/65o/66o/67o/68o/69o/70o/71o/72o/73o/74o/75o/76o/77o/78o/79o/80o/81o/82o/83o/84o/85o/86o/87o/88o/89o/90o/91o/92o/93o/94o/95o/96o/97o/98o/99o lv: /1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. nl: n/1/2/3/4/5/6/7/8/9/10/11/12/13/14/15/16/17/18/19/20/21/22/23/24/25/26/27/28/29/30/31/32/33/34/35/36/37/38/39/40/41/42/43/44/45/46/47/48/49/50/51/52/53/54/55/56/57/58/59/60/61/62/63/64/65/66/67/68/69/70/71/72/73/74/75/76/77/78/79/80/81/82/83/84/85/86/87/88/89/90/91/92/93/94/95/96/97/98/99 no: n/to/tre/fir/fem/seks/syv/åtte/ni/ti/elleve/tolv/tretten/fjorten/femten/seksten/søtten/atten/nitten/tyve/21/22/23/24/25/26/27/28/29/30/31/32/33/34/35/36/37/38/39/40/41/42/43/44/45/46/47/48/49/50/51/52/53/54/55/56/57/58/59/60/61/62/63/64/65/66/67/68/69/70/71/72/73/74/75/76/77/78/79/80/81/82/83/84/85/86/87/88/89/90/91/92/93/94/95/96/97/98/99 pl: n-tego/1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. pt: n-ésimo/1ro/2ndo/3ro/4rto/5to/6to/7mo/8vo/9no/10mo/11ro/12ndo/13ro/14rto/15to/16to/17mo/18vo/19no/20mo/21ro/22ndo/23ro/24rto/25to/26to/27mo/28vo/29no/30mo/31ro/32ndo/33ro/34rto/35to/36to/37mo/38vo/39no/40mo/41ro/42ndo/43ro/44rto/45to/46to/47mo/48vo/49no/50mo/51ro/52ndo/53ro/54rto/55to/56to/57mo/58vo/59no/60mo/61ro/62ndo/63ro/64rto/65to/66to/67mo/68vo/69no/70mo/71ro/72ndo/73ro/74rto/75to/76to/77mo/78vo/79no/80mo/81ro/82ndo/83ro/84rto/85to/86to/87mo/88vo/89no/90mo/91ro/92ndo/93ro/94rto/95to/96to/97mo/98vo/99no pt-br: n-ésimo/1º/2º/3º/4º/5º/6º/7º/8º/9º/10º/11º/12º/13º/14º/15º/16º/17º/18º/19º/20º/21º/22º/23º/24º/25º/26º/27º/28º/29º/30º/31º/32º/33º/34º/35º/36º/37º/38º/39º/40º/41º/42º/43º/44º/45º/46º/47º/48º/49º/50º/51º/52º/53º/54º/55º/56º/57º/58º/59º/60º/61º/62º/63º/64º/65º/66º/67º/68º/69º/70º/71º/72º/73º/74º/75º/76º/77º/78º/79º/80º/81º/82º/83º/84º/85º/86º/87º/88º/89º/90º/91º/92º/93º/94º/95º/96º/97º/98º/99º ro: n-elea/primar/de gradul 2/de gradul 3/de gradul 4/de gardul 5/de gradul 6/de gradul 7/de gradul 8/de gradul 9/de gradul 10 ru: ýííûé/1-é/2-é/3-é/4-é/5-é/6-é/-7é/8-é/9-é/10-é/11-é/11-é/12-é/13-é/14-é/15-é/16-é/17-é/18-é/19-é/20-é sl: /1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. sv: n/två/tre/fyra/fem/sex/sju/åtta/nio/tio/elva/tolv/tretton/fjorton/femton/sexton/sjutton/arton/nitton/tjugo/21/22/23/24/25/26/27/28/29/30/31/32/33/34/35/36/37/38/39/40/41/42/43/44/45/46/47/48/49/50/51/52/53/54/55/56/57/58/59/60/61/62/63/64/65/66/67/68/69/70/71/72/73/74/75/76/77/78/79/80/81/82/83/84/85/86/87/88/89/90/91/92/93/94/95/96/97/98/99/100/101/102/103/104/105/106/107/108/109/110/111/112/113/114/115/116/117/118/119/120/121/122/123/124/125/126/127/128/129/130 nth (generation) af: n-te/1ste/2de/3de/4de/5de/6de/7de/8ste/9de/10de/11de/12de/13de/14de/15de/16de/17de/18de/19de/20ste/21ste/22ste/23ste/24ste/25ste/26ste/27ste/28ste/29ste/30de/31ste/32ste/33ste/34ste/35ste/36ste/37ste/38ste/39ste/40ste/41ste/42ste/43ste/44ste/45ste/46ste/47ste/48ste/49ste/50ste/51ste/52ste/53ste/54ste/55ste/56ste/57ste/58ste/59ste/60ste/61ste/62ste/63ste/64ste/65ste/66ste/67ste/68ste/69ste/70ste/71ste/72ste/73ste/74ste/75ste/76ste/77ste/78ste/79ste/80ste/81ste/82ste/83ste/84ste/85ste/86ste/87ste/88ste/89ste/90ste/91ste/92ste/93ste/94ste/95ste/96ste/97ste/98ste/99ste bg: n-òî/ïúðâî/âòîðî/òðåòî/÷åòâúðòî/ïåòî/øåñòî/ñåäìî/îñìî/äåâåòî/äåñåòî/åäèíàäåñåòî/äâàíàäåñåòî/òðèíàäåñåòî/÷åòèðèíàäåñåòî/ïåòíàäåñåòî/øåñòíàäåñåòî/ñåäåìíàäåñåòî/îñåìíàäåñåòî/äåâåòíàäåñåòî/äâàäåñåòî/21-î/22-î/23-î/24-î/25-î/26-î/27-î/28-î/29-î/30-î/31-î/32-î/33-î/34-î/35-î/36-î/37-î/38-î/39-î/40-î/41-î/42-î/43-î/44-î/45-î/46-î/47-î/48-î/49-î/50-î/51-î/52-î/53-î/54-î/55-î/56-î/57-î/58-î/59-î/60-î/61-î/62-î/63-î/64-î/65-î/66-î/67-î/68-î/69-î/70-î/71-î/72-î/73-î/74-î/75-î/76-î/77-î/78-î/79-î/80-î/81-î/82-î/83-î/84-î/85-î/86-î/87-î/88-î/89-î/90-î/91-î/92-î/93-î/94-î/95-î/96-î/97-î/98-î/99-î br: n-vet/1añ/eil/3de/4re/5vet/6vet/7vet/8vet/9vet/10vet/11vet/12vet/13vet/14vet/15vet/16vet/17vet/18vet/19vet/20vet/21vet/22vet/23vet/24vet/25vet/26vet/27vet/28vet/29vet/30vet/31vet/32vet/33vet/34vet/35vet/36vet/37vet/38vet/39vet/40vet/41vet/42vet/43vet/44vet/45vet/46vet/47vet/48vet/49vet/50vet/51vet/52vet/53vet/54vet/55vet/56vet/57vet/58vet/59vet/60vet/61vet/62vet/63vet/64vet/65vet/66vet/67vet/68vet/69vet/70vet/71vet/72vet/73vet/74vet/75vet/76vet/77vet/78vet/79vet/80vet/81vet/82vet/83vet/84vet/85vet/86vet/87vet/88vet/89vet/90vet/91vet/92vet/93vet/94vet/95vet/96vet/97vet/98vet/99vet/100vet/101vet/102vet/103vet/104vet ca: n-èssima/1a/2a/3a/4a/5a/6a/7a/8a/9a/10a/11a/12a/13a/14a/15a/16a/17a/18a/19a/20a/21a/22a/23a/24a/25a/26a/27a/28a/29a/30a/31a/32a/33a/34a/35a/36a/37a/38a/39a/40a/41a/42a/43a/44a/45a/46a/47a/48a/49a/50a/51a/52a/53a/54a/55a/56a/57a/58a/59a/60a/61a/62a/63a/64a/65a/66a/67a/68a/69a/70a/71a/72a/73a/74a/75a/76a/77a/78a/79a/80a/81a/82a/83a/84a/85a/86a/87a/88a/89a/90a/91a/92a/93a/94a/95a/96a/97a/98a/99a cs: n-tý/1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. da: nte/1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. de: n-ten/1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. en: nth/1st/2nd/3rd/4th/5th/6th/7th/8th/9th/10th/11th/12th/13th/14th/15th/16th/17th/18th/19th/20th/21st/22nd/23rd/24th/25th/26th/27th/28th/29th/30th/31st/32nd/33rd/34th/35th/36th/37th/38th/39th/40th/41st/42nd/43rd/44th/45th/46th/47th/48th/49th/50th/51st/52nd/53rd/54th/55th/56th/57th/58th/59th/60th/61st/62nd/63rd/64th/65th/66th/67th/68th/69th/70th/71st/72nd/73rd/74th/75th/76th/77th/78th/79th/80th/81st/82nd/83rd/84th/85th/86th/87th/88th/89th/90th/91st/92nd/93rd/94th/95th/96th/97th/98th/99th eo: n-a/1a/2a/3a/4a/5a/6a/7a/8a/9a/10a/11a/12a/13a/14a/15a/16a/17a/18a/19a/20a/21a/22a/23a/24a/25a/26a/27a/28a/29a/30a/31a/32a/33a/34a/35a/36a/37a/38a/39a/40a/41a/42a/43a/44a/45a/46a/47a/48a/49a/50a/51a/52a/53a/54a/55a/56a/57a/58a/59a/60a/61a/62a/63a/64a/65a/66a/67a/68a/69a/70a/71a/72a/73a/74a/75a/76a/77a/78a/79a/80a/81a/82a/83a/84a/85a/86a/87a/88a/89a/90a/91a/92a/93a/94a/95a/96a/97a/98a/99a es: n-ésima/1ra/2nda/3ra/4ta/5ta/6ta/7ma/8va/9na/10ma/11ra/12nda/13ra/14ta/15ta/16ta/17ma/18va/19na/20ma/21ra/22nda/23ra/24ta/25ta/26ta/27ma/28va/29na/30ma/31ra/32nda/33ra/34ta/35ta/36ta/37ma/38va/39na/40ma/41ra/42nda/43ra/44ta/45ta/46ta/47ma/48va/49na/50ma/51ra/52nda/53ra/54ta/55ta/56ta/57ma/58va/59na/60ma/61ra/62nda/63ra/64ta/65ta/66ta/67ma/68va/69na/70ma/71ra/72nda/73ra/74ta/75ta/76ta/77ma/78va/79na/80ma/81ra/82nda/83ra/84ta/85ta/86ta/87ma/88va/89na/90ma/91ra/92nda/93ra/94ta/95ta/96ta/97ma/98va/99na et: n-s/1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. fi: n./1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. fr: n-ième/1ère/2e/3e/4e/5e/6e/7e/8e/9e/10e/11e/12e/13e/14e/15e/16e/17e/18e/19e/20e/21e/22e/23e/24e/25e/26e/27e/28e/29e/30e/31e/32e/33e/34e/35e/36e/37e/38e/39e/40e/41e/42e/43e/44e/45e/46e/47e/48e/49e/50e/51e/52e/53e/54e/55e/56e/57e/58e/59e/60e/61e/62e/63e/64e/65e/66e/67e/68e/69e/70e/71e/72e/73e/74e/75e/76e/77e/78e/79e/80e/81e/82e/83e/84e/85e/86e/87e/88e/89e/90e/91e/92e/93e/94e/95e/96e/97e/98e/99e/100e/101e/102e/103e/104e/105e/106e/107e/108e/109e/110e/111e/112e/113e/114e/115e/116e/117e/118e/119e/120e/121e/122e/123e/124e/125e he: än/ øàùåï/ ùðé/ ùìéùé/ øáéòé/ çîùé/ ùéùé/ ùáéòé/ ùîéðé/ úùéòé/ òùéøé/11/12/13/14/15/16/17/18/19/20/21/22/23/24/25/26/27/8/29/30/31/32/33/34/35/36/37/38/39/40/41/42/43/44/45/46/47/48/49/50/51/52/53/54/55/56/57/58/59/60/61/62/63/64/65/66/67/68/69/70/71/72/73/74/75/76/77/78/79/80/81/82/83/84/85/86/87/88/89/90/91/92/93/94/95/96/97/98/99 is: /1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. it: n-esima/1a/2a/3a/4a/5a/6a/7a/8a/9a/10a/11a/12a/13a/14a/15a/16a/17a/18a/19a/20a/21a/22a/23a/24a/25a/26a/27a/28a/29a/30a/31a/32a/33a/34a/35a/36a/37a/38a/39a/40a/41a/42a/43a/44a/45a/46a/47a/48a/49a/50a/51a/52a/53a/54a/55a/56a/57a/58a/59a/60a/61a/62a/63a/64a/65a/66a/67a/68a/69a/70a/71a/72a/73a/74a/75a/76a/77a/78a/79a/80a/81a/82a/83a/84a/85a/86a/87a/88a/89a/90a/91a/92a/93a/94a/95a/96a/97a/98a/99a lv: /1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. nl: n-de/1ste/2de/3de/4de/5de/6de/7de/8ste/9de/10de/11de/12de/13de/14de/15de/16de/17de/18de/19de/20ste/21ste/22ste/23ste/24ste/25ste/26ste/27ste/28ste/29ste/30de/31ste/32ste/33ste/34ste/35ste/36ste/37ste/38ste/39ste/40ste/41ste/42ste/43ste/44ste/45ste/46ste/47ste/48ste/49ste/50ste/51ste/52ste/53ste/54ste/55ste/56ste/57ste/58ste/59ste/60ste/61ste/62ste/63ste/64ste/65ste/66ste/67ste/68ste/69ste/70ste/71ste/72ste/73ste/74ste/75ste/76ste/77ste/78ste/79ste/80ste/81ste/82ste/83ste/84ste/85ste/86ste/87ste/88ste/89ste/90ste/91ste/92ste/93ste/94ste/95ste/96ste/97ste/98ste/99ste no: n./første/andre/tredje/fjerde/femte/sjette/syvende/åttende/niende/tiende/ellevte/tolvte/trettende/fjortende/femtende/sekstende/søttende/attende/nittende/tyvende/21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99./100./101./102./103./104./105./106./107./108./109./110./111./112./113./114./115./116./117./118./119./120./121./122./123./124./125./126./127./128./129./130. pl: n/1/2/3/4/5/6/7/8/9/10/11/12/13/14/15/16/17/18/19/20/21/22/23/24/25/26/27/28/29/30/31/32/33/34/35/36/37/38/39/40/41/42/43/44/45/46/47/48/49/50/51/52/53/54/55/56/57/58/59/60/61/62/63/64/65/66/67/68/69/70/71/72/73/74/75/76/77/78/79/80/81/82/83/84/85/86/87/88/89/90/91/92/93/94/95/96/97/98/99 pt: n-ésima/1ra/2nda/3ra/4ta/5ta/6ta/7ma/8va/9na/10ma/11ra/12nda/13ra/14ta/15ta/16ta/17ma/18va/19na/20ma/21ra/22nda/23ra/24ta/25ta/26ta/27ma/28va/29na/30ma/31ra/32nda/33ra/34ta/35ta/36ta/37ma/38va/39na/40ma/41ra/42nda/43ra/44ta/45ta/46ta/47ma/48va/49na/50ma/51ra/52nda/53ra/54ta/55ta/56ta/57ma/58va/59na/60ma/61ra/62nda/63ra/64ta/65ta/66ta/67ma/68va/69na/70ma/71ra/72nda/73ra/74ta/75ta/76ta/77ma/78va/79na/80ma/81ra/82nda/83ra/84ta/85ta/86ta/87ma/88va/89na/90ma/91ra/92nda/93ra/94ta/95ta/96ta/97ma/98va/99na pt-br: n-ésima/1º/2º/3º/4º/5º/6º/7º/8º/9º/10º/11º/12º/13º/14º/15º/16º/17º/18º/19º/20º/21º/22º/23º/24º/25º/26º/27º/28º/29º/30º/31º/32º/33º/34º/35º/36º/37º/38º/39º/40º/41º/42º/43º/44º/45º/46º/47º/48º/49º/50º/51º/52º/53º/54º/55º/56º/57º/58º/59º/60º/61º/62º/63º/64º/65º/66º/67º/68º/69º/70º/71º/72º/73º/74º/75º/76º/77º/78º/79º/80º/81º/82º/83º/84º/85º/86º/87º/88º/89º/90º/91º/92º/93º/94º/95º/96º/97º/98º/99º ro: n./1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. ru: ýííîãî/1-ãî/2-ãî/3-ãî/4-ãî/5-ãî/6-ãî/7-ãî/8-ãî/9-ãî/10-ãî/11-ãî/12-ãî/13-ãî/14-ãî/15-ãî/16-ãî/17-ãî/18-ãî/19-ãî/20-ãî/10-ãî/11-ãî/12-ãî/13-ãî/14-ãî/15-ãî/16-ãî/17-ãî/18-ãî/19-ãî/10-ãî/21-ãî/22-ãî/23-ãî/24-ãî/25-ãî/26-ãî/27-ãî/28-ãî/29-ãî/30-ãî/31-ãî/32-ãî/33-ãî/34-ãî/35-ãî/36-ãî/37-ãî/38-ãî/39-ãî/40-ãî/41-ãî/42-ãî/43-ãî/44-ãî/45-ãî/46-ãî/47-ãî/48-ãî/49-ãî/50-ãî/51-ãî/52-ãî/53-ãî/54-ãî/55-ãî/56-ãî/57-ãî/58-ãî/59-ãî/60-ãî/61-ãî/62-ãî/63-ãî/64-ãî/65-ãî/66-ãî/67-ãî/68-ãî/69-ãî/70-ãî/71-ãî/72-ãî/73-ãî/74-ãî/75-ãî/76-ãî/77-ãî/78-ãî/79-ãî/80-ãî/81-ãî/82-ãî/83-ãî/84-ãî/85-ãî/86-ãî/87-ãî/88-ãî/89-ãî/90-ãî/91-ãî/92-ãî/93-ãî/94-ãî/95-ãî/96-ãî/97-ãî/98-ãî/99-ãî sl: /1./2./3./4./5./6./7./8./9./10./11./12./13./14./15./16./17./18./19./20./21./22./23./24./25./26./27./28./29./30./31./32./33./34./35./36./37./38./39./40./41./42./43./44./45./46./47./48./49./50./51./52./53./54./55./56./57./58./59./60./61./62./63./64./65./66./67./68./69./70./71./72./73./74./75./76./77./78./79./80./81./82./83./84./85./86./87./88./89./90./91./92./93./94./95./96./97./98./99. sv: n:te/1:a/2:a/3:e/4:e/5:e/6:e/7:e/8:e/9:e/10:e/11:e/12:e/13:e/14:e/15:e/16:e/17:e/18:e/19:e/20:e/21:a/22:a/23:e/24:e/25:e/26:e/27:e/28:e/29:e/30:e/31:a/32:a/33:e/34:e/35:e/36e/37:e/38:e/39:e/40:e/41:a/42:a/43:e/44:e/45:e/46:e/47:e/48:e/49:e/50:e/51:a/52:a/53:e/54:e/55:e/56:e/57:e/58:e/59:e/60:e/61:a/62:a/63:e/64:e/65:e/66:e/67:e/68:e/69:e/70:e/71:a/72:a/73:e/74:e/75:e/76:e/77:e/78:e/79:e/80:e/81:a/82:a/83:e/84:e/85:e/86:e/87:e/88:e/89:e/90:e/91:a/92:a/93:e/94:e/95:e/96:e/97:e/98:e/99:e/100:e/101:a/102:a/103:e/104:e/105:e/106:e/107:e/108:e/109:e/110:e/111:e/112:e/113:e/114:e/115:e/116:e/117:e/118:e/119:e/120:e/121:a/122:a/123:e/124:e/125:e/126:e/127:e/128:e/129:e/130:e number af: nommer bg: íîìåð br: niverenn ca: número cs: èíslo da: løbenummer de: Nummer en: number eo: nombro es: número et: number fi: numero fr: numéro he: îñôø is: númer it: numero lv: nummurs nl: nummer no: nummer pl: numer pt: número ro: numar ru: ÷èñëî sl: ¹tevilka sv: nummer number of branches af: aantal stake bg: áðîé íà êëîíîâåòå br: niver ar skourroù ca: nombre de branques cs: poèet vìtví da: antal grene de: Anzahl der Äste en: number of branches eo: nombro da brancxoj es: número de ramas et: harude arv fi: sukuhaarojen määrä fr: nombre de branches he: îñôø òðôéí is: fjöldi greina it: numero di rami lv: zaru skaits nl: aantal takken no: antall slektsgrener pl: liczba linii (ga³êzi) pt: número de ramos ro: numar de ramuri ru: ÷èñëî âåòâåé sl: ¹tevilo vej sv: antal grenar number of living persons: bg: áðîé íà æèâèòå ëèöà: da: antal nulevende personer: de: Anzahl der lebenden Personen: en: number of living persons: es: número de personas vivas: fr: nombre de personnes vivantes : nl: aantal personen in leven: pt: número de pessoas vivas : ro: numarul de persoane in viata: sl: ¹tevilo ¾ivih oseb sv: antal levande personer: occupation af: beroep bg: çàíÿòèå br: micher ca: ocupació cs: zamìstnání da: stilling de: Beruf en: occupation eo: okupado es: ocupación et: amet fi: ammatti fr: profession he: î÷öåò is: starf it: professione lv: nodarboðanâs nl: beroep no: yrke pl: zawód pt: ocupação ro: ocupatie ru: çàíÿòèå sl: poklic sv: yrke of the %s generation af: uit die %s geslag bg: îò %s ïîêîëåíèå br: eus an %s rummad ca: a la %s generació cs: %s. generace da: af den %s generation de: der %s Generation en: of the %s generation eo: el la %s generacio es: de la %s generación et: (%s sugupõlv) fi: %s sukupolvea fr: à la %s génération he: ìãåø %s is: af %s kynslóð it: della %s generazione lv: %s-â paaudzç nl: van de %s generatie no: av %s generasjon pl: w %s. pokoleniu pt: da %s geração ro: de generatia %s ru: %s ïîêîëåíèÿ sl: %s generacije sv: av den %s generationen on %s's side af: aan die kant van %s bg: îò ñòðàíà íà %s br: eus tu %s ca: per part de %s cs: ze strany :g:%s da: fra %s's side de: von %ss Seite en: on %s's side eo: de la flanko de %s es: por parte de %s et: %s poolt fi: henkilön %s puolelta fr: du côté de %s he: áöã ùì %s is: á %s hlið it: dalla parte di %s lv: %s-jâ pusç nl: van %s's kant no: fra %ss slektside pl: ze strony osoby: %s pt: pelo lado de %s ro: de partea %s ru: ñî ñòîðîíû %s sl: po strani %s sv: från %ss släktsida on (day month year) af: op bg: íà br: d'an ca: el cs: dne da: den de: am en: on eo: la es: el et: :i: fi: :e: fr: le he: á- is:   it: il lv: datums: nl: op no: den pl: dnia pt: a ro: la ru: sl: sv: den zh: ÓÚ on (weekday day month year) af: bg: br: d'ar ca: cs: da: de: en: eo: es: et: :i: fi: :e: fr: he: is: it: lv: nl: no: pl: w :a: pt: ro: ru: sl: sv: zh: one day old af: een dag oud bg: íà åäèí äåí br: un devezh ca: un dia cs: jeden den starý/jeden den stará da: en dag gammel de: einen Tag alt en: one day old eo: unu tago es: un día et: üks päev fi: päivän ikäisenä fr: un jour he: áï/áú éåí is: dagsgamalt it: un giorno lv: vienu dienu vecs nl: één dag oud no: en dag gammel pl: w wieku 1 dnia pt: um dia ro: o zi ru: îäíîäíåâíûé sl: star en dan sv: en dag one month old af: een maand oud bg: íà åäèí ìåñåö br: ur mizvezh ca: un mes cs: jeden mìsíc starý/jeden mìsíc stará da: en måned gammel de: einen Monat alt en: one month old eo: unu monato es: un mes et: üks kuu fi: kuukauden ikäisenä fr: un mois he: áï/áú çåãù is: mánaðar gamalt it: un mese lv: vienu mçnesi vecs nl: één maand oud no: en måned gammel pl: w wieku 1 miesi±ca pt: um mês ro: o luna ru: ìåñÿ÷íûé sl: star en mesec sv: en månad one year old af: een jaar oud bg: íà åäíà ãîäèíà br: ur bloavezh ca: un any cs: jeden rok starý/jeden rok stará da: et år gammel de: ein Jahr alt en: one year old eo: unu jaro es: un año et: üks aasta fi: vuoden ikäisenä fr: un an he: áï/áú ùðä is: ársgamalt it: un anno lv: vienu gadu vecs nl: één jaar oud no: ett år gammel pl: w wieku 1 roku pt: um ano ro: un an ru: äî ãîäà sl: star eno leto sv: ett år only the generation selected af: net die gekose geslag bg: ñàìî èçáðàíîòî ïîêîëåíèå br: ar rummad-tud dibabet hepken ca: només la generació elegida cs: pouze zvolená generace da: kun den valgte generation de: nur die ausgewählte Generation en: only the selected generation eo: nur la elektita generacio es: solamente la generación elegida et: ainult valitud sugupõlv fi: vain valittu sukupolvi fr: seulement la génération sélectionnée he: ãåø äðáëø áìáã is: aðeins valda kynslóðin it: soltanto la generazione selezionata lv: tikai izvçlçtajai paaudzei nl: alleen de geselecteerde generatie no: bare den valgte generasjonen pl: tylko wybrane pokolenie pt: só a geração selecionada ro: numai generatia aleasa ru: òîëüêî âûáðàííîå ïîêîëåíèå sl: samo izbrana generacija sv: endast den valda generationen optional af: opsioneel bg: ïî æåëàíèå br: diret ca: opcional cs: volitelnì da: efter behag de: optional en: optional eo: nedeviga es: opcional et: vabatahtlik fi: valittavissa fr: facultatif he: òì ôé áçéøä is: má velja it: opzionale lv: neobligâts nl: optioneel no: valgfritt pl: opcjonalnie pt: opcional ro: optional ru: äîïîëíèòåëüíî sl: po ¾elji sv: valfritt or af: of bg: èëè br: pe ca: o cs: nebo da: eller de: oder en: or eo: aù es: o et: või fi: tai fr: ou he: àå is: eða it: o lv: vai nl: of no: eller pl: lub pt: ou ro: sau ru: èëè sl: ali sv: eller parents af: ouers bg: ðîäèòåëè br: kerent ca: pares cs: rodièe da: forældre de: Eltern en: parents eo: gepatroj:a:+n es: padres et: vanemad fi: vanhemmat fr: parents he: äåøéí is: foreldrar it: genitori lv: vecâki nl: ouders no: foreldre pl: rodzice:a:-ów pt: pais ro: parinti ru: ðîäèòåëè sl: star¹i sv: föräldrar zh: ¸¸Ä¸ person added af: persoon bygevoeg bg: äàííèòå çà ëèöåòî ñà äîáàâåíè br: den ouzhpennet ca: persona afegida cs: osoba pøidána da: person tilføjet de: Person hinzugefügt en: person added eo: persono aldonita es: persona agregada et: isik lisatud fi: lisätty henkilö fr: personne ajoutée he: àãí äåñó is: einstaklingi bætt við it: persona aggiunta lv: persona pievienota nl: persoon toegevoegd no: personen er opprettet pl: osoba zosta³a dodana pt: pessoa acrescentada ro: persoana adaugata ru: ÷åëîâåê äîáàâëåí sl: oseba dodana sv: person tillagd person deleted af: persoon verwyder bg: äàííèòå çà ëèöåòî ñà ïðåìàõíàòè br: den lamet kuit ca: persona esborrada cs: osoba smazána da: person slettet de: Person gelöscht en: person deleted eo: persono nuligita es: persona borrada et: isik kustutatud fi: poistettu henkilö fr: personne supprimée he: àãí ðîç÷ is: einstaklingi eytt it: persona cancellata lv: persona izdzçsta nl: persoon verwijderd no: personen er fjernet pl: osoba zosta³a usunieta pt: pessoa suprimida ro: persoana suprimata ru: ÷åëîâåê óäàëåí sl: oseba izbrisana sv: person borttagen person modified af: persoon verander bg: äàííèòå çà ëèöåòî ñà ïðîìåíåíè br: den kemmet ca: persona modificada cs: osoba zmìnìna da: person ændret de: Person geändert en: person modified eo: persono modifita es: persona modificada et: isik muudetud fi: henkilöä muokattu fr: personne modifiée he: àãí îòåãëï is: einstaklingi breytt it: persona modificata lv: personas dati mainîti nl: persoon veranderd no: personen er endret pl: dane poni¿szej osoby zosta³y zaktualizowane pt: pessoa modificada ro: persoana modificata ru: ÷åëîâåê èçìåíåí sl: oseba spremenjena sv: person ändrad person/persons af: persoon/persone bg: äàííè çà ëèöåòî/ñâåäåíèÿ çà ëèöà br: den/tud ca: persona/persones cs: osoba/osob da: person/personer de: Person/Personen en: person/persons eo: persono:a:+n/personoj:a:+n es: persona/personas et: isik/isiku"(c?t:d) fi: henkilö/henkilöä fr: personne/personnes he: àãí/ àðùéí is: einstaklingur/einstaklingar it: persona/persone lv: persona(s) nl: persoon/personen no: person/personer pl: osoba:a:-ê/osoby pt: pessoa/pessoas ro: persoana/persoane ru: ×åëîâåêà/×åëîâåê sl: oseba/oseb sv: person/personer persons having the same name af: persone met dieselfde nommer bg: ëèöå ñúñ ñúùîòî èìå br: tud a zo an hevelep anv dezho ca: persones amb el mateix nom cs: osoby mají stejné jméno da: personer som har samme navn de: Personen haben denselben Namen en: persons having the same name eo: personoj samnomaj es: personas con el mismo nombre et: samanimelised isikud fi: samannimisiä henkilöitä fr: personnes ayant le même nom he: àðùéí òí àåúå äùí is: fólk með sama nafn it: persone con lo stesso nome lv: peronas ar vienâdiem vârdiem nl: personen met dezelfde naam no: personer som har samme navn pl: osoby o tym samym imieniu i nazwisku pt: pessoas com o mesmo apelido pt-br: pessoas com o mesmo nome ro: persoane cu acelas nume ru: ÷åëîâåê ñ òåì æå èìåíåì sl: osebe z istim imenom sv: personer som har samma namn place af: plek bg: ìÿñòî br: lec'h ca: lloc cs: místo da: sted de: Ort en: place eo: loko es: lugar et: koht fi: paikka fr: lieu he: î÷åí is: staður it: luogo lv: vieta nl: plaats no: sted pl: miejsce pt: lugar ro: localitate ru: ìåñòî sl: kraj sv: plats population pyramid bg: âúçðàñòîâà ïèðàìèäà da: befolkningspyramide de: Alterspyramide en: population pyramid es: pirámide de población fr: pyramide des âges nl: bevolkingspiramide pt: pirâmide populacional ro: piramida demografică sl: populacijska piramida sv: befolkningspyramid possibly (date) af: miskien bg: ìîæå áè br: marteze ca: possiblement cs: snad da: måske de: vielleicht en: possibly eo: eble es: posiblemente et: võib-olla :i: fi: ehkä fr: peut-être he: àåìé is: kannski it: forse lv: iespçjams nl: mogelijkerwijze no: kanskje pl: prawdopodobnie pt: possivelmente ro: poate ru: âîçìîæíî sl: verjetno sv: kanske precision af: akkuraatheid bg: òî÷íîñò br: resisadur ca: precisió cs: pøesnì da: præcisering de: Genauigkeit en: precision eo: precizeco es: precisión et: täpsus fi: tarkennus fr: précision he: ãééå÷ is: nákvæmni it: precisione lv: precizitâte nl: precisie no: nøyaktighet pl: dok³adno¶æ pt: precisão ro: precizie ru: òî÷íî sl: natanènost sv: precision previous sibling af: vorige broer/vorige suster/vorige broer of suster bg: ïðåäõîæäàù áðàò/ïðåäõîæäàùà ñåñòðà/ïðåäõîæäàù áðàò èëè ïðåäõîæäàùà ñåñòðà br: breur kent/c'hoar kent/breur pe c'hoar kent ca: germà anterior/germana anterior/germà(ana) anterior cs: pøedchozí sourozenec da: foregående søskende de: vorhergehender Bruder/vorhergehende Schwester/vorhergehende Geschwister en: previous sibling eo: antaùa frato/antaùa fratino/antaùa frat(in)o es: hermano anterior/hermana anterior/hermano (a) anterior et: eelmine vend/eelmine õde/eelmine õde või vend fi: edellinen veli/edellinen sisar/edellinen sisaruksista fr: frère précédent/soeur précédente/frère ou soeur précédent he: àç(åú) äâãåì(ä) is: fyrra systkyn it: fratello precedente/sorella precedente/fratello o sorella precedente lv: iepriekðçjais brâlis/iepriekðçjais mâsa nl: vorige broer/vorige zuster/vorige broer of zuster no: forrige bror/forrige søster/forrige søsken pl: poprzedni brat lub siostra pt: irmão precedente/irmã precedente/irmã(o) precedente ro: frate precedent/soraprecedenta/frati sau surori precedente ru: ïðåäøåñòâóþùèé áðàò/ïðåäøåñòâóþùàÿ ñåñòðà sl: starej¹i brat/starej¹a sestra sv: föregående bror/föregående syster/föregående syskon private af: privaat bg: ×àñòåí br: prevez ca: privat cs: soukromé da: privat de: privat en: private eo: privata es: privado et: privaatne fi: yksityinen fr: privé he: ôøèé is: einka it: riservato lv: privâts nl: persoonlijk no: privat pl: bez danych osobowych pt: privado ro: privat ru: ×àñòíûé sl: zasebno sv: privat public af: openbare bg: îáù br: er renabloù a-berzh Stad ca: públic cs: veøejné da: offentlig de: öffentlich en: public eo: publika es: público et: avalik fi: julkinen fr: public he: öéáåøé is: opinbert it: pubblico lv: publisks nl: publieke no: offentlig pl: bez ograniczeñ pt: público ro: public ru: îáùèé sl: javno sv: offentligt public name af: Noemnaam bg: îôèöèàëíî èìå br: anv a-berzh Stad ca: nom públic cs: veøejné jméno da: officielt navn de: öffentlicher Name en: public name eo: publika nomo es: sobrenombre et: esindusnimi fi: julkinen nimi fr: nom public he: ùí áöéáåø is: opinbert nafn it: appellativo pubblico lv: publiskais vârds nl: publieke naam no: offisielt navn pl: imiê oficjalne pt: nome público ro: nume public ru: èçâåñòåí êàê sl: uradno ime sv: officiellt namn qualifier af: bynaam bg: ïî÷åòåí åïèòåò êúì èìåòî br: adanv ca: qualificatiu cs: pøívlastek da: tilnavn de: Beiname en: qualifier eo: kromnomo:a:+n es: calificativo et: lisanimi fi: lisänimi fr: qualificatif he: ëéðåé is: uppnefni it: soprannome lv: paskaidrojuma vârds nl: bijnaam no: tilnavn pl: przydomek pt: alcunha ro: calificativ ru: ïðîçâèùå sl: oznaka sv: smeknamn recognized son/recognized daughter/recognized child af: aanvaarde seun/aanvaarde dogter/aanvaarde kind bg: ïðèïîçíàò ñèí/ïðèïîçíàòà äúùåðÿ/ïðèïîçíàòî äåòå br: mab anavezet/merc'h anavezet/bugel anavezet ca: fill reconegut/filla reconeguda/fills reconeguts cs: uznaný syn/uznaná dcera/uznané dítì da: anerkendt søn/anerkendt datter/anerkendt barn de: anerkannter Sohn/anerkannte Tochter/anerkanntes Kind en: recognized son/recognized daughter/recognized child eo: agnoskita filo/agnoskita filino/agnoskita ido es: hijo reconocido/hija reconocida/hijos reconocidos et: omakstunnistatud poeg/omakstunnistatud tütar/omakstunnistatud laps fi: tunnustettu poika/tunnustettu tytär/tunnustettu lapsi fr: fils reconnu/fille reconnue/enfant reconnu he: áï éãåò/ áú éãåòä/ éìã éãåò is: viðurkendur sonur/viðurkend dóttir/viðurkent barn it: figlio riconosciuto/figlia riconosciuta/figlio riconosciuto lv: atzîts dçls/mâsa/bçrns (?) nl: erkende zoon/erkende dochter/erkend kind no: bekreftet sønn/bekreftet datter/bekreftet barn pl: uznany syn/uznana córka/uznane dziecko pt: filho reconhecido/filha reconhecida/filhos reconhecidos ro: fiu recunoscut/fica recunoscuta/copil recunoscut ru: óñûíîâëåí/óäî÷åðåíà/ïðèçíàííûé ðåáåíîê sl: znan sin/znana hèerka/znani otroci sv: erkänd son/erkänd dotter/erkänt barn recognizing father/recognizing mother/recognizing parents af: erkennende vader/erkennende moeder/erkennende ouders bg: ïðèïîçíàë áàùà/ïðèïîçíàëà ìàéêà/ïðèïîçíàëè ðîäèòåëè br: an tad en deus e(hec'h) anavezet/ar vamm he deus e(hec'h) anavezet/ar gerent o deus e (hec'h) anavezet ca: pare reconegut/mare reconeguda/pares reconeguts cs: uznaný otec/uznaná matka/uznaní rodièe da: sig vedkendende fader/sig vedkendende moder/sig vedkendende forældre de: anerkennender Vater/anerkennende Mutter/anerkennende Eltern en: recognizing father/recognizing mother/recognizing parents eo: agnoskinta patro/agnoskinta patrino/agnoskintaj gepatroj es: padre reconocido/madre reconocida/padres reconocidos et: omakstunnistanud isa/omakstunnistanud ema/omakstunnistanud vanemad fi: tunnustanut isä/tunnustanut äiti/tunnustaneet vanhemmat fr: père l'ayant reconnu/mère l'ayant reconnu/parents l'ayant reconnu he: àá îëéø / àí îëéøä / äåøéí îëéøéí is: viðurkenndur faðir/viðurkennd móðir/viðurkennd foreldri it: padre che ha riconosciuto/madre che ha riconosciuto/genitori che hanno riconosciuto lv: atzîts tçvs/mâte/vecâki (?) nl: erkennende vader/erkennende moeder/erkennende ouders no: bekreftet far/bekreftet mor/bekreftede foreldre pl: uznaj±cy ojciec/uznaj±ca matka/uznaj±cy rodzice pt: pai que o reconheceu/mãe que o reconheceu/pais que o reconheceram ro: tata recunoscator/mama recunoscatoare/parinti recunoscatori ru: ïðèçíàííûé îòåö/ïðèçíàííàÿ ìàòü/ïðèçíàíûé ðîäèòåëü sl: znani oèe/znana mati/znani star¹i sv: erkännande far/erkännande mor/erkännande föräldrar relation/relations af: verwant/verwante bg: âçàèìîîòíîøåíèå/âçàèìîîòíîøåíèÿ br: kar/kerent ca: relació/relacions cs: vztah/vztahy da: forbindelse/forbindelser de: Beziehung/Beziehungen en: relation/relations eo: konato:a:+n/konatoj es: relación/relaciones et: suhe/suhted fi: sukulaisuus/sukulaisuutta fr: relation/relations he: éçñéí is: skyldleiki/skyldleikar it: relazione/relazioni lv: saistîba/saistîbas nl: verwantschap/verwantschappen no: forbindelse/forbindelser pl: inne wiêzy pt: relação/relações ro: relatie/relatii ru: îòíîøåíèÿ/îòíîøåíèÿ sl: razmerje/razmerja sv: relation/relationer relationship af: verwantskap bg: ðîäñòâî br: kerentiezh ca: parentesc cs: vztah da: slægtskab de: Verwandtschaft en: relationship eo: parenceco es: parentesco et: sugulus fi: sukulaisuus fr: parenté he: ÷ùø îùôçúé is: skyldleikar it: parentela lv: radniecîba nl: verwantschap no: slektskap pl: pokrewieñstwo pt: parentesco ro: relatie ru: ðîäñòâî sl: zveza sv: släktskap relationship computing af: bereken verwantskappe bg: îïðåäåëÿíå íà ðîäñòâî br: jediñ ar gerentiezh ca: càlcul de parentesc cs: nalezení vztahù da: slægtskabsberegning de: Verwandtschaft ermitteln en: relationship computing eo: kalkulo de parenceco es: cálculo de parentesco et: suguluse leidmine fi: sukulaisuuslaskelma fr: calcul de parenté he: çéùåá éçñ îùôçúé is: reikna tengsl it: calcolo della parentela lv: radniecîbas aprçíinâðana nl: verwantschap bepalen no: slektskapsberegning pl: szukanie pokrewieñstwa pt: cálculo de parentesco ro: calcul de relatii ru: êîìó ïðèõîäèòñÿ sl: pregled sorodstva sv: släktskapsberäkning zh: Ïà¹Ø²éѯ relationship link/relationship links af: verwantskap/verwantskappe bg: ðîäñòâåíà âðúçêà/ðîäñòâåíè âðúçêè br: liamm a gerentiezh/liammoù a gerentiezh ca: grau de parentesc/graus de parentesc cs: vztah/vztahy da: slægtskabsforbindelse/slægtskabsforbindelser de: Verwandtschaft/Verwandtschaften en: relationship link/relationship links eo: ligo de parenceco/ligoj de parenceco es: grado de parentesco/grados de parentesco et: sugulussuhe/sugulussuhet fi: sukulaisuuskytkentä/sukulaisuuskytkentää fr: lien de parenté/liens de parenté he: ÷ùø îùôçúé/ ÷ùøé îùôçä is: skyldleika tengsl/skyldleika tengsli it: grado di parentela/gradi di parentela lv: radniecîbas saite(s) nl: verwantschap/verwantschappen no: slektslinje/slektslinjer pl: linia pokrewieñstwa/linie pokrewieñstwa pt: grau de parentesco/graus de parentesco ro: linie de relatii ru: ðîäñòâåííàÿ ñâÿçü/ðîäñòâåííûå ñâÿçè sl: sorodnik/sorodnikov sv: anlinje/anlinjer relationship%t to af: verwantskap%t met bg: èìà âðúçêà%t ñ br: kerentiezh %t gant ca: parentesc%t amb cs: %t vztah s da: forbindelse%t med de: in einer Beziehung%t mit en: relationship%t to eo: rilato%t kun es: parentesco%t con et: kooselu%t fi: suhde%t ja fr: relation%t avec he: ÷éøáä is: sambúð%t með it: legame%t con lv: %t attiecîbas ar nl: verbonden%t met no: familie%t med pl: zwi±zek%t z: pt: relacionado%t com/relacionada%t com pt-br: junto%t com ro: relatia%t cu ru: ïðèõîäèòñÿ%t sl: zveza z %t sv: förhållande%t med relationships by marriage af: aangetroude verwantskappe bg: ðîäñòâî ÷ðåç áðàê br: liammoù a gerentiezh dre euredennoù ca: parentiu polític cs: pøíbuzenské vztahy pøes svatby da: slægtskaber ved giftermål de: Heiratsbeziehungen en: relationships by marriage eo: ligoj per edzigxo es: parentescos políticos et: sugulus abielu kaudu fi: sukulaisuus avioliiton kautta fr: liens de parenté par alliance he: ÷ùøéí ãøê ðùåàéï is: tengjast með giftingu it: parentele per matrimonio lv: precîbu saites nl: verwant door huwelijk no: slektskap gjennom gifte pl: powinowactwo pt: relações por casamento ro: relatie prin mariaj ru: ñâÿçü áðàêîì sl: sorodstvo preko poroke sv: släktskap genom äktenskap search/case sensitive bg: òúðñåíå/ñ ðàçëè÷àâàíå íà ãëàâíè è ìàëêè áóêâè ca: recerca/coincidir maj_min cs: hledat/citlivý na velikost písma da: søg/følsom overfor store og små bogstaver de: suchen/Groß- & Kleinschreibung beachten en: search/case sensitive es: buscar/fijarse en mayúsculas/menúsculas et: otsi/tõstutundlik fi: haku/tunnistaa merkkikoon fr: rechercher/sensible à la casse it: ricerca/sensibile a maiuscole e minuscole nl: zoeken/hoofdlettergevoelig no: søk/skiller mellom store og små bokstaver pl: szukaj/wielko¶æ liter ma znaczenie pt: pesquisar/sensível à capitulação pt-br: procurar/diferencia maiúsculas ro: cautare/sensibila la caz ru: ïîèñê/ðåãèñòðîçàâèñèìûé sl: iskanje/razlikovanje VELIKIH-malih èrk sv: sök/skiftlägeskänslig see af: sien bg: âæ. br: gwelout ca: veure cs: viz da: se de: siehe en: see eo: vidu :a: es: ver et: vaata fi: katso fr: voir he: ìøàåú is: sjá it: vedi lv: sakatît nl: zie no: se pl: zobacz pt: ver ro: vezi ru: ñìîòðè sl: glej sv: se see above af: kyk hierbo bg: âæ. ïî-ãîðå br: gwelout amañ a-us ca: veure més amunt cs: viz vý¹e da: se ovenfor de: siehe oben en: see above eo: vidu cxi-supre es: ver más arriba et: vaata ülalt fi: katso yllä fr: voir ci-dessus he: äð"ì is: sjá að ofan it: vedi sopra lv: skatît iepriekð nl: zie hierboven no: se foran pl: zobacz wy¿ej pt: ver encima pt-br: ver acima ro: vezi antecedenta ru: ñìîòðè âûøå sl: glej zgoraj sv: se ovan see further af: kyk verder bg: âæ. ïî-äîëó br: gwelout pelloc'h ca: veure tot seguit cs: viz dále da: se nedenfor de: siehe unten en: see further eo: vidu cxi-malsupre es: ver a continuación et: vaata altpoolt fi: katso alla fr: voir plus loin he: ëãì÷îï is: sjá nánar it: vedi di seguito lv: skatît tâlâk nl: zie verder no: se senere pl: zobacz ni¿ej pt: ver a continuação ro: vezi urmatoarea ru: ñìîòðè äàëüøå sl: nadalje glej sv: se vidare send af: stuur bg: äà ñå èçïðàòè br: kas ca: enviar cs: odeslat da: indsæt de: senden +before en: send eo: sendi :a: es: enviar et: saada fi: lähetä fr: envoyer he: ùìç is: senda it: inviare lv: sûtît nl: zenden +before no: send pl: do³±cz :a: pt: enviar ro: trimite ru: ïîñëàòü sl: po¹lji sv: skicka separated af: separated bg: ðàçäåëåíè br: dispartïet ca: separats cs: odlouèeni da: separeret de: getrennt lebend en: separated eo: apartigitaj es: separados et: elavad lahus fi: asumuserossa fr: séparés he: ðôøãå is: skilin it: separati lv: nedzîvo kopâ nl: gescheiden no: separert pl: w separacji pt: separados ro: despartiti ru: ðàçäåëåíû sl: ¾ivela narazen sv: separerat several answers af: verskeie antwoorde bg: íÿêîëêî îòãîâîðà br: meur a respont ca: vàries respostes cs: více odpovìdí da: flere svar de: mehrere Antworten en: several answers eo: pluraj respondoj es: varias respuestas et: mitmed vastused fi: useita vastauksia fr: plusieurs réponses he: ëîä úùåáåú is: mörg svör it: parecchie risposte lv: vairâkas atbildes nl: meerdere antwoorden no: flere svar pl: wiêcej ni¿ jedna odpowied¼ pt: várias respostas ro: mai multe raspunsuri ru: íåñêîëüêî îòâåòîâ sl: veè re¹itev sv: flera svar sex af: geslag bg: ïîë br: reizh ca: sexe cs: pohlaví da: køn de: Geschlecht en: sex eo: sekso es: sexo et: sugu fi: sukupuoli fr: sexe he: îéï is: kyn it: sesso lv: dzimums nl: geslacht no: kjønn pl: p³eæ pt: sexo ro: sex ru: ïîë sl: spol sv: kön short display af: beknopte weergawe bg: êðàòêî br: gwereadur berr ca: presentació curta cs: krátký výpis da: standardrapport de: kurze Ansicht en: short display eo: mallonga afisxado es: presentación corta et: lühiraport fi: lyhyt raportti fr: affichage court he: úöåâä î÷åöøú is: stutt sýn it: display corto lv: saîsinâtais attçlojums nl: beknopte weergave no: kort rapport pl: postaæ skrócona pt: resultados sucintos ro: resultat scurt ru: êðàòêî sl: kratek seznam sv: kort rapport shortest path af: kortste pad bg: íàé-êðàòúê ïúò br: ar berrañ hent ca: drecera cs: nejkrat¹í cesta da: korteste vej de: kürzester Pfad en: shortest path eo: vojo plej mallonga es: atajo et: lühim tee fi: lyhin polku fr: chemin le plus court he: ÷ùø äëé ÷øåá is: stysta leið it: legame più diretto lv: îsâkais ceïð nl: kortste weg no: korteste gren pl: najkrótsza linia pt: caminho mais curto ro: drumul cel mai scurt ru: êðàò÷àéøèé ïóòü sl: najkraj¹a vez sv: kortaste vägen should be female af: behoort vroulik te wees bg: áè òðÿáâàëî äà å æåíà br: a rankfe bezañ benel he reizh ca: hauria de ser de sexe femení cs: mìla by být ¾enského pohlaví da: burde være kvinde de: müsste weiblichen Geschlechts sein en: should be female eo: devus esti ina es: debería ser de sexo feminino et: peaks olema naissoost fi: pitäisi olla naispuolinen fr: devrait être de sexe féminin he: öøéëä ìäéåú ð÷áä is: ætti að vera kvenkyns it: dovrebbe essere di sesso femminile lv: jâbût sievietei nl: moet vrouwelijk zijn no: kjønn skulle vært kvinne pl: powinna byæ kobiet± pt: teria que ser de sexo feminino ro: ar trebui sa fie feminin ru: äîëæíà áûòü æåíùèíîé sl: bi moral biti ¾enska sv: borde vara kvinna should be male af: behoort manlik te wees bg: áè òðÿáâàëî äà å ìúæ br: a rankfe bezañ gourel e reizh ca: hauria de ser de sexe masculí cs: mìl by být mu¾ského pohlaví da: burde være mand de: müsste männlichen Geschlechts sein en: should be male eo: devus esti maskla es: debería ser de sexo masculino et: peaks olema meessoost fi: pitäisi olla miespuolinen fr: devrait être de sexe masculin he: öøéê ìäéåú æëø is: ætti að vera karlkyns it: dovrebbe essere di sesso maschile lv: jâbût vîrietim nl: moet mannelijk zijn no: kjønn skulle vært mann pl: powinna byæ mê¿czyzn± pt: teria que ser de sexo masculino ro: ar trebui sa fie masculin ru: äîëæåí áûòü ìóæ÷èíîé sl: bi morala biti mo¹ki sv: borde vara man siblings af: broers en susters bg: áðàòÿ è ñåñòðè br: breudeur ha c'hoarezed ca: germans i germanes cs: sourozenci da: søskende de: Geschwister en: siblings eo: gefratoj es: hermanos y hermanas et: õed ja vennad fi: sisarukset fr: frères et soeurs he: àçéí is: systkyni it: fratelli lv: brâïi/mâsas nl: broers en zusters no: søsken pl: rodzeñstwo pt: irmãos e irmãs ro: frati/surori ru: áðàòüÿ èëè ñåñòû sl: bratje in sestre sv: syskon since the last click bg: îò ïîñëåäíîòî ùðàêâàíå da: siden det sidste klik de: seit dem letzten click en: since the last click es: desde el último click fr: depuis le dernier clic it: dall'ultimo click nl: sinds de laatste klik pl: od ostatniego klikniêcia pt: desde o último clique sl: od zadnjega klika sv: från senaste klick son/daughter/child af: seun/dogter/kind bg: ñèí/äúùåðÿ/äåöà br: mab/merc'h/bugel ca: fill/filla/fill(a) cs: je synem/je dcerou/je dítìtem da: søn/datter/barn de: Sohn/Tochter/Kind en: son/daughter/child eo: filo/filino/ido es: hijo/hija/hijo(a) et: poeg/tütar/laps fi: poika/tytär/lapsi fr: fils/fille/enfant he: áï/ áú is: sonur/dóttir/barn it: figlio/figlia/figlio(a) lv: dçls/meita/bçrns nl: zoon/dochter/kind no: sønn/datter/barn pl: syn/córka/dziecko pt: filho/filha/filho(a) ro: fiu/fica/copil ru: ñûí/äî÷ü/äåòè sl: sin/hèerka/otrok sv: son/dotter/barn source/sources af: bron/bronne bg: èçòî÷íèê/èçòî÷íèöè br: mammenn/mammennoù ca: font/fonts cs: zdroj/zdroje da: kilde/kilder de: Quelle/Quellen en: source/sources eo: fonto/fontoj es: fuente/fuentes et: allikas/allikad fi: lähde/lähteet fr: source/sources he: î÷åø/ î÷åøåú is: heimild/heimildir it: fonte/fonti lv: avots/avoti (pirmsâkums?) nl: bron/bronnen no: kilde/kilder pl: ¼ród³o/¼ród³a pt: fonte/fontes ro: sursa/surse ru: èñòî÷íèê/èñòî÷íèêè sl: vir/viri sv: källa/källor specify af: dui aan bg: óòî÷íåòå br: resisait ca: especificar cs: zvol da: præciser de: Auswahl der en: specify eo: specifu :a: es: especificar et: täpsusta fi: tarkenna fr: précisez he: ôøè is: tilgreina it: specificare lv: noteikt nl: specificeer no: velg pl: wybierz pt: especificar ro: specifica ru: óêàæèòå sl: doloèi sv: välj zh: ´ÓÏÂÁÐѡȡ spouses not included af: eggenote weggelaat bg: áåç äà ñå âêëþ÷âàò ñúïðóçèòå/ñúïðóãèòå br: ar priedoù n'int ket enklozet ca: cònjuges no inclosos cs: man¾elé/man¾elky nejsou zahrnuty da: eksklusive ægtefæller de: exklusive Ehegatten en: spouses not included eo: geedzoj ne inkluzivitaj es: cónyuges no incluidos et: ilma abikaasadeta fi: puolisot poislukien fr: conjoints non compris he: ìà ëåìì áðé æåâ is: undanskildir makar it: coniugi esclusi lv: laulâtie nav ietverti nl: zonder echtgenoten no: maker er utelatt pl: bez wliczania ma³¿onków pt: cônjuges não incluídos ro: conjugati exclusi ru: ñóïðóãîâ íå âêëþ÷àòü sl: brez mo¾/¾ena sv: exklusive makar starting with af: beginnende met bg: ñ ïúðâà áóêâà br: o kregiñ gant ca: començant per cs: poèínaje da: som begynder med de: beginnend mit en: starting with eo: komencante kun es: comenzando con et: algusega fi: ensimmäisenä fr: commençant par he: ìäúçéì î- is: sem byrjar á it: partendo da lv: sâkot ar nl: beginnend met no: som starter med pl: zaczynaj±c od: pt: começando com ro: incepind cu ru: íà÷èíàþòñÿ ñ sl: zaèen¹i z sv: som börjar med statistics af: statistiek bg: ñòàòèñòèêà br: stadegoù ca: estadístiques cs: statistika da: statistikker de: Statistiken en: statistics eo: statistikoj es: estadísticas et: statistika fi: tilastotietoja fr: statistiques he: ðúåðéí ñèèéñèéí is: staða it: statistiche lv: statistika nl: statistieken no: statistikk pl: zestawienia pt: estatísticas ro: statistici ru: ñòàòèñòèêà sl: statistike sv: statistik surname alias af: van alias bg: äðóãî ôàìèëíî èìå br: lezanv-tud (alias) ca: nom de casa cs: alias pøíjmení da: efternavns alias de: Nachnamen-Alias en: surname alias eo: familia:a:+n nomo:a:+n aliasa:a:+n es: apellido alias et: muu perekonnanimi fi: sukunimi alias fr: patronyme alias he: ùí îùôçä àçø is: auka eftirnafn it: alias del cognome lv: otrs uzvârds nl: alias voor familienaam no: alias for etternavn pl: alias nazwiska pt: alias do apelido pt-br: apelido do sobrenome ro: alias de nume ru: íîâàÿ:a:--óþ ôàìèëèÿ:a:-þ sl: drug priimek sv: efternamns alias surname missing af: van ontbreek bg: ôàìèëíîòî èìå ëèïñâà br: an anv-tud a vank ca: falta el cognom cs: pøíjmení schází da: efternavn mangler de: fehlender Nachname en: surname missing eo: familia nomo mankanta es: falta apellido et: perekonnanimi puudub fi: sukunimi puuttuu fr: patronyme manquant he: ùí îùôçä çñø is: eftirnafn vantar it: cognome mancante lv: trûkst uzvârds nl: familienaam ontbreekt no: etternavn mangler pl: brak nazwiska pt: falta o apelido pt-br: falta o sobrenome ro: prenumele lipseste ru: ôàìèëèÿ óòðà÷åíà sl: manjka priimek sv: efternamn saknas surname not found af: van nie gevind nie bg: ôàìèëíîòî èìå íå áå íàìåðåíî br: an anv-familh n'eo ket bet kavet ca: cognom no localitzat cs: pøíjmení nenalezeno da: efternavn ikke fundet de: Nachname nicht gefunden en: surname not found eo: familia nomo ne trovita es: apellido no encontrado et: perekonnanime ei leitud fi: sukunimeä ei löydy fr: patronyme pas trouvé he: ùí îùôçä ìà ðîöà is: finn ekki eftirnafn it: cognome non trovato lv: uzvârds nav atrodams nl: familienaam niet gevonden no: finner ikke etternavnet pl: nazwisko nie zosta³o znalezione pt: apelido não foi encontrado pt-br: sobrenome não foi encontrado ro: nume negasit ru: ôàìèëèÿ íå íàéäåíà sl: priimek ni najden sv: hittar inte efternamn surname/surnames af: van/vanne bg: ôàìèëíî èìå/ôàìèëíè èìåíà br: anv-familh/anvioù-familh ca: cognom/cognoms cs: pøíjmení da: efternavn/efternavne de: Nachname/Nachnamen en: surname/surnames eo: familia nomo/familiaj nomoj es: apellido/apellidos et: perekonnanimi/perekonnanimed:k:+ega fi: sukunimi/sukunimet fr: patronyme/patronymes fr-cr: nom-fan-mille he: ùí îùôçä/ ùîåú îùôçä is: eftirnafn/eftirnöfn it: cognome/cognomi lv: uzvârds/uzvârdi nl: familienaam/familienamen no: etternavn/etternavn pl: nazwisko/nazwiska pt: apelido/apelidos pt-br: sobrenome/sobrenomes ro: nume de familie ru: ôàìèëèÿ/ôàìèëèè sl: priimek/priimki sv: efternamn/efternamn zh: ÐÕ surnames list af: vanne lys bg: ñïèñúê íà ôàìèëíèòå èìåíà br: roll an anvioù-tud ca: llistat de cognoms cs: seznam pøíjmení da: efternavnsoversigt de: Nachnamen-Liste en: surnames list eo: listo de la familiaj nomoj es: lista de apellidos et: perekonnanimede nimekiri fi: sukunimiluettelo fr: liste éclair he: øùéîú ùîåú îùôçä is: eftirnafna listi it: lista dei cognomi lv: uzvârdu saraksts nl: lijst van familienamen no: liste over etternavn pl: lista nazwisk pt: lista de apelidos pt-br: lista de sobrenomes ro: lista de nume de familie ru: ñïèñîê ôàìèëèé sl: seznam priimkov sv: efternamns lista text af: teks bg: òåêñò br: testenn ca: text cs: text da: tekst de: Text en: text eo: teksto es: texto et: tekst fi: teksti fr: texte he: ëúåá is: texti it: testo lv: teksts nl: tekst no: tekst pl: tekst pt: texto ro: text ru: òåêñò sl: tekst sv: text the %d first names af: die %d voorname bg: %d ñîáñòâåíè èìåíà br: ar %d raganv ca: els %d noms cs: %d køestních jmen da: de %d fornavne de: die %d Vornamen en: the %d first names eo: la %d unuaj nomoj es: los %d nombres et: %d eesnime fi: %d etunimeä fr: les %d prénoms he: %d ùîåú äôøèééí is: %d fyrstu fornöfnin it: i %d nomi lv: %d personvârdi nl: de %d voornamen no: de %d fornavnene pl: %d imion pt: os %d nomes pt-br: os %d prenomes ro: %d prenume ru: %d èì¸í sl: %d lastnih imen sv: de %d förnamnen the %d oldest couples perhaps still alive and engaged af: die %d oudste pare moontlik nog in lewe en verloof bg: íàé-îòäàâíàøíèòå %d äâîéêè îò åâåíòóàëíî îùå æèâè è ñãîäåíè ëèöà ca: les parelles més grans potser encara vives i juntes cs: %d nejstar¹ích párù pravdìpodobnì ¾ijících a zadaných da: og de %d ældste par muligvis stadig i live og forlovede de: die %d ältesten verlobten und möglicherweise noch lebenden Paare en: the %d oldest couples perhaps still alive and engaged eo: versajne la %d plej altaj paroj ankorau vivas kaj estas fiancigitaj es: los novios más viejos y quizás todavía vivos et: %d vanimat kihlatud ja võib-olla veel elus olevat paari fi: %d vanhinta mahdollisesti elossa olevaa kihlaparia fr: les %d couples les plus anciens peut-être encore vivants et fiancés he: éúëï ù-%d äæåâåú äîáåâøéí áéåúø òåãí áçééí åòåãí îàåøñéí is: %d elstu pörin eru hugsanlega enn saman og á lífi it: le %d coppie più anziane forse ancora viventi e fidanzate lv: % iespçjams vçl dzîvu un saderînâtu vecâko pâru nl: De %d oudste, mogelijk nog in leven zijnde, verloofde paren no: Det % eldste par som kanskje fremdeles er i live og forlovet pl: %d najstarszych par prawdopodobnie jeszcze zyj±cych i pozostaj±cych zarêczeni pt: o %d mais velho casal talvez ainda vivo e noivado pt-br: os %d mais velhos casais talvez ainda vivos ro: Cei %d mai virstnici perechi logoditi probabil inca in viata ru: ñòàðåéøèå %d âîçìîæíî æèâûõ ñóïðóãîâ èëè ïîìîëâëåííûõ sl: %d najstarej¹ih morda ¹e ¾ivih in zaroèenih parov sv: de %d äldsta nu levande paren som kanske fortfarande är förlovade the %d oldest perhaps still alive af: die %d oudstes wat nog leef bg: íàé-ñòàðèòå %d åâåíòóàëíî îùå æèâè ëèöà br: ar %d den koshañ bev c'hoazh marteze ca: les %d persones més grans, potser encara vives cs: %d nejstar¹ích snad je¹tì ¾ijících osob da: de %d ældste af de muligt levende de: die %d ältesten vermutlich noch lebenden Personen en: the %d oldest perhaps still alive eo: la %d plej maljunaj eble ankoraù vivantaj es: los %s más viejos quizás todovía vivo et: %d vanimat, kes võib-olla on veel elus fi: %d vanhinta ehkä vielä elävää fr: les %d les plus âgés peut-être encore vivants he: äæ÷ï ä %d ùàåìé òåã áçééí is: %d elsti sem kann að vera á lífi it: %d più anziani che possono essere ancora viventi lv: %d visvecâkie iespçjams vçl ir dzîvi nl: de %d oudste, mogelijk nog in leven zijnde, personen no: de %d eldste som muligens lever pl: %d najstarszych osób (prawdopodobnie) ¿yj±cych pt: os %d mais velhos talvez ainda vivos ro: %d cei mai batrini posibil mai in viata ru: %d ñàìûõ ñòàðûõ åùå æèâóùèõ sl: %d najstarej¹ih, morda ¹e ¾iveèih sv: de %d äldsta personerna som kanske lever the %d surnames af: die %d vanne bg: %d ôàìèëíè èìåíà br: ar %d anv-familh ca: els %d cognoms cs: %d pøíjmení da: de %d efternavne de: die %d Nachnamen en: the %d surnames eo: la %d familiaj nomoj es: los %d apellidos et: %d perekonnanime fi: %d sukunimeä fr: les %d patronymes he: %d ùîåú äîùôçä is: %d fyrstu eftirnöfnin it: i %d cognomi lv: %d uzvârdi nl: de %d familienamen no: de %d etternavnene pl: %d nazwisk pt: os %d apelidos pt-br: os %d sobrenomes ro: %d nume de familie ru: %d ôàìèëèé sl: %d priimkov sv: de %d efternamnen the %d who lived the longest af: die %d wat die langste gelewe het bg: íàé-äúëãî æèâåëèòå %d ëèöà br: ar %d o deus bevet ar pellañ ca: les %d persones que han viscut més anys cs: %d osob které ¾ili nejdéle da: de %d som har levet længst de: die %d Personen, die am längsten lebten en: the %d who lived the longest eo: la %d, kiuj vivis plejlonge es: los %d que han vivido más mucho tiempo et: %d kõige kauem elanut fi: %d pisimpään elänyttä fr: les %d ayant vécu le plus longtemps he: ä %d áàøéëåú éîéí is: %d sem lifði lengst it: i %d che hanno vissuto più a lungo lv: %d, kuri dzîvojuði visilgâk nl: de %d personen die het langst geleefd hebben no: de %d som har levd lengst pl: %d osób, które ¿y³y najd³u¿ej pt: os %d que mais viveram ro: %d cei mai in virsta ru: %d ïðîæèâøèõ äîëüøå âñåõ sl: %d oseb, ki so ¾ivele najdlje sv: de %d personerna som har levt längst the %s generation af: die %s geslag bg: %s ïîêîëåíèå br: ar %s rummad-tud ca: la %s generació cs: %s. generace da: den %s generation de: die %s Generation en: the %s generation eo: la %s generacio es: la %s generación et: %s. sugupõlv fi: %s. sukupolvi fr: la %s génération he: ãåø ä%s is: %s kynslóð it: la %s generazione lv: %s. paaudze nl: de %s generatie no: %s generasjon pl: %s pokolenie pt: a %s geração ro: generatia %s ru: %s-å ïîêîëåíèå sl: %s. generacija sv: den %s generationen the anniversary af: die herdenking bg: ãîäèøíèíàòà br: an deiz-ha-bloaz ca: l'aniversari cs: výroèí da: årsdagen de: der Jahrestag en: the anniversary eo: la datreveno es: el aniversario et: aastapäev fi: merkkipäivä fr: l'anniversaire he: éåí äùðä is: afmælisdagar it: l'anniversario lv: gadadiena nl: de verjaardag no: årsdagen pl: rocznica pt: o aniversário ro: aniversarea ru: ãîäîâùèíà sl: obletnica sv: årsdagen the anniversary of marriage af: die huweliksherdenking bg: ãîäèøíèíàòà íà áðàêà br: deiz-ha-bloaz an eured ca: l'aniversari de bodes cs: výroèí svatby da: bryllupsdagen de: der Hochzeitstag en: the anniversary of marriage eo: la datreveno de edzigxo es: el aniversario de casamiento et: pulma-aastapäev fi: hääpäivä fr: l'anniversaire de mariage he: éåí äðéùåàéï is: brúðkaupsafmæli it: l'anniversario di matrimonio lv: kâzu diena nl: de huwelijksverjaardag no: bryllupsdagen pl: rocznica ¶lubu pt: o aniversário de casamento ro: aniversatia de mariaj ru: ãîäîâùèíà áðàêà sl: obletnica poroke sv: bröllopsdagen the base has changed; do "back", "reload", and refill the form af: die databasis het verander; gaan "terug", "herlaai" en vul die vorm weer in bg: áàçàòà îò äàííè å ïðîìåíåíà; íàòèñíåòå "back" è "reload" è ïîïúëíåòå îòíîâî ôîðìóëÿðà br: ar bon roadoù a zo kemmet : distroit d'ar bajenn a-raok, grit "hizivaat ar bajenn", ha grit en-dro ar reolskrid ca: la base ha canviat, fer "back", "reload" i completeu novament el formulari cs: databáze se zmìnila; vra»te se zpìt (back), znovu naètìte stránku (reload) a vyplòte formuláø da: databasen er ændret; gå tilbage, klik for opdatering og udfyld formularen igen de: die Datenbank wurde verändert; drücke bitte "zurück (back)", "neu laden (reload)" und fülle das Formular neu aus en: the base has changed; do "back", "reload", and refill the form eo: la bazo sxangis; faru "malantauxe", "resxargi", kaj replenigu la formularon es: la base ha cambiado: hacer "back", "reload" y completar nuevamente el formulario et: andmebaas on mutunud: mine tagasi, värskenda lehekülg ja täida vorm uuesti fi: tietokanta on muuttunut; peruuta, lataa uudelleen ja täytä kaavake fr: la base a changé: revenez à la page précédente, faites "actualiser la page", et refaites le formulaire he: îàâø äîéãä äùúðä: ìòùåú "back" å-"reload" åìîìà îçãù àú äèåôñ is: gagnagrunnurinn hefur breyst; gerðu "Back", "Reload", og settu aftur í formið it: la base è cambiata; fate "back", "reload" e rifate la scheda lv: datu bâzç ir veiktas izmaiòas; nospiediet "back", "reload", un aizpildiet formu nl: het bestand is veranderd; klik "back", "reload" en vul de details nogmaals in no: databasen er endret; klikk tilbake og oppfrisk, og fyll ut formularet på nytt pl: w bazie zosta³y dokonane zmiany; kliknij "wstecz" i "od¶wie¿", a nastêpnie ponownie wprowad¼ dane pt: a base mudou: fazer "back", "reload" e preencher novamente o formulário ro: basa de date a fost schimbata; mergi inapoi, ceri formularul si intra datele din nou ru: áàçà èçìåíèëàñü; íàæìèòå "íàçàä", "ïåðå÷èòàòü" è çàïîëíèòå ñíîâà ôîðìó sl: baza podatkov se je spremenila: kliknite "back" in "reload" ter ponovno vpi¹ite podatke sv: databasen har ändrats; gå tillbaka, klicka uppdatera och fyll i formuläret igen the birthday af: die verjaarsdag bg: ðîæäåíèÿò äåí br: deiz-ganedigezh ca: l'aniversari cs: narozeniny da: fødselsdagen de: der Geburtstag en: the birthday eo: la naskigxdatreveno es: el cumpleaños et: sünnipäev fi: syntymäpäivä fr: l'anniversaire he: éåí ääåìãú is: afmælisdagur it: il compleanno lv: dzimðanas diena nl: de verjaardag no: fødselsdagen pl: urodziny pt: o aniversário de nascimento ro: aniversarea zilei de nastere ru: äåíü ðîæäåíèÿ sl: rojstni dan sv: födelsedagen the children af: die kinders bg: äåöàòà br: ar vugale ca: els fills cs: dìti da: børnene de: die Kinder en: the children eo: la idoj es: los hijos et: lapsed fi: lapset fr: les enfants he: äéìãéí is: börnin it: i figli lv: bçrns nl: de kinderen no: barna pl: dzieci pt: os filhos ro: copii ru: ðåáåíîê sl: otroci sv: barnen the day after tomorrow af: oormôre bg: âäðóãèäåí br: an deiz goude warc'hoazh ca: demà passat cs: pozítøí da: i overmorgen de: übermorgen en: the day after tomorrow eo: postmorgaù es: pasado mañana et: ülehomme fi: ylihuomenna fr: après-demain he: îçøúééí is: næsta dag it: dopo domani lv: parît nl: overmorgen no: i overmorgen pl: pojutrze pt: depois de amanhã ro: poimaine ru: ïîñëåçàâòðà sl: pojutri¹nem sv: i övermorgon the father-in-law/the mother-in-law af: die skoonpa/die skoonma bg: òúñòúò:a:--à/òúùàòà/ñâåêúðúò:a:--à/ñâåêúðâàòà br: an tad-kaer/ar vamm-gaer ca: el sogre/la sogra cs: tchán/tchýnì da: svigerfaderen/svigermoderen de: der:d:dem Schwiegervater/die:d:der Schwiegermutter en: the father-in-law/the mother-in-law eo: bopatro/bopatrino es: el suegro/la suegra et: äi/ämm fi: appi/anoppi fr: le beau-père/la belle-mère he: äçí/ äçîåú is: tengdafaðir/tengdamóðir it: il suocero/la suocera lv: vîratçvs/sievastçvs/vîramâte/sievasmâte nl: de schoonvader/de schoonmoeder no: svigerfaren/svigermoren pl: te¶æ/te¶ciowa pt: o sogro/a sogra ro: socrul/soacra ru: ñâåêîð-òåñòü/ñâåêðîâü-òåùà sl: tast/ta¹èa sv: svärfadern/svärmodern the father/the mother/a parent af: die pa/die ma/'n ouer bg: áàùàòà/ìàéêàòà/ðîäèòåë br: an tad/ar vamm/un tad pe ur vamm ca: el pare/la mare/un pare cs: otec/matka/rodièe da: faderen/moderen/en forælder de: der:d:dem Vater/die:d:der Mutter/ein:d:+em Elternteil en: the father/the mother/a parent eo: la patro/la patrino/unu el la gepatroj es: el padre/la madre/un padre et: isa/ema/vanem:g:+a fi: isä:g:+n/äiti:g:--din/vanhempi:g:--man fr: le père/la mère/un parent he: äàá/ äàí/ äåøä is: faðir/móðir/foreldri it: il padre/la madre/un genitore lv: tçvs/mâte/vecâks nl: de vader/de moeder/een ouder no: faren/moren/en av foreldrene pl: ojciec/matka/rodzic pt: o pai/a mãe/um dos pais ro: tatal/mama/parinti ru: ìàòü/îòåö/ðîäèòåëè sl: oèe/mati/star¹ sv: fadern/modern/en förälder zh: ¸¸/ ĸ/a parent the file is temporarily locked: please try again af: die lêer is tydelik gesluit: probeer asseblief later weer bg: ôàéëúò å âðåìåííî çàêëþ÷åí; îïèòàéòå îòíîâî. Àêî òîâà íå ïîìàãà, èç÷àêàéòå ìàëêî ïðåäè äà îïèòàòå ïàê br: ar fichennaoueg a zo morailhet evit ar poent: klaskit ober ur wech c'hoazh. Ma ne da ket en-dro, gortozit un tamm a-raok adkregiñ ganti ca: la base està temporalment tancada: provar de nou. Si això no funciona, espereu uns moments abans de tornar a provar cs: soubor je doèasnì uzamèen: zkuste to znova. Pokud to stále nefunguje, chvíli poèkejte a pak to zkuste znovu. da: filen er midlertidigt låst: prøv igen. Hvis dette gentagne gange ikke fungerer, da vent lidt inden næste forsøg de: die Datei ist z.Z. geschützt: versuche es bitte nochmal. Wenn das nicht funktioniert, bitte eine Weile warten und nochmal probieren. en: the file is temporarily locked: please try again. If it still does not work, wait a while before trying again eo: la sliparo estas provizore riglata: provu denove. Se tio ne funkcios, atendu iomete kaj provu ankoraù unufoje es: la base está temporalmente cerrada: ensayar de nuevo. Si no funciona, espere un instante antes de ensayar nuevamente et: fail on ajutiselt lukustatud: proovi uuesti fi: tiedosto on lukkiutunut, yritä hetken kuluttua uudelleen fr: le fichier est temporairement verrouillé: essayez encore. Si cela ne fonctionne toujours pas, attendez quelques instants avant de réessayer he: ä÷åáõ ðòåì æîðéú: ìç÷åú åìðñåú ùåá is: skjalið er læst í augnablikinu, reyndu aftur it: l'archivio è temporaneamente locked: prego prova ancora. Se ancora non funziona, attendere un istante prima di provare ancora lv: datne pagaidâm ir slçgta: lûdzu mçìiniet vçlreiz nl: het bestand is tijdelijk niet toegankelijk: probeer later weer eens no: filen er midlertidig stengt: vent og prøv igjen pl: plik jest chwilowo niedostêpny; spróbuj pó¼niej, ewentualnie chwilê odczekaj pt: a base está temporariamente inacessível: por favor tente novamente. Se não funcionar, espere um momento ro: fisierul este blocat; incearca mai tirziu din nou ru: ôàéë âðåìåííî çàáëîêèðîâàí: ïîæàëóéñòà ïîïûòàéòåñü ñíîâà sl: ta datoteka je zaèasno zaklenjena: prosimo poskusite znova. Èe ¹e vedno ne deluje, prosimo poèakajte trenutek sv: filen är temporärt låst: försök igen. Om det ändå inte fungerar, vänta ett tag innan nästa försök the following children of %t and %t are not in order af: die volgende kinders van %t and %t is nie in die regte volgorde nie bg: ñëåäíèòå äåöà íà %t è %t íå ñà â õðîíîëîãè÷åí ðåä br: ar vugale-mañ, re %t ha %t n'int ket en urzh mat ca: els fills següents de %t i %t no estan en ordre cronològic cs: následující dìti rodièù %t a %t nejsou v chronologickém poøadí da: de følgende børn af %t og %t er ikke i kronologisk orden de: die folgenden Kinder von %t und %t sind nicht geordnet en: the following children of %t and %t are not in chronological order eo: la sekvantaj infanoj de %t kaj %t ne estas orde es: los hijos siguientes de %t y %t no están presentados en orden et: %t ja %t lastest järgnevad ei ole vanuse järjekorras fi: %t ja %t lapsista seuraavat eivät ole ikäjärjestyksessä fr: les enfants suivants de %t et de %t ne sont pas dans l'ordre he: äéìãéí ùì %t å-%t ìà áñãø ðëåï is: þessi börn %t og %t eru ekki í röð it: i seguenti figli di %t and %t non sono in ordine d'età lv: %t un %t sekojoðais bçrns nav secîbâ nl: de kinderen van %t en %t staan niet in de goede volgorde no: følgende barn av %t og %t er ikke i kronologisk rekkefølge pl: nastepuj±ce dzieci (rodzice: %t i %t) nie s± u³o¿one w porz±dku chronologicznym pt: os seguintes filhos de %t e %t não estão apresentados em ordem ro: urmatori copii a lui %t si %t nu sint in ordine cronologica ru: ñëåäóþùèå äåòè %t è %t - èäóò íå ïî ïîðÿäêó sl: naslednji otroci od %t in %t niso po vrstnem redu sv: de följande barnen till %t och %t är inte i kronologiskordning the grandchildren af: die kleinkinders bg: âíóöèòå br: ar vugale vihan ca: els nets cs: vnouèata da: børnebørnene de: die Enkelkinder en: the grandchildren eo: la genepoj es: los nietos et: lapselapsed fi: lapsenlapset fr: les petits enfants he: äðëãéí is: barnabörnin it: i nipoti lv: mazbçrns nl: de kleinkinderen no: barnebarna pl: wnuki pt: os netos ro: nepoti ru: ïðàâíóêè sl: vnuki sv: barnbarnen the grandparents af: die grootouers bg: äÿäîâöèòå è áàáèòå br: an dud-kozh ca: els avis cs: prarodièe da: bedsteforældrene de: die Großeltern en: the grandparents eo: la geavoj es: los abuelos et: vanavanemad fi: isovanhemmat fr: les grands-parents he: äñáéí is: afi og amma it: i nonni lv: vecvecâki nl: de grootouders no: besteforeldrene pl: dziadkowie pt: os avós ro: bunici ru: ïðàðîäèòåëü sl: stari star¹i sv: den 3:e generationen the great-grandchildren af: die agterkleinkinders bg: ïðàâíóöèòå br: ar vugale guñv ca: els besnets cs: pravnouèata da: oldebørnene de: die Urenkel en: the great-grandchildren eo: la gepranepoj es: los bisnietos et: lastelastelapsed fi: lasten-lastenlapset fr: les arrière-petits-enfants he: äðéðéí is: barnabarnabörnin it: i pronipoti lv: mazmazbçrni nl: de achterkleinkinderen no: oldebarna pl: prawnuki pt: os bisnetos ro: stranepoti ru: ïðàïðàâíóê sl: pravnuki sv: barnbarns barnen the great-grandparents af: die oorgrootouers bg: ïðàäÿäîâöèòå è ïðàáàáèòå br: ar gerent-kuñv ca: els besavis cs: praprarodièe da: oldeforældrene de: die Urgroßeltern en: the great-grandparents eo: la gepraavoj es: los bisabuelos et: vanavanavanemad fi: iso-isovanhemmat fr: les arrière-grands-parents he: äåøéí äùéìùéí is: langafi og langamma it: i bisnonni lv: vecvecvecâki nl: de overgrootouders no: oldeforeldrene pl: pradziadkowie pt: os bisavós ro: strabunici ru: ïðàïðàðîäèòåëü sl: prastari star¹i sv: den 4:e generationen the latest %d births af: die laaste %d geboortes bg: ïîñëåäíèòå %d ðàæäàíèÿ br: ar %d ganedigezh diwezhañ ca: els %d naixements més recents cs: posledních %d narození da: de seneste %d fødsler de: die letzten %d Geburten en: the latest %d births eo: la lastaj %d naskigxoj es: los %d nacimientos más recientes et: viimased %d sündi fi: viimeiset %d syntymää fr: les %d dernières naissances he: %d äìéãåú äàçøåðåú is: síðustu %d fæðingar it: le ultime %d nascite lv: pçdçjie %d dzimuðie nl: de jongste %d geboorten no: de siste %d fødte pl: %d ostatnich narodzin pt: os %d nascimentos mais recentes ro: ultimile %d nascuti ru: %d ïîñëåäíèõ ðîæäåíèé sl: zadnjih %d rojstev sv: de senaste %d födslarna the latest %d marriages af: die laaste %d huwelike bg: ïîñëåäíèòå %d áðàêà br: ar %d euredoù diwezhañ ca: els %d matrimonis més recents cs: posledních %d svateb da: de seneste %d bryllupper de: die letzten %d Heiraten en: the latest %d marriages eo: la lastaj %d edzigxoj es: los %d casamientos más recientes et: viimased %d pulma fi: viime %d naimisiinmenoa fr: les %d derniers mariages he: %d äðéùåàéí äàçøåðéí is: síðast giftist %d it: gli ultimi %d matrimoni lv: pçdçjâs %d laulîbas nl: de %d jongste huwelijken no: de %d sist gifte pl: %d ostatnich ¶lubów pt: os %d casamentos mais recentes ro: ultimi %d insurati ru: ïîñëåäíèå %d áðàêîâ sl: zadnjih %d porok sv: de senaste %d äktenskapen the latest %t deaths af: die laaste %t afsterwes bg: ïîñëåäíèòå %t óìèðàíèÿ br: ar %t tremenvan diwezhañ ca: les %t defuncions més recents cs: posledních %t úmrtí da: de seneste %t dødsfald de: die letzten %t Ableben en: the latest %t deaths eo: la lastaj %t mortoj es: las %t muertes más recientes et: viimased %t surma fi: viimeiset %t kuolemantapausta fr: les %t derniers décès he: %t äîúéí äàçøåðéí is: síðustu %t andlát it: le ultime %t morti lv: pçdçjie %t miruðie nl: de %t recentste overledenen no: de siste %t døde pl: %t ostatnich zgonów pt: os %t óbitos mais recentes ro: ultimi %t decedati ru: %t ïîñëåäíèõ ñìåðòåé sl: zadnjih %t smrti sv: de senaste %t avlidna the parents af: die ouers bg: ðîäèòåëèòå br: ar gerent ca: els pares cs: rodièe da: forældrene de: die Eltern en: the parents eo: la gepatroj es: los padres et: vanemad fi: vanhemmat fr: les parents he: ääåøéí is: foreldrar it: i genitori lv: vecâki nl: de ouders no: foreldrene pl: rodzice pt: os pais ro: parinti ru: ðîäèòåëè sl: star¹i sv: föräldrarna the spouse af: die eggenoot/die eggenote bg: ñúïðóãúò:a:--à/ñúïðóãàòà br: ar pried/ar bried ca: el marit/la muller cs: man¾el/man¾elka da: ægtefællen de: der:d:dem Ehemann/die:d:der Ehefrau en: the spouse eo: la edzo/la edzino es: el esposo/la esposa et: abikaasa fi: puoliso fr: l'époux/l'épouse he: áï äæåâ/ áú äæåâ is: maki it: lo sposo/la sposa lv: laulâtais nl: echtgenoot/echtgenote no: maken pl: m±¿/¿ona pt: o marido/a esposa ro: sotul/sotia ru: ìóæ/æåíà sl: mo¾/¾ena sv: maken/makan the whole list af: die hele lys bg: öåëèÿò ñïèñúê br: ar roll en e bezh ca: tot el llistat cs: kompletní seznam da: hele listen de: die ganze Liste en: the whole list eo: la tuta tabelo es: toda la lista et: kogu nimekiri fi: koko lista fr: toute la liste he: ëì äøùéîä is: allan listann it: la lista intera lv: viss saraksts nl: de volledige lijst no: hele listen pl: pe³na lista pt: toda a lista ro: toata lista ru: öåëûé ñïèñîê sl: celoten seznam sv: hela listan this forum is moderated bg: òîçè ôîðóì ñå ìîäåðèðà ca: aquest fòrum té moderador cs: fórum je umírnda: dette forum er ændret de: dieses Forum wird moderiert en: this forum is moderated es: este foro está moderato et: see foorum on modereeritav fi: tämä foorumi on valvottu fr: ce forum est modéré it: questo forum è moderato nl: dit forum wordt gemodereerd no: dette forumet er endret pl: forum jest moderowane pt: este fórum é moderado ro: acest forum este moderat ru: ýòîò ôîðóì ìîäåðèðóåòñÿ sl: forum moderira sv: detta forum är ändrat title/titles af: titel/titels bg: òèòëà/òèòëè br: titl/titloù ca: títol/títols cs: titul/tituly da: titel/titler (nob.) de: Titel/Titel en: title/titles eo: nobeltitolo:a:+n/nobeltitoloj:a:+n es: título/títulos et: tiitel/tiitlid fi: arvo/arvot fr: titre/titres he: úåàø/ úàøéí is: titill/titlar it: titolo/titoli lv: tituls/tituli nl: titel/titels no: titel/titler pl: tytu³/tytu³y pt: título/títulos ro: titlu/titluri ru: òèòóë/òèòóëû sl: naziv/nazivi sv: titel/titlar to add a child to a family, use "%s" af: om 'n kind by te voeg by 'n familie, gebruik "%s" bg: çà äà äîáàâèòå äåòå êúì ñåìåéñòâî, èçïîëçâàéòå "%s" br: evit ouzhpennañ ur bugel d'un tiegezh e ranker implij "%s" ca: per afegir un fill a una família, utilitzeu "%s" cs: pro pøidání dítìte do rodiny pou¾ij "%s" da: brug "%s" for at føje et barn til en familie de: um ein Kind zu einer Familie hinzuzufügen, benutze "%s" en: to add a child to a family, use "%s" eo: por aldoni infanon al familio, uzu "%s" es: para agregar un hijo a una familia, utiliza "%s" et: lapse lisamiseks perre kasuta "%st" fi: lisätäksesi perheeseen lapsen käytä "%s" fr: pour ajouter un enfant à une famille, utiliser "%s" he: ìäåñéó éìã ìîùôçä, äùúîù á-"%s" is: til að bæta barni við fjölskyldu, notaðu "%s" it: per aggiungere un figlio ad una famiglia, scegliere "%s" lv: lai pievienotu bçrnu ìimenei, lietojiet "%s" nl: gebruik "%s" om een kind aan een gezin toe te voegen no: for å tilføye et barn til en familie, bruk "%s" pl: aby dodaæ dziecko do pary rodziców u¿yj "%s" pt: para acrescentar um filho a uma família utilizar "%s" ro: pentru a adauga un copil utilizeaza "%s" ru: ÷òîáû äîáàâèòü ðåáåíêà ê ñåìüå, èñïîëüçóé "%s" sl: da bi dodal otroka k dru¾ini, uporabite "%s" sv: för att lägga till ett barn i en familj, använd "%s" to the %s generation af: tot die %s geslag bg: äî %s ïîêîëåíèå br: betek ar %s rummad-tud ca: fins a la %s generació cs: a¾ do %s generace da: til den %s generation de: bis zur %s Generation en: to the %s generation eo: gxis la %s generacio es: hasta la %s generación et: %s sugupõlveni fi: %s sukupolveen fr: jusqu'à la %s génération he: ìãåø ä%s is: til %s kynslóðar it: fino alla %s generazione lv: lîdz %s. paaudzei nl: tot de %s generatie no: til %s generasjon pl: do %s pokolenia pt: até à %s geração ro: pina la generatia %s ru: äî %s ïîêîëåíèÿ sl: do %s generacije sv: till den %s generationen to the children af: tot die kinders bg: äî äåöàòà br: betek ar vugale ca: fins els fills cs: k dìtem da: til børnene de: bis zu den Kindern en: to the children eo: gxis la idoj es: hasta los hijos et: lasteni fi: lapsiin fr: jusqu'aux enfants he: òã äéìãéí is: til barnsins it: fino ai figli lv: lîdz bçrnam nl: tot de kinderen no: til barna pl: tylko dzieci pt: até aos filhos ro: pina la copii ru: äî äåòåé sl: do otrok sv: till barnen to the grandchildren af: tot die kleinkinders bg: äî âíóöèòå br: betek ar vugale vihan ca: fins els nets cs: k vnouèatùm da: til børnebørnene de: bis zu den Enkeln en: to the grandchildren eo: gxis la genepoj es: hasta los nietos et: lastelasteni fi: lapsenlapsiin fr: jusqu'aux petits-enfants he: òã äðëãéí is: til barnabarna it: fino ai nipoti lv: lîdz mazbçrnam nl: tot de kleinkinderen no: til barnebarna pl: dzieci i wnuki pt: até aos netos ro: pina la nepoti ru: äî âíóêîâ sl: do vnukov sv: till barnbarnen to the grandparents af: tot die grootouers bg: äî äÿäîâöèòå è áàáèòå br: betek an dud-kozh ca: fins els avis cs: k prarodièùm da: til bedsteforældrene de: bis zu den Großeltern en: to the grandparents eo: gxis la geavoj es: hasta los abuelos et: vanavanemateni fi: isovanhempiin fr: jusqu'aux grands-parents he: òã äñáéí is: til afa og ömmu it: fino ai nonni lv: lîdz vecvecâkiem nl: tot de grootouders no: til besteforeldrene pl: rodzice i dziadkowie pt: até aos avós ro: pina la bunici ru: äî ïðàäåäîâ sl: do starih star¹ev sv: till den 3:e generationen to the great-grandchildren af: tot die agterkleinkinders bg: äî ïðàâíóöèòå br: betek ar vugale guñv ca: fins els besnets cs: k pravnouèatùm da: til oldebørnene de: bis zu den Urenkeln en: to the great-grandchildren eo: gxis la gepranepoj es: hasta los bisnietos et: lastelastelasteni fi: lapsen-lapsenlapsiin fr: jusqu'aux arrière-petits-enfants he: òã äðéðéí is: til barnabarnabarna it: fino ai pronipoti lv: lîdz mazmazbçrniem nl: tot de achterkleinkinderen no: til oldebarna pl: do prawnuków pt: até aos bisnetos ro: pina la stranepoti ru: äî ïðàïðàâíóêîâ sl: do pravnukov sv: till barnbarns barnen to the great-grandparents af: tot die oorgrootouers bg: äî ïðàäÿäîâöèòå è ïðàáàáèòå br: betek ar an dud-kuñv ca: fins els besavis cs: k praprarodièùm da: til oldeforældrene de: bis zu den Urgroßeltern en: to the great-grandparents eo: gxis la gepraavoj es: hasta los bisabuelos et: vanavanavanemateni fi: iso-isovanhempiin fr: jusqu'aux arrière-grands-parents he: òã ääåøéí äùéìùéí is: til langlangafa og ömmu it: fino ai bisnonni lv: lîdz vecvecvecâkiem nl: tot de overgrootouders no: til oldeforeldrene pl: do pradziadków pt: até aos bisavós ro: pina la strabunici ru: äî ïðàïðàðîäèòåëåé sl: do prastarih star¹ev sv: till den 4:e generationen to the parents af: tot die ouers bg: äî ðîäèòåëèòå br: betek ar gerent ca: fins els pares cs: k rodièùm da: til forældrene de: bis zu den Eltern en: to the parents eo: gxis la gepatroj es: hasta los padres et: vanemateni fi: vanhempiin fr: jusqu'aux parents he: òã ääåøéí is: til foreldra it: fino ai genitori lv: lîdz vecâkiem nl: tot de ouders no: til foreldrene pl: tylko rodzice pt: até aos pais ro: pina la parinti ru: äî ðîäèòåëåé sl: do star¹ev sv: till föräldrarna today af: vandag bg: äíåñ br: hiziv an deiz ca: avui cs: dnes da: i dag de: heute en: today eo: hodiaù es: hoy et: täna fi: tänään fr: aujourd'hui he: äéåí is: í dag it: oggi lv: ðodien nl: vandaag no: i dag pl: dzisiaj pt: hoje ro: astazi ru: ñåãîäíÿ sl: danes sv: i dag tomorrow af: môre bg: óòðå br: warc'hoazh ca: demà cs: zítra da: i morgen de: morgen en: tomorrow eo: morgaù es: mañana et: homme fi: huomenna fr: demain he: îçø is: á morgun it: domani lv: rît nl: morgen no: i morgen pl: jutro pt: amanhã ro: maine ru: çàâòðà sl: jutri sv: i morgon total af: totaal bg: îáùî br: en holl ca: total cs: celkem da: totalt de: Summe en: total eo: tuto es: total et: kokku fi: yhteensä fr: total he: ñä'ë is: alls it: totale lv: kopâ nl: totaal no: totalt pl: ³±cznie pt: total ro: in total ru: âñåãî sl: skupaj sv: totalt tree af: boom bg: âåðòèêàëíî äúðâî br: gwezenn ca: arbre cs: strom da: træ de: Baum en: tree eo: arbo es: árbol et: puu fi: puu fr: arbre he: àõ is: tré it: albero lv: koks nl: boom no: tre pl: drzewo pt: árvore ro: arbore ru: äåðåâî sl: drevo sv: träd try again bg: îïèòàéòå îòíîâî da: prøv igen de: Nocheinmal versuchen en: try again et: proovi uuesti fi: yritä uudestaan fr: réessayer nl: opnieuw proberen uncles and aunts af: ooms en tantes bg: âóé÷îâöè, ÷è÷îâöè è ëåëè br: eontred ha moerebed ca: oncles i ties cs: strýcové a tety da: onkler og tanter de: Onkel und Tanten en: uncles and aunts eo: onkloj kaj onklinoj es: tíos y tías et: onud ja tädid fi: sedät, enot ja tädit fr: oncles et tantes he: ãåãéí is: föður(móður)systur og föður(móður)bræður it: zii e zie lv: onkuïi un tantes nl: ooms en tantes no: onkler og tanter pl: stryjowie lub wujowie oraz ciotki pt: tios e tias ro: unchi/matuse ru: äÿäè è òåòè sl: strici in tete sv: farbröder-morbröder och fastrar-mostrar undefined sex for %t af: geslag onbekend vir %t bg: íå å îïðåäåëåí ïîëúò íà %t br: ar reizh n'eo ket termenet evit %t ca: no s'ha definit el sexe de %t cs: neznámé pohlaví pro %t da: udefineret køn for %t de: Geschlecht nicht definiert für %t en: undefined sex for %t eo: sekso nedifinita por %t es: sexo no definido por %t et: %t sugu on määratlemata fi: %t:n sukupuoli tuntematon fr: sexe indéfini pour %t he: äîéï ùì %t ìà îåâãø is: kyn ekki skilgreint fyrir %t it: sesso indefinito per %t lv: nenoskaidrots dzimums personai %t nl: onbepaald geslacht voor %t no: udefinert kjønn for %t pl: %t ma nieokre¶lon± p³eæ pt: sexo indefinido para %t ro: gen nedefinit pentru %t ru: íåèçâåñòíûé ïîë ó %t sl: %t nima doloèenega spola sv: odefinierat kön för %t unknown person af: onbekende persoon bg: íåèçâåñòíî ëèöå br: den dianav ca: persona desconeguda cs: neznámá osoba da: ukendt person de: unbekannte Person en: unknown person eo: nekonata persono es: persona desconocida et: tundmatu isik fi: tuntematon henkilö fr: personne inconnue he: àãí ìà éãåò is: óþekktur einstaklingur it: persona sconosciuta lv: nezinâma persona nl: onbekend persoon no: ukjent person pl: osoba nieznana pt: pessoa desconhecida ro: persoana necunoscuta ru: íåèçâåñòíûé ÷åëîâåê sl: neznana oseba sv: okänd person unspecified af: nie gemeld nie bg: íåóòî÷íåíî br: n'eo ket resisaet ca: no especificat cs: nespecifikováno da: uspecificeret de: nicht präzisiert en: unspecified eo: ne specifita es: no especificado et: täpsustamata fi: määrittelemätön fr: non précisé he: ìà îôåøè is: ótilgreint it: non specificato lv: nenoteikts nl: niet gespecificeerd no: uspesifisert pl: nieokre¶lone pt: não especificado ro: nespecificata ru: íåîïðåäåëåííûé sl: nedoloèeno sv: ospecificerad up to af: tot by bg: äî br: betek ca: fins a cs: a¾ po :a: da: op til de: bis en: up to eo: gxis es: hasta et: kuni fi: saakka fr: jusqu'à he: òã is: upp að it: fino a lv: lîdz nl: tot aan no: opp til pl: do pt: até ro: pina la ru: âïëîòü äî sl: do sv: upp till update af: bywerk bg: ïðîìÿíà br: hizivadur ca: actualització cs: upravit da: opdater de: Aktualisieren en: update eo: gxisdatigo es: revisión et: täienda fi: päivitä fr: mise à jour he: òãëï is: uppfæra it: aggiornamento lv: informâcijas papildinâðana nl: actualiseer no: oppdatere pl: aktualizacja pt: actualizar pt-br: atualizar ro: actualizare ru: èçìåíèòü sl: spremeni sv: uppdatera zh: ¸üРuse "link" instead of "create" af: gebruik "koppel" eerder as "skep" bg: èçïîëçâàéòå "äà ñå ñâúðæå" âìåñòî "äà ñå ñúçäàäå" br: implijit "liammañ" kentoc'h eget "sevel" ca: utilitzeu "reunir" en lloc de "crear" cs: pou¾ij "svázat" namísto "vytvoøit" da: anvend "forbind" i stedet for "opret" de: benutze "verbinden" an Stelle von "erzeugen" en: use "link" instead of "create" eo: uzu "bindi" anstataù ol "krei" es: utilise "reunir" en lugar de "crear" et: vali "loo" asemel "viita" fi: käytä "luo" toiminnon "liitä" sijaan fr: utilisez "relier" au lieu de "créer" he: ìäùúîù á-"÷ùø" áî÷åí "òùä" is: notaðu "tengja" í stað "búa til" it: usare "link" invece di "create" lv: "izveidot" vietâ lietojiet "saite" nl: gebruik "connectie" inplaats van "creëren" no: bruk "koble" istedet for "opprett" pl: u¿yj "link" zamiast "utwórz" pt: use "ligar" em lugar de "criar" ro: utilizeaza "reuneste" in loc de "creaza" ru: èñïîëüçóéòå "ñâÿçàòü" âìåñòî "ñîçäàòü" sl: uporabite "povezava" namesto "ustvari" sv: använd "länk" istället för "skapa" user/password/cancel bg: ïîëçâàòåë/ïàðîëà/îòêàçâàíå br: implijer/tremenger/nulañ da: bruger/adgangskode/annuller de: Benutzer/Passwort/Abbruch en: user/password/cancel es: usuario/contraseña/cancelar et: kasutaja/parool/tühista fi: käyttajä/salasana/peruuta fr: utilisateur/mot de passe/annuler he: îùúîù / ñéñîä / áéèåì it: utilizzatore/password/annullare lv: lietotâjs/parole/atcelt nl: gebruiker/wachtwoord/annuleren no: bruker/passord/avbryt pl: u¿ytkownik/has³o/anuluj ro: utilizator/parola/anulare sl: uporabnik/geslo/preklièi sv: användare/passord/avbryt validate/delete bg: äà ñå ïîòâúðäè/äà ñå èçòðèå ca: validar/eliminar cs: ovda: valider/slet de: Bestätigen/Verwerfen en: validate/delete es: validar/borrar et: kinnita/kustuta fi: tarkista/hylkää fr: valider/supprimer it: conferma/elimina nl: valideer/verwijder no: verifiser/slett pl: sprawd¼/usuñ pt: validar/eliminar ro: valideaza/sterge ru: ïðîâåðèòü/óäàëèòü sv: giltligt/tas bort view source en: view source fr: voir source visualize/show/hide/summary bg: äà ñå âèçóàëèçèðà/äà ñå ïîêàæå/äà ñå ñêðèå/ðåçþìå ca: visualtza/mostra/sumari cs: zviditelnit/ukázat/souhrnný da: visualiser/vis/gem/opsummere de: veranschaulichen/einblenden/ausblenden/Zusammenfassung en: visualize/show/hide/summary es: visualizar/mostrar/ocultar/resumen et: kuva/näita/peida/kokkuvõte fi: kuvaa/näytä/piilota/yhteenveto fr: visualiser/afficher/masquer/sommaire it: visualizza/mostra/nascondi/riassunto nl: visualiseren/tonen/verbergen/samenvatting no: visualiser/vis/skjul/summert pl: wy¶wietl/poka¿/ukryj/podsumowanie pt: visualizar/mostrar/esconder/sumário ro: vizualizeaza/arata/ascunde/sumar ru: ïîñòðîèòü/ïîêàçàòü/ñêðûòü/îáùàÿ sv: visualisera/visa/göm/summering warnings af: waarskuwings bg: ïðåäóïðåæäåíèÿ br: evezhiadennoù ca: advertències cs: varování da: advarsler de: Warnungen en: warnings eo: avertoj es: advertencias et: hoiatused fi: varoituksia fr: remarques he: àæäøåú is: athugið it: avvertenze lv: brîdinâjumi nl: waarschuwingen no: advarsler pl: uwaga! pt: avisos ro: avertisment ru: âíèìàíèå sl: opozorila sv: varningar with af: met bg: ñ br: gant ca: amb cs: s :i: da: med de: mit en: with eo: kun es: con et: koos :k: fi: sekä fr: avec he: òí is: með it: con lv: ar nl: met no: med pl: z: pt: com ro: cu ru: ñ sl: z sv: med witness at marriage of %s and %s af: getuie by die troue van %s met %s bg: ñâèäåòåë ïðè áðàêà íà %s è %s br: test e eured %s gant %s ca: testimoni en el matrimoni de %s i %s cs: svìdek na svatbì: %s a %s da: vidne ved brylluppet mellem %s og %s de: Trauzeugen bei der Hochzeit von %s und %s en: witness at marriage of %s and %s eo: atestant(in)o pri la edzigxo de %s kaj %s es: testigo en el casamiento de %s y %s et: %s ja %s abielu tunnistaja fi: %s ja %s avioliiton todistaja fr: témoin au mariage de %s et de %s he: àãéí áçúåðä ùì %s å-%s is: vitni að giftingu %s og %s it: testimone al matrimonio di %s e %s lv: liecinieks %s un %s laulîbâs nl: getuige bij het huwelijk van %s en %s no: forlover ved ekteskap mellom %s og %s pl: ¶wiadek ma³¿eñstwa pomiêdzy osobami: %s i %s pt: testemunha do casamento de %s e %s ro: martor la mariajul lui %s cu %s ru: ñâèäåòåëü â áðàêå %s è %s sl: prièa pri poroki med %s in %s sv: vittne vid äktenskap mellan %s och %s witness/witnesses af: getuie/getuies bg: ñâèäåòåë/ñâèäåòåëè br: test/testoù ca: testimoni/testimonis cs: svìdek/svìdkové da: vidne/vidner de: Trauzeuge/Trauzeugen en: witness/witnesses eo: atestanto:a:+n/atestantoj es: testigo/testigos et: tunnistaja/tunnistajad fi: todistaja/todistajat fr: témoin/témoins he: àã/ àãéí is: vitni/vitni it: testimone/testimoni lv: liecinieks:a:-u/liecinieki nl: getuige/getuigen no: forlover/forlovere pl: ¶wiadek:a:--ka/¶wiadkowie pt: testemunha/testemunhas ro: martor/martori ru: ñâèäåòåëü:g:-ÿ:a:-ÿ/ñâèäåòåëè sl: prièa/prièe sv: vittne/vittnen wizard/wizards/friend/friends/exterior af: Medewerkers/Medewerkers/vriend/vriend/exterior bg: àäìèíèñòðàòîð/àäìèíèñòðàòîðè/ïðèÿòåë/ïðèÿòåëè/âúíøåí ïîòðåáèòåë br: strobineller/strobinellerien/mignon/mignon/exterior ca: administrador/administrador/amic/amic/exterior cs: wizard/wizards/friend/friends/exterior da: bidragyder/bidragydere/betroet/betroet/exterior de: Wizard/Wizards/Freund/Freunde/exterior en: wizard/wizards/friend/friends/exterior eo: sorcxisto/sorcxistoj/amiko/amikoj/exterior es: brujo/brujos/amigo/amigos/exterior et: teadmamees/teadmamehed/sõber/sõbrad/exterior fi: velho/velho/valittu/valittu/exterior fr: magicien/magiciens/ami/amis/extérieur he: ëâàåï / ëâàåï / îéåçñú / îéåçñú /exterior is: uppfæra/uppfæra/vinur/vinur/exterior it: wizard/wizard/amico/amico/exterior lv: wizard/wizard/friend/friends/exterior nl: beheerder/beheerder/vriend/vrienden/exterior no: Oppdaterings/Oppdaterings/venner/venner/exterior pl: wizard/wizard/friend/friends/exterior pt: feiticeiro/feiticeiros/amigo/amigos/exterior ro: magician/magician/amic/amic/exterior ru: wizard/wizard/äðóã/äðóã/exterior sl: èarovnik/èarovnik/prijatelj/prijatelj/exterior sv: administratör/administratörer/vän/vän/exterior would be his/her own ancestor af: sal sy/haar eie voorganger wees bg: ùå ñå îêàæå åäèí îò ñîáñòâåíèòå ñè ïðåäöè br: a vefe e/he hendad ca: seria el seu propi avantpassat cs: byl by svùj vlastní pøedek da: skal være sin egen forfader de: würde sein/ihr eigener Vorfahre sein en: would be his/her own ancestor eo: estus sia propra prapatro es: sería su propio ancestro et: oleks iseenda esivanem fi: olisi oma esivanhempansa fr: serait son propre ancêtre he: äéä àá-÷ãîåï ìòöîå/ìòöîä is: myndi verða sinn eigin forfaðir it: sarebbe antenato(a) di se stesso(a) lv: varçtu bût viòa/viòas priekðtecis nl: zou zijn/haar eigen voorouder zijn no: ville være sin egen etterkommer pl: by³by/by³aby swoim w³asnym przodkiem pt: seria seu própio antepassado ro: ar fi propriul stramos ru: áûëî áû åãî/åå ñîáñòâåííûì ïðåäêîì sl: bi bil svoj lasten prednik sv: skulle vara sin egen ana year/month/day af: jaar/maand/dag bg: ãîäèíà/ìåñåö/äåí br: bloaz/miz/deiz ca: any/mes/dia cs: rok/mìsíc/den da: år/måned/dag de: Jahr/Monat/Tag en: year/month/day eo: jaro/monato/tago es: año/mes/día et: aasta/kuu/päev fi: vuosi/kuukausi/päivä fr: année/mois/jour/an he: ùðä/ çåãù/ éåí is: ár/mánuður/dagur it: anno/mese/giorno lv: gads/mçnesis/diena nl: jaar/maand/dag no: år/måned/dag pl: rok/miesi±c/dzieñ pt: ano/mês/dia ro: anul/luna/ziua ru: ãîä/ìåñÿö/äåíü sl: leto/mesec/dan sv: år/månad/dag years old af: jaar. bg: ãîäèíè br: bloaz ca: anys cs: let da: år de: Jahre alt en: years old eo: jaroj es: años et: aastat fi: vuotta vanha fr: ans he: ùðéí is: ára it: anni lv: gadi nl: jaar oud no: år gammel pl: lat pt: anos ro: ani ru: ëåò sl: let sv: år zh: Ëê you are visible/you are not visible de: du bist sichtbar/du bist nicht sichtbar en: you are visible/you are not visible fr: vous êtes visible/vous n'êtes pas visible ro: tu esti vizibil/tu nu esti vizibil you must first merge af: jy moet eers saamvoeg bg: ïúðâî òðÿáâà äà îáåäèíèòå br: kendeuziñ a rankit da gentañ-penn ca: abans heu de fusionar cs: nejdøív musíte spojovat da: du skal først sammenlægge de: bitte erst zusammenführen en: you must first merge eo: vi devas unue kunigi es: antes Ud. debe fusionar et: kõigepealt pead ühendama fi: yhdistä ensin fr: vous devez d'abord fusionner he: öøéê ìàçã ÷åãí is: þú þarft fyrst að sameina it: dovete in primo luogo fondere lv: Jums vispirms ir jâapvieno nl: eerst samenvoegen no: du må først slå sammen pl: musisz najpierw dokonaæ scalenia pt: tem que fundir primeiro ro: trebuia intai sa unesti ru: âû äîëæíû ñíà÷àëà îáúåäèíèòü sl: naprej morate zdru¾iti sv: du måste först slå samman you must first merge the 2 families af: jy moet eers die twee families saamvoeg bg: ïúðâî òðÿáâà äà îáåäèíèòå äâåòå ñåìåéñòâà br: kendeuziñ an daou diegezh a rankit da gentañ-penn ca: abans heu de fusionar les dues famílies cs: nejdøív musíte spojit tyto dvì rodiny da: du skal først sammenlægge de 2 familier de: bitte erst beide Familien zusammenführen en: you must first merge the 2 families eo: vi devas unue kunigi la 2 familiojn es: debe primero fusionar las 2 familias et: kõigepealt peab ühendama mõlemad pered fi: yhdistä ensin molemmat perheet fr: vous devez d'abord fusionner les 2 familles he: öøéê ìàçã ÷åãí àú 2 äîùôçåú is: þú verður fyrst að sameina þessar 2 fjölskyldur it: dovete in primo luogo fondere le 2 famiglie lv: Jums vispirms ir jâpvieno 2 ìimenes nl: eerst de twee gezinnen samenvoegen no: du må først slå sammen de 2 familiene pl: musisz najpierw scaliæ 2 rodziny pt: primeiro tem que fundir as 2 famílias ro: trebuie intai sa unesti cele doua familii ru: âû äîëæíû ñíà÷àëà îáúåäèíèòü 2 ñåìüè sl: najprej morate zdru¾iti obe dru¾ini sv: du måste först slå samman de 2 familjerna your message is waiting for validation bg: ñúîáùåíèåòî Âè î÷àêâà ïîòâúðæäåíèå ca: el vostre missatge està pendent de validació cs: tvojá zpráva je da: din meddelelse venter på validering de: deine Nachricht wartet auf ihre Überprüfung en: your message is waiting for validation es: tu mensaje espera su validación et: teade ootab kinnitamist fi: viestisi odottaa tarkistusta fr: votre message est en attente de validation it: il vostro messaggio è in attesa di convalida nl: uw bericht wacht op validatie no: Beskjeden din avventer bekreftelse pl: twoja wiadomo¶æ czeka na potwierdzenie pt: a sua mensagem aguarda validação ro: mesajul dvs. asteapta sa fie validat ru: âàøå ñîîáùåíèå îæèäàåò ïðîâåðêè sv: ditt meddelande väntar på giltighet geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/lang/start.txt0000660000175200017530000010421412664543647023635 0ustar guillaumeguillaume%T [ af: Genealogie/Familiekunde bg: Genealogy br: Genealogiezh ca: Genealogia cs: Genealogy da: Genealogi de: Genealogie en: Genealogy eo: Genealogio es: Genealogía et: Genealoogia fi: Genealogia fr: Généalogie he: úåìãåú is: Ættfræði it: Genealogia lv: Ìenealoìija nl: Genealogie no: Genealogi pl: Genealogia pt: Genealogia ro: Genealogie ru: Genealogy sl: Genealogija - Dru¾insko drevo sv: Genealogi ] - %t %j
%I&wNf %E%I&fNw %E
GeneWeb ([wizard/wizards/friend/friends]0%U)([wizard/wizards/friend/friends]2)%w

[ af: Genealogiese databasis bg: Ðîäîñëîâíà áàçà îò äàííè br: Bon roadoù genealogiezh ca: Base de dades genealògica cs: Genealogická databáze da: Genealogisk database de: Genealogische Datenbank en: Genealogical database eo: Datenbazo genealogia es: Base de datos genealógica et: Genealoogiline andmebaas fi: Sukutietokanta fr: Base de données généalogique he: îàâø îéãò úåìãåúé is: Ættfræði gagnagrunnur it: Base di dati genealogica lv: Ciltsrakstu datu bâze nl: Genealogische databank no: Genealogisk database pl: Genealogiczna baza danych pt: Base de Dados Genealógica ro: Basa de date genealogice ru: Ãåíåaëîãè÷åñêàÿ áàçà äàííûõ sl: Genealo¹ka baza podatkov sv: Genealogisk databas zh: ÍøÂç¼ÒÆ× ]

[ af: Taalvoorkeur/Language preference: bg: Ìîæåòå äà èçáåðåòå äðóã åçèê çà ñúîáùåíèÿ èçìåæäó ñëåäíèòå: br: Dibab a c'hellit ur yezh all etre ar re-mañ: ca: Podeu seleccionar una altre llengua, hi ha disponibles les següents: cs: Zvolte jazyk pro prohlí¾ení databáze: da: Du kan vælge fremstilling på et andet sprog blandt de følgende: de: Du kannst eine der folgenden Sprachen für die Anzeige auswählen: en: You can select another displaying language among the following ones: eo: Vi povas elekti alian lingvon inter la sekvantajn: es: Puede seleccionar uno de los idiomas siguientes: et: Võid valida ka mõne muu keele järgnevatest: fi: Voit valita jonkin muun kielen allaolevista: fr: Vous pouvez sélectionner une autre langue d'affichage parmi les suivantes: it: Potete scegliere un'altra lingua fra le seguenti: is: Þú getur valið milli eftirfarandi tungumála: lv: Jûs variet apskatît datu bâzi arî citâs sekojoðâs valodâs: nl: U kunt een andere taal kiezen uit een van de volgende mogelijkheden: no: Du kan velge sidevisning på et annet språk blant følgende: pl: Mo¿esz wybraæ inny jêzyk spo¶ród nastêpuj±cych: ro: poti sa alegi una din urmatoarele limbi pentru afisaj sl: Lahko izberete drug jezik: sv: Du kan välja ett annat språk bland de följande: ] %rversion %Vmotd;

[ af: Die databasis "%t" bevat tans %n persone. bg: Áàçàòà îò äàííè "%t" â ìîìåíòà ñúäúðæà ñâåäåíèÿ çà %n äóøè. br: Niver an dud a zo er bon roadoù "%t" bremañ a zo : %n. ca: La base de dades "%t" conté actualment %n persones. cs: Databáze "%t" obsahuje %n osob. da: Databasen "%t" indeholder for øjeblikket %n personer. de: Die Datenbank "%t" enthält z. Zt. %n Personen. en: The database "%t" now holds %n persons. eo: La datenbazo "%t" enhavas nun %n personojn. es: La base "%t" contiene actualmente %n personas. et: Andmebaas "%t" sisaldab andmeid %n isiku kohta. fi: Tietokannassa "%t" on nyt %n henkilöä. fr: La base de données "%t" contient actuellement %n personnes. fr-cr: Ni atchuèlement %n nhon-m, fan-m, yiche adan chagement "%t" ta-la he: áîàâø äîéãò "%t" éù %n àðùéí. is: Gagnagrunnurinn "%t" er nú með %n einstaklinga skráða. it: La base di dati "%t" contiene attualmente %n persone. lv: Datu bâze "%t" patreiz satur %n personas. nl: Deze databank "%t" bevat nu %n personen. no: Databasen "%t" inneholder nå %n personer. pl: Baza danych "%t" zawiera obecnie osób: %n. pt: A base de dados "%t" contém actualmente %n pessoas. pt-br: A base de dados "%t" contém atualmente %n pessoas. ro: basa de date "%t" contine %n persoane. ru: Áàçà äàííûõ "%t" ñåé÷àñ ñîäåðæèò %n ÷åëîâåê. sl: Baza podatkov "%t" vsebuje %n oseb. sv: Databasen "%t" innehåller nu %n personer. zh: ÏÖÓÐ %n ÈËÔÚÊý¾Ý¿âÖС£ ]%In ([note/notes]1%N)%E %I&|pwizard_passwd_file;pwizard_descr_file;|wo ([wizard/wizards/friend/friends]1)%E %Im ([miscellaneous notes]...)%E

%I&NwNj %I&NcNa %INf %E
[ af: [wizard/wizards/friend/friends]0 toegang (password) bg: Äîñòúï êàòî [wizard/wizards/friend/friends]0 (ïàðîëà) br: mont e-barzh evel [wizard/wizards/friend/friends]0 (ger-tremen) ca: accés [wizard/wizards/friend/friends]0 (clau) cs: {"[wizard/wizards/friend/friends]0" pøístup (heslo) da: Opdateringsadgang (adgangskode) de: [wizard/wizards/friend/friends]0-Zugang (Passwort) en: [*wizard/wizards/friend/friends]0 access (password) eo: Aliro [wizard/wizards/friend/friends]0 (pasvorto) es: Entrada [wizard/wizards/friend/friends]0 (contraseña) et: Ligipääs: [wizard/wizards/friend/friends]0 (parool) fi: [*wizard/wizards/friend/friends]0 kirjautuminen (salasana) fr: accès [wizard/wizards/friend/friends]0 (mot de passe). he: ëðéñä [wizard/wizards/friend/friends]0 is: Uppfærslu aðgangur (aðgangsorð) it: [*wizard/wizards/friend/friends]0 access (password) lv: [*wizard/wizards/friend/friends]0 access (password) nl: Toegang als [wizard/wizards/friend/friends]0 (wachtwoord) no: [wizard/wizards/friend/friends]0 adgang (passord) pl: "[wizard/wizards/friend/friends]0" dostêp (has³o) pt: Entrada [wizard/wizards/friend/friends]0 (palavra chave) ro: Acces pentru [wizard/wizards/friend/friends]0 (parola) sl: Urejanje kot "[wizard/wizards/friend/friends]0" (geslo) sv: [*wizard/wizards/friend/friends]0 tillträde (passord) ][ af: Vriend toegang (password) bg: Äîñòúï êàòî ïðèÿòåë (ïàðîëà) br: mont e-barzh evel mignon (ger-tremen) ca: accés amic (clau) cs: {"Friend" pøístup (heslo) da: Betroet adgang (adgangskode) de: Freund-Zugang (Passwort) en: Friend access (password) eo: Aliro amiko (pasvorto) es: Entrada amigo (contraseña) et: Ligipääs: sõber (parool) fi: Valittu kirjautuminen (salasana) fr: accès ami (mot de passe). he: ëðéñä îéåçñú is: Vina aðgangur (aðgangsorð) it: amico access (password) lv: Friend access (password) nl: Toegang als vriend (wachtwoord) no: Venners adgang (passord) pl: "Friend" dostêp (has³o) pt: Entrada amigo (palavra chave) ro: Acces pentru amici (parola) sl: Urejanje kot prijatelj (geslo) sv: Vän tillträde (passord) ]
%E%I|ca
%h[ af: Toegangkodewoord, vir vriend of medewerker toegang: bg: Ïàðîëà çà äîñòúï êàòî ïðèÿòåë èëè àäìèíèñòðàòîð: br: Ger-tremen evit mont e-barzh evel mignon pe strobineller: ca: Clau, per accés amic o administrador: cs: Heslo pro"friend" nebo "wizard" pøístup:: da: Adgangskode, for betroet adgang eller opdateringsadgang: de: Passwort für Freund- oder Wizard-Zugang: en: Password, for friend or wizard access: eo: Pasvorto, por aliro amikosorcxisto: es: Contraseña, para entrada amigo o brujo: et: Parool sõbrana või teadmamehena ligipääsuks: fi: Salasana Valittu tai Velho kirjautumiseen: fr: Mot de passe, pour accès ami ou magicien: he: ñéñîä ìëðéñä îéåçñú àå ëâàåï is: Aðgangsorð, fyrir vina eða uppfærslu aðgang: it: Parola d'accesso, per accesso dell' amico o del wizard: lv: Password, for friend or wizard access: nl: Wachtwoord, voor toegang als vriend of tovenaar: no: Passord, for venner eller oppdaterings adgang: pl: Has³o dla dostêpu "friend" lub "wizard" : pt: Palavra chave para entrada amigo ou feiticeiro: ro: Parola, pentru acces de amic sau magician: sv: Passord, för vänner eller administratör tillträde: ]
%E %E
[ af: Om in die databasis rond te blaai, kan jy die volgende soektogte loods: bg: Ìîæåòå äà èçïîëçâàòå òàçè áàçà îò äàííè çà òúðñåíå: br: Evit merdeiñ er bon roadoù-mañ e c'hellit klask: ca: Per navegar en aquesta base, podeu fer la vostra recerca: cs: Databázi lze prohledávat: da: For at navigere i denne database kan du søge: de: Zum Benutzen dieser Datenbank kannst du hier suchen: en: To navigate in this database, you can do your search: eo: Por navigi en cxi tiu datenbazo, vi povas fari vian sercxon: es: Para navegar en esta base de datos, puede hacer su búsqueda: et: Navigeeri andmebaasis: fi: Liikkuaksesi tässä tietokannassa voit etsiä: fr: Pour naviguer dans cette base de données, vous pouvez effectuer votre recherche: fr-cr: L'heù zott lé chaché ti-tac toupatou, zott pé jiss crié: he: ðååè áîàâø îéãä òì-éãé çéôåñ: is: Í þessum gagnagrunni getur þú leitað: it: Per sfogliare questa base di dati, si può fare una ricerca: lv: Jûs variet meklçt ðinî datu bâzç: nl: Om deze databank te consulteren, kan u een opzoeking doen: no: For å navigere i databasen, kan du søke: pl: Aby poruszaæ siê po bazie, mo¿esz: pt: Para consultar esta base de dados, pode procurar: ro: pentru folosirea basei de date poti sa selectezi: ru: ×òîáû íàéòè â ýòîé áàçå äàííûõ, Âû ìîæåòå èñêàòü: sl: Da bi pregledali va¹o bazo podatkov, lahko i¹èete: sv: För att navigera i denna databas, kan du söka: zh: ]
  • %h

  • %Ispropose_titles;
  • %h %INl%E ([all the titles]) ... %INl%E ([all the estates])
  • %E
  • %h - [ af: in die lys van alle bg: â ñïèñúêà íà âñè÷êè br: dre roll an holl ca: pel llistat de tots els cs: ze seznamu v¹ech da: i liste over alle de: in der Liste aller en: by the list of all eo: per la listo de cxiuj es: por la lista de todos los et: loendis kõik fi: listasta kaikki fr: par la liste de tous les fr-cr: an-ni an he: øùéîä ùì ëì ùîåú is: eftir lista yfir öll it: per la lista di tutti i lv: visus nl: via de lijst van alle no: med liste over alle pl: przejrzeæ listê wszystkich pt: pela lista de todos os ro: pe lista tuturor ru: ïî ñïèñêó âñåõ sl: seznam vseh sv: efter listan av alla zh: ÏÔʾËùµÄ ] [ af: volgens bg: ,  ïîäðåäåíè ïî br: dre ca: per cs: seøazená podle da: sorteret efter de: en: by eo: laù es: por et: järjestatud fi: lajiteltuina fr: par fr-cr: zott pé trappé assou liste-la he: ìôé is: eftir it: in ordine lv: nl: volgens no: sortert pl: u³o¿onych pt: por ro: in ru: óïîðÿäî÷åííûõ sl: po sv: sorterade i zh: ¸ù¾Ý ] [ en: et: järgi ]

  • %Ispropose_place_surnames;
  • %h [ af: by bg: ïî br: dre ca: per cs: podle da: ved de: mit en: by eo: per es: por et: fi: fr: par is: eftir it: per lv: nl: via no: etter pl: przejrzeæ listê: pt: por ro: cu sl: sv: efter ] [place] / [surname/surnames]0 - [birth] - [death] - [marriage/marriages]0 -
    %E%INshide_advanced_request;
  • [ af: deur 'n detail navraag. bg: ÷ðåç ðàçøèðåíî òúðñåíå. br: dre ar klask a-raokaet. ca: per la consulta avançada. cs: lze také zadat roz¹íøený dotaz. da: ved avanceret søgning. de: mit der erweiterten Suche. en: by the advanced request. eo: per la sercxado progresata. es: mediante una consulta avanzada. et: laiendatud päring. fi: erityishaulla. fr: par la requête évoluée. he: ò"é á÷ùä îú÷ãîú. is: eftir frekari óskum. it: per la richiesta avanzata. lv: meklçt pçc citiem parametriem. nl: via een gedetailleerde opzoeking. no: gjennom avansert søking. pl: skorzystaæ z wyszukiwania zaawansowanego. pt: por pesquisa complexa. ro: prin specificare complexa. ru: ÷åðåç ðàñøèðåííûé çàïðîñ. sl: s pomoèjo naprednega iskanja . sv: genom avancerad sökning. ]%E
%I&w|Nnspropose_add_family;
[ af: Jy kan bg: Ìîæåòå îùå br: Gellout a rit ca: Podeu cs: Zde mù¾ete da: Du kan: de: Du kannst en: You can eo: Vi povas es: Puede et: Täiendamine: fi: Taikka fr: Vous pouvez he: éù àôùøåú is: Þú getur it: Si può lv: Izmaiòu veikðana: nl: U kunt: no: Du kan pl: Mo¿esz: pt: Pode ro: Tu poti ru: Âû ìîæåòå sl: Lahko: sv: Du kan zh: ]
%E
[ af: Jy kan ook kyk na bg: Ìîæåòå ñúùî äà ñå íàñî÷èòå êúì br: Gellout a rit ivez gweladenniñ ca: També podeu consultar cs: Lze také zobrazit da: Du kan også fremkalde: de: Du kannst zugreifen auf en: You can consult eo: Vi povas ankaù konsulti es: Puede consultar et: Vaata lisaks: fi: Voit myös katsoa fr: Vous pouvez consulter he: àôùø âí ìäøàåú is: Þú getur einnig athugað it: Si può anche consultare lv: Informâcija par: nl: U kunt de volgende zaken bekijken: no: Du kan også slå opp pl: Mo¿esz tak¿e obejrzeæ: pt: Também pode consultar ro: poti consulta ru: Âû ìîæåòå òàêæå îáðàòèòüñÿ ê sl: Lahko pregledate: sv: Du kan också konsultera zh: ]
[ af: Daar was %q besoeke, %c van hulle aan hierdie blad, sedert %d. bg: Îò %d íàñàì å èìàëî %q ïîñåùåíèÿ, îò êîèòî %c ñà íà íàñòîÿùàòà ñòðàíèöà. br: gweladennoù a zo bet : %q, er bajenn-mañ : %c, abaoe an deiz-mañ : %d. ca: Hi ha hagut %q consultes, de les quals %c en aquesta pàgina, des del %d. cs: %q pøístupù, z toho %c na tuto stránku, od %d. da: Der har været %q opslag, %c af dem på denne side, siden %d. de: Seit dem %d gab es %q Zugriffe, davon %c auf diese Seite. en: There have been %q accesses, %c of them to this page, since %d. eo: Estis %q alirejoj, el kiuj %c al cxi tiu pagxo, ekde la %d. es: Ha habido %q consultas, de las cuales %c corresponden a esta página, desde el %d. et: Alates andmebaasi loomise päevast (%d) on selle poole pöördutud %q korda, neist %c korda sellele lehele. fi: Tähän mennessä %q tapahtumaa, joista %c tälle sivulle %d jälkeen. fr: Il y a eu %q consultations, dont %c à cette page, depuis le %d. he: äéå %q ëðéñåú, ëåìì %c ëðéñåú ìòîåã æä, îàæ %d. is: Það hafa verið %q heimsóknir, %c af þeim á þessa síðu, síðan %d. it: Dal %d ci sono stati %q accessi, %c dei quali a questa pagina. lv: Kopð %D datu bâze ir apmeklçta %q reizes, %c no tiem ir bijuði ðinî lappusç. nl: Deze paginas zijn sinds %d reeds %q maal bezocht, waaronder %c maal deze verwelkomingspagina. no: Det har vært %q aksesser, %c av dem til denne siden, siden %d. pl: Baza zosta³a od %d odwiedzona %q razy (w tym %c razy strona tytu³owa). pt: Houve %q consultas, das quais %c foram a esta página, desde %d. ro: Au avut loc %q accese din care %c pe aceatsa pagina din %d ru: Âñåãî áûëî %q îáðàùåíèé, èç íèõ %c ê ýòîé ñòðàíèöå, íà÷èíàÿ ñ %d. sl: %q dostopov, %c od teh na to stran, od %d. sv: Det har varit %q åtkomster, %c av dem till den här sidan, sedan %d. zh: ÒѾ­ÓÐ %q ´Î·ÃÎÊÊý¾Ý¿â£¬ÆäÖÐ %c ´Î·ÃÎʱ¾Ö÷Ò³£¬ ×Ô´Ó %d¡£ ]
%Il

%E

[ af: Indien u browser nie die bladsye outomaties byvoeg nie (wat u dwing om die dokument te herlaai), probeer die volgende link. bg: Àêî Âàøèÿò áðàóçúð íå àêòóàëèçèðà àâòîìàòè÷íî ñòðàíèöèòå, êîèòî ñà ìîäèôèöèðàíè (ïðèíóæäàâàéêè Âè äà ãè ïðåçàðåæäàòå Âèå), îïèòàéòå ñå äà òðúãíåòå îò òàçè ïðåïðàòêà. br: Ma ne nevesa ket ho merdeer ent-gefreek ar pajennoù kemmet (ha dre-se emañ ret deoc'h "nevesaat ar bajenn"), klakit merdeiñ gant al liamm-mañ. ca: Si el vostre navegador no actualitza automàticament les pàgines modificades (obligant-vos a fer actualitzar manualment la pàgina), proveu de navegar des d'aquest altre lloc. cs: Pokud Vá¹ prohlí¾eè neprovádí automaticky obnovu upravených stránek (musíte pou¾ívat tlaèítko "obnovit"), zkuste prohlí¾ení pøes tento odkaz. da: Hvis din browser ikke automatisk opdaterer ændrede sider (nødvendiggør genindlæsning af det aktuelle dokument), prøv da at navigere herfra. de: Wenn die geänderten Seiten nicht automatisch aktualisiert werden (man muß ständig im Browser auf "Neu laden" klicken), bitte hier klicken. en: If your browser does not automatically update the modified pages (forcing you to do "reload current document"), try navigating from this link. eo: Se via navigisto ne auxtomate gxisdatigas la modifigitajn pagxojn (se vi devas fari "resxargxi kurantan dokumenton"), provu ekde cxi tiu legilo. es: Si las páginas modificadas no serán actualizadas automaticamente, favor de usar esta conexión: hier. et: Kui Su veebibrauser ei uuenda modifitseeritud lehekülgi automaatselt (pead andma käsu "lae käesolev dokument uuesti"), siis proovi alustada navigeerimist sellest viitest. fi: Mikäli selaimesi ei automaattisesti päivitä muutettuja sivuja (jolloin sinun täytyy "ladata uudelleen nykyinen dokumentti") kokeile tätä linkkiä. fr: Si votre navigateur ne met pas à jour automatiquement les pages modifiées (vous obligeant à faire "actualiser la page"), essayez la navigation à partir de ce lien. is: Ef vafrinn sem þú notar er í vandræðum með að uppfæra síðuna prófaðu þetta. it: Se il vostro navigatore non aggiorna automaticamente le pagine modificate (obbligandovi a fare « aggiorna »), provate a partire da questo collegamento. lv: Ja Jûsu Interneta caurlûkprogramma automâtiski nepârlâdç lappuses pçc veiktajâm izmaiòâm (tâdçjâdi radot Jums nepiecieðamîbu "pârlâdçt tekoðo dokumentu"), tad pamçìiniet uzklikðíinât ðeit. nl: Indien Uw browser de gewijzigde pagina's niet automatisch toont (maar dit alleen doet na klikken op "Vernieuwen"), probeer het dan eens via deze link. no: Hvis din browser ikke automatisk oppdaterer endrede sider (krever oppfrisking av den aktuelle siden), prøv da å navigere herfra. pl: Je¿eli twoja przegl±darka nie od¶wie¿a automatycznie zmienionych stron (zmuszaj±c ciê do ich rêcznego od¶wie¿ania), kliknij tutaj. pt: Se o seu browser não actualiza automaticamente as páginas modificadas (forçando a fazer "reload current document"), tente navegar desde este link. pt-br: Se o seu browser não atualiza automaticamente as páginas modificadas (forçando a fazer "reload current document"), tente navegar desde este link. ro: daca pagina modificata nu este actualizata in mod automat (trebue sa fortezi "reload current document") navigeaza cu acest link sl: Èe va¹ brskalnik ne more obnavljati strani avtomatièno (morate "reload current document"), kliknite tukaj. sv: Om din webbläsare inte automatiskt uppdaterar de modifierade sidorna (vilket tvingar dig att uppdatera sidan hela tiden), försök då att navigera härifrån. ]

[ bg: ëåêñèêîí br: geriaoueg ca: Lèxic cs: lexikon da: leksikon de: Lexikon en: lexicon eo: leksikono es: diccionario et: sõnastik fi: Sanasto fr: lexique he: ì÷ñé÷åï is: orðasafn it: lessico no: leksikon pl: leksykon ro: lexicon sl: leksikon sv: lexikon zh: ±¾Õ¾Ê¹ÓõÄÊõÓï ]

geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/lang/start_utf8.txt0000660000175200017530000012166512664543647024614 0ustar guillaumeguillaume%T [ af: Genealogie/Familiekunde bg: Genealogy br: Genealogiezh ca: Genealogia cs: Genealogie da: Genealogi de: Genealogie en: Genealogy eo: Genealogio es: Genealogía et: Genealoogia fi: Genealogia fr: Généalogie he: תולדות is: Ættfræði it: Genealogia lv: Ä¢enealoÄ£ija nl: Genealogie no: Genealogi oc: Genealogia pl: Genealogia pt: Genealogia ro: Genealogie ru: Genealogy sl: Genealogija - Družinsko drevo sv: Genealogi ] - %t %j
%I&wNf %E%I&fNw %E
GeneWeb [wizard/wizards/friend/friends]0%U %I|pwizard_passwd;pwizard_passwd_file;%I|pfriend_passwd;pfriend_passwd_file;([disconnect])%E%E[wizard/wizards/friend/friends]2 %I|pfriend_passwd;pfriend_passwd_file;([disconnect])%E%w

[ af: Genealogiese databasis ar: قاعدة المعلومات العائلية (جينيالوجيا) bg: РодоÑловна база от данни br: Bon roadoù genealogiezh ca: Base de dades genealògica cs: Genealogická databáze da: Genealogisk database de: Genealogische Datenbank en: Genealogical database eo: Datenbazo genealogia es: Base de datos genealógica et: Genealoogiline andmebaas fi: Sukutietokanta fr: Base de données généalogique he: מ×גר מידע תולדותי is: Ættfræði gagnagrunnur it: Base di dati genealogica lv: Ciltsrakstu datu bÄze nl: Genealogische databank no: Genealogisk database oc: Basa de donadas genealogica pl: Genealogiczna baza danych pt: Base de Dados Genealógica ro: Baza de date genealogice ru: ГенеaлогичеÑÐºÐ°Ñ Ð±Ð°Ð·Ð° данных sl: GenealoÅ¡ka baza podatkov sv: Genealogisk databas zh: 网络家谱 ]

%rversion
%Vmotd;%P

[ af: Die databasis "%t" bevat tans %n persone. ar: قاعدة المعلومات "%t" تحوي إلى يومنا %n ÙØ±Ø¯ bg: Базата от данни "%t" в момента Ñъдържа ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð·Ð° %n души. br: Niver an dud a zo er bon roadoù "%t" bremañ a zo : %n. ca: La base de dades "%t" conté actualment %n persones. cs: Databáze "%t" obsahuje %n osob. da: Databasen "%t" indeholder for øjeblikket %n personer. de: Die Datenbank "%t" enthält z. Zt. %n Personen. en: The database "%t" now holds %n persons. eo: La datenbazo "%t" enhavas nun %n personojn. es: La base "%t" contiene actualmente %n personas. et: Andmebaas "%t" sisaldab andmeid %n isiku kohta. fi: Tietokannassa "%t" on nyt %n henkilöä. fr: La base de données "%t" %P contient actuellement %n personnes. fr-cr: Ni atchuèlement %n nhon-m, fan-m, yiche adan chagement "%t" ta-la he: במ×גר המידע "%t" יש %n ×נשי×. is: Gagnagrunnurinn "%t" er nú með %n einstaklinga skráða. it: La base di dati "%t" contiene attualmente %n persone. lv: Datu bÄze "%t" patreiz satur %n personas. nl: Deze databank "%t" bevat nu %n personen. no: Databasen "%t" inneholder nå %n personer. oc: La basa de donadas "%t" conten actualament %n personas. pl: Baza danych "%t" zawiera obecnie osób: %n. pt: A base de dados "%t" contém actualmente %n pessoas. pt-br: A base de dados "%t" contém atualmente %n pessoas. ro: baza de date "%t" conÈ›ine %n persoane. ru: База данных "%t" ÑÐµÐ¹Ñ‡Ð°Ñ Ñодержит %n человек. sl: Baza podatkov "%t" vsebuje %n oseb. sv: Databasen "%t" innehåller nu %n personer. zh: 现有 %n 人在数æ®åº“中。 ]%In ([note/notes]1%N)%E%I&|pwizard_passwd_file;pwizard_descr_file;|wo ([wizard/wizards/friend/friends]1)%E%Im ([miscellaneous notes]...)%E

%I&NwNj%I&NcNa %INf %E
[ af: [wizard/wizards/friend/friends]0 toegang (password) bg: ДоÑтъп като [wizard/wizards/friend/friends]0 (парола) br: mont e-barzh evel [wizard/wizards/friend/friends]0 (ger-tremen) ca: accés [wizard/wizards/friend/friends]0 (clau) cs: {"[wizard/wizards/friend/friends]0" přístup (heslo) da: Opdateringsadgang (adgangskode) de: [wizard/wizards/friend/friends]0-Zugang (Passwort) en: [*wizard/wizards/friend/friends]0 access (password) eo: Aliro [wizard/wizards/friend/friends]0 (pasvorto) es: Entrada [wizard/wizards/friend/friends]0 (contraseña) et: Ligipääs: [wizard/wizards/friend/friends]0 (parool) fi: [*wizard/wizards/friend/friends]0 kirjautuminen (salasana) fr: accès [wizard/wizards/friend/friends]0 %P (mot de passe). he: כניסה [wizard/wizards/friend/friends]0 is: Uppfærslu aðgangur (aðgangsorð) it: [*wizard/wizards/friend/friends]0 access (password) lv: [*wizard/wizards/friend/friends]0 access (password) nl: Toegang als [wizard/wizards/friend/friends]0 (wachtwoord) no: [wizard/wizards/friend/friends]0 adgang (passord) oc: accès [wizard/wizards/friend/friends]0 %P (mot de Santa Clara). pl: "[wizard/wizards/friend/friends]0" dostÄ™p (hasÅ‚o) pt: Entrada [wizard/wizards/friend/friends]0 (palavra chave) ro: Acces pentru [wizard/wizards/friend/friends]0 (parola) sl: Urejanje kot "[wizard/wizards/friend/friends]0" (geslo) sv: [*wizard/wizards/friend/friends]0 tillträde (passord) ] [ af: Vriend toegang (password) bg: ДоÑтъп като приÑтел (парола) br: mont e-barzh evel mignon (ger-tremen) ca: accés amic (clau) cs: {"Friend" přístup (heslo) da: Betroet adgang (adgangskode) de: Freund-Zugang (Passwort) en: Friend access (password) eo: Aliro amiko (pasvorto) es: Entrada amigo (contraseña) et: Ligipääs: sõber (parool) fi: Valittu kirjautuminen (salasana) fr: accès ami (mot de passe). he: כניסה מיוחסת is: Vina aðgangur (aðgangsorð) it: amico access (password) lv: Friend access (password) nl: Toegang als vriend (wachtwoord) no: Venners adgang (passord) oc: accès amic (mot de Santa Clara) pl: "Friend" dostÄ™p (hasÅ‚o) pt: Entrada amigo (palavra chave) ro: Acces pentru amici (parola) sl: Urejanje kot prijatelj (geslo) sv: Vän tillträde (passord) ]
%E%I|ca
%h%P [ af: Toegangkodewoord, vir vriend of medewerker toegang: bg: Парола за доÑтъп като приÑтел или админиÑтратор: br: Ger-tremen evit mont e-barzh evel mignon pe strobineller: ca: Clau, per accés amic o administrador: cs: Heslo pro"friend" nebo "wizard" přístup:: da: Adgangskode, for betroet adgang eller opdateringsadgang: de: Passwort für Freund- oder Wizard-Zugang: en: Password, for friend or wizard access: eo: Pasvorto, por aliro amikosorĉisto: es: Contraseña, para entrada amigo o brujo: et: Parool sõbrana või teadmamehena ligipääsuks: fi: Salasana Valittu tai Velho kirjautumiseen: fr: Mot de passe, pour accès ami ou magicien: he: סיסמה לכניסה מיוחסת ×ו ×›×’×ון is: Aðgangsorð, fyrir vina eða uppfærslu aðgang: it: Parola d'accesso, per accesso dell' amico o del wizard: lv: Password, for friend or wizard access: nl: Wachtwoord, voor toegang als vriend of tovenaar: no: Passord, for venner eller oppdaterings adgang: oc: Mot de Santa Clara, per accès amic o administrator: pl: HasÅ‚o dla dostÄ™pu "friend" lub "wizard" : pt: Palavra chave para entrada amigo ou feiticeiro: ro: Parola, pentru acces de amic sau magician: sv: Passord, för vänner eller administratör tillträde: ]
%E %E
[ af: Om in die databasis rond te blaai, kan jy die volgende soektogte loods: ar: بإمكانك البحث ÙÙŠ هذه القاعدة: bg: Можете да използвате тази база от данни за търÑене: br: Evit merdeiñ er bon roadoù-mañ e c'hellit klask: ca: Per navegar en aquesta base, podeu fer la vostra recerca: cs: Databázi lze prohledávat: da: For at navigere i denne database kan du søge: de: Zum Benutzen dieser Datenbank kannst du hier suchen: en: To navigate in this database, you can do your search: eo: Por navigi en ĉi tiu datenbazo, vi povas fari vian serĉon: es: Para navegar en esta base de datos, puede hacer su búsqueda: et: Navigeeri andmebaasis: fi: Liikkuaksesi tässä tietokannassa voit etsiä: fr: Pour naviguer dans cette base de données, vous pouvez %P effectuer votre recherche: fr-cr: L'heù zott lé chaché ti-tac toupatou, zott pé jiss crié: he: נווט במ×גר מידה על-ידי חיפוס: is: à þessum gagnagrunni getur þú leitað: it: Per sfogliare questa base di dati, si può fare una ricerca: lv: JÅ«s variet meklÄ“t Å¡inÄ« datu bÄzÄ“: nl: Om deze databank te consulteren, kan u een opzoeking doen: no: For å navigere i databasen, kan du søke: oc: Per navigar dins aquela basa, podètz far vòstra recèrca: pl: Aby poruszać siÄ™ po bazie, możesz: pt: Para consultar esta base de dados, pode procurar: ro: pentru folosirea basei de date poti sa selectezi: ru: Чтобы найти в Ñтой базе данных, Ð’Ñ‹ можете иÑкать: sl: Da bi pregledali vaÅ¡o bazo podatkov, lahko iÅ¡Äete: sv: För att navigera i denna databas, kan du söka: zh: ]
  • %h%P

  • %Ispropose_titles;
  • %h%P %INl%E ([all the titles]) ... %INl%E ([all the estates])
  • %E
  • %h%P - [ af: in die lys van alle bg: в ÑпиÑъка на вÑички br: dre roll an holl ca: pel llistat de tots els cs: ze seznamu vÅ¡ech da: i liste over alle de: in der Liste aller en: by the list of all eo: per la listo de ĉiuj es: por la lista de todos los et: loendis kõik fi: listasta kaikki fr: par la liste de tous les fr-cr: an-ni an he: רשימה של כל שמות is: eftir lista yfir öll it: per la lista di tutti i lv: visus nl: via de lijst van alle no: med liste over alle oc: per la lista de totes los pl: przejrzeć listÄ™ wszystkich pt: pela lista de todos os ro: pe lista tuturor ru: по ÑпиÑку вÑех sl: seznam vseh sv: efter listan av alla zh: 显示所的 ] [ af: volgens bg: ,  подредени по br: dre ca: per cs: seÅ™azená podle da: sorteret efter de: en: by eo: laù es: por et: järjestatud fi: lajiteltuina fr: par fr-cr: zott pé trappé assou liste-la he: לפי is: eftir it: in ordine lv: nl: volgens no: sortert oc: per pl: uÅ‚ożonych pt: por ro: in ru: упорÑдоченных sl: po sv: sorterade i zh: æ ¹æ® ] [ en: et: järgi ]

  • %Ispropose_place_surnames;
  • %h%P - [ af: by bg: по br: dre ca: per cs: podle da: ved de: mit en: by eo: per es: por et: fi: fr: par is: eftir it: per lv: nl: via no: etter oc: per pl: przejrzeć listÄ™: pt: por ro: cu sl: sv: efter ] [place] / [surname/surnames]0 - [birth] - [death] - [marriage/marriages]0 -
  • %E%INshide_advanced_request;
  • - [ af: deur 'n detail navraag. bg: чрез разширено търÑене. br: dre ar klask a-raokaet. ca: per la consulta avançada. cs: lze také zadat rozšířený dotaz. da: ved avanceret søgning. de: mit der erweiterten Suche. en: by the advanced request. eo: per la serĉado progresata. es: mediante una consulta avanzada. et: laiendatud päring. fi: erityishaulla. fr: par la requête évoluée. he: ×¢"×™ בקשה מתקדמת. is: eftir frekari óskum. it: per la richiesta avanzata. lv: meklÄ“t pÄ“c citiem parametriem. nl: via een gedetailleerde opzoeking. no: gjennom avansert søking. oc: per la recèrca avançada. pl: skorzystać z wyszukiwania zaawansowanego. pt: por pesquisa complexa. ro: prin specificare complexa. ru: через раÑширенный запроÑ. sl: s pomoÄjo naprednega iskanja . sv: genom avancerad sökning. ]
  • %E
%I&w|Nnspropose_add_family;
[ af: Jy kan bg: Можете още br: Gellout a rit ca: Podeu cs: Zde můžete da: Du kan: de: Du kannst en: You can eo: Vi povas es: Puede et: Täiendamine: fi: Taikka fr: Vous pouvez he: יש ×פשרות is: Þú getur it: Si può lv: Izmaiņu veikÅ¡ana: nl: U kunt: no: Du kan oc: Podètz pl: Możesz: pt: Pode ro: Tu poti ru: Ð’Ñ‹ можете sl: Lahko: sv: Du kan zh: ]
%E
[ af: Jy kan ook kyk na bg: Можете Ñъщо да Ñе наÑочите към br: Gellout a rit ivez gweladenniñ ca: També podeu consultar cs: Lze také zobrazit da: Du kan ogsÃ¥ fremkalde: de: Du kannst zugreifen auf en: You can consult eo: Vi povas ankaù konsulti es: Puede consultar et: Vaata lisaks: fi: Voit myös katsoa fr: Vous pouvez consulter he: ×פשר ×’× ×œ×”×¨×ות is: Þú getur einnig athugað it: Si può anche consultare lv: InformÄcija par: nl: U kunt de volgende zaken bekijken: no: Du kan også slå opp oc: Tanben podètz consultar pl: Możesz także obejrzeć: pt: Também pode consultar ro: poti consulta ru: Ð’Ñ‹ можете также обратитьÑÑ Ðº sl: Lahko pregledate: sv: Du kan också konsultera zh: ]
[ af: Daar was %q besoeke, %c van hulle aan hierdie blad, sedert %d. bg: От %d наÑам е имало %q поÑещениÑ, от които %c Ñа на наÑтоÑщата Ñтраница. br: gweladennoù a zo bet : %q, er bajenn-mañ : %c, abaoe an deiz-mañ : %d. ca: Hi ha hagut %q consultes, de les quals %c en aquesta pàgina, des del %d. cs: %q přístupů, z toho %c na tuto stránku, od %d. da: Der har været %q opslag, %c af dem på denne side, siden %d. de: Seit dem %d gab es %q Zugriffe, davon %c auf diese Seite. en: There have been %q accesses, %c of them to this page, since %d. eo: Estis %q alirejoj, el kiuj %c al ĉi tiu paÄo, ekde la %d. es: Ha habido %q consultas, de las cuales %c corresponden a esta página, desde el %d. et: Alates andmebaasi loomise päevast (%d) on selle poole pöördutud %q korda, neist %c korda sellele lehele. fi: Tähän mennessä %q tapahtumaa, joista %c tälle sivulle %d jälkeen. fr: Il y a eu %q consultations, dont %c à cette page, depuis le %d. he: היו %q כניסות, כולל %c כניסות לעמוד ×–×”, מ××– %d. is: Það hafa verið %q heimsóknir, %c af þeim á þessa síðu, síðan %d. it: Dal %d ci sono stati %q accessi, %c dei quali a questa pagina. lv: KopÅ¡ %D datu bÄze ir apmeklÄ“ta %q reizes, %c no tiem ir bijuÅ¡i Å¡inÄ« lappusÄ“. nl: Deze paginas zijn sinds %d reeds %q maal bezocht, waaronder %c maal deze verwelkomingspagina. no: Det har vært %q aksesser, %c av dem til denne siden, siden %d. oc: I a agut %q visitas, mai particularament %c sus aquela pagina, dempuèi lo %d. pl: Baza zostaÅ‚a od %d odwiedzona %q razy (w tym %c razy strona tytuÅ‚owa). pt: Houve %q consultas, das quais %c foram a esta página, desde %d. ro: Au avut loc %q accese din care %c pe aceatsa pagina din %d ru: Ð’Ñего было %q обращений, из них %c к Ñтой Ñтранице, Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ %d. sl: %q dostopov, %c od teh na to stran, od %d. sv: Det har varit %q åtkomster, %c av dem till den här sidan, sedan %d. zh: å·²ç»æœ‰ %q 次访问数æ®åº“,其中 %c 次访问本主页, 自从 %d。 ]
%Il

%E

[ af: Indien u browser nie die bladsye outomaties byvoeg nie (wat u dwing om die dokument te herlaai), probeer die volgende link. bg: Ðко ВашиÑÑ‚ браузър не актуализира автоматично Ñтраниците, които Ñа модифицирани (принуждавайки Ви да ги презареждате Вие), опитайте Ñе да тръгнете от тази препратка. br: Ma ne nevesa ket ho merdeer ent-gefreek ar pajennoù kemmet (ha dre-se emañ ret deoc'h "nevesaat ar bajenn"), klakit merdeiñ gant al liamm-mañ. ca: Si el vostre navegador no actualitza automàticament les pàgines modificades (obligant-vos a fer actualitzar manualment la pàgina), proveu de navegar des d'aquest altre lloc. cs: Pokud Váš prohlížeÄ neprovádí automaticky obnovu upravených stránek (musíte používat tlaÄítko "obnovit"), zkuste prohlížení pÅ™es tento odkaz. da: Hvis din browser ikke automatisk opdaterer ændrede sider (nødvendiggør genindlæsning af det aktuelle dokument), prøv da at navigere herfra. de: Wenn die geänderten Seiten nicht automatisch aktualisiert werden (man muß ständig im Browser auf "Neu laden" klicken), bitte hier klicken. en: If your browser does not automatically update the modified pages (forcing you to do "reload current document"), try navigating from this link. eo: Se via navigisto ne aÅ­tomate Äisdatigas la modifigitajn paÄojn (se vi devas fari "reÅarÄi kurantan dokumenton"), provu ekde ĉi tiu legilo. es: Si las páginas modificadas no serán actualizadas automaticamente, favor de usar esta conexión: hier. et: Kui Su veebibrauser ei uuenda modifitseeritud lehekülgi automaatselt (pead andma käsu "lae käesolev dokument uuesti"), siis proovi alustada navigeerimist sellest viitest. fi: Mikäli selaimesi ei automaattisesti päivitä muutettuja sivuja (jolloin sinun täytyy "ladata uudelleen nykyinen dokumentti") kokeile tätä linkkiä. fr: Si votre navigateur ne met pas à jour automatiquement %P les pages modifiées (vous obligeant à faire "actualiser %P la page"), essayez la navigation à partir de %P ce lien. is: Ef vafrinn sem þú notar er í vandræðum með að uppfæra síðuna prófaðu þetta. it: Se il vostro navigatore non aggiorna automaticamente le pagine modificate (obbligandovi a fare « aggiorna »), provate a partire da questo collegamento. lv: Ja JÅ«su Interneta caurlÅ«kprogramma automÄtiski nepÄrlÄdÄ“ lappuses pÄ“c veiktajÄm izmaiņÄm (tÄdÄ“jÄdi radot Jums nepiecieÅ¡amÄ«bu "pÄrlÄdÄ“t tekoÅ¡o dokumentu"), tad pamēģiniet uzklikšķinÄt Å¡eit. nl: Indien Uw browser de gewijzigde pagina's niet automatisch toont (maar dit alleen doet na klikken op "Vernieuwen"), probeer het dan eens via deze link. no: Hvis din browser ikke automatisk oppdaterer endrede sider (krever oppfrisking av den aktuelle siden), prøv da Ã¥ navigere herfra. oc: Si vòstre navigaire actualiza pas automaticament las paginas modificadas (e vos fòrça a actualizar manualament la pagina), ensajatz de navigar a partir d'aquela adreça. pl: Jeżeli twoja przeglÄ…darka nie odÅ›wieża automatycznie zmienionych stron (zmuszajÄ…c ciÄ™ do ich rÄ™cznego odÅ›wieżania), kliknij tutaj. pt: Se o seu browser não actualiza automaticamente as páginas modificadas (forçando a fazer "reload current document"), tente navegar desde este link. pt-br: Se o seu browser não atualiza automaticamente as páginas modificadas (forçando a fazer "reload current document"), tente navegar desde este link. ro: daca pagina modificata nu este actualizata in mod automat (trebue sa fortezi "reload current document") navigeaza cu acest link sl: ÄŒe vaÅ¡ brskalnik ne more obnavljati strani avtomatiÄno (morate "reload current document"), kliknite tukaj. sv: Om din webbläsare inte automatiskt uppdaterar de modifierade sidorna (vilket tvingar dig att uppdatera sidan hela tiden), försök dÃ¥ att navigera härifrÃ¥n. ]

[ bg: лекÑикон br: geriaoueg ca: Lèxic cs: lexikon da: leksikon de: Lexikon en: lexicon eo: leksikono es: diccionario et: sõnastik fi: Sanasto fr: lexique he: לקסיקון is: orðasafn it: lessico no: leksikon oc: lexic pl: leksykon ro: lexicon sl: leksikon sv: lexikon zh: 本站使用的术语 ]

geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/lang/alias_lg.txt0000660000175200017530000000000012664543647024237 0ustar guillaumeguillaumegeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/lang/version.txt0000660000175200017530000002556012664543647024173 0ustar guillaumeguillaume
[ af: Taalvoorkeur/Language preference: ar: بإمكانك إختيار لغة أخرى من بين اللغات التالية: bg: Можете да изберете друг език за ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ¶Ð´Ñƒ Ñледните: br: Dibab a c'hellit ur yezh all etre ar re-mañ: ca: Podeu seleccionar una altre llengua, hi ha disponibles les següents: cs: Zvolte jazyk pro prohlížení databáze: da: Du kan vælge fremstilling på et andet sprog blandt de følgende: de: Du kannst eine der folgenden Sprachen für die Anzeige auswählen: en: You can select another displaying language among the following ones: eo: Vi povas elekti alian lingvon inter la sekvantajn: es: Puede seleccionar uno de los idiomas siguientes: et: Võid valida ka mõne muu keele järgnevatest: fi: Voit valita jonkin muun kielen allaolevista: fr: Vous pouvez sélectionner une autre langue d'affichage parmi les suivantes: it: Potete scegliere un'altra lingua fra le seguenti: is: Þú getur valið milli eftirfarandi tungumála: lv: JÅ«s variet apskatÄ«t datu bÄzi arÄ« citÄs sekojoÅ¡Äs valodÄs: nl: U kunt een andere taal kiezen uit een van de volgende mogelijkheden: no: Du kan velge sidevisning på et annet språk blant følgende: oc: Vos podètz causir una autra lengua, demèst las que son disponiblas: pl: Możesz wybrać inny jÄ™zyk spoÅ›ród nastÄ™pujÄ…cych: ro: poti sa alegi una din urmatoarele limbi pentru afisaj sl: Lahko izberete drug jezik: sv: Du kan välja ett annat sprÃ¥k bland de följande: ]
%Ij

[ en: Wizard rights are now suspended for maintenance. fr: Les droits des magiciens sont actuellement suspendus pour maintenance. oc: Los drreches dels fachilhièrs son suspenduts per ara per mantenença. ]

%E geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/0002770000175200017530000000000012664543647022262 5ustar guillaumeguillaumegeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/puce_marron.png0000660000175200017530000000105412664543647025301 0ustar guillaumeguillaume‰PNG  IHDRóÿatEXtSoftwareAdobe ImageReadyqÉe<ÎIDATxÚ¤SK/Q>m§Ó–Ò©H‰G”X©‰Dbccgaá•ØÚX56¶ýV KK ± RJ¶5}M§Sç\·ÍíhmÜä›{æœïûæÌ}˜Êå2ügHÆÄÄ`—ŒÓb1ÅÓ§ˆDøüöIù&±“pÏéa~Ò¾^/ËGbq8<‹€’cÚe4 ÿ2@q§ÀÜ5¢/ ä‹¬æ´[a Ó VÉ ¡ã J­¢I¨jÀÛ.ø:þ©¯jW7ø>ämcqO{ cÌMlô;fÎ[‘,fˆ%Òp÷ú j±T’˜ ÅT#qICŠÁâôH7ûzNÕà‰Ð Š©Fâ’FÜ…ñŽV\Æ é:åfGûX'þ~ÓÔlã»’‡ÏlJzãs‘Ϊ [-Lçèµ(\áÿù)à‹Zóe¾Kl.•txH¦ÙúŠkp}þ»,Õý²hHâ’F4Ø¥‡«Éö§ØÀÙ Rˆ`÷ßãnn¸T‹ÿœ‘ ×ÔœD'NˆõJ«²dëÄÉðS‰c ±‰k£/S† ˆ}ÄZ^Õfƒ¼Eœ ¶yœ©{™„ÛHݸž¦}£S¥oã·©Ÿäö•t7IEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/menubar_flechedroite.png0000660000175200017530000000053112664543647027134 0ustar guillaumeguillaume‰PNG  IHDR ¹·7ÙsBIT|dˆ pHYs  ÒÝ~ütEXtCreation Time03/26/13ðŒ‘ºtEXtSoftwareAdobe Fireworks CS5.1«Hë¯IDAT(‘Ð1 Â0†á·6v(Y\Ò¸ ³tò9Š7ÉÐ ôD"\ºÔIÜ)ø;U,Ò¦d{ŸÞû¦ªª½ˆYŠ¡yï I’›1¦tΕÀèÙõ›ƒÿÐ<Цðb (¥Ò,˶ÀHÔX¬µî¬µmžç5pšˆOÀ85Ð ăPq_­µç¢(ž¡¸_$"k`¼Cñ/ÒÀ x…â~3tn3 ·2IEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/arbre_start.png0000660000175200017530000055471212664543647025315 0ustar guillaumeguillaume‰PNG  IHDR@jk§ƒútEXtSoftwareAdobe ImageReadyqÉe<ÙlIDATxÚì}|”Çö³½ï¾Òª×UE$-½ƒîvŒ°Û‰c[$wÉ¥8†4'¹$ß]|¹°§^"á¸Æá6KTÓµ*¨¡²êe%mÑöúýç]A0¶1É—»Kâßïe—Õ¾3óÎÎ<óüë"‘b%Vb%V>ŠE‚X‰•X‰`¬ÄJ¬ÄÊG­08v½ÿ+^yzŸÀÐ~áÆšØHÄÊß ÞÅ`¬ü5å‰*_0\e^gŒ F¬ÄDàXùH©˜Ûh±G–\_o.ßfé†!6*±ò·\1Qï*ƒ#üÃ?ãøð}[Nš_[ç°Z÷„|¨{àNØþ’zv½CVöê>‰´ƒ“O£$íz¤êô@°Ít=–˜k¯ý[yæC§n¨l8¤ÎÑ'A'Áé1ÓŸØeúKÇ Vþ>DàÆð]etäË} çkúH[U;8zä1ÓŸ €Uùy«j¼¡d¸ýfLÏ4A"’¡0õVôÙ¹Ÿ6 C£›ó?¸^ªƒ ‹•!‰pciÖ ¶¥%û6X»§ÚÊ+¦5||uäšA‹˜)Q~«þ¹Ã¯ò4x‚c˜›ž‹Duç†&šM w;A]lüc`LŽh%¡ºüô[PRXôV•nj|³a~µ?£š2™H‚®î× m æ›%ˆæ—QßÜ€ò;ƈ(£žÏûŸñÈÉ 5ºø¢>ª¢fQsâÝ]K£yñ¥FQDÝ÷Ì‚«öõ·»…†—Í/gï „m÷nºwÝm˜pœÇÊ’¯áxçqì3H¢ÄŠù·ã4‰»©_1ƒÎ?x‰`¬Àë|Éž¨.@ßÄ.¤'Ü…NË^ä¤çŠs¯¯!¨gÌìª1jåHµ!´<‘7~·¡01̱¼yn;¤q?â"ÕŽËßs¯(w/,ÚØèWÉÕÅ\Hj‡ZÓ¥º&*ô×7ä§lâ<.qÍ‹ûk.ï+½¯Üs°¸æ/ŠûÔÚ¾…ù/þ@Ь ô*1^9öM,ν.«¯;ã]ÍX^¼œF_ÁÆÊ?x‘(Öf{¼Ý˜q›!"üpÍ„qzà pj)æç•3Öt- h“¹X‘< §ø,BA|3"H´ôû Ο¦¿­¬º~±´~ᜊÊþéVôõB%5`ÂÖ±8ñšûô·Ô²$J¾*Nkh|a_J㉳·Dô)»…òâ*¥4ÏpÓü;mêHÝöËï …íøsàòÚaqõ#A–ƒ0IH­ƒx»µ WA,3,Í’Ì"Ž A¬@_9厮$&7..ÚP“¾¨Òês—·Oö—‹ä «RcõÒ9wVÏϾ‰‹Í²ÆÊßj¥o´yì˜ñ: DDp9ís”#ìï‚P @—̾} ”¸Œã¦Dùئón…ËgFzr<~ ±ë–å®@²6ATÆëB<#Ô« !ˆ««ÔsIèž‚{&ij¾‘#pŒ¸¨?ôOM{U~psBqþîþñ3ð»¼XT´‘°ÚŽÁë #N°†^!Àéµ@(Î|sv8ÐMíeóÏê”…á¦KD›@ˆý>óøýðdËTïb5©úô-%ô¬'z;𺩃ÃN¬)ùOt ¿‚в äsÝ›r2¿Ý›d1Œ•¿ÑjÊDì¤\ÎQ)&¦›yPò:Düë¨}j%̦†x9LnO7úÇ÷€}ް Ç[^C^|6n,¹ó3Ö#•›‡Â‚eÐk q®¿yÃO™D…)§ƒ@2‚ Wæ Ô„øÿ{|"%… ä>8¢D¨ßæsMÝ ÈH2€£þím9 o €PHâJa?Ì3¹IÇ}_k¸²¾H؆œäLgŸŸ›1@!‰Ä¬?ìÙ!9”2ݕ쯊SÇURàù‡04=‰=Ãââqàìס”D W¸M\æ¹øÅ0Vþ7ËïßqMíë+¯Qü5D"aÎ/þ2P¤øW¶øCþègÓn;4ʸ¨ÅgSHÔ Cͦuó>k4õ”`x²,øGŽ2_¥TM2U•$>ÿÁx1Š%ËÁ…Ñ‘è†ÁÚ¥g jƒüs é¾ü´ „ì[̱ÀX¹Jiì¸ÓÐ6²»2èÆÁ€Ð˜’QT¹HŒÜô;™–UæÑ® ›®ž\rÒŠRù\ôLæ&e‡¥ûñ­WA¶ G{}à”*ˆµ!x ¼Ä³" $qVœ¤÷j™6û8ϘޣC ÛLéú…å'ν)„X‚sP eºj’@`+æoàÜ”‹E éU(µïØgš2HD*]Ý §Ûµ"Ž#¦· 2抺±ðlÀX*×"=!›ÀÑ÷ž€©Ü~l>Ûk·Y‰ˆ¶õÿͽßFûàóØ{èQW7×îmÂ–äø´ªœÔ"´ Cjüȸ}z>YBNÛ×ýXïÓ¦0¾56»cøW~^'æÛ7Wþµëå2M :Y°.#®C‡ÝH‚y,W\“btOtaÚëC^z©aVOxe©RËå̧í-û•#@‹¿e¨ '‚hÜ2Ñ£­ù1¸!èØ, >E ø0o˜€*„[ˆmægÝl›°vU\Î<ùG¡qç ‰†„^§& Ooûž°mZñ2Ó× ;}ßQ (K©‚”€•‰‹ìLI °‹!–%–¨¡%À´:ºðë½[PûÆ£qhï4ýñ­ Ô]ÙßýGWV #ž:Ü …€qÇ82 © %¯· ÍŠíBÚ@‚$ÏH^Qü |î7h8=ïk™eÌvÆm«hìÜߪ[Ž¹ÙŸ¥g/Eœ>Ÿ9v›Ï÷<½],?T”U†ƒíÇÐc9œ”",Z|=«+çUá_n}¹šÝˆx]5ãM¬Äðïw°"‘ÝÉŠ¡ÿ‘lÇ~÷ÁCqóyQ®¿» “£C$ Š/(Ž#7}5ûêûµ¿NFbظc aí$Ä´˜ã1»·µûE¼Ó=D¢éíUѨ÷–¤yiAïÙŸ[åõ'Õ—n1ª‚?·]Ô%Â[_!r}£aYv&¼á þšÄ œ¬…×á@HA€ÄãR.‰V‰¥3ÄÖN1Ä<]ôìŸgŒƒVá9÷®g=]ÎîrÖ´yvyí?Ǻù_‡ÕB×à;XVx~¼û ³ÊR[A&ŠÇ•aMñ*„<Y_k?hüÀßy‹µâlÇãFFŽVpʼ­vwBÝþæ] ÆP®ç’¸þéix~~|_<ú$þN¬.LƼäs{¶!ì­Ï¡±¨­”þÕçÞHߦVpå:UÞÆÿ‰úCö† jU6äú ÔÙ>Þ*{Ñ!—]§™Éï‹¿\0äE’&‰w]é³ïFÐÍÄMÍ/a· !arõµÏDÙøô9~ë¨Q¿]¯I©½aAùÊ·.ßþCe5!IVÍÜÂOsá°"q¶á²ûM‰ÙÍÏyj§Ý6ÏC)š†Z©&à#‘šÀHèñFƒ¬Œ5øÒ­?%1ÿD´LG7-œþîõ `'™dܲüò>j¹E;„Ò ®q@´1ìoÞœ¢ìÂâÂ*œè~ Eé%Ä|s ˆ¨)µG"qrÜ\|æ†Gà˜úWÖÍ×`çEâ›×ŸoøÔMÏí<ßÚ@¢t“?"ܘ®ŸƒŽÑžhiŒí.ÎÃÞßöÎ KÅÕ|†™?÷wüe ÷øn‰á2uFùe—!¶òþgKÌr …¹p"Âj[F[F¦‘˜TùÕ Iabé?m.3|ÒðÖ;?‚˜@C–€³OI\7"06µ2“¾ý ËæöÚ!Ët‰U…()ˆ U¡.ȇ¤µ BEA¹ÁÒý¼ñj"ûÛ#OdÀ³ë]À«êšÄøœªcgö¡Ü¸^ÂòÜU[º^w9°¤—+æoµXO˜Çeñ»W®ãÃÍf|ZD‰ÔÇâef˜û¾b ‹ é\6§û8B1Aº|ºŽ·>Mì5‚¯ÿBQu÷\™Ó¯zH—ø±Ê®sO@(”'æÚ¶ZºjZ¹uǼÌ_–û‰I~î¦æã­{ Lï—“\ˆô8/<öo4Àß¼õ¼ýSÔÇg®ö3ÕB5§ŽãwoÀk;g¢gHŒ¢Œp¹\–»ÛÁk ½¼¯#x})s÷IÐ- `l½õ U–îS{˜ý ¶XVš†EUâŠê|¦wƒ³¢¥ûõÝ•K6ö6þ²Èʸ J%â’æB¡.GCóh~692:M6‰³~XÆE[¾ò¸l§^Ú2b›ÙUœÿM¾î¯<®4Õkµ¥Y9U!á²ú´´b.àîC–º;KîJ ¯<-! ©ú¸h“°¹¼Ði‹0bàüà$¬®I8<£´qD“Aˆ„bÎj”7õ7Ù4YÜ„}€acäu ”–Žt]~ëÄ®k¿–_01ŽÛ<‰¢œÅsŒaÌbÃúe?Áy󓄇Ÿ¸Î未ß[1àÿi‘E"\vʲ-÷@Ô!X’C¯Ô·Ä‘Žý*o©Hæõ1‘ø¯öƒDf6ÿ^·8Ç{ËŸÂÚùßÃÒÂã®ë·A#S›ž=pË‘0¯*?Ao¸\oE/›[zO`ür$¨SgC¹ˆªCˆƒºŽ -*wÙžø@H‹¾šî{ìr”Z©áÌ–±hrY]¯ÓÉ}~´Éç_r³ùu]é–G~'+ÿãpß»Ïg£{¶XpôZ_]#3^¡o3m¼a4§äÐæ;Ýe^”€†ã=ç›hµ,ÅO_ù=Žv¶Ãa÷ðϲ®äË8uþi„‚Nˆ¤9Õô›X­aµÅ*Ò}i‡²Š."TáþŒDCŸT‘\}~ÔÌI%zbl"œì‹?~õLú15ãáãx‹uF”¿„ {?Îv>9©Jܹ¢ búÿXÿ(4,6Ž~s󘄛tL˜“tÈ2”B¯Mš¹ÂÿC³ hþÐÛ¨–‰\¬þ$8}¸ƒ6ØfÚaÈ\ŠÔÌtôæ , * à…¿ê<öùºkžú3Sb+ïWЩTiÒŽßÑ´ùé·#ìò‹Ü>‰Oü"åç¥Ö\5}Ólà©WçÕtÉ­9)‹jÖÍ[¶ç}Äᆤœ¡m Yg¶Å¥Ø6m qYDúÜ>'N¶ÿ Ç;wC¢¼i÷åm2t¸¦rÎýz3'‹Ô}fý# ÷Uü´áÖ•ß°)…m›ã3M ÀûìacRê ˯À¹ òpûœ.Ãå E„<èI<"ø%Ú ˜ˆO4³”úì+< ¦çý¡î†y MY)¥˜›¿ÍxnÈ»cõœ 勳r¡…9j£ž€öJ÷öcræ&nŸÂøh µuii’R[îéA´ †$ë” ŒmýÅV·€¾·@)S×¥h‚X77£Öx|A¾2L¡$w9Îôzq¨­O}%šMt_·J‹}瞀Å6€ª w#àÝ‹gN¼…ÑÈ Ïœ#Ò0’xCãØ¤Ø¦Ö¨ð‰¥ëæ§'64÷5á­æîŠóû{êet醜Œõ8ÓsEY#q÷U´ u@È2Ñ„A0›ŒB&–Ðïàû«M`&Ä©A!4Ö0¦Ø’þdGAÆ.ž|Y`‹$AÄÏS„ÿŒ¬Ö‘¡¨S/S€ÓëØX3öœyRÍÈk>øªŸXÕ§Ò]¿{Ħ©JKZŽ{V_gRƯáCî3¤'U+$"Dh³ ‡û›÷qbÕõW€ ®ÚEÆ=›S¬ÈÍúRÅs‡¿_«Jü Ïê’Áuï4ïÇT8ÝXPü£úÁ®»­]wôÕîNŒ(¥ãƒŠYCëéê#`²pØèõ{ ×p•D๨omŒ&8 ábyüƒBLŒ·`„X%cökŠæ"?I‚>G@¿-»D *”|_¹m³M)˜<>ñdg³íu?=´¯±u3ëß[m’UHE¨.νÇ:àõ‡ sQb €Ãçw£(ÿn¬(’ó‹1"PüUP¦¾gÇðôè“ ÐÅ%×\žÕ;Vb ðj… íA^€a6" cÌM›½M5e>aÄú¢gRG,0×ø~,‰ºÏì‘7.›wgMÛð¤áDW+ k UË´5\C_J¥…<ítð:((‡%@óÀœîpç^x©ŸýL¼eïE"…$Bï;û<ž9ºS“\ç¤Óp~̉s– °øÛÈ-þ"ô©¥Ê5VØ"x¡WÉHìä `rÈC¼Xè¥MSQ ô]!1û²%BÇ›!—1t‡±çô LN`UÉ­˜Ÿ\©ùæ¯5ßø¥‚gŽbuæaà4Öbª8¿3ÔßÎŠŠ¢ÅéiÄÈ=p¹Gl—1HN ÒôkažÈ+àö 06Ò‚¢ÌÕxãÜÉK¾”¿8ª{š*§ËJÿש“pÃÂå$^¿Zws±Ëö{ªqçõwã¡} ]fið… §W°‰î·YBÎíT§èCÌXd¢ëª©ûÿ¸[ éË+pâüÐmÂhÂÕY§í³}¶´ Àp –$ 'ÑçÞ¿óã¬Ã7Ö:EÆé6ÈÅ$~{{PµáZOù‹àG½°,%b€<ãcyߘ ˆ˜˜‰šÀ´àcðiB·…Lyû_å•à'K]g툭î~X1³¬N 5 ÑDÁ´"#|vzCL !wÅo{Fc*c·”]QÏnCêÀŊzy·6!ÙQŒ“vjB ¸&‘$ñ"(œ"¸"Ö¨~ŠAuÅî¡qP´ãÛ¿‘×ë×ò÷Ä Ï‚egAp 9Î÷¾ŠÂŒÛÙBަ¿Šø6ÆFZ±ûíů?iÜO‘–}$vx§pïºÏ@&Vy%Î7¬Äü4›-ìy{ÓeÍUÉäj®w|‚›c€Ú]ŠÓ}õl ±P5RÒ‘¥ °Ï ô·úî‘¶ÜäÛ‘oÀ‚yqp˃°Ð¨»h°lÔ–—îÏKI#F¾!ûx·±DQ?ìYlœš´ÁÜ3¾ Ÿs“h¨ˆ¼9dü)oj–ž‹ÕÃÑ{½—KuøÚ]¿@œè6}¹þõâuù8>ó}gug3cß–iÄ¢ˆ‘·´Gé9c͹ 3¬Œ×¥qRÓ?Ì{xÅaL:ÍIt€Q5 K¬z¢7€øÄåú›üÿ²G„Iõ"U•ñ­ö—ᘠ#N]sg’µ5†xmZUŒ~Äðð¹ÿ¬®¸“@Óð¤ù)¹Q¶'ó¹æB¼8I`(ô "šÂ"1]ÎYöW.—ÊËuYØkjå'{‚&}–f^Ïeuzé3ÿµ ÙéuB#×"D ”ßpTŒ»DHŽ+…D$fõ3±l7‰–}$Znûú/<3ùÑ< në¢:Þm^æ<˜'šaê~©úR(å:žá }¢(»#ÑVDmX­øõkU龋Ĕ%¸O›%kÅ×ïøIÝç+ÿ Uå7Õ Ü?^ÀŒŒíÔíUÕKÛ!S¤â¨…úÄÚ²,8\Í<ø±gfÖä·š/ #iU!ëv&Z޹EœL¤DvÎjÈãøôu·Á ½äÎSš»WÑØy€Äÿ@Ý]a"öW¥Ó¯0¾uú|TѰù(2RåÐÊ•Ô_¼yö5$jS` E` G¯ º’H4þú½?„Ô¿ ÃS>[ýùk›ÏT;kõÊpc£ÓÑEãQeÝ3UtÞUßëÐUy=3 `6*ƒA OÛgÓì Ð1J¢¾c†XgÔ×]ÇZ‡ ¨JmüT^i„ú3Ø_•X}—ñPÇ«ð|—ÎföÊÎðsØé›„JÁÓ~T°f Òå·UYû ÿÜL.O@(ðb¡aaTDl/¨ ïž ì—„ù‰›º áŸ4´érÍLÊÁ‘ö~ø½Až0 ¢…ÊRÂN{ 48}[>$ösÏèôæeñI‚,XˆØ.F€võì¤yؼ&ÝL@A`" WbUaTS¿ú¾ú„¢qËÏ[³¹øz†Ž65™Í†xæ‚d °ºdSýHÖIÄœ‹‚äh|бl4ÔßçAJúWˆm© ‹ÊžnHI½ÓOw¯VÎ}EØ üŒb‘´oNÖâ*™TNŒÔ‡y™t?Æš9åè÷+` “Ú<ÞÙ NÎ?Vfyêr–n°MÏ4b`b¹ sÃ×} ³غñ>ܹ¢½ûáö8ý»ÈÖ *u)ÆÆZølÐ,ùA±AFâ­ €DAjœßþäçð•_ÇgnzßúÔãç>/ßœƒ©±-hÎdz'Ç éw6¾úf¶«MJtÕß·È]Y’&âõ°Á¨.sKÖÕ'ç~s÷¹‘éò¶¾ÌŽ·1B»Ô¤ÃŃ4=lÉO«NJÿx¤áK®U,†¹u  uÊÅæþ¢¬CAaBõðLz/‹žqBc2JŒž±¿€ÐBÄ\1äû( Z•µÃ5„DyK5Óü,°6 6˜.Ų‚R”d-àwëK'†IÂQ&FŸ¥p)úÎ1Ñåòˆc"—‰–Á!^d÷±( ~°ÝØÃNESÂé×ìàÔq¼å•@]Û.Q˜{ËØÔPCAJ:±À8žqzU!He!ˆdÌMM†Râo ¦·íÇ_ôäÐâÛDW-cVtÑ"ì`bðƒ)§†ôŽ‘&CH‹£}² éZ ŠÒcÕŠ/B­B‘A‡»×|ë–ÌEij£–C˜pˆ¡Òâ¢ë ÕßÿÙªŒ³z®úùk¹H`Ž€hÁéu §à “AOɳ8YDpÉau…¡Thá ÊoZ˜½%#q×k9¯ß¹Ø€Iû8¦œXQ¼ýÃĉægXZ~fõ­ öwQD43j²x¶gœ“ È‘D‹>ë!üSåÝ4.ýJ«ùy1uÿÎñà ^˽;ÞIêRátw+Òõ ‰•A~öÕ{öij>ücj£OËù>}Ë#Äb³.اð“W~†ST_Væä¤.à:š¡UréÔ9qð"Fbã2«aWÏÈ)htk.6Yö—èþ$²…†þ‰¦èVlŽ’„ Óá™ó!|rëŒ%†|ÜhщLcPsÙ¸`5Ê4Ÿ­¿V½Ù²Éév˜Nµ¿ŽµsW`]ñJ~ÂòçÇ2£JÁú’›XÊ¥+ÃâŒbxn_ôÜ 1sê%`€À^9)Ë“çEVò<ÒaUémXYr£!EŸÉtJWZë6ïk0U.ÝD ¨À‚ì2¸ TÊK? °É&ö]ŠÞøé—‡çÞ9Šÿ® /l„ZmÄš²{Œ±¼þò~l¼alÁÐØaóúù×aÈBnîm˜›¹V˾­äŒûøWÜu?{ȽúÀ…#$v˜¢±‰D,ÏÏãûfŸbÚæ…R,Á‰Ž¯¡ e Üî ZGM´›±°pQ–“$>‰èðøûo¹êˆÕU1£‡Š˜^ßH–̽ýû —¥Ãîê'Ö8M€ä²â4þȈ"ˆ[$Óx­CëX7²2>…й·Ã° c¬ >gÔ²-äp†é^7l®!d&2Qó}ÓÍ1¶n^’éܾ¢$q ŸI{²ß ±ÃÀð8Žöž‚Dû¯ÆˆgØŒÉíˆO\\~€Y¾/ž ×”ßÉN\@(èA²¾ êl×ûžzK¸ûÉ=‚rÞ²-—gçoCÝÉ9ó ˆfýådzIdö$<^<ø0”$Ú"J£‹€Íí™!é .Êô¨-»8 ÝË€PÎDbúŒ±Â1Bþ:b‹Ùí_0åMáФƋgX U¶—Ï*ÄDᢔ%ä]–j¯å­þý—Ê8M¤‰y)Aè@3öœ«C@ö™*ˆ ¯• Ò„Ùö‰[íq/U¼}æß¶&käÛïßðèö¹íñííûëêÎõ»LK®¬«!+1÷RRSÆü„³VHÍö……7Â鬻±1$ÏÁ˜³ˆOÓ%£~:…aÞ°#©-`~Ö|¸¼ŒÐø¥ÇeÃjk²YˆY̆¥%³ç- x¿F9Ój¼"ž ²¿å¥®×Ó~ñ±ý¹“I¡À…†TÎÀç,d„.ªlâTéHÓå``¼“ý†±,3ܨUiøEÑxêYÌIA—“$¼v¶nÉ !Qúî‹LðÕ£«×„ wÞ<¾³hÎcÛ„òåÛ²%Û®[^³©mà÷⹞ÆC 5Ì:É®]2o”K—ô/‰ÓmÓxˆeaÑCÖŒ÷7oÍKÐØ´È¢F–ù™7aYÎí8Ó^×ú*bì eãcJS'Ð×}ŒÏ”Ìþoµ áíÆg!R}Á@{åŽ_½(*—‹ƒï9th¤ï~ã/¤lû°†¤ÂˆmØîųg‡«Zœ7Õ¤ü°fñ¼O—Ûœ#(5,à'¸ŠÇ­¡L‡ïÜû ­×ZøCZt!ébRþ0¢(ié7Áá×$mc~ÖrãÙîFŒÙf  ¦§å¿w®¯"‰š“Êô5ÿõ{™ñØßŸNM£r×F^ŒÝ:au¢c¢IŠRþ:µzŸ¯ó 2ÌI  e¤‡À:nß(. ?‰¬ä{axƼ<¬£B‚8™â#ã LŒ E™ä]+çcAN:‰ôþò¦YµÛ/|lt¢ Bw®ºý’у·3cȬ!¤Ä°Dÿwà¶÷#/÷FÜ´ôžòõ‹îªZ8çæš#'×ö}ÀY0ïÇM›~Y{}é—±qíð‰•™’TéµGVñÉÛÝ1ð»¢üÝæœem•QæÆ°@Æ…iµ ÃÓ$bº÷à¯ý“1‰P7·´‡ _Êg4aqµ¢/ïnä(çVúüíå2IšÁ6h,g‡]l'-çIÓÛÇ+ê·ÿÎú@†6°ù³Ÿ7\Þ/ïT² *5˜?]frÎÂÉÎ#ÌQÉœ ›¯ÍÝÍÔ7R5þéæoÐ|£",™÷4F¾…98‡NçˆS ‰EÌJÈü¬ýæ¤J¨n5Úó‹…Y”áFÜ¿z‰ËÇq´í e/0fh?ÿcU-õç±ß|ÃuI\e†+u£mñF9±¡lýZô½@ßq#A@ìL̃šÓ#I‡/4©|5)Ò6t3ÖA„$ÑÌ YúD”fæ`ñVœ¥çå|.XDø„V„YBVb‚rM‰ºD NÙas¸ù-׿ê‡}fýŽŽ)ä&¥¢³Ýó³¤ß&HÀ¢ûY2×0 Ëóþ‘·|CÇQ7jèù*'gĦÞÑ.c޾Ï9>36A'Óƒ¥úáñÛHÔÏ„H4DuN#Eï'P&ö›µª`º9ÉU„†1/UÎÇãž4ÁK÷¹¸aÚN`ñœµp¸_…¹WÌgª3㎠ÂÄ R’°¤ ‹hm‹í\¯`;!ÜŽíJSE¡ÇÜܵǰŒ@éõ›ñÂÑçi#pƒ÷A§û3ôy¸sÅÍèêø7ìn búÔ>Ó û'E§N©1d&Þ¶ûù½½µ^OÛÖ«Øž–r=kUoÖÒuÿð¹cQÖÍ;rµÒ=A³Y$-ÝHü¾Òîs3!Z´~–^¹ˆvó„Ür·í'Yº[+ö6ÁÆüçR´)è¡tˆ Š"`‘@¨ò¾t]CûP´à®¬ ‘;?x ÆŒM$›Þ•ác~æSû€¥|Âe©ß÷vòΙ™æíGÍJ#aQ5-¾r>W \n“K‚\š.zù œž)ô[ì¶øñÓÝ;Q’¿ kæß‚¼¤ N¯Aí±Løw²÷{øÜÍ?$¶òU¤i;ÑKŒEf‘vQG2‰p‰ñ%8ß?·7À³ ;}ab|‰EF|ãŽ/@Øh‘°nÁrä,UnïtÕ{ý¦³ýâÇÆíºPX`¸\§$•(wÏÉZX~°ãEÌÍ^—σQ»)šdç®B­W4¼81î¾ùÓxíìQ´ ˜°ºäËe'Ïü>UôOZh‘êq÷Š[qªc/ˆcÆeEn|²æB¯ËÀéþ˜¶Î`EÙwaêy·—Þi{;´ÚBôNv!LÏã±óF‹Ów` 9)™è# bÐ*Ÿ IÄ¿wíB§IÄ÷9{¶;?¹]Ó •…ß1kéÂêú!–Ïÿ,þõžáõÓuènÁúy7ãÆ…·¢áÄ—pà¼!¯8zH<-WŠ|!d\&ú§úéy²ª<Kå~oÛôÏÞo­0§lzTNxÅ‘±òw €÷\1=õæ†inÕv¼ÖaŒØÚx #ŸUƒ€y»Kµ$¦ÅebCévƒL¼«8°«ìBåœìè± ð~oA‡˜™“³Jb‘›uÕâõ¦ƒÜ %_jœ8¾=>«‘}Ã!7¸fÜŽÖ±[VäݺE9r3^Þ°ÒÀ¢¶Ýû¨édóóÖ>‡#ã:p*!îXV óh-ŠttÐâsîň#ª”Vy ¤a N´àù#¿Å§×~†Ï£m<êè̂ˊn€Np*™­CC|_e,œ‹GJj.Ê%ØÛºñŠD">ÿ_œv9²S ±@!5.ÊÿuÍëgGjNöJX4YÝ?PÖÏqVf--7O6‘¸á3E³1<ÚµÞÕLåì'–ÓÇ8,{Žßü%LÏ âpÓÏ§ÉÆ ã—Qßñ8Ïz$$ކ§ðÜñܳj#gŸ‚Í€0”£–Š5ÄÀœ¼7sø ‰I¼–E dÎÀ.;‰‡ˆˆuz†¤ÐÆ$R‡.‰ìEi‹q¦ý9ž¸²nüªŽÞCrjeߨ(ŸöÍŸÚ/Zß77_8¶{ñ܆!ûZ‰I)³^0÷㘫CÇH7µIH¢yr°ýüa?Ò•GÛÀ.èäÄâ8Ä©Å÷¨yvOI0>̳S¤½“hcÈ'ö;…<z­Kò³ ×¸q¾÷Î醻6bÓÉÊäâšÑÐ:<]ÿ.Œá ¥’¨ÿd]û+o\üÏ&õêχ'»ñ“çïCϤ a´¹1ñº8s ”\:‡Ž`jä0Í'9*Ê6!U›ÀµíøõîÐæÏo:bz¯ºC°‘f¥í[÷úMWóŽ@4¤ü²Í³¯çŽàßX û")49;Â"=í¼õð\p[£çS0à)Ãp[İ‹ðÒñ*ܲà«å·”غ·Éjr¹'Œ…ÉóÐ>ÒFU€GBbDXl¤wnON´ÅüüûÐÜ÷$ž>ö,n[XYménjÙ.•kÓÎ $ÄS3“0O©ñ©5wâHós;¿ô©/füòkŸÇ™SK¬¶£åiI«ÑÙù:šû‡ñ±E…(ÍmDZ–-!A„g>YjÐzmê~ ¹‰©(Ì^ŒP܈×$ 8# ßS¶7OÎp°çŒ*Ü…QßkÈ !ð܃E;pºó«ð»™Ï]„ƦîI1ô)X6÷{¸§â´Šç¸ý­¢*± B2žéúT4·žã)g!1GÀ“ù8f¥á+Áñ®ýÄ:Ÿ†ƒþÖfÞO›Ê øýÛÏÂ99ˆ†éŸAN¬Û£ EõY´`G¬“h4#/m!Fœgá£çbæåý„ÑþÏê"…Tg@B¿™‡ÆC¡#Pá7KáOà.˜?cv±ÛiXã OÑ™®ßÊ'=­Jч°¸ ÅÜ3:ºéÀ»é2•i×Kþï´¼°¥$ÿ¶6.ü†aÊí€ßOàh3MXZ¦\â-K² q í0|ô¹@$€:Y¾!¤''B*rÀí°-…ï+SØÇÐd à§vL8†yÉ ‘¬Ó⺅F8ÝC˜²¿ƒ3;™¯"{#Kv‹ô_5ìyåWP ÈÎ\fó M¢R$F±¡±!9’l<Øt]^?€l® ';›¨Ž”æmaa`û¨‘úeèõhlz†˜A1œ ž=vÉúèxYþ<%1 ¥W½Ê‚ÂK‘F: ãÖ`qêo‘§ù¡-`½¿Öï|>'ª bà@æ{&eQÄÜ\î.;ùÆoGbb #’hRMb¶cÄ:÷Ÿù<,þÕ¸uÙ-à”$³JÐÅa†Dæ¯Bu˜íXÔ»š›ÅÝðLË2ÝæÏU|ÄóG‘˜°Òœ/D²6ñ¬S/Ý'£g`ú/Ì&=Þqyë!cÖWq4æËÂéu!+17tøY*-¦;cgèÍI_C}ñò  ŒÖÍÞë5ÌÏZ‡·ÏíÅ 't6‚Å>æw(¡[˜ÀÇ.Àåàw2¿Ím Ë^Ëùúï~f{ô™]›W%8g~ÇÔ>…¦}:ºÆGø§?ã×Ôø ÿü ¤ƒN’â‰ÃGÌQÈ,»,ŒŒ6¶Zxc–<v׈ùÌù] }ë,Ófz9ÁEËh⌆#¦ó|Vk‹ò8Š­ ©qZ~Æíâ-B¡†LPfHañá´£´ä¤yQ”íÁâL/æ§Ip¾ë'µûÏž®½Zª|–Í;oüþ.4̪¬×%V¯œw=çðvÇ~¼Ó~¡P$’d$蕸nÎúº¥¥‡*> à÷w€lbûÝĶ?qߢô½ uz€_ðl!ËSÆyó˜ž+”g› I*Ç|¨Ûßü¦mÜn&fµ)‹!•+‘œô¸8ôO9¤IÞ:ºr³þ“Öˆo°”¡ît¯¬î"q„‰'ÌìÍÆFZìeË4õ³á`pX›‘™¼34GÆ[˜G ¿`.ŒK V„à&PpHüò‹ùY‰é|"Þ1vÀÒM"mRrÌ‚dCo\b®õâ9¶&_ЋxuÔ™v†EVQÃãfä%!PM¡±÷8¦gx«ę̂”D5!?&^›ÇÎ? ±ò~,ÍSšÕ²Y¥PcÊ5Í[xÙ¢²†šIÔÑØ÷É\¬P'ü§à—û¿µ¹îôï SŽS¶õÆJþyX@7={U˜3Y˜õé§œ,ÚA !†À=伫gs3ŒÑ3JÀ £¡| ´‹Re$Þ%âö%ß…F‘õ‡KY‰›Œ_Áï÷Õb÷É ý‚ÊÙCÏk7”¸kÙ{‰<ÅåV^…é”'i‚fµ<¼1jìñ„EÕIqy˜tÚ/ùDZ1Ë›ˆ œœ—B׳)ǘAÆO`ɬÓb!‹uža÷šðXX‹PÙé ÂöÛ—…|L÷˜FO mƒ¯"ÐO¡“ój½ôøxÜTÂûcnŸ°Mb|ª“ÍJð¡‘j“u…n¬Èæ¥aMé2”—­E¼.)Ik·d¥®°¾q0³†æ›á¬ýå­Ìï3[8u\Õ‚5x«ýÞ=É1ã¡Íö3púÐ;ú e-ƒËöøGÊpòwåcuômuØ'mËó6@«UD“ L‰$f%O ðÉãØÄÎK[‚UÅ÷5”/üÃÖ¯ÝØ– lçÄÁírApg0àhÐksvÊ$Úí3;6þ‚ê‘Ñ.(€'`ƒÃ6@À%ÀBÓ¬Ô´ ‘ætCˆ&E2ÿ4j§wb#S$Æç0ð»”‹/+!Ž„S´pˆ.2¡PÃë Y æË\(¼Dz¦DaìÖq(UsqðÔ˯xì=Óö,)(MkEàI•öYú¡W¦"Äe 1;¯°êL?¤|3ÃÌ È¢é|6Zˆ¯à¶Å%»²õ^F]/˜Á!ºðgù¨]ÃûYÌ4ûZå좪c1ÅgûÚ¸¼D7殇Œyð27zÓë„—òŽÙ¬PÄçÀGý`:>„ÃA?šúŽaåÜÛøÏØÁå2±›¯ÿ7xí;L!ï;9Jœ©ûÔšÇñ‰õ?ƒÏ3_|üQ¼yÎÂJgñÌ; °s¾°Á¶55iN¥Na@çh’R?Qs¥ÿ#ñ^Þ§µ¦'eÕßµ:͸i©¬ò™=Òú$±ßì&ñR&‰Ç¸c" lì væ¾BãtЉµÑç3´ ÛÒõ+!"†ì–ñ«DU$ëò‰ýYùße6EÍ ¯ë¬9iK­kŠïÙ‘™±¡>¤]¹ãô@ 2"¸ë¦; KÀ4m‹óÓ0lm`cµ(7®!1.—Xx2¼”  ,ÇüŒ\,/Ù‰´]#A¼Õ:ˆ×ε£¹ßŒþi'‰¨‹«2Ó7öÕY¸í½ 0—Ný|?¸ºÈ°o´¾‹ÕÎo–j™Ý$ïLŸ¤N‚D0eúKwéÿYà®—š¶z}¶šuù×ÃâGŸz€vô)¨d‰Ð«2‰=,cŒÄôÖ‰/oš];’â2¶äf¬Åu†vÝAu;Ëo[ò°-YqjÁžãز4¯£ý|:(–ð4AA±‚¸Är<óÆè!ØÌAD³kªéâ$ùÞA¬/IÇàh3‹‰e²Á9õlõ·üžzõ›|tŒ‰Æ -&XJ"æ.!ŒZ?#áhFŽÜÔ8t[±ù†‡i"všóSsvŸhúQíò²o\܉wNLõ=4'[ÎsJq®§™U«M‚öþw°À°ow½§-tiçg>|’4?¼S’Yc‚"Q4Ž×åvóÊŒ~N]` Ç\íx]½·Íô#áãQyVûíOùmÿþÙcã¢êy–—Q¹üûøÝÌ8¦G[£ Íâ[y««@…©™é¨h(Ó‹ðNǸ~þÄkro€NÚ‹7Žü‹éÙ#S¦pD»;7y¿q^Ö~ä¤"‡6‘oß½Ãý›åìö±-]Ò©"…Ø+”PŠ·šžÅÝ«>Ëeçmml9ùb­×=øØ°?å¡‚ŒÒ*—߃¡é Ì#Õ*ÒQœ–SîóÙê_8^kõbËEK„Ä[–Ì64›Þ,E—„Hh²AñÚæ¦/« #¡ ú‰çôÈ…ÖÍŸ½+êšÅRž ™¡] xNÑgr–™ &S¿@ÂÔÐ0¬“ƒ«„ˆOO¡MÌñ‘óü»s„fZ&¬ý›L¯ØÆ'Í$bè±:w%JSçA/š:žj8Ö´³" –¨)6·ˆäxñÔK8Þ¹fK;Ìm8Ôº‹ˆRªƒ¡`íôÌ02âÓÿ{ß_gU÷ÿ½{'OöNnv“fÜ4Ý´Í ­Œ2š‚ Ì¦‚¢8šª *šFAA}ME )SÒ”B7Mºw³šÙŒ›=n’»÷úŸsnR[ßÏç}_ÿzõ!iróÜçyÎ9ßóý­ïÉ\Q&”Èù –©0ãˆ&¦åPPÀ”05a:–Y5¥šw!äó1[¸¾¨ CWm’ä T>ð,ÂâÒqý¢Û!à» gµßfd'Öº${9~üåß )Œg<|úžÒÃ-{J"âÊÇFÿȘàlñiS×_Œw•¬#?…Çf kx (ÉÔ"4LÎL4>1µ…\0ºÍJ¡Ãé;Œým‡S(@­ĄıßSŸuP_¨ÏN;¾MY¥,ãªgþø}.ZK¬;Ôå€Ëô4¾zýÈÏ¿6¾Að ŒV$V"3¡Sæ v^aಞßÚ…wÃjz§Újð_o?Š;~ñ~·Ç I‰r—߹ܡ¹sUn^z<~ö·v¢¦þ}H+  Y‚e…_ÄÃ7ýœ[ƒqZ§LÓãÅŸ½‚q³É©÷•GĬjLUyËû†NâPÛ´ `hXO¾vãƒÆ}蜘â®+,/;×wJ©JÂh®!eö„ÅFÇç!!Ô ¾r?`Þì³½`\Sô4+)ã϶?ÈŽ+%ÌÉ×duLë”2UÅ5×!DÎáæpNwö©²£nÁøø»òdckCfÜ5º¼yíÁs{°ã¬³Îéᕾ]ea¾K.~ÿV»aKÑÄÈã óR—C._Œg?ÜEžŸ9(âJÀyaF’¢¼PKi¾å7qâcѼûFت٢PÚTõTûqÖˆO15 Qyèí ª×ÐŒó/­Ÿ´ðw6qmö÷pKÑݸ®èuôON`ÚØŠ0…’,.=†õ!)à¶;ࡊ'"%î_ý8ÙH^ÀKûZÐ;C«S%džqU®[&! z5§lxn÷b^Ú!!4ù¾ÿˆw~€yñq(J.ÆÙž3ÈŒ‰cÀG)'mRïp›ðç“{Û‚5ZÄÒÀÓÈ>Dˆ,Б ç’A¯%ã9 ï%ÏDªžŸXZ×2Р¦í X¸•ü.9fÊ–=‡þΦ˜Ùþ¾úžK£ä‚šõ‹¤én†”ÜSú u-?,« 3aÒdÆ¡ÎÓŒKÈR§Ä ™BÛXÔ‰÷ÀíºˆKƒ:<¿çÙÌÄ›wü¼õãs™šœì W'ÅÞˆŸ¼þ 1¥,Nåç#,ÖƒU,#¼Å-ÇÞ¦ß1V(—ˆ°º` Ö/x˜ŒÕT]ÏèyÜÑ’©Ù~òÕOc4F¥4 ¦Cìï© â#‰0:(’@7Éäèkà3¼:ðßY—Ý=××deìÛøü2‡É—ÚÏzË|u¶Ÿ;€YÈÚÒº%†gdÀC„Iù U~&`ºùB÷þêÛßÅ}pá™ í,¯Îí v=“‘¯fò•΋ŒÄR³O*’ÂåõÌ}Þåˆ$A&ÚI@q@7ÞY9¤»NÉQ^‰æß‰óç ¢$ÀÉï£I³HŽ\ˆ\õ·Êò ½dÁƒÙ~ºiGé«"œÁòµÎÒwv>¢)ÎzzÓŒCY®õS¶Òö[YCãÎM‘\Ç)㦊/ÃÀ”ÇXwä-¼ðè3Œ!üúmqôWTÓ8Ђ‹¿ŠKãdÁ9XùˆID-Õy4¥f×ß<Û-宦Ÿ¾"Ù8iáלÐ%"eæOM…ÉÛ¡ÉÈæ„|‡›{Ï5í늩üâªG5]C§‘…éK`6íÔý¨vz`JŒHÎ×ååÖ-0o#,ªrIn ö7õá\Ÿ.Ø|ž€ßŠâ‡ñvý˜xìÚ…ap²N[ ö`IáùŽ7° ç~k{Ž1¥Î±t½ŠïCAÚW1:¸ ™üÈ Ói1 iĉÿÀ@nXð}4´½S7/eUYlD&9Ÿ K2—Á1ó¾býÀDžÿûEï<]¶¤beÞæRždaÕkLˆNÇ'ÃÁöc,®{‘¯Fbì|î8€Pù|èM͈”‹aóX˜ÏÎ_š?•]EGªZÛ`s:@IÈ?n_~3FÄÊX€ ý>%¦¢¯·-ù2cçéz;[?;×@ù=ús;|‚Ü©Ž/P}Ø´Z™?U°¡LÐ,‚fÁ]ð;w1ñÏ®GËĽ5GúêËñW±Úÿ˜Àÿ›/…,Dmrø˜ÊˆŸÐ|bÃÂGUq¦ÖŸ&íf¸=—êæÌj‹ÍPt¬e[í²ŒlclX"Lyšmnjۢ“Ï—F$. O:·¥T‹ºI³µtÛ­º¸ÈÜò´tÇkëï¯ÞY5Lؘ@ÁÂ/e…ì²Êü´EØy¦gzuL^Š>Ó…óïÁ©ž¨ø)œƒ“Í`bR¥TD6 cд6Y˜†M¢Íڳ׿çÜk8Ð:„„ÔïB®ŠFB¤é Ádl¯$€Ä¤|„Š/éh_[1+r|«&öR•}ê[E‘)í¥ŸtÏ=“ÓÉ?:.jjŠï¿xš~$N %,”ŒY±4NÀnõà/!Lø01eÛ¡ÍÏÁg}……RßnëeóUåÃCkK!•Ebpú$“MËËȇÌß5ù,‰û†§›ÎM\ÝP+˜Rl•ð1²@ÆBn ælRÓŸ<3jú3X«@Qú"ø\§þ^ãOzé{Pf™¸¯~ÚQn¶á_­í¦ðÿWTÉ£˜4Q€ r‰æq4œ}~r·Trª ÿndDap iç“„LRÙ½¶o¤J.¾ &&T€ŒÄUè<ŠÂm¼¿‚d‹³ó1eøŸÅD)s»ùQY3 œ„*¼©º_„QĪ2p®û»,‘y|ð˜‘Nã”ãÒ+™ŸXLÀP„ݪÂúò‚ìýe…B¦*;ß~¨nʬ(“KÜŠìoÖø¼6Ä;ûár³º^{ kåSÐ͘5Ÿ´>;9‘¡™K¢ Py~¡îÔ¥} NS"‹UæÝ„eùFëÌÏ6G¥>õ~žxÐY{±1b]·APf7‡Ôüä%kÉÏt]Þõ_|ÄfüÖÖÀæ×n­‹ ¯ºy%>¿¨|–•l<ô¬ÉXú²¨aÐ +?ÓkFëàëÕkçX~ãÉÖ7˜d¥1± ˜1wSS‡ØèH²rƒÂv‰M-o oþ­¸Ðñ:SÐñѦäošÚ¶³NoËÒoÃPÏ+H ÷À*.ÂÂìû.<Œ/?õ[­Ù)«º¦plãóÇ6<ñ€sýgÍ£9ÑZcKL5§Š€Ý-†Ñna¿çÂÜȈ_ˆ–¡6LÛLL¼*õÐT¤q“žÎÚ*UýYÑÕEúÇ_'Ö-ÅŠ¼¡·Yp¼§|"àI,ÏR£´`1Ft¯7Ï»S»÷ô{e/lÓåÄ¥Ô ŒÕokg¦õƒGAèªH°PóLVôòÊK}§à¼Á:ãˆ\_ü}ðOù~ýæ¿tj– ˆ-á S8>_©ˆæÁ‹p\š:G6´.¨ø‹0ÓÜðŸ|Íí°–éÐ £ûgËr$âp‘˜¼Ù ·¢}|'Y Ö‰«¤øÈ‹‡ÓÞˆIG˜Ž«fÖ„­=[ï[7>¼µì‹+ŸÀ¯…P?&hŠ ø-ÏYŠH=}=”5T}ö"â•ÐIlqò«£¸Hø|&D(ÉŠ˜îDSïÏÈî¾gZž€"Úƒý%è­SX™^ ‡Ë ÝXO5y.usðqa¡ Ÿ¡.šKª”‡ÌG×h .ô=‰´¨Xpr%ÒD³T² “/!.&*e"Nö\ÄdWÇlªYtò(u¡z­úþü¯n¬zkNu½»édûË:››÷™‘À]ðË¢#–}Øþ6Y¸EH’w—?ú‚žÖE¯ÿõ7l‘Ë$NÀÇ3;oùÊ ©°ƒ—WÕð;cÃ÷Ÿ—q‰œC+•%áh{G0"`ÁXpþ ÂŠ™FËi>`|6ÀðÇÉ{B ›6Ñj‘ Á4Ì…>kMÀzŽsð=|m} ó’^DHøø&Û±–Ðc™¤¶á¿ê:›LvÖ>´ñX£´.3Ù£ùÑŸ¤5'š¥Ûèµ}ü^K¿Íq“3îb¶£gHTiQñ4kÅcÆÆºÙA"@)‘k#ãgØMÐÄi³cnZ¥DÀ×à@L)ºÊÿgž~©ÚH6g½ÙiR©ò7äGr×id(¯EËÈ1¦†M7Œ˜u<±ÐŒ´¸•èî&„wºª(/dÓÀÔ5e!*ºq轊ÕywUˆ¥ÇŒ£“4ùüo@èåßmº÷ÚßAPLæÕ$bÂ2‘«¡ÒÈót–~û£¢#T-É'ˆ+JKÀcdj?ì®)2Ow`Ú>Áz…i•˜ä3zÿÀÏ zÚø¨ÅTòÈ2ÏÇQöâó;`wNÃ`'¿wÐù Íîÿ<@j´ —Íxc•„KÝ¢8+Åi¹0[ÞÆë }pûPš¿I1Ëkv:ª[{m÷ÇÀÆ™‰³H”¿]vÓâ»±óä› üüdµ.Ï-Á]%kqøÜ8¥“~ÅÆ_ÎæaÕÛ_77m‚V@AÀÇ+’Y=0y’©>³:f·ÓîC¤Ràõ÷°Ï˜±q~ðª‹1>=Â9Ý*‘ÏvhEøÃl¢^lûÚÀ»gÞÄþ]xm#CÁœ}EʼX•›Y~;/4òDMEó-Ñë3ÎL£AÿVäÜP¹¥Ü• LÖ>þ²” ;l  @}g'õëBdaëx¾™²‚y÷cÔlÀ„qÙIE$3Ô˜œüÆŠçäU^t.6MB'Œn‹ô…‚ÀÖ¿—Ñ>À•a!±êÌð%è~?臡)F¾ `,UΦ)B2I(òÓà£Óf¾IÀEÀ?‚Çcà@“±UÎÙÈúÜ3Ÿ²oß…u o†àøðÞ*²©mYùpÇã*f7ÙŠ®È5–§%zÊùßá‚mGg_ôüTí9!,?ëé[¡›‘Å.…Ùî ¦ÅÐä{± CäY2Ó“æG’r¤· â˜`Z’±4±¼„ìåW €çyF,T”IDBÎj¨nX»HYÆ“=ˆÃ[a° ÂëäC,÷CèIÇäè›HL戡ÂÝtÓëÐ`™0kURQÙˆ¾~´$÷«å¢TÑ2p)åÊÏúá‹Òj'!}J÷×Âòbî-óùŒjŸo7l“'uä>ë>­º„ŠûxÊ|ùzµ+° §ûÿŒñ™·àQ?Ýp„AŠˆ£Ó×’9ǰOóßñ%þ[à›{yj2Ã6‰„ªr±DÅùÅVL:û ä‹¡’–‡!9ºáBÝÜ¥¡¶ÊmÛ½´­ãúDÏ,9vaRÍw³DÔ‚///'&Æ9¼{èmLšùp‹hmêÂ×° ý¬.x°x4õc,~Îú³õ¯”-JÞP½$ûEõîÓ;™TuD‡Ï>^»¯Íetxø´×Æ~êYÑÓÊ9VÃÀ¬Š^ƒRê'»i€¼ßà ]¨4‘{Äs„0™tfZ{f•«üˆçR‘“NØÇÅr|LÅ7@6‰ôØ\$¦ý-Kƒ÷OŸìì&&Nà–¡8ûšŽ!@Ì1vM4¥ƒF{)HP¨ÂGLåîËÑfb6ÌšNŸ{S¸C¦È®5Œ’ÅjGf˜ šÜ023Ž·O ¦‘óôMt£$w%¶Ÿ=Á1uvÏÁßÑh¦Hˆ& %7lpF.š"CS €:Ù9"B¥pš\¬gï8SÌæ!‚LŽåÅåpZÞBÿ°"¾°@…AÂr lLÏV¢˜ «È=ÓÊc¯ p9äÒðÈW=‰ìOp9 ˜M!cÄ›cëTfZÓÑ/FQ¶K“êVwˆuNwÐTUûÃÛiÎ3ú½à¢Â|ºÎ~Ñ6ŸŸGÆ7˜_I?‡SE’+X9Šc€êc~fšhnvÚi‰äß°"Eø7èçl% £õúR*½Ò ¸ðs” à]fr2îCÓ¹7!Šô1ÀQÉ$°{gO¾nÆ|=dãÓæ §[±ëüaܾ¤”’‡òmÛ'·NÈt|>™À3O>è¬{’ýáëµÿ orÕyøSꦡ^4¶“¥ÎÈ¢‚ÛƒmT„Ð$7Š3~‹Ö¶7à‘6Ëê!t¡þ?i0ŸõºÔ³TctywÉêKƒGÉTÊA\äJŒêcxü(x¢IVÑA'R¤2ÙÑ9XYx#Îv4h­ ,-ý¬óï­/Ü2akö·b&Ê ™k°ëÈËqÎ-Ê §(È„Î^:A&»LMÕ–öžçX nV4”5Þ!œ²n¤G¢ýRÉ]ÕýoTj~¯áãAûžPRy&Ö ;p™ýñtv'ÏHØÆíÇ6± PhuZ5 a¡pÌæR!ó°>÷”‰¼  óŒåfuŒµ£$»” G[fÎö*f¯É™óH#ϦE׊ÿ+‹¾ƒ–Á÷1>ÑŠP4iqùø¨ã Ëu£ysƉa¶c³¦î4ù—€ä¼¤[áñè®òMÑÚf¹”«ÉJ½N3<5JÀ¨“˜×*$¦Þ†ó½±»ñ†KO€ÕvÊIN–sJýq€O305LÏ¢r]äž'Ìfœëm‡&m!Ž6ï®ðdóám|êëÎÏßàI*$!ßT_èEsßspDÇJTlCL@>û.Žy <Ù4"” ðýž¹XÁÿx83ãTÓ¢ùçRÓ”#›×-y2Ù$yÀUTð©?…m(úò.>:5‰b™vŽ÷cÙü› ”‡°hæg˜¾ê‹£Ã›Ü, »gYàýć­‚Ô*€Ì&€ÀT]# ‡*Ÿ|iéR$q4Ÿo¬29NS•^/Ëú Ðãr­iBÆ‹ yʶâù?¢5 Æ O*µ÷?¡¬ À·ãÞŸ+a`G”Ê[–é&“Á§ “ûKߪ´¤ºÜ<.Ýc ÛF¦ú‰ÉâE@˜ÌLf:ÊD7›\´øž•hÍFDõ=Ò8²ˆÂ€u ›6¶#+>J© õÇ~‰Q*Žé'OÙ‰Éí”bqúw "€B?Ê£ô2_(@±4_(º.ûÁ†+ÁO!«×dß iì„×t©Q2$¦oÄî¦q|xá¥×˜^ˆ™‘‹p¸½lŒ(N‰Æï7Û)‹®¢æã¸qF»,½°r^ÒMšüät,HrÒ@ í$§yçøyì¿PÏ¢¨Và ÷µ(J“"]¯L…o¬û9xŽqv Œ™¥f».·£3}(NË`φêðQ]DÁótΘxä®`™Í\ï eÚÁ=þ*÷-Ÿ#G?/¨‘«¢+SRW¬]zn]õ .%kSåŒ_]ù~ËIõð”#ØùÏÏk˜Mb/Ÿn«ŠáR *á ×e¶Z®Š šÀÔ½@ëÐ Ðûèf ô!\.#×aú4ÿZDy꽉Éö äÁÓ¬„‘XE/7–ÔΗ¯—´ÌàÀ`µADæò”m€å\RßôÙ¾K,}K) ár£Û¨_ö#<µËú®ús-TAü¿h .\z^V$ ´¿Ž‡¬%7úN}51õ'!!`˜šÂ$þÕ^ÿk>@.ñôÖݸq‘úáš)Ë›9 ½ K–Uàbÿ³ p“-$“¨k¢“€†…«q¼eǦ;”O4?Pkæ™ÝÛ+1ç·¢u| X±!’Ãou2 qKý„UÊ™šCfšº)êĦ0ƒp…ñáIÈN.†nì¢zh¢{ÇkÛ}u‡ºå,ŠûÊJVÌ¿¡òþ'•Ü\Ê‚ŠLøìXÂLbÃ!KhŒ.—Cm´êç½Îoúè¢_mqš>zƨ;¸•‚ôL­Ùê+‰V#0ujB{(óóæG[Òï£ ç79ÄŒ”‘þ&·kÊØ‡êT|ÔÖNÌ^Î ïd%{a„1t!?û^œïÙ—Õ ¿<Øv‘OLìŒÜ›pMî ð¬›ðönž?µP ¬ÏM]Êu³ÊgmCx±ÉkQßá"L¹!(=F—›OÀff½1XO Û4ÂB“ÕïìÖ4ô‡×FL¿Ä(ƒ–t\8‹õ‹×ÔD‡¯ý°…Õ!k,{‘’s†JãQWáÉ7±rþ*œ¿†+0Rµ"ïë›&þÄ\6–.48Ú%y™X”žƒ3=ì^ý,B#½(JYŽ6€©™OAS.QÂç„Ó>Öð×\¹Ëý}ëi‹Ë¸”rLZSq¼¿ƒ˜’G0c¸œC—U@6²P¤Ç¡u¤y'%¦é0´l¾&÷¶êúÓo GoÆâ¼hˆrÂÉ=yˆ,ôèÅ‚¬o“]ç¹N÷'Š“[d"¤ím¿aµ¹|q°‡‰sB e²‹Ý •x“‘û “G`Ê<d³Â”‹;1X¿MÎ2Ñ}‚ž³umtŒŒ#2,Žö.|óoKŒª°’|ZØçq®º©÷àfBØ;í2g‘°ªy‚›õž ¨ "¤GÎÇE]ãßl6ÿÀÏx…«jÍcg6äÄiµgu»aÒ[Ðh©‚mR LJ˜ó2‰v!ÙaZ‡Ï#)â^21³ÕÛ¶wiæ*>èëÈÅ×ʲ£ÐÎKZ )ɽ¦I!æq>„ª›ú/àÐÅ£0 I›Œ Ú´ÙAp<¼dÌqièuϦ<Ð#L®DÙâ…(ÈL@Ë¥†²¬h¶sBÜd²ñÁé?7Í–ÎŒv~aÁ’²¤¨8ÝVXÉ¢çóøŒX‡È$tÂj”Òfb–¶}ô×t›}­&Îåj*K‰¹/ì…t¶m!=¯‹ìüÒÙÜ5Ö@›ª͸«X„ÃÇ×¹¼,ÉÌÃÙÞmöË1ex4Â$¹è¨Å‚ÔÅŒ {H‰]†ÈÐ8ðÜûàsý¼~ýÆ+à•1‘)œÑÀ¡–ó(›çƒ‚¼×àþŽ7V°s³òaòM¸ gúÞ‡m¶—-õÀùÛBaBëÈ›6?¸,’;;>]y¶ç ,JZ…×ïÁ·o\VÎ ì¯ÚÕªlˆ ‰­ˆ‰Eqª…0™vŒYÆ ÐÇÃîo‡y2€¡‰i]a–¾èÎÒïפDŽs3Ói:×¹¯¼½ÿnXpìnZº‘Ÿš‚¤øXš,¸yE!êO5“s¯^ ãôq¸|xæcÓ®ZÏŨ…?~ úñË¢5Úœ ­,•ªdÆ–çð;ܶ¨D}¦×$!@KæöG’ª“’¿·ÕlÜW²2ïî²á©VØ­X˜~#ŽvlŸ&•¶”‘p+Vd-‡EÿÕºèO‰°ø!j±8g¶ƒ^°$Ñ¥ADæ=•vsùFxÙœŒ%,¾{ð˜€ß©îëbâ"tŸºKx³­èxŒ›Œˆ"}DdVÍ»ªI¢¼ãsÕùŠÄó0a8¬{'V“‡*‘9J§7ÕE¤÷ɧ?"æþü¸b †®ï6â_¬ßðÿzØã<¾MQ®½8r¾ lÓ"]sL ™¼ÕУ}¤ù +0¢ïÒÌ=hjöyêúÎv\_¸Jçs7n³°]¨ ñÖjú^mç¨Ì•\íˆ!;ûÞÆÝ8Õ~éñ+qÓ’¡·s7.N72ÂȦ,V¼xð0Jó ±"çF öpé‘Ös~AúªÛ—\ž·¨²{¬‡;Û`v8fwõ¿F€—dcÍ¢à”;*ow\îŪ’a›Çy¤,9êa\ŠÚÛˆ˜ÉxÑÚ]*M5` ~ZÑ!*›>üw« Üc°»d¸±°¯?Ådµèú3š&mÀµóoBÏh+ëo!õºÑjþð /ibÒô—óßšÚn×N˜šÊûˆ)>ˆ/Çç!àçB{ÓSP‘sNñ‚×DEùùv3ÛTæÆEÀÀKÎovòShÀã«ÅöZ‰4£¿wÜÃŒb"ÓÜÆ¶äÅ'WÞ’?ÖÐãå6¯Us~^XÙÞöZÖ##V±—fŽâÚÜÛˆY=YÓÐôriû¸ôð‹Ø¶Ì²ÔÃS†‘¥üîÓ^‡ãía'[]@¬FËð6dG/÷¬Â¾æ&¬]t/†ûǨí¯QIÚßW ”jÒ;÷d‡{°4uTòhb>z14m„Õå' ­½[ª@ÏÄ€Z)h´»¦Ba€ö ¡ù?yu}sNœoçíE.Ý 10Jò6¸\¼ò s²“–«€ƒuê;u<ÿ̧VFðxbv0³—X'®A ±x‚Ï•®L±Šö ),*øbÊ8†î ±z‰Õ­ñ“‹ ãs‰ƒÂ³°Ê‰ÎaÀ•JC&L/"$<§fóïdeÕßrüÃÑYÚº…f0P± Z3L-1>6Õˆ|¶! -2‹<§D²žb6[ã_JPá½Äï¯s»Î"+f9›TÇN팀ŸcL”+š„ž‰VÄE.þ¸?LÃ…g)8ø'uÇDH5d6ò¥¥õnÇQÓ´usjØ]Fd r3WCL0ìKË×!+.]CG±ãÔ“„Ò$"3²0èà%.ÄÏgŸy°¹gâc èç”Ï}àkï§TXüI59õ!Y(ý°]Lå˜å¢‘¯B{0_íD×¼sâ –å‹È­žû{ºê¾A]b(‘\!c|Ôr…LÅçúéù#Š0>Ý~• õêûqÕn7_“£E§î(Òâ¢qMVË¡£ Å^¾ã3£x~ï»ØßÜ…-:ì½8Š3­n šrÈĺj—îîÙNA„ùéKy=, Í­ÈDX5? ùYBpRKO¡í L–¬&š¥Ÿð¨`«z«°<%&Š.€2™ª€›1Ûà •6§J&'ºªˆ†Á.ÐÎX¦áö «gzYtz¯!b |„môLžC^êRHEz§‹·ážŸ)Ëïý¹’#`nÔ´âBç;‘Ée8p©ý¢Cµh>¶©>|Y»<{5"#Óéímš»O§šA“ý#Ç1/%YÄlž±y `^ÀïÀ®Æ3˜&ãzaS1Xž{ âtĜֹ<ç‹5sv5×fÄ­B8Ùµ¼T•$l‘HM_¯Ep¹Dˆ˜‘9Z/3±Ü´Û43–nH…Ü>1><ÿ!ªw¿Ž/*9¢º< YZí÷\ªò;>(rM»Jä·ÎjÜ®»uñÚ ÿ‚Ø>ý]»‰)ÔŠHò=m•üUU㕃{¿šþˆ¦áà§/IÊ»G&«%Ò\bR®BRÂJ,Ö|Ëç?e œ–3½;+x#Ó£Äüû3ò3î¹J¼“pmt˜‡[?MXY!Så’É/ŠsÃCXp€ ƒ.%摞Þkí•y“>>WQv¦„)U fáê‚l\W° ¸˜|@³NwYAš.V?´SßVD&\üÜ¿Y”Ë$RÃ"Ȧð¢È±Oóô,ºôMX˜³óãùˆ¦(:.4%ÃÇgU1t£‘+ˆ80b­Ê S³ ŠçÏi†kvÑg ¶ú§Dën_èÒ $ 5à0 à#×L’.þÂÀ¤">¹d"?M/¢y‰„;v6+9ŸWÐàõ`²Ž‘{µÁ)èß™‡™V_\ÂÁöý*´dNX —©8*TAEkÇl¨ ‰#÷óô;±õÃ}¨;ÛŒî‘ ÖjtíÂÇYô¸±çϸ½äKH 1alêLÃc÷v¦z}ØèóñtA°B#y¶®Ì$¦qÅéŽ7žùóÁoÞqüÝu»›Ñ¸s_X`çþÈÀ_> ¡eWLé·9ÍS;‰¥c¿@6¹ÁÍS¸¬DŸY—Žò¿„æž`´Lþ°·*-EÑJ[:J¡4ä2:ˆ‰"ñ£8#&ç Ón õ·±óµìÂêÂ[±8ÙǤÎ+[Yp£:6*IÆm팇Wá&ö¿øç¨Æ§Þ7>ñª¸ñ/§_ãŠÓooZ½üar}yHÏ%G6R£ò±,ãFܹøp1޵ì"àg¦à÷/ÙróÿF%ˆªÊi®-_žý>0<ód0m“—k\̺¹Ñ¢}€» –ž’h• §/ Û„”õ²FdÅ%@"òÂA{‡ &dì¶F£Ë>ˆ´Œ›0pi7¤äô‰#CÂ`¶“ØÆ/[5?Æ8d"üÍãOT²ös˜¿‰fLXÆÀ)# Ã:!ÙLÆ„&÷j‰=PöA› 2±·,ð€z dá÷LÔÂi±´¢¡¾6´…##ÄÉô³Ã:¹T¥¡ ²^mhFïÄ8‹–3U0æ×?Œ¿ƒÓm²¬<„K½d³5Âå¶0yù¾k¯}â‰Ñààï0áCpÄ:a“ñ”ª%ÿ¦¾b"âÕéq9Tyf»‹¹1Bä!‰P¬™2›*vê¯zjûØV2¿/èDxÿD=îXósÔîýÜ2KPB…¥™7!1<gÚ_ÅäLÕ9°6™nžÊǘmiIÇ“\ÕµÊéžA|T<¼dÀw|±á…7¶2aS >õ§ž…TüäG/¯Ö÷Ô³¬w¼xæ qæfîÒ„zã@Pê²%2ciÚò¾Ç¡)#TJ5V.ÛWô'§) ÚÛ–|¿º(u¾foã{£°úvœd+ñð¡"¦°]ägý}ÛúÏA[xßU5šäZ6ë{Ž8¦¿^¹0éN.3ª Þ€„Ü£”0 0Âp¬ O¼ùð•Qµ ‘P¤vy¼0˜‰IdÁˇžÇ—܆PÕItЗʓ±˜°€krrÐ1BuýD œ°;gˆy}CæN01 ÄØÞDX‘nÖ—ª³;LÄüìeå\6štoB+`BS¤FŠ&ÁÌ„¶â%Øâ²lÉ2 ë›Á—G 1¬#Æfª× |¤Û°æûêG;õÒ±$ï--XŠ3ÝõFNO˜¤"äÖë F?iz…øÈ8Ó3»Ë ¡P4«¨àÞxÜÊ¢ÕwU©¸[r§°ŒÙëeìàËATN‰X÷¶î‘÷P¿ü 0ÕîÈð4ööÐrB„…¸à˜Ñ#%#K.:^‡Ëeb€¸0C‹½½ƒ'WV5‹Åw=ÍÙõÚ¹ í° ×I§Ëo_QŽ—ßÿ¤ 2G?A°ÂÞl䃧ɿ§ÍväÆç&pêÊë% î7¥‰¡«ë¦¥jz†{pýÂx@ÕŒ#mõâ³Jª!È|ÚÎv½“ò ÷½•0ÁZ—ñer¡Z-Ïg,·¡kºdß…#Z6ý<­¨£ÍÎC•Ê n¯…%Ø ì|VÛl6™ñÚ‘·qÇÊï!?µ–˜o}hÔ÷1GurìJØIøèì~ÌÏþ2^?¾ ña ͼN““˜†hѩVLLuê¼>Î`™RG‡ßˆé?°¼/Up‘S3¦mÄGÄ“±Å\©_ùê[ɳžX‰Iý)ÈFtŽFZdyyBâÂÍý› ¼veyË›€0USVn}³ÁUöµROƒHR¨Ö¿lgJåó%Ì{OÀ’Çú"ûTiò:b_~nÄ4~·ˆMŽDÇXèi(•J˜VÖàˆ6Ä’FzX+ž ž†Ù¨ öù 9ÄG+amÂ’ŒbÆø¦‡ûq–*9S Øì)><§Î½H+ZªhÎ' žp•ÍCœj)Fô‡)ƒâÄ¢@áw/«PG†i¯ÕÜ—ìÂÈL°±’˜6šÕMr5Õ+ $à6e€L.>òRY¦Ú£ã Qv¨m×3׿û¹XTtº½Vß÷’±8qiõü»žR¿{ôd£…w¶BÅc¡©]FðEÁÀHïàûÐ$=Lù~\° 4¡ãÉ¥Cr| rã¢tʨ·>5`3›„¯û魯ÐUN•¦±úûÕ eDJZ̚Ù®ý·ö^5¨ž|×±Í^ÓÃÆÅ) |eõ‹xèÆ=¸kålÔþ9‘ú†wŽ~Ãø³W%W:l÷µ"/AÍüQB§ ‰¥:m6a0°á4¡sˆ‰|^)Õ³ÍD‚¢wßð¸$!„}‘HËм„õ‘o,> „<¡ù) q¤å Þ®KOrWú/½ŽJ|¹1=åìo}&·wk¿Þw î¿A%i<\_t 6”¬izåÀï›úµ¢æk¿V”õWŠ«ÎCŽÚµn ÿáUÌ[uõ‡C•þõd2?C&p™Bìo”Kj>ÏÇúë¶ ½OåV&ew»ñö‘à—ÿ 3Ãu]âÒÖÉÖwOm0OŸÅ}7|M½»pýâ“ %»Î4 z×k¸Ð×Ô¸B,Ê[§VÈBÕú™NÄs‰,÷Œù© Eýsä{‹Ã ©$>˜‰LÂã_Þ„´!ÚúŽB&“ÂdpÃB›K³jOË›ðòÕÕÑ–Ã×,y‹·$Mµ~Õ‚;~üú»&ª,]¬ö ðøQ¬t|ˤùŽ Ë7£ÿ–‰B`²ÌPŸl?ÀÓ~lª4ÙÌ]ˆ¹.ÇÒÔUK$¬o‡Bíd×ͪ4§avP0–-É]që(޶Ô#6”6qÿ9âUB´võÃFf ìÐ 0/‰˜ðŽaH¨£ÍŽhÞ ’Ëêï4äVl?vqJ‚Å> ³‚€–tõ Å÷âÅý{08TÂVÒ@ÙD¥ä>Ò# !‹Ëá¶×qàÜïa2cˆ$ŒZ*h¥Wýä~×?eBF¥ÍÔ…ÅïNÚ¿S4nè­õú¼ô‚ez”Qófsõ¨+ÇAÏâò‘XÊz6ûɆ3ãêg:‰9‰‹`4îÞFû©£ñí]²À®±†÷öDì ’l³}„ÿYÐÓ¾·7jÇ™ «ÉÉ‹e 5b^Få²´{5ÿÛà÷ç‘À?™ê5?»Ù¢°Êiø^•Ôõ4ùþë©Ê˜ÚÒ)‹qÁ©MWüIíÐD1;.Ñ¡pÖG*™d’ù òƒA Ó¿î^T¾Þï÷ÖîC:w?¹·‹ îaÚks¦ï²üðã¯ü‘°KoÓ ËUÓܱՠ’…\U츻™ö€áF ˜—ü 4ǧ¶b1ýˆ™¶nÅcX–Úëô# øž½öØ6Ξ¿ñ§_yJQ½ñ—ŠrrhÉqy¢‘IœBÅ^y̶¥æ‡¶°…¯J@ 6ÅBÌŦÖ7Áó%ç=ÄÞyz„Š»Ô!r~ý%½¨bØ(Tïj­ L`“à݆G±8ç^dpø^Ô·õà¿víÃ.MöµpûUû’¶‚¥!Í=Öð( "L/[îù%¾Wö˜ÍÇqºõUÂÈC0eci">lMêñàÜÙêZP¿`AmÝ>¾s~JN%9h7ñf¦›ÇWøá MêÉLÒ”Êú2Ä„&Ã`ѽ>ÝÔwüTuå¦We·Ž#%Ò½“˜ÝGQš³ž[6{”ueÅß„‘spxÈ®—±˜ëœèCßÔøÞ0f÷P†&åaÒŒüÏvCFâJX-] ÑÌ¢¡BQ½SZÎí8úä´!–ÓŒˆPä$$ÐÏâVå®mjêÆÀä(ê‹£©BaÞ`UÊÈx º»?$÷€Œ<#§o}g¬NWéïs­]uâï‚À{íx¢F¤ùŒ5Ó4e XUà¦÷!"Ï’Ž!ífg›2÷@€"퓟z2c8ÑÙS©ŽË¨\Ux½&/}¢ ¸”øEe9e5±1¥ýo¿åó!mI‘“UŸ—¾¬lÐ|VB©Ò ÌK#–woÕLàψ CêÓW$»”Ñ”’ͳÔܸm»wãùîã;®+XŽÎQ;Žw5]d˜E>H+‰ 7’™þñ$Í~¿8¨•©špkáµP•ÜMÌ›P¸#ÄL¾d´Ìü¶*­èÜg…÷5J1[Û¦õCdqblô"F<6¼ƒsý)X]𔢽“=;9Êrÿô¨ùUøÍ )P5]0žT2p8½0ZùšûžPÒ|,í´Í«m¡il¡Ñ(³‹,(‰-ØÞÇ£é&GaZx®ÿzÓ©^VŠÇœæ?û’«1#.CÓ9:‰· ®[úc O´ÂAlM»ËƒWêO¡$7¥ù«06yˆ|ý%œ^#S5¦i9Ô´LG{0wÔ 7ãüL‡&z‰±¸ÞGlTʺ:&jáž Ì&Å…îÈMú%TüCd³šÙøãÚŸ–ËÔízÚ\ûÒƒàÜŽ#ÈIzƒÄœTð!÷águldQ&–`h¢Ý»t_|\¬ \!)Eë³ÏÖ;7÷?U³vÑCøõ_šÑLL¼U9‹Ÿ°  ópª{ö6·¯ÉVqvŸ]£:<´D,ÍÍo@¨âÃà"6ʞؤTÓš€yQz<Æz;Ë ö÷-â>jma­+©™|²s¢#9èÍVšçz/h,$â`ÀN(ô3ÕpÚñ±ˆvÍ#@*–@á7vOº×?õ5gÃ'€½¿uq‘Ùê¸È<Ö]oÔ0„)£11š }í´ ´ôÊ€«âˆÁßf4ë+ãBÓ1f샌6ÆÒ‹˜;CJî;L§ß ?±»© EªŪܕzš¬5è³ öÈI¸½n$¡¢³\DrRoáŒ^[åŒmzÓÓoª~p{ë?~ÕPË¢Rq¼o?l?”¡}d Jæm& µÓøü'^•\ÆŸ¼"ixüeiÙ8çë¶mw¬oé9R“£þî-ɤ¶ÂhsƒÇW@£Ñk?l<Ш ï¶á ÈÑ¢x‡ejS¯ñÅýÎÐÍT¹}ø{;´š–ÛÉÈq©ï¦~þX†{Ú!ŠðÀ@@ñ/¿…Vþ±2W¹¾gW3e¹ô »›+Îß|ÿJª©GM½Úàš|¯™Ë¤[¬È¯P*ƒ ÈÿÅÄ”q“'%_©Tº‡,¶Î¡fÅF¨ßªì»<Á\®ac|XË㣑î}çÌäh:§éÚ9t± i±‰„ùd`H÷n-~ýSeä|»ŽCTHv]rîsW‰‡þâ%QyB´‹°› ó£ŽxÊè(c¤µ°ÝcíX—Vvó£Þ´Ž³rétƒ›ìëÙšî­ TpЬ,ÀEÿ.:4éÑ8Úô MgωüœŽó†+óÌ‚š=M*Þ«Õ¿ÜðSí¡ÖvFÍøÂ¢t²qu†£ B±¨,&<½“#äú{&@03> 2ر.’[U`S¢1 äá»áYx\fÌŽ 'Æ“Mµ‘<ld`hcv_«•„. Qpr*jJÙyÙ4fàíB@e„áË% 5ô¼ÑçØý7º{³¬ª>1:M“•TŒr}{[>‚R‘…8®1\&âÂç“1ÐÁêÓ×lÛ>ý‰é&d ÉÏ׿»ûº¢y÷hFfþ” Ë,óRFÀ¹ F¼ÄBJ‰_…µ ¿ˆ™ÉJ„†®ÁÛ§Îb¨'ÌŒÖ4 _8–k¾‰io?N´=G€ò6¬_¸Ôh±µb³õ;œX¹Þøà§–Š¥)±Y¨ïj€×ïA˜ªzkCpîs©ÿà?ó"Œé0™‹ë®ŒÐQ<[ÊzGZ4\*bÂòáöšò²^®ûÚ¯PPOX×3x®µö£Ã³¸ÐÐh¤ÈiÝ­›€ç0OVO›ô•d@?5Ô?iº=fćÆÃìèÅÅéjðáÁnct°¥daO °çLî\µ áÅJ ÿovÐW·^¥TòøKÒÀŸ±]ùžÒíØ16ÓW¶8='/µÂÃó±bx>±î)C ÊA Éî­¼jrÚ,ZžlÙåR?‰Í‚!Û1‹š©ª0ÓŽ¼ïÝ“çð£/ÞˆͰØ6×ÎK]8€HEJßÌHùæçv^yÎ[Â]Ъ³ã ˆMa+ÞkN§€IÀ¢©´Ä‹/ÎåK5”ýíþµéòs?=piÿ×µ_^ñ£òƒ-ïbÀÞÄ¢/ÏZo<Ñü‹ª/ÝbÝz»¡fsźÇB´;Ÿ2_éÆ Ï«µtÿÞ‡ËÔ‘7ïàÄvŒŽU»ì#Ï5¼5,D äR¹ºýT€^ -¯ð³R5¦·GmØ1Mއn}jî4»™åKë‡YQ»¹!*,FË—ô`^Œ”µíäT ˜ ÏpÒ2 ¿CEˆ‘²8lûè1¹ù,êÅ%C[pVä(Às¼LÀ¯ëSÁo^J¾F"ŽÆ›Ç?‚ÅnG¢Jƒä²Auÿ__SŽóý}ÈM½=#;4IKˆõ³ûo‚?¸žV¨mCé´±wGiÞCÚ㯓™ìD\X12ÂݴŸ‰°±0 RALmÞn\OžÛ ?šØÎZÑIù8pñç,;juÁuX’–P+üÍìçþ]É«òä˜ttOèÈÜóB$çÁ0 —<[Y8l䄉瓾µîß›;ÖÖÇ‹vffü?€L¨sÓ§D«fSUhУÿòÏ_|ÄÖôÀSŠRª×·áÊF2a6¯Î±êÒ¯¯–+ÄeNÏ8a ÉàSqX uÂ|䪥\kß‚3)´Ž÷ÊÏÒ~‹+;ßë­(ÎÔ!)< c½A‘NCà'ìl\~˜—E7)“»8x+Ó¯çô=Ð|VÿZoê|⯪. µ•-Ë¿ ý““,â蛓ÓdXV3b´6\ý¼èœ`%\F¹å4)9Àgÿö‚B¯z“ƒz/BU±îX±êÜ–/Uª*⣼dƒðUÿâ qÝîqgA©šVG êmº¬d‰Z(ÂêdJ3þ¡D^²ÐˆaIM®[è—Ù#aÜê6³³ò¹=#©›nzyÛMÅU ‡¨½¾À3uõ·Õ^Ép(›w:´zCº‡6|< Iô|yFµBj‚H"‡Ï—Ê y™•SÆá =]C:§O¦a„ú0óC½ð’¯11dst5bÑüoáë·­&æ5Œôí ãä5^y­ç{U¥r2mjnRc ˆ©Ýˆæîýs1?å«èÐý×çÝoô¸šÏ~ãIµ@L+Šœp;OÁiÝžµ·VòÀ3ʨ®OhµÆå ÅŽ“ÇYi•jKž·ç;ŸCÙ‚L[]8Üv%šG1aFXˆ–%šçØñ•&0ùsm0efOé…– åw,~ÃÅ¡ÝÚüøì&8^ÝÜÑ{©rÊm¨*†0ÖXòþTŽ&¬ FbžG`Z?/e sc@wŒl|DEqX˜ª6ÚŒ¿Ùü9–hIxHÎw„ß JN ŒB`VO˜J~6öï•Ó6rJ7ÿGýÖ‰á:À6àóMx!œÏ;B&¨•&C7ñýÓ”eÔþ=|òAgÃc/JÕ?øƒ”{úëÎP_~Ìfdææ“JmR´§Þ/ƒCè†Ãå†ÞÐÓ¤•IûPý5êÓ¢‹†“E£8c z†Î’‰×yâð£fjÍ”E€±©>d%æ 6$Ãz=|ÖÙÂq)1'E,"MÛ/v îÂêܧàÁ¸¿ðÚÀ'•Sÿõw6u¨ùÒ5_ÂŽ3ÇÑC@7p¹K)aFø­W9˜öq$©¨ZM(h¾M¦",7 >+ë¬ÏtÌàDëuÜ7w-LVþúHηƒ¼›é1®ý~¨––„‘Y\®ôm¾4|¡ñÆÂÛ¸ígÞ †Õ”´oeÊH4´¦à_·ï·¦¿æ?Æ®Û194 ——WžÜ±õç¯~­’,þõßçjºøÂ—VOL•/ŸW€WöØì ð«×>ZE˜$cg~”© O©é×àTãš¿,9¡‘û„"õušé8†U2&MƒÁˆšê„.Ƚ.ÇóX(€aèk°™ç‚dg]#Øs(G;ièØ‘Ÿ> Y>lÚƒ» BKrrîÇ¡¦ï£dÞÍðyÚk¹ø]›õ=»´³yrì\ä2šè\þèÜ…z}þfó „›â"çæwŒ•RÒ†]´[áÀä6|±8 BÉ<¼rèm¸}˜Èõó CÐ_D|ä|²!·Q6]‘½I*iÜ^+aíÓÚ’íÌUPµ `ùý¶ÚÊIÿªù±ÎêˆÐ(Ͳ¼dÃãcÈ0L¬žÏ— ™©K‘iĸ¡ ÂŽÍ6>ÒPܼèn¸mÛŸù¼ÄE* ¦KÑV²´§ÌÏ’ÔÝ켉ÄB²ýŸÀÿ±(°Õh6žé¹Àëï,o5U¶Mðʇ†´Ý†|®Ç´‚› lÒŠÃ]í¦÷“ÉRþ°@šŒûOu úîmÅ›n¿f ò³ÖÀ`>CÌŽbr¬CFÒýð2[£å4 1mÓ£¾s7²RV#"4©ò ð«§ÅâN7¿ÉëóÔ¶éÎbQjÄ1x„ý€v¢£M§cÝÈ|¬/±ªû†|zƒœêwEe2±ŠJÊ7} íµØ E'Z^«[“—‡¯ßøe]‹¤Ä|ûÖ' B÷ÆOjÀc5}MÆ-ŒõÁÌ £iñd ˜ýY…cl.?1¡eìo¾ø•ýR¿ò˜­ÁïçUùüÐþl›¤†ülÇl](­RÑYl3¥ãúƦõ‹¾ •4ŠMTH&Ò¬xïä°10°¢A…®Æ…&–¦µ» J)·nK­¤‚œ·iü¨Yøöªêôä5ýÃFsy|¢Y1QºšÇ-[i 9jæÞç„×|Ôr .k:Äžp–Ä‚)NZ‡Ñ>FÀ‚+‚Á: ÚØO«#È"\±àP‡öÃ<Ó½uD÷Z?ºaà+3}ß®çU{}î)qi\ˆ<6…Þbbùé÷áXûì™qJªë0Íå†Ò|ÖÙƒ~o¬©ã•Ûl.­,dcÅÇýdQ\7<ãaiLt“¤IçnÓ¾0O€¨˜¯ã¥ƒïÃã júÌf¦Åhq˜ÁÅr Er?±¬Æ©ÆNëå±X`á¼-§ «Ÿë(èññÔÙÑ®MqIšõrê<ƒ[¢u¤#CFðÜ…(HûyŸ!!!¸6ï.¤É¡$ÿ+»æq„ ýÞþÏ[ã{XD®‡úœ™À¯ Ùt(z]´›ÙJ½]ÿ^ 01ZÓėʵTò¨iàUøÜAñ/2:“ÛŽTáÖeÏs*Qm¾çVhþ©èçgM«ÏýÒä^O%¿E’¢ŠÌ¨Ç*Ïö¿K#ÛØÂ OÒ` K yŒa .|B'NöÀµ¹÷s¶µ¾4zËP`AzÎñé‘2•<”»©ð:ì»x&»érýr€,:ÁŽL£ú.ºOëö»‚òÔøå5‡šÏPpÿ¬¤T¶õÛ¶¿ÅE‡çinZøu÷H/÷Þ±çJ6ßÕúIA²ýtq7GšÞ@øl‰‚…\ P/ïå´r„ϧÅk É×eäBØüä~×VVëhþsj‚½C¢ªýÕA&¼žæ¢÷˜Ë¾|Í£%£½å‰*!÷Á‘ßáÆŸ1/)´æ…ViBÃsÃÓfüvû6,.¼Vó>­ËoàÈ%\Vù Åõ…¥š]ç"3æ\èÞ†ü¸û© 2wÏóH ø^·9´lÂb/I IV§$&ÃE¬òhA†ºÃO˜ŸæJw !½p5F;ê±4kb"Ô˜£‘:dt[ÞÙœ½ð“\¯¾ÏÓú\¢ ³sy©7àƒæ“pØ=L…2f³¿v#$Y°5ßÿélF¥Torzü˜¶ * C ŒaIæÀDMË+Ï醃ë€å°ò±´ØCò7ðüÞ7Y™ ’F®C1hnfÁ‹i‹ùäž}~'ÎÇÄðEŒ[›X1ŽT&BiÎrÈ—j~U3htóüˆ Ц'.CÝ…¬'6uô Èf»nEÎtþ éÑyPs©xùÐ_ †âÎÕ[(ç™Ot[Íú/5WÌÉ+×j˨œ+'eZ—>úøˆÑ¶‚Ôb©û·b€áòø&“ù4kXœV‰ÄØU,Å‚öM`ƒ' À¦·â­ú»áW‡¶¤ò³ÎGÁ/€¿ßƒô¹7šORÃ¥ƒÊ%5nñÚ^ܸ åf„JÃÈnËÃð`{*Öq«1¥‰Àt õ–QLX¦‘“¨eŸ‚ß± ÆYŸU饡ö¦®Á㸵è|!Ÿ0ʘ&”IÁ%*>%y_P”ü‰¾”úÚò¸ˆ›j25’Âå,ÝçïÝýÜK/6¼rð›\¬´ íC}Æ¥(û„·ÖÙ-“xvaÝŠïA?ëø§‚¢²ð"ù¼Ë=.æ%åcÚØC[4‘{\G&ðṓœk—î´ñŠäüXœçº\ÑѵHóþáäú)ëà¦÷W33ø;Î8ú_(ÍDÉ¢5juÆÝÚ¾™pî»÷à5oÆ#…DÂ!D•‰…·êg]sµÎ[2çkÎ÷wÂlrA"æX^ßÐ”ŽŒÅ¢Šý¿5Ѥè•\Q“ûÿÈ{°6ϳmøÔ–B{ƒðO,ï…mág9ÆIš4ÓÙæmb“Ù4M°Ó¦mŠf7)¸Ùilpìx;ï…ÁÆ`³ÅÞ !¡=þë~$ˆã8ùû¾_ÿ÷k_9t0AŸsr¾±cUS_c8cgbQá¹ØßêI¸&&&Á¡K6ô{eÁ3–زõ¶¡×fàgR³Ì.µdµu ¼ö#HÔ*ÌI{Ô?ç—Œ5êÝçôˆ ŸMìTÏêFg¦­Æþ*ÖMçÏ”fÝt»¿Es눅2Ì»}¶TܱìM<žõ<âdï}öƒk.'!g«Öiwè3šò?‰ò)Õ«CÂ3JÆ$.-™>~YÉ×û£}¬î#3ˆFK_qZܾ™í'‰Êƒ°èZÏÃeÝù?šAü €5Í_7OMX„^Ó1-{ }mþÂÙ!1/¶ÈK^¹ü ³¼ ò åºŸt1ÂX~²‰s ’‹œÃ[5?ö;ášÖB8Îsë–‚ŒóËq‘ëjÃcúåÎY³çröâF&oÏÜ¿ÀŒ‰ËX2ûŒ]¿-ûÈ`2Vb|T n›÷½î í ž.<×´ÓÆ/þa¡ëžèl‡×VàKQÙ¼·/¼ÕðÌ5¶úÞÊ„>®Ó”ÿH¦ÖÈj$s^V^y½}^±»u'±X/îZA®2 ëtérû0@ïpZ !Ñ“Bt±1'ëÙ&ÿ”å 0@¦^2läWÖÉ˜Ú “¶ÏþÍ_å%Ͼ/ç&¦®Ð¥ÎÜ>&r‚nvŒ[—I.\üL„Å?ƒÝçãqçk_à_êQRÙλ«3~‰½§>E$—ˆ0¹çòs]ªŠÅ…Ö¸Å^4t–B@žÁ¹–&Åšµ¼áó"gÀlÅ».pw¿¾/7QñEÊísçës–>Œ¹i÷#V¥Exâ,™õ nž{1ñÝl$'êZº¹wìÕýy[ÅåŒfÅzµ–ÞÙÄ* ®y\Ý”î*?qI­ié5€Ä£ŸøÞ=å‹¥Ù b¥‡Ÿ­Âÿ\ÈäðMW]_‰Ñ³× Zêý %öœÿ Ç›5>Å×ÍH( Š0ø|~µ#ýN|„²à›qâb1_×ɇÐXG b!KNxüb»{7C“Nà~'οE_Ì+(Áê—Ç*½tˆ\[±Ì(t Ya´ú[JÙù3ÍI–¥ïïnå³âã¢&ÑñÏÇs_èã$Ïé½COä \•)L¶©èì9²pƒÅø7còæŠÅãEk®Ÿ½CN;8õJ”œ?†okÎ".r&§Ì`ÀÎÜoî|Ý9³ÆgWˆÝ*^ÕIµ«çü¶þG Bo_οKEÉÿfL±ÑÔ’¯MNÇ O¬¾>å.–‘år’ebÉb‚>£6•æ~,ßÕ,Åão)¸‘ñ‡?~Ý&iIJbІõƒ¢/y'r2aÖªY¯s»Îüf²ú¬~Jäá5úX1©€6dZBØrøíÁÌcdôeƒÿ} þ÷ÎïýÎs——ï°XPlø¸üú¾f(ä‰0’[t^3_“QÒ[$óŸ >³‡xøÂAܲðõÏß<CÖ¾’g®m4¸Ý&­ÏkçœöºW.bJ64×ý³SÖbá/?EÑ‘ÏÑÔYéwÕdÁ¸vÎ-äÚîØDìOÓ¯ù’áëWx©#¶© ¬6’¼9¦ÌÂÜcv,YSþô»òœ'>ØÏÝ;wb¥qšŸ¡ªc^yç¼¼DäC1íx2‚=•ÄTLˆR™à'Ošùsà‚C5Um¼¦¢‡îok\ôwíýmJ~®ñ¯c…îWÛ@,!Sþ³Mœ>ÌæÏÄëÚìªì¹yE0÷_¦Ž/­0wßY(ð²/¶˜0wÌ:œlÛ„=•'0)>’¦i/µœË£½ësLÈŒŸ\¾jæ“ëðv8Ù·¡ð_Q òÇY°¼¹ë¬><(cÆû¬ûcê,AÀ' è¡øtÀ’0?A“ù…ëû‰dBLä¢üÐðEÚÄIë~êÜØñ9Ž­‘8?Áõ³^BlÒde=! +eÍ"Zœ ¦ÞŽ‹êÿ“ûÀjÚ~ýžüò€øºèЮ¥¿^[¯Sˆ²†³h±LÓB<¶àŸ9f¤*±ÜLüië›ØYV—@ªqËRu‚à9\h¯0nÊ$Œ»ªÐ¸ÝvjÞF[Ý]ЭÅc×/!†º ÷-[¢ M¨öÎá¾Ü÷ f`–Ц5ú7FÝDkNÆ4;7%aJ>]G&C!±c6j²$c¼#Œb“Wádã2üö¯Ï«4ú7SB)qSqíÔ…h¨ý§ù>³—ò‚¬¹, ±‰Ð9ä-ž}ø¦ôÕÑac }M—9Å·^¬¸–;ÚÔ€­;°íä709¯…Ñîwíc#ܰ»X›Ý"mj’K§ù´·_O@X‘%ÅôqÆÅE`Íb)d¬3ÄÇÚƒª˜­KæZ³Ž¡YÌkA <çùëÕÜ_6ãZÉf“÷“«y˜ïqfñîN2:ÛK7Cr?榸¯E\â4~¸’Hâ_'Ì(9ýÛÓ-òòÃßL§Å'óÊжˆ\û7ç¬x±LO’éh ýúŒ }Åö !¼6¤ÝéâcѳˆŸ\Ç’s‹ˆ¾#cÒ#ô£FŸ§·8|ºý¥³J:­aåƒFIöJí}¨i-Ó<õŽb4ÜävÖ”Ær èêªD£±„]¯º½ ^Qºž×·/Ð6vßøÉž›rЏý›2·ëØ¿­¿R€õÿ…ÐN—=÷ÔŽ%³',æÂ”á8ÖPNÇ9ªøÌÝ‘aNú­è3·²AÝù¿¿ßþƒ˜ë !¿*þ㛈 >Qhv Y¶}§_B}Ucîy¨@õ~ÎO€ ¾·þÔ¡§³àúië¹–$/ú,´Ðœ&bGJ$‡ÇÀ<\cø¤ô¥õ¯|&%f…ÍÏÞåüor_~È^øô»Š¦'ßVþé~è»Îd3ó,Ã0\BKv M(¹°w.\“Õ[ÿ§l&”pù1Ø#öw) «–œk2ë¾Ô—iê;ËpçŠëzÛN ø°ƒÿ:‰€inZ’¢N¢³ùsXÍ­ìÓÛy bdhÐæ/îàȽ)HŸ=Øcl7î>}h#û¬øè%ëšúLY-m=š¤„4,™s×õgŒKãrCC¼º„h—fR4m·°T 8²‘÷·{0-Ò‡ÚA!?´'X惋®o§FÁ7¯¢“€(X.A}o Æ7òr¸œ†¥JÃ)˜" ëJ°ªF&, ‘¯Ö¦×Ì({©yæÄì®Î&Xì"à ³ƒ5FgÌv vÚèUuóòòì¾Fp\2HÑe#-ÜU,S@“æÑ 7Ö¶J–LŒ“êî^~+ŠO’!XˆÚ¾JH¼èêË{¼õþ´ËjÚý,Сdâ¯ÙpYÃZä®O´Úû¤Œä×wŸ£œ\a1_'ÉØZWo%NÖż$)¾þ¦b»‹sX[?¡%£«ËHn±×úÃhX=ûFtö]¤=c+ö':ô=¯Mûyæï²vŸ=ˆ‹-;à sóõ„±¡ã ð¶‘w5hêƒ×$â§Í ø³™3žD¤¢^KÙÆ b×K'æ©Bfèô—Ž’;{Z:‹O@çp†s‹&&—(>8šûâŽB·£Ì0.î8RsÝíÈ}¦{¢ôò×v¦©óR&Âh>¬¥GŸ!vUÈ¥ò‚p. œ’•b)ù=?h1æoÙZÇBÿo ©þËY¼Ë¾5\>ÃöûulÎÌãUJ4±ã¸¬éËa¦EÍJ/ ¨ƒâ¢7ÚÎÜ1c6>÷<ëÙ÷å%d¥×¼úðwõ~¬ovdöîUÎC›59ïŒá41ŽT¾8ò)²3oÏlÓiÝvýº•,æÑ[ߪ·ü:/B‘1Y#ªàq•áì,– ;·$¨Åk›„,6Vôûd¾7™X]ÞZÇ?Ô%ßèmeG+¢ˤLJEF؇á¡ÍÇæø6c(_ ´€/[©ˆX§‰×iû-axõ«S°»9ÌLYY“¸qº‚_áLóS|̈¹hüLZ›õvãBÃN,Lÿ–N~  —Ã2µ”RÑÛ?3®Ãgk®R•.-ÊÖqë&j®Íß¡œ¯ÁJ\3y®1*é•ÂÌÇ8]{Q¿QÈ 8M±!2æçx½h·_€]»™–Ÿ*:±“]GùL ë3”ÆJ²1lë Y0F—σ›÷+¨º$¦,‚ZÚMçëjÓà)Ãìq¿BSè\lúJcv¤¢¥¯DÃ66‹¹™ÌÍ ßñÁ’6ËÒìX4Î¥Bš%Š‚TeðØ|¡@‰.‹¥µçàöòóS˜JóZé<"F~Œ—W³ûEyÙëg‹ÞF¸ì(Ü–ÎW[O  ¾ØÑƒä˜ |¨›Ø½€@‚éZòz¹¬¦¯ç8–¤Ýƒ¡ÞG7$:"Ëç¥ejK+‹àùF×ø­óî€ZnÄ™‹l_ò¨1½kºžÌ¿nÊÊõKÓÿ ³ÕL€ÛOÌ”)[ç¸=‚‚ôq7¢Fq=Æ:'$­Â͵ˆ”•b¨ç34v"_ž¥Rƒ/#1zíy0ˆi)U±«áN^åððÝgÐFxÑi Á(äé($þÙyi±0µŒºripþxM†¦¥ç,2&.Ç¡ª`c~A›eÕÜ8­OFžYpÈ­Éiå¥âÇ'¬ÀñúCX:>¾š5ÿó5pÿD³Tµ‘“=ÒBv'Î5ÐTw 6ÇI4õöð •ñC)ô›:$Upö¡Û8„ÉɤDNƒ¡ã<_lF qÛâß!2¨ÓÇQcL%%+‚¯ Q¥$÷X4ݽ-\|t¬Öj4 wkbÕqhótð¡~l'±1Ö:80ÔBŸ­ø~<Úº#gÅ´?–TŽsÃænLMžCnªÃÃçPÖØ‚¸¸Û5=_|/¦=ÖBkuëf ¶f…\Q™L]Z#YφÔÉ8_¿ kæÝ ‰øžð:«0<ô2º›Ð<$$®„:8[ô;ˆíyÇMÃÑ‹!B¢ gæÄ”˜ Ú¦CK`í°Ÿ.Øu®"óÚņicnÑ=ö>¼t¿™*Q`Â+ú-]¢%·Î½õݵ8tjö1ÑZ•]C=¼ÁËN#R¥MwGÉ–­Ÿåü˜Ðÿ-~¾CY0>azv|xLD÷Y¦ÉM;;DÉ:(tš—oÙjXhO»2Yë³IÖý b~ üÛÈ}S±&ÿW6.,h¸ kBCbtÆá>žùuõœÇìÄGÐÜt6¯Ÿ9‰ÿºáa­ÏÓE Øù£ ÈjÎ Š)Hgë<â…è±XÑ5pw‡ÃBÒ1>f—zã¶è?=ÕSêå]x·\ÇwqÜù_¿'Ô× $ÿ½Ç/p yì ¬A›.—!r5!ÉD6ÿòf÷˜$˜’)ã—“«¥Ä/6@Y½·;–ý¿yÿyŒWB)µc€\›Aï v•üjuo™e´*-rÿ|f‘¾ß}òÐÞþ7ȃŠÈ•îÂîuv˜:b}Jl:Þ?PBn² s'eápÕG´!‚ˆa94œÂ›×?ÌǧØsÍ9ô–Ñ(¼7µ­müµ±á¤Àò$š‡ =…„`ÿ±nzÔAäþÎM‹#Ãtœ/šeÞƒ&6=»m mí¸nîZ¸œ" ÈeLž‡ß»z§u¤˜šS‡¦ç9w ½¦f¤Æ-BuS+b¸PÌ·g ¥°Y„†»ùäUb¢Ñ Ç݇S†hÿ6Cä^òmÚ¬÷•PzÞÄ»q¢ú¤F…¡¶ƒÜRú̺žˆ‰…>ó1®Ïø âC³éyØávwÀn}Õà4UoÙ]aÅŽý±ƒãfs]–Œç11ép!'0+!jSñÑÂ͵-Êg¤-ãltz¼Ý€ÚË?2q0t5^^jbh…aãóúÇnx!‹SÁ‘êoñõñ0hõ`ò˜U¨n-Áü±×»R®0Ül?ð5†wl”22’Mp»ÎA.pcOrÿúAÊ»9Cä–CC(×Ñ‚^6!6d,¢É=ýäÈAÚ¿6(í¢ÑF6éÐ8T‚„¸kñîþO6 ƒCܲI«‹¬¶=›çŽÊ¿Ô>½]à&`ZÈpÓ׸ðqa²ªÚëPÝ~Šwá]¦€$7vÏDTd:"â`±`rµV¤¤ Ø™“åû_Áÿqd¯~JÁÌ 7dÛ¼8Pû5Ž6êq¶á<ª:Ïã(Yæ½ÕEˆˆÐbÎä{ þ;Ï×?Óꬦ¿Wßǘe™ÇG7eûü5€W»QZb¢üHG>¦¤ððZl#¯¡f·âÅG ÜtV`w,fJÀ36”,h”M35Ú¦îÐÅ»u´ t¬Jž•¬4õKu5­°lê~€‘ƒþ†ÚÙ¸C)Èm=‚IãB*Tâá7Îàt1Á^,Ÿ1Ûîáÿ†ÅCE"!¦Æ…‚ R´H=h·ÒÂ’{ád]x´ÙØÂö° d©‡m&ì/ßF®Í„+ÁÀVœOn ¹B§0@Àï ´Ù±¿cß»œX¥õ1‰®\¾5 üø…$”›‡{y÷—¹°ŒîióÌ}ßdÀ@o;çÞ¥S lÖň®‹äÂÐÃPÝB4vÔÒywb|¢ No++4]RYh‘2®¬¡‰ÿ,íu ³äB5¹^1ˆWEÀÇÔÀû$†’û“x;N6Å`Ï±× ¼†xÑ[)‰Dëg?‡Áö hë>On^,*Ú|Ø}¶q!Óx¶æUQðí³xsÛz| F‡>ç™Ü]ÖäØðļÉ)3¹²Ö£¨l< MÔ¨hx©Ñá´òž yC™gkJŒË&-Ƽq+ )ù‚ÙãFîzÝèÜb&¾Új•‹Ëòúz±©øY|qøb©ÐÄ.†Áp]ƒàTašOŠøš» ÷÷’ ´\~¬%Ó(”ú¦q2 å› ü4v8›W‚± Zœi¨A3}†/PŽÓgiæÿåd y J¶aˆÀ1.ݲlH›é Qúçê˜ÙŒ[ÎM ÆŽõ;‘»ˆ»fÞó€§þ©Ú§³µÀçºÄZ“óc@ÇoK|xý“è ] W+=в5BÁˆ¯)@·ÝÀo~»’W›Cí¥oÐ=ù „ ¿^w®v^a¤2B+±}ÀobiÐ5k…ÒéÙ =§PÝùnÿ€rI°b¥€—o·´Jù‘]ûaw `ÕŒuùÀ¡âßßoUsaqÈÈД¢øˆMN€ì¤4LîŸýÍhê$×c¹]Câ|–¸ÔéÚQ¿ö¦9·kvŸÝI.§ƒoÒ•¹Ë; qîË/ÃÅVs †(@TT:Žîû€¿‹-ÃÄ$z‘›€K}RÚ0}¼²KXE H (XÄþD"_bÒÚäª"¯¼Ù\HWÛaF}W¯0c£ß¯k>ÌÏA÷¢ª¥ sÆ©¸©±ų߾,àoiÜž:1&‹m¸ñ¡^Tt‰x1R–ívú×”ç¤âÚY18UÍ'g Ù¬eæB*e ˜Ù`yZGu†è°˜ˆýz  RãöŒßq^×¥üÓ%æsÁê]¹a˜þÚ¬L×êpãdm ±òñè:†Á@>“*óÉV`DZG bl˜ ô¦¯2v?$œeoÁâ4"]Ã2äüì’¦žþlzC*– œ›UäãUU8Ù°~ë p\phvbÔªÞ§ÛEÜœ¼_;‹#ãJ„ᲸwÊ¡ŠOÖ§&-^²J{³Îæ– ‹ŒÁâI7nݰa„Ù²ºÓAÜckîÁ»{ö¡Üs%Õ@÷Ž)Q7ÒÚ•“A=ß°1šìHu,oø†Øœæ¡ü-[Û7ލþ|ƒj-­ƒžƒB8sf¯Õýv°c@,¡¤ªÆ_õ@ïÍB ˜›qíd)Ò’nÂßJv¡wpˆG ¦(r Ñ9؈„¨)ë·Ÿ»˜™5íÉRmÌ‚µs’nƒH¨†T>cûïÿqÇ4~è’€… Àg¤}NĬô&ȃÞVˆŒNÅüÔ»Œp|½Ñe?Q¨]ø¿üo ³4¢ YH>“4×ÁOçì CuÝǰÓc…Ĭ€XáâÝŒ‹íG0&æšlŸãL®@6ë'/ðÍOE:Œ^Ía^÷ô»òÕ¼†Üh†˜w#™´Úç»]-þg0šûÁ\ö<™²†=À¦˜Âc2¬†ëPå^Ü:{>g-ÒoϹVË)5èn@SS!ú­}|Wˆ“E‡ºy‰q¦)Ç^¶ _'È$œŒ“š+“0išëJ¬.wº©í§y…ä‘ééI1oêmˆn?‘·û|»Ñî¾ø°sÃØ­å›â£„Y,zm}G“.TéCSˇHŒž€w¾n%à1C&ð‰¦Ür¬º a ¤´¡ÛLBÚ,t~=X5}Þ=x6bÁ ´„7 ö«-³ hr·¿ ÑâÖ®ÉUgïË•©ZÍ©¢q´¶—wee¬‰1éV ±äc¨žhH¡° wŒ ”ŽÔy =-ùËf,à˜’HŸU0D>~¨rs+‘†“û~Â/"Kk 4ÐuÁ$ðÝVü)ÒF‘2&‹Áðv®5ç—¯å&EÆåµôvduô#¡_Z° êê‚͸‰ò‹ÍŒ†ŽjLI˜…LÅ8g²Š¨k;Š@G„ñûõ¡‡ÀÞLÌûX}}Æ;—Ç_óÏwI¸™VáGkÐÑužOžHؼ`yzÈÍT… qݬ >SÑT‰Æ.° ! b¸d+ž·G)ùZÝ%žl˜­BNä%ÆOÏ\êY7€Äþø°DLxNÔ6Ãêtú=‰šÎC˜?Á…ôñwàrñ;ˆqž#šØ_]Í7d<½L—Q!!+ vWXˆ¬X³ö–£{ûý¯§7 ö·Áiæ×<¯IÈùU‘X³‹§ÆNÄü´[á³mË M<ó­+ä¿ €¢aÍâæ<¾Ô ·ò ‹…ƒÜ,¶âÙŒ~G—Ä_†@ßW5€\,Ì{õ3é–gîpòûâßeü±«+ ¢]2D@(&Phí9O–j-s‘ÖÔߟS6øqy\x|’ X{ù%"V£žŠ†ó—à¤kJ¼|ÿ²<ÒÅV%Ϥ¢`H„âËL´N*Ù}î0çt¹!fµlüt:o=Y-Y¹áªÛ ¸oéƒ\‡q;NÔµqßm’²Bÿ›wGKBC"u^o(>Üwš_Hat?Ø1QÎζ#˜IV ÁÿÛûHæ¢èfàÁe™xo©¿É^à^ær³—…Ø’’îÁøøé¸ÔÅX5 –­ãòY6ÛdÒ(åávøŸ+OV‡gøg¥(½~ÐÏëd‡ú^ûכǃ±Úsën¹»ƒÖ×A @›3HŠeÚT,œóð9œ½ø5sÁùÖA6p(ðçÆhU$ÇÓ}ðcõ¼8tiMµö–!Eµ€îSv †[xw¾Ÿ~/Ìç ccì. Ù}þ,+û±¿0ró4÷×Çùü×φ´3ƒ̾§‹œœ‡(.'[«y£úÎVcõÑöÏË:ø,Ó»-âu…{?ÙœšìÔ5Ù‘!aš´¤9hè²@± ƒ–v Ã×D†ÓÚ÷SŒGPð‚¦sn\~±ø*UKèô¯ÜôY§Û$¸sböšI'›QÃʈ†Í¨ðèñè wÑz©@MDZQÅfV /¤‹¯é2Ê1)afvéa!Œý5¨évhìDÆëúÅL\WK¤B÷Ú/ìú€¾”ò0T¶Öú½&Ä@ëšœÌÃà”]|¬Æ‡Ý+¯ÙŒvo?²TH®"ÐU*Â4¡ñK œkþ—»* m¶îÍuF9íu‹ñîkòðqi˜J [yžÀ|ï°èD\3çQpâRc×ÀîŠ3ÍgYõHEé©5º%sŠôÿÖx¶ú¶ì ‘ä°IÝ®¶ÕVO8TZéÆÈB=ðŽtgЦgÓ¹DL %˜>f%ô•/¯§^ÿ‡O¤|O¢ÏûÝðq6b1J)Eˆ2 $áÓÒñDÖC˜•r 8\z*çÊdmf6,¨éW•¥<ó¸i@.ª¢kÀ MOš€ C ìd¾DNÿæçÈ$ ãdê‘ì›ñžU¨ø{±'Çé«*ð¹Êä•`†$0I’äà#¥®@‹«¥ò†§gL¼½Ç¶ŒôwšÃJ¹D.cê°9M0ÑF s(»ô1?§„‰—2GÜê±ã¯>ÄËÅ©†×Fˇ*3ŒQjéÔt!Á(9gF@yÅÏXï.YuùEgÚÄ~pc$FB¬×wÝÝ¡ŠžZ}#¹68ßÜ„~³iô÷ÂUQX8i%ÆÇ¦B*‰Â‚É5Ň+39þìaV.d‰1·s²™¶ô7ƒ¨LùèÛàõü0iEÏ3+>j6ݨ9ÙËCòÂÕ³4¯‰Ÿ#;0T…ʺ0™ùš?ö¼r/?ž=¶÷7g‡+#Ñëíå7‹\Þõ ‚ž$Ïð#¥eNÆNɨØ|þ2æ&t mþð/§áºé¢¯O_‘š¤ín9îÀMfž2 ƒ„Ð0Ü2ÎÕîåK!GÜQyÈÜ|UH6-Ú»®¤ò0,¡F%ôè“£ÒÊùYxgï.ho˜£€ýg&)n#=cp-íMEϾ#+6ÙD9o?n5^€::ýÜËc—z%\tØDœ©9Ä÷h[èüøù/tÜXM<24³ñmU =ýàÇ‘;ÉR1²é˜@îj­œ, M}_gÇÉ=X>‰y0NíR¢¼õF1ªúĬ¿^?è@©H$Ö±Ù+mýþÒ$¾ÝÓ‡IIn¨CïÁÛß‚‚þΘjØoiæuÓXŒée:Ý6ôµÂ)M%ã‘Ι{ZÖÛ„ýë£Ôn}KoËv¥`ïæ{—„JÎw‡sãcYRŒßwÐiq“óÊÈRMœÊg£~ÿåÛx京,¡Ô­í­?»æò®÷ž6øå0ö’ór°¾àYËåáܦŽK%SnC—ÑD.h\´{äò(hC±LhBädbsüáx‹so [Â…rÙ =‡`v@¨ò(¹~}?Y¸{4V²tÒ}´ ÆãUo²äG6¹ #~2ÇĪÛöãdÝ)¾þNâBDÖUêög×d†Éˆ Ûm8^{–\†fåã'Kœ.ÿä3Áe¢ Š@G¿‡#ö™ñjr»¼«RÙ8m>ƒ2¾1ßN¾M‡á :ƒ‘ž8×θRqÄ¢0º††´Ë*¾øö©-_jþã7oÔ¾øàî”%¾]&QÁ°mHI›´CtT ‹Ü£>zPSS&£¿‰Ab m¤|˼9iºBìI~°V*øµñx†kr‰–­Ë'Ø8"ªzyä ½¯){Aê5Øvz+ß©ÀúZͽb„'¸©žFçÍ—Ì ."Væ’ ýJ#JB‰NBV#$“#RŒZÂÉ›fçÖ·~½yZê#:©²¾ ¼ö0z{./û]槦aѤ\4”+5²@6$[¢ž“ÿaI ±Ý&Cvz¢ õݶ¬pe˜!)öF¼¶íþ8œW3‹±Òó I†2f TÌoöÚ%Ð-»Þh¶vce݇*ž ®ùM“ãè)FBJÍfäUtH¡]Œ Í—xr øWBjŒ3'ÍÄ‘KgÑÛ×ÄÄzxÕ!uî%ï«Ë}=Žr™«Ù¤'\‡Ú®VLNÁr%¶$Xê1±¯I·bw{–Ñé ±ÖH :‡ì0 Dk52D‚¾áhô›š¡öùçc³‚t+­‚„K鿇+™†û¡Ã Ãˆ³µ!ÖxÆFß…¶î}:¯hl÷÷ÂÞú†pIÚº¨ðˆ,—«‘]ï2vm‰“ òÐ ù ÅœZ5r•5;AíË¢5¦Ù«Ÿ¹}¥®Lÿoë_þ K®Ñ÷Öפ¨%©Ó¢Ò²&ƾ£Vßp’#ç#DfÃüa…Ãr2ç™;x‹¯¿ZO.sÃUŠ<¦tÑX³ ÓÆÞˆŠÚx­èX·z&.X^Ò[ì{’âÄüŠs^V®e |'§Ä P·lµå\h*)¸qÖ øúô~²rí<ز!åì¦$%ÀãØ®¿\–ª½çX®Ý1N›‘z·¶ÓXC¹5Fžý±¹µ# ,V=Ú䥰Zûp¼ê+V»d©s¹¯’¢'6æóIF`󀓢<|ÜÏ胞‘ìÁé1âÃÉ]2±ÆCñå–ÅMK†,‡u†Óg¡³¿ÝC.}e‡Œ®[¤ùÑÒ}As÷>~ÞX,]Çç¦Ö`Þ„{q¸êÌH ƒ,ÌAWpÏ5¿§·.'ÏfF™÷Ï7¨x…ø£²ù L˜k34ðnçÉÚóÞBº–ö-úÝße™Ïßë0~ÿ™õo´ ·çM×,BYãb§€ld&E};ž]I›ÞyéwãȹOOà×ã!F`äÓ8ñJÃÅÁܹwlTiŸ¿sÎÚ£çßXs÷’¥ùJ彚S7 ;ÓŽöÞ3(¿ô5±T¿\¿¬ˆØk ÖÄ ¿ï"Æ…‘û=Ø…’p¾­‡›7å~mþöG{ÐE|"FÈŸc¯±í2™ÿuÝMˆ½…N뇹¦_á½øISu1jhó$Acéz[01vˆ< >$«…!&7Y‹Ðp>ÜýÔ!!èñ1·—È"µ?¦æ#?ž1B&ó8wìBLˆ›†z6Ã$dŠ ¶»ŸMxƒ&Ì í˜¥?6ºhˆîKÜXˆEúDBô ùO‘%–ÂØ]¢‘†(™ýeFÜ!óðœ %*çëΣËÖ@nºK&®ÂÔ­Ñ2ðšâ2yžeÛGº«€ö­°ÊæçAœ®;Tûw »Èà …J(ϯíñ %z l]l?§üÇBûÝÓÚ5½õµZ‘`ßÚ0JÄ2?_mæžíW¶qýÈK'—ÊY‘mÐfLw#.17€Á{»¶ ÷–¸‘@°#årw˜@YË&ÚÀÙ?o¹Ü.ܲµ…~ooþm ~®©l1àPÕ~¸-V¤$Nä8y…¥¿bÍ•µ‰[¶Ögªh/™œ¡]4þ8]fr}†ͼÚrTH"kçCMó^VÂÁ¤Û™ZƆ˜È)º¯ÎlÁì Ó0HîóG‡Ž"gq~¹òVªqâLõ6¾µKÌ»K^Ø™[A iúø9Ø{v/‚ä^£Ý)b±ÎsL2{—¸\nmˆR5 vÀÙ‰#`,À¢1.²ÞdµÃ’æBCç ¹^翳lø4p]Ï¿#[os ¯î³ØunS‘1nX韋^cÉ¥ ®¹S Ûz|Ï&u`úØ9¸PšWŠfÙß[¯ÇÜ1f4×~ͳìÕä€K—G¯X _øãöãç»t}=ÂâÈHO¡Ë+`" ùWÆoYörËÖC†é©·æ‡L½ƒ;rñkˆ„ND«ã+=+Zváës ܲwdáTõNì&Dˆüa¥,ˆØîT×½ÍÎkãíyªì˜Ð„uNû‰\M$ò.uÓx}Áhl>Ä3ê¹×ìaç»…‰?Œ4ÃÔÓp®²LñTÍNÄÆD0q ØÝC(kèF©A´NƒYÅB >:¢É¡ŠÄƒË3¥¼X¨Ž;žó#]@<½eÖP–D„¼Yã¢&6:™qaä¹Ì„Õ1Œ“†Tè_ÁdbtRÑYÌO¿Ç.~ŸÔ©MäKȽ˜6îV¤Ç `²táEïóÅßl6±Mì…‡v8‹y·õÇj«éùñ±n¯ýý=r±„—ˆw·‡imZ\^ÄÑu0ðsÒ:U2–«pc¤ºbB|í~˜mØèàb4˜7Ým/äjÒ¡æ=}Ï ¼zdù Õë .\hû;}¾“×û~Q)×â›S[05õ1 {5_íŠÚpëõ=þ£Záü쌵ƒ9þ'α$ÆÙC8Zõ1?¨‡¬í w¾Goù/ÎgݸžËèÙò‹‘ÀÕæÓ.ØPär4oÙú‡¬Óž\’9­@k¶¢¦U?nÛ¸ù…û¯Ú¾D?³Mß²u~u“d}(-eŠ·…f²šu†äbZ ~𤏅y U¼ZoDÍ»È6§ ê[pÿ'®OŸE–÷yœmläÝ ¶°R`B,Ý3EmáG»š• ¬U»´°€1ÐÇ»…¹£ó'ñËqL²÷øH/–wâ\‡˜ †üÕZ˜¾‚ÇíÀ¹N îzQÆ”RøXbƒ¿ÓÌ@[hw²4n.-ÆiUz˜‹ª‘IÕÆýU®5½fQ‘JéE}—¤¢ªþ“Ü›æäŒ‹™¤aC“´)ã œ¡f[±ÇmÛ8Ò;Ì·hý–g TÔj/a¨0$¯ïên®ˆö°ZÀì dx1Çq%’áúª˜žWÖ}ËòWo6oÖ}{ö×=hãËhÊZ¥…·ÛJ{ ¹ù^—Í}tð 2j]PH”xêÖuhïú‡Ñæ0e~yFÅ’jëÆGÔlé7úŠ”ÊîÈùÃÐi‹ÃΠ¡MÂßßóïßpyuÃ0´F¤<®Hy¡X˜avÛLPÓN©ïlƒÌËH1ÐðqJµOÀwŸ$&fà¾k–A`ÿ«Ám¯Éý 1 þ9†(§MQ"˜[ŠAû­¬@[_%±Òó¼«0âªÿL÷vx ãã1WcB¦öKr“«àp»!#/bLT$aà>bìg±³¼,÷­&Ð ðc±N¦!ìñ %8ÅläÁœ^s&®™8ÃsnÃæ][á(FA‚ ’Ô!HLLÐâ×ãòùヱaqX6uJ+ 0àö'5æ_I{ãzûQ@ ÿ¨pWêÔõÔKò%Á÷¬/k3;Ý—Y„ÈX :;xc$—JÀF˲k²vbòØ™ë¶lݽé£=î_€5µ«òÄ;6þŸÈÜXƒ V¢¹«ƒ¬–Š qö1× ¼ˆêÑ24šuÄ6¿gVL²WuÈÖ…y ®Ýʱ+.¿q~ ü{þÍÃR<ôG¥þý§†¯z¾LÊgËVׯ^cGV¯ñ{EÜWtµäņkPyîß(ßÖtcã¡¡ù¬^þZÒƒÇo’"\ô7\7Q ¡t"‹s;½®‹›Õ1{õ¸À<;œr?›L— nÚI©Y!¨ÆÊk‘Îß¶¬’8/>?+åÕMøøåu·ãþ•JÔ_,g36p¦UÊ2~  ˜Âê)õÌ00¦*‰¹e‚*?Ú(€yx‹Ç›²N6È .·D+¥ÝÏÑ}sÎŒ YR×áÍ­Më+Ltí—³¾ï Ÿ£ßöÒáÇž­Çk¯È˜¼@÷ÅþmZÂXú›ZAaöo?”ã÷÷Ûs~h„þÄÇ|MYâp‰t"!Ÿ€ª8¸Ù˜3û –48[*Ê{mí“Y̓bRæ0®|ƒëh\sª&„ÖˆO›‘jÍ U%F§r_/A¨` ;C.óËÿ¾M»üs[ÌÒ…8”‹‰÷ÁAÿÞN»[)“cθ(œ¼Ðˆ^“³S|X}÷‹(>qV§ÃÉÕX1c%âCŽÁ=ü²ÞþÜŸÚ̘E„xÁ˜ŸLý[|}¦e•ÏóƒÕm² ¶œ˜ºÿíK_ű äê‡* »GŽÖK·a|tŒÞ+6 Áe4öjVñ™}ôÏ æáÞ—‚µµÝž¬Ôv}Þ«݉Û6ü…€%u2þöØmâÕ—¡¥é18‰¥ÄFÕ¿ûLô ‹v)Šb#ÆgibÓÀØÔ…æA–6¦û Ä´1‹‘"å"B÷k??Ü‹X»é³Eéc–êzZÿTá³ápÙ ŸË»ú×!Ù´té™?µ>ÜÎmDH*¦¤Ý€5G³â6bÄ_`À&b¢ªLØbÍËýp¸U[·XÃÚÑ$bŸÑåþnR›ˆOç²ww÷®¢¿í{B7`iÞTÛ"_ËÚÉ“È öŒ‰Kã^8Ë3òDu2¹‚PËüõŒ‚ËÆ)ì?q§F*öTÌJ)ªY’:.C7Q"Æ”N\:„Þa$9Ñ4¨‡¸¹dŽ3BƱ—ã4<Χ‹=æÞÍQ?1Âár¸z&mЍWðæÎ"4¶†’ÐÏ$ðòÉ–X Ž‚…ãVáð¡WÐíÄêù‹Ðg¬FSk»G9sæ5aëà—Ù;:²‚èYÊe>2Ÿ¿ö‰yÛV¡ßÔµ¸ô4ƒƒ1C…w.Zƒ“Õ; "_wÓÜ \]G=Úú›:ßV(íÅ­‚E85ÑñÄLbûÉ÷1hsò™i¦X³$=}=ocó¾v¬Îx éc¹¥Þop¸Éôñ¨Öº„ËQVõ$_BÇoXAº¸Œg§ìû ©&c+ºzí`±… ¾Œmõ º&|sv§f¹öå"뀛.©Ï}æü¢‚`bVÛÕ—­$¯§¡G/ð9.Þ£ï7öçO™Å¨”aØëGàÇòáð±–æîóˆïÅ€Eû÷`£œ›µN­á:½0³ „²HÌLLâ¬öž¼ÏwœJþù*ëUã0Äüô¼¦, ÆUH cø^¶V$’@$pc`ØÊ?ȉ2bro |€õ#(¬ÌÄÌøéèn-á ­G¿]ÄÜç’gÞ•ç¼ú‹ïÄ#®y\½ÀUÃ:ìYá¬L"ø@>ý®\ûqÉ“º¬ù¿À‡»>бÌ5mö̯_2ÞR„¬þÁVÈ<ÝDZ\ÖH(U‚8Z~´bÞ§†Ë‹²õ'9ØÚµŸû¨¤ weÌÄ”1sye”¾¯é«™¯&3,©¢‚,ÑrºŸ_zàŸkägŸ½dšå1ª ‡ùëFøK«‚¼&0/‡¿­«vVç¬@zr"œÞS|ï-~#@kEK¤X÷üù«_<ÁÅ„&ÂLÈjøÁn˜%Œ‘õ ü=ج›D@?W»¹vq&zªQÕe×TuØõ2é_Œ­z"koE 1[f`Å8×pénôöö CðJýìTèÃ'÷`ÙÜõð:öà`u3<#ÅÇÞ@Û˜q¸iöíÄ ®}þšJŸ0JÓÖßé/!c£&ÚØ¼F1$A$«“ÐÑoà½>G„ÿ ï÷}O]êßÕò˜R‘8^·íÔŸ!y!ÉÈó ghЯ¦OÕ¬Bjü“H¶ëlÆ?cìæÙc[_î ]•ÜŠô(>uƒB¿@(?»6%Öâ"ê­Ëë±ôàó“»awºýCÈ=L´’Øè¥ $E¤àZíƒÙ_íúäÜ­×÷mú¸™ž ÛÔ¬¥ní7|Ä…Üt5·o$q##ËÅKY± ,ÔGî…ò²!C,ù±ïÌ,×¾ˆ¾Î£¬.kõåÌ’ÜSÃm/¨Øï^µ’ÜÑÂc'·Wüñ‘§KÂU¹œÙt g+†ŒE8qæ4¼âI¨l•!"f jzå˜7æÆìÞú·Yò©ø›}Që5ñK³wœªDIe+ïB³ü^#¡•Öçò'* xêÃ×ñ«›BjÜ%˜ÝП7!9v>–h—"XÚ ãÀ> õ×s.§-ŸîÙ´¼o¬‚£ýµñ§Ö†R5¡@: ¥Ûóy÷ ï1špüR5V͹›XÅÇè·‰Yü³ä©wÿøKÛ¦kŸP³{±.ðœ˜èjV w›gì¬E’n;ëÊkë3.Ö>²ê¿ ?O™®×ä•ßTªJ W*3'Ù18T‡^c ÔÁurb¿8—àªç{Ó3!:±8‚ÖÙ"Ü® ÇÎ3¥xgﻈTª±|î=˜£©ECÃW¼#÷ÝH –ï yö}y&±ØÿW|.kRi:¶–¾îbzjx/gˆIp°þL1–Oˆ®ÁF4öJ¹[++bÀMÿ¤¿nÖ͆ê–òœ[—½e¨«{²äþ•é>ØûF °!À@D7ˆÅ,YéSj‰'Òzó¼Ù¼¨þ±šJ½Ï'ÒÑ)è Jë oÈ™>_ûA‘J™¨4F®³—Lµ|/P±[ÈwQy‚¼¸qþk°·aoíQD©‚±b"¹vÃtô]ÄG¥ƒøÙ‚;³[j¦hº;¾Ü,„òæG óÂÖ,ãÕ`\Ä¨ÙøY±û±“PÝtœ˜¥Ø_rÀ_¿ëß_ á{ý»ÖvƒKÐŽIÉ÷5C§©}æA¾)}ä% WWµ EGžÁ¾óõbq>Q|ÑÈ¿'Fk5Æ¡h"E˜=nÊèß™XÕ*¤ŽÃzCâ,ª?ŒŠK—@û`2å"ÿTh±ÅŸ¾7ô4¡èÔnÌ›úd^`zÕ^‹5fõ³Í!K»ë¤ò`øß<ýf œ6±"Õ»n»ÃJ‹CÈ[o–áå³¼|A.£'<02ñÆ.+¤ ^Lš»š[ôcÈ·4y2tÛžüà¹Ð¢Ãl¬m+†¾± ÇÚ½8ÞT[Ÿiq 0S£C§y,¼ÂØ<æ¢G†gä½ùM)ŽøEÒú fq&:¯~¢ÔÝ Jìg ^¯¿›âƒ=Ÿ"<ìF0¥—'nÍ%#¦Âúw^@¡þú¼÷!eB”êh4õ‹³™ màÂoþhú)öWwCÖ9z^ÕmFl ÍGø¯ûË p“ÕÒMšÏæ‚ðC®Ø°õ'ÞR”ˈù03°‚aú6’3ïš\µöñ·¬7¼œežMaau£DWzá¬ÑêôÞ’±¶`®ö­’ªöhíÆÏöâŽ×þLï·ñTÁ!”\azÚjLIƒ»ñÃÚ1þöþÙ~´cRÉÏ^Pm¸áé¦=YRÓZ¹96¤;÷ø…“è'v=VNÆÂbÂçß¾‰-GÌPG_›èÝÅ´ë½~Œ’gÞ“_u­ì;43äÿ'Å»I2º[ø¸±˜ž«kt”‚˜ûªòù猎ČqÔ·žDs¿„oýÇïÌ¡_n4¯¹÷†-¹ üØ1Ë«ÿ”¡lÇ w<mJºŸpðǤcÓ‰%R¬œ6¿ºn\®>T7lß´á!G&í`qC™Ô—}¸)Y#‡s…û_)dsYæÎ¸…o¡ôòÆœ8¹ÎI ‹µðU{ßB¸JŒ‰)™HI˜‡”øYX8u%nš£C´ ÄðßCU¯E'‰~´¨Ç¬µÚ.ú»Môd‘núêæëjçŽYI®}ZúŒpYÄ|¾%9"FKŸ?q÷”6īǠ¼þ/˜–ò±ç •"£P¹ù™¬üt(Bÿ²šÈ¥Q#sâ#šÞúç²Kª``ivyÐ8­*Å‚I+®ÁÎÓßÂb·ABiåÌ›qäÒ! X¼HK¼ÆÐf;š„CÍù]þY L”ŽÏT`:ZqøâQî¦%Ÿ{¸³ðŠ™- ª{E¨NÆÍZ$âdʼntîfxÝݰZÎb°÷,ç°õ–·VËeÖWÄ.‹Å/ñÀOáð ØH—eâúàãkÅØÂ‹ã bŠè½Z‹«ü@j¿£íuÎí•I¥QÚænCæëÿµ—ÕŽÑñ<|1*30>Öj'õb×Ù¿cÉ$9ÆÅ/#V:YËq©ù[J.rI1:hÇp'æÕNnUeÄøŒf®%g¼”‘ÛÏÝžaºßbÏ÷âØ¥mô /ÂB–¹´ü"Úzƒ9ïFæä<mR‘“%b6þø…E-ÌfBoî<æI ¾1Ñ ›»O—#ûškÐÓÞXÞnÝ8hå9œÛp^;З»õ%>³¿iåãêµ"ÊÝlïˆÈÆ ˆrèOGe ™9%í—ÆÎŽÏJ ÷üƒ;uñ(†Gê*LÖÉoÏ×ádM3^øù|,ž&FYcÚÅYcŸP¯ûDß®%C¦S+¼X65"÷þ¬âML>:üœ®g®©áL €Î»ºö8>u&kZ~Áé’ùŒø+~•oç.¡¯¹¯ýÂ6ºÞ.,+8X[“=âb³5ä0Êx©&{mpù3¾¦€û¨&/& ÷-›‹ŠúC°9,ÅÏáGÅDXÍå—۷䄪ÇülÁJܹdÚûX=¤ƒî·š¨`bÀ­8si7†,=L€"7PèÇ@°œ ŽF7U—o²´ê«[Ne­™•»ljÆ:Ý”|M·ÉÊÇüRbçbxøj ň ›ƒ]çöÓ}5òïÓÞ‹T…`Jâd¨ƒ0;ãqæèWˆâúŠo\ø‡¬ªºRB†ü£gU‰˜3fº{ËÈÕ®DW¯ŒoÐf™š8ùýuy?õ¿5 %•DŒˆà0”U¿ ‘#‰‘KÑ-©€ÑÖH…ü,6®Pˆ?>ÿ’ŸA’rÞ4à„Áé2ñ®ëNÚl­{0{üTüú–èFFã“’$D*Ðoòaròtô›ûÐÖ}½fº¡L‰–ÒÃ4ïXmk“2‹ù¾ÛKM'1)qæºuo6?fÕ¬v~XÔüluØd̰7B¡i;-˜Ý|Ëæ1±‹‘15ãÈ}êjß“©1‹‹¾-k°ípNhÂÉÂÛóT\i­gõ’T3mä~b¬p¢æ_·È•F( à­:«ia¨Éa7º¯jÙbãô^¯Owósà¶½44úÀãž0Z?Ø>`nY3wÚ“#?× óƒãavó¬—¯Ð}8E† -1“܉©ØyòËìùÓ~…g>E÷@‹¿ ŽÀ.„€©Oó '@´ÌH+ƒ”p^üê%(é¸ê`/âÉb·vKPÛ,%Vò1¾>¼‡\X7VMu`áX‡f_þ¯‡Ÿ<(:;Øç°H/dÎ +R¸qÎ/!rž­(.;©¥-þ…nž64bžÆã5£¬¡Œb51B•^>ÇP‚õìzLelÜbÚ(Ãmùz̘2ñœ¯}ãkÅ™"uî-3Ì%‘¡ \JÂõØøÅ'þ!èÆÌ2etœ.ò‡YÆì­GßG͹;át3‰5|?›úlHÉšÙcuÕ 5WLO²ëC”Ý?ý§GjÖšæM½E³¥ô›ÑðB¬25‹°`Ɠؼõ7L cã“0lÄ™º&ôšl£òêþGN>¦Ä‡Å:‹ÿ™çÝó4<Ö=¨lq¡¯£6™—LÔÞ#Fï ˆ/†eÏtÚX-½fݧYAô¦+Ù5})ˆN\ŠNË\<ýÁ;üÏCésÉõ¾cÑ8Yþ)Ÿùè S±(=GË?ÂÙfÁÆÊVSš6&D¹9Ú\ÆËB…†ñ9³U˜?Ò2È4!þX-ÿÚôÀªu…úî\Ã9LRûLk¬Ë.@/­ ¦€2òZ2%?Ë‹Ÿèõ}_©–H,9TAdö ÌÒÄb¢jõL8]×B÷ÒI?%O%ÑÁý†iQœH$â‚T‘V…2d!y+Ã0ô™Éû±áb[- JC[ÛvZ«²5´µVÓzÎ UäJ®Áòé3QÛVI쬗âOĘh1 “hh;Çf0cÍÕÆKüÔ‹±×+bÚú7ö„æ …>-M3¯ÝlDhÄ’õ[Ïvç Z ™F»°Èér„¯›4¬„€t2©œ¼,¿julÜ/ñ±>ŸOJ‰Y_8+w È‹%Yˆ”¤EdÏÑzWchЀ®¡Ò »[¨±æ×w8‹KJƒ ¦¤­Ï~ù«÷ávó¡+‘ÐßÉ‹[çgâÌÅ­´n̈ OBJÔLØm–ŠÚ–=ÿ2ÉüàÝ¿›rÃÜÉ·äY½øöâ ?øÙýmB,IÁbu™nrôY#7”Mš†ÝuzEØó™ôКbbhþê¾<Ê*mûž’éÉ̤÷LH!H†Þ! 6j°·• »º–°¬îº±mq°ëºÔE"REz $C IH›ôžLI2“©ÿsÎ; ê¶o¿²×þ¹’™·œ÷œû¹ïç<¥øbšz„nb!4@qZ‹Ú‡Ó)A½U‚Vb&w/\ƒÑÚí 5ùƒæÏ5õà\Å’Ç t|? Ñs1:.)úKP)çÂã ‡ßmF¤V‹h­¬ñ6 `רÑ#å±a¬l“¢rV8”ŽÁzR𸨠Zú½_àP–ˆî;óÅ„Üì~‹D"­÷z=˜8f)]s0 ¾ûj$·™4¡eJ†“Óçáî9‰h¨y›mªüUìÒ'CŠBÕÞœç︿ÛQˆ!k“1oL(ÙYó˶öŽ?h¥™‘¶C"‹²ê=˜`˜€éY¿Á‰ Ž_üaÁbÜ>oÜ®V8ë¬MÅ‘ò‹Øz¨–(ÈEðFE@›C„èÐD€†¾^\h8^üäí®ù,Ð|Ú¸UõbäÇ«Ý8aÚ 3À!ᘜ:…¤o,J*¶¢¹Û ‡S i0—Ölèh„ÊÃL­‡þW@ðÿ J¹¦~æ¸%hémÂw•%3#YʢШø;Â<µ‹ØXš33gšÞøúfÌgèsˆ“’Sq¾¡ ÉLÇ«žôõB£ BlˆŸŸ¨F†a1æ&™w¦Ï®èªU?iÊê Õu:±,ƒ{$üîK¨¨ýGk[àrÊè³NT>Ô¶Äõó ¹Œ51't[¿˜/"}ˆo„½)‡$B •ÔÇÿ–ŠÇW¼„ FrÒ"”×þÉ4)5ºTc°:rY8´jNVcëáýäleú@_ýÙoÑZÿœÉ1`žÿã]e·¼C•ë;,.Ý«?É‚GvÞÝ»‰¬V[å>¬\¸ é1„*ÍŠû[× §m}ô%Ö„G­×'aLÊøÓ¾OPRuš@?Íö„hbðà’GÒDÀ»š „EÎ Y8§«Ý!:Rc≉ËÐÞ´GËOãl‹ w°‹M÷êŒÂ™V l4nú/>}êU\2ýlÕ÷›*20Ì΄Ùvž)øÃÈ}F)‰ KiliRWôýpïmÏsËp©ñ4ªª°ëœÆDÒ—1;Ë»Œ‹÷ëÃà—éY‘éÉ ×x³#"rtJÍ$Ä£²ÿ™§¼–ûÖîË(.ÙÊÏÉ@—•K¥çk‘&á–Ù·cß©­Ð»S<;ù‚%"î¦ÜÇ >A7±\ÖD=ˆ€0B'Áše9°ÛËÐc©ŸÀül·=Ì6ª éžü ‰?gH޶>Ä/Ľ±|n¦XØwv{Ñx¹Ý_•~2C« öqÖc± RG‹•+?YIv¤‡+Ž q¬ø¯‚oá€lÖ™¿ŸçξΗE'Ým”ûK¸mÛwv¶}±jüXß@ 'OGÛwA6‹÷ͳãêÙïâþÏ 6r24 -Ž]ÜYcðÐ’Åhh;‹Ú¦ƒÅŸÐŽ}ºqZÖüþóq©IH8ײòQ4V®ÀcÍ¿ûD*£©¶€7G—‘3ݳŽ´¢áŠ=þ‘/z¼/Ó}nŒ¶Ç{eSíƒ$¨‹ƒIP3"/¡Fs0I-Säõ8 %èq7ó½6I%þS“œæPO[Ì–© ¡Ú4ˆÄrH%Á–`õ¨sííïgdžçÊä:–áC ºŸ.ÍA†Ëfù‡6r×A aQóËŽ6q²ä°Pæ11Y¼_³WÞ‰ãRÖ­ß}teŒVfxô†ûp®zÚ{/ÁëBY“¨ qÉÒï#9_ÊÆÝpÙx¹·1) 1o|DÎmæ“•ß®ÝW´#òÅù+‡x|OgAÑÖÃoå\n¹Ä¾àCd.1µÀ Y?D¸9‹òŽyü§TŠpu"lÎVšÓŽM¿Èõ¬úÀH%Ayi ™ôàÇ¢¹Ç ö€YÃk¬©5­M!ªß^|ÔôÛÈNÈJÝçE‡(1&a1ÌdA¬· !i8Ê™­QÌ;£Â¦¾5± ‚ù…¿³ýUìÕÂ5¼ec‘Lâ7?~ã4ÝñÚR!z>bôÙ()ß s÷y\?íAb‡V¢EbuÑtyl‘ø†=³j¬œ•OË8ˆ”˜ŒK^„÷öŸ@ESÃH~n8ó°«£±þÞ;±ýðÛ›r'’"b l2Q^½uÝô©=¾Ü@!ƒ\¦D¨6Áô¹×¿®AKÏ ^º9âWþ·À¯ø-ÞÙñk.Ugƃ‹f‚õ¾xYp{Íšø0Š/4áËãûFî혳p—Þ@†>‹»ÛðÀG¨¿|'¬=•D×—ª‚Ý)6í8«4î=¯Äúû²ð]Ëœp]ÙBõ_hˆ1µJù5Å„øV¾jý>ôKe ¢Háá·Iö\@7;àæÃÅ1?VŠ–y@R¿öÓy$Åê ÜM )¶‚N›ÿç'&°¿M¾7”ƒsYæÍÂÒ9³ ÖÝŽ]'ãÐù}ĶûÂ#4xöÎ?` ý9xÃ=˜™î@\¨q‘¤6ô)PÊõ0wµ µÏN2}–:„©RÐi=‡§ä°8D†ÎCLøbÚåp î†ØSc¶Z7ËCŸÏ_·ù^_‘}± ;VûÖ9ÓHæÚt¦Q‘—™ÙHŒGãêÆGÅ{À ý¦éShÝ*hi\<4§Æ’KÌPŸ‡%7|gëmâíÚÀXë¯þ¤`;Ëì¹­X·jˆ»nêÌïøÿÅãQû,÷B§ðBÖe/š1"ôööÒxøn°Rãzkðlú:zlu‘Hmªh=FêòÒæ¥s›6ýoàÿzct´U›·»*̦Õõ­U:]p8Ï—±ÜEzY­mèiù‚¥Œ åÔ}˜Ò2p0ß4yÌÚ–®ù Ç^oüóÁýðÉf›!1"1ôdJÊcî­¿±<´l¦åo-ùeHò×°ý€Ü`)¾=?Ù’.2èåÍÅK&ܳãô\¬ÛV?IñCÇßAsòKy&úÙ5ž–‹Eê6BXÑM:gr˜‹&¢Q¡Sð«w`À9(0*âŠí¨Ú{ÛÑÐ+'æ@“6,Mu/@¦ÂRÒÀ+Ž0ðcÀ·F¥FRÜDé3éaèÐnqøºe…Œ§ ÕsçgŦ=$!áì¥Ý8|±Îv.ž€ñ£áBÕn´uÖà@ÙIn1G²rè8Q¬%1W ‹ù³6⛲£˜–|Ý0‰µ¤®¥ÞÊ›Y)J¤Ç_ƒME‡ÑÓoÿ~ÐøÈ—[áÃŒÌdŸ3£¹O²~â=¡¦Ò{GŒX,!¶“ŒŠ†wxg¸P¹­ó:â%…øÑ甕b!=C®Á@Þ°h5gHV…²l~KÇ;°bþÕЄþ¾|žgQ > áéqõãÅ­Oà•{^"9ÿ&ÚÌ;$û“ãbiÞi° -’Ø•rE’iÈ«6~R\‰ÓU=ظk±ÈnŒTb$ðc‹]/ctóÇ¥!!Ô‚žÞº$ƒ¹!û |Κ½•}H~ttH ”$ü¾øçhE‘„' òrwKek Ér ‰»^Ç‚ï2yžÓ=T0!FN,.aš‹Øö¼ç?3?çÄdçŽYé]\T*Râ& »p´âª;Úèg ÂxÃRÌ· ¦Ú±pâ͈Tcsчè,å·’?sÇç!9¼Ó íÎÿîü.î—fj†s`ÅBÔ*Äë±¥^‘ÇÜ›‰‘ðŠbñÖÞ½¤àz…yEŸùÓ·ÅüÞÆÅÇbjñ¥—ŸFe‡“ÈL=ëBn1ýr%X`8‹ß4²5Ög&æê7”y»KvBAë+QåFl„£â2è³tÚ-´fOŠönû #iÌÚëî=¾šîÙùS[ÿâðEÀ¶,èr»Ëa”Š`ë÷"&ò:k2HÆŽ¦AmÝr,§·ëxYIQýŠÎ«ØDg`¸)Óx”YŒÇ›·zéÕ%õ‘(.Ù QÀ!™?™÷²Äâ§kPOãÄ. ¦þ«\ÔöÞ¾µjµ;»¸:yM\HVL]‚ç¾C—ÏN°ÉQ³6‘þ@¥/ W \rðó ÙZ¥‰¡~LLŸ…× M|2ŠEBÙW<ÛE TjÖÅáÚì4Ô½W,r[׆j’wŒŽëe…XÚ¨ðD¤%LB{ŸŸ—ÂT_ ‘@§$÷££¯‰Î!”¼*»|krŸD%];ÿ»s­<÷K' >šØ%ºL¢$™.ahzÒ–@5a=Mj+}nßé÷1/óW)CàrØrØfŰ©ÊM¯3åû‘šhÄcËã|C7Éâ.ôØíü "FaBê<èU"KyÃëÅí½]¹ê1Nøž† ƒ BMF¯wЊQÄôší"Dkü¼E†ÞÇëÀu \QYÉQ0UŸ“É!µ*ëî0š~æóÓÍJ "õžýèQ4´_  gàÇj×Ò³t~väsÜ6÷.)©€Þ;°ÎíªFEgú$Ú_ßõÆÆú޶‚Ÿ¾ú®%ïª _‰ŠÆVZìx*’å !’ ^ÞÈùBÕâZ8|tçäߺCÍ%—Z 'Ê妆H˱á>DGz¸OŒ5jÊLˆE›Å‚n ˜G±G3]ôºŒ˜œ(•Ír팧ŒÏ|üïÙqçóÝ5™ý©¸o=¯ŽŽï.Táøåj¡]«'™‘¾˜Æ°ß–¾ˆéižŠwvÿ.»”Wðf_m ÇPÐzY£®Æ ÓnÃè¤^|w¶ían$EF`ɤb‘6D„¦£ËzÍõøÆTÌÏÃÎ'ò Õ¶Ù=²¶›ZQÞÜ £! 7Ãá;M½€¤q#.4Õ=!ZÝ5 1”Ô—qß'Í©åoP]n¬nìª&&<A’VŒN˜ˆ‹ÍÕ(¾¼Sh–E÷o0Ì&f™ ™}™j2±†ä/ÛèÍßRXºüŽåÎ ÿ_ óOɂƴø±‹ZCVÐ…S—?GMóV¾àXœ]lX&zL]WmþØÜj`zóðfÎíÞtètÇú)1t³ïzWßUŠ,-kõº &²ôɵô˜Š®\ûÜÞ?Z`!ŠÞ°lb«ç•Í•‡êÚÅ£¢StyóoÅ‘KÅ8ZYÃ,2-1±>ÁʱæG¹"/?…Hñ‘\0 ¾£—ǰyTir$+€f§cÆB]”´€¶™.á`¹:t,À–iÉÎwÕhªœªjä`* dmtÙl#õÿØ÷ƒ¦d"03s4Úºª7„cµJQQ"ÑH‘ÞÌòLe4qY®^šXA2ÀáL—â@nª‘A ;v—ÍoòÖŸ1¶uÕƒIÁ5ÙéÑ$C"ÑÁIV¿ÏÞŒ®îÏŠ¿¼pjU†!Yç÷‡æ´v÷ ¬ÖŸÿ¨‡mX˜X v¿ßIc6¾+݃z’†côþ¸ ­1¾—†–3>…îÓEF²í6)»žŸ<Óoÿy= cb˜÷Ìuø-Æ®ÓGÐÔqž/à`º7­(ಀ¤`Ym)n™} ôº4Ÿ IÄÚVÝõ‚œÉý|‰ægfK÷_HbFcíûå˜5.Š "eud ]ˆ×»¡aݘæõòïV{…0Ʃ𶰋Ÿ?®d®ˆƒg<^½¤øÌ:L‚\£­Ä.;úœ¦!ÜÆSF .nvÿV;”Ì'„™TV ‹˜ß(¿qøówGH!ôŽÌ)Íѱ£– }¨½çøïgŒ¾O}‚Áî ¸I^²Íª‘ØBz]¬ÿµ-‡±6÷U<~Ç#hé®B:D,«=gvº¤‹ÎiÕ­+»¬0tu6òföÜŸIó•ûï•p¿%?–Ü'†‚þx©®…Xï,›r Ž}—Ú]dð”:ëÀè_èÉ=äYXGGšËN±%-¼Ù$Æ`ΨØ(,;Hò܉LÄýSÓžE—÷;œ«}sÇäÁN’¾¸ô4¯G(¦ñ͈IÀ„ŒÅÆo׬¿zî¹µÿÑÈâÀdrmNtâµ°xà­Ý/¡×ÒÈûʲ Ã: T7¹í0ÎVø±tÊ D„h Z¥‘ÊöÜÁOf"diêkÑNen2ÿ~³à·À&MÜ‹EPÆŠ%á/~BˤCþµjwîÍúWþÀ'VzXå˜âËû †\¹óÆ-Dvb2>?aÂåÖ^ø<¬‘ÿ ð)dJ,Ÿgÿì1øÃ—&ž¯ÉÒÈØG’ü*‰Å¨:mìb¸'1*Ò·Ê:S]å¼²ÚJ’—âü}UØ{¡ ItÚz™Ëƒ¥ñ‰ÊB#t´&%º Pjq¼²Œƒš… Ñê>UyÖ!!5j¸¯Ç[{Ê1=#qQéôùsЩ|<|§ƒ.<„ _`4¬€V$ýÐI÷Öm5C)–þ ŸˆHÇî—]ÏÑZåÚeYý ŒVÒ+·¦±d$mÏå×tÉ,µÝldõ@ –͘mþèÀI”5™w…Ò  ^B΄«qðÌ´÷[&v4>‡¯ªÿúü·åLF·¥šKàV o$¿qìa,Í.OEcðËëmPjÂá—ÌÆÓOðŒzj}߉ò{Ù<=‘§§Øgº*ó¶º×žãMéù.©Ãí3µõ:x3®£;q×Âp,›3ƒWMŽ Câ¦1¤gà€ÛÓG÷Ý‹ÎÞ*l#ÉüÕ)‘¡¯_¼fØÇgˆeÆÑ˨óttmÙ1nþ’Óïz»J¡×ÐsŠÎ2*U£èyÑßê–6<³ù5œ­éÆ ³o‡×µ² îõ‘º8]ÿ`;Rãgœ=MÒ¹·4eSŒ[¤Ê'Í•¶ÁD†è ’‡ èb+̽RˆúÄ<¤‹³7ÆhB…uX8 OlÃà`»;Șu³Òi¦þ!™E$:ha›ôÊëg%À$B#,¡œ) ¯˜ûê†èüã³î$ÀnDlÔx ¸,Øuf/2ãÇ@Ót£oÂЗéžÙù™¯”¹´‡DV–Ö¬p[ƮŽ3»Èà ±Ø*}Âp¡cµé±™ò}8pü|* °ØÞ˵-hêm# ž½foQVáõóÏÿG “VRYðúXÃrÔõDblj5¹Ø®ªÐ (\ª„.2=ýÕPY ›ˆ3æzÄè’,GrTl>ËUìì«Em[úÅhˆ1Œ{ÏJ÷Й^×y]Dêo˜yç÷¢ÀX:V^`saþßñK²µ²b[aiž­¿©`trnœ1 ¿Ý¾——ŽêDëCˆÅ)‘3 “Ó²èšqÄÄ2 äÄþ¬b"d¨ý¨#SÏ$N"Xåóu Ý›ÉÜ,Ê`s*ê½’,¯hD]»…KØ@›O¾pX†ÁÔä!\+–D¢¦ÍÅÁ®›,cv¨íFÊñ‡ hôà›²vÌËN@]Ó9H¶]f±Xj"v±d×HU ‰!– ÜëžJÅú•/I7³¤ú"¡á÷W±E³)f…fL1;°a’Øô±Æ¿Ðîè3Ùœ†€¢`ÇYÕü“WZzOæÏãñ…,®¦WÌípeëá¯Æ1—Ž“¾$†/F}Où\[n~ìœ7«¿˜diŽœ C]{7o4F7ÙKÁÊî†Ò³óHil¢+ŽÊª–*LOÕâëéÂŽåÙ嫾, ÖÝšl¸P_¶®¹«wÇðmlxÚ¬^l?qÙÉ ÄdÚÐÖÛæ>'fdŒFwŸï~ÝN ØÜð#+iwæ„`ZÖcRÝ$q[á¨E˜¤ÄÂ$R‚C Ðê'èÍÀùê³8WV…ö¾³8o¦ùÍ2cèX‹gÜc—Ž!調$»aèîü‰±cPÞØêöVÎÆX[LÖφePYmè¾l†Œ˜˜GåE´Vþþ*:?˜±X‹d`Ž´¡@ž|S»§6Ñ3N‰ ÃÏ®} I£Ñçn²ˆÄÁ Ï}^bhëmÂìqW“Áý†ç´³M K ¥)»çúáÜù¿`€Ž{¾ù0Ÿ+ÙiKHYôB¢Sà›sŸ@«’ÒýÒì÷rƒm&•µ–ÞWϪ…gfê»ûàt;!b»¾ÎîÞ tà<$ô³LÏÚ;ÌÅ7ß µÌ%2|´&£³ø¸GÇŽƒÛmÁ ¯tý].ÿA$Ó­‰M¼A×ÔÕ§¶ No–¨ìÒæ„ØÖ„ÜI7£¤¹>Q0Ƨ.ƾ/Ã9håÎY£!“’“ˆÝhaqGãøå½†ZÃØø)ë“Ã&£§©Üìs_.†¯åæš÷¼b5_÷˜v£ÛW¯Ñæ}³Áºé§ uYΖ^–¬‹“ÄVå„Q‰X4i<±.6’ë…hí(‡LŽÆ®AÎÊBh´f[ŒÒŠÝ<|Ãèl÷Èͯ Lö1ªÍ\1fLR*Òâ3Ð7ÐAãcçÁ±,T‚…<0ðuÒç3‰1ˆÄ,&L‹–ž®¦w¡GŒÌP??W ÷I º.oÃõS'òЇõ ÜÝè±àë`^IX N¿°0ô ,ÍÂÆFm”5œç Ãv*;û„&â¬ÁÏk¸Döù¿WÇO/6Ò÷â-ùWPýÜog}[øÖñï‹3ªÕ€+ì–Ú"}Ø6Ý|ãD|t ‰ß ïï1œL¯1 qXw÷hhßG2³§ëUp8EéÞvõL°vê(¯E(‘¨h\úÁ áp#‹½‹Õ¤Ÿd@9%?1¸«&ÏÅ¥&qN¯klÙDÃI”ÔYr—ÿzK1S"¢@Õå-ßîÆÝWûpÛÜ%øå»а0=ædF@dCi[BÕv4wË‘®Æs?I%ÅÒ„ÆÖJ˜ÊŸB¸~œ%%)¤¡?/Óñ‰‹‰@\Àå^'|jáw¬|C-±ÞÎÁ£ˆKEo_·ñ­Ï%Ï=t³÷¹ÿ(dUS"b–æ[n|]vd„åø¿çdW±d÷àË£Û°òúûðÅ©/°³v®›üÔ¨\ì3¡´® %µMX•3‘ßü¤ô_àÈ…PÛÑHÒQ†I©7²’nÊó9 òºj.­ ôá,Ð/¤ïlú'9“¬”½©³§>?A+Ík·(øï[º*Qr©šû¢†‹8Ü¢MaŠ 5ZL3nùÄE8ÔÐÈÆåîmáœ_`²áâì(•¯àUΘ6¿óØ cRób"²ˆ=6ÃÜÕÍcY@‹óÂÛ/•À0VG2J¦@iÍeh‰Æ1ÙËÀñl§ˆo0Ð %K_">SÝÆw5¥¸<8²cÇŽ4Œ5ˆ„Í&c&‘¥rž…{¨Ÿ;–aˆX°îðs øé˜ta.ÓÖ|ûIjX®óû¹ëbÍmo‡~ú`÷ü¶¦/‹Vç>¥ Vªðú—[¡’^iä4-#¯?œ‡Îž¨¬ÛO*@aé°IP^+[H}+®ý¼{~.ìü±ß¹d.#ÿH #ó‹#aÝëXþµmD ³M$9;Ðe £ùS£ûù¢ÉwnåÙ‹6K+‚@}›å-ýHø/Üs76ì8Š9É‹ðÌGÀÌ1QX½b)n[ЊòºÃ6dćƒUÕ–Jäœ}w÷]ܤò\4[ËUjBk¸{Î&àý¯ž…ÄgáÏq8v0VM$€ ¿_Ýñ^ú˯¹MãØÅn$ꃉÉÅ¡ºõË@¯S\)Åä; ñ•N†Øk1Øó¡ª,M‘ÀNîÃMÀ×Oò’åäØå¢ó1Ü M¸ ,°›¼@ˆ‚´°Ë’Pݼ—×TÊdxö'OaTøIØz wš$¬H%“ƒy¬Ç©ŠÉŒé4Ê0|~ì0gâ€s™åQ²:m`;¿ÁBœÇ=ˆ‰éÓè\[M¿ïuˆF˜ ÏÈ€°1òýþ b±œÏ|>ÿ‡Ydj»ÎñÝ;Öô›û'ÓH Ú³¢¦¨ïUl’Ký…,ÄÐ7пÙ> Î÷:•‘ Þüç§úÿå*¼ÕŸu[FݾvX ßüfÄ„ý¿ÿMq“ùc㪅w¦Žùžÿðˆ aõ · wÖ$\¬þJ«vár»bmu‡l}G¯„ÅÙ‘Ôö[hxWŒ°ÏÂßÇýPËŸ-«Ì„o<jë±/µÔNÆ2_8CXŽeÇâå­'°íé…Æû¯ßWðÌÇð•*UBäjÇ«÷KÐc©Áî“{qÏõ÷ãƒÝïÁTû%ž¼9ó'Ý‚úÖ38S±9Ù×#>r \î!R •k˜T•)‚“”‡OkñnáóHÖú`ñˆFÂcƆùÐ`ó°§ï| |ùkȼV$&èÈ€80@ Y!×ó^̓.çȦ³¡ÄælÊ+ÉÌl3D–HÌÔ‡ºÆ~|ö~/­„ÜE ȆŒNYG!&FgâB“™~×?Òk„±©¤H·Éïõ0·ÑpY:È[·ÊkÉ›7Z’3Z/7°Ö›"°h¿Yä³ìü㺠ÍÒœ0×’åÒiU>‹^åeëmscŸr%]GÞòé?ÍrûqàÒG˜™1³³rì ð3wËf)tll@Õú‹¦=Ÿã-ŒI6ÿ~°Â(É1S§×@'=M†¯{ƒÃò»uÿ[iÿc¼PýÓܦ¶²Õ¡ê8cLhŒN*‹ÇùÆã8qù(i|·à³¢û O€Çn#ykC?=@fí¤Çöž*d¥MáÇ“Ó`—¾Å©;›á>² –þFD…„ÁÜF Œ*Kù²ô6rz̪¶l;ð(–Íý%”Þ³ë·6èú½c8K ö¯_w›5ë‘ÛÑ}~x±nk;ÔŒ›á]/pV^m—ló‹q«r× d½ƒõrº`–J£ ÆÌÆ®[ù=,™6·Ï›L÷ò…Å7p|]òX¡ ÀÃxåÖ!}>G&G¯½=½¼»VH³§>ˆSæ¯ÐÅB9eŸ¸$p;h\xøHÇ ‰?êÂ,›af¬G›¥B‹Lt¬"»H複€S^OçPÒçÙØ»ý¢ˆ Ý,9…òÆ>ì8¦Fu‡2oA¶Ñ’•š1?÷ª7M‘‹•ùà Ü4h}Ï ÒÞÿ/Wߨû¢{gÒ ;Yk‚•WçÔGèâ6jŸ¹JÔø'cfÂùkny gêèPtõ•š‹N¯->RÕ˜ÓfUšH~¯d;òÍÒÀ†‹hUãŽ.þœ¦ÌÇNV…Z$–ëôª¡PPи1–ëc$ÒÖ24JÙ†ƒçBaµ9‰©;‘âƒmЃ7 Ïá§×ŽÁÑòsØwV%øôüBJZ]‹”#«FRV{SÆÌÂÔäTµ6áéÎã–9}X½|‚‚$8yi7¦d\C lL6ö!265Wá­/ïæ›\,Ó¥Î"ÙŽŒpÿüë°{ÿSp8ìôœEXžA×-…!r=I;½Wùƒqe ¡¯3ž¬·µ‡dñZŸ“á@Z¬ݵUü~{vÅ£w^I{sÍ fýÅFÛ)ÌÒFëNW_â3XŸ€ë§?mGž€ÓiEˆO‹Ì;"§E.\Îs˜g\ŒÂ#[a ‘¦ó¡ªWÌûX|k–òM—a×\Z\ ïëát VrJ]tÑaÚDDZ½ˆÑÉ`5í^ø¬… ííøýÏî…rhÓº¬M gÎþX*»Îg 6ô5O[«?eúWç-pÆs öë>ÜW¼¹¥°+Ð úþâ¸å,*iýÎ|ß+j;i_¿CÌz}ë[‚†åñNúûÙûN—Ã’Ü+ #Î4WzIM$j °õ›ùBsIv˜“<„Ȩ)xêÓfÞAÏ ÷ât]3eûêd;½!K¦”`O‰šß¯B&œ˜±)‘ȃ>$ö÷ÛUcpïïÑM’ìÓCMpøðôí™èèBYu1¦Œ]ŒØ°d x¡Õ߉·6¿Ç?KǪè ì±UšòÖ²qkjÛM<£†çÜË…äkøÙ¡/0}ô8Ü8eBCx4ÈãÜö'vŠ|]k…Üeó†SÔ‘¯ÿVEh»­Ë|¬ªÂµS!H‹«Ç›RQTŸˆ&ç=P†Ü€Ìt9®Ï˜íL±ÆA쥒 “În¿Œñ£– aôpí$™´ñ HÑÑWCD,‚$2¾Î>áÒ{ ¦É8ØëÆ9S &ÄfàîOÃ#¶cŒa)2S~Aà܈½eÅØ¸g ¾8¾›€ª™É319s1TÊtõ9âë¶~w>¯É €®Ër¯Ûx—7?sÔ”5}¶´·ŸÇïï}ª & ‰f#-ù·X{Ó±åk|ÞX=¸W²Z•ˆ†®f$,;é!|üí}XV~vyÀŸC¯&›„$œ¶¾£¸oéí|Õö‰ÑÃb¤b¼|±Vo r3û>9=N†ÈØè‚ã¸ÄÖ{ âƳpÝ”»Px¢ÿé4êx4÷ØqÕ´Ä·˜³f´qÆÚ]ë T®f2üÙÎüg;tÞE4¡ÿê¼hÚÙe¦ãm\gÁÁ‘ÿÎøóWUÌ´†Yÿ ØØÒÄéo’â+ÏskÈBŒ7‚äc¿OV¤B­Áø¸9<Z$Êï32„’,vEuc- Éa¢OåÍÐ+diµIÑ*„…éVl+„®’\)È`’ Û‘Kå<ïy¸€GáÉl:ЈäØñ$N4µ—óZup2:­jœ(?æóbŒÝæs·Ef¸¢¼8X/á 84¼yÆÊŠÑÅÆ„éÄ„àÙ’oyYùŒø,^޹Iú$^¢À©P„†ÂI`=*n.©GÐÞüˆ•æˆËrüÂ'PIJqõV_3 O-]D`÷ÍXûÞh4YЪÃPÓ\ŠÝÇß+Þ~B¬kè *»jµ®ïêµÚ"–¾Ç0Ðá5,}2Äø#Ðˣ׎½|ô„²±)ËŠ&޹»hüèŸ%$ÜSÿù©þ7¶JýŸ—Jˆ\•ô üÕË8³¶³bv)°©{oçßݽ÷z7ºÝ¾œä=º…–iá!¸ÔÏ*šAÁ¹“' !BÇ;ä±â¢¬šËèp/‚I†ô>^ÀÐØÄh»ó$Get1™“]QÑ“•Dä'×öŠ1=®›»'|>ékc_»O÷`ñÔD´w›¹ "HLÏ«éJ>0=¦HZðeí$F¶²M­`™61g‰±Z\?%æŽKÄi½ød V!.j)zz`JÚD¼»§Ø½ &L†H¾îBÔV!æÇ#vÆÇÑ5+&çâalør?™~ÏÙ°ŽÎÃÊ–±Ýæ«'.›…¿Çk?»Uf˜¿eÞèùºù™à‚@Å|æ‰ÖyæÍíÈ FZÂdÿ |}¦çyšœ’Öi\L6&½“XÜ‹ˆÕãÖ9k°iÿ³èvêð«»>ÀS(òÊŠGicà°‚òúø¦DBÊÅÁs›ÇÆM2nÞ~ÐðãµCÀf ñœïëóÄÒdR˜“èÙDóJ7"o < zcéø>2p6œª* –é·üÛU)>c %``Mß‚—e3„%2¯E¨-æEÎÕmÇTØ"Ç_ŽTÐÏ:Ô7|G’ËH%,=í‡uÓÓ¦“exß}‹[m+=DVn»©™]ÞdŽš†”¨ëq¶®uõÜOÃ*7K]b\5åi 9σùü:l6,»óĘI’sùë#›,¬MåÖcÇpë¬yHMœ‚óUßãucc¯4`E¦ë³\+æŽöùåsüVàƒÝËø†‹†…/XªùV¬Â!ÁZO¥µ±xò]ºÔ„ëhíû« ìóõEÔ)Ш†p÷ÒÇÉÄÃ1ØH À·» NG%ºšŽÒõwè)gë­E³øY¬½á—ˆÑ߇۷Xô£ž$±žsÎä«òê-&•Ü?õËšp­(Lò´vzqÏú3Ä…\⫳Çâ«S'øÂ€¤©8AãtƒS±yÿ]ô>ÅH>0“BY£ÂÑÞ7,ǾS%¸÷ú™†k§,[#U­ ënÍ÷¸kÐe®¥ƒµ›àïgei6ýX°&FôŒx ØåYAb´‡§Á1Ð;_-Gvú yáŽòÀÁ?Ko*rt›ÑóqOŽF–A‹üÍß"ƒ–Ê’IYÈ5Õ äDÆhÉ`=N/ÀâÚ : AR ;%ßœ@S— Ã±Ž“’™a"à ‰UììaO• Sã=<(X# rÓŸOVtâîkX´ÓaœonÇ´”DbXáBÓs•N²â¥mÒ@¾²$ ßëû‘çDb|vÔ7ŸÁ /·Î½S¯&é¾j¹On;k§çáÃ=ïáð…($k^G/x×]L{!FŸ"gýñš%xsû³“öÑùÅ‘&#ðPÇ3®Ç–½¿#r D°’ûì øN6©\ƒïyÅZÌBÄXý}HÆ&ωÊ&|sñ‚‹,\Yq¡4ÞwàkZgì÷×F’ü£MUÎCkrŸ,Ø~ø!X,j132EVÆQ$è?Á·e‰8U}£¢GÿÕ51׋W^¤Ô®Õõ % ¦½˜”ÖiôÙÏqwG°"¯´ §§Ÿ˜øÕûôð8¬¦r ÙtxÓ̱×ç÷è%¶š™R„×)T‡…ÞÅûuˆÈÊZ†âPxümz0böáL‚Íê ˜<.G}Sõ+ºœô{1oü~Û…ÒË;J;48cS³PY÷šI¥¨1Î=ËX£A&g‚5mç±K»,úʼä¨4»\ ‰[Ìë”_xr¯˜W3öŠÆÈØ%k¹ùÔ · "´ñý-hè†`k¾}ÂëD³Ý’$ƒR½ ï}•‹!·••²îÒèÔ)ƒSëáÍ[†*šŽÑCHÍ!˜óãòõ<>+ÈŽŸ]óZÞ4_ª+aÒ¦ê^©±ß-ZÏ|{*©Ï”¬ó—u/愯ûb¾£ÿñ¼ë³—à' ßÂåf-ºrþ†[s¦à•-/˜eqUóÙfζBïêèðQ‰Ãq÷«‡Hžy1œÛ+Vgáèù/ø¢ì")ØÚ3ˆÔpŸÎ/šŽý%oÒ‚À/°3ß-Åm³Ãðöú}xñþðô{ÏâtÕ~:Þ~L­Gf’™†HÌÌ~Qº£sð[£ÈS—ßUÃÙsd[y]e `\¿ëˆ½V1Úº%8q^aêwˆXÁ C5ÞÙ+tð Óz-Kçš7îÿ'ÒÚkEtH?nš6‘¤ür¬yçÏ’˜–q†0Uí@ŸÍ¼!1º!Ûö¼'n¿~ÿ÷W»É(  vïu³è=åøü¨†—¹޳Ӓzðù,œ3éEE—d8ÆAô ÔBA_¡B˜„€F/¬ƒÎNŒ·b¬!…6QëCI‹ô{ ŽD?èûÁ>ýÒÊiˆ ¡¼î8ÿwrbŽ\x•å_bÚ¾¤ë³õÑ0žçÇ,2™0ãÖkÑØˆŒS³eQ6L>éè.ÉËÈÿp&Ðõ^ê6]¢4B°|jX>Ùý4£¿#'†•Ÿû%¢PÌ6íÿ\#‘H éISñíù&©¼Èý¡,¦Åíi¤z¤§/ÁW'~ÉÙ|D°–ŒŒí–Ó…7M›© Qù0àmƒÈGDh@ÂA°µû¶=„«'¿‹È°9˜=©q–§qºf Ú’ßmÅÃ’ÒÔ"uèº}e¯’Â< ª µò`¡:S/ÍáÁ;?wZÜÝô-Ð…„aÐfþ÷ Óe_WÙp*/gôW£›&×® ÿ¹ ÊÌvä7&­Ì·NI‹=ƒ‡Àޫޅ-Ü0Þiq»ÞЩCv’ìÈ‚ôeð¸±X½38$ã1õ`v{OIáÙKL=;†©®iÜhaãÒÙÔ! ==­¨k=Œ¶.Í ?0ŸóÔä±eÿ6¼xß øÕ;Ïð+>^ÑÇ_~öøü§Éø$àþå7bÅ,%ËçybwYî‡_z6žoñ¯få«Râ]<ŒSUCqx³ÉJF‘½†¿ˆ êhœÊÖ¾©Ü¸þaÇsß÷ÿði’ˆy’ 19R™™ÚÅ8z± K~³ %°Ž€h%?Ü4ä²®ž[¥GŽ[®—ºæðÔ)8sñ±7?Íšg+ñʧeøî¼ö{¹Èx䆩Ä`> gÞˆãfb°çëžÍzuˆY¡ÿÍÀVi÷/¥ªùε›lMz1/‹…µü¯^‹ÛÕË«–胓Ðck€‡@jˆ•8b)A$¥û¥>^è`˜¶Õ´·aÌõ-{X,mÇÂü>q˜A©ÊÁ¹Ú?CâÂ</e’ùi¢²M™+7<` Òõ °‹) 3E(úͱ??á땦_¾«˜ ‘ùŠb5æ|.øñ{ê¹jéÚDÿñÅ]Uû—¢ôÄkVú|¦ÌgÉ2MX}A­:ûÎVðÊv>Ù¢'dŒñàDƒT·K:ý­ »q¡F‹.‹ä™:ÌGÇ€ÿê‰ñÄûG ‘ûðòOÃo·|?KVð¢¤IÊÁµ¾­ oöÞÞ™„ßÝ¿sÆœÔ-ÈÜšßÙß›¸Øå­#éýýþ?è‡ì‡P>9Î3ü·üGßR.ψö®Z‘íZí—$äŠeY:§wŽ«!†T†g ¹{ˆ?—§ï~ /ô*¶={_qxÔó?÷‰skKŠÞ+|ógW7ô¬È­n®a¥4,w¼ü©þ ø¥Ç¸ñÔâ r`ë;†[¬ÅC¯ÀL3&~4Y%\7ô‰GÒÉ‚Ub•é0äuÂê1¢¯ß‚OŸû=v9†ãå&î¶€‹ƒécq•1É1>bÄe8wÙ4|ÎU‘Á«ÅÁZ£<$ y'ªš½dT=œµ—V…Z*Hïs ±ÈŠKFtÚtøòÐûüš"è½R&»Å8Õ*áQÌ÷Ø`aÑäxè‚Y+Ú:Ë?h®ÄÁ##ÚÅÝI±Ó°ýÄÅ+ì;°nä4÷;:.@MPèR ëB¯‰„ÝvŽ•—3hÀaÖÖc·A¥ˆþ¸!0 ëÉò¹‰¡4Ìš¾ ¸Äp…» µIáW|¿H(ë`ǃFÙ5ézG€{ÅŒ{µ˜_þ»grŒs\¦1ÆDd"\ …L… ± nŸ‡uCŸ½XjSž­¿+w[!V5´n[—9*·è»×~µã¥ÍëÙyŒr¹5-~Z€. ÌØóù±2X{«dh²Ž~V¤¡£›_«š,ê¹J9gç¾@s"ö+M´ÆöFütñMxíóÓhk¿ˆCÇÍXÿà“xfÓŸQßÓ€Iñ^œn¦ “–Qr3nͯ<ø¬\øVÍ~Å"öõ¬ŠxØa–Ï‹6?œÆÚ/ÞÀ1hÐw]Z¤×xÝ8y™_¹½ŽëðÊæ3Øul½Ïv…U3ãñðóøxßg0¦¨HYÿæ±…RýÏ—\x+'<4zõ5ÿ.W*– þPÞ¢ÃozçÞ^ƒÛåÓù¬­ü3ý–F,Ÿ©ÀÛ;ÆáhíEh‰M¥…{AÆ„Uz ÷ΛNÆ¢ýÞ0,œ¸É4¡¿-ùC±ZRQ8--'É´y:=‹uóõÓõÙàp6Óû/S=O÷Ò9 8«X ]WÍ€®½ýcc†~ýNš¯"%gå:2>ìœl#%†d홦%«FX\{ß cª,´æL› !~žqÒ9(Bv°*.ÎÄùšCøG)¢Ÿ>g7Ýñ|0+b U«Bés£pÎü%÷ï!½äæ­)ÀÀI)y‰‘ãi]ÍÚJd«|ž.æ]2Ò¾OA`å%ÑÔr®ôEˆÖz,¹3&àƒƒ¬H¯P\.7æ4uæsÑc•òÌwŸ”X 2Rbœ­ŽGøy+×D]=£”öí9ôo@ΖDê<ˆÔóÄ’0“Èo[±ûl I¨ŽœŠæŠyvD®TÏÊÈ]óåÉßÂÙ3„Ú¾R¤_äLŠ]ºã'/­6fq^¬2cƒiÐ(ƒ!•ʉeI±¥Ðbòz…r Ïäø{¬Ðb·VêÆ%Þ³4žr‡™`¡é©›³J}AFztIȰüe¥»™o.‡íº½2¡þšÒw%Fˆ}L¨9'¤­H4¬ƒÝÃøW,'%ùå¿XZ¸WS3%/6< 4™wŸèÆéËmžñZ,œ09¢µû¢®ªþÛ‚´ˆ ¡ô·%99ÆÌ¦je(lBŸ8ŒíMˆ%VJOöÉ6^é…À/3Ê‹™ã'àí®-ÊÒzÙ_ålW7Ëx[ñðòDüòƒ¹ô}ö4îœ}=v­GˆÜ7’Òj#A磉èÃco¾H,ü,›’§óØÞ 6ëšOï+üGÈüÀ¯>ä0=þ¶²xZ²§höèP£:ôy¬ßÞ…¶ÿívá °†<ÆX/Nð¾õè:œ>»õxô¦—ê8W§Œ¨¸£ýóõ '&ãÀóÆ#­ QòmÝ"¯‡] CÚORøwøê·›±ô©'qž@°¤QŠó.Sø™¥ÐjT¸%g6—®EMW?zN x’Ÿ N-]Ý´a[áÇ›ªêùøÊ¿qïæ¸È©æÄØ¥‡’žás£´19;)v<®™~'Ž˜Þ!ã'ä}3ICòW/¢5>4u4Ñ8ø†ç¬™åS3ß\±ècŒ•ÓÏ—º®ÌÍ¥ oü|Úú*‰é·Zùòó«¯yºñÙ/XµÛ$Q¡½oð‡T¥‰pÊ~XN^¯IB°: ¬v¥ÑK(!~8ÌYõ5U¤BÆ¥*ŸPÀ‚æWtPˆîë’¤EÉs¾:8Ú¯KƒâÑÐ^FT\ ½WJÆÇOk—'c€^z^2v ¹Z…™±Óqöòü³üÿ O›f—%kŽþÝàÄΚ çüòéùPÜŽ>Z¬ÖþK9J©ÍU“Š·þÔL ±0"ȵsTTJYUëÔAøÉ”1ætòÒǘ`Xg÷MÙù&¶8EÅ×ã›"e:Þž€Ø°ØœŒö+xªW´Þ`tºŒõ-Çó?+×q¡¶[‚G_sÞÿš C9]5g Ñ+EŒýæûÿö0˜}ÇÚ¸A{ò‡Ñ+I4úU¯!gõ»èè¼€hb3-Va çÒùLmáxó‘{QezùÿÑöpQ^y×gú 0ðÐ; e;Q£±+ÆS…$›¶IÄdÓ6MÛl²5&Ùt0‰)&ì1QÁ^P^‡Þ™a€éß½w€¨©û¾ï÷ä7A`˜§Ü{Ï=ÿvþ8[1Âú|Ü0ÝŸ<‹Ê?|Þ‰÷=£5Û”ã×±(Y±yÔPAY¢º0ŸI+eù^¡í*‡Ÿ‰¼WŸÁ›_ŸÀ»ßa"­An6<|Ë­èÓ2úVˆœŠ ®#ÏÑÚƒîÆñòJ:—¨ZÁ„e1泦¿ÓõÜ¥0Ù|‹¿üáþ¼©Áö qLúþ û nø¡žfÜ¡Šƒ‹TІþQ6“}¬¸Ü%À#7,"ÖÉE6}¦=åÍå½Ô¡»uþBî«‚#¾Iú ôà°jv4nLñC}ûq´v5ÐkH]–0Ñ8 WÖY‹esÓš‡Ü·¥d­ò8­.2_LTu„ï "Ÿ¥Ã$EÝLÖˬ0Àã†Ñ>U¸WìÄú’y("€5JÄ*”zXYÑ`¨%Æ–3Óq®®ýMTQ[fA°G"ÚE¥hÈ£DÄÙÆX%]ôçÙô¯‹¸]µèhÉùoû&ÿ.iÊ”¾Ê‡{ÅVKÎ!g±4)m6g·´OCuŸ ¥%9hm´ŸGv#WÕÝ©;3¼¼n!f129îD]>Ó¤b%ö¼Y7„šöZø“m­¤ÙJ&¹…ªŽäGOæ¢âp©¡ K²¦<ã%I¬W†³)×bþ´›TEoäïÚÓžzm9›ÕbLëíØ‹”ØWˆI8­=¥¯rЋn‘A“QA²ÜCº÷4¡²Sr|ÌwG'ƒŠ:¶+~8ªJAS5˜2¤e™mçý¼9†zù¢®ýôµU%¿yì?ì»)$pyúKŸŸÆþó=?žÝá·s•8LšÃo§éÀ›>ÇÛ܆”¸éPŸúz®d"üX¬š!Ãô¸à 0£ÇÄô½9Áˆx?+B¯A,và ÓÚ‰i1zWH_¡ªEŒÎþÄ„(ñÒ]‘Xÿ¯ò‰{m G_ 2‘WO1²¼3 ½Â~½/}öÞ~ˆJê«7ÌIÙs¶TʉåÈûÙÇä–íÄ=‰»_?€¢šr¬Uš±[-™x#=ŸÝÞ‹gÞk¬[›kçzBá놎¾ŠßõóSüU]ZCšõgÕÔ­¯­9“ó÷ï¯kL¹·,uzªŽþ}*BÕkSõtœR¸2ñôÚUx`ù«híµàÔåj„úúb¡RªiÑ|¡ññLR9‹WaFl 1OÂnás»öØ6[1¿r¯,eˆó~TSÓðéÆTåªü–î:îß_¼0aR¶hE(i(Á£ióðÊΟ( ±h´‘«ç„£¢B§yîsoÚ¾rKæ»;7lý˜»mÑ’ =ºÎf„“ÄDæ¶Í]p¾bFÃqØäí±…GÌK¾(’˜Õr­¬æxÈ8އÍY: týÎf·kœdžŠ+2~Bdd Ñò<3ùŸÜ#IaaèÔ|Â63 z´­YIQHD˜,F¥÷&¡âÄ6Œt áhÆÐH=¾³°çâ—Žîpv>\‚Ñ®çcar&š{N£ˆlC£=¬‰›§<*,G”Ob|#PÚxlÔut½ý¯¢€ÆáauQk¯R7pJåhŒHc?rBu Š#»ÑJ/ïíÌB'½™hPW=<\BÆÜê¾11šh§Ò6R“¿¦Šv‡2Zž2ddýäðÙœ€§O¢k@7‘–1~ôûþÁ^|uâCx„ã%o+K«_';ÖEæøÞ}ä–´ÏÔû¸bø˜äCL„V(Ž–"ïÄk#÷^Ñ阖ôßIÁ,“ó^ýßL6Jfþÿƒú䬉GÆçT;]0Š[çºroíæŸ9¿0uÎÌ#ê±öž?«Õ©†ÞR9»D#‚KFÔ|ˆ\oX]XsA½üºÖŒÂüVKùÿzäYåá4Ì‹R"–)Ý]}!wñ æªS5´Úmd¦é‡úÒvíi£•Ñá÷ä´Õݯhé–dy z£Ì{\*ëÇš…v¬—‚²Š¨"¸)}jjŸÃcI±–ô›fd¥ø ¦ZÐi˜ƒúŽÏA(,„ 4H!!6>¥©þÜdèŽɥұЎ oÔ=•KÌÐŽûݺC៘ëí„oÏŸ@·~€¶aßâ0]6GV‘5''7OÀ«§³û.|EeÒø—³.Ð3*½LsŒ[‘¯$©; íùŸünœNÓרh.'¦÷NÖÜÜÃÅ x"œÄ|¼y©=mœ±}ùâfÛíPP¤„Ÿ®ê¤h2%ü.TWd È˜K‚¦ýJ%˜3 ­ý2è'MF–sºLhÜBÀÏýðSÔtÍÏÝ}ºËæÜ„`ŸP9Uzë¦ÎÁþü÷¡Ò£YËG5™ô) ûDZº)<ûÑ.¼ûØJ¨+«áìã‹Ål8»TAÓ~ ¯^Œ½§/³"t;Uˆ1–†‹OŸ}©ñÍh¨¾À€zÛAW£È5o¼‚Åþ]U,0óî#“ÑÜ]Dv\=T`a•þ®Ž’ T”©Í 73°êóÙ•kF09ØEÇçëÕR‰]AÕq®štdNøyZÈ Õð(Ù”\ÖbÛ·;ÙùÝì ìî˜6JL#v—8˜`˜—çKwë<„ø¹ ON7-ñw øgÓ3ÂìxìœÉl9Ë'¥›»1#áîÃgiYdêµþ埱Žpàd@ÞÔ°øü¢²7¹5/|XÒÑ7˜z»ê¥L¾I—2 ÿi¨j6`ÏéÎ1ÃÑÊ´%E#,R ƒÙ®¬i:EÎ×”AýƱ+zÉmy is'D´,Ž Ì§G÷`vìl,šö8âB$øú§/‘ßÇÃÁ—Wƒs‹á¬VmîÚ¦ý»¹f›O¤i«Ã–­Ÿ^%t¹3«q Ÿ…•llÎ&ØÆüi~Š@Dx¯'c–9_Œ¾aÁr i'êœÔÊIç4)q‹—Ë„NhcóÝ>¶ïGÌÃêÙÀyÝÅãÏu\Bm[c{eÖœ)‹á…FÞ˜–¤ÎÆv…ÏC§ö¸£ÖËfD¸'!9dr ~*z…±`UÜ ¸MºSE/m4ÚW;;¹§ÙíŒ)£7Ý)ànÅÿÁñ äÛGJœEÃi¥4â}20*ìG{ã~L ž‡ÃägjÏSU ±é½ÌìßÌLñš„’šÆ?æ¸H`WÉ¥NÐÙ ðuU¢C[ÂÒEœM¨ílž6:?Ø7»/dlc4—ÖyòÇÔ)dFÄ&Gú‰Ž€'LX2ífœ.ùOß²#S7p}ý¹ð$àv¬âk‡¿Ï,D[_1{ÁÙò ¼ynÄ\““‡;±d´ W{~‡V4eÃkßRž­ØÏ5tV‘I^á¸wbÛìÖ‰Žc1‰ÉFãù1J?1Ö&ߣU‡º– ÐßüýKÒßÍ«ÉÞxS8ÞÁ™«MßBçìaƒžKŒšŠ‡w]eú~QpŽE§Ñó°  _œ|\l(mÂMjgÍÛ›Êཷ¬ˆ†ÙªÅO…»qRÝ…Ñ|ÌOæáŽE©¸ >Šc5"fú»¹8ãØ¶ÿ §šÚPATæÒó5ñ¡fmY“è*à?öžÓcz JëΪcæàÀË3°üÅ‹u¨ì°×• y¦QÄp’¯•ýŽê÷Eååo¯ÈÀBW­Î¨ Â»jsKŸˆl~ë[{FTÅŽçÅ\ægd@'%—7'ÌÌLAú½–l!ÞR¼´>ƒ#—iÏŽm¿;»irïϦoašòB…Ê7pÕ†Ïß?ˆñkðé¾vî/Ëo" ô]â•9ª¿v,Ÿ»Y}êÒ³‰ºAy6•°úâ‰Nô¤¦ÅgÀ0ê‹[^>„Se-W$=;¾>Gàir¨ 2nÀMª%\kW}n­f§:&r {~ýcM°úx6&}åAXWmåy4H:ñÄ»øÛº104ˆùOî…~x?â#â±tæmŠ¿,1oéjØ–à®ý¥ˆ„dÆêî‘©8^ú$,ƒ"–Og#$b¸] Ÿ @¸óçáÌ… (B ù̉è²~”ŸõÕ©3Š¿Ýô:±”æó¿–¬§:Âú<0?áNx¹ ¡«íeôw’9feói¼Ã B£it}YÃY…ňÂË®;aJt7lG)~ZQ ú ݰðü šä¾(º¡Z¤D ®« I©èï<˜³f%“äb²\ã™!×ü@M{zÎÔ»ÑÔ³¥­;XßÕµ)*\n?G Þþ ˜u^ ¼„†b¹•0*w–ZQÑy^CÕ>JÛí¡^œI¡“_~ 2!›ÌŠÙ‘3p®²Póî߆7­;7¯ñdåôjáfñDløJô4hi<Å\n”ùé%&°PÔªøÁ‰¯†P‘ùôÖÊúíé“#çrÇk²Vø’߯±ïï¾a!‡+ñÝ‘—`ç÷ÁNžºEÎ¥ýÃõxóÁí(k¼µ«ŸlZ„ tmAmùQÍÊTo¦â4ñôàÎÌ‚þ~LUÕÜó‹IÑÜ-»ûÜ7þu¥6»¸ú´rJ„{6OÇ‹;ðùÑ_øP€¢ H_‰Q1ZC'g: ^õÞfø+þ¾î/ÙÍ?Hq®þÑ^)a ;/JõnÎB|öd<Ù„4®R_Á<~yÌcެõ<~T[p“œ›œõæ7gp¦¢7Ìv…žÌ“KµfnjH|.Pö‡½&®{$GÇÀâlÇ&¬Ç¦ä¸¸Ÿ.ÙñäŸc`x”I½±êO»Ÿ¦~>‹è^nÂãÖà­ï›°qma…w+Ev5Ö/~_üø¬cûU¼6“רVˆ.wÃʼn_w7|±÷?ð'l2Ì•¦—”`ÿ‘œROÅ;Kïnx[箽Ê&‘$(KÊÉe”ñ ÕK a±@b„YR‡–á:ȈŰ¥µçèÚPÇEcZTª22 —5$…¡~niS½¥ «­£=Ï¢º¾ž=Æ,žt>æ&_à3G™_Ò£øö@;úû›qû’¥¸aj?ªúz`õ ›cç&Ìú1 kž $è‚Þ“QW} á>QÈ=un M{±ˆšÞ,Ÿóú†šQXõ9ŒÃzHxd°¤VföRZ(7‘_d…Tì†ÇÒ¶ãródgÚ€òÊgáïȵj[˜V ¥øt‡£I—½CÛN(°è®¾‰cî´,ÖøŽ—\¶xËý€sú3ëDhѶ³ˆSœânÔ·í…ɦ…ÀÅaòEù„bVD"x| êÚKÐÚÍ"j/¹wI§Î–}´¸bi ŽžÄÞM+² ó·ëâßSoØþÍú—ïŒË±˜šÌææÐÄUSÒŸ¾í¼ùõ!¼ùm 3õ®Ï uÔóæ×ŠØÒpsvÆ›ÝIÌ™ûˆ ×ÍIu 5˜åƒ0¡¢¥Þ®Ãd#(Ë™ZKÊ‹KébUÿÚ3pw±(ï[¥Ç;ßÊ¡éüuºP+SýÚÔa£µ¸¸æœ"ȧ¯Ý;Oß:аꄦ®«sð´FW¤]7šÎ<ööù S,ù !š{¬Œq`ô8¾:U‚µ³þªXí¬açâ‚9!ý8X)™È»ò¸sA0a~ad<Ê *ÓIØèãâ•Ù©áVÃ>J{˜ðí:À>´g¬MÂú Ó—‡ ~Ù>É释dx}W§Î®ËŒa~_¥OÆ+wí)K§}cþ`ÍФuÆ<–­ïÑGâÞ½ö3ë³SÖjaþЊáDà,1ÈLÀ¨ê¶ãñ÷‹1k’'^MBJ¬ ÙpnÇ©Òð#@Pªë¿P.Aù›é“ `™ªp™|ÍKLQ˜É:²*7]þþ©Þ¾qfOÝ×ÛhæÆk;Åid_­5”4ÏÓLX¶”˜¾L1zˆ€q¿Bdí&ÍBŸ®›¾ã°Ëò—M[šç!8^Ýv)oIÊ–q6¼‘ª¾_“Ò£v$é#óHAø†Ð€Ù\I#÷oˇ‡[͸ õͰz‡Î&$…¬Ààh/zÏãlå=óI'k§”°Jw$„†áà¥Bðm-àIm„áGÃI³zÇîê¼ÿ­ïÏ<û5^pºƒ€Ú49|V–TÆ£Ñ|b-<ߣqÀ‚ÊŽJÂ\àÓÓã‡x2‰Râ—‘ëátÉs9kG2~ï~µÍñªòÞ)ùÇչČ Ö¼ðé7‘Ãø³É¨^8Ý@ÕAS&¸oÙPˆÉê…?%ÐŒÎÄ, ŒY…_0ÂÂÐÒuV÷mÁ™O~t‰E^Ï—nª{ßQ(öžùyS龉ßžòÜœÂð¯o‹±íûƒÌÜ?B}äX9+.W–¨Eß ±Ð;,Î[¬¼SUßÈuèLb öaòüc®Ew×wš˜ib»#½ð¥öù™[¦Àã¤<ò1¹ôÌ\O_v ¶îþ–=纜ëQѰG³jÉ`Øoª õ¿—þÊ—«ÿñÈ®5Ô§»pvvã‚'>€º®iâ=”S?fQ‹}¥ßdžÁÏ+nÞó »í2Ù9üxv?^ÉbåukQ׌³GqôÜ9üti”_Ê!<]h{Ö%˜ÿø64Ó‚-Ì%RG·~ÔQ.·q­·«† ¾:QÁçÛì47Îzª µ[“^ÒúÍUAVÚ&#)xä¿%gQP%¢­1ó¾ÊÌø3 AŸP ÎŽ KåhëŠMŸŸÅ¡‹ÝôÆ=ËÀæìç‘óä}÷hÀ¥&²Qv^"ÖH<¨BºÕÎGaŸ#†j˜„|ø;Ó´ŸX Œ¸aÔ¦c÷H“¥!èS›í¼Ôçî4ýŸ‚àµx÷[‰Ð[Ëέ ˆV&…·ž•¡Ø ÷œ‚PÈD|² w1=´S¥ût«yãßï¡‹Ü|m¥HÞýÿ®¼ÑÚש3w×, [€…l#/@$§hjrsÆ/Ĭ‡ØÉ ‘)ak<µœ°|À¿VÜQ1–ö2ž°¬óqEAÒ¤ÕÙ1QIxã»WQ«afàøˆ›àá-‡P,Õ< ‹edWÓ[$èѳÞ!›i% ùÌ-Þœw¤è|‰‰BÛ"ºÙðU÷§=K€³œ0Á>Í,L%‡¢¤×¶ºw‰éÝ›®'ŒË_kÁñⳬ̌…Òç.Áú¥«°$ÙŠæú—PÓÙÎ=‹â¦ÖäÅœìÃä¹7„A§¿€†¶Ÿ¶ðûCÀo™½þdÅŽ­.–ÝR«&æ"mŽžOkx¯x›R7ÄÏ\>s—2% μ#yu­ÕšÆöŠ4òRÈì¿ÀªojXÌLX Ÿe|t°÷.¾Yåå\¨ëAÆ3·›ržÁ+Ðö~}<*pjv—¾ŒõÝå+æ…ºJ$¬ X¹¦5L‚#¿œ? ~é(;>êzùrÜñúQÔ´ !šý]ËnÅ?¿~“ep$G:Áh _("L¸7ÌX÷ØÂ؉õ—±ö›öØEõ°+Æ×Í ‹¦¦aMâCy]:uIc¿™—;ÿ´ßoÜWøg+È~)õ$–ÚØ^“ÕÒÕéÅù“ b;Æù²\Œõc¡vŠÎ9¿EU׿æ’>jAfC—‘,†–Œ‚JSš¾ó&Å¿ö8é.$+B4Æ‘| OàC¦ ³r>?‘c©…+`'Õfi&“àC¦-–^‡¾þ‹èë:?žÕN…Á9qèêtGpü$ŒÔ7‚s&fjL2¬ƒolmél4nÌtI§µ³Î27H%n¸PãBÞ_Ó•—Q¯Û ¾A‚{æ…`räXøw³¤à²Úû!.IJ‚ßÀUhÜ1Îê+J»Üh$ `FÕA û òÑØËÃG{‹ñºèj9´áŠ N$S¡µ÷;ètVØ[ ¤»ŒP×`¼z¡ÿ._ÆtÃÖ]ß»¨«(Ũ¡{k÷ ¶u^ÌKÚˆ¬þû{ÍÜxÃæwŸýS“8>棫wú3jÅÞÚ!y.õcMøê×fe,Ib9!Þw§%„çèŒÃ2ö_jÖ ú¸ð Ù*N¿¡iðPê’Ôæ§in}ž\Û+8Ý®¾õ™ð¼oNV¦]¬½<1Õü {aæ»Ø†ïŽÊiÔ kæ6CÌ÷Çá³/ÃÛM™ÌŽ)Õ=@àB=‚äÒº¹Ï7:7÷l#b‚ªáÎBNVÉûúÇÚ\ôMØw²bBÍ¿zv±ÒOz2¿«» <É2>õ: ²hi¥¹jJÒè2õ_RF;Ë;øÉ(¶A`Ë»{N­¹gÙ$ï‘îï¹ÚIêË34*N_ ¢Ì8X!žØ0 #¬žšÄ4}ˆþœ`o \…Ähg„ù®Å¿öEJU¾;wïÝÛ(ï}¸xá€ÚÍÉF7”¼ª~lX¿h]æ©ËÞPkz13ÄŒýä<]:R·©Øºë#ÜøÒØý£p]ÄßÇ2ƒÜ½ÖÑœÜ?ÏÉYëHšÍ6Ê™-#èÔéê»Å\cmDµñÛ—sÆÖ­`™A ”3¾!Ð4.š4£˜‰À÷l-DuËóVLBqc+-ÉbXÝÒ_çV2¾nl“jêîe=¨UGFÆÊê¨ËÉßÕ›X+ÐÓöe4f`Ízt¼²¼ÝƒÒ}="a!XoÔcïq#ú´5 /pá[·¥$×çýW¥pc ¶qÇnËæÎ¾y+zü§dÆ?œÓlvdÛí콩/ÝO©l‹úohÁÞü™˜âßµ¦¤­|~¸ììD·'Zb§B1£iõgç¹ÀÎs&»— ¦‘/`µ¯Œ:å?kЈ…bEDt š{³áåå‚9‘ÄÌþdë¸SxLù9Ÿ*A‡ÄÃb“£‹˜‘í:ºôZÔt$ãok”˜E˜©ÒŠg?ɇ~)ÎUæ;úד”ª©´hx`ÍýÈ\³ ºÎ×6æWåP°X$e³h]f¤— ÄœÒô ØQPxÏÝõù”CWÉuóù®L>L j6#l¤ú¾jòÛ}¬Ã•È7›%IÅ" Ä%OÞjÒ\+¸àX ’´ÒF‰rBUãp„øÆèn™/챫vXÿ³oänŸ±dp_ï,Mþ'—{ä.OÜ–ã>”ÑÜz׆šÖËÇÁúv«;Žf“qL¤cºí/}\Y³;Ê›Ž4»sd×êâ;µ”å¾Ý½Tví y~³“ ‚–L€6ÃF;ù/Píü2h{Ð{‡ÂÓ#>ûÜ1+™ 9/y@Þ„­·ŒêÀÉŒ„ÅÝÄ]n: ¹x¦´`eâ\˜ˆii64¢º³51JZ…ðñ#%ìÖ†.­Âš8=?W+ù,G„–²¶38ņ8£¨¢o¢Dl üÒÆÊärøýâÙw´~²ùÉ›_Ènêº9?e¾D-;Êiþ&Mã)n2œÆáý 3ÈáЩíº35k¶üÍPÀØ¥Àží˜8G\h5™£éù'“÷¤Î½T°c·.µ¨:/ÿõû¦r†Ñé8_9݉¥mYLgÙ} ‹:ó|¹®m/Ü—ÿ«f㲿¹m²ÛíY3bu‹“å?¨þáhhzløºlA„Úöjüt¹š¬ ‚½<†È` UÏܵ§‹> Eˆ_,1¹;Ȇ2HÖ !-CŽmã°º‚XHŽJ&zïç+»A¹Hœ¿ ¦DtôÁ© °®õíg˜O2*h$¬†¯ô!&´ hÕ©©®®—n¶ü£gs ý-d3laÝ#}D° j±=ö¿¡€€_Îÿ75˜_;î}Ý9Ì–ñ0ùçÏ_ ~Tçm ûáô®ÆàõÅ-FE‘¦A^[Üd³X[HÚUŽ:ˆÝ=‚‰©T óÈQ…ÀÖ½y,²ÇŽC§oQ¤NY¥»åµ‡óFºu“"<¸ø e8ò×x„u\9ø™Q¡)Jù¼ïû £åªk5“Å—#BU› ºñyœ.=ƒ„5Œ˜ˆ@Ì–²NZÁGu·€°;+«U×–#k‡oß×j`œ<·Áô`/9*;Y Õ˜y­<“Cý@,À«3ŸçˆRÓ¤T1a2žÎJh-Eh壅0Z>/z.F̽´È\7`hÚºíÊêÆ—¶D¨lv Š«¶¡¼~—fŒ‘³¯dÁ¦_¹PWù¤W~|£ÚÕçý?dì®NÖù‡‹øè±%(múêzdzºT%EÜÜá‰Ô ³Õ_#nÑWè=~ðÌ? ;‹Êœ7ýƒÌü“ïjZ‡š¹ÎžNH"îÛÐSWLÇ¿äºÉîi4@¢étø5) ìï–Cû›YôžO¯Ù:ÂjšY¢²%·-Ÿ|É“pD,’YXüÌǘ6iòNÀ3·%aÈæOŠðˆ»09¶Ú¾°t“Ñ~Ì ˜ ™CšÞÂ$ç…0ŽÕ5㎤Q|r^6•~dåT X5OÁD‰eJ@æ˜Û„‚߯úU§ÌjÎ)/|}ýöGþªº{é­x{w.¹¶‘ì±æÍªÄ9xd •]èë:в²sy_—+ÉÈ]ú7·Í‡Î°huÙÄ&RzêËR3Ï׎¦GÇã‹c½YãV×Û;m©§+ÔÅþnˆó$ÏËãá³y½—7ÿ–ßë†n±ðsÇ\'f‹1C ôÊ/,}#;ØÛ/탃ÿAu[#Lå…€S]gNTSCƒ°fÆï9 ”pÂa&Í _°šœKLÆŽXxæ½ä«EÍßc¨ßþß”µe…NâêzÛÑÒÓF®™g¡‚Í©æÎR$…Ý@,ƶ=ÿ'j0cvöDQ÷oùüîû§s&Ù´é€eäü}(/ÿâZÅgÏí7o9¾("“/š²¡m0kÓI -„—7:‡ºPÜ´k¬©Œ£I‰˜†ÞÞS0%üYE ¼:»«þëù¾:FãïÝ`1ji^îBuïV?¯f•Ä/îÁ%W8k9o˜ ®øèÈ1&f&EU„ù¬)=1›ÈPiG ˜gÀ³ï¿ˆ¥‰“ðæ½÷²bü U嘪eNfªJâJÌÕ`©£|íðù³à=rËx€eGsgyúöG×`ùsûÐ7ÌcŽêÓ "bš,A÷w¸¦^QÃ'f=kdN•nE<ø‰ÐÙŠ*Âägn~ñôƱ¢S,gqV”yÇóî+.Õ|ŸYÚ°›LB¸G#mþ621sÉøüT<°ç‹|·¬q–8õNÏÌÅÓâ¶ðãý‰ñÝ”w΢jlªGAylRá‰öâëSN(o£?ÆG!ûЈU¥–¯‚—èMl9z °>uºBîb‡›|:ŽWïææF½P<:˜“gÉÇŠÙ*|¾§¹±ëˆœ™žI¾‡l’Ô6&Ÿde~8V‰Ò~nkdHoú£+ü˜6]™f¼½‹|ÂuSiÏèa®8]ý1[ljw")êQ ?ŽŠæâ]8Ѽ²N!c16Ù,]O{7?!;·°ûø‘î‡ÌµQ(­ú€%³ã:Ö4+›Ëì ü~72jª_SSölc¸o ·óÙ;0¸q%Jh"§‘€” d‚rèúrÐXUEóçrT‹‘±ö9;G;³ºI”%Ú¹ÓG6¿üªÃçᓲ¡M¯PÜýÆ,H^ˆÁ³êБô¥ ›s4:ñ:oÚ‡ì:>¯7õõZÕ¿³VéüTï½$WèG@›Qq´Òþ7ô÷c?D{½ש2rßß÷®¹µlB+“m@T}Lñ§¬¥ÚáA(F!§åÚ€¦.‡ú•뢖” aÓµ½F&¬a4!4ÇamãF‡_QË\îR™ïGKïhÏa[=;én ïÕÂf–S;DýÜÇR…“Ȧr1©/ F$”(½=bqér.,#H9+º4íèëlYòàœüa2|¢þ_ y˜Ô)šå.÷QøyÆÀÓ-4'»kÂ6WgEO2M÷À›Îܘ¿^pXö³Ãì köªN\\žåãY`ã Uu=ƒ8Yq ýÃðöæá ε"ÑT„y¥£©'mÈÈâ  ²­uèì{qá·avø£éy‡^‡ºY¨2Úì ¼z[\ž¯ó¹Íí¼ÍÃÆÁkEÓ"‚çq»N"”ØáK³òí7©<¾€\l!Ê6Btü¹~¼vÏL¼˜}êºrV“K™ŠÝ.aRRs‰IKFÌB–¢â#·£¨~uŸkù0l.- Ãßûlö×ÏߎûßÊ#¦/™0‘áx|7º5Ç3®ÉÃÓЦ.<¾Ãi?)øn¨/} ¾‡cÂy:»C“Bò%ZïHŸã¶ÌU3·ôš}Ю-‚™J„“Á®l; W™'fG­Ä\eJ(Ø¥:QNv?Â߸ó_ÿÆ–~÷B貑ë4Àbff²—û"Tv_‚ÑÔ‡Y‘7§IQE“Oâø1à²Þ¡!¸|ڜ䮰Øû!Ž‹ËZY8m(45’ì6"7Ž/›¿g—àÝýuŽj#ÂàÆY™“RÕ 1"§®ÛŽOöS‡»Ï®qÆ i*œ¤ÞhímVkÚOe’©Ü|Ç‹ÙM½hjq¬‹»Í‹wLBMãGäúM·¼À\®ôTA^–‚·2ºucþ¿ñÀ}í ,±àŠ’9]a¾1µ§ýXn_ç …XÆ!TF5ý,èm†Åh`ÿKBg.ŠÝ¯Ò(y™`YS"M±æ\¾@¨ñ Z¬ØY ÀÓÿàHHˆÃ×GOÃ×sJVæöÅX‚\€ßˆúW" [\dr•³ŒŠ«ÊÈŒ"m†êF32IÆ¡LX÷®ÊÖ¥µE°~'ôð&ƒ@}¨™‡h_n¾}Bó¯C«ƒ¯tÎC£Ž¾)vG5ÓŸ¤–Ñ)pÂ…J­%‡@†(­ÎÛ•/=þ¶V¦Cži®®ÌÝ‚ÏùðrK€”w ©‹êu- ó—šzs[;†¹„º(ßPu[×Ùã†QíUª/.NîªÎÝ8Ñfù2o3¤r+$r©+ÕÿaxlQäÒ‡«˜F™/.·4£°ñ<¡Æ„Ê9û(ü="·¬™³!ë¹÷e›{‡0Ÿjê}ôÔðU«í©ÛÍ9Û¿9ŸÕØ‘¤j×—tÄzƒ˜ 6m~Þ=Ô·e(¬ß “Ö ~×Ãà|Cmz8*KËw ]bT6} …ÏÌ›º }Ar4vžø%µE˜›°$M"Ÿ’¶8ÚP`6•kãX@B}=çŸ'æjKo?\L|ÄE®@Sw)9O èc£`¨±ÛàEÀ0¿ª.ÂÇOÌÄÛŠ`0‘‡( ’RV€µ"–Ò@u˜|ÖÜäùx/w»®´Ñ¤~/óž¬Es>ÊøéÌ_ÂÜäú¬Óoß«Ôt ”© ‘mÍÛ7þвµÂh62èéšà(‹ Ï#ÜK¤d²4@Ó^͘ã²pBÉô´Ó—?pÔ([xÒGCÆ>üt9ócÓ0#n)–OÏGC§tËw§\¨§ÑÁq†àSS òŽ@ÎÑJÜ8-yo¾Ì¿Œ;DcÕìµp‘ ’…\Š>m)ª{GР-Éj%¦‹œ0U-hwˆ71õû-lC 84÷kÐqñLTB5í&|½ù+Ü¿m•ý<Ƚ-è4ùÃÜéƒ6c#<\mðÉÐ'ÅÌH*8» ³±on}ùsf:SÆHýhÏÜ~/þ™ó‚½œÈ9x,Ф¯“ADÆ©¡[ˆ~ÂÔU‰³!w‚¾åÝ©ë6²hÆý¢êÚ’£ê}›Ò³/6®S:‰á,jÔ•×¾“÷EmÇ·§6Œ¥HaÕŒ!õ}7@è3[%wò ãNÕ‰LŠáQ¨Ýµ§ŸFF3®A&«E€.st¸wýèð„µ4î?«Àöç¯P­x¥DƒQk6Ä‚O3úèçû†Ü¨x#7 oû%ËQô ˜ }ç^T4æ%W8‹mY#ŽÖ±©o<øKðót ÌŸv×oÀ€AÇ6btF%#9ÚL˜[é†ÛS®J.ÖijB}£QTç €nc9:”R¶uLˆOKT­tΉ˜dÃX{V³¾,ÖÄ|ãâ%Óƒ-,M'À¬ÙK–=û †:‡!ó“ÃêÁ/4€XSd÷ènvl¨œŠ=ŸàðÕÃ=ç|7z)ÓÇc.w¶îcÕÂø¹*í@}ÖŽÝ›ÇÇ3Ø7Y]×Û¨dÂ)d1Ój™‡…•êFƯ†Ýtöw»þÌõõðWÅOÇáÒr2¹Î:[©‡ôé{éÁ;]'¹h_—õÑÞýÔÖV¤ú}­"Ú74£ÃЛ²ºþ(üæ¡¢~º:Ê`3¡ìDtÀ$ÔŠ*ÐcÙM݉0Ryvª¾LG<Ì UïaŠÿd¼}ðSÜ0 .þ*ì¹ðÛb#U~îQ*…ï ð-ùèn¨QWuûrëOcjøJxMÅéò/00Ø '8Ô¡é€É˜¾XZ#´N¿5/}Qƒ¯ ÚQÙ)«Îp€Ÿ«³ ÿz0 óâÍxúÓ.ÈO¨Úðî[0™ÜW7wû“+7mÄ™u—«?Í.(¿¼cÙu§~AÁ¥.7¯®ï-ṮnY¥ Ûàâ!BrÈ yÄ ¦µõ­E,Oó i?T$ÃÆ·èQ… lÊÇÙÐÉš\¤Æ.gIÃe-qÜ™*櫤’DäïÓÈDø½ÖjG:•MBÔ}àN¹âLåyâáw ±r†Y³ 3c‚sÛƒØÁ å3v@{À¿å\äl~_ú ÊõP7l‡iÔ‚Kæ è’áúø§‘óÌ«øð˜~f²j19z#Ôõo²G¼»'¼¤§!ç`_Ñ"ÜûÆki$a„5$øÌ…©w/ ^¸{H!wâXy¤@b‡ÔÓ 9Þ¶!"ŽÀÊ›|ž7·Ì­óªR¹¨„Ój»qÛF÷rÕÌ?ØjµóÒGÌÎ Œå9Ö¾:cÁÀŽG×Ìß"•ÎÄë_ŸÁñÒz²qêêã„3|qß’ùòëOÏ;Xˆ´e†+AP7þ­MÝ@__nÙ6®Hÿ>KîÈo¼ûŽ=Á¢ÑTy'”ëÖµÐP0Ò¦XøÿzøàÇ…¦äº¹FsûÕɦèP{áQ‰:©CÅÅ×Õ1~S”|ž8hœè^88 nJ‰[‡Så§X+ ª…¤e€g‡ZP‰ñw€#sµ¿/—Éø‡øùMâÒã§1ÖN52s˜ZJÔgÞOæç ÓÃÐ×ìHx7š å°ˆ‰áð}S믿§ºÏ q¶!Þ{zzê'pÃj9î#wÍìè/!Ìt6öýˆÔ¸iô"ÖSÕ¥­¾yåø…Éç `¥úƒ“CæÃ6°ûOS„¿föRæ75|¾=Wˆv]¿#Ô=~”…„x˜àédSnØ õvWÒ;2 ’¿7ŒÉÔ°Z¬ºTpòœª ÛP¢jì,CCÇ Ö¤ÈæDh”ÊÆ,™¹ ZC/º»aÂJ;ÕÓ~F¼Ænº-up Ÿƒ`O+œœ=p©ös,šö<öœz ÝÚb²Š B¼bRâÖ(«:²±@ù4ªÛNâÀùWÙ Iì|h…™gjnQù'rcóîÀ’éÓqúÂÃI}ñÒúD<±6‡/éÇ’ÀEˆó&ç Fcûüû»Sèçv˜ža$ŸÔ‘6 tŸ•sa7ÆáTiê¡›_ÏøeÆÕ-*MÝbúV5¿‡¸€÷N‚VßFÌÍo!° h‚\°ÙUì-ßg¾@4Áúè‚í!=Ö#ALÌ>…ÂÚŸ¾l¿ˆë§-e`¶ï\=V$¯#Ìæëß@%Çv½‚¼ÄØœýoä<µ i/>>@û.t’קĬŸL6€P†…eäkÂŒÌê#¥`lbÍë­²~´ÖV@îŠ>]++ojn;ýÄš_1}3[ò$Tip[„2‚ÜýÒEXy.w<€çßîN4…„OØ™˜ÔB<“êDá4ûE¸-V“¹ŸÞ?¾s½2º„óeR¬Ûü!’Ã\ðãE¯-˜-jr¤9òÍæ=ö`èßïº5mÄÌ_O15ÎʼnVl-ÙQ¼ñélÜY`ÆË;?¸JðoÄ'‡‡ñE~ žZ«Àm×§¥ïûá`ÓÊ%º?Œ¼SàJ¦¥ ˜”YêREˆ7uÔ i®$KÒöô» O¼²„ Ó²H òyç«Y®"»vòŒ9™5ï©tó/õäˆ[2!ôPä]Ìf‘Už™ÏÚÒŠÜ,li³I«¶ ~‡7¿‹ç?YÁd¹\© LÎGŃÝȺ/,Û +±‚f‘ v`p/fLáèí‰æ®~†=4ñŸJÅÐ •‚:s=ŸþøæCîGYãÔÜ¥sÔF®MäBL`'ò"ëPLýÝ\ \Å^¨Ô™XX-­JlÈ­g1X{'1ë*/beb U·ÎF¶š-¶žÉéÍ-µdMØðÑ1VMù™Xïëx¶Íÿ£R¸Ï¾ç'Å\§lé3àduÄ\¥;;í¯A³íýýFÈâE WÜœÜÐ74Àü.$Üœ¼1bFMË]g_Íšqõê˜ ñK.v•ûp…u—ÑÔÛ í±AØŒy A2$E§ º»-ýÍ,e¼³Ü8óT¸Ï#&i—};ÚÖÐÓ%PüUøñükO[`Òü"wò€å®S`&OÄ8ªa¥?ýC4tÄq/6G›¿ðà¹X˜´Q>íÐÔPµ}N£ž%nquñàäÎ^ై-a#ƒh»p¢R€­pãí)úP@˜éêâ 'Úì܉lZMŸ®v£Eð˜æö×¾U¤&Æ®ÏWW3m¶ªÏ×]¶4¿ºãg1Xáî¨ñr‰Ô˜ŒýºîþbLŠx M œD»lƒÑö†¶÷”†s5pÞ¡Ÿqßœy Ã:GÍ.õÒby*oDËþ<¢C¢04ƒµ¯œÃmófâ«ç‘2É ‡_¿£onö ëßôóÆ/âÃ"÷TŽ]lǤÌ›qžù4s&µ‰XA?õR@¼eñz¼t—F´/ã‹£x{Œ`1y~Õqt8Äè¦Eý "_‡¸­E'DÌäe˜å‹ÒúQÑcÇô˜QXý’‚§"Œë »Ò;ˆÍxI~½8VçHZi‚;ÑUv ôxú&Ò¹á³â»<V´a¯¶«Óùìã¹—5aêg´MÈß°fÚÛ¾rArì”l2gÕÄLËxsûÄŸ'Z Ѥé+Ëônç‡WÓ§êŠ*r~UE†Ö@Û¡ë¢Õ°ÉWq È†wÕ :‰ a=Þß_“J˜Î“§ïS8-~€§kÕ‹4ä>öðùö‚>0ÊÖV[Ûûý´A1½åéDLžÎN6Hß ÄÆ,'ó®nΡÌꨬûœ¼¯oÍ=«llS¼t\¤ ޏ—âÝ„íß?†} „t~M”ÎÙ'[CÝÍ„߆oŽ‹ðêÎŽ”6bÿP)žP6¢Ñð÷6,DmE:À>¶’q:˜:hšSÊ#óAL,Bd’ƒ¯CY"ƒ†~÷qó¼·)6÷`¹,­^SÍZÒÚȆA›”E†…À—¬í殺TŠ--íïç.ü‡Êóƒ7•0¿5Ä:Ú®³Zó[æï/J¯ýAîöi±×#»à0FLfV—KÍP'r¡6ÌšºZ5¬z5€Â€ÊFe±â<Vó°î\ÙÇ©ãIÓ?EPþdE7j¶¢®«›us#Áfî@w%Y„Éˆä„ ÈBjg¿÷p G Gê;zwî3È ÚOòCSkI(æsóÃÐÕZ†™•]‡™°NrOÜ:÷^¸JDdGé!;Ž"3AZûµôôÁȰš˜åG0H@×f³¨Ç“¬Çò©?(Áh橚ûEÊ>šÓ!ÖÉÄö·ÌÜä©cpLm%橌I@¹¹¸@U =ŸÓ7šÜ”êóS›Ç>ký˜Oˆ.–&–¶Â#çz²‰“6äçVrõug¡ó¯¬_üæÅù ¿ã8»/ÁÅÖ!ÔÖïg»-ÝEÍÃXd¡xX ±Ö—Ž'?º„Ÿ.ö mÎLdeÚøúé,î Ó`N굓b¬ñTþÑR­L@{Ÿ3Ö¾Z‚I>,›,ƒwØØôÙ§la^ H4wnÝÂ[ñöC¡Ðv½ˆÓUzÌŒ_†Êö:Ôt5:zC“q²ô‘Å(·2=8+@>a%w.Ø £î¯8\ÝÏXp}û—X9å<¼º[‰­ß}ÌÎAÏGA`y¬qüè÷ôë¬$x¸¶£¨®P\%Ei㘈‚ÅvÍÏû&t:;ÌS•˜“mlÑ}wäaÅÌè)ÙïîU«Nœÿ~"‰™ ½_ ü~îrÄ(âQ­)ñjVÏV sµ8göŒãW²=+Ï5W,_¯úîœ ¾8v'h&89ᦻ7âð…˜åªycC~˜CxÙñÓ÷§ËßeqFÈ„Žó·ŠØ××™Ñåèéo¥­ ò>üZ”i±cþ aSæPeêÔë'/î`õù<ƒ£sÐÝꈬ›xë‘uáÇ!&` YËMhÓ÷éº{.&¦¯´iÈù3ù|ÁWHxÞ‹¦êÚ.³T-›µ îRȤ„ð ‰èÇèà9Lys7üî‚N–ûH“ÿ)ŠdelÀ3·Ï@[ÓÓèë,DÃp’&ßÊÖÃÐôœ›SW™½"ãõÁ¥š“p‘©§–O(ñô4å«»«¨ 1mFFïêòÈ\JSÎÇ¥êS{,b5gßr眻šœ$ÒùfS¬¦J5¬-Û~«ÇŸÀg“s–àÇËÈŽç!S`°¯Á<¨ˆiÕ9X†Úžj‡>™Œ&²-d! ݬW±¶ÅbDûNÓ„*²Â~©rU …•‹ÕB˜“.g,ÑyƒT,S¹»úÁIêIv 'Â( ™L10bÃ÷Š™Í¾jZ<9ögNA˜7(d×A› Éd|¬&×ZÓZ‹´¹ë ï|fM{µÕB‘3aZRG~.È×hš#µÒ¼!#Oaw”©ÆEHio3 <L&Óu‘#˜7e*ÎVºãÙìZ ›1!ù1v|ýÜ£ps`óŽí[Ï}Ô²ñŠÄÚñZäÕäýª‰¨ˆ¯ ¦.V7*§ ¸)Ó"ƒMMó{) 4½ »|+1i ›Ó ˜³—:~û«eðAˆw’¢æ#ú¾|Lö!l,e²vîS‘âÌ[+áë|Xg7׆WÝ\ìÒþXì‚uóÝ0cÒBLÛp -=Žr8Z%1'ÔÄL±ƒUaR B è÷[ywÏ;G̤/!—GABJAÕy‡•¬¦Ñ¾.ôz)(Ê-¸nʳˆó8‚«›À9Ï$ ÞoÑY(ÂÞÁäû¶1Óúüèº#q„œGÊ„V“5¶›ŸÌÅɲChï€À“€+YèoìðtˆGØ 9|Wæ_’e*¤¹n<»Ž,ÆÄác]W-”ª¢dU»ùüOnfc± ÂÁ~ib/½&Ê+z½X %6(„‘›FN#mZae üAùš¡•›w|‹sÕÉ0΂»W>‰ãE?À×KˆUIM›—-¨Ü4€*Wß{òg>~q^:µþÌ4½ðý‹¡¸T±OæÊÄ\³ÅRg–~e³YÑÔmFêÜwðþÏÃdhL‰s¨š ˜ðócCÊ—à‡Â#ê›gt§Š¤)Š:}¨nZÜ—š±k °,„œ˜€“XâAþ^Êêu-æHä•×ßS0Ày\ç&“OM/m.çü½ÆKŸ~»@Ž„ˆP¬œ= ¾mhoÙÁúm—R7ÔË“ṪâCLršç;ˆáÑ´÷Ö ©«œk$Þá3¦žðMv5xçVéÖ¥åŸüV²ÄÄŒ·{8\=·Î\‹3—¿Lí2‹W» ,M2¾»2àôG5À(† :¡¼½…ùç&¯B»¹Â0®Kº—;÷ ¯˜°;bÓS«Œð%<Ùº’Ý^lc¯¸ñ0y€. »±0'™žs…®WêŽÝú ykDóvìá:zÉï'r¿Ü#)NŽMUÞ5w¾;W„–î&ĆÄßì -„ RjM‹©íä:8búyøã»“0D.'uš_ž“­?['*!à|œ¬m7)õŠ!³XÑ9(XO—Âha¾ Ì±ê VîGLl¥a”ÇѼD‰˜0Jr¿ÎäëÌØ8\ÖxâáwÊ1ÉÏB6GIÕxùeK9‡É¬žb€Þ`Èœz·G¦gSû{Yt³c'ÿËâ›s$n2çüý/9e;9MOßs¾ :²È»µW ½”‹¬OLJéoäåó‹ݰҌäèÈÝ0XYŽ[¦…]´ýÀ³;ê°ã‰ÅœÅÒ²͸¦æ[7bqçú‰éc²šqû<_üs·CÝ„Ïî2)Aú:Ó$fà2nŠ€Ç]×÷c¨moÄ‚¤Ö·Aï2È¢Õ¶a>“ê²X>…C‚Ÿ˜ì|7ˆ,2tõ £XÇG[Ÿ² è}û“y´ ÒH®]Èþæi™0ß»%íÚfò¼z »ÂJÀ‰vkÔ ÆÌÝŸ[üÜí‰6v°;LD–l Ž|É•/ôM<Ò5±!Ä&]*èl*Ñ¥¥¤py§O³ÏtgŸMØX;Ÿ¢»L‹¼“‡—_R'᳂š ÀÀFÛ2À{K¹îµ,Hû •`Yä(Ü<§bOþ‡8«1àø«sQÕø®ž4”7oÝpã²Ì}G¿oàÑÕ3pÿR'\ªüõ}bõԈ܀Ð'»NtàèÄd…ÎFWûX;ã2ÿ´(Ó|ÆúéÚGø»… >j9b¼Éú´ç=ðŸ…ÁÄS*qÍæñ.gì}ý´îŠkØJ@0€jÚèp?G}wãëñê,†SX÷\IÉ-ªøl‘°ïþíôô!{Nô]¹8XÓ­^ˆöalĸ}j<¹ÖË8q±šœcÊͬꇎ0»Q«+Ÿu=ÔUß¿š•é÷Dø§ýD°D¤w¬ *Ç/&ØD¬R]‡Q¬ò‘ò2=™lþØ@£W׳…`Kþ ©|á¯!dCw7&G¬BÇp#Ú{J± f&jz‘Yäèൄ  Ó5C;TŒÑ1)+™¨£Ý"HÆd·md+¬ÈÅì˜[·¼ü¹/Üe̹¦¼®àwJï®úÙbL=WöC~X@Œò‘¥óPÝR Í,I˜†'ޱ&JBúœÈæÌ¨éosøÈ÷ºa=’#CT}Ã+¼FLƒ[ŽÔõ0ÕÊìLfæÚJ@nÏgÏ ±óÞøœë&–T²®dˆDl$‡ò9W—Xå£ïc“t"¡ÖÓŠG®a dw©Kf¸ §›0KÍhí*»ÈŸ¬ì,/¶_˜`PΜoOªÛêa¢õ‘„ɶ‘Ïé'f!ϱ¼¢£ˆY]K6gˆÄ1èÒ²ULS’"þsß×ä¹·}eOBØ‚ CE‚³î Ö¶Zº[Û Ý­mÕîôtœŽS´­=Ý`­­µ¬«NpT‚Le…½C Y$ùîûà8}Ï9ï÷¾çû}9¿(“ç¹Çu_×Z!Špªz8}\ùg.2¹6Ò£é÷“e(®»êPUFwmuö•¡¼IT¤”YÓäRoèÚ/àÑÅðù­L‡˜¦ˆMBÆoM²2¤ÀH¡ÏdÄæƒZ¬œ3 [¶áBý),š°0óݰ¹l€ÌF;êÁÊeŒÚb­ƒÍé„a¨“"—`²J _qÙÀ£óêÀIò9ôY蘎nT  , AyÃH%^dŠÙÂoîò¤³Ii9±H;9í¸oÞbø{—á÷3Qؼ§-W?s<ÿGÛ¡*¥ö]ÁöæMß®~)c^J*²ó>†°?`ê”QÈ%xïÜ45Ad͸àÀ‹ßøgPÉÓ3ÞýîB%½¨ê`f¸ +aϧ=%õï™ ·×®ï1ã¬5ëP©‚CÓ¢‹êÁsŸGmãÞ¢Ò6®rBĘ´òÞLÜøö¸ !û)-¬ÀóÆŠÔ¬^ÞŒ91S0°è·oÂ#K—Á[l‚cp§Á=X›í;f`ýMÏyÓÔj(¿†:ýEfþ;Æ+ãuW˜»J©&¿—•úÁîO £{·£Ÿ—%DAéˆ;!ãHc@Á@—C}t˜ p¥DÆ’uéFÉ¥*˜Dh§‡ä ¡öEp=‰ûæNb9ÇkoÁÕh+;ósÒçoTæ}‚È`¸d-ŒUMC±†Hù¤¬”¨Ih J”¦Àq94›ÊI±³ˆ*u¦Õ´”©6ýÚžúï€à?HàÝE×õÕéÝJo™ eõ; ;‘‚˜È 7j ý}´Ü`•\ˆƒí°›<6)G?9ái5²Ab‚çbé¤;´ï<µ0¯åäï6dgÚþ-÷ô›˜Åçñ×(½ühbŒH„¯"ùÅ'Y´:e‚n·'›Äaóx’ožyöž=ˆèXCyãyÝa£öŸM½žÒáä¬$¿¯vy„|䦧!^- '•DÄÆ†ÞovÞ+&ÝÙóó ßÿ¹OSv± žÆê¾üª²:b+ûeÝ3˜qvøá ¶ [•±^«Ã¶Re¡ä3órèn˜?í)<—ë‰á–1=ù\ò•úØè¶¦–·‡–? ùø(õ}½— mÚÃnš3è©éxtCvwÊTfP'àN‹E…Ͼ_?e‡Ûüýz€£²Üiðº‡öe¥ªCÐÝ׊9É7ak‘ /ä]dסÒÓÃy˜D€)ÚÇÓûƒ‚"õXRÏð‘÷gâR}..µu“9¡MÞ“±³d‹G Tù{Q ÷jÞFOïz è;äåÃbËR)šÁ—Ö{$6‘ž»/Š®š¥Lˆëæ‘‘9ËÚÌšp=†àÄÙ¦“(ÔòXôƒ×OÅ=K¸hêÚŽäp€"jºÂÑlÊEU»ŽKÉß Fû<ÏFÔ’ïS{ÿè2 ËA%—'l‰LSrÄËñû©J4v´A‹Yã¼ pÃh¨×Y›Ö&Mo¦U¦Ug:ïÍòÏyOO¾͸UÇ|•Ñd4ôóÙP¯3ʰ?+ º¶ƒ†;n6ù\»¾›·fozoSq•.gJ¬5û¦Iæ‚gs41ެœG^W¥<þ7$ 1VOSíè8ÑütªÂŽô9)hÒ7¡³¿^4=ã ?0^‘šôtÚóàô —½gmX¨2/LI\@sy°öÛRürÄ´¹&¬M¿ Â’úÎàæäW°sÿÇð3/í‚”Héöî±8|6'ËKÙºuÚ –OÔ…ú8u*$X8Þ’>¼¶ y|‘’'“ßÀM–Ù C3-±¶þÊ¢#¶¤ç’;ßù 3ÂlØ]'¹Ê ýÙÃã16° m=kÿ¬¡®ñ»Â'>þZõG1ËzÑIE.µ\"RŽ Â’i³±íï™S„®3:>´ƒÐk"Äboˆ¤Q dg&ØÉ³ì%’·.õ_S•C€µLèÖÝžlÉòrކ¿¬ƒºÊ§±õ¼=ƒ\f8_1ƒƒØ h3ù/vmAÁáÓhïázÎ) ú9æí†—Ïb¥`ÝÝzy.V¡îÉ%÷k*€u°#…Údhˆ…P–žc°†©‹ÎŠÔIKpïû-8RÑã±ÕvF¿R€¢²Íc äáç7žÃœè÷<¦s–¤'eƒ*d’R×~Ád1Ç…§båGäš]WèÆ«AðaUÁ~A¸øõZ´êîO“äYÈ?íPæó…â´ð€)ñMïK§ n‡·ÎÇï›tEè틟‹3ܬØ'õù…Ì絆'>oTž.Ý7 ¬J™O-›ŽGnT¡µûªÈ&è±òavð t’ç *$ Ï|cÆ™K&¼÷0ÔNå°›¹à‹1!d.~?¼…õn‘¥b!‡ô¼/áø™ŸÑÛÓcxä–‡•çe V˜ø–ƒZCoYú°ý íŠxõՈ®}]ªÛØ·üõ·”U½‚Ñð›¹ãBñÆía°Yãd¥^ûÖSö«ûŽÌ #×wçj?AskÖG†‹U¨t²0¯é‰Iº¢Òòìo=ž5ç™TÓ [k” ŽT±¡^êV"1]ƒÄ8&ßO”Ù]PŒ1úŸí+Êt{ÌÜ|™Kó'ÿ¬Î^É[°Z™CÔÐrO"¡Ûà-w))s¾~â­T’¬ óñÕq9vµÕÖÞþ‹hé*ƒÅf-62@².#|A8Býü156þ^6”סÕWeÔüº%÷÷'@Z®ÛBÀ/ &¢hå2æåà³hÙ$R…A™³Ò×/’±Áæ–ß °¢¯”ÂÿßÙ$̘‘°4WR’©3'hÇúz¼‚·Ž² ^]HOt]‡¢29£ÐjhG›¾Œmb!O‰èàEˆ ž@nôM¸,{Óÿ, ᕯĔ æ“ͯr»9é·ØI%/Ò ä³W’ûÐÐ6d’ pÒëZøZò(YäßÖ §÷È;sÕ"ƒîû”^‚ ø)h`² ULy Ž¢«e7J[]8Õ,dà÷À\>ŸAE{ª›¿eº6>Žœ—@×.õž;¯D*¿ý ­÷" >sá †.º·ù*édh™–»ýô™ŒIñ³ðÞ/À÷…:f« ñò0¾”Ð!RTRÒ¯Y÷݇Çü€²¬é¥ßuð£‡K·¦§¿ ÈÌÍ Š†R\Â@0eìBlØÞƒ»ª‹³]ÑBå1akásðÓ‹»Ÿö¡mw01îÖüó-‡Éœ%“ñãì·z4T¶1ÛׇûS_þRL½í%$Rÿú¨•Í}]õÍù¾ϧ­ÏßÎÒ¸æŒÇìqþhh?„Ú–B²YôHŒ¾¿Ýíñè’yæIœð&ƒõÂþ´]·*4Vt™ (Ȇ¬\® @ª m`éÀ'\ uØ­¨ «úƒ|¤ŽÆ”ë~HŠàÃÌ8Cd€Þê¯ÊT3Õºí³ÆÍ)š:~뿬0ì¶M;_s*§ÏlS9zr(v“ÍYÒÚ³øûrœ¯ðÝÎíL~±@]»‹«‘ƒî»—ž&  SBáMËLéÏ¡µë¬Áj3m 9ÍBé-YÏ}¥uV>r¨Ý=/- ÃÅú㰈͘>îD{×V”ye¥kÀ‚^¾D¢¥,hÈ M:°ÃNÝjùÕ¼'å„fÉ…„l‘±æ“³©£‡Õi÷cß™¯ñúÃ6ΩC(´¹¥š6rèøyû!Ø7’Œ¹ÄB!ÌäZ½F=:õíð †y°ƒ¦2¿D®oŒÓ4Yn(™I‰Oàpå´µ–1{)-ú•…‰Ð¦ÑŠ¹Ø¶H»&ÎUHŸ“ÅôR`¼¢Qü0ÓŽx8þöp—f ‘U-ãñØÆb+ ÀD•Sê7ÅRÆÖ¨M-ëþ <> ¦>gEs/¯ˆÐHå­RæÔ®ZÂÍ %éo˜<}ý'YB}RÌ\²°íh‘Äu8\vTþRä¬ZƒÉÑ}‘ª×ÒYÀ{`tI€WIÛ} yr@öãüæ´× 9ii¦íï<<\ÁZ®ô‘¹J¶¾þ¸ÊdÞI†ˆÌ ߊžŽF8EfVäÔKìÀ‚)wbÙY´è[3¹“9äÞÚæË.óðÍ}¸ez,fÆŽÅ9:C| j:j à1‰d7ò "›Fèƒë“¾Å’ž‚ÐÈÀœVüa½XûŒ K‚:: ‡*þ³Üõ-Ýúþá1×þCÝTòßO¦MY®­=ƒcåÜþ ‘Öd…”JX—ª©›–[1íÇ%K%;“k.SO>m,æÆgO߃ÍûNcOIãpL^¼=Ñ%hî¨Î¤ª¸¨ùšž_ì:Óˆ¨¦Æ‰+êFe[) ¶!–j&ã®9oÀ¦¹(0Æœú'à—!WÄå„Þ™×B´õy£©ËÀªaKíHÀ€¡F}:QÝ͇züì(>…®;ú‰Ì$$ËæÜHt?ž»¿—CÙd¯3¸!.úFe}·Û+`¦­dÉszK¤ˆð !û5ެ©^T6ƒŽäóÚ8W²Ñ‘¨?šEJ"cÕô€˜;QÍMR9÷Ë[¬NA¿#Ǫ~b}Ãéà‰Ý,"…/t±„‡‰S1.|&Ä<{ÑË¢+oÕjˆԑì_†ÁIª{›ÿezçt©¥¹ª*·*÷h¬tÿ,ñ 5Æ«i󳵟JRsž´Py§ê2)ò½|fªOÔÿþ>;8Ô6G³ñpÐx2›Ü†ªÖrÔvÔãö«`êÿ uÍdÁ»a'áx‚aE|,v3Y0yº û¤,ç“^6ÙcÉd,2¨qW*vGo\;x•´9¸ÁÀBvæ?­d1RõBõÊùaø$Cæü‰œüé–c×¹”7é"¢i]t[%ì4’‘ïc|Ýd.À¹–Óè·•@ìë5#‘§t¨݂þ÷Òi7!Ò똌¯vµáD•aT>4GY)w/ˆÃ™Gq´×ɱ )TA´RÉ©+bLí|›€±Ï%ø(û£¥éE4êYäÙ·Rð3àrÃðTµmøšèÐÄŒòV'Z{J0;ù1”ÖäádÙN„úWá¦ÉIx䦥„ø‘ƒEÉÞ4ë§¹«Aûäç™LLŽç&(Mî9¨ïh—çxU ÎÚß" …V¨© „>Ô[]Q¾ŸƒœëSxªØ09v=+9@ÄÁXûàAå …¸Øt ³ã'cû¹.¯væåïä^‘ ÇA©‡(ëÑÞ[`˜6þ¥ŽžnK £É—3_ýÚèÏA„[13ÒÎL´qÑã‹Bp¢~‘ÕH‰‰Ã»?–åuôñÔ#±¡ÿ¥©æ3xá®)¸ØZŒrÿfÛåûbFsIà²>8þø\ZÈiPÊùÊSˆ¼u1.mèÄ=ïuâ³Uj$EÚ2š;h·FƦf1ÓHUƒH{œ„Q Vh#R_o¶@Æó×Оº×€Ÿ:(ì¶±w>Ý]‡¼ýoC×ÑrÓО7î]‰Ûf ¢¯7Ÿ€ØiÔèêÐatx€Ûå‰=xv2§ÕxaäOI‹‰œ«ÜYò#‘¼½û= È:7qͨj®CuSB Ž[†ß‹QËñÍIü4.—²ž†ÙÐHþVg‾Á[–eqÑjÚn7ÅRu&Žù '.擵w˜dw2Æ„ª&ï‚€ÓYäx'Sû?è òßy ƒîÿæoßÌbxî3 µ·”µ‘ûëAzŸÙ‘_Ù­Pû„ *øvôòšáß„ú^r*qÀ•y2 àã€ÍaÁOÇ?Ã3^F¯õÕÑëši79SÆÎ@qÍ Z-†æ~^ͼøâY3“‘=]›Ò~:òsÚéê"¥a€“󧥿ÉëÐdžõ©O+ ¢‚Äù.œW+ÄÜ|Ÿh8††PÚØÈvoóp ÚÜZ2ÄeahÓ&O@#a?-=Gƒ¡Aã´™<Í}¥}†GY„³‹q­—¬4ë‹5‹”ÇÊôxþë LΫPP2„j9À«ïïh¹‹&‘kØ›ñÔÒüå§SžÂ£´çB*‡©S„¾&D‰á°Ò¹¢cNXt2ïA="ýÇ¢¨ª†£_ )~"ºˆRmÕë`wØqQWÀlžþ^Ñ0 ÔS£ÕV´±+¦®ùagj O*Wï'àRý_<}?Ƚ‘çµ4ŽÆ/*åbEÎ# ÄË=C…VëYd~\£ý½iënÐz‰åÌ#OcÅ&.Ë(á+ìÀ$|»¥«‘AH'`_Xu=æ>ôi$¢}¤i8I˜ ´P‡;0§!meÃiÍÂqéØW±ý„ï)•¢™ŒIxÔç¸oöm†×î Æ_¶:”'ÚM˜aIm¾™¥Úýí—*øÑñ{Çåu1'T3 „ó®DjëÊÐxãï{$˜F@¨ŸCX½p”0|!à7DÞ4&QÈqd¤d÷xRkdQ¾e‚•ÉÛŽá9{â3-ÎæL‚€ß¢Q*‰ìOÆÉšãöÂ•Ï êÒð3š KOß1~亃‡“ï@{}°›ã¶é¸nS‘ÃîØÎ•<™Ó68UyëÚ ëì]ƒ4Õz÷©î:<»ñ/ø¸ _¿®òæ¹râ'únD‘uçv^@w[yÖfÄxÙ S'¬Û*„¦šf %Œ¼ç,v_ø3U1[uÜDÒ’ .Ç%ò·Ú"Xj6(cñßr®þi[Ìÿׯg6J¨#"ÿ®©b´˜]p EÂJ¨ý€¥Çãa&²Öaä²êh¡¥¯Ý4ÆŒLÝ0Iªé#Am{1ÙøB²‘­ŠCˆ$%ÊÑ™M™xE—h\àÒMU‰ &{:ãTV©k)Gaâí½ô:ë·¼ñÏ[hjžTæLŒ´­yrù\jkÀòÊË61;Rò6HHŠaÙu`_åF ä8 OF¤)ÍV¡v ²21>\¹¹é“p†;ÖeE‡ÏÍIÆbåÅ(kèbÏî@}µ_݉»~ú‡Ä¢Éƒxr™)qàæu{ {èð؉|< JíšäiرnžyÇëùë?øÉï0+üYÔâ3â] Å}qQs±õÄ–+ªŒ„DV™˜ÿ<jÿ†³-<Ü:÷/º¯ö½‘rsÊì5ÂCÈ:­œõÒAÕò™íà’À-ô¦y|–×ÿ»ßè½F>D¤¦H›ÓoÙ¬þtž^b×>µ¨[+ñÿ,£àÌèî/eýlY`¾Ÿc˜ÍK0sÌ\\¨Ý‰DÕ$D'¢®³~kı„ù•pìãQRó1"ý¢0+v¼îÓgsyþ9-ý ”/äóL¸~‚q1×#>@˜¹óTþê¸È™ê®~oØl9ð6á‡ÃUØqR6â¹Ì¬ù©çmižÂ©–Õãö8èšsçáí#.Ö\DT8­]fì/qz*‡ŽA"=h6 ÁAš’j>ÔIKiåzEæe$d¾Ê²l¬Ãuìhì!+}|Of$´ w Óǧcˉ-°’uäÍ#®Ò‰Âj…„ñ_?ÃaÁÀΙD”€¦ÁzøËC`¼@$! åHyò~—Ã¥"ììû²>G=ïÃà-`ës×azb.^ü}Ih#Ê«wÈ;Á7© &N%‡FŽTl"_Á²Q@Ø/ËG&‡U:<ò=_äbà¿$û{ TÄàHY3ô¦ösê½ šˆôY« àþŽî–ÝpØÍÙ?_”Dùȼ” ÇOWû{‡©à¶bÈ5‹µ ½Z8Ÿ‡ôE þ½æé×âÿ¼>Ze)X1ÿ@ᛊ`5‘3pÓøe˜»Bž—Rüpøþ„ÐMA¥O¿g°9NêíâBsª[uDâu £¯Ña‹1cÜ-Y6·l ÅŒ ož*)îî5ßÚ¨<_·ÆNBéÛ zS¶²æž7åÿì>‹>5¬UGÙÖKD~(oiaÕ¥½¬<ܘø4^ H.h&&bÉôq¬v N"Âæ !d5”Ñ—´&šY˜Ñþ‘hh=ÁN,šJE=b -G|Êk¾IŸ3Tä Bp€ "³½¼&bÞ8ë?Ü×¾ó2]yCOQ‡þ ¾zzóžzPr$kƒƒ^ »¹@W×ËMçrÜiêXkî°-q4Ýj· yƒP©BÓØø._XœSÈBã’±ýAa÷bÙìw4?ó퇬†]ÚcQ»µ]Y›ŽŸTE‡êÑ܇P߉R59´ès:yîÑH}ú¶»ä”¯‡ÑÜŽ—¿ù¡B<»â+µ›#ÕØL[ Ž¹ÙB¹>CÃE59ì=;á8ÝÌŽ¸¾JwÞp²b?¤9Ô¼P4“ß›¨âádÅ‹ôVC×Ü‚¢‹çU>~÷®NO¬ýð·rx7¯Ýû8¦&?¸à±°Û*²•bµ›;„vÃ>ôôí%_£¼É„H_7ƱðÜ„»ýÿq]k3wygâx›OúÔÁt¡(ˆÕLN^¼BYv3¾Ñ5 *<'5ØÚ7 (øø³¼#,ÅŽ¾hì¦RâÆóâ !󰳸‹è¾4e”lø^$„…BA”qˆõÏa©‘óRà¥\]¥G±éÀíhêøá>qÐë͸ÔDæB8k¿ü{&…80Ÿ¬Ç' ’IçâP½èª°£‘–¦yÞ”}Û_¸ć¯¬†•§‡\"ÃÊÁØð$Ôt¶1!ÉBRÈž¤ExdÒX`º_y4SL@ãóÂqËä§pý¸ÛtÉÑwÁLöžÝÒÁêÊhå'rõ¶—ã«ßCÓÀ…/—'XM‹Œ>óÀ†©“vDÑ~žy¤4/ïDÙ¯E%5'×·é-™‹!úß¿?{ýdžlÐ÷?su÷5_— º7íRk5ŽVŸÄ¶ÂÍÈýc3¬úÜ>í $¨ÔÈ,½Šöpõñ™„þ‹½¤˜9n6.TÿÁ6e.”Äö›zpäôðV.BC¯§¿…®×…wn"›Ï“A ¤5ÓÈP/ªLL«¡!çîl/õ?{¹ØÕow Ðk2B.R"uaT›@ñ˜<†0&àdåqˆ„ã0qÌh½ÔŽ ÝÇLÖñK¡’%Ä;³ÆÎEIu‘ñƒ®¼>íIñÀÇAEßÒ«e„í>²$ÝÆ`ÄÇÌBCgžI»Ý “°ŠédF¿òÈPjeýµ"A¥á̆g1ob<¬NÚƒYü¬çTjpY¥?{­€ÃEŠ®S€ä«òÕ¯ÅWö^[Ýx7NLA°·7: ¥,˜½‡0¹©óÑnl,8Zþ¶áýßf²7Vi]+8´þÞq¸õºé8\jG×€._K^ ˆ7ó†SànNjîâ½îW¹m§ ¢M¾ÈãôzœX×Ðùª¨ûƒ¦8Ñ8:Ÿ¾®Ì' öic6:P®4½hÀp¨hÀVWðq~¹aþËEêšXÍ7Ï.ÆÉ‹?cÓ¾ زëK|ºk+N6OQÅ«–AH¤¢ÅÍ…Þ @ÿ€=m­¬-Á-©X6#v ܹãVøýÓÃñ­{ü扥a8Z®CÁ±½,ð|Í—{±ú¶;±z‰ œ¡««ÔËfÈæt ÜÞÙú#6¿p#DЉì©¦&Œ÷VÌGm› ž”š.Š.5ŸÃäÈ©ðõâÃ0ü¾‚ù~9ù.Zº3{gO[vŸ~ ‡.¼ ]ÏWÐF'A9œÎ· q¨AŒß*%H$`µjº‰—ûåP³ •á# ⱿkñýÁS˜œü VÎ\ˆå“P_Ÿ‹žîS„‰V:6 AA1,ùCmÛä3hp2ݯ i®‹IÅ n0ˆ† ÒT×^ê0aWI3KVrzLFf¹.šÀ…>ƒú¾†j”a^.j*+>¤iUhºR‡×AÞÿŸøÿ!ÐS¹8’,ð¢2ø øü èÛJˆ´m\ïYÊdæé 7å‘+“Õ}—ò˜öGæíeE;dÔ•­ÄÁsuh6~9Vx/ª@6uŸA‡¾”•Ñž º“H_+œ èwɆá@Hd2ͦ ›ÍB$r¯Ñcž s°üºëñý‘}°Ú9 ¹¬MŸ™(§Ë€[fi°ùàN%Çí¦i)ÿäñtz³“QöÉãVàÈÅOˆ0@oåÅß²x¢‚‚ ç…¡±íSDR£ˆ+Ãä#ñ#Ì/"®g«v’½?óš\hx_¤$›¿<òᥨë‚Ò›‹"íI<ÿu=~~%_­úûZò>|Ò’yMáú׿.˜·| J·g=¸²¡“«R’ƒ#LÙ¬íïú4sÄ+ÿ×ý™=n6‘ƒä°ÈgŽá\íM¿Óµµ'rož´@¹óü!s%£Á¶<*뎬u¹Ñ(tÒbfûê;¤Ó¨üÄ…›PX)Å‚ñä€Qö"FdDN²â7žÝO7í’I;ÃÍž0¿@šŽÃ˜¸Ž—ÁnÚœ©Ix$g|ÔeyÃ^$Eß@5cÁ¡âõÙW¶c¥‹í‚ yÅà²õ˜1s뛕ZÌ'‡­”¥ÖĆ…¬Í¾QΦÂ7Y*ŸV&›ÔJ滸*gªÝ˜•0‰þmè5èQÙQ“wl6d"^¿S€]g°žªÊ“îóCÙæÞ¼?ó¬†.[s¸L‹Êf ùI îÒ,"@hÇ·ûÎâ¹;30d߈ÏÿPóòÑB5¹Š…Aº©©EÅ…–¼^ÝÓ›_zëÅ'{ÑßVÉ2m$ÒPXìŒI:z[â׌Ըëq¸v?ÀCü–âdõXô䳉¢iiM¾e,$„/ó!÷«°|úÝØ°}ר]¹ÈUš²GÙµÞ:ÎÂd1ûy÷Õå¿V}Q‰ÅíxéŽy˜<6 ¯sè-€-ûK!6¿Š›¤ÃÎ Í…l„R…0Ÿ0¤8,»´—tÖn9#Ê™ÆWO3ÅS]\ÞB@/ÜÅe§ÉgÓJñÔ‘¸íÈF<·ìLU©È¾ô#hÿë6@ïæ'råO(/45)ZÊNs!ß 1‘ˆóïÕz}ŸòÍoµ•ÃË·™yªXÕR"Õ ž–”^ɬ cg÷4š Y¨€œ,Ü)ñ|ćFC ž>ÏŸ¹íMÆ(.;«x1.Vïb5¼‡$´æ˜Ûœ/ñFd@".4œ&)…¿O,Ž_Ò‚O&˜ Ò¾!š rš*ðôâixyóÁriä3³Ìúó!ÚZî¿¢Ð좣·m½.ÛBDOE|ÄL(ø1h5±4%Z¾Ýí¶ÂléCg_#z †á„í« ¶>7)Ýüœn¨ÕD¢lzñnÌyñŒ˜Â¾>y4+¯OEg[ÁÐ{†«^•UðÚ×âud¯ëA«áö7îÌòŒË·dí¹ºÑ4 Öë"å{»WÓ)Ïδe^™m#û¬ ôMX]¯PJ…‰¼;håCOÒ0ÈCs·™²a„úØÈ4q° íïépö£ñdóØ!æ /¬‡6ÿ²ü—.êGN‘‚õÉJ ]qÓãïA‚oeQ@ä™Tª jŒ‹òý}–èÆ†ÎÊæˆ¦è®Íêjfìß훳ïrr4FšÑÊΚ¾ì{4‘9‰Fu¸x5¾1ûËK¦âÁ'^AáÞ™(t“õÖ×YŽÒÉÆ´ëG’ïNª.rïñËN£¸™¥›ôyW‚ŸÿôÜÀàù˜ùüo(o43pÉLŠžPÈGqÎ\ ˜ÛðÁO§‘R>lóMÇ3ÐT3Ã>f deÓ¼”ñ…"Qùûy9^øön™{+^Jk$lï"š:ëX¥Éñsà#À™Æ£PzM%ì|þ½®½EÄú­P:ß`_!Ò|†Åë¾ÁáòšQYÎâ9Cì8ÑìqØL v0‡P@ô}8U]m]Å?´KV«hˆP3Y—V¤ÆÚ!”»¨pavb0¢‚ÇÂÍõ‡Ë^£E›]¬ý¼°=•Ãu’çVGö÷‚·ðü·µýùè _儹ÑŠç䆸.r-¬Ô¬@mÕ»©×ôÕù¿~ýË8Àÿ Rð㈶Zæ)h?…¹Çä)£OÊ-õ8,挀°1wÞÇò î{‡ûIÖÐ0¹4ƒfÚë´ C´¬bÈGN3–nG&ŠÚ’SÕäïe¨ïi€Í=™Ü°ÕM;`í6aHá)Å#²€ã#ǽ 7á›Ý÷‘ÍiÂuì®@œ(#€L¤ýúû&òYýƒˆ6Û8™4+ÄSò›“B@P÷g¨Š* ôY„óõ› (‡#1LM$X4„IÐ ÓÀ%˜u°˜;avÀÐfFžÃ…þ+¢ì ®MÔ~æC‘zÛQE¾ÉÂUÑ,¯žVB®˜ù/ïƒFí± •z@ð¯÷'`Õ²èhÝCïyz½ÌJ=´ §¸fÞËå"‰JÌ9·AæŸ³Ž€] µ¤\€ëXô¡6ÙÙy¢|²Kg­´­ÿ“`t›?µP׌½çjˆ”4Щ}Ñ[&Ä7Åí³%¨m:dxê[©aÙäUúu!hÔw¡îçÙå\sÂJh3ø©ñÜ:ѾÀ¹·r¡7bK¨çóe:³ƒ§â8ûÖšÛGKQcÿ´¬N³=­bK»òóŒž<2–JV¤fUËúˆ ‰ <¡·Ò[> {KsÉF4³ònÔfì–;!†‘ùÉÌÖi´–#Rᇽg»®`RîÞ?ÈòBAИ>vxL¸×/‡€ËVÓŽƒÌó¹ú< ~B±_®*6¯äžÄÆ=M£ÏI°´ú‘›<—ŽnŸŒS6ã‡"WvÁ)ùS#ÇÔñÓ0#FmèjÿmmÒuÍyÿß =µ²;NÔW)/uT]Îl ›d¨‡ïAꊜH¤Ï]yy‡^Ê&,…-ìƒÇæäÊåAm„-v;YÛHÆÄHP0íò4/q|ebT4–ÀÊKdƒDå°ËÎ%§†›ý.5ÄFDÎÁ¢É£®y#¶Ÿ9N[Šàºä@¸8þ8YSÎîCfö'”[·ÈE@ù:» -z+Š@3E ,"˜ú§á;ߊÜRE n˜´Þ'lÖ&mIM‰ÚjiŸc!'³“h]E‘ØæÁÚuläÏé"ßD£ìGzÐ>KÀog±¼°»ŸGƒ³qóT3^¿9~,ªÇ_i¸À!ÌñÖÿúÍè=Ü;/ Ÿ˜½¾=í'!ôžg¨3Š”eÂMÀiÙŒµˆö>©[uQ×mäm'`—wæ3°8ÔžïÍïDJuÔ”†¥×mX[zéË"uÒ—l^V½/Q×´ˆs}ýÓÕ´ö­7Χ¹EŨê0a\À ±¡’‰æë~ýä |ýÇž¢ç ÞýZTAdèM_ÿx¦ý5£½ax}=›¦GL ^|."ƒ£ÈFâÊä=€¦+Ä¢H(yÑ1`ÖñùníséãÓZúk¡fàãõßaÿÕk•±jl)xà­Ä’I‰µ¾0LŽ ó¯[†ÒÆ3hî­eíXerBÂP“"ÆÃi'ŸYÙˆÛB qÿM`rX+\ƒ¿\•S;ñ~?šKÙ ž]4äÈ ^Š :nÊ>6j?£…#Þ»/{oeo)µ_ÌD›¾çªëöVÈt}F®f$?–çUxÉ\ë_¾ë}ÕÞs›Òê:ÊXøà¸.õ"ÈßÄ<êb šqÉTëŽë$"/UD Y ¸ì:ÿñháQÅ#Ï+öb×òç0wò‹Ø~º~²ý*¤¬ÊàJ*}‡<-0¨]þŒ‚øÈÏîš—„ëÇ×h%´Þ¯gœ©×ãŒöKØ\}žÂ¥Ô±Àó<ÓÔ„§ÐÕ³—0ÉzzO:2])3",J±Ð«áº‰ذc7ZõÌ+® -5x´Yž ÷AèÚ¶#¬…Ft`¦ÆN#2þ¢ÁÍ•e/™{hýÿòÿ—l~‰Ï«9§ë(kÚ«à Ž J¬ð ç+g¸`j_$dBÁ¦ðcY³fnÜÊ3$FLY3iâÐ,‹.cK¢¦~™Ø |²BjÛ. ¢¶&‡Œ0F ¦Õ@0vy¨A¶®Ýoz;TŒº–p¤ÂBž êé7õa\ô8œ¦ý¯ |ÆCcóQćMÆäH+fž’ùØßßJæxÊÑ“Asw¶—†€àèÐéÞ_äaØðûJÃÔ8Rh¯Ó66nK§Éãw½*Ï™2ÖwMêÄd"I à"üÄMchemz-èê­W÷ôµ²4Â&³WXô} )èogü .¥—U-¶ð‚  †Hõ£¡-ô¤þþp+x";>~xašÍ0÷VöõòYâ>A^ì:ûV/ûIýî=úœ·r¸ªÍ¨Š‰Ý¤¬]ª|<¿Çš¨wløL44di^ø}Ó™NÖòY>ʶ~ŽWœg ”ÚgÄF <DfÑû¡ì½|.· [_xLùÓ‰/ñÅ þö —ÖÐ'PóÝW°ð% j…ŸD†DÕ\l.Àgï^`%¸Bȳ&„@™ñ8t-p8üðì AªÉªÕ±ÚK²+ ;^ƒÓÿ~©ü´O¼+[3wÒLuþ©:dܸqæÂOHŠÄÔ1K 6±T;ò~r"YËQÑÐ…¿‹ƒðÅ®)°‹áô=·>𚂾ëÍLÉð¥)Š>CY2E¼³ðò–ÂQ»šRL‹Q€=ljá8@ú\ûÎ÷b^r0ä"—*6о¡+ÌÞyTª%@•E–öša9¼æ¹[•†–ærx‘uKû[uýˆ¦E-<õ i!’ýåç°`Â4¨BgÍ›q2sÓ¯G5ÀQÕ¤„»rÓ¦>Ž¢Ê­0ÙôÐjÜÔD3&È÷—gÊ>#ì œù`n»=eÔˆìo`ÌÞ5ꥡv@°’p<Ü›‚Gnšþþ¢>CmzD ]uÏ7&ù]=eÙ}ʳv‡ \w?8\Z!]Š6C+º»zà-qêl\ZPAM[ŠnÛ>°¾¸bóšÞˆ}ÚZœ®©B?-TKãi²‹›á&gfxP9çÂn7Öù;Ùó(zø6ÃúÿMàÿÏȉôMHàJT'+C³¾rÔ$$.A]å Øy}¬2ŒGR’ÓK ÃÄH5öZõÒR×'Lk" pLKqQ ·Ÿ&À'‚›ƒ½ëû`襶]‰·Aä%Zâ®úaÿgd°¥†ø©nRd˦@…Kiê Ÿ§ô¿E£m €ÑÒŒ!É‡ÐøAL+&“)!raKC£¡5Ócâ1dÙ—-òT¸ÿmùajœNË% EmcZÊÖlN_èMCJò8Úp¹]ÙÖ¸-µÁˆ´—6„®4Úâ5¥Í~øùÄ2ù—“fÿ#_“¢äPJ1g\Ô±QЛ;ÐÐRªì3v笘gÄ÷EžÆ>ÁCøöééÊnC)=¾ÑÒë «êà.¹“OˆW ©²iÿN¶+ðúm‹ÑbÝ‚‰~f2N|XÀs$NV%m†JýÐç­,×€("_•Ãéo›(ø ä+ Ï7›•Ç«Ÿ‚›l”ó Û0iÌbõMÓïTûÊ>/êí?Ÿþì¢È´G¯_–óòwç”»Ï4¡º‘̇EÂgCä.̶£ª‡f/´ÓCG½|º Ëš2~<þ&ó8N½f™Íë$à'‡·"7½YÎ>3+6ÚO¶@öm©¨·ÄbÝw9dÜ|ðû«sƒ>ˆÊ6>jÚj © Á÷¥§`¼ €Zæ ?ج{í±ª»/!K!.Ç=/|–¿¡Þ–Øãè„R8„ …œHl>.õöŽÖ•·6dFEi çÇÃG»¬Æ[¿Á÷N"ãtòÖ|Iž>së6¾Z"t«¾1øå¤·ÇN6 ѾCè0q±~û¯äð\–þçõD•xÆä𞨷WQsëñ²ÖïÆ@¶æ(+okûN@ÔMDä`é¦E\Ím[øð ˆ ²w‹Ý(*ÏÃôØäŒa[r‘ÇD°U56rfÖÒIw`»„Ú®Rô v`uÒ!C9˜ûÚq¶bÆÇ.ÂÑwâ§c-Ø|¸†°Ø>O]ÖzÓÙ‰JÌŒ'‡]¼7f'%aÁ±²¯tvmhN~1öu@źîÚ ÍÞSbºgT]FnÁªë7P³ÄѦ¨uâdœkØ—iêäÈø¬|þï’œòn×ö±¾ýºÊú]ª¹‰j,œx9@{ɾ ûº0¬8…BNÓkûa0¶ÁFž!>x–fÓ¯°Î“ÃU¡2àéj¨6h‡ßþUeèÿ üÍž’ L¡€£NŒ½‹ƒh¨?«¬Ùä@6#Ÿ'Áí×=ŠK{Š®Ÿ[v•´$ƒ’A« Ôå¹…|ÿ5Ta„%#kаŸÁ%>· ˜Ë[*ÄG÷Y3¼½•^e&j¶žŒ)li=X´á‘¤MÎøœÏÿÐ)Vž!jÁÆ (P'ˆPî…'­D¼÷ÚêÊÜ<§0ªPìµH=÷Õ}xæ¶Õ|?ž, ܶƒ™‹¯oÏ»¶Š õŸ „DŽ}ó_­‚ÍX:Ê–(#¦ÞÔoÎI3™£‰Q z{2ÎVíÑÔSDÔÔ+¯YÛÉÏñ’¸3h‘Õ+_f­äïkõ| ’ýDö’¯wÆ©–Pº„ýŽô‡ow\a³]'ɲ"‚Æ"À; >r_–PΜ†V ê۪У¿‘ÿÁ1ö‹—4¢8LGQÂâö䟠Ó÷÷ ¥KkÐjמn•xjºµï=jͼ&I@íèN=°¾¿è‰iC˜D%•£×Þæ¤—¾«ÉuÒ®‹»Òiש|¢ ¼Ãi£0p9BXl.ôô¡¤¡A>qð–G² /&K8ö®‚ŽÎ“|a®R ’K½ #J‚â˜ÉÒ³e=VÁ(ûŠžÐÿ9 EbŸq9b©OFkßlLòR@âC Ë¡ÊrZÍBSûY2˜•©W†~¼ø…˜0-N‰“U†AæG«,ÿmCgú+ ù¼,2oÔ†6&ÌÁÂQîH‰€_Ð<‡&¢©Ç ûa,²&"ƒwÀßg?È_Ðr]:~ ƒýUÊDÕbœºÔ­G÷0;& 6UG%ã¡%«Ñ\}{tµá†4‹Ýº2ļÚ<¤ÄoÇcÛQchi³o$3;?íý’H©RüZá+Êp,W”“¿OƒŽCyÝ>‚ðòyg/nA„¯ qá Hˆ˜ß{¯v|Ícc6™+‚OTÔlüör tÕÁfuàH¯n²iâ–`nTZŒñP¯>‚}/:pâ¢ë ¼ñè|£á•IÊ&c *t[ÐKÌjäïç…ëùão…ÍÒˆjÝIêˆH_°ÊoÍ{YÁ¡*¿ÜoÁwûw3™JŸ[=&O.™Hþ +à…¯‚.מ#“6¼Î(ÝøöÕhlÜ+'Ì·Š¨RìbUlX !½ç;„¸mVÞ¿W‚âKç –-z¡CÕb””Iq€hEê(úîÙ4Ìý£ @UË0Cûmù+>6¤E`jä´uáÄÜÊÖHÍ_~îÆ£K'"20±Á!äƒ~È«»T¸A$ñÏW,S-}û$ÊMxéŽðÓþ/±pJ¿ÁËPÛ´ÿª®oÃù«…RE|BßG软{¼þrW €#sDíh#àØ·åzT6CWw m}ºé §­Ô¬âpyŠeˆd¬ê8„É“·ll»Í@dª6oĆQŸ–ˆ¨ˆ˜µyóBk›‡ÉÝ\X“ÿN¡v¸ÙÕh£÷kLÎé$†˜GNˆ·ç°ó’ù‚v7¤Ý)ó¢mv êN˜­´€oæŠtùxás^èÖŽ³~¥>¥\G«H{I\†¯6fžnàçXÕ¼8íµ5{ž]sZgÎ9wñÈx„éÚ¸,Liˆ€o#3Zl56l<‹¬sÆÍFMC!ÆE¤ !j,&4tÒ®îC´»¼Ä„û5dEuS)ºûšYÜàÿ'HþÞðŒ1¡SrR1ÌD³S£îÙÚ6ÌŽe'OMK)dϼ6x‘œëheÓ~ø„%åÚŠ3nð—»8r›CviФCÇql⸭믭v{ó etØP ëV Éúñ%çÞ‚+Ù@~ @û"9hëç@§¤‹Œþ5z¸ \CTh¢R&MÂ×û£ËØÏ’¾i}1ZYÚ‹<Ï‚™˜ÇË V­ÏÞ *‰4:'"zuÚ¦ƒ…xú‹³£l/ãÆÛqËDV½iÔ»F“î)+Á×5ËÃpºì”UÐ^ºˆˆp ƆÅb|Ôt(W^e÷c]Ò⬞Í5øÝ—Œ³ç¹çdI¾äU9„¿¿‘‰¸ÇôÜ¿rˆe&Pã;IcUf‚±ãµIDAlÊkÖ 3x¢D•–Àþ»;Ý|Ô“ÅuËôܹàv¤Æœ0pÑ|±&Ë /Í/§=ÀóÞ=¦¢é“w§ŽØ9_¥=°1pùkw¸qßì–l]3t\.¿0bì#ÊÛÞÓéÞÌÀø±Å·aû‘ŸÐíðÂéfáXɦњuú÷Õù¼¦J ±çË}BÐd{7¼òÎ(ƒÉ«¥ Gíô+ë‘ùïý~Š«¶cˆì¥˜•u²[Á%À'÷! È?é,T4šÑo%2Óe„—Ä ážfB6›ýÕ ãqvì.4ö4!2d îûh7Nqéªriwg{©üdC ×|eÎÌìGíyÃ?o ëÚ–l¢ÏµrØ&Ì’|¼½¢3L„X$†ÁÔˆæÎJòUOOc|¬}™0¸a¶·ö­¯ÁÏ~ð.\25Zãí=‡…E¹aÇí,¶2ð\E÷àh•(ê8åy½Ñ°£ä ²¹û¬§«Ó“*Úiææ`r¼“£o@l`¢aÐf×ÌF5õáï(Þ£UÏê^éL’„H ERd2‘Õ¨j(ºªíÄ ÂXØ -y›~m¡ƒ”å«Ép»0YQX¡ ?Ó" ™då²öžÕ®¡v²ȤºÑÕo@KïZ ØpU,!/(×Å‹T‹äw ×ìBÿàÒøÊƒU÷…,›é‡åݵ¥©W‚`J‚-ÇíâêZ)‘ÁŽ’U"7 ±0aÁ ƒ!ÜÇÉž¬’í n..´³†ÿtT쥋ü±qÏrêÙ€»à‰¡õKÓŽŠ/#8#ƒ¿®œÛ®=–ûÀ og4w÷áƒüzO!µ½?£à¸‹Ç…ÀZÕÎd?*™qœ\ø­mÅX6=Ñá³PRµ“()„ä$´ˆq!*@JNÂAÔ¤RÊÄCeçÔ37©Ïì„-"„ h¸I7$Ôé¤P ÜÇ ¥UzÔ¶Á•aŠó¸}Z„²WÐf4’±o‡qPÇê8F=ŠI)‘ˆ}[÷ž7À‡ËŠÝçjñî/þPG› ?½çm´Å5ì(oS ˜úpËuM†PÙgézPÝéS¯šÌz±ðEn$ޱ¢Më ±q®%Óõx8 *ŸiÑ‘pŒŸ^Y…`é[ºÝ•¦l¥—†‹,SG¹˜1èz!3‘àGJMdA[”\ñü†/Š”/nÖ2ËÛ÷3¹òd -¦K7¬gÃÙ´‰×?ó òŸù&teñ›m*™w¨ò÷óÑüvx5Àή2Æ@iy…Î>+ƒ   3ó’vªú³]?çÿzØ[¹qE7;èüO®5| âtNfDØq²YÈú©Ð‡¿‰*_6CNrÀðÂáTÜ ‘ã89`K™®ølÜyëÍaÅv¯5`î8?Ü<5‹§¤{ &Þ›F* ®_´·$s~u€69%9˜òû,<º–³?yÆ£¬îZç•A†^%¹ ë¤Ô£¤àªT,›¾RSX¶]y¢©\¿žíŸ@¤¨&"&Ì¡)­=]¸é×!¢à¬ÚW¿§RŹ"¼9Üæ¢§!0CèuŸ¦Ýœ€*Ý)´ö| ‡³s¡ |A^ƒ·uGIw}ÍZ]£Q×Ú%Éát¤T{s.‰B3’(Š#ˆôÑÀÖÞ„{n¼œ€}Wö`_Öz—ìӽŬÎ?ùÉ(èшŽ…ë©%rÁÊ!$£©5]:Ì‹Ÿè°Y9_üvJûè-΢ÿx&Ȱᑜ*í™”†ó9uGooÎϧ/ ¯SÆj껨±•, þXø)"„ÉB0ÉúMnWÝ—㥃 1—+¾ u=Ý(½ð邺‡kãcB–cÚ˜Õ2þ®ÂîÚ½ ×剨 QM$õǬa–E´ÜVß 'gÛ9)µfÞxÙƒ´m»KÙß[‘\°[Þ`w˜TƒÖ\l8ŠÔ±ìhÛ>zÈÛIN¤n—§Œk¾$dYTZŒ^K=»/³øô–Œ§—ÏÆ—{›˜×²=²$ÐÑãÆŠd¶”J€±†×WìçsbgÖ2T7ìÇŒ$7¼Éhí*‡ÝiÜñh<ÜÈ (¢}ìì”qP¯eO'šEl3z¸{Ô¹çøÐ p[ PRG6*9ß¹3‚€Aì¾^\jø½½M°=6Z&Q×þ;z%fÄe`qª¿>‚ŸNîhÀ_3xð–¥UwõÃ`‘bBì}䤮‚Íy4L„Úl•^d̺ ÓèÚ!\áú5^‘`î œžçÇî=ZédàG)´P›Õ¯e<•b#ÁŸjªt?ï²ê"ea*çÅK¨çqHiTVf&‰ ¤¾¹Ç&+_ü~+ åH —b/=,ú½0Ìn.ç‰mcÞâ9ùR‡ƒÚ?äN|˜ó+» btŒ÷h«Éñð´ôZ! ‹îp¡_N»mAÆ?|¯œë¢ó¾†F¼Mˆ”²±§s1)ÑBX¬€Iy ‚”Í2ðžëyh6‡‰VAF]·g?Áƒ× !nÜ£h6ÞƒôÖ°ÒTt}Ðú²©) Žääî(î`oú8þ"„û ÑÜm#û'\G/VhŒ‡Ï}{µ(ãx?åm~Í´î¿Êh”A†ÅFûê°Àª`¯!]Ü©Rˆ]*>wßE Á~¿`hßá^3ÈÈnìèÄĈ1˜–¨QWÍ!““úöCVíëߊShw½ìM"å37ÞZÀMÏÝzâKô |â©Øl¥åëÈáÖ¾µÒð Grd*"Ss"UçPÑ{*êJ  „¬ƒŒ›7æM bVNT#ÍçígÍLTnÛYU]{qÆ/Ç¿`ÀçI+"0bÀ¥ð´Ì¤`šíc⢿߆=޽˜;1þ“É:8óŸÀkÀ| »èÛí‚;' bå8,ßÂ6‚€Üä Ú!pqP~ƒmB–ÏyÓ"~Ëâ Ç£Y߀²Ka´tÁN¬ÉïÛiW/Js½‡£ùM‡pÇìÔ(²Þüîwj4¼ù€-årm8àÀzOM¿Ô§”j~ÚaG•»k‚¦¬öQ„*2/ÖQŽãvpu@o¤MڛȄt!”°ŒªF±‡š“ëúD1¯4-}wå³.}Q¡Þ{eÞ[™ˆÇþ^6ÁJjQ?‘®hÇ?Tr9\®C›žÿ˜ûð¨®sÛ5½jtÔ»4BB4ô#ƒ „[lcáÇHb'qƒâ;Nœ8Ž«DÜ F`Ó\D¯’ª¨z—FmFÓß¿÷Œd NîM®ßË;ŸÇ£)çì³÷ú×ú÷_ ÓDÁ0y2JZÔº¥èìoÀú%)x§¨É·,åþ>¶ÈÙ®0Á Ÿ"ýBÒ–{”Æ*1<³cÃQÖ°)¡ÁX„_îÊá`jˆ‹Â¡³‡9˜±ÝC…L›ýÑÞ‘¢k{Nüq}ÿ^©\‘}¹ÃƒÄ"•¾ø_ Lïe`ÌB|¸OŒpX´jóã/};ç a×Ö¡-/Ü‚,ûذ^£è†!q Jë+±¿V‰Õ“Ç8p¨U]]-•ŽGWMEÙ+è–aV° 11+ÑÔ¿Ë~z?g}ã.Žý—•nvoy$çñMµ–^d¯¸æÁf$E˜£ƒº&®‘XÞv’¸lS¢P"ANöóZ|O6+ÌÎÇåFæu‰–µ>åƒðàXè" VèHF €æ‘ÕŠ¡ÑA2–¥hîF}W©( bç³.áÌú¹ûÇLD<ÜnÞj¶V‘ª¨ååì—AÌ‚›Yñ_\∵ §jsÑHßµ(é^DZŽ¢Ø\€—Å𧛯`ÆäÅ4ïºÌ ]õy4ü›ø=ù’ÚXÚP°µ´îKÈYÑV`ƒåÖ³ø_Vyˆu¤³ðØ5DG,Èσðð4ŒØM(i.ÂäÐŒl2Ò;¯L¥ü¿€ß¤Í¤æ^|"KäÐáÖùLz5«{‘Á´XiZ;{£îC˜ªˆP|Š›ö ¡÷²7¨™¹‚YÅf±ÚÍkÄÙZå;a%ù|àÌv¬š³eóu©åHŒÇ“mŽ,·k`§Ç~~ÇkÇÝ|GlÜ÷›mÉŠˆe¹Q¡É=_ßÕÊ7FL=ýœK³&Ò aQHŠÊDbÌ(jšÎ+ê„»A…vÁ©ú¹°Œ¾é1¶ZÌsOÇAa}ær¼°»žK×+4©Yõ 6™¯t˜³ ÞÒë@P@:ÒEü?G¸V„Îf¦f`Íl=ökòÕøó†ÄTõëÓ,Ø_§äïg>³¨@+jZ;ÑE“B«CM_;&é7ÁÕ²ö´škyZ¡¤8ë—!gpV%Ùç§³vË8 ²Z…gªßƽ7ÎÆòÁw!h&atÔÆ;¨éýê3£,(©ü¯ÔDcÌjãíΧ•å"t ‹Ž†µï+&*¯Åxº%¥zÝ'9‡r²¶7õ:õ‘†ë1Ø,Ší½¯t–ŸÝÎC.XØK01«@²ö£4Ñ×/~j[_|ûÝXU±ÍäFŠ‘Q™°(í¡=û}´cÍÊÁ+K ,^rˆ€—3j½mÂ0±è’N/Ðø©d²#ç£CøùA)–`x½Å›u0wt¸›Ö݃¿cdxØw/ˆ¶_h'nš…ð@1Ž—Ó9IÐH÷`j‚¡÷!íîg`õŠ¿?–šÁª{»¼sÆkÈ€/…Æøƒ¢/èßA,ÆÐøÖ§"¶ÑSø }ÜÆËI™|á.ù]}Û7,5 »ŠŠÐk໫ tŽ–TÑ$«@\Ô8 +è5íxìÆ;é\ßÇ ‡gêÑj©Í ¹qÛ/ü²¤bþÖùqÙZ±ÐClkFB$6ݲ;ð¶ÏøÍáÝÐð…|Ђa“^$R@)WÐõÛ¡ )7F,Nd¡µ³ þñ8´íÜù»Ã(ªøÆ«<  ~ÿ@ÚŸB£U­8Mgq™ei„‰Ð?r~êið 'òÊÔ=fx”}H7,#mÞòóã媢§BB“³·­CÁ8ZªBmG/Iâ¿+MóCz¬·/XˆÉfT6^€L&áxf\âB*mðs»ÿ.¡žWèùozÆÐù0&ÃQ*Åé6õI›w"šCÅÏå;Á¹'ªºxY&Y™•ÿb7Í G{Ÿ ƒÂ5]5˜ØÈ$‡‹÷29Ì6¯ÎØò¥®3YÆôÙ(,;Ç38Æw¡Ùñ×G—¢¡í0B‚ס™Æì21…“Vá‰j¶5Ÿ3;Ó²ñ£; ~þ» _þú ÜþÂ[¼Ê2c£ãÇÒi“ñÑO¾‡Þþ/`j;ƒóMJ®$‚YÓž¨•(:t–3DæÖ`×Àæ ¡arz<õŒ;.V@w‹‹Kloí> ^zd´ÒÓ굋:—–¿ ò¶}à»¶yÏŒð1¾;G»ž6…뜂ÆßˆÊV1>=õÞD«JVFŽéVŒ .$éñ™xóë÷`sZ¸Q–ø6 *=X’<³S–Î×î!íÀYÕ¾¢;ò¯›ó›Ü:ÿ8ôx‹ŒT†ƒ Š&Â1Í1 ]€ã:øiq˜à¤¥u) ¹ýSD«Ó‘>ÝÏüñ©“»<i ]ú–¿þÈ’Å\1 ´½Ÿw·ññìC%4žEpb‘ I¸«fÍ0€XaT`æM^N?˜ä0I$!¦¦Þ)Æu_l¸¿“0Ö Œ~lŠÑÇ„ QÇÈÈ ¤æˆÀ¹;¿8ý8¢B¢·j•!xÿÄY Yx¢6ûêÄXô±jHe¡$í`bM‚Žþ"¨ÃìXeÛ ²çDµ”¨%H‹ÉÄG§~Å_ãbém~",™µ—Zšq¾±žÇ1fg—x&˜ !¸'ó§$™€ÎŽË8]þ.ÆXûI_C"9M<æNðEm`zB6,[‚3Ûp \µÌSø§[&¨ô=¿Ò¬œ‘bd~ Sg9V“Pë"»Û>”`çžwþQ :CV9›ôKZL‚ËÑÚÝÉe)+&HŸERM5Iqëðá±<÷áW0u÷óÍVë¯à…ç¡:n>W±³P¡‰Êêq ÁO–CÅÅP¸ß±ðzôZËÚ¼ÕÅÞÍ$–-Â6@¤Ì"‹<œýEI0¦n¤™÷ôÙ¦`h Iѳ8Û4$L d8ÞÅî5_ ã›|–èñóÛ¢QÕx&b(¦Ä,1¯y~ŸÐÔ®Àú1WO³é¯ïú§à÷è"šH•\Y«Ð¹f„ùo _z´°Û”¸ýóoþákÆ­É~N^ƒ ÇÇ?NC{û~7ɈY3'ÅbÅô$œ¹´—>VibªGÄm¿y©ÌßëÀ7_‹ù $§O‘Ñ)F\t’ヱ(9o'x…Urýüx›þáo4k~ôÆØ{ü+øû‡aÓšëñØêù¨¨{­]§Ñ>œŠ#—J9ˆÄ…&â…û_Ǫ_üöb¾Ä6RÆw¢§GØ'€ïZÂø±ãÉX;*Î]úóº¦ÄþX çv+s€Æ•7[oe(´t+IVYv¤’#æaARòþ=ö8YbzͲÅóPÕÞD¶‰B pÐàÚ¤n.Üäô︨ LÖH\ÈåŸ)%ÚÌZí Ó &eÄc‘F o§6¥L‰ºy£¶1X"–ÒÿÞ³#æÇ~¯6†è\ ±kÉ¢™9ýŽz¡_€Ú/‚Õ³ñÜ;»|éRWmöòë°uý÷¤05uw ¯ü\(©?ˆW.‡y 2²jZ™Z¢,D'&b)¢Ã—£{PÉs8õaáVu”V_z`]£7r¢dRìtA©ŠÃžW/¡-´!d4n[¸*¥ ¦¾Khl‡Ýùüg·_£Àô¸åd@¢q¦ú]Lž´ƒCû‘•‰c5 ü8w/*Z¬Ü×xç’ë¡r6â…ϼ1Š×ÅM4ÏÐãã§æ¢¼ñC¸<“ñ›×MõI0Ûî¼vÚl|åD÷? xÿþÂÐÑÍŸX9EÛM£¬AU!-ŽÂž† ¬=—îÚóðËû¸ìõ†®sûþbÄ G x¨žòŸ­[Úæ" ôeÞácL—/¦{äêE(iOEÎÛo!còm¶qvÚÓûâç$éõ5Ž”|…¸=Ï_­6.4lÑ~¾„ê,Ä„¦@«”âg»>CÞWpŒE2d~MÆöÌVÑU›_z wgÎĹŠ÷±çŒyËC’GË–ùúL†˜±Â¸`éæèP=/—¥S`ÈBòÜáFuK ¦%¬Æ ÇQ×^=ÁþÖ¿—Ø”‚Œ šæüîzϼRD27hƒ•§’Óë!vû ¬¢$ÇÆ .0"ÑÜ¢uãIÁSÓV u]—PÞvN·•Ç8ƒdÒ8@-@˜B?§ ÿÄÇæ³ ®L‰Äcˆ ͽ׸:ß:V+ô T¢o°™`Ñ•±Ã¼ ›$?¹2ƒsQþ*¶IÆJxèCg 4püüoÜp²êTÎ׿˜çÛáΖH¤¹q‘SNRöðûøº§ ctM¯ GrÜ hå2ô[zxº“•d½  #V«¡QŠ¡n ŠÚ0)rlÖ‹! µŒõaá´;°êWŸ³åL‰uGÙp„$]±õavœlónì<¹zºÈ?sŸ}&7OëõrÏßéß¼¿žèÞøOÀo›d®z}öóZö¼‰d]VÄ 'žÏjüݧ—…¢òr,I7àGkR1<´Ç+šá‘¡G솆îÛ4Ù˜¹ˆ”DzZ'úÑ6×Üîùð|;bÔ0è³PR½_V—AÕêÆg54[=WuèyëÒBÞuÿÚ!SE½‚¥…aJ¼½ '@{]á+² .”Þ6Ýê„þB£jD2ܶ ƒƒÝ˜›ñIÏQä~ñ!2§H°jÁÏñðŸÞÂÞÓÅÿ”í?ɪʼ³y æ¥Æ¡Út,…ìÀùjó¥Ve©Já6bÇò¦OŠÙ–Š:""ÝÃmdˆìœÕkƒ¹¡ÓÈã°ïT1­U‹=œÞ(¦ئÂíKã|‹åM…ðcmf•.`*ÖÂb<“V#PGD‡H¦£w­¬]éS)t‰13…ðÀxúž. [ûèóD¹utþôY~hên ƒt<ï@™ß–´çöðЬ,AKO R¢ ‘")RŠÆÃèèm*õå<_Ù:×ð-™.ùÿ½[å»Àܙɋ²»F»PKÀë kÉä*+ÅüKì£Ù¦ÅšYOCçüuæx̘/M‡9$ ~ap8í…#Ö½r™zCBôk„ÎB>úG{ % è`,M¢àùŠM]Uèìo‡Nµt:¬pÕ O¤;”ŠÐ€tTš>C'+'dóªÐÌí*£›Ç#F”:b^€þµ]¶«–3Ö1 Àa@«Èûœ‚âwlÅæ×ºqÌ&Únµ‰}hJì$ó½ÆY;§F{⬮¨ìì?¾ŒÞAýÜxh  /¯“e¡¨´a4¶*štJþÓ:Òl²Zš·ÌÎôZªÑÞ–ªÈ5$DmÆÅš?ï©Í€· iÒ"Tˆ]÷ñO+”hšü®3½_Ðcn+šoøñ¶+ên³ØD[+Ûâpä¢ êú!žrïˆv`㠃Їû;ÈaÌnÁˆu#Nw¬[ülÖYÓ½Íå@¤f*þ|`/ï·|×üÄF,üÙg4é\úr¦B¬Aðù¼Žg~÷ŠJþRÚðšÅŒoi'IóÂôêÉžøo›S,ÉòU©¾rVfÞ÷_¼g‹þoÇàçn½ó–O,íÅ-(«ÜƒzRNºA¬ ˆ•W"¤¿¯0¤[é%9Z;€mu¼sºJpÙF‘¢Ÿ_¿· $$#GÑeóàË– +™«ò幎3'ó¬)c+hš¬wä0©9+ñöüÌŒëKN–>™ï¯AVrÌ|¼°û42âƒPÕê©+ÑÑùVΚ µÒÝ=˜‘ú¼zð~õÁA˜G­ß†{ÞP«Y¡øËÃÉdTå,5õµ˜•²Œdz•jäÌ{ø†IY‚0I8~ùs^ˆƒm<¨ƒœ° H.¡„ÅfÂ`÷ ûËÑÔAóƒî¯Š#t/ÝRoÏâäp)îYö[ì9[‚’Êw $&è"éËBNXè‹ÉåÁÓAéÐ@Gó©}Ý-7Tæ_³°]*‘ƒ…0R/~> aÙ|ë#Ck±;s¹Ã½­¿Ù`È“ ¾ªŽÚ…~ßø²JP•+2¦#:Њò†3f§‹aÿûý?¾óLm°Q¡ðCsÛ)HÕàõÀœ6)ßÅUð—r'gDàdŒv_,}EHB×Äo¼(Êè:fÔF¶@¿@žÄí$]jéã ÕE3oÄ*CK÷Ûú»¸/Q¡vaĦ 4£°ô¿8¨1ÚÎvŠ»SY%¼â¬_@ 6®|™¨ýo1}Òb´šÏÃä7GìÃ}ÖTùYj8« äà·þ. ArtZ®\Ê2`ÿÙ/QR×(ü$·qdNT€»°XbŒ Ö "´…M „Ò÷' Ó°ê è'@fwî_ýjáî/W±d¶3N]úÈ wû£©%1!áUÇCá¼h~tYsÞÞÿì¶õɺ_•âú–1“/[ÌR±Ãàvõåð«CY°·ñû-õ²p+7=è|'¹<ˆi–âÙ7CG@˜mÆìäŽüº¥ñr‡B¨íšD,%cï-"«¡gð’^#1û‡*„p!ͽmØ}¶?ºù={+Vý×4š½z»Ñç³b2øJà»EÕøÉº'öþêÕ7üƒ©£' Ë&Ì»üXæ^3G ,»¹d¥Ë0õ I7ùœ×ålÜaº‰dHä,´™g¢­×Éï¥Â—ÖÏ@°Ó÷aÑÁᮽꃵ~…~òÖ¬æžnkÓ†UM#Cj@M„ö£ ¥U¸P;ïÆ‚wÇÑ·ÉÀ7F,báÓ#ší!.ÓÿvijÂú,1zñçCE(kÊšú05Æ†Š¦÷&Åùêó¬D”76Ûò4î\t/î^ú8öŸ«AiC;.š:¼Q¾$5X…»‡#)ZÌ]KÕgÑÓÛ‡N›lÂ¥Â?X+d‡‡ÌÃå¹@l=lóÁ+ýLŸ¶½–BR0_Ñë"1sÊ͘b‚m¨®ÑF´R«î“¢ÇïZ×í$ò3Üd¸‡ÖÉshéä-h•R ­‹:ZÏqˆd°¹(n¨F©©n-Ÿ“W„1éʲ^:ûZ ¾d“ïQÔa‘™lnYn~Ab©Fx"wÄR&˜ºk`¦{@'0èñ5[lcØwîfONÀ¼Éó„ ÕÇ÷¸N¿¶˜ð¬VH@‚ÞÔWÅýtþ*ÌÃÍ~ƒPGÚ1Ö/åõÈæ¥þ –á÷Ù L¿ÿ£¦éÿNc¤ëÖ/I[“s°´Ì8-b:ÑßB8\p’4µzqÓü$IM4ð½°;ÉJx·[û{ˆÑ(17>âÔÛˆq…ÐÂíD×˳ ! „V)AF\Ì}? ¹gBlìjb‚¿BîWÏ"RdFR„Ù7+¯sD‚3­2_l^·2‰Ótwæã&™ÄeþâÂÛÆ®Áº~j±~pD̤Úö–>žr©Ô»•3êGk·ÕMÞÍ)+s8“ådÌ8u2>úòÎ,Âèl²’Ð;ô#)êÏÙ¡’‡K\n:br:G2þL/²`×Úyw•<öò 'kĹ=#ÒÜ„ûÒ ž+žÛõîöˆ›C½ýt}‹Ô[†Ë'Ûèßõ/_K´õ+º&;¿'k€äëñË,]͉—^Øzß²zA$¶çŒ´¶w—,3,Ã_üUÊFyç(–&ÛÈyYÏý ‘Ê> ÷DH“Æ ÙæHsW+"C~@ÆëEý?™>Û^RúÚÉnÑé÷mž«eïø‘3Á,ë4B‡YÆÔtng¥cÖ+QTú.ÂE"n´Ølws?#bq¶ÇfNìê„ùX4¥éé7Þ˃nê(ïI¡–)aˆOÄõ ¨n®Äšg¹Täc:¾k*þF3êê—èYèÆ“~ ëW¬À‹Ÿ¤yëDj”QdüœPzœ0$܇!–"×ÛBªé(ßE·^z ÁÂ$,IMÅÚ¹zúÈ^GÒá¡ù>L,´—ê:˜|‡uTŠÖ9<¬í$]ŸÃååV³Sfã‚éÿÝÍ ¾Ò=m—CB`^QóÔt áÓ1=zº»>Ž ,ÈlÔ~ýˆúQÙæAU·ŒotôØo¢ÏÆö‚ÄjØdþDXG¿nÛá"¿P/à ´díîÅ€_ãÀ‘cˆ0)7À/”·¯dk·ÇlbV³åû*´˜­øÕßë"‚–ì9Z](D¨K‰§ÃÁ6sù¾ÞEŒ÷ùú:L^ˆøÈd}c{ óoû®ð%Oœ™ëi)EdoÍWRüä.¾iÁB.¦NÒbfL,ÝÄVbga4itp¹ºL"W×®„‘‰‹xôjnÛúÞxôdãköÖʦchÁ_rX:n»áIŒuÿmõf­6Τӄx. ‡¥ 9h°ÌèìÌtKwj`\9%ÖÜ;ìØê§z†zxaLSׂ·¢ªe25–!;,£¥Pj R‡€ ¼ Çèp#ÉÔv¨îä=c­n -Š´Ò—÷¿fªjmØõúÓ£ù¾  ¸ ˜„–Hwï²Ì‹‹¦LÛþnA.zɲšºÌWÅN·#sŠ…^+÷ÕM¥É¨Ge‹“³X°þg"–¦¥£µó4~ÿñn,2¬!–à™7^ãŸc§I?@ `ÄAF†ù¹h¦(E®ñï1©Ö'VÏÛJ²]p½žÎ%”þ±ÐI 'Ñi':XìXþ»'7ùêª!>Ìž×ø7o#pæO\:ûÅÜ¿ÚC ¾3'ÇнŒ„ÕV ©öGøÅû5Èûò“¿›,,'wÓÈš;gË#ÆUÛÿ[Iâ$–²%|ËŸy¯×Nõ˜±2–GÜ0mH/h\ñåxÛœ+À6‰T±5uF>ž~ýÇ´àšA€?D×:ê›ÚËRC±8Ùm]ÅÐɽ€ê/ÌóóŸ®q( ßûÝaáe! @fh*Ra¾B«˜<3¢ÓI©­@y«Å—‹x.µ><ÎOƒ$š—}]Ÿ£´¾)ÓÞ@´:š?DC[+òΪ'roÇãé3Y™{VÐõ"ý»ðµMGŒgªwç^l8Š–n04J&…F`þä8Þꢶ¥²ut›¸÷¶sÛÞ:”½uRp'’ßÁ_½Á,å”ù%i°‡Änî—”Ó÷étj<¶ÒH o¯éîµöøïJÿ¯ððñŒ‘2PP)ãÉšíâ~4™$1ÁK0Ù¿’bÅZt Ó̲-l< XÝ‘}©ÓZÀóxÛ®fy¼YdcKÕbOÑ¢´¬­!šN²v¾1b±ÔÃÜûµÙaÙ8î3óù¾¬ŒÒÉá0OÑ_o8Ú0°69úŽ-ÉñO³²@ÙÁBhîäè™tÓ€”õ4QºéþªqÓô›qèìnsÙiºÔª4d-NÅØhÜÒATÌ/.S{Ô/™ó b´-8{¹{Ï]æÀ§ ×ø‹½ªÅ¾ÄaEz0-$s1€zÐzã¹ÓÉéÿÅ.èWIÏû£a¥±ô†„k§ÆLÏÎ?þ2ï-ñù𘿓º7fB-w¡¢áôDE¨Ö–í›{Ë·7¶ÿ kæüoi‚éò~ ‹½ùòa X»L©‡ê-sgÒõô,O/9Ïìt9›LrÍ:øGì)üྣ“ ´ƒ±gèKL\E70Œ&¿™î4DÊ`HÄ¡s¿!-?xU…L‹;ÿIaªÒ§ÿö³]¾"¬#ÚÖIáúü›Rd;Sg^,ôŸœ˜³3¿]ûw7Fmw+ïÛ\ÝQ‡º¦s˜3õn³k¬kËôô7óXŒ¢R¡Ê KM(Ú‡Ð?lAŒÎ‰$½§k;QXQ…A>vÃX÷“ô;«9¶(•&°è8ö-ÈĻ3¿ojmþ#cO›Î6è„âF1¦éÉr’¾0ÿæ¡ÓÕ¶7%áÞmWìV ÝCÐW´`{p@¤0%~>öž±ãé·+ø¦Â55S'–V5gÆ­xrež}ÿwãWûÇé#6 Šª´…ƒ ßpˆp˜¢[Îý¥÷[C˜ oW8^¼â UÖ»®&ò±.:9/wÐÝœ°õí»±‰:“ÓòY¡[¤ Œ2™^%F3†ºöú¼-÷m|p>÷çü/0ó AEr ¹÷,0­J· þÚA«Öy‹?[5›ûÛv& ˆ‹Ñß™]܆OŽ}Œ`íÌQ„’ˆŠ{Î x§à¼·±”ç›Üvß‘|ž¹©pãkÿyŸÙúòYž÷.„àDÉ´öËQÝ#CL …/<ãå‡7V´TçZF»°0ÙóÓÖC&‹Æ±Êz\ll¥¯rÒ·±Pæ'k‘é$£×S[9ß}RÂDìtã•ÝÏ–>. °ŒŽOžŠÎ©7/Øz¤xÂI]¦ÇÎÅçÿ†a‡Ý¬S¸…2“×¥¯ÄÚópºî¯§7b5!DÈ@Zì*ÈíïÂâHÃ/Þýcö‹”ñ\9Ï„œSI Æ÷¯ƒÜc!¬1yäѦsÕšyë3µ?4 ýM¯ÔÝw•kÌüã——.žy‡Þ'‚‡+Ë‘{7UD>P¼uötöÕ™n¼®!~|³ä¦%¯–¼sô'ÈLp <êe¼´ç5 õ\Â«í¥ŒEJHŠö!>–˜|Êdºn+–™kA›¹0ïæy}ÿ#¸ësÉžP!#kqÒ<“ÛÕ²Ó6úY©H–+ÓÞ§/¨î@iíÇ€UÂK$gØ•$‘áÝyÍ^þ<*›Oç}où‡‰ {M¯üÈòw—±­qY¤Ð=aJ‹Oß.h”YÏš"¢ž2|qéMt›/ò©Î…[fÿçžåÅWs÷¥l‹ ¶:lN“ŸJ¢OŒY€¾Q3>>q˜&ò /l<˜ùž™ó|ÀŒÒï*¹Ïoø5öÌAeGnLK$‰ßH7A·¾læ,,X§@c»‡þl47X\S^ì EÁ‹Ÿž®<‰¨`Ö¦˜ØþÖce¬ð°QÞ¸§X!8É 'EY¡»øßñðm Xa>Yþ¾Ù0)]0;>Û‡—>ûÊ»³û-œ¬Üi1cgá§y§xåÙ`ÁÛî³¥KÊÙmb´zäר*»?Þ[/p¢ÍÀÌ)7Òù«±è—&±,øÊ²BØe½l²Í„â.9 ññ8õÛï£üÂ]ŒäýnÌÊk€Ðëg˹ð c¨2‰ùˆF&\ëþ¸r­Û]ŸUÛW¶¶~^iÃÔpšP’£Djh½Ùcýrúý¯ëX©%–µ‘·ïÅ!>!ïŸÊêÎåþK“óŠß 4rs£\B 3j~ü¦…_|ÐŒ}çù8Å“Dlôæì²Íö{ˆà‡‡—'›ÝcŸoÜúˆ=ÿDQª'5å.Üÿ—f\¬Üïën&Gj°ƒ×KÜtÇp±ì=¼®¯n^±¡×'¤¯Kƒ/l‹¥ióIú‘þ3¤{>"33a¬tùì§…ÉQzˆTÈ|æ—0u÷ü÷IÇ«OÁmóƒÑD(ÒÐ|ÑZλÎë'»îI!Û—Û»c~ÆØ^bk[U 1€$µJ.'öæBd@¢üÑÑ[…Ú–:œ3©0l‘`ÍìT,™þÔ¶Flh>8zç/Ÿ˜`z¬kSÔðÊàÀˆi«ü9`ņ¦SÄð`üÄG “ݦqã«_§³ð”^œw÷ªò ðìÚ8p¢A/|qöEhÙ¦¥ÚÅ;ѱØAmx4f&Ý‹®‹ô\¬ƒ'3¿éc‚lCÒš\:…Uïbn¬‘!7¢•Öô'Gÿ‚ö^ÎR£îè-à ½ 2¥ý} y·­ìÙø¯ZÕkñNü¿Ñ'ÁªÔB…d£ü¢³åš[¶)?ˆ†:f=xÖ"MTMR²bœpªÜp*\ˆ˜:^^ʾØÉnŽJæÙzð r“§§¬Ê^:ãÌJ]¨ˆEdïÃô”ëàr\fD7gËÕkQvùO°õÊxCu•X ‡%qSä®÷¥é!^plì쬆Íø¨µHŠ^ µÂ:!Zz„»Å„R¬ò³·úóe¿>Cã58Ø ëX¢t˜–¼ '«hñÙm p‡D@)÷ðÙ=02ŠK-&(UQWîhCƒ Uá…=&~Jo@ÃÒ¯Xòþ“’ÇÔ=6s˜/R~œâñdù±¿«@óOCÍ&Æà¸”õ‚Ÿ—­Œ-ñùÓøñæéîRflèaÖ;\B£Á¢‰°ßí¿þøý"æ¯bV…5jn?æ5fÄJÊs1ìY*¸E~¼Ÿ ï!áùfÇ–¯Ç·Þÿ§‰²}9øéƒíy­¾C¸÷ÏÕà· ÒÆÅ æ¬5âNãíÈ6.Ç­‹î@}o¼ðÉéÀ=s~’­Sš ë{ãò°ü:Y…f/+Åñ^úþX؇ @R#¾ÍˆdÓ£^`7ò:—‡šãï^˜¼åÁµ[MOß¶¹0&$» ªÛå»n˜ÿ«x%š óOŸE -ò+s‚Çfð³¿N?6KùÈk•øèDbB’ɨ§aØ#«4î[ù*…Ûœ:ɱyvâõ¹á~IF»Å‚ž¡f´öÕ’ziÀ…ÆSø¬ô ´š(Ì²Ó¢Æ ¡qÚ{¾ /|ø<>>þZ;Ž kÞª«‡Å7à½t/ûÉê·w_B¯ézN¢ äe˜:!VhÅ´?£.0>Û/ Æè'„Çf1ÆìÙ'Ï]_âkNûÈG9 ‘µä׀ΠF-°“?rñ¿xÜ®\9‚0ËxEÙ¼¼ÒËû ûÌe¸iúz´'àXõçô;ðÃÕ©Øzǽ¸!c:J.Däb1]3_)çß¿ï4 ¦¢öAƒZNw©3k¸ëžµNñ4ãWå»PÛU1“’./ó“ôÈá&Às8 ’r°` ¨T¨1),oïŸ?á×ûófKé;Õ¦ø ©11á.’”$UjjQÑÒ‰¾a‹—QÒggÄMÆÒ´ëíWŽNs)Ï8ñ‹¶CBìJ£$––Bà"‡ZÊ+·0 žÿý;]¥»>±m´;L¹•-—xç”@÷ûUõ^D‡ÄÅ%¬Œ‹+/ ÄNÖÎÂGßI“ècÈ¥½Dßpº¦a~l§Š:³PLé[}`‘b‰4‹/_”À´ö ã½ãÝ`ƾ™Ž¼,<- VßïÍ2-ϲ˜@ÎŒ…°ŒVcÄ&ʸîIÿÍdÀ–ÒÃHc±óèËæmÿ òzˆã;¨ôµl,r±*–ÀY”³8~ÈT ü»Å9Aí’í× ;P¢’¢Rɧ…PÒ¬ÞÚ7Ô•‚Œ àÎr‰mÄ0£ïµ¡©7h«ÛÍ$çàï‡LW;/ýwæÕ1­u ά ÏÿáWE¿úøxöŦ.ŽÉ,ã„•º.Öʰ¨äJºådÒŸª,÷¯ ó£Gx™«ÝUª‰t3ö¾çsÃø¦°*Ž „‡÷è )`òßóuiJ]Ž‘Â—÷íX@çûk QÆšfOÛìtŠ–r§úFzbñ†W¬ú1wa;²t-GkO`qâbZ¨Bï ­]V(T­®ÅÚÙ§ðÈðú¡]|n³ööZúM ðScL³¾¼ )–$MÁÔèTè”vønÀÅÆô `Iò¾.Û1w(4Š8š¯£&”X~÷º„ÑÝõ1O š²=u̓BÑÅý4gÊxÐ=k;8:ˆ¾‘jô°¢º£×ÜöuÕ¦“{L¥ÆI‘S½š®šŸ§JRe©0$ÌGá¥F’¾%¦²ga0ÿ6ž/{ÃäRå†ù'eI%J¢üûxï6!â"#Xk@MÍ~˜Cù¢‘°œ^¢ÅÞRóÀ‚äL4µ4_ÙÍ,_›E*ÄÇ­Á¡’£é@½gj8½ƒ°¶wDB).6Õ¢¤±ë† u²š '1N7Ýü%8XV€¿\®ÃÚ™™4G'ÎyÃmî¼c'G—êƒçgvî+>‘_ÌÂGàäñNN¶!²4m!’I/œ)+ƒ¿`@Þ×g ”Ù(gM =\>ûÓ,tñ2Q$ï $T ý±1]O/ ð‹Æ–Î]åîcÀÇ “rãÉü×–-ÇÈðKhî—f±²[ãEÄøŸEijb°À ‰)4 (²[Í –ÝÁXî¹-âl1`ñs#²F†9b.! ªhS Õ­]¸qnêº "Íd§ûÈ ¨²*ÒnîçQÑø °kÜqÒ3ü«sê¬F6~Ì(® ÒMÛüå¹ßqÉˤN¶³ô»oê)ú«eø`ó|Üh–Ú†ÿ¸n<ÎôòësOµ!›1+Qµ»ZÅ c*ºW¬µÀM3C`ˆ—¡°¤ºô¾7â6c—º,Š>ÃsðñlŒŸèôÛwÿuCjl"c½¬¾^‘HäÙîËY.´Œ^B†þ:þZ|Lž?6c˜Kn|•}ßT›¹²L;žÈ­ÇW1~ˆ _„âÚÃÓ•mgƒhêfÀ [š•\àÐO³Õ!á¦R…7Fñ|s n˜º !Á&4ŽxéXø“ ]èê½€ˆàtä¬;ˆËí°Â»»ÊÖ¤F.â”xÌK΀yd¡Óðáñ¸Pû—÷ÎQ¡¶}:*›kŠ–Ú“LFRXbÖ®ÝÝF&iCÆòví..UÉ/•ÄG¥ð]þÑ^8\v„ªuHˆ Åè¨UmVš͸‚òÝæ]»-›+Ïm¢‡^`ÝìxkY1Iú“HŠÐä§Çß–ÕÒ%2}—¬þmôžtߺ×>=“+A|vDè °9ÍòË€©îÎ]ú+D$å˜OAL åf…MY¯ 7ë°6 3&MÁ×çv\µKéouʧ ÎŽE©éˆ ž ™D„á1Ö\Ùíø¡¡£ uí}(kSâLm'æOãå—‚Äde¬}pŽÐhED•ÛPÚTGVu11‘cß”‘ê9±%À²á±U·Î^¾€Óµ&XlNž&gçUQ¼,N-WbyÆb,™šŒ³åäÏz¦b±jš„Zü¬JË5íb%´D^Šdurt ª{‡Æe«I«fuô”8X:Àë¾±…‘¹{ʺQÜTÁÈ•‰ðãiLŸ‡¹‰£¨¯,eß_H‹m¯X,*ôUºþ‡ÇòÍ<6‘eKdÑOÁ'§0)Ȇƒ¤¢ÒÜ="˜¯éQ¡‰@1ÚßfRGºò[$›ÃnÜf¶á¸V†]'üQ‚ù 7àxí—1ÙÏf !¿Ûц u¬a¶|¹cp‚Éo˜Ãa½ßû¯ÄÁôK&<2[p Éì°—áéï=ˆz™ËÞ¡v„ãþÒûV܃‡–"Ò¯*Ï6\°åÊþ0þ×ùkƲ•47˜‹ã¼›!ø]¶—êŽàÅ~ãá/Á‡E§ñÉib¬/]"5äLØ4'âɃÈ?} Z௑##.«fcÕt'Êë¿Â'gŠ%«ðÚyï ðËV*tþ‘î£Ð "DGÆ·[Túó‡í¼_ï4—^¿Åß$òº0:rÙ‰jd/_¼¯öO°¼_U—*\?e”Ëäìå·!5LƒÂâC$íÛqêò0>:шi±ÓKÃúϱP+­ ­±ïúªÌe\5ë5,Ÿ± Nn›>KBlVNžÁ‹HIYM æfTuïÀ´°H®®Sƒ3ÐØw‘? jc–§OGAq±Á¨U:l­Vê0<:€ÖN ‘•pÓ$ýLcî cIù §ûÁnÉÌ šÂÐÕY‘Ì–ú„t>/–èé³›/ÏÕ×µŸ2%ƯÕ¸˜Ç«À؉©*€eâ„*oE€^ ›§¡j©>K¦(Õ¿w¨wÝÝ+=¦kÈU)¾EáF¾³í£Ã³ ¯àÜw€ßY[L†ÚÉq7„E ƒ£Mèê¤ u‘î„ r6±Áѱö ¼á$Æl£W5.þíÛ²’@?A«ŒGjÒ=nÂ0I­¶á=D«ú`éó–lÑ#!Ô@Ò-»ÀÊ™³è&ô TÂ×U•±ÀÃ|T4ùd¥ ñ·Ã8ù²98æ o8Ðýʶ€ÐG·ù@w»F¸9$(:¶F×κ± ÷ °£V3»1ë>:ïGVÎSòý—ãÓS_ Xˆô´»ñõ…—y)n&%Xͳú^ 1ÆHÜšn‚Ãn)$ùËËñS Þ9`üëá2ämú%v|¾›÷‘àòlô›ÊΌݰ§ÄNÅO>ŠÅkèl>Làï4ÓgüƒqçE%ŠU›º‡$úQ K©dRtøÿ0ùqcÜfߎñD&†–è& Ƽùª#ÄÂ˥欕pC¶J'x¶B….ÛZ\*{û%¤|Ä,æï÷f/Ã%G 3 ¸Óp™ÎµÃ\Ã÷<6owM]©/T:µ?æOº Z™=Oáwç.·{Ø$×d}§²öÿY̵Ç+ŸJ 2ÕÖЀĬ!’Ø”Z•æá.b?ftö5Ñïý\â\Ù«óíýS¶¥Äø­õ—+ µåm{8ÛH6 Øo)ª*ð;î{ ó–nŸ¡_…–Î^ˆ ~ô!ô]£ø¼¬îa)Ï`)AN¢Þ*Ož `3?Ç«Ñôtï.è5WmIMúÅx“¤ñê4¼7ªÍ!2+džB_@>cŒ·ÿÒ¯dzì˜yå¼{;ò2ÓDZª·a· q2c¨I1k°ÿÄAÄ;ñƒ¥<‚~úxÌÉ3™O½g5ÎN]‰Â²Ó(m¨üÖñ3Lš‚'×dá¶¹Nô÷䢯£”÷Že <žã=XÊVA–­VjVÍá´ÐØö‘á)b9×ö_þo@Pï˴ȺÒG©uy`´#Àé#µ*‰y0Ê•6¶Ùå™È¾­o65~Ü;;ìߊÿë’‹ñ… /%ð›þ^Cl‹®•×``~ºé㮀% µ£[å¤2ÒÐ%Œ™´Uð¿+dÐ+U"½Âçj`¹ÍL*’Îv|òÌ/ñ‹]/ñDÿŸ¯ÿxå Š*êþî»ãœÿöƒTªÔ˜NLÄ ëf)™%´l6æÜ8X*ËJ"ãoEòc,ûù&Þ8žçI“1¾²b“Á,—šIdî+ ‹ÆÖõ[°åÕ<³nêÛ># Ñ`Vb:VÍœšÖ3øëÁóX‘6¶#kŽÖ –M1Ê• 00:H@é„Ýe'ài€Í­E{Ë9\4Ùxuç…Sî©õFœÝþR”›¸ /ü³ù‚NÙ¥»Ï7:õ‡.äþÁÇVèoDùÅ÷¸_œ»²ØÃB‘Žº"’IÈÐëñ奭ަHƒž’§ei€¬šÒC \‹å©à±îÙ¨oÎÃàø¿ €×°’ W¤ªgðÀÜñ È+sÞPø”;ávÉQÙyõu°±þ Næw`Í ü\«¼±wÆ”« ÂÑŠ7¡#°í±*p¹½ô” ·ˆûbž¾ëÏho}%ÿTuãΙӞ/HOyäªúe¾óªÚFmbó¬IÖuãçø½­~Ûä2OÆ´8ÛÅ٠˶¿l¤È%8]ù?‡™“qÃô¨k«DÎ{'xÀÔ8GaLjx“Ÿ/o±˜J/®ß>›¿óØ‘ïí]¸0YGrL‡’e‹R£9 ‘B/†‡Žc¨¿ –á‰*9WÅÿ}öÕä,…"6wÀê'Ô´ bØj£ '¦‰*Aj´‹“¥(k8ÍÀ0®á_ X—å‰Ýsý€N÷Ss…9Í#ñNæ„?ô‡o|÷Ì|à÷/o€4(%8©“m$Ìû'?×—Cì–ТGø†Qk“Ì $Ó¢°³nT käß1y$Ž!\Ëkø™23f›Ö/Û`ðÀ)Üñ‡·H*6M¼65Ð38@so¨^ÚHcìFmSA< Ÿ#«~ì_"{Lû;´Ž¥åÉ~ƈ¸!V>‡^Þ…|R J÷rüüÌíñÓÛîÇÛGÞÁÍé•hr0Ñ*•¸}a&¾¾X†¡“-™™SQz T‘}¦N¶=Lç6ßb°:!RÝ.þ-êÚu0[G9€­ž÷ ªß蘆(kÂ÷oyëŸ.ò½…Ü9é?ÍÞž¿ -½­X¿@ý¤?àÃ#AÆš8ùy­uŠ«?Ã…'æMžÙ©k±¯à—ÞHæûÓº!§kö8DˆOÃÌØ™éÅ91¶á?tü?Àç𥽠LžöSä~µ÷,}'êwóš€n_–ÆMî1²,@‚7Ìú ÉÔ¨2•š•"&Ç-”ö–³g%ßÙ„ÐbóÍ?Á‰K…ˆ [C“L‘}ïºñšeJ…Ƙ3±aó0b'Àt+XÓiø«#K/6ž/¬ï¨ß<`9Q8b5¥ENY;ìœl¨!‹¨Ã ×ÁekCïQóùÚvSÞ)AM ›ãÄx!Vûn^âl¼U Ð›úFˆÝ©ñäê%ÒÀnïƒÍÖ«¥v[ž NÇD79¼<žÅX_îñ í"©>» ¢wb6y‚YX[¨qÁ<×4$„4±®vW¹þ‡ (ÌOŠÚsêrÛD¬c‚7öÛqeaSYt{kÇîü>žñ²~V˜à«ãgüwî•ZŠ ~Ò|Þô­éŽ2ã̲ðàïÿ®»×£‹ÂXlfy/ë9ׂ¼AìUß±ýƒ;õß°¦qÖ¦s¦ÆÀŽÉÔª~ÙUͫƛ\½´1sâóæÍ)âfõSþÙ"‘‡Iá€_®b€L€(.(Aa·£{4/t+k…©»·iQCЩDˆ R!&$—š­(ihâ~í@4`aúïÿ!ž¨@ãÁÒ)¸P†y“¬…[683‰ùéïô÷Âß®3³sÙ¤RéŒ}âI†´#jÚ›ñ陯a˜ü=t÷ŸÂÅêL™´OÝñ\éÐàƒË5€AsF†Ê1fé`ädSLùiÂÓ“6àý£GÐÜ]‰Ÿßù¼sìcŒtõ46«gfÃl¾ˆº®D…Ä£Û\^#Hd±†š¶ýÞ`šŒ1NO}IáðŒ¾ž¢oÞˆÿàñÿ-ú@°$iÚËù¯ 5\Š›çÞ‡ª^7Š/¾åmáHL1@æàg]âõ‹ˆ-Á=k<¢·?EvŠ~inë“&Óy¢ÙÞ"ŽsSDR`¶¾ûØû¸¨¯tígzoô"0€"Â`ïŽÆF4}“˜d³©«nn’-Ù ›d7›l¢¦™lvLLÑ1–$jìe@@6t†2 3Loß9gÀhb²wïw·Üû}ÿßA˜òŸsÞó¼ÏÛéà9ž½ÿ(9y×»i ››‰>s+ŒÝÇYe‡X’ˆ 7 N¯“ï'Lrߊ >cæçáã³ÖÖö(6Š„C¸iÒ S×öÍvÛ…"jê.üY¨+ ÖêÒÝ+‚AÀÎ÷x9yO}¸Z§ïºwLO €ùE©Å|üÒd9¡I‰ ?È‚XšM¾¢ äYaº‹¹ÎÐ5·ë¥’„å ‘FÇã 0à2“‰¥†ðÌxò³2–ÚAM­ã]¢‘ ƒù˜Û`iê8‘ü÷öO3Ô¬W_è´Üÿf!1½Ì7HÍàE„ ß¡/–‡µþÿfïke|CEYç÷š¿7>©,!ÏZaí}iè âÁÙQ ü¬\®å}¥¨ø à ^ºGê[üÞè¹Å´±Dÿl±ÞÐbÄ]ÃlÒ\ôL¹ÃõXƒOžÁLøt]61ñvk¨‹d$E¦å•ž3ªi–¯OüG^ª²†=ŸÇB¦ŠƒP©,u@§©C®nç  )±r(ú¡›ê?ûWÌI1!]í£ ËYvm ¡T ^ƒ†ÎzÌëÌ}c¿šŽ¾l!`SzèUË%¥à²nSŸ?{·>*nå7M â|¾Z®òâ?} ïx -ýJd˜”v VÎY…áÁ-0µí¡þf*Ï«iŸJ™4¬ 3ùB „° ÷#9~ê:»‘öÞÃèl@ÿP'‘½€AÀ n%ËSœ=nmá7Ràe`ØÑˆ0™<ï> Ùšq¾u¸(ïú®ÿ€?€…éŸÎßòÕVQ‘ËÅSc˜³õÐÜó9›&Ï@nÒB ”âl˱ÒA/Ï(æô1r©6'u%š,8]ó%"#Ç"oÊmxù³MðX|èöqó¬kc¼6ñÊXtv•±¤ìèø;aó%Àã ul¦U"|Ž…˜Ög‹QˆÒVv‹[V_ó;6æŽÖlÒëš5jšœ\  ´ôõo„ñÇÏÊK<½Ù1Ÿ?q½¥¥á¹—¼÷6‰ÖùéNθÐ%Fyý~ö{úþáò –N™1ò¥o#=.Á’ž´PýÇ=5x¡¸Š1j6ÑÄàŠ.',DãRC#Œô:ù»{‰vßµzÑÜs·¿ÅPóû.¯È²ô…Whî%”1n?æ zþQÛ_ôA¹éª‡ã¦§”Ô4ßI$uÃî?X¯`´?IÀ“_/äÓò¹|}ì1~ïá«;—UXm½;ÿ–—¶°5LVúp¼;¤Lf껦Œ0oÆu˜?q¶ü/¬hY}Ã5Ílmoú…’BÖ¼÷ÄŸw=¼é¾­*@@ÊÍæ_íöpÐF¬™'×87ѳUžV0è[þ¾PE,Åš·ÞÆb­ &®r&i–è0ÙïÛgNÇG* ’¸Ö½¼Æ¹iÁcê @ã×›-WmÕx~ÁΊnaÞ© e¸V7‹Èx2öœØÎÚN rCÍ äV]ÿ"Ây[ÑÓvà’Ï™È; )åáj2JYúsh2™¡QÄ"5:•0S;@b‰tŸEÏ@»EÄ÷m˜Ÿ5¶ÀÈPw›N HEem;dB¤FD£±ýtòå.°‘J*_Ë/·Âé~ýw6>ýŸ€ùÙ¿/ÜVöÚúû¡’'aVB6¼ƒˆ‹Y 05 õz. ¡õ šº»àõÃ(J´je8Âh4t·“%ÇØ(="D\|v´;—U§Ð& 7Mò#.L!±¶úº¡ KFTâ+Øîž};ÔÒk¤Mþ£+×#èØbÑMnºýåÛâ?»î^Klò›W&€4…¶õÚD™…÷¿([ïõq h.š–˜ß‹>¼4ûZâ yÒ¥ù%µ ?»6×P¨6‘¼·md_"T1X1ëf|rô3Ü1+.O'â"2qø‚þù쥒*1ÖÈ†Ê ÷µ„’ªçg¦¢èáÙEÉÉÏþ§´.­Y‹4gå¾WÕÚG ˜šmùËñ›b›ÚF@ ÅéÇô¡®û°Ü´éjÈû¥’>Pü{ë‡ü'3#Y­ìE¥2Ñ·ŸÆpŽøu ‰ìåÅkïÙy²s1î}õwˆ 0æGA‚ß·/Z~×Ò±ËæÞª$汋[°lÚ8CM»C×Þߎ8>-%JŠ0uŽ8€Ù驸ä¤C.î//¸œ€ŽÜÿ‚U9½P¢,ÅnÁúwŠùÉñ¨6‡cØ^‰p"ƒ¼««¥×egÂbÏ™*#Á°ÜÖnþ 1€œïs-µûf6µ—ïX¸Vûò®O`<:’ì/­X£ìÒC˜î“·¿ {÷ƒpÚú I?G®öùÜj—sXWÑê@Ÿ{ ü>.¬ž.6Qnt¨’D$BΘ,Īd8ßt ±Ñ7àëšÃðC›4‡œå2¨T\;a Î\8p)êÔ$-LŒNUGªb¡”*Ù¹3[-èìµ´›ªÖý]Á¼ÿòñovq82t˜C>.Úì«ò}p$†ù‰ÈNJF;ax»ºÈÂ+“4Ië au`u:‘‘ŠKN^,d=ü„ä fgË0+g¼ü…è² €?°"²à‘ /âÍ=@›é|(‘™õú QUWŠ…®WïØõ¦~´P>!rÜfUØ$Ëwï¬)íèMÿÿø’ÂAò%¢`‘XÈTYJ/¿¶ìõ^Τü?U‰úŽš¥6R&H1¨Gºâºl&ò÷ ÛzÐÜÑG@^‹CgŠñØÍ7à|gÞø²ò›Ä[+ œ¸y¬µf!N]l$Jã§4—L;ê°ÿðÓ)åcvæŒ_«}aÇëèê3BBîçcEŒúç+Åœ´¿àGêÇEÂ.Õ^>Òí¾ÿî­¿ªyºò׌ýi™ {ÙuÿŒ¨ü ‚…<.ŽSæ7rüe­ZÝñ^gèà,Õ.Á<Æ4–jC‰Ö{ŒWì!eÎ7€Øð,Ü1¯€ç$°æ -¹‡ ·Ïƒ³­åˆT„aö¸¹8U»~g1ÐÖ~”*¢Ü´N £éVÔ™¾39~2 m'PÑ}èRk.:5.\©ÎN¿±ðÐ1 Î>ö‹ÿËÎ뤂éç¨çJ]Ÿy7ˆ4sâÓ8tî9øÈî(%\3!éñi0 ªo=…M2'áp}9úl¬Ž÷òÎËÔQ¸lÆÍ8S÷1&&ŒÁøäI8ÚÒŽÞÇ!'D)3Ò‹øÔØ{æz{ÏCãã²áI´—h'ÍØ&Ï?×x·Ìœƒ!7oç¯ÿ, ÉÄ–¶¾‹•ë?|¬ô*º…±g d¿x[\hµsh7”â··¯þùë’üê¶ÒK>2KçµnL,xsß'00—^ƺµt7#4A*”bÊØ4­Ù'‘(‡‡OÕà·+S° çi<ÿÞ+G*$x8Ô2dІ}:µ2¡å«¯anß0Úó.à:šÏÏ)e~4À“~›ú­}¢­Ï81ú­=ØXü'¼òÓ?âãûïÀ¯?÷`O4Q:Ùáÿï…«494E©ô“gm—ÖüÞéQ´ŸáF3‡½*‹L³ü:µï[…Ì8Wá–òY #@·‚ßÚË#zòÿäo†;7(Ô#þKÝûå~õʉ{¡PÆ#3c!½6“õñóz«àq£¼ñ ¶}í$Ê–ƒ0iÀðìÍóq¤Aµ‹¬e÷Æ',¼ÇÊ_cê/Õ?º8K­V梪S‹¯&‚lv9 ›qÈiÓ øÌ¼[Gs¹âY…’kÐ=p–°û(¨¤tpÎH;lNTšéˆíq¢Îb@·Å‚‰IZ$h¼ëêz…Å ‘N½nJ¿ãÐwäò‰-íWçŠ-“c¡ †Fú\9 ÒŽËAHÉw/Ôy¹¶qò¦=MÖ|7öŸy}Ã\8]\Â̈úÉùг´€ ߎIÈÎ?"duз › rY„>K; »+ÀéðÂO}€h"Ú-—ÑFÚ7\ê'€9‘½øðT jºÛ®ÐÄu¨$dC °øyóQ^ûkH} üÎÓ`CY ù„Ah„S?ÂôòÌÁ¢€[Lp`ÝâšfÖ¤€l¬g¹ÛË1ÒN¾n( E!UËμº )…qaZ]c¯O·ýÈûÄq2Q)Á3·ÃBîÝJ€¦žÐ¨ó-M_‚úöSL;¶öZ0yÜ8ÌM_†3m‡á=u˦tcÆo×â¥ÏÛ°ëT)‹2êR&–Žïš„]EÛ`mŽÀ¬¥ó´'k ›{׸Ü+8±ö²­Xžª®n¥ló"côRqép¡ 1IÚ°ûôÌH˜ƒ‚ë÷ZLç…†Sj¡^J4”;ðß" ÛÏõ|o/P胜‚ß°¿üø•ÐSVø ðLÓ#'̃J_ǺOhc#§•ìØuzAzí1nÂ2mñ¤{Y‘º:ÆàóÛuÂP~ Ñ4Ì5¼_!ÝzïT+‹KÓeÄXu&'gaNv:ª[Ž“ßu#:2 .÷pq(úlß´êwòU´Ë€‡ù?Û,¥{Fî#¨©Q¦Š”–ê•Z¼ü¾Á ÈMNÁ©†Ú+šñ*‰âw ‚LÙqü­äyBÚá*b C$rIÙYwÄiÌÈü9±N¢×ZÃf“ð$>øûùHˆžGˆD Ú,Å̤Q‡Qu\=ÏqˆWG ¼{ˆ¦e‡Ö¬Ý_õ»?:¼ÉkãSf-ü-æ6\¶@©áa|쌋ˆ1NÿÑÖFs«Ö3ü Z(_aù€}-‘y|銵'Zl8_÷6F“C€‰Cóžˆvíu6a[Ò¼y©îöÒñ‰÷ƒàZãv\chÔÚ=NôÚúà'C!Ñ¢¿£\¢ø1^dÓÈf%ÆÌCœZ —o$CCÐÊSq»`hc­¸\<^'Ó|£à ¿§Uiüá‰Pªˆ°õ°{~î>—e„ °ÃØRVÑë}P÷广bh˜¶øqV ØŒkCYð’F&Bh C¬‰î6ºýmp¸ìÚÆÎìk.µ>Ü£e Ælˆµ˦ΆT`Åþ³;1ä’°ûI3N?^7®¨3z¶/Ð]jºz¶5#É\ÀãEუUè²pYçhúº´ÙàL Ý"œù²gv—ÒüÄéã6¼VÚEŸ¯ÕÈ#Qi<ÆO;b³î`Œ4‚¼y¿• ^3£Çxµ1®ÀŠYÞŠc\kòðM(£ Œ²Z>÷oWÀÿw÷³rvÁ|r+ F“¬išíi…f‚ÌÄDÒ': ¦@ V}ÅÖÐ<ÜO˜p;"4©º»šòX°4&µ<Ñò#}þº¢ƒoa¥®Ç`óM(¬ìIÖ¾¤R¤QŽ%9BܘÍÕÅ(tÖáü»Ø^ÓVùFäî÷ü¥ ¦®×YÊQ‹U@d,V.P'…JwU ê;Œ…žöYNK'Jë5,Lp±@Ê9ÂÔÊjðôÈSb ÃÀã“Æ ¦ÇϤÔd¼¾ûEØ-&ÚEíŠÕ鵚ðU• ÑêpÜ”;‡üî8lŽV؇L›G%´B²à|>èZåsBÓë(è±¼¾?<èbkûäFq~Bd-feÌ'XÃÔ;•)Úš¦“ÛŽs3âŸv‰óó±¦<Ú>ŸÏ£×™›éÜ4íw8(*D{Ë1p”~"|hï<yx&e®AMçfÈù!³z\Ü$è3PyñãM4'õåmë@eN{¹~ræEàÄ™ ,ˆ0?m%”bQ‘,âòÞWÿóM`êóJn(‘r÷Ôc=Œrc.j¾ªÌ§óȼ˜RK»Ü)#s!Àæ³°‹Æziô‘:󩣜ÖÅŽº1wœë1Üš³aVŸ·àX¸SM^ðF’¿é¤41ï?‚—å~;¨D#¼¥ï==\ú£)£àÝq•M¤>DËüÄLãÂ!ò#Üy$'ä;eé]M£&Üu0Ô’þ®£ß´59vÊÆ›g\»yfæµ%òÜ´¦c”ðyy- ­|q^µ4 „aŽQ;ôÑîŠßÝXü›/j=æ d“›rÉ:^èïBþŸœ45Fßß]lˆX0#Å·³½oHŸæÅ>£ K´ÜH¾>m”á«Ê.LKTåoß0´úG¿­(ºsž>_,T`ÀÞ 1¹‡Ëzgr)ãbd¬ö½ßÖÕ'°8{.Ž×W”¹ª´|ºn{ÙvQË¥AÖñ%@)¬ ¯<âüŽ/°ºCdÈN´èc{q÷ÜéøðØ©PÆ‘­8™í²Jø¼Ä £Ío‰U"¶+ö³áê^+<µmž¿ ³ƒY)añÄ›aÍXHØ`ÌÖ*"Ãà]8Û²œËgÐÞµÝrûœõ†þÁ3êÝg·±@Íæíü o³µ¹kGÙÍóÖçYù"|~#2ô=(q™”u?a}á:·)¢.þÃsùÿdðÓŠU?ÛYÑzNÝf6ÂO—²?Z0ÍSèorŠè¹‰VAjTúòKŽ-´8ûKŸAnf&¸üÌ™~W=¯Ax0ÔU˜¼Ž6}æM¼"Ïføù#¬Á¼Œ0YëÐaiE0̇Î-úmcBà$¯=>v*ºÊX'k:D]*3<¡¼¨­Wèf^욪Ž~˜Ú«‰ãÃf ”Ž$‡#RÅGjL*šº›®H &&±Ü¥."úzu{_vÈé$Ÿ}ÉQ1“‰ÙxOÏcW=a‘6r¯ XÅ ˜ÓãâqÓÔ ¼X\ƒ îšG?0lûbi^´2ƒý…–ÄØIjCss’ÓÊ— ˆ|©ÉÓöçÃtmi}èò©Ð&,Úóv8\ë+>Ò ûÄ)ðU<ˆü°sl,±Þ0L}4ä…¢TIð¸j®`lWô¬¿%7fùô>¯®VÍGæ€5J¥¾PA}ÿ¯&U0^CóþîœüMy>úE/³ƒ²f9¨_$LæC’‡¥Q&ü›(8ÒmüRóÍìñkŠšZ·Ï_Nj„†—o2+ N×:<Çk>e÷¹ød͸8cc€€b8D¾h€0'dœoXò€11'Ü®÷&c\êƒHKvÖӀŎ}híéÀgçÈ&9{åÒÀ­rðcé)”?f·cp8 ‡/´²Di¸­Øvî VŽEfŒsÝÌiÇ DÁ¯©QÇ   ÈE¬ãHÇÉΧ&£L,"²¸œ€ 6LØùä[â·¦»Œ|t­@(ï´÷[öÕº´.²)ÏRÙP¦›0 ß´Çëªp¤®•-»±rî‹(9÷ ¦§<ˆÖ–B¤% Nœ¥DNX½}Cýèéë‚ÍŽIñ)èë:­ÖN¬_Ô³Ïôë?‹óÃdÁ5«æ¯ÖuôžWwšMröà® ç] ]R.¦e¦©«î:±·hIÎÞ ^â™H©F`°Ú àðæÑ¦¶ÿk°±§¤´Ñ\%´@·Ré$x‡y¨2lƒ0ÂGÃQàÑN·ä ¦Çä #&‘lHi©W›«VËÂ`63*Ãs¶Ç‘Àã©ÆmS~ Ÿk ‡Ýê®Þºº¾!LLZ‚mG€ªN“ñýg†GBç®Ü­ŸžÎ'Û´œRq¢„µ‹tkÐ3t± ããæáà±ß3¦Â-3¦‚Ç·£¡ùˆv‹PÕEjÒtÄÜʳ9¬„¡)`G3IJ9¸¬½}¬*À´d´*’¹m´óµv”-‘÷¥dE?šñ²în/híØeÔ_—³z ëÎSÊÕl:kRN¡ÕÞKLð:4µ5ÑP›Ü~©îÍŸ;¨9Wülá„|¥L]ØÐU¹,\MÇ8ì.ÄñÂ0{ÊÃøÊð:|´[ aCƒÌÄÒ ßôâ%³óÍ£¦â¿ðÕ=ÕŠÂæ“|©)U.B_“îTø‰~fOJÂPOKݸ|o?©è1ÜySD©Ï(ÐsÝÁÑúgÆiÝ,Õìÿ•àGÀÉ)f£;ƒÝ ƒf)sÌîÕóRzU„H'ë³£µÓ˘ªXégü,ÚÒ€~‘“¤H)>¯è¡ú-–ó ßäZK@ºpí«_•ckÙ{»Y>ka×Obå¤.<¤y_W¡º•Ï’ƒÏ67!5: ãµspºz6,MÂÐõir%pœçC¯¹†€Ÿ‘É™Ÿ•ÓÐãBWçY,ÉžˆK‚hLŤÈ24ÙeX˜%Ãé+›iMƒ__m¸~ryþu“ŸÁŸö–(`bQ€¥ÆY•,‰XDÄÄ%Êh˜ë@CO=ÂT)D®ÎR™¢Ã¨ ¯®qXn|R¹Áíá”ühÞÚÕ'/–ì *³-uý>߆©ãRq‡f3¤òñà ÃÕfk#zèLSÆFgcll*:-<œ¾ðW"ÇÓ°ûÜWÈN˜Òó‡ äØ/í GÐC}Ÿqɘ®Õ\²žz[¼–l¢‘ò™ZßêAwt…€ŽÓpʪ}.”·G›" Æ_CÞëPþ¾Jë®U7·­øWf¢üSðþ%~–‹õéWþµçÙ‚aOÚæìƒ$ÊËü|I€°·X$G¦AÂã ´r›%Èá”5¶ZžŸ‰“ GS£)Ê¡&Âq´î0ô™™¥ê˜í«xI–`cŒÆoÈJYª»ÝßI É(/úð'ŒrL¡‰ôa77Lû¾8ù;ø¥\èSÇaaöT´õT’ÃU‡”„©hê@UÇWHíƒX$; WœKÍsøìøK²8˜%^*+ “KÑÜqatöÉ%ÿõã9|+¡ëÂÑ x4 9_"$Ê2JJ´y*²’õÐ¥ý˜|îqyéí,¯ŒïPN2,™¾}û†pEtA}—‘uܘžy7>-{r/vA(š,ó“ÏJ~^uÝkˆAkk9Fƒ9ŒÂÝç#@<¸J¿l±~ÏÛõè4Ãj¶"8 †»:ˆ)·D&ç‡ÛÕ¿îrögn×é$ò;ó*Ûü–×ý«¥ßìP_>䈥ÎßÇf^žý˜˜¾–Ú"à¢FÉÇôA÷†Ý§zè{}gA¬Ê¡¦ë- X¡ŠË‚¹ç<[Pš16 ·ÍRbœ²wNÂ:ÄXRxwpÁ†õ0GÈMuòYPyaÊ _âÝ´YøàgÀ²©ÏÀìîCW¹BöV°6özÄGç µë ÿO¡jª®E—'˜ƒ>v¤¾6˜ñð²0¼q@ŒUgàíæcx`a,ÌÄä%†Vê)*üå°ñ·ÕE‡ó§¤ÿ†‹ï±Ä}¿j$ªN¬k 9iw“6µíï¢ÝÜŠä°‰Øü™@×ÔN*7Èäkï‹ÖÒ›žR–š=Ë©Bûó-::üœž›’ãÀK~ …e¾¨ßK¬ :* )þRr2aÐ’áY$ h kß™‹Ž~J>ú4‰H"C6"Cš2t’åSÑ2>õ[D-ä¬Öúùû]†µÐ›.´ ´‚ë% ÕÌeMŠ#ç·ÏkƉærÊsq¸roÁèùø_ €£×Í×·mÚúi[ñ˜¨)…‰ÑIz\Á¦ÜûüB¯»a$òm± ”øe\.§ØlíRçÆŒ×«¤ ¹íÄD@%&€Ø>H„ɈYãfèiPåéŒÙG«cÊ$ÒXZDóöX°‚#¿Š'š¢åq¥„Ŧ¾†²~§ŸÞ†´1 pæÂ;X0q>ƨ¶wàxÕvK\D’:"2“°‡3ÐIŸ“ qØ}¨ëöá5#†g%&©³3ïÀ{íÛ¥q@FXˆH „FÂ#@a2r¸t 7çrVÃÊp¾ FÒ&òyŒA¾V/Ó kHŽÏmD×Àgˆ×¤iScu„žY[~|jÑmXRIú5ïøÝ5(*+‚Icçá'csÐæ±`.U¤eÜHîu!Ôü¯ÐÖ¸‹¼ËŒ¥× k°²äÞççë6þñ†Îò˜ÿ1hçàdQš|nén!÷ØÃYáäÂNû¼¼cåˆ êÄ]OÜ‚M¿|w¤ Î7@O[RI[6zEJ@þ°A´ÊzH¨¥-”|„VtJy˜Ýï1rFJ´²¡âˆ©85eY>e´4—-sÌ\5U1%# p÷Ühìd]ƒ7”ÁØSo#fÅøXÙ`¬Ô‡ ƒB z¸¬M•ÕtK^°bßSOáΙ¯âÕýí,¿ÍCLÖ¯* X±„ú‘•8ÕÍåËYY‹AØ6 ›×ç]—óu˜âI”V¼ùìæ¼õ±Ù•Õ-ï!&,×L‰ù½ãäIè·p+ØèQ0ïÙwE%d- mÝþ]oï}gÍów/ec;5DhÍo?íûÅsX”;IÄÊh'Ê­ÜUA¬ KfŽTpÔÞâ¥k¶aǹžKÎ}ŸÏ¾™ôç‡É%r8Y¤šGˆøÈ×χÉÒ‰î¾F–Ë7úœÄ9º|öEpa¼1Ïõ˾¹‘þ Xü{ v?¾K²v㋳x‰Ò­îhǵ9~hT©DV›¾sÿ³ÒЪŸR áEÄ&~±Ó€™ãîDZ3 VhñåÙÈÐIJ {”éÓy¸Ô*¡þ®çþj³,ÓýR=ã—¾Œ–Þ4v—£wða¡.fMж÷5Æ Rãn‚ÍÓa¡A5ÂþôD±F÷×&Ç{YTm[-2’ÑØÕÂ*v"%*DEOÄþÊ#X­_‰¢•€y“g•”•³£¬bûš÷ÆæÖ®š‚EÙsØxWª¨1‘°Ê£]dS†ƒ¤õø˜ÜÕ/=ä¼"9™5îøÐ2=ã!õ×¶_PJΪEÔÇo‡&Œ= ¸hª‡V†­Ÿ6è.ŒöO/½ýwi†Ð×½^,¿cU—M¤­ï:‹©)·nˆ{p=­äóø%é‰9ê0eZúMhê1B¥•p<η~L3Ãpÿ²c—^Oœ—¤h×è·•D_W5c$ÔGÄ÷s—8­xmG4åŠÒšÇ6KKˆÉ¦Ÿ1nìþz8ˆ ÕÈ…H‰™Õæ7ÄòãhÂK›7ˆ{,†ÙÚŒ#õ0#“}ú\ ÚL¨m9c šûø›’º´¯<âdylϾ'ZOçu¯Ü‚Uî«n¸©QT"ÖüF¿ãÄa4w&&‡9Äi$ÐM+ϧÜ_ŒÂƒ;`µÚ8 hlÂRƤât}?Æ„ñqÏ\„<7¸žX]\ôpéæ•þ,ß½àoíÅ¡ÃYëm¾¸‚~‡MšÑx¤cd$iÈ·G™¡"FáØ^ÄF`Sùà'L¥ùQúíŽYŠ6úˆÑÄÝ‘J­K HSa>­èùÎ=t>ÜràŒO¾ç[vÃïí#fï"øÈ÷†ÖCôP®mUE¯öÖ‚àÒ—¢²­‹¡s²ÒKX j¡‡:¥lâGz=²(/Ü‘ƒŠº©< ÇŒéãÒ¡ 3L™´ïŠ–]³ÔÐäxÚµ˜€Råë÷K ì¼'PbøÅgl˜‘DäF¦A§Ýˆ±Ñ‘X2i,Zºkƒë)%r²à¡—¥t6K‰TÄÌT²L©òZ)„ÍË`syÑa6¢ªõ 1W'Á<|¨ôb—pyßAÚLáå‡Ci/øP¨[õëÂ_ÿ^wÇ¼ÙØ~¼ óœd-Ó5IˆÕÎ!2Û sÏ8Fò<“"ý˜2.“0=¥aö´²\ZIö£"&2U;8ìCek7h •?Yº;QVõdMÂŒÔìÒ˜¤7¯*K´Ã‘@q_Ayå†wØØNÊüüC|ŒÏ^ O?=¾ÏØ ­ó {/ Iÿg\ÿ–ÍLÍšBêÙü½†×Ð;TÇJc”’ð‚³•w$%È>­tTÆ~»H×ÔÕ̆MˆSlwY˪šÿl4š……ͽë.gQ‰^¿÷\5zªá££½„!¦³T9>´÷ìŸoqaE§.ª3b”˜‘vDÂaü¥¤RŽÑ5zº‰tȈI“ÆÁç§Zpãô$ä&é`ì®BkOu)«; b:hÇrY24KL~úž«ƒ½o7\ß:¨Bk÷aˆ‡ùðÓÂd"8>êwrY®×+Ÿ~Äòì(hÐ"&a3n?í–-ÇáóFæw«ëäà³3nd%ûÈ¡å"ÎæÝgÄ´ªBç!æu­·}¯Ö]8¯zýŽ]ÕEçZâ*4µkZ**ûXç]Ÿ(’ ,]6pÐ’~a˜>7‡ßÕÈl ¾''00ýf¨¼,“Ü B3Ûid£É/»Î”@gq91n¯…0q¢€2oD¿¹º´§ÿÜ†ÑÆ—_Æžã£×OÖþä®Ðæxx,IùD¯÷·2s˜¶À¢i-olÁÄ„0Ü:=áÑ/àãÃO¢®«c£RuW¿’‘äã<úu°Òb¸ç†:Ý!ŽQu„­y³¦ºV6ºaÐ6„¤¨t €£¥•«(ð»}œG6:‹WæVoS©™­ 29)i˜§ò÷žÝÎæÝl|Ôi!J6$g#×Swz ¶¡)¾D®;Z[†›§¥ÁéÈyýˆô¸éœ.茵è¤þÔ´Q‰ˆ ‹!²4 §aìx…(†h3¥,ÒÓV[Ô'{Uë]××øÅ.%ϰfjÜØ¼Éñ‹`uË{íBMçQ‚9p¸Ûÿåäë_€Ždù 'MÆ¿°Ô˜L €ô@õÙšÑÙ}Mû™3¸F´›EÏ6¤ig_[Áál)z}㊴ ¾xvÞQÃç„¥~Dž£"À§Jr²‚y"a*%a$ƒú#'g·øØÚÚ}lÓhãÅÄ·¶üDK[Ç'É åóQßÕ¯×鯑³ÉÃØ úO[N5y1ìòæÎqøª@Fù—õª ºËÕ›?Ÿ¥uù°ù–BÍME›é-øå~ ظ0…Zy%…ÖIÖ„bCB˜årbæÑÆ ¡>yP†‹MM˜JߊÙè÷Ý'w6 øÔg°8¬DÇ '1FûÖêµùoí}͸¿Æ¯m·ˆ „7‡xFùÌ45nÔw{‹*;D´!å7 æB¦)ÍÍ[3(áhÏÇð1¡Û?’î2ÂâF™Ü÷˜¸Áï59£Î˜ï€ (Ò¿‰ôs@°ä‰-’ÕÏܾÁøçý›-Wßê¬1žÒÛ–7¯æ—ûöåòض–_ø0ÿµUw ­•ífÂþĘåÂq“œÀãÂϰaùÝÄd ÃGï|c/f‹Ã¢ìðs–álËÉË6;iJ?b†–¾þÍp¨ÈäŽÕæv£þ®y‹´…‡ö¡½¯ ."1šX|m8‚lmŽ×5àÎ "ƒµd~´M9 „Õm¥À:jI|Ë¿f°tT-ÈN]A”Ö'ÌeðÔÛbý~꺤XSR~[t¾æ®×çÒÄø:­qü Ò3‘‘”E”¨V:‚ÁÓŽpy aa>äŽÉÆ_¿| ֆРô‘Zä¶P£éBËtó©ŽEÅÅ#àÚÃñUõÌLZDîóà÷¦±P ÐM¿Ñ¡ñ¨È›õâXu¦­^ÛÑa0ü«ñç_îìiÒ”´»óôGO|i´¶N!¸‚ë.‘=ÂÀ0Ž64ÂML@!1OÜâÆ VèŸ4LÏ^…?ÆÜ–©ïvL-ùðèvvžÆ(=‹¸ˆJBZürPÕvS`b¡Ñš4$Df[$¢øÕÑ”â¢/EIa×èv)EnrªqJj´–‡acÐ×iv `±õÃá²îú²F¦vs ;6ؾ7„ÿË?‰K&§LÂÌñwª½ÕºÔØ\ømøñ&Cq0Yör‹[LU#²^ö»‚ßú[ÂPy¬”,‚ö&¤‘À@hOèHÂ))Ó«ä ¼ú.(¤m¼È‹¥ÆópÇüøëÉIx}79¾P{,êçªè1Æ£Œ$€hgyŠ‹&Èqݤ» hµC)ê'Ê! ñ ´šøÝå›"+Ö]ísÍ"f}»EZ ©óbŒÙ?âä|Ãä®å„ZËãªìð›tfJ^î ä@“þÕ/AÊôóF·ú…ŸºŠþ+²¶õSÆFhócfáõƒ½ØòuÓ7ì“\4i;YáE-1‡i~ »¼ý êïG¬ªþÈÇ™ýf#¾µä~ø•½þÝAõd?uB鲊í'»0ì€×sYñjÔ˜pûô%(­ØQTÖ £îÚ8ƒù,‹~Ŧ â©·Äùb1¼ð@(ºJ†ÚØ«ì®^½ÏïÐÒ)p6{qÓ HG¬„Õ¿Àu…eQV†µÓuolüôØ":~ÌLÏ„Çþ1Y»D¨uàp•ðøø¨mk—l`væ/ðÂöCìåÂGäe/C©Pˆ“Àþ:lÂÕ\A¤ö±Ÿ*–©öwÍ"àÊ*ÜYþ6î_ø§æþÛu„65G¼Q_^» \n>ÂÜ*ÃÆAÅçàxeÜÃ|xˆ èãpä˱nùË¥a‘«.9a-³uŒ+Ù~r¿šË‡ÀSN4œ 9c§Áã—£¬î,z,}¡€È¥aë„A ä¸iêcð,†oSÙíÅ„Ñ.ä{‘-yœšä„X!ÅŠiOâó#obÇq‚Ƙ4eo„fêRÜwaFÁ©†*DÓO»2¯ @:†Zɯnžv:{Oã|S:|@ZbêÿhÉ­xüƒfl;ÞqŽÐÂ}Ö'pÄìyíÞ{Kùž6ës®Ûù^Ùp¼dÝ¡tœ¨H(œŒi˜’<ÖèuìÙ Ï6kìÐÞ0çè%Ð1w-iyxk£¶v·QƒÁoüxß§eiºÆU0€PïÆQ‘ûï®ê^q™BY;2Èàï~ò÷ƒàHûõ¹D©KOÒA&NÄ~ÂüÚhp¡µßI”€ñÄÞÒ}[ŇǽºsµYã¹DŠÇóFwïˆ\Øœvô aõNdìô®E¿ÂŸ÷?>Ù 1åK-“?:þ’;ÒUFæ§EǯEµñ ºû[Vÿßtk¦ hæýg±®´~7›¦¥Ò$ J¦ÃEÓ.Ö‡+Jé‡BDJÜD\è¨Åù.ì õ«X2å6¬yï>8ÑÅ uð3ð# £& V7$d ’†£ÏÜgˆRÇïzgßÓ&"…ÜQð£ë>ÒúÝ/ ƒ*ÁDít˜šÐ=T·ú™|÷7Ø>y}UwLAá§„ |.Cà?‘ç,®jþ~;Œo@põžóÝWZj5b² Õs÷…@ðò¹|_/à N7ó o¾ZŠy<Òµjyk¬«‘G±P´^ÆàÂ2<„£¡ô@•_gwsÕq*?ž¼å¢\>2–” Ô\núÿVðû›‡·ªæžàû‡>Æü±.¢\ÔP)âÑÐU½îÎê\pß 2šØ]8Q;½ìÞë~–ärwê­çu–Z4wW ßîİŸêÎä!ñê8T¶T"Zê½4µ¯I‘ïý¶ðÉ¿<íÄ ²qr‰Þx;j›>@Sm]sŸpÕ­Ó5Z¥`c‡#oÚµZád— =D˜s#Ü8Ùê³ôöý·@#:NØEB¾2ßÐòeÈ™NX7e˜4í&'ýnP“Ø2Ü S÷®Òoë[ðíˆuŸïž–âò¯ ì¼{ ýÍ}–ðƒWõ ‚W˜¼—¾QÕì=ßýó›¿$&ñˆ_rAŠÒmŠå%ɱ:‹;‚u‡ ÐÜ7B®Í]UënYÒÿnÂ7=¡Ü™ï΋PÐ"|ßå&$õÊÖ’'T:ÂÎô)Q’Uo„îbG'm{Vúõf˦)V1·àlG_~RT&±f¸°ZÎÁ1ÜAdÂÃJ ?¨‘PÓžvoaŠÜfºKÛi›ÜRôÅ`£å”p&&MÀŒ´t8œÐÐQ…žb¦¹àÑNËdŸœn&QF×ÉÒIL-±;ûü¯æýîƒÕˆ"Hé¥}G†¥Ç'á¦ÉZœªÝWº¯Jaœ‘âÜ<5Ù·&'ëÙü}†6œkxb'ù iý1ßE·‹K†FÑÒVUBn& ÷dÍ.£Ýi¦>mÿ:’û?; &`)”*XžP\|†MV²±ÀøØ,tõ·Ââ0MDsßôiS¥¡¦yߦoWýß·~Ã;ÇTSStÔÁûIù¾‘’'rd$æëñE/ì²ò?ÔíBÍ]?åA“²—›K3²nÕ½_¶uM¬NS@^ïËòO13ãY†¿è\Çzm×´V"¬’K¸Z³ÃA ÔY+!š'áû«AJü4l-+Ããf ”CTNX×ÙÖ#¸Þ5 Cö*¦m3µ?FcËnäÄx.å jÌ"p$«pª¾Æž: ;Ú¯àD}-øÄd W%FI(Д´¶ÅÛM^ˆÉ Qð;Õ+f€r׬LLOìÀ¾Ê:hQy3ÆfL–D]ïP ðC?H€¶²s+Ë@քɈ¢É²Xy}WsÆ/Ôû0iÜQ'ú ¦„¡¦ÜüÂ÷=Ña\-„a_u÷UƒKÏÞë*Z_Ä Q&¸SŒƒÂ2I÷˃}8Ñ}* Cž“¥ælÞäÜÛvwäܽìÂ%—Åœ‡4…ƒväjP3varß{€÷½4D¤aÎC<ÂÐ:udYj…_[¢„𬭷1yñXßÏ·¹yÝ^ž%Q±J4˜ª±I}¡s.t»;‰Q³0i‘ã jûPoaaõ]üÒo‚wÍ©‹GpÙÁ„Ö¢¶½uÕ˜”<Ó2æâXu ÌþÐpu.3O=D±N ¸œEŒƒu]ÛiP>Kóüèl)Ì!¢ò»[ xN &ÑÏJßÐc ¬yïä€.1îc\“ûg\hû^šï$ö³sGýÏ1ÑäÞe P^õ&Üá^´ ´@.‹ÓF‡§nj%g¥—îÃMÿˆInÿ«£Àô0Ùz•©P¢KÏC¹éY¢:-OBmëI,˜x ¤b)<;a‚58ÛÙEéþwôý½ïå…«2t¯}23oLT{1춇ͧ# ȵòYp„v•ñ‘ƒÂ#Eÿž•¼Œ˜> /ß¼µ)ñtÍ=Ädiºä¤˜l&`ê˜ø“QVàñ+ÑØD{_—E(ô¡»§Ê \Dxh ~:€Ì¤ÉØz伄^.ó™Q? SH´tÍ'ÆÅ®½ä^~ÌÞJÀ/' ÆAüØÛPß;ï|ðÐ%ó=82û„6[1‘¹Øqê<~U\Í:°Ð;¤ŒëtŸ™O.ˆÅY>|phêMA<´lœz¿a‹ñÚ‰yZ—?Wm0žDßÄ^7%2‰‰‘ÓUÛrhÅÕz¨ëº¼½ÕMèëÿÚ21ibÑPÚ±­(+ÁÈÀ›ÿ<Ž|þïF€Q¬'æø<¬Z.ÈòšÂÇë_iªcU#Ó"Ýh° ¤‘ã‹ô¨îs`Ȇ¯/*óo)èÁ'WSð õüÛ>¼ÑkîÃ-y|ë`Ä ´ƒþ¿â®ßÊW¿ÿÌp±ÍÙ_½Fóæ§wk—N½¦å7þ]–n¿ârPß~„´1ÙX{ó«à¶?‰IÞvt7ñ.½¿?àÖ¹<^8pRë„XüPkeëE²—Y?†Ú¥)°ì ¦m ã“&éÍíÁ>߀N£P°6ÚÔ–!moF;ÛÉÿ/vvvŽtí¢‚}gë°xÚj"k§t<‡§=I”û‹˜É3y¡r¼ ÄSO5lšV,]²e•£©÷ÔSȉ¡§ƒÍÞ¨®n>Yàò8iפÿ“@ðß"šËUC*IëÉñc‰É—Œòú¯‹ÜžaíYë~ý0ÑC±•,î‘×Òã³Ö'Å-YSZý…º×ôˆX–¬y¼â8½€•‡´Ô¥¨oØ*ЧS xÐÎ2ÔïEݲÃmÍÇó_H ּƩ ( t¬‰ OÃ'§³ÇPæ§¡C`8”QÛv Ó“âÑã½m½Gˆ¹+ÃÒ9«½ÞFØ‚ï¡è†„hKw?ñQ‰¨í4÷aæ2ð¥Eï^šOýcbbÃâÐ$Ì‚ÍÙJÌF¤Ê¹ˆŒŸ‹‹½ÓñáÿHîH¤•u¬æ0ö4Dþqøâpó$>~_@€ØŽ®Alî ÆÇÉ‘ÀG]ÛYœ¨j…¡YÁÚFñ42«?U÷ÙŠHExᄘ1Ú0bfÑ~utpMÿPƒq•Y;h—“µþkáj{έy‹¯™êP¸ ƒ)¥Bü@¾ßÕLà+ä—rË®ö«§Géi‰!ݰ›ïzãíªÂC:˜Š*ÿÙQ.¨UQøíÞbônzj$n–F>פ|Ñïlú¶Ž- `à[àG}·#nü¶uAÀ¯pÄ<ßtYºËj~[©ßnÕór?fÆFð·i‡œsøÑŽ r^¨r&Àüš”úÎãâWñð²ÿ€Çõ[ܖѯi¤!€Ï׎q ·¢¦µ"›BhÏý4•ü|¦¹ùó ©­vŽSsAw[5‘r3î×ÕtœÖ ü_ 5FÁn–‚ï±tÂ)äØ$ê_¥åxŸ}¦~±l ˜3a6njF’r?~rÃË8^WŠÊ¦÷Ø~ÐÑ ¯_U܇…¹dõÈ)QÑøÒð>³Xf›†Ùo ¦õAݰÓFaîÿÀÿäeí¹UÛÐwRg#ZG 2ùMqeû¾Íß«Eô„ Yl¿®ª~ Ô9’ǧ Ë,…ÉÚ»ÛA(ú9O£¼e3‹f…¡¤7Z”@s}ò®Í} ‚ÀÔv·¹\Ž6æ©¥¨å ³wyÝlF=™ô[;AG:/Ãá¢^Dì?».T!?vþ}Ìžp/r“oÀ‰Æ¿Âcç²¹¨Ñ.ö΂ãïûØûø*«»ÿïÝ#ã>7{çfȺao@ Î:I´ZÛ¾­¤¶µom tÛv½V« ÚZ7AQA…$ìÈ !ãf¯›äî=þ眛DDÀUÿÞŸŸÇ rŸqžs¾çûÛ€Œ€ŸUæ£@š5õkp˜_Á þT5’£I™ ™÷äo.¶í~”]×6oC®í$ô·1¡P™H€×޽†œ¸HFL‹ ƒÍn„Ù¬ÇÞSFX,"Â*„„ÙyÐÔ'Ä_ߨÕ½Î-*¼ÿÚá”GÿÏØ¡yôÑ!îã&€Jƒ-x í/Awå¶GÍ`I«ìÚJÇ¿¸è•Ÿ#q½ÏkQu¶=Qñõûɵø[ž°ÿMd}LÆòÞw\Ђ¨ôXÓqú´HêS‡‡™:»Ò’°^â$ çAÍë•`w¿è×Ѫµ¸mnþtÇMÿë²ud,®œÆíM€µ“Ól ÅÅñ™\Lx>¤’hô÷ÆêCƒ¦TÊeqßô³¥…#ÒŠ)ëçYvTÿõýû'̯úž_Ðqº÷·AåÏüÈBï«Ðãcï†èÂ0“‡L! ØOÌ5ÞlË8T‡÷EâÖ9× «õ?Tuõoê®sujVáî Ì&ØÈ‘mAl£á)^V¼´S7eX8Æu8­ý3ÒãÖ  õ<ùÖ÷aöô!–h« ª‘Jæ]a’‰…5Aò².w<žÐ߯“f ãðÙH_ƒœØ38¿‡Eis±(ë1ö£GWK>o‡Ñ6Š~ÃŽ4þ‚€ßZœë}wÒ{¤õ\žlÌžZ„Cõ覆½j+¹Òý|¯ùú¼o Mo-nêÝ»Ùån-X1¿6eéÂCe~ãRåtÙÔÏfO[‰¸èÙ´˜`°ŽaÈ4ÄšªçN½ ‡ÏýjçúË#³œèKî–Mÿ!f§†Âføƒ>-Â^ð§oÛèdVÆ„¸*!a„9&ÈÊóWFfµÍ¨±0&g3\#"xM|xÈW®Ò5zÁâhæ©¹Ò $êŒÙî `dC²h:²¦\OÖ¦!áKLYH&[\¶ªÍ÷¬õݰôt™g쥚Èè¥Øqð…÷Ãh/òm"0yÜ8-)¨NFÖƒ‹¼ Ç:G*&ê¼P>«ƒr˜Ì"¢Šûïb¶IÁ‚cç¤ðýÅF,ÂÍm: G{6ЉKU˜Š›KÉ¿Wœçu”í»bKVÌýmGöÍ-¿y~‰ú‰Ý¥œC®Þ0¯h.Ç/<&žöKÝ }Ú› bT·L)'KvL ñm Kqj–«ð}¤i³Ë´Y_¼à{DÅ e=chh’8$‹§|"¢µôŒ F™IæüLOž½¡vÇ0Lv¢në…èïb¨ÿŠ\3éU—Åæ +"|Ó¡õùDpv,ŸGôxûÔ{ð çaÏi²ëÛ^/ƒùW•ÂÊêéIœ~z’Ës–ãî…ßÅŒÔèê<3Ñpødñ-ðÈÜÓ&j±»È˦—yèË¿0Å>a<íñºeª*‘Ê©¨:»‡¨8Æ(dBd)x~ï CÔ?|³ªB¡(( •ÅÃå°¨­ÖcÚ¾ƒ5»7a5åè'ì†ýî…7‚Ëä=XR×} =X[DºKP;k”íf<ûXÍÅU‹ä»½çUáø7òš42¡O#àù(ëƒ"Í…»¿{ r2ÓQßþ‚¾³ÿeKt“ÔÓØOïÚªg;¹†ž²ù±R= 7¨ÉøŒþvÑ=H”WáÛÿwZ?däÓâ¡eD…¥ìµD(–Ϙ²•Çåøíöè­“ýN˜w}Z„ 7,½Ê}xåH?~ÿßA!>JTÎgà°Xý» Kе´0ÚW£ ÆŽã¨m;ÃÀ%œ0@yç d h½B'AZpU¯/¿ mgÿT0q.@íeW¹ÄßâöÔÕ ©óuŸ' %ÚÅwp¦}+gÎÕª"œÛ‚P¢5XÖ å…ê—ýÔ¸d3æÈõn\Q„·jm8XŒu[\‘}7ö}·.¢ Ù„šzV ‹~ÆÄ÷70*ž³€¼”3Ðéû' èºV 8¿Yøì»_‡JáEQÎ2 »d8Ö°“0Îñ€ijR‘ç ‹Âµ¹Ex÷Ä‹¸³Øù…’ ñŽ/™Œ{g7Ò´ž(eÞm$/Âa`;.<ŒÂë Ac糈 ÇÒiדݻ.Û€‡VÿkÕiȉ: íWzX_ÞLÀ¯à|ð{#’ÅèaeäiT_ŠŸ¸" ûKëFç°žU¶ uÎh¯ ªÆÑŽVs/â¸HCÝH9ÂH­ÈR­¦ýY¤ÇÇbͬո·p)²ÃÉ®k~ºì|ð;s$¡D6·äõã{[ )Tsg}‹5±6óÇÕïñýiSˆú;À:ÜÅpñ0ê»*Єȃ¶Òû?;ùnÂ;™—=*ŒÃм)ˆåX¿ ®­?zÃñúçÕU§§>¡}iDÉ‚¼{ÊŸß!©¥61zÔQPÊóWûeCjüŒ’>}'Îö`÷  6"?Ûƒ×rñ]ö#Tâ‰ïéûó}4K¦„‚{Ül’Ö˜QÓQŽøâ¢póro- Åôþ¸„ƒš³ç~Vz×ÌÓøÃZ”ßÓ‡ù1ÂɆŸàí£C¨9ú{x%·â–y¬rrÅ8ø©ýà7¿xÅŽý«z‹ó÷v]š §ýÍåSbãÉsêñÓŠûñܾ~Ĩ…,$‚ÎÁí† E±%ïÕíFGo5n]°`œ¹ûŸŸ~íx’´á±¹ ”:††ÑÔۉ؄»Êi^í¸SPÃw5ˆm?®¸>׈¯/»3§äPvA;T‰$•¨ÂÒJeü;›Bc^Ùt¨áíB¾s¢&DœºQyöýX‘‹˜pŽý›Áé÷Kćǣ¹kV_› `¬ôù{Út ö!XΔ‚IVJ‡%†+ “(ÐKÎûŸ}Õ„?Z™MS G« ýžAª"[6D‡§a¼Ü]@¾ ² VrIQØsv7axÌ|¸Æ„L¥ItÆ:ä'-À3ïDjd"¥Z¸öl¶m&*Æ›yŽƒEÑ)½J2Ù6],˜™†=P ü³7›Ú†”I~C69Ö//ÅØÈË8{N YŒ‹¥îñÇUÒ„0lÎa²C6ÁáhCX»scc¸mþ(œV„$¥«ÒbØY4êX½.,eh«qä眮ïûÅ}í_/—…ßXþ¡70d4"3inœ÷c4Ÿ~€bÚ¡U–ëëqëÂ<ÔŸÛAXíL²ÀÄD­9¥©.’K‚É"±!1r1†GNC¬p#-*‹2âDs ù¬‹æØâ½Ú#ɼðZÈøy­8¥} GµÕ(˜rZ$m§›ÍÓX4äo·}ÿ/ÒMR‰|cRt.NtìWå|Ìë5A \#dÜã2å—Øyy:Þßl.È)¦AÛ+-ˆœißíoíi²à¥ÃOÀhÔ™K3¥`Ö5•˃—NUãù“GðÎ1Z´<ȃc½lÇú05)’ùDäÀ–”¸Lœj¿÷÷"…lÓcœìëMS¬ìWG@Â@‚ćh² ¶{O¿S…˜ÄõäÜR­âÉg«‹Ït5aÄ*ÀàX?F ±~i›2Hòñ ±g?ÒƒTX1ýÛ’)°ýè»hƒ:9ýGµ=­wo0ýIM##¢R ¥^Û.¥å늦&o]¿èZ}°È™€ÃYí+ Ù¾ yؤ:+ ñ cÌ£göàÞåë ‹X(Kdm/aÁ€! º¹RÀ¤¶Êq‰Ýi#LýƒnžW·Ããx s¿=$ïcoÈ%áþLò²2•ëhÇ-f$ïÔ‘9/‹þҀɗצÆç C×AÀÏÉÔ;1a:Òp §p¸ÈLž‰HÙ0þuàqxÅËávwjÃOn¼Mþ$íK õ4Žö!ZÅš—G“ÉÓ3|š­.~ûO €G®Kmklâ±~¦2¤D¥ µ«­dVŸk3£³çuD*Ò‚½'wb[ÕY²ûÏçR¦vWOÉx´Ò2lÙùWõß÷¼Pü·þ !/ s§ÝE&¤»ÿýžQ¶h„‹P*Âõ3ÔdbOG[÷»°ØÆ4b!¯zØÐ¬ÏSe¯+ʦ»zf±ÃÊ*nŒØvcÑÔeH‹ÈÁÑÆwõf«aÝo¿ë(ËNp±æ×݃BV€‚©²n`ÌÒ‡ÎÑN$DÑâŸÌÔ€§~hÙê^©ˆ!€Ò —ÇÆ@ÉKÆÞIÔ1ž†ñš8|I'ÈùÇEÿ}<¯8y®‘9ÿ¸²¦¾ñLÞ=SIÀZBî/•‚ ÍèàœnkºCY¨8ØãïÇB‹j èÒíClX8Wõ½ž:=¤byaZl~ôïVªÀú–P¶'oÞôf›ŒýŽÊšYj¸l],œd~ÀÐvï'@(”‘̦ö~y,¾’KOXÊÆ¥{@ŠöžãDÂwV/Ô¸hV¹š>“\çHÇë8Üô/䧯*zŸ9‰Ç*WUìß¾¶bÏÓÜy!bzrT*b_.ã9þ“²2gŠÆ`bõ5Ο¿Õû15N þ„M`ÝšÉü3[‘”E6§Nä­I!éDr\.‹¤6À Ÿ_mrQ$ã]4_»Âe~A;/#…Å}ÒÈ —Ńe ãK?fäµ##îø¬|tö“ûÃÆp¼nkX©HDçX;[ÚN“–„ê–@ê<Ò…`òFß8õ¸BHù}dawÕ|’küø)iy¿a¬:JAØ™ün=Schä;/ )VA([l€icg:ñf¦,"“ÿ0ú&ŒuõL}=bŽvœl;ƒÃm´ü‘cÆúIõÀfxš ûþWØ7åE™S2be\аFŒ.dМ‚ÅÙ¸y®߸f16ßv=¦%òÑÔþ.†G»éB(êÒë4QRwQáìøØònÃ6U¯ötºwµùq+«»ú+Ž6T–Ú¦”‰0¢ÅSýž×®NÂbÃÜì9¼´ÙÉÛuMˆHý€1;2Ø­¥êÑ-‹NÁÏ"`½\(Û ª¶”öw!L2}jöÇ@ßÿ8ÑNS$Àu÷3°ãP¦]1LÔQÃIÕ-ríCç"+i:m1ÉÆ±wø ’ÂSøPzLÖ”¤Ï4FC$ʘ¸Rarl6^:¨#Àhg@7fçãÎl køój³)„-w0/ž·ÑÁ§ÐØ¥CA–‰ ˆf Ui^„,8Ÿ°@Ù’‰Ë¥ùúäèìïÌäœ-Ã|4¶ƒÕªÁ=EyøßWâÁkbiNæå¤afz‚…ýPÊõ˜)ÃwV­Ñgõ…w.˜R5¤Mn(§jõù`è0o+ WU_g§éè;Ž”È„Ê9¶&h–ec!INtt›‘“<cd79!D± §)Ù|¥àG$´¢M™K Ÿ¨Î£?ÿº|ŸaYW¦_6ÃÚ%¿"<Ñ´ÔüAqX_³°¹Sï„Án„‡lÞè©üRàÉ— Cƒ"a"ƒlsYXaÈÁtèÉ.-Y{ºˆÚ::á•ù°(ç{°¾GÁë’.yš;Ég-‹óTbÉ4ý¡smú=uÏÔ„Š=e­U™ *µÍ¡g»ä}×Ü ›{*Žžx ¥Ž9U¨ I'Ôèiˆ ‘áÐéwÐgù$‘Ók ìªV‡^»…-Ž©‰é°;üºØ¿…ªc-oPû³ú+{¶'·¾´ê訹ëEˆb€†çØ`¶œÃº8œ¬ÕæãäïÇŸë½2Ÿãe#šÜŒ'7a²äýµ*~ø™[¡vóeØ~RLÔ53DAôÀRO9mTïóЀYÎ?xKCÐmêôƒ á!ãí&€IsH©‡ÝC@\L..è#‰XçËGOó—É­B]YÃüø¼„¡ ÈæFÓ}¤Í|#."¸h Œô*útZýœìå\Ÿþ¼r7{'éQ%è6?CžÃMî7xâR*#úwë¡$ ·(M—ãÈizÌæGTáCƒÑxòÛ·¡·÷Nh´"ØÉÅ‘ @ ‹|¥U•›º“>G5AÆ,ú­•¡Ñ[ Õ÷ãÄñ§ óÀf' Ùcƈ¡ 2‰\hR"ää~ääß Õfkí¶Üi?$ÊÕg:ßæLÚ.D‡Í%ÚÂõ\Wÿ¿J2ÃÛ‹‡[µe„*&ÀÈfܸÎßIbR[!ÌÖ\ÑØñ^É’)EØÓô& cÀÔ6Ý1\;Íñ ƒW`ÆñŽ¡pÊÈM|-½6ÄJH I†ÖÖ¤ÈHÚ帠QµK·Ž¹ŒÝ’ Ë*¼wÙ7¡jE{ÿ~Œ˜†0BØ -ÙŸ½ˆÙ£å²42?÷⯊ۚ'˜MÏš©K3™¿'Îþb¾€Œ“0§Ìeê_Bàø|žöÍë3J«Qxy!Û¥a¿(lèÑ¡¹ç=ø¼˜¿ßZùËmÊ`^q÷à1nÌ.Ñ•Œé©:²Ð»ñæ±mpÊÇüF² 8¥S¢r£ˆÆ±&~D39ˆ à8DX -UÕo†}ÜÈŸ§JB{ç{ì‚ä‰Å&›¯d´SU–¬ýHp#“è:f»"€8Á5ç—z§ÆóØ„Òb·Û°‘µ¾¾áëêÆÖV\®8¨G¸Ý+Xƒ‚”×ðŽ@œžND&ƒG ©˜ŽˆLhS?kPŽ%ÏîœÉ|´R¡€˜SöK¿: pÈ# ¦Ug8 ç€ù˜q€Š $ÿÍœ=€ÈP±ß¨/ð‡Œð »ôŒ !"jÏÉcã>h@ˆ<œ Êíq=ÞÖ[·qIÆRìoÛKTt'úu5ÈL¿íCÛ`uùØû~‹hF{aŒfÜ>;yywbsÅFpRÑ$ø §ãŸßËèwQ±ÏÌòÉYSyrÍ0–£„ ÉÏÇ[›·ìVÕñªj•Γ\è”|—l¢Ùú•êndèmœìf†sý6,ý(Žü%²2 älÃÚ5×ô¤L8ô¦ eåÿ~sø´aaTÆ“ˆ”,C}g¦¥üŽs™~L˜`+S…YHKèú‹Ù¬7÷ë´ÅAR9·2gšûÐ>rŽ1|y„ú1¤Ä'#!æn ꫱¿un_vš´09£AÞ4”|2îŠp4´uU\, Íï(´ ·Ö;Çή—¥&e¥©D¢•,¸¾¾»Ï!=öîcš/ ž|éT`±(Tc²÷!(89êÕ8£ÝÌè¾”6O'OCo\ükDŠßÏþnETšsÓEO¶‘òHáŽ;±§îwèªE·¶5Ï ï,ëÌ÷QÛó’ÞínÁ@obÂsÑØ÷&$ÁÄF„!="óSauöõdqcŸæuh‡­è·E`á¬oB'ô2u)” 1 y ‹öõ<²x:a² 0Úàp×C‹>ë¢rÃÀ=ÛuQ%—znZæ}ü8üŠ£âÖv1£ü7Ï?¬úå¿QÛ¼i³3îé €¹…öw¸ð—HCîU•W½†Œ^1e²dEo€›l"D÷¤¶v­Á‘m.>ì.;ˆ,’úØ"UKq°±Ÿš| D¾zy?Õ»¥ŸêïqWܯcaÎÙ/(ÛÐRZnÜ´±ŽÔŸ”ïpÛ‰6ÀŒí,~q`¤¯¢¥û –f^$e2ÑÚàöè‘:Ç ‘¯föÌ·NöÃ'ä¿þõçÌáÑ4BØ™Ow¯º/ÿp1"ÿ‹'v¢Ÿl ”õÉX1@ ‡Å³¾ù^;<Œ³=§aðÅwäe=T¾óÄþ’_Ľvè?X»ð»X›FTR1«áx¨åÏÈ+ø6-n(BR'íw‹ 6wcì6ØÍGvT2®Ë[…úÞQÂó±Wó+ˆB¾/Ÿ©ÃÜelÖ°ŠZ{õgÚö!+&×å¬:¾€Œ… qÑ£±V±µbutÂa ÁÆ¿¡Çp}cݰ ¼ÈW¥Œ}ß›/÷Ž(G¦ÙJ#’Ϥ(c+y6ýïŠ$Þ]eóÒ¦kd} -ÿ‚ÑÒÙÀ«Ç5n^0²S¿‹–¾­Ì&¤$,ljL>Šgü‹Ò§‘íú—zž}O¿‹Ö죶¾xö†Ó=cèî<„àé ¬Æé2Ã,C>|m™¯ÀbêIññ;¶Ž{‘¬˜…™‰·aJäbDg ³ ªî Ô¶…°Ä”¤2,™z7Ÿø;«[HÌ4Œ…Þ#õÚ.œ‡³ío³ÍŸäcÃ3Õ./~ /Ù_Üe¹¦|¤÷º±á6Ù¦~å1K¶wZr¸?¼út䡸óŽ_aÈÄ!7ó¶ ã1|~Ø툇¨®Fœ&÷HXß—‚ˆÐpÈÃ<° OB&S@!Å6ZI=­"Gevò1fE‚2iÒ!!´¤CL U„xXïßdNŸ«^k±ð«?]ŒpûÿXJ}öýšìxâS²ý †Û{Ñœû-,ÀØKX#+ûU3¥ýúîŠÝÇw#T‡9©×A,€Ù܂ޡ>œumŒŒ_ÛÔëÁ†u÷a믱k.ÏÂ?¾1g¿ßY¶ú¡ßjö‚Y‰i¸nF>$„ºÆ­ºÓhmÙ‰â¹BMîÍ`8…œ)ßÂßvþÞc^ú÷j_Æï·oÁÔÌR\Ÿ)Â593 :Ù‹£ÐÑ»oÒÝ;´I°Ø†•Ó”¸eÅÝpB‰ÿ®‚Í­€ÁÖ‰`Q04]' ”¯™(÷u9Çe]:ýPõ¾º·;¾WŠE6²c®ÁÜä{0E¹RŸ\T¡©]77A^6%úò\†õDíNÖ÷ ×}Ì$„ó±Z™¨Ùj5ü­ =Ì®‰ŒŽ%¬üdõ—O¾t*pßðÉšxÕŒ‹]KTR'¤— .4f[„®}p;”Q›ß%Â[&¤ÒëqBóSfïLUjªÆ±ð ¯\ÊZ c\p—=¶í ·ÿ\P‰N¿_äb¥íínþz“=B•”øuølmþ<Xld±ÒàPCH{¯Êš†‚ÔX´u½CA…²¸ Œ"Åé–˜žv7êêŸÇk#mÒnáOýéÆÁ¶ß%G§éK/~ÅW¢Œù!¶>w? h¸ˆßøýÌ»Ïàáâû1EýÒŽæMäz›Þß@äªaƒ–Uú Í•ä^íÖ!,H-FÃÀ1 ˜ªK6ƒ™lN3e%´ˆ¦Î*d=n3g!28ý£ÌHÁIB_<—Š9ÓirÏñ?íû-ÊŠçø¾ÞR‡áÏU« 6p»jÇ 3µ“°¤æþmdã»ÍD­¥ f›…™&>kðkžñ•Ô4ÖV.ͶL¶à•(„ðZ}j¯wZ;ЃS8ü¡ô6Ä+:àõ i|ž×4nljÍ?|^¡¢å÷ùî:äg]u-j;:Ñ68 íÐ0z­Z uvN¢y™÷áŸï¼„]—?óþP¥QÓŽ´Z0+ñ:x»_Eé’ûõÕÍœyL«ÿÎïÛ£½î&U"'D¯å!<»‹ã”“Í'^V@ÞÅSŽÌBCϳ˜ó;¢éë oýdLpÛ«nu¿®³ç³Æê–­Bg‡hË™. *D oh{¹è³´§¤ëm¸õ©¢äˆåµ‹Whx¥º“¨ªª!®Íþ àÚ_Qß¾Ÿ{øÖÅ«‘‘q`ëG2 Aô’^²˜ù"²³“Åë6Ž€ ÏÅg œ½>3¼^çTŽGÖ”þäŸÒÂ:¸GîqŠwÓ®=Á%wÝú´ÈÔB¥t*ÜÌcìAjTd9¢¹ ’‰}æÜ›p8Yû‰òR*…Lƒ»Ò^%”2F\8Ýð*†sqÛâ” µý¢&*í¢•·+Rq²½……Ê„²R»$ÅoJëwß‹;«1¨k¦žÜIˆÒÑ3têÒ$ª®‚0À6åÕÏá–ù÷ö±‹€v\æáÍtA †‰,zšµÑE¶”®!-2"óˆÚ¼—°?/nÿy§'ß·ó­”eaãgx¿jÖ[¶µ»Ègy¢üÚÜeêC-Õèí €§Ejd£´eizú´^mêØùç…kù¼f ,¤Sú],ôYB=dãòá…²iZ—õ©Íëºô gmW àÒ+oÕ®þ«£•‰œeõ­·„G¨âÃ31-1Á²H¢VGw!Xê@ÿ˜ͽm“åãim!TL-‡UµOàõèïzCÝ[+R"ï/Ñö?à\H Wi«±óGá¡Þt»©ñKÈFúÄÅ)!ø35Zz^€:.C=ÜÚÊ}ÄÆ~>üH0ëéA×à }zÄPÑ•èÍKï­á\&™ßï}iÀäK§Ó‰-Wx´©á3à¶óø$Œè)nýóŽì¸ Ûn7×?Z)a¨&sfñ´èõ²°_¨wžxg{þÍ‚¦EJWºôwµ{.(]ºàà‡Øó ušöhÃ+ª™¹eªÃÍCx}ÇC,½°òHî»¶¬p~N¦$hÿú?S‹“ï¨L fá6Yò~×Sì`Ì/”¼ ZnŠÆÐÑÍÄB@PJ}Úã^t*33nÞ¼pzåæA÷È Ñ 8DZð†¸Á',''ïGcC¦¥Ðl§~C"å+–ï\¡ø:î[ñÝ"¹â=¾ÂòeÌÁ´¤ÛËf|¨ÅäOJIðÍiĈR@k»ÐÞ¼œ; SÒ³¡Ôƒ%Y³ÑÑšþÙŽ ÿø(¡€G=¶67TäØBËäå4G’–K/ʹm‹Å.DVL¢"•àÑ87Î O„“Øàè)ôhãk_Á-´êôù×pÙ›¡HfU­Y.A?ÐjO™£N ¢ÓÈvØÑþõü¬¯C.žCž_ »£W4m „éuU$Ä,-¸sÕûý‹©Š©7é´A"# ’3X¹ü1·{rל#ª½—¶hø=²Wã}S•ØfØZ”—T·Ã¹0Qò#zyØÏÔ{¶»ÏŸAžßé6cWí_‘¿¸üÂ|Tº1©:¸ôä"¼Wׄ×î`¬Ë3žiRñÞŸPuæ$´Q ´låÝ}ùw«ºÎ}ÍwrŸ°j"_—í?L“ð0³«A˧EüÁåîñ 9aôã Ä¥!w}h‰†Àr× à¹c™¼`–ç-‚v ±Ü݈ŽÈcÏÖÒ]ƒ}õu%çÍ¥-ãå¼>•+ÖÕÁïK €¹éÏk%Á·|j¦!g‘µŠ $XtfÆü¤"–O[DÔ•AèM#Õ«gÆó·üH€¥ñ]t’ƄǕ«Óg—ÌϽ¶pú´å…óso)Qg®®²Ò:¼ò¥êƒç†‰Jy 3r‘ç??ul™š´€\s5íAmÔA@pÃø%*mÖ!¨"ƒYQUª†)Ü|æ‰å‡lЯ)ѵ;26K¯P,)—Äü•ûõ Ï`ÿ‘x}9)hi˜³ÝƒÔæWš–ôÄÅÆµ¬¾ýf¥`ÉÔæ,r’UòL#Â9è~VO4$Aׯ¿¯W})•XÄ3U¸\ç ñôV%ö#Pßñ,+Æ@½ø¼ñ–Ž]ºF2–"p!ñ–òÚ  vqF[öÔ˜ÜÐãæú½ÝiF0—×ïÆþÃÏãÙ·Ëñf‡XÕ½L'l›Z‹Ã„ÌØpÿgh $_ªNQ^N–D˜q\N権¼¨gÄ$h´*x°ÿ¾¹ %®/X“©}únÔ·=¿I!¹ÈŒ[€ô¤ÙÜôiË å®,œ¦Êß •ÈkÇËzä«€ŸE¨Ðé‘«ÍN7Òb×¢Ýô â[•·šmì8©.ÞíŠLRîã X$Ý>7{Ea\T:N6ãݳ{PÓ\] •¨ïo¹'›_ÆQQ›ÚÄxóøÈùfO¿ËrÖbÍÂï`vª]g ׿›5d=UKCŽ-„ Öî”ì°™ h† <4’±7 µI^ÈJ SZ‘›³ÝDPëWÏQw÷ìë?‡¨]Ád•šI5[,Õ· Hª/cw­´;í[6V!5J‰û‹V!'1¢ªŸjkDrÔ&´ ¶`Ì9£Dß­þ¬vªK²HOXãôš«¦ûêIJ"jüëe£j£È7^Èþ ݇‘¡º Ö‡s ¨©?=^£dàÇc,0h\…MŽGSw=L^Ïžù7Î %A, aÅ¢B¡§f…‚”x)0–á³£cáô §-ÆØðn~–ÍšØÈ×ݵò•« Jô«Õ·baúLôC°,!Š0D$ˆ ŠŽ#ºJöœ} {šÞƾ–ì:ûôdc[»’‹‹H+ÿ²T^ Ø¿àgß_~äÌ+\Œ¢Ó!ÌO_ QâN6íÑZìcÔH}ÉÆ.´»ï#Eé‚ËÏX^¨k@×X<.K£Ýá„d§±ô¢¦ñ9důÀŒô…hk:„^ƒƒ Z…Q"FÑŒ7†Ï")r.Bží)ñuã}@´dMªµ~¹¨Ï«W„¿ÉÍÏHÅ›§†áùSòh8Œ‹¨Ã󧤱°¼¿Ü¨-݆N„’jõùB"²ÑÜ^ŽÇ÷}”ó©lÛ«¦š# ïn‰‹LWå'MA~²š0i Ž5>¾GŽwNüêÔ9USæè5ÍG]Ÿö5%_êÚªÝpS6µA Î…ÎPŸUA¤?S„zµâc噆]¬Zqy‚Í«ÂCãp®¿š©¼ã¥âÅ^2„Å) «¥ã`³w X*Ðí€ >ÖKãpÓAܘŸÄ ·6 Cذ÷d%2’$,áÖAæõŸSèEXp²ã‚”Dˆ=Hˆ BAú*´ë†Pß}‚-¦î®:ܹò§˜•Ð]“”ÕÇbï{,¨`WÕ‡ˆ 5áºù%hìiEÇÐ8. ®^R" { C]ËþŠ÷ó…¡mè:‰ ² “£rÑ:p†-ªØP#Ny ý8¶Íñ“Êm¯¶ªú†[©ý‰2½dÜñ‘Ü´lOuQVü¦K©²C.iך•ýŠv|##@ ŸQ¸›±0Ö|(Ü„|ZïGNˆ¼±PÄ2ZhÁ ? V÷çù²b6;Ô„Ý5¶¶³êß9±y¨ïÚ yK4^þÐÚ^SÎöoChÐ ¬*˜Ž¼÷lø£òÐ7R‡ÕÓÁflÕ×öûª]^~ QrKû û$ ´è®zCS§Ñ WR±T}ý¬14rŒ0Ïèî© éTIÄõjó°òÖX„æ_ûë†9 |¶ÑµD~ê|Õö݉%ë®í®@Z/)×-j¦àUýI>ÓÚúˆ:&bÁz½m¸°µç_(œUuÉÏﮞQhôšUQ܄ɸ,̦½ítý=¬bŒ”€ÛÁgßKãŸ8µçê+Àœ¬åØÛtC†^,Që@Àó@ÓëD5^¾x–Mî§±TßýËàÍNoãîF \qó²–ò*$2š¦&À ³–âDKµÞç²| {pÝéùwÀ@ÀÏ+âk3²`4Õ´ ‹7’Bàã›…ö“ŽåÇ”¥Îù<:Ç‹_ø¼þ¾Ï|À ¿ó%Óž+ˆø uû ‰ÊîÕçó ˆfw8]¬()õ=Q“Í÷¥¥`‡èðxÌ÷Bo '…IÑyh7vÂâ@š¦îìi‚ÃÉljº>¬.*ÀìôThu´„X.¬¶ò>sÐÚôó¢ï¯ÿ°êKû`÷x…ͽûÁ÷úK}é“{íø“Xž½9„U·tš¼äÒnë¬Ú~ã)ø룅?B?Z‡EÈ™;ra eD>—üÙ2°^¡)`GO^[ååùj_<øÍ /¼÷-upPô}×Ö^*ÖÐàìzHÈKBßX%Q5ŸÁ¹îgA3V*KóÆBAQ*æP”óŽ}Iœ9©³p¸íFÌÌ“ÉÊ>Ñ^ ¬¶[øÂ$Õù¥‘žû‰yU£êÔžú³ú„°xæîÓÆ²ÜB¢®Fu³Ž«n“×~ór¿ ,쇜î4ÐÊ6Ò3î[𠝣ºªÑZ*àûTßYs7½†ú‹0ö„A~Ô}h½®6Dq™ÌŽç&€À˜6uŸ;ýñtQ¡JŒšú/üœÆê°"#&‚u~pÊ$ö÷r Q?£¥X1ózô œ…MF»JÍéo™?-ÃUXœw'¸Bpª¾oø8LDÃï&àùŸýo 1,R‘›œC© Ù0Ûª/e÷óñ•K„’ñÚ}n0:¡rìçꦷ —Gƒ +®rUAdcÀÐ㯬L»×™ 3 ,‘Æ)2bæ›T 'ÕtÂrJÉz¯ÕYø“¹·0„0zÑÑkÜ|vPWA€a£×ËåeQ–¿Pó\eD°góšÙw¡©ËªyáÀ¹%£AqZìÔª™‘‘œÉ—ìïëÛ¥u[_/ý¨¢±!ŠÏø >*<£Úëî`Mãuz²©Í%-a ´úJˆÈ¸QV856§Û÷³òi„wM|îqa¸|jB šzûâáA• eÚ(Q¯ïAÛ0‡Ú¶SÐaŽžæ<¾ÖÊ)QÎÎëg¯Õ¶õW©š{ëÈyÈæ¢a‰ú- -€QÛ–NMAó଼»f¼uõÚ/9ïÝiNƒš/’øKŠÑZ‡¬¤ôì„Qz½<"Ø«7Zøu„ É>¥VM¯¼nVq¡ÑÜÌ ŒœDïpc¥HUS×;¸qÍŒUúP9ÇI¥RÎá2Àã5CÄsÁ`Ïs1 ±måóƒ ø!Žô—úyq×Ü›ñæ‘ÿè×ß%™GÅ>á”-Bé\•HÃìš^÷9:4<Ÿõqót¥?ª!ßuÅÙon ÀÚeL'à]€~˜ý•„+¢T­ÃgàöؘçÍ1&€(ÔÃr†u†:ðsY*Óù,iaÞ‘ä_úë§5•Òc¸õ]5ј¸ál´Ù…‰éw 7íntõ”#HªDqˆb‹x 6£œþêÈB³ÒÂkzñ¢@Äãù¶F…E®?ÞÒ¤âakÁÝ¿ .¡º©“äΟýuëç[úí-òÍ„X–Ej ѵ6ó¼(X’nAFÒœŽwNîdùÞ2ü{Ï¥|ªc[†[T_¬–âA>2 Úë¬ÛÃÝYÌçíFHP2\Þ1ÐvaÁ dÇçáxó˜Ýé0:B?hÓ2oæg·ÓÖ2~ÄòÕøå‹‚Ž€_8ßß½­¶ýŠçþ R%›o¹N¿éߺ]¼-üA>(ry‹ßª}R3¨×V6^ó£Û•@Žj¾¡ïÓ–[u§1B˜?ë›2r«ˆÆŒÄ9{ÞÂì)ßÀñ“Oû›iÉ<ÚÃá Ñ1UxÈ4‚ ”ûë6W·6«<ï;ˆ4æûßSü6ÀÏ.ùá¡10X‡˜á™² ZЉ:.X˜ƒ[O~åù8jÚù““NØj‹e^¯G?2Tƒ¥ÙSÀ)Ôd½pzüòâ70Ž»iCŸ¢ùß„×òWBÓÍ ½)ÿ_‹^£í¦õ½¿ *|î'æ r‹EãÍqªîúE0³ ‘ÅWH©žÜÊ?¾oÙôÔ-ôÞ‹£•*®N[ËÔ1Úi.™ü!'w~–r>ˆ?¯þ®—eCm¡Å-YDë©íò†éRõ}ËWhJ—ßÌýäöǪÎuíÉ ÒÏŒÕjeBë#¬ Šg•¬›»ŸE„Bg­‡Rt‚u—Уì£Î¯p=žo/ÉHœ_»0ÿÛ[d²˜Â–zügï&îTË®ÂV=^¬ï™¡‡óz-“ÕLx㥴œã?·õ4ÐR} ûß•È^r±_2O¸({K]o.jNþ̓MìýX-gÄÏÀÐh†ÇZ×õD)´—ñ7þTÅãùè¡&àGÙqÁ_7X þòukZ¤×Ð=b Ÿ7b”V}&ÏMYÑÂ<¶*\,Œ†©ã>¬µº• ¯›±s²îÅ¿ßy ox ';s=©,iŒÚî´vBäŒÌÚ6@æaùÁÖAâ"– +ù$„Þ‰Sc|A¿4+_?3mcá^ñ(‹pØŒÌaXŠü<¤Æh3#TÊ&||h1ä4Ø–° UÔ,ˆ\»ô<¯qóg¹e‚^£ ¿ëõ­ÑÊT‚<¡°8µ ŽÂòìõдî‚ə޾‘ÞÍ—ëí1n³T§F87.È™ØÈYx¶æ)T}Ú¡z¸ìo{ ;OîàâÜí†ïŒµ øhå]€d¡Rd"‡Ía L4öc•»A_56„ù¤_ç^Ý÷[LKÏ€¦íu4u×`çáì8v J»ôÚ>bÑ5¿ˆÏò©ê_ð÷2kéßʬ“¬Ý#H„Û-™ì³Lë¶x&ê)Ò˜@™ŒOÿ¸áÜ Ÿ×Œü„$%­Âÿ½õ]6¶ÔL¢i¯Æ¶ª?¡¡§ósïâ,Ö³H ÍeUµYt6™74І®ô îG—¾zÏ^„?@ýNSE:qjåÂŒëa²uBΣϷ~ÒÊÌ à•’Ê‘n}œ" .‹V—’P‚‚„˜­*€×¾¯ìJ8ê šÊ C»K…žŒX˜y;vÕî ªçtôª<¿’ó%À2´ªŒÄ®3÷!/Éæá!ÒÇg­@Y»XžŸÂÞ¤ºïࢠêᇗœhÕABXÛK5‡ÑÒ(ƒ~@ 3Ðç4Û‡?ðÙ'¶n%´Ž:†¾ûgù€œï33[.½`Z¼€ €›„ô]VB$ÌV'žÏ\lÁ¬´é¨ª¯aè¡­„'G[kðòáW1=c<Î6¨¸¹ÈÏ»I !ò)‘3i‰IÈŽ/ÄŒä5„åiàp8¸]úqÆÄ(ãn«àñ#K&ªÍ0Ð#*®Ä „4‹¼, ¯¶Sƒ)7#X‚š3­[Wç·nöaÒÍô¨4ÜBÞÉËì‡Nžª¼·Øeù<  >¬»¶¿B§ëY76vR._D¤mWë%P› ÓåAë˜V#w,ð›(žŒž±VΟoЀl1Òû˜ÓëóZÈsY.ýc#´ª4ŸÚÃÈB¤]ßÎÂUðó«/`º›ÃZtüì^ýóŠ„£ÿ‚šmñÃçK¯˜ýîSHáù?Ðø7Jbsêý æóîð{­ øIDX–“Š]³áN~H°¥¾ÇŽþÑsŒ¥MØDéçOk€–/¥?'Gå¡ÓÖâÙs$¢¹ó¿ MÕëN¤ÆÎõGðüd¼d£…à‰ý©mT=1éX@üòË=k|/ÜǺö]µKÓèoTÁòÈ‚ûnö~ìk(dàüñB¿J&ñúóKÍ4A“¶)Ê—ü^{%ú ‡û®5ë~äë]éêHÚ¾:œÑ¢K9Ѹ½b¥z£Ã,UÀ蔓spùŸPm½’àդͬ2c#!‡²&å^ª²J„øú²Åè ™;®Iï)ÍÔJf¨ #l\$dS ð& ¡*ä>huÜZô6<›æ­‚À7ª=}îíÒ‹€`¸ÎiÕªHCB؆ÃÀ”n<Ôâ$?Ów0Þ³XÀOÿÿ;—zõ×Ím¯¼Zç û_í²Ù;µ÷ï©C`VVv¹Çã¡¡!þ…HèP¨-ª©óñN.ôèø\ÌN‹ÏÝB˜bs»úûÛþŒw›§ÀR^ ÙªªUjiñmkL¥g;v¦$qÎ2³é]mcó[8Ú:Pì·Qý×Õß‹ªÀàIÑ>4Œ9wá0aªbÂÖJ‹–ÀæE÷`+uXœo£-ä‹2 7wÒý€yl}äÂÖDf©¢òð›8zjQ{ça`pz†4›/Ö ar±øŒ{¬ÿÄ ó yÆ™ ?o;?åVÙ…þìõ‘-ÓË" 0 WZ¼<ù¯äNnÈh ¬‡° PøÌ|äç߉žá}þ~Çd!Ɔçã¶÷À6ö˜¼ëp¬õ̦AŒUš§ðØ w£eä@² œ&ÝSötÍâc[¿yKGJ|¤£`wíÛ›÷žå•|ZµõJªÀ4Z«£%«rYËIqw-^QcêÛPæWpÁçõ.çY¿d2F^ áe¨¨Í.$:šÏ²š‚™ YÁ±¦N—uตçÒTÄÊöbÍÜMþ‡°>Úb”GQ!H°L¥œ£6Dú‘šÀl `@®°øøáë;Gœ0›EÐG! Tx˜Ìl~2/2b’pãŒðZþ¦4„Töë­Lc¦,(Â!`M”DV#ž÷a˜}_‡‡»åük”ÝíÑ<ö-û¦â—6}µõ³Èù*µ[¼~Ë[Gö"9*>wVª ´­]ïmÕöŸJ¹€ùMˆÆí8‰´Ø¹~µTìeÍœ|R/Ì£F2:,A¶€T|qÖyD¥9K}¶·*TŠSX;ý:Ö×™‚`£ö9¤dÍ_èƒTƒ¡±6íN”€0 WB„ÂUkÏAXÈÛ;Û£Aœ2 É1‹Y>)e% 3çãºé·€ç¨¬ö¹š ŒnÔäy£†{Zù˜¶n´PòòñÆámÉ–Ò‚¨ÅŸñÖTWøQª½¿äÙ}G8“³»Bä©)…ã`Êœ»Rn½~¬ìRÔfçswêÕ)i†"bsq¦óŒcíPÊb1'ý«ÿ}uxÊàä5v!1B9B_ºGäC‹Ç²(è/´ DET~j/. \¾ ú™¼Ê¤6ÁqT3-ÆŒ)‰‹ü 0_—Gèð<øL~R”"Ãúú‘ÊOx~=·kн§zfÚZVÁÛníÕö) ÌÒä* Ìbüb’³!å)1jµÂåeIû}CûѯÇ‚¶.;l„Æ)#'Ãc\„‰ˆ:(wñi¼4úGš ”Ìú"©¿W„Qò|–"·ùYͪÜLä$L_îg‚2Q‹‰ NÔc«Ó “EWùi 8mûKÂ9 ™«,”—RÙ«$Ôª³8!—p˜·ÝcÕPÈåX˜9NÏlsõEB9¶5wŲµ¿qП/œ˜²ñi XŒÈ ¦æÉ? ˆ^ç%Ìò3—eax†Š\Ö·+—ç­ÃÔ¸ ÿàƒ@êE4—€ö~𖆲Ïp ­‘0?¡À»õúåMÇGrµD\º±±‹ò~‚3]ÇôiÓ°*)º†Z`3i+DÁ³/¶+õ¦­Ã٦υ$HÈ€PÛ·S#—°ÒMƒF=xü°tŸû„’|•ù3+ÁUÇ:—m÷æù VÎJOÑM 28 ÚþÃeŸµü”Å…Íß¼ÑP}¿lÚÔ…MBr¾ªùÅju¼®°¸C7ôPWO⢓‘»cDß5pŒï/«ÂѺB°jZÊtN‡·ëN kDƒ¹êoãÜÀ>¢"&aŽÊQûzé'½·+ÐéRRYu¶÷ŠåÈŽu«·÷Ù ‹{FM1F˜H¶yeáÉMÙþÕ5 à—?«P$_¶ÇF¤¨2fÀìðâTG=Úû¿ †Ñn¤%Æ#'Î]!óî(û$µ ^­‰¤'¨¼’&QèO:Êßû=‚¥®Šûoô–fzòÀó€°„|Y"T…'UP†ÎÁ&m­ËËë´»ùÚïßül¥4äk Ç=ÀWñ–?²Mæ'‘Ææb_MùÏSpX00*_1¼Ò2ºŠ—(#xÅâꪎϨíê:¿ ¢äŠHáU>? оbX4ëdAà•„JÀ +!ÉWùü…!HòEÕU>?w…k $  È—Š¡X`@/–\¥à‹ÉÚÀh$€ù¢ÉK5 0À€0 _YüÌyÁ Hr¥%ÿ¿x­€ä %ªÿâµ 0  ÈWS¦×ú/:]À€äÒò9ÅæX`@¯û›€0  ÈB>u4ÀÀ€|!dÉçpM.ä«Êjp@ÏW ã>G 0À€0 Ÿ«|žÕYá0 `@¾²H¥8ð À€|^’ÿ9_Ià$€ù¼äóVA‹Çí Hò_—ÂÀ=$€ùÊɨ<} &  ÈWNýTƒ¯"  È[¾( f…@0 ŸZ}/#¦ñ—¥S´äËæñ“?gFÈÞS@xäµ]10Z!–I“~#‚¤ðú<—ý ǃÃå@®¾àŠÞÇëÆ¹žC¸M‰C–4|Ÿ }cÇpb¯ »žŒåÂUÆ9¼äÈÿžŠîs|Míé}üwP\ÉbpcÁªÜþxðøþ!°8t8Ýu¡T­"wBg‰ü1ï§±9|X–·qqkÀs5!ˆ?‚Ú¾a˜Nðyþ”€çF^˜† ¼˜¬Ú,ð¼àóeàKŠÈÛ°Àå ‚Íc…Çç¼ÌU'gäâ\<óÞó0[»  ET(w™yD†ò‘›$Ó}éa“é~ª(œÕÀ€ü÷Äãæ!,΋ØÿÇÞ{Y–\×7ó¹ï}yßUÝ]]m§Íx Ü ‘µ¤V$EIE(È]1Š µ»¢–’ÖÄŠK2¸b)Š)3„ƒ±˜žé™ééž6Õ]Þ›ïÝs™woþ_ÝS]SÕÝCà»YÿÿWÏ¿—'Ϲyóæ*¬ÏÏè€òû†jÇשx[ˆÛ€ðvÛ°ïà8ìËf¨\ø[?…üïûDþÑ?‚f]@@>¸-ðþ˜ïöûð©_ÑaüD7š7™É÷ÉJT êÐÐ&;þÅ»ÍÿöZçn¶¹Q^Wäëoë>+bVÜðàó¿Úv#¿û0U1U€¾á üÚoŸ†“tƒ]÷¿Ÿ‡Tà·°´Ü­âm1±µLl[înÛÆÛñ¿ èmÛçÿmÿ=³õûoÅ<á“ÿ]x$_ð 0°0¬–Ø8 ÷¿ÊìûG+Tò;í{U¼Û0ÁíËæ©,ÿmÞßüš ûé.G´D,ðþH #Dè+ÃØé:ägC`Xòûq¨&•-@Rö^}|wZÿnö§<íÅ¿•ûJ4acÙ…ÏþR»ÓC¼löƒhÊØ=jCvІ™Wu'ÞéµFª·¡˜ÍÀï¶Û·d°CEƒ[÷¶[ìízi·ÿo¯õØ`TŸs[Çÿ¾›êìøì?éƒOýl7HºBô/ÀÀ~`¥p£¬CÿBwï„BØB %ÙB€oýy6æ-à:B$.Zìæ;´Ò–ŽÝÁá–«Eîp½Èël_η–áWÍmó[÷ãêÞx®h…±„¬lÇ1vtÞܰáÌÓmöçì/ÀÀ~ Mx ÒÝ™ñXFüTÑè»aùШh@õžüÃ,±Zþ…+æ·X u7Øs,qûò;­?·uì÷ähÔlèì‹Ã/ÿÎ8¼vñHmúêÑÿ\¶{ôœOrw(s)<'¿û! *6ÀmÒWñ"ýîöˆÉx b´òŸnÀ—þ}GKÖ}1Û7:Brw¸{Û^ÒwçwØ ©4ÞËÉz® ÿø?~6µ¯Á"ÚÐjW›öØ$*¼z¾„ãûbâ:5~ðnýˆYÐ üwLûUjÀ!øèpáñ¶NàȾ“^Mg „Þk¼ßn½¼·û¾sße*KП¹ks]¿uýcã Z²ÁwÚ÷¡]ýÞ«Ð…6å÷3°<°ûoaªògz=xü7V[£IÞëæðN0ô^ å}ËöZçÆïõ÷*]ǃ®Þ üÏð›ÄŠó-9X`Öb„™n>÷?®’L|ϯƒ\ÝT;ËÝ‚ß{YGà]þB@ß`'üá_ý¯Ð7$&øñ 0°í A“êðáó¿¹Ò £ñ½»–{5hÇÞI¶Þì½Ý:7>mh@Ûw{‚*SŒ*Ý´/xØÝbA'H`-SÄ(‘õá§ÿå˜ì üÑ¿(€iÝQ**ö§Âa¬ïá©Ü®CåFÇË]^“„L6ÿïWþ5 S%é´÷ØžlIÅ J@v·Ãèš[rôNÝ£;{u¿SÛ¼[ù«X_<…?öwÁâ<ÈíX » Ö$29~ï‹g Z¹c؇¿ÅßK6ï6RøN믾´Bf«àXÀ{o/†Á!Ó¸¶'qSÀ¤Fe(Ÿœv—rö½ ‹ÛÎż+4ëèÊÀ_<ó»$}¿_` ì=˜ëÚÕ‚ÿû‹§[à‡·ï8U!*&ÐÝ…¹¹;XÞötY.Ü>VÐ…[Ól·ŽuWì¯~¾f`öÞÍ÷$ôDàwÿè6o›rO±¿&¼;\e·"öø~§mÔ¾×¶äömÍó|èíïß ˜_`ì»d‚Jpö …¡^óAÛ] 7¶€ÉÜ&Y÷’¾°Ë:»¥Õßmy îÐÙ¢˜ßоø“¯ý  y \ 0°ï†ÿüßÀƪ³Wϰ»úÛ˜ÝÎtù»< Ø{ÔÇöíwÃþ*¥:üÉWþ•Ê`€_`öÝ›ë"pÎcP¯ú» ¨|o³Bï,%¸ƒÿO%)=yß81U‚tÍØ÷ 'à_ÿþ ’‘Öï¦Ôáֱ݉LPÜSÜù¿òËÜÓš ~ÿ?ý6DS*9Mˆ€:ü®­ÏS`d`ÊàßQ“4•"P1:5}"}Òb)q[êõÿ1¿‘±(üÚo„_ý¯A®ÓÚ:[ïÓyƒù¼ÁoøövKšŠÛ~³­"¶vWÈRççÚŒŠ ë‹ÏAGw¼º³ûº|¿ièPIºN’ÚooB€}ìÆÔïé>¿Ž-B¸}Äâ‘x<Í™9”êepÞ¿gèðš§úo F°¾w¾uMž¶»“±¾¬×˜»¦qoÐÁûÞú¸ºfÆÝ;º¤Tz&_lÍ3{›ÁbRHݾfªzŒ¾äŒ FµWÊ»›£Ö—ŒXfo_n0™Š÷ƒí[°P,0‡˜ae±i_#à k#e¸ó·›Jy w{ŸöJjz§3¾q7ê°côG‹•–Œ¬C8ððO!œBÐC[ý{ìYíL×Ãz:zȈš«áZs¥_ÓÄÝGy§`ÇÀ 쮘€©é0’ำPr‡ ý;“J»ž·¿ï…¾ðÃ…r_W½ZaÜŠ‰¦ÛðÃ:Ãx$é–kš”²É€ËÝ*¾' ‹„‡Æ&LÓêò///Á›S—D‚ýë xrt>4Ñ“¿8¿2‹Â'¢®É09ÑFM ä½°±ÞMhËíFƒÈmøF¶™ö?é•6:e‡~¦ ©.ê%Dâ«Ø¿w˜IÛÜÉ8õarÑ'G3qî4íÚâ! î–Zˆ¦t²{’Y¼;P,Àq¤b’u‡ª°^z–!0øíçîV˜’//Á=é²™-6ÈvÁDlj0Ë»’4½N5~©¼Á Ø„}£`™V³âòšSÓ¬[ÒEø™$õºôó¦ˆûϼù:›Ê¯bslbè#2_ÁÍÒ%vü¾Ç½jñ¯Ö¢<†ÌÓÚ5}b²˜? C¼â //êu?;áO./ø—æ®ûŒ%|œ¸ç.Å;mfÙp€'"¦•MÈK+›þF¹ì[ºå‡0äWòóbaåUÚÆ¹xÄwÜyµ\ª{XUl¯-Ý fâŸÀþc?¿óŸ‡ŸüüƒP­ì‘âlAqŸrÛo¹íóæ:\ãN¹Ðtû'Rpâ³~¤ïÿ<ƒpB‚ݸkð£ö¥·ÇÓJgw”ªµ (è/²ˆß”žpœ%´{\„bi±V“+×üCŸêK ålï‘MtŠrS•¦ sA¡y\=ô›¦æÓ¤/¹ìëÚ/|Å& |}øê„+«DÍ­Èn&NŽÁ/üÓB¹ô®´|7¡ý]@pçïíÃÞv²ÃÖw)€“÷ˆ}û{X¹dsun·¾±£×!lF>~{ÙôÏ]{ÖWÝ峄îÇE±6í7YA¸¾Žg‹D8Ì4 L‰ïL#ªÌ¦³´ÝÝz– Ñ6#ñuá𹙯ù‰ø ŸHŒéñx_Ò“¸ç™ªkPYº|áƒ`‚¦»éüRRëë+Шàys:·ð jH¡ë)Aˆ¡Þ¬H§S¢NzÎÐâÕéçÅÛ+shE,.µ‰,‚µ¢Ž/Þ+|¡P'D(' Ô}»ÒG†>&âÆ’¯Éµ†Ž‹pnª ÓëUˆì`=èùÐ3Ð ÷½ï ØÍwuìlÅq;ð»ÓoÁºãõô¥œÃ÷ ‰M+ ç†sžçÆ ®/HMHÿæùiô&¿|½Õás“ýiFwlÓ9!Î_{E¸v]èš%¤ÇýraÅ/:Suá»> ÏwèÞO²_' ã7Ü| üî!ù›Š´Ý Û”ÆôX8ò@nÓ ?}éI‘¯o KOù›Õ)‹t…#V"ª’˪˜òíE!i¹†pbdFºöÓùºÁ‹``7‚µ1æ7PÔc{ñ¨þÔ$‡¿3> ;"¢7Û-Kõ9Q,-˸Ù' ##Ÿ¾øuñÔå7 ">N§Ç’ÝI©™zHø’ Ïç*TŽ$“Õ2É¿p¯xøÈIaŠç\KÍ Ë#P¨q°ôvyb)[á([„q͆»WÇÎ ?žÜjr‡Ÿoçï[>é¸-YšëLø‰lz;¥÷ÙÊÑ®3á²(1WYÓHe»2ƒI: KáŠ:e’Ⱥvƒ­išf1®,¯úË+ç¥i˜Ê·)‘Šà®tÐSACÄ~™ßú"„ÜÖýÒŠ¿!ìˆÓŒ[ ¦I3ö±ä•uK{âü—åÜæ =]Z¼[¬çWe,ƒÎXWØ@`jZ•íé OŒÁ#ï#YiP`¶ÍT…{mj«;ôF4ÜVQ•U¸‹ö‘þN160Dl#.JÄ>åºàNTÄÍnÑh:òõéWÄçÏË&ÿ¨Ñ‘Ôôltc<.šMW®úU9_«ŠDö¸üÜ£ÿ\ôÇ^Ü_(=}Å”¥fH«#…8ÓC]÷D@pÂ$ TQ¡~Ø ØÕ¿µ›–{|ßþ{ç§°B†?5¹*Þ|m #-†s•êø@Ô GÆ`¡h±Wç6õLrd|ðtJ×´„Â@“îÛsWÚlî›æb—ÈWëÒõAäNFŠP",Rf Û$BeÄâ¢îÔ@z¼=$°Õùñ¾¹x;¸ú¦|ž4¢\XíÀo^ü†XÙ\%YMû‹ŒŠ¥ë’T-1ʪÈÄ;9±Å·5UKUYºÒÑ„CQ×¼ìÿ­ÝNÁ-øÁ3zª£õåI€‡î_Ê÷Ž¥¦)¾b†4W³Ì^Ú@c./Ãfy¸Áˆe®làŹW˜À$„À±Ž9vßþÃ8“'„¬#}NMà`â%gj¯.äš«å¢>ØÉBkå£^/ë>‡»Þ*Iü80~#U¬•T`¼~{9¶vFï¶¼}ŒyµÂÓ„F!ð›k~OrÂûæÅ7Ñ2û VµØ×Þ¼=yL ½={…µÍªÚ¶}¥ ùB “-kpÆCt€ ÇÁ¾Œ˜'X­ÙÄå‚Ëd;˃ÛÁØòÇ\ZÕ‰™h»3„,ÌÃ÷š×Šãâ[¿ÀNt/šiA»àzå« Ç:n¥Ã)Ô¸f)lííU¢š#Cƒ°¿ÿ8n3xÑü!ñÍ!r!Š/ï0 W ŸÀmß%ÞɾÁñnê!ÅT…yá*1‘ñ6ƒ¸±¢'=jåz]ŠžXH×蓚€‚w XIÕVŽ!ã–_ùöUX):Zw¶;¶¯ï^í‰s¯›9$t:ÑTÄ…x(ëxÞc·$aÐLB¾IÇœ£_ïrCÚÂ@ÿN&Gl|ní ú%æ—ÏAÇðvÀražyû:·•'m…vKëðm‘ŽPEë~úô¯ƒVú:T:µ%Ëv8Æ[e4•݉Aô!xëìj-)GÕYuºªÒØú¤õ„çy¾ë7…©‡Iý¢ÚšŒªªN[8ʹÏUï¦Ü,]÷×*!™Œvƒ©×Psþÿæì“¸Zpx6™¼‡½xù’\Ï;ÂBS.. KWîF:KÐ9$o`©ÛIàÝ|zn ~–[‹=:Jn„É(œ«_™Ú &[ó˜¾+‹k—d³QÍ’W—–äõuGæ’½*A„öõ·Û­Œc¿ÑÜß!å‘¡Šª#eÕ­‰rÃ1+. Ÿ‘Ép‡\/N Ž`2ƒ_~õeY÷ÃòÀÀaÃ2tK Ë64„ÑÂA ? æ×/I_*¯ =tŸ FE†é~»ˆ¶Š×dԊѱëBc x`_Û¡zYvg~ìfcÈZs2ó]J.0@²'Îö@6¶÷ÿĬ M_~æçáÒüÛ‰MÀÃG>/ÿ[bnß¹EU¼®ÌˆI$Ìxd”U™ÚrûÎæ¸Sˆ¢ÛS(!³À ÿDÙ Õý]¯¶NÚ‹«]5‚þ]¯\€Zù2hôƒs,-IJÉ{eØêß×-_öM¯ÜÌ×·³å’ üjïNuÞ]]“Ë ¹K•Æ%VÈ9I°<Øžºž%¢ ðÌ¥&äk­s1ÆÃù¹UñÆÌ,Û—þ÷kðó¿R…U€HHù ¦GÑgœUݪH;]ã¬î:0»VÁÞdZ Ýã¶çÀ7.|ô¨íuE^k~þ¡¿o†Í0ÛÈ_ƾ®C0Ö=û;}X-n²jÃÅŠ=ËSà¸üêëçàs÷‚žL·^¨-ªÞ ¿åST÷\O¡ã»¢5Æø©V×[#´¥«V@&LÉP–…t¦×—1y¨¸ §ÙÂ=ùî{ 1z¿–™ž¾²:é£ï¼+ˆ28– ¶:ÀwÓ‰Ðn5ws7ÝÉ÷¢ZêH(ªeSƦ=ac+õy¶YO³®ÔÕl;-f´íMÄç»{2­$°”*”„¶¢BpÇ…¾Â&Êk+‹µJD<*nÝÞD…XCí£]YyUSOøþj~Á¸†sÃ8³6 +ÄH£RfÜcèpÉÂñ.HX:‚¬(V…*°—Š6Ö×î…¯MMÒ)i¬èÁ/ˆÖæåbžöæ]f¸íbÕa)¢tØcÜ¿¸…ÒÜšüôvcƒ·¯§0Fén% heC•±»MÑïäË,†›è`Š™Ì$Ê«ØQÕv芣Ì2Lº>‡ÕmÀßú+•°àœ÷ÉS 9ü³Z4ôÓr³pN®žÂ¢¾Î]yȨ4èò¼VÖLHF0³²ˆoÍ­±Ý9›kš/=ÒÒêu²è!Û2d$™dœž Ý_Õ[’¨^74šš‰ºÇ˜ïU¡ÖXÁã£÷q#ý€¥Æíoz^%´ òRL••ì’þæêñDÎËdî—R&tåÂßysd@¼+p‘>œ˜øub=oip Úv ®L>ELè6(€å½Z8ªËâz•ÙM¬É<{ké|hä~ÍbË´ÓÊ÷(ã‡Èë’ñż-<”ÅÅÍ)`æ>ÆýI£ü÷èqv P,ÁËWó¥s™G‰ÎwÁÊt=¦é±£F”ïCgðí¥sìäÐN­-²Ñþµ·§6t[¸þ ð;Øpuõ¨P,Û^¼hLìK±Ožú øÖ¥—qfýß×w `#ìžÑ‡q8Ûº,ˆ,7ÑXÃ3`³RR×ÚÖ ÿ)>5Š‹(ÒÓïªqµ*‡Ï|®N ‡ÿí_¥!“° “Ø=àžÈ»s¾“ÑZ‡»M¶†ˆ@Hp’Ò1&䯮A<-˜{%QÞ–0êdwG¶'n±àj}ÑËMñ‰á JòŠMa2Q% w@—)ð½2³Ýr†Ü— ©N ÕEÛš×ýˆòêÇßþ’ÿÓg]ìïÈBX‹BÃ+ƒ­3Œ´“ýµ8o©îAÒ©W†Ø±¦‚—æV±;ò<ûØ©ŸÁç.~•X¶‰N6Þ;Q£¦Õ²·„BžÀʵÀJ˜@»ßAHg{1mÞC‡ 5í‡ÁTÂÑÌ×—7áµé§`¸çqäî2Ä£I-_ЄsuFa‹µ|öøÝKdÕ{&hîÎ9gÌ‘.«;Mtê©›2¸ž…M‡µü$,gßÏrÝ#D‘µ'"Æ;ïxÜÖhÞ?MӌΞòšLbÃYbùòe“#‰Âé•—Øf9÷ü8èB4Å6U\ ÛgðÌd,£=®´U½IÐFMW4où‰ÈEÞ×õ~m¸ã$ËŒ©¸É¾zö÷Ä+“o`©…½ô$|Ð[ =-DÔàð©—!,™JŽ‚Áþ3´ãå-ס|ˆ` ˆ$$(o•¦ã^,nÃîv“ÇïjQЫÙ^Š~ãñ‘#‡ÙFµÖŽ«¡ÜX ,cÚÔ{Ój*Ÿ1.K Ð< k¾†Rçaƒ‰Íº&¾}uƒXö"˦Ð^^ƒ­Ix©ü¡{ÌL£Á«à+¯¯X•ñ uó/Ÿ} >Õ §Ça!ÍÞT'çž„—¦ŸõÓé~ì<`\¾ô —Ø!Ó°±Á˜u1’4‰l ¸6÷uŒÇðÁC‡0›x=ý<\œ{± ój€®k³HÆ‚H$Æ‹§Õð=v"ÜJÅ`€ßŒí@c±3¹rª %!‚e…U<*V¨Y*æ„#s€Àjê’J,M\¡Ñá…‰öY½_!V²è¥£»ç¯³Cðò¥§`„$P(ÇÅå+,G!Æ:¡X]bϼý~àðã0Ðçi•â "“Ròß) %’J`ÄTî Ÿ ÔÜ««qYnÔÁëKºº¾øq?LÚîìäëŠôi™È+ëaÔµ¦#CfX3t‹ ºuŽ˜#îä».&;޲ƒý!ÔqC¸ÛªÝ XgU&ýáüØ?Dxö‹YPÃ…5a`»›à]AS߯ºëkœ¤¼T‘}àxž¯×ÿûc÷êe‚-L’ñÓlzyé 85ø ‹…MX\»ÌœÐ{<€î„'¾viί9‚[ºò}FM„,I'g³+os›( ‹5·\˜©hšIwJn8€/]žÆ±ý`ðÔ¨Áø›7þ„õçRx|ð4[Z]Æ©•KØD.£¼ t}PZZ˜ÕÍ ½7 Fšº•:Ì‘ô\Œ $H¾±Dìø­ky¸0wžI0“>këç™-Ûd,lFx ,Eôn¼¨ßÚ,À½p[çBkzHlU0éR‰ErÜŠ¯`½ä€t æ8jú0¹iªQ§¬®Ç€i$)Õ„áU¾­_´­™ÊìÇt¦ÆH†«gR‚™±#ðüÕeœ_¿ÌöwBË Ùd.ÃFõ÷¨¦ãzÝ3¹cté>ЛÒÒ£j´Lkˆ‘‡j„ ±LiÓûÇosÓ• Áˆ[= ñH¤b˜[½ÐŠæ£V •M‘*.±¡ì1^'Z+΀ˆjõûXOÜM\€ET1…þ ×ÁÔœ£úþŽûÀÔl¸M­dÀ¢SgTw°R]£åYè:ÈF;ÃðÐØ,>÷ö ¬Öptà ýÏbµªKŒ€˜fU#’ÉQc®š³ën˜E­.¨6þÃÓ›‰¶ð«¡.aCG¼ú:Þå6™/ÊÞf½…¦Ð‘øŸF€š‰ÄÐv|™‹åˆÝd‰i®ÉjÝÒ_½6…^‘#ÝxÏáa¤+ý©)lV¾ |ßoÍÌtc òMð µG¦Ü`Е<ÀÉǰ:m›O% ’m×äî ïåóÛƒ¡3pì5J}ÀCÄa¯€ô×i¹ ¤htÌv=Ä AW#¯5öæü%üñ£€Þl4íE¶Z@öÂ¥W1Óy$Ò©­–›°²¹Š]уðÌ…MèHý1|äÈ#xbøÓ¬Rk ãçá…Ëg…ŠÑ<Ô›¦ãY"醹ÂÝ—W^¼òm~}-Ç2Q²ˆÕ©_^Ÿ‚‰‡0¡_¯_zÒ×­¸4¹Î}lα¥N\îþÃïc6ãug4_ßáL³Ôd¢/lÌFs`ÛM0YUæQΣŸ3櫽0»úK×Y(b`"–d #ųѸÑW¥b—«Õ%>[x›Ú;@¶7¸5Ý*œùyˆ‡B„ÕcAʶÏGµºêû–,–sëýÃÑýp÷#Ü„$4Ã? 9ãÛ¼«Bo!ÃíZ.7ŠëÒõ—´X,ÌÖJ¯É0p^+ª_MôæÔgŸ‡™ûà}ûïƒÁBæÖ¯Àhï v B±ñ6Ú¶KÂD´õVð«ãרcŠÄ©jKHÇ6h_­³Ô ›UæxŒ…Ma½éàhª¡÷6ÊøòõKÞŠƒ$½žLîK2}µž0*^’¥Ã6ëÉý]&¾9ýu9‹}Ø™~Œ¬Ëüü—¥¦©aoÍ›.~ª´˜¾Û ÒÔg=Å|¨l‘$ÌÐôÖÚ ¸³ø¶~}‡ØØ¡#pô¾_-ö8„j¿ò“ ™&DÈHã× ¨Aµ$1&WC=˜Í¯@.Ñ×ç^% ¹áPkf$-JÂ…¥M,6U®¿:Ì./á·/M±¾Ü,Œ Þ™ø¥³x¤{•÷Цcò|­ÓبÌÂÑá(>seš¿=sÕì¡vJ‡®¸%'‰Éô½,2 ÎAÒb8_¾$œ SK‡ú†:™±¶(˜ÊÌ%]®²Pƒ`=jìº296˜Àɹ·p¤ÃÂÎÎ×έ†Ø×ÿÚE“¡a#[_'¡`,š`˜‹±XôËÓõ–K+‚é{Oɧ`6lU’1üˆ ì „ÒU¹ÖÛäÛa/mÄwñËŒÉÍÒ´Û—Kñ‡ÇfR{cúK0Ù8ë‡ )׎òpË7¶f$§M zÅ® ÅO`.ä°Bskõu¦G©r/T¦ç^”Å!«KSìíÙI8>zå “kSPwÊŒsb„A™H ;b¶8;Gg+7)©FõI‹€÷ö’¼æpyæ–ˆ$ÅŠpjx€Å̦œ^¾ê9Ø”1€3£]þ³“ec¶ÀáÊJ½nÖÙGŽõiŸ:Õ„ßz ÿÝùcßb0G[2³²•’áâR;-T‹ùÉí Gk¢õVLjÛ8ðp U õÅ^X¹æ€gK$d;êÙnScî:"D±¿õ"üì/} ù±‡IpÙ 0:÷ äÄîx;[A„t·b¶¥ÇI´{°RÊÃÐðDë%a˜[’1Cðùò1šYc:©BßVÓd ¦…UÞ„Íb‰Î%Œ:‹ãåÅÓŒ‹0Ò{†$¬3×HÂX.9†û;ûØzá ù_Zf¦fÐù¼RÃÒ|¼ŸhÝé±üë7ÏA©Q…Þtæ–&™Áòø‘c‡X˜¯ië…ÞÓÇ0›Ì­²s,nDñüÒ*{Âgø±]zOÚ…†äÿË—^”¿üX¢å xtàõY€ËËmæwã…Š­£6$‰A<’i5 åFJ«Mè9Ý„ƒ?ÂoýŸ1¸ðâµ9ˆ[ƒøïf¢ô[¡m;pú¾#pèÄ :8µXÒüTÅ·€‹«€ºžkãcHm…JÈ‚ÂVi¦è+¡®ã 4Œ‹–uÐÐÛ]5×ÃbÃe=["^`K zàšÎq(m°Jeæ‹L¯ðüù)bX]XÀ«LÇ Z¹Õjôý"»:õ<<ÖñXüåÙoBLÏaé²åB‰Íò¬3{Ìèˆ~“ÏV§ŠÊ¯‡xq]bÅ]–Ÿ{È’G‡îåߦ†QÍ-œ‹öáÁî#ØhæÙå…ó¨‹DmDŸZ½Â¨qa–iã“èÕ5jHêqšb* ::â,QØ,Ï ×’Õú»âŒZgÔ(xÄzÚa,,Úó}ö£ËÃæ0$£±vJ‘VT· a6¥MêÝZÝFŒÇ"D§6 neäŒÂJ~V À.ÔêËpÝ× ìý_ðÆÌß ¡ùà‹5¼wê«IàÓÚÒY7òÓþpï!£¯£Â¦Öæ¡æIä¤sTîuH»c™hû:'صÅU(=h0¿=µÊŠ³Ø™9Äõ=„+¡ ÄÃl5ÿ¦|k~⦩ ©qÉ‘§¢vJüàD?›-6àë—Y<ÜA@•†Âë3×áðàd’£ÚÌú9™¯,Š„Uf©£ ëP©ÏB_,ŒÓ˫໓Ñ2Óy,#ÿþ šÐo=ŽZps2p?- i¹}\UübÓƒµR…IsŒhÂöY™J”±•'ŠP“i»†¾ìõyóÆ6 µúð<ôhÊù³ÄàHòÖØ|¥ 3ª^Áõë:ê:”GÀgsdqÕ±D¤Ð"}(5•‹u•U I5:FAƒ2£<†ØÂA &N9‚Æ"Û(†pz YD3Ae¸²´ ~œ…Uc†Ó"g<Ïv²¾¾xòÍI(×›˜‰øÔ¬¢òI¾xõMöø½÷²G2ZãZ7ì ›H@ÇpjÓ'Þ8‡–Õ/¥iÀþî ̲rå2›Y;‡éXîé?¬ÇÂ:&ccàzU\.¿Ñ¸¢EHå™t¡ê-b_.ÇÒ=ʶ,V×¥PÀØ­î ¶º[BÀ~T“!PÉWò$oÁ8±—h+tD èV}«{kµÆ}"ùÒ<6¢Ëü`÷AÈÄRlrñmÞtmO'2Ñ´‹0·Y„âÔ[­ ‚BU¦F¼£ë $År!*ï›òçTê¹°zEŽáÙ±.¶RZ‡B½ ®ïƒE:8ÊÁþžav½ oÍ> &Vá@O‚õwÀFYTQÄ ³Ç?צÿxíjÓ¿ºb×5•°ÔäþC |x$¢së>ûÆëL©xMH,VÁcMVjx0¹¼ íÏB:Óò¥5kØßy/ä’ýÄHV!©«4]º˜8¸"Lû(™}!ˆ„ðp ÎÏ·3°Üpàøé¹DBë;J’;W—çáúÊ:‹DÆp¤w€õuÂ{&سñ–xñ*³ ã7ræì•u7VØÊèìyaXYx Ds œšTô@xim£& FÏàÀ‘h”7 êQz(¦Pcúz5ÌÆ j×0üZñHìȦ&ùPg7¼6u•Õ„ÚƒÖ DˆÚªàe[®ªœÐh:ö²‘ŽNj`&a†p¦ê|•w'é¥&à$5"ŒëÐTökEPû¹¾¶‚–êìÌàaV©='ª®rÃ\UWÁçììÔEy|à>zø'9ðA­éÎÓ;e±{FÁî1ŸXÚLãe¢´]l¨c {3½°QÁš³jŒp"ƒîT¤C)ØÈ¯ËùµËžJ¢p#Nóð±ô~4°%fZÔBß*ï~Ê*ø´\¯·&Jð¿·§œ)ž\”*®ÞäÝl±p æ=lzù›P¶ëpjð(Ûß_ž¿dx¾çYĆJr©µb³TG‡Àvʶ›•š*M”VL'Æ X¡ÊJ«PÉ{Í©WŒÞÜO›–HFëªPÄÝÞv%ö³þlº£9‡³•J‹µ<[X¹FÀýI’W§äÕå—xÃÓ[Y |ÅgÛb8ãëáhæË°”ß$†c¨!°¾v‰U™ÊJb°¹õ<î ý¤Øf¾Æ«tQûeùС‡éRBlvá5ëêgaKÃJÃfƒ9‡ŸÙ“±d –‹kí‰€Þ ÒÒñ„>ÖŒÎQàÙ©³°¼žgY+Ã:â«0Þ{Š¥´×ý/®¯Zw¯¶³r øá]ô“üe$]ø‰Ï,ƒS±Ôpôô* ?Æ}ÑÉf7Öq|pžŽù0.l\!€,)—#¤£ç£f,1`(wg—žôÕ0õ¥èI XRžì;Íú3ý°¸¹2Ãdëé’<õjÄ c,ŠCÚ,ã ð]ì£÷~äVÀ)-Ê™ ›œS¹^ß(±B¹N*@#iÞD½¼NìÒšﲷæçðØÀI6˜=«¦lq½òj‘£óáh>}O¸5ÂÿúìE¾Px‰¥’iìJvAW< vsç6–èº6àðØ ‹„ìŒdèúLÓ èÐcº'`jã’Ü(­(W¬lŸl+[Îàû‘@•COùÒ¤(©>-å†mI”[½[Ê÷w#£B­rÊúF+$ZASèz#†¥«ÏöaÌìf ë×QxoÁ™‘#¬'ӥͯ/ªº$”‚n%²lWߣ¹éó£ÿu†#J°Awö±…y Ü„ÅU°ª;³|‡Lƒ‡Í(ñ·04<§ twz»ÕîMê¡É­B®,Πç¹Ää bž\Zxõ<ÄWʯb<¢²ž´&–wY¾ip—°éÕE„F*>U,ÕÍH,@å1°PǪí1ÇghéshÓmË¯ÍøC}Y3zúL÷hБ8 ‰h5]†96b4œãŽ/¶òU>¿°ijC]ûa¾èãÓÞ` Û¾t÷wõ03Tƒ¨žÃt4Î*ó‚ó&$SÄ«¸`ˆ»?ßvˆJðP.qòàô£MXŸVðD cösícºžçµf —6ž—ãýàÅú?fÏ]ú·tϨ5¾à}?@M–/—7§|"Þ¸Yøâ3)ˆÇ…øì›Úñ}xì䇨Ÿ?÷%\/U“ÜôÐgÑh7f£=Ä›ìã÷~Ž5ˆõq ³Õ⋦Pw'dr&™Éóôé¾G ƒ¹Ô6eƒ9ôìU*ÚjµëUƒØ|¼šÍÍH§ŒGúâ.üÔéŠEù·ç'ùôê«ÌkTÁules²±,Þ³oÓ6+˜w&a®| ’ã,muȵ V›5t¼ºš¥T ‘lÈߘ/¿÷f?tžÐ|¾À Õ5ÍkžÓýêO«\qí¹2„ঙ%VÓ 7J$ÜE­¢E%J/†Š²×˜ÊÅF˜Áì†`‹‹ç˜]/¢Ê²œßd×6V1•è¥m#¼aC{ªíd!(•W ôÓ 7C[ É6›ZxÅÕ$·tΙšÒód­QòJ•·Ú(x´;¹Z­ËW¯}E¦#–lÆ./L£ïH°ìÓœµòóds?ƒt LÍk&?}¤ u `³À0»©b/ú$c©Êú­Üìî*JXm@X¨Âe¸C@ç~˜K,»OæÒÝ¢PyHƒi¦Šql€ ˜ŒwáXϨn}âÜl…3·òÓöé^ÍgöòÕ«¬Ñpp¢»`™î†â9²ºÁ³'éÞ€+6ªðúݽ¿lÇ÷ËZf7<ô>ÿïëP_Q)÷ „¬nM=ªÏ7XÃÏc(:F,5ÄÜÚÿ'ïIལŸ‡ÞÞ“p]ðÐøGáÃG~B®ä/Ò­r|äap!_}2ör ž»ÒèÏÀHº ÿàÃ?ã'XC ëíœÀ¿÷ÈOÃþî.veÄÐàOz#]´©ûª3·ô„siiÍ+C'öuoÝ—nŽGï€êKU9 MäÌSyéÞ[ÊOçëL=[bçÌ• ÇFè:Â0ÖÉ 3ZÛ“<T~G`>G«AËãF!W– ›ÄH¤ÈòåKL£Æz¸k‡rR.¬­y•zÝ—Šœjj˜Ñ;²—kw?õ|L*­ ù¿óPùCÇ¥=ã5^jÖxX^#ùGªHz$Ktý@:Æ;Ìç}Sg7ÜԨ 5WÃ;XÏU>j±MÒFj {¤­1-J?¤‡+Å<ëOuS %p™¬¤.Uˆ‹`í°b[ôuˆZòlˆCÅSƒ<Õ zzùJ‚³Z³ˆÅê:*j¼4µöØ%•ï™kŠE„ØRqÕƒÄTÜJÓeTqa¸çC°^‘ã=¾ø‹×Bð³÷6àH·ßJ‰¯æQ ½iőބ¿=4Ä t­¨¸<ºú”ne+v| š‡Ñ}'¨è°R©°¥ü:vD\¶VÉãZ¹/LÙ§Ï܇}á^¨ç5‚Y¡q]¥Qáñh/Îæm¶Z,áñ¾Ü?>žÞ Ù®±¦³Šùz‚ g"¨zkË…H+A‚ò“J¹7ÓƒÝóÊrEÃl‡€£g<ؼ,ѹù0}qž_[¿Ld·ƒ¡Ž.ä—çßöNìûùÈØq>Ñû>^!fX³ãøÕWžñÐ{]f“}KOÀ@çUø¹Ÿ[‡?>WV;YMô@6òªïx6ûÔ}g•æ'ùxwüæ9ÿéùsüÅi‰ÉèoˆÞÈEXÊW85 , 3¡¥ 35‚¥ê”ôHëĘ+Ô| 5ªˆ.!Lï†"â.‘hÕqC¬\ «#‰îi*rÞ÷+RºuZ^’=©{1ÛKµEæ™.jžNŒÓ` …8<0JÌR%^¥ç¬Å ;ÙǸ÷†<} ‰/\.C򯄼ð;'KPu"aΑÌo¶VNEÃ:‘y‡ÿÐ1@¢û„xŸ¯,³¦öˆú€‘‹13ëÒÝÃCò9÷IÒBíÞ7Ú’˜ B5ÁF‹¤tXO©ÜOŒ©¼U…† Ðé(gÚt©ɲÑî–Žè¬Ö(´Â{zÒ!ª $µœEž w+fÊJ듸º¶®í°ÖDCO2 Eºx&5¨B™Á²BT¹Ò°Z,“¤÷vŒ›Õ²áAŽ©ØÎ±Þ^èLd±Ft»†Ðr¼D©U¥B‘Ìv€ïV!‘ÍèÑÜÑgW$\[ó@“khú/‰±c,ÀwZ™Šz³gÐôRX¬H2“¶cؽÐ6½h¯Í?}‰NíÀàÃP Qcš ·©©üpK’—[“XÉc:Ä€NÀâú³>¼å¯R=ˆÊÝÎY”À NHÍ·]ß'†‰ié˜ a¾Â²a_÷iýºí‘ž&Ézˆ€Sc3«¯`¡0É ÃDAHmijT@ööÀxß°Qx[[ÙXTÌÈ‹F:°é˜1 a\yÐC)öÐþãÉ‘(‹Ê¿ò¤¨Š)ì“C>\}ÇG&©Š6j3Ú®(ôvf KgU¬:Ș ßî†ÃƒÃPk\„z£©¢-ˆeÁv•|× é¦ÏÒú VqC8ËÁc'NÁbéMhÈ,F bɤ^«­Òe¨±Ã¯Ât% ;× SùKtn+þLã!X¯VØôú5ìØ@à}‹øŸÿÔe•R˜ê-NÀÛæl1vRïÃŽî÷x½qШ°c¯Ï¼S‹gÕÔ,Û‡åÍ Vh”ÀLD’|z™±º]“Ì÷þÒÏW7Œ\‚„8Wá€rË=­tR8n²0Ç?}©/_/ò_ÿÔ1N÷Vç[Lúlj$`2g“18:vP¹Øå¥"N¯]gudžº]g–n¨8>ªá=£GàÙ /35¡0)^ô¤C 3Íœø(Fa†9zdìýÚÜb‘Ø´rO›\OcÑŽ ®Íɉž ‹?ðqöüå—p}ã8¬ûú¡ãÌ¢ÏÕhƒtžD×þªX*É|ëb‰ToΩ.»› ¦z‰åj¡†Äú B5¿+ÕɆ>¶ýª ÌUÁ]»FGßÈ Þ–Ïòv𨆘ð[œò?èªÁ˜À ,ÀX`X`X```X€X`X`X```Ø›ýÿ i“Ûf+óËIEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/restricted.png0000660000175200017530000000136312664543647025142 0ustar guillaumeguillaume‰PNG  IHDRóÿabKGDÿÿÿ ½§“ pHYsHHFÉk> vpAg\Æ­ÃIDAT8ËÕ’½kSaÆŸ÷}osÓ|­mÓšèP¨ ÕN:X„â¢"8J­€‹èâæ .â$ê"Ò©`¡NŽZ4P Ó¤7Mr?Î9ïuW)¡àêžÏáà¿/µßàáüµ±#ãÅSJk§Õj}Yzó¼öO€WUfgå'Çç‡2Ã$ ÑÙj|¬û~çÂÓŸö¼º¾tbºrr-7:26œÍÁI§ÐÂNݨQÛ\˜{|o9ñèDÜ:sÞ)•˯1cFb(¨ˆûM -FéTöPáå³Ë7'ç¦+—b¥**"X?€t}P§êôÀ]Ö€0l|`j¢´˜øœDä2™9‰"<{éâ(´1кϷ±…A†á»UØfkÀÝ=™  D›BøÀØ¿€8Ž!" "„D`¢â@Ž¢±VØ^^C*†ã8ÐÚ@)ÀŠ…ƒˆÑ󓈬3´q|¤x‘¬”¬¬„ Ì bêÇgBDÔXÿY¿±ZûêïTÕQ>Z^Ë+³ ,ò"Üß[ÄŒP=&ÿswûÊý÷o« À-§6‚ö– 5’…™ +&[k7ÃNuu·þd=ÜýÀó3(%tEXtdate:modify2008-01-08T21:30:12-06:00€øâïIEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/female.png0000660000175200017530000000073512664543647024225 0ustar guillaumeguillaume‰PNG  IHDRŠí$ctEXtSoftwareAdobe ImageReadyqÉe<IDATxÚ¼•ÍMÄ0…qD{‡C¨€”°T@"-gÒì$v%8,{‰PALé€àžÂéBd;±•0ÒÈR<ù<ž?«¶mæÕ…+¥ŒFß«ûË¢ó©>~»­M¶x.8 ,—ÐØÀ© [RxÁØ;¡ÏЗ®§ØO±œCsÙƒ®±ß Âñ£\ÿK®Íl×ç!K:¡a—õá‘á1/Î\`ìk±ƒ¦ ¡=¡?âII°[_AOŽ^o›ç’¼ÊLyb5¥Ý}¸”܇o=3™âÐé\öLÅÿ ]LÕ¡ÑÐé"Åðé‚k&ÕKØt ³Â¥cçžü;Λ gÓHY=rXñ:çXÅ\dËÖ/ÙÞ.ð5–gO1jär¾ìØšá’æªy£„¡ˆ97!#wɶN{NIÓ×Aó¼wPÉrËL!0Á£€znB›hÞ7”q.†—š",Ó¾þ½„:’ó|Vø¡‡íž#µŠùÔò+ÀoŸ¿ìC}ß°IEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/icone_gwd.ico0000660000175200017530000004107612664543647024723 0ustar guillaumeguillaume@@ (B(@€    #%%%%%%%%%%%%%%%%%%&(.35777777777777777777752-# /=#"Pt™•Žq–’’p””p””p””p””p””p””p””p””p””p””p””p””p””p””p””p””p””p””n‘•iІ˜_}zžTom¥Leb«H`^®G^[¯G^[¯G^[¯G^[¯G^[¯G^[¯G^[¯G^[¯G^[¯G^[¯G^[¯G^[¯G^[¯G^[¯G^[¯G^[¯G^[¯G^[¯H^\­I_^«((ƒdL2.7HG_¤ÙÔâ°éãû³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ°éãÿ§ÝØÿ‘ýÿF€xÿ UJÿQEÿREÿTGÿUHÿWJÿYKÿ[Mÿ]Nÿ^Pÿ`RÿbSÿdUÿfVÿgXÿiYÿk[ÿm\ÿn^ÿp_ÿr`ÿsbÿucÿveÿ|lý'_W®F! 3‰µ±²²ìæþ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ±êäÿ©àÚÿ—ÉÄÿrŸšÿ9mfÿRGÿQDÿRFÿTGÿVIÿXJÿYLÿ[Mÿ]Oÿ_PÿaRÿbSÿdUÿfVÿhXÿjYÿk[ÿm\ÿo^ÿp_ÿraÿtbÿucÿweÿxfÿ!sñL,‡³¯®³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ²ìæÿ­æàÿ¡ÖÐÿ»¶ÿf‹ÿ/b[ÿ PFÿQEÿSFÿTGÿVIÿXJÿZLÿ[Mÿ]Oÿ_QÿaRÿcTÿeUÿfWÿhXÿfWÿi[ÿ8zpÿ…¨£ÿŠª¥ÿ?}sÿn`ÿn^ÿsaÿxfÿ ƒtôB/>=X²ìæþ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ²ëåÿ­æàÿ¡ÖÐÿ޼·ÿm”ÿ.aZÿQEÿQEÿSFÿUHÿVIÿXKÿZLÿ\Nÿ^Oÿ_QÿaRÿcTÿeUÿ k\ÿhYÿcTÿHxÿÒÒÐÿÑÑÐÿCvÿgWÿp_ÿ vfÿweÿyfÿ-ka¬) +˜ÉÄͳíçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ²ìæÿ­æàÿ¡ÖÐÿ‹¹´ÿdމÿ0a[ÿQEÿQEÿSFÿUHÿWIÿXKÿZLÿ\Nÿ^Pÿ`QÿbSÿnaÿš¹´ÿˆ®§ÿ~§ ÿ¾ÈÅÿ×ÖÔÿ×ÖÕÿºÇÄÿw¥ÿ«£ÿ±«ÿ}mÿweÿqü<7¬äÞó³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ²ìæÿ²ìæÿ±êåÿ°êäÿ°èãÿ®çáÿ­æàÿ¬äÞÿ¬ãÝÿ«âÜÿªáÛÿ©àÛÿ©àÚÿ©ßÚÿ¨ÝØÿ£ØÒÿ˜ÊÆÿ…°¬ÿ`‡ƒÿ+^Wÿ PFÿREÿTGÿUHÿWJÿYKÿ[Mÿ\Nÿ^Pÿ`Qÿt¡šÿîîíÿííìÿãâáÿ×ÖÕÿÕÔÒÿÖÕÓÿ×ÖÔÿØ×ÕÿØ×ÕÿØ×Õÿi ˜ÿvdÿyfÿI=°éãû³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³ìæÿ²ëåÿ°éãÿ­æàÿ«âÝÿ¨ßÙÿ¥ÛÕÿ¢×Òÿ ÓÎÿÏÊÿšËÆÿ—ÈÃÿ•ÅÀÿ“½ÿ¿ºÿ½¸ÿŽ»·ÿº¶ÿŒ¹µÿŒ¹µÿŒ¹´ÿ‰´°ÿª¦ÿq•’ÿVwtÿ$VOÿODÿREÿTGÿVHÿWJÿYKÿ[Mÿ]Oÿ_Pÿ:~tÿÞâáÿêéèÿææåÿãâáÿØ×ÖÿØ×ÖÿÜÛÚÿÙØÖÿØ×ÕÿÊÏÍÿ4ˆ{ÿucÿvdÿO>°éãû³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ±êäÿ¯çáÿ¬ãÞÿ©ßÚÿ¦ÛÖÿ¢ÖÑÿžÒÌÿ›ÍÈÿ—ÈÃÿ”Ä¿ÿ‘¿»ÿŽ»¶ÿ‹·³ÿˆ³¯ÿxŸ›ÿ(9Kÿ(Aÿ(Aÿ(Aÿ(Aÿ(AÿHahÿ{£žÿwšÿh‹‡ÿKmjÿ#TMÿPDÿRFÿTGÿVIÿXJÿYLÿ[Mÿ]Oÿ]‘ˆÿáàßÿááàÿîííÿééèÿÑÕÓÿÓÖÔÿãââÿäãâÿØ×ÖÿÖÖÔÿV•‹ÿtbÿucÿP>°éãû³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ²ìæÿ±ëåÿ°éãÿ®æàÿ¬ãÝÿ©àÚÿ§Ü×ÿ¤ÙÔÿ¡ÖÐÿŸÒÍÿÏÊÿšÌÇÿ™ÊÅÿºµÿ@Wbÿ(Aÿ(Aÿ(Aÿ(Aÿ(Aÿy ÿ“¾ÿ¿ºÿˆ´¯ÿxŸ›ÿU{vÿ'ZSÿPFÿSFÿTGÿVIÿXJÿbUÿf‘‹ÿµÂ¿ÿÖÕÔÿÝÜÛÿèèçÿ³ÇÃÿ?ˆ}ÿGŽƒÿ¿ÏÌÿãâáÿÚÙ×ÿØ×Õÿ·ÆÂÿiŸ–ÿxhÿP>°éãû³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³ìæÿ±ëåÿ®æáÿ¬åßÿ«ãÝÿ¥ÚÕÿ£×Òÿ£ØÒÿ[yÿ(Aÿ(Aÿ(Aÿ(Aÿ0CUÿŸÓÎÿ«âÜÿ¥ÚÔÿ¤ÙÔÿÐËÿŠ·²ÿgŽŠÿ*`XÿQFÿSFÿUHÿVIÿ#j_ÿ¿ÆÃÿØ×ÕÿÕÔÒÿÕÔÓÿÖÕÔÿ_•ŒÿeUÿgWÿs£›ÿÕÔÓÿÖÕÔÿ×ÖÔÿÛÚÙÿ¿ÊÇÿ}nÿP>°éãû³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ®æáÿÐËÿ¾¹ÿ‹¸³ÿ~§£ÿƒ­¨ÿžÑÌÿx ¡ÿ(Aÿ(Aÿ(Aÿ(AÿTqzÿ§ÝØÿ›ÍÈÿˆ´°ÿ–ÆÁÿ£ØÒÿ–ÆÂÿª¦ÿ]†ÿ+`XÿRFÿSGÿUHÿfZÿ¡¶²ÿÏÒÐÿÖÔÓÿÕÔÓÿÚÙÙÿ‰­¦ÿ hZÿl^ÿœ»µÿßÞÝÿØ×ÖÿÛÚÙÿÑÕÓÿ »·ÿzkÿP>°éãû³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ²ëåÿ¯çâÿ¯èâÿ²ìæÿ³íçÿ²ëåÿ¨ßÙÿw°ªÿOŒ‰ÿTpmÿ7Šƒÿc•ÿ~½¸ÿ‘À¼ÿ(Aÿ(Aÿ(Aÿ(Aÿd…‡ÿŒºµÿs˜•ÿLœ”ÿj—“ÿ»¶ÿ|¤ ÿr—”ÿ|¥¡ÿ_‰„ÿ*`Xÿ RGÿTGÿVIÿ ^Rÿ|ž™ÿ×ÖÕÿØ×ÖÿáàßÿÖØÖÿ©¾»ÿ·ËÇÿéëêÿííìÿææåÿääãÿ{§ ÿscÿq`ÿP>°éãû³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ¨ÞÙÿ–ÇÂÿšÌÇÿ¬äÞÿ®æáÿŸÒÍÿ“½ÿa²±ÿs̾ÿ)™ÿœ‡ÿ»·ÿ|¤Ÿÿ޽¸ÿ(9Mÿ(Aÿ(Aÿ(AÿJzqÿ[yvÿc¢¢ÿL·ªÿ5—Žÿa}ÿI“‘ÿI–ÿp”ÿv˜ÿ_ƒ€ÿ)^WÿRGÿTGÿVIÿ6tkÿÍÐÎÿØ×ÕÿÜÛÙÿÛÚÙÿÜÜÛÿééèÿïïîÿððïÿîîíÿÛàÞÿ4‚vÿm\ÿo^ÿP>°éãû³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿšÌÆÿl¢›ÿg¢žÿ•ÅÀÿ¿ºÿo“ÿUŽ„ÿbšÿGÅ»ÿ}ÆÁÿ^½¹ÿzÌÉÿc§ÿ‘¿»ÿ/BTÿ(Aÿ(Aÿ):Lÿ‚ÇÂÿ6¢˜ÿV­«ÿ"Ÿ’ÿI³¨ÿD|{ÿY¸°ÿ5¯£ÿKcaÿWspÿ_~zÿOtpÿ&[TÿRGÿTGÿdˆÿÖÖÓÿØ×ÕÿØ×ÕÿÙØ×ÿááàÿéèçÿëëêÿïïîÿððïÿêëêÿd›’ÿk[ÿm\ÿP>°éãû³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ²ìæÿ°éãÿ®æáÿ¤ÙÔÿ†²­ÿuÏÉÿ_³°ÿu›—ÿ`|ÿ0–“ÿhÌÃÿLsqÿ!ž‘ÿ–…ÿU®«ÿ0œ“ÿ“¾¸ÿ‚¬¨ÿ=S^ÿ(Aÿ(Aÿ5HVÿ`º¹ÿ8¯¨ÿ$“~ÿRº¶ÿ:ž’ÿgÉÁÿ•„ÿ¶§ÿVÀ¾ÿdºµÿ1mkÿNieÿHlgÿ&]UÿSGÿ=woÿÁÉÆÿºÅÂÿ»ÇÄÿÛÛÚÿææåÿììëÿìíìÿÇÖÓÿÈÖÓÿÎÚ×ÿ<†zÿjZÿl[ÿP>°éãû³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ²ìæÿ¦Ü×ÿ–ÇÂÿ“½ÿƒ®©ÿfˆ„ÿ©Ÿÿv¶¶ÿa¢œÿeÁ¾ÿX×Ñÿ: œÿr«©ÿ4œ†ÿŽpÿ1šÿ)•…ÿd¡¡ÿVqoÿ,=Iÿ(Aÿ(Aÿ9NYÿU•–ÿU½±ÿ·®ÿL¹¯ÿS³¥ÿ3 …ÿ¥ŠÿaÁ¶ÿH°¨ÿH§¡ÿH­¦ÿd«§ÿP‹…ÿTwsÿ#YQÿRFÿ.pfÿ i]ÿfZÿqš“ÿâãâÿçèçÿs ˜ÿm_ÿ#thÿ.|qÿgWÿiYÿjZÿP>°éãû³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ¯èâÿ‘À¼ÿe“Žÿh‹ˆÿX£›ÿP½±ÿ;€{ÿ)ƒsÿ9rnÿ*¯¥ÿ·¤ÿ Œÿ ™€ÿƒÒÏÿA­£ÿY·¶ÿ+‘†ÿ1smÿ&§˜ÿ-€ÿ(Aÿ(Aÿ3ELÿG­¬ÿY«ªÿ/—‹ÿ’{ÿŽ~ÿuÅÂÿ0®¥ÿ}úÿ-ˆÿ*¥˜ÿ¯šÿ(ªŸÿMމÿOjfÿ7UQÿOGÿRGÿUHÿWJÿ,qfÿ®Á¾ÿ¯ÃÀÿ*tiÿ`QÿbSÿcTÿeVÿgWÿiYÿP>°éãû³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ²ëåÿ¨ßÙÿ™ËÅÿj¢ÿ^ÎÃÿi·µÿWŽŽÿh³²ÿD¨œÿŸŽÿU¿´ÿŸŽÿU¿·ÿŠÅÄÿ;ffÿa³¯ÿ"œˆÿUª«ÿAž‡ÿ6½µÿNĺÿ@z„ÿ(Aÿ(Aÿi™ŸÿFµ¨ÿ.·³ÿ[“ÿl«—ÿW³¤ÿ%¤˜ÿ7­œÿd¶´ÿP®¦ÿYÁ¿ÿÕÒÿB‹ÿ7ytÿ5‰ƒÿL„zÿ#QLÿC<ÿPEÿUHÿWJÿYKÿ[Mÿ]Nÿ^Pÿ`QÿbSÿdUÿfVÿgXÿP>°éãû³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ®æáÿ‘À¼ÿkŠÿG~yÿ©ÿM¾³ÿXª©ÿ2„ÿ^Ç»ÿX½µÿ¯ ÿ^Á·ÿQ¯¦ÿAžÿV·®ÿJ°§ÿm·¯ÿŒvÿ‘{ÿ¡‘ÿ¢•ÿS_ÿ)Bÿ)BÿJ]ÿ¤”ÿN¾¹ÿfÌÍÿ.Œsÿ!}kÿc¸°ÿb¯¯ÿlÎÆÿ:ªœÿL®¢ÿAÆÅÿT”Šÿ&¬žÿ=«žÿB¤›ÿg]ÿCtrÿRIÿRFÿVIÿWJÿYLÿ[Mÿ]Oÿ_Pÿ`RÿbSÿdUÿfVÿP>°éãû³íçÿ³íçÿ³íçÿ³íçÿ²ìæÿ¦Ü×ÿi­©ÿT¼²ÿ%—ÿ;§£ÿ@º¨ÿ+˜“ÿhÿÿ#Ÿ•ÿpºµÿQµ®ÿ§˜ÿI¦ŸÿoËÆÿh¸¸ÿOšzÿA§“ÿVÿ$ªœÿ+‚tÿG¦£ÿ%=Qÿ*Eÿ*Eÿ"7Mÿ"Wfÿqrÿu¬—ÿ{Vÿ9sÿ<€jÿ }gÿH­ŸÿY¬©ÿE¬¨ÿY­¨ÿYüÿgÂÀÿX©¢ÿ¡“ÿiº·ÿ[š–ÿh]ÿOHÿSFÿVIÿXJÿZLÿ[Mÿ]Oÿ_PÿaRÿcTÿdUÿP>°éãû³íçÿ³íçÿ³íçÿ³íçÿ±êäÿ›ÍÈÿNžœÿeÁ¸ÿ&ªžÿ5œ’ÿ@¶®ÿ¶¥ÿ'Ž‚ÿE¡Œÿgÿ7zÿ-¬›ÿ9„qÿE®ÿ š„ÿZÿw¨†ÿDˆZÿT‰aÿA|Uÿ%O1ÿ)Bÿ+Gÿ,Jÿ3Nÿ –yÿK•ÿA{xÿ"ƒ^ÿf¬•ÿB‘jÿeCÿ-ƒ}ÿYÀ·ÿ‚bÿ'~jÿ«”ÿ:‹€ÿ&™€ÿ.´¥ÿÿ’ÿArpÿ,LIÿOGÿQFÿVIÿXKÿZLÿ\Nÿ]Oÿ_QÿaRÿcTÿP>±éãû´íçÿ´íçÿ´íçÿ´íçÿ±éãÿ‘ËÄÿqÁ¸ÿ"¶¥ÿ,µ©ÿWȽÿeÆÁÿ>¿¹ÿVªšÿ&»®ÿZ¾¶ÿŸ„ÿ$kÿ9wlÿWÀ·ÿ!¢‘ÿD§ÿ`¯¢ÿcÄÅÿ-mxÿ%Ndÿ;osÿ1Kÿ-Lÿ/QÿCLÿEŠÿY¬—ÿZª›ÿ2ƒjÿa©•ÿ «ÿ"cJÿbÄ¿ÿO«’ÿY´°ÿ\À½ÿZ¿¯ÿ/›ÿw¸®ÿ$£ˆÿ:¹©ÿ5¬¨ÿ-€vÿN‡„ÿ0lgÿIAÿRFÿWIÿXKÿZLÿ\Nÿ^Oÿ`QÿaSÿP>±éãû´íçÿ´íçÿ³ìæÿ­äÞÿœÍÈÿº´ÿsÈÄÿF©£ÿ,·¬ÿ[¼´ÿ‚ÉÈÿ¯£ÿY­¦ÿžÿ@£”ÿ €XÿfÿhÁ±ÿžŽÿ2 „ÿbÅÀÿH«Ÿÿ=rÿosÿJ£žÿ6|pÿ5Bÿ2Uÿ2Vÿ>}oÿ#M7ÿ_)ÿ(~fÿG˜tÿVÿ+œ…ÿ]¸­ÿL§›ÿeÿ_»²ÿ–‡ÿ!°£ÿ}Xÿ—Šÿ5¤”ÿYüÿ,³ªÿuÅÄÿ<¢˜ÿ„vÿ2ogÿUNÿTHÿWJÿYKÿZMÿ\Nÿ^Pÿ`QÿP>²êäûµîèÿµîèÿ´ìæÿÎÉÿo“ÿQuqÿRljÿ3¸·ÿgÊÀÿ.»¬ÿž„ÿWÊÇÿkÑÑÿF«ŸÿQ¢•ÿ"qWÿZÿF¦ÿB··ÿ/“{ÿo±¨ÿ0„hÿX‹ˆÿG€wÿ3n;ÿ=9ÿ4[ÿ4[ÿ7OÿGf]ÿ(hUÿ#H(ÿ"L ÿ+N%ÿZ¢™ÿ_±²ÿQ—ÿ?·®ÿoÕÒÿ?©’ÿ#“ÿ‡jÿhQÿF¥›ÿ4šŒÿkÚÝÿ:¯œÿ ž‰ÿnžÿ>‰ÿ!zsÿ!a\ÿTLÿTHÿWJÿYKÿ[Mÿ]Nÿ^PÿP>³êäû¶îèÿ¶îèÿ´ëåÿ‰½¸ÿb´«ÿ@µ®ÿ( ”ÿ*± ÿB»´ÿ2Å»ÿf¾²ÿ`ªªÿ ”ÿ&¥‘ÿ\¯¢ÿ5“|ÿ9ˆvÿ|§‘ÿ~±ŸÿH¦¡ÿ(sXÿ&ƒlÿ1X6ÿ H ÿmFÿ:›Žÿ(ETÿ6_ÿ7Yÿ(O%ÿw´§ÿ+}dÿd¥”ÿ6š…ÿ+tBÿ$‡kÿ&z]ÿe´¨ÿ sÿ|§‘ÿ5™{ÿyÉÃÿsÊÄÿX»ªÿ7 ”ÿ8¥™ÿ}ÅÂÿe¾ÿ§™ÿoƽÿ0gbÿ>ffÿ+UOÿWOÿUIÿXJÿYLÿ[Mÿ]OÿP>´êäû·îèÿ·îèÿ¶ìæÿ”ÈÄÿk×ÐÿX¶°ÿLµ¬ÿ)Šrÿ;¯¦ÿfÍÈÿFÌÁÿG«Ÿÿkº³ÿ? “ÿF¬›ÿ6‹kÿ9 ™ÿ$sMÿiJÿQpÿ(Z:ÿ#Pÿ"D)ÿFÿD§‘ÿŒÜÝÿ=ˆ€ÿ8dÿ8dÿK:ÿxUÿ‰Ç¼ÿk¼³ÿk¦™ÿD„lÿS&ÿO‡^ÿH‘uÿ6|Wÿ)˜~ÿ•‰ÿŸ‹ÿ+·¨ÿjÌÆÿ‹ƒÿ^´¦ÿ2¢™ÿO¢—ÿ=¥£ÿI šÿLÀ¹ÿp´±ÿG‡ÿ9_ZÿWNÿVIÿXJÿZLÿ[MÿP>µêåû¸îéÿ¸îéÿ·íèÿ™ÑÌÿ/¶«ÿ*²¯ÿ0—ÿ4³¤ÿ.À²ÿ©ŸÿtÄ¿ÿ|ÆÆÿ.´ªÿœŽÿ+kÿ5–|ÿXÄ¿ÿZÇÂÿ,}TÿR›ÿ>nJÿ[Lÿ››ÿ.£ŠÿL²šÿL®®ÿ#kÿ=Tÿ+Haÿ?eÿbIÿT£“ÿ•Šÿ-­¬ÿ(lYÿEÿd8ÿS‹dÿ-’tÿ8‹hÿ*xRÿ"—~ÿ*¶«ÿ7°¤ÿ]ÊÀÿPÀÃÿeÉÌÿo²§ÿ!®ÿ&°¦ÿ=±§ÿ!šŽÿB{xÿJjiÿ:[Wÿ ZQÿWKÿXKÿZLÿP>¶êåû¹îéÿ¹îéÿ¸íèÿ¥ÕÐÿl¤¡ÿT© ÿ]¾³ÿÝ×ÿ*—ÿ;²¤ÿ8²£ÿœ„ÿ Œÿ˜|ÿ6’‚ÿK°¢ÿ>‚ÿS!ÿ^ƾÿZ'ÿK’~ÿKÐÊÿL³¯ÿ ˜‹ÿ^©ÿB•ÿ#Ÿ…ÿH9ÿEŒÿKÿ#meÿwÀ¿ÿ-¨ÿX¥¢ÿucÿ2ŠgÿdÊÃÿ`:ÿ8ŸŠÿVŽÿp[ÿbXÿ=‹uÿ mÿ˜}ÿ$¦’ÿ©žÿ'žŽÿ ”†ÿW´¯ÿNǶÿ=Ž|ÿL¤ ÿh©£ÿ7Œ…ÿX}xÿ)f]ÿ [NÿXKÿO>·ëåûºïéÿ·ëåÿ±ãÝÿœÐÌÿSÀ³ÿ(¨œÿT°«ÿ&ª ÿXÜßÿ? šÿ5¯˜ÿoÕÐÿB½¹ÿ‹kÿX˜‚ÿYŠjÿF„hÿ(qÿ”{ÿ?‹zÿ}³£ÿO¸±ÿ5‰kÿUËÂÿ$…aÿ}ÍÌÿ.~^ÿP7ÿ€kÿúÿ!bIÿ@xNÿQŒrÿ8¦ÿnª™ÿ=€rÿVÍÑÿ!|kÿ%xÿ1œ—ÿtËÈÿY¿¸ÿ+“}ÿ¥ÿ&Ÿ‡ÿ#„`ÿ(¤Žÿ4‡xÿjɼÿ7¯¨ÿB»ÿB´©ÿ9±£ÿªžÿi±«ÿ…¬¨ÿcŠÿ4ukÿ[NÿM>¸ëæû»ïêÿ­ÝÙÿ·³ÿz™ÿs¢¡ÿžÉÈÿ@¥˜ÿ^˽ÿ3½°ÿŽÔÏÿ9¢—ÿš‚ÿ ‡eÿ¹ëæû¼ïêÿ¡ÌÈÿHˆÿMŒ‰ÿœ®®ÿcŽÿ>…wÿK –ÿbÇÁÿ"®¥ÿ ‚ÿ•sÿ}\ÿ"`Gÿ/“|ÿL»½ÿjÊÆÿ"†nÿU%ÿ"Q"ÿ+ŽsÿkSÿ]­¡ÿ €cÿ%—ÿ9’vÿ`¥”ÿW‹§ÿ!|WÿXª¡ÿ"º®ÿ"rTÿ+­›ÿS± ÿd ÿ.Y0ÿ(FÿHˆhÿW#ÿa”xÿ;”†ÿ'’|ÿ]»²ÿb¶¸ÿQŸŒÿ[º´ÿ5¸©ÿC¨–ÿ,®¦ÿiÓÌÿq¼»ÿ1³§ÿF¼·ÿq¸³ÿ|º²ÿ®ÜØÿ­Û×ÿªØÓÿ’ÈÂÿE>»ëæû¾ïêÿ¤ÎÊÿÕÌÿXǽÿš‘ÿ2ª›ÿ*—Œÿ3|wÿ(œ‘ÿ¯šÿ£…ÿ4ªšÿ“~ÿƒcÿXž‰ÿ>‰zÿ3{Xÿ#].ÿT(ÿEŒnÿ Œrÿ@jÿÇÉÿ qIÿ#nRÿM–Šÿ²¤ÿ*ž“ÿnâäÿ"rZÿ }aÿm@ÿNuIÿO ÿD–‘ÿgÃÃÿr§ÿrÁÂÿF‹ÿPŒŠÿ/rNÿeÁÄÿj¸²ÿU§ ÿ„sÿ@®®ÿB¢“ÿY°œÿ0½²ÿš„ÿ=ŒÿtÇÊÿ«“ÿ$¯­ÿ´®ÿµäßÿºéäÿ¸èãÿ¶çâÿA>¼ìçû¿ðëÿªÖÑÿ"§™ÿ(´§ÿ¥ŽÿL©Ÿÿ\¼³ÿK¹±ÿQ»¸ÿJ¿®ÿ{ÍÇÿX®£ÿM«¤ÿ0Ž|ÿ1zXÿ>aÿ@gRÿ}ÔÍÿ*± ÿ<µÿ–€ÿR{Vÿo™˜ÿIœ„ÿ`¡Œÿtãåÿ]ÈÀÿlÀ·ÿ< †ÿdºµÿ`‡hÿ1xSÿd?ÿ3h?ÿ!X+ÿkHÿ2ˆ|ÿW©¬ÿ,ÿXŸÿm—ÿ‚qÿ(‘ÿB·­ÿY¦¢ÿJ¤¡ÿI®žÿlWÿiÃÃÿX±­ÿlÀ·ÿxÈ¿ÿCº³ÿdƾÿÇÄÿ·çâÿ¾ïêÿ¾ïêÿ¾ïêÿA>½ìçûÀðëÿ©ÔÏÿ\¥ ÿ4–ÿ;{tÿ.jÿOõÿåãÿxÝãÿbÎÆÿQ±­ÿ! ”ÿRšÿ[¨•ÿH£šÿ/’…ÿg²´ÿYÖÖÿiÇÃÿ?¾´ÿ;vÿDf]ÿHmgÿ!^BÿvSÿHËÆÿD¤™ÿEÿjBÿRµ¦ÿ>—~ÿx¿µÿ=•~ÿZ§¢ÿ$qVÿ;Z9ÿn¢œÿL•Šÿv°£ÿGwVÿ7…nÿ.‚mÿg£”ÿ>‡wÿG½°ÿˆpÿ›‘ÿ4|_ÿC¡‘ÿ@¸²ÿQǾÿLzÿ\¤ŸÿcÅ»ÿÜ×ÿ½ìçÿÀðëÿÀðëÿÀðëÿ@>¾ìèûÁðìÿ³ÞÚÿbƾÿˆÕÏÿœ‰ÿG»´ÿ\Ǿÿ8¦•ÿ)†ÿ(±¤ÿVÁ¾ÿ<˜‘ÿ)¥“ÿ„ÎÇÿ­™ÿK®ŸÿM’‰ÿ]•~ÿ…}ÿ2|bÿI™„ÿE˜ŒÿHŸ–ÿA ÿ#yÿV2ÿ;€gÿ>ÿG•yÿ!ubÿfCÿs¨§ÿ#W2ÿb”|ÿ.}vÿiŽÿ4_ÿ {cÿ%mÿX§ÿN“zÿ\¢˜ÿ[¥¡ÿoÄÃÿ[¾·ÿX³©ÿ]¹¹ÿJ¼·ÿM¬œÿ|ØÐÿcÐÇÿF§ÿF›–ÿš¿¼ÿ»èåÿÁðìÿÁðìÿÁðìÿÁðìÿ@>ÀíèûÃñìÿÀíèÿÖÒÿl¿Àÿ!º«ÿ  ‹ÿG«žÿ2¹²ÿ9”ÿ@¡ÿI¨Ÿÿ ˆsÿ+³£ÿIª¢ÿ ‘€ÿ:¢˜ÿ>|ÿ-†rÿyÿqÁ¶ÿmHÿ}oÿZ® ÿ%\.ÿ€¢‹ÿL—ŒÿqÈÃÿ@ ÿtNÿ|Æ¿ÿs® ÿYŠƒÿSŽ„ÿ)\2ÿ\ÖÜÿ/oÿKœ†ÿ+–€ÿ3˜„ÿ9·®ÿ zfÿxÚ×ÿuaÿ“|ÿI‚ÿ'¡‰ÿÿTÀ»ÿ£”ÿkÁ¿ÿb¹¯ÿ›ÿL¼±ÿ…ýÿ»èãÿÃñìÿÃñìÿÃñìÿÃñìÿ@>ÁíèûÄñìÿÄñìÿ¿êæÿyǽÿ‰ÐÏÿzÈÄÿ?¿·ÿL¯ªÿ ÿ9¯¤ÿ[¹ªÿ#ªšÿcÿg²ÿB¨–ÿ5qiÿhǼÿVÀºÿsÒÓÿkOÿ4­ ÿX¡ŠÿZ¤”ÿLÿR’ƒÿJ–”ÿ)bFÿ`;ÿ[.ÿ<\Uÿ/­¡ÿ¥˜ÿx·³ÿtRÿ>¡ÿ=‚ÿ8½¶ÿ/€iÿ{hÿ%–|ÿI¡ÿpÔÒÿV¾¶ÿf´§ÿ,mYÿŠuÿ*¢‘ÿnÍÄÿ®ÿoʼÿ=‡…ÿo´·ÿlº³ÿˆÐÉÿÁíèÿÄñìÿÄñìÿÄñìÿÄñìÿ@>ÃíéûÆñíÿÆñíÿÅðìÿ£ÖÒÿC±­ÿN¯§ÿ\¾¶ÿhÇÀÿuÌÊÿa´©ÿ8|tÿA“ÿ‹kÿ¡‹ÿi®£ÿjÀ·ÿ•~ÿ‘|ÿF¬¡ÿ‚sÿ"¡“ÿ+•ˆÿD¯¢ÿZ/ÿ*mÿ0lVÿ4Ÿ‘ÿ(z^ÿ>¡ÿuXÿ»ÿ †tÿ]¡…ÿ^0ÿd¡ŠÿAœ‡ÿœ‹ÿdÑÔÿX§•ÿM£ÿ”}ÿI©žÿ›„ÿD Šÿ7¦Œÿ—{ÿcÂÁÿeôÿ hÿ.«¡ÿ„ÏÏÿfÀ¿ÿc¯¦ÿ¼åáÿÆñíÿÆñíÿÆñíÿÆñíÿÆñíÿ@>ÄîéûÇòíÿÇòíÿÇòíÿ²ØÔÿ^¤ ÿ²©ÿOÀµÿuÿm»°ÿHŸ‘ÿT›ÿB­’ÿŽsÿ–†ÿ'›‡ÿR® ÿK¿ºÿ›†ÿU´¦ÿY¯¢ÿ¢Žÿ4œ’ÿtØÝÿ8‡ÿŒyÿ1|^ÿiÆÇÿvÿ&~ÿ€fÿLpÿ‰rÿnÊÇÿˆÁ³ÿˆdÿ „gÿ#xQÿoJÿ‹nÿeÿ ¤–ÿs´«ÿ-¸²ÿ{ÆÆÿX­£ÿŽlÿ™ÿXÁ¼ÿ ¯˜ÿ&­šÿG¼²ÿHÀ°ÿÏÉÿÄîéÿÇòíÿÇòíÿÇòíÿÇòíÿÇòíÿ@>ÆîêûÉòîÿÉòîÿÃëçÿ¤ÅÂÿf´­ÿG°¤ÿjÀ½ÿ¯ ÿ(Ÿ†ÿV»²ÿ!™Žÿ:“‡ÿF°ŸÿhËËÿ6¤ÿŽ|ÿvÀ»ÿ/„ÿ/o\ÿb®®ÿAµ­ÿgº¬ÿ,‚ÿ@ÿDš„ÿ3‰nÿX¡£ÿd¯œÿ$˜ƒÿ „`ÿwPÿJ—~ÿ(Ž~ÿ0–~ÿ*ˆgÿS¨šÿZ·ªÿ,“€ÿS­›ÿF§¡ÿ&ž’ÿ=nfÿ=‡}ÿŸ‘ÿ*¬žÿ‚ÿ[»ÿ5¯¤ÿfÒÈÿ!ªšÿ§‘ÿL½·ÿ¼âÞÿÉòîÿÉòîÿÉòîÿÉòîÿÉòîÿÉòîÿ@>ÇîêûÊòîÿÊòîÿ¿åáÿ—µ²ÿd°¬ÿ~»½ÿ_‘’ÿ6©›ÿlÂÀÿ"•ÿ2š‘ÿ(ƒlÿU…ÿ1¥žÿ1©¡ÿH¶­ÿrÎÄÿHžÿwÿfGÿˆÈÃÿžÿš~ÿ+¯Ÿÿ_Á¼ÿ<Š‚ÿLphÿI•…ÿ4’ÿ"ƒjÿM•…ÿ3 ÿ,©˜ÿ6“~ÿT¦¢ÿ4¨—ÿB³°ÿbŸŸÿR~yÿjÈÅÿoÁ¸ÿYÄÀÿ@µ¬ÿ*›ÿR´žÿ:®›ÿ&¢‹ÿlÚÖÿ!’Œÿ€ÉÆÿ5´©ÿvÆÃÿÇîêÿÊòîÿÊòîÿÊòîÿÊòîÿÊòîÿÊòîÿ@>ÉïëûÌóïÿÌóïÿÆëèÿ„ÑÊÿW¹²ÿC³©ÿ2ŠzÿS¤–ÿ1ˆÿD’~ÿªÿg·®ÿMƾÿ\»¶ÿœ‘ÿ[³¦ÿFº®ÿ«•ÿžÿqUÿe¨œÿ šŠÿ{ÿ8¯©ÿƒÿe±¯ÿC•†ÿ%„eÿ1¥¡ÿ2¤‘ÿ‡×Øÿ+–ŠÿIÆÁÿ,•ÿ/¨˜ÿ/¨ÿ*°£ÿ|ľÿ6œÿ0‚ÿ*‹ÿ3ªÿB°§ÿ'¢ÿ!¢™ÿ`¿¹ÿI¦ŸÿFĸÿ/³¢ÿe¼ÿ8µ£ÿ½áÝÿÌóïÿÌóïÿÌóïÿÌóïÿÌóïÿÌóïÿÌóïÿ@>ÊïëûÍóïÿÍóïÿÌòîÿ»èäÿmÍÄÿi¹³ÿ(ªŸÿ+¢—ÿ^ªœÿJŠÿxŽÿa±¥ÿe‡…ÿxÛÞÿNÀ¸ÿ4qÿHzqÿ"Ÿ‹ÿ^³±ÿJ ™ÿ`¢“ÿpÈÃÿ‰ÛÜÿJŸÿT«˜ÿ3€ÿnÉÊÿ<˜’ÿ<Ÿÿž’ÿm¿»ÿaÊÄÿ0«¥ÿU¾²ÿKº§ÿ£”ÿŠÓÓÿ@¡šÿ* –ÿc¹¹ÿ@©“ÿ2¦˜ÿ}²³ÿ¦“ÿyÐÑÿX½¶ÿI°£ÿt¾ÿ£ŠÿRľÿ‰Ã¾ÿÉîêÿÍóïÿÍóïÿÍóïÿÍóïÿÍóïÿÍóïÿÍóïÿ@>ÌðìûÏôðÿÏôðÿÏôðÿÏôðÿÌðìÿ˜ÕÏÿvØÕÿ„ÎÐÿq”’ÿHŒ~ÿ_yuÿMxÿK¾´ÿ(ªžÿ%‘vÿ$¤›ÿ"ž“ÿv•“ÿPª›ÿJtrÿ#•†ÿE›šÿ†ÌÅÿ ƒoÿ"–ÿŽqÿ#¶±ÿH­žÿ`°¡ÿQ±ªÿ3š†ÿpÆ»ÿ4­›ÿe²ªÿ/“‹ÿ§ÿ‚ÎÉÿhŽÿX´ªÿ¤–ÿXº°ÿT¼¹ÿ:´©ÿ°˜ÿ<¯¦ÿgÕÎÿM¨ ÿh«¥ÿ¥˜ÿkÏÆÿ°ÐÌÿÎóïÿÏôðÿÏôðÿÏôðÿÏôðÿÏôðÿÏôðÿÏôðÿ@>ÍðìûÐôðÿÐôðÿÐôðÿÐôðÿÏóïÿÃêèÿ¢¾»ÿq˜—ÿaŸ™ÿ,”…ÿ#¤œÿV†ÿgÉËÿ@®¤ÿNvwÿ†ØÒÿlÈÃÿ0oÿ™„ÿœÿX¯¨ÿUÂÁÿg·©ÿ/¬ÿV¾¹ÿ4¬£ÿ8© ÿHª£ÿK»¸ÿ§šÿ|nÿ'²¥ÿ-ĵÿ…ÊÅÿqľÿr·µÿ(¤ˆÿ vÿ\­Ÿÿ-Š|ÿJŽƒÿKˆƒÿ$žÿF¶ªÿ[ÄÄÿ$­¢ÿ^§šÿo‚€ÿN´­ÿjÌÆÿ¹æàÿÏóïÿÐôðÿÐôðÿÐôðÿÐôðÿÐôðÿÐôðÿÐôðÿ@>ÏðíûÒôñÿÒôñÿÒôñÿÒôñÿÒôñÿÆçäÿœº¹ÿoËÉÿ ‘‡ÿ‡ÌÊÿlÉÂÿkÑÑÿh´­ÿ{ÿT¿³ÿB­¡ÿœ„ÿo»¾ÿ(¤—ÿ; •ÿKº¦ÿ?®›ÿO´­ÿQ¸²ÿI¾¹ÿ ŒzÿNÅ·ÿS©ÿ9¾¹ÿJƽÿ —ÿSÁ»ÿHÁ¼ÿ4½´ÿ_¾±ÿ ‹ÿ0˜ƒÿXƾÿ9ž–ÿ8®¢ÿ"¯¡ÿ[·³ÿ#© ÿ_Á¸ÿb½»ÿp¾¶ÿ™Šÿ#®¤ÿ˜¼¸ÿËëèÿÒôñÿÒôñÿÒôñÿÒôñÿÒôñÿÒôñÿÒôñÿÒôñÿÒôñÿ@>ÐñíûÓõñÿÓõñÿÓõñÿÓõñÿÓõñÿÍîêÿuÒÊÿ`ÍÅÿ)¸®ÿo—’ÿp»³ÿB³«ÿ5¢”ÿ=§£ÿF«žÿ¤ÿ‹nÿDÆÄÿ(¨œÿ3Œ†ÿiĵÿQ¿µÿX±«ÿ7™ÿ>Á¶ÿ\¸©ÿ«–ÿ9Ÿÿ)£ŒÿYÅÁÿ«›ÿ›”ÿgÆÆÿ-Švÿ3­˜ÿ&©Žÿ­—ÿ+›”ÿ™šÿÔÖÿH¬§ÿ0À²ÿM³¤ÿP´®ÿ…Ÿžÿ†¨§ÿvÂÀÿV»²ÿ“ÑÌÿÍîêÿÓõñÿÓõñÿÓõñÿÓõñÿÓõñÿÓõñÿÓõñÿÓõñÿÓõñÿ@>ÒñîûÕõòÿÕõòÿÕõòÿÕõòÿÕõòÿÕõòÿÕõòÿÌêèÿ§À¾ÿN šÿ3 ™ÿIª£ÿG«¢ÿVÊÎÿ †uÿE££ÿ?¢—ÿLƵÿ@¿¸ÿ@’‰ÿ"º©ÿ&Á·ÿ©ŽÿA®¢ÿM~xÿ]ÇÃÿ#‹xÿ@¡ÿ+­žÿv½²ÿM¼³ÿN·ªÿ;»½ÿ¦‘ÿq¡¢ÿ)£“ÿ&¿²ÿYÀ¶ÿM‰„ÿ=ŽƒÿA¼°ÿbƶÿ&ž…ÿG™ÿ:¢›ÿ”ÆÇÿ›ØØÿ•áÜÿ¨ÜØÿÓóðÿÕõòÿÕõòÿÕõòÿÕõòÿÕõòÿÕõòÿÕõòÿÕõòÿÕõòÿ@>Ôñîû×õòÿ×õòÿ×õòÿ×õòÿ×õòÿ×õòÿ×õòÿÑîëÿ„ËÆÿF·­ÿGÁ±ÿ¨—ÿP½­ÿ=¹°ÿj¾­ÿw½µÿ!‘{ÿ'–ÿa·°ÿ˜„ÿmÎÆÿdÊÁÿ!¶©ÿmĽÿCÆÀÿX®§ÿ˜„ÿž”ÿkÉÊÿ!® ÿ0£‹ÿIŠÿ&¯Ÿÿ ¨”ÿ™ÕÒÿJ¦¤ÿ»­ÿ7·ÿ.¢…ÿ:°£ÿK½µÿb¼¯ÿV£”ÿ[™“ÿA¹­ÿzÓÍÿÐíêÿ×õòÿ×õòÿ×õòÿ×õòÿ×õòÿ×õòÿ×õòÿ×õòÿ×õòÿ×õòÿ×õòÿ×õòÿ@>ÕòïûØöóÿØöóÿØöóÿØöóÿØöóÿØöóÿØöóÿ×õòÿÈïëÿ¾ëëÿ™ÝÞÿV»±ÿÔÓÿi¡›ÿKœ“ÿ%–„ÿ”}ÿjÉÈÿ¡‹ÿ¦šÿ]Á¹ÿT„‚ÿ•ÿlÌÂÿI¼¬ÿ+«œÿLÁ·ÿ²¥ÿtÏÉÿ* ™ÿ<Žÿ”ƒÿtÌÂÿkÌÇÿZƽÿjØÍÿ4£ÿ ‰iÿœ„ÿF¥œÿD¹¹ÿšÇÁÿ–ÇÅÿ'Ÿ’ÿz³®ÿÊçäÿØöóÿØöóÿØöóÿØöóÿØöóÿØöóÿØöóÿØöóÿØöóÿØöóÿØöóÿØöóÿØöóÿ@>×òïûÚöóÿÚöóÿÚöóÿÚöóÿÚöóÿÚöóÿÚöóÿÚöóÿÚöóÿÚöóÿ×òïÿ˜ß×ÿÂÛØÿE±¨ÿ ‚ÿ‡¾¼ÿ&¦—ÿ{ÌÉÿXŸœÿ+šÿ š„ÿ.ƒpÿ#—€ÿ6²ÿuÒÏÿ>¦šÿ2½¹ÿ(£’ÿµ¤ÿ9»­ÿ ¨œÿVÁ½ÿ;¶£ÿtÆÅÿO»¼ÿ3~}ÿ*—xÿQ³¦ÿ<±£ÿX¯¦ÿd¼ÀÿÅÞÛÿ°ÞÝÿk½ÿlÊÂÿÒíêÿÚöóÿÚöóÿÚöóÿÚöóÿÚöóÿÚöóÿÚöóÿÚöóÿÚöóÿÚöóÿÚöóÿÚöóÿÚöóÿ@>ØóðûÛ÷ôÿÛ÷ôÿÛ÷ôÿÛ÷ôÿÛ÷ôÿÛ÷ôÿÛ÷ôÿÛ÷ôÿÛ÷ôÿÛ÷ôÿÛ÷ôÿÛ÷ôÿÓîëÿWĹÿ|ÎÃÿ¤ãåÿ¶áÞÿ{¼±ÿ†ª©ÿC±¤ÿ6ª¡ÿ$›ÿs¾´ÿ4€ÿ –ÿh´±ÿ]¥¡ÿA³ ÿ‰ÿuÉÈÿpÁ¹ÿ—{ÿ3«–ÿ™‰ÿk½®ÿ*™}ÿ=š†ÿ~›šÿjżÿYøÿuËÇÿÎèæÿÖñîÿßÙÿ¹çâÿÚöóÿÛ÷ôÿÛ÷ôÿÛ÷ôÿÛ÷ôÿÛ÷ôÿÛ÷ôÿÛ÷ôÿÛ÷ôÿÛ÷ôÿÛ÷ôÿÛ÷ôÿÛ÷ôÿÛ÷ôÿ@=ÚóðûÝ÷ôÿÝ÷ôÿÝ÷ôÿÝ÷ôÿÝ÷ôÿÝ÷ôÿÝ÷ôÿÝ÷ôÿÝ÷ôÿÝ÷ôÿÝ÷ôÿÝ÷ôÿÜöóÿÊìçÿ’ØÐÿÙòïÿÚóðÿÀÛØÿnÍÊÿ¦šÿW¸®ÿY®«ÿšÊÌÿc³°ÿE­¤ÿG§žÿpþÿq½¹ÿ8´¨ÿ4º²ÿd²«ÿ<½°ÿhÀ¾ÿC–“ÿ%«¢ÿ©ÿ9£—ÿˆ»¼ÿ®ÎËÿ‘ÖÎÿ”ÙÏÿÚóðÿÝ÷ôÿÝ÷ôÿÝ÷ôÿÝ÷ôÿÝ÷ôÿÝ÷ôÿÝ÷ôÿÝ÷ôÿÝ÷ôÿÝ÷ôÿÝ÷ôÿÝ÷ôÿÝ÷ôÿÝ÷ôÿÝ÷ôÿÝ÷ôÿÝ÷ôÿ@:Ûòðùß÷õÿß÷õÿß÷õÿß÷õÿß÷õÿß÷õÿß÷õÿß÷õÿß÷õÿß÷õÿß÷õÿß÷õÿß÷õÿß÷õÿß÷õÿß÷õÿÞöôÿ½äáÿªâàÿ•ÚÕÿºãàÿÞØÿ¹ÍÌÿL¼»ÿ$¬¤ÿU¨¥ÿ[¶³ÿ°ÿ›‰ÿ¦ÍÎÿÆÉÿ±§ÿX¯«ÿp´·ÿg¼°ÿ2§˜ÿ¡—ÿ“ÍÉÿÇÜÚÿÜôòÿß÷õÿß÷õÿß÷õÿß÷õÿß÷õÿß÷õÿß÷õÿß÷õÿß÷õÿß÷õÿß÷õÿß÷õÿß÷õÿß÷õÿß÷õÿß÷õÿß÷õÿß÷õÿß÷õþ=4ÐæäéàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿÏæãÿpÕÎÿ'¹¯ÿ—ÉÅÿ8¾±ÿF½±ÿ:³©ÿ¶çäÿÊàÝÿ7È¿ÿmÇ»ÿfÇÂÿg¸¯ÿXÀµÿ–ØÓÿÏÊÿ½êæÿß÷ôÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿÛòï÷7 &¦¶´©âøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿÞôòÿÝÖÿÏîëÿÛðîÿpÓÇÿ»êëÿÝòðÿµèâÿßõóÿÓôñÿßõóÿÊìèÿ¸åáÿÐðíÿá÷õÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿÁÔÒÏ, =Þòð÷ãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿâ÷õýª·¶©ØèæéãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúÜíëï¸ÆÄ»G( '4:=>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>=;5)   ðÀ€€€€Àðgeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/male.png0000660000175200017530000000071212664543647023705 0ustar guillaumeguillaume‰PNG  IHDRŠí$ctEXtSoftwareAdobe ImageReadyqÉe<lIDATxÚì–ÍQÃ0…-Ƥ|Ñ9î ¡ƒÜu€TÐA\AHÎîtP>Ãww ÞÚk";–Œr`†y:HÞO+iwÇBkí]ËÄ߆ !º{JuÀ8·-ëgáìšÔæî¡‡á‘_žd‹q íiŠ|¸T1G¼„Rè@ð›">ƒ?_öæ’oq »\@3(àÙ zƒ^I ð¢ Ü|çRÑÇ1?Ö‘d· ¢ù'(dÝœþóòZ|ËÉ9‚SV f‰oh}Ë›TÁç‹|,‹Hª ¤Ù¹ížCè½[óœ¸ù UÀàu‡‡ ]>&<†¾zå¶Å¸e*Ò#ìz$â.Ï&:Eƒ•pJ·¤3ºHÉŒ³Æ b‰Q £ÃC.y+<µ­åAÎ÷ħ¤_õˆz•vYHxįÞ-Ï‹yÎJºR…VW{oñŒÞ’roÉ~wwÅ)ÛĹ¹^ÐÝÏöÿÿ)ªÛ·‚¿"¸Wh×IEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/menubar_flechedroite_selected.png0000660000175200017530000000055012664543647031005 0ustar guillaumeguillaume‰PNG  IHDR ¹·7ÙsBIT|dˆ pHYs  ÒÝ~ütEXtCreation Time03/26/13ðŒ‘ºtEXtSoftwareAdobe Fireworks CS5.1«Hë¾IDAT(‘Ð? qÇñ7Ýuî²ø“' c1yFФ»Ae2ye¿ç%2Xna’tåk:Ý¥óó©ïô{¿–n§,ç‹•ˆTDDT—qÚ]0MóZ­ÙÞz»ñ€’²ŠöþBÿàTô g#gXv½Ö€ ¥ÅÅr)tÇ£swÐ÷}üí Åâpv€À=qâ#4]×/ÎxxœÌ¦U-#"6Ð^ª8Žò@xªâho=9vm‚[=ŸIEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/picto_cle.png0000660000175200017530000000121212664543647024724 0ustar guillaumeguillaume‰PNG  IHDRVÎŽWtEXtSoftwareAdobe ImageReadyqÉe<,IDATxÚ¬”MhAÇÿ#Þ*D£±±Š½FME+»ìÁƒˆ ‚'OV Æ“mªâaBO=Ôj(Aš4…†‹FBA° T¨{©æc“Êøf&»Ý˜˜"tàí¾ö·ïͼ·ŒsŽÍh[Å£`²öÍ’é®qŠÌ°‡ÃäŒð(wWi+£5¾ü*Hݼc_ÓAž½#–ó •û¤Gkk­ÝÈÞf³{z`÷‰Qà÷*æÆy8p" ­s ™¡€8Ζv š×;õ1 ²ÔV°Ÿ‡wŒ±‹'±Íß ÿ±ƒ¨”eØ‚êïÒºº€K__§[KÀ¨3|O¢R‘© ÎȲêû, Ÿyw Px–T€¿ìm,‰×1ùŽÑiêÛË€~~@Þ‡9XDß)`éÃGd¦I?5DŸ ß× ±§)4RÝwš<É`Þ€„ì<Ä'äòHx†GP9ÖX"Uòhôãý“™#È‚x÷/ÆþIÞº†¬õ®G ’vAüÀóÇ@Oÿ.DÊ3MsƒÄ-^yKA¶SžDÅ"XbºM)WëïÚ¡‰ .DÓâñOŸ¡ ’hãT=û™¨\3ääÝØÿü‹èh3Úx ón²ñjIEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/icone_gwsetup.ico0000660000175200017530000004107612664543647025640 0ustar guillaumeguillaume@@ (B(@€    #%%%%%%%%%%%%%%%%%%&(.35777777777777777777752-# /=#"Pt™•Žq–’’p””p””p””p””p””p””p””p””p””p””p””p””p””p””p””p””p””p””n‘•iІ˜_}zžTom¥Leb«H`^®G^[¯G^[¯G^[¯G^[¯G^[¯G^[¯G^[¯G^[¯G^[¯G^[¯G^[¯G^[¯G^[¯G^[¯G^[¯G^[¯G^[¯G^[¯H^\­I_^«((ƒdL2.7HG_¤ÙÔâ°éãû³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ°éãÿ§ÝØÿ‘ýÿF€xÿ UJÿQEÿREÿTGÿUHÿWJÿYKÿ[Mÿ]Nÿ^Pÿ`RÿbSÿdUÿfVÿgXÿiYÿk[ÿm\ÿn^ÿp_ÿr`ÿsbÿucÿveÿ|lý'_W®F! 3‰µ±²²ìæþ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ±êäÿ©àÚÿ—ÉÄÿrŸšÿ9mfÿRGÿQDÿRFÿTGÿVIÿXJÿYLÿ[Mÿ]Oÿ_PÿaRÿbSÿdUÿfVÿhXÿjYÿk[ÿm\ÿo^ÿp_ÿraÿtbÿucÿweÿxfÿ!sñL,‡³¯®³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ²ìæÿ­æàÿ¡ÖÐÿ»¶ÿf‹ÿ/b[ÿ PFÿQEÿSFÿTGÿVIÿXJÿZLÿ[Mÿ]Oÿ_QÿaRÿ^PÿYKÿZLÿbSÿjZÿl[ÿm]ÿo^ÿq_ÿraÿtbÿucÿweÿxfÿ ƒtôB/>=X²ìæþ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ²ëåÿ­æàÿ¡ÖÐÿ޼·ÿm”ÿ.aZÿQEÿQEÿSFÿUHÿVIÿXKÿZLÿ\Nÿ^OÿYLÿH=ÿMFÿ PHÿJ?ÿ^OÿiYÿl[ÿn]ÿo^ÿq`ÿsaÿtbÿvdÿweÿyfÿ-ka¬) +˜ÉÄͳíçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ²ìæÿ­æàÿ¡ÖÐÿ‹¹´ÿdމÿ0a[ÿQEÿQEÿSFÿUHÿWIÿXKÿZLÿ\NÿPDÿLlgÿÆÉÈÿÈÉÉÿg|ÿI>ÿ_QÿjZÿl\ÿn]ÿp_ÿq`ÿsaÿtcÿvdÿweÿqü<7¬äÞó³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ²ìæÿ²ìæÿ±êåÿ°êäÿ°èãÿ®çáÿ­æàÿ¬äÞÿ¬ãÝÿ«âÜÿªáÛÿ©àÛÿ©àÚÿ©ßÚÿ¨ÝØÿ£ØÒÿ˜ÊÆÿ…°¬ÿ`‡ƒÿ+^Wÿ PFÿREÿTGÿUHÿWJÿYKÿ[MÿNCÿ¿ÇÅÿÕÕÕÿÓÓÓÿØØØÿtЇÿJ?ÿ_QÿkZÿl\ÿn]ÿp_ÿr`ÿsbÿucÿvdÿyfÿI=°éãû³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³ìæÿ²ëåÿ°éãÿ­æàÿ«âÝÿ¨ßÙÿ¥ÛÕÿ¢×Òÿ ÓÎÿÏÊÿšËÆÿ—ÈÃÿ•ÅÀÿ“½ÿ¿ºÿ½¸ÿŽ»·ÿº¶ÿŒ¹µÿŒ¹µÿŒ¹´ÿ‰´°ÿª¦ÿq•’ÿVwtÿ$VOÿODÿREÿTGÿVHÿWJÿYKÿSGÿÁÐÍÿÜÜÜÿ×××ÿØØØÿáááÿy‹ÿK@ÿ_Pÿk[ÿm\ÿo^ÿp_ÿr`ÿsbÿucÿvdÿO>°éãû³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ±êäÿ¯çáÿ¬ãÞÿ©ßÚÿ¦ÛÖÿ¢ÖÑÿžÒÌÿ›ÍÈÿ—ÈÃÿ”Ä¿ÿ‘¿»ÿŽ»¶ÿ‹·³ÿˆ³¯ÿxŸ›ÿ(9Kÿ(Aÿ(Aÿ(Aÿ(Aÿ(AÿHahÿ{£žÿwšÿh‹‡ÿKmjÿ#TMÿPDÿRFÿTGÿVIÿXJÿXKÿ5ofÿæëêÿâââÿßßßÿáááÿèèèÿz‘ŽÿJ@ÿ`QÿjZÿm\ÿo^ÿp_ÿraÿtbÿucÿP>°éãû³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ²ìæÿ±ëåÿ°éãÿ®æàÿ¬ãÝÿ©àÚÿ§Ü×ÿ¤ÙÔÿ¡ÖÐÿŸÒÍÿÏÊÿšÌÇÿ™ÊÅÿºµÿ@Wbÿ(Aÿ(Aÿ(Aÿ(Aÿ(Aÿy ÿ“¾ÿ¿ºÿˆ´¯ÿxŸ›ÿU{vÿ'ZSÿPFÿSFÿTGÿVIÿXJÿZLÿ7qhÿèíìÿèèèÿåååÿçççÿîîîÿ—”ÿH>ÿUHÿZLÿaSÿkZÿq`ÿraÿtbÿP>°éãû³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³ìæÿ±ëåÿ®æáÿ¬åßÿ«ãÝÿ¥ÚÕÿ£×Òÿ£ØÒÿ[yÿ(Aÿ(Aÿ(Aÿ(Aÿ0CUÿŸÓÎÿ«âÜÿ¥ÚÔÿ¤ÙÔÿÐËÿŠ·²ÿgŽŠÿ*`XÿQFÿSFÿUHÿVIÿXKÿZLÿ7qhÿêðïÿìììÿéééÿêêêÿóóóÿ†š—ÿ?d_ÿAgbÿPGÿSFÿgWÿq`ÿsaÿP>°éãû³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ®æáÿÐËÿ¾¹ÿ‹¸³ÿ~§£ÿƒ­¨ÿžÑÌÿx ¡ÿ(Aÿ(Aÿ(Aÿ(AÿTqzÿ§ÝØÿ›ÍÈÿˆ´°ÿ–ÆÁÿ£ØÒÿ–ÆÂÿª¦ÿ]†ÿ+`XÿRFÿSGÿUHÿWIÿYKÿZMÿ;skÿîóóÿðððÿìììÿíííÿñññÿòòòÿôôôÿÖÛÚÿTxsÿUHÿl[ÿq`ÿP>°éãû³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ²ëåÿ¯çâÿ¯èâÿ²ìæÿ³íçÿ²ëåÿ¨ßÙÿw°ªÿOŒ‰ÿTpmÿ7Šƒÿc•ÿ~½¸ÿ‘À¼ÿ(Aÿ(Aÿ(Aÿ(Aÿd…‡ÿŒºµÿs˜•ÿLœ”ÿj—“ÿ»¶ÿ|¤ ÿr—”ÿ|¥¡ÿ_‰„ÿ*`Xÿ RGÿTGÿUHÿWJÿYKÿ[Mÿ8riÿëññÿóóóÿðððÿðððÿòòòÿøøøÿþþþÿúúúÿ>mfÿbSÿp_ÿP>°éãû³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ¨ÞÙÿ–ÇÂÿšÌÇÿ¬äÞÿ®æáÿŸÒÍÿ“½ÿa²±ÿs̾ÿ)™ÿœ‡ÿ»·ÿ|¤Ÿÿ޽¸ÿ(9Mÿ(Aÿ(Aÿ(AÿJzqÿ[yvÿc¢¢ÿL·ªÿ5—Žÿa}ÿI“‘ÿI–ÿp”ÿv˜ÿ_ƒ€ÿ)^WÿRGÿTGÿVIÿWJÿYLÿ[Mÿ=phÿíñðÿõõõÿóóóÿôöõÿ’²­ÿ¨¢ÿöúùÿ¼ÌÊÿ_Pÿo^ÿP>°éãû³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿšÌÆÿl¢›ÿg¢žÿ•ÅÀÿ¿ºÿo“ÿUŽ„ÿbšÿGÅ»ÿ}ÆÁÿ^½¹ÿzÌÉÿc§ÿ‘¿»ÿ/BTÿ(Aÿ(Aÿ):Lÿ‚ÇÂÿ6¢˜ÿV­«ÿ"Ÿ’ÿI³¨ÿD|{ÿY¸°ÿ5¯£ÿKcaÿWspÿ_~zÿOtpÿ&[TÿRGÿTGÿVIÿXJÿYLÿNCÿÙâáÿùùùÿüüüÿƒ œÿ[NÿeVÿ"maÿz¬¤ÿcUÿm\ÿP>°éãû³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ²ìæÿ°éãÿ®æáÿ¤ÙÔÿ†²­ÿuÏÉÿ_³°ÿu›—ÿ`|ÿ0–“ÿhÌÃÿLsqÿ!ž‘ÿ–…ÿU®«ÿ0œ“ÿ“¾¸ÿ‚¬¨ÿ=S^ÿ(Aÿ(Aÿ5HVÿ`º¹ÿ8¯¨ÿ$“~ÿRº¶ÿ:ž’ÿgÉÁÿ•„ÿ¶§ÿVÀ¾ÿdºµÿ1mkÿNieÿHlgÿ&]UÿSGÿTHÿVIÿXKÿRFÿÍÛÙÿýýýÿÿÿÿÿi‡‚ÿNBÿ^OÿfWÿhXÿiYÿl[ÿP>°éãû³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ²ìæÿ¦Ü×ÿ–ÇÂÿ“½ÿƒ®©ÿfˆ„ÿ©Ÿÿv¶¶ÿa¢œÿeÁ¾ÿX×Ñÿ: œÿr«©ÿ4œ†ÿŽpÿ1šÿ)•…ÿd¡¡ÿVqoÿ,=Iÿ(Aÿ(Aÿ9NYÿU•–ÿU½±ÿ·®ÿL¹¯ÿS³¥ÿ3 …ÿ¥ŠÿaÁ¶ÿH°¨ÿH§¡ÿH­¦ÿd«§ÿP‹…ÿTwsÿ#YQÿRFÿUHÿWIÿVIÿbŠ„ÿÿÿÿÿþþþÿÊÒÑÿBe`ÿF<ÿXKÿgWÿiYÿjZÿP>°éãû³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ¯èâÿ‘À¼ÿe“Žÿh‹ˆÿX£›ÿP½±ÿ;€{ÿ)ƒsÿ9rnÿ*¯¥ÿ·¤ÿ Œÿ ™€ÿƒÒÏÿA­£ÿY·¶ÿ+‘†ÿ1smÿ&§˜ÿ-€ÿ(Aÿ(Aÿ3ELÿG­¬ÿY«ªÿ/—‹ÿ’{ÿŽ~ÿuÅÂÿ0®¥ÿ}úÿ-ˆÿ*¥˜ÿ¯šÿ(ªŸÿMމÿOjfÿ7UQÿOGÿRGÿUHÿWJÿUIÿ–µ°ÿÿÿÿÿÿÿÿÿÿÿÿÿ²ÅÂÿ[OÿdUÿgWÿiYÿP>°éãû³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ²ëåÿ¨ßÙÿ™ËÅÿj¢ÿ^ÎÃÿi·µÿWŽŽÿh³²ÿD¨œÿŸŽÿU¿´ÿŸŽÿU¿·ÿŠÅÄÿ;ffÿa³¯ÿ"œˆÿUª«ÿAž‡ÿ6½µÿNĺÿ@z„ÿ(Aÿ(Aÿi™ŸÿFµ¨ÿ.·³ÿ[“ÿl«—ÿW³¤ÿ%¤˜ÿ7­œÿd¶´ÿP®¦ÿYÁ¿ÿÕÒÿB‹ÿ7ytÿ5‰ƒÿL„zÿ#QLÿC<ÿPEÿUHÿWJÿVIÿ7riÿn—‘ÿo˜’ÿ:xnÿ^PÿdUÿfVÿgXÿP>°éãû³íçÿ³íçÿ³íçÿ³íçÿ³íçÿ®æáÿ‘À¼ÿkŠÿG~yÿ©ÿM¾³ÿXª©ÿ2„ÿ^Ç»ÿX½µÿ¯ ÿ^Á·ÿQ¯¦ÿAžÿV·®ÿJ°§ÿm·¯ÿŒvÿ‘{ÿ¡‘ÿ¢•ÿS_ÿ)Bÿ)BÿJ]ÿ¤”ÿN¾¹ÿfÌÍÿ.Œsÿ!}kÿc¸°ÿb¯¯ÿlÎÆÿ:ªœÿL®¢ÿAÆÅÿT”Šÿ&¬žÿ=«žÿB¤›ÿg]ÿCtrÿRIÿRFÿVIÿWJÿYLÿ[Mÿ]Oÿ_Pÿ`RÿbSÿdUÿfVÿP>°éãû³íçÿ³íçÿ³íçÿ³íçÿ²ìæÿ¦Ü×ÿi­©ÿT¼²ÿ%—ÿ;§£ÿ@º¨ÿ+˜“ÿhÿÿ#Ÿ•ÿpºµÿQµ®ÿ§˜ÿI¦ŸÿoËÆÿh¸¸ÿOšzÿA§“ÿVÿ$ªœÿ+‚tÿG¦£ÿ%=Qÿ*Eÿ*Eÿ"7Mÿ"Wfÿqrÿu¬—ÿ{Vÿ9sÿ<€jÿ }gÿH­ŸÿY¬©ÿE¬¨ÿY­¨ÿYüÿgÂÀÿX©¢ÿ¡“ÿiº·ÿ[š–ÿh]ÿOHÿSFÿVIÿXJÿZLÿ[Mÿ]Oÿ_PÿaRÿcTÿdUÿP>°éãû³íçÿ³íçÿ³íçÿ³íçÿ±êäÿ›ÍÈÿNžœÿeÁ¸ÿ&ªžÿ5œ’ÿ@¶®ÿ¶¥ÿ'Ž‚ÿE¡Œÿgÿ7zÿ-¬›ÿ9„qÿE®ÿ š„ÿZÿw¨†ÿDˆZÿT‰aÿA|Uÿ%O1ÿ)Bÿ+Gÿ,Jÿ3Nÿ –yÿK•ÿA{xÿ"ƒ^ÿf¬•ÿB‘jÿeCÿ-ƒ}ÿYÀ·ÿ‚bÿ'~jÿ«”ÿ:‹€ÿ&™€ÿ.´¥ÿÿ’ÿArpÿ,LIÿOGÿQFÿVIÿXKÿZLÿ\Nÿ]Oÿ_QÿaRÿcTÿP>±éãû´íçÿ´íçÿ´íçÿ´íçÿ±éãÿ‘ËÄÿqÁ¸ÿ"¶¥ÿ,µ©ÿWȽÿeÆÁÿ>¿¹ÿVªšÿ&»®ÿZ¾¶ÿŸ„ÿ$kÿ9wlÿWÀ·ÿ!¢‘ÿD§ÿ`¯¢ÿcÄÅÿ-mxÿ%Ndÿ;osÿ1Kÿ-Lÿ/QÿCLÿEŠÿY¬—ÿZª›ÿ2ƒjÿa©•ÿ «ÿ"cJÿbÄ¿ÿO«’ÿY´°ÿ\À½ÿZ¿¯ÿ/›ÿw¸®ÿ$£ˆÿ:¹©ÿ5¬¨ÿ-€vÿN‡„ÿ0lgÿIAÿRFÿWIÿXKÿZLÿ\Nÿ^Oÿ`QÿaSÿP>±éãû´íçÿ´íçÿ³ìæÿ­äÞÿœÍÈÿº´ÿsÈÄÿF©£ÿ,·¬ÿ[¼´ÿ‚ÉÈÿ¯£ÿY­¦ÿžÿ@£”ÿ €XÿfÿhÁ±ÿžŽÿ2 „ÿbÅÀÿH«Ÿÿ=rÿosÿJ£žÿ6|pÿ5Bÿ2Uÿ2Vÿ>}oÿ#M7ÿ_)ÿ(~fÿG˜tÿVÿ+œ…ÿ]¸­ÿL§›ÿeÿ_»²ÿ–‡ÿ!°£ÿ}Xÿ—Šÿ5¤”ÿYüÿ,³ªÿuÅÄÿ<¢˜ÿ„vÿ2ogÿUNÿTHÿWJÿYKÿZMÿ\Nÿ^Pÿ`QÿP>²êäûµîèÿµîèÿ´ìæÿÎÉÿo“ÿQuqÿRljÿ3¸·ÿgÊÀÿ.»¬ÿž„ÿWÊÇÿkÑÑÿF«ŸÿQ¢•ÿ"qWÿZÿF¦ÿB··ÿ/“{ÿo±¨ÿ0„hÿX‹ˆÿG€wÿ3n;ÿ=9ÿ4[ÿ4[ÿ7OÿGf]ÿ(hUÿ#H(ÿ"L ÿ+N%ÿZ¢™ÿ_±²ÿQ—ÿ?·®ÿoÕÒÿ?©’ÿ#“ÿ‡jÿhQÿF¥›ÿ4šŒÿkÚÝÿ:¯œÿ ž‰ÿnžÿ>‰ÿ!zsÿ!a\ÿTLÿTHÿWJÿYKÿ[Mÿ]Nÿ^PÿP>³êäû¶îèÿ¶îèÿ´ëåÿ‰½¸ÿb´«ÿ@µ®ÿ( ”ÿ*± ÿB»´ÿ2Å»ÿf¾²ÿ`ªªÿ ”ÿ&¥‘ÿ\¯¢ÿ5“|ÿ9ˆvÿ|§‘ÿ~±ŸÿH¦¡ÿ(sXÿ&ƒlÿ1X6ÿ H ÿmFÿ:›Žÿ(ETÿ6_ÿ7Yÿ(O%ÿw´§ÿ+}dÿd¥”ÿ6š…ÿ+tBÿ$‡kÿ&z]ÿe´¨ÿ sÿ|§‘ÿ5™{ÿyÉÃÿsÊÄÿX»ªÿ7 ”ÿ8¥™ÿ}ÅÂÿe¾ÿ§™ÿoƽÿ0gbÿ>ffÿ+UOÿWOÿUIÿXJÿYLÿ[Mÿ]OÿP>´êäû·îèÿ·îèÿ¶ìæÿ”ÈÄÿk×ÐÿX¶°ÿLµ¬ÿ)Šrÿ;¯¦ÿfÍÈÿFÌÁÿG«Ÿÿkº³ÿ? “ÿF¬›ÿ6‹kÿ9 ™ÿ$sMÿiJÿQpÿ(Z:ÿ#Pÿ"D)ÿFÿD§‘ÿŒÜÝÿ=ˆ€ÿ8dÿ8dÿK:ÿxUÿ‰Ç¼ÿk¼³ÿk¦™ÿD„lÿS&ÿO‡^ÿH‘uÿ6|Wÿ)˜~ÿ•‰ÿŸ‹ÿ+·¨ÿjÌÆÿ‹ƒÿ^´¦ÿ2¢™ÿO¢—ÿ=¥£ÿI šÿLÀ¹ÿp´±ÿG‡ÿ9_ZÿWNÿVIÿXJÿZLÿ[MÿP>µêåû¸îéÿ¸îéÿ·íèÿ™ÑÌÿ/¶«ÿ*²¯ÿ0—ÿ4³¤ÿ.À²ÿ©ŸÿtÄ¿ÿ|ÆÆÿ.´ªÿœŽÿ+kÿ5–|ÿXÄ¿ÿZÇÂÿ,}TÿR›ÿ>nJÿ[Lÿ››ÿ.£ŠÿL²šÿL®®ÿ#kÿ=Tÿ+Haÿ?eÿbIÿT£“ÿ•Šÿ-­¬ÿ(lYÿEÿd8ÿS‹dÿ-’tÿ8‹hÿ*xRÿ"—~ÿ*¶«ÿ7°¤ÿ]ÊÀÿPÀÃÿeÉÌÿo²§ÿ!®ÿ&°¦ÿ=±§ÿ!šŽÿB{xÿJjiÿ:[Wÿ ZQÿWKÿXKÿZLÿP>¶êåû¹îéÿ¹îéÿ¸íèÿ¥ÕÐÿl¤¡ÿT© ÿ]¾³ÿÝ×ÿ*—ÿ;²¤ÿ8²£ÿœ„ÿ Œÿ˜|ÿ6’‚ÿK°¢ÿ>‚ÿS!ÿ^ƾÿZ'ÿK’~ÿKÐÊÿL³¯ÿ ˜‹ÿ^©ÿB•ÿ#Ÿ…ÿH9ÿEŒÿKÿ#meÿwÀ¿ÿ-¨ÿX¥¢ÿucÿ2ŠgÿdÊÃÿ`:ÿ8ŸŠÿVŽÿp[ÿbXÿ=‹uÿ mÿ˜}ÿ$¦’ÿ©žÿ'žŽÿ ”†ÿW´¯ÿNǶÿ=Ž|ÿL¤ ÿh©£ÿ7Œ…ÿX}xÿ)f]ÿ [NÿXKÿO>·ëåûºïéÿ·ëåÿ±ãÝÿœÐÌÿSÀ³ÿ(¨œÿT°«ÿ&ª ÿXÜßÿ? šÿ5¯˜ÿoÕÐÿB½¹ÿ‹kÿX˜‚ÿYŠjÿF„hÿ(qÿ”{ÿ?‹zÿ}³£ÿO¸±ÿ5‰kÿUËÂÿ$…aÿ}ÍÌÿ.~^ÿP7ÿ€kÿúÿ!bIÿ@xNÿQŒrÿ8¦ÿnª™ÿ=€rÿVÍÑÿ!|kÿ%xÿ1œ—ÿtËÈÿY¿¸ÿ+“}ÿ¥ÿ&Ÿ‡ÿ#„`ÿ(¤Žÿ4‡xÿjɼÿ7¯¨ÿB»ÿB´©ÿ9±£ÿªžÿi±«ÿ…¬¨ÿcŠÿ4ukÿ[NÿM>¸ëæû»ïêÿ­ÝÙÿ·³ÿz™ÿs¢¡ÿžÉÈÿ@¥˜ÿ^˽ÿ3½°ÿŽÔÏÿ9¢—ÿš‚ÿ ‡eÿ¹ëæû¼ïêÿ¡ÌÈÿHˆÿMŒ‰ÿœ®®ÿcŽÿ>…wÿK –ÿbÇÁÿ"®¥ÿ ‚ÿ•sÿ}\ÿ"`Gÿ/“|ÿL»½ÿjÊÆÿ"†nÿU%ÿ"Q"ÿ+ŽsÿkSÿ]­¡ÿ €cÿ%—ÿ9’vÿ`¥”ÿW‹§ÿ!|WÿXª¡ÿ"º®ÿ"rTÿ+­›ÿS± ÿd ÿ.Y0ÿ(FÿHˆhÿW#ÿa”xÿ;”†ÿ'’|ÿ]»²ÿb¶¸ÿQŸŒÿ[º´ÿ5¸©ÿC¨–ÿ,®¦ÿiÓÌÿq¼»ÿ1³§ÿF¼·ÿq¸³ÿ|º²ÿ®ÜØÿ­Û×ÿªØÓÿ’ÈÂÿE>»ëæû¾ïêÿ¤ÎÊÿÕÌÿXǽÿš‘ÿ2ª›ÿ*—Œÿ3|wÿ(œ‘ÿ¯šÿ£…ÿ4ªšÿ“~ÿƒcÿXž‰ÿ>‰zÿ3{Xÿ#].ÿT(ÿEŒnÿ Œrÿ@jÿÇÉÿ qIÿ#nRÿM–Šÿ²¤ÿ*ž“ÿnâäÿ"rZÿ }aÿm@ÿNuIÿO ÿD–‘ÿgÃÃÿr§ÿrÁÂÿF‹ÿPŒŠÿ/rNÿeÁÄÿj¸²ÿU§ ÿ„sÿ@®®ÿB¢“ÿY°œÿ0½²ÿš„ÿ=ŒÿtÇÊÿ«“ÿ$¯­ÿ´®ÿµäßÿºéäÿ¸èãÿ¶çâÿA>¼ìçû¿ðëÿªÖÑÿ"§™ÿ(´§ÿ¥ŽÿL©Ÿÿ\¼³ÿK¹±ÿQ»¸ÿJ¿®ÿ{ÍÇÿX®£ÿM«¤ÿ0Ž|ÿ1zXÿ>aÿ@gRÿ}ÔÍÿ*± ÿ<µÿ–€ÿR{Vÿo™˜ÿIœ„ÿ`¡Œÿtãåÿ]ÈÀÿlÀ·ÿ< †ÿdºµÿ`‡hÿ1xSÿd?ÿ3h?ÿ!X+ÿkHÿ2ˆ|ÿW©¬ÿ,ÿXŸÿm—ÿ‚qÿ(‘ÿB·­ÿY¦¢ÿJ¤¡ÿI®žÿlWÿiÃÃÿX±­ÿlÀ·ÿxÈ¿ÿCº³ÿdƾÿÇÄÿ·çâÿ¾ïêÿ¾ïêÿ¾ïêÿA>½ìçûÀðëÿ©ÔÏÿ\¥ ÿ4–ÿ;{tÿ.jÿOõÿåãÿxÝãÿbÎÆÿQ±­ÿ! ”ÿRšÿ[¨•ÿH£šÿ/’…ÿg²´ÿYÖÖÿiÇÃÿ?¾´ÿ;vÿDf]ÿHmgÿ!^BÿvSÿHËÆÿD¤™ÿEÿjBÿRµ¦ÿ>—~ÿx¿µÿ=•~ÿZ§¢ÿ$qVÿ;Z9ÿn¢œÿL•Šÿv°£ÿGwVÿ7…nÿ.‚mÿg£”ÿ>‡wÿG½°ÿˆpÿ›‘ÿ4|_ÿC¡‘ÿ@¸²ÿQǾÿLzÿ\¤ŸÿcÅ»ÿÜ×ÿ½ìçÿÀðëÿÀðëÿÀðëÿ@>¾ìèûÁðìÿ³ÞÚÿbƾÿˆÕÏÿœ‰ÿG»´ÿ\Ǿÿ8¦•ÿ)†ÿ(±¤ÿVÁ¾ÿ<˜‘ÿ)¥“ÿ„ÎÇÿ­™ÿK®ŸÿM’‰ÿ]•~ÿ…}ÿ2|bÿI™„ÿE˜ŒÿHŸ–ÿA ÿ#yÿV2ÿ;€gÿ>ÿG•yÿ!ubÿfCÿs¨§ÿ#W2ÿb”|ÿ.}vÿiŽÿ4_ÿ {cÿ%mÿX§ÿN“zÿ\¢˜ÿ[¥¡ÿoÄÃÿ[¾·ÿX³©ÿ]¹¹ÿJ¼·ÿM¬œÿ|ØÐÿcÐÇÿF§ÿF›–ÿš¿¼ÿ»èåÿÁðìÿÁðìÿÁðìÿÁðìÿ@>ÀíèûÃñìÿÀíèÿÖÒÿl¿Àÿ!º«ÿ  ‹ÿG«žÿ2¹²ÿ9”ÿ@¡ÿI¨Ÿÿ ˆsÿ+³£ÿIª¢ÿ ‘€ÿ:¢˜ÿ>|ÿ-†rÿyÿqÁ¶ÿmHÿ}oÿZ® ÿ%\.ÿ€¢‹ÿL—ŒÿqÈÃÿ@ ÿtNÿ|Æ¿ÿs® ÿYŠƒÿSŽ„ÿ)\2ÿ\ÖÜÿ/oÿKœ†ÿ+–€ÿ3˜„ÿ9·®ÿ zfÿxÚ×ÿuaÿ“|ÿI‚ÿ'¡‰ÿÿTÀ»ÿ£”ÿkÁ¿ÿb¹¯ÿ›ÿL¼±ÿ…ýÿ»èãÿÃñìÿÃñìÿÃñìÿÃñìÿ@>ÁíèûÄñìÿÄñìÿ¿êæÿyǽÿ‰ÐÏÿzÈÄÿ?¿·ÿL¯ªÿ ÿ9¯¤ÿ[¹ªÿ#ªšÿcÿg²ÿB¨–ÿ5qiÿhǼÿVÀºÿsÒÓÿkOÿ4­ ÿX¡ŠÿZ¤”ÿLÿR’ƒÿJ–”ÿ)bFÿ`;ÿ[.ÿ<\Uÿ/­¡ÿ¥˜ÿx·³ÿtRÿ>¡ÿ=‚ÿ8½¶ÿ/€iÿ{hÿ%–|ÿI¡ÿpÔÒÿV¾¶ÿf´§ÿ,mYÿŠuÿ*¢‘ÿnÍÄÿ®ÿoʼÿ=‡…ÿo´·ÿlº³ÿˆÐÉÿÁíèÿÄñìÿÄñìÿÄñìÿÄñìÿ@>ÃíéûÆñíÿÆñíÿÅðìÿ£ÖÒÿC±­ÿN¯§ÿ\¾¶ÿhÇÀÿuÌÊÿa´©ÿ8|tÿA“ÿ‹kÿ¡‹ÿi®£ÿjÀ·ÿ•~ÿ‘|ÿF¬¡ÿ‚sÿ"¡“ÿ+•ˆÿD¯¢ÿZ/ÿ*mÿ0lVÿ4Ÿ‘ÿ(z^ÿ>¡ÿuXÿ»ÿ †tÿ]¡…ÿ^0ÿd¡ŠÿAœ‡ÿœ‹ÿdÑÔÿX§•ÿM£ÿ”}ÿI©žÿ›„ÿD Šÿ7¦Œÿ—{ÿcÂÁÿeôÿ hÿ.«¡ÿ„ÏÏÿfÀ¿ÿc¯¦ÿ¼åáÿÆñíÿÆñíÿÆñíÿÆñíÿÆñíÿ@>ÄîéûÇòíÿÇòíÿÇòíÿ²ØÔÿ^¤ ÿ²©ÿOÀµÿuÿm»°ÿHŸ‘ÿT›ÿB­’ÿŽsÿ–†ÿ'›‡ÿR® ÿK¿ºÿ›†ÿU´¦ÿY¯¢ÿ¢Žÿ4œ’ÿtØÝÿ8‡ÿŒyÿ1|^ÿiÆÇÿvÿ&~ÿ€fÿLpÿ‰rÿnÊÇÿˆÁ³ÿˆdÿ „gÿ#xQÿoJÿ‹nÿeÿ ¤–ÿs´«ÿ-¸²ÿ{ÆÆÿX­£ÿŽlÿ™ÿXÁ¼ÿ ¯˜ÿ&­šÿG¼²ÿHÀ°ÿÏÉÿÄîéÿÇòíÿÇòíÿÇòíÿÇòíÿÇòíÿ@>ÆîêûÉòîÿÉòîÿÃëçÿ¤ÅÂÿf´­ÿG°¤ÿjÀ½ÿ¯ ÿ(Ÿ†ÿV»²ÿ!™Žÿ:“‡ÿF°ŸÿhËËÿ6¤ÿŽ|ÿvÀ»ÿ/„ÿ/o\ÿb®®ÿAµ­ÿgº¬ÿ,‚ÿ@ÿDš„ÿ3‰nÿX¡£ÿd¯œÿ$˜ƒÿ „`ÿwPÿJ—~ÿ(Ž~ÿ0–~ÿ*ˆgÿS¨šÿZ·ªÿ,“€ÿS­›ÿF§¡ÿ&ž’ÿ=nfÿ=‡}ÿŸ‘ÿ*¬žÿ‚ÿ[»ÿ5¯¤ÿfÒÈÿ!ªšÿ§‘ÿL½·ÿ¼âÞÿÉòîÿÉòîÿÉòîÿÉòîÿÉòîÿÉòîÿ@>ÇîêûÊòîÿÊòîÿ¿åáÿ—µ²ÿd°¬ÿ~»½ÿ_‘’ÿ6©›ÿlÂÀÿ"•ÿ2š‘ÿ(ƒlÿU…ÿ1¥žÿ1©¡ÿH¶­ÿrÎÄÿHžÿwÿfGÿˆÈÃÿžÿš~ÿ+¯Ÿÿ_Á¼ÿ<Š‚ÿLphÿI•…ÿ4’ÿ"ƒjÿM•…ÿ3 ÿ,©˜ÿ6“~ÿT¦¢ÿ4¨—ÿB³°ÿbŸŸÿR~yÿjÈÅÿoÁ¸ÿYÄÀÿ@µ¬ÿ*›ÿR´žÿ:®›ÿ&¢‹ÿlÚÖÿ!’Œÿ€ÉÆÿ5´©ÿvÆÃÿÇîêÿÊòîÿÊòîÿÊòîÿÊòîÿÊòîÿÊòîÿ@>ÉïëûÌóïÿÌóïÿÆëèÿ„ÑÊÿW¹²ÿC³©ÿ2ŠzÿS¤–ÿ1ˆÿD’~ÿªÿg·®ÿMƾÿ\»¶ÿœ‘ÿ[³¦ÿFº®ÿ«•ÿžÿqUÿe¨œÿ šŠÿ{ÿ8¯©ÿƒÿe±¯ÿC•†ÿ%„eÿ1¥¡ÿ2¤‘ÿ‡×Øÿ+–ŠÿIÆÁÿ,•ÿ/¨˜ÿ/¨ÿ*°£ÿ|ľÿ6œÿ0‚ÿ*‹ÿ3ªÿB°§ÿ'¢ÿ!¢™ÿ`¿¹ÿI¦ŸÿFĸÿ/³¢ÿe¼ÿ8µ£ÿ½áÝÿÌóïÿÌóïÿÌóïÿÌóïÿÌóïÿÌóïÿÌóïÿ@>ÊïëûÍóïÿÍóïÿÌòîÿ»èäÿmÍÄÿi¹³ÿ(ªŸÿ+¢—ÿ^ªœÿJŠÿxŽÿa±¥ÿe‡…ÿxÛÞÿNÀ¸ÿ4qÿHzqÿ"Ÿ‹ÿ^³±ÿJ ™ÿ`¢“ÿpÈÃÿ‰ÛÜÿJŸÿT«˜ÿ3€ÿnÉÊÿ<˜’ÿ<Ÿÿž’ÿm¿»ÿaÊÄÿ0«¥ÿU¾²ÿKº§ÿ£”ÿŠÓÓÿ@¡šÿ* –ÿc¹¹ÿ@©“ÿ2¦˜ÿ}²³ÿ¦“ÿyÐÑÿX½¶ÿI°£ÿt¾ÿ£ŠÿRľÿ‰Ã¾ÿÉîêÿÍóïÿÍóïÿÍóïÿÍóïÿÍóïÿÍóïÿÍóïÿ@>ÌðìûÏôðÿÏôðÿÏôðÿÏôðÿÌðìÿ˜ÕÏÿvØÕÿ„ÎÐÿq”’ÿHŒ~ÿ_yuÿMxÿK¾´ÿ(ªžÿ%‘vÿ$¤›ÿ"ž“ÿv•“ÿPª›ÿJtrÿ#•†ÿE›šÿ†ÌÅÿ ƒoÿ"–ÿŽqÿ#¶±ÿH­žÿ`°¡ÿQ±ªÿ3š†ÿpÆ»ÿ4­›ÿe²ªÿ/“‹ÿ§ÿ‚ÎÉÿhŽÿX´ªÿ¤–ÿXº°ÿT¼¹ÿ:´©ÿ°˜ÿ<¯¦ÿgÕÎÿM¨ ÿh«¥ÿ¥˜ÿkÏÆÿ°ÐÌÿÎóïÿÏôðÿÏôðÿÏôðÿÏôðÿÏôðÿÏôðÿÏôðÿ@>ÍðìûÐôðÿÐôðÿÐôðÿÐôðÿÏóïÿÃêèÿ¢¾»ÿq˜—ÿaŸ™ÿ,”…ÿ#¤œÿV†ÿgÉËÿ@®¤ÿNvwÿ†ØÒÿlÈÃÿ0oÿ™„ÿœÿX¯¨ÿUÂÁÿg·©ÿ/¬ÿV¾¹ÿ4¬£ÿ8© ÿHª£ÿK»¸ÿ§šÿ|nÿ'²¥ÿ-ĵÿ…ÊÅÿqľÿr·µÿ(¤ˆÿ vÿ\­Ÿÿ-Š|ÿJŽƒÿKˆƒÿ$žÿF¶ªÿ[ÄÄÿ$­¢ÿ^§šÿo‚€ÿN´­ÿjÌÆÿ¹æàÿÏóïÿÐôðÿÐôðÿÐôðÿÐôðÿÐôðÿÐôðÿÐôðÿ@>ÏðíûÒôñÿÒôñÿÒôñÿÒôñÿÒôñÿÆçäÿœº¹ÿoËÉÿ ‘‡ÿ‡ÌÊÿlÉÂÿkÑÑÿh´­ÿ{ÿT¿³ÿB­¡ÿœ„ÿo»¾ÿ(¤—ÿ; •ÿKº¦ÿ?®›ÿO´­ÿQ¸²ÿI¾¹ÿ ŒzÿNÅ·ÿS©ÿ9¾¹ÿJƽÿ —ÿSÁ»ÿHÁ¼ÿ4½´ÿ_¾±ÿ ‹ÿ0˜ƒÿXƾÿ9ž–ÿ8®¢ÿ"¯¡ÿ[·³ÿ#© ÿ_Á¸ÿb½»ÿp¾¶ÿ™Šÿ#®¤ÿ˜¼¸ÿËëèÿÒôñÿÒôñÿÒôñÿÒôñÿÒôñÿÒôñÿÒôñÿÒôñÿÒôñÿ@>ÐñíûÓõñÿÓõñÿÓõñÿÓõñÿÓõñÿÍîêÿuÒÊÿ`ÍÅÿ)¸®ÿo—’ÿp»³ÿB³«ÿ5¢”ÿ=§£ÿF«žÿ¤ÿ‹nÿDÆÄÿ(¨œÿ3Œ†ÿiĵÿQ¿µÿX±«ÿ7™ÿ>Á¶ÿ\¸©ÿ«–ÿ9Ÿÿ)£ŒÿYÅÁÿ«›ÿ›”ÿgÆÆÿ-Švÿ3­˜ÿ&©Žÿ­—ÿ+›”ÿ™šÿÔÖÿH¬§ÿ0À²ÿM³¤ÿP´®ÿ…Ÿžÿ†¨§ÿvÂÀÿV»²ÿ“ÑÌÿÍîêÿÓõñÿÓõñÿÓõñÿÓõñÿÓõñÿÓõñÿÓõñÿÓõñÿÓõñÿ@>ÒñîûÕõòÿÕõòÿÕõòÿÕõòÿÕõòÿÕõòÿÕõòÿÌêèÿ§À¾ÿN šÿ3 ™ÿIª£ÿG«¢ÿVÊÎÿ †uÿE££ÿ?¢—ÿLƵÿ@¿¸ÿ@’‰ÿ"º©ÿ&Á·ÿ©ŽÿA®¢ÿM~xÿ]ÇÃÿ#‹xÿ@¡ÿ+­žÿv½²ÿM¼³ÿN·ªÿ;»½ÿ¦‘ÿq¡¢ÿ)£“ÿ&¿²ÿYÀ¶ÿM‰„ÿ=ŽƒÿA¼°ÿbƶÿ&ž…ÿG™ÿ:¢›ÿ”ÆÇÿ›ØØÿ•áÜÿ¨ÜØÿÓóðÿÕõòÿÕõòÿÕõòÿÕõòÿÕõòÿÕõòÿÕõòÿÕõòÿÕõòÿ@>Ôñîû×õòÿ×õòÿ×õòÿ×õòÿ×õòÿ×õòÿ×õòÿÑîëÿ„ËÆÿF·­ÿGÁ±ÿ¨—ÿP½­ÿ=¹°ÿj¾­ÿw½µÿ!‘{ÿ'–ÿa·°ÿ˜„ÿmÎÆÿdÊÁÿ!¶©ÿmĽÿCÆÀÿX®§ÿ˜„ÿž”ÿkÉÊÿ!® ÿ0£‹ÿIŠÿ&¯Ÿÿ ¨”ÿ™ÕÒÿJ¦¤ÿ»­ÿ7·ÿ.¢…ÿ:°£ÿK½µÿb¼¯ÿV£”ÿ[™“ÿA¹­ÿzÓÍÿÐíêÿ×õòÿ×õòÿ×õòÿ×õòÿ×õòÿ×õòÿ×õòÿ×õòÿ×õòÿ×õòÿ×õòÿ×õòÿ@>ÕòïûØöóÿØöóÿØöóÿØöóÿØöóÿØöóÿØöóÿ×õòÿÈïëÿ¾ëëÿ™ÝÞÿV»±ÿÔÓÿi¡›ÿKœ“ÿ%–„ÿ”}ÿjÉÈÿ¡‹ÿ¦šÿ]Á¹ÿT„‚ÿ•ÿlÌÂÿI¼¬ÿ+«œÿLÁ·ÿ²¥ÿtÏÉÿ* ™ÿ<Žÿ”ƒÿtÌÂÿkÌÇÿZƽÿjØÍÿ4£ÿ ‰iÿœ„ÿF¥œÿD¹¹ÿšÇÁÿ–ÇÅÿ'Ÿ’ÿz³®ÿÊçäÿØöóÿØöóÿØöóÿØöóÿØöóÿØöóÿØöóÿØöóÿØöóÿØöóÿØöóÿØöóÿØöóÿ@>×òïûÚöóÿÚöóÿÚöóÿÚöóÿÚöóÿÚöóÿÚöóÿÚöóÿÚöóÿÚöóÿ×òïÿ˜ß×ÿÂÛØÿE±¨ÿ ‚ÿ‡¾¼ÿ&¦—ÿ{ÌÉÿXŸœÿ+šÿ š„ÿ.ƒpÿ#—€ÿ6²ÿuÒÏÿ>¦šÿ2½¹ÿ(£’ÿµ¤ÿ9»­ÿ ¨œÿVÁ½ÿ;¶£ÿtÆÅÿO»¼ÿ3~}ÿ*—xÿQ³¦ÿ<±£ÿX¯¦ÿd¼ÀÿÅÞÛÿ°ÞÝÿk½ÿlÊÂÿÒíêÿÚöóÿÚöóÿÚöóÿÚöóÿÚöóÿÚöóÿÚöóÿÚöóÿÚöóÿÚöóÿÚöóÿÚöóÿÚöóÿ@>ØóðûÛ÷ôÿÛ÷ôÿÛ÷ôÿÛ÷ôÿÛ÷ôÿÛ÷ôÿÛ÷ôÿÛ÷ôÿÛ÷ôÿÛ÷ôÿÛ÷ôÿÛ÷ôÿÓîëÿWĹÿ|ÎÃÿ¤ãåÿ¶áÞÿ{¼±ÿ†ª©ÿC±¤ÿ6ª¡ÿ$›ÿs¾´ÿ4€ÿ –ÿh´±ÿ]¥¡ÿA³ ÿ‰ÿuÉÈÿpÁ¹ÿ—{ÿ3«–ÿ™‰ÿk½®ÿ*™}ÿ=š†ÿ~›šÿjżÿYøÿuËÇÿÎèæÿÖñîÿßÙÿ¹çâÿÚöóÿÛ÷ôÿÛ÷ôÿÛ÷ôÿÛ÷ôÿÛ÷ôÿÛ÷ôÿÛ÷ôÿÛ÷ôÿÛ÷ôÿÛ÷ôÿÛ÷ôÿÛ÷ôÿÛ÷ôÿ@=ÚóðûÝ÷ôÿÝ÷ôÿÝ÷ôÿÝ÷ôÿÝ÷ôÿÝ÷ôÿÝ÷ôÿÝ÷ôÿÝ÷ôÿÝ÷ôÿÝ÷ôÿÝ÷ôÿÜöóÿÊìçÿ’ØÐÿÙòïÿÚóðÿÀÛØÿnÍÊÿ¦šÿW¸®ÿY®«ÿšÊÌÿc³°ÿE­¤ÿG§žÿpþÿq½¹ÿ8´¨ÿ4º²ÿd²«ÿ<½°ÿhÀ¾ÿC–“ÿ%«¢ÿ©ÿ9£—ÿˆ»¼ÿ®ÎËÿ‘ÖÎÿ”ÙÏÿÚóðÿÝ÷ôÿÝ÷ôÿÝ÷ôÿÝ÷ôÿÝ÷ôÿÝ÷ôÿÝ÷ôÿÝ÷ôÿÝ÷ôÿÝ÷ôÿÝ÷ôÿÝ÷ôÿÝ÷ôÿÝ÷ôÿÝ÷ôÿÝ÷ôÿÝ÷ôÿ@:Ûòðùß÷õÿß÷õÿß÷õÿß÷õÿß÷õÿß÷õÿß÷õÿß÷õÿß÷õÿß÷õÿß÷õÿß÷õÿß÷õÿß÷õÿß÷õÿß÷õÿÞöôÿ½äáÿªâàÿ•ÚÕÿºãàÿÞØÿ¹ÍÌÿL¼»ÿ$¬¤ÿU¨¥ÿ[¶³ÿ°ÿ›‰ÿ¦ÍÎÿÆÉÿ±§ÿX¯«ÿp´·ÿg¼°ÿ2§˜ÿ¡—ÿ“ÍÉÿÇÜÚÿÜôòÿß÷õÿß÷õÿß÷õÿß÷õÿß÷õÿß÷õÿß÷õÿß÷õÿß÷õÿß÷õÿß÷õÿß÷õÿß÷õÿß÷õÿß÷õÿß÷õÿß÷õÿß÷õÿß÷õþ=4ÐæäéàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿÏæãÿpÕÎÿ'¹¯ÿ—ÉÅÿ8¾±ÿF½±ÿ:³©ÿ¶çäÿÊàÝÿ7È¿ÿmÇ»ÿfÇÂÿg¸¯ÿXÀµÿ–ØÓÿÏÊÿ½êæÿß÷ôÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿàøõÿÛòï÷7 &¦¶´©âøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿÞôòÿÝÖÿÏîëÿÛðîÿpÓÇÿ»êëÿÝòðÿµèâÿßõóÿÓôñÿßõóÿÊìèÿ¸åáÿÐðíÿá÷õÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿâøöÿÁÔÒÏ, =Þòð÷ãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿãøöÿâ÷õýª·¶©ØèæéãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúãõóúÜíëï¸ÆÄ»G( '4:=>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>=;5)   ðÀ€€€€Àðgeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/bg_motif.png0000660000175200017530000000147412664543647024563 0ustar guillaumeguillaume‰PNG  IHDR&(Û™tEXtSoftwareAdobe ImageReadyqÉe<ÞIDATxÚ¬UÁ–Û@œ8¯ÝÿÿÆ{ênãÄC‘îë½Ù}ÉÌx!öóø¹2 Ÿ4·¬M>­V'~>®GøþØ“tx”/ÔÕ(s—¯:¢/:‡íǾÃÜ}U.èk—/¸®À‹†'u2Eü,d/ïé0Š>¤/o{¢€ !RmC–‰Ï!Øôi‹9ø÷ÛN*¬“õâ>ÆPã†ïµôµL N8z°Î`ÑÀ, =Âî•á÷ ÛÀC?È€¤tò ‡Lª:Ÿô,G1Ü“_&ŠʶR| .S %ÖT™àÚF³&D'–g­]-òlü¸L´^•©SWìMt(ÌÉÂjP2‚G'éqýn’j”VMèAHHµ” 0-VnjÀ-ž¤î0¯ða²\Õ¦ÔTT¢t9`:gs‡Å(‚YRpôéYNjSp,"¾Þ¯!…9ú½E‡½Aà…Ìo¬iÐêÎk’“•y9+Òt>ßG#’@fÆâž¨ .ð–¡øöQØû„⨇.^ˆ&9¾Tâ)è«Ú¼øU*§¢=öívŸêIºÕskI"ùvdµ€X „ñ®>>eŽFM¢ÓœÐÔ!!ëâ…-¼M“m)[úK$kôišùó÷eÂ91­¨ŽÕ($÷3=V^}?C![³É^IÅ>§ÉÄæ‚²ã_¢•Äfƒ”MvjâFKÒ|šŒ¢Ì5·÷*Ñ¢—i„÷i2£ Ìûn2'ÍU‘,I{^zœy¤ Â(áý¢¨ÿGM¼ú{ÀQŽÆ­±I02êéÐ]Ø%Ÿ™§Á×P0Fmö‹_Ñ‘]L¡Ï÷³þµ¶ákf±·v£«˜÷H}ö+–Þš©ê!ua6¢p„Jë'Äš^€á÷†×šÃœƒ:Ô챿ÜL(?1bºí±SeôÚ>ô ŽYqI.ñÕeTBÞéë0y&ÚĨ™™IEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/parents.png0000660000175200017530000000045412664543647024446 0ustar guillaumeguillaume‰PNG  IHDRb¢0† pHYs  šœ0PLTE  Šz|ά ô þÎz‚ÒÑÒÿÿÿ¼–ð¼mótRNSÿÿÿÿÿÿKFIDATxÚ=Ž1 Ã0 E“{”î.Um÷ŒNà!Ý 6ä PrÛÈNZà!‘ô¡sEÂÍtŒV†mêèÒãûkÃfþH‡ûú„“iÈ|05ðŠÅ8 ©CqÖ£^|E¨.³¯ÌÈ­—u¾S1Gá‘¥ ½ ˜5Z¯Ê{Š~A‘ulûÈ=CýJ~òIEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/not_married.png0000660000175200017530000000053112664543647025271 0ustar guillaumeguillaume‰PNG  IHDR 2ϽtEXtSoftwareAdobe ImageReadyqÉe<ûIDATxÚbüÿÿ?1€‰HÀXYP|Þ7(Ѐ••áųç {¶ï\ðèÁƒ‰ö.Nû¥deN=º¡gʤ@°êÎÆ–þ/_¾üûöíÿ kÖ­¯/¯2X½|ÅûΦ–<Šóöîܵ¤ðÎ;ÿ—-\ô~Ú„I 09B¸§ôô>¸w¶–ÀËç/.`õLbFZÿÇ÷¼}ý†AHX˜ÁÖÉa} «§ŠÂe Í4˜ÜÝç¸wÇÎB˜Œ¼œ‚»ŸÏ|˜B–þö®û JJ Ïä+<ºÿ@þԱ㠼|| R2Ò¥9ù÷⊌Ä8@€ÉÆmÏ™/¿ÞIEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/file.png0000660000175200017530000000137612664543647023715 0ustar guillaumeguillaume‰PNG  IHDRóÿaÅIDAT8u’ËOaÅïBcúh\»tãRI]׿Á ¢‰Š±Å…‰&¦&.L4*‰£‘B>(–"Pm)…–ÒÎôÝ™N_Ó'¯N[êõû¦PÆÅÉL&ùsîÜ N7,ºVN™m?5³ N­ÝáÒÚ-ig©mÙ‰æˆ Ûu·Ÿ/®åU0ÍØË0i±]ÉJ˜ÎŠ˜É0›/`._ļXBú],–Q$Ïb©ŒÓÌ[çŠÜ/Øç—†ÇJ 1É4š×ãh $p:˜D+“Ä–Ã,ùrKå2ŽN˜_®®­ƒƒ´'©2b0)sbY.s3T\¶…Sè&1Ȱ Gþ˜¬³èðÛ½ :bpt„"RÃýúÅR…$W±\ÙU©TqxlRµì]k7ÐÌJ:#—Ê`€ a #Ф(†"1ŒDc%0OâÆæÖjêÆ§T>xAO H/dÿ ó)A†7·¶±&ÕQo0©üAÈ:¼rƒ1H¥s2Ìvàx'9žàHý*nmï ToÈ&L xòôÜ»ß{âFW·âÖíyWEæüû‡Šçä=cÖÖÖîagåfHž( ƒvtµHrŠOÿýEÄï‚âçLß¿ŸÁÁÁ‘’Ø'…®Y-©«¥‹Ê^€,œ ²0¾[kQÍÒ¿@ƒ–V¾„[Ó!U0Å¿Â&¾°·E¿ÿžÅÆÆ– òz’…[Õ"NÕl²¬æ%(õrü“›…á b´Ê¢ì@ ·naH-ËVXœÂ- (¦ya·d¡o±ýŠA f~óæÍ’ͽïþþþG3ŒžeþŠŠŠ–Ü¾}›gÛ¤n™ü4÷)ÈR3¾ªªª–\½z•u×ôÞNɼt±ô¿–³ù@‹öÍýìmÃM ûþ!—H^òÕÛ"”C׉ÕßɲíéÓ§+Az1ˆa1Ðocvlõ¦?úD¤}?¡j_AÙ¨@σ–¢y€Xhñ`±õ(Çÿ!M %ƒ2?´4biG){µœ!Õëµ½ÿ@ . ZÚP —Ï]^‹V^ÙÜ,W«U¦U»Ó šÍæÝN÷ç—×ïÞ>õ€ÅZ´Ú¨T*å0 ɲljH)ˆÂ³å¥-à…@Íu]´ÖØ’R AV€%(d™)cHÓÔ$Ë2Dd(z€+ˆ3 ºÓõF‹b¢sÙŽ!™1$¶ü 1Æ$‰='¹&ú»\³†ŒÊõàÉc+;[·ÆsgìDÄnð9'N>“tÁ§iÊíë7f«×Š1ætˆË1Þ©ü†M9ÌAó€ˆèþ`ð}§÷“A ÐÐÿôùh'îõZ6ƘìãÑá6+ ê¥ hÔ×7nEeèpâò¤ZÇ{ž=9~ì¨áó[6†£ øæ%Àøì»ÀáèÏåË@( S@R  œÇ@÷7Yxí„’¾TIEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/button_headline.png0000660000175200017530000000232312664543647026133 0ustar guillaumeguillaume‰PNG  IHDRÄé…csRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÛ *2åtéôSIDATHÇ¥–MleÇ3»Ûe?f …nÙ-¥`À`l¡´ÐJÀ-íR jôb¢'†õ¤Mð¢†Ä³Oz@…P _”©Q!°-EÁ„ -vwgwvwÞy_´“ŽÝ"ê“ü/“yÞ_žçù¿  D—/¹¯ÙŒÇ›PhJ){ MÓÊâö¹áÌE ؀Ѐ`¬iY•N%öD£ÑÆp8Ì !…B¡p;;ñΩïß²A ’¨›cÃÂ÷V¶¶šÉd²zb±HÑ.1âqæ„ÃhZõB³¹\lddäÍœ•¿ñóÐ… `¤¦ëëëÍD"뺾¥Ù|Ž ›»ÙØÓ À[oì &ª ‰Çb4$Ì3ç>|¥1 BÌP¹\Æ.•èè\ë-ò`ÛJòù<ŽãTÍB i µ˜«aו)%ŽãÌPÞ²hioÃ0 ²©w3v¹D©\ªšã8®ë¢”ª"A  PúdzH¥˜ÈNxmš Ã0XöÀ ~»x‰h$Rµe®ëÂwt¯÷U*)‹46/&™J1”Éøiï\C6—£R©T­DL›­q¥¤â8>å¬Ðº‡×c¬˜^IpúL¦,œ/X¤·öpøäñ»žU]]$’ ™¸5N0ô[x6ˆp]â¦ÉÚ®.^zaÃç3èºW0vÉæã}Ÿ°¨©ÉûÖ“NóÑúö̬íB`Û6½ýi~eèüÌx#ódÆ >?0૦§·tÍs•âî3Ñ:;žxœ/Oœ$¨R⺮']Ó8ýõ)¿jké\¿ŽR¹ìý'¥¬î®‚]¤gK¦i2|!ƒB!¥ô àæ›?zÌzæ¹g± ÇAJ‰RÊÑ„ë†rVžm;wðâ+/°qs7èv©ä-.¥¤T.3w~†iø MMM¼¶ûu\åJÙhßÞ¿õ„š% TÛ7õª½ýjû¦^uhà ú§x÷í=ê±î>õÈÚ‡2ÀF h]ºhñ®eÍKžÿû…¥i:5¡5¡º®ß9z&7›R²ª¥u=àå\¿õÇéoÏþôj°Go\\Þ¼ôÉZì»ÛžÐu9á0sîá ¥t¯Œ^=4 h‰Çbé–å+žŽE¢ @éü÷PŽ…áË¿»9>vøQ›¼~“ÀŠI%ètçýPn—€ puêÍê€zÀjþÄ,`¬¿³¶ (¢ÂIEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/pyr_female.png0000660000175200017530000000027312664543647025114 0ustar guillaumeguillaume‰PNG  IHDR궦asRGB®ÎébKGDÿÿÿ ½§“ pHYsÄÄ•+tIMEÛ 9é8âtEXtCommentCreated with GIMPWIDAT×c|ÒòŸ ˜À`æô—×á)ï„IEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/down.png0000660000175200017530000000630712664543647023744 0ustar guillaumeguillaume‰PNG  IHDR°º¬K pHYs  šœ OiCCPPhotoshop ICC profilexÚSgTSé=÷ÞôBKˆ€”KoR RB‹€‘&*! Jˆ!¡ÙQÁEEÈ ˆŽŽ€ŒQ, Š Øä!¢Žƒ£ˆŠÊûá{£kÖ¼÷æÍþµ×>ç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-Û cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅFòIDATxÚì–¿kaÇ?—¶4©V‘ Žq‹ÿˆpGÅ©2w•¶8DÁ"ˆHG MkÚtÑïr?Þ¯C¯‡I/—Ts“>p¼÷ýÜó<÷~ïµ$‘eLî'–eõßËSÀt´æž7€t£Õ$‰d’„çyý×Ífó p*ªô@X)3ÐåÛs„Càk/÷÷òÀ3ø]ÃZµƒeY瀯À¬Z4͉¬Óƒ´2òÀ¿Hð¢ñWä@‹Æ ™ìÛÓÀ”eY¹Cþ'f€“IžûÍU]Iß%íHÚ>¤#¿”ôEÒ¶¤V«u8LÄnzíî&&a(L ¡nêw ¾gõz}µT*-[ÀÄ3ˆ>Ï Çqîçóù«WîœyïŸ9‰âIû , ×]×]®Þhôæi⃼ÈìCßÜJ_«vRÅÓÌ.†<½•¼%ì•Ý¡â=Ç–AVâ8Î’$]Z<¡reVççI’jµÚ+ Muå!€H¹2+Ij4/FÐi·Û€¹‘Ä_½ÿœÈò,‘>IEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/picto_numeric_order.png0000660000175200017530000000075312664543647027027 0ustar guillaumeguillaume‰PNG  IHDRàw=øtEXtSoftwareAdobe ImageReadyqÉe<IDATxÚbüÿÿ?- 2‡‘‘LOïêRñ@,@¤9€xafYá%T@†Þ°cý¦ÿŸ>|üO,©ééÅ0Ý‚y“¦½ÿO&éE·#„EEÈ olzIŽä37€1Y‘Ll:¶€¡v^"˜}qÎêZ0cS#ÃôM ”%S\ ¹Û‘¤`!È©–ºLÔJÃûqªÁU"åƒþ¬u ¼\dùà[þýû‡"ÆÍÁCv%º˜^Â>ø]3º¡XÕü'Æ@Wþýû— ØÔ`‹’,øû—Jüþý‡àllj(¶@[ΜaOû+Ê,…óÏŸ?ÉÊTØ"·¯^?b~>’ ÿòñHïb2ZàéCÇöË(Ê“Tl?¹ÿð#JDgD·M›6ŠÞ*üüòÕŒ‰…E€‰™Iˆ‘‘‰Ÿ‘‰‘(ÇÒÄ¿€ú¾ýÿ÷ï#0XÞÿûó÷=÷®û@¹~~~¿±Z0$[üørËmk»DIEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/button_italic.png0000660000175200017530000000156012664543647025631 0ustar guillaumeguillaume‰PNG  IHDRÄé…csRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÛ )(3;CMðIDATHǵ–KoÓX†ŸããØSRnMH+TbTh)·a¶³AS$ÄX°âOŒº€;Ęٌ„bvÝ€JÅq) —a¸ *!.…tšØ±}ÎaÑ6¤$±€–O:’¿c¿z|Þóù;€$àÞÆõ}ë²k1cŒàCa˜(ާî>*>ª€ÄHË~Ü:ܓ˟ð<¯×u]~4â8¦R©T¦ÊŸŽß¸ö7P¶tnåª_zókþÚ²%[(Xl”§§3¥RéØôÌÿoî<|pÞ–õä× wwwgs¹J©EC:3ò¹+²Ë÷c6z¤”ÄqÌR…ƒY ,·W)ÖZEÑ’A”Rc mÒ`¬$H¬¾ïãÁ;¥´èèèÀK{ØR6A˜­NiÏOšH- ùýÝìÙ··éÞøå1F/\Äuܦ›:DiMØ¢µæâÙsܾ=ÁÈÑ#LNNrôÏ2îìJ¾ÖªV­5a¶õØ–ËúbÉÕ+ã¤,‰ë¸(¥šª²±ˆÚ• ü€uÖ×óOŸ! m5-!IvTü*Ûvl¯çÅ{÷I;n[MK»Œ1m7^k°,ú7màa±ˆ_­âH»íÇÛr%I%FýCõüÖõ›‰ßUÛo' ‚€ }}õüI©Ú|?ÄÓ²­cðŸ¿íªÏý{k‚”•܆´Ö­!_û«”¯ä{{Ø<0kW¹\&¨ÕP–ÄI¥¢õ‘cŒ©_[“Zë#Œ"þ9sŠ“gN×]]]ŒŽ]b`h¥T“f~4Bì¤&gKÉჇˆT "iIÇ!eÛßÔ,Ÿ’Râ¥Ó‹mÈÆâ VûÈOˆ ¬M±/'_OTªÕ©¥h­ÕóׯƊòÀ`g&3<¸±ÿ@&í­ž[áÛÅqåѳÿFß~x˜sÇoèŸÀk¬¼ï5àð(¯æÿ¹<`%Ð dg˜>ï™Ïæî–£+ÿ@IEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/not_married_no_descendants.png0000660000175200017530000000564112664543647030347 0ustar guillaumeguillaume‰PNG  IHDR rëä| pHYs  šœ OiCCPPhotoshop ICC profilexÚSgTSé=÷ÞôBKˆ€”KoR RB‹€‘&*! Jˆ!¡ÙQÁEEÈ ˆŽŽ€ŒQ, Š Øä!¢Žƒ£ˆŠÊûá{£kÖ¼÷æÍþµ×>ç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-Û cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅFÌIDATxÚŒÑ1JQ…áo,b q 6Ú¥X¥°°ÜA ×`ëRÆ$˜&¤Šh§….À-Ø‚ ¤“æ>2Ã$§9ï¾wî¹¼,ÏsIWgçð‰k½¢?~žÓÅŽÿ:ÄqxÒ)îŠMeè;ü-üFu,c¤H·› ÷”}ü•ª vø$¼» ”"f¥ˆ¡—ð¯ªÇ*è­87·zñ¹ÈÑÀuP»ÄNOØÃe”êkÜ uVÍð‹Üã?˜›VJw#M€Ê©IEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/gui_log.png0000660000175200017530000000153312664543647024416 0ustar guillaumeguillaume‰PNG  IHDR szzôsBIT|dˆ pHYs  ÒÝ~ütEXtCreation Time11/14/121ÀtEXtSoftwareAdobe Fireworks CS5.1«Hë±IDATX…Å—ÍOAÆŸínÓÝ.ý hbPRLÐ(ÔÄJ ŒL¼öfšÐ¿¢‡í•?À›g¿‰š(¢1ACT@ù\Ø~ÀNwƃbè”vè¶è“ìa÷¼ÏoßywfVbŒW*‘ìÔt¸{% ¢H’$F)[076ÆcËq •H¶+nåå¥ÁÏñ¶°¦jZ5þ ¶ cmï^¿1ç¿Ì>ˤÓw¢ñ˜±wqæšW×Ç##7‚§ºª6—,£¡1„þÈ/ÜÑ~YÕÔ{qn|wß×zôXKÕÆ{étO·Gq»ï–hm:r¸ú×.¡:¿²,»R‰¤^ @WUÕPĸwnÑè•¥eL•À«ëè:w¶f¼„MX{U8Æê&_¼rl7p-Âå/Œ ›Ð  /rÅ1@q5+¬ÀAK@, ë?lß 57qùE\¦7MLO½w pq°Ÿwp¨ øq~ Ï1@åŸáA/Å•~¹l?fç†Ovðåø 0ZÛ¥˜—° ÝZN„ð뱬O)€-kÛúI)mvìXF”RȲ’! ÙRS›†A!e¹æÆÊ*$—k1™;Ï Î„ÑxìíV6÷üûç¯9Û¶QëköÓL:—ÉŒíö,ê.h%IEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/logo_bas.png0000660000175200017530000000775312664543647024570 0ustar guillaumeguillaume‰PNG  IHDRd!/w‹tEXtSoftwareAdobe ImageReadyqÉe<IDATxÚì[ T”W–þª(ŠŠ*ŠŠM@@Y\ÔÄ—¨I'јîhz<‰¦ÇÎbº¶{̤Óíh‡;'›Ýê¤ã’N&‰ž¨1Ñ6.ŒÒQvd§X ªŠZ¨½æ¾gª‚€´ÎtΙ¹ç<þúï{ï_î÷îwïýÿÛí“‚‚‚$ڵɕï[œÔJ¨£¶3''§›) ã%‘H”‹àà`H¥ÒQs}ÏÂìn4ÑÛÛ‹––¸\®ç”‚üüülã›ÌÌLˆÅâÛ> ÍÞ±o¬¶:ø‰“¼ú.í„+2F-~b2™PZZÊ@‰óY½zunbbâd™Lv[“-Ö¸Ü8l¸Z»×[O¢I}¾Â6œ)Ú «]‚º¦Ã ðE€$vÔÚ·!¾¾¾ÐétV!í?¢T*¹ ݪéú*`±µC£+ÃõÆ“(*ÿ5œŽÔ·Aè«\v˜Ìu0›û!÷ïEEk!„.j›?áóûŒM#´¹¡P(6‹è\(ÂÜ‹ÙRŽ®î£èѶÃì …ÛUn“u]{*–@âK¡Ô&Âáp ®e?ú̾趶@á†))›P×ü9Ô¦ ,ËþÒ„Щ†"˜¼FàFeõ;£ô4Bc‚ú昘˜›Pr8zä§GmË9\4´W!uÜ<جmh3tÀßGŽq$zMýˆRFÀa¸ÞuzS2S· «¯†æ#/*AJ|¬):µE ΀Þ| òÀI£®0HØïèèЋ<âÍ¢l­Ð.¢C]³;*¿d¤ÏÆÅʽHˆŒGJä#èÔµ E‰Kåg!rÇ@( ÆœŒß£E}U ;(¶Œ*f.ôò¢ÎFJ E¾½æZÄ©ž¸eÌú!‰ÅS‘×àN§óÎ)K§¯‚¶§ÝÆ.ʯ¡²íoÐë[)E{w'œz 2±ûò¶azÂ,h-c¡3´¢N}ú¾zØla0Ù…èÐuÂ.P§Iìo‚¶«¾>z¤Ä,#ZÛ}WPãó 3xc¿o‡²†"J†Ù`BkW1¢‚² ·PÝtõV/fO{œ²ªj<9=>ÈûRaÔê6l?ôyJŠkkp±¶/ÿ55oQ±)¥Æçê*))pá\éŸàpöÝ51apu~Ç€L•08lÈ™ú,Ü"+Â¥è0ê1ry$dnÔFìË/Ƥ”…¸ÚŒ³Uýø—9K!†B2_ †ÀH t.W  G¯Ñ† ÉX$ÆÌ Ú;8ä‚Xêççç‡ÀÀ@Þ$ wûÁ«ŽRž6ðúYŸ¿¿?Ÿ0¤ßS„y+Æ<}ì)›Ç¶Ï7P?ðXƒõÃ{pZ;Ò}y®•ì|ÇnkCgo>Ì6 jXQg·BgŽ@BÄ´hꙌã_E“Í €ÃH<‰~Dªf"2t,y“b»(CÓbï—ï!!<ˆk ej™¸x5!Qp‹(.ß‹1QxÏË„ÂaÅÁwþW s]â¤{°tÝËP„sþe7ZöÕ!ôv´ð~© 3—>»ÝÎoðJþa|}ð]h©ß_*ÇìG×búC«y?Ëe· àãÞsf-^À?vkÏä•®À‚Éû!ÿ‘÷˜úþ+ø,/Yã·"%z=¬V+7¶ F¼÷e(&%lDFÜf²¸e ¹Þc§Ä¬%;Åñßš¾ëãí‹V.À¬ »({æÇˆÁMAÝæÔSàm…H"Ĭô—Q×ð)|µœ--$cJÉ#â°(gJ«Ô„´/ÄÂ>ˆ¬6|CÒ©w˜Ô4ê0#}&'Å‘"N—œ†JÖ‡ QBTÕUa£Š˜ ‡«›ÒkÅ9_= Œ?¯_æ56“šKçð'Ò­{û3Q6÷éëP~îøM+¯öR!žØ²…ŸíƉ½ôêz-ŽïÙ†žöf<ðô&t7×`ÏKO¢ß¨÷Ž)8° ¿¸ã³æß’Z†Óƒõ*Ž-†Õ®õêÊ®oãà'm=yøì|6–ͼH÷~c± KY6[Ù2%Î_Þ‚ÒÆ° íÐÙÚ16îlü¯±yÏhV«)hK©à‹¢€Ýƒ7×-€º½T!#5½k´Ž$Jœ“†C ™€´q÷@©ôÇõ–·`è-E·ö*Uýß¹Áþ]ènmÄ´Eá•cu¼Í^¾F]/Žï~…‡w£´à¨·å ïPöæä†ïl¨D>­|±DÊõ¬Ý[‡!‹Æù£ÿî¦j|˜»b)׳þ„ô|~kõO•Lt;< LÏhX=móKWBBqrÙ=ñ¯Kœˆ ]ÀûzÈ3Ø6\žÉõž–¼•â©–¨|ÛM9™t.2Rr16fäŠx䤿‚ªæ‹ˆ‹JEEó~¬œŽ9t#iñJ4w]Er‚ §Î«_ÞêÞ`rc+"ƒÔ¨l¯Æµú+'†–VOGWÞ?Ñ! ‰ÂÜ/„Šj‘ÌËý•Å_CF\ö‹\ôõõQf§ÇÂ'6`lÆL4V–¡ªè»þóG?¾-Ï@•†µ[?€†¼ €›ó“§1>{>´Z-Bb’°dÍFºq'ªKΡ³¥YKV"$"»þý§¨ ã-¦þù«þÓ3¸Ï·†h¶ËôB ¯ïè̓Ùr©cÖB柀“%‹ˆ)òM7%1—Âóv]:©1¿â ±q³¯aƒºÕ¦CKûˆ"ƒ•Vþ‰Êô›.!)2µí´²K¨QaŽ™¨juB„5ó—AiMÀ†¥Yˆ±j~&`-ƒÈ!„Ô? û)¢°+P×Á!hÒœ‚ZÓ„ný~NÆŸlõ:NïM{ÜX„>m78ëÏ#OøhÛoA`<³í#¸}|ù|»Ý…*†çûl3rHÄ®w:]Þíö +pí›ÜÿÔ ¸÷‘§ÐßßÏÏÅ2A²†©ÿ:<Ïö˜±Œý \owj½zËŒ4Žé¤g[äéˋѥÍÃ4c\Ôúo•cXÜñ…ß|Ë:¤WW q*.T¾0U2'þ Y±“PXyI­ÈÝ_ŽÝGN#2Ø…$gÎÿõ tý%ˆPNDE‡ç~ŒÅ-Å0š¿Äâ)«‘½„è+]ú<Ä„=Œ0åx(ƒfós2#F'N„º±oÛHÙœœ ÉîÎŒVì6'ÆM¾—÷ܾ‘ ðüŸÀܧÃÙƒ» ÀæàÛÁ™Ë ½ ¾T±¹×Ë/áÁµ/"籟S y“žK)› ¥ªiº Çøù-ÎJ\©‘é[4åz·°EUÏrýÔq[ù<6No(áû㣅úŽ·a±7#:dúɃÎ_{AAAü©nmû›8Üm6ÛMÂ^P¹'NœèEˆ]\OÏß ý— %á9˜ jäר)“JCˆˆŠÀ. Ǥ#÷“?bQO,F,Z5gjªLÁMÕs“p¦²~”\D‡EÑE›ÐÞs*E¢Cï‡*ôÁ›RB?‘X5ÝmC‚` ,¯¹ìퟻ|5×9´÷?ñÒ›ØùÂ<ûÚ^¤L_À3¶uêF>çÇ¿øO>îS$>u2Ò¦ç –¢‚<…ý^ÿöîQÍší('ÃEP&´†’!z•b!fN8†zõ|Çtll§ö4ÿ=câ~œ.Îâž7PÄ"N+‚ÝÂ$;uuuóa«ÉI Ù¬ ÆÌI¿G¯©“(‡²)-¤â 8…&Ä„Û!¬«ÇO) ¾ÔÖ‰Š* '(‘Õ™ Ñp 4èê)áT8/û·”YYi•eÞtNþH¨gÓ‡ù˜’ó_Õ Ö’À üzÇaÞú“÷päÝ×”Ž >Ä“6Î}KqcÞŠ§±|Ý&è{4|nÙÙÓ|ÿ—oíç´e6›öKd¥ì‚< ´>x›”´9“Ï«Ÿ‘v”Ïe󨾋¨©®õ5ÊTO{ûíV1î#ÃÇ©~â¥\ˆ…YE¸#8CØÍC>‚PÇqj(2•è ‚Û)±lÅ Nÿ‰ÁÜan]»†¢eã>RI:»:yúñ'xî©gè]¾Œ‡·?ÆX±X3D‘šv¾ça[kׯö,Ž:L©hqøPŽL[sçÏ£ì–Qrä‡}0Ðøãô¯ çóttv’HšAð÷ír½2Ùe½4¤R <Éù ç±l›þþñ̳ݸe·ÊÉ$‡çFFˆÆc5•\%^)„¸n™îžV®^ÍÞï¿«ÍuÖóÑî÷‘•„•²WFA:“ dÛ5œ×rb—Jlܼ €ûï¾{ÌFÓ4\ÏåÃ=3»½ÎîÅÕ [ﺓo¿Þ˼… XÜÝÍp>OáÂ%ê¦èŸqí†ß¾¥T*EnàŽU"U_?ÞÃàÀ¾ýl{ð6n¾ Û²Èõ°ë½wÉ´µ‘àÍW_G×õšJ4 7ÛÑõdç¼Û"‘"$¢GˆGcU¹Rˆ€0¬ ihTÇX)…DÕ b±(†n ¥äÒåBþ@®{ 'RJ ÝÀ¸º£5E(Q#ú9!)×'>¬„øA@†5N7j†n¿'“¼øÚ+ô._>m¹ß²~ÓõA"Z„·^ƒx]¼fnÔ¢º©J¿2€Ðóý+º®saäJ)Ô4ªÐ´ñiô ÀûsäìàüÙsF“¦Ù¨iÿ‡I)+¿Ÿ=sp4 ÈÖ'“}ÙE]÷%f¨È4â+†Îðo¿|sñrá+`P›øý¦®‰“Ì©ºv#€\NCÀ™É7— 4Í@ ˆMD%à2PJ*ZH}YåhIEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/picto_ampoule.png0000660000175200017530000000523112664543647025630 0ustar guillaumeguillaume‰PNG  IHDR22?ˆ±tEXtSoftwareAdobe ImageReadyqÉe< ;IDATxÚÜY[l\GþgÎÞíõ®cÇé:‰kâ4m“&©Kˆh „^ R".B¥Ri@í+<𠉾 ñUAH•©ˆ(¤*ISÒ6Qš8÷hc§Žïkg½Î^ϙ៳svÿìÚ»[Gú5;çœù¿ùïÿaRJ¸û:-\l‰¹yÉ%æ \»Ë¿|ÐúÅywMf¹Wolèò}BÌ`œkbd¬DB&›•”¯&,c¤ (ʼ"ÇE @r9P–ÀGÈ›{Ïjñ˜¶õo›c€lH2¾&APæ=†ý„z¤ ¸DÌ‘ zôÈ& ¨êÉOÄAO? )hŸ²  (o¥Ùú6TŒ¯ u¢ üšá¡°¦äƒÂD‡˜~ã1¾ú;§4ž$<ÆsHYM~=çú™wÙK9€F%bªRP3AjÓc»#epÅ™gäg/‚J.<ñÂ߉4rš2šôhÕˆAãN=‰°Eb-IÈé·iæ£HzTóv™Z'S'entã¡`™™M²ØŽ!ßõø:Sx뎠(4¯Çý,«Áˆ$‰GÛÝ0ê•<žã1¤¸cræðgDêÝ'YhS à Á»—.Ž‚Ì]U+_ç½ß{ |ñ¼›"t[i &c€q*`BÛO$Ñ®% ˜_Ô©F1üò·€Å7±öÏ’uðï ÿÎp”¸·´+6kOƒHŸ(ðûž=ÄÚÁ;sH³dLi -ɉTD3)Š &H¤âé7^~ü}YxcŬx$GÌ,¤…Š)sÀ´@¾|+ÇöÄÄë{ù} ÀpâžM·Lc '¬ŠÑżC§FîÙFLÌüu;ðUY¨BZ1¤ü—¢n¤.=öàýUHlÐóØ·ãZÂ1boaâÎ=>LþbJÄoñÀÄdêÒnÖ6XY–£ùpÅ8òÄï(“šƒ…šÈ»Kï¹ï#˜ÈãQ1ùÇÍÞšD؈K¼Ï| ·K£8 ~®»“ÚŽ’ˆVþáÃÓFFñÄ%kCæ#%ÕRF£šK†<ºÀâ%ûQW` ÈìÄf½J”¸ò Ùת‘)4„×ñ\•’K0dÂ[V2¼­eÈ‘”‹xqu_tí'\>2ôr‘|³_ï!ÒÔHwx365r«ªˆ.‹ÙþÊÙ0Í ž¼ëv­:µ–…Ï.Wbea®D©Œtéiˆd~C¼VáÆ›ˆì>Æ'ç/­fþ•Õ¯1º/YúNýM‘,§\2¾§y冀²7ú¥ ñ”Vœ­¥\‹é{ Œ³×ûxojÁ1E¬Äøü$ÞÂ-Úð s ÙÒ¼£‹¼¯cÌÝ|QI°Å4+‘Z€¸æ¤~A>v¥Ä´úM‚,ΗÙ’£ç@:øÛžÁ{£¥hŸÿ°–·\ÀrÔì £èŒÖ艎ccÖ,Þ_±d½” ܨ´ÞòÚ€žµÀFΠ7Æì$wŸÛ¥çëm™—F%"òS€Õ–ƒâtõ+±,‚\˜áÏ‚@ .*Ú‡waÒ1Žj†™‡ŠòÒ©®«‹)iìÝ2€£©È:6O¸ê ò•WEÄØ1¼uùKÖÈ$p.0M‘ø«Ì™Ñ G>5Nê"ÙoI@¼Ai8$×ñrŸ< öŽÉÌù/ù« ç^Ai¼ƒ¹#ªÐͳ¥œJj~Ôˆs&ÐèÌóèœÙª]Xèþ¤žå 0öbµÈb6" ;„WÕåXû¦1{´—eß«˜£'Φ€åòÈt?ÆŒHÉ“¡ 1™™üº ä7?¦Ð—ÏZ™˜Û6¦÷õŠ®¼!™ºõûb5š½¸Rü ïùÊeSù˜…z?ÿJ%âÚQ`6¾}Ëåø9LÎ/ã®I`m U ÃÚ6ÿüñ‚Þ#£÷È×®C@4㵤!R*MýñÖ¶ñºÌ^ÝÀôù0Ì”ÄÔ(ðªQb%ˆ‘û0Šs˜•`]s >F ½¶TId%¾qVï›&eožìë`š²O”´ãá5 Ôf)«ï»GA U.Aé 2×1 ¾<:Œ#JÆ÷‘{,Qå>Xô±K,ÜçH‘b*KÔ«h¨VC@¤Qð;¯ÆN¿sœw?uBš\ÔX­ŠTiĹ˜”À;Yù],¾ÒVï·ßט%eî‚Ä!½.ÙŒP‰Ø†¡gtª6㉯¿Y&w1—áj)ÙríÈ•Ñ?~UTHê2×+q3†ÁÛ­HÄìÓ:¤ôÌé¦@Z7 Ôæ3,¼áŒØupwW.TwvÑia†ÏÜçR»Þó4º<˜Rkèµn“ÆCŽ”»N&wSQ¯•#}¨”V‡$ ¯;G+k†ê#’²Ì´"5w« ϲØ8V ã¯i-‘Yb#f÷D´e ©ØÄNî”í™à«Ÿ9% ÈxQ–Aæö4«(©ûžoåe"¤ÑÊ’ÀhJ£¥N£$FÆê<+¹eþSõiÉÊé2DrãbAVäŽhYÒòÉÕ° §ÕÈ^«Ç*HCj¶nœÐUig˜UiÚÈŒtw‘xÖ¬C³'JªÆ|ÝCÚ.h»`tí¥¤ÑŒDh7Ü6l§õ%tœ‚ìÜ^IjI9_*á]æóÔøyÚ·éùãK|Vpê|øiª÷ÛÒ‡žñ¿ü~¬»ÿ!µ2Üž‡k/¢‹A4ŸÞÖA$Ö…L ÒÓ·Û÷µ—~ÔÀ‡žE$ÑÚÇPº·§R±í-ýÓ!¬E|®îÌŠ[pb$ ‘ž>ˆr[æcʦð$‚0=ÑùdÀøô&ùôÆ¡¹KÖQ+íÍÚÃÞ} ƒX¿ æffá7¯?¼öœ~ã0$§ópÿà— ÜÝ ù""F¯#‘†@´ZêJÆö`¢wÌÆô¦¨¦þö‡>ýYê?lÙóUøüŽ¿Á† 0?5ó³påÔq¿~œ´Òé' ÿÍÏÓ%ƒa{ª6D`ìÕWuc­†Gw?ãÞ¼ñþÛ+ WÆ$rÛÃÂÖÁ Ô–‡xgfo&ûèÇN²žþ–r î ZÀ E¹õÈï~gÏ Áƒýq° 98wþ\¼xúÃaøæžµ°yçNNyóÄ®ý?‘˵?‡e¼~v ;|Ö¯î€èŠ~¸ùóP,Q:ºhú`í#Âúí_„xO-çÞ>Xæ‹í—~ýý>Žòþ?ŸžüB»#€gó0\LÂá#¹é±~~’ƒucçsÏ€WÞY¾}kÇ‘¥Ô¨’©L™f4Ñ¡C‡rÿL«Õúy@@Àv£Ñˆ³gÏvÚ¾}ûË=öX2€Nünè'¿…1üöAŸºÝîd·(Mx=zö,²eÚl¶Ïƒ‚· <#‡R;}¹fíËã‡úMù¼bY´h‘1öoµKáy¥¥¥Ö²²²ò={öˆYYY³!J)(¥p»ÝAf³™kÓ¦Í)ÅÐ#I-Ü9|”Mr»ÿ­v)åpñbžµ ¿ |Ó×Äc©Gf¥„Pˆ.1È`å:wíú›ðIæÎû&€ûXë¾éçç—  €óF6ðׯðÛ½)3v»„O«ò¤©S—ü÷“϶ñ<Žr>j 5|ʲ ·äÆË—ýøþÛïä^È­—ÏÐÐ Ÿýå á“RJ ‚`50™LÞÍh4"  Í˜1cºe ‚Uõ”RpçÝÔ×A€¿¿¿WÈó|öxê1yž÷///Ÿ `€ÐÆlÌM‚…<嬂`€A³ ‚AAmþ0çþ®¶fͲyŽÇ)„j6ŽS„ÃyÞ÷÷ RH)d¨ç˜åü‹ oŸ¼Ô À«^»Ýœ’’2ü¡‡úëÖ­[§Y­ÖHJ©Pwh¬FƺtéráܹsE.—+Êl6{#  D·Û Q €Cr»Q¿% ¼Žã@)UÚ%0ÆPZ\¼ý‡­Ã_þûëýϪO§Ù#9Ê ›šâý‹!áöþÒNž*ª*¯Œ2 Ê» Þë$Ipƒøä ŒF#Að D–eï¶iÓ¦±íÚµ3¶hÑb·Ùl¶qgR?P#õµãÇû§¤¤Lå8΢S{\QÕÿ±04fcnhs ª¹qdHÞ{ó­±Ýc{Ûwì°Ûâçgx^áSs BõܳûÿŸ¶ü0•@µ7cdé†òÉ«]ƒV Œ1H’¤ªSHKK––6@­}”ÆÔÎI´D©]PÝ}<Šo’à8J÷Q[ ŠHd¸Ýn!eßÑ)ûŒVÞ&—9óŠ„xºZ;"3"\ëdçµ€Wïp5¯PDñ^H5š¨ïÕjF¡Bjå(j¨U¡(M”RPŽ‚ãh­›‰1"*C–´]JýPºB<œZÓm©\Ë2¨|ãøäÕjO (* @Œ‰‰É•$ÉqìØ±ˆ’’«vŸKšä9†*‚ºÇ­ïøç[mc.§Ë.3ÙK–§£!²$ùCMroàýÆ×ꇬ¨¨0¾ñÆ3Ûµkw1##£]qqñ\ŽãâFc­ȲŒ¢¢"I’üeY®Õåhsžçkå"MuBPR\l|lÞ‚™1±±>ÜîÂùܹ`r¼À J—á‰6 y.øË²rC1°Zù,6ÇÃ%×®±Q+‚¨¹Ç Aƒ²[·n}ö‹/¾h»cÇŽW ëî»ï~£¸¸¸ç‰'â***À`0H÷Þ{ïÁàààt(Ï/Ô;†=zôh«7NhÊÑP/%Ñd–&N”Ý¥{·³o¿ñ¶›¾úZá3(0ëO ¼‘{þ|Ï}»‰+Ì/ „Àh4IO¿¸ò`D‹>ùüeÇ®Vï¿ùÖÙs®¯@Ô;ÿþûïO N°Á‚Åüñ‡ÃÑrÞ¼y?Èp [·n!ï¿ÿþ”R¸\.îÓO?½çùP—ËåeMHÔÜI’$5ÅiõK ´×ócxú…•©-"SìîõWŠ_úË_çTWW·üËKÏ{ùì7p@ÈSÿ·ø —ÓɽøÌ³·ŒÆP—ÓåÐv1êñ)(\Ngè¯1*äëŽF‚ƒƒ³ü`€êÙ³g§è@p À™fÍšñ²,¿¡þ_ee¥Y’¤Ö’$ÕÛ½¨ó"uÇñMJÛj8hY‹Ï'ŸY~ ŸÍ#ÂyYfoP¢ô&e¥efY’[ËLé²Õéu•SêYèS§óoxµ!šÉ°2g ¨[PíùxÞs ’¤LñZ­VqÁ‚{ $^Þ¬ûµ×^›m·Ûý !^q—θ65h“SÏ€õªød`¡hÖÌ&¾òö›—ðùðì?ή¬¨ôWB¼Ý »ñD{Wÿë_ÿSZZÚÇn·Wɲ|ÉÄ Çq0 Þÿ©¬¬^xá…ÚÙVmbªF uÔÓÔgRÕ.FI:e‹–Œ)).îS]U]¥®êüG)8ž÷D ´¤Txpê¬JÂ/«%Ô;}_K„Œýze„„Š¢ª®Åh» õ"B`0¼ÿS÷u»õg]Á5E¨eÊäÅ…ìs¡nI UGxÚùB$JÁKž÷&›J4!` Q&Ä©æØ“@ ¤ÝÅð^DuÑ®n>áU¼æ9uíÆ;DÓÌšj§ÛU4uqus/¥½”r`ž|³Ô®ªDõ†À…LY­cªSêj2deÁîFw1Ú‹I)­µ8Wu÷U¡Ýÿ’E%MÒþÝ$¡¹è@ ž1@.Ù„ÐZk-€]¨vgµÛ¹ä†»ÒZNCÁ ‚,Ër/íÅSEp¹ƒê^ðºû©]I]!¨ÝVxxx”GãšÜº¿ÙbN–D±ƒ§k cE½ ñüÐŽD¦¡NYƒñ¼¦9†:±ݾí ã“0Æ¢ŒÀx…ý N©¾ƒ’á7%4)> cÌ 9®1î”Y‹P†}M MŠOÒÔ§¾u4 MwBBG£@ˆŸÐ¢Ã'tèð ] :|BˆŸÐ¢Ã'tèð ] :|BˆŸÐ¢Ã'tèð ] :|BˆŸÐ¢Ã'tèð ] :|BˆŸÐ¢Ã'tèð ] :|BˆŸÐ¢Ã'tèð ] :|BˆŸ¸¤N*,\¸Ð&Šâ7Œ±ÛÀd2%ß{ï½öîÝ;@Éõ衇Z)Ëò£¬„ÊÈÈÈ·žy晿AqVr5Æ9nŒ<Äæ°;¾‘eùv@1jzbù²‡ Ú¨|Þ‘xûJY–•eÙJ)­Œn×ö­Uÿù¬A|ÖAc+9Ž»]µ!s»Ý½RSSWhF²œX°`A!d¹Á`°ªFC¹¹¹OìÚµk€ðË}¶[n·{%!ävÕ*ÄápôJÚýó 4"ŸÃ Žc²¼œRjõT+ò?“yú‰M_Ó >ë ƒ!€·‚$IÈËËë € P*7þþþ!‡Ãksƃ(Š0ñv{ÎáhèynœGQSqH–Ξ>Ýè|V”—{íWTK£©a|Ö«*«ÕzJµ(30èܹs%”²–µÄƒ   JÕÌH=Á`@PP@.#Þ[AA§ <ƒ ÀÀ 0ðëHllì»V«5Gõ£kÞ¼¹cĈ'¡‘îê¥K—¦DDD|©­w_бcÇ,•Üqž›ƒ†Üñ®-Ø–Ãy<éZE·v̸ïÞFåóƒOW§DG·ý’óxÕpŨ±c b{Å5ˆÏzUuæÌ®gÏž¯3ÆÆšL¦°ððð²cÇŽÅÇǧ{NÖpuïÞýMJiQuuubdd¤+22ò'„shBIê±#G¹ÁC‡½îv‹cýüüÂÚuèP¶÷—_ŠFŽÓ¨|ö4ðM€•—•'¶ïÔÑÕ¾c‡óY«€Ì¢E‹l²,ï0 Ý=‰#ÀívÃét‚㸳³fÍšÞ­[·£h@ö½hÑ¢8BÈ×F£±¥ÇÞ²,Ãår1Vÿðĉ7C)4{ËVÞ?b”Íåríà)×]àyPªät²,At»a4›Ï>¹|Ùô¾‰ âsܰ‘q²,}ÍS¾%Ïq ”@–Ü’Þ 7öá?Îèºø¬Õň¢¸ƒRÚ]ëÔÐu:mþóŸÿ¬Ð×éýÈ#ÄI’´RÚ²¾«n·;x×®]oݺu&€ºŸñV‚ÓéÚAA»«5NkŠ+EíUÕm^é•ñ9vèˆ8I·Q–Jf¥¸Z‘ÙåpoüjýÇ_®Y{]|z#È£>º’Rº\Mµ6©ª©Ëå‚ÓéDûöí÷-X°`>€£ðù.\¸Ðæt:hÉq\îܹsïŒMƒB ˆÀ6AT§MÕ&D5fEN§Œ1׸qãž2dÈ¡ßR‘dìá+ÁØržç“CJ½‘™Ì yL“Ýn7zöŠÛ÷Ü«/×âsüˆQ¶j»ã0d¹%/¹ËŸ]qçíÔâsì°‘q²Û½£4@=j¼ÆÌn·”ç]³ÿøà'ßsM|RX¼xq[BˆWZe­i²:êÈÈÈè›––6@jyÏó-=ÃÖˆÒÒÒ?h Ož³hÑ"!dµ &“©Þó¨ç0™L „¶lÙ²2''g0€ ÜPÛœÆÅÄQcÛ‚±å/@à•6r§mŽràx%ùWß?”|°oêÁCµød ÷p„´äyL–#Š kñyר16"³Õ<Ç‚z­13žç”s˜$>ÿ䳕§32ãø¤ Ëò³ê¤˜záÔÊ¿jYmõâ©ïûí·è Ï0-22ò„ö‘‘‘­ LÐJƒÙJžç»Õ¡Öu³®HDQ´nÚ´éI˜í Þ`È’ô¬rax<ãÀS<çÙ(ã”÷<û¬þàÃZ|¶jÕê„÷ü?Ï£UëÖµù”ä•”nÚ¡3Ïñà)õœƒ‚çxÔ¡¯ À^]mýäï‰O®ªªª-€ÔùŽV­ZUÙívƒ¶Z²ú{tttYii© JJJÛ·oŸk³ÙÒ”0 ðÂ… Btt4ß»wïâÞ½{'8 gÉ’%­|¦ž£S§Ne&­µçjÛ¶mYII‰ òóó#Ú¶m{ÞcXTŽFš–¾Q˜BPÇ3À…s9¦³§Ï”þ¿¿üù¹1ãï\ÃQŠÔC‡¯šOnôèÑíæÌ™³£K—.9¶ر}ûö?Ȳ¬Ök—e‹Å»ÀÖvíÚýqÖétFüøãý\.W”vT¢†7·Ûͧ¥¥ ìÞ½{Ê„ 6÷ìÙóLQQQÊgŸ}6O–e›6 ªQËårÑôôômÛ¶ÝÒ³gÏM6›í<€f±±±™Ò4þem´Î¤YaaaË?üðyþRü‚›·ü™kæ“B™˜)2Õ+K’t·ú¦ ’ ^‹‰ôôôöZ°B™hi9räÈÕ‘‘‘ç²²²š©ã8dee†‡‡gÜyç_WWWûegg÷•$é>õýúD¡òBžžž°sçÎ{BQºóZ¯Öo€Z|ÊL¾›Påb™,fÉd1KêßG”\@Ã'k9eÖŒÕÑÚ;qäˆÂ'§ðu<õH`«6m2þðàœ¯ËËËüÒO¥õ•˜tå(8ž‚r„óü¤”£ Ž÷˜q©‡%lZ¿ášø¬5íºlÙ2›$I£Ô‹“ß­[·luØ”Åúꀘ˜˜]Ÿþù8·ÛmÔúǸ\.îË/¿tÛm·í{饗>tèÐ@u®CÝêšiçBÔîêðáÃwèæ!ñ–Âî™bs‹®QÔc4pÈùý Ȧ„€#i'NÔâsí¦ Þ¾ë/¾2Nr»ÄcGF :Ü;ûÇ ø~‰ûþ»á«‡Þ±s À©ó8ÏyÔ#¤fÎÅ3››´s×5ñYK Œ±{Tq‚ ÅÇÇïÓ§ÏWÇ9Õ×wíÚu;”ì—PðÎ;ïL—eÙ\_—a·Ûý>ÿüó‹‹‹íiiiìv;Ô!õåŒ Õ£ %''§¥§AÁ×{¡~+0I¾G±/¥0šÌÒè w9~ÜW‚`p*݇ÿmØX‹ÏO,›îvKfuX¬Ý*Ê+üÞ|åµ .æÛSSu¨ª¨Ç©|rPÏ¥nêkσãx𼀌ôŒkâ³ÖUâ8n¨úY=ò-Kz@@À–ÐÐÐ/<ï#==½€–¬K—.íèt:‡Öõ©Óö….\h{ìØ±‰êqUÔÌÑþ­ DÝ’““„â×ó_iPžª¶iàÐ;ò­éÍ‚ƒ·Dµnõ…ÚÞÔƒ‡¼|þáî)íÕÕCÕ.ˆZë'¡g2O·Ý¿gïDB$·äZ¿$ÿÐpªN½sž™Ü]Û¶_5Ÿµ"ËòXBxžw'&&‡2sw"66öEJ©‚¬¬¬H(kA”ÒIõ]èºxPÁÿÛ¼ælæ™ûÝ.(9%¶g¯¸ÃÂBO^,õ< Ìg(þ» T¦°˜-RÇΫî1lݬ9÷¯™7ó¾—ÁšGF8&N›’é–¤ &Ë^>¿ÿfÓm9YÙÁ o}òá5óéˆÑh q»ÝA8p`µŸ†'Ó}衇–?ÿüóã%Ijæp8š°-Y²dóÑ£Gïûæ›oV‡……•÷ë×/‹1V)˲˜œœÜñìÙ³ásçÎ=²À gdY~ Ù®]»@y,PRR’››û¤$I€ò@ïÿì²D}Ë<†h¶XBìUÕ FqÜÝw]Â犗_X>oÖìñUUUÍìÕÕÍØ^}ëÍÍû~Nºïƒ¾µºUt›ò1Çgɲ\)K²¸íû:ž:q"ü™—Ÿ?Ñ"RÃ'{”á®i“3»Çõ¼„Ïü‹²Ïf=)Ë ¸>½ Í9þ<† ¶ËÏÏï8€Ãžƒ¨q¿°sçÎO8pàm‹ÅR %D9»uëöÆ ªGŒñ]xxøÏÿ•ñ<••õBHHÈA(OUïPèr¹*;wî|¦}ûö©¶øšÉš„„„ýG힟Ÿ?ÜsþÓP&tn)DFµÈÉ<•†)³¦ï  ¬—ÏÞ‰}ŸÚñãOoûùû{ùìÛ?ñ‡ÿõvõŒîÿ®U›Ö^>&ctFZÚ -"kñ)3¹²Gl왘¸Øzù5~ÜþI{»ŸÏɹ.>µ¡85ö…â-¿ÊDŠvµ¯€~PÆî=› Ê2u,”°uбžÊ|¸g¿“PBZGC¡ÜI;œEm;O@ƒ<Ÿi+€´«mÐM„&Á§V ÊJ çãÒÄA³ûCQi©çCú{þ¯Êóºì9^”GéÊPóp®?”aEÑõMÖ=ûž}ëÁÞ_M‚OÝõR‡Oܲëøu  D‡OèÑáº@tø„.>¡ D‡OèÑáº@tø„.>¡ D‡OèÑáº@tø„.>¡ D‡OèÑáº@tø„.>¡ D‡OèÑáº@tø„.>¡ D‡OèÑáº@tø„.>¡ D‡OÔ* 2þü{DQ\W·Àc „ÊñãÇß5vìØdÔ|_T‡ í?ð—˵@½|>øÐŸîºwÎ웚ÏZ¡·¶”o[I’üýýý§CùâðÜS¡·,I ”‚€xl:>eÆüoz>k ÄÏÏOð8Ky눩å¡Ün7ÚA)?p7iƒn&XüüI’ÀQ¥Z2ÇÇ…)œÚl¶›žOÂÃÃ?|Ïós CÇqá‚ xKJ©öš¢(Âjµ–;΋•••’$I ¬ PÞ¼yóµË–-û@n¡êAW¨ACî!„Ìx>N–äpŽã@=mµuÙBÃÃÊN×ÅÊŠŠóI8RÞªUëµoôA£òIæÏŸ¿Òcp ÕèG­DÔšE.— ¢(B’¤KŠÎ] ´$µk×nÍ’%Kžƒ›ô.º 0x%“åå<§–Óæ@½à‰ ’¤¸A)\20&_¿Ï yo g IDATcÞÈÔ½GÌš¿¿óV£ñÉSJj1~5zh#ˆú€×€ðJâÐÕ­’$A’$œ?þn›lRCë–!äQÞã2Ås|M1~R“ÓFA {ªrÞ¼äŠ`»ŒŒSlÎ2Ó3•O^«jôS_1~õ§Éd’¦M›vÜh4æ¯^½:±ªªÊr¹ò‹jƒg̘qR’¤2Y–k)9%%%úÔ©S-=uêäÆhÐo žR+Ï xņ֩EϘ²™,é©gW·øùå?óäÒIJÒR <‰¬ªncXöì3'EQ¬Å'ðÓ–¢ìÝßR’%H’»Qùäë–¾®+!!!ö–-[°5""¢âìÙ³wÕW£S3êA§N2üàŒvŸâââ¾™™™K5‘)J™¤[J×Âi /­I-[µ´wêÚå8€­ÑíÚV9”zñ”Ý&¨=$öŒzÐ;¾o½|æ^Èí{ð@ÊRÍyO^õxQG.À¥cv8þ¼ÿ÷ßߪ´´´cVVÖ°Ëå׿yyyîðððT(¥½ãüÌÌLA¢çœ‹¤[ZSÁˉƒ!#-ÝÿãwßoUp1¿ãñԣèZ4·žýe&ƒI2Ξ>ãnÓ6ú>§¤”*Sk\>ùº•’}aÏž=‰Œ±D5G © © WTTóòòÕüñÇ#cív{¥$ILSÌ?¨©Ü”@4¶—kaJÜÿmؘ ‘z¬;"Z´¨ŽjU͹¸ Èx&33Ðó ž]¶|!¤seUU¥Ìd¦í§ ”â1¢;ßvÕ¥­µÎP:t8?lذS¡¡¡yòà©ÎW^^ºk×®Á‡êÕÕÕQ;«I-!’$1æVM ŠëSãB]0Ї1†¸¾}ÎÏœ}難V­jñY\Xºî¿ŸÞþÃÖ„T”•[$YòðYsƒñžÔ€#{Ãñ¾L}”¶Ôdß²,côèÑgããã“$oܸÑzþüùƘ-$$$mòäÉkÇŽû]hh踟~úi®,Ë‚**Y–kY~¨£¡&A<å³}EdªìFîÿÓƒgG— ùý¾eÍLˈ`L¶…GF¦-ZúÄÚ?=¼à»–­[[óÉgsí»Â'e`Pn8µl·–çÆÄ5Ç4hPN||üžC‡e®_¿þ·Û®¾—““ƒ“'Oôë×oñСCW•””ˆûöí[Äó¼7QIã¸kÚÝb¨káq)B€É3§åŒ?nÏΟ¶e¾ó="º\^>OgžFÊþä‚qw_<õÞ™« .æ‹›7~»ˆÐšJ¼jBK(<â¨ÿœ×ZŸKC}›ÕjxøÌ™3'¾úê«G%I ¯kÿát:CwíÚõþ±cÇzŒ9ò“ÀÀÀSÇy»UÓe­%È•òž[ Úèák³…4ïž6ùð±Ô#'ÞzýŠ.W¸7"eíÆá°‡nøjýû{Nêqïç|rŠz ™¨ó-œg2ÎkAÖˆð)7í5&&&@Æúõëû3Æüµ¦?Ú 6·ÛmܳgÏ!ÁÁÁ뀓 ­‰aS€ZŽOõmJ›î6,@Æ»ÿøg€ùóW(ç=–ꊋ”$ŠÆÍ7-Õ*j%¥à)U½=.ÛQ\¬êË{ØßJ¡„……åH«¬¬ŒQÅ¡µb׺^FèÖ±cǽê‰.g8ÔÔDrÅè hÕ¦u>€´Ò’’ê±QW ”52ðÊ9÷ü…hÝâúöÙë9ɯYcኖw¢F– $I ×:B©ÑCýÛcªlкOŸ>y ]·¹Õ@<‹r¾. ɒ§(…«ó&<¯uÚR&Û8ÅTÙ õð1£ò˜7‡©çø7@ >“Tí¤Wuu5Àm2™2eYn§}$@%F펢¢¢*¿þúë^¿axAáµ#´î¼¹ç§ TVTòÜ«%Stº>53ÓŒyVÁжC»JÆ÷ÞüW/Eä’|ƒ€€0ÒèÏ^u’š––À¿eË–kêN®©›Ú}ÄÄÄä(ÌÊÊt5ÇnJ¸RB¡ü<´ÿ@ÿŽ:¯¡„^âX©ºVr” ßÀy O;1ˆ\éø¿f£½ˆéééQÙÙÙ=fÍšõmPPPŠÚmh7Y–ѱcÇâ„„„”‚‚‚¬ÒÒÒqMMWB}n•µ6áá”CQé'OõxüÏO}ž¢,Ôi†Ç„€ WB|ñÈ;Ǧ\ÈÉÉ**(G ®pŽÆÄ#ˆ:¡”âË/¿œ“ŸŸßnþüù Ûµk÷ƒÑh¬V» ³Ù,ÆÅÅ]˜4iÒ¿¼ÿþûó !þ—KL›j¹"ŸÞHKðöÿ˜““}®Ý‹oþmaÞq?øùû{ù ‡yaÁâE;üò—ÿ·|>Jkº¢_ƒÏ+N”i…R^^nûôÓO_5jÔã÷ÜsÏJ(ÎH ˜ß@YQQQÖ{ï½7ÛårÅÖ]!þ= îç|xÖéÓ=ó.äÍeLöçÕ9Ëqª9oc‚7ÉziG#µ\g¥—eÁ­  `pAAÁàK ¤–)r}"Qî 22² Ê£qRÝcÝŠ0[,É’ÛÝërCNe8 e“$H™ŒÜœ ƒss. j?5Fñ>[Â×™h¬s`€D·oר|Ò;ï¼óA«ÕzZ¯PT7µOT?,­â´Iªö}í$[Ýãª7oÞ¼jÆŒû 81–6Fƒ~kÜ?œVò©›È3ÆïJ¬†/J¢Ž„5ùŸ'©­ï&Ó>LÄCë¶ÑUÿ·ì‰Få“0Æü¡¸)€âýk>Ùå„Ò˜]P¾r+šÖE“â“0Æ'Å0A¸ ?÷F„EéùP›Â¬Z“âSw½Ô῟ñ§Žë‚.>¡ D‡OèÑáº@tø„.>¡ D‡OèÑáº@tø„.>¡ D‡OèÑáº@tø„.>¡ D‡OèÑáº@tø„.>¡ D‡OèÑáº@tø„.>¡ D‡OèÑáº@tø„.>qÕ•–ï¹çž!„õ”Ò€ÆþŒ±Ê¸¸¸…K—.Ý廥M¢ĕзGÜF€kì¢/ Ö€€í[wí˜ à"ûõëªâçç·>(((À`0\ï¹. —Ë埞žþ.€I’5úIn2ôï¿ØÏlg4½è‹ÌœN×à§ÿß²×V¾øüŸ¤p]ϱ®Z AAA6› <Måݯ n·PÊ$Ü¥|A“HP`@A04z&ÆžG@€µ€Ûä(¾žc]õÕV-ËnTÏ<¡,7ä$7,f3ïv‰ànDý6BÀsŒF£ @0Óõêšýbn<Çn2ÎSWBMÙÊÓ\â1@MÁ«ëÂu÷Ó§O¿ÞõbÕªUµ,XO ¤öM7jÒ] >æÆÏ×ãhµY#hÏ+‡zh¥t’(гf<ðÀ?C± —AÊËËžç›\%Ä‘ƒ† ¡”Nr¹\³†1c韗×âW0ºØXÌfp¼z܆›_¸p¡MÅOŒëÞ½û«………‡“““×¶lÙrɈ#Ö( ×mÌ'Ÿ|‚ÒÒR8×ïÝk4›\AÝñÃGÙœNç'L–ÇÅ÷K|5ïBÞá?m_Û¾C‡%“§OÕð©V+Tro×~…j»¢(^÷¹Að³±8å)¥CyžÇqN:µdذa›­VkÆÆ_#„áÇáiTíäyA’®ÊBuhJ C È8ްϾ%SfNß`ÍXýþ‡¯BȤiS¾PHHíZªÇÃßb,_I0J‰RÑsÜÆ¸åx+zôèñQzzúJ)vîÜ9êŽ;îØB)%7n|†þEÝ2Œ3fÌhðÉ?ýôÓ&AdY^‘Ð/ñ£ƒRæPJ°~Í£&͘¶…PJV¿ÿá«À=Ó¦|A)G‘¼íqÏøŸ{óº¯ëðÙÄh4ryyy#œä±=ÅÎ;G 4h lÚ´éUBüýýgÅF,zWVV†   &•ƒ wöô™‘wM¾;éßlLÖ¯ùbÄÝÓ&o!”`õ‡½ 47çåä4j»«ø™Íàˆj÷Öðc’”””›6mÚd6›MݺuËØ³gO‚ZðvàÀ[ÒÓÓ#322ÚwêÔÉ$Iìv;cp:(--…Ãá¸î“›L&Áh4¢¬¬ Ï?ÿü*oØßð¦ý6ص}GÞyo“Ùd2%ôï—ñÝ7›d&C’eLœ2yËÑÔÔÈãGµï7pÀ/gN¥qxøEUöêç ~f A€(Џ}è™ó}øuœ¿žcò±±±™Íš5{`Íš5«Nœ8Ñ>11qÏž={!صk׈nñøÅtëÑ£!°ÛíAAA ²á¤”z«¦‚ƒe†……=ð·^^µ?ioû1îÜóÝ7›!ذv݈»¦LÚB@°g×îÝcbPZ\ŒŠò ð<‹äDhJH-³ÈÆ`U-¤kÍÎÎN\»víÇ‚ ;wÎØ»wo‚$Ip»Ý8pà–“'OŽÈÊÊBLL ªªª0zôèk:Ñ¿ÿýo¯§]}(--ÅsÏ=· ·xÒñ[ÓNžL|ã…—?A蘱ÙIdIÆ„)“¶¤¦Œ;uòdHl\Š ; ß5uß[¿ÞäÓICEô2(ó¡GA(”j¼­ZµJš2eÊlQÅ“'O¶ß£Ž2vîÜ9¢yóæhÓ¦ > ??¿kžÜ*++kPø¼…ÀTtìÜ9éÿ–>9Ûív‹É{ö¶=~ÜŽràxß|ñ制ÚWuèØ‡Dph¨wȵ¨rØ=>¹¾|cC´•– ë¹sç×®]û1ÏóB—.]jE’ØØXäç磴´QQQHKKCIIÉUÈl6#00&SýË¥¥¥øë_ÿº ·~QAXÓOžJ|ã%%’ôIHÈØ¼ñÛYVr’þƒ ?ï"Š‹‹Õ" ÇŽGYYÙUÜ ð·X.»>&Š"úÝ1(sîà A¸+Vhÿvæ·lÙ2ùèÑ£w‡ÆÆÆ¦æææFBpþüyÄÅÅÁáp@EøûûƒçyøùùÁßßßçf6›a0.ë<åt:1dÈCPÄqázsÂ’ß±sçä¤?ßy17/tÐÐ!©g22£(!È:“…þƒÀ^¥LYÌ0Y‚Ñ`€Ùdô¹™ F¯Å}}|ʲŒ–mZ—ôŽï›à€Šëi@ÝŒ¨hÙ²eÒäÉ“gK’T«»éÑ£ ™™‰'N yóæ†Åb¹âf2™~k. @E‡Î’}rÉl·Û-Ø»¯ýÈqcöPJ‘x{äž¿€ãÇŽáHê´lÝ ¡!a°˜,0Í>7£Á¨øÈxœºënšÅºáræò-[¶Lš4iÒlQÅììì°>}ú@Edffz½rÝnw­yŒ†nM^‘<òä’ÙnÑ-¦Ÿ<vÏŒ©™N§ÇRxܶy€R„6/4Ÿ@éåF¨I,KÚÙ³gqúôižñ¶Ÿ‚‚‚àçç§YÐr("éÔ1éá'ϰ¦¥ì;`=žz²$ƒçxXýý‚À @ †Fá³18õõ´ŠW$Ó§O_êt:½®R&“ ƒFJJŠ7šÜ ¹ÉáÉ¢¥O.]®*€€P‹Ÿã&NÄ®;a0a0…ÏÆèb®´RÆ $7' !èÕ«8ŽƒÁ`À±cÇPRRâM>«ªªüa~ðòé¸=±mt´ÅbÙlƤ_P”_«? *ÊËt¢Æºá®f)•p”••!//V«&“ mÛ¶Åm·Ý¦>OÚàô;ˆ *ÇùìsååEÅ ƒ¿ÕŠŽ;#¶Ooˆ.åÙâ†>ÈLIã¬Å\õZ»,Ë••••þv»ªå©ç9RØíö_`ƒÁ Ay˜æwa%Iî’Ò¢b8ªíàyƒ“Yy·¢¬¼á7‹¿Ÿ Ÿ×ÍéU?1Û¾}û…œ’$ÁårÁn·£´´¥¥¥p¹®ë‰z/!ÒĉO(PÝ ƒÝ"x{õGoÚB‚Hn7\N'*+*Q˜ŸÂü|¸œÎçroëZ6ýÞ?†ò ë^Q½Ϻ`‰P¾šŠÆýVž E»ñ;ù^ €†èÀÜÈÇ·8à'4à{1×"Š‹cs(_Mh̤A‰ñ;úfQ4`C ¿ ÜJÐÀoÖé®—:|Bÿò¶ŸÐ¢Ã'tèð ] :|BˆŸÐ¢Ã'tèð ] :|BˆŸÐ¢Ã'tèð ] :|BˆŸÐ¢Ã'tèð ] :|BˆŸÐ¢Ã'tèð ] :|BˆŸÐ¢Ã'tèð ] :|BˆŸÐ¢Ã'È”)S˜ê¸Àƒ É«W¯ž å;ÞoÚO:u'ÇqÔo»Ýn¬Y³¦ ”òŠóæÍ{@–å×\ÖSýšç{ï½×eîܹë&OžôîÞ“©6c f³%yÇžŸ/á³OLìNB0@­$É29äåsH¿¸Ýî×ÁXÀå }¨|îÚ¿§Ëà„þëüß#'O›Ú¨|òÍ›7‡¿¿¿ò!% f³9ÀP[d«;†…… ‹Å[©°²²&@©Áy’1öêU_m Ƙw0rÛ¦M›¶´mÛv~Û¶m†Ryç–I Õ £ÇTf aááõòi ´v N¥„†—OI’>à(J•‚¸u)eŒ)…?<|2Æn[õþ‡[ºÞvÛüÛºwk4>ù¨¨¨w"""æäät‹‹;Ïq\!”oñתе¾M›6§OŸÞ¡C‡BAª„Aq«„Á`€Á`𖇮+Y–½€Îƒ¢(¶yï½÷VÍ;wvttôîÆjÔo‰6m£ß‰xüÈÑ®cîÞjµÖËgttÛõ­Û´®8°gïðø~‰…¶ÀZ| ž› B/­6¦Ül€Ì>ž‡½ººÍ3K—¯zöÅçfwív[£ðIŸx≿FDD|Q]]‘#Gî6lØWB±ÏòâÉ'ŸühêÔ©/UWW£cÇŽ‡'L˜°À^x̆ŒF#ŒF#L&Ìf3L&S½›Z•HýÛn·‡}ðÁŸ9sævVÜ⦆~öÉ_»tëú…Û-âÁyswL5£^>ß]ýáGËþòç—Ün‰n?<kñ)ð< ¼ƒ À(0†z6eÞ}ËJJÂþ²lùÇ'Žk>y…III—Ë…gŸ}v`qqq着ª»$I’\.W'ƒÁp p”Rœ>}šÅÄĤB©Š\Ô¸G©Õ”ëB–eH’ä}O-ìÏqª««ÃÞÿýŸþùI2+Ҩ߅?nùÁ!I2îŸ6s`YyYïʪª»d·$ÙöNf“ù#Œñ”#³…“$§Nž`‡ ®Í'U¸á9„ÖÓeË 2£ DqÛàyŒ1P*¡´¤4lŲ§?^³á«óÉpvéÒå?F£QnÖ¬Y'—Ëåp:e”RlÞ¼¹÷ĉ»\®*Q«8ŽƒÉdJêÚµk €(f½N@±öP»—«©¨¬&Æn·”RØíö°×^{ퟋ/~ÀQ4 lÒo gB¿~ÿá8Nˆèär¹v»½Œ‚Õ|Ô{Á¢G;Î*§ÓYE ÅbIŠï߯>PO7S2‘AdÙÓ•s€Ê(•PVRöóþó·ÿÙ >y˜4iÒE_h¥”àÇ\:`À€b2=ÿÃy‘­=é•jžjß;zôh¤Á`pH’d¢”Âívƒ1†sçÎżüòËï<ñÄ@©/~KŠdîÂùõòùïU«—Þ9qÂUñI)¥TñŸ«'‚@&`£Ø½cg¤Édtˆ¢h¢”ÊJR{êøñ˜‡ÿøÐ;o¾ÿÎuó©–=rAQp>úàƒ>beï¾ûnŸ¼¼¼ÖÏ<óÌP’'”šb.(eŽ® Z¤¦¦vîÛ·ïæêêêƒÁÆ#’$AE¹ººPjvå]OƒnÔâsäà!OdÆð—§žî“—w±õÛ¾ç“Oâ)cy¹ŽR ™É 2°kë¶Î£ÇÛ\^VÖÂl6ÛI–!¹¥ó© „=8Ž{œ1???œ>}zpii)üš>².®6‚xr˜V§OŸn¥îǃ$Ip:p8˜5kV(s·"jñ)ºÄÇ«+*a2q`ÏÞÁUv;Ð@>€‚TÆ¡ä”V‡RRZÁS[™A–dˆ’¢èÆâeO^7ŸõN FPP(¥Zó þÎà*|Gê«{æë5•5iÐJƒš¬?X,fBad5§ðÉ'!ÊåV¹©·–œZn[ÕQP pŒƒÌÉ@ø¬W Ï?ÿ|(“65/“@]êD˜ÍfsDGGɲ,2Æ$õ=í>*!8sæLó¢¢"M‚¥Ld“À†7_3ŸÚèÙ"ÒÑ=6¶H–%‘ÉLò0éÙS™a¨ÑÉ‘C‡›çž¿àOÀÀXÃø¼\éÅóPfô~Ò¼VÑC £££‹†º ÀqÔÿׇիW?X\\{µ# [×Í'[4óû¯šÏO.{ðâ…ÜXæñŽi.' '¯ç€Œ1ìÝ»·ERRÒ,I’. u£‡væµ¾Ø&‚kæ“@5"ønã·-þ·aã,™10°:s£š?|¸ûUê[ ƒãû1ŽÖt’,aûÞ_|òI .æMœ>%ç®)“®šÏÞz·×Ž·vGm]êHóæÍaµZ½wwEE Yi¬ïÔ;Ÿ‚ììló¡C‡JŠ‹‹ÓœNgE}¸6bdddôÕ¾ÖÔ` ‚ÙXãöiw:€«àS9qô˜ÙÖ¬YIÁÅ‹iÕÕÕ—¹Akö?œœÒ—hþnêH‹-ÞéСCÌÉ“'ûÅÅÅåTWWKP2aãÕôÌ™3ÁéééÓ$I‚,Ë—äêOJ)x_[S†ŠÖmÚ¼Ó¥k—˜}¿$õ6zTŽÃé¼"ŸÞ.FHðÑéÓT.Yí´Cùéq¯¢”‚£œ7Á½!yì±Çþ  Ïþýû×:ôG(6¥—ÔÑ‚1†ÈÈÈʰ°°\—ËU!IR­ÙÁóçÏGFRJ¡nM5r¨xã½·þ  ÏÎíÛ×OŸ}ïUñI(ñF‘v:T¶nÓ&×átzøTµÀéĮ̀ 99‘Ä“œj9•e©Þ…¾k3f̰BzY,Þ`0P«Õ*DFFš«ªª°sçN–——çLOO7{Vz{tëÖíÐÂ…  L 3 v—Ñ»w˜˜ÝÒ <ÝäÅöíÛûîܹó>­@Ô^Y–/k5~+aä !6B>#õ·ú ‘‘‘fÑ%â»›X^^žóøÑcæ¢ÂÂÞUUU=zÆÅZúçåµø¤ ×(‚a£Fäô<¨^>¿ú|mß k×ÝGø¤ Ô³$â!DÉ985 {Ÿ<«YߢLnx2sæÌ•‘‘‘] V­Z5V–å“sæÌyÊC&”åhiåÊ•wsׯ`0ààÁƒ III¡K—.U—½R»õwíz‹V$MuÞcäà¡+›‡†uùÕ± ôä£?v Ÿ‹ùl×±ãÓ¹çr–ƒ1#P#„Ë]ðúÖ¼£Qº{ÖôñIcV- < (ý¤j†§µ(µ Æ€O7VW$+<ï „rØp}ßÚ“=çÞ `'n͆šŸij(@iH(7Çë n ŠCc”†‰¾woÒ¸)øÔ]/uøÄ­?m©ã†BˆŸÐ¢Ã'tèð ] :|BˆŸÐ¢Ã'tèð ] :|BˆŸÐ¢Ã'tèð ] :|BˆŸÐ¢Ã'tèð ] :|BˆŸÐ¢Ã'tèð ] :|BˆŸÐ¢Ã'tèð ] :|BˆŸhôBº×‚yóæÅI’´1Àó|nbbâü{ï½w”ê;—¯À«£^ ½}`œËéÚ €„ÜÑãÆÌbÙÒñù›FŽãó<`0@‰ÈËË{@ ¿ßòsݪ  ‹9Ž à9L–#Ξ>Ó`>Ób2™BT;Y– à6(ŽLW¬è¬£6ŒFcˆZ•1[­Á|þ¦$22rÙlv‚???©ÿþ¹Pje4rC¿2¢Û¶]g6™<ÇÃêo•ÆN¸³Á|^A~­¼àñÇ·EFF$$$¼)ŠâN:9Ngþ… Š"##€Ç<éÇÈCâ\.×6 BîÈ1£ç/Yúd£ó9aä[«Ö­ F÷¦ÃîÒ7±¯Ón·çŸÉ<]Ý®íuóy‰@8Ž[L ð„)5/ø?)h¤°ÿÈ#ÄQJ·åææã8Ç 'KÒ¶3çΜ!ÛüQ1‹q÷´)s˜û§ëâó\O^0oÞ¼{dY^Äó<Ïqœ·ÛbŒ!$$dÝ3Ï<ó”;F­p³šã¸m­Tµ¾ªÛí¶ìß¿ÿµ &@)Tz- ºÙP7/ºŠ¼`Ô ! Ÿ‚ÀsšÒÓŒ1D´ˆ\÷þ'«jñÉdy5%4@)Hº’çùnª•» ^Cfµ‚buuuØÇ¼@;\¥ÀÍŠ6ÑÑëÌf³ƒçyø[­Òè;Ç^‘ÏÍ;~úÖf³I¢/ºÄ>¢(ö]®>.—«Od‹µø3døJBH7ç=vî¼×äZyM@iiiØó+ž½.>k äñÇ·B ÞìÓ§Oò´iÓöº\®œ .A©’w¹F¹_yå•ÇBBBrÌf3ÔÍh4Âf³µ À´xñb¥ôѺâð6H  Nœ8‘PPP0Š+Â-™´Þ3æN!(9vÌ›ÃFH^ôÄã{v{ÎÙÓ§¯ÈçšoÖ?’c00zø2‚CB¼|N5ÆFÀx¼Àƒ÷ˆ£Æµ›÷ åÀž½ rÎ_3ŸÞ.¦yû…^s:QF£ÑÛ=QJ!‚ÅPX,‚UôêÕ+÷øñãÚâý„ôíÛ7w×®]‡ƒÿþûïgÌš5+Š‘Î-UsüðQq²$o;“q:àÜÙlPB°ãÇmª‰ôˆ‰S&ͽÿO^–Ïy÷?V]Ye D©²ì–$4|2‰-æ)oå9C‡Èݽ}G„¶p®L(ÆÞ5!w×_Eˆn7ÿßO>›±xÙ“×ħ6‚\6/ „Xöïßÿ€Þê;Piié+jÐnZ0ÆÁ>a„=ãÇßXÔ vŒ1"e̘1ß™L&155µ”þ:øjs3Él5¥4€RÅZ]µ£”c̲uË>ù¼˜wñ%"ðàyNùÉÕöÕ‘dùƒÁ`葇÷Ìì‘¡a¡EÚjÖQ-£÷þqNÊœ‡þôÅlÙ¹ëšù¤@Ãó‚%K–< ?¥ŽÙ³g§vîÜù!6›M­Q.[,–ýÓ§Oÿ°wïÞ{lr8µ’4ADÙ‰‰‰ïÍš5ëñðððlA—#ñfÅøá£VJº AP.°º Á  ¬¬,쥕ÏÕËçÝ£Æ=ÀëO9‚f!Í+^z>µwBß „„5oîåÓ`Ýÿز'?>fä^›ì{¨ÇG—F‹Y=ö®ñï=þô²Ç[µmsÍ|òõåZkR­cƒš„††æA±®` Ëòë‚ <üÿ·wîQQyÿVÝ{û4Ò o€J0 AŒ4h¢£QcFMŽ›Œ3ãdòиîÎ+n²Ùɸ›ÝÌîd'&g“3³™Ç:³™3ãf’1ñäaŒ£1¾P#‚Ѝ€hGycCÝ÷Öþq»[@(_´þ>çôQ›òv×·¿õ«ß­jê—P»bÅŠ#%%%žøøøƒn·{¢Ãᨄ?ã^¿~ý·|€§¸¸øL[[[J Ú”555Ž––Y™™¹'33óÌgÛz¾ñJÑüœX£úÄ`D†)7 ÿÙêÀ={'Ÿ;{vFRrrw=ußÏTUÅèÔÔÚg׿pä³íÛ=©cÒ¶ºÝ1Ñ•ðëùû·ÿÔó“>:ÓzÑ¢t©˜qª¼ÜÑP_/¢cbªó&åïÉ›”Íz*S¦LyVUÕû, &Nœèª¯¯wô¬år÷Ýw»jjj>Ÿ»Ýî˜;ï¼s€ó«W¯ž±}ûö9©©©‡Ge,[¶¬tãÆ™œ\UU•¹víÚŸjšv:<<üÌŠçT½ùæ›ó ÃX0£>Ÿªªv¤¦¦~ó6гæ|ºÔµÈüaãïžåŒÝ§©fιÏu¶úŒ#ð¡*2ÜÿÀBWÅñr‡×çã/^Œ™R0m€ó‹fÏñΦMs2Çe›™a¬ùá÷K_úñ ™Û·n›|üèÑÌW~ùÆO-VËiGdäezþø™˜¯ûô…\áþ1†!`³Û;²&d_·žüFò‡Ã¡uvv¾úå—_^är¹Æ†Ù³gï`Ý ³ÒA.úÛÒÙÙù`àßüü|`𤢢"À(˜·qn˜à{nìc»y†xÚb±z¾³úÉÝß}zÕöØØ¸zæÏ=ãH1¢}ù·VøÆc+·„Ùü»w|ÔsXT”æik=.!.näèQ§×¬üî¢Ó'+Ç ,ÿ抬IÉɽêÙáõ=hÆ%޹ ç»Ììá‹C_ÜžjXXؾ‡z¨,;;[°¯½½}2º$1]ò‚£££?xï½÷VÃ?Ùl6Åëõ¢¤¤ä©® iBBBãÔ©SÔÀ¬Oß„.˼ëÖ­s˜§( âââšfÍšU\QQ‘çr¹+++³œNç˜Ùö Znw8ûžZûtÙÝÓ¦šzzÚ&3†˜@ji³Û¼ªç=°àÄÄÄ~ÿ›ßõ´ÛìJ«âÆ®í;ŸRƒ5u€Ñ©©óXЧžË¿VäÔ;½ó4MEjZjÓÃ+-.9øE^Ueeâñ#e µj³bãb¯KOõFòEQ‚w+ÿ£(Š^TTt@)€C0+ t»B, ˜©   ÀáqãÆ»\®çcØ¿ÿ´Ù³goPI}ûÈoÿôVPÏO?ÚzÆív§(\ ®<œ,¯p4Ö7gLtun~ÞžÜü¼ ž\áP3™ ÔÙµX-úªï­•êièú’@µ©EK—T8œ?urqueÕóŒ3lûèãiK—?|]zr˜%(vؽeË–érêúh†a`ÿþýw¬^¨ð9€ ]¸ ^qqqžØØØ ŪÑË\§(ÊDÆâââê222ʘ1cÆoÂÃÃËüuwG ÿjá #¨çÆÿþÕtÑ£¾‹€À'}Ü»žŒ¸Ì²m#Fô$!ÕSUÕ‰œ1ŒLM©»kR~9€_[Vô›aNgg Ç˯[OŽÈ z*ô—=xóÍ7ïö_WïíE…9BLŸ>½ fcÎeff>'„@KKK€D\*©1˜êéõv>0Ì™¿+p÷RÚG^À9‡Ê¨ŠYiŠ3ŽÓ'#þå¹’ëi9 ÀƒE‹»é™?9ÿ9 ±¡áºõ ®b­[·ÎéóùææÑÑÑ.ä¢Ñc™Öf³Ž½ß’Ð’˜˜Ø|ñâŨ͛7ùßTo;Æî1cÆìÊÎÎ.pþj .Üš˜˜ø]×;Ø`®J¾QôÓëóÍcŒatZjÓÒG—'ábŒáØÑ£ uµµ—ëÉ€0Gøé£G^HIOkIMOkIIOknnjŠÚø«_÷©§fÑÜÙ_ÉÙu÷´©Ýô\ñøc[G§¥ýE÷ù®[Ï`9gžyf%çü‹?ü𡌌Œ÷ÿú׿z·mÛö|gg' wÌž=ûY˜!10…˜`*€8\š½0Ãá>˜wÏeݦÀÜ´Ú³\—Ó°£L†™Líò_gÐñÈâ¥+…aüBUU¬ùá÷åæç½ÿÎ7yßþß÷ù|xpYÑŽ¯?¼lÀët£¢(ôÌ ìÝ»·ÈëõfuÉ J»t¨f±ß:˜îìš!w¢ïûíz˜Åû‘¡Ó€éþOýk¼–Î $4Uèóz1*et]n~^9€‹Š–øôÊêëê³N–Ÿz "„ÈÐk^°{÷îM=ò‚zÿ ”ÛºÖö ï{ñ˜ :ƒÃ0r†‹ì¦gn~þsoù`SS÷¼`ÀêÌAn‡¼àf¢išûŽœ »&MÒMÏGûöÖQi)Ñ}ƒCÏ®%Ɇ|^p“zv5ˆf½À<ÖuAÅ 3ãÌcƒfóì2$ô¤¢†„úÝ\B „B!¤A)dB „B!¤A)dB „B!¤A)dB „B!¤A)dB „B!¤A)dB „B!¤A)dB „B!¤A)dB „B!¤A)dB „B!¤A)dB [½zµÓëõ¾«(J¢(°ÛíÅË–-[™››[ ]Žƒ~úé§CÒv¨±pÎ\gG{Ç»¢€sŽðððâ5ßÿû•3f^Ö÷Pµí/¸×ë}×f³8NÄÆÆ""""oÛ¶m›`*Þµq¨Ú5:Ú;ÞU9/ˆ Gd„ ãyÿûëßöÚ÷Pµí/TEQ """ U5n÷ù|i¦Ã,˜ç4UÛ!‡6« v›-XA´¥©¹÷¾‡ªm?¡*Š«Õ,) ð¦Á¬¥$Tm‡œó`®þ¿_Ö÷Pµí/¸Ýn/îùdBBBkoCÕv¨~YßÓÆ¦÷Ú÷Pµí/” 6ì={öì]לs$$$´.Z´h¯¦iû@—Ò111!i;ÔHLJÚ{²üÄœvÇÉ9GÚØôÖ¿[÷£½V›õ²¾‡ªmÁ„0“œé0Cœ°@ ºÏk¡j;Ô2š2!ƒ™ÇáÒ<Ö³zcÏ[§Pµj M©Ú!…VR )dB „B!¤A)dB „B!¤A)dB „B!¤A)dB „B!¤A)dB „B!¤A)dB „B!¤A)dB „B!¤A)dB „B!¤A)dB „¢öõƒÇ|–¡ë[çÈΛˆ îDCC=çðz<^/Ú=}+c Óç~÷ÍÛ«žõj±åÝÍhjjBàü¸Â{g~ó'ÿúâ-ѳOƒDFFjù‚Aiu#¶¤£jj0ÆçƒO0¨(wEE~>f/[Š˜˜h|¾{7š›[ ë:²³³g¨€yvgÛMëÍ&jX”voTx«)§N!uËû½êùÕeKátFáÏú?œw‡&Mž|ËôìÓ v»]YØâ†QR ­ôXc}ðg:ÌC9]1ÃqÞ݆„„DŒ•‚¶¶VTUU!<<<ÀpJïW¿ý°‡…)+âa쯶s§Tϱ™™˜VXˆÓ'N äàp8"Sp‹ôìÓ Š¢ |ßTŸ8 îõC0ÎáioG…͆´ì;pìðaxëa ³cܸñp¹\àœR›ž(œ£tçT8 ­£ÚôætbÑ׋p´¤þ£îo RƒlÎÈ@cV¢SS‘9aŒN,ð}ü1îMNÂ}¾táìé*ÄÆÅ¡ªº¦ÛáýÄ%Îñ*823‘’wî¹îÕé©(·TÏ> ƒ'9ìVŒÈÎÆWfÏF˜Õ 澈ŽÚ:è`p&%COJ„¥¶'Ê)zôã ÆAUU OM»=ÙÀ5HðQßoYÂrsa9z ­GŽá"çûé¿#ùäO ÃXÀ¡( ’’’^ŒŒ<ÓÞÞŸ®CËÌ„rÑú7Þ€–9޹s`ßö DÙQ(eÇaýÛUàkÐT6lX~ìØ±·u]cÌó?ëׯ_ @Ç-íuˆùê=3gqÆW2ÆREá£FÚަúzp…CÆUë©ø#ÈK?ùçÙÛ?Ýþ#@0«Åz6eLê[?{uÃ0ðÙ­¯RWW·1ö=UU­ªªBUUdeeu¦§§Ÿ¯®®.PT‘ ñÑØû«¯Á7n”‡–Áö±hÉ‹Fç0t8¨ki‚ëœ YYYU_~ù¥¯¡¡!SQpÎ-'¿¬¬,gêÔ©{´„²S·’y3ïý¶îÓ7Aˆ BˆÂ0’³²³‘“sîXiÙLEU˜>ã…~UzÚ[Œ©Ó§U•–”jçΜ¹W×dogçøó_ž/:}ê”­pÖ¬R˜·¾! à*ç|•¦iÝ’K‡Ãÿ« ]‡ÕÓˆ™3a̼ ðtxƤÃëóAèF0‚X,Åjµ„ðù|¨®®¾f)‹5¡èЭFâgMóçb ŒÑÃcFF9£8çæTcW­g ±X4UÓ4˜kg†a xϾ'ìð ÌŠýŽªilþhŒ1!ÀC|||]ZZÚ;‘‘‘#TUM9®ª1§âá;\áõBt!!àÕ (œ¡³³‰‰‰Ív»½€°X,ÁkêÖȰCÔ ª¢Dªª …+fñhª¦)Š¢ƒ€×íÆqUÅÕè 0€1(\ašª¯©:|>ŸÀD˜Ë(¡1ˆÅb¦iÐ4 `ÜnwØùóçc’’’öÚíö‹eX0“¶ÙúºcŒYÆŒcohhhnmmÍЂ# ðz½0 0‹âXBÑ™€¦ªÐT ŠbF! pÆ1wÁüò¹ æ/p€QW{½%K–@õ‡ï½Ÿ¥©Š  ëþOÄ ÀÞïñ£ åF¸®ë8qâDâ±cǾ\º›éÀó(xæ:Jà˜ÓŒ×ë U? ¿Ôo@7ö}¾;ù‹ƒVux:ÜŒ3¦p…_éÎÕ &¦ž†Ð'µ{:b9W pœéÄ¡ú“ÈàHBtûPÈîÅíºÞ®¸.ç¼[µÆ¡ çJðaÎ -ÍÍ6£QŒþ–]ù#@×öœ3ÿuMƒpú……në Œ±à‡ˆ W¢7ãLÒ5¯¹]`Œû` `îØ2ÑcÀɯÓU2sÀ1pÆÁ8BÙûµç¨$©=§Œ¾èù&»N;‡aÒ©j(Á»„1Á9¸`,®u°00t×S†˜Ë"HàÏõ]¯u;ÑÛ€3ïL¯×Á r3ÜeKí·ëÛ_0ÿÔÒÕ(¡|PÓmŠ E¾ÐóúCnnÌ¡€ vS¾0Ú-‚Ìßš˜˜Øh†×¹„ër¹bjkk£n§螃tÍúkÊöÿã²ë‡ uذa¿koo_xB„„„ÆÄÄÄ£ååå6˜Óæ5½“”””Ó'õÂ… ÓB 77·ææRg?öa@ÁÀýÑÒ\VB`ô˜ÔÖ´ôôp§NTÄœ©¬Š2¯ 0f€Ý„¢¾xäÈ‘¤ºººŸÏ§ !ÐÖÖ†ãÇÛKKK ®uZð/ˆu†ÑìóùÀƒ¦iú„ ê ÷8  !$½$&'½^_[÷x×çÒÒÓ#"5»w|6ÀÕ¬‚t#wRþ‘„¤Ä g*«¦ˆ`šË0÷ù.˜ûZ!pjnnî©ÜÜܵ¦s)¼é­·Þ×uìjÜ[­ÖØ üÀfé¢aFŽ£>P×ß(üÛ«ÿ¹þ¿^þ¹ó‚ëÂLWMMœP{¡Vmin®³çF˜R²«Y' 0²¶öLgGçEC`‚atZjkV΄ÚEEKv8Œê©hPó{»`î“x›ššV®†^É$B˜;Œº®CQ”pÿÓ`nÌi0]ÞàöPtf€P÷ÄÚ5ÿsm<€Xm¯¾ôãü ¦šáß· `³Z£V®zâoHàP sÀíGˆ "x`î®wX[ZZZ ø¦¯Lâß#èpÀÙ~}ÇŸ•š`ÔÖ֮󸫸£3÷`tCã\ó_w?ÌA¬h…ù{2MåÓ×~ðƒ¼`€i0¿r-ÔÁ4Çþ昄N˜ÛïÁ-øæÆæf3$ˆ«û!c€0! Ä­pLrûe…iŒá¸öíùN˜&©Ãík’ž P€ëpŸ؉›œ¿É Bô/ƒrÀ‘A)ôK,„2!… BH!ƒRÈ „2!… BH!ƒRÈ „2!… BH!ƒRÈ „2!… BH!ƒRÈ „2!… BH!ƒRÈ „2!… BH!ƒRÈ „õ•W^©ÂކVÅõÔSOÝÀ󜢖Ì]P%„ê©išë›ÿ<(ôäN§óçWj”——w À ˜ç‚’F$_Qϯ-ýú Ñ“?òÈ#-K}_ """¼“'OöÀ<[‹~Sÿ løåív{ŸzFñ>ôèß =9€Æ¸¸¸×új——wfÍÖ#0,!ä4ŽÉÛ§ž‹— *=9ïâÅ‹_ë-ŠDDDxsrrJP`è—k¸q¼/¼ôâk½E‘èá1Þû-Tzîbz"=®›^£È`‹À%ƒ\E(zÜ—E‘Á=€îë Ý¢E¦[ŒÑèn` óäääÁ sû#E¢œQžû-”zö<å°1..îµøøø»`Ð:¨Ü>i“1öµ±™ƒVÏÞÎ(‹ƒY™0;’jŠ·ƒZÏÞ ¢óÿ½ ƒ(PµžtÊ!!…vs )dB „B!¤A)dB „B!¤A)ÿN2˜¼KDëIEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/picto_parente.png0000660000175200017530000000157012664543647025626 0ustar guillaumeguillaume‰PNG  IHDRÄé…ctEXtSoftwareAdobe ImageReadyqÉe<IDATxÚÌVKkQ>“&š4µ Y‚Ðü¡7nJãÎ…Ôt)ŽàB…š¢ØªÅÆˆmmU¢Z+…qQEl’""nÆ•Kg+"F7L¢i§É4ÃCEI++wy<É@ Àúý~ð¸ÝáãGŽr¦žt M ‚"St  Vc­”TªU–\’$P5 ·Ö‚Ž<YÊ€¸ ®ãé *ÒóVJJÅ¢ð}m …ˆ¢ˆ&¼#%d~RÀË£PÙäAQ2(‰Z))¯¯G Åb¦\.óº®GWÞ¾îPÂÐêjN<“˜£àN¿’‰s÷ë²› +hâ;œfHü|Ý«‡“34,<;8|m´nÄÜÔìþõáÙ ãc¼µ'5=…áÁ\Äë âs|Ž`°“#©ªªrˆ¤¢(‘{7nE¨ çqÄÊSö‰×õFâXf<Éaœ‚†§„ôi“å¾&ylêêuVV”F-sÂ\¹ÂKÁ€®ÅPiøÏ³aà…ATu(JX’å˜ñŒ˜¸82÷D×ÛK5ÔZ$ÔäIÈv/FÂ\‰¦âFÆŽ!Ø&%¬-—lÄ;ñ¤“ †ã¡³¿¾ÕC²Ã°òDëwÀw¬ª(Nx±ß\IMO ››ƒ×6Êe {CDº | ¯~ÄO~$@õ·$¼—ËLßIEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/minimise.png0000660000175200017530000000052712664543647024605 0ustar guillaumeguillaume‰PNG  IHDRóÿagAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<éIDATxÚ¤SK ƒ0KqåNÐˤq顲tÛ+ô$Ý)¸ª+~›L Xl$fxóò2¾ñ¶m#—ð@ „ÀwÅãANyV yžiG“ò\Ëò½( Rˆu]«,Ëxš¦V·¶mË›¦©@rÛoàI’в,V ,zЫ ™W=†`š&•WBã™ }ßÿ%ò}Ÿâ86ŠLwÊóü” ,KŠ¢è[~X_ïséZí χ8%€7€ý9ƒ0 ­x˜Ó_pñvb-­iíD`÷}0»p‡·»®»´Lf]â#ÀòQÿ:Ë?¿mIEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/picto_rel_small.png0000660000175200017530000000074712664543647026147 0ustar guillaumeguillaume‰PNG  IHDRóÿatEXtSoftwareAdobe ImageReadyqÉe<‰IDATxÚ¤R1KÃ@~—ötu(mAgc]êdú ü up ‚N¢;…*èàÐtéäà’þû,d4Ø&MriÎKÈÙ¤I¡èÁw¼»÷îûÞ»÷!þ³òÌ@:j5ã$}«`7HG2˜ÿôðøÍ4M^×uñ¾÷tÆ„¹ïï— ¬2Ï®÷w÷*Àçs9âoÇŸ$ ÌQ>?lK¥§»¾îÜ)š¦ Þ‡Cp§ŸI€ÄVŠëàØ(­¶¡¼Ö`¾«óVs³ZíZ–U© B‰žùÔÀÔ“è.@±Òe “¶rI¾U‰Ö¬nÕj†mÛ¨Äz’Àu#ƒP"Tˆ… ž°ˆ2ý6 -ê`W`fnÂM3ìМOÈ"Èjsֽ܀ëIõp8Ô€`~ØhFFº‹a3¨äöB–dJÅ ¦ ü©L§bè2—çy] `ÀË)‚hl•X¦ íç×#{ÿ°æ ÔXF¿ªTQÉŠÉ"ЖMÄü0åðÈ×Kè«oIEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/maximize.png0000660000175200017530000000066212664543647024616 0ustar guillaumeguillaume‰PNG  IHDRóÿagAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<DIDATxÚ¤S;k„@^ƒ/´,ý3^Á&\“Ò¿“Þ*„@H# ¤÷þŠ…‚…`¥à3ÎÄ÷â%$80îìÌç¼vFš¦‰í!>QÁ‘Ȳ쫪Ê8Ïwõ}ÏÚ¶%žï§Y}ÃðËÁ8މçy¾ëºŠšç¹ŸeYNä%‚ï8†@eYb4 ÈÆ¶m²6MSŸJ€!M‘š¦aA ÇñÆÎƒ¡ƒ®ëE‚†q•¿Ûù]UU»q6ײ¢(̲,ʈ2€zëºf·w÷ä ]ZrI÷öúÄ Ã8Ï€—€Ï5üþ<ÛÞñø9"ðÍ1ÄóãeÕÁlöbt]' öCh"Ô-6pÓƒ]¯pi$Ibï”öOspµD8Í£‰JΚ¦1Ó4‘Am€]övá³]Å¿– 3ݻΟ âêÖøƒ\IEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/picto_fleche_blanche.png0000660000175200017530000000036012664543647027066 0ustar guillaumeguillaume‰PNG  IHDR Þn·]sRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÜ Œ :pIDATÓŽ± €0DŸ6Α­¬gp lÌ‚cd Á RÛœ…A‚(úºã¿û\!Iü¤* |x¨˜úIFRÔ3Q’™úÀ[·ÍË×6ÝO9`¼‰£·nÎ7çtÙþ2²·nj`ê”/•¼@lÚ °IEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/picto_edit_small.png0000660000175200017530000000107412664543647026304 0ustar guillaumeguillaume‰PNG  IHDR rëä|sBIT|dˆ pHYs  ÒÝ~ütEXtCreation Time12/07/12/*žtEXtSoftwareAdobe Fireworks CS5.1«Hë’IDAT(‘’=H[qņäµ~@Ò(Ô !Ñhª;E(-Q—âþ hqtèÒ©¥¥´¸8DQ覈“oÓW\ZŒâä½ v*”‰.ñ%ïïb"á)…8p¸÷îåÞ[#„ˆS@‚# , „XÔ4MJ)åM¡ ¯¯®åM¡ ‚¦iR±è±X €µ¥eæÞÎò~¿lmîêŽràÛÇÏ ¼zI‹ß¿µ•ùO_Èçr‹Å Ëpäsy2iïË«질¾è'‰°·ûÓ4+¬2)Š ÷3MÞF¦f¦iëhghd˜Ëìå㦧µµ¼Œ³»³Cj?…CQ0Ò:.~szxdÏY]‘>Ì%“ÖÙZßàìàÝ0Ð ƒ‰É7t÷=·›LÓÄér w wÒÜÒÌß•U,Ëb{s ןÏw?@©TªÚT°»‹á‰1½^B¡gÇ'öNn·›l6‹eY•dO´—º†zÎ £ããU¦¤ªª‰x<ŽÇã±4T´ªªÉšÿù½[ì™Ä ‰ìºƒIEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/img_unknown_man.png0000660000175200017530000000674712664543647026173 0ustar guillaumeguillaume‰PNG  IHDR––³cæµtEXtSoftwareAdobe ImageReadyqÉe< ‰IDATxÚìOÛHdz…! ˆ€£ % íÒ»ööNª´ÿ}O½“nwQÛ-l@ø±p%À–Œ@ºoüŠÏØŽãŸ3c3OÑü´ç3ïç<¿ûùÝûŒ”$‹‚o~|+"¡òË?ÿõHŽBÒE"”¥ˆà “.—ÎíÍíÑÞ¾ûË Å"~g•l.ŸwåH>—U‰0v9kµÏÛí³ÖéíÍ—×=ÿÃ×çƒb.ŸøéÇ™¨’Px;ë+-ÖoÁÌuü4–ŸŠca4ú»YBÆ_ºñésifjúñìÈ #,ÙC¹Æ˜Ÿ!­ã“£½©…AäB÷aÝN#èÑí–¡a5›U(Dêé\!ß>nv;]ú^ÌžÍOŸ‹¥ÉñÒäªJ„žBÍÆF¿™}cmå%غgiz ? wrxDÑyǃí(Î>-‹`W‰ÌãÈ€´íÍo«ËÏvÖ×¾€þ¨Ô ôÛë_®5 ´–V^ZhëúêG°ŒÛ0$U 1@[ØŒ´ _N£Å1|é¯?­Ž—&†Ôad°™xŠØ)%koS×Nðæ¨Žb!Ĉ I?–ÆßlàT®V ‹P,=5_[$Ÿ‡Cê—V’µ¨­¼àEQ„ˆY›[q§z.±.°ÁùÁ¨ÂÃa*ñ½``¨üý¯¹T„@¯3°<Æ@ `u„òínl›~Þ³OçTUÕ4 Q+tŽ.óÁ!ÄáÌý–¾â;oµaQá]Ž 6–“t®É€:ô¯ÿðïÿÀ-Ë”CáËMÌé7’‹I4ó3+Qëø?xÍô“YŠƒR‹PL~æÃs|ÚIé‡ûëq^Pèl6‹@7çç(À†H‡¢‹ Ú>¢435¿´˜B„8·dñƒò †Ch£ª@ûiŠŒ•"„üĉ_¼ˆM ÊÏ*; ;H<‚dÉÑü&!"#ë\’PÉf$ŸóhiAqH¶ç!±¦LÒj_"Ì&/k¼ð‚†uÅßÝ‹±·» PÜÝ܊â2E;ý(ì.HØ+K‹ÞèõEÄ}GfÌü"S„Ž_œ€“ªk>ß•¥Â×DK‘ QC‚¬Ç o?_S/Îf•rµ’†ê w‡W(õß¡úšH¥|QD@7RÈGU»IB á¨T=vèê£zq…xÏB7*Š‚¨j¡]iýŒ>ØJÓÓ|;ÒYåò¹HÖ§„FH«?˜­ç2úæ§Ì¦N tcêy àãÖ56êöZkzFR&¶ŽoIS-ÀJg¯ŽºYGÊŸ„Y§Æ»@Q yÂöÝö j`ƒ:ZÍ“3õKÅÔ«÷M» ¼"~­›i›ûy‚1›¶8d~iæ4Àa¡ˆ‰Aè¸RcÈ\t©—äröé\°÷ž‡ëOgŠr´‘ ŸŸq—ñɉ`o YtdÝ ÜoªžÂB)"—6Ö¡jvŸG’®‚$‘äy¢#Ìôú½¦m&h2“ Ñ«Hþ§u1aíîA3R‡ýƒÏ% a°à;)2êß#ä ù„!´×¢’ÕJy²lË¡¦i)† †³¢|^œŸÛ|á„d™$„³©·ˆå,€ðIk„—ŽÅ† ©ÅË+üm;~ú²FxÖ:6¤P«ÜKÁ‰7¤vG¨(iëß)ÍL¥¡=õ¸œ¨ì^M3B{R˜¾XæšmÖÄaVIÛ£¯>šðµ*Öí) à-ú¤ëçº;UMBû2ÅuêŠ5ÔãêÑ&…_eã¿^øóúHz…8Tg§M©O?„X/L[Rá-B¿H,„æãNåÚ¡ÇŇbD½ |vB4QUSˆÐ£nEU–âƒ0Ý ÷)FU–â„ð®Á$­™¾â÷ÜCh-|ÈETÂáe§ì: )B ­E5ûÚS:¤Ûé¦áåÝnóéŽk¼~£j`ç¼½z .¥™VE:1>ts$-ÔÝXÂ󸵔 Íw-+¤½Òf—rµy‰˜5B³óË=°Œ‚6þ6œeëøÁ¦])Ye¤Ÿ«V‚eÉ̪*4}˼U 5?:ÜÛ7á:£u;Ë‹NíÕË9„3F8ņÔ­”fz÷º¾ÒÖù°¿½cŸÄ]ŸñDø+2ÜhŸ¯µÕÔ–Qš™^ùûßÏß È¿Ê’9”(S_ã¶»Àù¥úª6ýäÛ&'”Sîî‡Bsc*a›7 ƒòáÇ’w/:tSÆñR)†4}½¿¹Ð·ò3çNð?¿{__ûÍñþ™•Ú"1v¡-¤ SœÔ›7tBƒ“%ÿG71Z~ó‹¥]xñç³V+XRÁ§À†ôVI©.^kšqõ|¢‹ÕÑ#Ϧ=‚«>KFjçÊ—t^ŠœÏ–QU•å‹$ÂÄb6·èI„q¤Ãa²c‘&ÛŠJ„É{Ïx«j‰0¬l;ü3ÞªZ"Œ@j+/Œ#R™ÚG ú-DËø9kµö7ªK„QÊxi2ä=´¤!å/쯑/¡D(E"”"J„R$Â.·77»›[o˜"†’ËNçןVƒmù# Á¶Ç-ÍLqÜýA" (°œÆöÆ|ï#ôõµ/Äo¾¶Èw߉0?èµÌ@ÿX6«9Š\©ðm?¡Äo´8V®V¸’DèOš¿?ÏêòsóSÛ ž}ZflWÅ5¤Íã ÞEi5OpTį¶ò²!ž¥[80¾\[áõ•g#‚±Òó÷:í†û¹´òÒòÌ6ŠnôMNY*¢ Zˆ‰L75ÈõÕ|o õBþnìfa±ŸN¯oJ-Ìí˜q‚"¿é'³Œ3hÀk7NQÚÖq撚|ÎØs“ǧø@šCvóƒPGê2bvînlYz|ñíðý,$m×uyw‰ÓÑÞþÐ0£‹c„CØ<üo¿pã5>9Y(Ž)QÜ‹ÚN®u|rq~noÐvŒ_ìÆßü_LxMfC,„ó~¬£|¥A),´ qifjÔÖ•ëý{‘ôk­ÀÏH3:δ! ¼ûŽÎàÛ Â‚Ñýeiûጾù ] s1A³]–ð •ÚÂÀ½ ?¶Ž{ë ±FË ±1´ Z ·4RÈÓã0•Ýû7ps/©zïÖ/MçI€TDVcÍ1BH‰àý᛻֮¯ÆQ4à8/«ðßý&Eg˯_ÅçEÉ aÖ̉Éxi¢üŒ[^ï18?ÌË©E‡áx’äÌàɸ•q)ì@<ÆâpÚ )N ó!Œ‹B(¢Ëkb’rµâ% ?&š(Œlƒƒë+mÐiw‘üéû‘O0îOñâ¦@aóNƒnÞ”`„çà´=^ÜÜít(GXÁXá› ºïûøäöæ¶_•Nt„¾àYòeŒ&,ÛîÆ³@Æ‹ ¶¨ÇAp©Õ‰ÎôJŽ›[Ÿ>ûÝYàÞ=&'²¬.€†ÝvWÁƒí†/j÷ñë«û¥’bi!Žu{ýKà=!zIúA?ø§0ç5­-º—§¡FÁ²LkÖ¯•ð¥ðµb°{z˜ßwOCo-i?Ý¢Ô£úFPĹ B²œ°á[.îßê(Bb‘¡aîÎ/Ž$:²—5¸RÀƒŸp¼K_x-ÌÜ£M“© c¾Qd?~1õÅà“á 0h8µôQä*B~ä-£†“ôX7ñÈÊ/Ë‹ŸÙïSÇ´‘Õ¹¾ªÓ¹A-ss¼4Yš™ Ÿì#ÝôØŦ/-€:Gˆ<¯Õl2ȸ1?쵪q¦ÏW~Vñ¸’‡ø“åFk¤Ž8eL//y”o„ðvU,E¨…T,µSR‡ý¦½¢kµâ=”‡wÏ0Œ0¾š@F†äÚz·+ûó9kŸ::No´8V_÷%öî@·üܻ 2+ s/z {ÅwxØÒ~zS(Ž}ÿÃë±HÃóùꘂpÑ?G»êâ¶wrgí63ƒénÜmãòëWÈD]£/·÷ÿ¤»Ï§ñêÞ«,-Úg¡â}}½k/GöÍ÷N¯h±{xK€e˜¡øùÕÆ§Ïö3RÌqŠnyOEƒ÷Í–¶·‚õÒólö`§A–aK€ëo‘™1¨Ä†™ÊP0s˜£é€óîþ¡ŸÎ/ ~0nú3_û"²P˜Cvÿýîçwï3R’,ÿ`í MÌ.¬IEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/favicon_gwd.png0000660000175200017530000002133212664543647025256 0ustar guillaumeguillaume‰PNG  IHDR@@ªiqÞtEXtSoftwareAdobe ImageReadyqÉe<"|IDATxÚÜ›”œ×yžŸém{ï»ØÞmÑB’"iŠ2ES”û±å’(Ç’mEŠí“[NÜ”Øòq¢ãÄ–dE%‘b;Dß‚Åö^gggg§÷>ùfv±ˆ´D:çØƒs1eÿùçÞï¾ßû½ïýÿ«àö‡BšJšVšFšzë³”´„´¨´˜´øÖg· öæ×Ji:iÙÒò¶žµ[Qü+|rkð~iî­çÐVPR7àÆ¬›¤I«|ù•ïÿ»»ºgg›òùWü‡#©©ÙþG>ñóµa³/ÉG¶­@¤‘º€ô೤•éË¿óÀ—ÿÓçÿT«Õèø7ôH&“‰gž~ñë¿ø ¿õ÷òvUš'7 ­—Vú;ŸÿÍþøO¾ôWjµJÿ±‡B¡Pvt´ìknnH=÷ìËc[©Wl‘\¡´f·wþu™y=ÿ†©T*ùàÇŸxâÌ™óÒé Ü"¹Ü—^~òßkµjý&7|´-±¸ú  ]r2Ìõ™¯ðNF±»‡I$âÄâî̳׿ƆcŒPØ!M~ä}Q(PþÍßþé—¶H^«Þ*u9;w¶OeHó£x¼ø"çûþ%y¿ƒ=p›mœpÐÏὈmcƒeë爧öI Šàð(Ðê=Ô”#ŠRUÙENv}ÆIªk*Z·_£ÞJmV–)OBþaá…ù@*é ÞÀdh"ÃïjÇåš%àK°è:MNN¶èØ7¼4YÜÄ"X7VQ'7ÈÒ”¡Ð‡XY›fyé »;ÿ¿×H–1J¥úH Õ¨u7Ê»z»*RÊŸéûƒNÖí—©­¸73C¡ ¯÷Bnñ2!¥½²Ÿ3€R±†?z…`GÅ)„¤?4'ÞÐ6êw?HþÄZ'ÏÓ_Åhl"èé#’,`jéagFS>ïvC^Cs×þËT}’•eÉï3 ã+Üü <ºçÆåo!‚*;•23{ƒto~1H½ñMâ¹ú*‚¹~ô=ÎW0è;ÉÏÝñ¡RC}ól¦þ™)'°:΢ˆ ´N®ôÿ"ÝÈŒõÙÝü)FV†ñ¹­˜Ç¾Þ„/þÕõ…ì®û%úF¯P[ægʤ©3Ū ÅåXãîöCX«ôT~ŠP`F*µo¹ƒºªÖ쨒Uè³] C„‚˘Íóhô 赟Å`øé —ò&©ð¾-•JŽ8 ̸6Î1={Zr·OÚH~Öq.Oþ#§TÂ…Kù:¦,½-R hNˆÐT±9Û(Jƒ¤º‚Â\Ÿ|ööUKG.Q[r¥6„ÂdâOì§)ËÈ;㯳´±HPR-’XIJ>†uÝÂØÜ›Ü©$áìûÛOˆ€H$ÊŒüèšýj£‹c€¸2Jq™ƒ„¦‹úT'G¿Ï¥·hÚñ0£KÏÑÙšÇ]§tXíbaEÆ(1o¯“§Õ£( ¡Ë áUùÑ9:™[y@ı®¯2<ø+¥¬‡*c]•y"Æ=˜í:ZšŒ-qlŽòüN¡°è„2Ú;ºˆk^¥úDUÓ(Băã³sEÐÌ‘[bãêÄ×ñúäx ÉDòÇŽå–v“ PQüÅ/}ö—”J…òfÙ˜–¢©D„ »Ìô躔¶F^%œ`h,—Ý­’ÇJýo«9uï1Êrªxöô;"dÌRü«›©+2âãŒc¨À¨Sãó„ÐÈ u&׆YžK‘_äBc ’oü”tJÞk:°'&™î£¼ô³s+"Ÿ°Z"ĵô: &«ö3¢ N²4ÙC~qñ„Tm%:­q«ªßYÿÙýú·äņúÖõƒ[I0‘H°¶1FEÅ<Åy…œ»()®bj¬•^P @4n%U¹*¥P¤m4IcÉ£è󧙸e~G^{=»vñýþ'Y.ôá¼µG(O¾_Lž±—²šeJŠŽJ0ÎÐ,²´t•‚"'kÿu.œµ`Ò¹¥+ñ ʸ¤b ÎèeâÝB´'±ÐÔfdC´Hye5v[ˆÜìÔOªÒ¥N±]‚A—˜pÙã"fÎHÎËŒ•ì!˧䮃åÂìJ®_QóéG»¤cã¼&%RDEÓÓÔŽì´U¥­9Ò\ÝUG‰IYSˆ8*/<ÌÒµA’ºY<©9z›Å ö`Óg¹©j©²ubcšU0‰Ýn£¡üg™vÍ¡Ix©Ìz[p•Žö£¬ ·¨ôqIÇ,V—BBÔk„SSÂYåh4꟤ ¼ ¨Ÿeý Nùá`tš™E#)e+vßþ€âêw1hµ¼ËÊ䢙©Ù~zw·pôxcV‚ù3¼y}HŽÑpiøøÆ¾FVž“ óezŠvófÿ#öuòµ)eåT—Up±ÿª˜žrf&&ð8Í’÷¢¿IcÃBñ,®ŒöÛ¤2(ð'/ˆÓsyø)TJ½pìaÊòj¥ ЏzŸÏÿÎð=ØDÀf‹D#XÍ…DCÙéS¦ë’h®p é°’yüîBN÷Ÿå3Rmcäe—¢S9ÆR–Ú°ºRxJZêÄoæ¢2ªâãàîŒLM°~²¿"Ä’cËòŸ¹ÿ>$;…ůáö Q6å3=ôQ‡J´qACùa±¼×¸ÿÈ)z;'—Ù×ùîÙ+\532†óÓ—Qk£œ<µÞ]n‘Ù¿"•¤›'Âʼn3”4Hʼ.Ô°£x¯-ÑŽQ)ɱ[Æv£½¯H%“’K²³W¥®îA‘Ìæý÷S‘¯§¬¸œµ%3 KŠpBÊ™èöªÂ»)-(ã¼XÙ ˆ›XØÃõ‘ hRF‚‘&†xê­9Q€¥„Ý)®Nõa’ÊÍ/“T‰óÀî=(~NO¸ø£øšËl/‡}üů>JKÕ)ZëïbÍ-‰gxÅ-¹Âzd\ƒ‰ãm÷Vf34oC—ÔS]x‘[Ì-Žˆp ¿¯¸£ŒFcRRÆ©¯=E@ã ]ÀfÍfÕsâÜVömÀí¹LxLIAËÏà Nqñy?ûØÇIŠa*/¨æ‡gúèêh™oÌðÝ« ¤°•–Ò0/¼³@ édhÉI‹¢ËÆs4ֿР®d DÈ´›=Ýõüݳ}¤bnŠ*µfïaoG f[¶ˆ¬<^xí"UÕ)†/±§ãzwRYõ1^~õ5vwí&Û$®u£ŸZýÁ»†pÄãRöÄð¨Â>fm_çÒä×ÄéÑ-R‚ZEšêˆº›š_çøÞR4áelR1zvixûõq^½8Á“o=Åo<öË<õö«³—DCa^.ú¼n¢µþè³÷‰ÁQ ôÕüöo'¥¸‡Õ£\Ÿ˜aÑZÀƒ½58¼^† )-‰Ë ‹Ø½£ˆ !P˜¨¼ò:c /Ó\\MQ© ·HæÏ"6Ú‡*§}w“k? ©\Ô%„ £?–Þ-”ifàõø°»—ÈV½rÉOGía)mÅL,x$3Ý䥨–xÝ;q{ìm;LH5ˆV‘Ov¾Rdo-)÷Yž~ã,G:÷¢OÅ zœÌ®zq:¿Ík½Ì¬»äç”tìèâÛÏ~‡%Oœ_»û1þòÙçøøÑ»øûïʬåæúJêx£ä~yîŠÊ‹9{ÙÌñ:‹ðGí‚®\q™8Q‡†£ä—棇å·:Y]ˆÒÜX¼9Ë©;¯vmKáßýâ/f¤°Ãáfzr‚ñ©s¬/—2nv°£Îȱ]ÑSU…JWÀ†-@ >ƒ3Ü…ÇïFÉeÝf¡«®£{B¢Úº©¯ö2½bvT-nM)åÉK0ã+¿Þƒ*¥âô¨Mdö2ž:ˆÑ¨£¡®“ÑMS¡‰« ‹\š ð‰}ûEjhm:ÆËý‹’l®U²óèÕãüÐe±eÞ¸.v;[…2¾$“—”–’SdY¬Ê&P¾köþòϾyg)œ>(¢¼HEE®|u·äu6ƒ£o Sj ª#TTí"˜Ð‘—0¹2Ϭ]A“ËÀØð¹£ÌÙž¡8¿£a‘Hñ~×TS­R ×”R[VD4±Î÷þ •k‹CäŠà±¹søÇ×^“Ô[å¬:(L‘-°h ±sG#s/³¿µ¸Yàsâ4ϲogÞõvUí!aB¾~™ÝõcsºÄÁqòþ,©,}¨;pl€É £»íºèm "‘p”=Ý¿€Ç;…ÍrŽxž…©™yÉQu …v&ÌÃëÊ0¯/ŠNˆ²«ñãx6$‹|üÊŸ?)ÊÇ©•rr EZ'»ºó_¾ÿ<†Ä4É@»ðºHì,~ñž{øâ_¿„ΔÄaÌ?ÀÄôU>o§XÓf%eåw‘p„þ|ñáûp†48]RÏs¸½U¿’“÷܇+z‰‰õ ô û8¶?£žkT–Ph*©¬N ¹ÇoB7¥ÀÏgRÀéôpúÌ«Rêì¨ü-l+qlÞ0µu…t·µö­Ig"7#€8ÖÅŠŠ¼ÜÝU‘ž!,ÖSK>Ú$uVÍóeãô,ÓT§gˆ¨Æ^Šl|íâîß³Ÿ® s Z:äãÄžÝR^ËùoO]áå‹“D41¾aŒú†ò}LX'¨,)ä) (-*Dk\ÑøûØßó rM5Ò¿3Td7¡PA©a—]"Ȉ”²h]_æÿç•ïȸ­· *E±ˆ,ÑVvíÚC$9Ls[¹äûˆøú_Ãe³‹ ŒûÉŠ7ÑÝXMEm¥@<)]bÊ¢§ó ÕY¡ÍRÎõÛÙ×T,³YG–ÞÀÈÒ*S×&¤4SZèeôz”§‡BÒÁ\5T1»q¢’‡wæáJˆ+u`P¬ròÀ'‰$ÎI­ )ùÞ;cX­fVÜÝRi²ÙÛØÍðòk,./R' ôõ·®Ku¨¡ª¢&}qTˆÑÍÌì×ßæì›óß•q[¶ð…/~&µ8¨ü‚òót$tý¢üž^‡Ý1Àþ¶NÞ¹Ü9Nì:Im®†ùÀŒ(ˆzQcaú',Í_].ÌPP_’]5~™u¯¨¼J^ºrO £ÃLIU¨¯rhçgyáí‹2Ãõb¥ËÄ-I½?JȵÂÏž*âÚ°Há*­EFj«*¤"22ë'9Nmy.ö´×ذ›}’¢eļ.vÔæãò­RR¸Kéo2·KÉäô8cS—ż]aj$ù=·ù6%¨V)…u¨bNs9j*úû÷|šWÏc,ˆcR©xéÒÓŒ¬L‘Ÿ-ùç@³— S˜ç.z8±û8Ï\›gfaò²8÷´—reàG‚”C¼xù-;(E íÈkeäôT™”|þ¾ýtTÍRªãjßÿ%` àMäpÍ  ·¢‰¿ýÎ?òÍs±æÌ[c¢2½B| ò4AJJ}ò½o¢ÓÔÓd12#á+5z?Ó3ƒ ]adü"+–1ATl[ý˜‘´ òË`ß‘:cvJ‹' ¹× Ÿ¾B]åc4é1;_@iu2—^i|¢·ãªøÚ˃<ñ±^®ŒØ¼2ÏÃǤL˜ N™5#o@e ÉØ«Ô!7æ†$£+sb¦V©Ò †Jxó ×§è츛od™¾ŒÎ’·éªÕ‹cíh7£ ú0ŠE[ˆìŽ¿ Öùa[)Yf&'4x\ËÂ?*¢©ËR}Ö2W§Ê;U­™õaAB8£iÇT Œ/ŽÍ±·©€¶Æ’ƒá©»¹GÅŸ²³V'ªMôÃì/lzpå5á¶Û0uÌ}/…Oéà÷¥„žÞûžö‰M!„ÁX¡NH-&çí%'ŽÐ&ÔP&ÈZ Ñܰ?³f°l3ˆð°Ã¸ŽRŸ"¡¨´ØÃ[g^¤¡ícøÄp%©&KU…?–%„­Â¨îò‰õ6»$(«ÄRfxRÊ|ú^;¬ÝŒ€t™ðˬ®ÙCBˆVÑÓVº[”äHjøÂý„"{1¥¢,Yž'©1 «ï#_ïbÎ ÷ì}\ŽE¸Šµv穸:fbÉíâG¯‘ð}ˉ)9Ò“ µ‰Ïy‚§^þ'v¶¤ 3îpr¯FüÀ{ºî"鞤0÷祽Æ}í÷È¢˜EåWàóLÓÖðq!ì™Õ‹46?Áw¾uuÊ˺Ë!@÷K®I5Á+6¯TÞ*Ò÷µ›m/¼%†A½y;IŠ•åu.^fyy™HHÁC.a(Ø‹ÝsIÄÏ4':uWÄàôŒ@ÖĹk×Qå%8ÑÔ"®1Îy!ª®šã¼=r–:]+®€‹óN;ÉkkÔ‡™÷‹8Êéé'·ÄÈbŒ%uŠ*¥ß{´G¤¯†k¯¨K'5;y{t‡Í̆?&%:%’¹M‚åä‘ãû93v ‡kX,ò¯ÒwuÛÆ ë‚v·/†qQ†Ñ ì3³Ÿ~–Q?÷O<"]¸°]>ÿ{o•ÁM4èÒ«®R ÊÊ ôö𰬧#9Ž^ÕMgÕ#ÌZ~(•¡” ññ*••à,ÙÞ݇DŸúÍ¡½º@¤lŠè„CÜÛ ÷öÖ£ÉR37çÛ*ð“V²+—±7ÑâµéÙ]Ãù’̘›öÚZœî$Ͼóû›÷âr ÑQodÞã‘ÔðbÈÊ—g ]¡£úÓLÌõa±Ïàs—àp8‰!)£ŠoúÝ (˜"]VÞ-ƒ¿ÿi À&8ÒW[Ó ŠYY†Ìò˜?ì'JiÈÍ+Ê\ëÓiR2&*Kíb‘[H`&èÊf~ÂÇ¡}Ý"CçXó«0i+èÞ[,žÀÁÔEcž—¬"@»ÃÃñ»›¹û@;ÕéA\oËQò Ó|ç3ÝÕ@é}}e )]•è“(mµˆ /ê.¨äíË“Â=ØÖÂEs¤T^@‰÷ œŒÔO6±€÷]Oç‹ZiÄ<7GUà AÁYÖ¼°¯I|þVó:ÞP-3‹¯P˜lfgWñIQN§p…ñ… -{xõüºªü¹FÌ䇕hÒw#¤Ë®[I8ëáõ»X·ñëÝ™UÕzñ$³¢Jû8t´“œ{}¼„ö®yq›½ 'Ÿ¥©ÒÈøø¢Ì²T!ïn.LÏ“T­¡ÑQ©ã·^Á6(”wpƒ_øýÇ·psÒ·XúªîªÙJQNŽˆsŽÅ8½;ïÂHíQZ.Äš¥2¿–Ö­j;ðˆ)Ô΋ÇàcÍ>⮫eaÜO$—(P´¨<&±Yê÷=Ȭ¹Ÿ¤Sr7”"ß䣫«ždÐ@Cqž©jJÛ 5"{ $Çg鮈¨¿VÒî*€‡”Ú%ƒOÜ:ð›gë³ñÁÛpÇ[ËĪê),lep@‰ËSO^Áyê]( Ê8wö*‡N&´Šü¤¶â.§’‘ajÄ»wIyÓë:©ËžfaÍMu­0{|œûæõ»¼BÝ©iª8"Áõ0»XJØcåÔá»I…š)­•YžD«. ¡ÌÊ…ÁBŠÊÎÈhJ…xò™§)ÎîÎ\ IªüÂGÉ[fû]âSlÎþ{ðWÒÒ¸º¶ƒI/Â"EsS©ØP“ A\^Ï>––f% &h®;ÄÄü[b€QSr?ÿô­ç¹ÿ¡f‘¼?¢·æ³~;U4â"]-^–Çf2ç¿ûáG1äÏ,rñz6µÇÈÖo`M_†—Ü×X»0ªK(/4{BtÌ‹Œä … ÅrÅ—ä°0{ Cv@2'±=Àí¦ØœÈ÷VvÒ°ÉÉ1‰ÚÒ‰Pi¡ïÂ(ÑpJÄŠ‚”ÑÊÂ@ˆ°*‡EÉíýGsq„ßalé*ö¨«½tQ¤µšÔšW_ÖÒ±w’øM7¡>óôU~ù7‹%;GGq¯-£ŠçpÏþÇXYmv9SÃWðV ¡9_§¨º˜¤Èâ¹Y%¢ObBȦ\TDf€U<þ‰?Îôû{Ïÿrbö?¶T«¨¬*F«ÛE,–Ànw3Ò·Bc[?¥ÙOHùÙ ¼@Ma‰Om™ê‚¼rõy/óäg¹åûIövïaðª—éþñíóf ج9T¶ÆiÈrIçŒêxgæ´T"ùI3m­•¢E@“¬‘T‰è±“­fÕ¾#eºšg^ÑøºÚNÒX¿W¾«Gz?Á'L ^JùÆÈû)Á¼ÕT`—EV¶1s º´4?”*©¿kR b‘NŸÞÏ'Ù¹ï?üî4uŠõ š‹±:g(­îá É…ky• ׿ب ¼É„Ë;ɸYË­üm#{y§ÿ9<ù§)ÍÛOHÊçË/k3ÂÆé™—@­ÒÖt€ŸûäW¤¬F2³^RT'< –¾ixô¡/sxߣ™r«VkùöÓÿEó…Ÿ7‚Y^–V¨Ë¥ÜW”¹2«BO[{ •ŒæröœEÞ—°£%†V±O|Å55gtfˆš²nÑ Þís½~Éßz¬ãtUìfvµŸ’â^qŽÞ#wã“Êòíg|™€|ùnPÌ“”b_h^ò3.n³EÐPÌ —ÉI_S*U%•å­™~§W†ËŠ[YZ½ðÓ!àNBQŠ-MíÑTZV€JðUX˜+e³¿{•T€Á§…#ìb˜~e¢œD2!pŽlŸ#àôò싗Ŷ6alÓSVÖŽy1­à:Yš±Wѳ« ½¤ŠÕ²ÎœmZ¿˜|Î+«ÃÄ¢!Q®&™uÆÒ§ ×ë3ïÓƒO/†ø¥Dš×†¶Éð# @:Òä˜vid¤¬¬¼P>7pÝYÂäÛ“˜Í”T¬0¯0ÓPW)àQáwùn9O‰IÔbo+‹ókxW×ÑÐËÁ# ØÖ+ñû‚dçY1¯0)R×íO>JZ²¤óº»ýTæfEæP ¡°¸Góˆô!G~o·§Î,…iD2·7Ý‹CÌS"ØÚ3ñ!ZõmŸéuZvÔ5“›SF{g·KP¢ÕPT$)rmú¶óø„P*3è±®o®Hd“e2H×™™gbz§wZ‚Ï@8?¯BØþO©©êΘ·ôOéÛy†Æ^ä¥7þ$Ã?÷ð_Ò* 6€ôm¶{ºE°5ñÒ™/Ëñk>w¾}6­T””äSTœ›é\8Íäfzš§VnûÎÌð¬ävXŽÏË *}’¤‰Ûã—XeðBz³Øß¨íé;Èòój$ý ™;YÒˆÅãX„Kb‰ é‡Å:!‚ìàfÈ9µbÝórk%ÚŸ7–ÑÓLn³%HÄ7ŸãÛ¯7ß§s»ý,ͯÞv.ûêצÙQ_‘ù^ ¾A*½€9ÇÜÂ0¾àRæ²ùÍu<vr¹ï»ìÝõ0Å…;„tbÞLìßý(ß"Z­ž]ІÉ»ÊðÀº}–Ñ©ˆÆ<.ÛŽ'2·Í¦[,ÏÌ@<¶ù:óyúu<±}\Z;¬/[ïxξ³×DÌ(‰KYt8=â WXY›$”¾Ò£Œ¿GÖB8ââ|ÿßK&‡ê_Éü]«ÑÒT¿¼œ¯É{%9Yy™ˆ¥¯v§y®\û ?¸­ Ün?0÷•Xe8@¥È”•Z‰:®"¡IV³˜ *¶fÊÒó¹¯ü†t(uË©éÿÓÁJ§ÝÄaw²º>%Rw9£ðn•µ·Ú[»cN^'Y”pæ7UÊM¥–ÜO#*•¹ßÑ/æi~û7Ƭ¾±¯Nf-,LžõÏÓl@µ© t¼;˜äÖêb2½¶˜ÜN“ÍEç­A§¶VS›«Oòãø½,–8¯Kf~Œˆ…*v«•½ÉáÝèCsÃ!~ÞæU-°ßï–On潜÷Æäz}Õe½¬;dÒÒ&8ž¾dœTom&ô[VíÓ"dvˆMI›Ï*Å»FÕòHú^„ôL9¥4ÎÍ/09=„Ó'FIqkÎ߬åo¬ê¤Ÿ/ |‡Š²f|§ HÓŽãR}Ê3¤èò¬0%M+eR¯Íblî™Ì÷Mú|™ôt-Ž)¶vN”=Ösä{?ü“'Õ¾”ÜÆ¶)XÒĸfq05¹ÀÕ³l¸'3[úÊÔüüMÖö¦÷:­isßQ,Bcͽ<þÈ_dPöä¿À’õ´ˆ(#†LÈóv>ó¿ù#ù¡Õ\X^Z9Ú]^U]ÒöÿaçÖöày"Ÿ§¼~»KJ"¼=ã· |ëýͳƒål™ÔÓjrÐi²„„œ X„G$³å÷¤)B¤‘Ÿcª üÏ?Ÿþ‚t#½‰Òc¶5[»¨jžÿÑŸÿçÞýmþK"!Mˆi³­;Ÿ¡ð’hôkR»Ã·¯áÝaMïÎ¨àŽ«@Û¯içYçýê^øŒtaDÚzšU7-¦¹ üÔ“oöÏ_9zWÏ­Vczï2ÙG´‹ST[ —ÛËÀµ Ì,ô qE¤“ïû­Á¿_pnZ Ùþ›ü§Óæ$«µÏý￞ýòó“[ÛgÙ­³7Ø{kÆÕ[ÛÉr·‘SßPYø»_üô1)gjÉ[åG„E$S‰Î×ú¼] ÖÆcqU"™úHP'aJ O$¯^›œœ\NC=->,[ú7íÃ#Û›§ß»K$½Åt+%´[;ÉoÞFÿQ¡áÆNõçV~„ç¾±û#±µA:¸µYÚ¿5ðÄͺçÿ 0¶d=è·.{/IEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/1pixel.png0000660000175200017530000000017012664543647024167 0ustar guillaumeguillaume‰PNG  IHDR%ÛVÊ pHYs  šœPLTEÿÿÿ¥ÙŸÝtRNSÿå·0J IDATxÚch‚ÚE;IEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/right.png0000660000175200017530000000127012664543647024104 0ustar guillaumeguillaume‰PNG  IHDR^ö¼tEXtSoftwareAdobe ImageReadyqÉe<ZIDATxÚbüÿÿ?½ˆ`dd$ˆ± 8Óß¿g™ÿAôÙ³gùqY„l ±®K,M˜•™™9$7;÷iºŽžF:ÐbÇü>ô)1àß?L ì0¹ä‰Ò ì¬Ü ÚÚÚ=sòž1cQK†¥ÿc`O‘åû¤888R¾ÿ>c^Á3&4µT³” ].¾[fñÌÅÏ™°Y ‹S¦_¿~MgeeM#%.,…ÐÑ é`XRñd1''gzt»8J3‚² 0E±éQ-âTÍËj^2üøñcÈbP€ /8AüýóŸª8¼A ÔÈQ c°B,ýGuR#‚a1²å~ÿ§ (F±§¢@ú•o±M‹¿Í½ï@v±¢”Hÿ£™…Û&}`xóæÍ “ÅRPPÐìšþ‘áÎ;TUUK@~Cµôõ}ºoîg†k×®m ¿‚²ÌR°m¿R×ÒÃK¾Â,Ìr_ñ7]°„Ä÷äÉ“YÒÒÒáänʉ!vbõw¬¢”H@6‹Aiv"íãêßhìªüìÆŸ8-D.{ñ' þ -(ˆ­„ÑÓÂÅí¿1,Ôó`ùwiÇŒÿÔŸ¸L×rÆtǵ½ÿ ©B_ÝóÃB ¾в"Ñ-‡¿Ø³Ó?˜Üƒÿ0,T·cü‡MÑõ)¨úBÇ hyùòå² »¾2Ü»wo²…*ÖÀjU-Û©CÇÐ'èää¤ M„< àP‹QŸe)¶Ö ¨Xƒ†(¨ÿÕýÃÕ„€EÿKùùøEIEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/gui_quit.png0000660000175200017530000000207112664543647024615 0ustar guillaumeguillaume‰PNG  IHDR szzôsBIT|dˆ pHYs  ÒÝ~ütEXtCreation Time11/14/121ÀtEXtSoftwareAdobe Fireworks CS5.1«HëIDATX…¥–KnG†¿jrO.²qà„cHâ(¶qm Éèö <gQ Qøûà—±Q<=Q-6’ @Ztq&âmðIA"ï÷ÔJí¸b§x ˆJµÍȳG—„'¤µxa½Kºí{AÆA°ªîï= ÎuSÿ™yO< Öi…IEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/picto_branche_patronymique.png0000660000175200017530000000056012664543647030405 0ustar guillaumeguillaume‰PNG  IHDRÄé…ctEXtSoftwareAdobe ImageReadyqÉe<IDATxÚbüÿÿ?­À¨%$tƒTÆó Iè^œÃðY~ ƒ©@¾paöCb|b€Æâ€EšØô’\ DŠ ®ˆÿ€El‘bˆŠx pâçÝm†ÇQ#@ AÖž¡QH• Å ŒèÅ ###ºšùP:‘ñ@WO`CÖíÚFtœ4B}&€–â rè€ÀR#T€8I,*ö‹ 蛺&±?ß*ëwogaX¨Ã‚ WÄc`î>Í P¡@|ùä+8@?ZpíÆ’è•ãé‘ãÿÓò}²H1¬>amH :K †cB¥O“IEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/img_documentation.png0000660000175200017530000000626012664543647026500 0ustar guillaumeguillaume‰PNG  IHDRóÿa pHYs  šœ OiCCPPhotoshop ICC profilexÚSgTSé=÷ÞôBKˆ€”KoR RB‹€‘&*! Jˆ!¡ÙQÁEEÈ ˆŽŽ€ŒQ, Š Øä!¢Žƒ£ˆŠÊûá{£kÖ¼÷æÍþµ×>ç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-Û cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅFÛIDATxÚ|“=kUA†Ÿ³9÷£‚ "IP"HâMç ‚@ñ7bçð—X b'Ø-´ k ˆ•Á|€ÉÙ³3ïXì͇rãÀ2˲óÌû.³MDpçÑÓ¥ˆx°Np#"€jн%/”¼ùõý³ÇZê…—F‹sÍÚÏM"v‹ ÂD66³“E{žqTÜ-Î6·—g™;7"*…jWÕîgNÎ03ÝróîCþqj´4Ï«O«¬¯oÚUA(ØØÚ¦Ë=cl¦¶\¼<ÏÂÙÓ¸C„÷À%޲úã+/?LîâÛÚÃ4 ë:Jî1ÕscŠíŒÑ ˆ @.Ì 9gî]]¨ò«:"‚'o¿ ‰ê÷^ óÄówŸ™ž>J×í‹a$‰¦>ð$€™èK¡D:²—›ÁR FcP̱ÎÈÅ1m梸0©ILŠ}.J.äâmyл1œJÿ˜(}˜êð˜‚Þ„{ WL(‚ÞËF.¢H R¢H¸EÀ@‡Z LïÕ‚„RP$Ì„Yíìmn”¸rm™hÜó@ã|0¾xózåãýúóÌ?ã}“šZpböúàÏ!ÖŸ1£F­‡IEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/gwback.jpg0000660000175200017530000000220612664543647024221 0ustar guillaumeguillaumeÿØÿàJFIFddÿìDuckydÿîAdobedÀÿÛ„ÿÀÿÄ¢     u!"1A2# QBa$3Rqb‘%C¡±ð&4r ÁÑ5'áS6‚ñ’¢DTsEF7Gc(UVW²ÂÒâòdƒt“„e£³ÃÓã)8fóu*9:HIJXYZghijvwxyz…†‡ˆ‰Š”•–—˜™š¤¥¦§¨©ª´µ¶·¸¹ºÄÅÆÇÈÉÊÔÕÖרÙÚäåæçèéêôõö÷øùúm!1"AQ2aqB#‘R¡b3 ±$ÁÑCrðá‚4%’ScDñ¢²&5T6Ed' sƒ“FtÂÒâòUeuV7„…£³ÃÓãó)”¤´ÄÔäô•¥µÅÕåõ(GWf8v†–¦¶ÆÖæögw‡—§·Ç×ç÷HXhxˆ˜¨¸ÈØèø9IYiy‰™©¹ÉÙéù*:JZjzŠšªºÊÚêúÿÚ ?ÞÒYL§JßMÿÄ ýO¸þi¼NÕáþŒÀý½7IŽ‚Y¦ê -2/BGÖàÿkúýx<ûhŠƒŽ˜x½xz^¦ÆL$i(BŽJð€{Ürèm~^?¤O.¥ýÒµþ›ý?äßjþª?Ÿõ~ËçÕhzgÇI$°^PHS¥&b ƒêRß«óùähÈ ðé¨ÊçËõêo`ÉúÚÿ^ß_Ûx€qþŸÿ\%,±;F¾WUº¯õ8ËOÃ?Åjâ«Ëµš‰1 -ìki­Ž¯C‡8tx€™l–O?þ„ CçéhoÇó–M3©9ÏóêT¡üUçsŸ}Γ?ÁÓû™Ÿà¹ÁS\ºr™ý!_È×Ä®yðõåyøªÊYbQ‰àõ—_e)—`ðô ÀuݦšrÕ_kDU&+>¶”h­©¾¢É$óssX 6ÝRM÷}ŸR¥Ìö­™À–Îd¸³”Ö’£ÇÑÖÖÀØÈ(7¦§‰EÌr£cšCª(¥xí­7Ù÷ðþÀvà±Gùñ·_‚õL6Ëй/øöâ7„C- ïh€Ô‹%-^zþ4žòš"Ò²Ù!B¶”rÍñ³&DZ’hD%²Þl,@•+•;üRv+‹€²€ò­Ù™«…bqq#ZkÿæLv(  è‰Çb}=Ý;Ä¢Nçr†÷\O©ÂøéK.Ü®ŠåÏoع¬iÀ©¾¨ÿT€y` ²+ÿ\Ð$вˆäà6ÿTïüÒP¾ŽIEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/img_unknown_woman.png0000660000175200017530000000562312664543647026531 0ustar guillaumeguillaume‰PNG  IHDR––³cæµtEXtSoftwareAdobe ImageReadyqÉe< 5IDATxÚìùOGÇÝõ '±c SS(**5jû[¥þ÷­ÚJi“”V0P®à°ÈŽƒ‘-õët»¬vwîõ<¹•“Àz½ŸyóŽyóæ‹¿~ù-eDg±ñß?ÿd„¦òì×ß-ó’ …S+7ÝîÍu—¼Ÿ¹—™Éd BÕõ{½ûssxßn}¬Ÿ|j}ôÿ(ŠÅâò—iÛ6å hÐÕe§Ýju.;øãÝŒ¯»àŠWiåQi¥lJÃÖ» hX$źã—K³ss½^ã¹}¶ÓD‰ BöRw.ç ¶a<=8¼Åõ¿7¹B~>ûÿWÄvj:wXÝó¼Ò¬7ð`èe~©X(.„ñ¥v|ŠIOÖ§CéñË\á!̧,¥Ô!žsVSÁ×Ï/ð*¯¯Á|Š¿]C{Le*ð ©£êžAvàU÷UôªÎ/NA8Zœ³÷aâwœÿÌ5¨UÎ#ŬEóëRøÝ9z¸úÕê!ÌdJ+âýî°«¢E®kOÊ!t½†ëx/6{ù)¢raNâ%¥ŠË%E*äGRä—iS !ÙÑ’Ò_@qmëñ-„ΧLErvùªVEÒþÛk6>„“ä“zkÂú|Nµ?j!¤‰¯NåÑŸ[èò‰ÕBHÉ€ìåTJHB•«SªƒÊÛT²D@œªBøl”öŒ2³ÃÉ5 ¸ÜIFH¹ÙS¸P°¨‚°YoÐä‚s…|y}MýÇÝãàpÉ_©ÀüÙnµ(“Êö $ ápa´% aõåkúxn°’§^/‘ϯ]„ØvÛ ÐóÛúîÛÔ‹L„¬ø)«‚®ñë'aÚNS^áñö7*óC,/ k/á,ÝÓ<~)LD̆r™ç]ÍâûS jóéËðH>HŽ izí¨ßrr>› üM&“8„4š”+<ÔÎ{L vãîÝ‚!TÙ‘!2¼ð2“<-ŒùÚÔÞ¬ôö´‘çñ)’–ãÍ-â-æ’M$BL,Ûß?Y<8­vURp¾ry.ÆÛVổVʤ3—_;W77À©~~–$‚Ä4õi=ÕÍÇœ\h™]lï‰Jù“m`~Äg)¯ÏùãHP$­Õ IPA¾×êÖ'C(á¸M$вGzª©>BÌ%i;Í»‹·4[8¡êw²Í Ù-`€œ€ZåêHîʺ‘p0Ëm^ÒN”Cfª¼¾&½/½Aeš§mw ˜ô:“'™Á`œ&}Ò­Ýš™HµÛ§a³1:Nï´;ŒÇbê B¾²_y«xuƒð³G3AAIî͈Òý·†Å9«ETagâvÀt²L8Â0íH?D1í‘õi9Žv«æÇÜ×'˜T ÅE²^Óív[õFq¹4¯ÃzS’FZj>ªIý:ài*Œ$áý‰Þ¬A(†U¨mV*¤#4–L{„ƒŠŠú—n·kàÉ·……bQŒCkòšüY¼ž¥!c·^h´P„ÃTÇ…K³²¯B4­Ãæ´ä#¤i—™ÊvkÊ!4ÙÚ#¤?ÇHJzíLìö…êo´Ÿ4öÆWóyƒ0%WcüViå‘ÑB…âÂuì8“d„1¶™Ô[ ÌBãm‘ïÓG­e²Ëþæ¿“xÉ!¯!•D]rÊæ$Žv÷È.FÌÛ?<Ñš¢}g"© “îði{îÑ»nÍøëB±ˆ7ø£ÿœl²‰UýÆûòma¤"šæ—…ò­nmËJª¡—þõ¯@7#£…"„<é$Þ—’¸ÝúXwðÓq¸|„¤9KÈñÎÉh‘³ÍÉûÚñ)å¹5S7‘º–©ÒÏ %þ"c-%ŽMu›®Ý)¼w9Á£Ñn#•*…˜Ç¸šxÄ\]Œfýƒ?NÕ¢ZU•å:ÄÚp1~Ÿg3Y/û ä$°êË×p\U•@Ƀàºï×kù}TÝó¬ï«§Ï@QÙ–a¶\ÍsÞÕšhÇÞu„lݜ䆰®šºhË‚µ‹wàxcŠËq®»),-úoop¤¹»µØ t¸sq´»GsDâ¼®nntÚÿ¤ÝWµ¡»h…’_Š®’?Âè¾]ªªlï K0¿Ý—oÌÃ×Ý6ÿ?P0މTÍQBÒG†U7  èá[ Ù¥#™Ùò#:q#<îF€¡`C*K?æ¶dÿ ÇV{ãÆGåÅܱéBȯ+Ë:NáÆ™a¸c•ç;Ó‚w5\™“_3Ùìñû\µŠéƒ×ã3—Þ™0:98T„¢¥5?H‹OŒxçÉlî4þú՟Ϥ›FKk~)7™Éüƒ&œd3Ò4z9q)Â>Á†/¿_y+r="îõío^0ê2!†^ Ùù¥¢ø ‹ùø…þ îƒÀ<´ðgFub¡‘˜ZÛH–³̃øà—Gë„|\eÂðÅCi -VzpPy¾–¹2Ï^ÎÎSí¼!RLþˆ-ļqˆÛ•ÚD¦î8¥•2à Îd2°m4sž,¯¯qÝŠeQŒ5ÌÒ›ñ¸ø&ôùä:\çU;6<çì½:çð8TNó®F± úî^«Þàtœo-lÖ•;µãuÒöœV×¶³ºyh1LN.ˆî\2Î^e~´ô/žÇH9ï¬B²¶4Þž?…yhQ\þRJ[’“›°\eûô¨ºŸJŠ`,b# ÈòL+¸ÔêæFù뵿ÿx*þëïrä±ýÃ6a‡“5w¶®)@ÎÜËHÉõ£hyþ[b¦P¿`êc»»fIâZ (ÛcË›v’Ço°Ú®#Q+©ÄëŠÕý€w“äã˜1µ07 óÙ¬Ü/ERùþ¨7ÉIÛk†oÇõ{ùc÷„ŠÎck5Íá§ M²>$á K,ëL›"~;üÒp áy8 ê´%_í‹¿~ù-eDgùW€N{øßIÙgIEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/gwlogo.png0000660000175200017530000006317612664543647024302 0ustar guillaumeguillaume‰PNG  IHDRHZÚ}ÏtEXtSoftwareAdobe ImageReadyqÉe<f IDATxÚì}xS×ýö«eÉöõÞöõ6ÆØ2fO™ “4 &mF› ´MÓõÅÐÝäßÒ$M“&6IÈ,± ;,3À`ËÛxJÞ–méjoé»×bŒ &ëë×ê}žóHº÷¬ßѹ¯Þßù{Åòx<ð /¼ðâz°½Cà…^x1‚d±XÿV©¤‚MŽ?öÞglY…b}‘¦w!ùïÖß[I^xáÅ¿?¸ÿÎ㻃·È/ÌÉsÚzv¬XXSÌ õŸ.sÚ¦å_P囆·m>]ÿ‰Â—˜·Åh©-_;¿n4Oiyèv“y¨8ŒXA\R—‘üÕ›øüà<8O* úΛî‚ÂûÕ{á…ÿ_dtP2ÑÝ'"}DÆ¢C'ÂaóH(_VÄÒ:åß`±8!Þ[`öXAHD×\)GÏßtIUY ÍÃú ìðÍ5{Ï æuªÉ™)QE@oö‰Sñ[‡Ìœ ñ¼òUÙìä WQÞéà…^Lêbÿ¿FÑQɤ+Ÿ}y‰y]§ÐÔÞƒ@qø¦eé”Õ,#„"$ÆO£”)³žO(j÷ *pͦŒf`óv³©“ìèÓ¢³ë¸\"Îà ¡|ø<‚²ˆCÇCóJªåÈ‘±Yj/9zá…ÿ6y®ŠEÖ6ÿ²äÐÉiÚSçRËvïÁ!î)ÌŠÙP0Ôö¯Ï\¶/ Z\ü0¥ÝT¢ñü 4Ãî"ܾTeì…H@‡gu›u&,mì‡ÓÄF{×iøÍ%›;>,9- AI4ÑF’’¤ ­ «ó“§«¼ÓÀ /¼øÖ òå}\éá³¹ÒñÇçÎô(MÖ#”Ó6ƒ¨nQÉâc²·Ò$)5›ºóêš{ó=¾?/còû‡m[°h R#oSt vî®VoÞV<=ã{0kg`PÉB 7µƜWYBcáHýÅI°Ó¤¾6{ƒrÁB({J7F†YµÊR¨Ftyé 2¬[²Ra×{§^x1¾±5HF¦%<[Âg]TÒŠpcH®qcS¬»¹æ7µ„Ù˜eGîkS¡·G‹¦ÈùRºŒÔ/ø7Å;vóÀw)…Ü𡘮ãÓì.¡&42¼pí’gKkÚ_—Õ7µõª÷I9©:ŒãP A˜‘´‚ȈO%N5|@TœÏÙÞÚ߿Գ´{„»1ÁÑðAËn?º_L_=ð-/4/9~L†#W-h)õN/¼ð*Èoqá™ùªžÓdES§Ìîû\'Mxäâ,.]¶õc…/‘ѱqýªG‹,až4qµŒÇ¶ï £´†fʼnöԢÇØ2> ›fF’n;‡h®;C$ßÙâp7ô÷+w—ýšÊL\¿fÁjô§Òä9›¤ê¥ûΞ@mWzµƒDÏ0/ïd•¥@"¼S&t§C¯£v³à„CiÓÿ}T=É…|Éíy‰‹ieº‘ãgŸg¾õ Kê2^xá%ȯ^1ËBôŒTÁ4lÀ§•ç®ä‰-‡Ž‡JÍŽØÎ$rMaÞô ŠÀ°”j†?SU7ÉÚSmÃ:Õ£ë;ÎvÊwID‹¤ º˜22|•,8x]Oè½‹í¯ ê .Iˆüâc/—t¨»1Ð{ g[÷#@h¡nÏLR,›ùyñR-ÚÚÕp™ ÃXʼO•n½{ËŽ¶!u®ùÁ¨Úw„ç›Ü|3e@ç@Ò“¯³…ü^¾D<{«¿0¾Ä;e¼ðÂK·Œ÷'nïëÿsޕσÚ>eLX8Œ ÊÓàòâa²ó‹†õb¢ºþúÍ9´šÌ³;-\<°­bø ÷üøßj›µ©¼nØŒ†\êéÁò¬uŠÐˆøÒ µ?ÝÀ÷ ’j©2Ô6 %"\š†… æ#=1,WÏ6wn>›v£ã‚¸¸=÷^ܾæ.ôS-8Wóëm¿ØùðRÉaÄ_?ÌÑúp‹zÕfôÔ¡©C£+•e¸F)*{¹EÕ+hr¶’WJ^xá…— §Œ˜ðÅ[*[Þ/Ñkþ¼Õ¢“¸g©8PÀÞ13}¡<=e™òØÙ×ËÝ_Â0ÒP¿$œonË7ybJlN‚JŠŠ§æÌÜŒeÉa¹þ%Ûæ`aaJ‚BÌ·Ò®ú,hMçÑÔ}}#çÁÆKmœHÄ…úaÙ¼4H„ÉDeý?¡Ñé#”ß¾Z_ÌæömóñD>á˜c•—UŸ†Å™Eܼ²[X™P¸^êçÒ£N5@ PÝø ¡·èÀµrÀá@kû×rÀUé„4Aò”›î‚wK^x òÆhj¿/¯§ë­†‘ÿSr¡ZV8¬)'Úêúp¡¾£°ºíïeÌV=viUëÉŸ·W4 pJº4’'CzJ(f'ΆªK‡ÛQ¤ÑlÏyXUòÞÿ|ZA– ì}dÄÀn†Õß5ÒØð¼î¡.h»a6k 0BoâFΨÔZõXû²¸L¾¡oà4Z»ŽƒrϓźáÏ„¿¯›à K­NÚSf{ÂCS¯E)àrÀ–Â?4ªJ Úæ—”|–WòT¡pT-êlúRiʺmšU¶wÊxáÅXcŸæs+÷ï/_ÐiкÈu-ÒÓ—Âd©§ºÔ"ˆ/EtTxÜa¥ÖBj´­0Û:w$Dû>6XàQ¾|Gijø²W b§!\ŽÖKcÆŒÙpº»•Ÿ5ôç¸@ógÁsØ6Ÿ8P2`°ç%D.†¿;;=íô—¾eÑû%/¼øV¾s›˜èCTLŒÖv¥Ùj¦Å1à‰ûQ^õ ‚øþdEå~¨ÍÌ:ᆄ`¾R=dÝ ³€&7<Ÿ”]„H,qŠà°W¢©éÎÕ½KMXÌ(;Ocp@Sý¶™) àüaÖ;` ó³œ‰ˆ#ãÁ8©´¤yà¸c"ö'“bsˆç7Í-p;L[àì%mn5¾8 ‰ ŽŸßÉ]Ž÷ΨåçZË$¾îb­–£š‰-Ñ’P‚Ã5 [i@JâíX‘í³ÍG°Rn46µ¨k¥k4¬.9Ö(¥¯(ž¤¨“;»(·*6 qÊ™«)·þ§›Ζ’¦¾“$˜ —µ#+ùÕ)“¤×Åö‹LùNš´èò=…Ëæ:9z¸h2uÑdeÚ¤Ôpž!+Ο„€çød>íf;ˆŽÖø»¶‰{Šï»M™ ÿ—rTÿ¾ðÃ/<‘6ȱw6yqÐðþþ¹Ø33ÞÝÎÇP©²ë†­Ð;Äî½E„ÝSbEzŠ«n@ h ª ÒÏêœùÃ#û¥ng?™™°\j¶°‘ž€Ì„Œ}á’@%—CÀNãrÂìŸ%‹ @ËðçPëZ "&¬]~¶ño”P2_ª³™@©ÛÐÖyAb±6g9M¦næ=ê.Ë ƒ¥^ÙN K³é6¦-ƒlá<ðY­”™%*0yÂòºÕ—àaÅFÓê»j©øÈ”Ò„¨YÊØX'u¦fã2}šÂae-1íæQ?‘è®‡ÃÆì”ä<¼½xŸdûžcódgê÷V7E+M ¾]ý ¹w:yáÅׂétŠù™ º|þßo 2„߸knú£ðøÃjðenÛÎ\h‡ˆ›‹áÅ‘.‹ÔvWáïÇ’l ¥j=¿T€cÛòVÞOÍž–…–¶Ü‡/(29Dxì¶5´:‚J«†ÁIJá°lp¹z ì7#:FƒË»;b~¸.úX €&dèli‚Î2BV¶©Ð9¨W–CQÓÿlÒÆ Í¿Ø5VŒÆJ,Idïà±x²½çN”­‡<][APŽUeï^XR­ÖPTÚôùòYI‹JÕí¹i !òÐ0šÈ­F4·¶ÏüÍ·Èá‘€WTgV’ž<˜+ÝQÙj-«T„ÁªÃ馣r(›‡úwW4 /•MDJ ®(‹ÌŒŽÞ¬±µI“c—*D>Ö]¡þ†‚½{)÷ûkì2“É-íuëÐÛ©CR¨ܾÍïöY8ó7ÅÄYˆéD>üy=”݉ˆ ~±üü®]bQbµÎœDøøê1;ã»Ô¾£¥T·Ž‡øPI©‡ãÎó ÖÃêÂù5bÃVÂMëÝÇçÙ•¿¤ÇB(å)G¤¶¶R¬]ö˜8ìê^|%üãç¿ÎæïÝæZt#ûMi1]ýHçi¼A]ߎ‚ä²s³*•(;©—™}Šª‡T$sÜî`‰dÏ›]±ýb‡\ñ›MÏ­ò|¡¥Ö‚«%?.4 º¾Ó" aÃC8ÑÒùr|ÿ@f~\°XúîsF¹^ßž»böÜB1KsFžGI$±`»A+=¬ì—Íì¥|”þbÑŽi ÄIªÑ0@õ é(‰¨s·ÙS2'5ƒ˜WÆæÌ•ö·©ÑÓçDXìtåôÄèÍ?Ûx®Wסn" Ú0 *ÌÌü$`DW±Q­ÌËв‰„Ð (êÛÑ7ÜFˆÄÒ?^ÌV“Õ(s¹†p¶ö44#AX½èa,5Š À®S]oý´bÑv‘@·G€Ððä[¼·#záŦDFãgå]=Ÿ€ùûƒ·ºÆæt!‹yýç§Yù¥$*â9y4ÿ­‰ÑqJ†(Œ!îX¹ûwO©7ÛM}Ùß_ÿ«\#›µãÏoseáaY…á³Iµ*dHv@Ý®jUu’åço«fsøÄ ã1;;—J_¬ð@“.þb—”ïØ”‘þ¼/g¡Ä"n—rH¯ßTWss’zC¥Ó×aÍÚMÈHÌAyS#ñÄË;eÇÛCK”Cù&‡ÊÓˆðOµ-H“µwh «kAA|è4ˆý# §ºÐ£>ú(«Î…K—Ô— £ÚŽýHñ©ú}ŠÏÛÕ[|8—âúŷűËÂùTUëÇÞMä^xñ€I÷A–W¤n79õKyl‘²o°m[p@d‡å/•ˆ3Ë*ö)mv–Òábmɉ2oæð“:%âÕÄôhƒ<)é­\æ>lžøájp§“ÝÃ8TUª0ZìršPu'KîËu†‰$Ró°÷¬¿]±ÿLitæ1V¸Ì]èÖÔ⮕?©w[.˹¬±W_w7~·û÷Ê_Þ³”x눊àÚ•P™Xxt ©àòlÄ…†aò{wüP^§:¥t±¦åSƒÁdÐ`ÑÌ<4ô ‚/ˆ‡V÷ |‘A“`,flåÅ·Ô ¿(klo“ê´6ÿ¥.¶ç\ì'è<¯}“.ö„k竞̷²õÕe` †‘½¢fõâ϶=÷æ‘VD»Öq4ÙÒi]*ñå µ¥0›e²ªÚ̲^;–šj²»c/Ý‚‹3ï”×öž$øçV¶›]`óðÀçqK=*oÅçÒ}§H';™û›¡ìo½g_Ù« Ê‘ Í­[T}bô‡ðËa»ý$TÿЩÂvŠ‹5³Ãi ÜAQz‰41q.í›H»]"ë_Ñ 3QVÕ‡UqÈj{Ìr!ïœ,7ØŠšÎ^ÒÉŠØÈÜ1kÚôÝG.4tuØ70âSdÑ[ ŒŽ¡õc]ÙáÊç•Õíž]Z³Fªíyq_;EjvF +6 Ÿ7Ò¤¹fÉ}ŠãµeTo¯BÆ2r  iCdIu¾á^rÎô•^Êð‹ÿ ÛÍ­"¸®6yBürÄÝ œ~÷¿,DBT[ay‹SË~µÖÏå‰f±Âl¥( [ƒ¾¡DÑåVW””χ‡®=œ ƒÖ6H¦Æ=˜Ïe-AK‡j½R“j£Ayô‚ ±"->¯«À†Y30?#IÉq ŠÆ°%z“ÁêC†»’ w­ƒú¬~gëŽ?<šMå$÷Éu&ýf¾/ÕMehV#- ôÕÃI“0XÑJ7× Ð@¡Z±6{‘µ}ƒÔéJ-†‚ЧŸµå­ò‹Š¶[ñùK§6p<"È߉š–O¡l1ÁbN'NË.Üœ»|ûs¥Ü÷˜2%:=ØôYe‰÷Ù‘^xñŸFó2Ïïôp‚6“!'6æ¤^Ƚm±<÷—Ùr3#ýwkõ]¨kî%íüEû;v‡û; E<ûÆÙÉ9;8\µ"<öÐv½¦&ןß[š>-T-ô+VSÝ2J«Er,ËçÞ…Õ9yŠ@?7Á¨/ß#´«,M]ÊØ‰ãµ½¥*uåÃnA¸¤VÚÞoSæHó”IDñç­¥ï•íÆŠÛ•ê¡âA}ˆ¬M'ÅÇä:Øù‹‡Û¨èP£<4&»˜¢ ­ddh:¬vc±Ç9´¯»K'Õ WcPíCd$®GfZ"u»Ô‘ýÊÌòÕÒ@éÂÌïçó|±ÙÓ2±qU>"Bĸx± ‡O]€Ú:_jw%Ђ²ªàôãƒÇ ÂÏ—¥I.ÂÑ]}Ã&RÙÅFZ$I’á…Þ)ößƵö.¡ü$ƒÆÎ£d.§¤¾Ë\vòÜ&Ï`ß«-Ö^¥«f]*[.åŇ”$…†äëDI|ˆqSßÀÆí¯ JÜy"kSùÚ%ÊÜÁáÚÝF“•¨¯;„ƒŸW!>HCÍžñóP\ùo`‹¿cABiîœ9xx¥\A:õÀ¢ôr‘OQV­Ãg5&ÌM[HúúÚI§ñp^«š[H—ÛÁô/Ô?LêaÓ —ˆ,Ú[yAÖÞk!<,”î¯Þ¿;.6‡r¸$t_Ý´<ÒÏM„™•IEÅ$QI4a~oÍRJD|¾SÑþÚFÿˆO”oÌ%3’Ã[¥¯BÕÞvÕAÔv(”#öÐ=ƒ&ªß ÓnºASŽa]=Èð<4*O!%( ~ül˜Ì6„fʺuç@5´ýý´×ɼSÌ /þÿŤAš—J¹D˜0GËrhì8€ €LÌÍ*›º:Éæ;‚$¡ÈN“¢òüQ˜,:$§Í,M°¢¬™Ê›=aaÑp?UžºÔ«àùòšZ‡Ás³ðÌ#ÏPá±Ï<þ§ˆN?í¶løÕÒ~õ;ºº ÖÎß‚ã Up{‚0Üs N»éÓ º½¾~3ÁuVÉŸßÖ—ÛV?·èõã–üĈ…è§ÎÀƒ>4÷Ù”l–‡0ZØ„ÉÂ.^”Dækh—ßàñABŒêºØ¼*WqæÂ)©H< Ób‡åþ‘Ôêp)]N%ÛÁ‘¹ÜÒî1bFŒCa2µå2O¯©É“u«ŠLV=a6éå#Î0t å­ÏVNO¼“ü@þØ!¦¥/…îÏã¦úuí„jp9 ¡p¸lÛòV¨vN¤2¾â_wÜŽ‰ï88M§—_Ï|Ms%ýr[WÚNs®cL[ÌkãWlë۶¹+äû7°áotzw²Â“i¾w›ë¦õÒeß½• ë ½\çŠ êeê|®óí)Ô3屜hã-in†¯]–O˹”V‡…‚'”ƒÑ¡lÂÒéžkδøÌNÿ5µTVLg©Éœ¨R‰Èà(l˜7:ÝÄ¢|zá# êpi„ƒÅÙòÙ‘ò]âÐü’_½QŠ8ÂÝF XêƒÍÔÎf%ÌÍŒÊs8ƒñðòeøääyðiží溆. ]ýX<-œÒ;Àb ‰¦înØì,ø ôg35/-†èìGVœ}gF\¬®²½¢¬ržÒcéÐ ™ó T#¨î,¥¦F£ w„?¸9•ÔˆYS*æÏ’uôœ#Ó#RŸhºm=VÇ6>q§«ôk ȇéô8&¿ _æBü ù×Ýæ·mß7iÛ•[æn†¿Òé‡S%Hš@˜[ìžžB½ß™*I^&Ç:…ß$k]çÂ/AÚ7˱ýüš ò:’§ÓÛ·Rè†û 톖ÍÓ#ü°2{Ö-|”²[[I.K»3X"@TàBØ¡Ä#/üjÇŸ?þds{ÿ!Ê—Ç¥‰‚€ƒVŠz®›VOF\¬"j¹3)M.Ö–CJØ—&¿ó»áËŽ"ŽÕ"¿g¨ nË0t=µp³ÂÀ1ï.~r×n…“ŇD$–Hq¨ª]ÖÐë³aD/†?—&Za­\†æÑÐáC¬›·6/6b1í WáDõ»¸}®Mž£E{O=a±waí¬@ø û‰h¢ºÅžƒi‘̈£°nV4ÑO“ð¬%Go-«3$’Û ¬žUy>×mvo.8[¿ã9PFq¨² /uÐ?* ðá6£spjì2Hõ†z2)Ò‘Ùðå÷Ò?í˜Mf~U…ÃL¾^:½u‹øâÞÕz:­¹…rLÞOpãûboÖæ'SlóÛ¶ïÛ°ík¿eî²:{zŠõ~ÿlúþÈ‘ÁºëÓ:}¥±dÊ3õ|ÃÞò¢Ëó«·ð°‹Þj˜#ͯ‰GC}9D¾µDP@šŒB& ü1-¨SÎauîv»QxäϺ܇JtŠì̹%{N·HSâ(r¡¹‡(BŒŒT8hÚ©PvÈζŒ ¿}`~ý^#j¢QmÀÌ;" äi¡u{h—]º~žLmà`@ÛϸΤÖÌ‘‹…œòw+D[þ1µ‘: ßYžŽª¶J„‰Xù+²Âñö×!¦x:GÌ0T‰¤·YQt´_º%/‰&²Ðê›q¶iH¶\ÊÃüx'BÂÀñš´ô¹‘îC«V q¦®Ñþqèí?€~==ƒprbÐIÕ"’³Õ‚äÀ¸Ñ1Ë Ö´Àæ”ZƒC‰(:šàs/AÓß ž?MŽÜÀ-@ué­~£ÿçŽüæ“– 齯ªuæu<ßõ8|Å~£¯c0N‡èôkºÞ‚µK·É¬ó>7þø…£ÐmêPI¿jº¯ÁìÕ÷Ñmúcý:ë/§IÛü¶íû&l£SÁ$äT•Т)ºîWëlî~§žœˆD¯Ë{+õ®\…Þ‘ãלdúÉôwLÞ·/·5áX2}³9´ôõÿ: 掫Ç%¤E?>/`¼ Kº¾_ßTÒ6Od÷DÈJø)}ÍŒ¾Ž›' ™§Nò½Ýœ ?9“,#%Á›Út¶|›afáb ë p ¡TCFFEÊÖHyÊü£¡EáÂfUwÿ¹6»¨€¢š‰! ;/=þI(û˜›á*þÃÞÏó2ã≕i 4]²à“¾ n'óLÆ@Qþ0XÛÑÙÛ ù¥PÊd±“Vléÿn¹tuÃuÂÝÁÔßœÛrÇ’Û”]Cƒ$‡­"?®ð¡þ÷~í6«m¨H(ô£É˜…„>š»8ÇÓ'õºát±Ð9›ÞI»ßHÔÂíûs¼üÁ«´›­Ãú?CGßnôSŸÎ«1¨°Vö+|vñà„9ÁqÔaÅÌ; Òó}d[|t7Üz½ð\nj©Îb”ù‹|H; sV!;1XÑ’A‰ÅÖrã¬üËüäÑ3³n²àÊg }á2„Qyäý–;ùÏ¿¾-~Kî~ü2¡ø_9ý]o¯Ö'?Ýý¤íiú»FÛbPúÒ¯°jÓ3£íŽÁ„mÒm}«ö}S¶]^g{ø¿)xA“ÙucYÓñ<*[~>i†,¯œgHnvÊÆ“×s_g™þ0`Úd™i!ç1må\^ç¾5Û0À!,Ü%ùZ*aA‹‘’’ góRWÁf0ÀjkFïp-º»ê‘?tÚ%ù»‘VíïëBÇ_¶nþ=¦T•hЫÕ¼¼Í²Béà΃ÁЉå‹…Ù΀_ž±=šTtS¡øëSÐJM¨ºÙùÇOÝ^¨éÍ•1oÐñÏáï–uà•ƒG5ª x㨖VœìÍïrMÊÔ¤ô™)ÌI™«úZ:‡±a¾©QA¨¨|n°·\››Ë›Á÷P`~ßÿôî HAÄAÛ|ïÚgÀwì¥Ýò{ÀågÁÊZUïÙâCg+¤Z[Y"ÿÓÒO/¾_ ð% "Âse‹¦Ïƒl:ãV{`³|„ˆ_f‡‰_Ý”Ž CÖÒñ`á‡'Y²[ø~¯!†4þòز›’Çõdò]n9êO_óðŒ‡.“Å „)ó»fÝ@&“Ÿ)w£6Ç“ã7mß7mÛ­®mý'‘cçÀ?ñöñà’ãD`ò3å˜òß4U;A[ë.qn h–÷|Hu÷ŸÂ™º¡6t)¢$ŽmË'X½|BÄÓó¥3ÑÒb–½CµéÑ¢¢ÍDDúåß»0Ýý"¨:Ž£u ]êÏ ˜Çuvÿ“Zž¸#XbW Œ4+9;©ÜK”,ÕZúQ¹ V 䣾cXjwÐ.¬H€Ï%l}rWY³æÚGJæN·aHËÙZÕÌu×ï¿Í€ÎØ|«M µ6 ËÓc”¾¬žRž(þAÑØ{Ú†°Rc30B«×3MF˜m|ø¸58tÉçûÅøîÚdº-f³}ÃFxìupù,Ç+ï} ŠâÂfª‚_¹ûðÿê²SÃieË –UÔö€ëˆ†Í\×Nµ¶}ޤ˜ÿ!™æºP™ÎSPöáÑ× j[‡ †ô’­¶©?Ââí±äÁ(&]Ù_w«Él ðÞŸ¾ª¼ÆÈŽ+y˜÷c'=“—)ÔýšÛ|û2Y}kö}[¶ý‘äCcUÚqÅ}£.õ—SŽ)Eí}Ó`ÚGä Iî˜A~rzÞèC('KÙ H$ƒi%ä‡QºtÈ6sɦöRî°\ki¡„Ç®µ¹û7gÅÎËÍ—N} ¸ÜpÌM[­¨íÚM»ânðÀDl)æŽi9osCç';áæá`]ùâ!>átõ“·ÍM¤I8>¯¹ËÃH-¤ èP}ZPˆŸVC#f“Ixê…×ñ‚¼_Ü·A©7±™ÿ¥Alˆ«ø…w”¼jCÑÞrÉrÒŠ/bwꌲäýd£¢Ý©lE8ÿ$~xÿ&hlX8=~ÍÆ†%ò –â½g3äq…ÑlQö Á5Õ0Ƛ:K5õ¡èlÅ´-µ6‹þµl›“C6ôèàëd£¼ö%dÇ͆€o!˜§UÔî€HÄGÝ@BÑ'òß@£íBŸV›õõ𞩸ڎ€¥ý%Î~ïK“ÇØt¤èy”_{Q?÷»m‹é´f¬{Ãäaò~Cm>ô-Û÷mÛ¶ð?œŸªK}«jòÛ"É úýÜd·kÖ ý…³ªË+Ð>‹ÓuƒŸXRêÇåuõt"3{¡L"èÁɆþÑõ¼`‚/{á„¥ U5/k=¡QcšÝ‰šžjª­¿b¾Ø”© ~|iN‘mºkïöÂ=›Š†{ü¤FêØFžù…W~@»á|ƒhõjÇòy qP~N§/ªZ‘•ÈÅß÷";ÚùÙ½0»æÉ8lP´z$îY$‘•œ @wÛ;°:YøøT?Þø‰GÉØ3ë‰oð°Y¥Ë2çH›ÕÊY¾Ï[xˆÔY}7Õ^ú„ðeseûÏõaEvtvúJÅ{Ÿ¾* ÈßL8س“¡Sl^'S´õ|Fˆ…²üªþβ°hŒè÷ Ò/VŽËæo†NûŠÜæ€ÔÌs©!Ki\Âw19/+ŒÒ+ˆ‘H9¢éÙ1…ïŽù=¹êó•ôwœ;<¹ËyÛæŸ"*)IÙ_\“u§¡Mq†&‰Ëyóy†Å`ÆâµWýmìy¦<“çFXzÏc×üÐÛV?Zn2ŒÖçùW¹±˜Š}ŒmŒWÐV}fÔ>¦ìí{á[¶m¾¾½§ÿ¶`\Õ›‘ã• É ë/ÞоR߸uÉ·&hêùlRÒeŽûå >üî±óäð rhøceTÄjRÕÓ ‡‹C(IØÊY·“&k›Ü‡³R&v‚ŪÃüÅ`5˯ª«ÄÌ4æ…¿¿M ~¼ÔÍ›—_ÞpaË"éƒP4½D«µttô Q÷í/îöìÕÒþ!Ú àÓvi’ØÐÙïÄk?y]½í¥I~o•ó$Á÷±”Õr·°OñäÆéóDù µË­Œ QF«A:sš”,úÓ^tjø˜žŒ‚G<ˆøÁ†ªz±tË[ù/ÿ ]ÙØGžo»Tøà]=ñÀqïÏW`þ´ÈM÷þ¶’Xà€†J"ζôÊ2Ò¾ƒç@âgÇóÿø#Rã2dö%QÊÝ9’R·ÃéÐ!ÑOŒâîwî ÐØ¸miU,ZI"-B ŒöXøúX`w‡Éï]©Úx‹Û-"¯¿ñ§ 31¤ñ_¾tÍ…| 10iéÝO`Ïïÿ½­õ×å9L_ÔL—ËO¿rœ‰â~¼ë—ð¸'Þ£¹æÑŸbé½G{éöþúô“s]ðãËØÇœcÒœÛîÇÇ/þr”0ǃ±a¼}ߢmãϳ¾$ ±¾áóS-ÇšÀ->Óðä¤õ3ÁÌIHŽ!É}s&mÛO˜ð•ûÏ *hùhb¢æ'÷¶{Ý"?mC$çràfúå€ÍI RÈqndÙ ¾½T†_D¹r µøpµxklÈ‘¬„026Œ/_¶HJFÄ“n{Õ¨kRLO]'ËHå*Ÿ '‚‰cÕ½}|¢±(q/bÞBˆ¸S^Úf"}lÄÌÙ‹ ¢ýŠ6Ï̼¿(RdGU§ 3$èQË‹¹éòµýŸ”¿ùÜ…í£‹êoó¥á…ÖÈ-¹Ð:]ú½õAX7×NQû®¶Þ^ÿOÎ[¶Fxðô+çñ‡§Àm÷Ъ¶¿ý`õUÏæîMÎûÁmv*ÐOJv.$PL~¸²{ÿ¹éwßÛ¤úãÛoóH'Ün.47€ÇF´ýJ½•CݹØMœbG“ŒRÔùǪÈOmœY®¨ÞÒÞcP,J÷§zÕïd]lj©2¦È>(· :ĈԈ(uîjB²t!â‰î§ù3‚+\Aü<9ßê–l X ƒéÌ6Úĉžùì•7‡ÞüÜl&Ÿ»öܵå÷7 ±xú¯ŸàõŸ=„Öq$2ܧ¹Cïуq-!0ÇLjº¢ +:yÆ„mõ´ÖÑí<Y4¡_ÆÇä5kC”Z©Ñ«v“¡‹ö-¾\|º]´5!<(kÝ̘}Ó¢B(Œ–é¬i0qh•¤ÛÕÔbHÑÝýö6 | Ê.‹’(-oÁŸÞz /—jdIQ8Q߇öACÚóh°Ò*ë4jTŸR}?irBu¢fpéœÍ©£xøÕÃ6Er”ƒ¼G¶—M]5ˆžC´tL‹ÏÈb](­:}°rš ^ƒýP|< +f?éÂõ ÜX¿t-QßÕ…æ>#"ƒÙxìåð-+¤fT×?\|ßõŽ=ú4ž¼ç.þÓFÊOÔ\ZÑXG­Èò(«:cˆäø6yZÊP©²ï•ÉŒºN;Ý (M»ŸxípEÞžyVxAi… ‰Â4´œAV\*rgߎÛïØ„¸HEe‹AyèÜ/ÈÝ{AöëuEýÝ|™ÍØH,œQ69.¼¢GhuUS~ðº5/ÆÕGtú|ŸYE².—„ù‘¿º(ö«—GÎøºN¼g=ª°˜cãó D~7$ÖªÓxíÙ‡& xßËöÜÌ>¦~¦oÙ6f_ÿ²kͨG†TƃQa7"G†œrœ,˜3ž§ˆ'Þ<ÊaOcæÉÕë 7ëƒQŸˆìÇô‰Q‘é“ddp|‰rDPôþé’¢=ÇžÔ®‘Æ…ŠºwPiaSË ”ÒœGWçö—½Ž.*¢ %nµlXã!ÜUE!â5ó‹ƒÇ:€¹)ýÐ[ ²ÃͶ ªe„X1:Eˆ±ÑÁ!"£ÖÂé/A‘1‹•CÒ³ Gò¾·F"»cQîV‹îÑÇ„eÆ[·ˆ%é8ßfÁ¼iÃfýŒþ"Œ 2üý')´ì•‚ÍÅûr>bÐ?pÞ}=Úp=w´¸{ȺsaÎ,<¿w€Z3'%Ë Ê?ß–Þ"T†¹ 6Æ‹þ¾C­½¸ãhM˜ìÍ­";{cóÔÃZB §Ä¼ÆÍi‰[šºÌëæÏËjãíå\.EEøð!àÃK€Ó%ݪ4wúØøäÀóhoo¥wSÓ’"7pÙéÕ„_d›åŽÈ…ÔÈôÉž6¾âʛړ'¼ Ç*"ÌrÍOVƽK'+sž~í§IͺB"Œ›É(ʼn"±5t;WÐB“ÁDD{ß“7$¿?ûI äqF]ͼ~¿òDäx#û®œgìd>OÙ¾òƒß¦mŒWP0™Ë:>MÕÕ½Q™›ÕËšbšJ™+觉ÎNÊøó™ñ?½ 9®š°ëäÈú’cPt”c¥Ó5ó„!pÆíŸ—é“rðšuÑE“d7å’qí4ѬªÆ€^—ŸB®*²š?ÙßjÊbÕ(£âLTÊŒhôSƒP ¼‹&e QQs’ ·`V&‰‡ïÈÃàðåâµé6-fZ¨)>Ñ?lFéYeáÃ…›žúß”»þ9€â“iÄàH²´½³–¶.N7 áxå;%£ ®?ÙÚ¹·gEãç^™–•ù¢®õ4Õ^ÀÌi¸77zÓ"Ô5ìGùù÷iâíÇǃ“µõøÍ¼üW^ÜúÊÁêÒ²¶îPu÷ ЧDƒýS cgÁàóÓ-Uª¥…¯\UZ§²*tšZXìÝH àKSc7v¶+U„eÄE”5­Ÿ’â¶Ýß½c=ds²0l¶Èg†A…GoŸ…–&LÏIGX£NQž³†¸xn/tNžÔé2Q3â”6ê·Û&[¾JVN®•MŒºwA>úãå±êñù˜D¿DŸ¿÷JÆyëUKãóõ\ªý•¤ß?ϔɽoâ;ÖÒyõ™1QûLzüO{Æ÷÷£«ól‚¶nÑ>õxû˜ÀÌø|Ý-µß–mÌwºófnë5éÜ݉Ü^Ö$õÞ´Ý/QflgG ¯;Ï÷ ÀŒøŸNJŽŸ^\5iÛ«o §2n7±ëšë •¹‹‡îëø|#×®OæLJ3’¶!–Œ—³w4 }.\êl”ZœÕ6Dmܸª+~í⮽æR@°ÐP%öÇ׃sdôÖ¾ÒÊ òŸ½½[qª•E\h·RzniKÿR‚>$„F!’6©Ã2;J±ÐãÐ ¼uäSpX‘à‰%(«Ó#ÁƒÆå²Áv?YòÕ³€’ó—æÄ»û߀Ÿ0©© p‹]èh¤Fú> >­neea؆ÅÓM à¡U³ñÚ× 5ÜŽ±K&ÿ|;õÆO×)ï]“G»ã&ÊÇ5XúâÁØ¢=¥ÿ ŸÝ‹ei%5¯º}W`ÌjÊOâ¼2Ô {÷È{5œ]M½<êÞ%!R'U&‘ `ùÏMVÌúH:-ÜNú  19 ìº„dWÖÞ±Žˆ‰ûkigÓjÂW<«Ho±üå¡}Ô»•½Ä¾ó¥ÈË™¥ÔZºI‡Í‚ÛæÇƒíè)ÚÛˆO6’A‹‰8ÿyèn»ˆôLbÉü7ö¿»{‚ ÍÕý&ÝõÁ„ ˆØkp“EcÇêð¯û\G]Éê²ý×.š÷*¿lè©ë"¼¾"ÿ ä•?0iƒ?øó{HÉY| l•EïÜ)ï)ü¢]Õ‘àkìkœ¢}Wï_¢Ë/ÃØôMÛv3rü²Á’©”ûF‚4˜XU^c‚à̘Û÷¾ G MŽU«&íÃJš#¯%ÇwŽó YéúË×Èšè:òÏJ}íV#Ʀ‰®ÃëòÁÛ/åþK•ŽbûØs¿̺sû‚B7·Ðe}}50Y†; v]=œö„Áns“jƒ¹æØNݶìÍÜí\ž\ÖÔç‹Áq¨ôE¹~O‰Âä;K ­WöGP^yà VÌ"q°Â„UQ!¨ë²ÊD¾îÍ,¶OQNŠ·Ïñ…Àgƒü­ãùÍ1DçévØxê¼fGªô‰5)8V¾}>fMKÆ»åø¢š´»Ð0<IäYTw´Bù¹2‡*›úôÌç&!Ï)“I¼q¬ \¶G&›æw÷ŒÈjÚLxöA꺕ˆôóÏ'„Ô=Ûù›=õäñ ÿ€ÅÁÂâY뉹‰Õtž.ôŽØeÇ ‚cŸ½™ç+¼3oqšòKg”s“RȹéßQF~;üB^(õ=“£Ù ›0bê+¹æ‚Öº§ö¸4íåý®«w,g0$2þ¬*2@¤à:i—[‰_Ü鋪!?tR\Èš1'9F{·â±ÕwQªS±8ßZ¯\2#j¶Ñ1‹Ñ£ÚúÑÑ´í»÷BJ'ÙTHR –ÐÜå¾&u‡™­ãÏO”®WX“ç¹Q›ÍNâÅ­÷LÚÎS…ï#uÖ5ÒG'Æ¥>Æì²ù멾­×òòõux®S_Ÿ}ߤmtÚ:É÷Ù1v/ÞøÀÀ8‚LŸbæj>£µcÂÀ„ÑrÍ>õô)i®îUÒ«n™(ÈÁôeTPÑäx¢jò€ÌxåÈŒ%M޹2–.w0?¨øZ”¶qá!HåÉïš@ùúpó^?ðbç%¡öž¶í3QÑ”„ï¿DW¦l}öΩŸ˜‡ÒŠO‘iGñ¡*ÌH] ‚ïÁúsá¯ïäE„,Êë:Ÿ™¨” 8 jþœµ(¸ÿ6ú‹°£ªË‰i(=KOd‹'fU‘ç»-xÿ™ù¥Òätiá*=߇%3–){µhPq‰ùé¤ô—ëuòž‘‚ðõ@7t’V´VÜ>[„·x÷Ì &7¯_‚%É𳉃çØûÒBÃwJü 8ì Š’Ÿð¨gïñÇËO…`Yúqňõ¢âw%/g7wÛ<6K¹Y–¾+ÀgpǪ Æ H.úM« žVvò\f5óàŽ †üêãÔœ%×EN›*OŽÍ»ååÓ©“EY¯¤ñìòLÔæ©Ò·ÑL·ûâï™´§ ?DÚ¬%ãm‰÷¹p¼:¼®(È[³oò<ß‚m‘äºßÌëÝ×n-aö®.¾Qâ;+\Ìó ·\97¨9>a`‚!©1xòfšûsíù—÷ B£¿8ªÇç Cj9Ú{_ÿ‚'igùÌO¯©g¢±¼L–_ü°øÆßtÜèqY|“ Íâ+ë“Û8Ò>=%‚ܰ¨²´­½8[ä+Þºª‘œ¢õYåÝ=?e „[·VwÆçEG,/\7_Bò8&EéÉ÷§Ý#æbï)dN‚ÏmPJü÷ËS£}0D[æÏ FzD0Zó^¢ÞùùYî^ÊÝï´€HëÇËÚã4 Ýú!;wZkQEGÄÖN-é!ŽQ5(ñ#`± ¤ÍÆåýŸb5–ýâ<îy¡å ~Ñ{â^>Úy½QþY½‘èÕhB8­Å€Q:'N¬Z’•¼%5&Zz±ê©¤R c¢3 "×"8b\N[éùú:4ÖvC¥l®…Òàˆ•“,$"&5óºè©²I1ž$ß|¥b0ôF‘Þkùc‚+3; wÏゲLî=»À²) tã~Ù*¨úšAH:(ß½5ÌÏ Z“ }|”5™1¬“Àf ¢¿0QAJ¿Üäê‡ÍN¡³¹FçB´ •ãÓ ïÉ;ûOïZ˜½‘’ÆÐDUNyܾÒ)ÈœewL¨hJ^ºæËÌãÂj^ý\ý 7UX¸±‚œF“³V7寤-4L»>}vþÏ]h:_~Kýø&ä·dÛx’¼ú}&E=6¡Â¹ÐüäXW›ùËæa¼¼¶‰–»tzðòñ«‡«mûù¤JÍDN“êš;]ž£ëx›N ¯äaÞß—ë`‚°ûƺžŒ__lØÝרÏÝ•@ÇTҲ쓣¼z5V*»ñ`Úž¨­‰Æ'f¼X×[ø•µÇfz\Æ×ÅÔ~9éŸv8ZÒ;lÎÓ »1oÎj¹z¤†ô°ü¡¯ž°Úí´ÂÏ'}Ýô…ŸEÍ» ‚SàæPô15¬ÌcÄhR®Ÿ³€ìí¯GþЍé‰EïÈ 26ÔIí¯6K…P`IæêÁ‹É–Ž-ÊÏËÅ[—Ïñ7|\¶a P^߈óMp,]h4a5íù7”*érS¯žQ<± DJ÷½Ìë,JŠ&Ò‚Dy~B´ÚfÌÉ¢ˆ€Ì]:*µ òÄIüéL7â#ˆváÙû7+¦sä¹6;­P³°G®Ä¹æf¤; $B±ã>_ZEvR3“EÇ –0І°è¹XµèqTTÒ.XÚZøˆ­Å|wÊä heh‡ÐGBuö…Ð ³—Hæ*#üúvd¦ýœtÙ”ÃôQqH¨Iþ´«÷ŠÛñöï„“%o]—aÉÆGðð/þrËÑI¦.¦Î±‰ŠÃïK¿Ø$;Y›ãñ£—÷bÚœ¥žbä©;ÿ/{_ÕuöÿÎ>ÌzgX–a“Á•Á,6\’“iÖ6­˜4KÓôCÒ´iž¶A›ôKþi¿ˆÕ˜&j€äS7FãŽÂ²ÉvÙw¸³¯Ìüï;â°5~Oïïy^¯sï9ç=çž{~¼ïY׉Â?;Çç¦xD™ˆ²¹ð<æ“©òñ÷òAbé ±~¾ÝùWØÿáÛžÂÜÕ²¹ÜÕ±Áb ǹYѨÇYwNHðÆ©žv=N”Îx,Lø‚ýÖM+M‚¨N¨–ï¿tbÅ‚Fà[¢7Ý<å’LBŽãuz »Þ›R噄“"Þ…ØÐë“ÜkpI˜AžQ­+CÛ:B¦ ~ŽZLå;ßܳO•ñ@¡˜­–É|:Xl61ZŒX€p!ê#Â-*-Ðp[ÍdµC—Ú  ï’wöìP<0{ÍõˆÍÔ é R¨@q lÔR"`Ë'Ÿ¥&†žþn°FÁWCpÄŸ«ùè/VØ•)¡!YéÉs3—…P]Ø :;Ö·¦Äÿ•¾öan 5%ï~i±lÏá&¹ÙÑ÷¥øƒÎ§¬®Qø…[`÷w}hC[ÆçƒÁ†@Z”¬LÅ€‡—sH'ÆÿšH`D7B/ è¬L@pËF Äo DEÉaÁÀðaõ€½YÙ=Ô„õjd6+ ¡Ò0Ù,?/%Ý+ù„Þì—öäç`¤;`yz¤2Ù_•M£»ËëĶýÿ¼ÖQxcõl•‡7Èÿ¸8dÚȉ¯vÂ?ÿ°eAÊà¥ÿž$kÐ`ðzÖlçu"¼òßÅNýéØ÷aÇøîñ~š&¾éùSoBÆšM× 3%AþÏÅáëyhçvØ÷A§0wµl®þÄ]ã듰쎔Ï?8s½±§E \k…ÝG_Ï^yÔc#ŸDã }mÒ0DzDºžòø,¤Å|ì>88–—ƒg¢<ÆCÆ$䨂a{Š?>Þdº¦óÞˆ÷~æÊcÎ.‰ñ ¶b[¾°Ñ}K6b¼CÓšæ£3cXÒ,–Jc^)ÿÓÎ7d4/?*0zÛÕγ°"Z½Íl‘@¬4Af¤d•7Å™öBIï03«'”žŽàòB!,HƒºcYLÜ¥¦Ò¸Øs‹[3[°˜²Mbï»(¶QÈH*Ð1hîç -6º¢•BÝ™Øa–2,…df}ñ²¦ËW/0ãäkA{NÖlï³SÆ:þ#Ã*„†m|@œß7d‚¿W…[‰AXFòJdÏÑ.I‚Õ†¶‚UðYÉñæ`ÅìJ!îåæÀ_¿99«!)Tï<Ê>Eµí縊E‰V„ËYRDÂlðåEÁ_ÿUœð"Â'dlp}6 ñRKé•Zæ­F¿T…·cd»/ßkV¾ í]8«Ç[ðüs§ø¦w¹| A^k_ú/Ø÷×›}Í9%¼¤ƒu¿ÌY¬âæ)¦7Spœ[:þ7A¸Oýú}øèõ‰³ù粜zÇãPÑöëó=¡üpÉuñ<…Çñ§ù8&s·Ên‡Z¹×'ш“"ÿ—nÞR­ä(< 1!¯ƒÞè%¢ûÿM`ø³~œÄêÛß»Þ/9DÚzÖ_uËÐÒó‰“蟻aoF"="]"}Oé^Ëï»î·Þ€k»MÅé¤Å|gk&žuòòñîM÷p7wŒì<•¥s`ï 9™®úÞˆtÝÞI Lµ¤;L†6Y7ÄËÕÝ@¥€±Àú…ëJWîRX˜Áy•Íí.©¡Ð fI³†ãÒå~ŸŒÅ0È: kƒ¸YÁ éó‡~#Nb¤¡VUÅ…0_˜õmÎù„i1 p¦´r5Γ¹†o:U)Ïú(ú4ôâP9XªÃqæQ¤¼Q'ooùŒêçà\}•ÒxŠsƒé¤â0À7I•Wš@æÍ±ïr¸Üg.jÿöt^sK ŸãÀCó}3~ùyà&y¨I¹yõC%ŧ(ÎÔ7a}uyFñüšáÉ¿qáý§²"‚¯ AÂ@9ÚÜÌQt÷ž€–¡3 îFôÕ@€¹1/+*¯^VPMÑÒŪª[›äL* UÝ*ˆoãsÑœˆ>ôk#ÐGœ’Çð*¸ÎS^ž“ý((÷y øå¶­ðCài2öœ²­UÁÏž©^ÅÚØôV¡ÛÜ·©çAÚoaäTqîFÙàæíÎ^ëë#HJol…†vÏû`÷'z6Ñ|?‚„Âðt]œã‘$ ø½+Í¿vÊtÓ%HcAü7Ǿ2ê®u™v¢¿Â¹{pßzˆÑVL˜_gÿ t޽ŸÙÑßt*]·úÞˆtǵ;˜6AöŽ4gã^n1MÀ”GÇIïÅR}yn+’(Ë;ìB`Ú›€Îd€ÑX MÍu°îþ'6ERÙ[ê˜;6‹øþ -¹ D’ÂW#T› ÖZâ#VSéÑ ó7ªY¿yìˆ~‰nÊÀ2£CÒr”©íÅ-FbÝs.Aù—4ÌÍ<–CQö/•€®¶»ÚCßè€âþ’ЩhÅÛ…)_žÚ_l³iåµÍÇTa†0y‡×ƒÒàt“—ü©Œ`D£×åðèß—èMº‚ß««5sŸƒ“gÿOï­|Î4–ÉC(€¥™î¦ÑQ¼Œ°Ó@uœF—-‹Üiµû ¿>Õ’7;È M§A:?!§= ­ zH©‘´MóÏå:}ÚþR̠ͻۿ;%Èùí6ç?å¾"¸Ýçæ­Ë髬߼թóÀ§Û~°ŽOçÁ#› &ÓëÉ€œ¨ b2yZqîpÙÎÀÍçÒgF®£m‰†IX3“Ët‘þ.D‡\ÛiIòa8_û¨GWr& Hqž–ˆÃÈî‹Dž÷+©‡Ö*ìDGïÝî²å Ê3î]½ºÜß› o{²'%ÈçÖØQ€Æ”±ÉÍF=¨^y°Óˆ²ù0 fÐ@èeÇ4¦^¤©ë²¬s`¸ÐO0ò9˜)éx&tJב37¶ä÷{(ôfÖjÜ…øaÕ¯×?(gØ• ¬ThÝPy¶3@v¹f,H’À—ïTãäâtiJt+Bóš¹¢BÖ7Èl6LbeÚ)7N¸fÛ;)¬¹Øò_ OàFÄvæUfFI›Wɦ‚ÍN)’7êwf¥?¶ùÂÅ/²ü…|8Ñø`VrØW¥»Xž;ï<>ÿ8T݃›ÿ_€„µ õ²ò«µ æØ‹Â}y²à`Æee%†>‰`&k†LPeΖ –^Ë× †ôC àùcK«³C}>›˜Žg Û´Ð_1`3¬Ã']då¹Ìýív§+ýiÁ/o/AÚíãoûƒ9wÅ >¡óƒWžºåôñ—ÂÜoÞPÝ~³Þ›'Š{3E´ãÜ¡² z¢óh~éªÏc TÄŸ ç'qQ§Â<Ü“ú®¿Á%^šZîL³k`ï-¥é‡»¨)³nìÓÍ-ýžñý˜%ö•’š¿FaO½“e!Þ%®Çù.ï‚®Ý0ÉùØÔ©Ä¸Ò%Xw#Un°š°¶ÈHË…ÄÀ(1˜¡4¡e†È³dß–kàÐÙ}²Yþô %Eÿ:²Ép({Ôt¤_S¾m~ _uì||°ïÔ÷س֧6ÉB„}'ÒÁÁ‹FYõ• yvã1bpùžŸÇl~v! òXvÐdxÈÅÛ’Sì×d.fU®{‹°ŽPéiRofåµû 0!Ǿ ÿ³#Wõò°ÙAè¯6æ@XT*8F› m$rsMg½êÐÅ:hëë‡~/¬L³ªYÄ? ÀNáe•^²œÈÎlÊ6˜¯¨(EŽ•}¤ÐÏË û#jC˜M:@ÑN`QõHsÃ)(¿ú½¼ôxH!•å]Éfûµîý.8çë2ÝÕèœÈ\— 9Tå¼Þާ®É ŸHà=ì"I'øøtÇŒuá‰xžÈñz¡™N˜™†÷ðàN”íL}X× ï–h¤+ 9ÝãénKFžˆ7®‘›Ý Àiz˜¯8‘£Ô„kKÄOŽ_Ÿb_|‚z'ËrO?}*]„xtí†)Î3Ÿp{<°Á­9ª¦®mu`evÁ¢èd¨h©†Ôa„†Å@}óg&}Î?¸)·|^²±_]CyïñŒnI ‹*t@ ô÷UƒÖØþ %‚­µÄ×gIÖ¹†KЫlyøTy =xU£à[ͰæÁ§áù?}‰y·;Å´³šI[­WPª˜ª3ZÎŽ@™™‰»S™³‹Î¶À—ç®f™M ÈOê± !¥„#z)§s¨Úº(î:ÅɆËÙEúÍBÔ–â„Bða´Œ}[1lE%¼QÌî(hFH$ø‹k…q/ÂÙÊO!6!šÚ¾&K¯¤‚PÑ×Ý ©©kA(êÖ}·å‘%l¦.äãq\ØS«ÿë˜{æŽoþñ¾s²3q½å¿¦ËÖÀæÂëá^\Ÿsï<\gx8Ä}2+Ÿyx‘óêo»§G”k<žÙú,}äéë£Øx˜)G±ñ|^Å&òôùû¿õÆý}RîPÙògðÚ=êoìx,VÌy¨à×É@œ× ôÝ2D·Sì mw·°£Ð?r \ƒ1×-Nv8ÈŸ„— ¾nƒc=lD”œ ~=YA²2ì·½,¸Îü»¥k:õ6-‚ÿÂÙã`æ 7/Œ#ZX’ñ"ôwUAlx2´tªÒë´ò.ìæ@`°Qˆðµ)ábÙ‡%{eb_̦l‰ˆ•é牸|ŨMZœojCÙt–#ê±Àˆº2c†–ü¹³Zåâ$.¬_ž»Þ=œy¤‡S&±‡a*åzG¬È+ÓX\‰'-Fº{ڀÅp©—êíG7(¹œð¼ÊƽðϲrH OS—šaUzDw]¸"ÌièîÇ—K,£¢¬Šs»á¾Á!K¯öeÇ&øbÍðwN©îÏ™ŸŸ>‹Bô+‚ÉFÅÝl îbãÂrö\à(,@)zIa*úíšUðp*6Ìã(¿÷RÞ/þôØwVO.I.­^΢ ‘â?³á刂Që žÇHeú¢g-æC°dØÀ.—Ú€îʯ«iÎéÒúCŸ¦ Lê=Ê:T mÁÐØc…ï.îU%ÊpÍ‘`ìC]g þ»Ì‰ÈqÚ£Ìv‡SöÚƒ‹®Í±;5ÓtŽ~ñ?×Ór—„™7ˆû3—΄[ÔI„ŠˆO¤ã]þhº Së)¿ãwÚå&MÝβÁµ Å{n±j÷¸âßNýVœ‰áô\¶Ãµ4fb¾æWiÿ\–©tm¼[õ6m›@wϯ ý2oVP8:¤sÈ´-¨Ú«2·~DZ“ûeLÄ>kXe—׎ø Ù 1G—¥>ß® ÷Ön?XÝ' G“ßÜhÉì\’w¨<°ðtõœà˜`ÓY!@†ei‹¦÷”}©]–Š…¡ts^O›zmÀ`9p‹ˆJìß^Œ÷£1ٮѤÅÇ%ÓéR™Úž±àû¢ç¶+F®Ô6 ?‰Ÿ§úYðø<˜Ìå»ŽŽ¬žeW‰ÄÉ9!â<-”Õu(Ó˜²5s¢vÖö…'WUŠüîiSæ§¥÷ —¡8˜t6ˆùZÔfí—‰ÐêÙ eœù„„ŸûjqeËá™s>¥Ì`Ùó`Â,¶Çû_^5¥»¬±‡§²Êú:Zá5 A¯¾q¢­$8 >8Vç~Ë ×7áÖ]ÓÐI|€Ä‰p§ðtNOa¼8Iüð¸3&šîLÊwæÌë;¥ŸH÷~—ŒO·Å•Þ.×Õt—åGÑ5#‚T]y¦ìØé=ŠÐj*´  ß¶0.šÚÛóx<3ô¨)@±r€Bg¨Úû±1_1¬c•¼úäÅìÂÏè :-°Ì—ïj •H„UÖœÏRF )1úú† Ï¶”—®BY»FQ±$‘IOöÃDˆ°è³SM'Ð m1T¤HôA²év§é\Sɵ—Ìz÷;ÆÛTà#•÷ v©"ƒäН*l;껨(›"¶ÊkO`ýjêö“ö6Ö?˜WÝ.,ÔO©”uH[¤ ›åc¿¼}¨a>%6tõ޲РùúŒ…ÀgªaÏaØ,jàøP!I&Am”°Ì‹£×û³Nä­\Ò³í‡äú(Ö„Ïö6š'#…k®5NŠoç,‡–+7=Ûøêï!ë¹_]·p]›€ÄøwL¾„ÿpPg3Cå)«@ÈB ,F ‘¾¦Òžz‡£‡ËÐÝØ}=ýñ€rqWUÙÒ üè,´õ‰ÞAÅõ茽²´6‹é°ää®| 6¬xµéPÖÿ:?ý: dÍ †û⬈,°'"bÐ[O_©,yùéŒÃ£9‰ˆ —k.öµm³žºó½çM¹¶†¼ê\xåîãÂâàÐ+_ÞÑmÊ¥‘5Ù±¢}aå5'¶Œè¨˜Ôw{ÿžwò kó°'ÆYKåIRëv†Í9~î¢B¯5 bV „KS‹Y_¹ ‚Êæ øöÒX¶äÜdµƒLôô«­2‡­Ü{€›s½S rœ.&ÚLo¸Ä¦ŸMFŽ)¾¶z>4W]º)¾ŸTæNŽ>™îFÿIB‚}&&j›X`È­ï¨%H — b³E%wØ`VPt³«@‘úSèìû:õy>æQ0ZípVu>ÇLãAJb$ôªÅâ×i±óUUÛ º%@ÞÛ] 1°q‰àUWQ8Z£†G3Q6­Y¹ÿÜœ:?[6`0¨î{\¦øúÿ5; ’ø†‰þHÍAX“¯mˆÍø–VÒùóC¡wà Â÷â.Ž-Aã‹Õd‡û¢û”Çëz•ÿ<š¿©_-’ѱدI€åis’…¢•è¶KÎÈAêÐÜÞ,ó  Bpè"ÜõÝàñ>gW=…ª:êe\{\¬;‚Ì–4ÝÎÊñ´Òå«+áwNçÌÁ}Puúþü¦ûò‡Ÿ»ÿܽ&œqšl $Hü@Ûûñ³XlŸâº†>ˆN…°)*äŠw2­_(ý‡”Ÿ–HšáPH‰ ‡ŠÊ¯ (*ÄÂXÐꨰ0vQÑçÇ_»è]¨1P ¦õ0,Œ ½Õ†%ÎZ…4¢ûàxå&䘑„p!XÌ”„ÇÛŒ´!4£7|ý—kn5•zm$ 'HiŒdë 94 …a­-]2±¿´šoJÞ?è“åGQãnx(ÌCjô"Ø?ÜÒïÈ^=8rAqBÕ÷ÍûX­}˜ˆñMQlÄ:uekÏ&>}({ΝénŸ€• U×ÃåÚFH…Ü™²uÇ‘s»ÀI…Öá Ñæ5ÖiM ŸŽ‹vó߯âVÑŸDìÀ —q"ÜúIJUø“¯ÿÖ¼pà p=çȦžÞ5ùHûÖ GÊ-¶‰BÀO4‚fIPðoµ27nÚó¿‹+}#1DâVè©Ì (;~¾¯¹Ým°,e˜-µÙ¡ݶŸ>¿Í—k.ˆæ¡}ÝÇ·˜tWÃ~¾œýز”tž ØŒh˜.9NÛÅvÜ,7ðf"yòµ›È1'KF?ç˜a:ÿ)B‚ýV#2AJ±ˆ™ï#˜%é*ú±µ½ÙOQQcÎiA/hî6úBóIy±ä=j!"ðD™kî:(ç°ïÏ™;+@%¢½•‰v€Â@¡øàÉÝ&çÑ¡¤oD¬à°Y†grD>bhi`"0 ²·D„Œ}èËÃ`Ä(÷E‚Ы·¨‡…äÐ(Ú탖ŒP6¼¸"GµÿÄ›ò‰ØýÐ>dSTŸú=<º,Z»/âÕ[¶:§­— Þb¹¿]'­éÌ ö Î ˆ‡ò–(8Væƒc°`Ó:b-ä™Bš©çßîÊ™Ž•90<¡~öîǾâ†ýw¯¥í$› w€ çÎþFyòò¼-Î]VÎûN_àÄ´Á½dà!t`8úÕƒuéñšÓòß=mμremVϽN*pE UÃnhSXÒüH^70è~ÀÃ]ü-à†§B€È!*ˆÔQ´¤WÝTÚ?LÙdÀ-UÚrµ“èUŒåE‹[šTã3ScV"^ rÐÁ«yjõ1õíVU·Õ‚ ƒZVáý‰ôÛ Õ€àd؃]•××qäsRÃÔö‹ ðZ®ŽT™¡²¯6ßÊòf自†69"díøºL*[•ÙµuLѺûO(ïZí8¦ñÜC˜µ?{'DÄyõ€·WSóÉOŸ‰©q˃4SáôÅ%;ÚûŒ9‹å«rƒ¤¿-ª¨{~D§±##j5vhï;mZXñÀØŸ÷–à])“¤AïÈEвi|EÿP ò“9‹·ÌŸ½ë†i3™1Ò2w ÒQY}ÖÕ¾¡ðÏTæ© (ÈÃ}ÀWè[ô]…9‡M5€ÆF1’„—Sz}ù/ƒd©±h@s¹FKÊ?yáÄÄH 2ø!¬¡¹ ñ €Fw Š9ûÂ~ ÷y£ØÆ[ˆG,±"ö¼;D~ö$HLÔ;‘(±EZGoSZ_TÊè&«þ|_Xœ´5%Zr¾Hê¡ x'DÈSîzK§²:L•MU?QÕ;Ü(û…+qlC'·PÓÿó¼i¨u„Åg‹ˆˆt ­Y†í»€ÂÒ”(àÒãÀ‹‰‡Ñ¢R_Ĩ 7D\.Ë©ëÈ÷F¼@´ö@hmù[nz¢)3Éÿ|ʼèU)÷X+fâΫˆ¥Y $9’ q]ìI€1étˆOV‡Ö~‚ÁÝ:6ºK¸Û¹•g÷´Òfç§$‰±ú†¿8wM ´cVJ¨¼®ñ¸ü¹kTˉË=]:¸på3x`Ño’Ç¥/ó¤´³‘¥¨îâçÔÖ_oŸ’µ•æ( “.“íÿöu…4H )áшPà§.‡ÔøŸmº#lTo 8«bp³‘ù‰§JÆN¬{ê^¬7¢&ÖËN¶¼îN.#A‚´ o›Ö‚Ê4:R$V!’O·Žž² këV¥lìlߢÈt’&¸üü´˜f*Ð)\9‡Ö¡ ãcQ1+àÛò’¶i¤œï•¦¨©©†Öîðb Ö¬_¨fùESíTÈ“_Àji€ ,3 ®4ÔƒTÄ@3fd† †ÂÀK’[ÕþAîÿ‘º#Ö»Óx:m“¸ÿIŽ$HÜ›$<¾B›ûÙñݲ‰ž7ôä¾¹± ½fù1eu}|$6*º»¯€/ß5Ye‰¾èå6mÉÀK8/3F*Ÿ ÉÐnµ×eï€Xä׃1©Ý‡£ëBF‘Bx`ˆxþ)a õè@oh~eOèŸÃú«˜¯ÿN%ù) Aâ®XcظԎNôìÍ–ëϨ¬9ýÃàðh°H.UV´\€Ê+G ¶•![Qµóùµ'¶Lå^äþ³-`´Ôæê´•aËïëS‰¸F”-æØ8¬X¦tê´þœ=71Påí N9 wׂœ šû„|dPGÏaÕÕ¹AX2L? zK0n1Öº[xYŠ·žiɼ¶‹“ ¦e/NŽ-3RÒ­ö`ÑØmIxŸj ©/³ÉW¼ éì6ò3 A‚Ä]· § ´£¾”ÏéËìë­#¹bQõÙsâT_•M}«ÇOž(ÜýV¸ÿ–„÷«b$ýÙúrÕðpÝ #¿Ä¼ÉI»2ÉO€ áŽÍƒ¼SÀI°r+² ¬þß“ºÇðA1ùE¶ »—Êá û’ AZwòIžexºy¯‘# $H‚¼Ö£|Š < BV+ $þ-Hù4Â(Èj%A‚Ä"Aʦf5Y­$H¸¸'¦ù|ýõ×YBs勸2\ÿwʇomþ‰Õb™<1 %O/ÿß(.V\ln2êûªU«ìdõ“ Aâž#HœÀòcââ… .|\ã®<—a84=Ú S¤ÃÚZåݰ˜„nü—-.:\4.!~kñ<ŒÝ7àB_g%I“ ?*AâÄDè丑"±ŒXy¸ ]dI/anºB¡` •ÜÚ$æ%9gË8ì‡c›Ãn·âWbž7R$F±GÜ®cÿW»„ K=ž7N’äü$H\sHŒy.—šî²"Y.ÂäºY“î–#×eiÂvÅsÁ —Üy<Ëu¶¸„ØÌè² ÇDç½ÛÕäf=ŽÞÍO΃$A‚$È[!Î1¡º‘àØ•êöl|fíndiw#M÷ߎ{Å& ’‰ÿc.ö=ÐhÝd!‰‰ ? þ¿ˆsá)îÌnIEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/picto_fleche_bleu.png0000660000175200017530000000557412664543647026435 0ustar guillaumeguillaume‰PNG  IHDRóÿa pHYs  šœ OiCCPPhotoshop ICC profilexÚSgTSé=÷ÞôBKˆ€”KoR RB‹€‘&*! Jˆ!¡ÙQÁEEÈ ˆŽŽ€ŒQ, Š Øä!¢Žƒ£ˆŠÊûá{£kÖ¼÷æÍþµ×>ç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-Û cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅF§IDATxÚÄ“± QDßêEÚ-¸Áµa` ‚›Éaö`,¿ElÂD¹ŸYÀõ``²¦¢wèÝG\˜d؆YVÜ”é‘8¿1P“¹šd) ¶ÀIM´«ÁȳšlÔdеƒ>°®j2M)q Õd¯&£”+Ì€å3‘µ—€Åà—¶ n@ä¯âo€"¯šš *`ƒï>æs÷7L ëø:Èß¿ñ1õØR͇ÿÙ¥IEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/marriage.png0000660000175200017530000000221412664543647024555 0ustar guillaumeguillaume‰PNG  IHDR##Ù³YsBIT|dˆ pHYs  ÒÝ~ütEXtCreation Time11/09/12þó­tEXtSoftwareAdobe Fireworks CS5.1«HëâIDATX…ÍWßoUþîdi-%™ Ššî|é&C€ÄAcDQ»ý ã‹>í þ–Q Ó" µ¤6ÖØI”PRÚ¿À}3»;ÔÒÝ™Û܇ýÑétîÎlWˆ_r²sÏž{æ»çž{ÏAÿä²>ôœÀ ‚À¯>ô—Ÿ‘™£#ViïÐ À|Tß@mmmªê×ýÒâý"„˜PùP(–8îf!c¤ìvæ˜òû±oï0†Ï hÉ@ˆ¢CB˜bò»÷¬¾ÉŒ~Ñ6 ÃÜ“ËaO.Ã0 „‘è|iñ¾ ±–¥,dºæL C£^GUøˆz¡ ±¹)“'6Y°¥ËˆÔœyþÙC Ï ÚѬ­¯£4ެ$Ù/Ý[üBXMr€ ¥Ž;u"Ñ>ŠÔœYõkãj«Þ?Õ*ª~­Òã:" Ç…bE(B(åC©²i’'ÿñææ-onÞj—~»[ìÕ‡v›Þ?ýV€ ÀŸ]¸ãÄô%wváNgÕÞܼ À³Ïžq#: € `Â>{f¦[`øíS¶ àóÈxâ—ß½e¥,(x½õ÷ù¶"—LþúÓÏ%Nk1.¾ñÞ;]‰hÉ„;OK€súøÉR‹Hù¨½Ö〠³5¾FÐ$p(¥J‰ˆ”N¾úZ>”Ò‰é‹Ñyo~ðî2©|RTfë¤ÊTB##eW™hFg,¦·â†$W°µ…mx»&Ji'¨?MÐâŠ~ºÝ6åcÛ¡•W޾lEç*ÅŠRD\²@™Ñd¡™¬RY:ÞɌ¼ðR>ɰ ŠˆäÉb‚M&Ÿ;ÈH&9ë†Î‹æn~oaë8GaèýžùëÁßÞÁüþ NŠ—Ôµ vGºþ,cO­úµÎBÒÖÔÑÙ·R—HæßGë®Ü”žÜ”H‘óí9·¯ß´Õ˜¢‚FR,m Jy!-* ¨t¢¢X¢"ºˆ³k2J©’~—’¿-!I:)-ÂèWot=iÍ•®ÀU¢d~˜¾V$Õh¤éÄ里«Ñ¯DŠt‰ Ò¶Ua*:)ùÒóÖäU-¡Ý’éà»+ÓE’fí¥­ó•öyë§‘aJè =â]#Ãf™„ÈE§ì ‰óÛK“v’ÓLþ ðàúWW,½Tø6Ú ý6ô•3î8×.^ÞQɳIܪo¾üÚ&U¹Ç-êl©&â>S?o…bíåô§œË°4¬|øÉÇË3•ÌÓÄcç•à²ÒfIEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/gui_create.png0000660000175200017530000000331412664543647025077 0ustar guillaumeguillaume‰PNG  IHDR szzôsBIT|dˆ pHYs  ÒÝ~ütEXtCreation Time11/14/121ÀtEXtSoftwareAdobe Fireworks CS5.1«Hë"IDATX…Å—_¬EÆïììiAÚ^¨ h iÐR£m R[iÑÐÔ b/Lˆ£Ø(£‰þ‰Q‰)Þjc‘ªMP#‰^Ôˆ…B¡ƒm5i+IAb›TÚƒ{ÎîûÇ‹™ýÎwðpá$ovöûvæyæç}fW"‚¹í¾ëFýá÷wÇ݉€ÉÉÉ+Tõ6S]Ü©ÓuñÇ®ç¿ù‚'Ês†{Ôç÷àÓïùÛ,,™K`¼X¢ª{UírÕþÎ… Þ8Ï?z»?`¦‹z ú¦» ëaj:ŽvÓüxª‹{V­\ø×B ˆ˜Mb¹àî~…™=¨ª‹Ì UÅÌžRµýföawjÐ+¨Ó=t]ÐuÁÔt‰³S±jZîÚ¸6ï ´ÄˆÀ\p3»ÒÌv›Ù"3ÇLqwL 5£üf jAß]ïL¦àìÙàųÁÙ)žS]wm>ÜtÕs¤—PÕÛUõ÷ªÜ݈(z(t¤I "‰”MS"×hA4 ÚÌ[š†‡vݯKv>~1à7Çß; Ü̾àî˜y­Qwˆ€ ˆ€Hé'¦r4 L´‚Yàæ°yc:=>߬ D!ð13ÃÌ*pQ|¤!ÄT2åžB$%¡IL´%ÚRâ@6ãݱï"ò¯ÿ¾–‘2T÷aTðÀ]ð€Z£g"¢ôGcš&Èä䆳Ÿ{ÿ:y|nÕ%¨9sæRUKfVg%”ZöfæXÝ"3p›ù}ð‹&UMÐfÎ;ÿ<Þ÷‡8±û±¸a|[“›ãQŒBÕªê…3 ÜÁ Ü‹ÚÝó œj2G‰A¨%¥¤9m†‰–7N´ÜýÀ£Ü2"0ì³»£½Rö_1 ÌÕRbje…j^¡ê˜zÕËŒp‹&‚fŒD›!gvÜ÷ˆ\ Ü«+Që¿?WÊuHù(UGuæZžsfoFSM‚¦ Úr†Ü@.¥ù¨ƒ»N·õÊ¿Õ@j43 ½½:Ú}ïô½W5ÊH Ã6 …Dj ‘Ô” I»ò ò'N.hî•óEŠHõnÀÔ«ãͬ:†ýJF^0”åPa2ĨÃ;²»süÄÉ¥îip©¸R õÄó´ôhï¨GQ~T1FÔÉ©{žRÁ Jé–¹w¯Äát;<¸lÜÍ¢h«캠ëËV¸©2IjjSÙ甪WU,u,¸s ?}ì䳿úâpA’()%¨Z€§§«ðêÁSJ°¬¦ïÙ!‚LLpKn„œ¡I¥¡h©W¡ë¡ïk9;ßÈÓÓ²ZmÆõD¼ú}=á4è:ªêƒ>¹t:_øÂ>™Ðk<ýÇ¢í6ÿë3o[³±[õÔ‚M~²iÊyªS—…@§Ðõ ÊáMWÇN€|Ùò¥»Ÿ8têÙðxkyg;j£® PãvdÙ—â¨|M×¼-òö™·=ýØŸdYÛÊäÚͧ·îù<Øf¾›^/¨s)ôʾ®4 ?;º‚½ûO­6—™³Ò=\/ª»•:‡¾ç‹¼¦ùæ#ÛÖü‘K’"2))M^ùÙ=[†Iïß+K›†ëSb ÁáÎ13~±éê¸gÜ)2Àú«–ˆˆwþê·“[{óÍdH‘jT›ÅÝîÜ Ûö["òP%€ˆÜ8>éµï‹SÀ5þk»uý‰’ÑËFµQwçç»^\ ,&brËæ‰ã'¤{p`ûN‹ÈâJ`ÉÊ›î|9°sÃØ+ÙO¬˜E`üm6FffÂÍkŸáÖoÝ#"DäÐö~oÕ0ñw}Ó«Z:Yq„Ÿ~;]ù$w\Î`aîŽ>µæÙYÛ¶Òÿ¹"sç¶<~sÃåà«þò²ƒÚœIJdúœöJÀç$ð¿´¶m—Õ ÌwŠ×L€ÿ7!^ —|š½švû—¿ºXDNùÀ%ŸÿúWŽÍ‡À9?L^©µ9¿»m[rÎ%Úvã|æ™?¶ÝÒæLÛ¶CÌ›À¼4жí!Ù#"¤”H)š/ÿ÷€ûhE’Ï}IEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/picto_rel_asc.png0000660000175200017530000000071112664543647025574 0ustar guillaumeguillaume‰PNG  IHDRóÿatEXtSoftwareAdobe ImageReadyqÉe<kIDATxÚbüÿÿ?ÃÌž ²Š ëÅ%%€—Ï_üÄðüñ¬°²²‚lD¶Ìðªl;Ð&là÷ïß` xùù]ÀÈ pl|úø§ @@äE~T/Â]ðïß?°!ÿñ„>H@ jÀÅÃÍ .%‰ÓÝŸDžBë*´¥@¹¸ë‚+½!¥FÊ‹¸r‹Þ±iL2c»µ#Äã‰IbQm Õ•ÔWURi дòÉ(zG³ô^¥³o€Î+ a¤³J§Þ:>abס5Äb™úÉUUOϬ£±ºÊ›Ðþ‡òÁ …á2|ã&'/õpòb7H§M²uõ¸ ˆÖ¶5Äì½ îIˆçfՀРMšBv½§ë›Æ'ÒÑÓËᎳ zçöÆ$€×N®/à¢è­®áE¿•⯞ÿ8qî¢Gb×»âóƒË±ícØq1'1…¹Úˉyúrd\¾ÿ½¤ŽÓ¦wšÃŽljY‡±b+FV*ú²7ËbÏ®™Ìâé ªíX舧ú†8ue 4ÁqËצhÍ-kt&µ/B@ì<ðñxK€eÑï¸T8·"ÀS+lZW<Ì’{§ð[ÿhXR7—ºË×o°þ诜ŒhbdtÔ7£oK!Z}ˆÏ8Ä+lì8Ä+À²°¥Ã¤ÜÀÑUËYÞ0€3ƒ#,ýîgp]V56°÷™e\ËåYúÕt€R¸ù¹lÏã€Ì{O­[t&•¶Dzï{hlŠBÚq²•“ÉjA6/Cp€ùµ5dó’¬#ù¶³‹Ž«ž–&U°é±dóÙ\Ž[¹· õ7,´~Ñ 1íÛÔx!fÔ©0µ†‘¼ ÿÉ;…õÀp.έœ5Ãû¢”¿­±_ák½hnIÚ>d!´|ç±|§1ˆ4;ÃÆ¹3Hwþë“yp5ÕáÒdÍã FîÐÆ!=Yo‹÷÷$±ãvÜ­X4HÚû†iï6N§A ÒK瑬¾+\×Ñ7ègIFIp€¥6J­]Â-œ\1Ë ¡P…ž¦1ÁÆ…÷³²þnV̘nnJÛß]…T­ "ª„ÀÛ‹SˈSÃVZƒ2æ‚(Å¢Ú[ϦXºG®“>yÚÏfª4!Pi2™×̹þ ¬2Ð ¤¤X:ú‡hÚw„áìÍ‚‹‹•V‘wl\i£à( –*uÆ º.¿ôôÓ5øo’ö‹ÿDv:}¹·@60C …RÇÖ™TŠ;¢ Û®bY‰0öõ›&КDU%k™GÓ¼iû³“tû‰¨­ƒÓß¾ã~)hH¢^Ý’DX—°,¥!h(´äåú²6¤MgRaKVÚ”¾²y ÂÚ‹%DáôE Š‹ŒIàÎ÷Œó:“Šäïòmùº×=Â'Q,AeS‰±oX%à·% š[–?!DUÔüñß)5°GgRëÊâŒy5kn94Qê ã‘ó@³Î¤&~5+Cd7ð,Ð0ÆR œ6Ü xŠÈlææ-çpj< ¦üõúMz@uIEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/folder.png0000660000175200017530000000145712664543647024251 0ustar guillaumeguillaume‰PNG  IHDRhôÏ÷tEXtSoftwareAdobe ImageReadyqÉe<ÑIDATxÚb\×)ÎL@,îkõ €a" ¿.ûþÿùzÅ€b¼±Ý]^FàÃ?¿2üýûŸ(ÉõãˆßW°Fþÿ „Ð,ÎJÿÙÄÿ0¼yÿáî&–þ1‡‹3ˆK[1üb|ðŠ…IŽ›áÏ µ,'žÜ{T @Œfë1|ùüzÐx. -çùùÅò‘Íd¼³×C„ýá—×Üf¼ <â¶ ÿ”à’?¿¾g`¹tæ<³ŸƒÉV†_N00qg`âýÏÀÀÆÊpißýW ws°³1©¸Y r²³2þeafüËÃÉüëë¿lËw¼¾@þ@,@,ÆÆÆ´<Ü¢v _8)02rÿex÷ùÛF Âÿ@'œ?÷î7ŸÈ†»Ïþ1h9©3ˆ1yÃuºë0°žÝÖ{ƒ‰…‰ù?7ãÇw Ì?—20ýÛ Wô÷ïßÅ`$ø9þ¼bÆÃ B®¥ ÿY€ þt `ùÏÏÁ Ñò‘áÏ7ˆÂgž]ÂðŠÞ6BâììL¿™þsi^.æßÓV?ÿŒ†Ž J‹´¬‚Ìkgïk+ ±°°S ÐÕŒ@Wœ;ÿæ#ÃY ÿ~þúõ/ZHHü$ Y~ýùóç/3ß>†÷?1¼ûùŸ h‚„¸0ðm°˜4à#ã MXn]½þ”¯ÿgü(ÌÄ`l-ÊÀÈÆvÊf†ÿLš()–Ê>¾¸-z÷ü6)–Ÿ?~0²2³0¼úý‹AFXŒáï+`beº‚õû; aÇ€î<Žaà³ÛÇ>ÿüùµ•f$³;ƒ8ûøÿ€Ô?fHjB3ðó—C ?¼=”9Š&ÕÅ­Êóå¥E-YYnFÔ«ÌΊ PQ Kþýÿóû÷ÏȲ ŠKZÔ_Rˆ.Ê´ÏÓIEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/gui_setup.png0000660000175200017530000000340712664543647024777 0ustar guillaumeguillaume‰PNG  IHDR szzôsBIT|dˆ pHYs  ÒÝ~ütEXtCreation Time11/14/121ÀtEXtSoftwareAdobe Fireworks CS5.1«Hë]IDATX…µ–klÕ†Ÿ¹íì}×Ävœ:q Ù5©Qƒ0!@¬v«.5$ËÅI †& !E¢T!ZD *-h VmpQ›Ú.)­¶ÁBiK­6QÇ´X‰ uœ |!ÎÚkïìxfÎé][ÆÄY‡OiÏ™yŸïwÎEJÉìJ'Sa`µiš-¡P(!„ð©šfOŒ·mûeàŸ™Ž¬ý‘+(}Žß¿T]]ýÔÊU«ê—,Y‚aضÍÈÈ==oo:3ræít2õLGö­ù(gsà¶oz0?°õŽm`0ø¡¹ÞãÇ9ðÒB±X|8Ó‘}|>ê\–e=6>>þýß¾ðbßÈÈš®£é:ª¦±<‘`÷½_ .O$¾žN¦6Ï`N¦*Lm®©­Ù³k÷î…>Ÿ”!$Bx  ²ÿ×ûNår¹¦LGö½JԲȆ¹d:²û†‡†¿ýÔOŽ £º¡£ëu‹êX¹jÕ’H$òP%âj:™Z ¼eýÍß<ÄÞ‚e½680XÐ ]7Ðt MÓ¹nÝuäóùédj®@Ÿ³t`m"‘ˆ=¸©eCµmÛg:²ÖÔ‚t20ýæãŸ¾ì²5Ÿ»buP7t„"@)ÍûL“†††‘þþþk€Cç  ‹ê—,ŽÜº±5V__·ÏçÛ3sA øÞÅ—,ÛºýîU¡pxF÷ªª¢ª*5µµ •: ©Š‚®ë´nÚ{åà+7olYϤ=ù-àöϬ\yË];wÄÁ RJ<×CJ‰*ªª¢¨ ~¿ ©`<ŸÀô›¤®OU{»õ?oý{麅ŸÝ¼mË¢p$ŒnO …DQEEAAappp诠ûÔ©þ!¸º þ`€Í[n»è`öÏÍ_¾ñsªsá•:—H 4 E\×åÌÈx£8<6–?1<4T)%×·´˜š¦!„‡çz8Žƒë¸x®‡ð–5‰ãºXV{rÒª+ÐzNôÚûÛŸ¯¶ Ö•‰ SU¥ônQJq/ ÏCx ×Äb!|†Î²Ä ³¿ïä-=omþWç?Œ¦k×v …g;ö¿#‡ <'<<¯Ô¹WîÜq&qË*¢>>µ¸Ž@ €?à§¾n!MMWVkš–r]wï¿óHÛǘފÓÉT8 nºªé’«Ö¬ ˜~?ª¦¡i*Šª¢ à8F0ÄÒe %c¹Qœb‘¿½úúûúJY‘)RÊ;xì‘ç>6@¢!î©©­]Ûxycí¥Ë/%ŽL'~`à}|¡(W4­Æ4}8¶Ík¯þ•#)q]—b±HÀïG”!¾ûÄÎ qÖ?£t2õÅX,¶CHqu<W ÝÐÆòy@ ÅSZ[×µ¤oð÷tw“Íü¡$î8ô¾ó–e±¸¾žx<>åÈÓ>óä}ç0 ¦–RÂsÀàóù|®ûüîzÿ=C–ÅO¼û.Åbqú¾ºº:¢Ñ(R„”í?zö'mœ­úÚýÛQ”ŸI!p]—¾“'?$®( š¦±`ÁÀT&ÚŸþÅO?1çä\å ẎƒëºXÅ"“““¥‡©*º®ãóù0 ƒ‰‰ òù<Žëâ¸î»¶ÞùÜìgUäÀý»îÝ ¥Ü+…ˆÛ¶Í§O išª–¾ ©QÓBL³ýç¿ùUÛ¼îûÊÎF)å!!eÜu –5mÿLqUUñL¿I$-_"ÑD¹ràwÿÔ%¥lr…B×_À_ê¾,ÞÛÛ;µüÀËÀìJ'S”NÉñX,ÆÚk¯¡ªªŠî£Gé>Ú ¥­ýòO   q1°X7k*4g:²]Ÿ(À õ@ã ñöLG6ðØZ zøHÓIEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/married_no_descendants.png0000660000175200017530000000042212664543647027457 0ustar guillaumeguillaume‰PNG  IHDR 2ϽtEXtSoftwareAdobe ImageReadyqÉe<´IDATxÚbüÿÿ?1€DÌRý@Ä ö ÞÄ…)ï_~RÄçwG'üséÊÑ >H$S8$ˆ @Ï)d2ÞÜ ²Žá×§p7±ññƒé öÎ’ß½d¹IXW›a›_Ãó#Çà %m¬¼6­c€º™¤ðÃÛËWÌ[›1LŠ3@=F¼™@AðpÛö {ba&€i$’') ˜&ü¶{IEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/geneweb_start.png0000660000175200017530000002661612664543647025633 0ustar guillaumeguillaume‰PNG  IHDRTZçï®qtEXtSoftwareAdobe ImageReadyqÉe<-0IDATxÚì]\TÇóß;:* X±v±7P1!1¶D[,1‰’Xb¢æg‹Éÿ§I,1&±ÅX{‰Få§Æ‚½WDŒ¨€+‚¨ î?óxï±wܽrwÀ™ìøÙÏyÇ–Ù™ïÎìîÛ§Ñét„#FŒYNZ&F/#i4ÉÄè¥Ò¥&77w8wÇà«ÎTŠËËË[•žžÞVSÄJ–_¦Æ™†y¨Œ^V@•"6®_0€èìì¼JM9(äêêzRWDŠVŠ×†Í3•#F%Š©ÃÔ²··em­3öLŸŒþ‰ôë_vL/iíììÚ*Ñ[ך¤oû b-äϳ©Î0}2bÄèeà µ5¶è¡2@eĈÑË ¨ÚDg1bÄÈJ¤)¡² P1bÄ)//Ï&ÏÆ1@eĈѿѻe€Êˆ#F¶L P1bĈ*#FŒ1@eĈ£$}R ŸceÏB3*Ibœ0b*#FŒ1ÕêÞ…&11ÑÛÕÕµ]=H¯ÒÏëR”œ››{¼áã999Ç\\\ðú.¢+f÷X¸ ,===ØÞÞ>ØXžâäOà'%%¥¾““S04çÍdhºi¨·¿V«,IeDåååýü­[º[kqûa¹³šÌÌÌþxÁ‡Tû¼~–:::®Æ¯%Ñ~vvö"OëÌmŸoO±Ž­ÑGSýõ…>¥©)ƒ2[ÙÉóxÜZz(@å ¯â 3aü†Tòu…Ï®  ½ )<##c£Ðá¢Š× h¿´ÙDRPÀ²‚àxMZZÚ1OOÏ(k‚Ï—øâ „ÉPž ¼ú Ú_¥gä5ÊhA6k¬`LóÉÙJÚ  rjà”gIû˜‚­­†>õWÒ>ðüVtvvþ‰äß1ª¨ AÇæÚ©Ò1ð¦§ã¢X¥úþ0რ…Cß––)S昵ÀÕÞ†µ|ùr'PÔp˜ý¦ÁO.f¯?hµu1ÁÀû”±ŒnT¿ËZ @ó m„a[jë@Ã}ÅÙøÎúPíZKxd24[†f]ýÆ—Y«T¤ÀfãÆ®Ð‡Ù*å׌xúJKu‘œœÜN ˜Ò„üß‹ûtîó€`ßòuü®Uu }^[^¡™ã¸2ð7°téÒ;)UªÔ.Kù³·Ä°Ð~SSS@h?4Ìu|7I~Ob#NØK' ÕáRÚ´{'ŒûóN}¹ï”BºB½]³²²ÆÅÅMƒú|ÙÝ߬Ž~»ãÇë‹/Þ‡:盬û1QFùDj÷ÎG& –~`$ ;PøêÍÅ|IÉðÜž $=õÙ¿N† ÁNñÕoHCßÈÛ$ùû]ýÖ©S'1ì½—NvŸ}ÝdÞ:UÃHpýE¤×>VYèh‚àiŠí_Š›EÎ^Ÿd2sç{I¯Wi¾÷˜ðHeuœøü<¹—n´Àšãeuìææ¶ÓàJI‹³èZÆ3¸Ïš•zqW³“”””Ÿ½¼¼¢Íöæ‚itttåš5kΆì]CƒŠ:þ9ºy‰l={WæOðøéí×€4zCÏð þï@GG€k¾¡xÐÀLÞ”ø³áL‹í#`!¿È· |"hU>ñ“ sºo]P! ,øˆ'CŽGäÉд ÇŽ›¡p,ÙTµtCVá¬ÈDuAþ9tKÃ}³ú€|“üÇ6uthoJÇ™ÙÉ$:~)¹ùp¦R$€:N åÜšqŸ¦tÖ™Óq±çxÃOÔ:>azÚ‰§§çpp>Ïu-¯U oô(RǦàoZ¼»»ûzøEá÷'à‰î]ù=‰:¶Û⎣—õúàÿoôÓôôq0“àúOÞän~’ö¿nÐÂà¡Æ÷†€uÀÊR^_<Ž´ïõ‘¡±\{þüùð²eËóLðÆd¨P†2 ã ã4]­‡Êcð2,ùµ·oßîêëë»]­‡ àJ0Ø0h?Û‚öía Möðð˜¢ÖC½sçΛժUÛ íç ^©1#xb½¤–z††ž+¥ã³ Ã¥:´699”åø£)##c:Èãÿä@ÕìW hòI ^NPânŽlZB~ú ‰:º[â[ÊSzÊ3²mÁWdù—ƒ9A€ð5òÍ»‰ò`^z 7…õ.ÝÓ*¼î]ñ=™Ö¯99û×ïôfm”Ê ÓOü-111¤$eƒÃ9»—A†ü5åÅ”èÕo¹¹¹%zS’¹õð|k05Ô1z¤Ç® #[O´´Lpux9ÎË5ÔñÍ›7»—äZ*ÝW\Rgjgç/;Q3VÔ„ x*fÖÍì‚q-ƒÝ³b؆õÿÅDÃíAb#ŽëugSTwÆh Ëào(æÊÅòuùk½UyLK}J¶.ø’¬Ÿ9Š“‡0ñ¡œx@Ð|Â'¦^^^»JR†NNNÃA>ó^&šÔ% ¨sÕJ·Ík,Tc:FO{ëÉ–zàgMà èËý_ÐqõêÕ× ôÆ7ñ×›@h;Qª/E€Šžéƒêò@ †§Ë&&1ôz‹*¥§õ´s™ -q6…páäúÎXÿÏϸSQB~,‹u$=ˆ/2>/ƒ·†ò ½A„§OŸöäùÔN™2ÅBœ…z`ZŒ2!ã—â¾#@%''ïÎâàÐÀ )xÑOÞ![8 P~ꡊÒø4$>¥”ôàùuÒ 2tÆ*®Ïx¾ÔÃÃc:ÝïÈ#;KD†H(ÃQó·q'ðˆ L˜ï+l]†àUÕ¬P¡B ±ìü濞ªT©ÒUÐ1šZ0ÅãP5*õ2êyªÙÄ@µKó=zçBMýiµ„'®ÝJ„(þ÷#=ÚœáNØI®Y€ŠÞ_­ZµFÀ`væ¬Á(mTf¸hT!}†qfŠ:ôÎWdçÇsõ"X+14Ì‹uóÞžÖ]ßBqd¬ÐÀµC%„u…ôùXïP¼1RÊ#á-=-A!•8þwý¦¬ÑÎN(b¾·?&„4ß"΂ [Ù² œœjÁGŒI@í®ŽAJnWcCí{yy} üÿ€F^ÕOÕÏŒEÊá2ä+%ý¦¨š"Ò—p, o)å/ÿä â»ñv‚ΛɣTZ)ïtæÌ™¥¾(ðNg*Z0y—¤€À˜ANÏ3¿Œtý»—}Ç“T= ƒD‚Ó»ÖøË¯Mb[Ø&‚‘àšg$çaÉ÷ß³rU6}ˆ……ó$åë@ž†ÎX]d2<½kž ïß¿oó2Ü´iÓqæ_ZÐk“;¨/x¤}À3Äóšr`Š^ R/A´3x§ÞüùØâ"œ°?Ø/%2–%ÐN’’’Þ“ÂM©5Tíˆ#ÄÓ®7.'×/ÈïF±F/äËËË˼råÊ’uëÖ Œ€äÉãÆý£¢¢æBÈ)äõ¬ìK>¿Tñk(ÛÎAÊS†¬‹‹‹¸>‰“+ï×8ˆk ÛC””[ׯ_ßxáÂ…Ÿïl–NDî^¿,[oYð¦Â¦¯Ö«W °S;×+’¡à›+CìŸB(=Õ–eøìÙ³‰C† IW䦙Jjó«©‹X9¿µûbÌ“¼9K¶œw¹WÉ[mÏè…ä¦tŒ`ú„ð‰)çeëåÀ´…‘P_a222î Ô†T]"Õ€TkΜ9ÝNŸ>ý „ì—h0Ç~aÿäxåäÄ„ü߉­„ªñFž!§v®ãÖÒ¤Ò@ðJi"::z‰¿¿£ üwÀ€xîé¤L}ûöÝݰaÃižžžÝŽ?>žVLØL0¦JU%Ûºtx§xfÑÁÁ¡¶È'x^I÷oK–Å5ɰ™khÀÊ>räÈD77·ÐÄÄÄýM›6 ³‘ƒK& $ñ×#eû<‡Í(DÚ°H¶ôôh>xð`רQ£Ú©•áÀ/–•!ê4‰÷Ríìì*Úª ¯^½ŠkWóˆÌ3þÿfOúÉ'ŸœÛ·oß¡ÿ†HKµ{ýÂQý5º”gÀëQÉ2]€Oa­…:yòäPhû½{÷BüüüÖÐ7? ïª>ún­œ:u* ¯R8 Hò6´@†?ÞѨQ£ù€2ÌR"ÃS#Cy[•á™3g†6kÖl Ž%€jËjQ·¯&?nB=H —ÌO¯—Jé=·'[*öL Á4<<|dQÉpÙ_ZŸôìdøðáçi;á.qñ “¬ë¨ŽŽŽÕªÖÕÕU¼-ß L¯yµîÒŸ¸”É7°ôôôXc|Þþ…`c^©ª3V‡$t6½S§Nû#""Ä[Út ÙîµóÇô˜¾~á˜dþ*0 ¼hê÷ß Âê×Àü‚Eãú“Äûwd×ûpúãYëô€àܹsCÚ´ió§O}¥2Dï^¨ðãW^ye$?»fñ2Ì+ Æ_»Ì¨-ʰU«V›x#È&Jnþù7#ªŠ˜ÿþ“pɼ^îÍHuêX”)#˜¢gš’§hÍ´“˜¢ŽCCCÿ,.ÛÀºG«g'‘‘‘ã„jâå-å“RÎsw4 "÷;wzãȤ‡êääÔ¦ÀC•öX;t+X莌œÆ{TœŒî裓óN KO“&MVâ& ça4/«é°ÿùSq °´$ø¤–$`¦]B=Ÿ*Uª´‚_þó.ÁmE^Õ°ï A‹-ð¾ƒLa5±^X¤dØ•öð‰ŠŠz*€iQÊS¢íÊPSE÷£²5Teùå¼É{ÉêÁt/€©Ü:¬à™vj^L)›—ïÑ v’¸a)=U©²Â:*xé~j/î­.|‘2 ÷«‚Ñ »Ñ­[·Þ!Ág!Ud@H¼ÁpnyBBÂz¡mÿ¦Á’åpóD ;פÁ  Y0½Æ»€ëuC¯jáçýÁðÙ륀 5°€·KÒ¼5WXÈöíÛ7§ DmT†ŠÁÔÖCn[j_PécLÆtŒÀ²O˜¾. ¦9Å­C~¬ËÎÍͽ/ÔéRÚC²†”¥Ið‰k~U‰À_±bE7ú¦ô æ€@Aˆ 0böï²@ Ñh¾ Ðƒöž¬*ÓDë8USa>ç™6“ÓU{ ¿Sª˜×¡õìÄ\½ËjPPÐMñHw5éó Ï Â;;;w%¢ dÁHa>c|p@0¦/y¬~ü“‡B0ÕXÀ›ndp%]ñÉPgS2ľ+ÄPx ÏèpUiȶtéÒ²ï½nÑ}¦š2eÊÔGæÖ$ºm°+D®ºž¬‚ Îê„ ºS9*̓ii3ÀTv©"'Ùk´ê' wkÊP«d bXoÊHШóYþX'Þ`è3"®Ò2¬ŸôEóG÷Q Ÿü´A ˜5ªÑ~›)?ódHlF†#‚*ªz“tnnnÁÿ¨R! mÚ´©Ÿ˜rãÑÂ:"èÈ„Á©¢"<ÙÇ9mó ¢uvvn%Ôù$å‚d™2."öC8^Ãd¾Ðü9ÏôB'îw9¾ðh”0]½O«£ä¨ƒˆXÜÁ:LÕKo¸œ¶iÓ&oKuº¨DªT~z†q—¬ Psrrn+ÙÔÀ +ÜæÃUg|qÖkî]˜FÐ@:?UÆË[zó%úìæ}†@p[–ìû¨9õ€œÃ ᜧ§§¿ Â]iÈ,˜÷–¦0@ªë·%÷‰¾Ì2œ{ènðÂã”FXº¬¬,ñùl/·¦’áÚÃ'¯>öõõÅ·Ø z-OuèepŒ—.]ú-¡>¬[ªLòó‚sŒàxÄÆÆ™öã–Çzï7Ybç'äJË|R¡B…_Ì‘!8›Çˆ‰G¡M†ü'Nœۢ=wÑ”á¼xžL¶üüX¸T©RT¹7“.>õXS\ªo@I>¹uÀ»Ê€`ôÜM¤\•B@°¥G8JÂaâׯÖÌüœìY=^#{„þëËè¡Ú’ 333å@5<…ãè1pÞ x¨Nöe%öK1“è5ÿNŠb£vBåCÈ£ˆˆ¨\£F}`½Ž‚w ¢’0Cg_ÜÝÝ—/€“kÿŽùð}_XŽs¹Ü·¢þíúJä¤4Ì¥‰Q05ªã³ÑÃôú:ù/ß³gè¼UàR£Cð|û‚ ǪÑ!¾æ§|ùòë ÖŸÏËêöœSRRN›:?kÒC4hÐ=˜A®çŸõ Í^éNty:“éÈ–•úo£Au€Ê7?þø£ó’Ó‰©²t2º–(UÆ H»·¥mKå D=o³Q ˆ‰‰i¼yóæSz@0c,×÷Íó¿&­*WW×Þú»|}6Öo úðO‘!¾âFT¹'^x#¿*a’áAÃßñàÁƒzýÁØú‡ñ7ün×F0¯:<~¹Ÿªµly ––‚óÁ‚±¶…öÑVñõéžžž˜ê‹1Bðô,SpP_©œ”„ùM€©1#˜âÒòKƒ*âàÁƒ§€ž¹w›8˜N†t¼Tºáw8N¢££+£žLÉ’èpPÕªUÏw[A؈R¢CZ^÷îÝ;¡ÚCÅ áÔ|ÑÈz –Ý|X4q¹zæ0 *“ÆŒ“³Ð×?¸Õ~éÙ$-$ª ¢n¦]ÏÁfoæ`h:zÁRž¼5 „ÿ¬ñµjÕ: ¼µiõô±äð–UbyVÎS݇"ß”"Ê7¥lM†2 ÊSð8ÄÃçµ`àË…|WïÌâÂZÀðߨT©R8sÁûh'+~¾Ñ4±!ö𜜜£`¸Ûi0=ñ:IN=¯zwù„Ó4¨¢ó‘›› vòEÏ zíãwüþ~_ŸN゚ˆê'Û–ŸOܺuk‹9I…ù†`*¥cÓX*¤ŽŒD®R€Xºté^0Y\£¤ ½eyÀ:QË78Nj×®ƒ:ìÞêY{c:„‰uˆcÅIœ£úÊ.m ˜"Ð#!ðCTtÔ”‡*õN©\??¿µ0«} ·Õê’f¯¾IÎíß&‰ä?Œx› ›¹Œ47@]`ú>¿Trf©$,gð74äv=ßã<5T¾Ju2æçÍz@€Ôºuk£+þ‹&~hT›æOåÖD;þ¬PÈ­° ²ùU“Œ ×pmM†h,`(Oàs”üsO»Ô¯_ÿ`, ŒÐÈý¼ÃôÓ#ǰ¶Q­tú &9Ù£Ws 1ßVKxüç0€jÛHE~m_vò­Ý#`ûÜ1/²–w îÝ»wåСC_U#'cuvh¼§ÐF—)#Ÿ¸îiÈ'"·œXm¼°ÁÔCøÊC0Ñ!˜ÐPBˆ5Ju(LH¸®.§Cª~r÷î]œísˆÊwJ OëdÁì/¾­óQÿ§h ï— péöÕ˱@vC§0uü©ª5GôªÆ.ÜÌ‚ý}ú0™øfSrvßV“õmš7•ì^1׆ΡÊ=©eû2#ñäÉ“úÆ–§£bcc§Ñ ·‡)¼¤}g[Ê.MXf× LÍM¨ °+=PŽù0?–ËÎI–mƒž,’’’þ>|xÄ7¦ÓrRÃ3‚hˆ05ú;Oú“»<˜K—T£oac‹Ú‹ñ„u <’SΫÓ!ðö4Eþ×@¡Ð_ˆRø»`Uª8Pûöí»+<¥ ŠÆ2u@G2{xO²kŽÔBªÒ pÇÕò‰)áîM²kù\ŽgS„}À¾ÌÞƒË/Wçó¦@(»ÂF6¥”?aË2„Ð0ÈTØ_§NÕÂ8-ÐÈpŸâ•IÉ©çÈáK¯‘}çZè;ß5̸ûK¸¿m<¨%‘qIVîEu+Iq–­G½È¹kø6Œü~òJ_.æWRoÕŠ½HÕ k‘ÑÑÑèA¦×«Wo9rÂô"#–[.‰O0}Û?òЇ2Åüru¢{öì×&Mš¬£ykÝ dtˆº+K=(þb’ÿÉ7Gh¥÷28ëÄ㯽öÚT7ºyq‹¶¡5¶h7ډ“SNHHȨ’ä³÷§SI×FÛÖ.¿ ‚wls2LIIÙ\ªT©Ï‰é[¨„qšÙ­[·‰ï܉…Æ{IEÏP‹®ÊS“œjz”¿Ñ‰íËÝ1`­„í`{¥¨5ÎóçÏ~öìÙç<˜æ r¢íÁËyʪ·fBÏ´6¦¨cÔqúÒ¥K¿Bÿ’àM˜ºzõêØàà`<š'{«Vç˽2óüâÅ‹c…7“¢¡_¼ÔkR²^*e_xhTTT!>§®?LZ¼Ö£Èyùý ÒõÃѪ=DRâ—£èè#DyöÛŒ Ñ[qss “Ú ×RÈa;¯4;«çUácƒ‚‚@°é x5d!{F9aùâ’ ¦¼Ž?â½è¬ &ÜÁ3­4o(à eC‹”/a¬Ð:Ä]}ˆÐ—+ñN*å¥fµiÓæÀ±cÇúÒ†6aÉ6ÒgôT›ùù{T ñ‰ôÉì•äƒÿ›[$zĆ4h£WE¿1v3€)æÝœª¹¦t\Ür¢t,¼…ã '‚#GŽô3œÖœQd¼¡ iÐ^UµjÕ©d¬Þ`ŽŠŠúOõêÕñ¤Aª9ªp1´¥€jî%Ý|9ÈP ˜ÒKTœAN™2åòþàÁƒÕâ¸sM€^oCªN0Ë›) u4O©g‡<®CÞýýý‘÷¤æÍ›ÿºÿþ^4XUï¬cÓ³¤e½ œ7dNûèáay¬‡ö¨RSS#Ö®]Ú¢E‹M4˜þy(ß;¥ü&i'('¡¢’“¡Ž‘O>‰Xƒ jˆ5Öä­[P©^ù#=Þ𩯀€)Þd±Æ¼Ý½{wí¡C‡4(’š$Ç_!œ4å±Èx48Pð±UÔ7tÒ÷Ê•+ßdè¬H‘'Âuý긘LCZVóBÛx`i4$øÁDñ‰wºŸÏž=»ŠÆg$Ëóí; ç"³²²Nª­/-- _ÿì`¡‡ªŒŒlfNbccCùÉÀP×%!C³_oaŒwH•Ïž=;ô’PL¼k ‚ä¹téÒsW[ÓFâããW-[¶¬.òí`{Z•ã¥Du\ÒXÎÇ¡#GŽàÓrèó¼)¹×سz@¥:*ÌȾVµÊéÓ§Ç¢ð¬ÑÑ%_Ôõ­íl2ýôY1/„;{ù¥¿!QÛj|B÷øáÇÛvìØnCEÞXyÅkyùØ'$$|¨¶î˜˜˜ŽXÖR@E@OIIY¬Ì7ðýÐÑu±ÊÐÒÈÅï°!ðx°Ž1—w4f9ý±¼£ íäÉ“›ƒžçC4pÑœö±ÜåË—§}õÕWÍx(Í×/ P2ö\ìv¢‚7»"ä ožr3güòª:ä7’WC…Wö|§`ÐTíÒ¥K[;ëTªT©»»{c5qùÄòí]%ó„}½€„ö"< ò¥Ïl wú8b~ãõ I>!Ì­îííÝÑŸÏŸ?¿xÿþýƒÑÑѧ{öìyœë²øEØß+Å/8@™APw˜³³sKSý)½Ù;wî,˜;ïÆ¯Y›E¼N¸ÑÀòåËuqqia*zzúYÅ~­V­ÚZ!\4öb'9][S†Æb@-BÞOð!¡Iýi[c° ÁµÐÚÍÍ-ÀÃã)Œ“*†åÁY¸š””t!33óáõë×OuïÞÝPvÂfŽNÕ ¹Ì°gkÛ‰ð–E‡÷jÆ_¡qf) 4vTrà;nϧÝháS{êÔ©·[¶l9]¸´÷ųd2ñí¶äQüM“í•r/Kìÿ›ûä×OÛ†††žëíï”-Åç72¥ø´3§°A“Ë Ny¦2j´9Ì€B½Ùƒ.Ï †a8ðø$„£:ªOBÛÙJ¼Œ®­"Ckª ïö”l¬¢‰¶…BKÙ†½Ùn² ígSÿÚ'–Ž—’б-óf. Ú[Kº‚›Jð]9|g2©™Yo£íÌ™3õ|}}ƒ`Véçèè(^D‹`úõû]ÈÃ;ÒÏ@¿ö¹¦x6nFñ@$Y®—Ÿ£È禘,Ï j{AœŽ</p2ݶõÓÇ@²ŒÔ¯3¨›«ŸçÑb•PžKŽ茴¯S2èMèÚê2, 2Á»¦8x§òçBÛ‚^Œµ­1h[Gµ-n’¥ìlYǶ̛}Q^Qú988 ƒN)Éé£Þ%qQ$ó!¾Æ‡úHàÂO!¯rVÌß;µèGsé¿Zì!Qõç©-kÅAW¨oE4¸‹´ïÔ@U=>þMrzÙx+*@ÕdddŒÏs¶Ò.þž¬™5YQÞýGôNñíÀÀÀ]¡ª­(š0*ZCbB`dsãËꀊë7nturr’Ó}ë%©⯙õ…âúk5hJz~ÇÖ ŒÁ)#F P­â¤¦¥¥Ù¹¹¹‰Àb­ðìóëIEß‚KžuèÐ!|÷TJêv:[ YHʈT«PVV––vÕ¬-S×ì!A¯Šß/]ºôñÛo¿}YôNm ¿ž2bÄÕ*”››«±º`˜?ná\¦qqq_C¨ÿ'á/.xËW«# Q1bôO ù Õ\hA1c©ä[p‘Allì7~~~øÎîò‚7}µy¶] N1b€Z$Т6G¯tð¤¤SýÛÏy0ý‰äßQȇú¶ ]l •#¨VÁ;;;³Ðįa3Ô­yg¸þeÙÙÙI/^œÐªU«-„ºðµ{U C-FŒý³=TP…­LÑàI3¹Ïàn½õB{ðÒÛÅ‹Ïúæ›on“ü}îùÛn>¶ë2•£'Yírª¬vâĉî3fÌxb cIII‡£££—祿R!ÌghõO˜2—S°!Àèߨh ‰‰‰Ÿ{yyMWS6333ñÑ£GEFFnëÞ½ûRpEwíR¨ Pý•»N+>>~ €j˜Ô]œÂ…xÏã[o½u‚ë3)Ôj×~1b€ÊˆÑK¨BØOôï™t$w>ûý‰Œ 2bTTTǦ ïâîE•º ´ÄîÈdĈ#›Ô—ùŽLFŒ1²jÈψ#FŒÔ“–‰€#FŒ 2bĈTFŒ1b€Êˆ#FŒL’Ñ]þÑßjÙN#FŒ¡9_æ™<$Ívù1bĈ…üŒ1bÄ•#FŒþ‘ôÿ Î2 JbùÙÊIEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/favicon_gwsetup.png0000660000175200017530000002124012664543647026171 0ustar guillaumeguillaume‰PNG  IHDR@@ªiqÞtEXtSoftwareAdobe ImageReadyqÉe<"BIDATxÚÜ›tœ×uçÓƒ2è•Da;%Z”˲Y±¥8ÅŽõ9ñfãµ{“ãØ»ÙbŸ”ÍI⢨Z²šE‘*¤H±“ ‰Þû ¦÷>{gRl–-›Ùs’ÑyÌpæ›wï»÷_Þ÷}jn~(d¨dhehd¨WßûøÈÈHɈËHÈH®¾wõ¡¾!p¥ ³Œ‚ÕgíjBÿƒO¯”á]}ެ&%sm®¬ºI†UFÕÁןûý›:÷™Í¦Bþ?¢ÑXhddüÂÃ}ü›Ë猼åXMD¶"2WV5|žŒŠ/}ùøòáZ­FÇ¢G:N½ðü«ÿøë¿öÙ’—ó2|Ù–¸RÚzeð…ß{àkþ¥oªÕ* ÿÉ …BÙÖÖ²­¹¹1óÒ‹V[!©XmƒbÍ^ÿä²òzþ?2™LúÃ÷?öØÑ£'NfÛA¹ r–|ê¿hµjý 6ÜÞ‘L&˜žPØ)=¥gì[„üÃÄãqœÞ^R©$‰¤7÷ì.²ì uÉdÓ·}. Ê¿ýÎ7¾´ òZõ*Õåoܸ~_&š·ÿáóû$ðiNœÿJ þgè Ç ÑpÝ[¿‚cy™YûçIf¶ Åpùhõ>jËï ‰S]ÕA¾¹![Æ·e>5µ•ëV_£^mm^ž©@Rþ‹–.÷™´‹Pt“¡‰hb€ g=Ï8¡@ŠiÏòóqÄßĹì§iÁK"6„}yuz™ÍõWÄ¢1äÕ“¯*``°KÉ,¥½²€;„R±H0~…$`Må¤aL¼¢m®Ñé¬u²ýÜ;ü-ŒÆ&¾óÄÒEŒÌœ$ê.ÇhÚ@À?…ÓçÆPPÉå‰)ÿYª¬cnVú;߯Ôà÷í{ Ÿ.ÁñÁiù·a•“ª¢36~ƒLor:Lƒñ-’!}5aK½Aϲûu úv -k~¡ÖP_»š™Ÿ±’Év×1I)m—›³þšXçW³Íͧo®—€×NˆIœKM’/QÓPÌæúßà|ÿYêʃŒ,„ijÏ0/Õâq-r×ú],„æÙPõq"¡1ajþ õÕ},:—Q¥«Ñ›=„Š#D³Øl“hôS赟Æ`øù‰KyTxߑɤˆÆÜDC6<ËÇ?"½{^]KaÞ>Î ÿ+ n'™”ò Ly>ºZ¡HÑ,˜£©rŽ~”iu%Å–€¼÷Îy¾…jNõ¦®t'Jm…ÉÄGÛNSž‘wß`fyš°´Z,5ÍÂÒö¥&Þ’äæ “DêÜo=>`ÄbqÆäGÇQ,¸ºI*ã””»Hi:hÈ´sªÿ9Nw¿MÓš‡èŸy‰öuÜy@‡Ý©!U`5ÆIø;èzƒ­EY]~¿*ˆÎÕÎÄÜ+„b ÜÑñ-z/¾LAù2©kçâ´|Î$©.Ä- 2¿DßJF{ZðGÐLû(z½îß·RÂåÑP#®%=ö)'yÊ.Bîµ…œ9óî…‹TÖÒ¼±I&3…&¾9çk„#Ç™ؘ—Õ?tÈHu…†` ˜ª™~Û;Y>κŠê[4Ôæ•J›¸|aOJŽ!`I7Y¬czRE"FgZM\‡ãĽ#¨Ä½|‡ó ‹="y“?gdËü ˜]ùiÛ3$Ëx£g‰F°fmƒ`/Kž€”b˜Ö¦8b½ÌØct¬ÝÂð’TÜ$ÔõK¤vjô›…秸cŠŸ…Úú$ËÁ™pšÆò9F.ó*¨n{ùK~tÇE¥˜wûI¹{<eÏîVÃzJ ÄCm2y‘–V=>«¥*BS]%ª”‰žþ…Ê6Pm¬¤£ª@ĸ›SGKóN‰îØ¢£¢°T$*:¡œõm$5‡¸0úCâªQ‘6’áAŒf‹š ,¥Î ý#þ@·|^C:•þ‰±\7nLÀJ\?Ò|jUJ²®åb·’¢üGyóÌ“ŒŽ½ÎkG–©-ÉÐZ»Ž¯ÇÙÔv7w¶Œ—OòãLN¢ ™i¶–Šå*—ŸÌm/´Ö·²ds U„0‹˜˜éÅ3ŸÂáë—¶˜§Ðü0fmëËA“åÐÙW1XtCÌN­ãrWޝÀZÄ ‹áôü˜‚ü2Þÿa_™œù.ÿbnî·ŠéʸņHæÆÍÑæ)—¨¬œ¤¤ ˜ã§¤%¢ÕŒ ”¡Ò‹ …ˆ'ídªæ… EÚÆÓ¬-}}á(CçâL®9ßÙ@Û¦MÏKuKµ€­£Ó¼¢aœN¿Ì¨gMÊOUÞ8Âó´­ß˼`‹JŸ”vÌc~&"@½H43"˜UF£þ ,ðžcŠ ð-,Å-?Ž26m$£\‡3ÐG0$ 8ÿ4­–wÚž¶12~®Í-ìݗƘ—brù(oõ\–Ïh8Ýû/|÷µo“WàfÙv† Öͼua€>ç…Zim5啜ºpNLOcCCøÜ6éû"Qßcmã"É<Îv :„Ó'EŒé9Óû *¥^0Iv/åuÂÅ"®^$þgx#ä*`eÄâ1ì¶bâ3VýnÊu’Í9v4íC2IÐ[Ì‘ Çx÷¨P¢c€s:•Kʸ]h©»'#=ª¤¥¾Qü¦•QE˜;7ï§odˆÙ1õ…k™v©™òò‘Sò=CssøÒF©„&q…Ì‚3c 8g«Ù¿s—0Ì=4V6Ë\Òb+ThŠ61ë¼™ ¶´Ç”£® ­ôÿÂüa©‚Äuq];Þ·´â’ Ìâ”,†ÎÒ¶Á„Fk㔡MÍ[Ieö€,Rd`0ô*à„ÔêÔç‹Ì¢Qöež ë«ïaÊæ—vØ‚©ROÿäož GÄÇÚú;%³èÊ\ÜO3AE„× ³Ýüê}÷"ÝIÈ o@€²©ÑË?u¨D›”j¨Ø-–÷÷í9@WÛ'Há§{ü ž>v–sã6ú&rbô jmœ{l£k“Wdö§Ð(:…=bœ:JyQ£´Ì’@ kJ¶ £ˆÖpõ %'Þ—n©2i¡À´³y^xu Š´™¶ßGe¡žò’ gl¤2DS4¢Û«‹ï¢¬¨œbeÃ"nQ=}'ÑdŒ„cN]æ™·'D–õf87r»€”¥°\Z%É›· L92äá«ÿò·4WÜK}ùVv­ ð~ëZª°®áN½ÒH¡Azç¼’³,Ŧ°Lìk½¨ÒÌåIº´žšâ½ˆÜbbºO„[ô}uÀ-•`<žJ¤¡î€p«@ä$»™yßIJ,ëØ¶·¯ï ÑÑ-!áÔË~ùÑûI‹aª(ªáGGÏÓÑÖ(+¿6‡N¿‚Òâu´”EyåÝ)Bi7—gÜ´(ÚYX~‰µu±ÁUt—J2*Â&ÆÎþîÅód^¬UZŠÍ[ØÚÖ‚Ía‘UÀ+‡OQ]“áòôi¶ˆéZSLUõ‡8xè0›;6c6‰k]¾@~çOÜC¸ ’I¡=1<ªh€qÇ?rzøÛb€ôè BAëDšê‰º™\bßÖ24ÑYÂ6ixçAâ©·Ÿá3þ&ϼ3Ãüøi‘ÄP\`A_ÐIT¡ä«Ÿ¾W ŽRJ_Íç>·Œân–ç÷Ò34Æ´½ˆwÕâòû¹7ãó~Üî'8|ÊÏØ’G~NIÛšžxñIf|I~ç®GùË_âþ½wòOO˪ì¦gî<êd£ô~…e ÖŠޱ±oãRV‚q§T—E\£FÎ…Þ°—²BôѨüV;óSqš×–¬¬ræÖ»]Ùºõ¡ä¿øë¿¡T*”.——Ñá!G޳4[Æ ÍÅšz#wlz ÕÕ¨tE,;B„’c¸£ø‚^T1 KŽ:DæîÝÕÖICŸÑÙˆHTµ¸5¥Ð“Ÿp&Á×wªŒŠ#ý‘³Q} N\>C*1Ë›=b·Í*”ÉYè>£ ¬¬˜|«V!Ì&‰P¾göþò/¾÷}yZ¾I g?Sž¢²V‹Ââ PÝ)}mæbÿ›è”ZÂê•Õ›§t¤B ÏM2îT`ÐXèáO>¿— Ç ”a4L+ÙÎîÚjT ôš2êÊ­ÄSK<û'ë¸4}‹‡7Ÿ=|XZožcê°T`J€lŠé…×4Ñ7qíëÚ F›Å¾$NóÛ6Vâ_*bSõRFäž3lnø·G¬•{îËf9J±×2˜LqÑ0º÷oÞ‰Eãléü5|þ ÇI,026)=j ²>„¡ØÉ­—]9¶¥iÑ b„ÖÞoYzÐàSÿû)P쨒ƒk°jÝlêÜÍŸ=÷2†Ô(éÐzI`Hì<~ýî»ùâßü)-'‚±pC£çøÂ/µ ˆ‰²™(-‡¼ ‡”+J·Ìç‹Ý‹;¢ÁíYz<ÁîõÌ•Üs÷½xâ§ZB?µ;¶o§ßw‰ÊÐ MU5i÷äMBèšx<×n·#G Õ¥XSõYsIþ(uõÅt¶¶ ,ÊdÝ"7c’€$öé"¬V?wu”²gC›€Ž{Š‘™€8?#ó¶IŠ­fܾYšêÕøEëèT]XE|ûÔQîÛ²Ž–&¦´<¸+Àþ-›…^+ø_Ïœåà©abšÏ ¡±ÆÂCö!ªJK¤r D”E”Y‹ÑEô$¥ülßðQ,¦Z™ßQ*ÍM(T{ÄÍŠ°3—JeÄ -Ú—fùî?¿þ¤Äm¿)Ù6P)JD@䉰³iÓbé^š[+¤ßûÄ×ÿ‡SÔ`˜p2H^²‰Îµ5TÖUI‰§¥D§˜òØÐ¾“š<—ÀfÇ/8ÙÖT"«YOžÞ@ßÌ<#—†„J(+öÓßçùË™ …]ÕŒ/ŸE§¨â¡xÄ2§R. ŠyîÙñ1b©Ä2K$"Jž}w»ÝÆœ·S˜ÆÌÖµôÎfzvšzQ o¼Ý#ìPKuemö䨣—±ñ!º{ÞáØ[“OKÜ Wð_¿ø«¹¨ÅAåSX #¥» Êï% õ8]ÝlomçÝ3 ?ÆþM÷PgÑ0Ñ j,Ê…¡…œæ¯©äN)hh¸‡MµAYu¿¨¼*~|¶‡m¿›“ý½Œ+4T†ÙµñÓ¼òÎ)Yá±ÒåbŽf„ï÷ñÌñˬ\ê)\­`ÕH]u¥0B1}ã.q’ƒÔUXpÆ`}­§- -ZNÂïaM]!žÀ<¥•ˆ»”ù¦ ðz” 20rFÌÛYFúÒÏJܶ›” Z¥4Ö¡–sÛ*P‹PÑçؾå“:Ö‹±(‰I¥âǧŸ§on„B³ôS|’Í~*MQ^:åcÿæ}¼pi’±©‹T”'¹{}g»_“JÙÅ«gNÒ²&„RÚš‚uôy“j“’/Ü»¶êqŠ2õœ;ÿo„Œ!ü©|.ÙBYЉ(šøÎ“ÿÊ÷ŽÄš1iOˆÊô ð)(Є)- È÷¾‡NSOB“Gßh‚T XÔè}ŒŽ]ärO}ƒ§˜[ŠJ\Õ@?aC$+ˆ‚ì»Âà ÆG´øBÒ{jñésÔW=J£UÍý J»›‰ìƈHãý]ìÛQÍ·^ä±uq¶ÏÉų“<´/EÆ´“Á-«fäí>¨ ¥8´€:âÅÖ˜¦nBÌÔ< záH)o½¹@ÏèímwጌÍÑ—Ó^úuzq¬RÚͨ †Ñ"»“¯ˆu¾DÔQFQžá! >ϬàŠx挰Ïbîì”By+Xý/·?,•$hZ³‡é)5RƧ&ØÚTDëÚÒƒRÂS»–½âÏûÙX§Õ&úa|†÷-“ ûð4áu:°…uL<›! tñGŸ*eC×½ôŽúˆ%FÀ` X' –ãv‰’Gèh(—ÊZŒÐܸ=·g0ë0ˆð±Æ¸„RŸ!¥¨”¶ØÂÛG_¥±õCÄp¥©!OUM0‘'€­Â¨ì ˆõ¶y$)ó$26 <-4Ÿ½V€÷ßËÒDPVuÑ@´‹ž¶ÓÙ¢$_Z#½@$¶S&ÎÌÂˤ5FAõmê=LØáω" Ã^› Tœ01ãõðÚ©K¤‚aúßvcÊvŽÌdYmâó{㙃?`ãºRi½ zCܳU#~`ˆ-w’öSly\Øè0÷®¿[ˆcATXRIÀ7Jkã$°ÇæO±¶ù1žüþ1Ô?K—z€DzQØ@‚W¬¯T^/²×­·9^y[ ƒzår’ s³Kœ:ÙËìì,±ˆ‚?<ƒ¡h+Nßi?£ìoHÔ•‹£cR²&Ž_êAUbS‹¸Æ$'¨:j÷ñNß1êuëð„<œp;I_Z¤!’ÊýxPÄQþ† âäfè›N0£ÎP­4ðßÙ ÒWÃ¥¿¨K7kk7òNÿe\ËÁ„PtF$s«$ËÍÃû¶stà.O¯Xäßâü¹Ë8–çX’j÷‰‹2ŒçÊ>·úÙg‰ú¥ð°Lá¤òF!´rv(CIi;wu°ÿžN{|^,Lp½¢ƒ»ÛþX´ý» Œ»q†ÅBxD5.“'žßZÕÀÐâ‘¥å"Œ¶·”£Yœ'éä·»ÊØ~g5‹ éÉ´`QQY„ÙùDî,ѯmÖòÐýÕ¼=õ6}ââÚ×äáòšùÎóÏR_T^åfg« ]I_QÁÔ’›|µŸÝ-Ÿetâ¢hÁ‹P!~©´$ ïeõ³Ï×Hâ÷hð>)4¸RÙ³­Ù ż# uŽÎ†jZjš©26Š(ZÄœ9G2r‘»ÚJÖñ‘_iàGÿ0IЖ(d¢B­ÇD¦Vž¦i÷o3yiÉáIqŒkËeÕ×WáwÂõ[eæV¬¥›Q—å3»èÃí:ÍŽ¶‡˜šö3~[¾’ £öˆéIç‚T¬~%èlé¿ ÜòÒ2±ªzŠ‹×åÎ y|  P Þ„¢¨œãÇαkÿnâa»Èß‹ÔUîÇãAÒ×K­x÷¡7½®zó(S‹^jêÙ“Kä—*ð9WÎßè|PMSå¬ù>ƧˈúìØ}™H3eu²ÊãѪ‹h,·sòb1Öò£²:e‚ <õÂó”˜;s'CÒªàJð׬ö{À§¸.?Sr,¨©+Ã`Ò‹°ÈÐÜT&6Ô$&G\Þ†mÌÌŒK Ñ\¿‹¡É·Åí¢¶ô>~ðý—¹ïÁf‘¼¯ÑU»‹ñ “µÕ!4â"=-~fÆrÇ¿ë¡G0NMsªÇÌÚº;0ë—±gOÃKïkìÕ¥T¤÷‹Žy•ÁîBÁ¢(‘„E|I>Sã—tCÒ9©\€™ŒRäxëš¶çq|ú<³ gE³¤¯âÏœ€läç›DméD¨´pþd?ñhFÄŠ‚ŒÑÎTw„¨*Ÿiéíí{-¸¢Â3ïR¹%D}ݽãÓ"­Õd:¨¥më0Ék.B}áùsüæïY‰¤ÛˆÆûñ.΢Jæs÷öG™[z­¹‚‘Þ³økÐÜo`­)!-²xb\ɲ蓄²ÉâžOåV;“Öò™ßüa“Ï^ýwO½Ê·þþqù+ðÁ+àêÕ*ªªKÐê6‘H¤p:½ôŸcmëÊ̱à\¦¢HMqi@m–š¢¼~îeÁ…I ó¼òý4[;·pñœŸÑ ƒWk6hqØó©Z—¤1OèT¹›p\Ç»cG„‰\¦m´®«-št­P-¢Ç‰Ù¬fÙ“½"EÔ¡Ÿó±‚ỻϟ¥ó¾þ üõw¾ÄøÌ ,EÒŽ*>܈–‚<òÌÆÜ)è²²Â\Rªk>É¢°A"VÊ‘#Ëòþ0·íàGORßæ¢D¯ Ùº»{Œ²š ì4yðÌ.2·ìY9—À›LÂëà ڴìhÑÊ¿-²§m+ï^x _áÊ ¶ú<øj7ñ¤6Çínߤ$j^J\íùDBËÇþýœõÍ2ú˯}—Ù¥£R­â õï~m(?àõ¶¹ µ: ÅV •Vzû"¸=zZ××sǾ²:wrì¸K^ eµ4³gãçÈ·ضñ~æ—.  ZD/ø¯3ìJÿ6äN˜tTnu™Ò o¼:A{ã]$%±O<âÍÃ,…˜L Q}“º“2¡èuhŸJ*tór;ÛÙ3Û••²`"œ¤ãŒº5|øî/“Œk¾ ¸Õ£¸(Ÿ–¦õ9ÑTV^„J²ž Ðë]KÐ{•0ÀÅîç#œb˜>‡2UA*’rŽ]=FÈíçÅWψmmÂØª§¼|=¶élY·33f'©²²aSziûÂŽQ‘iYºäõü.75t m[s È^†ûÉG¿@a‘…PØÃ¯|ìèé=E"ù—”·)ÙvÈ‚cÖQd+#[!åÅò¾w)Ãï c³µQZ9ǤÂFc}j•Š 'pÝqJM¢»Ö1=¹ˆ~ ]ìÜÓˆc©Š` Œ¹ÐÈœmŽá‰óxƒÙàã7ð;T—íà/þôG’mî¤èмWòÀO£ÕjsIùçïMh2yû* '+µê›ÞÓë´¬©oÆ’_Îúö$^T‰VƒÕZÅÀ¥Ñ›Ž@ml¬ÊU}±deGªÈLžÉ \bl|’¡Ñ‹¸ý£2ùäugW¿¶|7ñg¯JÙ+sû~+­ª^½¦1ÉìÜ$ÿ÷_þ³ö—qûpëËg³ÚAEii!Vé嬳ŒFâ2¹t®R¦GænúÎXï8á°©’‚\Ue‘6ñú‚’»ß- 7ž+{Å ²¶ªl;_ÿê‹x:·Ó“ Þ`0ðoO‡3çËŠ+{†D%.Q(¾W£ù9iðV× gG6Àlp+#%@´òœ¼ú÷Êëìç¼Þ 3“ó7Ë9¿Ì¥îQÖ4Tæ¾ e/Ên`N01ÕK <“;m~sÙKð_y™Xt%ø,òëñ¾ÿoÅs/ÿOŒæ¸,†´j!¹Ë뤮ãJÀÕ€“©Üe³Ù‘Hd¯ùO’L¬ü{?ûw2uõsYí°4k¿å1Ï»$bF)(Äåö‰+œcnq˜HöL2y¬Íﲤ‹¯ýñ‹„Cñ\‚¯ÿ½'¾É+‡¿)Ô—çIî,‘òFOpCn¶?µ÷•¹RËa€J‘+3•Z‰:©"¥É«¹š˜\U¬&Ì”§çó_ÿŒ¨µÌuW¦fÿŸMV¶ œþ0.§[ÊvD¤îlNáÝhl²Tö™O}¿/œ¼+eÿÄÓËkoý% Œ¦ëàuÆHqõgs ÈÝW'«$ÏûÙô« P­œvÖñ^0éÕÝÅtvo1}µMV6WƒÎ¬î>fVvŸäÇ úC,,$ñù=²òDDä(T‰›¨.û:™ I£×Är¢G#ýÔ³ßáÐ;ߦH‚7ä]ìÕ ‘+ÇÊÝwÌž2N+Wo& .Ì;GÁ›’V’’­ù,jù³Wmf©2{Ô$†*»É’:³Œ,]ê š•“B“S ^Æ#£ˆÜT¶ï½Žñƒ'¿E 蓪 àý5¯] ÞÄMû7“¾0•3"«wN”î½cÞgôçO)n×})?õ6¶L®|³À¸¸àbdxŠsÝÇXöçnéS(3ï­¾òú]”LÛ'JÚ ©Î­f$>G5+ûk{^yMë\Û û ßý»¾¯ÊM]©€À»Ç{úÏžxéÿÓ[Wƒ—Ê£¿o˜óãôŒçnôÌ#â+®ÙÓÓŠ®/.J˳¡6Î`-ÏâËjð?©jVG¾±.$Áÿ½ü+›iåê¥ÓaK?øåoœ;3øj&ó Þ<ô3¬~öLmVåÙlóŒMöáôŽˆÍ ¿è5BçºÕT®llh¤nMf¡¸ü•„ÜØ.×õüê³ÙPïÿæW§?!S˜á¿‚¬VAöÙ‡øï_ùÔãßø”Ëé›Oþ{U@ÖQÆD¯OÎôc³÷`ÆB¿_”âÖÉQ\ÿúúŠzÔXÒ¾Åæ¿õ§S—ŸÏÞ4¹œ½>wëì•Å^í}õêíd–Õûêò«Šÿð‹Ÿ¼CèL-+§¼ JTÄb •T€6àéBá¨6™HªRéÌmÁISZ’•>wv`xxx6{¿pV|,ÈX”á¹|î³7V{öÓÕ{ µ«w’_{½ò6Á•;Õ¯[y}åîÔê ÒáÕ›¥ƒ«§®Õ=ÿO€Y EL}ƒ´IEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/married.png0000660000175200017530000000060612664543647024414 0ustar guillaumeguillaume‰PNG  IHDR ùaæ•tEXtSoftwareAdobe ImageReadyqÉe<(IDATxÚbüÿÿ?±€‰@’b8xñ÷Áw ›vþþ?›<ȹ,ÿþøÿp_ÿßí)Ÿd^s›0üû¾Kàÿïo ¯Î00«´€i`ü{·eÿ¯U36rV>™ð­˜A-:aÿÿO< ÿžÞ:Àðï‹£„‚Á¿›Ù³¯^`øµ/ë<ܪû) ¿Oüÿ¹Øa=Lì÷*¾„ßRÁÄðù-Â]òI ÿžÜ{ÀÈ#c û´€QXü84˜dø?üš']1y£ãßo ŽlXˆâ¹7ÏÀº™Ÿ/ üÿó§þIïÿì\VÏ(ÈûI”nôïÑ ¯~ö zýÞ`aðïéõ l,þÿæøÿáǃÿo_röüÿÀ88¢ À®ÈŽIr署IEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/picto_alphabetic_order.png0000660000175200017530000000125612664543647027460 0ustar guillaumeguillaume‰PNG  IHDRàw=øtEXtSoftwareAdobe ImageReadyqÉe<PIDATxÚbüÿÿ?- 2‡‘‘‘aFw¿9_XL4€hƒž=~òHf”^@,j ¬ít IréÛW¯6¯Z»ÈT$Dö¤@3HÊH+CÀ€fq ´èÉD[ðùÛÛ|AƒTF†goPß‚ý6€-MÇRß‚¥{&2¨Ë08Ù(³”Ž‘ñGçn>¾4ÜŸÁˆA>Ùxt†ºÿäZ°tïD°¸e<ƒ¯e/—Ãæc˜0`)vˆ²àÀ… úþ ’Br`¾ƒ¾Ù[Á>ð_Qÿþ…³·žX ’72g *_¶wC]ìl‡eÁ¿ÿàìÍ'1ðpò3„;ä ¨Ùvr ÃÁ‹›>v‚ƒ ¬X þüù¦Ÿ¿{Èpîö!OÓh†D· 5Üì¼ “6T0l>¾ˆ!Ì> Ãaxãà÷ïß`¼òÀ0ßÍ(.î@1Xup*\ ›,¸,1M†§m9s¸ °3s1”Odxñþ1ÃûÏox8øþ!Å^ ~ýú¦t‚Pøè&SóùÓg¢‚èÁ“~þüIþòå Ã˧O?+œø}ÀÈXxñÄi#iEy=¢‹„—OŸüýëw!†qÈiwóæÍ ñ‚Šö÷Ï_92³0 011 221ñ«S ål =Àÿ¨ïëÿÿ?Ãýý¿¿ÿ>pðpáàá³}}}cµ`H¶* Béc¥ücÞIEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/flags/0002770000175200017530000000000012664543647023356 5ustar guillaumeguillaumegeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/flags/l-ca.jpg0000660000175200017530000000203612664543647024674 0ustar guillaumeguillaumeÿØÿàJFIFÿþZ CREATOR: XV Version 3.10a Rev: 12/29/94 (PNG patch 1.2) Quality = 75, Smoothing = 0 ÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ$"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?î³ãïø{ÿ#QŸÿÃßù¸Ÿ³YÿÑ9Ô¿ð"þ&³YÿÑ9Ô¿ð"þ&¿4ú´•}ÐÿäϺú¬•à0ÿå‡mŸÿÃßùŒøßûþÿÈÕÄýšÏþ‰Î¥ÿÿñ4}šÏþ‰Î¥ÿÿñ4}Z?ʾèòaõXÿ*ÿÀaÿËÛ>7þÿ‡¿ò5ÄýšÏþ‰Î¥ÿÿñ4Qõhÿ*û¡ÿɇÕcü«ÿ‡ÿ,:øBuÏú5Éÿøåð„ëŸô:j“ÿñÊ(¯ûKÝà1ÿ#ÅþЯÝà1ÿ ÿ„'\ÿ¡ÓPüŸÿŽQÿN¹ÿC¦¡ù?ÿ¢Š?´±×þòí ý×þòøBuÏú5ÉÿøåQGö–#ºÿÀcþAý¡_ºÿÀcþGÿÙgeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/flags/l-bg.jpg0000660000175200017530000000074412664543647024705 0ustar guillaumeguillaumeÿØÿàJFIFÿÛC   %# , #&')*)-0-(0%()(ÿÛC   (((((((((((((((((((((((((((((((((((((((((((((((((((ÿÀ-"ÿÄÿÄ#RUa”¢ÒáÿÄÿÄ"QÑ‘S¡áÿÚ ?ª#¨Ž¤ÕqžÌñ}£‚ã=™âûFÜå:>ˆ*E‚qJÇQIªã=™âûFÆ{3ÅöŒ:rBâ¥H°N)Xê#©5\g³<_hà¸Ïfz¾Ñ‡AÎS¡àœ.T‹ã˜ÔiÁÇÑQ§LD¤­´¤퉠tûê88ú*4àãéƒ(”m¥ XšO±8Þ¨Óƒ¢£N>˜2‰FÚR‰ tûÿÙgeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/flags/l-pt-br.jpg0000660000175200017530000000213712664543647025337 0ustar guillaumeguillaumeÿØÿàJFIFÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ("ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?‡‘Åt:7….õóþâѹÜOÌʺ9üÎ:÷§xfçE¶ ê:]«|’Ès9ãèyþ,ôÎkwÇ3FÞÔ¥Ý\BbRëe?–ïe݇ÚÀ ¹ÝÁsÚ¿>„ªWÅÓÂGÝç’3óvºé÷³ærœ¦…X:õd¥o²¿^¿wÞqïã_i÷²éMÕÚ r_y`Áƒmʯ8ãwÖ¿ð›¬iu¤È·vŽ‚DÚà±ÎàG 1ÐŽyëÈ[Zðäïr’øF-ß>KZ_Ì“Eó2Ò¸“œäcí? ÅšxVoìÙõ)tã{!¶þЈFèŸ/Ê»Y•†só e·|¢¾Ë‹xc “à!ÁÊiÝ))´Ô¯ÕYèôÛ¯Mµõ¥€ÃâײœR¶Î:[üÎ8õâŠé¼S}¤^ÌÆÚ3%Þ@iÐáN8çûǨœö¢¾JW8)8´|v/=WN3R·S™9Ï5¥¦kwºC£H 1ËFÃ*N1ŸQøc ¬æëM5RŠ’å’1£^¥)©Óvb\xkÁ·wrj2ZêÈÒû2(€÷ÚܪñÏ#ã¶4ïõ«›èÄ ,HEm ˆ£ ½úb³E/zéÄc±8µâj9¨i»ÛÓîßs®¾iˆ«I;.¶Òþ¿Õ„¢Š+œóÏÿÙgeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/flags/t-bg.png0000660000175200017530000000023712664543647024716 0ustar guillaumeguillaume‰PNG  IHDR$’|¬}PLTE3fÿÿÿ1Eh3tRNSÿå·0JbKGDÿ-Þ9IDATxÚcøPH~ ’£NH2Ø0€H É'‘& °’P•`¢h ˆüÁ&Aä?f¨­JYQ TIEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/flags/l-af.jpg0000660000175200017530000000215612664543647024702 0ustar guillaumeguillaumeÿØÿàJFIFÿþXCREATOR: XV Version 3.10a Rev: 12/29/94 (PNG patch 1.2) Quality = 75, Smoothing = 0 ÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ$"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?Åðî¡o*Áá»õžñÁŽçF3)FÎcÁ80§qQ0Ä)û¯þÎÓ¯ÒàE#éÚ”li÷ „s“»±]€ß+äñÌMyNg©_ë–ú¯òKîÿ‚Wúìÿèýç?áÛI¼RÂú,z>—©"Mì]K–bIvH˜çµßÿÂ5©jš&ƒ§Ek%¼²Ú6¥3™n²®ÊZ6ábܧ*äsÉ8 ¢¾‹„ðT+b$êFöî|=Μ嫹À—Í7uWê“Ø·¸»¨¢Š®fÿÙgeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/flags/l-en.jpg0000660000175200017530000000234112664543647024712 0ustar guillaumeguillaumeÿØÿàJFIFÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ(ÿÄÿÄ2 !"#16AUs¤³Ò8Qtv•²ÓÿÄÿÄ8!1AQar¡±"256BRSq‘ÁÑð¢á4bÿÚ ?ǶoºmÃLE«ª”R”§ºå¥L“”æ#Š;œ8Q A!Á¹ IV­Lö&XnIR5˜ý1€úÒ£â=íuVsŽ©¸’)Ê$\Á\}"{2&Ù’^DpíšÂ†à ¦ÈNyAÀÀQÎN2HÂÚŽž‰(Èýól.& ü1ªd ÆðqЊÅÅ“¥zãk|*OÑcJѼà­&Ð,îŽíSj6×O&ÔæSSÆ;kŒGdJ’Ñ'*m'„3½Â‘·*€#Mqv›§sMW2$%šú% |$”&õîN` ¨ÊÒDɯMé-Fª´Ëó a=Ç`¨­'´Jæ8œ< r6ÊØ‚= ¬7Æ™1 ëØÖ—æ p7ãY–¤¸´â ŸõuD¤ÆùK»½ïòÍ}º]ß»[ÿƒvguù+å«Ê]Ýï–kí×oÇݭܳ;¯É_,šåF]q5—äo¨%Ä8Ø‘âF6œŽ6g³P—Š+Ã&¬I܇pûÕ ’$D¦n7ÖüyYH÷åÅçÞ1†]}[ž[p˜Jœ<œ¨„ry>ŸÌêAôA¿0øjO,(‰J^$›¦¥xq¨Ä÷¢½ÛDþ'ùêäã;ÂÑpjËå¶Û^Û¹â1§zÝWbJwģÜú¥>¤åE+Hå#häÞ2¤‚ËïŠí Ÿ ú}“fpO¢IÁ ™&@Lʤì¼â tõ`SÞn,y*•ذ€ÜHS”¦P¢Ù–’y@ŸBO=Àæk÷ç ñÁþÍuqp¨.áS†®Ú€º}TŒB¦µ4¼›"¥Ô ~t·;I2{±çW´ ËSL’p8“èÐ8´„Ç”‹‚ƒ8ÙÝ: Ú¦B×ëjk0ãQë²Ý¤TU†ÓVe ­•« º… gfvñœœ¡:d‹³W"§'ï¾ÖÏ¡Ÿ»v°^ ,d$`ŠúŒÌ­ßX¾¢„J§WãÄa󘯆Ù\9i)µ)M(Œ8¢“•´¥#4Ä:t¬´K=u‰ÓôÄšˆ§{¥ž¢¢Ê(x 䨤ËZàõǨ_·ú-j¬'8z{18ÎŽ¸Ò;VÜá§FPiŽ•ë­ð©?E!Fó‚´›K³º:tµMiõ³FéÛ ðò?A;û½¥›S–óÃÙ‰Y_Ýs¦¡¿ÿÙgeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/flags/l-pt.jpg0000660000175200017530000000136512664543647024740 0ustar guillaumeguillaumeÿØÿàJFIFÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ(ÿÄÿÄ%!"1ABaq‘ÿÄÿÄ'!1"AQ2aqðÿÚ ?ç­¹`£$€=»¢*imî¨ 0N=$ÿ@O¡š—¸‚[yäŽXš6W*U”Œñƒßöš#«(*f­V‡Ujý¥Øûˆr¤ùÙÛ2í@âµTë6”QUÔ¢ª--m ä|AÅX\4ÑÇ4ެöŒ±»‡U-#kÇÔ †Aê9ÕL±nõÝ— ïßêž39ž$OKüe,/Lw[ó( A À̽ഞÑ+€S¸á\ïÕâ. ÏŒääŠÌËä›xÞfÕÔHÂVùE‚Œ( QØ{®Ä0ê©kM{âµÏ™‚¹‰äsŸßÿð³!ÿ?WÝÿôš+Í¿³5ùñ¹ÿ¿Mþfjóãsÿ~›ü(þÖ©ÿ>Ÿßÿ?³!ÿ?WÝÿôš+Í¿³5ùñ¹ÿ¿MþQý­Sþ}?¿þfCþ~¯»þ ÷­Q_:{ÁEPEPÿÙgeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/flags/t-ca.png0000660000175200017530000000024212664543647024705 0ustar guillaumeguillaume‰PNG  IHDR$’|¬}PLTE)cÿÿÿ[èÆ¾tRNSÿå·0JbKGDÿ-Þ‚zÿ«œT‹Žn±Cñ†l6t>µ‡ˆÕz3ÎM¤Í† K¢ þ†R`”Ý¥J¦ùž¥ŒGPÔ’É¢í»ùÙÕÊÜËb ¨ÏÛG¶ @N")Ô“4¾Ä·ût™)6„ô‚-_IEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/flags/t-zh.png0000660000175200017530000000023512664543647024745 0ustar guillaumeguillaume‰PNG  IHDR$’|¬}PLTE)cÿÿÿ[èÆ¾tRNSÿå·0JbKGDÿ-Þ7IDATxÚcøPI~4ò3G=ˆd°“ò@ñv6ÉÏ"åAä?{ù§Dþ`F'±Ù'–L6¥¥–›IEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/flags/t-sl.png0000660000175200017530000000045612664543647024747 0ustar guillaumeguillaume‰PNG  IHDR$ŸlÎ HPLTE)c1c9kBsJs!R{)R„1Z„1Z„9cŒBk”JsœZ„¥kµÆ¥½ÎµÆÖµÆÖ½ÎÖ½ÎÞÆÞçÖçïçïïç÷ÿ÷ÿÿÿp·átRNSÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÍ.êbKGD Ö˜pIDATxÚ͑̀ ƒAüE”÷S7Âͤp!±‡¾t]'RƒD_HzCN+)•¾dd‘ÙÈèi,b+™¶¼kÐAA•L]÷˜cfh¬õt3 ‰¯4VÙi@=¥37¾‡Öß}~ùCèwA;ž¦`“ðIEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/flags/t-br.png0000660000175200017530000000022712664543647024730 0ustar guillaumeguillaume‰PNG  IHDR$’|¬}PLTE)cÿÿÿ[èÆ¾tRNSÿå·0JbKGDÿ-Þ1IDATxÚcø°ü$G…;d°`‘ü@’OÂLÖc%,$GE=V[@$×ùO-Ì»ÆÕIEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/flags/l-it.jpg0000660000175200017530000000076112664543647024730 0ustar guillaumeguillaumeÿØÿàJFIFÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ(ÿÄÿÄ6u³ƒÿÄÿÄ ±423qrÿÚ ?– ‚ –æyõ䲺öæ të–æz W¶gg¯GJ†u_4ði·-]ô°±(€ 3Îv*[™æ7×’Êè{Û˜-Ó®[˜Qè@(^Ùž½*Õ|ÓÁ¦ÜµwÒÂÄ¢€Ï9Ø©ng˜ß^K+¡ïn`·N¹naG¡ {fvzôt¨gUóO›rÕßKˆ <çb¥¹žc}y,®‡½¹‚Ý:å¹…„€í™ÙëÑÒ¡WÍ<mËW}, lJ ?ÿÙgeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/flags/l-zh.jpg0000660000175200017530000000100712664543647024727 0ustar guillaumeguillaumeÿØÿàJFIFÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ(ÿÄÿÄ"!"#1AÿÄÿÄ$!1AQaq‘ðÿÚ ?ãip&ç§ïr¦ôŠ®L~È<Z@ žÎŒgó°.-¼Æ^¯éç†Öû¼ª×ç~“½×¤äê{3GkwçZþIþµ{¬yêÒ·µã–:÷ m¨£‘¤{mq?I%Àfv vÍ'=&idƒSvâé¿uçÒ¾i]qÍ¥ž›#œZ–Ü]??kõºã“T¶€€  Ú³5ËsZ°þóL÷I#° q:N¥N8G#ÂÒ&PŠŒxD•@@@ÿÙgeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/flags/l-cs.jpg0000660000175200017530000000130212664543647024711 0ustar guillaumeguillaumeÿØÿàJFIFÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ$ÿÄÿÄ' !A"1BTa“ÓÿÄÿÄ-!1aq"AQÑR‘¡#±ðñÿÚ ?çöl·]¬Û®ª÷;Dj±ÆŸÐéÔKcÄ$cÑ@*6sû¹ŠÆß _¶£;¼.b¬.ÚÝv}ÛlMm£X’‚ªÒBX `'>9S~2 Ԥ̫²Ñý ~‹q8'ª]zŠŠ¨tÄšß³kn6Û¶Ÿ_jžM>³Nᣙ=ç¡dx##4†Ñ™•aƒ¼‘B0ætpÓ„Üœ›óNÏÔþ×’–ôµn¸t±G<©åE Ò´ 9'OŸ\âfzœ&^C™¯óKêUƒlA÷ã&,¬>A®¶Ñfï¿rûOÕ'éKï‘ô o.Jú¢÷‘ß~åö6ŸªOÒò>\•õEî;({Eo –Fð%yëV{kÄJ¸e˜cpÎüíl ø»`Ã3˜|ðœÆÆ†¹[•ó Õc@ˆQäC<ó¸]tÖ#‰V¬²Û-†Û„%VkDP„P…ÿÙgeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/flags/l-sl.jpg0000660000175200017530000000154512664543647024733 0ustar guillaumeguillaumeÿØÿàJFIF,,ÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ("ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ö/kÃÃ>¼Ö>Î.~ʪÞW™³vX/\uô®{Ÿ_Ä~ ›I}2+vKQv%Žå¤œ4iÈÊãÐ0 |ç_^iZ•µý¡+qo"É+¸#ƒ[>(ñŽ¥â‘n—)åÃn>Dòs…RÛ™²B®yä‚z’OÒ<…Ũ'tþÖÖù_QÆQå¼–«ñì}…‘ê(Èö¯†v·÷OåIÖ¯ý\_ó÷ðÿ‚cíè}Ï‘ê(¯†v7÷OåEêâÿŸ¿‡üó˱Òïï·çF÷þû~tÚ+óÞiw?[²³¬OÔÒQE&ÛÜ W¡#éE%ÔšÙ…ÿÙgeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/flags/l-fr.jpg0000660000175200017530000000076712664543647024731 0ustar guillaumeguillaumeÿØÿàJFIFÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ(ÿÄÿÄ67t³ƒÿÄÿÄ!4±23qrÑÿÚ ?…Bé›ÊÔ_~ fÔoêèM™^cÀ‹ÅwJhAÑ@D~¢mèÆÂ/æ¶hzR5D0éÅÓ7•¨¾üͨßÕЛ3¼ÆŠî”Ѓ¢€ˆýDÛÑ„(_ÍlÐô¤jˆaÒ!‹¦o+Q}ø( ›Q¿«¡6f5yŒ;/Ý)¡Eú‰·£P¿šÙ¡éHÕäCLÞV¢ûðP6£WBlÌjóv^+ºSBŠ#õoF6¡5³CÒ‘ª?ÿÙgeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/flags/t-oc.png0000660000175200017530000000026412664543647024727 0ustar guillaumeguillaume‰PNG  IHDR$'Щi{IDATxœc`£`Ä#gœ†Â=; »2Ídîõ¹¤[†fV+Ѭ!h%I6Q°X†?ôಘ¡‡ì¬žfÁïˆMggð+Ü<Æ€+i“eÐ#˜^à1¤™Œ@˜{ÒÇc:õ“>®ü‹KœH@×dŒ‚Á9I$R5¹­&IEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/flags/t-nl.png0000660000175200017530000000031012664543647024727 0ustar guillaumeguillaume‰PNG  IHDR$Zœ# $PLTE1cBsJs!J{!Z„1cŒB„¥c„¥k¥½Œ­ÆœïïçÿÿÿLÎé8 tRNSÿÿÿÿÿÿÿÿÿÿÿßÎÎbKGD ×ÄÀ:IDATxÚcØð m`à&Uˆu™€š³ÃlT!ðFªžÀÀ&´z†Ðn: ‘^” ÎêrngJ-IEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/flags/l-br.jpg0000660000175200017530000000203312664543647024711 0ustar guillaumeguillaumeÿØÿàJFIFÿþXCREATOR: XV Version 3.10a Rev: 12/29/94 (PNG patch 1.2) Quality = 75, Smoothing = 0 ÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ$"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ô-zêîâ8aÔdK”\ÿhêNí!…”XEÞ ƒËü€òøàäÔÍ}«7Šbmºº,¨ºNs –_nMÖC`8‡±9É8^ ù˯ˆ˜N%ø»á6KŒ›„+nV|®Óæ ¸”*óž!›Äeþ4è;Æ@qånõº€p8öµ*ë#Ã×SÚ<­x瑈õÈeé–‘ÆP „õÊœòsË@wàoˆÖêðJÚ3êÙ$ünÒcøbTP>€B÷w€‘'ÇKqþäDÿ& FP°Ñ¿è„kÿø{ÿÄÑZk“¿Ç~}­ßÿŠ¢•Çc˜ÿ„ûáø\/ÃÇPoþ&—þ@ù~ØçÞìŸý–Š(¿ð±¼ËðÇLünIÿÙiŸð²<(:|1ÑÿÿEÂËðÀéðËCü\Ÿý–Š(¦#ÿÙgeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/flags/t-da.png0000660000175200017530000000024212664543647024706 0ustar guillaumeguillaume‰PNG  IHDR$’|¬}PLTE)cÿÿÿ[èÆ¾tRNSÿå·0JbKGDÿ-ÞPÿá‚üc‘ÿÀDÚƒTþ‘±ÿ1<¨‡‘ÿ›?Ô£›FÍ.[øÐ% ÈIEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/flags/t-sv.png0000660000175200017530000000024312664543647024753 0ustar guillaumeguillaume‰PNG  IHDR$’|¬}PLTE)cÿÿÿ[èÆ¾tRNSÿå·0JbKGDÿ-Þ=IDATxÚcøð“ÿØùä?0üaî³ÿÀð#±DÖƒIö#õ qùŸL>|ð¤Dþa~Öû‘ùK [Z]®%©IEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/flags/t-eo.png0000660000175200017530000000051412664543647024727 0ustar guillaumeguillaume‰PNG  IHDR$ŸlÎ EPLTE)c9k9k9sZ„1cŒ9cŒBk”Js”R„¥kŒ­s”­{¥½”­ÆœµÆ¥½ÎµÆÖµÆÖ½ÎÖ½ÎÞÆï÷ï÷÷ïÿÿÿ¿otRNSÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿæ@æ^bKGD|Ѩ’IDATxÚݑ̓ „C,ÿ•æýÕ(‰­3ôbd–ùØI ×CÝ[ê6ŠÑ  ñ{¨‚XvÍWÔò°–cŸ$¾éTYnågö6ÂôXÜ>Q@°U”št ë2˜œŠŸ™Jjù|å3Ùƒí|¾Ýø?§*Ï©Ù'î´¥]ý’øpã?š2ò5;Ç^ÿWIEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/flags/l-da.jpg0000660000175200017530000000122712664543647024676 0ustar guillaumeguillaumeÿØÿàJFIFÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ(ÿÄÿÄ)7ƒ³!"V¥ÒQÿÄÿÄ+ 35A²ð1RT¡¢ÑqÿÚ ?…áö‚º˜f$+[ib˜JäÕÆ,á³^a™OÌH®ŽÒ.¹up›Ök¼s)"&6€®ò:òÏbïò4·h~¿(q|jYíýúkÊò”— ˜_!3-ùþk—­BˆûR’3°ŒÏ§àôråË-¢°Õ+ú„RŒ§)¿†iÜC–ŠWe¤½/U£˜š%).'1=>E¦#óKœV8Ö,îØ„‘v©&ei_Ð|åËMª¶Õ ú‚N”å7Ì»‡s´ÂSBì´·­è´s29yg±wù{´?_”-ãRÏoèßÑÈtëË=‹¿ÈnÐý~Pq©g·ôoéȆiÚÔÃ1!ZÛKÂW&®1g šó È*~bEtvuË«„Þ³]ã™I1´u0ÌHV¶ÒÅ0•É«ŒYÃf¼Ã2 Ÿ˜‘]¤]rêá7¬×xæRDLmÿÙgeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/flags/l-fi.jpg0000660000175200017530000000201012664543647024677 0ustar guillaumeguillaumeÿØÿàJFIFÿþhMade with GIMP CREATOR: XV Version 3.10a Rev: 12/29/94 (PNG patch 1.2) Quality = 75, Smoothing = 0 ÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ("ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?÷úóoŸò&YÿØA?ô\•æßð´ügÿAŸü•‡ÿˆ¬ÝoÆž ñ’Yêº‡Ú IªžLi†€rªBkì0=ŠÃâaZr“èßùelm9ÓqIêzßÁ?ù/?ì ÿú.:ôšùoDñ§ˆ<9dözV¡öxC+'“刜²“Ð Òÿ…§ã?ú ÿä¬?üEþÅb13­ FÍõoü‚Ž6œ)¨´ô>’¢¾mÿ…§ã?ú ÿä¬?üEÇþ«c?š?{ÿ#Oí ]Ÿõó>’¯6øÙÿ"eŸý„ÿEÉ^“^mñ³þDË?û'þ‹’¼ÜŸýú—©ÑŠþ ƒàŸü‰—ŸöýzMy·Á?ù/?ì ÿú.:ôš3÷꾡…þ BŠ(¯4ÜÿÙgeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/flags/l-eo.jpg0000660000175200017530000000105712664543647024716 0ustar guillaumeguillaumeÿØÿàJFIFÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ(ÿÄÿÄ$!1A"QqÿÄÿÄ'Aq!1‘ÑáQa±ÁÿÚ ?¬öÎÑZÅË(Ïå_ünq5Eàk`u°HWk–Í„…йäq[´•Ø«ž\ðëøe÷¯3é¾G™À‘ÒñË£k^csˆ•—[cêǵƒúYZ‘²Vs›ËÊ]•’Ós™Ë‡Ú5óA@U²~ õLǼü~Jx`•°º8ô/?š+àìlj¯%Úòa¼Š¨šw.Ë´jˆûUQ2áßÁ•šî˜>OKŸއ$/Q äêC$Öö&€Ÿ`?«mÄè&"üë©„÷auu†4_luÇס>S‰!@@@ÿÙgeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/flags/l-is.jpg0000660000175200017530000000437312664543647024732 0ustar guillaumeguillaumeÿØÿàJFIFHHÿíPhotoshop 3.08BIMíHH8BIM x8BIMó8BIM 8BIM' 8BIMõH/fflff/ff¡™š2Z5-8BIMøpÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿè8BIM@@8BIM8BIM ƒ(x ¸gÿØÿàJFIFHHÿîAdobed€ÿÛ„            ÿÀ("ÿÝÿÄ?   3!1AQa"q2‘¡±B#$RÁb34r‚ÑC%’Sðáñcs5¢²ƒ&D“TdE£t6ÒUâeò³„ÃÓuãóF'”¤…´•ÄÔäô¥µÅÕåõVfv†–¦¶ÆÖæö7GWgw‡—§·Ç×ç÷5!1AQaq"2‘¡±B#ÁRÑð3$bár‚’CScs4ñ%¢²ƒ&5ÂÒD“T£dEU6teâò³„ÃÓuãóF”¤…´•ÄÔäô¥µÅÕåõVfv†–¦¶ÆÖæö'7GWgw‡—§·ÇÿÚ ?á—MWÿ“Ãÿ§ýÖ]ìß­üéôûfýêY_YÛõ’ž‘]C¥btÌÓˆÖ3uÛ,kw²›îÿ¿üæ-Šüs7ÊË qN˜ËŠ[z[øt±sx¦rá•¡’2—Ò.wøÃÿŇQÿ¬ÿ犗8½3#ë®Uο'ê×K¾çFû,eOy±»žü·;è·j‡ìß­üéôûfýêVyøÇ‹XŽ „ã„1ØëíÇ©/…LÈŸ§üì6IzOìß­üéôûfýêIMÿ*0ÿâ|ˆÿDÏüþü6ÿÐá—MWÿ“Ãÿ§ýÖ\ÊéªÿòxôñÿºË¯ÿŒöº_߂σÿ»°ù°ÿø°ê?õŸüñRçGþ0ÿñaÔë?ùâ¥Î-CýÉËÿ±Åÿ¤âÑÉóËÌ©$’V–¿ÿÙ8BIMÿîAdobed€ÿÛ„              ÿÀ("ÿÝÿÄ¢  s!1AQa"q2‘¡±B#ÁRÑá3bð$r‚ñ%C4S’¢²csÂ5D'“£³6TdtÃÒâ&ƒ „”EF¤´VÓU(òãóÄÔäôeu…•¥µÅÕåõfv†–¦¶ÆÖæö7GWgw‡—§·Ç×ç÷8HXhxˆ˜¨¸ÈØèø)9IYiy‰™©¹ÉÙéù*:JZjzŠšªºÊÚêúm!1AQa"q‘2¡±ðÁÑá#BRbrñ3$4C‚’S%¢c²ÂsÒ5âDƒT“ &6E'dtU7ò£³Ã()Óã󄔤´ÄÔäôeu…•¥µÅÕåõFVfv†–¦¶ÆÖæöGWgw‡—§·Ç×ç÷8HXhxˆ˜¨¸ÈØèø9IYiy‰™©¹ÉÙéù*:JZjzŠšªºÊÚêúÿÚ ?€äµÿòVàÁÿbY.ýçÏú|¿ÿ"-¿ì«<è<áo Ãk¬è6>˜oT:zÆ…®=9C$SÍþêçñz°Ÿo»kÚ<:í´ÐÁ“2Œ¸¥ËÒævadÒö–Ÿ<µ:l‚2úa–™¾èÞè/ÍùNµoú7ÿ¨h²!‚êßóöw¹½ò^‰s;ÓœÓGŽÔW“=Ùcð¯KôgŸ?êAòÿüˆ¶ÿ²¬ÍÒûYƒŸ¦ÊN,p#¯DoìuÙ=›Í<“Ÿæô€JDÿ}¿’fηú3ÏŸõ ùþD[ÙVl¿ýiÿå7ØÃý fÿ”Í'ü®‡ëÿЀäµÿòVü?ìK"Y,ü•‡ÿûÎ÷ÚÏøÉÉýx}î²ÿñ±¦÷Ÿ¹æ‡ü§Z·ýÿÔ4YÉæ‡ü§Z·ýÿÔ4Yͯfÿˆi?á¿éœ]F£ûü¿×—ÞìÙ³fcKÿÙgeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/flags/l-sv.jpg0000660000175200017530000000133112664543647024736 0ustar guillaumeguillaumeÿØÿàJFIFÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ(ÿÄÿÄ, ³!167Vuƒ¥Ò"QÿÄÿÄ33!156ARUqs‚¡£²³ÑÒðQÿÚ ?¸VŠMß7Ξ¼Æc,ÜËjž…‡\iW€š©ñ"-ÙÉ@¼›ŒYvßî,F÷LdñÛ…€ ¦üÝäýF#nÒÛGrZû ß?‰ $“+ÊPHËg˜ vþô§u3[+Û&¶ Ô“5X‚#ÚI+vk¬®”RŠ©¸¡Ut­3%‘þ˜ª "(¨Ì¯œ/Ü0dÉ ŠÖCŽi“䘤Èöû˜îí4>VÖ,ôlBH¾ªI™ZDG¯ô='%L©q©Œª{•q’cVÚ*1Q™ÝI‘ Ì®!|yjÅŠ–f¥@õO€)¿7y'QynÒÛGrZûìw|þ$ Mù»É;ú‚Ý¥¶ŽäµöŽïŸÄ„xm¸Rhžù¾tõæ3dîàF[Tô,:ãHz¼ÕO‰nÎJäÜb˶ÿqb7ºcû ÇŽÜ,¤Ñ=ó|éëÌf2ÉÝÀŒ¶©èXuÆõx ªŸ"Ýœ” ɸŗmþâÄotÇöA¸XÿÙgeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/flags/l-ru.jpg0000660000175200017530000000175012664543647024741 0ustar guillaumeguillaumeÿØÿàJFIFÿþXCREATOR: XV Version 3.10a Rev: 12/29/94 (PNG patch 1.2) Quality = 75, Smoothing = 0 ÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ-"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?÷ú+åø\~=ÿ ÷þIÁÿÄQÿ Ç¿ôÿÉ8?øŠ÷¿ÕìWóGïägíõuòü.?ÿÐ{ÿ$àÿâ(ÿ…ÇãßúäœüEêö+ù£÷¿òh«¨¯”áqø÷þƒßù'ÿGü.?ÿÐ{ÿ$àÿâ(ÿW±_ͽÿ{DrÿÙ?ôßÿÿëÑý“ÿMÿñÏþ½iQ_?þ±æó÷ðù¢`eßóïñ—ù™¿Ù?ôßÿÿëÑý“ÿMÿñÏþ½iQGúÇ™ÿÏßÂ?äØwüûüeþfoöOý7ÿÇ?úôdÿÓüsÿ¯ZTQþ±æó÷ðùö]ÿ>ÿ™ÿÙgeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/flags/l-oc.jpg0000660000175200017530000000354412664543647024717 0ustar guillaumeguillaumeÿØÿàJFIF``ÿÛCÿÛCÿÀ$"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ü¯møiðv/ë^Ò|qâë_ƒÖì-¥ø_ã/hZ¹ð7Šõ'ø…§øúïÙ#Çáí Lhü[q¨xª[mCJÓu_ .¬*ÏR›]Ò¼^Ý Yák¨åšÙe®!·™-§–êfމ-WrÇ3ÚܤNUÚÞeS~£xŸYð­·Ãï‡7¾×>øöL×¼/y5‡ÂŽžüFñoެüoãÝ7Åú–¦ø[Jÿ„·Yñ¦¥ofšfñóÀú‡Á_Áá«O ü¿øaâŸë-üâGfÙ—”RÅPÄçØìN9µ ÅK ,._‰ÆÇ—á–_TÅçø×GÛåø ù5L»Àæô1¶IˆxL}?ûãlû0Ê)e˜Lºž"•lÛ_³Tc]Ðt0uñQÂàè,&g]ƒËð²Æâ~8¢Š+ú8ý¨+Õ~|^ñÂ_hþ4Ñ4ßëÞ ðºéRø*ëÆ:}Ö¿oà}OGñŽ“ã[MoÃ{êú}¦¨5 :úÏ}åµý¤6ž#ׯlìí|C6®i¥Á™e˜ ã_.Ì𴱸T%K†¬›¥^”Ó…J5Rqs£Zœ§F½&Ý:ô*U¡Z3£V¥9rc°8LË WÃÓÅakÅÓ­BªnZrN3§4šæ§RTêÓo’­)Ô£R3¥Rp—¸xÿã‡ÃÂIàŸƒ ¬m¼5ñ3Âú/Œ~1ØüJ´Õ¼A%—ÆSá¯øaSá]ìÞ;×/tü3êZ÷ÂkV¸o‰×𶡍ÚüPñ¼4Ñøy¾C»½¼¿•'¾»¹½™-¬¬’k¹å¸•,ôë84ý>Ñ$™ÝÖÚÂÂÖÚÆÊDV¶vð[@‘à h¥ñžexåÈ«G°-ziô8tü§Á3ެû—"­Àµé§ÐáÓòŸÎ:³î\Š´{צŸC‡OÊ|8êϹr*Ñì ^š}?)ðLã«>åÉ)Üå<•ç}_EË,¢ËS{»9O%yßWЖ@Ñe©½Ý‹œ§’¼ï«èK h²ÔÀÞîÅÎSÉ^wÕô%4Yj`owbç)ä¯;êúÈ,µ07»³ Þ1ÿÙgeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/flags/l-de.jpg0000660000175200017530000000076012664543647024703 0ustar guillaumeguillaumeÿØÿàJFIFÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ(ÿÄÿÄTU“Ñ”ÿÄÿÄ ‘RS’ÑÿÚ ?çð Ç1³o©<'¹¦ä®v²‡L>SàŽcfßRx9¦ä®:Ê0ùO‚9›}Iàæ›’¸ë(tÃå>æ6mõ'ƒšnJ㬡Ó”ø#˜Ù·Ôži¹+޲‡L>Sán„¥cyÓÂ"ê~jêFÞÔì‰ÔBR±Œ¼éຟšº‹Ú‘:ˆJV1—<SóWQ{S²'Q JÆ2ó§‚ê~jê/jvDê!)XÆ^tð]OÍ]EíNÈMÆXÿÙgeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/flags/t-lv.png0000660000175200017530000000021612664543647024744 0ustar guillaumeguillaume‰PNG  IHDR$’|¬}PLTE/dÿÿÿ?‘ù³tRNSÿå·0JbKGDÿ-Þ(IDATxÚcøPH~ ’£Dò‚IEɧŒNò³cýèæ£“ }VQ¯’ÙIEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/flags/l-no.jpg0000660000175200017530000000127012664543647024724 0ustar guillaumeguillaumeÿØÿàJFIFÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ(ÿÄÿÄ* 7!Wvƒ“³´Ó1ABÿÄÿÄ1 3±45RSqr‚‘’â!a²Ñ1AQÿÚ ?‹ &â8Ÿhš9ˆ½cô2Ùûö™5˺—¸ks5 iÒñ (Ë-ÝÂáÂæ¸\ß%$„bð‹”¹3¤{,ý†ƒ€L:kÓÄÅñ¬å­wrý’÷ÊÕªN}KÉäÒ¼ò\B¥ä„í=°²"2KŠþq߇跋yžO7BŒ¸#ÕV¯ÅUzVžÉìC•J%ÕÊåþª×y]WB6!qvê–}õá´ã¨ijVbfþ?‚".‘LnZÖ"ôñ$Bœ%𚌇ȉúG*%ç¥Èá#Ùgì9€L:kÓÄôƳ–µÝËöK‘Ã:G²ÏØæ½×y‡,'NP ­>Câ·÷/8ôpßDÑ€”¯#IEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/flags/l-lv.jpg0000660000175200017530000000154012664543647024731 0ustar guillaumeguillaumeÿØÿàJFIFÿþXCREATOR: XV Version 3.10a Rev: 12/29/94 (PNG patch 1.2) Quality = 75, Smoothing = 0 ÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ$"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?òÚ+è?øJ~ÿϾ‘ÿ‚vÿãTÂSð‡þ}ôü·ÿ¯?دæG×iTÿŸûŸ(¯ ÿá)øCÿ>úGþ ÛÿQÿ OÂù÷Ò?ðNßüjb¿™ö•Oùñ/¸ùòŠúþŸ„?óï¤à¿øÕ{üÈ?´ªω}ÇÏ”QE`zÁEPEPÿÙgeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/flags/t-fi.png0000660000175200017530000000026312664543647024723 0ustar guillaumeguillaume‰PNG  IHDR$Zœ# PLTE)c9k9sZ„9s”R{œZçïÞÿÿÿ&m=tRNSÿÿÿÿÿÿÿÞƒ½YbKGDaˆë5IDATxÚc(Ç `²Ì‘A™E¨˜M¨€ ]#;š*â„ ØË£–À¡§\n›»dã IEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/flags/t-ru.png0000660000175200017530000000040212664543647024746 0ustar guillaumeguillaume‰PNG  IHDR$ŸlÎ 6PLTE1cBsJs!J{!Z„1cŒBk”J„¥c„¥k”­{¥½Œ­Æœ½Î­ÆÖ½ÞçÞçïç÷ÿ÷ÿÿÿób̼tRNSÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâ¿¿bKGDâµ=º\IDATxÚÍÑK€ Ð)Z¨¥÷¿¬¨‰l€²pÁ$MÓÌÛÚô‹ðN˜âÆ{"‹\œÕBwÄDN5Ñ‘Ú2’”¶ØÈëRG#¾”‘zªH7š…³è¿w….N*ÇÞ}aIEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/flags/l-ro.jpg0000660000175200017530000000153512664543647024734 0ustar guillaumeguillaumeÿØÿàJFIFÿþZ CREATOR: XV Version 3.10a Rev: 12/29/94 (PNG patch 1.2) Quality = 75, Smoothing = 0 ÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ$"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ñjöo€‘ÿÒâa…þ2=–¾j=M}+_5¦¿áßùyòýOÑøWâ«òýD¢Š+é±8ªöo€ÿ’wéý.'àø_ã#Ùkæ£ÔÑE~ÿòóåúŸ£ð¯ÅWåú‰EWÓbÿÙgeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/flags/t-cs.png0000660000175200017530000000056012664543647024732 0ustar guillaumeguillaume‰PNG  IHDR$ŸlÎ TPLTE1c9k9kBsJs!J{!R{)R„1Z„1Z„9cŒ9cŒBk”JsœZ„¥kŒ­s¥½”µÆ¥½ÎµÆÖµÆÖ½ÎÖ½ÎÞÆÞçÖçïçïïç÷ÿ÷ÿÿÿ¿íµ¡tRNSÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ²â×bKGD`Ô¤¢IDATxÚÝ’Ñ E/ù)È„m²ÍÿÿO[†ðe‰&ö¡inNK{ž9Õ@ô÷PZR?jhÀŠjkÌ%äÞ:hÁ2SêKH‘d6F[R)Üò¹SÃÍy ôXA¬¦V/ãÓ¶„Ik¢6k:†N%tåÂYmTÖ4½D?Õ\DzûÏp¢¼?þ'ˆçÏKÿ¿RñtQõê!þªæ=—ÞyåQ^)úpQEQEÿÙgeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/flags/t-pt.png0000660000175200017530000000045712664543647024755 0ustar guillaumeguillaume‰PNG  IHDR$ŸlÎ ?PLTE)c9k9kBsR{)R„1Z„1cŒ9cŒBs”RsœZ{œc„¥cŒ­s”­{œµ„­½”ïïçï÷ï÷÷÷ÿÿÿYYÇtRNSÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ+Ù}êbKGD’ßÉ5}IDATxÚÅÑÛ€ PèfV–(ÿÿ­i]›Ò[ñ LÏT¸Î)‡Š™à”QXI#ÎtšÌžH q«—ÑVFÆ›x«ø&pLald”&ù$F”‘á5—G$U·1·W/JèèSç™—˜´etwœFhTµºÒGþ†êñ1ÚB™07¸lÓ`IEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/flags/t-en.png0000660000175200017530000000046412664543647024732 0ustar guillaumeguillaume‰PNG  IHDR$ŸlÎ BPLTE1c9k9kBsJs!J{!Z„1cŒ9cŒBk”Js”R„¥c„¥kŒ­s¥½Œ­ÆœµÆ¥½ÎµÆÖµïïçï÷ïÿÿÿã ŠtRNSÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÒÀäbKGDåØù£~IDATxÚÕÒI€ Ш8ƒCïU•j FŒ cb7 åAzxõ…Bb¬¯ÅXk¤Ý µà¨eÚl€ìá<Ú"P¹TzO £†ìš”ÈbÅhä £dör§InA¥#£ãvCÉ;µ7툜QPÆÑ-úøü ͨ~2f»ÑÊIEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/flags/t-it.png0000660000175200017530000000032412664543647024737 0ustar guillaumeguillaume‰PNG  IHDR$Zœ# *PLTE)c9k9kBsR„1Z„1cŒ9s”RsœZ„¥c­½”ïïç÷÷ïÿÿÿ=ž7œtRNSÿÿÿÿÿÿÿÿÿÿÿÿÿEÀÜÈbKGD ö´aõ>IDATxÚc¸‹p 10ܽ³C¨‘C#ºª 01…°˜E‰Ðnt!t¡ ÌèBÛÔ­„ÉT%õ鳬IEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/flags/t-af.png0000660000175200017530000000052412664543647024713 0ustar guillaumeguillaume‰PNG  IHDR$ŸlÎ TPLTE1c9k9kBsJs!R{)R„1Z„1Z„9cŒ9cŒBs”R{œZ„¥c„¥kŒ­s”­{œµ„­½”µÆ¥ÆÖ½ÎÖ½ÎÞÆçïÞïïçï÷ï÷÷÷ÿÿÿg?tRNSÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ²â×bKGD`Ô¤†IDATxÚÕÒA ÐØŠ¢ÐŠŠ…ûßÓPj74àtgYðß™â…ÝÈë U)¤ºÖQ"~kÜd;ŠŽú• U‰Þr‰ðà‘ù\x”.rÑSy³‚ðû³è~Â:†C–εóu$ÒjÂÐFÍq·9ïÎÔ‹‚•fÖm6Añ–ÿŠ>UÌBkñ< ZIEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/picto_loupe.png0000660000175200017530000000115212664543647025310 0ustar guillaumeguillaume‰PNG  IHDRVÎŽWtEXtSoftwareAdobe ImageReadyqÉe< IDATxÚ¬”ÏkAÇ¿»."ŠZ[-ˆíµPh¶rò$D/@sÜ’?@Ú@èQ¨ÐÖƒ—€=´‚ñ=YìÁ)¦RˆÆP¤NßLYµ’–<ø,³³ï}÷Í›y#1Æp¦ðG*•ÚåsH<'ž¿ˆñ–ø¤;¤Óé?B³Ùl›ÀcâDUU€Û퓽^/R­V#Íf3K¯¯‰ËeF:I$šßïÇ`0@§Ó“N§ÉdG+‹|êÅRh:n,'ˆL&“ ‹…ø0`³Ù Ñjµ´z½þ™¦Oe]h - ¡ßïc>ŸCQF,ËÂg8" ßeFük¶ïõzÑíva6›·îÀx<u£Ø'»„„ñ Ãöí¦,ù7Š5쪶ÛíŸÏ·­~Â, ȇÇòãYâÔj5í¡zU(`·ÛE_Þ*V«U<ŸÏó¸ìRH/²n)õ}üÛÈårp8B pQ>æd2T*•,ÅDo‘UÎ^‚5>ÄÙ»c°£=°X,ÆÊå2£ƒÈ¨ø¬T*±h4Ê\.×â>!â”ÕuW^IÌó4ŽÖÅG\ßW?éÜÜ{pJоÖ"|9g½¶.òýpþ•ç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-ÛbKGDÿÿÿ ½§“ pHYs  šœtIMEÛ  9VD¶ vIDATÓ]‘=kSq‡Ÿsþ¹ÆR(ˆ…`pª ‚ÐEÁEp+R#H¿„&ª…K3ÔÒp¿E©Bè‹[»¸è°‹‹– ±P¤ÍËõ—fq~ðð{ÄÝØü,•¿Êçf”€3U:aÄÇäµ_ˆ»“´å™+»fL¨™S@é寫íªwtý@îO@ƒ(§Ò|é†ç”TI1f Êný‹”5Ê©›1­JºUõ&À‡}Yh5¼ß\öäfß²&m~¸3˜LGÎéÎÙ]xÚ=G‹÷ÈDèª;±ÝdÅ{j¼˜xó”…VÃû"\à”d£Íwœr>¦"sŽ‚*—aÀü@!"á—šñÕ!ŠÔ·ª~:óH•·aÌ“dÅ{Q‘€'²zDy*çF¬Jzý“VÃû›Ÿ$ÎoQs£†Ò».°(îÎû}YT8ĘùÿgU~Œ7ÛUïȤàúžÜ‰Š¼3ã1ðP…Ì…“«iºäÀ?7½¥z‚/IEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/menubar_background.png0000660000175200017530000000032212664543647026614 0ustar guillaumeguillaume‰PNG  IHDR!¹Á¿sBIT|dˆ pHYs  ÒÝ~ütEXtCreation Time02/27/13îGýktEXtSoftwareAdobe Fireworks CS5.1«Hë(IDAT™¥Ê±0 ƒ@Îû¯,‘âK‘æ@u®¨LÛIþ–µí”Q›¼T/IEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/picto_anniversaire_small.png0000660000175200017530000000227312664543647030047 0ustar guillaumeguillaume‰PNG  IHDRÄé…ctEXtSoftwareAdobe ImageReadyqÉe<]IDATxÚÜV]L[e~ÏoOÏiá´0·ÁÇA–™Ì­Äh4NÍâ…‘@â•ñ¢»ðfwêͼ €Ñ›]¹D]ü™`Ì’©34%qn“µlØ2Gù—ã¯0`PÚÒöôô´ßï¨P0½Ð]ø%ïIÎù¾¾Ïû<ßûSÊ0 ø¯ `=Wpþ¾ëN߀+ßó}CU‹–•¼.]½æ^ ­÷¦¦¡Ÿ÷Òey§³¾ëµ#£wW1(#87?™·\ëëëJ$UMºaTLž>óY«3g¿j¶X,­ U•UU…p$ªä b“¤–Ðj$I„t: ‘HTæXÖ÷ö;'³@'ß;ÕLQ”{-†aÀjµÂâÒÿvþØí>^øÉ#?ÿÌÓK$€eØW²¦gfåÊ#OùêÇÆ¿ß—ô´¹1 ”¬ DÑ ËË;òéê¹ÕŒúºë퇱‰{ ë:èȦØéAäÖ¶Ÿ«€¢€ãX¸ÞÕ ê¯>`XÙаT¹Ø/KAIª”²ý-¦T6›û@Ù~àíPR> Œ6“Î@<9½bÊÇÐ ö PõQ`€eX“ /‡·¡Ècy%äV“Éfõý…E Á’p2Òxö`hÙ€÷ß„DB5Y - ½ _orö¢£»[iÏqS¢ÕªþeS.¤êG}±kWqØm6¸3&Ò)  ä¢í6 æ03ÿp߈ÀÛ‘ãEÑÍ¢„¢Uð‚åóêoÊÏ%){¥Ýèì¹õKiÉžç¬\!L†z@×À´LÀ™yÖdº‹ÁHð„âÁì>„*@[)kZJ°Ûm@ŒfhAGÙö¶‹a´:Íî›2àK`V‘̉mˆ”¬×_;nH¨ÿø•ï 6ñpß)ÁãûJe§£°éƒÆI*+¹ðèj8ÎfWoÿ bá¹Vtî"i{¹Ýç‘P»$“É@*•¬ iÁ6Âk8ýa}2ñ#‹ºO(av68׈uÔjšfVGgw opøDå[Æ&@ÌÂóPTÖtv/¶ÒWèl¨~é ’õ¬(¯Ë€1[šŒucŠ|h9ÿ½ÿª¯£šÈè” ¶—‡ö&GçZJG4K¸JY;vd1Œ5V}ᢧévoŸëÓ/¿Q6ãlp^é–¯ù;ß=îóOþÞ,+ÔÀƦ¦þlØFL&i”† ;vK)›÷ ÐøZNÅŸjøh 8¶‘lÑ7½«IÕI&“fbЛ;ŸòC ùŒ€HtÍ”KMjØ rƶò¯LÆèZÌd‚Ýv‹‡òþ]Nƒôz½XêšûápGàö8Mñ"CqVŠb…c¥q^×St"7æ¢{RÓÑ'µu#­bb'8JÒ¼Þz2Üb555éœÞµGºÅãþbO´"Ž´-–B€LNƒüßü%úC€¸ œ—v IEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/picto_molette.png0000660000175200017530000000104412664543647025635 0ustar guillaumeguillaume‰PNG  IHDRVÎŽWtEXtSoftwareAdobe ImageReadyqÉe<ÆIDATxÚ¬”;¯AÇÏÞÜZG| QéT£ð9$D¡Pjön£‘Ð(T*…B$ *+¢S ‰Ï‚à•¹sæÚ1¹Öå&NrvçìoþgfvJ)¼Ã>ñÇŸåæMi¬1ÿ2™LÅb1Þš9‹æ´×ë w:TŠóö‰çóù¡SƒÁ \.F‰DÀb±ø¤ø­´' , ŽÇ#”J%°Ùl¾jµª‡Ãa£\^æ+ŠDkµZ¹‡B!ÂÆÍh4Ê E¸šlý~_ôØápǓɄoz €Ýn'⦠ÒÉ$M$°ÙløØívƒ×ëå}œÛn·°\.o ÓétÑ4ªª ³ÙLÌ¡ªý~ÏûÉåràp8|„ ²1”©ñx,æX,å4×cïꦥùý~šN§a0ˆ¹ù|ÎOl8*¿•³üûÒ!4›ÍB·Û‰‹ÅÊå²)D~W(b›Hóù|üO,©ééÅ0Ý‚y“¦½ÿO&éE·#„EEÈ olzéÉèÀ³IŠ(C¶×=#?™zÅ€1>6Ù>»îÜ‚l’-€¥¨$«ÍD‚¯4 D¡.Æ`ŒM’€©—áß¿pþê=g ²aêAz Ñ `®ˆ‹ WÿŸÃóïß¿$ù¦[\´€lÁïß¿IòL=É8èË•LI²a?þ$«ÜAN8-xûêõ Vàáç#Éð/?ô^ &'ž>tl¿Œ¢0*ÅDD# ¢“‚º”€@¡àbA°P(]2(ìÝC·B’=Cˆ´ÐUºf“:¸‰¨Ñ(ÆGŒhTì=• ™úÃùÿïqî½ç>~År¹¤ËËKzå9g$Vë Fò5’¯ù|¾Þ¿gÜ0aÇå0NÃÑŸp÷û5)‡ÃqÒjµÈjµ’Åb¡F£!¤@ @|þ{ÜU*•"q0›ÍŽœNçI0¤ÉdB …‚©Ó鈃íímòù|äõzI§Ó!`¢\.CÍ/qðüü|S«ÕèîÓ)- œmRúßï“J¥¢­­-6¼9´Ûí4%2 •ûû{q`6›%%Ü`0Ñh¤‡‡ÔâJ¥T*Ï9â7¿ß/‘€f³I,ñ¯ß{½xûz½^œ#¥b±øív•,9q||L†F£‘ªÕ*R9cÔW8ÃîÀ6°U#g䄨Xïìì ¨²~ù°©Á`0.öà¨ööövóù|ò@€w¬9¢†%þe¼a|å÷µZ­Ô‰S¢l6‹b_(S©T’=}j·Û"·ÛMÜÒS®x…B§G¢ƒƒö²ÍgFrÝ…,Òp¹\Bº½½'ápXäÃ9Îpuõz]l^¶ñ Ôj5Çcé?ŠÅ'0\OOO’3Úh³Ù¨P( éõ$^år¹Ž€ôÙd2Érîv»¢óR*•0ÊiÜ)0±Xl]ì/ H;`\G"9Ìd2ø|\ýLoׯÑhô¿ç Xkæ¢K"—IEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/picto_branch.png0000660000175200017530000000134512664543647025425 0ustar guillaumeguillaume‰PNG  IHDRàw=øtEXtSoftwareAdobe ImageReadyqÉe<‡IDATxÚbüÿÿ?- 2‡‘‘‘aFw¿9_XL4€hƒž=~òHf”^@,j ¬ít IréÛW¯6¯Z»ÈT$Dö¤@3HÊH+CÀ€fq ´pÆ |þöáæã R" p¾”°\ Älbx#@šRz2üÀü370døÖÃÅ@|@Ë´j'-™Â MÇ"RÌ›`ŒMQ€¼ìg•6ÄDÍÈŽZ°,âƒäa$²¤†h $…ä|@ ôµ„h‰ø&P S–ªùOl€3 ƒ"Åû@1È go€ån>¾ˆ¢‡h ¸9øx8ùЦ1ðrñƒ]ÉI É OíubP“ÑËý‡ZŽÕ0dI`FÙÿóçÏÿ0œÔi÷ÊúÚÿÈb0¬ŸÂðÿø•ÝpþÉCGþõ; ›‰ÕÿþýC8ˆ·œXÄpöÖA\jaêÿDþü³sýÛ>ÿÈpáÎa†çï1œ¿{˜ÁË4šAL n ŠZpõÈÃkÁïß¿ál1M07Õ .6og;C‚k9ƒ«a8Šz²,Àþ CW÷ïï_â,øõë†X¤}! _SÆCÝçOŸ‰²àÁ“D%%PC,³1SН_>}úXáH/)Àc#cáŧ¤åõXXXˆ.ª_>}þñ÷¯ß…Æ!gŽÍ›7ƒŠ^PÑþþù+Gff&&&AF&&~`uÊ´œ ¤˜xõ}ýÿïÿ'`¸¿ÿ÷÷ß®3<Ü 𣯯ïo¬ ÉV@€.slöZX¸<IEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/menubar_background_hover.png0000660000175200017530000000031712664543647030023 0ustar guillaumeguillaume‰PNG  IHDR!¹Á¿sBIT|dˆ pHYs  ÒÝ~ütEXtCreation Time02/27/13îGýktEXtSoftwareAdobe Fireworks CS5.1«Hë%IDAT™cøÿÿÿ&ÜÄÿÿÿ˜þýûeA¤˜°|aQæ¿j–sIEND®B`‚geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/images/button_list.png0000660000175200017530000000164312664543647025341 0ustar guillaumeguillaume‰PNG  IHDRÄé…csRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÛ *Z¤ˆâ#IDATHÇ­–ÍoEÆãÝwmSÜÆ®c µ‘E‚#n9#!8äà@8ôÌâw¸U '¤PTT©|öƒ€@¨…Ð&ñÇz½;3;[v$;æ•V£Õ¼3Ï<ïóì;+8€_>W*Å"¬µ‚)CaX¥õîwný ô€Ðpâ3Í‹kK•êÛAÔ}ß礡µ&Š¢h·µÿÖÕë×>ZÈWʧWêÕ³<¹ºZªÕjÌ­v;ÜÚÚz½Ýílwû憊KÕ³k‹‹‹¥J¥‚1fnBR­Tx¸têE`S!°ä8Zk’4¥Óí¤)¾çQ,ñ=of !{8%ߘ,ŸeJ)öööxóýwGÉ—/½Êéryfc ÖZÈKÀ±ØÜ$êõ&’£^ß'QéÔ¾ë Ê>p§“NØ\nÒµ¹œ êõxã½wØßoM5F½zL[<Õ\i¼öôêÅõz½NªQ‘*…纄a€š‰ëzôã˜oþtûËë×^‘É,ËHÓÁFaŽ(ÚÁBéN/ˆµh­G¯r¢\i:Ð%ŽQZáJ—0ŸÇuÝ}”G@L–‘*E«Óæã+£„õç_à¡béDî:ÊÄZ”RÄq"9Žû¸ÒEk55€”.ÙHn\¥‡;¢â8æ£+´;Ý©Æ8Ž'˜ŒÜÕX>¿îyZkâ¤Ö)òþ ÆFOÏÄ‘!ØÞù{Ò]vÌyaÐø-ü_41Æ ¦Ÿ$hcŽÃ‚ïÏ 0ÜïXk-qÜçó¯6G kÏ>Gsuå#G<\{m4ú€á,šHÇ9ê®ÿª½t$Úh>Ýü‚$I¦È  yþÜ/¯®4. NnH’m4Ò‘ ¯â“0ùkgûëo¾ÿö²úüyïÆò#í†AP–Žƒ %nn; %if;(evar.slices = "on") [*display by slices/slice width/overlap/total width]0%nn; %else;%head_title;%end; %base_header; %message_to_wizard; %if;(evar.slices = "on") %if;(evar.cgl != "on")
%if;(referer != "") << %end;
%end;

%nn; [*display by slices/slice width/overlap/total width]0%nn;

%hidden; %foreach;env_binding; %if;(env.key != "slices") %end; %end;

%else; %if;(evar.notab != "on") %end; %if;(evar.notab = "on" or evar.pos2 != "") %let;dpos;%if;(evar.dpos != "")%evar.dpos;%else;78%end;%in; %let;pos1;%if;(evar.pos1 != "")%evar.pos1;%else;0%end;%in; %let;pos2;%if;(evar.pos2 != "")%evar.pos2;%else;%dpos;%end;%in; %let;overlap;%if;(evar.overlap != "")%evar.overlap;%else;10%end;%in; %if;(pos1 != 0 or pos2 < dag.ncol)
%if;(pos1 = 0) %nn; %else; <<%nn; %end;%nl %if;(pos2 >= dag.ncol) %nn; %else; >>%nn; %end;%nl;
%end;
    %foreach;dag_line;
      %foreach;dag_line_pre;
        %foreach;dag_cell_pre;
          %dag_cell_pre;%nn;
        %end;%nl;
      %end;
    %end;
    
%else;
%foreach;dag_line; %foreach;dag_cell; %end; %end;
%nn; %if;dag_cell.is_nothing; %nn; %elseif;dag_cell.is_bar; %if;(dag_cell.bar_link != "" and evar.cgl != "on") |%nn; %else;|%end; %elseif;(dag_cell.item != "")%dag_cell.item; %elseif;(dag_cell.text != "")%dag_cell.text; %else; %if;dag_cell.is_hr_left;
%nn; %elseif;dag_cell.is_hr_right;
%nn; %else;
%end; %end;
%end; %if;(link_next != "")

>>%nl;

%end; %end;
...
%copyright; %base_trailer; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templ502/accent.txt0000660000175200017530000001151012664543647025133 0ustar guillaumeguillaume À à Â Ã Ä Å Æ Ç È É Ê Ë Ì à Î à à Ñ Ò Ó Ô Õ Ö Œ × Ø Ù Ú Û Ü à Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö œ ÷ ø ù ú û ü ý þ ÿ ¿ ¡ © ® « » ° ¹ ² ³ ¼ ½ ¾ € £ $ ¥ geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templ502/updmenu.txt0000660000175200017530000001035012664543647025354 0ustar guillaumeguillaume%doctype; [*update] %base_header; %message_to_wizard;

%nn; [*update]: %first_name; .%if;(first_name = "?" or surname = "?")%index;%else;%occ;%end; %surname;

%if;not cancel_links;
%if;(referer != "") << %end;
%end;
[*person/persons]0 [*family/families]1
[*modify::] (P) %if;(bvar.can_send_image != "no" and image = "" and first_name != "?" and surname != "?") [*send::image/images]0 %if;(auto_image_file_name != "") [*delete::image/images]0 %end; %end; [*delete::] [*merge::] %if;(not has_parents and first_name != "?" and surname != "?") [*add::parents] %end; %foreach;family; %if;(family_cnt != 1) [*invert] %if;(family.father.index = prev_family.father.index and family.mother.index = prev_family.mother.index) %nn; [*merge::] %end; %end; %nn; [*modify::family/families]0%if;(nb_families = 1) (F)%end; [with] %spouse.first_name;.%spouse.occ; %spouse.surname; %nn; [*delete::family/families]0 [with] %spouse.first_name;.%spouse.occ; %spouse.surname; %end; %if;((first_name = "?" or surname = "?") and (nb_families != 0 or has_parents)) %elseif;(not is_male and not is_female) %nn; [*add::marriage/marriages]0 ([M/F]0) %nn; [*add::marriage/marriages]0 ([M/F]1) %else; %nn; [*add::marriage/marriages]0 (A) %end; %if;(nb_children != 0) [*change children's names] %end; %if;has_possible_duplications; %sq; [*merge::possible duplications] %end;
%define;hint(xx) [*to add a child to a family, use "%s":::xx] %end; %if;(nb_families != 0)

%apply;hint([*modify::family/families]0)

%end;
...
%copyright; %base_trailer; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templ502/updhist.txt0000660000175200017530000001061512664543647025363 0ustar guillaumeguillaume%doctype; [*history of updates] %base_header; %message_to_wizard; %define;search_form(xxx) %if;(wizard or friend)

%hidden; %if;(evar.m = "HIST_SEARCH" and found) %end;

%end; %end; %if;not cancel_links;
%if;(referer != "") << %end;
%end;

[*history of updates]

%if;(not cancel_links and (evar.m != "HIST_SEARCH" or not found)) %apply;search_form("") %end; %define;update_text(uu) %if;(uu = "ap")[add::person/persons]0%nn; %elseif;(uu = "mp")[modify::person/persons]0%nn; %elseif;(uu = "dp")[delete::person/persons]0%nn; %elseif;(uu = "fp")[merge::person/persons]1%nn; %elseif;(uu = "si")[send::image/images]0%nn; %elseif;(uu = "di")[delete::image/images]0%nn; %elseif;(uu = "af")[add::family/families]0%nn; %elseif;(uu = "mf")[modify::family/families]0%nn; %elseif;(uu = "df")[delete::family/families]0%nn; %elseif;(uu = "if")[invert::family/families]1%nn; %elseif;(uu = "ff")[merge::family/families]1%nn; %elseif;(uu = "cn")[change children's names]%nn; %elseif;(uu = "aa")[add::parents]%nn; %elseif;(uu = "mn")[modify::note/notes]1%nn; %else;uu%nn; %end; %end; %let;kk;%if;(evar.k = "")3%else;%evar.k%end;%in; %let;wiz;%if;(evar.wiz != "" and evar.n = "")%evar.wiz;%end;%in; %foreach;history_line(kk, evar.pos, wiz) %end;
* %time; (%apply;update_text(update.var) %if;(user != "") %sp;-%sp; %if;(wiz = "")%user;%nn; %else;%user;%end; %nn; %end;) ... %if;(first_name != "") %person;%person.title; %person.dates; %elseif;is_note; - %if;(note.page = "")[note/notes]1%else;%[%note.page;%]%end; %if;(note.part != "")- #%note.part; %nn; %end; %else; %key; %end;
%if;(pos != "")

%hidden; %if;(wiz != "") (%wiz;) %end; %if;(wiz != "") %end;

%end; %if;(evar.m = "HIST_SEARCH" and found)%apply;search_form("left")%end;
...
%copyright; %base_trailer; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templ502/robot.txt0000660000175200017530000000111112664543647025017 0ustar guillaumeguillaume Access refused

Access refused

This address has been considered to be a robot and its access has been automatically disconnected.

Contact the site administrator to restore it.


Copyright (c) 1998-2007 INRIA - GeneWeb %v
geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templ502/moved.txt0000660000175200017530000000117712664543647025020 0ustar guillaumeguillaume install -> http://geneweb.inria.fr/roglo? [ en: The database "%b" has moved to: fr: La base de données "%b" se trouve maintenant à l'adresse: ]
%t

...


geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templ502/relmenu.txt0000660000175200017530000001473412664543647025360 0ustar guillaumeguillaume%doctype; [*link between]%sp; %if;(public_name != "")%public_name; %else;%first_name; %surname;%end; [and]0...%nn; %base_header; %message_to_wizard;

[*link between]%sp; %if;(public_name != "")%public_name;%else;%first_name;%end; %if;(qualifier != "") %qualifier;%end; %sp;%surname; %if;(alias != "") (%alias;)%end; %sp;[and]0...%nn;

%define;relative_sosa(sosa_link) [Sosa number relative to %t:::sosa_link] %end; %if;not cancel_links;
%if;(referer != "") << %end;
%end;

%hidden; %if;access_by_key; %if;(occ != "0") %end; %else %end;

  • %foreach;family; %if;(spouse != "? ?")
  • %end; %end; %foreach;relation; %if;has_relation_him;
  • %end; %if;has_relation_her;
  • %end; %end; %foreach;related;
  • %end; %foreach;family; %foreach;witness;
  • %end; %end;
[*color]
   
...
%copyright; %base_trailer; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templ502/redirect.txt0000660000175200017530000000120212664543647025474 0ustar guillaumeguillaume Address changed

Address changed

The address of this service has changed. Please use now:
L'adresse du service a changé. Utiliser maintenant:
L'indirizzo di questo service è cambiato. Utilizzate:


Copyright (c) 1998-2007 INRIA - GeneWeb %v
geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templ502/welcome.txt0000660000175200017530000013350012664543647025335 0ustar guillaumeguillaume%doctype; [ af: Genealogie/Familiekunde bg: Genealogy br: Genealogiezh ca: Genealogia cs: Genealogy da: Genealogi de: Genealogie en: Genealogy eo: Genealogio es: Genealogía et: Genealoogia fi: Genealogia fr: Généalogie he: תולדות is: Ættfræði it: Genealogia lv: Ģenealoģija nl: Genealogie no: Genealogi pl: Genealogia pt: Genealogia ro: Genealogie ru: Genealogy sl: Genealogija - Družinsko drevo sv: Genealogi ] - %base.name; %base_header; %define;language_link(xx,yy)%sq; %let;zz;%if;("yy" = "")xx%else;xx-yy%end;%in;%sq; %let;tt;%if;("yy" = "")xx%else;xx_yy%end;%in;%sq; %sq; %apply;language_name(zz) %end; %define;sosa_rel(xx) [Sosa number relative to %t:::xx] %end;
%if;(wizard and not friend) [wizard/wizards/friend/friends/exterior]0%sq; %if;((wizard or just_friend_wizard) and user.ident != "") : %user.ident;%sq; %end; %if;(bvar.wizard_passwd != "" or bvar.wizard_passwd_file != "") %if;(bvar.friend_passwd != "" or bvar.friend_passwd_file != "") ([disconnect]) %end; %end; %end; %if;(friend and not wizard) [wizard/wizards/friend/friends/exterior]2 %if;(bvar.friend_passwd != "" or bvar.friend_passwd_file != "") ([disconnect]) %end; %end; o + %if;(referer != "") %end;
GeneWeb

[ af: Genealogiese databasis ar: قاعدة المعلومات العائلية (جينيالوجيا) bg: РодоÑловна база от данни br: Bon roadoù genealogiezh ca: Base de dades genealògica cs: Genealogická databáze da: Genealogisk database de: Genealogische Datenbank en: Genealogical database eo: Datenbazo genealogia es: Base de datos genealógica et: Genealoogiline andmebaas fi: Sukutietokanta fr: Base de données généalogique he: מ×גר מידע תולדותי is: Ættfræði gagnagrunnur it: Base di dati genealogica lv: Ciltsrakstu datu bÄze nl: Genealogische databank no: Genealogisk database pl: Genealogiczna baza danych pt: Base de Dados Genealógica ro: Baza de date genealogice ru: ГенеaлогичеÑÐºÐ°Ñ Ð±Ð°Ð·Ð° данных sl: GenealoÅ¡ka baza podatkov sv: Genealogisk databas zh: 网络家谱 ]

[ af: Taalvoorkeur/Language preference: ar: بإمكانك إختيار لغة أخرى من بين اللغات التالية: bg: Можете да изберете друг език за ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ¶Ð´Ñƒ Ñледните: br: Dibab a c'hellit ur yezh all etre ar re-mañ: ca: Podeu seleccionar una altre llengua, hi ha disponibles les següents: cs: Zvolte jazyk pro prohlížení databáze: da: Du kan vælge fremstilling pÃ¥ et andet sprog blandt de følgende: de: Du kannst eine der folgenden Sprachen für die Anzeige auswählen: en: You can select another displaying language among the following ones: eo: Vi povas elekti alian lingvon inter la sekvantajn: es: Puede seleccionar uno de los idiomas siguientes: et: Võid valida ka mõne muu keele järgnevatest: fi: Voit valita jonkin muun kielen allaolevista: fr: Vous pouvez sélectionner une autre langue d'affichage parmi les suivantes: it: Potete scegliere un'altra lingua fra le seguenti: is: Þú getur valið milli eftirfarandi tungumála: lv: JÅ«s variet apskatÄ«t datu bÄzi arÄ« citÄs sekojoÅ¡Äs valodÄs: nl: U kunt een andere taal kiezen uit een van de volgende mogelijkheden: no: Du kan velge sidevisning pÃ¥ et annet sprÃ¥k blant følgende: pl: Możesz wybrać inny jÄ™zyk spoÅ›ród nastÄ™pujÄ…cych: ro: poti sa alegi una din urmatoarele limbi pentru afisaj sl: Lahko izberete drug jezik: sv: Du kan välja ett annat sprÃ¥k bland de följande: ]
%apply;language_link("af", "") %apply;language_link("bg", "") %apply;language_link("br", "") %apply;language_link("ca", "") %apply;language_link("cs", "") %apply;language_link("da", "") %apply;language_link("de", "") %apply;language_link("en", "") %apply;language_link("eo", "") %apply;language_link("es", "") %apply;language_link("et", "") %apply;language_link("fi", "") %apply;language_link("fr", "") %apply;language_link("he", "") %apply;language_link("is", "") %apply;language_link("it", "") %apply;language_link("lv", "") %apply;language_link("nl", "") %apply;language_link("no", "") %apply;language_link("pl", "") %apply;language_link("pt", "") %apply;language_link("pt", "br") %apply;language_link("ro", "") %apply;language_link("ru", "") %apply;language_link("sl", "") %apply;language_link("sv", "") %apply;language_link("zh", "")
%if;just_friend_wizard;
[ en: Wizard rights are now suspended for maintenance. fr: Les droits des magiciens sont actuellement suspendus pour maintenance. ]
%end; %if;(bvar.motd != "")
%apply;interp(bvar.motd)
%end;
%apply;interp([ af: Die databasis "%base.name;" bevat%sq; tans %base.nb_persons; persone. ar: قاعدة المعلومات "%base.name;" تحوي إلى يومنا %base.nb_persons; ÙØ±Ø¯ bg: Базата от данни "%base.name;" в момента Ñъдържа ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð·Ð° %base.nb_persons; души. br: Niver an dud a zo er bon roadoù %sq; "%base.name;" bremañ a zo : %base.nb_persons;. ca: La base de dades "%base.name;" conté actualment %base.nb_persons; persones. cs: Databáze "%base.name;" obsahuje %base.nb_persons; osob. da: Databasen "%base.name;" indeholder for øjeblikket %base.nb_persons; personer. de: Die Datenbank "%base.name;" enthält z. Zt. %base.nb_persons; Personen. en: The database "%base.name;" now holds %base.nb_persons; persons. eo: La datenbazo "%base.name;" enhavas nun %base.nb_persons; personojn. es: La base "%base.name;" contiene actualmente %base.nb_persons; personas. et: Andmebaas "%base.name;" sisaldab andmeid %base.nb_persons; isiku kohta. fi: Tietokannassa "%base.name;" on nyt %base.nb_persons; henkilöä. fr: La base de données "%base.name;"%sq; contient actuellement %base.nb_persons; personnes. fr-cr: Ni atchuèlement %base.nb_persons; nhon-m, fan-m, yiche adan chagement "%base.name;" ta-la he: במ×גר המידע "%base.name;" יש %base.nb_persons; ×נשי×. is: Gagnagrunnurinn "%base.name;" er nú með %base.nb_persons; einstaklinga skráða. it: La base di dati "%base.name;" contiene attualmente %base.nb_persons; persone. lv: Datu bÄze "%base.name;" patreiz satur %base.nb_persons; personas. nl: Deze databank "%base.name;" bevat nu %base.nb_persons; personen. no: Databasen "%base.name;" inneholder nÃ¥ %base.nb_persons; personer. pl: Baza danych "%base.name;" zawiera obecnie osób: %base.nb_persons;. pt: A base de dados "%base.name;" contém actualmente %base.nb_persons; pessoas. pt-br: A base de dados "%base.name;" contém atualmente %base.nb_persons; pessoas. ro: baza de date "%base.name;" conÈ›ine %base.nb_persons; persoane. ru: База данных "%base.name;" ÑÐµÐ¹Ñ‡Ð°Ñ Ñодержит %base.nb_persons; человек. sl: Baza podatkov "%base.name;" vsebuje %base.nb_persons; oseb. sv: Databasen "%base.name;" innehÃ¥ller nu %base.nb_persons; personer. zh: 现有 %base.nb_persons; 人在数æ®åº“中。 ])
%if;base.has_notes;
([note/notes]1%base.title;)
%end; %if;((bvar.wizard_passwd_file != "" or bvar.wizard_descr_file != "") and (wizard or wiznotes_dir_exists)) %end; %if;has_misc_notes; %end;
%if;(not wizard and not just_friend_wizard) %if;(not cgi and bvar.auth_file = "") %( IE seems not to recognize style "display: table"; must use a table %) %if;(not friend) %end;
%apply;interp([ af: %sq; [wizard/wizards/friend/friends/exterior]0%sq; toegang (password) bg: ДоÑтъп като %sq; [wizard/wizards/friend/friends/exterior]0%sq; (парола) br: mont e-barzh evel %sq; [wizard/wizards/friend/friends/exterior]0 (ger-tremen) ca: accés %sq; [wizard/wizards/friend/friends/exterior]0 (clau) cs: {"%sq; [wizard/wizards/friend/friends/exterior]0"%sq; přístup (heslo) da: Opdateringsadgang (adgangskode) de: %sq; [wizard/wizards/friend/friends/exterior]0%sq; -Zugang (Passwort) en: %sq; [*wizard/wizards/friend/friends/exterior]0%sq; access (password) eo: Aliro %sq; [wizard/wizards/friend/friends/exterior]0%sq; (pasvorto) es: Entrada %sq; [wizard/wizards/friend/friends/exterior]0%sq; (contraseña) et: Ligipääs: %sq; [wizard/wizards/friend/friends/exterior]0%sq; (parool) fi: %sq; [*wizard/wizards/friend/friends/exterior]0%sq; kirjautuminen (salasana) fr: accès %sq; [wizard/wizards/friend/friends/exterior]0 (mot de passe). he: כניסה %sq; [wizard/wizards/friend/friends/exterior]0%sq; is: Uppfærslu aðgangur (aðgangsorð) it: %sq; [*wizard/wizards/friend/friends/exterior]0%sq; access (password) lv: %sq; [*wizard/wizards/friend/friends/exterior]0%sq; access (password) nl: Toegang als %sq; [wizard/wizards/friend/friends/exterior]0%sq; (wachtwoord) no: %sq; [wizard/wizards/friend/friends/exterior]0%sq; adgang (passord) pl: "%sq; [wizard/wizards/friend/friends/exterior]0"%sq; dostÄ™p (hasÅ‚o) pt: Entrada %sq; [wizard/wizards/friend/friends/exterior]0%sq; (palavra chave) ro: Acces pentru %sq; [wizard/wizards/friend/friends/exterior]0 (parola) sl: Urejanje kot "%sq; [wizard/wizards/friend/friends/exterior]0" (geslo) sv: %sq; [*wizard/wizards/friend/friends/exterior]0%sq; tillträde (passord) ])%nl; %apply;interp([ af: Vriend toegang (password) bg: ДоÑтъп като приÑтел (парола) br: mont e-barzh evel mignon%sq; (ger-tremen) ca: accés amic (clau) cs: {"Friend" přístup (heslo) da: Betroet adgang (adgangskode) de: Freund-Zugang (Passwort) en: Friend access (password) eo: Aliro amiko (pasvorto) es: Entrada amigo (contraseña) et: Ligipääs: sõber (parool) fi: Valittu kirjautuminen (salasana) fr: accès ami (mot de passe). he: כניסה מיוחסת is: Vina aðgangur (aðgangsorð) it: amico access (password) lv: Friend access (password) nl: Toegang als vriend (wachtwoord) no: Venners adgang (passord) pl: "Friend" dostÄ™p (hasÅ‚o) pt: Entrada amigo (palavra chave) ro: Acces pentru amici (parola) sl: Urejanje kot prijatelj (geslo) sv: Vän tillträde (passord) ])%nl;
%else;
%hidden; [ af: Toegangkodewoord, vir vriend of medewerker toegang: bg: Парола за доÑтъп като приÑтел или админиÑтратор: br: Ger-tremen evit mont e-barzh evel mignon pe strobineller: ca: Clau, per accés amic o administrador: cs: Heslo pro"friend" nebo "wizard" přístup:: da: Adgangskode, for betroet adgang eller opdateringsadgang: de: Passwort für Freund- oder Wizard-Zugang: en: Password, for friend or wizard access: eo: Pasvorto, por aliro amiko aù sorĉisto: es: Contraseña, para entrada amigo o brujo: et: Parool sõbrana või teadmamehena ligipääsuks: fi: Salasana Valittu tai Velho kirjautumiseen: fr: Mot de passe, pour accès ami ou magicien: he: סיסמה לכניסה מיוחסת ×ו ×›×’×ון is: Aðgangsorð, fyrir vina eða uppfærslu aðgang: it: Parola d'accesso, per accesso dell' amico o del wizard: lv: Password, for friend or wizard access: nl: Wachtwoord, voor toegang als vriend of tovenaar: no: Passord, for venner eller oppdaterings adgang: pl: HasÅ‚o dla dostÄ™pu "friend" lub "wizard" : pt: Palavra chave para entrada amigo ou feiticeiro: ro: Parola, pentru acces de amic sau magician: sv: Passord, för vänner eller administratör tillträde: ]
%end; %end;
%apply;interp([ af: Om in die databasis rond te blaai, kan jy die volgende soektogte loods: ar: بإمكانك البحث ÙÙŠ هذه القاعدة: bg: Можете да използвате тази база от данни за търÑене: br: Evit merdeiñ er bon roadoù-mañ e c'hellit klask: ca: Per navegar en aquesta base, podeu fer la vostra recerca: cs: Databázi lze prohledávat: da: For at navigere i denne database kan du søge: de: Zum Benutzen dieser Datenbank kannst du hier suchen: en: To navigate in this database, you can do your search: eo: Por navigi en ĉi tiu datenbazo, vi povas fari vian serĉon: es: Para navegar en esta base de datos, puede hacer su búsqueda: et: Navigeeri andmebaasis: fi: Liikkuaksesi tässä tietokannassa voit etsiä: fr: Pour naviguer dans cette base de données, vous pouvez%sp; effectuer votre recherche: fr-cr: L'heù zott lé chaché ti-tac toupatou, zott pé jiss crié: he: נווט במ×גר מידה על-ידי חיפוס: is: à þessum gagnagrunni getur þú leitað: it: Per sfogliare questa base di dati, si può fare una ricerca: lv: JÅ«s variet meklÄ“t Å¡inÄ« datu bÄzÄ“: nl: Om deze databank te consulteren, kan u een opzoeking doen: no: For Ã¥ navigere i databasen, kan du søke: pl: Aby poruszać siÄ™ po bazie, możesz: pt: Para consultar esta base de dados, pode procurar: ro: pentru folosirea basei de date poti sa selectezi: ru: Чтобы найти в Ñтой базе данных, Ð’Ñ‹ можете иÑкать: sl: Da bi pregledali vaÅ¡o bazo podatkov, lahko iÅ¡Äete: sv: För att navigera i denna databas, kan du söka: zh: ])%nl;
%( IE seems not to recognize style "display: table"; must use a table %)
%hidden;
%if;(bvar.propose_titles != "no")%nl;
%hidden; ([all the titles]) ... ([all the estates])
%end;
%hidden; - [ af: in die lys van alle bg: в ÑпиÑъка на вÑички br: dre roll an holl ca: pel llistat de tots els cs: ze seznamu vÅ¡ech da: i liste over alle de: in der Liste aller en: by the list of all eo: per la listo de ĉiuj es: por la lista de todos los et: loendis kõik fi: listasta kaikki fr: par la liste de tous les fr-cr: an-ni an he: רשימה של כל שמות is: eftir lista yfir öll it: per la lista di tutti i lv: visus nl: via de lijst van alle no: med liste over alle pl: przejrzeć listÄ™ wszystkich pt: pela lista de todos os ro: pe lista tuturor ru: по ÑпиÑку вÑех sl: seznam vseh sv: efter listan av alla zh: 显示所的 ] [ af: volgens bg: ,  подредени по br: dre ca: per cs: seÅ™azená podle da: sorteret efter de: en: by eo: laù es: por et: järjestatud fi: lajiteltuina fr: par fr-cr: zott pé trappé assou liste-la he: לפי is: eftir it: in ordine lv: nl: volgens no: sortert pl: uÅ‚ożonych pt: por ro: in ru: упорÑдоченных sl: po sv: sorterade i zh: æ ¹æ® ] [ en: et: järgi ]
%if;(bvar.propose_place_surnames != "no")%nl;
%hidden; - [ af: by bg: по br: dre ca: per cs: podle da: ved de: mit en: by eo: per es: por et: fi: fr: par is: eftir it: per lv: nl: via no: etter pl: przejrzeć listę: pt: por ro: cu sl: sv: efter ] [place] / [surname/surnames]0 - [birth] - [death] - [marriage/marriages]0 -
%end; %if;(bvar.hide_advanced_request = "no")
- %apply;interp([ af: deur 'n detail navraag. bg: чрез разширено търÑене. br: dre ar klask a-raokaet. ca: per la consulta avançada. cs: lze také zadat rozšířený dotaz. da: ved avanceret søgning. de: mit der erweiterten Suche. en: by the advanced request. eo: per la serĉado progresata. es: mediante una consulta avanzada. et: laiendatud päring. fi: erityishaulla. fr: par la requête évoluée. he: ×¢"×™ בקשה מתקדמת. is: eftir frekari óskum. it: per la richiesta avanzata. lv: meklÄ“t pÄ“c citiem parametriem. nl: via een gedetailleerde opzoeking. no: gjennom avansert søking. pl: skorzystać z wyszukiwania zaawansowanego. pt: por pesquisa complexa. ro: prin specificare complexa. ru: через раÑширенный запроÑ. sl: s pomoÄjo naprednega iskanja . sv: genom avancerad sökning. ])
%end;
%if;(wizard and (not base.has_notes or bvar.propose_add_family != "no"))
[ af: Jy kan bg: Можете още br: Gellout a rit ca: Podeu cs: Zde můžete da: Du kan: de: Du kannst en: You can eo: Vi povas es: Puede et: Täiendamine: fi: Taikka fr: Vous pouvez he: יש ×פשרות is: Þú getur it: Si può lv: Izmaiņu veikÅ¡ana: nl: U kunt: no: Du kan pl: Możesz: pt: Pode ro: Tu poti ru: Ð’Ñ‹ можете sl: Lahko: sv: Du kan zh: ]
%( IE seems not to recognize style "display: table"; must use a table %) %if;(bvar.propose_add_family != "no") %end; %if;(not base.has_notes) %end;
%end;
[ af: Jy kan ook kyk na bg: Можете Ñъщо да Ñе наÑочите към br: Gellout a rit ivez gweladenniñ ca: També podeu consultar cs: Lze také zobrazit da: Du kan ogsÃ¥ fremkalde: de: Du kannst zugreifen auf en: You can consult eo: Vi povas ankaù konsulti es: Puede consultar et: Vaata lisaks: fi: Voit myös katsoa fr: Vous pouvez consulter he: ×פשר ×’× ×œ×”×¨×ות is: Þú getur einnig athugað it: Si può anche consultare lv: InformÄcija par: nl: U kunt de volgende zaken bekijken: no: Du kan ogsÃ¥ slÃ¥ opp pl: Możesz także obejrzeć: pt: Também pode consultar ro: poti consulta ru: Ð’Ñ‹ можете также обратитьÑÑ Ðº sl: Lahko pregledate: sv: Du kan ocksÃ¥ konsultera zh: ]
%( IE seems not to recognize style "display: table"; must use a table %)
%apply;interp([ af: Daar was %nb_accesses; besoeke, %nb_accesses_to_welcome; van hulle aan hierdie blad, sedert %start_date;. bg: От %start_date; наÑам е имало %nb_accesses; поÑещениÑ, от които %nb_accesses_to_welcome; Ñа на наÑтоÑщата Ñтраница. br: gweladennoù a zo bet : %nb_accesses;, er bajenn-mañ : %nb_accesses_to_welcome;, abaoe an deiz-mañ : %start_date;. ca: Hi ha hagut %nb_accesses; consultes, de les quals %nb_accesses_to_welcome; en aquesta pàgina, des del %start_date;. cs: %nb_accesses; přístupů, z toho %nb_accesses_to_welcome; na tuto stránku, od %start_date;. da: Der har været %nb_accesses; opslag, %nb_accesses_to_welcome; af dem pÃ¥ denne side, siden %start_date;. de: Seit dem %start_date; gab es %nb_accesses; Zugriffe, davon %nb_accesses_to_welcome; auf diese Seite. en: There have been %nb_accesses; accesses, %nb_accesses_to_welcome;%sp; of them to this page, since %start_date;. eo: Estis %nb_accesses; alirejoj, el kiuj %nb_accesses_to_welcome; al ĉi tiu paÄo, ekde la %start_date;. es: Ha habido %nb_accesses; consultas, de las cuales %nb_accesses_to_welcome; corresponden a esta página, desde el %start_date;. et: Alates andmebaasi loomise päevast (%start_date;) on selle poole pöördutud %nb_accesses; korda, neist %nb_accesses_to_welcome; korda sellele lehele. fi: Tähän mennessä %nb_accesses; tapahtumaa, joista %nb_accesses_to_welcome; tälle sivulle %start_date; jälkeen. fr: Il y a eu %nb_accesses; consultations, dont %nb_accesses_to_welcome; à cette page, depuis le %start_date;. he: היו %nb_accesses; כניסות, כולל %nb_accesses_to_welcome; כניסות לעמוד ×–×”, מ××– %start_date;. is: Það hafa verið %nb_accesses; heimsóknir, %nb_accesses_to_welcome; af þeim á þessa síðu, síðan %start_date;. it: Dal %start_date; ci sono stati %nb_accesses; accessi, %nb_accesses_to_welcome; dei quali a questa pagina. lv: KopÅ¡ %D datu bÄze ir apmeklÄ“ta %nb_accesses; reizes, %nb_accesses_to_welcome; no tiem ir bijuÅ¡i Å¡inÄ« lappusÄ“. nl: Deze paginas zijn sinds %start_date; reeds %nb_accesses; maal bezocht, waaronder %nb_accesses_to_welcome; maal deze verwelkomingspagina. no: Det har vært %nb_accesses; aksesser, %nb_accesses_to_welcome; av dem til denne siden, siden %start_date;. pl: Baza zostaÅ‚a od %start_date; odwiedzona %nb_accesses; razy (w tym %nb_accesses_to_welcome; razy strona tytuÅ‚owa). pt: Houve %nb_accesses; consultas, das quais %nb_accesses_to_welcome; foram a esta página, desde %start_date;. ro: Au avut loc %nb_accesses; accese din care %nb_accesses_to_welcome; pe aceatsa pagina din %start_date; ru: Ð’Ñего было %nb_accesses; обращений, из них %nb_accesses_to_welcome; к Ñтой Ñтранице, Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ %start_date;. sl: %nb_accesses; dostopov, %nb_accesses_to_welcome; od teh na to stran, od %start_date;. sv: Det har varit %nb_accesses; Ã¥tkomster, %nb_accesses_to_welcome; av dem till den här sidan, sedan %start_date;. zh: å·²ç»æœ‰ %nb_accesses; 次访问数æ®åº“,其中 %nb_accesses_to_welcome; 次访问本主页, 自从 %start_date;。 ])%nl;
%apply;interp([ af: Indien u browser nie die bladsye outomaties byvoeg nie (wat u dwing om die dokument te herlaai), probeer die volgende link. bg: Ðко ВашиÑÑ‚ браузър не актуализира автоматично Ñтраниците, които Ñа модифицирани (принуждавайки Ви да ги презареждате Вие), опитайте Ñе да тръгнете от тази препратка. br: Ma ne nevesa ket ho merdeer ent-gefreek ar pajennoù kemmet (ha dre-se emañ ret deoc'h "nevesaat ar bajenn"), klakit merdeiñ gant al liamm-mañ. ca: Si el vostre navegador no actualitza automàticament les pàgines modificades (obligant-vos a fer actualitzar manualment la pàgina), proveu de navegar des d'aquest altre lloc. cs: Pokud Váš prohlížeÄ neprovádí automaticky obnovu upravených stránek (musíte používat tlaÄítko "obnovit"), zkuste prohlížení pÅ™es tento odkaz. da: Hvis din browser ikke automatisk opdaterer ændrede sider (nødvendiggør genindlæsning af det aktuelle dokument), prøv da at navigere herfra. de: Wenn die geänderten Seiten nicht automatisch aktualisiert werden (man muß ständig im Browser auf "Neu laden" klicken), bitte hier klicken. en: If your browser does not automatically update the modified pages (forcing you to do "reload current document"), try navigating from this link. eo: Se via navigisto ne aÅ­tomate Äisdatigas la modifigitajn paÄojn (se vi devas fari "reÅarÄi kurantan dokumenton"), provu ekde ĉi tiu legilo. es: Si las páginas modificadas no serán actualizadas automaticamente, favor de usar esta conexión: hier. et: Kui Su veebibrauser ei uuenda modifitseeritud lehekülgi automaatselt (pead andma käsu "lae käesolev dokument uuesti"), siis proovi alustada navigeerimist sellest viitest. fi: Mikäli selaimesi ei automaattisesti päivitä muutettuja sivuja (jolloin sinun täytyy "ladata uudelleen nykyinen dokumentti") kokeile tätä linkkiä. fr: Si votre navigateur ne met pas à jour automatiquement les pages modifiées (vous obligeant à faire "actualiser la page"), essayez la navigation à partir de ce lien. is: Ef vafrinn sem þú notar er í vandræðum með að uppfæra síðuna prófaðu þetta. it: Se il vostro navigatore non aggiorna automaticamente le pagine modificate (obbligandovi a fare « aggiorna »), provate a partire da questo collegamento. lv: Ja JÅ«su Interneta caurlÅ«kprogramma automÄtiski nepÄrlÄdÄ“ lappuses pÄ“c veiktajÄm izmaiņÄm (tÄdÄ“jÄdi radot Jums nepiecieÅ¡amÄ«bu "pÄrlÄdÄ“t tekoÅ¡o dokumentu"), tad pamēģiniet uzklikšķinÄt Å¡eit. nl: Indien Uw browser de gewijzigde pagina's niet automatisch toont (maar dit alleen doet na klikken op "Vernieuwen"), probeer het dan eens via deze link. no: Hvis din browser ikke automatisk oppdaterer endrede sider (krever oppfrisking av den aktuelle siden), prøv da Ã¥ navigere herfra. pl: Jeżeli twoja przeglÄ…darka nie odÅ›wieża automatycznie zmienionych stron (zmuszajÄ…c ciÄ™ do ich rÄ™cznego odÅ›wieżania), kliknij tutaj. pt: Se o seu browser não actualiza automaticamente as páginas modificadas (forçando a fazer "reload current document"), tente navegar desde este link. pt-br: Se o seu browser não atualiza automaticamente as páginas modificadas (forçando a fazer "reload current document"), tente navegar desde este link. ro: daca pagina modificata nu este actualizata in mod automat (trebue sa fortezi "reload current document") navigeaza cu acest link sl: ÄŒe vaÅ¡ brskalnik ne more obnavljati strani avtomatiÄno (morate "reload current document"), kliknite tukaj. sv: Om din webbläsare inte automatiskt uppdaterar de modifierade sidorna (vilket tvingar dig att uppdatera sidan hela tiden), försök dÃ¥ att navigera härifrÃ¥n. ])%nl;
%copyright; %base_trailer; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templ502/perso.txt0000660000175200017530000003151312664543647025033 0ustar guillaumeguillaume%doctype; %nn; %if;has_public_name; %if;has_qualifiers;%public_name; %qualifier; %else;%public_name; %surname;%end; %else; %if;has_qualifiers;%first_name; %qualifier; %else;%first_name; %surname;%end; %end; %base_header; %message_to_wizard; %if;(is_male or is_female or bvar.show_invisible = "on" and wizard and is_invisible)
%nn; %if;is_male; [M/F]0%nn; %elseif;is_female; [M/F]1%nn; %end; %if;(bvar.show_invisible = "on" and wizard and is_invisible) (x)%end;
%end; %if;not cancel_links;
%if;(referer != "") << %end;
%end;

%if;has_public_name; %if;has_qualifiers;%public_name; %qualifier; %else;%public_name; %surname;%end; %else; %if;has_qualifiers;%first_name; %qualifier; %else; %if;cancel_links;%first_name; %surname; %else; %first_name; %surname; %end; %end; %end;

%if;(has_sosa or has_qualifiers or has_aliases or has_nobility_titles or has_public_name or has_surnames_aliases or has_first_names_aliases or has_linked_page.HEAD)
%if;has_sosa; [*Sosa]: %if;cancel_links;%sosa; %else;%sosa;%end; %end; %foreach;qualifier; %if;not is_first; %if;has_public_name;%public_name; %qualifier; %else;%first_name; %qualifier;%end; %end; %end; %foreach;alias; %alias; %end; %if;has_nobility_titles; %foreach;nobility_title; %if;not is_first;, %end; %nobility_title; %end; %end; %if;has_linked_page.HEAD;%linked_page.HEAD;%end; %if;(has_public_name or has_qualifiers) (%if;cancel_links;%first_name; %surname; %else; %first_name; %surname;%nn; %end;) %end; %foreach;surname_alias; (%first_name; %surname_alias;) %end; %foreach;first_name_alias; (%first_name_alias; %surname;) %end;

%end; %if;has_image; %end; %if;(has_occupation or has_birth_date or has_birth_place or has_baptism_date or has_baptism_place or is_dead or is_buried or is_cremated or has_consanguinity or has_linked_page.OCCU) %if;has_image;
[image/images]0%end;
    %if;has_occupation;
  • %apply;capitalize(occupation)
  • %nl;%end; %if;has_linked_page.OCCU;
  • %apply;capitalize(linked_page.OCCU)
  • %end; %if;has_birth_date;
  • %apply;capitalize(nth([born],sex)) %on_birth_date; %if;birthday; ([happy birthday to you!])%end; %if;has_birth_place; - %birth_place;%end;
  • %else; %if;has_birth_place;
  • %apply;capitalize(nth([born],sex)) - %birth_place;
  • %end; %end; %if;has_baptism_date;
  • %apply;capitalize(nth([baptized],sex)) %on_baptism_date; %if;has_baptism_place; - %baptism_place;%end;
  • %else; %if;has_baptism_place;
  • %apply;capitalize(nth([baptized],sex)) - %baptism_place;
  • %end; %end; %if;is_dead;
  • %apply;capitalize(died) %if;has_death_date; %on_death_date;%end; %if;has_death_place; - %death_place;%end; %if;has_linked_page.DEATH; %linked_page.DEATH;%end;
  • %end; %if;computable_age;
  • [*age]: %age;
  • %end; %if;computable_death_age;
  • [*age at death:] %death_age;
  • %nl; %end; %if;is_buried;
  • %apply;capitalize(nth([buried],sex)) %if;has_burial_date; %on_burial_date;%end; %if;has_burial_place; - %burial_place;%end;
  • %end; %if;is_cremated;
  • %apply;capitalize(nth([cremated],sex)) %if;has_cremation_date; %on_cremation_date;%end; %if;has_cremation_place; - %cremation_place;%end;
  • %end; %if;(has_consanguinity and (bvar.show_consang != "no" or manitou))
  • [*consanguinity]: %consanguinity;
  • %nl; %end;
%end; %if;has_image;
%end; %if;has_parents;

[*parents]

    %foreach;parent;
  • %if;(cancel_links or parent.is_restricted)%parent; %else;%parent;%end; %parent.title;%parent.dates;
  • %nl; %end;
%end; %define;married_to(date_place) %if;is_male; %if;are_married;[*married%t to:::date_place]0 %elseif;are_not_married;[*relationship%t to:::date_place]0 %elseif;are_engaged;[*engaged%t to:::date_place]0 %elseif;is_no_sexes_check;[*relationship%t to:::date_place]0 %elseif;is_no_mention;date_place [with] %end; %else; %if;are_married;[*married%t to:::date_place]1 %elseif;are_not_married;[*relationship%t to:::date_place]1 %elseif;are_engaged;[*engaged%t to:::date_place]1 %elseif;is_no_sexes_check;[*relationship%t to:::date_place]1 %elseif;is_no_mention;date_place [with] %end; %end; %end; %define;witness_relation(xxx, yyy) [*witness at marriage of %s and %s:::xxx:yyy] %end; %if;has_families;

[*marriage/marriages]1 [and::child/children]1

    %foreach;family;
  • %apply;married_to%with; %if;(marriage_place = "") %if;(on_marriage_date = "") %else; %on_marriage_date;%end; %else; %if;(on_marriage_date = ""), %marriage_place;, %else; %on_marriage_date;, %marriage_place, %end; %end; %end; %if;(cancel_links or spouse.is_restricted)%spouse; %else;%spouse;%end; %spouse.title;%spouse.dates; %if;has_witnesses; %sp;([witness/witnesses]w: %foreach;witness; %if;not is_first;, %end; %if;(cancel_links or witness.is_restricted)%witness; %else;%witness;%end; %witness.title;%witness.dates; %end; )%end; %if;has_comment; (%comment;)%end; %if;are_divorced;, [divorced]0%divorce_date;%end; %if;are_separated;, [separated]0%end; %if;has_children; , [having as children]0
      %foreach;child;
    • %if;(cancel_links or child.is_restricted)%child.child_name; %else; %child.child_name;%nn; %end; %child.dates;
    • %nl; %end;
    %end; %if;(evar.opt = "from" and wizard)(%origin_file;)%nl;%end;
  • %end;
%end; %if;has_relations;

[*relation/relations]1

    %foreach;relation;
  • %apply;capitalize(relation_type) %if;(has_relation_him and has_relation_her) %nl;
    • %if;(cancel_links or relation_him.is_restricted)%relation_him; %else;%relation_him;%end; %relation_him.title;%relation_him.dates;
    • %nl;
    • %if;(cancel_links or relation_her.is_restricted)%relation_her; %else;%relation_her;%end; %relation_her.title;%relation_her.dates;
    • %nl;
    %elseif;has_relation_him;: %if;(cancel_links or relation_him.is_restricted)%relation_him; %else;%relation_him;%end; %relation_him.title;%relation_him.dates;%nl; %elseif;has_relation_her;: %if;(cancel_links or relation_her.is_restricted)%relation_her; %else;%relation_her;%end; %relation_her.title;%relation_her.dates;%nl; %end;
  • %end; %foreach;related;
  • %apply;capitalize(related_type): %if;cancel_links;%related; %else;%related;%end; %related.title;%related.dates;
  • %nl; %end; %foreach;witness_relation;
  • %nn; %apply;witness_relation%with; %if;cancel_links;%witness_relation.father; %else%witness_relation.father;%end; %witness_relation.father.title;%witness_relation.father.dates; %and; %if;cancel_links;%witness_relation.mother; %else%witness_relation.mother;%end; %witness_relation.mother.title;%witness_relation.mother.dates; %end;
  • %nl; %end;
%end; %if;(not cancel_links and has_linked_pages)
([linked pages])
%end; %if;(has_notes or has_linked_page.BNOTE or has_linked_page.NOTE)

[*note/notes]1

%if;(has_linked_page.BNOTE)

%apply;capitalize(linked_page.BNOTE).

%end; %notes; %if;(has_linked_page.NOTE)

%apply;capitalize(linked_page.NOTE).

%end;
%end; %if;has_sources;

[*source/sources]1: %foreach;source; - %source_type;: %source; %end;

%end; %if;not cancel_links; %if;wizard; %end;
[*relationship computing] (R) [*update] (U)
%end; %if;(evar.opt = "misc")%misc_names;

%end;

...
%copyright; %base_trailer; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templ502/forum.txt0000660000175200017530000002657312664543647025045 0ustar guillaumeguillaume%doctype; %nn; %if;(evar.m = "FORUM_ADD" or evar.m = "FORUM_ADD_OK")%nn; %if;can_post; [*add::message/previous message/previous messages/next message]0%nn; %else; [*incorrect request]%nn; %end; %elseif;(pos = "")[*database forum]%nn; %elseif;(message.subject = "" or message.subject = "-") [*database forum]%nn; %else; %message.subject.cut.50;%nn; %end; %base_header; %message_to_wizard; %if;not cancel_links;
%if;(referer != "") << %end;
%end; %define;search_form(main)

%hidden; %if;("main" != "true") %end;

%end; %if;(evar.m = "FORUM_ADD") %( add a message %) %if;can_post;

%nn; [*add::message/previous message/previous messages/next message]0%nn;

%hidden;

[*ident/email/subject]0
[*ident/email/subject]1 ([optional])
[*ident/email/subject]2 ([optional])

[*message/previous message/previous messages/next message]0
%let;name;Text%in; %include.accent;
%if;is_moderated_forum; ([this forum is moderated]) %end;

%else;

%nn; [*incorrect request]

%end; %elseif;(evar.m = "FORUM_ADD_OK") %( visualize a message before post %) %if;can_post;

%nn; [*add::message/previous message/previous messages/next message]0%nn;

%if;(message.ident != "" and message.text != "") %message.ident; %if;(message.email != "")%nn; %message.email;%end; %if;(message.subject != "") [*ident/email/subject]2: %message.subject; %end; %if;(message.access = "priv") [*access]: [private] %end; %message.time;
%message.text.wiki;
%end;

%hidden;

[*ident/email/subject]0
[*ident/email/subject]1 ([optional])
[*ident/email/subject]2 ([optional])

[*message/previous message/previous messages/next message]0
%sq;
%let;name;Text%in; %include.accent;
%if;(message.ident != "" and message.text != "") %if;(wizard or friend) %else; %end; %end; %if;is_moderated_forum; ([this forum is moderated]) %end;

%else;

%nn; [*incorrect request]

%end; %elseif;(pos != "") %( display a message %) %if;(evar.m = "FORUM_SEARCH") %apply;search_form("false") %end; %let;col;%if;message.is_waiting; style="color:red"%end;%in; %if;message.is_waiting;

%if;is_moderator;

%hidden;

%else; [*your message is waiting for validation]%nn; %end;

%end; %if;(evar.m != "FORUM_VIEW")
([view source])
%end; %message.ident; %if;(message.email != "")%nn; %message.email; %end; %if;supervisor; -%sp; %if;(message.wizard != "") [wizard/wizards/friend/friends/exterior]0:%sp; %sq; %message.wizard;%sp; %end; %if;(message.friend != "") [wizard/wizards/friend/friends/exterior]2: %message.friend;%sp; %end; ... %message.from; %end; %if;(message.subject != "") [*ident/email/subject]2: %message.subject; %end; %if;(message.access = "priv") [*access]: [private] %end; %message.time;

%if;(evar.m = "FORUM_VIEW") %elseif;(message.wiki = "on")%message.text.wiki; %else;%message.text.nowiki;%end;
%if;(message.wizard != "" and wizard and user.ident = message.wizard or manitou or supervisor)

%hidden;

%end; %else; %( display message headers %)

[*database forum]

%apply;search_form("true") %if;can_post;

%hidden;

%end; %let;len;%if;(evar.len != "")%evar.len;%else;100%end;%in; %let;to;%if;(evar.to != "")%evar.to;%else;-1%end;%in; %foreach;message(to, len) %let;col;%if;message.is_waiting; style="color:red"%end;%in; %if;(message.date != message.prev_date) %if;(message.prev_date != "" and message.date.month != message.prev_date.month) %end; %end; %end; %if;(pos != "") %end;
 
%message.date;
 %if;(message.access = "priv")*%else; %end;   %message.hour; %message.ident.cut.26; %nn; %if;(message.subject = "" or message.subject = "-") ... %message.text.cut.80;%nn; %else; %message.subject.cut.80;%nn; %end;
 
%nn; [message/previous message/previous messages/next message]2
%end;
...
%copyright; %base_trailer; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templ502/cousmenu.txt0000660000175200017530000000640712664543647025545 0ustar guillaumeguillaume%doctype; %nn; %apply;a_of_b_gr_eq_lev%with; [*cousins (general term)]%nn; %and; %if;(public_name != "")%public_name;%else;%first_name;%end; %if;(qualifier != "") %qualifier;%end; %sp;%surname; %end; %base_header; %message_to_wizard;

%nn; %apply;a_of_b_gr_eq_lev%with; [*cousins (general term)]%nn; %and; %if;(public_name != "")%public_name;%else;%first_name;%end; %if;(qualifier != "") %qualifier;%end; %sp;%surname; %if;(alias != "") (%alias;)%end; %end;

%define;nth_cousins(xx) [*%s cousins:::xx]%nn; %end; %if;not cancel_links;
%if;(referer != "") << %end;
%end;
  • %hidden; %if;access_by_key; %if;(occ != "0") %end; %else %end;

  • [*uncles and aunts]
  • %if;has_nephews_or_nieces;
  • [*nephews and nieces]
  • %end;
%if;(died = "" and (wizard or friend)) %end;
...
%copyright; %base_trailer; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templ502/random_css.txt0000660000175200017530000000633112664543647026033 0ustar guillaumeguillaume/* $Id: random_css.txt,v 1.10 2007-01-19 01:53:16 ddr Exp $ */ /* Copyright (c) 2006-2007 INRIA */ %define;bright_pastel_color() %let;h;%random.255;%in; %let;s;%random.64;%in; %let;v;%expr(192 + random.64)%in; rgb(%apply;red_of_hsv(h, s, v),%apply;green_of_hsv(h, s, v),%sq; %apply;blue_of_hsv(h, s, v))%sq; %end; %define;dark_col() %let;h;%random.255;%in; %let;s;255%in; %let;v;160%in; rgb(%apply;red_of_hsv(h, s, v),%apply;green_of_hsv(h, s, v),%sq; %apply;blue_of_hsv(h, s, v))%sq; %end; %random.init; %let;h;%random.255;%in; %let;s;%random.128;%in; %let;v;%expr(160 + random.96)%in; %let;bg; rgb(%apply;red_of_hsv(h, s, v),%apply;green_of_hsv(h, s, v),%sq; %apply;blue_of_hsv(h, s, v))%sq; %in; %let;h;%expr(h - 40 + random.80)%in; %let;v;%expr(v + 10 + random.20)%in; %let;bg2; rgb(%apply;red_of_hsv(h, s, v),%apply;green_of_hsv(h, s, v),%sq; %apply;blue_of_hsv(h, s, v))%sq; %in; #user-info { float: %right;; padding: 10px } %let;fs;%random.3;%in; %let;ph;%random.3;%in; %let;pv;%random.3;%in; #title { text-align: %sq; %if;(ph = 0)%left;%elseif;(ph = 1)%right;%else;center%end;;%sp; vertical-align: %sq; %if;(ph != 1 and pv = 0)top%sq; %elseif;(pv = 1)bottom%sq; %else;middle%end } #title { %sq; font-family:%sp; %let;f;%random.8;%in; %if;(f = 0)Times New Roman, serif%sq; %elseif;(f = 1)Trebuchet MS, sans-serif%sq; %elseif;(f = 2)Arial, Helvetica, sans-serif%sq; %elseif;(f = 3)Verdana, Arial, Helvetica, sans-serif%sq; %elseif;(f = 4)Courier New, Courier, monospace%sq; %elseif;(f = 5)Georgia, serif%sq; %elseif;(f = 6)Tahoma, sans-serif%sq; %elseif;(f = 7)Palatino, serif%sq; %end;;%sp; font-style: %if;(random.4 = 0)italic%else;normal%end; } #title { %sq; font-variant: %if;(random.5 = 0)small-caps%else;normal%end;;%sp; font-transform: %if;(random.10 = 0)uppercase%else;none%end;;%sp; font-weight: %if;(random.3 = 0)bold%else;normal%end; } #title { color: %apply;dark_col(); font-size: %expr;(80 + random.80)%% } body { margin: 0; background: %bg2;; color: %apply;dark_col() } :link { color: %apply;dark_col() } :visited { color: %apply;dark_col() } body {%sp; font-family:%sp; %let;f;%random.8;%in; %if;(f = 0)Times New Roman, serif%sq; %elseif;(f = 1)Trebuchet MS, sans-serif%sq; %elseif;(f = 2)Arial, Helvetica, sans-serif%sq; %elseif;(f = 3)Verdana, Arial, Helvetica, sans-serif%sq; %elseif;(f = 4)Courier New, Courier, monospace%sq; %elseif;(f = 5)Georgia, serif%sq; %elseif;(f = 6)Tahoma, sans-serif%sq; %elseif;(f = 7)Palatino, serif%sq; %end; } %let;pos1;%if;(random.2 = 0)%left;%else;%right;%end;%in; %let;pos2;%if;(random.2 = 0)%left;%else;%right;%end;%in; %let;sz;%if;(random.2 = 0)100%else;70%end;%in; #lang .title { display : none } #lang { width: 12%%; float: %pos1;; text-align: %pos2;; background: %bg; } #lang { padding: 30px 10px 10%% 10px } #lang a { display: block; font-size: %sz;%% } #lang a { text-decoration: none } #lang a:hover { text-decoration: underline } #lang .item img { display: none } #content { margin-%pos1;: 12%%; width: auto;%sp; font-size: %expr(90 + random.30)%% } #content .subtitle { text-align: center } /* end random_css */ geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templ502/stats.txt0000660000175200017530000000433112664543647025037 0ustar guillaumeguillaume%doctype; [*statistics] %base_header; %message_to_wizard; %if;not cancel_links;
%if;(referer != "") << %end;
%end;

[*statistics]

%define;births(nnn)[the latest %d births:::nnn]%end; %define;deaths(nnn)[the latest %t deaths:::nnn]%end; %define;marriages(nnn)[the latest %d marriages:::nnn]%end; %define;engaged(nnn) [the %d oldest couples perhaps still alive and engaged:::nnn]%nn; %end; %define;alive(nnn)[the %d oldest perhaps still alive:::nnn]%end; %define;lived(nnn)[the %d who lived the longest:::nnn]%end; %let;n;%if;(bvar.latest_event != "")%bvar.latest_event;%else;20%end;%in; %if;(wizard or friend) %end;
...
%copyright; %base_trailer; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templ502/renamed.txt0000660000175200017530000000140712664543647025315 0ustar guillaumeguillaume %o -> %e

%o -> %e

The database "%o" has been renamed "%e". Please use now:
La base de données "%o" est renommée "%e". Utiliser maintenant:
La base di dati "%o" ha cambiato nome "%e". Utilizzate:

GeneWeb


Copyright (c) 1998-2007 INRIA - GeneWeb %v
geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templ502/calendar.txt0000660000175200017530000001312612664543647025454 0ustar guillaumeguillaume%doctype; [*calendar/calendars]1 %base_header; %message_to_wizard; %if;not cancel_links;
%if;(referer != "") << %end;
%end;

[*calendar/calendars]1

%define;fun_day(ccc, nnn) %end; %define;fun_month(ccc, nnn, vvv, lll) %end; %define;fun_year(ccc, nnn) %end; %define;fun_julian_year(ccc, nnn) %let;year; %if;(date.julian.month < 3 or date.julian.month = 3 and date.julian.day < 25) %expr(date.nnn.year - 1)/%expr(date.nnn.year % 10) %else;%date.nnn.year;%end; %in; %end; %define;calendar(ccc, nnn, vvv, lll, fun_yyy) %if;([ !dates order] = "ddmmyy" or [ !dates order]0 = "ddmmyyyy" or [ !dates order]0 = "dmyyyy") %apply;fun_day("ccc", "nnn") %apply;fun_month("ccc", "nnn", "vvv", "lll") %apply;fun_yyy("ccc", "nnn") %elseif;([ !dates order] = "mmddyyyy") %apply;fun_month("ccc", "nnn", "vvv", "lll") %apply;fun_day("ccc", "nnn") %apply;fun_yyy("ccc", "nnn") %else; %apply;fun_yyy("ccc", "nnn") %apply;fun_month("ccc", "nnn", "vvv", "lll") %apply;fun_day("ccc", "nnn") %end; %end;
- %apply;capitalize%with;%apply;nth([(week day)], date.week_day)%end; - %if;(date.julian_day = today.julian_day)%time;%end;
 

%hidden;

%if;([ !dates order] = "ddmmyy" or [ !dates order]0 = "ddmmyyyy" or [ !dates order]0 = "dmyyyy") %elseif;([ !dates order] = "mmddyyyy") %else; %end; %apply;calendar("g", "gregorian", 12, [(month)], "year") %apply;calendar("j", "julian", 12, [(month)], "julian_year") %apply;calendar("f", "french", 13, [(french revolution month)], "year") %apply;calendar("h", "hebrew", 13, [(hebrew month)], "year")
 [*year/month/day]2 [*year/month/day]1 [*year/month/day]0[*year/month/day]1 [*year/month/day]2 [*year/month/day]0[*year/month/day]0 [*year/month/day]1 [*year/month/day]2 
[*gregorian/julian/french/hebrew]0
[*gregorian/julian/french/hebrew]1
[*gregorian/julian/french/hebrew]2
[*gregorian/julian/french/hebrew]3
%if;(date.moon_phase.index != 0) %apply;capitalize%with; %apply;nth([moon age/new moon/first quarter/full moon/last quarter], date.moon_phase.index) -%sp; %date.moon_phase.hour;:%date.moon_phase.minute; UT %end; %end; (%nn; [moon age/new moon/first quarter/full moon/last quarter]0%sp; = %date.moon_age;) [*julian day]:%sp; %if;(date.julian_day < 1000)%date.julian_day; %else;%date.julian_day.sep1000;%end;
...
%copyright; %base_trailer; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templ502/updind.txt0000660000175200017530000005676212664543647025203 0ustar guillaumeguillaume%doctype; %nn; %if;(evar_m = "MRG_IND_OK" or evar_m = "MRG_MOD_IND_OK") [*merge::person/persons]1 # %index; %elseif;(evar_m = "MOD_IND" or evar_m = "MOD_IND_OK") [*modify::person/persons]0 # %index; %else;[*add::person/persons]0%end; %base_header; %message_to_wizard; %define;date(xlab,xvar,xdt,xcond)
xlab %if;([ !dates order]0 = "ddmmyy" or [ !dates order]0 = "ddmmyyyy" or [ !dates order]0 = "dmyyyy") %elseif;([ !dates order]0 = "mmddyyyy") %else; %end; ...
[*calendar/calendars]0 [*precision]0
%end; %define;source(xx)
%end;

%nn; %if;(evar_m = "MRG_IND_OK" or evar_m = "MRG_MOD_IND_OK") [*merge::person/persons]1 # %index; %elseif;(evar_m = "MOD_IND" or evar_m = "MOD_IND_OK") [*modify::person/persons]0 # %index; %else; [*add::person/persons]0%end;

%hidden; %if;(evar_m = "MRG_IND_OK" or evar_m = "MRG_MOD_IND_OK") %if;(evar_i2 != "") %end; %if;(evar_ini1 != "" and evar_ini2 != "") %end; %if;(evar.iexcl != "" or evar.fexcl != "") %if;(evar.iexcl != "") %end; %if;(evar.fexcl != "") %end; %end; %elseif;(evar_m = "MOD_IND" or evar_m = "MOD_IND_OK") %else; %end;

[*sex] ?

%if;has_qualifiers; %foreach;qualifier; %end; %elseif;(bvar.propose_qualifier != "no") %end; %if;has_aliases; %foreach;alias; %end; %elseif;(bvar.propose_alias != "no") %end; %if;has_first_names_aliases; %foreach;first_name_alias; %end; %else; %end; %if;has_surnames_aliases; %foreach;surname_alias; %end; %else; %end;
[*insert::first name alias]%nn;
[*surname alias]0 [*insert::surname alias]

[*birth]

[*born]2...
%apply;date([*date/dates]0, "birth", "birth", "") %apply;source("birth")

[*baptized]2...
%apply;date([*date/dates]0, "bapt", "bapt", "") %apply;source("bapt")

[*death]

%apply;date([*date/dates]0, "death", "death", " onfocus='setDead()'")
%apply;source("death")

[*burial]

%apply;date([*date/dates]0, "burial", "burial", "") %apply;source("burial")

[*relation/relations]1

%define;insert_relation(xx)
%end; %define;relation_type(xx)
%end; %define;one_relation(xcnt,xvar,xrel,xsex)
([sex]0 = xsex)
%end; %apply;insert_relation("0")

%if;has_relations; %foreach;relation; %apply;relation_type(cnt)

%apply;one_relation(cnt,"fath","r_father",[M/F]0) %apply;one_relation(cnt,"moth","r_mother",[M/F]1)

%apply;insert_relation(cnt)

%end; %else; %apply;relation_type("1")

%apply;one_relation("1","fath","r_father",[M/F]0) %apply;one_relation("1","moth","r_mother",[M/F]1)

%apply;insert_relation("1")

%end;

[*title/titles]1

%define;insert_title(xx)
%end; %define;one_title(xcnt)
%apply;date([*begin]0, "t_date_startxcnt", "title_date_start", "") %apply;date([*end]0, "t_date_endxcnt", "title_date_end", "") %end %apply;insert_title("0")

%if;has_titles; %foreach;title; %apply;one_title(cnt)

%apply;insert_title(cnt)

%end; %else; %apply;one_title("1")

%apply;insert_title("1")

%end;
[*access]0

%sq;
%let;name;notes%in; %include.accent;

...
%copyright; %base_trailer; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templ502/index.txt0000660000175200017530000000112512664543647025006 0ustar guillaumeguillaume Base

Base

  • =>

GeneWeb


Copyright (c) 1998-2007 INRIA - GeneWeb %v
geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templ502/anclist.txt0000660000175200017530000001102212664543647025331 0ustar guillaumeguillaume%doctype; %nn; %if;(evar.t = "F")- [*surnames list] -%nn; %else %apply;a_of_b%with; %if;(evar.t = "M")[*missing ancestors]%else;[*ancestors]%end; %and; %if;(public_name != "")%public_name;%else;%first_name;%end; %if;(qualifier != "") %qualifier;%end; %sp;%surname; %end; %end; %base_header; %message_to_wizard;

%nn; %if;(evar.t = "F") %if;(public_name != "")%public_name;%else;%first_name;%end; %if;(qualifier != "") %qualifier;%end; %sp;%surname; %if;(alias != "") (%alias;)%end; - [*surnames list] - %else; %apply;a_of_b%with;[*ancestors]%and; %if;(public_name != "")%public_name;%else;%first_name;%end; %if;(qualifier != "") %qualifier;%end; %sp;%surname; %if;(alias != "") (%alias;)%end; %end; %if;(evar.t = "D") [up to] %pvar.1;%end; %end;

%if;(evar.cgl != "on")
%if;(referer != "") << %end;
%end; %define;tothegen(xx) [*to the %s generation:::xx]%nn; %end; %define;togen(xx) %if;(xx = 1)[*specify::generation/generations]0%nn; %elseif;(xx = 2)[*to the parents]%nn; %elseif;(xx = 3)[*to the grandparents]%nn; %elseif;(xx = 4)[*to the great-grandparents]%nn; %else; %apply;tothegen%with; %apply;nth([nth (generation)], xx) %end; %end; %end; %define;ancestors_by_list(xx, nnn) %if;(xx.has_parents and nnn > 1)
  • %xx.father;%xx.father.title;%xx.father.dates;%nl; %apply;ancestors_by_list("xx.father", nnn - 1)
  • %xx.mother;%xx.mother.title;%xx.mother.dates;%nl; %apply;ancestors_by_list("xx.mother", nnn - 1)
%end; %end; %define;ancestors_horizontally(pp, xx, ss1, ss2, ss3) %if;(xx > 0) %if;(pp.has_parents) %apply;ancestors_horizontally( "pp.father", xx - 1, "ss1     ", "ss1 +-- ", "ss1 |   ") %end; ss2%pp;%pp.title;%pp.dates; %if;(pp.has_parents) %apply;ancestors_horizontally( "pp.mother", xx - 1, "ss3 |   ", "ss3 +-- ", "ss3     ") %end; %end; %end; %if;(evar.t = "L") %( by list %) %let;xx; %if;(bvar.max_anc_level = "")%apply;min(evar.v, max_anc_level, 7) %else;%apply;min(evar.v, max_anc_level, bvar.max_anc_level)%end; %in;

%apply;togen(xx).

%apply;ancestors_by_list("self", xx) %elseif;(evar.t = "H") %( horizontally %) %let;xx; %if;(bvar.max_anc_level = "")%apply;min(evar.v, max_anc_level, 7) %else;%apply;min(evar.v, max_anc_level, bvar.max_anc_level)%end; %in;

%apply;togen(xx).

%apply;ancestors_horizontally( "self", xx, "   ", "-- ", "   ")
%elseif;(evar.t = "F") %( surnames list %)
    %foreach;ancestor_surname(evar.v)
  • %nn; %if;(evar.cgl != "on")%nn; %ancestor.surname_end;%ancestor.surname_begin;%nn; %else;%ancestor.surname_end;%ancestor.surname_begin;%end; %if;(ancestor.nb_times > 1) (%ancestor.nb_times;)%end; ; %ancestor.place; ; %ancestor.date_begin.year;-%ancestor.date_end.year;
  • %end;
%end;
...
%copyright; %base_trailer; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templ502/perso_header.txt0000660000175200017530000000000012664543647026326 0ustar guillaumeguillaumegeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templ502/particles.txt0000660000175200017530000000012512664543647025664 0ustar guillaumeguillaumeaf_ av_ d' dal_ de_ des_ di_ du_ of_ van_de_ van_den_ van_ von_und_zu_ von_ zu_ zur_ geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templ502/copyr.txt0000660000175200017530000000136212664543647025036 0ustar guillaumeguillaume
%apply;interp([ de: Seite angezeigt von GeneWeb %version; en: Page displayed by GeneWeb %version; et: Kasutusel on GeneWeb %version; fr: Page affichée par GeneWeb %version; it: Pagina visualizzata da GeneWeb %version; sl: Strani ustvarjene z: GeneWeb %version; ])%compilation_time;%sp; Copyright © 1998-2007 INRIA%connections;%sq; %if;(not cancel_links) - DOC%end;%sq; %setup_link;
geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templ502/summary.txt0000660000175200017530000000246712664543647025406 0ustar guillaumeguillaume geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templ502/deslist.txt0000660000175200017530000001623612664543647025357 0ustar guillaumeguillaume%doctype; %nn; %apply;a_of_b_gr_eq_lev%with; [*descendants]%nn; %and; %if;(public_name != "")%public_name;%else;%first_name;%end; %if;(qualifier != "") %qualifier;%end; %sp;%surname; %end; %base_header; %message_to_wizard;

%nn; %apply;a_of_b_gr_eq_lev%with; [*descendants]%nn; %and; %if;(public_name != "")%public_name;%else;%first_name;%end; %if;(qualifier != "") %qualifier;%end; %sp;%surname; %if;(alias != "") (%alias;)%end; %end;

%if;not cancel_links;
%if;(referer != "") << %end;
%end; %define;tothegen(xx) [*to the %s generation:::xx]%nn; %end; %define;togen(xx) %if;(xx = 0)[*specify::generation/generations]0%nn; %elseif;(xx = 1)[*to the children]%nn; %elseif;(xx = 2)[*to the grandchildren]%nn; %elseif;(xx = 3)[*to the great-grandchildren]%nn; %else; %apply;tothegen%with; %apply;nth([nth (generation)], xx) %end; %end; %end; %define;link(xx) %if;(evar.cgl = "on")%xx;%else;%xx;%end; %xx.title;%xx.dates; %end; %define;somebody_long_info(xx) %if;xx.has_nobility_titles; %nn; %foreach;xx.nobility_title;, %nobility_title;%end; %nn; %end; %if;(xx.has_birth_date or xx.has_birth_place) , %if;xx.is_male;[born]0%elseif;xx.is_female;[born]1%else;[born]2%end; %if;xx.has_birth_date; %xx.on_birth_date;%end; %if;xx.has_birth_place;, %xx.birth_place;%end; %end; %if;(xx.has_baptism_date or xx.has_baptism_place) , %if;xx.is_male;[baptized]0%elseif;xx.is_female;[baptized]1%nn; %else;[baptized]2%end; %if;xx.has_baptism_date; %xx.on_baptism_date;%end; %if;xx.has_baptism_place;, %xx.baptism_place;%end; %end; %if;xx.is_dead;, %xx.died; %if;(xx.has_death_date) %xx.on_death_date;%end; %if;(xx.has_death_place), %xx.death_place;%end; %end; %if;xx.is_buried;, %if;xx.is_male;[buried]0%else;[buried]1%end; %if;xx.has_burial_date; %xx.on_burial_date;%end; %if;xx.has_burial_place;, %xx.burial_place;%end;%nl; %end; %if;xx.is_cremated;, %if;xx.is_male;[cremated]0%else;[cremated]1%end; %if;xx.has_cremation_date; %xx.on_cremation_date;%end; %if;xx.has_cremation_place;, %xx.cremation_place;%end;%nl; %end; %if;xx.computable_death_age;%sp; ([age at death:] %xx.death_age;)%nn; %end; %if;xx.has_occupation;, %xx.occupation;%end; %if;(evar.rel = "on" and xx.has_relations) %foreach;xx.relation;%nl; (%relation_type;: %if;has_relation_him;%apply;link(relation_him.var)%end;%nl; %if;has_relation_her;%apply;link(relation_her.var)%end;)%nn; %end; %foreach;xx.related;%nl; (%related_type;: %apply;link(related.var))%nn; %end; %end; %end; %define;married_to(is_male, date_place) %if;("is_male" = 1) %if;are_married;[married%t to:::date_place]0%nn; %elseif;are_not_married;[relationship%t to:::date_place]0%nn; %elseif;are_engaged;[engaged%t to:::date_place]0%nn; %elseif;is_no_sexes_check;[relationship%t to:::date_place]0%nn; %elseif;is_no_mention;date_place [with]%nn; %end; %else; %if;are_married;[married%t to:::date_place]1%nn; %elseif;are_not_married;[relationship%t to:::date_place]1%nn; %elseif;are_engaged;[engaged%t to:::date_place]1%nn; %elseif;is_no_sexes_check;[relationship%t to:::date_place]1%nn; %elseif;is_no_mention;date_place [with]%nn; %end; %end; %end; %define;descendants_by_list(xx, yy, curlev, maxlev, famlev) %if;(curlev = 0)

%nl;%end; %if;(evar.cgl = "on" or xx.is_restricted)%yy;%else; %yy;%end;%nn; %apply;somebody_long_info("xx"). %incr_count; %apply;lazy_print%with;%nl;%end; %foreach;xx.family; %if;(family_cnt != 1 and curlev = 0)

%nl;%end; %lazy_force; %apply;capitalize%with; %apply;married_to%with; %xx.is_male; %and; %if;(on_marriage_date != "") %on_marriage_date;%end; %if;(marriage_place != ""), %marriage_place;,%end; %end; %end;%nl; %if;(evar.cgl = "on" or spouse.is_restricted)%spouse;%else; %spouse;%end;%nn; %apply;somebody_long_info("spouse") %if;(evar.witn = "on" and has_witnesses)%nl;([witness/witnesses]1: %foreach;witness; %if;(not is_first),%nl;%end; %apply;link(witness.var) %end;)%sq; %end; %if;(evar.comm = "on" and has_comment)%nl;(%comment;)%end; %if;are_divorced;, [divorced]%end; %if;(curlev < maxlev) %if;(curlev = 0 or evar.t = "M" and xx.is_male or evar.t = "F" and xx.is_female or evar.t = "L") %if;(family.desc_level < famlev) , [see further]. %apply;lazy_print%with;%nl;%end; %elseif;(family.desc_level > famlev) , [see above]. %apply;lazy_print%with;%nl;%end; %elseif;has_children;, [having as children] %family.set_infinite_desc_level; %if;(curlev = 0)

%nl;%end;
    %foreach;child;
  • %if;(evar.alwsurn = "yes") %apply;descendants_by_list("child", "child", curlev+1, maxlev, famlev+1) %else; %apply;descendants_by_list("child", "child_name", curlev+1, maxlev, famlev+1) %end;
  • %end;
%apply;lazy_print%with;%end; %else; %if;(curlev = 0)%nl;

%nl; %else;%apply;lazy_print%with;%nl;%end; %end;. %end; %elseif;has_children;, ... %else;. %end; %else;.%nl; %apply;lazy_print%with;%nl;%end; %end; %end; %end; %define;by_list(xx)

%apply;togen(xx).

%reset_count; %apply;descendants_by_list("self", "self", 0, xx, 0)%nl;

[*total]: %expr(count-1) [[person/persons]1@(c)]%sp; ([spouses not included]).

%end; %apply;by_list%with; %if;(bvar.max_desc_level = "")%apply;min(evar.v, max_desc_level, 12) %else;%apply;min(evar.v, max_desc_level, bvar.max_desc_level)%end; %end;
...
%copyright; %base_trailer; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templ502/anctree.txt0000660000175200017530000001263012664543647025323 0ustar guillaumeguillaume%if;(evar.t = "T")%doctype_transitional;%else;%doctype;%end; %nn; %if;(evar.t = "A")[*male line/female line]0%nn; %elseif;(evar.t = "C")[*male line/female line]1%nn; %else[*tree]%end; %if;(evar.t = "A" or evar.t = "C"):%sp; %if;(public_name != "")%public_name;%else;%first_name;%end; %if;(qualifier != "") %qualifier;%end; %surname; %end; %base_header; %message_to_wizard; %define;a_tree_line() %if;(not is_first) %foreach;cell; %if;(not is_first)   %end; %nn; %if;(cell.is_empty or cell.is_top) %else;|%end; %end; %end; %foreach;cell; %if;(not is_first)   %end; %nn; %if;(cell.is_empty) %nn; %else; %if;(evar.bd != "" and evar.bd > 0 or evar.color != "")%nl;
%nn; %end; %if;(evar.cgl = "on")%cell.person; %else; %cell.person;%nn; %end; %cell.person.title;%cell.person.dates; %if;(evar.bd != "" and evar.bd > 0 or evar.color != "")
%end; %if;(evar.image = "on" and cell.person.has_image) %nl;
%nn; %if;(evar.cgl != "on")%end; %nn; %if;(evar.cgl != "on")%end;
%end; %end; %end; %if;(not is_last) %foreach;cell; %if;(not is_first) %nn; %if;cell.is_right; %if;(evar.marriage = "on" and cell.family.marriage_date.year != "") %nn; - %cell.family.marriage_date.year; - %else; %end; %else; %end; %end; %nn; %if;cell.is_empty; %nn; %elseif;(evar.cgl = "on")|%nn; %else; |%nn; %end; %end; %foreach;cell; %if;(not is_first) %nn; %if;(cell.is_right)
%nn; %else; %end; %end; %nn; %if;cell.is_empty; %nn; %elseif;cell.is_left;
%nn; %elseif;cell.is_right;
%nn; %else;|%end; %end; %end; %end; %define;male_line(xx, nn) %if;(nn > 0) %if;(xx.has_parents)%apply;male_line("xx.father", nn - 1)%end; %xx;%xx.title;%xx.dates; %if;("xx" != "self")|%end; %end;%nl; %end; %define;female_line(xx, nn) %if;(nn > 0) %if;(xx.has_parents)%apply;female_line("xx.mother", nn - 1)%end; %xx;%xx.title;%xx.dates; %if;("xx" != "self")|%end; %end;%nl; %end; %if;(evar.t = "T")%nn;
%nn; //
%end; %define;tree(xx) %foreach;ancestor_tree_line(xx) %apply;a_tree_line() %end;
%end; %if;(evar.t = "T") %apply;tree%with; %if;(bvar.max_anc_tree = "")%apply;min(evar.v, max_anc_level, 7) %else;%apply;min(evar.v, max_anc_level, bvar.max_anc_tree)%end; %end; %elseif;(evar.t = "A")
%apply;male_line("self", evar.v)
%elseif;(evar.t = "C")
%apply;female_line("self", evar.v)
%end;
...
%copyright; %base_trailer; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templ502/ancsosa.txt0000660000175200017530000006251012664543647025333 0ustar guillaumeguillaume%doctype; %nn; %if;(evar.t = "D") [*ancestors] ... [up to] ...%nn; %elseif;(evar.t = "N" and evar.only = "on") [*generation/generations]0 %evar.v; %else; %apply;a_of_b%with; %if;(evar.t = "M")[*missing ancestors]%else;[*ancestors]%end; %and; %if;(public_name != "")%public_name;%else;%first_name;%end; %if;(qualifier != "") %qualifier;%end; %sp;%surname; %end; %end; %base_header; %message_to_wizard;

%nn; %apply;a_of_b%with; %if;(evar.t = "M")[*missing ancestors]%else;[*ancestors]%end; %and; %if;(public_name != "")%public_name;%else;%first_name;%end; %if;(qualifier != "") %qualifier;%end; %sp;%surname; %if;(alias != "") (%alias;)%end; %end; %if;(evar.t = "D") [up to] %pvar.1;%end;

%if;(evar.cgl != "on")
%if;(referer != "") << %end;
%end; %define;tothegen(xx) [*to the %s generation:::xx]%nn; %end; %define;thegen(xx) [*the %s generation:::xx]%nn; %end; %define;togen(xx) %if;(evar.xx = 1)[*specify::generation/generations]0%nn; %elseif;(evar.xx = 2)[*to the parents]%nn; %elseif;(evar.xx = 3)[*to the grandparents]%nn; %elseif;(evar.xx = 4)[*to the great-grandparents]%nn; %else; %apply;tothegen%with; %apply;nth([nth (generation)], evar.xx) %end; %end; %end; %define;gen(xx) %if;(evar.xx = 1)[*specify::generation/generations]0%nn; %elseif;(evar.xx = 2)[*the parents]%nn; %elseif;(evar.xx = 3)[*the grandparents]%nn; %elseif;(evar.xx = 4)[*the great-grandparents]%nn; %else; %apply;thegen%with; %apply;nth([nth (generation)], evar.xx) %end; %end; %end; %define;letter(xx) %apply;nth%with; /a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z %and;xx%end; %end; %define;somebody_long_info(xx) %if;xx.has_aliases; %foreach;xx.alias;, [alias] %alias;%end; %end; %if;(("xx" = "ancestor" or xx.sosa_in_list = "") and xx.has_nobility_titles) %nn; %foreach;xx.nobility_title;, %nobility_title;%end; %nn; %end; %if;(xx.has_birth_date or xx.has_birth_place) , %if;xx.is_male;[born]0%elseif;xx.is_female;[born]1%else;[born]2%end; %if;xx.has_birth_date; %xx.on_birth_date;%end; %if;xx.has_birth_place;, %xx.birth_place;%end; %end; %if;(xx.has_baptism_date or xx.has_baptism_place) , %if;xx.is_male;[baptized]0%elseif;xx.is_female;[baptized]1%nn; %else;[baptized]2%end; %if;xx.has_baptism_date; %xx.on_baptism_date;%end; %if;xx.has_baptism_place;, %xx.baptism_place;%end; %end; %if;xx.is_dead;, %xx.died; %if;(xx.has_death_date) %xx.on_death_date;%end; %if;(xx.has_death_place), %xx.death_place;%end; %end; %if;xx.is_buried;, %if;xx.is_male;[buried]0%else;[buried]1%end; %if;xx.has_burial_date; %xx.on_burial_date;%end; %if;xx.has_burial_place;, %xx.burial_place;%end;%nl; %end; %if;xx.is_cremated;, %if;xx.is_male;[cremated]0%else;[cremated]1%end; %if;xx.has_cremation_date; %xx.on_cremation_date;%end; %if;xx.has_cremation_place;, %xx.cremation_place;%end;%nl; %end; %if;xx.computable_death_age;%sp; ([age at death:] %xx.death_age;)%nn; %end; %end; %define;link(aa, xx) %if;(evar.cgl = "on")xx%else;xx%end; %end; %define;link2(xx) %if;(evar.cgl = "on")%xx;%else;%xx;%end; %xx.title;%xx.dates; %end; %define;my_link(aa, xx, rr) %if;(evar.cgl = "on" or rr)xx%else;xx%end; %end; %define;somebody_extra_info(xx) %if;xx.has_occupation;, %xx.occupation;%end; %if;(evar.rel = "on" and xx.has_relations) %foreach;xx.relation;%nl; (%relation_type;: %if;has_relation_him; %apply;link2(relation_him.var) %if;(relation_him.sosa_in_list != ""), [see] %nn; %relation_him.sosa_in_list;%nn; %end; %end; %if;has_relation_her; %if;has_relation_him;,%nl;%end; %apply;link2(relation_her.var) %if;(relation_her.sosa_in_list != ""), [see] %nn; %relation_her.sosa_in_list;%nn; %end; %end;)%nn; %end; %foreach;xx.related;%nl; (%related_type;: %apply;link2(related.var) %if;(related.sosa_in_list != ""), [see] %nn; %related.sosa_in_list;%nn; %end;)%nn; %end; %end; %end; %define;somebody(xx) %apply;my_link(xx.access, xx, xx.is_restricted)%nn; %apply;somebody_long_info("xx") %apply;somebody_extra_info("xx") %end; %define;somebody_spouse_parent(xx) %apply;my_link(spouse.xx.access, spouse.xx, spouse.is_restricted)%nn; %if;spouse.xx.has_nobility_titles;, %nn; %spouse.xx.nobility_title;%nn; %end; %spouse.xx.dates; %if;(spouse.xx.sosa_in_list != "")%sp; ([see] %spouse.xx.sosa_in_list; )%nn; %end; %end; %define;married_to(is_male, date_place) %if;("is_male" = 1) %if;are_married;[married%t to:::date_place]0%nn; %elseif;are_not_married;[relationship%t to:::date_place]0%nn; %elseif;are_engaged;[engaged%t to:::date_place]0%nn; %elseif;is_no_sexes_check;[relationship%t to:::date_place]0%nn; %elseif;is_no_mention;date_place [with]%nn; %end; %else; %if;are_married;[married%t to:::date_place]1%nn; %elseif;are_not_married;[relationship%t to:::date_place]1%nn; %elseif;are_engaged;[engaged%t to:::date_place]1%nn; %elseif;is_no_sexes_check;[relationship%t to:::date_place]1%nn; %elseif;is_no_mention;date_place [with]%nn; %end; %end; %end; %( Long display %) %define;child_notes(spec) %if;(child.sosa_in_list = "" and (evar.src = "on" and child.has_sources or evar.notes = "on" and child.has_notes))
%ancestor.anc_sosa; %if;("spec" != "")-spec%end; %apply;letter(child_cnt):
%if;(evar.notes = "on" and child.has_notes)
%child.notes;
%end; %if;(evar.src = "on" and child.has_sources) [*source/sources]1: %foreach;child.source; - %source_type;: %source; %end; %end;
%end; %end; %define;long_display_notes()

%if;(evar.notes = "on")[*note/notes]1%else;[*source/sources]1%end;

%foreach;ancestor_level; %if;(evar.v != "" and level <= evar.v and (evar.only != "on" or level = evar.v)) %foreach;ancestor; %if;((evar.src = "on" and ancestor.has_sources or evar.notes = "on" and ancestor.has_notes) and ancestor.same = "")
%ancestor.anc_sosa;:
%if;(evar.notes = "on" and ancestor.has_notes)
%ancestor.notes;
%end; %if;(evar.src = "on" and ancestor.has_sources) [*source/sources]1: %foreach;ancestor.source; - %source_type;: %source; %end; %end;
%end; %if;(evar.siblings = "on" and ancestor.is_female and ancestor.same = "") %( siblings %) %if;(ancestor.index != self.index) %foreach;ancestor.family; %if;(family.index = ancestor.family.index) %foreach;child; %apply;child_notes("") %end; %end; %end; %( father's other families %) %foreach;ancestor.spouse.family; %if;(spouse.index != ancestor.index) %foreach;child; %apply;child_notes(family_cnt) %end; %end; %end; %( mother's other families %) %foreach;ancestor.family; %if;(spouse.index != ancestor.spouse.index) %foreach;child; %apply;child_notes(family_cnt) %end; %end; %end; %end; %end; %end; %end;
%end; %end; %define;long_display_ancestor_personal() %apply;somebody("ancestor"). %if;(evar.only != "on" and ancestor.father_sosa != "") [*parents]:%sp; %ancestor.father_sosa; %sp; [and]%sp; %ancestor.mother_sosa; . %end; %if;(evar.notes = "on" and ancestor.has_notes or evar.src = "on" and ancestor.has_sources) %if;(evar.notes = "on")%[[*note/notes]0%sp; %else;%[[*source/sources]1%sp;%end; %ancestor.anc_sosa;%]. %end; %if;(evar.siblings = "on") %foreach;ancestor.family; %if;(ancestor.index = index or family.index != ancestor.family.index) %apply;capitalize%with; %apply;married_to%with; %ancestor.is_male; %and; %if;(ancestor.index != index) (%family_cnt;)%end; %if;(on_marriage_date != "") %on_marriage_date;%end; %if;(marriage_place != ""), %marriage_place;, %end; %end;%sp; %end; %apply;somebody("spouse")%nn; %if;spouse.has_parents;,%sp; %apply;a_of_b%with; %if;spouse.is_male;[son/daughter/child]0 %else;[son/daughter/child]1%end; %and; %apply;somebody_spouse_parent("father") [and] %apply;somebody_spouse_parent("mother") %end; %end;. %end; %end; %end; %end; %define;child_long_info(spec) %apply;my_link(child.access, child.child_name, child.is_restricted)%nn; %nn; %apply;somebody_long_info("child") %if;(child.sosa_in_list != ""). %if;(evar.only != "on")[*see]%sp; %child.sosa_in_list; . %end; %else; %apply;somebody_extra_info("child"). %foreach;child.family; %apply;capitalize%with; %apply;married_to%with; %child.is_male; %and; %if;(on_marriage_date != "") %on_marriage_date;%end; %if;(marriage_place != ""), %marriage_place;, %end; %end;%sp; %end; %apply;somebody("spouse")%nn; %if;spouse.has_parents;,%sp; %apply;a_of_b%with; %if;spouse.is_male;[son/daughter/child]0 %else;[son/daughter/child]1%end; %and; %apply;somebody_spouse_parent("father") [and] %apply;somebody_spouse_parent("mother") %end; %end;. %if;are_divorced;[*divorced]0%divorce_date;.%nl; %elseif;are_separated;[*separated]0.%nl;%end; %end; %if;(evar.notes = "on" and child.has_notes or evar.src = "on" and child.has_sources) %if;(evar.notes = "on")%[[*note/notes]0%sp; %else;%[[*source/sources]1%sp;%end; %ancestor.anc_sosa; %if;("spec" != "")-spec%end; %apply;letter(child_cnt)%]. %end; %end; %end; %define;long_display_ancestor_families() %if;ancestor.is_male; ... %foreach;ancestor.family; %if;(family.index = ancestor.family.index) %apply;married_to%with %ancestor.is_male; %and; %if;(on_marriage_date != "") %on_marriage_date;%end; %if;(marriage_place != ""), %marriage_place;, %end; %end;... %end; %end; %else; %foreach;ancestor.family; %if;(family.index = ancestor.family.index) ... %if;(evar.witn = "on" and has_witnesses)([witness/witnesses]1: %foreach;witness; %if;(not is_first),%nl;%end; %apply;link2(witness.var) %end;), %end; %if;(evar.comm = "on" and has_comment)(%comment;)%nl;%end; [having as children]:

    %foreach;child; %if;(evar.siblings = "on" or child.sosa_in_list != "")
  1. %apply;child_long_info("")
  2. %end; %end;

%end; %end; %if;(evar.siblings = "on") %( father's other children %) %foreach;ancestor.spouse.family; %if;(spouse.index != ancestor.index and nb_children > 0) ... [having as children]%sp; %family.father.sosa_in_list; -(X%family_cnt;):

    %foreach;child;
  1. %apply;child_long_info(family_cnt)
  2. %end;

%end; %end; %( mother's other children %) %foreach;ancestor.family; %if;(spouse.index != ancestor.spouse.index and nb_children > 0) ... [having as children]%sp; %family.mother.sosa_in_list; -(X%family_cnt;):

    %foreach;child;
  1. %apply;child_long_info(family_cnt)
  2. %end;

%end; %end; %end; %end; %end; %define;dates_in_interval(xx) %if;(evar.after != "" and (xx.birth_date.year = "" and xx.baptism_date.year = "" and xx.death_date.year = "" and xx.burial_date.year = "" and xx.cremated_date.year = "" or xx.birth_date.year != "" and xx.birth_date.year < evar.after or xx.baptism_date.year != "" and xx.baptism_date.year < evar.after or xx.death_date.year != "" and xx.death_date.year < evar.after or xx.burial_date.year != "" and xx.burial_date.year < evar.after or xx.cremated_date.year != "" and xx.cremated_date.year < evar.after) or evar.before != "" and (xx.birth_date.year = "" and xx.baptism_date.year = "" and xx.death_date.year = "" and xx.burial_date.year = "" and xx.cremated_date.year = "" or xx.birth_date.year != "" and xx.birth_date.year > evar.before or xx.baptism_date.year != "" and xx.baptism_date.year > evar.before or xx.death_date.year != "" and xx.death_date.year > evar.before or xx.burial_date.year != "" and xx.burial_date.year > evar.before or xx.cremated_date.year != "" and xx.cremated_date.year > evar.before))false%nn; %else;true%end; %end; %( Main %) %if;(evar.t = "N" and evar.only = "on") %( short display; only the selected generation %) %reset_count;
    %foreach;ancestor_level2; %if;(evar.v != "" and level = evar.v)
  • %nl;%apply;gen("v")%nl;
      %nl; %foreach;ancestor;
    • %sp; %if;(ancestor.interval != "")%ancestor.interval; %else; %if;(ancestor.same = "")%incr_count;%end; %ancestor.anc_sosa;%sp; %if;(ancestor.same != "")=>%else;-%end;%sp; %apply;link%with;%ancestor.access;%and; %if;(ancestor.same != "")%ancestor.same; %else;%ancestor;%end; %end; %nn; %if;(ancestor.same = "")%ancestor.title;%ancestor.dates;%end; %end;
    • %nl; %end;
  • %end; %end;
[*total]: %count; [[person/persons]1@(c)] %elseif;(evar.t = "N") %( short display %)

%apply;togen("v").

%reset_count;
    %foreach;ancestor_level(evar.v) %apply;lazy_print%with;
  • %nl;[*generation/generations]0 %level;%nl;
      %nl; %end; %foreach;ancestor; %lazy_force; %if;(ancestor.same = "")%incr_count;%end; %nn; %if;(evar.sosab = 16)%ancestor.anc_sosa.hexa; %elseif;(evar.sosab = 8)%ancestor.anc_sosa.octal; %else;%ancestor.anc_sosa;%end;%sp; %if;(ancestor.same != "")=>%else;-%end;%sp; %apply;link%with;%ancestor.access;%and; %if;(ancestor.same != "")%nn; %if(evar.sosab = 16)%ancestor.same.hexa; %elseif(evar.sosab = 8)%ancestor.same.octal; %else;%ancestor.same;%end; %else;%ancestor;%end; %end; %nn; %if;(ancestor.same = "")%ancestor.title;%ancestor.dates;%end; %nl; %end; %if;lazy_printed;
  • %end; %end;
[*total]: %count; [[person/persons]1@(c)] %elseif;(evar.t = "M" and evar.al = "on") %( missing ancestors alphabetically %)

%apply;togen("v") %if;(evar.after != "") [after] %evar.after;%end; %if;(evar.before != "") [before] %evar.before;%end;.

%empty_sorted_list; %reset_count; %foreach;ancestor_level; %if;(evar.v != "" and level < evar.v)%nn; %foreach;ancestor; %if;(ancestor.same = "") %if;(not ancestor.has_parents and ancestor.first_name != "?" and ancestor.surname != "?") %if;(dates_in_interval(ancestor.var) = "true") %incr_count; %apply;add_in_sorted_list( ancestor.surname_end, ancestor.first_name, ancestor.surname_begin, "0", ancestor.nobility_title, ancestor.access, ancestor.dates, [parents], ancestor.family.marriage_date.year, ancestor.spouse, ancestor.spouse.dates, ancestor.spouse.nobility_title) %end; %elseif;(evar.ms = "on" and ancestor.has_parents) %if;(ancestor.father.first_name = "?" and ancestor.father.surname = "?") %if;(dates_in_interval(ancestor.mother.var) = "true") %incr_count; %apply;add_in_sorted_list( ancestor.mother.surname_end, ancestor.mother.first_name, ancestor.mother.surname_begin, "1", ancestor.mother.nobility_title, ancestor.mother.access, ancestor.mother.dates, [husband/wife]0) %end; %end; %if;(ancestor.mother.first_name = "?" and ancestor.mother.surname = "?") %if;(dates_in_interval(ancestor.father.var) = "true") %incr_count; %apply;add_in_sorted_list( ancestor.father.surname_end, ancestor.father.first_name, ancestor.father.surname_begin, "1", ancestor.father.nobility_title, ancestor.father.access, ancestor.father.dates, [husband/wife]1) %end; %end; %end; %end; %end; %end; %end; %if;(count > 100) %foreach;sorted_list_item; %if;(initial(prev_item.1) != initial(item.1)) %apply;initial(item.1) %end; %end; %end; %if;(evar.ms != "on")

%apply;a_of_b([*parents], "...")

%end;
    %foreach;sorted_list_item;
  • %nn; %if;(count > 100 and initial(prev_item.1) != initial(item.1)) %apply;initial(item.1)
    • %nn; %end; %if;(prev_item.1 != item.1) %item.1; %if;(number_of_subitems > 1)%nl;
      • %nn; %end; %end; %sp;%item.2;%item.3; %if;(item.5 != ""), %item.5;%end;%item.7; %if;(evar.ms != "on") %if;(item.10 != "? ?") %nl;&%nn; %if;(item.9 != "")%item.9;%end; %sp;%item.10;%item.11; %if;(item.12 != ""), %item.12;%end; %end; %else; => %item.8;%end;
      • %if;(prev_item.1 = item.1 and number_of_subitems = 1)
    • %end; %if;(count > 100 and initial(item.1) != initial(next_item.1))
  • %end; %end;
%elseif;(evar.t = "M") %( missing ancestors in ancestors order %)

%apply;togen("v") %if;(evar.after != "") [after] %evar.after;%end; %if;(evar.before != "") [before] %evar.before;%end;.

%if;(evar.ms != "on")

%apply;a_of_b([*parents], "...")

%end;
    %foreach;ancestor_level; %if;(evar.v != "" and level <= evar.v) %apply;lazy_print%with;
  • %nl;[*generation/generations]0 %expr(level+1);%nl;
      %nl; %end; %foreach;ancestor; %if;(ancestor.same = "") %if;(not ancestor.has_parents and ancestor.first_name != "?" and ancestor.surname != "?") %if;(dates_in_interval(ancestor.var) = "true") %lazy_force;
    • %sp; %expr(ancestor.anc_sosa.v * 2) -%expr((ancestor.anc_sosa.v * 2 + 1) % 10) - %if;(evar.ms != "on") %apply;link(ancestor.access, ancestor) %else; %apply;a_of_b%with;[parents]%and; %apply;link(ancestor.access, ancestor) %end; %end; %ancestor.title;%ancestor.dates;
    • %nl; %end; %elseif;(evar.ms = "on" and ancestor.has_parents) %if;(ancestor.father.first_name = "?" and ancestor.father.surname = "?") %if;(dates_in_interval(ancestor.mother.var) = "true") %lazy_force;
    • %expr(ancestor.anc_sosa.v * 2)%sp; - %apply;a_of_b%with; %apply;link(ancestor.father.access, [husband/wife]0) %and; %ancestor.mother; %ancestor.mother.title; %ancestor.mother.dates; %end;
    • %nl; %end; %end; %if;(ancestor.mother.first_name = "?" and ancestor.mother.surname = "?") %if;(dates_in_interval(ancestor.father.var) = "true") %lazy_force;
    • %expr(ancestor.anc_sosa.v * 2 + 1)%sp; - %apply;a_of_b%with; %apply;link(ancestor.mother.access, [husband/wife]1) %and; %ancestor.father; %ancestor.father.title; %ancestor.father.dates; %end;
    • %nl; %end; %end; %end; %end; %end; %if;lazy_printed;
    %nl;
  • %nl;%end; %end; %end;
%elseif;(evar.t = "G") %( long display %) %if;(evar.only != "on")

%apply;togen("v").

%end; %foreach;ancestor_level(evar.v) %if;(evar.only != "on" or level = evar.v)

[*generation/generations]0 %level;

%foreach;ancestor; %if;(ancestor.same != "")

%ancestor.anc_sosa;: [see] %ancestor.same;.

%else;

%ancestor.anc_sosa; %apply;long_display_ancestor_personal()

%if;(ancestor.index != self.index)

%apply;long_display_ancestor_families()

%end; %end; %end; %end; %end; %if;(evar.notes = "on" or evar.src = "on")

%apply;long_display_notes()

%end; %elseif;(evar.t = "D") %( ancestors up to somebody %) %pvar.1.mark_descendants;
    %foreach;ancestor_level; %apply;lazy_print%with;
  • [*generation/generations]0 %level;%nl;
      %end; %if;(level <= evar.l + 1) %foreach;ancestor; %if;(ancestor.same = "" and ancestor.is_descendant) %lazy_force;
    • %ancestor.anc_sosa; -%sp; %ancestor;%nn; %ancestor.title;%ancestor.dates;
    • %end; %end; %end; %if;lazy_printed;
    %nl;
  • %nl;%end; %end;
%end;
...
%copyright; %base_trailer; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templ502/desmenu.txt0000660000175200017530000001661612664543647025352 0ustar guillaumeguillaume%doctype; %nn; %apply;a_of_b_gr_eq_lev%with; [*descendants]%nn; %and; %if;(public_name != "")%public_name;%else;%first_name;%end; %if;(qualifier != "") %qualifier;%end; %sp;%surname; %end; %base_header; %message_to_wizard;

%nn; %apply;a_of_b_gr_eq_lev%with; [*descendants]%nn; %and; %if;(public_name != "")%public_name;%else;%first_name;%end; %if;(qualifier != "") %qualifier;%end; %sp;%surname; %if;(alias != "") (%alias;)%end; %end;

%define;tothegen(xx) [*to the %s generation:::xx]%nn; %end; %if;not cancel_links;
%if;(referer != "") << %end;
%end;

%hidden; %if;access_by_key; %if;(occ != "0") %end; %else %end;

%if;(bvar.max_desc_level = "" and max_desc_level > 12) ([maximum] 12 [generation/generations]1) %elseif;( bvar.max_desc_level != "" and max_desc_level > bvar.max_desc_level ) ([maximum] %bvar.max_desc_level; [generation/generations]1) %end;
- [*color]
...
%copyright; %base_trailer; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templ502/updfam.txt0000660000175200017530000005311612664543647025162 0ustar guillaumeguillaume%doctype; %nn; %if;(evar_m = "ADD_FAM" or evar_m = "ADD_FAM_OK") [*add::family/families]0%nn; %elseif;(evar_m = "ADD_PAR")[*add::family/families]0%nn; %elseif;(evar_m = "MOD_FAM" or evar_m = "MOD_FAM_OK") [*modify::family/families]0 # %evar_i; %elseif;(evar_m = "MRG_DUP_FAM_Y_N" or evar_m = "MRG_FAM" or evar_m = "MRG_FAM_OK" or evar_m = "MRG_MOD_FAM_OK") [*merge::family/families]1 # %evar_i; %end; %base_header; %message_to_wizard; %define;date(xlab,xvar,xdate)
xlab %if;([ !dates order]0 = "ddmmyy" or [ !dates order]0 = "ddmmyyyy" or [ !dates order]0 = "dmyyyy") %elseif;([ !dates order]0 = "mmddyyyy") %else; %end;
[*calendar/calendars]0 [*precision]0
%end; %define;source(xvar,xx)
%end; %define;small_date(kind,xvar,xx,verbose) %if;([ !dates order]0 = "ddmmyy" or [ !dates order]0 = "ddmmyyyy" or [ !dates order]0 = "dmyyyy") / / %elseif;([ !dates order]0 = "mmddyyyy") / / %else; - - %end; %if;("verbose" = "true")%nn; %end;%nl; %end; %define;birth(xvar,xx,verbose) [*birth] %apply;small_date("birth","xvarb","xx","verbose") %end; %define;death(xvar,xx,verbose) [*death] %apply;small_date("death","xvard","xx","verbose") %end; %define;parent(xcnt,xx)
%apply;birth("paxcnt","xx","true") %apply;death("paxcnt","xx","true")
%end; %define;insert_parent(xcnt)
[*insert::| | parents]
%end;

%nn; %if;(evar_m = "ADD_FAM" or evar_m = "ADD_FAM_OK") [*add::family/families]0 %elseif;(evar_m = "ADD_PAR") [*add::family/families]0 %elseif;(evar_m = "MOD_FAM" or evar_m = "MOD_FAM_OK") [*modify::family/families]0 # %evar_i; %elseif;(evar_m = "MRG_DUP_FAM_Y_N" or evar_m = "MRG_FAM" or evar_m = "MRG_FAM_OK" or evar_m = "MRG_MOD_FAM_OK") [*merge::family/families]1 # %evar_i; %end;

%hidden; %if;(evar_ip != "")%nl;%end; %if;(evar_i != "")%nl;%end; %if;(evar_m = "ADD_FAM" or evar_m = "ADD_FAM_OK") %nl; %elseif;(evar_m = "ADD_PAR") %nl; %elseif;(evar_m = "MOD_FAM" or evar_m = "MOD_FAM_OK") %nl; %elseif;(evar_m = "MRG_DUP_FAM_Y_N" or evar_m = "MRG_FAM" or evar_m = "MRG_FAM_OK" or evar_m = "MRG_MOD_FAM_OK") %if;(evar_ini1 != "" and evar_ini2 != "") %end; %if;(evar.iexcl != "") %end; %if;(evar.fexcl != "") %end; %nl; %end;

%foreach;parent; %if;(bvar.multi_parents != "yes")

%parent.himher;

%end;%nl; %apply;parent(cnt, "parent") %if;(bvar.multi_parents = "yes")%apply;insert_parent(cnt)%end; %end;

[*marriage/marriages]0

%apply;date([*date/dates]0, "marr", "marriage") %apply;source("marr", "marriage")

[*witness/witnesses]1

%foreach;witness;
%end;

[*divorce]

%apply;date([*date/dates]0, "div", "divorce")

[*child/children]1

%define;insert_child(xcnt) %end; %define;invert_children(xcnt) %end; %define;child(xcnt) %apply;birth("chxcnt", "child", "false") %apply;death("chxcnt", "child", "false")
%end;
%apply;insert_child("0") %foreach;child; %if;(cnt != 1)
  %apply;invert_children(cnt) %end;
%apply;child(cnt) %apply;insert_child(cnt) %end;

[*source/sources]0

%if;(bvar.origin_file = "on") %end;

...
%copyright; %base_trailer; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templ502/robots.txt0000660000175200017530000000003412664543647025205 0ustar guillaumeguillaumeUser-Agent: * Disallow: / geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templ502/ancmenu.txt0000660000175200017530000002246312664543647025335 0ustar guillaumeguillaume%doctype; %nn; %apply;a_of_b%with; [*ancestors]%nn; %and; %if;(public_name != "")%public_name;%else;%first_name;%end; %if;(qualifier != "") %qualifier;%end; %sp;%surname; %end; %base_header; %message_to_wizard;

%nn; %apply;a_of_b%with; [*ancestors]%nn; %and; %if;(public_name != "")%public_name;%else;%first_name;%end; %if;(qualifier != "") %qualifier;%end; %sp;%surname; %if;(alias != "") (%alias;)%end; %end;

%define;tothegen(xx) [*to the %s generation:::xx]%nn; %end; %define;navsosa(xx) [*navigation with %t as Sosa reference:::xx]. %end; %if;not cancel_links;
%if;(referer != "") << %end;
%end;

%hidden; %if;access_by_key; %if;(occ != "0") %end; %else %end;

- Sosa base
- [*color]
 

%apply;navsosa%with; %self;%nn; %if;has_nobility_titles;, %nobility_title;%end;%nl; %end;

...
%copyright; %base_trailer; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templm/0002770000175200017530000000000012664543647023066 5ustar guillaumeguillaumegeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templm/inc_mickroue2.txt0000660000175200017530000001620312664543647026361 0ustar guillaumeguillaume%( %) %( %) %define;display_images_him_her(xx, yy, zz, hhim, hher) %if;(has_linked_page.xxyy and spouse.has_linked_page.xxyy) %if;(evar.image = "on" and (bvar.no_image_for_visitor != "yes" or friend or wizard))
  • [*image/images]0%nn; %if;(nb_families > 1)&%marriage_date.year;%end; %linked_page.xxyy;
  • %else;
  • %if;(nb_families > 1)&%marriage_date.year; - %end; %linked_page.xxyy; %if;(not cancel_links) %sp;-%sp; [*see] %end;
  • %end; %end; %if;(wizard and not cancel_links) %incr_count; %apply;add_in_sorted_list%with; %expr(1000 + count)%and; %if;("yy" = "A")&%marriage_date.year;%end;%and; %if;(bvar.var_text != "") %apply;v_linked_page("xxyy") %else; %apply;v_linked_page("xxyy") %end; %end; %end; %end; %define;display_images_person(xx, yy, zz) %if;(has_linked_page.xxyy) %if;(evar.image = "on" and (bvar.no_image_for_visitor != "yes" or friend or wizard))
  • [*image/images]0 %linked_page.xxyy;
  • %else;
  • %linked_page.xxyy; %if;(not cancel_links) %sp;-%sp; [*see]0 %end;
  • %end; %end; %if;(wizard and not cancel_links) %incr_count; %apply;add_in_sorted_list%with; %expr(1000 + count)%and; %if;("yy" = "A") %if;("xx" = "BIRTH")°%zz_date.year;%end; %if;("xx" = "DEATH") %death_symbol; %zz_date.year; %end; %if;("zz" = "other")- - -%end; %end;%and; %if;(bvar.var_text != "") %apply;v_linked_page("xxyy") %elseif;("xx" = "OTHER") %apply;v_linked_page("xxyy") %else; %apply;v_linked_page("xxyy") %end; %end; %end; %end; %define;display_images_marriage(xx, yy, zz) %if;(is_male) %apply;display_images_him_her("xx","yy","zz","self","spouse") %else; %apply;display_images_him_her("xx","yy","zz","spouse","self") %end; %end; %define;display_images(xx, yy, zz, curlev, maxlev) %if;(curlev < maxlev) %if;("xx" = "MARRIAGE") %if;(has_linked_page.xxyy and spouse.has_linked_page.xxyy or wizard) %apply;display_images_marriage("xx", "yy", "zz") %end; %elseif;(has_linked_page.xxyy or wizard) %apply;display_images_person("xx", "yy", "zz") %end; %apply;display_images%with; xx%and; %apply;letter(curlev + 2)%and; zz%and; %expr(curlev + 1)%and; %maxlev; %end; %end; %end; %define;v_linked_page(gwf) %if;(bvar.var_t_gwf = "") gwf%nn; %else; %bvar.var_t_gwf;%nn; %end; %end;
    %empty_sorted_list; %let;focus_cnt;%count;%in; %reset_count;
      %if;(bvar.var_n_BIRTH > 0) %if;(has_birth_date) %apply;display_images("BIRTH","A","birth",0,bvar.var_n_BIRTH) %elseif;(has_baptism_date) %apply;display_images("BIRTH","A","baptism",0,bvar.var_n_BIRTH) %end; %end; %if;(bvar.var_n_MARRIAGE > 0) %if;(has_families) %foreach;family %if;(on_marriage_date != "") %apply;display_images("MARRIAGE","A","marriage",0,bvar.var_n_MARRIAGE) %end; %end; %end; %end; %if;(bvar.var_n_DEATH > 0) %if;(has_death_date) %apply;display_images("DEATH","A","death",0,bvar.var_n_DEATH) %elseif;(has_burial_date) %apply;display_images("DEATH","A","burial",0,bvar.var_n_DEATH) %elseif;(has_cremation_date) %apply;display_images("DEATH","A","cremated",0,bvar.var_n_DEATH) %end; %end; %if;(bvar.var_n_OTHER > 0) %apply;display_images("OTHER","A","other",0,bvar.var_n_OTHER) %end;
    %apply;init_count(focus_cnt) %if;(wizard and not cancel_links) %end;
    %( %)geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templm/perso_accesskey.js0000660000175200017530000001272012664543647026607 0ustar guillaumeguillaume /* perso_accesskey.js mickroue(a)yahoo.fr 20130617 templ=templm */ function acc_key(thi,event,xsib,xspo,xchi,xmod_ind,xadd_par,xadd_fam,xmod_fam) { var key = event.keyCode ? event.keyCode : event.which ? event.which : event.charCode; var charKey = String.fromCharCode(key); var acckey = (document.getElementById("acckey")) ? document.getElementById("acckey") : thi; var add_par = (document.getElementById(xadd_par)) ? document.getElementById(xadd_par) : thi; var add_fam = (document.getElementById(xadd_fam)) ? document.getElementById(xadd_fam) : thi; var anc_tree = (document.getElementById("anc_tree")) ? document.getElementById("anc_tree") : thi; var chi = (document.getElementById(xchi)) ? document.getElementById(xchi) : thi; var mod_fam = (document.getElementById(xmod_fam)) ? document.getElementById(xmod_fam) : thi; var mod_fam2 = (document.getElementById("mod_fam2")) ? document.getElementById("mod_fam2") : thi; var mod_fam3 = (document.getElementById("mod_fam3")) ? document.getElementById("mod_fam3") : thi; var mod_ind = (document.getElementById(xmod_ind)) ? document.getElementById(xmod_ind) : thi; var nav_sosa_ref = (document.getElementById("nav_sosa_ref")) ? document.getElementById("nav_sosa_ref") : thi; var par_2 = (document.getElementById("par_2")) ? document.getElementById("par_2") : thi; var par_3 = (document.getElementById("par_3")) ? document.getElementById("par_3") : thi; var par_4 = (document.getElementById("par_4")) ? document.getElementById("par_4") : thi; var par_5 = (document.getElementById("par_5")) ? document.getElementById("par_5") : thi; var par_6 = (document.getElementById("par_6")) ? document.getElementById("par_6") : thi; var par_7 = (document.getElementById("par_7")) ? document.getElementById("par_7") : thi; var rela_comp = (document.getElementById("rela_comp")) ? document.getElementById("rela_comp") : thi; var snd_image = (document.getElementById("snd_image")) ? document.getElementById("snd_image") : thi; var spo = (document.getElementById(xspo)) ? document.getElementById(xspo) : thi; var Tn = (document.getElementById("Tn")) ? document.getElementById("Tn") : thi; if(document.getElementById(xsib)) {var sib = document.getElementById(xsib);} else {var sib = document.getElementById("sib_1") ? document.getElementById("sib_1") : thi;} var sosa = ""; if(document.getElementsByName("sosa")[0]) { if(thi.getAttribute("name") == "sosa") { var nb_sosa = document.getElementsByName("sosa").length; var i = 0; var j = 0; var sosa0 = ""; while (j < 2 && i < nb_sosa) { sosa0 = document.getElementsByName("sosa")[i].id; if(j == 1) {j = 2;} if(sosa0 == thi.id) {j = 1;} if(sosa0 == thi.id && i == nb_sosa -1) {sosa0 = document.getElementsByName("sosa")[0].id;} i++; } sosa = document.getElementById(sosa0); } else { var sosa0 = document.getElementsByName("sosa")[0].id; sosa = document.getElementById(sosa0); } } else {sosa = thi;} switch (charKey) { //shift = on case "W": acckey.focus(); break; // menu2 (w) case "²": Tn.focus(); break; // trl : search input case "2": par_2.focus(); break; case "3": par_3.focus(); break; case "4": par_4.focus(); break; case "5": par_5.focus(); break; case "6": par_6.focus(); break; case "7": par_7.focus(); break; case "1": sib.focus(); break; case "0": spo.focus(); break; case "8": chi.focus(); break; case "9": sosa.focus(); break; case "P": mod_ind.click(); break; case "L": add_par.click(); break; case "A": add_fam.click(); break; case "F": mod_fam.click(); break; case "G": mod_fam_2.click(); break; case "H": mod_fam_3.click(); break; case "I": snd_image.click(); break; case "R": rela_comp.click(); break; case "S": nav_sosa_ref.click(); break; case "U": upd.click(); break; case "Y": anc_tree.click(); break; //shift = off case "w": acckey.focus(); break; // menu2 (w) case "²": Tn.focus(); break; // trl : search input case "é": par_2.focus(); break; case "\"": par_3.focus(); break; case "'": par_4.focus(); break; case "(": par_5.focus(); break; case "-": par_6.focus(); break; case "è": par_7.focus(); break; case "&": sib.focus(); break; break; case "à": spo.focus(); break; case "_": chi.focus(); break; case "ç": sosa.focus(); break; case "p": mod_ind.click(); break; case "l": add_par.click(); break; case "a": add_fam.click(); break; case "f": mod_fam.click(); break; case "g": mod_fam_2.click(); break; case "h": mod_fam_3.click(); break; case "i": snd_image.click(); break; case "r": rela_comp.click(); break; case "s": nav_sosa_ref.click(); break; case "u": upd.click(); break; case "y": anc_tree.click(); break; default: return true; break; } return false; }geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templm/dag.txt0000660000175200017530000002755612664543647024400 0ustar guillaumeguillaume%doctype; %nn; %if;(evar.slices = "on") [*display by slices/slice width/overlap/total width]0%nn; %else;%head_title;%end; %include.css; %base_header; %message_to_wizard; %if;(not cancel_links or evar.notab = "on") %end; %if;(evar.slices = "on")

    [*display by slices/slice width/overlap/total width]0

    %hidden; %foreach;env_binding; %if;( env.key = "dpos" or env.key = "nogroup" or env.key = "overlap" or env.key = "width" or env.key = "slices" or env.key = "templ" or env.key = "iz" or env.key = "pz" or env.key = "nz" or env.key = "ocz" ) %else; %end; %end;
    [*display by slices/slice width/overlap/total width]0

    %else; %if;(not cancel_links and evar.notab != "on") %let;l_o;image=%evar.image;;bd=%evar.bd;;color=%evar.color;%in; %end; %if;(evar.notab = "on" or evar.pos2 != "") %let;dpos;%if;(evar.dpos != "")%evar.dpos;%else;78%end;%in; %let;pos1;%if;(evar.pos1 != "")%evar.pos1;%else;0%end;%in; %let;pos2;%if;(evar.pos2 != "")%evar.pos2;%else;%dpos;%end;%in; %let;overlap;%if;(evar.overlap != "")%evar.overlap;%else;10%end;%in; %if;(pos1 != 0 or pos2 < dag.ncol) %end;
        %foreach;dag_line;
          %foreach;dag_line_pre;
            %foreach;dag_cell_pre;
              %dag_cell_pre;%nn;
            %end;%nl;
          %end;
        %end;
        
    %else; %let;l_arr;%if(evar.m = "A")↑%else;↓%end;%in; %let;l_a;%if;(evar.em = "R")---->8----%else;[tree]%end;%in;
    %foreach;dag_line; %foreach;dag_cell; %end; %end;
    1)colspan="%dag_cell.colspan;" %end;align="%dag_cell.align;">%nn; %if;dag_cell.is_nothing; %nn; %elseif;dag_cell.is_bar; %if;(dag_cell.bar_link != "" and evar.cgl != "on")         %l_arr;        %nn; %else;|%end; %elseif;(dag_cell.item != "")%dag_cell.item; %elseif;(dag_cell.text != "")%dag_cell.text; %else; %if;dag_cell.is_hr_left;
    %nn; %elseif;dag_cell.is_hr_right;
    %nn; %else;
    %nn; %end; %end;
    %end; %end; %base_trailer; %copyright; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templm/accent.txt0000660000175200017530000003264412664543647025074 0ustar guillaumeguillaume

    à á  â À à Æ æ Ã… Ã¥ Ä ä Ä„ Ä…   Ć ć Ç ç   à ð   É é Ê ê È è Ë ë Ę Ä™   à í ÃŽ î ÃŒ ì à ï   Å Å‚   Ń Å„ Ñ ñ Ó ó Ô ô Ã’ ò Å’ Å“ Ø ø Õ õ Ö ö   Åš Å› Å¿ ß Þ þ   Ú ú Ù ù Û û Ü ü   à ý Ÿ ÿ   Ź ź Å» ż ½ ¼ ¾   º ¹ ² ³ ° ª   ¡ ¿ µ • · – — ÷ ‰ € £ © ® « » ¶   ‡ â„– × †

    geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templm/toolbar.txt0000660000175200017530000000116412664543647025272 0ustar guillaumeguillaume
    %if;(evar.file != "")
    [*link] : %evar.text;
    ([*image/images]0 : ../src/%evar.base;/images/%evar.file;.%bvar.var_img_ext;)
    %end;
    geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templm/updmenu.txt0000660000175200017530000000752212664543647025311 0ustar guillaumeguillaume%doctype; [*update] %include.css; %base_header; %message_to_wizard; %if;not cancel_links; %end;

    %nn; [*update] %first_name; .%if;(first_name = "?" or surname = "?")%index;%else;%occ;%end; %surname;

    [*person/persons]0 [*family/families]1
    [*modify::] (P) %if;(bvar.can_send_image != "no" and image = "" and first_name != "?" and surname != "?") [*send::image/images]0 %if;(auto_image_file_name != "") [*delete::image/images]0 %end; %end; [*delete::] [*merge::] %if;(not has_parents and first_name != "?" and surname != "?") [*add::parents] %end; %foreach;family; %if;(family_cnt != 1) [*invert] %if;(family.father.index = prev_family.father.index and family.mother.index = prev_family.mother.index) %nn; [*merge::] %end; %end; %nn; [*modify::family/families]0%if;(nb_families = 1) (F)%end; [with] %spouse.first_name;.%spouse.occ; %spouse.surname; %nn; [*delete::family/families]0 [with] %spouse.first_name;.%spouse.occ; %spouse.surname; %end; %if;((first_name = "?" or surname = "?") and (nb_families != 0 or has_parents)) %elseif;(not is_male and not is_female) %nn; [*add::family/families]0 ([M/F]0) %nn; [*add::family/families]0 ([M/F]1) %else; %nn; [*add::family/families]0 (A) %end; %if;(nb_children != 0) [*change children's names] %end; %if;has_possible_duplications; [*merge::possible duplications] %end;
    %define;hint(xx) [*to add a child to a family, use "%s":::xx] %end; %if;(nb_families != 0)

    %apply;hint([*modify::family/families]0)

    %end; %base_trailer; %copyright; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templm/inc_mickroue1.txt0000660000175200017530000000674612664543647026373 0ustar guillaumeguillaume%( %) %( %) %if;(has_relations) %apply;lazy_print%with;

    [*relation/relations]1

      %end; %foreach;relation; %if;(relation_type != [foster father/foster mother/foster parents]0 and relation_type != [foster father/foster mother/foster parents]1 and relation_type != [foster father/foster mother/foster parents]2) %lazy_force;
    • %apply;relation_computing()
        %if;has_relation_him;
      • %apply;somebody("relation_him")
      • %end; %if;has_relation_her;
      • %apply;somebody("relation_her")
      • %end;
    • %end; %end; %foreach;related; %if;(related_type != [foster son/foster daughter/foster child]0 and related_type != [foster son/foster daughter/foster child]1 and related_type != [foster son/foster daughter/foster child]2) %lazy_force;
    • %apply;related_computing()
      • %apply;somebody("related")
    • %end; %end; %reset_count; %foreach;witness_relation; %lazy_force; %if;(count = 0)
    • %apply;witness_computing() %end; %incr_count; %end; %if;(count > 0)
      %apply;somebody("witness_relation.father") %apply;link_marriage("witness_relation.father") %apply;somebody("witness_relation.mother")
      %if;(count > 5) [*total] : %count; %end;
    • %end; %if;lazy_printed;
    %end; %end; %apply;lazy_print%with;

    Photos

      %end; %foreach;relation; %if;(relation_type = [foster father/foster mother/foster parents]0 or relation_type = [foster father/foster mother/foster parents]1 or relation_type = [foster father/foster mother/foster parents]2) %lazy_force; %if;(has_relation_him)
    • %apply;link_image("relation_him") %apply;somebody("relation_him")
    • %end; %if;(has_relation_her)
    • %apply;link_image("relation_her") %apply;somebody("relation_her")
    • %end; %end; %end; %foreach;related; %if;(related_type = [foster son/foster daughter/foster child]0 or related_type = [foster son/foster daughter/foster child]1 or related_type = [foster son/foster daughter/foster child]2) %lazy_force;
    • %apply;link_image("related") %if;(cancel_links or related.is_restricted) %related.public_name; %related.qualifier; %else; %related.public_name; %related.qualifier;  %end;
    • %end; %end; %if;lazy_printed;
    %end; %( %)geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templm/upddata.txt0000660000175200017530000000732512664543647025257 0ustar guillaumeguillaume %let;maxl;%if;(evar.data = "src")300%else;200%end;%in; %title; %include.css; %base_header; %define;print_short()

    [*select a letter] :

    %foreach;initial; %html_encode.ini; %end;

    %end; %define;print_long()

    [*help modify data]

    %foreach;entry; %html_encode.entry_ini; %end;

    %foreach;entry;
    %html_encode.entry_ini;
    %foreach;value;
    %escape.entry_value;
    %end; %end;
    %end; %if;not cancel_links; %end;

    %title;

    %if;(nb_results > 1000) %apply;print_short() %else; %apply;print_long() %end; %base_trailer; %copyright; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templm/relmenu.txt0000660000175200017530000001753512664543647025310 0ustar guillaumeguillaume%doctype; [*link between]%sp; %if;(public_name != "")%public_name; %else;%first_name; %surname;%end; [and]0…%nn; %include.css; %base_header; %message_to_wizard; %let;l_on;onclick="this.focus()" onkeydown="if (event.keyCode == 13) javascript:document.relmenu.submit();"%in; %define;relative_sosa(sosa_link) [Sosa number relative to %t:::sosa_link] %end; %define;navsosa(xx) [*navigation with %t as Sosa reference:::xx]. %end; %define;nth_cousins(xx) [*%s cousins:::xx]%nn; %end;

    [*link between]%sp; %if;(public_name != "")%public_name;%else;%first_name;%end; %if;(qualifier != "") %qualifier;%end; %sp;%surname; %if;(alias != "") (%alias;)%end; %sp;[and]0…%nn;

    %if;not cancel_links; %end;

    %hidden; %if;access_by_key; %if;(occ != "0") %end; %else %end;

                %foreach;family; %if;(spouse != "? ?") %end; %end; %foreach;relation; %if;has_relation_him; %end; %if;has_relation_her; %end; %end; %foreach;related; %end; %foreach;family; %foreach;witness; %end; %end; %if;(has_siblings or father.has_parents or mother.has_parents) %end;
    [color] 
    %apply;navsosa%with; %self;%nn; %if;has_nobility_titles;, %nobility_title;%end;%nl; %end;
    %base_trailer; %copyright; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templm/welcome.txt0000660000175200017530000003057212664543647025270 0ustar guillaumeguillaume%doctype; Geneweb - %base.name; %include.css; %base_header; %let;l_on;onclick="this.focus()" onkeydown="if (event.keyCode == 13) javascript:document.upd.submit();"%in; %let;l_on1;onclick="this.focus()"%in; %define;book_of(xx) [*book of %s:::xx] %end; %define;sosa_rel(xx) [Sosa number relative to %t:::xx] %end; %define;lang(xx) %apply;nth%with; /af/bg/br/ca/cs/da/de/en/eo/es/et/fi/fr/he/is/it/lv/nl/no/pl/pt/pt-br/ro/ru/sk/sl/sv/zh/ %and;xx%end; %end; %define;link_lang() %for;i;1;29; %apply;lang(i) %end; %end; %define;disconnect(xx,yy) %if;(just_friend_wizard or bvar.xx_passwd != "" or bvar.xx_passwd_file != "") yy %if;(user.ident != "") %sp;:%sp;%user.ident; %end; ([disconnect]) %end; %end;
    lang= %apply;link_lang() %if;just_friend_wizard; [ en: Wizard rights are now suspended for maintenance. fr: Les droits des magiciens sont actuellement suspendus pour maintenance. ] %end; %if;(not friend and not wizard) %if;(not cgi and bvar.auth_file = "") [*access] : [wizard/wizards/friend/friends/exterior]0 - [wizard/wizards/friend/friends/exterior]2 %else;
    %hidden; [*user/password/cancel]1 ([wizard/wizards/friend/friends/exterior]2/[wizard/wizards/friend/friends/exterior]0) :
    %end; %elseif;(bvar.wizard_passwd != "" or bvar.wizard_passwd_file != "") %if;(friend and (bvar.friend_passwd = "" and bvar.friend_passwd_file = "")) %if;(not cgi and bvar.auth_file = "") [*access] : [wizard/wizards/friend/friends/exterior]0 %elseif;(not just_friend_wizard)
    %hidden; [*user/password/cancel]1 ([wizard/wizards/friend/friends/exterior]0) :
    %end; %end; %end; %if;(wizard or friend) %if;(friend) %apply;disconnect("friend",[wizard/wizards/friend/friends/exterior]2) %else; %apply;disconnect("wizard",[wizard/wizards/friend/friends/exterior]0) %setup_link; %end; %end;
    GeneWeb

    %apply;capitalize(base.name)

    (%base.nb_persons; [person/persons]1)
    %if;(bvar.motd != "")
    %apply;interp(bvar.motd)
    %end;

    %if;(browsing_with_sosa_ref) Sosa 1 : %sosa_ref; %else; [*search/case sensitive]0 %end;

    %hidden;
    %if;(bvar.propose_place_surnames != "no")%nl;
    %hidden; [*place] :
    %end; %if;(bvar.propose_titles != "no")%nl;
    %hidden;
    %end;
    %apply;interp([ af: Daar was %nb_accesses; besoeke, %nb_accesses_to_welcome; van hulle aan hierdie blad, sedert %start_date;. bg: От %start_date; наÑам е имало %nb_accesses; поÑещениÑ, от които %nb_accesses_to_welcome; Ñа на наÑтоÑщата Ñтраница. br: gweladennoù a zo bet : %nb_accesses;, er bajenn-mañ : %nb_accesses_to_welcome;, abaoe an deiz-mañ : %start_date;. ca: Hi ha hagut %nb_accesses; consultes, de les quals %nb_accesses_to_welcome; en aquesta pàgina, des del %start_date;. cs: %nb_accesses; přístupů, z toho %nb_accesses_to_welcome; na tuto stránku, od %start_date;. da: Der har været %nb_accesses; opslag, %nb_accesses_to_welcome; af dem pÃ¥ denne side, siden %start_date;. de: Seit dem %start_date; gab es %nb_accesses; Zugriffe, davon %nb_accesses_to_welcome; auf diese Seite. en: There have been %nb_accesses; accesses, %nb_accesses_to_welcome;%sp; of them to this page, since %start_date;. eo: Estis %nb_accesses; alirejoj, el kiuj %nb_accesses_to_welcome; al ĉi tiu paÄo, ekde la %start_date;. es: Ha habido %nb_accesses; consultas, de las cuales %nb_accesses_to_welcome; corresponden a esta página, desde el %start_date;. et: Alates andmebaasi loomise päevast (%start_date;) on selle poole pöördutud %nb_accesses; korda, neist %nb_accesses_to_welcome; korda sellele lehele. fi: Tähän mennessä %nb_accesses; tapahtumaa, joista %nb_accesses_to_welcome; tälle sivulle %start_date; jälkeen. fr: Il y a eu %nb_accesses; consultations, dont %nb_accesses_to_welcome; à cette page, depuis le %start_date;. he: היו %nb_accesses; כניסות, כולל %nb_accesses_to_welcome; כניסות לעמוד ×–×”, מ××– %start_date;. is: Það hafa verið %nb_accesses; heimsóknir, %nb_accesses_to_welcome; af þeim á þessa síðu, síðan %start_date;. it: Dal %start_date; ci sono stati %nb_accesses; accessi, %nb_accesses_to_welcome; dei quali a questa pagina. lv: KopÅ¡ %D datu bÄze ir apmeklÄ“ta %nb_accesses; reizes, %nb_accesses_to_welcome; no tiem ir bijuÅ¡i Å¡inÄ« lappusÄ“. nl: Deze paginas zijn sinds %start_date; reeds %nb_accesses; maal bezocht, waaronder %nb_accesses_to_welcome; maal deze verwelkomingspagina. no: Det har vært %nb_accesses; aksesser, %nb_accesses_to_welcome; av dem til denne siden, siden %start_date;. pl: Baza zostaÅ‚a od %start_date; odwiedzona %nb_accesses; razy (w tym %nb_accesses_to_welcome; razy strona tytuÅ‚owa). pt: Houve %nb_accesses; consultas, das quais %nb_accesses_to_welcome; foram a esta página, desde %start_date;. ro: Au avut loc %nb_accesses; accese din care %nb_accesses_to_welcome; pe aceatsa pagina din %start_date; ru: Ð’Ñего было %nb_accesses; обращений, из них %nb_accesses_to_welcome; к Ñтой Ñтранице, Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ %start_date;. sl: %nb_accesses; dostopov, %nb_accesses_to_welcome; od teh na to stran, od %start_date;. sv: Det har varit %nb_accesses; Ã¥tkomster, %nb_accesses_to_welcome; av dem till den här sidan, sedan %start_date;. zh: å·²ç»æœ‰ %nb_accesses; 次访问数æ®åº“,其中 %nb_accesses_to_welcome; 次访问本主页, 自从 %start_date;。 ])%nl;
    %base_trailer; %copyright; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templm/perso.txt0000660000175200017530000012530012664543647024757 0ustar guillaumeguillaume %if;(evar.del = "on")[*delete]...[person/persons]1...[family/families]1...%else;%first_name; %surname;%end; %include.css; %base_header; %( %) %let;birth_symbol;%if;(bvar.birth_symbol != "")%bvar.birth_symbol;%else;°%end;%in; %let;death_symbol;%if;(bvar.death_symbol != "")%bvar.death_symbol;%else;†%end;%in; %let;l_child;%if;(bvar.always_surname = "yes" and evar.always_surname != "no")child%else;child_name%end;%in; %let;l_hh;%if;(sex=0)[him/her]0%elseif;(sex=1)[him/her]1%else;0%end;%in; %let;l_maxlev0;%if;(evar.maxlev != "")%evar.maxlev;%elseif;(bvar.maxlev != "")%bvar.maxlev;%else;1%end;%in; %let;l_maxlev;%if;(has_children and l_maxlev0 > max_desc_level)%max_desc_level;%else;%l_maxlev0;%end;%in; %let;l_url;;wide=%evar.wide;;maxlev=%l_maxlev;;image=%evar.image;;spouse=%evar.spouse;;%in; %let;l_ldates; %if;(evar.del="on") class="del" target="ifr" onclick="javascript:deleted(this);" title="[delete::person/persons]0" href="%prefix;m=DEL_IND_OK;%nn; %else; onclick="window.open(this.href); return false;" title="[modify::person/persons]0" href="%prefix;m=MOD_IND;%nn; %end; %in; %let;l_lmarriage1; %if;(evar.del="on" and wizard) class="del" target="ifr" onclick="javascript:deleted(this);" href="%prefix;m=DEL_FAM_OK;%nn; %elseif;(wizard) onclick="window.open(this.href); return false;" href="%prefix;m=MOD_FAM;%nn; %else; href="#%nn; %end; %in; %let;l_lmarriage2; %if;(not cancel_links) %if;(evar.del="on" and wizard) %nl; [delete::family/families]0%nn; %elseif;(wizard) %nl; [modify::family/families]0%nn; %end; %end; %in; %define;init_count(prev_count) %reset_count; %for;i;0;prev_count; %incr_count; %end; %end; %define;letter(xx) %apply;nth%with; /A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z%and; xx%end; %end; %define;link_dates(xx) %if;(wizard and not cancel_links) %if;(xx.dates != "")%nn; %xx.dates;%nn; %elseif;(xx.is_dead) %death_symbol;%nn; %else; %birth_symbol;%nn; %end;%nn; %nn; %else;  %xx.dates;%nn; %end; %end; %define;link_marriage(xx) %if;(not cancel_links) %let;him;[him/her]0 %nn; %if;(xx.computable_marriage_age) %xx.marriage_age;%nn; %else; ? [years old]%end;%nn; %in; %let;her;[him/her]1 %nn; %if;(xx.spouse.computable_marriage_age) %xx.spouse.marriage_age;%nn; %else; ? [years old]%end;%nn; %in; &%if;(on_marriage_date != "")%marriage_date.prec;%marriage_date.year;%end; %else; &%if;(on_marriage_date != "")%marriage_date.prec;%marriage_date.year;%end; %end; %end; %define;a_title(xx) %if;(xx.has_parents and xx.birth_date.year != "")  [father/mother]0 %nn; %if;(xx.father.has_birth_date)%xx.father_age_at_birth;%else;? [years old]%end; %nl; [father/mother]1 %nn; %if;(xx.mother.has_birth_date)%xx.mother_age_at_birth;%else;? [years old]%end; %end; %if;(xx.computable_death_age)%nl; %death_symbol%xx.death_age;%end; %if;(xx.computable_age)%nl; %birth_symbol;%xx.age;%end; %end; %define;link_name(xx) %if;(cancel_links or xx.is_restricted) %xx;%nn; %else; %xx;%nn; %end; %end; %define;link_name1(xx,yy,zz) %if;(cancel_links or xx.is_restricted) %yy;%nn; %else; %yy;%nn; %end; %end; %define;link_image(xx) [image/images]0 %end; %define;somebody(xx) %apply;link_name("xx") %xx.title; %apply;link_dates("xx") %end; %define;somebody1(xx,yy,zz) %apply;link_name1("xx","yy","zz") %xx.title; %apply;link_dates("xx") %end; %define;child_long_info(curlev,maxlev) %let;next_chi;chi_%if;(nb_children != child_cnt)%family_cnt;_%expr(child_cnt + 1)%else;1_1%end;%in; %apply;somebody1%with; child%and; %l_child;%and; %if;(curlev = 1)id="chi_%family_cnt;_%child_cnt;"%if;(child.has_sosa) name="sosa" %end; onkeypress="javascript:return acc_key(this,event,'sib_1','spo_%family_cnt;','%next_chi;','child_%child.index;','0','0','0');" %end; %end; %if;(has_families) %if;(evar.image="on") %foreach;family; %if;(evar.spouse != "off")
    %if;(spouse.has_image)%apply;link_image("spouse")%end; %apply;somebody("spouse")
    %end; %if;(curlev < maxlev) %if;(has_children) %foreach;child;
    %if;(child.has_image)%apply;link_image("child")%end; %apply;child_long_info(curlev+1,maxlev)
    %end; %end; %end; %end; %else; %foreach;family; %if;(evar.spouse != "off") %if;(self.sex = 0) %apply;link_marriage("self") %else; %apply;link_marriage("self.spouse") %end; %sp;%apply;somebody("spouse") %end; %if;(curlev < maxlev) %if;(has_children)
      %foreach;child;
    1. %apply;child_long_info(curlev+1,maxlev)
    2. %end;
    %end; %end; %end; %end; %end; %end; %define;children_list() %if;has_children; %if;(evar.image="on") %foreach;child;
    %if;(has_image)%apply;link_image("self")%end; %apply;child_long_info(1,l_maxlev)
    %end; %else;
      %foreach;child;
    1. %apply;child_long_info(1,l_maxlev)
    2. %end;
    %end; %end; %end; %define;advanced(z1,z2) %if;(not cancel_links and bvar.hide_advanced_request != "yes") %let;x1; %prefix;m=H;v=advanced;focus=z1;birth1_yyyy=%birth_date.year;;death2_yyyy=%death_date.year;;z1=%nn; %in; z2%nn; %else; z2%nn; %end; %end; %define;type_marriage() %if;are_married;[*married] %elseif;are_not_married;[*not married] %elseif;are_engaged;[*engaged] %elseif;is_no_sexes_check;[*not married] %elseif;is_no_mention;~ %end; %end; %define;marriage_date_place() %if;(marriage_place = "") %if;(on_marriage_date = "") %else; %on_marriage_date;%nn; %end; %else; %if;(on_marriage_date = "") [in (place)] %apply;advanced("marriage_place",marriage_place)%nn; %else; %on_marriage_date; [in (place)] %apply;advanced("marriage_place",marriage_place)%nn; %end; %end; %end; %define;content_marriage(xx) %if;are_divorced;… [divorced]%divorce_date;%nn; %elseif;are_separated;… [separated]%nn; %end; %if;has_witnesses; %if;cancel_links;  ; [witness/witnesses]w :%sp;%nn; %else; %reset_count;%nn;  ; [witness/witnesses]w :%sp;%nn; %end; %foreach;witness; %if;not is_first;, %end; %apply;somebody("witness")%nn; %( %) %if;(witness.has_qualifiers and witness.title=", Cousin") @%nn; %end;%nn; %( %) %end;%nn; %end; %if;has_comment; ;%sp;%comment;%end; %end; %define;content_family(xx,yy) %if;(evar.image="on")
    %if;(xx.has_image)%apply;link_image("xx")%end; %xx;%xx.title; %xx.dates;
    %if;(xx.sex = 0) %apply;link_marriage("xx") %else; %apply;link_marriage("xx.spouse") %end;
    %if;(yy.has_image)%apply;link_image("yy")%end; %apply;somebody1%with;yy%and;yy%and;%end;
    %else; %let;next_spo;spo_%if;(nb_families != family_cnt)%expr(family_cnt + 1)%else;1%end;%in; %if;(xx.sex = 0) %apply;link_marriage("xx") %else; %apply;link_marriage("xx.spouse") %end;%sp; %apply;somebody1%with; yy%and; yy%and; id="spo_%family_cnt;" onkeypress="javascript:return acc_key(this,event,'sib_1','%next_spo;','chi_%family_cnt;_1','spouse_%spouse.index;','0','0','f%family.index;');" %end; %end;
    %apply;type_marriage() %apply;marriage_date_place() %apply;content_marriage("xx") %apply;children_list() %end; %define;parents(xx,yy,zz) %foreach;xx.parent; %let;l_sosa;%if;parent.is_female;%expr(zz + 1)%else;%zz;%end;%in yy %if;(parent.has_siblings) ♦ %elseif;(parent.has_parents) ◊ %elseif;(wizard and not cancel_links)  -  %else; - %end; %apply;link_name1%with; parent%and; parent%and; id="par_%l_sosa;" onkeypress="javascript:return acc_key(this,event,'sib_1','spo_1','chi_1_1','parent_%parent.index;','add_par_%l_sosa;','par_%l_sosa;','par_%l_sosa;');" %end; %apply;link_dates("parent") %end; %end; %define;anc_families() %if;has_parents;

    [*ancestors]

    %if;(l_maxlev > 1) %if;father.has_parents; %if;father.father.has_parents;%apply;parents("father.father","        ",8)%end; %apply;parents("father","    ",4) %if;father.mother.has_parents;%apply;parents("father.mother","        ",10)%end; %end; %apply;parents("self","",2) %if;mother.has_parents; %if;mother.father.has_parents;%apply;parents("mother.father","        ",12)%end; %apply;parents("mother","    ",6) %if;mother.mother.has_parents;%apply;parents("mother.mother","        ",14)%end; %end; %else; %if;father.has_parents;%apply;parents("father","    ",4)%end; %apply;parents("self","",2) %if;mother.has_parents;%apply;parents("mother","    ",6)%end; %end;
    %if;(father.nb_children > 1 or mother.nb_children > 1)

    [*full siblings]

      %foreach;father.child;
    1. %if;is_self;%end; %let;next_sib;sib_%expr(child_cnt + 1)%in; %apply;link_name1%with; child%and; %l_child;%and; id="sib_%child_cnt;" onkeypress="javascript:return acc_key(this,event,'%next_sib;','spo_1','chi_1_1','child_%child.index;','0','0','0');" %end; %if;is_self;%end; %apply;link_dates("child")
    2. %end;
    %foreach;father.family; %if;(spouse.index != mother.index) %if;has_children;
    1. [*on %s's side:::] %father; [and] %apply;somebody("spouse") :
    2. %foreach;child;
    3. %if;is_self;%end; %let;next_sib;sib_%expr(child_cnt + 1)%in; %apply;link_name1%with; child%and; %l_child;%and; %end; %if;is_self;%end; %apply;link_dates("child")
    4. %end;
    %end; %end; %end; %foreach;mother.family; %if;(spouse.index != father.index) %if;has_children;
    1. [*on %s's side:::] %mother; [and] %apply;somebody("spouse") :
    2. %foreach;child;
    3. %if;is_self;%end; %let;next_sib;sib_%expr(child_cnt + 1)%in; %apply;link_name1%with; child%and; %l_child;%and; %end; %if;is_self;%end; %apply;link_dates("child")
    4. %end;
    %end; %end; %end;
    %end; %elseif;(wizard and not cancel_links and first_name != "?" and surname != "?") %end; %end; %define;lex(xx,yy) %if;(yy = 0)[xx]0%elseif;(yy = 1)[xx]1%else;[xx]2%end; %end; %define;relation_computing() %let;l_rt; %if;(relation_type = [godfather/godmother/godparents]2 or relation_type = [godfather/godmother/godparents]1 or relation_type = [godfather/godmother/godparents]0) godfather/godmother/godparents%nn; %elseif;(relation_type = [adoptive father/adoptive mother/adoptive parents]2 or relation_type = [adoptive father/adoptive mother/adoptive parents]1 or relation_type = [adoptive father/adoptive mother/adoptive parents]0) adoptive father/adoptive mother/adoptive parents%nn; %elseif;(relation_type = [recognizing father/recognizing mother/recognizing parents]2 or relation_type = [recognizing father/recognizing mother/recognizing parents]1 or relation_type = [recognizing father/recognizing mother/recognizing parents]0) recognizing father/recognizing mother/recognizing parents%nn; %elseif;(relation_type = [candidate father/candidate mother/candidate parents]2 or relation_type = [candidate father/candidate mother/candidate parents]1 or relation_type = [candidate father/candidate mother/candidate parents]0) candidate father/candidate mother/candidate parents%nn; %elseif;(relation_type = [foster father/foster mother/foster parents]2 or relation_type = [foster father/foster mother/foster parents]1 or relation_type = [foster father/foster mother/foster parents]0) foster father/foster mother/foster parents%nn; %else; * %end; %in; %let;l_rt0;%if;(l_rt != "*")%apply;lex(l_rt,0)%else;*%end;%in; %let;l_rt1;%if;(l_rt != "*")%apply;lex(l_rt,1)%else;*%end;%in; %if;cancel_links; %apply;capitalize(relation_type) :%nn; %else; %reset_count; %apply;capitalize(relation_type) :%nn; %end; %end; %define;related_computing() %if;cancel_links; %apply;capitalize(related_type) :%nn; %else; %reset_count; %apply;capitalize(related_type) :%nn; %end; %end; %define;witness_computing() %if;cancel_links; [*witness at marriage of %s and %s:::x:y] :%nn; %else; %reset_count; [*witness at marriage of %s and %s:::x:y] :%nn; %reset_count; %end; %end; %define;age_at(xx) [age at %s birth date:::xx]%nn; %end; %define;nav_with_sosa_ref(xx) [*navigation with %t as Sosa reference:::xx] %end; %define;link_ng(z1,z2) %if;cancel_links;z2%nn; %else; %let;x1; %prefix;m=NG;t=z1;n=%nn; %in; z2%nn; %end; %end; %( %) %nn;
    %( the magic Safari div %) %message_to_wizard; %( %) %if;not cancel_links; %end; %( %) %if;(evar.del = "on")

    [*delete]… [person/persons]1… [family/families]1…

    %if;(wizard and bvar.can_kill_ancestors="yes")

    /!\ can_kill_ancestors=yes    %nn; %self; /!\ [delete::ancestors]0 /!\    can_kill_ancestors=yes /!\

    %end; %end;
    %( %)

    %if;(has_public_name or has_qualifiers) %apply;link_ng("PN",self) %else; %apply;link_ng("P",first_name)%sp;%nn; %apply;link_ng("N",surname) %end; %apply;link_dates("self")

    %if;has_image; %end;

    %if;has_nobility_titles; %foreach;nobility_title; %nobility_title; %end; %end; %if;(has_linked_pages and has_linked_page.HEAD)%linked_page.HEAD;%end; %if;(has_nobility_titles and has_public_name) %apply;link_ng("PN",public_name) %end; %if;has_qualifiers; %apply;lazy_print("") %foreach;qualifier; %( %) %if;is_first; %if;(title=", Cousin") Arbre en ligne %end; %end; %( %) %if;not is_first; %if;(lazy_printed)/%end; %lazy_force; %apply;link_ng("PN",qualifier)%nn; %end; %end; %end; %if;has_aliases; %apply;lazy_print("") %nn; %foreach;alias; %if;(lazy_printed)/%end; %lazy_force; %apply;link_ng("PN",alias)%nn; %end; %end; %if;(has_public_name or has_qualifiers) (%apply;link_ng("P",first_name)%sp; %apply;link_ng("N",surname)) %end; %if;has_first_names_aliases; %apply;lazy_print("") %foreach;first_name_alias; %if;(lazy_printed)/%end; %lazy_force; %apply;advanced("first_name",first_name_alias)%nn; %end; %end; %if;has_surnames_aliases; %apply;lazy_print("") %foreach;surname_alias; %if;(lazy_printed)/%end; %lazy_force; %apply;link_ng("N",surname_alias)%nn; %end; %end;

    %if;has_occupation; %apply;advanced%with;occu%and;%apply;capitalize(occupation)%end; %end; %if;(has_linked_pages and has_linked_page.OCCU)    %linked_page.OCCU; %end; %if;has_birth_date; %apply;capitalize(nth([born],sex)) %on_birth_date; %if;birthday; ([happy birthday to you!])%end; %if;has_birth_place; [in (place)] %apply;advanced("birth_place",birth_place)%end; %if;(has_parents) %if;(father_age_at_birth != "" or mother_age_at_birth != "")    (%nn; %if;(father_age_at_birth != "")[father/mother]0 %father_age_at_birth;%nn; %if;(mother_age_at_birth != ""), %end; %end; %if;(mother_age_at_birth != "")[father/mother]1 %mother_age_at_birth;%end; ) %end; %end; %else; %if;has_birth_place; %apply;capitalize(nth([born],sex)) [in (place)] %apply;advanced("birth_place",birth_place) %end; %end; %if;has_baptism_date; %apply;capitalize(nth([baptized],sex)) %on_baptism_date; %if;has_baptism_place; [in (place)] %apply;advanced("bapt_place",baptism_place)%end; %else; %if;has_baptism_place; %apply;capitalize(nth([baptized],sex)) [in (place)] %apply;advanced("bapt_place",baptism_place) %end; %end; %if;is_dead; %apply;capitalize(died) %if;has_death_date; %on_death_date;%end; %if;has_death_place; [in (place)] %apply;advanced("death_place",death_place)%end; %if;computable_death_age;    [age at death:] %death_age; %end; %if;has_linked_page.DEATH;    %linked_page.DEATH; %end; %if;is_buried; %apply;capitalize(nth([buried],sex)) %if;has_burial_date; %on_burial_date;%end; %if;has_burial_place; [in (place)] %apply;advanced("burial_place",burial_place)%end; %end; %if;is_cremated; %apply;capitalize(nth([cremated],sex)) %if;has_cremation_date; %on_cremation_date;%end; %if;has_cremation_place;, %cremation_place;%end; %end; %end; %if;computable_age; [*age] : %age; %end; %( %) %if;(has_sosa and sosa != 1) %let;l_sosa_ref; %apply;a_of_b%with; %and; %apply;link_name("sosa_ref") %end; %in; %if;cancel_links; [*Sosa] %sosa; %l_sosa_ref; %else; [*Sosa] %sosa; %l_sosa_ref;%nn; %end; %elseif;(sosa = 1) [*Sosa] 1 %end; %if;(bvar.show_consang != "no" or manitou) %if;(has_parents) %reset_count; %foreach;ancestor_level %if;(level = max_anc_level) %number_of_ancestors; [ancestors] / %level; [generation/generations]1%nn; %end; %foreach;ancestor %if;(ancestor.same != "") %incr_count; %end; %end; %end; %if;(has_consanguinity or count != 0) , %if;(cancel_links) [consanguinity] : %consanguinity; %else; [consanguinity] : %consanguinity; %end; %if;(count != 0) (%nn; %if;(not cancel_links) %count; ==%nn; %else; %count; ==%nn; %end;) %end; %end; %end; %if;(has_children) %foreach;descendant_level; %if;(level = max_desc_level) %number_of_descendants; [descendants] / %level; [generation/generations]1 %end; %end; %end; %end; %( %) %if;(not cancel_links and has_linked_pages) ([linked pages]) %end;

    %( %) %if;(bvar.var_img_ext != "" and (has_linked_pages or wizard)) %include.inc_mickroue2; %end; %( %) %if;(has_notes or has_linked_pages) %if;(has_notes or has_linked_page.BNOTE or has_linked_page.NOTE)

    [*note/notes]1

    %if;(has_linked_page.BNOTE)

    >> %linked_page.BNOTE;

    %end; %notes;
    %end; %end; %if;(has_relations and bvar.var_photo != "on")

    [*relation/relations]1

      %foreach;relation;
    • %apply;relation_computing()
        %if;has_relation_him;
      • %apply;somebody("relation_him")
      • %end; %if;has_relation_her;
      • %apply;somebody("relation_her")
      • %end;
    • %end; %foreach;related;
    • %apply;related_computing()
      • %apply;somebody("related")
    • %end; %reset_count; %foreach;witness_relation; %if;(count = 0)
    • %apply;witness_computing() %end; %incr_count; %end; %if;(count > 0)
      %apply;somebody("witness_relation.father") %apply;link_marriage("witness_relation.father") %apply;somebody("witness_relation.mother")
      %if;(count > 5) [*total] : %count; %end;
    • %end;
    %end; %if;(bvar.var_photo = "on" and has_relations) %include.inc_mickroue1; %end; %if;(has_sources or has_linked_page.BIBLIO)

    [*source/sources]1

      %if;(has_linked_page.BIBLIO)
    • >> %linked_page.BIBLIO;
    • %end; %foreach;source;
    • %source_type; : %source;
    • %end;
    %end; %( %)
    %( %) %apply;anc_families() %if;has_families;

    [*descendants]

    %foreach;family;
    %if;(wizard and not cancel_links and family_cnt != 1) %if;(family_cnt != 1) ^ %if;(family.father.index = prev_family.father.index and family.mother.index = prev_family.mother.index) %nn; [*merge::] %end; %end; %end; %apply;content_family("self","spouse") %if;(evar.opt = "from" and wizard)(%origin_file;)%nl;%end; %if;(evar.image = "on" and nb_families > 1)
    %end;
    %end;
    %else; %if;(wizard and not cancel_links)
    %if;((first_name = "?" or surname = "?") and (nb_families != 0 or has_parents)) %elseif;(not is_male and not is_female) %nn; [add::family/families]0 ([M/F]0) %nn; [add::family/families]0 ([M/F]1) %else; [add::family/families]0 %end;
    %end; %end; %( %)
    %( %) %if;not cancel_links;
    %if;wizard; [*update] %if;(bvar.history_diff="yes" and has_history) [history]%nn; %end; [modify::person/persons]0%nn; %foreach;family; %if;(family_cnt < 4) %let;a_k;%if;(family_cnt = 1)F%elseif;(family_cnt = 2)G%elseif;(family_cnt = 3)H%end;%in; [modify::family/families]0 %family_cnt;%nn; %else; [modify::family/families]0 %family_cnt;%nn; %end; %end; [add::family/families]0%nn; [send::image/images]0%nn; [merge]0 (oc=%occ;)%nn; %if;(evar.del = "on") [delete]%nn; %else; [delete]%nn; %end; %end; %if;has_parents; [*ancestors] [tree]%nn; [surnames branch]%nn; [table]%nn; [long display]%nn; %end; %if;has_children; [*descendants] [tree]%nn; d’Aboville%nn; [long display]%nn; %end; [*relationship computing] %if;(browsing_with_sosa_ref) %if;(sosa_ref.index != "" and sosa_ref.index != index) [shortest path]%nn; %end; %end; 7 [family/families]1%nn; %if;(has_parents) %if;(father.has_siblings or mother.has_siblings) [uncles and aunts]%nn; %end; %end; %if;has_nephews_or_nieces; [nephews and nieces]%nn; %end;
    %end; %( %) %if;(not cancel_links and wizard and (evar.opt = "misc" or bvar.misc = "on"))
    %misc_names;
    %end; %if;(evar.del="on") %end;
    %base_trailer; %copyright;
    %( the magic Safari div %) geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templm/css.css0000660000175200017530000003530412664543647024374 0ustar guillaumeguillaume/* css.txt or css.css */ /* mickroue(a)yahoo.fr 20130703 templ=templm */ /* Properties of all html pages.*/ html{background:url('/images/gwback.jpg');} /* Properties of all html pages */ body{word-wrap:break-word;} table{word-wrap:normal;} label{white-space:nowrap;} body,td,th,form,input,select,legend{font-family:Arial;font-size:14px;} legend{margin-left:10px;} dt{font-weight:bold;} .list_no_style{margin:0;padding-left:10px;list-style-type:none;} .background_sex_0{background-color:#ADD8E6;} .background_sex_1{background-color:#FFB6C1;} .background_sex_2{background-color:#FFFFFF;} .border_sex_0{border-left-width:5px;border-left-color:#ADD8E6;} .border_sex_1{border-left-width:5px;border-left-color:#FFB6C1;} .border_sex_2{border-left-width:5px;border-left-color:#FFFFFF;} .h1_border_sosa{border:5px solid #FFD700;} .border_sosa{border-left:solid 5px #FFD700;} .border_family_0{border-left-style:double;} .border_family_1{border-left-style:solid;} .color_sosa{color:#FFD700;} .color_sex_0{color:#ADD8E6;} .color_sex_1{color:#FFB6C1;} .color_sex_2{color:#FFFFFF;} /* Properties to highlight words generated by GeneWeb. All pages.*/ .error{color:#9c1117;} .even{background-color: transparent;} .highlight,h1,h2,h3,h4,h5,h6,legend,th{color:#620000;} .highlight{font-weight:bold;} .highlight1{color:#990000;} .odd{background-color:#FBFBFB;} .reference{font-size:80%;font-style:italic;} .with_picto{background-repeat: no-repeat;background-position: left center;padding: 4px 4px 4px 20px;} /* Properties for the unvisited,visited and mouse over links. All pages. */ a:link.date,a:visited.date{text-decoration:none;color:inherit;background-color:transparent;} a:link,a:visited,a:link.highlight,a:visited.highlight{color:#291D81;text-decoration:none;} a:hover.date,a:hover,label:hover,input:hover,.button a:hover,.menu a:hover,.menu1 a:hover,.menu2 a:hover,a:active,a:focus,input:focus{background-color:#EECCFF;color:#000000;text-decoration:none;} a:hover{z-index:100;} /* Properties of the main title. All pages. */ h1{text-align:center;} /* Properties of the menu2. All pages. */ .menu2{position:absolute;top:0px;right:0px;font-family:Arial;font-size:14px;} .menu2 a,.menu2 .s_menu,#ak input{float:left;background-color:buttonface;border:solid 1px #FFFFC0;margin:0px;padding:2px;color:buttontext;} .menu2 div{position:relative;display:block;float:left;} .menu2 .s_menu{display:none;float:left;width:350px;padding:5px;} .menu2 .s_menu a{margin:10px;padding:10px;width:308px;} .menu2 fieldset{clear:both;padding:10px;margin:10px;} .menu2 div:hover > .s_menu{display:block;position:absolute;right:0px;top:1.5em;z-index:10000;} .menu2 .s_menu label{display:block;padding:2px;} .menu2 .ok{width:100%;} .menu2 .ok input{width:100%;} .menu2 .v label{text-align:center;width:2em;height:2.2em;float:left;border:solid 1px #FFFFC0;margin-left:-1px;margin-bottom:-1px;} /* Properties of the footer block. All pages. */ #footer{clear:both;width:100%;} #footer hr{color:#e7edb3;} /* Properties of the title block. All pages. */ #title{padding-top:10px;width:100%;background-color:#e7edb3;} /* Propositions de background dans certains menus */ .bg1{background-color:#FFC0C0;} .bg2{background-color:#FFFFC0;} .bg3{background-color:#C0FFC0;} .bg4{background-color:#C0FFFF;} .bg5{background-color:#C0C0FF;} .bg6{background-color:#FFC0FF;} /* Pyramide des âges */ .pyramid{text-align:center;} .pyramid_male,.pyramid_female{font-style:italic;margin:1px 5px;padding:0px 5px;} .pyramid_male{border-right-style:solid;border-right-color:#0C4460;text-align:right;} .pyramid_female{border-left-style:solid;border-left-color:#E45484;text-align:left;} /* Notes diverses */ li.folder{list-style-type:disc;} li.file{list-style-type:circle;} li.parent{list-style-type:disc;} /* … avec images */ li.folder{list-style-image:url('images/folder.png');} li.file{list-style-image:url('images/file.png');} li.parent{list-style-image:url('images/left.png');} /* updata.txt */ #nx_input{margin: 0px 5px;} /* wiki */ #summary{border:ridge 3px #844404;} div.summary ul{padding-left:0;list-style-type:none} div.summary ul ul{padding-left:1.618em} .subtitle{border-bottom:solid 1px #844404;} .found{color:black;background-color:#afa;font-weight:bold} /* trees */ hr.left,hr.right,hr.full{border-top:solid 1px black;border-left:0;border-right:0;border-bottom:0;margin:0;} hr.left{margin-left:0;margin-right:50%;} hr.right{margin-left:50%;margin-right:0;} hr.full{margin-left:0;margin-right:0;} /* perso.txt */ #perso,#dag,#anctree{margin:0;padding-top:2em;padding-right:2px;padding-bottom:2em;padding-left:2px;} #perso h1,#perso h3{margin:5px;padding:5px;} #perso h1{font-size:150%;} #perso h3{font-size:120%;} #perso ol,#perso ul,#perso .data2{margin-left:0px;padding-left:20px;} #perso li{margin:2px 0 0 0;padding:0 0 0 10px;} #perso .person h1{color:inherit;} .menu{margin:0;padding:0;border:0;position:absolute;top:0;left:0;font-family:Arial;font-size:14px;} .menu span{position:relative;display:block;float:left;} .menu span a{float:left;} .menu .s_menu{display:none;float:left;margin-left:0;margin-top:0;padding:0;border:0;width:200px;} .menu span:hover > .s_menu{display:block;position:absolute;left:0;top:1.5em;z-index:10;} .menu .s_menu a{width:200px;} .menu1{font-size:1em;line-height:1.5em;} .menu1 a{vertical-align:middle;} .menu1 > span{display:block;margin:10px;} .button a,.menu a,.menu1 a{background-color:buttonface;border:solid 1px #FFFFC0;margin:0px;padding:2px;color:buttontext;} .nobr{white-space:nowrap;} abbr{border-bottom:0;} .hide{visibility:hidden;} .small{font-size:.7em;} #perso .col1, #perso .col2{float:left;padding:2px;margin:2px;} #perso .col1{margin-right:0px;} #perso .col2{margin-left:-1px;} #perso .col2 > div{float:left;padding:5px;margin:5px;} #perso .col2 .fam{margin-bottom:10px;clear:both;} #perso .col2 ol{list-style-type:none;padding:0;margin:0;} #perso .col2 p{display:inline;} #perso .data1,#perso .person div{text-align:center;} #perso .person,#perso .notes,#perso .sources,#perso .relations{clear:both;overflow:auto;} #perso .person_img{max-width:240px;max-height:240px;} #perso .image img{max-width:12.5em;max-height:12.5em;} #perso .image,#perso .image_sheet{float:left;width:12.5em;} #perso .image{display:block;margin:0;padding:0;} #perso .image img{border:none;margin:0;padding:0;} #perso .t_witness td{background-color:buttonface;padding:2px;margin:2px;} #perso .sheet{max-width:95%;width:auto;float:left;border:0;margin:5px;padding:5px;background-color:#FFFFC0;color:infotext;text-align:left;} #perso .image_sheet{border:0;margin:4px;padding:5px;background-color:#FFFFC0;color:infotext;text-align:center;} #perso .del {cursor:crosshair;color:#AA1111;border-bottom:dotted 2px red;} /* updind.txt */ #sex_person,.modify_person{text-align:right;padding:0.5em;margin:0em;} /* updind.txt,updfam.txt */ #upd form,#upd input,#upd select,#upd textarea{font-size:11px;} #upd fieldset{width:auto;float:left;border:solid 1px #808080;margin:0.2em;padding:0.2em;} #upd fieldset dt{width:auto;float:left;} input{padding:0em 0.2em 0em;margin:0em 0.2em 0em;} input[type='checkbox'],input[type='radio']{width:auto;height:auto;vertical-align:middle;padding:1px;} #upd legend{font-size:12px;font-weight:bold;} #upd .sure{background-color:#90EE90;} #upd .not_sure{background-color:#C0C0C0;} #upd .number{font-family:"Courier New",Courier,monospace;font-size:12px;font-weight:bold;text-align:center;} #upd th,#upd td{white-space:nowrap;padding-left:5px;padding-right:5px;} #upd .addrow{border-right:solid 2px green;border-bottom:solid 2px green;border-top:0;border-left:0;margin:0;padding:0;} #upd .addrow input{margin:0;padding:0;} #upd .bg7,#upd th{font-size:11px;background-color:#E7EDB3;} /* ancmenu.txt,desmenu.txt,relmenu.txt */ #menutxt fieldset{width:300px;float:left;margin:2px;} #menutxt fieldset fieldset{width:270px;} /* calendar.txt */ #calendar{margin-right:auto;margin-left:auto;} #calendar th{background-color:#E7EDB3;padding:5px;} #calendar input{text-align:right;} #calendar select{text-align:center;width:100%;} /* anclist.txt */ .ld_birth0{background-color:#ADD8E6;} .ld_birth1{background-color:#FFB6C1;} .ld_birth2{background-color:#FFFFFF;} .ld_death0,.ld_death0 td a{background-color:#000000;color:#ADD8E6;} .ld_death1,.ld_death1 td a{background-color:#000000;color:#FFB6C1;} .ld_death2,.ld_death2 td a{background-color:#000000;color:#FFFFFF;} .ld_marriage{background-color:#FFFFC0;} .ld_before,.ld_after{background-color:#C0C0C0;} .ld_no_date{background-color:#DCDCDC;} .ld_him_her{font-weight:bold;} .fam71{font-size:16pt;float:left;color:white;text-align:center;padding:5px;margin:5px;border:solid 1px #AAAAAA;;background-color:white;} .fam71 img{max-width:305px;max-height:305px;} .fam71 a,.ldimg0 span,.ldimg0 strong{display:block;} .fam71 strong{color:black;} .fam72{overflow:hidden;font-size:0px;color:black;text-align:center;border:solid 1px #AAAAAA;;width:100px;height:150px;background-color:white;cursor:crosshair;position:absolute;bottom:25px;left:25px;} .fam72 img{margin:5px;max-width:90%;max-height:70%;} .fam72 span{font-size:12px;color:black;line-height:12px;font-family:'Comic sans MS',sans-serif;} /* anclist.txt, deslist.txt */ .bcbg1{border:solid 1px #555555;color:#EEEEEE;background-color:#000000;} .bcbg2{border:solid 1px #555555;color:#EEEEEE;background-color:#555555;} .col{position:absolute;text-align:right;line-height:30px;font-size:16px;width:80px;padding-right:5px;} .title{background-color:#555555;} .stat_ars{position:relative;margin-left:-10px;} .stat_ars a{position:absolute;} #form_ars input{margin-left:5px;} #form_ars .number{font-family:monospace;font-size:14px;font-weight:bold;text-align:center;width:40px;} #form_ars label{margin:5px;} #form_ars table{margin:1em;} .stat1{margin:auto;} .s1{position:relative;clear:both;margin:auto;width:480px;} .s1 strong, .s1 span{position:absolute;} .s1 span{font-size:10px;line-height:7px;} .s2{left:20px;margin:2px;} .s3{right:20px;margin:2px;} .s4{left:200px;width:80px;text-align:center;} .s5{text-align:right;right:280px;padding-right:5px;border-right-style:solid;border-color:#4682B4;} .s6{text-align:left;left:280px;padding-left:5px;border-left-style:solid;border-color:#FF69B4;} .stat_age1{position:relative;clear:both;margin:auto;width:475px;height:382px;} .stat_age1 .col{width:35px;} .stat_age1 .body{position:absolute;left:40px;top:19px;} .stat_age1 .body span{position:absolute;font-size:10px;line-height:7px;padding-left:5px;} .stat_age2{position:relative;clear:both;width:900px;margin-left:auto;margin-right:auto;margin-top:10px;} .stat_age2 .body{position:relative;} .stat_age2 .link{position:absolute;font-size:x-small;} .stat_age2 .date{position:absolute;left:860px;top:10px;} .stat_age2 .lev{position:absolute;left:10px;top:10px;} .stat_bmdm{margin:auto;} .stat_calendar,.stat_month{position:relative;} .stat_calendar{clear:both;top:2px;width:956px;height:390px;line-height:30px;font-size:16px;text-align:center;vertical-align:middle;} .stat_calendar div{position:absolute;} .stat_calendar .title{display:block;width:88px;} .stat_calendar .row{left:88px;top:0px;font-family:monospace;} .stat_calendar .row div{position:relative;float:left;width:28px;} .stat_calendar .body{left:89px;top:31px;} .stat_calendar .body a,.stat_calendar .body span{position:absolute;width:25px;font-size:12px;font-family:monospace;line-height:27px;} .stat_month{width:475px;height:382px;top:0px;} .stat_month .body{position:absolute;left:85px;top:19px;} .stat_month .body span{position:absolute;font-size:10px;line-height:7px;padding-left:5px;} .m01{top:10px;}.m02{top:40px;}.m03{top:70px;}.m04{top:100px;}.m05{top:130px;}.m06{top:160px;}.m07{top:190px;}.m08{top:220px;}.m09{top:250px;}.m010{top:280px;}.m011{top:310px;}.m012{top:340px;} .m11{top:20px;}.m12{top:50px;}.m13{top:80px;}.m14{top:110px;}.m15{top:140px;}.m16{top:170px;}.m17{top:200px;}.m18{top:230px;}.m19{top:260px;}.m110{top:290px;}.m111{top:320px;}.m112{top:350px;} .a011{top:10px;}.a010{top:40px;}.a09{top:70px;}.a08{top:100px;}.a07{top:130px;}.a06{top:160px;}.a05{top:190px;}.a04{top:220px;}.a03{top:250px;}.a02{top:280px;}.a01{top:310px;}.a00{top:340px;} .a111{top:20px;}.a110{top:50px;}.a19{top:80px;}.a18{top:110px;}.a17{top:140px;}.a16{top:170px;}.a15{top:200px;}.a14{top:230px;}.a13{top:260px;}.a12{top:290px;}.a11{top:320px;}.a10{top:350px;} /* deslist.txt */ #deslist li{margin:2px 0 0 0;padding:0 0 0 10px;} #deslist .notes_src em{font-size:80%;} /* ancsosa.txt */ #ancsosa li{margin:2px 0 0 0;padding:0 0 0 10px;} .generation{margin:0px;padding-top:5px;padding-bottom:5px;border-top:ridge #D2691E 2px;text-align:center;} .ancestor_male{margin:0px;padding-top:5px;border-top:dotted #B8860B 1px;} .is_desc_10{background-color:#ADD8E6;} .is_desc_11{background-color:#FFB6C1;} .other_family{font-size:80%;} .sure_dates0,.sure_dates00,.sure_dates01,.sure_dates10{color:#B8860B;} .sure_dates1,.sure_dates11{background-color:#90EE90;width:100px;} .not_sure_dates{background-color:#C0C0C0;color:inherit;} .xs{font-style:normal;font-size:x-small;} .top{vertical-align:top;} .p_left{padding-left:5px;} .p_right{padding-right:5px;} /* ancsosa.txt,deslist.txt */ #ancsosa .image,#deslist .image{max-width:100px;max-height:150px;float:right;margin:3px;} #ancsosa dt, #deslist dt{margin-top:10px;} #ancsosa li .image #deslist li .image{max-width:75px;max-height:125px;float:right;margin:3px;} .icom{padding:5px;margin:5px;background-color:#EFEFEF;font-size:0.9em;} .inot{padding:5px;margin:5px;background-color:#CFCFCF;font-size:0.9em;} .isrc{padding:5px;margin:5px;background-color:#8F8F8F;font-size:0.8em;} .isrc em{color:#DFDFDF;} /* ancsosa.txt,anclist.txt */ .ld_table,.short_display_table{margin-left:auto;margin-right:auto;text-align:center;border-collapse:collapse;} .ld_table tr th,.short_display_table tr th{border-top:ridge #D2691E 2px;border-bottom:dotted #B8860B 1px;} .ld_table tr td,.short_display_table tr td{border:dotted #B8860B 1px;} .ld_table a,.short_display_table a{display:block;} /* welcome.txt */ #welcome div, #welcome form{margin: 2px; padding: 2px;} #welcome_content-top,#welcome_content-bottom{width: 100%;clear:both;text-align:center;} #welcome_content-left{min-height:300px;min-width:275px;width:37%;float:left;} #welcome_content-right{min-height:300px;min-width:275px;width:60%;float:left;} #welcome_motd{border:solid 1px #FFFFC0;} #welcome_user-info{position:absolute;right:30px;top:0px;} #welcome_title{width:100%;} #welcome_content-right form table{width:100%;border:solid 1px #FFFFC0;} #trl,#misc,.menu1{clear:both;padding:2px;margin:2px;border:solid 1px #FFFFC0;} #templ{font-size:12px;padding:2px;margin:2px;text-align:center;} #templ a{text-decoration:none;padding:.2em 1em;color:#FFFFFF;background-color:#2F6400;} #templ a:hover{color: #FFFFFF;background-color: #4A9900;} /* upddata.txt */ .updhist_table{white-space: nowrap;} .updhist_table_header{background-color: #6F8301;color: white;} .hist_summary{margin-top:15px;margin-bottom:15px;} .diff_highlight{background-color:pink;} .hist_lbl{white-space: nowrap;background-color : #6F8301;color: white;} geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templm/css.txt0000660000175200017530000000021112664543647024410 0ustar guillaumeguillaume geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templm/js.js0000660000175200017530000001125512664543647024043 0ustar guillaumeguillaume/* js.js mickroue(a)yahoo.fr 20130624 templ=templm */ function adv(z1,z2) { var x2 = z2.innerHTML; parent.location.href = z1 + x2; } function adv1(z1,z2) { var x2 = z2.innerHTML; var x3 = x2.charAt(0) parent.location.href = z1 + x3 + x2; } function changeDate(add,del,text,i0,i1,e1,i2,e2) { var v0 = document.getElementById(i0); var v1 = document.getElementById(i1); var v2 = document.getElementById(i2); if (v1.value == '' && v2.value == '') { v0.firstChild.nodeValue = del + text; v1.value = e1; v2.value = e2; } else { v0.firstChild.nodeValue = add + text; v1.value = ''; v2.value = ''; } } function changeTri(xx) { var labelTriA = document.getElementById('labelTriA') var triA = document.getElementById('triA') var mNG = document.getElementById('mNG') var tP = document.getElementById('tP') var tN = document.getElementById('tN') var n = document.getElementById('n') triA.style.visibility=xx; labelTriA.style.visibility=xx; if(xx == 'visible' && triA.checked == true) { if(tP.checked == true) mNG.value='P'; if(tN.checked == true) mNG.value='N'; n.name='k'; } if(xx == 'hidden' || triA.checked == false) { mNG.value='NG'; n.name='n'; } } function computeSosa(event,id) { var x = document.getElementById(id); var key = event.keyCode ? event.keyCode : event.which ? event.which : event.charCode; var string = String.fromCharCode(key); if (x.value > 0) { switch (string) { case "*" : x.value = x.value * 2; return false; break; case "/" : x.value = parseInt(x.value / 2); return false; break; } } } function deleted(x) { x.setAttribute("style","color:#C0C0C0;font-style:italic;","false"); } function insertTags (tagOpen, tagClose, sampleText) { var t = document.forms[0].notes; // IE if(document.selection) { var theSelection = document.selection.createRange().text; if(!theSelection) { theSelection=sampleText;} t.focus(); if(theSelection.charAt(theSelection.length - 1) == " ") {// exclude ending space char, if any theSelection = theSelection.substring(0, theSelection.length - 1); document.selection.createRange().text = tagOpen + theSelection + tagClose + " "; } else { document.selection.createRange().text = tagOpen + theSelection + tagClose; } } else { if(t.selectionStart || t.selectionStart == '0') { var replaced = false; var startPos = t.selectionStart; var endPos = t.selectionEnd; if(endPos-startPos) replaced=true; var scrollTop=t.scrollTop; var myText = (t.value).substring(startPos, endPos); if(!myText) {myText=sampleText;} if(myText.charAt(myText.length - 1) == " ") { // exclude ending space char, if any subst = tagOpen + myText.substring(0, (myText.length - 1)) + tagClose + " "; } else { subst = tagOpen + myText + tagClose; } t.value = t.value.substring(0, startPos) + subst + t.value.substring(endPos, t.value.length); t.focus(); //set new selection if(replaced) { var cPos=startPos+(tagOpen.length+myText.length+tagClose.length); t.selectionStart=cPos; t.selectionEnd=cPos; } else { t.selectionStart=startPos+tagOpen.length; t.selectionEnd=startPos+tagOpen.length+myText.length; } t.scrollTop=scrollTop; } } if (t.createTextRange) t.caretPos = document.selection.createRange().duplicate(); return false; } function TchangeTri(xx) { var TlabelTriA = document.getElementById('TlabelTriA') var TtriA = document.getElementById('TtriA') var TmNG = document.getElementById('TmNG') var TtP = document.getElementById('TtP') var TtN = document.getElementById('TtN') var Tn = document.getElementById('Tn') TtriA.style.visibility=xx; TlabelTriA.style.visibility=xx; if(xx == 'visible' && TtriA.checked == true) { if(TtP.checked == true) TmNG.value='P'; if(TtN.checked == true) TmNG.value='N'; Tn.name='k'; } if(xx == 'hidden' || TtriA.checked == false) { TmNG.value='NG'; Tn.name='n'; } } function valid(id) { document.getElementById(id).focus(); document.getElementById(id).checked = true; }geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templm/menubar.txt0000660000175200017530000000020612664543647025255 0ustar guillaumeguillaume geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templm/advanced.txt0000660000175200017530000001453212664543647025400 0ustar guillaumeguillaume%doctype; [*advanced request] %include.css; %base_header; %define;event(xx)

    [*after] : %if;([ !dates order]0 = "ddmmyyyy") %elseif;([ !dates order]0 = "mmddyyyy") %else; %end; [*before] : %if;([ !dates order]0 = "ddmmyyyy") %elseif;([ !dates order]0 = "mmddyyyy") %else; %end;

    %end; %message_to_wizard;

    %hidden;

    [*advanced request] %if;(evar.birth1_yyyy != "" or evar.death2_yyyy != "") %let;text;  [date/dates]0 %evar.birth1_yyyy; - %evar.death2_yyyy;%nn; %in; %if;(evar.marriage_place != "") [*add] %text; %else; [*add] %text; %end; %end;

    [*sex] : %nn; %nn; [*died]0 :      [*married] :  

    [*birth] %apply;event("birth")
    [*baptism] %apply;event("bapt")
    [*death] %apply;event("death")
    [*burial] %apply;event("burial")
    [*marriage/marriages]0 %apply;event("marriage")
    %base_trailer; %copyright; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templm/calendar.txt0000660000175200017530000002014312664543647025377 0ustar guillaumeguillaume%doctype; [*calendar/calendars]1 %include.css; %base_header; %message_to_wizard; %if;not cancel_links; %end;

    [*calendar/calendars]1

    %define;french_day(xx) %apply;nth%with; /Primidi/Duodi/Tridi/Quartidi/Quintidi/Sextidi/Septidi/Octidi/Nonidi/Décadi/Primidi/Duodi/Tridi/Quartidi/Quintidi/Sextidi/Septidi/Octidi/Nonidi/Décadi/Primidi/Duodi/Tridi/Quartidi/Quintidi/Sextidi/Septidi/Octidi/Nonidi/Décadi/ %and;xx%end; %end; %define;fun_day(ccc, nnn) %end; %define;fun_month(ccc, nnn, vvv, lll) %end; %define;fun_year(ccc, nnn) %end; %define;fun_julian_year(ccc, nnn) %let;year; %if;(date.julian.month < 3 or date.julian.month = 3 and date.julian.day < 25) %expr(date.nnn.year - 1)/%expr(date.nnn.year % 10) %else;%date.nnn.year;%end; %in; %end; %define;calendar(ccc, nnn, vvv, lll, fun_yyy) %if;([ !dates order]0 = "ddmmyyyy") %apply;fun_day("ccc", "nnn") %apply;fun_month("ccc", "nnn", "vvv", "lll") %apply;fun_yyy("ccc", "nnn") %elseif;([ !dates order]0 = "mmddyyyy") %apply;fun_month("ccc", "nnn", "vvv", "lll") %apply;fun_day("ccc", "nnn") %apply;fun_yyy("ccc", "nnn") %else; %apply;fun_yyy("ccc", "nnn") %apply;fun_month("ccc", "nnn", "vvv", "lll") %apply;fun_day("ccc", "nnn") %end; %end;

    %hidden;

    %if;([ !dates order] = "ddmmyyyy") %elseif;([ !dates order] = "mmddyyyy") %else; %end; %apply;calendar("g", "gregorian", 12, [(month)], "fun_year") %apply;calendar("j", "julian", 12, [(month)], "fun_julian_year") %apply;calendar("f", "french", 13, [(french revolution month)], "fun_year") %apply;calendar("h", "hebrew", 13, [(hebrew month)], "fun_year")
     [*year/month/day]2 [*year/month/day]1 [*year/month/day]0[*year/month/day]1 [*year/month/day]2 [*year/month/day]0[*year/month/day]0 [*year/month/day]1 [*year/month/day]2 
    [*gregorian/julian/french/hebrew]0
    [*gregorian/julian/french/hebrew]1
    [*gregorian/julian/french/hebrew]2
    [*gregorian/julian/french/hebrew]3
    • %apply;capitalize%with;%apply;nth([(week day)], date.week_day)%end; %if;(date.julian_day = today.julian_day)%sp;%time;%end;
    • %if;(date.julian_day > 2375839)
    • %apply;french_day(date.french.day),%sp;%date.french.day; %sp;%apply;capitalize%with;%apply;nth([(french revolution month)], date.french.month -1)%end; %sp;an %date.french.year.roman;
    • %end;
    • [*moon age/new moon/first quarter/full moon/last quarter]0 : %date.moon_age; %if;(date.moon_phase.index != 0) %sp;-%sp; %apply;capitalize%with; %apply;nth([moon age/new moon/first quarter/full moon/last quarter], date.moon_phase.index) :%sp; %date.moon_phase.hour;:%date.moon_phase.minute; UT %end; %end;
    • [*julian day] :%sp; %if;(date.julian_day < 1000)%date.julian_day; %else;%date.julian_day.sep1000; %end;
    %if;(wizard or friend)

    [*statistics] :%sp; %hidden; … ([before (date)]… %if;([ !dates order]0 = "ddmmyyyy") %elseif;([ !dates order]0 = "mmddyyyy") %else; %end;)

    %let;lang; %if;(evar.lang != "") %evar.lang; %elseif;(bvar.default_lang != "") %bvar.default_lang; %else;en%nn; %end; %in; %end;
    %base_trailer; %copyright; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templm/updind.txt0000660000175200017530000007627012664543647025125 0ustar guillaumeguillaume%doctype; %nn; %if;(evar_m = "MRG_IND_OK" or evar_m = "MRG_MOD_IND_OK") [*merge::person/persons]1 # %index; %elseif;(evar_m = "MOD_IND" or evar_m = "MOD_IND_OK") [*modify::person/persons]0 # %index; %else;[*add::person/persons]0%end; %include.css; %base_header; %let;l_on;onclick="this.focus()" onkeydown="if (event.keyCode == 13) javascript:document.upd.submit();"%in; %let;l_on1;onclick="this.focus()"%in; %define;search_focus(xcnt) %if;(evar_add_qualifierxcnt = "on") onload="javascript:document.upd.qualifier%expr(xcnt+1).focus();"%nn; %elseif;(evar_add_aliasxcnt = "on") onload="javascript:document.upd.alias%expr(xcnt+1).focus();"%nn; %elseif;(evar_add_first_name_aliasxcnt = "on") onload="javascript:document.upd.first_name_alias%expr(xcnt+1).focus();"%nn; %elseif;(evar_add_surname_aliasxcnt = "on") onload="javascript:document.upd.surname_alias%expr(xcnt+1).focus();"%nn; %elseif;(evar_ins_titlexcnt = "on" or evar_ins_titlexcnt_n > 1) onload="javascript:document.upd.t_ident%expr(xcnt+1).focus();window.scrollBy(0,60);"%nn; %elseif;(evar_add_relationxcnt = "on") onload="javascript:document.upd.r%expr(xcnt+1)_type.focus();window.scrollBy(0,60);"%nn; %elseif;(xcnt < 10) %apply;search_focus(xcnt + 1) %end; %end; %define;load_focus() %if;(evar_m = "MOD_IND_OK" or evar_m = "MRG_MOD_IND_OK") %apply;search_focus(0) %elseif;(evar_m = "MOD_IND") %if;(birth.prec != "sure") onload="javascript:document.upd.birth_d1.focus();"%nn; %elseif;(death.prec != "sure" and death.year != "" or death.text != "" or dead_dont_know_when or died_young) onload="javascript:document.upd.death_d1.focus();"%nn; %elseif;(of_course_dead or dont_know_if_dead) onload="javascript:document.upd.death.focus();"%nn; %else; onload="javascript:document.upd.first_name.focus();"%nn; %end; %end; %end; %(%) %define;sure_date(xvar) class="%if;(xvar.prec = "sure")sure%else;not_sure%end;"%nn; %end; %define;date(xlab,xvar,xdate) %if;([ !dates order]0 = "ddmmyyyy") %elseif;([ !dates order]0 = "mmddyyyy") %nn; %else; %end; %end; %define;source(xvar, xx) %end; %(%) %(%) %define;accesskey(xvar) %if;("xvar"="birth") title="[*birth] (2)" accesskey="2"%nn; %elseif;("xvar"="bapt") title="[*baptism] (3)" accesskey="3"%nn; %elseif;("xvar"="burial") title="[*burial] (5)" accesskey="5"%nn; %end; %end; %define;place(xvar,xx) %end; %define;insert_title(xcnt) %end; %define;one_title(xcnt)
    [*begin]0
    %apply;date("", "t_date_startxcnt", "title_date_start")
    [*end]0
    %apply;date("", "t_date_endxcnt", "title_date_end")
    %end %define;insert_relation(xcnt) %end; %define;relations(xcnt) %apply;relation_type("xcnt") [*him/her]0 %apply;one_relation("xcnt","fath","r_father") [*him/her]1 %apply;one_relation("xcnt","moth","r_mother") %apply;insert_relation("xcnt") %end; %define;relation_type(xcnt) %end; %define;one_relation(xcnt,xvar,xrel) %end; %(%) %message_to_wizard;

    %hidden; %if;(evar_m = "MRG_IND_OK" or evar_m = "MRG_MOD_IND_OK") %if;(evar_i2 != "") %end; %if;(evar_ini1 != "" and evar_ini2 != "") %end; %if;(evar.iexcl != "" or evar.fexcl != "") %if;(evar.iexcl != "") %end; %if;(evar.fexcl != "") %end; %end; %elseif;(evar_m = "MOD_IND" or evar_m = "MOD_IND_OK") %else; %end;

    (1) %if;(evar_m = "MRG_IND_OK" or evar_m = "MRG_MOD_IND_OK") [*merge::person/persons]1 # %index; %elseif;(evar_m = "MOD_IND" or evar_m = "MOD_IND_OK") [*modify::person/persons]0 # %index; %else; [*add::person/persons]0 %end;  

    %nn; %nn;   [*sex] : %nn; %nn;   %nn; [*access]0 : %if;has_qualifiers; %foreach;qualifier; %nn; %nn; %end; %elseif;(bvar.propose_qualifier != "no") %nn; %nn; %end; %if;has_aliases; %foreach;alias; %nn; %nn; %end; %elseif;(bvar.propose_alias != "no") %nn; %nn; %end; %if;has_first_names_aliases; %foreach;first_name_alias; %nn; %nn; %end; %else; %nn; %nn; %end; %if;has_surnames_aliases; %foreach;surname_alias; %nn; %nn; %end; %else; %nn; %nn; %end; %nn; %nn; %nn;

    (2) [*birth] %apply;date([*date/dates]0, "birth", "birth")
    %apply;place("birth", "birth") %apply;source("birth", "birth")
    (3) [*baptism] %apply;date([*date/dates]0, "bapt", "bapt")
    %apply;place("bapt", "bapt") %apply;source("bapt", "bapt")
    (4) [*death]
    %apply;date([*date/dates]0, "death", "death")
    %apply;place("death", "death")
    %apply;source("death", "death")
    (5) [*burial] %apply;date([*date/dates]0, "burial", "burial")
    %apply;place("burial", "burial") %apply;source("burial", "burial")
    (6) %apply;insert_title("0") [*title/titles]1
      %if;has_titles; %foreach;title;
    1. %apply;one_title(cnt) %apply;insert_title(cnt)
    2. %end; %else;
    3. %apply;one_title("1") %apply;insert_title("1")
    4. %end;
    (7) [*relation/relations]1 %if;has_relations; %foreach;relation; %apply;relations(cnt) %end; %else; %apply;relations("1") %end;
      %apply;insert_relation("0") ↴ + [first name/first names]0 [surname/surnames]0 #
    (8)
    %let;name;notes%in; %include.toolbar;
    %sq; %let;name;notes%in;%nl;
    %nl;%include.accent;
    %base_trailer; %copyright; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templm/summary.js0000660000175200017530000000240312664543647025117 0ustar guillaumeguillaume/* summary.js mickroue(a)yahoo.fr 20130211 templ=templm */ /* This code has been borrowed from Wikipedia */ function showTocToggle() { show="[visualize/show/hide/summary]1"; hide="[visualize/show/hide/summary]2"; if (document.getElementById) { show_disp=' style="display:none;"'; hide_disp=''; document.writeln('' + '(' + '' + show + '' + '' + hide + '' + ')'); } } function setTocToggle() { var cookiePos = document.cookie.indexOf("hidetoc="); if (cookiePos > -1 && document.cookie.charAt(cookiePos + 8) == 1) toggleToc(); } function toggleToc() { var toc = document.getElementById('tocinside'); var showlink = document.getElementById('showlink'); var hidelink = document.getElementById('hidelink'); if (toc.style.display == 'none') { toc.style.display = tocWas; hidelink.style.display=''; showlink.style.display='none'; document.cookie = "hidetoc=0"; } else { tocWas = toc.style.display; toc.style.display = 'none'; hidelink.style.display='none'; showlink.style.display=''; document.cookie = "hidetoc=1"; } }geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templm/anclist.txt0000660000175200017530000021010212664543647025257 0ustar guillaumeguillaume%doctype; %let;l_v0;%if;(evar.tf1 != "fam70" and evar.v > max_anc_level)%max_anc_level;%else;%evar.v;%end;%in; %let;l_v;%if;(bvar.max_anc_level = "")%l_v0;%elseif;(bvar.max_anc_level > l_v0)%l_v0;%else;%bvar.max_anc_level;%end;%in; %nn; %first_name; %surname; %if;(evar.t = "F" and evar.tf1 = "csv") - CSV -  %elseif;(evar.t = "F" and (evar.tf1 = "fam70" or evar.tf1 = "fam71" or evar.tf1 = "fam72")) - 7 [*family/families]1 -  %elseif;(evar.t = "F" and evar.tf1 = "sb") - [*surnames branch] -  %elseif;(evar.t = "F" and evar.tf1 = "surn") - [*list eclair]0 - [surname/surnames]1 / [places]  %elseif;(evar.t = "F" and evar.tf1 = "place") - [*list eclair]0 - [places]  %elseif;(evar.t = "F" and evar.tf1 = "aad") - [*age at death] ([M/F]0, [M/F]1)  %elseif;(evar.t = "F" and evar.tf1 = "afm") - [*age] ([father/mother]0, [father/mother]1)  %else; - [*ancestors] -  %end; %include.css; %base_header; %( %) %let;birth_symbol;%if;(bvar.birth_symbol != "")%bvar.birth_symbol;%else;°%end;%in; %let;death_symbol;%if;(bvar.death_symbol != "")%bvar.death_symbol;%else;†%end;%in; %let;marriage_symbol;&%in; %let;ref_index;%index;%in; %let;ref_sex;%if(is_male)[him/her]0%elseif;(is_female)[him/her]1%else;0%end;%in; %let;max_event;%if;(bvar.latest_event = "")100%else;%bvar.latest_event;%end;%in; %define;tothegen(xx) [*to the %s generation:::xx]%nn; %end; %define;togen(xx) %if;(xx = 1)[*specify::generation/generations]0%nn; %elseif;(xx = 2)[*to the parents]%nn; %elseif;(xx = 3)[*to the grandparents]%nn; %elseif;(xx = 4)[*to the great-grandparents]%nn; %else; %apply;tothegen%with; %apply;nth([nth (generation)], xx) %end; %end; %end; %define;gen()

    %if;(evar.only != "on") %apply;togen(l_v) %else; [*generation/generations]0 %l_v; %end;

    %end; %define;ancestors_by_list(xx, nnn) %if;(xx.has_parents and nnn > 1)
    • %xx.father;%xx.father.title;%xx.father.dates;%nl; %apply;ancestors_by_list("xx.father", nnn - 1)
    • %xx.mother;%xx.mother.title;%xx.mother.dates;%nl; %apply;ancestors_by_list("xx.mother", nnn - 1)
    %end; %end; %define;ancestors_horizontally(pp, xx, ss1, ss2, ss3) %if;(xx > 0) %if;(pp.has_parents) %apply;ancestors_horizontally( "pp.father", xx - 1, "ss1     ", "ss1 +-- ", "ss1 |   ") %end; ss2%pp;%pp.title;%pp.dates; %if;(pp.has_parents) %apply;ancestors_horizontally( "pp.mother", xx - 1, "ss3 |   ", "ss3 +-- ", "ss3     ") %end; %end; %end; %define;csv_line2() ;%family_cnt; ;%marriage_date.prec; ;%marriage_date.year; ;%marriage_date.month; ;%marriage_date.day; ;%marriage_place; ;%spouse.first_name; ;%spouse.surname; ;%spouse.first_name_key_val; ;%spouse.surname_key_val; ;%spouse.occ; %end; %define;csv_line1(yy) ;%index; ;%family.index; ;%first_name_key_val; ;%surname_key_val; ;%occ; ;%if;(sosa_in_list != "")%sosa_in_list;%end; ;%ancestor.anc_sosa; ;yy.%child_cnt; ;%sex; ;%consanguinity; ;%first_name; ;%surname; ;%birth_date.prec; ;%birth_date.year; ;%birth_date.month; ;%birth_date.day; ;%birth_place; ;%death_date.prec; ;%death_date.year; ;%death_date.month; ;%death_date.day; ;%death_place; %if;(has_parents) ;%father.first_name;;%father.surname;;%father_age_at_birth; ;%mother.first_name;;%mother.surname;;%mother_age_at_birth; %else;;;;;;;%end; %nn; %end; %define;csv_line3(xx,yy,zz) ;%xx.index; ;%family.index; ;%xx.first_name_key_val; ;%xx.surname_key_val; ;%xx.occ; ;%if;(sosa_in_list != "")%sosa_in_list;%end; ;%ancestor.anc_sosa; ;yy.%child_cnt;xzz%nn; ;%xx.sex; ;%consanguinity; ;%xx.first_name; ;%xx.surname; ;%birth_date.prec; ;%birth_date.year; ;%birth_date.month; ;%birth_date.day; ;%xx.birth_place; ;%death_date.prec; ;%death_date.year; ;%death_date.month; ;%death_date.day; ;%xx.death_place; %if;(has_parents) ;%father.first_name;;%father.surname;;%father_age_at_birth; ;%mother.first_name;;%mother.surname;;%mother_age_at_birth; %else;;;;;;;%end; ;%family_cnt; ;%marriage_date.prec; ;%marriage_date.year; ;%marriage_date.month; ;%marriage_date.day; ;%marriage_place; ;%first_name; ;%surname; ;%first_name_key_val; ;%surname_key_val; ;%occ; %nn; %end; %define;csv_line(yy,zz) %foreach;child; %if;(child.has_families) %foreach;child.family; %incr_count;%count; %apply;csv_line1("yy.zz") %apply;csv_line2() %if;(spouse.sosa_in_list = "") %incr_count;%count; %apply;csv_line3("spouse","yy.zz",family_cnt) %end; %if;(evar.cousins="on" and child.has_families and child.sosa_in_list = "") %apply;csv_line("yy.zz",child_cnt) %end; %end; %else; %incr_count;%count; %apply;csv_line1("yy.zz")%nn; ;;; %end; %end; %end; %define;ld_somebody1(bbb,ddd,xx,yy,lexa,lexb,sss,ttt) %let;relationship; %if;("lexb" != "") %apply;a_of_b%with; %if(xx.is_male)[lexa]0%elseif;(xx.is_female)[lexa]1%else;[lexa]2%end; %and; %if(sss = 0)[lexb]0%elseif;(sss = 1)[lexb]1%else;[lexb]2%end; %end; %else; %if;(xx.is_male)[lexa]0%elseif;(xx.is_female)[lexa]1%else;[lexa]2%end; %end; %in; %let;l_year; %if;(xx.yy_date.year != "" and xx.yy_date.year > 0) %xx.yy_date.year; %else; 9999%nn; %end; %in; %apply;add_in_sorted_list%with; %l_year;%nn; %if;(l_year != 9999) %if;(xx.yy_date.month = "")00%elseif;(xx.yy_date.month < 10)0%end;%xx.yy_date.month;%nn; %if;(xx.yy_date.day = "")00%elseif;(xx.yy_date.day < 10)0%end;%xx.yy_date.day;%nn; %else; 9999%nn; %end; %and; %if;(l_year != 9999 and bbb != 9999) %if;(l_year >= bbb) %expr(l_year - bbb)%nn; %elseif;(bbb > l_year) -%expr(bbb - l_year)%nn; %end; %end; %and; %if;("yy" = "birth")1%else;3%end;%(sorted : birth = 1 marriage = 2 death = 3%)%nn; %and; %xx.on_yy_date; %and; %xx.yy_place; %and; ttt%nn; %and; %if;(cancel_links or xx.is_restricted) %xx;%nn; %else; %if;(browsing_with_sosa_ref) %xx;%nn; %else; %xx;%nn; %end; %end; %and; %relationship; %if;("yy" = "death" and xx.computable_death_age) %sp;%death_symbol;%xx.death_age; %end; %if;("yy" = "birth" and xx.computable_age) %sp;%birth_symbol;%xx.age; %end; %and; %xx.occupation; %and; %xx.index; %and; %if;(l_year != 9999) %if;(l_year < bbb) ld_before%nn; %elseif;(l_year > ddd) ld_after%nn; %else; ld_yy%xx.sex;%nn; %end; %else; ld_no_date%nn; %end; %and; %xx.has_sosa; %and; %if;("lexa" = "him/her") ld_him_her%nn; %end; %and; border_family_%xx.has_families; border_sex_%xx.sex; %and; %if;("yy" = "birth" and "xx" != "spouse" and "xx" != "parent") %if;("xx" != "ancestor" or xx.anc_sosa.v % 2 = 0) %xx.index; %end; %end; %end; %end; %define;ld_marriage(bbb,ddd,xx,lexa,lexb,sss) %let;relationship; %if;("lexb" != "") %apply;a_of_b%with; %if(xx.is_male)[lexa]0%elseif;(xx.is_female)[lexa]1%else;[lexa]2%end; %and; %if(sss = 0)[lexb]0%elseif;(sss = 1)[lexb]1%else;[lexb]2%end; %end; %else; %if;(xx.is_male)[lexa]0%elseif;(xx.is_female)[lexa]1%else;[lexa]2%end; %end; %in; %let;l_myear; %if;(marriage_date.year != "" and marriage_date.year > 0) %marriage_date.year; %else; 9999%nn; %end; %in; %apply;add_in_sorted_list%with; %l_myear;%nn; %if;(l_myear != 9999) %if;(marriage_date.day = "")00%elseif;(marriage_date.month < 10)0%end;%marriage_date.month;%nn; %if;(marriage_date.day = "")00%elseif;(marriage_date.day < 10)0%end;%marriage_date.day;%nn; %else; 9999%nn; %end; %and; %if;(l_myear != 9999 and bbb != 9999) %if;(l_myear >= bbb) %expr(l_myear - bbb)%nn; %elseif;(bbb > l_myear) -%expr(bbb - l_myear)%nn; %end; %end; %and; 2%nn;%(sorted : birth = 1 marriage = 2 death = 3%) %and; %on_marriage_date; %and; %marriage_place; %and; &%nn; %and; %if;(cancel_links or xx.is_restricted) %xx; & %spouse;%nn; %else; %if;(browsing_with_sosa_ref) %xx;%nn; %else; %xx; %end; & %spouse;%nn; %end; %and; %relationship; %and; %xx.occupation;%nn; %and; %xx.index; %and; %if;(l_myear != 9999) %if;(l_myear < bbb) ld_before%nn; %elseif;(l_myear > ddd) ld_after%nn; %else; ld_marriage%nn; %end; %else; ld_no_date%nn; %end; %and; %xx.has_sosa; %and; %if;("lexa" = "him/her") ld_him_her%nn; %end; %and; border_family_%xx.has_families; border_sex_%xx.sex; %and; %end; %end; %define;ld_somebody(bbb,ddd,xx,lexa,lexb,sss) %apply;ld_somebody1(bbb,ddd,"xx","birth","lexa","lexb","sss",birth_symbol) %if;(xx.is_dead) %apply;ld_somebody1(bbb,ddd,"xx","death","lexa","lexb","sss",death_symbol) %end; %end; %define;ld_cousin(bbb,ddd,curlev,maxlev,lexa,lexb,sss) %if;(nb_children > 0) %foreach;child; %if;(child.sosa_in_list = "" and child.index != a_i and child.index != b_i and child.index != c_i) %apply;ld_somebody(bbb,ddd,"child","lexa","lexb","sss") %if;(child.has_families) %foreach;child.family; %apply;ld_marriage(bbb,ddd,"child","lexa","lexb","sss") %if;(curlev = 0) %apply;ld_somebody(bbb,ddd,"spouse","the spouse","an uncle/an aunt",sex) %apply;ld_cousin(bbb,ddd,curlev+1,maxlev,"a cousin","","") %elseif;(curlev = 1) %apply;ld_cousin(bbb,ddd,curlev+1,maxlev,"a son/a daughter/a child","a cousin",sex) %elseif;(curlev = 2) %apply;ld_cousin(bbb,ddd,curlev+1,maxlev,"a grandson/a granddaughter/a grandchild","a cousin","sss") %elseif;(curlev = 3) %apply;ld_cousin(bbb,ddd,curlev+1,maxlev,"a great-grandson/a great-granddaughter/a great-grandchild","a cousin","sss") %elseif;(curlev = 4) %apply;ld_cousin(bbb,ddd,curlev+1,maxlev,"a great-grandson/a great-granddaughter/a great-grandchild","a cousin","sss") %end; %end; %end; %end; %end; %end; %end; %define;ld_2nd_cousin(bbb,ddd,curlev,maxlev,lexa,lexb,sss) %if;(nb_children > 0) %foreach;child; %if;(child.sosa_in_list = "" and child.index != a_i and child.index != b_i and child.index != c_i and child.index != d_i and child.index != e_i and child.index != f_i and child.index != g_i) %apply;ld_somebody(bbb,ddd,"child","lexa","lexb","sss") %if;(child.has_families) %foreach;child.family; %apply;ld_marriage(bbb,ddd,"child","lexa","lexb","sss") %if;(curlev = 0) %apply;ld_somebody(bbb,ddd,"spouse","the spouse","a great-uncle/a great-aunt",sex) %apply;ld_2nd_cousin(bbb,ddd,curlev+1,maxlev,"a cousin","the father/the mother/a parent","") %elseif;(curlev = 1) %apply;ld_2nd_cousin(bbb,ddd,curlev+1,maxlev,"a 2nd cousin","",sex) %elseif;(curlev = 2) %apply;ld_2nd_cousin(bbb,ddd,curlev+1,maxlev,"a son/a daughter/a child","a 2nd cousin",sex) %elseif;(curlev = 3) %apply;ld_2nd_cousin(bbb,ddd,curlev+1,maxlev,"a grandson/a granddaughter/a grandchild","a 2nd cousin","sss") %elseif;(curlev = 4) %apply;ld_2nd_cousin(bbb,ddd,curlev+1,maxlev,"a great-grandson/a great-granddaughter/a great-grandchild","a 2nd cousin","sss") %end; %end; %end; %end; %end; %end; %end; %define;ld_children(bbb,ddd,curlev,maxlev,lexa,lexb,sss) %if;(nb_children > 0) %foreach;child; %apply;ld_somebody(bbb,ddd,"child","lexa","","") %if;(child.has_families) %foreach;child.family; %apply;ld_marriage(bbb,ddd,"child","lexa","","") %if;(curlev = 0 and maxlev > 2) %apply;ld_somebody(bbb,ddd,"spouse","a son-in-law/a daughter-in-law","","") %apply;ld_children(bbb,ddd,curlev+1,maxlev,"a grandson/a granddaughter/a grandchild","",sex) %elseif;(curlev = 1 and maxlev > 3) %apply;ld_somebody(bbb,ddd,"spouse","the spouse","a grandson/a granddaughter/a grandchild",sex) %apply;ld_children(bbb,ddd,curlev+1,maxlev,"a great-grandson/a great-granddaughter/a great-grandchild","","") %end; %end; %end; %end; %end; %end; %define;ld_nephew(bbb,ddd,curlev,maxlev,lexa) %if;(nb_children > 0) %foreach;child; %if;(child.index != a_i) %apply;ld_somebody(bbb,ddd,"child","lexa","","") %if;(child.has_families) %foreach;child.family; %apply;ld_marriage(bbb,ddd,"child","lexa","","") %if;(curlev = 0) %if;("lexa" = "a half-brother/a half-sister/a half-sibling") %apply;ld_somebody(bbb,ddd,"spouse","the spouse","lexa",sex) %else; %apply;ld_somebody(bbb,ddd,"spouse","a brother-in-law/a sister-in-law","","") %end; %apply;ld_nephew(bbb,ddd,curlev+1,maxlev,"a nephew/a niece") %elseif;(curlev = 1 and maxlev > 2) %apply;ld_nephew(bbb,ddd,curlev+1,maxlev,"a great-nephew/a great-niece") %end; %end; %end; %end; %end; %end; %end; %define;ldimg_somebody1(xx,lexa,lexb,sss) %let;relationship; %if;("lexb" != "") %apply;a_of_b%with; %if(xx.is_male)[lexa]0%elseif;(xx.is_female)[lexa]1%else;[lexa]2%end; %and; %if(sss = 0)[lexb]0%elseif;(sss = 1)[lexb]1%else;[lexb]2%end; %end; %else; %if;(xx.is_male)[lexa]0%elseif;(xx.is_female)[lexa]1%else;[lexa]2%end; %end; %in; %apply;add_in_sorted_list(xx.dates,xx,relationship,xx.index,xx.image_url) %end; %define;ldimg_somebody(xx,lexa,lexb,sss) %if;(xx.has_image) %apply;ldimg_somebody1("xx","lexa","lexb","sss") %end; %end; %define;ldimg_cousin(curlev,maxlev,lexa,lexb,sss) %if;(nb_children > 0) %foreach;child; %if;(child.sosa_in_list = "" and child.index != a_i and child.index != b_i and child.index != c_i) %apply;ldimg_somebody("child","lexa","lexb","sss") %if;(child.has_families) %foreach;child.family; %if;(curlev = 0) %apply;ldimg_somebody("spouse","the spouse","an uncle/an aunt",sex) %apply;ldimg_cousin(curlev+1,maxlev,"a cousin","","") %elseif;(curlev = 1) %apply;ldimg_cousin(curlev+1,maxlev,"a son/a daughter/a child","a cousin",sex) %elseif;(curlev = 2) %apply;ldimg_cousin(curlev+1,maxlev,"a grandson/a granddaughter/a grandchild","a cousin","sss") %elseif;(curlev = 3) %apply;ldimg_cousin(curlev+1,maxlev,"a great-grandson/a great-granddaughter/a great-grandchild","a cousin","sss") %elseif;(curlev = 4) %apply;ldimg_cousin(curlev+1,maxlev,"a great-grandson/a great-granddaughter/a great-grandchild","a cousin","sss") %end; %end; %end; %end; %end; %end; %end; %define;ldimg_2nd_cousin(curlev,maxlev,lexa,lexb,sss) %if;(nb_children > 0) %foreach;child; %if;(child.sosa_in_list = "" and child.index != a_i and child.index != b_i and child.index != c_i and child.index != d_i and child.index != e_i and child.index != f_i and child.index != g_i) %apply;ldimg_somebody("child","lexa","lexb","sss") %if;(child.has_families) %foreach;child.family; %if;(curlev = 0) %apply;ldimg_somebody("spouse","the spouse","a great-uncle/a great-aunt",sex) %apply;ldimg_2nd_cousin(curlev+1,maxlev,"a cousin","the father/the mother/a parent","") %elseif;(curlev = 1) %apply;ldimg_2nd_cousin(curlev+1,maxlev,"a 2nd cousin","",sex) %elseif;(curlev = 2) %apply;ldimg_2nd_cousin(curlev+1,maxlev,"a son/a daughter/a child","a 2nd cousin",sex) %elseif;(curlev = 3) %apply;ldimg_2nd_cousin(curlev+1,maxlev,"a grandson/a granddaughter/a grandchild","a 2nd cousin","sss") %elseif;(curlev = 4) %apply;ldimg_2nd_cousin(curlev+1,maxlev,"a great-grandson/a great-granddaughter/a great-grandchild","a 2nd cousin","sss") %end; %end; %end; %end; %end; %end; %end; %define;ldimg_children(curlev,maxlev,lexa,lexb,sss) %if;(nb_children > 0) %foreach;child; %apply;ldimg_somebody("child","lexa","","") %if;(child.has_families) %foreach;child.family; %if;(curlev = 0 and maxlev > 2) %apply;ldimg_somebody("spouse","a son-in-law/a daughter-in-law","","") %apply;ldimg_children(curlev+1,maxlev,"a grandson/a granddaughter/a grandchild","",sex) %elseif;(curlev = 1 and maxlev > 3) %apply;ldimg_somebody("spouse","the spouse","a grandson/a granddaughter/a grandchild",sex) %apply;ldimg_children(curlev+1,maxlev,"a great-grandson/a great-granddaughter/a great-grandchild","","") %end; %end; %end; %end; %end; %end; %define;ldimg_nephew(curlev,maxlev,lexa) %if;(nb_children > 0) %foreach;child; %if;(child.index != a_i) %apply;ldimg_somebody("child","lexa","","") %if;(child.has_families) %foreach;child.family; %if;(curlev = 0) %if;("lexa" = "a half-brother/a half-sister/a half-sibling") %apply;ldimg_somebody("spouse","the spouse","lexa",sex) %else; %apply;ldimg_somebody("spouse","a brother-in-law/a sister-in-law","","") %end; %apply;ldimg_nephew(curlev+1,maxlev,"a nephew/a niece") %elseif;(curlev = 1 and maxlev > 2) %apply;ldimg_nephew(curlev+1,maxlev,"a great-nephew/a great-niece") %end; %end; %end; %end; %end; %end; %end; %define;ldimg() %let;l_vld;%apply;min(l_v,4)%in; %empty_sorted_list; %foreach;ancestor_level(l_vld) %foreach;ancestor; %if;(level=1) %apply;ldimg_somebody("ancestor","him/her","","") %foreach;ancestor.family; %apply;ldimg_somebody("spouse","the spouse","","") %if;(spouse.has_parents and l_v != 1) %foreach;spouse.parent; %apply;ldimg_somebody("parent","the father-in-law/the mother-in-law","","") %end; %end; %apply;ldimg_children(0,l_vld,"a son/a daughter/a child","","") %end; %elseif;(level=2) %let;a_i;%index;%in; %apply;ldimg_somebody("ancestor","the father/the mother/a parent","","") %if;(evar.cousins = "on") %foreach;ancestor.family; %if;(ancestor.is_male and spouse.index = ancestor.spouse.index) %elseif;(ancestor.nb_families > 1 and spouse.index != ancestor.spouse.index) %apply;ldimg_nephew(0,l_vld,"a half-brother/a half-sister/a half-sibling") %else; %apply;ldimg_nephew(0,l_vld,"a brother/a sister/a sibling") %end; %end; %end; %elseif;(level=3) %let;a_i;%index;%in; %let;b_i;%father.index;%in; %let;c_i;%mother.index;%in; %apply;ldimg_somebody("ancestor","a grandfather/a grandmother/a grandparent","","") %if;(evar.cousins = "on") %foreach;ancestor.family; %apply;ldimg_cousin(0,l_vld,"an uncle/an aunt","","") %end; %end; %elseif;(level=4) %let;a_i;%index;%in; %let;b_i;%father.index;%in; %let;c_i;%mother.index;%in; %let;d_i;%father.father.index;%in; %let;e_i;%father.mother.index;%in; %let;f_i;%mother.father.index;%in; %let;g_i;%mother.mother.index;%in; %apply;ldimg_somebody("ancestor","a great-grandfather/a great-grandmother/a great-grandparent","","") %if;(evar.cousins = "on") %foreach;ancestor.family; %apply;ldimg_2nd_cousin(0,l_vld,"a great-uncle/a great-aunt","","") %end; %end; %end; %end; %end; %end; %define;ld(bbb,ddd) %let;l_vld;%apply;min(l_v,4)%in; %empty_sorted_list; %foreach;ancestor_level(l_vld) %foreach;ancestor; %if;(level=1) %apply;ld_somebody(bbb,ddd,"ancestor","him/her","","") %foreach;ancestor.family; %apply;ld_marriage(bbb,ddd,"ancestor","him/her","","") %apply;ld_somebody(bbb,ddd,"spouse","the spouse","","") %if;(spouse.has_parents and l_v != 1) %foreach;spouse.parent; %apply;ld_somebody(bbb,ddd,"parent","the father-in-law/the mother-in-law","","") %end; %end; %apply;ld_children(bbb,ddd,0,l_vld,"a son/a daughter/a child","","") %end; %elseif;(level=2) %let;a_i;%index;%in; %apply;ld_somebody(bbb,ddd,"ancestor","the father/the mother/a parent","","") %if;(evar.cousins = "on") %foreach;ancestor.family; %if;(ancestor.is_male and spouse.index = ancestor.spouse.index) %apply;ld_marriage(bbb,ddd,"ancestor","the parents","","") %elseif;(ancestor.nb_families > 1 and spouse.index != ancestor.spouse.index) %apply;ld_marriage(bbb,ddd,"ancestor","the father/the mother/a parent","","") %apply;ld_nephew(bbb,ddd,0,l_vld,"a half-brother/a half-sister/a half-sibling") %else; %apply;ld_nephew(bbb,ddd,0,l_vld,"a brother/a sister/a sibling") %end; %end; %end; %elseif;(level=3) %let;a_i;%index;%in; %let;b_i;%father.index;%in; %let;c_i;%mother.index;%in; %apply;ld_somebody(bbb,ddd,"ancestor","a grandfather/a grandmother/a grandparent","","") %if;(evar.cousins = "on") %foreach;ancestor.family; %apply;ld_cousin(bbb,ddd,0,l_vld,"an uncle/an aunt","","") %end; %end; %elseif;(level=4) %let;a_i;%index;%in; %let;b_i;%father.index;%in; %let;c_i;%mother.index;%in; %let;d_i;%father.father.index;%in; %let;e_i;%father.mother.index;%in; %let;f_i;%mother.father.index;%in; %let;g_i;%mother.mother.index;%in; %apply;ld_somebody(bbb,ddd,"ancestor","a great-grandfather/a great-grandmother/a great-grandparent","","") %if;(evar.cousins = "on") %foreach;ancestor.family; %apply;ld_2nd_cousin(bbb,ddd,0,l_vld,"a great-uncle/a great-aunt","","") %end; %end; %end; %end; %end; %end; %define;stat_month(xx) %reset_count; %empty_sorted_list; %foreach;ancestor_level(l_v) %if;(level > 1 and (evar.only != "on" or level = l_v)) %foreach;ancestor; %if;(ancestor.same = "") %let;l_month;%if;(ancestor.xx_date.day != "")%ancestor.xx_date.month;%end;%in; %if;(l_month != "") %incr_count; %apply;add_in_sorted_list(ancestor.sex,l_month,count) %end; %end; %end; %end; %end; %let;max_width;360%in; %let;l_size;%expr(36 / ((120 + count) /12 / 10))%in;
    [*year/month/day]1 [*xx] ([M/F]0, [M/F]1) %count; [date/dates]1
    [(month)]0[(month)]1[(month)]2[(month)]3 [(month)]4[(month)]5[(month)]6[(month)]7 [(month)]8[(month)]9[(month)]10[(month)]11
    %reset_count; %foreach;sorted_list_item; %if;(item.1 = 0) %incr_count; %if;(next_item.2 != item.2) %let;l_width0;%expr(count * l_size)%in; %let;l_width;%if;(l_width0 > max_width)%max_width;%else;%l_width0;%end;%in; %count; %reset_count; %end; %end; %if;(item.1 = 1) %incr_count; %if;(next_item.2 != item.2) %let;l_width0;%expr(count * l_size)%in; %let;l_width;%if;(l_width0 > max_width)%max_width;%else;%l_width0;%end;%in; %count; %reset_count; %end; %end; %end;
    %end; %define;color(xx) %apply;nth%with; /606060/993333/339933/333399/999999/339999/993399/999933/AAAAAA/FFAAAA/AAFFAA/AAAAFF/FFFFFF/AAFFFF/FFAAFF/FFFFAA%and; xx%end; %end; %define;stat_calendar() %( table calendar nb day-month %) %reset_count; %empty_sorted_list; %foreach;ancestor_level(l_v) %if;(level > 1 and (evar.only != "on" or level = l_v)) %foreach;ancestor; %if;(ancestor.same = "") %if;(ancestor.birth_date.day != "") %incr_count; %let;mm_dd;%expr(ancestor.birth_date.month+100)_%expr(ancestor.birth_date.day+100)%in; %apply;add_in_sorted_list(mm_dd,ancestor.birth_date.month,ancestor.birth_date.day,ancestor.index,birth_symbol) %end; %if;(ancestor.death_date.day != "") %incr_count %let;mm_dd;%expr(ancestor.death_date.month+100)_%expr(ancestor.death_date.day+100)%in; %apply;add_in_sorted_list(mm_dd,ancestor.death_date.month,ancestor.death_date.day,ancestor.index,death_symbol) %end; %end; %end; %end; %end;
    [*calendar/calendars]0
    %for;i;1;32;
    %i;
    %end;
    [(month)]0[(month)]1[(month)]2[(month)]3 [(month)]4[(month)]5[(month)]6[(month)]7 [(month)]8[(month)]9[(month)]10[(month)]11
    %reset_count; %foreach;sorted_list_item; %if;(prev_item.1 != item.1) %reset_count;%incr_count; %expr(count - 1) %else; " style="display:none;"> %expr(count - 1) %end; %end; %end;
    %end; %define;tf1_ars(xx) %end; %define;ars(m_bt,m_bf,m_dt,m_df,f_bt,f_bf,f_dt,f_df) %reset_count; %empty_sorted_list; %foreach;ancestor_level(l_v) %if;(level > 1 and (evar.only != "on" or level = l_v)) %let;lev;%expr(l_v - level + 1)%in; %foreach;ancestor; %if;(ancestor.same = "") %incr_count; %let;aad; %if;(ancestor.death_date.year > ancestor.birth_date.year) %expr((ancestor.death_date.year - ancestor.birth_date.year)*2) %else;0%nn; %end; %in; %if;(ancestor.sex = 0) %apply;add_in_sorted_list( level,ancestor.index,ancestor.sex, ancestor.birth_date.day,ancestor.birth_date.month, ancestor.death_date.day,ancestor.death_date.month, "m_bt",m_bf,"m_dt",m_df,aad,lev) %else; %apply;add_in_sorted_list( level,ancestor.index,ancestor.sex, ancestor.birth_date.day,ancestor.birth_date.month, ancestor.death_date.day,ancestor.death_date.month, "f_bt",f_bf,"f_dt",f_df,aad,lev) %end; %end; %end; %end; %end;
    %foreach;sorted_list_item; %let;i9;%if;(count > ic)%apply;initial(item.9)%else;%item.9;%end;%in; %let;i11;%if;(count > ic)%apply;initial(item.11)%else;%item.11;%end;%in; %let;fs1;%expr((item.13 + fs) * fs)%in; %let;db;%if;(item.4 = "")%expr((item.2 + 31) % 31 + 1)%else;%item.4;%end;%in; %let;dd;%if;(item.6 = "")%expr((item.2 + 31) % 31 + 1)%else;%item.6;%end;%in; %let;mb;%if;(item.5 = "")%expr((item.2 + 12) % 12 + 1)%else;%item.5;%end;%in; %let;md;%if;(item.7 = "")%expr((item.2 + 12) % 12 + 1)%else;%item.7;%end;%in; %let;dbc;%expr(8 * db)%in; %let;ddc;%expr(8 * dd)%in; %let;mbc;%expr(21 * mb)%in; %let;mdc;%expr(21 * md)%in; %let;pad;%expr(item.13 * 10)%in; %let;aad;%expr(item.12 + green)%in; %if;(item.3 = 0) %item.8;%i9; %item.10;%i11; %end; %if;(item.3 = 1) %item.8;%i9; %item.10;%i11; %end; %end;

    %hidden; %if;access_by_key; %if;(occ != "0") %end; %else %end;

      • [*M/F]0[*M/F]1
        [birth] [birth]
        [death] [death]
    %end; %define;stat1(z1) %apply;stat1a("ancestor.z1_date.day","ancestor.z1_date.date.moon_age",3) %let;nb_date;%count;%in; %let;l_size;%expr(40 / ((90 + nb_date) / 9 / 10))%in;
    [*z1] %nb_date; [date/dates]1
    [*moon age/new moon/first quarter/full moon/last quarter]1 [*moon age/new moon/first quarter/full moon/last quarter]2 [*moon age/new moon/first quarter/full moon/last quarter]3 [*moon age/new moon/first quarter/full moon/last quarter]4 %apply;stat1b(0)
    %apply;stat1a("ancestor.z1_date.day","ancestor.z1_date.date.week_day",1) %let;nb_female;%count;%in; %let;l_size;%expr(40 / ((40 + nb_date) / 4 / 10))%in;
    [*(week day)]0 [*(week day)]1 [*(week day)]2 [*(week day)]3 [*(week day)]4 [*(week day)]5 [*(week day)]6 %apply;stat1b(1)
    %apply;stat1a("ancestor.z1_date.day","ancestor.z1_date.date.month",0) %let;nb_male;%count;%in; %let;l_size;%expr(40 / ((40 + nb_date) / 4 / 10))%in;
    [*(month)]0 [*(month)]1 [*(month)]2 [*(month)]3 [*(month)]4 [*(month)]5 [*(month)]6 [*(month)]7 [*(month)]8 [*(month)]9 [*(month)]10 [*(month)]11 %apply;stat1b(0)
    %apply;stat1a("ancestor.z1_date.day","level",0) %let;l_size;%expr(40 / ((30 + nb_date) / 3 / 10))%in;
    %foreach;ancestor_level(l_v) %if;(level = 1)[*generation/generations]1%else;%level;%end; %end; %apply;stat1b(0)
    %nb_male; [M/F]0 %nb_female; [M/F]1
    %end; %define;stat1a(z1,z2,z3) %reset_count; %empty_sorted_list; %foreach;ancestor_level(l_v) %if;(level > 1 and (evar.only != "on" or level = l_v)) %foreach;ancestor; %if;(ancestor.same = "" and z1 != "") %let;l_y;%z2;%in; %if;(z3 = 3 or ancestor.sex = z3) %incr_count; %end; %apply;add_in_sorted_list(ancestor.sex,l_y,ancestor.index) %end; %end; %end; %end; %end; %define;lang(xx) %apply;nth%with; /af/bg/br/ca/cs/da/de/en/eo/es/et/fi/fr/he/is/it/lv/nl/no/pl/pt/pt-br/ro/ru/sk/sl/sv/zh/ %and;xx%end; %end; %( %) %define;stat_age1()
    1101009080 70605040 3020100
    %reset_count; %foreach;sorted_list_item; %if;(item.1 = 0) %incr_count; %if;(next_item.2 != item.2) %let;l_width0;%expr(count * l_size)%in; %let;l_width;%if;(l_width0 > max_width)%max_width;%else;%l_width0;%end;%in; %count; %reset_count; %end; %end; %if;(item.1 = 1) %incr_count; %if;(next_item.2 != item.2) %let;l_width0;%expr(count * l_size)%in; %let;l_width;%if;(l_width0 > max_width)%max_width;%else;%l_width0;%end;%in; %count; %reset_count; %end; %end; %end;
    %end; %define;stat_age2() %let;l_height;%expr(40 + (count *2))%in;
    %reset_count; %foreach;sorted_list_item; %incr_count; %let;l_top;%expr(20 + (count * 2))%in; %let;l_left0;%expr(20 + item.2 * 8)%in; %let;l_left;%if;(l_left0 > 840)840%else;%l_left0;%end;%in; %if;(count = 1) %item.1; %level; %end; %if;(next_item.1 = "")%item.1;%end; %item.2; %end;
    %end; %define;stat1b(z1) %reset_count; %foreach;sorted_list_item; %if;(item.1 = 0) %incr_count; %if;(next_item.2 != item.2 or next_item.1 = 1) %let;l_top;%expr(item.2 + z1)%in; %let;l_width0;%expr(count * l_size)%in; %let;l_width;%if;(l_width0 > max_width)%max_width;%else;%l_width0;%end;%in; %count; %reset_count; %end; %elseif;(item.1 = 1) %incr_count; %if;(next_item.2 != item.2) %let;l_top;%expr(item.2 + z1)%in; %let;l_width0;%expr(count * l_size)%in; %let;l_width;%if;(l_width0 > max_width)%max_width;%else;%l_width0;%end;%in; %count; %reset_count; %end; %end; %end; %end; %( %) %( %) %message_to_wizard;

    %nn; %if;(evar.tf1 != "csv") %apply;a_of_b%with; %if;(evar.tf1 = "fam70" or evar.tf1 = "fam71" or evar.tf1 = "fam72")7 [family/families]1%else;[*ancestors]%end; %and; %if;(not cancel_links)%end; %if;(public_name != "")%public_name;%else;%first_name;%end; %if;(qualifier != "") %qualifier;%end; %sp;%surname; %if;(alias != "") (%alias;)%end; %if;(not cancel_links)%end; %end; %sp;%dates; %end; %if;(evar.t = "F" and evar.tf1 = "csv") %elseif;(evar.t = "F" and evar.tf1 = "place") - [*list eclair]0 - [places]  %elseif;(evar.t = "F" and evar.tf1 = "surn") - [*list eclair]0 - [surname/surnames]1 / [places]  %elseif;(evar.t = "F" and evar.tf1 = "sb") - [*surnames branch] -  %else; %end;

    %if;(cancel_links or evar.tf1 = "csv") %else; %end; %if;(evar.t = "F" and (evar.tf1 = "fam71" or evar.tf1 = "fam72")) %( 7 families with images %) %apply;ldimg() %if;(evar.tf1 = "fam71") %( images (long display) %) %foreach;sorted_list_item;
    img %item.2;%item.1; %item.3;
    %end; %elseif;(evar.tf1 = "fam72") %( images with onmousemove %)
    %foreach;sorted_list_item;
    img %item.2;%item.1;%item.3;
    %end;
    %else; %end; %elseif;(evar.t = "F" and evar.tf1 = "fam70") %(7 families (life dates table) %) %let;l_byear; %if;(birth_date.year != "" and birth_date.year > 0) %birth_date.year; %else; 9999%nn; %end; %in; %let;l_dyear; %if;(is_dead and death_date.year != "" and death_date.year > 0) %death_date.year; %else; 9999%nn; %end; %in; %apply;ld(l_byear,l_dyear) %reset_count; %foreach;sorted_list_item; %if;(prev_item.4 = item.4 and prev_item.6 = item.6 and prev_item.10 = item.10) %else; %if;(item.3 = 1) %incr_count; %end; %end; %end;
    [years old] [date/dates]0 [place] %birth_symbol;&%death_symbol; [person/persons]0 [relationship]0 [occupation/occupations]0
    %item.2; %item.4; %item.5; %item.6;
    %item.7;
    %item.8;
    %item.9;
    [*total] : %count; [[person/persons]1@(c)]%sp; %if;(not cancel_links) %end;
    %elseif;(wizard and evar.t = "F" and evar.tf1 = "csv") %( csv display full %)

    [number]%nn; ;index%nn; ;index_family%nn; ;first_name_key_val%nn; ;surname_key_val%nn; ;occ%nn; ;[Sosa]%nn; ;[Sosa]_[father/mother]0%nn; ;[child/children]0_[number]%nn; ;[sex]%nn; ;[consanguinity]%nn; ;[first name/first names]0%nn; ;[surname/surnames]0%nn; ;[birth]_[precision]%nn; ;[birth]_[year/month/day]0%nn; ;[birth]_[year/month/day]1%nn; ;[birth]_[year/month/day]2%nn; ;[birth]_[place]%nn; ;[death]_[precision]%nn; ;[death]_[year/month/day]0%nn; ;[death]_[year/month/day]1%nn; ;[death]_[year/month/day]2%nn; ;[death]_[place]%nn; ;[father/mother]0_[first name/first names]0%nn; ;[father/mother]0_[surname/surnames]0%nn; ;[father/mother]0_[age]%nn; ;[father/mother]1_[first name/first names]0%nn; ;[father/mother]1_[surname/surnames]0%nn; ;[father/mother]1_[age]%nn; ;[family/families]0_[number]%nn; ;[marriage/marriages]0_[precision]%nn; ;[marriage/marriages]0_[year/month/day]0%nn; ;[marriage/marriages]0_[year/month/day]1%nn; ;[marriage/marriages]0_[year/month/day]2%nn; ;[marriage/marriages]0_[place]%nn; ;[marriage/marriages]0_[first name/first names]0%nn; ;[marriage/marriages]0_[surname/surnames]0%nn; ;[marriage/marriages]0_first_name_key_val%nn; ;[marriage/marriages]0_surname_key_val%nn; ;[marriage/marriages]0_occ%nn; %reset_count; %foreach;ancestor_level(l_v) %if;(level != 1 and evar.only != "on" or level = l_v) %foreach;ancestor; %if;(ancestor.same = "" and ancestor.is_male) %foreach;ancestor.family; %apply;csv_line("","") %end; %elseif;(ancestor.same = "" and ancestor.is_female and ancestor.nb_families > 1) %foreach;ancestor.family; %if;(spouse.index != ancestor.spouse.index) %apply;csv_line("","") %end; %end; %end; %end; %end; %end;

    %elseif;(evar.t = "F" and evar.tf1 = "place") %( list eclair tf1 = place %) %apply;gen() %empty_sorted_list; %reset_count; %foreach;ancestor_level(l_v) %if;(level > 1 and (evar.only != "on" or level = l_v)) %foreach;ancestor; %if;(ancestor.same = "") %if;(ancestor.has_birth_place) %apply;add_in_sorted_list(ancestor.birth_place,ancestor.birth_date.year,ancestor.index,ancestor.anc_sosa) %elseif;(ancestor.has_baptism_place) %apply;add_in_sorted_list(ancestor.baptism_place,ancestor.baptism_date.year,ancestor.index,ancestor.anc_sosa) %end; %if;(ancestor.has_death_place) %apply;add_in_sorted_list(ancestor.death_place,ancestor.death_date.year,ancestor.index,ancestor.anc_sosa) %elseif;(ancestor.has_burial_place) %apply;add_in_sorted_list(ancestor.burial_place,ancestor.burial_date.year,ancestor.index,ancestor.anc_sosa) %end; %foreach;ancestor.family; %if;(ancestor.spouse.index = spouse.index and marriage_place != "") %apply;add_in_sorted_list(marriage_place,marriage_date.year,ancestor.index,ancestor.anc_sosa) %end; %end; %end; %end; %end; %end;

    [place];[date begin];([nb events]);[date end] %foreach;sorted_list_item; %if;(prev_item.1 != item.1) %reset_count;%incr_count; %item.1;;%item.2; ;(%expr(count - 1));%item.2; %else;" style="display:none;">(%expr(count - 1));%item.2; %end; %end; %end;

    %elseif;(evar.t = "F" and evar.tf1 = "surn") %( list eclair tf1 = surn %) %apply;gen() %empty_sorted_list; %reset_count; %foreach;ancestor_level(l_v) %if;(level > 1 and (evar.only != "on" or level = l_v)) %foreach;ancestor; %if;(ancestor.same = "") %if;(ancestor.has_birth_place) %apply;add_in_sorted_list%with; %ancestor.surname; -- %ancestor.birth_place;%and; %ancestor.birth_date.year;%and; %ancestor.index;%and; %ancestor.anc_sosa%end; %elseif;(ancestor.has_baptism_place) %apply;add_in_sorted_list%with; %ancestor.surname; -- %ancestor.baptism_place;%and; %ancestor.baptism_date.year;%and; %ancestor.index;%and; %ancestor.anc_sosa%end; %end; %if;(ancestor.has_death_place) %apply;add_in_sorted_list%with; %ancestor.surname; -- %ancestor.death_place;%and; %ancestor.death_date.year;%and; %ancestor.index;%and; %ancestor.anc_sosa%end; %elseif;(ancestor.has_burial_place) %apply;add_in_sorted_list%with; %ancestor.surname; -- %ancestor.burial_place;%and; %ancestor.burial_date.year;%and; %ancestor.index;%and; %ancestor.anc_sosa%end; %end; %foreach;ancestor.family; %if;(ancestor.spouse.index = spouse.index and marriage_place != "") %apply;add_in_sorted_list%with; %ancestor.surname; -- %marriage_place;%and; %marriage_date.year;%and; %ancestor.index;%and; %ancestor.anc_sosa%end; %end; %end; %end; %end; %end; %end;

    [surname/surnames]0 -- [place];[date begin];([nb events]);[date end] %foreach;sorted_list_item; %if;(prev_item.1 != item.1) %reset_count;%incr_count; %item.1;;%item.2; ;(%expr(count - 1));%item.2; %else;" style="display:none;">(%expr(count - 1));%item.2; %end; %end; %end;

    %elseif;(evar.t = "F" and evar.tf1 = "stat1") %( tf1 = stat1 %) %let;max_width;180%in; %apply;gen()
    %apply;stat1("birth") %apply;stat1("death")
    %elseif;(evar.t = "F" and evar.tf1 = "aad") %( age_at_death by generation tf1 = aad %) %apply;gen() %reset_count; %empty_sorted_list; %foreach;ancestor_level(l_v) %if;(level > 1 and (evar.only != "on" or level = l_v)) %foreach;ancestor; %if;(ancestor.same = "") %let;l_aby;%if;(ancestor.birth_date.year = "")9999%else;%ancestor.birth_date.year;%end;%in; %let;l_ady;%if;(ancestor.death_date.year = "")0%else;%ancestor.death_date.year;%end;%in; %if;(ancestor.computable_death_age and l_ady >= l_aby) %incr_count; %let;l_age;%expr((l_ady - l_aby)/10)%in; %apply;add_in_sorted_list(ancestor.sex,l_age,ancestor.index) %end; %end; %end; %end; %end; %let;max_width;360%in; %let;l_size;%expr(36 / ((60 + count) / 6 / 10))%in;
    [*age] [*age at death] ([M/F]0, [M/F]1) %count; [date/dates]1
    %apply;stat_age1()
    [*generation/generations]0 [*age at death] ([M/F]0, [M/F]1) [*date of birth]
    %foreach;ancestor_level(l_v) %empty_sorted_list; %reset_count; %if;(level > 1 and (evar.only != "on" or level = l_v)) %foreach;ancestor; %if;(ancestor.same = "") %let;l_aby;%if;(ancestor.birth_date.year = "")9999%else;%ancestor.birth_date.year;%end;%in; %let;l_ady;%if;(ancestor.death_date.year = "")0%else;%ancestor.death_date.year;%end;%in; %if;(ancestor.computable_death_age and l_ady >= l_aby) %incr_count; %let;l_age;%expr(l_ady - l_aby)%in; %apply;add_in_sorted_list(l_aby,l_age,ancestor.sex,ancestor.index) %end; %end; %end; %apply;stat_age2() %end; %end;
    %elseif;(evar.t = "F" and evar.tf1 = "afm") %( age father mother by generation tf1 = afm %) %apply;gen() %reset_count; %empty_sorted_list; %foreach;ancestor_level(l_v) %if;(level > 1 and (evar.only != "on" or level = l_v)) %foreach;ancestor; %if;(ancestor.same = "" and ancestor.has_parents) %let;l_aby;%if;(ancestor.birth_date.year = "" or ancestor.birth_date.prec = ".." or ancestor.birth_date.prec = "|")0%else;%ancestor.birth_date.year;%end;%in; %let;l_fby;%if;(ancestor.father.birth_date.year = "" or ancestor.father.birth_date.prec = ".." or ancestor.father.birth_date.prec = "|")9999%else;%ancestor.father.birth_date.year;%end;%in; %let;l_mby;%if;(ancestor.mother.birth_date.year = "" or ancestor.mother.birth_date.prec = ".." or ancestor.mother.birth_date.prec = "|")9999%else;%ancestor.mother.birth_date.year;%end;%in; %if;(l_aby > l_fby) %incr_count; %let;l_age;%expr((l_aby - l_fby)/10)%in; %apply;add_in_sorted_list(0,l_age,ancestor.father.index,count) %end; %if;(l_aby > l_mby) %incr_count; %let;l_age;%expr((l_aby - l_mby)/10)%in; %apply;add_in_sorted_list(1,l_age,ancestor.mother.index,count) %end; %end; %end; %end; %end; %let;max_width;360%in; %let;l_size;%expr(36 / ((40 + count) / 4 / 10))%in;
    [*age] [*age] ([father/mother]0, [father/mother]1) %count; [date/dates]1
    %apply;stat_age1()
    [*generation/generations]0 [*age] ([father/mother]0, [father/mother]1) [*date of birth]
    %foreach;ancestor_level(l_v) %empty_sorted_list; %reset_count; %if;(level > 1 and (evar.only != "on" or level = l_v)) %foreach;ancestor; %if;(ancestor.same = "" and ancestor.has_parents) %let;l_aby;%if;(ancestor.birth_date.year = "" or ancestor.birth_date.prec = ".." or ancestor.birth_date.prec = "|")0%else;%ancestor.birth_date.year;%end;%in; %let;l_fby;%if;(ancestor.father.birth_date.year = "" or ancestor.father.birth_date.prec = ".." or ancestor.father.birth_date.prec = "|")9999%else;%ancestor.father.birth_date.year;%end;%in; %let;l_mby;%if;(ancestor.mother.birth_date.year = "" or ancestor.mother.birth_date.prec = ".." or ancestor.mother.birth_date.prec = "|")9999%else;%ancestor.mother.birth_date.year;%end;%in; %if;(l_aby >= l_fby) %incr_count; %let;l_age;%expr(l_aby - l_fby)%in; %apply;add_in_sorted_list(l_aby,l_age,0,ancestor.index,count) %end; %if;(l_aby >= l_mby) %incr_count; %let;l_age;%expr(l_aby - l_mby)%in; %apply;add_in_sorted_list(l_aby,l_age,1,ancestor.index,count) %end; %end; %end; %apply;stat_age2() %end; %end;
    %elseif;(evar.t = "F" and evar.tf1 = "bmdm") %( birth month death month tf1 = bmdm %)
    %apply;gen()
    %apply;stat_month("birth") %apply;stat_month("death")
    %apply;stat_calendar()
    %elseif;(evar.t ="F" and evar.tf1 = "ars") %( ars table day month generation %) %( rlm link 2 %) %let;rlm2;i2=%index;;t2=0%in; %( rlm link 3 %) %let;rlm3;%if;(browsing_with_sosa_ref)i3=%sosa_ref.index;;t3=sosa_1%end;%in; %( font family %) %let;ff;%if;(evar.ff != "")%evar.ff;%else;arial%end;%in; %( initial count %) %let;ic;%if;(evar.ic >= 0)%evar.ic;%else;400%end;%in; %( font size %) %let;fs;%if;(evar.fs >= 0)%evar.fs;%else;3%end;%in; %( width %) %let;width;%if;(evar.width >= 0)%evar.width;%else;2048%end;%in; %( height %) %let;height;%if;(evar.height >= 0)%evar.height;%else;1536%end;%in; %( left x %) %let;lx;%expr(width / 35)%in; %( top x %) %let;tx;%expr(height / 13)%in; %( red %) %let;red;%if;(evar.red >= 0)%evar.red;%else;10%end;%in; %( green %) %let;green;%if;(evar.green >= 0)%evar.green;%else;10%end;%in; %( blue %) %let;blue;%if;(evar.blue >= 0)%evar.blue;%else;10%end;%in; %(male birth text %) %let;mbt;%if;(evar.mbt != "")%evar.mbt;%else;%end;%in; %(male birth field%) %let;mbf;%if;(evar.mbf != "")%evar.mbf;%else;ancestor.first_name%end;%in; %(male death text %) %let;mdt;%if;(evar.mdt != "")%evar.mdt;%else;%end;%in; %(male death field%) %let;mdf;%if;(evar.mdf != "")%evar.mdf;%else;ancestor.occupation%end;%in; %(female birth text %) %let;fbt;%if;(evar.fbt != "")%evar.fbt;%else;%end;%in; %(female birth field%) %let;fbf;%if;(evar.fbf != "")%evar.fbf;%else;ancestor.surname%end;%in; %(female death text %) %let;fdt;%if;(evar.fdt != "")%evar.fdt;%else;%end;%in; %(female death field%) %let;fdf;%if;(evar.fdf != "")%evar.fdf;%else;ancestor.dates%end;%in; %apply;ars(mbt,mbf,mdt,mdf,fbt,fbf,fdt,fdf) %elseif;(evar.t = "F" and evar.tf1 = "sb") %( surnames branch %) %apply;togen(l_v).
      %foreach;ancestor_surname(l_v)
    • %nn; %if;(evar.cgl != "on")%nn; %ancestor.surname_end;%ancestor.surname_begin;%nn; %else;%ancestor.surname_end;%ancestor.surname_begin;%end; %if;(ancestor.nb_times > 1) (%ancestor.nb_times;)%end; ; %ancestor.place; ; %ancestor.date_begin.year;-%ancestor.date_end.year;
    • %end;
    %elseif;(evar.t = "F") %( list tf1 = ? %) %let;l_url;%prefix;m=A;t=F;i=%index;;v=%l_v;;only=%evar.only;;maxv=%evar.maxv;%in; %elseif;(evar.t = "L") %( by list %)

    %apply;togen(l_v).

    %apply;ancestors_by_list("self",l_v) %elseif;(evar.t = "H") %( horizontally %)

    %apply;togen(l_v).

    %apply;ancestors_horizontally("self",l_v,"   ","-- ","   ")
    %end; %if;(evar.tf1 != "csv") %base_trailer; %copyright; %end; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templm/trl.txt0000660000175200017530000000613312664543647024432 0ustar guillaumeguillaume %if;(not cancel_links)
    %hidden; %if;(bvar.hide_advanced_request = "no") [*advanced request] %end;
    %if;(evar.digest = "") %end; %if;(wizard) %end; %end; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templm/deslist.txt0000660000175200017530000013714512664543647025310 0ustar guillaumeguillaume%doctype; %let;l_v0;%if;(evar.v > max_desc_level)%max_desc_level;%else;%evar.v;%end;%in; %let;l_v;%if;(bvar.max_desc_level = "")%l_v0;%elseif;(bvar.max_desc_level > l_v0)%l_v0;%else;%bvar.max_desc_level;%end;%in; %nn; %apply;a_of_b_gr_eq_lev%with; [*descendants]%nn; %and; %if;(public_name != "")%public_name;%else;%first_name;%end; %if;(qualifier != "") %qualifier;%end; %sp;%surname; %end; %include.css; %base_header; %( %) %let;birth_symbol;%if;(bvar.birth_symbol != "")%bvar.birth_symbol;%else;°%end;%in; %let;death_symbol;%if;(bvar.death_symbol != "")%bvar.death_symbol;%else;†%end;%in; %define;married_to(is_male, date_place) %if;("is_male" = 1) %if;are_married;[married%t to:::date_place]0%nn; %elseif;are_not_married;[relationship%t to:::date_place]0%nn; %elseif;are_engaged;[engaged%t to:::date_place]0%nn; %elseif;is_no_sexes_check;[relationship%t to:::date_place]0%nn; %elseif;is_no_mention;date_place [with]%nn; %end; %else; %if;are_married;[married%t to:::date_place]1%nn; %elseif;are_not_married;[relationship%t to:::date_place]1%nn; %elseif;are_engaged;[engaged%t to:::date_place]1%nn; %elseif;is_no_sexes_check;[relationship%t to:::date_place]1%nn; %elseif;is_no_mention;date_place [with]%nn; %end; %end; %if;are_divorced;… [divorced]%divorce_date;%nn; %elseif;are_separated;… [separated]%nn; %end; %end; %define;married(xx) %if;(evar.sd = "on") %apply;link_marriage("xx")%nn; %if;are_divorced;… [divorced]%divorce_date;%nn; %elseif;are_separated;… [separated]%nn; %end; %else; %apply;married_to%with %xx.is_male; %and; %if;(on_marriage_date != "") %on_marriage_date;%end; %if;(marriage_place != "") [in (place)] %marriage_place;%end; %end; %end; %end; %define;link1(xx,yy,fff) %nn; %if;(cancel_links or xx.is_restricted) %yy;%nn; %else; %yy;%nn; %end; %nn; %end; %define;link2(xx,yy) %if;(cancel_links or xx.is_restricted)%yy; %else; %yy; %end; %xx.title;%xx.dates; %if;(xx.sosa_in_list != "" and evar.only != "on" and level != 2) %sp;(⇒ %xx.sosa_in_list;%nn; .)%nn; %end; %end; %define;somebody_long_info(xx) %if;xx.has_qualifiers; %apply;lazy_print(", ") %foreach;xx.qualifier; %if;not is_first; %if;(lazy_printed)/%end; %lazy_force; %qualifier;%nn; %end; %end; %end; %if;xx.has_aliases; %apply;lazy_print(", ") %foreach;xx.alias; %if;(lazy_printed)/%end; %lazy_force; %alias;%nn; %end; %end; %if;(("xx" = "ancestor" or xx.sosa_in_list = "") and xx.has_nobility_titles) %foreach;xx.nobility_title;, %nobility_title;%end;%nn; %end; %if;(xx.has_linked_pages and xx.has_linked_page.HEAD), %xx.linked_page.HEAD;%end; %if;(xx.has_public_name or xx.has_qualifiers), (%xx.first_name; %xx.surname;)%end; %if;(evar.alias="on") %nn; %if;xx.has_first_names_aliases; %apply;lazy_print(", ") %foreach;xx.first_name_alias; %if;(lazy_printed)/%end; %lazy_force; %first_name_alias;%nn; %end; %end; %if;xx.has_surnames_aliases; %apply;lazy_print(", ") %foreach;xx.surname_alias; %if;(lazy_printed)/%end; %lazy_force; %surname_alias;%nn; %end; %end; %nn; %end; %if;(xx.computable_age), %xx.age;%end; %if;(evar.sd = "on") , %apply;link_dates("xx")%nn; %else; %if;(xx.has_birth_date or xx.has_birth_place) , %if;xx.is_male;[born]0%elseif;xx.is_female;[born]1%else;[born]2%end; %if;xx.has_birth_date; %xx.on_birth_date;%end; %if;xx.has_birth_place; [in (place)] %xx.birth_place;%end; %end; %if;(xx.has_baptism_date or xx.has_baptism_place) , %if;xx.is_male;[baptized]0%elseif;xx.is_female;[baptized]1%nn; %else;[baptized]2%end; %if;xx.has_baptism_date; %xx.on_baptism_date;%end; %if;xx.has_baptism_place; [in (place)] %xx.baptism_place;%end; %end; %if;xx.is_dead;, %xx.died; %if;(xx.has_death_date) %xx.on_death_date;%end; %if;(xx.has_death_place) [in (place)] %xx.death_place;%end; %end; %if;xx.is_buried;, %if;xx.is_male;[buried]0%else;[buried]1%end; %if;xx.has_burial_date; %xx.on_burial_date;%end; %if;xx.has_burial_place; [in (place)] %xx.burial_place;%end; %end; %if;xx.is_cremated;, %if;xx.is_male;[cremated]0%else;[cremated]1%end; %if;xx.has_cremation_date; %xx.on_cremation_date;%end; %if;xx.has_cremation_place; [in (place)] %xx.cremation_place;%end; %end; %end; %if;(xx.has_linked_pages and xx.has_linked_page.DEATH), %xx.linked_page.DEATH;%end; %if;(xx.computable_death_age) , [age at death:] %xx.death_age;%nn; %end; %end; %define;somebody_extra_info(xx) %if;xx.has_occupation;, %xx.occupation;%end; %if;(xx.has_linked_pages and xx.has_linked_page.OCCU), %xx.linked_page.OCCU;%end; %if;(evar.rel = "on" and xx.has_relations) %foreach;xx.relation;%nn;  ; %relation_type; : %if;has_relation_him; %apply;link2("relation_him","relation_him") %end; %if;has_relation_her; %if;has_relation_him;, %end; %apply;link2("relation_her","relation_her") %end; %end; %foreach;xx.related;%nn; %if;(related_type != [foster son/foster daughter/foster child]0 and related_type != [foster son/foster daughter/foster child]1 and related_type != [foster son/foster daughter/foster child]2)  ; %related_type; : %apply;link2("related","related") %end; %end; %end; %end; %define;somebody_spouse_parent() %if;(evar.parents = "on" and spouse.has_parents)    %nn; %apply;a_of_b%with; %if;(spouse.is_male)[son/daughter/child]0 %else;[son/daughter/child]1%end; %and; %apply;link2("spouse.father","spouse.father") [and] %apply;link2("spouse.mother","spouse.mother") %end; %end; %end; %define;link_dates(xx) %sp; %if;(wizard and not cancel_links) %nn; %apply;sure_dates("xx","birth","baptism","baptism","baptism",xx.has_linked_page.BIRTHA) %if;(xx.is_dead) %sp;%apply;sure_dates("xx","death","burial","cremated","cremation",xx.has_linked_page.DEATHA) %end; %nn; %else; %apply;sure_dates("xx","birth","baptism","baptism","baptism",xx.has_linked_page.BIRTHA)%sp; %if;(xx.is_dead) %apply;sure_dates("xx","death","burial","cremated","cremation",xx.has_linked_page.DEATHA) %end; %end; %end; %define;link_marriage(xx) %if;(wizard and not cancel_links) %nn; &%nn; %slash_marriage_date; %marriage_place; %else; &%nn; %slash_marriage_date; %marriage_place; %end; %end; %define;sure_dates(xx,dd1,dd2,dd3,dd4,zz) %if;(xx.dd1_date.year != "") %dd1_symbol;%xx.slash_dd1_date; %elseif;(xx.dd2_date.year != "") %dd1_symbol;%xx.slash_dd2_date; %elseif;(xx.dd3_date.year != "") %dd1_symbol;%xx.slash_dd3_date; %else; %dd1_symbol; %end; %if;(xx.dd1_place != "") %sp;%xx.dd1_place;%nn; %elseif;(xx.dd2_place != "") %sp;%xx.dd2_place;%nn; %elseif;(xx.dd4_place != "") %sp;%xx.dd4_place;%nn; %end; %end; %define;somebody_notes(xx,yy) %if;(evar.inline = "on") %incr_count; %if;(evar.notes = "on") %if;(xx.has_notes or xx.has_linked_page.BNOTE)
    %if;xx.has_linked_page.BNOTE;>> %xx.linked_page.BNOTE;%end; %if;xx.has_notes;%xx.notes;%end;
    %end; %end; %if;(evar.src = "on") %if;(xx.has_sources or xx.has_linked_page.BIBLIO)
    %if;xx.has_linked_page.BIBLIO;>> %xx.linked_page.BIBLIO;%end; %if;(xx.has_sources) %foreach;xx.source • %source_type; : %source;%sp; %end; %end;
    %end; %end; %elseif;((evar.notes = "on" and (xx.has_notes or xx.has_linked_page.BNOTE)) or (evar.src = "on" and (xx.has_sources or xx.has_linked_page.BIBLIO))) yy%nn; %end; %end; %define;inline_comment() %incr_count;
    %comment;
    %end; %define;init_count(prev_count) %reset_count; %for;i;0;prev_count; %incr_count; %end; %end; %define;link_comment(z1) %if;(has_comment and evar.notes = "on" and evar.inline != "on") z1%nn; %end; %end; %define;bcomment(z1,z2) %if;(has_comment and evar.notes = "on")
    z2. %z1; &%marriage_date.year; %spouse;
    %comment;
    %end; %end; %define;bnotes(z1,z2) %if;((evar.notes = "on" and (z1.has_notes or z1.has_linked_page.BNOTE)) or (evar.src = "on" and (z1.has_sources or z1.has_linked_page.BIBLIO)))
    z2. %z1;%z1.dates;
    %if;(evar.notes = "on" and (z1.has_notes or z1.has_linked_page.BNOTE)) %if;(z1.has_linked_page.BNOTE)
    >> %z1.linked_page.BNOTE;
    %end; %if;(z1.has_notes)
    %z1.notes;
    %end; %end; %if;(evar.src = "on" and (z1.has_sources or z1.has_linked_page.BIBLIO)) %if;(z1.has_linked_page.BIBLIO)
    >> %z1.linked_page.BIBLIO;
    %end; %if;(z1.has_sources) %foreach;z1.source;
    • %source_type; : %source;
    %end; %end; %end; %end; %end; %define;image(xx) %if;(evar.image="on" and xx.has_image) [image/images]0 %end; %end; %( %) %( %) %define;stat_age1()
    1101009080 70605040 3020100
    %reset_count; %foreach;sorted_list_item; %if;(item.1 = 0) %incr_count; %if;(next_item.2 != item.2) %let;l_width0;%expr(count * l_size)%in; %let;l_width;%if;(l_width0 > max_width)%max_width;%else;%l_width0;%end;%in; %count; %reset_count; %end; %end; %if;(item.1 = 1) %incr_count; %if;(next_item.2 != item.2) %let;l_width0;%expr(count * l_size)%in; %let;l_width;%if;(l_width0 > max_width)%max_width;%else;%l_width0;%end;%in; %count; %reset_count; %end; %end; %end;
    %end; %define;stat_age2() %let;l_height;%expr(40 + (count *2))%in;
    %reset_count; %foreach;sorted_list_item; %incr_count; %let;l_top;%expr(20 + (count * 2))%in; %let;l_left0;%expr(20 + item.2 * 8)%in; %let;l_left;%if;(l_left0 > 840)840%else;%l_left0;%end;%in; %if;(count = 1) %item.1; %level; %end; %if;(next_item.1 = "")%item.1;%end; %item.2; %end;
    %end; %define;stat1b(z1) %reset_count; %foreach;sorted_list_item; %if;(item.1 = 0) %incr_count; %if;(next_item.2 != item.2 or next_item.1 = 1) %let;l_top;%expr(item.2 + z1)%in; %let;l_width0;%expr(count * l_size)%in; %let;l_width;%if;(l_width0 > max_width)%max_width;%else;%l_width0;%end;%in; %count; %reset_count; %end; %elseif;(item.1 = 1) %incr_count; %if;(next_item.2 != item.2) %let;l_top;%expr(item.2 + z1)%in; %let;l_width0;%expr(count * l_size)%in; %let;l_width;%if;(l_width0 > max_width)%max_width;%else;%l_width0;%end;%in; %count; %reset_count; %end; %end; %end; %end; %( %) %( %) %let;let_child;%if;(evar.always_surname != "no")child%else;child_name%end;%in; %let;max_event;%if;(bvar.latest_event = "")100%else;%bvar.latest_event;%end;%in; %define;info2(xx) %xx.title;%xx.dates; %end; %define;tothegen(xx) [*to the %s generation:::xx] %end; %define;togen(xx) %if;(xx = 0)[*specify::generation/generations]0%nn; %elseif;(xx = 1)[*to the children]%nn; %elseif;(xx = 2)[*to the grandchildren]%nn; %elseif;(xx = 3)[*to the great-grandchildren]%nn; %else; %apply;tothegen%with; %apply;nth([nth (generation)], xx) %end; %end; %end; %define;marriage_info() %if;(evar.rel = "on" and has_witnesses)    [witness/witnesses]1 : %foreach;witness; %if;(not is_first),%nl;%end; %apply;link2("witness","witness") %apply;info2("witness") %end; %if;(has_comment and evar.notes = "on" and evar.inline = "on") %apply;inline_comment() %end; %end; %end; %define;bnotes2(xx, curlev, maxlev, famlev) %incr_count; %apply;bnotes("xx",count) %foreach;xx.family; %if;(evar.spouse="on") %incr_count; %let;id_fam;x%family_cnt;-%count;%in; %apply;bcomment("xx",id_fam) %apply;bnotes("spouse",count) %end; %if;(curlev < maxlev) %if;(curlev = 0 or evar.t = "M" and xx.is_male or evar.t = "F" and xx.is_female or evar.t = "L") %if;(family.desc_level = famlev and has_children) %family.set_infinite_desc_level; %foreach;child; %apply;bnotes2("child", curlev+1, maxlev, famlev+1) %end; %end; %end; %end; %end; %end; %define;bnotes1() %if;(evar.inline != "on" and (evar.notes = "on" or evar.src = "on")) %reset_desc_level; %reset_count;

    %if;(evar.notes = "on")[*note/notes]1 %if;(evar.src = "on")[and] [source/sources]1%end; %else;[*source/sources]1%end;

    %apply;bnotes2("self",0,l_v,0)
    %end; %end; %define;descendants_by_list(xx, yy, curlev, maxlev, famlev) %if;(curlev = 0)
    %nl;%end; %apply;image("xx") %incr_count; %apply;link1("xx","yy",count) %apply;somebody_long_info("xx") %apply;somebody_extra_info("xx") %apply;somebody_notes("xx",count) %apply;lazy_print%with;%nl;%end; %foreach;xx.family; %if;(evar.spouse="on") %if;(family_cnt != 1 and curlev = 0)
    %nl;%end; %lazy_force;   %nn; %apply;married("xx") %incr_count; %let;id_fam;x%family_cnt;-%count;%in; %apply;link_comment(id_fam)    %nn; %apply;link1("spouse","spouse",count) %apply;somebody_long_info("spouse") %apply;somebody_extra_info("spouse") %apply;somebody_spouse_parent() %apply;somebody_notes("spouse",count) %apply;marriage_info() %end; %if;(curlev < maxlev) %if;(curlev = 0 or evar.t = "M" and xx.is_male or evar.t = "F" and xx.is_female or evar.t = "L") %if;(family.desc_level < famlev) , [see further] %apply;lazy_print%with;%nl;%end; %elseif;(family.desc_level > famlev) , [see above] %apply;lazy_print%with;%nl;%end; %elseif;has_children; %family.set_infinite_desc_level; %if;(curlev = 0)
    %nl;%end;
      %foreach;child;
    1. %apply;descendants_by_list("child", let_child, curlev+1, maxlev, famlev+1)
    2. %end;
    %apply;lazy_print%with;%end; %else; %if;(curlev = 0)%nl;
    %nl; %else;%apply;lazy_print%with;%nl;%end; %end; %end; %elseif;has_children;, … %end; %else;%nl; %apply;lazy_print%with;%nl;%end; %end; %end; %end; %define;by_list(xx)

    %if;(evar.t = "F") [*male line/female line]1 %elseif;(evar.t = "M") [*male line/female line]0 %end; %apply;togen(xx)

    %reset_count; %apply;descendants_by_list("self", "self", 0, xx, 0)%nl;

    %foreach;descendant_level; %if;(level = l_v) [*total] : %number_of_descendants; [[person/persons]1@(c)] %end; %end;

    %end; %define;desc_aad(curlev, famlev, maxlev) %let;l_aby;%birth_date.year;%in; %let;l_ady;%death_date.year;%in; %if;(computable_death_age and l_ady >= l_aby) %incr_count; %let;l_age;%expr((l_ady - l_aby)/10)%in; %apply;add_in_sorted_list(sex,l_age,index) %end; %foreach;family; %if;(curlev < maxlev and family.desc_level = famlev and has_children) %family.set_infinite_desc_level; %foreach;child; %apply;desc_aad(curlev+1, famlev+1, maxlev) %end; %end; %end; %end; %define;desc_aad1(curlev, famlev, maxlev) %let;l_aby;%birth_date.year;%in; %let;l_ady;%death_date.year;%in; %if;(computable_death_age and l_ady >= l_aby) %incr_count; %let;l_age;%expr(l_ady - l_aby)%in; %apply;add_in_sorted_list(l_aby,l_age,sex,index) %end; %foreach;family; %if;(curlev < maxlev and family.desc_level = famlev and has_children) %family.set_infinite_desc_level; %foreach;child; %apply;desc_aad1(curlev+1, famlev+1, maxlev) %end; %end; %end; %end; %define;desc_afm(curlev, famlev, maxlev) %let;l_aby;%if;(birth_date.year = "" or birth_date.prec = ".." or birth_date.prec = "|")0%else;%birth_date.year;%end;%in; %let;l_fby;%if;(has_parents)%if;(father.birth_date.year = "" or father.birth_date.prec = ".." or father.birth_date.prec = "|")9999%else;%father.birth_date.year;%end;%else;9999%end;%in; %let;l_mby;%if;(has_parents)%if;(mother.birth_date.year = "" or mother.birth_date.prec = ".." or mother.birth_date.prec = "|")9999%else;%mother.birth_date.year;%end;%else;9999%end;%in; %if;(l_aby >= l_fby) %incr_count; %let;l_age;%expr((l_aby - l_fby)/10)%in; %apply;add_in_sorted_list(0,l_age,father.index,count) %end; %if;(l_aby >= l_mby) %incr_count; %let;l_age;%expr((l_aby - l_mby)/10)%in; %apply;add_in_sorted_list(1,l_age,mother.index,count) %end; %foreach;family; %if;(curlev < maxlev and family.desc_level = famlev and has_children) %family.set_infinite_desc_level; %foreach;child; %apply;desc_afm(curlev+1, famlev+1, maxlev) %end; %end; %end; %end; %define;desc_afm1(curlev, famlev, maxlev) %let;l_aby;%if;(birth_date.year = "" or birth_date.prec = ".." or birth_date.prec = "|")0%else;%birth_date.year;%end;%in; %let;l_fby;%if;(has_parents)%if;(father.birth_date.year = "" or father.birth_date.prec = ".." or father.birth_date.prec = "|")9999%else;%father.birth_date.year;%end;%else;9999%end;%in; %let;l_mby;%if;(has_parents)%if;(mother.birth_date.year = "" or mother.birth_date.prec = ".." or mother.birth_date.prec = "|")9999%else;%mother.birth_date.year;%end;%else;9999%end;%in; %if;(l_aby >= l_fby) %incr_count; %let;l_age;%expr(l_aby - l_fby)%in; %apply;add_in_sorted_list(l_aby,l_age,0,index,count) %end; %if;(l_aby >= l_mby) %incr_count; %let;l_age;%expr(l_aby - l_mby)%in; %apply;add_in_sorted_list(l_aby,l_age,1,index,count) %end; %foreach;family; %if;(curlev < maxlev and family.desc_level = famlev and has_children) %family.set_infinite_desc_level; %foreach;child; %apply;desc_afm1(curlev+1, famlev+1, maxlev) %end; %end; %end; %end; %define;desc_ars(curlev,famlev,maxlev,m_bt,m_bf,m_dt,m_df,f_bt,f_bf,f_dt,f_df) %incr_count; %let;lev;%expr(l_v - curlev + 1)%in; %let;aad; %if;(death_date.year > birth_date.year) %expr((death_date.year - birth_date.year)*2) %else;0%nn; %end; %in; %if;(sex = 0) %apply;add_in_sorted_list( lev,index,sex, birth_date.day,birth_date.month, death_date.day,death_date.month, "m_bt",m_bf,"m_dt",m_df,aad,curlev) %else; %apply;add_in_sorted_list( lev,index,sex, birth_date.day,birth_date.month, death_date.day,death_date.month, "f_bt",f_bf,"f_dt",f_df,aad,curlev) %end; %foreach;family; %if;(curlev < maxlev and family.desc_level = famlev and has_children) %family.set_infinite_desc_level; %foreach;child; %apply;desc_ars(curlev+1,famlev+1,maxlev,"m_bt","m_bf","m_dt","m_df","f_bt","f_bf","f_dt","f_df") %end; %end; %end; %end; %define;tl1_ars(xx) %end; %define;ars(m_bt,m_bf,m_dt,m_df,f_bt,f_bf,f_dt,f_df) %reset_desc_level; %reset_count; %empty_sorted_list; %apply;desc_ars(0,0,l_v,"m_bt","m_bf","m_dt","m_df","f_bt","f_bf","f_dt","f_df")
    %foreach;sorted_list_item; %let;i9;%if;(count > ic)%apply;initial(item.9)%else;%item.9;%end;%in; %let;i11;%if;(count > ic)%apply;initial(item.11)%else;%item.11;%end;%in; %let;fs1;%expr((item.13 + fs) * fs)%in; %let;db;%if;(item.4 = "")%expr((item.2 + 31) % 31 + 1)%else;%item.4;%end;%in; %let;dd;%if;(item.6 = "")%expr((item.2 + 31) % 31 + 1)%else;%item.6;%end;%in; %let;mb;%if;(item.5 = "")%expr((item.2 + 12) % 12 + 1)%else;%item.5;%end;%in; %let;md;%if;(item.7 = "")%expr((item.2 + 12) % 12 + 1)%else;%item.7;%end;%in; %let;dbc;%expr(8 * db)%in; %let;ddc;%expr(8 * dd)%in; %let;mbc;%expr(21 * mb)%in; %let;mdc;%expr(21 * md)%in; %let;pad;%expr(item.13 * 10)%in; %let;aad;%expr(item.12 + green)%in; %if;(item.3 = 0) %item.8;%i9; %item.10;%i11; %end; %if;(item.3 = 1) %item.8;%i9; %item.10;%i11; %end; %end;

    %hidden; %if;access_by_key; %if;(occ != "0") %end; %else %end;

      • [*him/her]0[*him/her]1
        [birth] [birth]
        [death] [death]
    %end; %define;desc_month(xx,curlev,famlev,maxlev) %let;l_month;%if;(xx_date.day != "")%xx_date.month;%end;%in; %if;(l_month != "") %incr_count; %apply;add_in_sorted_list(sex,l_month,count) %end; %foreach;family; %if;(curlev < maxlev and family.desc_level = famlev and has_children) %family.set_infinite_desc_level; %foreach;child; %apply;desc_month("xx",curlev+1,famlev+1,maxlev) %end; %end; %end; %end; %define;desc_calendar(curlev,famlev,maxlev) %if;(birth_date.day != "") %incr_count; %let;mm_dd;%expr(birth_date.month+100)_%expr(birth_date.day+100)%in; %apply;add_in_sorted_list(mm_dd,birth_date.month,birth_date.day,index,birth_symbol) %end; %if;(death_date.day != "") %incr_count %let;mm_dd;%expr(death_date.month+100)_%expr(death_date.day+100)%in; %apply;add_in_sorted_list(mm_dd,death_date.month,death_date.day,index,death_symbol) %end; %foreach;family; %if;(curlev < maxlev and family.desc_level = famlev and has_children) %family.set_infinite_desc_level; %foreach;child; %apply;desc_calendar(curlev+1,famlev+1,maxlev) %end; %end; %end; %end; %define;stat_month(xx) %reset_desc_level; %reset_count; %empty_sorted_list; %apply;desc_month("xx",0,0,l_v) %let;max_width;360%in; %let;l_size;%expr(36 / ((120 + count) /12 / 10))%in;
    [*year/month/day]1 [*xx] ([M/F]0, [M/F]1) %count; [date/dates]1
    [(month)]0[(month)]1[(month)]2[(month)]3 [(month)]4[(month)]5[(month)]6[(month)]7 [(month)]8[(month)]9[(month)]10[(month)]11
    %reset_count; %foreach;sorted_list_item; %if;(item.1 = 0) %incr_count; %if;(next_item.2 != item.2) %let;l_width0;%expr(count * l_size)%in; %let;l_width;%if;(l_width0 > max_width)%max_width;%else;%l_width0;%end;%in; %count; %reset_count; %end; %end; %if;(item.1 = 1) %incr_count; %if;(next_item.2 != item.2) %let;l_width0;%expr(count * l_size)%in; %let;l_width;%if;(l_width0 > max_width)%max_width;%else;%l_width0;%end;%in; %count; %reset_count; %end; %end; %end;
    %end; %define;color(xx) %apply;nth%with; /606060/993333/339933/333399/999999/339999/993399/999933/AAAAAA/FFAAAA/AAFFAA/AAAAFF/FFFFFF/AAFFFF/FFAAFF/FFFFAA%and; xx%end; %end; %define;stat_calendar() %( table calendar nb day-month %) %reset_desc_level; %reset_count; %empty_sorted_list; %apply;desc_calendar(0,0,l_v)
    [*calendar/calendars]0
    %for;i;1;32;
    %i;
    %end;
    [(month)]0[(month)]1[(month)]2[(month)]3 [(month)]4[(month)]5[(month)]6[(month)]7 [(month)]8[(month)]9[(month)]10[(month)]11
    %reset_count; %foreach;sorted_list_item; %if;(prev_item.1 != item.1) %reset_count;%incr_count; %expr(count - 1) %else; " style="display:none;"> %expr(count - 1) %end; %end; %end;
    %end; %define;dstat1(z1) %reset_count;%reset_desc_level;%empty_sorted_list; %apply;dstat1a("z1_date.day","z1_date.date.moon_age",3,0,0,l_v) %let;nb_date;%count;%in; %let;l_size;%expr(40 / ((90 + nb_date) / 9 / 10))%in;
    [*z1] %nb_date; [date/dates]1
    [*moon age/new moon/first quarter/full moon/last quarter]1 [*moon age/new moon/first quarter/full moon/last quarter]2 [*moon age/new moon/first quarter/full moon/last quarter]3 [*moon age/new moon/first quarter/full moon/last quarter]4 %apply;stat1b(0)
    %reset_count;%reset_desc_level;%empty_sorted_list; %apply;dstat1a("z1_date.day","z1_date.date.week_day",1,0,0,l_v) %let;nb_female;%count;%in; %let;l_size;%expr(40 / ((40 + nb_date) / 4 / 10))%in;
    [*(week day)]0 [*(week day)]1 [*(week day)]2 [*(week day)]3 [*(week day)]4 [*(week day)]5 [*(week day)]6 %apply;stat1b(1)
    %reset_count;%reset_desc_level;%empty_sorted_list; %apply;dstat1a("z1_date.day","z1_date.date.month",0,0,0,l_v) %let;nb_male;%count;%in; %let;l_size;%expr(40 / ((40 + nb_date) / 4 / 10))%in;
    [*(month)]0 [*(month)]1 [*(month)]2 [*(month)]3 [*(month)]4 [*(month)]5 [*(month)]6 [*(month)]7 [*(month)]8 [*(month)]9 [*(month)]10 [*(month)]11 %apply;stat1b(0)
    %nb_male; [M/F]0 %nb_female; [M/F]1
    %end; %define;dstat1a(z1,z2,z3,curlev,famlev,maxlev) %if;(z1 != "") %let;l_y;%z2;%in; %if;(z3 = 3 or sex = z3) %incr_count; %end; %apply;add_in_sorted_list(sex,l_y,index) %end; %foreach;family; %if;(curlev < maxlev and family.desc_level = famlev and has_children) %family.set_infinite_desc_level; %foreach;child; %apply;dstat1a("z1","z2","z3",curlev+1,famlev+1,maxlev) %end; %end; %end; %end; %( %) %( Main %) %message_to_wizard;

    %nn; %apply;a_of_b_gr_eq_lev%with; [*descendants] %and; %if;(not cancel_links)%end; %if;(public_name != "")%public_name;%else;%first_name;%end; %if;(qualifier != "") %qualifier;%end; %sp;%surname; %if;(alias != "") (%alias;)%end; %if;(not cancel_links)%end; %end; %sp;%dates;

    %if;not cancel_links; %end; %if;(evar.m = "D" and evar.t = "L" and evar.tl1 = "aad") %( age_at_death by generation tl1 = aad %)

    %apply;togen(l_v)

    %reset_count; %reset_desc_level; %empty_sorted_list; %apply;desc_aad(0,0,l_v) %let;max_width;360%in; %let;l_size;%expr(36 / ((60 + count) / 6 / 10))%in;
    [*age] [*age at death] ([M/F]0, [M/F]1) %count; [date/dates]1
    %apply;stat_age1()
    [*generation/generations]0 [*age at death] ([M/F]0, [M/F]1) [*date of birth]
    %reset_desc_level; %reset_count; %empty_sorted_list; %apply;desc_aad1(0,0,l_v) %apply;stat_age2()
    %elseif;(evar.m = "D" and evar.t = "L" and evar.tl1 = "afm") %( age father mother by generation tl1 = afm %)

    %apply;togen(l_v)

    %reset_count; %reset_desc_level; %empty_sorted_list; %apply;desc_afm(0,0,l_v) %let;max_width;360%in; %let;l_size;%expr(36 / ((40 + count) / 4 / 10))%in;
    [*age] [*age] ([father/mother]0, [father/mother]1) %count; [date/dates]1
    %apply;stat_age1()
    [*age] ([father/mother]0, [father/mother]1) [*date of birth]
    %reset_desc_level; %reset_count; %empty_sorted_list; %apply;desc_afm1(0,0,l_v) %apply;stat_age2()
    %elseif;(evar.m = "D" and evar.t = "L" and evar.tl1 = "bmdm") %( birth month death month tl1 = bmdm %)

    %apply;togen(l_v)

    %apply;stat_month("birth") %apply;stat_month("death")
    %apply;stat_calendar()
    %elseif;(evar.m = "D" and evar.t = "L" and evar.tl1 = "stat1") %( tl1 = stat1 %) %let;max_width;180%in;

    %apply;togen(l_v)

    %apply;dstat1("birth") %apply;dstat1("death")
    %elseif;(evar.m = "D" and evar.t = "L" and evar.tl1 = "ars") %( ars table day month generation %) %( rlm link 2 %) %let;rlm2;i2=%index;;t2=0%in; %( rlm link 3 %) %let;rlm3;%if;(browsing_with_sosa_ref)i3=%sosa_ref.index;;t3=sosa_1%end;%in; %( font family %) %let;ff;%if;(evar.ff != "")%evar.ff;%else;arial%end;%in; %( initial count %) %let;ic;%if;(evar.ic >= 0)%evar.ic;%else;400%end;%in; %( font size %) %let;fs;%if;(evar.fs >= 0)%evar.fs;%else;3%end;%in; %( width %) %let;width;%if;(evar.width >= 0)%evar.width;%else;2048%end;%in; %( height %) %let;height;%if;(evar.height >= 0)%evar.height;%else;1536%end;%in; %( left x %) %let;lx;%expr(width / 35)%in; %( top x %) %let;tx;%expr(height / 13)%in; %( red %) %let;red;%if;(evar.red >= 0)%evar.red;%else;10%end;%in; %( green %) %let;green;%if;(evar.green >= 0)%evar.green;%else;10%end;%in; %( blue %) %let;blue;%if;(evar.blue >= 0)%evar.blue;%else;10%end;%in; %(male birth text %) %let;mbt;%if;(evar.mbt != "")%evar.mbt;%else;%end;%in; %(male birth field%) %let;mbf;%if;(evar.mbf != "")%evar.mbf;%else;first_name%end;%in; %(male death text %) %let;mdt;%if;(evar.mdt != "")%evar.mdt;%else;%end;%in; %(male death field%) %let;mdf;%if;(evar.mdf != "")%evar.mdf;%else;occupation%end;%in; %(female birth text %) %let;fbt;%if;(evar.fbt != "")%evar.fbt;%else;%end;%in; %(female birth field%) %let;fbf;%if;(evar.fbf != "")%evar.fbf;%else;surname%end;%in; %(female death text %) %let;fdt;%if;(evar.fdt != "")%evar.fdt;%else;%end;%in; %(female death field%) %let;fdf;%if;(evar.fdf != "")%evar.fdf;%else;dates%end;%in; %apply;ars(mbt,mbf,mdt,mdf,fbt,fbf,fdt,fdf) %else; %apply;by_list(l_v) %apply;bnotes1() %end; %base_trailer; %copyright; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templm/anctree.txt0000660000175200017530000002245212664543647025254 0ustar guillaumeguillaume%if;(evar.t = "T")%doctype_transitional;%else;%doctype;%end; %let;l_v0;%if;(evar.v > max_anc_level)%max_anc_level;%else;%evar.v;%end;%in; %let;l_v;%if;(bvar.max_anc_tree = "")%l_v0;%elseif;(bvar.max_anc_tree > l_v0)%l_v0;%else;%bvar.max_anc_tree;%end;%in; %nn; %if;(evar.t = "A")[*male line/female line]0%nn; %elseif;(evar.t = "C")[*male line/female line]1%nn; %else[*tree]%end; %if;(evar.t = "A" or evar.t = "C"):%sp; %if;(public_name != "")%public_name;%else;%first_name;%end; %if;(qualifier != "") %qualifier;%end; %surname; %end; %include.css; %base_header; %define;symbol(xx)         %if;(xx.has_siblings)♦%elseif;(xx.has_parents)◊%else;|%end;         %end; %define;a_tree_line() %if;(not is_first) %foreach;cell; %if;(not is_first)   %end; %nn; %if;(cell.is_empty or cell.is_top) %else;|%end; %end; %end; %foreach;cell; %if;(not is_first)   %end; %nn; %if;(cell.is_empty) %nn; %else; %if;(evar.bd != "" and evar.bd > 0 or evar.color != "")%nl;
    %nn; %end; %if;(evar.cgl = "on")%cell.person; %else; %cell.person;%nn; %end; %cell.person.title;%cell.person.dates; %if;(evar.bd != "" and evar.bd > 0 or evar.color != "")
    %end; %if;(evar.image = "on" and cell.person.has_image) %nl;
    %nn; %if;(evar.cgl != "on")%end; %nn; %if;(evar.cgl != "on")%end;
    %end; %end; %end; %if;(not is_last) %foreach;cell; %if;(not is_first) %nn; %if;cell.is_right; %if;(evar.marriage = "on" and cell.family.marriage_date.year != "") %nn; &%cell.family.marriage_date.year; %else; %end; %else; %end; %end; %nn; %if;cell.is_empty; %nn; %elseif;(evar.cgl = "on")%apply;symbol("cell.person")%nn; %else; %apply;symbol("cell.person")%nn; %end; %end; %foreach;cell; %if;(not is_first) %nn; %if;(cell.is_right)
    %nn; %else; %end; %end; %nn; %if;cell.is_empty; %nn; %elseif;cell.is_left;
    %nn; %elseif;cell.is_right;
    %nn; %else;|%end; %end; %end; %end; %define;male_line(xx, nn) %if;(nn > 0) %if;(xx.has_parents)%apply;male_line("xx.father", nn - 1)%end; %xx;%xx.title;%xx.dates; %if;("xx" != "self")|%end; %end;%nl; %end; %define;female_line(xx, nn) %if;(nn > 0) %if;(xx.has_parents)%apply;female_line("xx.mother", nn - 1)%end; %xx;%xx.title;%xx.dates; %if;("xx" != "self")|%end; %end;%nl; %end; %define;tree(xx) %foreach;ancestor_tree_line(xx) %apply;a_tree_line() %end;
    %end; %message_to_wizard; %if;not cancel_links; %if;(evar.t = "T") %end; %end; %if;(evar.t = "T") %apply;tree(l_v) %elseif;(evar.t = "A")
    %apply;male_line("self",l_v)
    %elseif;(evar.t = "C")
    %apply;female_line("self",l_v)
    %end; %base_trailer; %copyright; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templm/ancsosa.txt0000660000175200017530000014131512664543647025262 0ustar guillaumeguillaume%doctype; %let;l_v0;%if;(evar.v != "")%if;(evar.v > max_anc_level)%max_anc_level;%else;%evar.v;%end;%else;1%end;%in; %let;l_v;%if;(bvar.max_anc_level = "")%l_v0;%elseif;(bvar.max_anc_level > l_v0)%l_v0;%else;%bvar.max_anc_level;%end;%in; %nn; %if;(evar.t = "D") [*ancestors] … [up to] …%nn; %elseif;(evar.t = "N" and evar.only = "on") [*generation/generations]0 %l_v; %else; %apply;a_of_b%with; %if;(evar.t = "M")[*missing ancestors]%else;[*ancestors]%end; %and; %if;(public_name != "")%public_name;%else;%first_name;%end; %if;(qualifier != "") %qualifier;%end; %sp;%surname; %end; %end; %include.css; %base_header; %( %) %let;birth_symbol;%if;(bvar.birth_symbol != "")%bvar.birth_symbol;%else;°%end;%in; %let;death_symbol;%if;(bvar.death_symbol != "")%bvar.death_symbol;%else;†%end;%in; %define;married_to(is_male, date_place) %if;("is_male" = 1) %if;are_married;[married%t to:::date_place]0%nn; %elseif;are_not_married;[relationship%t to:::date_place]0%nn; %elseif;are_engaged;[engaged%t to:::date_place]0%nn; %elseif;is_no_sexes_check;[relationship%t to:::date_place]0%nn; %elseif;is_no_mention;date_place [with]%nn; %end; %else; %if;are_married;[married%t to:::date_place]1%nn; %elseif;are_not_married;[relationship%t to:::date_place]1%nn; %elseif;are_engaged;[engaged%t to:::date_place]1%nn; %elseif;is_no_sexes_check;[relationship%t to:::date_place]1%nn; %elseif;is_no_mention;date_place [with]%nn; %end; %end; %if;are_divorced;… [divorced]%divorce_date;%nn; %elseif;are_separated;… [separated]%nn; %end; %end; %define;married(xx) %if;(evar.sd = "on") %apply;link_marriage("xx")%nn; %if;are_divorced;… [divorced]%divorce_date;%nn; %elseif;are_separated;… [separated]%nn; %end; %else; %apply;married_to%with %xx.is_male; %and; %if;(on_marriage_date != "") %on_marriage_date;%end; %if;(marriage_place != "") [in (place)] %marriage_place;%end; %end; %end; %end; %define;link1(xx,yy,fff) %nn; %if;(cancel_links or xx.is_restricted) %yy;%nn; %else; %yy;%nn; %end; %nn; %end; %define;link2(xx,yy) %if;(cancel_links or xx.is_restricted)%yy; %else; %yy; %end; %xx.title;%xx.dates; %if;(xx.sosa_in_list != "" and evar.only != "on" and level != 2) %sp;(⇒ %xx.sosa_in_list;%nn; .)%nn; %end; %end; %define;somebody_long_info(xx) %if;xx.has_qualifiers; %apply;lazy_print(", ") %foreach;xx.qualifier; %if;not is_first; %if;(lazy_printed)/%end; %lazy_force; %qualifier;%nn; %end; %end; %end; %if;xx.has_aliases; %apply;lazy_print(", ") %foreach;xx.alias; %if;(lazy_printed)/%end; %lazy_force; %alias;%nn; %end; %end; %if;(("xx" = "ancestor" or xx.sosa_in_list = "") and xx.has_nobility_titles) %foreach;xx.nobility_title;, %nobility_title;%end;%nn; %end; %if;(xx.has_linked_pages and xx.has_linked_page.HEAD), %xx.linked_page.HEAD;%end; %if;(xx.has_public_name or xx.has_qualifiers), (%xx.first_name; %xx.surname;)%end; %if;(evar.alias="on") %nn; %if;xx.has_first_names_aliases; %apply;lazy_print(", ") %foreach;xx.first_name_alias; %if;(lazy_printed)/%end; %lazy_force; %first_name_alias;%nn; %end; %end; %if;xx.has_surnames_aliases; %apply;lazy_print(", ") %foreach;xx.surname_alias; %if;(lazy_printed)/%end; %lazy_force; %surname_alias;%nn; %end; %end; %nn; %end; %if;(xx.computable_age), %xx.age;%end; %if;(evar.sd = "on") , %apply;link_dates("xx")%nn; %else; %if;(xx.has_birth_date or xx.has_birth_place) , %if;xx.is_male;[born]0%elseif;xx.is_female;[born]1%else;[born]2%end; %if;xx.has_birth_date; %xx.on_birth_date;%end; %if;xx.has_birth_place; [in (place)] %xx.birth_place;%end; %end; %if;(xx.has_baptism_date or xx.has_baptism_place) , %if;xx.is_male;[baptized]0%elseif;xx.is_female;[baptized]1%nn; %else;[baptized]2%end; %if;xx.has_baptism_date; %xx.on_baptism_date;%end; %if;xx.has_baptism_place; [in (place)] %xx.baptism_place;%end; %end; %if;xx.is_dead;, %xx.died; %if;(xx.has_death_date) %xx.on_death_date;%end; %if;(xx.has_death_place) [in (place)] %xx.death_place;%end; %end; %if;xx.is_buried;, %if;xx.is_male;[buried]0%else;[buried]1%end; %if;xx.has_burial_date; %xx.on_burial_date;%end; %if;xx.has_burial_place; [in (place)] %xx.burial_place;%end; %end; %if;xx.is_cremated;, %if;xx.is_male;[cremated]0%else;[cremated]1%end; %if;xx.has_cremation_date; %xx.on_cremation_date;%end; %if;xx.has_cremation_place; [in (place)] %xx.cremation_place;%end; %end; %end; %if;(xx.has_linked_pages and xx.has_linked_page.DEATH), %xx.linked_page.DEATH;%end; %if;(xx.computable_death_age) , [age at death:] %xx.death_age;%nn; %end; %end; %define;somebody_extra_info(xx) %if;xx.has_occupation;, %xx.occupation;%end; %if;(xx.has_linked_pages and xx.has_linked_page.OCCU), %xx.linked_page.OCCU;%end; %if;(evar.rel = "on" and xx.has_relations) %foreach;xx.relation;%nn;  ; %relation_type; : %if;has_relation_him; %apply;link2("relation_him","relation_him") %end; %if;has_relation_her; %if;has_relation_him;, %end; %apply;link2("relation_her","relation_her") %end; %end; %foreach;xx.related;%nn; %if;(related_type != [foster son/foster daughter/foster child]0 and related_type != [foster son/foster daughter/foster child]1 and related_type != [foster son/foster daughter/foster child]2)  ; %related_type; : %apply;link2("related","related") %end; %end; %end; %end; %define;somebody_spouse_parent() %if;(evar.parents = "on" and spouse.has_parents)    %nn; %apply;a_of_b%with; %if;(spouse.is_male)[son/daughter/child]0 %else;[son/daughter/child]1%end; %and; %apply;link2("spouse.father","spouse.father") [and] %apply;link2("spouse.mother","spouse.mother") %end; %end; %end; %define;link_dates(xx) %sp; %if;(wizard and not cancel_links) %nn; %apply;sure_dates("xx","birth","baptism","baptism","baptism",xx.has_linked_page.BIRTHA) %if;(xx.is_dead) %sp;%apply;sure_dates("xx","death","burial","cremated","cremation",xx.has_linked_page.DEATHA) %end; %nn; %else; %apply;sure_dates("xx","birth","baptism","baptism","baptism",xx.has_linked_page.BIRTHA)%sp; %if;(xx.is_dead) %apply;sure_dates("xx","death","burial","cremated","cremation",xx.has_linked_page.DEATHA) %end; %end; %end; %define;link_marriage(xx) %if;(wizard and not cancel_links) %nn; &%nn; %slash_marriage_date; %marriage_place; %else; &%nn; %slash_marriage_date; %marriage_place; %end; %end; %define;sure_dates(xx,dd1,dd2,dd3,dd4,zz) %if;(xx.dd1_date.year != "") %dd1_symbol;%xx.slash_dd1_date; %elseif;(xx.dd2_date.year != "") %dd1_symbol;%xx.slash_dd2_date; %elseif;(xx.dd3_date.year != "") %dd1_symbol;%xx.slash_dd3_date; %else; %dd1_symbol; %end; %if;(xx.dd1_place != "") %sp;%xx.dd1_place;%nn; %elseif;(xx.dd2_place != "") %sp;%xx.dd2_place;%nn; %elseif;(xx.dd4_place != "") %sp;%xx.dd4_place;%nn; %end; %end; %define;somebody_notes(xx,yy) %if;(evar.inline = "on") %incr_count; %if;(evar.notes = "on") %if;(xx.has_notes or xx.has_linked_page.BNOTE)
    %if;xx.has_linked_page.BNOTE;>> %xx.linked_page.BNOTE;%end; %if;xx.has_notes;%xx.notes;%end;
    %end; %end; %if;(evar.src = "on") %if;(xx.has_sources or xx.has_linked_page.BIBLIO)
    %if;xx.has_linked_page.BIBLIO;>> %xx.linked_page.BIBLIO;%end; %if;(xx.has_sources) %foreach;xx.source • %source_type; : %source;%sp; %end; %end;
    %end; %end; %elseif;((evar.notes = "on" and (xx.has_notes or xx.has_linked_page.BNOTE)) or (evar.src = "on" and (xx.has_sources or xx.has_linked_page.BIBLIO))) yy%nn; %end; %end; %define;inline_comment() %incr_count;
    %comment;
    %end; %define;init_count(prev_count) %reset_count; %for;i;0;prev_count; %incr_count; %end; %end; %define;link_comment(z1) %if;(has_comment and evar.notes = "on" and evar.inline != "on") z1%nn; %end; %end; %define;bcomment(z1,z2) %if;(has_comment and evar.notes = "on")
    z2. %z1; &%marriage_date.year; %spouse;
    %comment;
    %end; %end; %define;bnotes(z1,z2) %if;((evar.notes = "on" and (z1.has_notes or z1.has_linked_page.BNOTE)) or (evar.src = "on" and (z1.has_sources or z1.has_linked_page.BIBLIO)))
    z2. %z1;%z1.dates;
    %if;(evar.notes = "on" and (z1.has_notes or z1.has_linked_page.BNOTE)) %if;(z1.has_linked_page.BNOTE)
    >> %z1.linked_page.BNOTE;
    %end; %if;(z1.has_notes)
    %z1.notes;
    %end; %end; %if;(evar.src = "on" and (z1.has_sources or z1.has_linked_page.BIBLIO)) %if;(z1.has_linked_page.BIBLIO)
    >> %z1.linked_page.BIBLIO;
    %end; %if;(z1.has_sources) %foreach;z1.source;
    • %source_type; : %source;
    %end; %end; %end; %end; %end; %define;image(xx) %if;(evar.image="on" and xx.has_image) [image/images]0 %end; %end; %( %) %( %) %define;child_notes(fff) %if;(child.sosa_in_list != "" and evar.only != "on" and level != 2) %else; %apply;bnotes("child","fff") %if;(evar.spouse = "on") %foreach;child.family; %let;id_spouse;fffx%family_cnt%in; %let;id_fam;fff-%id_spouse;%in; %apply;bcomment("child",id_fam) %apply;bnotes("spouse",id_spouse) %end; %end; %end; %end; %define;sorted_notes() %if;(evar.notes = "on" or evar.src = "on")

    %if;(evar.notes = "on")[*note/notes]1 %if;(evar.src = "on")[and] [source/sources]1%end; %else;[*source/sources]1%end;

    %foreach;ancestor_level(l_v) %if;(level != 1 and (evar.only != "on" or level = l_v)) %foreach;ancestor; %if;(ancestor.same = "") %apply;bnotes("ancestor",ancestor.anc_sosa.v) %if;(ancestor.index != self.index) %if;(ancestor.is_male) %apply;other_family_notes("father") %foreach;ancestor.family; %if;(family.index = ancestor.family.index) %let;id_fam;%ancestor.anc_sosa.v;-%expr(ancestor.anc_sosa.v + 1)%in; %apply;bcomment("ancestor",id_fam) %end; %end; %else; %foreach;ancestor.family; %if;(family.index = ancestor.family.index) %foreach;child; %let;id_child;%ancestor.anc_sosa.v;%apply;letter(child_cnt)%in; %if;(evar.siblings = "on") %apply;child_notes(id_child) %elseif;(child.sosa_in_list != "") %apply;child_notes(id_child) %end; %end; %end; %end; %apply;other_family_notes("mother") %end; %end; %end; %end; %end; %end;
    %end; %end; %define;link_dates1(xx) %if;(wizard and not cancel_links) %nn; %apply;sure_dates("xx","birth","baptism","baptism","baptism",xx.has_linked_page.BIRTHA) %if;(xx.is_dead) %apply;sure_dates("xx","death","burial","cremated","cremation",xx.has_linked_page.DEATHA) %end; %nn; %else; %apply;sure_dates("xx","birth","baptism","baptism","baptism",xx.has_linked_page.BIRTHA) %if;(xx.is_dead) %apply;sure_dates("xx","death","burial","cremated","cremation",xx.has_linked_page.DEATHA) %end; %end; %end; %define;link_marriage1(xx) %if;(wizard and not cancel_links) %nn; &%nn; %if;(nb_children > 1)%nb_children;%end; %slash_marriage_date; %marriage_place; %else; &%nn; %slash_marriage_date; %marriage_place; &%nb_children; %end; %end; %define;symbol2(xx) %if;(xx.has_siblings) ♦%nn; %elseif;(xx.has_parents) ◊%nn; %else; -%nn; %end; %end; %define;symbol1(xx) %if;(xx.has_sosa) %apply;symbol2("xx")%nn; %else; %apply;symbol2("xx") %end; %end; %define;see_sosa(xx) %xx.title;%xx.dates; %sp;(⇒ %xx.sosa_in_list;%nn; .)%nn; %end; %define;link(aa, xx) %if;(cancel_links)xx%else;xx%end; %end; %define;tothegen(xx) [*to the %s generation:::xx]%nn; %end; %define;togen(xx) %if;(xx = 1)[*specify::generation/generations]0%nn; %elseif;(xx = 2)[*to the parents]%nn; %elseif;(xx = 3)[*to the grandparents]%nn; %elseif;(xx = 4)[*to the great-grandparents]%nn; %else; %apply;tothegen%with; %apply;nth([nth (generation)], xx) %end; %end; %end; %define;gen()

    %if;(evar.only != "on") %apply;togen(l_v) %else; [*generation/generations]0 %l_v; %end;

    %end; %define;letter(xx) %apply;nth%with; /a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z %and;xx%end; %end; %define;long_display_ancestor_personal(fff) %apply;link1("ancestor","ancestor","fff") %apply;somebody_long_info("ancestor") %apply;somebody_extra_info("ancestor") %apply;somebody_notes("ancestor",ancestor.anc_sosa.v) %end; %define;child_long_info(fff) %apply;link1("child","child_name","fff") %if;(child.sosa_in_list != "" and evar.only != "on" and level != 2) %apply;see_sosa("child") %else; %apply;image("child") %apply;somebody_long_info("child") %apply;somebody_extra_info("child") %apply;somebody_notes("child","fff") %if;(evar.spouse = "on") %foreach;child.family; %let;id_spouse;fffx%family_cnt%in; %let;id_fam;fff-%id_spouse;%in;
       %nn; %apply;married("child") %apply;link_comment(id_fam)    %nn; %apply;link1("spouse","spouse",id_spouse) %apply;somebody_long_info("spouse") %apply;somebody_extra_info("spouse") %apply;somebody_spouse_parent() %apply;somebody_notes("spouse",id_spouse)
    %end; %end; %end; %end; %define;marriage_info() %if;(evar.rel = "on" and has_witnesses)
       [witness/witnesses]1 : %foreach;witness; %if;(not is_first),%nl;%end; %apply;link2("witness","witness") %end;
    %end; %if;(has_comment and evar.notes = "on" and evar.inline = "on") %apply;inline_comment() %end; %end; %define;other_family(xx) %if;(evar.spouse = "on" and evar.siblings = "on" and ancestor.nb_families > 1)
    %foreach;ancestor.family; %if;(spouse.index != ancestor.spouse.index) %let;id_spouse;%ancestor.anc_sosa.v;x%family_cnt;%in; %let;id_fam;%ancestor.anc_sosa.v;-%id_spouse;%in; %let;txt;%ancestor; &%marriage_date.year; %spouse;%in;
    %apply;image("spouse")    %nn; %family.xx.sosa_in_list; -(X%family_cnt;) : %apply;married("ancestor") %apply;link_comment(id_fam)    %nn; %apply;link1("spouse","spouse",id_spouse) %apply;somebody_long_info("spouse") %apply;somebody_extra_info("spouse") %apply;somebody_spouse_parent() %apply;somebody_notes("spouse",id_spouse)
    %apply;marriage_info() %if;(nb_children > 0)
      %foreach;child; %let;id_child;%ancestor.anc_sosa.v;x%family_cnt;%apply;letter(child_cnt)%in;
    1. %apply;child_long_info(id_child)%nn;
    2. %end;
    %end; %end; %end;
    %end; %end; %define;other_family_notes(xx) %if;(evar.spouse = "on" and evar.siblings = "on" and ancestor.nb_families > 1) %foreach;ancestor.family; %if;(spouse.index != ancestor.spouse.index) %let;id_spouse;%ancestor.anc_sosa.v;x%family_cnt;%in; %let;id_fam;%ancestor.anc_sosa.v;-%id_spouse;%in; %apply;bcomment("ancestor",id_fam) %apply;bnotes("spouse",id_spouse) %if;(nb_children > 0) %foreach;child; %let;id_child;%ancestor.anc_sosa.v;x%family_cnt;%apply;letter(child_cnt)%in; %if;(child.sosa_in_list != "" and evar.only != "on") $$$ %else; %apply;bnotes("child",id_child) %end; %if;(evar.spouse = "on") %foreach;child.family; %let;id_spouse;%id_child;x%family_cnt%in; %let;id_fam;%id_child;-%id_spouse;%in; %apply;bcomment("child",id_fam) %apply;bnotes("spouse",id_spouse) %end; %end; %end; %end; %end; %end; %end; %end; %define;long_display_ancestor_families() %if;(ancestor.is_male) %apply;other_family("father")

       %nn; %foreach;ancestor.family; %if;(family.index = ancestor.family.index) %let;id_fam;%ancestor.anc_sosa.v;-%expr(ancestor.anc_sosa.v + 1)%in; %apply;married("ancestor") %if;(has_comment and evar.notes = "on" and evar.inline != "on") %apply;link_comment(id_fam) %end; %end; %end;

    %else; %foreach;ancestor.family; %if;(family.index = ancestor.family.index) %apply;marriage_info()
      %foreach;child; %let;id_child;%ancestor.anc_sosa.v;%apply;letter(child_cnt)%in; %if;(evar.siblings = "on")
    1. %apply;child_long_info(id_child)
    2. %elseif;(child.sosa_in_list != "")
    3. %apply;child_long_info(id_child)
    4. %end; %end;
    %end; %end; %apply;other_family("mother") %end; %end; %define;date_place(xx,yy) %if;(yy.has_xx_date) ;%yy.on_xx_date; ;%yy.xx_place; %else; ;;%nn; %end; %end; %define;link_parents() %ancestor.anc_sosa;%nn; %end; %define;link_rel(xx) %if;(cancel_links) ==xx %else; ==xx %end; %end; %define;nb_fam(xx) %if;(xx.same = "") %if;(not cancel_links) %end; %apply;symbol1("xx") %if;(xx.nb_families > 1) %xx.nb_families;&%xx.nb_children; %end; %if;(not cancel_links) %end; %else; %apply;link_rel%with; %xx.same; %end; %end; %end; %define;male_line(xx) %apply;link_parents() %apply;nb_fam("xx") %apply;image("xx")
    %apply;link(xx.access, xx)
    %apply;info3("xx") %apply;link_dates1("xx") %end; %define;female_line(xx) %apply;link_dates1("xx") %apply;image("xx")
    %apply;link(xx.access, xx)
    %apply;info3("xx") %apply;link_parents() %apply;nb_fam("xx") %end; %define;info3(xx) %if;(xx.has_nobility_titles) %xx.nobility_title; %end; %if;(xx.has_occupation) %xx.occupation; %end; %if;xx.computable_age; [age] : %xx.age; %end; %if;(xx.computable_death_age) %xx.death_age; %end; %if;(xx.has_consanguinity and (bvar.show_consang != "no" or manitou)) %xx.consanguinity; %end; %end; %define;sorted_list_birth(xx) %incr_count; %apply;add_in_sorted_list%with; %ancestor.xx_place;%and; %ancestor.xx_date.year;%and; %ancestor; s%ancestor.anc_sosa;%and; %birth_symbol;%ancestor.xx_date.prec;%and; %ancestor.on_xx_date;%and; %apply;a_of_b%with; %if;(ancestor.is_male)[*son/daughter/child]0 %elseif;(ancestor.is_female)[*son/daughter/child]1 %else;[*son/daughter/child]2 %end; %and; %if;(ancestor.has_parents) %ancestor.father; & %ancestor.mother; %end; %end; %and; %ancestor.access; %end; %end; %define;sorted_list_death(xx) %incr_count; %apply;add_in_sorted_list%with; %ancestor.xx_place;%and; %ancestor.xx_date.year;%and; %ancestor; s%ancestor.anc_sosa;%and; %if;(bvar.death_symbol != "")%bvar.death_symbol;%else;†%end;%ancestor.xx_date.prec;%and; %ancestor.on_xx_date;%and; & %ancestor.spouse;%and; %ancestor.access; %end; %end; %define;sorted_list_marriage() %incr_count; %apply;add_in_sorted_list%with; %marriage_place;%and; %marriage_date.year;%and; %ancestor; s%ancestor.anc_sosa;%and; &%marriage_date.prec;%and; %on_marriage_date;%and; & %spouse;%and; %ancestor.access; %end; %end; %define;M2b_b() %if;(not ancestor.has_linked_page.BIRTHA) %if;(ancestor.has_birth_date) %apply;sorted_list_birth("birth") %elseif;(ancestor.has_baptism_date) %apply;sorted_list_birth("baptism") %end; %end; %end; %define;M2m_m() %if;(ancestor.is_male and not ancestor.has_linked_page.MARRIAGEA) %foreach;ancestor.family %if;(marriage_date.year != "") %apply;sorted_list_marriage() %end; %end; %end; %end; %define;M2d_d() %if;(not ancestor.has_linked_page.DEATHA) %if;(ancestor.has_death_date) %apply;sorted_list_death("death") %elseif;(ancestor.has_burial_date) %apply;sorted_list_death("burial") %elseif;(ancestor.has_cremation_date) %apply;sorted_list_death("cremated") %end; %end; %end; %define;M3b_b() %if;(ancestor.birth_date.prec != "") %apply;sorted_list_birth("birth") %elseif;(ancestor.baptism_date.prec != "") %apply;sorted_list_birth("baptism") %elseif;(ancestor.on_birth_date = "" and ancestor.on_baptism_date = "") %if;(ancestor.has_birth_date) %apply;sorted_list_birth("birth") %elseif;(ancestor.has_baptism_date) %apply;sorted_list_birth("baptism") %else; %apply;sorted_list_birth("birth") %end; %end; %end; %define;M3m_m() %if;(ancestor.is_male) %foreach;ancestor.family %if;(marriage_date.prec != "" or on_marriage_date = "") %apply;sorted_list_marriage() %end; %end; %end; %end; %define;M3d_d() %if;(ancestor.is_dead) %if;(ancestor.death_date.prec != "") %apply;sorted_list_death("death") %elseif;(ancestor.burial_date.prec != "") %apply;sorted_list_death("burial") %elseif;(ancestor.on_death_date = "" and ancestor.burial_date.day = "") %if;(ancestor.has_death_date) %apply;sorted_list_death("death") %elseif;(ancestor.has_burial_date) %apply;sorted_list_death("burial") %else; %apply;sorted_list_death("death") %end; %end; %end; %end; %define;miss_b(xx,bb,mm,dd) %apply;xxb_bb() %end; %define;miss_m(xx,bb,mm,dd) %apply;xxm_mm() %end; %define;miss_d(xx,bb,mm,dd) %apply;xxd_dd() %end; %define;miss_bm(xx,bb,mm,dd) %apply;xxb_bb() %apply;xxm_mm() %end; %define;miss_bd(xx,bb,mm,dd) %apply;xxb_bb() %apply;xxd_dd() %end; %define;miss_md(xx,bb,mm,dd) %apply;xxm_mm() %apply;xxd_dd() %end; %define;miss_bmd(xx,bb,mm,dd) %apply;xxb_bb() %apply;xxm_mm() %apply;xxd_dd() %end; %define;miss1(xx,bb,mm,dd) %if;("bb" = "b" or "mm" = "m" or "dd" = "d") %apply;gen() %empty_sorted_list; %reset_count; %foreach;ancestor_level(l_v) %if;(level > 1 and (evar.only != "on" or level = l_v)) %foreach;ancestor; %if;(ancestor.same = "") %apply;miss_bbmmdd("xx","bb","mm","dd") %end; %end; %end; %end; %end; %end; %define;miss2() %if;(count > 100)

    %foreach;sorted_list_item; %if;(initial(prev_item.1) != initial(item.1)) %apply;initial(item.1) %end; %end;

    %end;
      %foreach;sorted_list_item;
    • %nn; %if;(count > 100 and initial(prev_item.1) != initial(item.1)) %apply;initial(item.1)
      • %nn; %end; %if;(prev_item.1 != item.1) %item.1; %if;(number_of_subitems > 1)%nl;
        • %nn; %else;%sp; %end; %end; %item.4;%item.2; - %item.3; - %item.5; - %item.6;
        • %if;(prev_item.1 = item.1 and number_of_subitems = 1 and item.1 != "")
      • %end; %if;(count > 100 and initial(item.1) != initial(next_item.1) and item.1 != "")
    • %end; %end;

    [*total] = %count;

    %end; %define;same() %if;(ancestor.same != "")
  • %ancestor.anc_sosa; - %ancestor; %ancestor.dates; == %ancestor.same;
  • %end; %end; %define;same_consang() %reset_count;

    [*display smallest sosa number relative to ancestor] + [*consanguinity]

    %apply;togen(l_v).

      %foreach;ancestor_level(l_v)
    • [*generation/generations]0 %level;
        %foreach;ancestor %if;(ancestor.same = "" and ancestor.has_consanguinity) %incr_count;
      • %ancestor.anc_sosa; - %ancestor; %ancestor.dates; : %ancestor.consanguinity;
      • %end; %apply;same() %end;
    • %end;

    [*total] = %evar.same; + %count; = %expr(evar.same + count)

    %end; %define;same_same() %reset_count;

    [*display smallest sosa number relative to ancestor]

    %apply;togen(l_v).

      %foreach;ancestor_level(l_v)
    • [*generation/generations]0 %level;
        %foreach;ancestor %apply;same() %end;
    • %end;

    [*total] = %evar.same;

    %end; %( %) %( Main %) %message_to_wizard;

    %nn; %apply;a_of_b%with; %if;(evar.t = "M" and evar.miss = "M1")[*missing ancestors]%else;[*ancestors]%end; %and; %if;(not cancel_links)%end; %if;(public_name != "")%public_name;%else;%first_name;%end; %if;(qualifier != "") %qualifier;%end; %sp;%surname; %if;(alias != "") (%alias;)%end; %if;(not cancel_links)%end; %end; %sp;%dates; %if;(evar.t = "M") %if;(evar.miss="M2") [*not found] : %if;(evar.M2b="b") -%bvar.var_t_BIRTHA;%end; %if;(evar.M2m="m") -%bvar.var_t_MARRIAGEA;%end; %if;(evar.M2d="d") -%bvar.var_t_DEATHA;%end; %elseif;(evar.miss="M3") [*date/dates]0 <> [exact] : %if;(evar.M3b="b") -[*birth]%end; %if;(evar.M3m="m") -[*marriage/marriages]0%end; %if;(evar.M3d="d") -[*death]%end; %end; %end; %if;(evar.t = "D") [up to] %pvar.1; %pvar.1.dates;%end;

    %if;not cancel_links; %end; %if;(evar.t = "N" and evar.same != "") %(short display smallest sosa number relative to ancestor %) %if;(bvar.show_consang != "no" or manitou) %apply;same_consang() %else; %apply;same_same() %end; %elseif;(evar.t = "Z") %( short display, table with occupation, death_age, consanguinity, dates, places %) %if;(evar.only != "on")

    %apply;togen(l_v).

    %end; %reset_count; %foreach;ancestor_level(l_v) %if;(level > 1 and (evar.only != "on" or level = l_v)) %foreach;ancestor %incr_count; %if;(ancestor.is_male) %apply;male_line("ancestor") %end; %if;(ancestor.is_female) %apply;female_line("ancestor") %end; %end; %end; %end;
    %nl;[*generation/generations]0 %level;%nl;
    %if;(ancestor.same = "") %foreach;ancestor.family; %if;(family.index = ancestor.family.index) %apply;link_marriage1("ancestor") %end; %end; %end;
    [*total] : %count; [[person/persons]1@(c)]
    %elseif;(evar.t = "M" and evar.miss = "M1" and evar.al = "on") %( missing ancestors alphabetically %) %apply;gen() %empty_sorted_list; %reset_count; %foreach;ancestor_level(l_v) %if;(level > 1 and (evar.only != "on" or level = l_v))%nn; %foreach;ancestor; %if;(ancestor.same = "") %if;(not ancestor.has_parents and ancestor.first_name != "?" and ancestor.surname != "?") %incr_count; %apply;add_in_sorted_list( ancestor.surname_end, ancestor.first_name, ancestor.surname_begin, "0", ancestor.nobility_title, ancestor.access, ancestor.dates, [parents], ancestor.family.marriage_date.year, ancestor.spouse, ancestor.spouse.dates, ancestor.spouse.nobility_title) %elseif;(evar.ms = "on" and ancestor.has_parents) %if;(ancestor.father.first_name = "?" and ancestor.father.surname = "?") %incr_count; %apply;add_in_sorted_list( ancestor.mother.surname_end, ancestor.mother.first_name, ancestor.mother.surname_begin, "1", ancestor.mother.nobility_title, ancestor.mother.access, ancestor.mother.dates, [husband/wife]0) %end; %if;(ancestor.mother.first_name = "?" and ancestor.mother.surname = "?") %incr_count; %apply;add_in_sorted_list( ancestor.father.surname_end, ancestor.father.first_name, ancestor.father.surname_begin, "1", ancestor.father.nobility_title, ancestor.father.access, ancestor.father.dates, [husband/wife]1) %end; %end; %end; %end; %end; %end; %if;(count > 100) %foreach;sorted_list_item; %if;(initial(prev_item.1) != initial(item.1)) %apply;initial(item.1) %end; %end; %end; %if;(evar.ms != "on")

    %apply;a_of_b([*parents], "…")

    %end;
      %foreach;sorted_list_item;
    • %nn; %if;(count > 100 and initial(prev_item.1) != initial(item.1)) %apply;initial(item.1)
      • %nn; %end; %if;(prev_item.1 != item.1) %item.1; %if;(number_of_subitems > 1)%nl;
        • %nn; %end; %end; %sp;%item.2;%item.3; %if;(item.5 != ""), %item.5;%end;%item.7; %if;(evar.ms != "on") %if;(item.10 != "? ?") %nl;&%nn; %if;(item.9 != "")%item.9;%end; %sp;%item.10;%item.11; %if;(item.12 != ""), %item.12;%end; %end; %else; => %item.8;%end;
        • %if;(prev_item.1 = item.1 and number_of_subitems = 1)
      • %end; %if;(count > 100 and initial(item.1) != initial(next_item.1))
    • %end; %end;

    [*total] = %count;

    %elseif;(evar.t = "M" and evar.miss = "M1") %( missing ancestors in ancestors order %) %if;(evar.only != "on")

    %apply;togen(l_v)

    %end; %if;(evar.ms != "on")

    %apply;a_of_b([*parents], "…")

    %end;
      %reset_count; %foreach;ancestor_level(l_v) %if;(level > 1 and (evar.only != "on" or level = l_v))%nn; %apply;lazy_print%with;
    • %nl;[*generation/generations]0 %level;%nl;
        %nl; %end; %foreach;ancestor; %if;(ancestor.same = "") %if;(not ancestor.has_parents and ancestor.first_name != "?" and ancestor.surname != "?") %incr_count; %lazy_force;
      • %ancestor.anc_sosa.v; - %if;(evar.ms != "on") %apply;link(ancestor.access, ancestor) %else; %apply;a_of_b%with;[parents]%and; %apply;link(ancestor.access, ancestor) %end; %end; %ancestor.title; %ancestor.dates;
      • %nl; %elseif;(evar.ms = "on") %if;(ancestor.first_name = "?" or ancestor.surname = "?") %incr_count; %lazy_force;
      • %ancestor.anc_sosa.v; - %apply;link(ancestor.access,"??")
      • %nl; %end; %end; %end; %end; %if;lazy_printed;
      %nl;
    • %nl;%end; %end; %end;

    [*total] = %count;

    %elseif;(bvar.var_img_ext != "" and evar.t = "M" and evar.miss="M2") %( missing BIRTHA MARRIAGEA DEATHA %) %apply;miss1(evar.miss,evar.M2b,evar.M2m,evar.M2d) %apply;miss2() %elseif;(evar.t = "M" and evar.miss="M3") %( date != exact %) %apply;miss1(evar.miss,evar.M3b,evar.M3m,evar.M3d) %apply;miss2() %elseif;(evar.t = "G") %( long display %) %if;(evar.only != "on")

    %apply;togen(l_v).

    %end; %foreach;ancestor_level(l_v) %if;(level != 1 and (evar.only != "on" or level = l_v))

    [*generation/generations]0 %level;

    %foreach;ancestor; %if;(ancestor.same = "")
    %apply;image("ancestor") %apply;link_parents() %nn;.%sp; %apply;long_display_ancestor_personal(ancestor.anc_sosa.v)
    %if;(ancestor.index != self.index) %apply;long_display_ancestor_families() %end; %else;

    %ancestor.anc_sosa;. %if;(not cancel_links) %ancestor; %ancestor.title;%ancestor.dates; (== %ancestor.same;.) %else; %ancestor; %ancestor.title;%ancestor.dates; (== %ancestor.same;.) %end;

    %end; %end; %end; %end; %if;(evar.inline != "on")%apply;sorted_notes()%end; %elseif;(evar.t = "D") %( ancestors up to somebody %) %pvar.1.mark_descendants; %foreach;ancestor_level; %apply;lazy_print%with; %end; %if;(level <= evar.l + 1) %foreach;ancestor; %if;(level != 1 and ancestor.same = "" and (ancestor.is_descendant or ancestor.spouse.is_descendant)) %lazy_force; %if;(ancestor.is_male) %end; %if;(ancestor.is_female) %end; %end; %end; %end; %end;
    %nl;[*generation/generations]0 %level;%nl;
    %apply;link_parents() %apply;nb_fam("ancestor") %apply;image("ancestor")
    %apply;link(ancestor.access, ancestor)
    %apply;info3("ancestor")
    %apply;link_dates1("ancestor") %foreach;ancestor.family; %if;(family.index = ancestor.family.index) %apply;link_marriage1("ancestor") %end; %end; %apply;link_dates1("ancestor") %apply;image("ancestor")
    %apply;link(ancestor.access, ancestor)
    %apply;info3("ancestor")
    %apply;link_parents() %apply;nb_fam("ancestor")
    %end; %base_trailer; %copyright; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templm/desmenu.txt0000660000175200017530000001667312664543647025303 0ustar guillaumeguillaume%doctype; %nn; %apply;a_of_b_gr_eq_lev%with; [*descendants]%nn; %and; %if;(public_name != "")%public_name;%else;%first_name;%end; %if;(qualifier != "") %qualifier;%end; %sp;%surname; %end; %include.css; %base_header; %define;tothegen(xx) [*to the %s generation:::xx]%nn; %end; %define;navsosa(xx) [*navigation with %t as Sosa reference:::xx]. %end; %message_to_wizard;

    %nn; %apply;a_of_b_gr_eq_lev%with; [*descendants]%nn; %and; %if;(public_name != "")%public_name;%else;%first_name;%end; %if;(qualifier != "") %qualifier;%end; %sp;%surname; %if;(alias != "") (%alias;)%end; %end;

    %if;not cancel_links; %end; %let;l_on;onclick="this.focus()" onkeydown="if (event.keyCode == 13) javascript:document.desmenu.submit();"%in;

    %hidden; %if;access_by_key; %if;(occ != "0") %end; %else %end;

    %let;l_mdl0; %if;(bvar.max_desc_level = "" and max_desc_level > 12) 12%nn; %elseif;(bvar.max_desc_level != "" and max_desc_level > bvar.max_desc_level) %bvar.max_desc_level;%nn; %else; 99%nn; %end; %in; %let;l_mdl1;%if;(l_mdl0 != 99)([maximum] %l_mdl0; [generation/generations]1)%end;%in;
    %let;l_on1;onchange="valid('tL')"%in;
    %let;l_on1;onchange="valid('tT')"%in; %for;i;1;7; %end;
    [color] 
    %let;l_on1;onchange="valid('tL')"%in; [*statistics]
    %base_trailer; %copyright; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templm/updfam.txt0000660000175200017530000007232312664543647025111 0ustar guillaumeguillaume%let;birth_symbol;%if;(bvar.birth_symbol != "")%bvar.birth_symbol;%else;°%end;%in; %let;death_symbol;%if;(bvar.death_symbol != "")%bvar.death_symbol;%else;†%end;%in; %let;l_on;onclick="this.focus()" onkeydown="if (event.keyCode == 13) javascript:document.upd.submit();"%in; %let;l_on1;onclick="this.focus()"%in; %doctype; %nn; %if;(evar_m = "ADD_FAM" or evar_m = "ADD_FAM_OK") [*add::family/families]0%nn; %elseif;(evar_m = "ADD_PAR")[*add::family/families]0%nn; %elseif;(evar_m = "MOD_FAM" or evar_m = "MOD_FAM_OK") [*modify::family/families]0 # %evar_i; %elseif;(evar_m = "MRG_DUP_FAM_Y_N" or evar_m = "MRG_FAM" or evar_m = "MRG_FAM_OK" or evar_m = "MRG_MOD_FAM_OK") [*merge::family/families]1 # %evar_i; %end; %include.css; %base_header; %(%) %define;sure_date(xvar) class="%if;(xvar.prec = "sure")sure%else;not_sure%end;"%nn; %end; %define;date(xlab,xvar,xdate) %if;([ !dates order]0 = "ddmmyyyy") %elseif;([ !dates order]0 = "mmddyyyy") %nn; %else; %end; %end; %define;source(xvar, xx) %end; %(%) %( %) %define;search_focus(xcnt) %if;(evar_ins_witnxcnt = "on") onload="javascript:document.upd.witn%expr(xcnt+1)_fn.focus();window.scrollBy(0,60);"%nn; %elseif;(evar_inv_chxcnt = "on") onload="javascript:document.upd.ins_ch0_n.focus();window.scrollBy(0,60);"%nn; %elseif;(xcnt < 10) %apply;search_focus(xcnt + 1) %end; %end; %define;load_focus() %if;(evar_m = "ADD_FAM_OK" or evar_m = "MOD_FAM_OK" or evar_m = "MRG_MOD_FAM_OK") %if;(evar_ins_ch0 = "on" or evar_ins_ch0_n > 1 and evar_ins_ch0_n < 10) onload="javascript:document.upd.ins_ch0_n.focus();window.scrollBy(0,60);"%nn; %else; %apply;search_focus(0) %end; %elseif;(evar_m = "ADD_FAM" or evar_m = "ADD_PAR") %if;(father.first_name = "") onload="javascript:document.upd.pa1_fn.focus();"%nn; %else; onload="javascript:document.upd.pa2_fn.focus();"%nn; %end; %elseif;(evar_ins_ch != "") %if;(evar_ins_ch > 1 and evar.ins_ch < 10) onload="javascript:document.upd.submit();"%nn; %end; %elseif;(marriage.prec != "sure") %if;([ !dates order]0 = "ddmmyyyy") onload="javascript:document.upd.marr_dd.focus();"%nn; %elseif;([ !dates order]0 = "mmddyyyy") onload="javascript:document.upd.marr_mm.focus();"%nn; %else; onload="javascript:document.upd.marr_yyyy.focus();"%nn; %end; %else; onload="javascript:document.upd.ins_ch0_n.focus();"%nn; %end; %end; %define;accesskey(xvar) %if;("xvar"="marr") title="[marriage/marriages]0 (2)" accesskey="2"%nn; %end; %end; %define;place(xvar,xx) %end; %define;small_date(kind,xvar,xx,zz) %if;([ !dates order]0 = "ddmmyyyy") %elseif;([ !dates order]0 = "mmddyyyy") %else; %end; %end; %define;birth(xvar,xx,beg,zz) %apply;small_date("birth","xvarb","xx","xvard_yyyy") %end; %define;death(xvar,xx,beg,zz) %apply;small_date("death","xvard","xx","begzz_fn") %end; %define;type_sex(beg,xcnt,xx) %end; %define;insert_parent(xcnt) %end; %define;insert_witness(xcnt) %end; %define;invert_children(xcnt) %end; %define;hide(xx) %if;("xx"="link") class="hide"%nn; %end; %end; %define;person(beg,xcnt,xx,c1,c2) %let;zz; %expr(xcnt + 1) %in; %nn; %if;("c1" = "yes") %apply;type_sex("beg","xcnt","xx") %end; %if;("c2" = "yes") %birth_symbol;%nn; %apply;birth("begxcnt","xx","","") %death_symbol;%nn; %apply;death("begxcnt","xx","beg",zz) %end; %end; %define;table_th(xx) %if;("xx" = "witness") %apply;insert_witness("0") %elseif;("xx" = "child") %else;   %end; %if;("xx" = "child")   %end; ↴ + [first name/first names]0 [surname/surnames]0 # %if;("xx" != "parent") [M/F]0 ? [M/F]1 %end; %if;("xx" != "witness") [date/dates]0 [place] [occupation/occupations]0 %else;   %end; %end; %( %) %message_to_wizard;

    %hidden; %if;(evar_ip != "")%nl;%end; %if;(evar_i != "")%nl;%end; %if;(evar_m = "ADD_FAM" or evar_m = "ADD_FAM_OK") %nl; %elseif;(evar_m = "ADD_PAR") %nl; %elseif;(evar_m = "MOD_FAM" or evar_m = "MOD_FAM_OK") %nl; %elseif;(evar_m = "MRG_DUP_FAM_Y_N" or evar_m = "MRG_FAM" or evar_m = "MRG_FAM_OK" or evar_m = "MRG_MOD_FAM_OK") %if;(evar_ini1 != "" and evar_ini2 != "") %end; %if;(evar.iexcl != "") %end; %if;(evar.fexcl != "") %end; %nl; %end;

    (1) %if;(evar_m = "ADD_FAM" or evar_m = "ADD_FAM_OK") [*add::family/families]0 %elseif;(evar_m = "ADD_PAR") [*add::family/families]0 %elseif;(evar_m = "MOD_FAM" or evar_m = "MOD_FAM_OK") [*modify::family/families]0 # %evar_i; %elseif;(evar_m = "MRG_DUP_FAM_Y_N" or evar_m = "MRG_FAM" or evar_m = "MRG_FAM_OK" or evar_m = "MRG_MOD_FAM_OK") [*merge::family/families]1 # %evar_i; %end;   %apply;table_th("parent") %foreach;parent; %apply;person("pa",cnt,"parent","no","yes") %end;
    %parent.himher;
    [*source/sources]1
    %if;(bvar.origin_file = "on")
    %end;
    (2) [*marriage/marriages]0

    %apply;date([*date/dates]0, "marr", "marriage") %apply;place("marr", "marriage") %apply;source("marr", "marriage")

    (3) [*witness/witnesses]1 %apply;table_th("witness") %foreach;witness; %apply;person("witn",cnt,"witness","yes","no") %end;
    %cnt;. %apply;insert_witness(cnt)
    (4) [*child/children]1 %apply;table_th("child") %foreach;child; %apply;person("ch",cnt,"child","yes","yes") %end;
    %cnt;. %if;(cnt != 1) %apply;invert_children(cnt) %end;
    %base_trailer; %copyright; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templm/upd.js0000660000175200017530000001305012664543647024212 0ustar guillaumeguillaume/* upd.js mickroue(a)yahoo.fr 20130211 templ=templm */ function addRow(event,id) { var key = event.keyCode ? event.keyCode : event.which ? event.which : event.charCode; if (key == 49 || key == 13) { document.getElementById(id).checked = true; document.upd.submit() } } function changeDisplay(id,c,cond1,cond2) { var d = document.getElementById(id); var val = c.options[c.selectedIndex].value; if (val == cond1 || val == cond2) {d.style.display='inline';} else {d.style.display='none';} } function changeFocus(event,id) { var key = event.keyCode ? event.keyCode : event.which ? event.which : event.charCode; var charKey = String.fromCharCode(key); if (charKey == "*" || charKey == "_") { document.getElementById(id).focus(); return false; } } function changeFocusDeath(event) { var d1 = document.getElementById('content_death'); var d2 = document.getElementById('content_burial'); var d3 = document.getElementById('content_death_reason'); var id = document.getElementById('death'); var key = event.keyCode ? event.keyCode : event.which ? event.which : event.charCode; var charKey = String.fromCharCode(key); if (charKey == "*" || charKey == "+" || charKey == "_") { id.value = "Death"; d1.style.display='inline'; d2.style.display='inline'; d3.style.display='inline'; document.getElementById('death_d1').focus(); return false; } } function changeFocusFn(event,id,id1,id2) { var key = event.keyCode ? event.keyCode : event.which ? event.which : event.charCode; var charKey = String.fromCharCode(key); if (charKey == "*" || charKey == "_") { if (document.getElementById(id).checked == true) { document.getElementById(id2).focus(); return false; } else { document.getElementById(id1).focus(); return false; } } } function compute(id,prec) { var x = document.getElementById(id); var y = document.getElementById(prec); if (x.value != '' && x.value != eval(x.value)) { x.value = eval(x.value); y.value = 'about' } } function computeSD(id) { var x = document.getElementById(id); if (x.value != '' && x.value != eval(x.value)) { x.value = '/' + eval(x.value) + '/'; } } function female(id) { document.getElementById(id).className='background_sex_1'; } function fillPlaceFam(xx) { switch(xx.value) { case "1": xx.value = document.upd.pa1b_pl.value; break; case "2": xx.value = document.upd.pa1d_pl.value; break; case "3": xx.value = document.upd.pa2b_pl.value; break; case "4": xx.value = document.upd.pa2d_pl.value; break; case "*": xx.value = document.upd.marr_place.value; break; case "0": xx.value = document.upd.ch1b_pl.value; break; case "+": xx.value = document.upd.ch1d_pl.value; break; } } function fillPlaceInd(xx) { switch(xx.value) { case "2": xx.value = document.upd.birth_place.value;break; case "3": xx.value = document.upd.bapt_place.value;break; case "4": xx.value = document.upd.death_place.value;break; case "5": xx.value = document.upd.burial_place.value;break; } } function linkCreateVisible(xx,yy,zz) { if(xx == 'pa') { document.getElementById('pa' + yy + '_6').style.visibility=zz; } if(xx == 'witn') { document.getElementById('witn' + yy + '_5').style.visibility=zz; } if(xx == 'ch') { document.getElementById('ch' + yy + '_5').style.visibility=zz; document.getElementById('ch' + yy + '_6').style.visibility=zz; } } function male(id) { document.getElementById(id).className='background_sex_0'; } function no_sex(id) { document.getElementById(id).className='background_sex_2'; } function orYear(event,id1,id2,id3) { var key = event.keyCode ? event.keyCode : event.which ? event.which : event.charCode; var charKey = String.fromCharCode(key); var x1 = document.getElementById(id1); var x2 = document.getElementById(id2); var x3 = document.getElementById(id3); if (charKey == "." || charKey == ":") { x1.value = 'yearint'; x2.style.display='inline'; x3.focus(); return false; } if (charKey == ";") { x1.value = 'oryear'; x2.style.display='inline'; x3.focus(); return false; } } function setDead(c) { var doc = document.upd; var d1 = document.getElementById('content_death'); var d2 = document.getElementById('content_burial'); var d3 = document.getElementById('content_death_reason'); var val = c.options[c.selectedIndex].value; if (val == 'Auto' || val == 'NotDead' || val == 'DontKnowIfDead' || val == 'OfCourseDead') { d1.style.display='none'; d2.style.display='none'; d3.style.display='none'; doc.burial.value = "UnknownBurial"; doc.burial_dd.value = ""; doc.burial_mm.value = ""; doc.burial_yyyy.value = ""; doc.burial_prec.value = "-"; doc.burial_oryear.value = ""; doc.burial_text.value = ""; doc.burial_place.value = ""; doc.burial_src.value = ""; } else { d1.style.display='inline'; d2.style.display='inline'; d3.style.display='inline'; } }geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templm/ancmenu.txt0000660000175200017530000002502612664543647025261 0ustar guillaumeguillaume%doctype; %nn; %apply;a_of_b%with; [*ancestors]%nn; %and; %if;(public_name != "")%public_name;%else;%first_name;%end; %if;(qualifier != "") %qualifier;%end; %sp;%surname; %end; %include.css; %base_header; %let;l_maxtgen; %if;(bvar.max_anc_tree != "" and max_anc_level > bvar.max_anc_tree) ([maximum] %bvar.max_anc_tree; [generation/generations]1)%nn; %end; %in; %define;tothegen(xx) [*to the %s generation:::xx]%nn; %end; %define;navsosa(xx) [*navigation with %t as Sosa reference:::xx]. %end; %message_to_wizard;

    %nn; %apply;a_of_b%with; [*ancestors]%nn; %and; %if;(public_name != "")%public_name;%else;%first_name;%end; %if;(qualifier != "") %qualifier;%end; %sp;%surname; %if;(alias != "") (%alias;)%end; %end;

    %let;l_on;onclick="this.focus()" onkeydown="if (event.keyCode == 13) javascript:document.ancmenu.submit();"%in;

    %hidden; %if;access_by_key; %if;(occ != "0") %end; %else %end;

    %let;l_mal0; %if;(bvar.max_anc_level = "" and max_anc_level > 12) 12%nn; %elseif;(bvar.max_anc_level != "" and max_anc_level > bvar.max_anc_level) %bvar.max_anc_level;%nn; %else; 99%nn; %end; %in; %let;l_mal1;%if;(l_mal0 != 99)([maximum] %l_mal0; [generation/generations]1)%end;%in;
    %let;l_on1;onchange="valid('tT')"%in; %for;i;1;7; %end;
    [color] 
    %let;l_on1;onchange="valid('tF')"%in;
    [*statistics]
    %if;(wizard)
    %end;
    %let;l_on1;onchange="valid('tG')"%in;
    %let;l_on1;onchange="valid('tM');valid('tM1')"%in;
    %if;(bvar.var_img_ext != "")
    %let;l_on1;onchange="valid('tM');valid('tM2')"%in;
    %end;
    %let;l_on1;onchange="valid('tM');valid('tM3')"%in;
    %base_trailer; %copyright; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/dag.txt0000660000175200017530000001223112664543647023062 0ustar guillaumeguillaume%doctype; %nn; %if;(evar.slices = "on") [*display by slices/slice width/overlap/total width]0%nn; %else;%head_title;%end; %include.css; %base_header; %message_to_wizard; %if;not cancel_links;
    %if;(referer != "") << %end;

    %end; %if;(evar.slices = "on")

    %nn; [*display by slices/slice width/overlap/total width]0%nn;

    %hidden; %foreach;env_binding; %if;(env.key != "slices") %end; %end;

    %else; %if;(evar.notab != "on") %end; %if;(link_next != "")

    >> [*next relationship path]%nl;

    %end; %if;(evar.notab = "on" or evar.pos2 != "") %let;dpos;%if;(evar.dpos != "")%evar.dpos;%else;78%end;%in; %let;pos1;%if;(evar.pos1 != "")%evar.pos1;%else;0%end;%in; %let;pos2;%if;(evar.pos2 != "")%evar.pos2;%else;%dpos;%end;%in; %let;overlap;%if;(evar.overlap != "")%evar.overlap;%else;10%end;%in; %if;(pos1 != 0 or pos2 < dag.ncol)
    %if;(pos1 = 0) %nn; %else; <<%nn; %end;%nl %if;(pos2 >= dag.ncol) %nn; %else; >>%nn; %end;%nl;
    %end;
        %foreach;dag_line;
          %foreach;dag_line_pre;
            %foreach;dag_cell_pre;
              %dag_cell_pre;%nn;
            %end;%nl;
          %end;
        %end;
        
    %else;
    %foreach;dag_line; %foreach;dag_cell; %end; %end;
    %nn; %if;dag_cell.is_nothing; %nn; %elseif;dag_cell.is_bar; %if;(dag_cell.bar_link != "" and evar.cgl != "on") |%nn; %else;|%end; %elseif;(dag_cell.item != "")%dag_cell.item; %elseif;(dag_cell.text != "")%dag_cell.text; %else; %if;dag_cell.is_hr_left;
    %nn; %elseif;dag_cell.is_hr_right;
    %nn; %else;
    %nn; %end; %end;
    %end; %end; %base_trailer; %copyright; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/accent.txt0000660000175200017530000001433312664543647023571 0ustar guillaumeguillaume à á  â À à Æ æ Ã… Ã¥ Ä ä Ä„ Ä…   Ć ć Ç ç   à ð   É é Ê ê È è Ë ë Ę Ä™   à í ÃŽ î ÃŒ ì à ï   Å Å‚   Ń Å„ Ñ ñ
    Ó ó Ô ô Ã’ ò Å’ Å“ Ø ø Õ õ Ö ö   Åš Å› Å¿ ß Þ þ   Ú ú Ù ù Û û Ü ü   à ý Ÿ ÿ   Ź ź Å» ż
    ½ ¼ ¾   º ¹ ² ³ ° ª   ¡ ¿ µ • · – — ÷ ‰ € £ © ® « » ¶   ‡ â„– × † geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/toolbar.txt0000660000175200017530000000614612664543647024001 0ustar guillaumeguillaume Texte gras Texte italique Liste a puces Lien_interne/Nom du lien Titre de rubrique Ligne horizontale geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/updmenu.txt0000660000175200017530000001616312664543647024014 0ustar guillaumeguillaume%doctype; [*update] %include.favicon; %include.js; %include.css; %base_header; %message_to_wizard; %import;perso_utils %include.perso_header;

    %nn; [*update]: %first_name; .%if;(first_name = "?" or surname = "?")%index;%else;%occ;%end; %surname;

    %(

    [*update family]

    %if;(has_families and nb_families > 1)

    [*select a spouse]

    %end; %if;((first_name = "?" or surname = "?") and (nb_families != 0 or has_parents)) %elseif;(not is_male and not is_female) [*add mariage(s)] ([M/F]0) [*add mariage(s)] ([M/F]1) %else; [*add mariage(s)] %end;
    %foreach;family;
    %apply;marriage_with_txt%with;%spouse;%end;

    %apply;married_to%with;%self.sex;%and; %if;(marriage_place = "") %if;(on_marriage_date = "") %else;%on_marriage_date; %end; %else; %if;(on_marriage_date = "")%marriage_place; %else;%on_marriage_date;, %marriage_place %end; %end; %end;

    %if;has_children;

    [*child/children]1 :

      %foreach;child;
    • %apply;image_MF("child","13") %apply;short_display_person("child")
    • %end;
    %end;
    %if;(has_families and nb_families > 1)
    [*display this marriage in this order]
    %hidden; %let;curr_fam_cnt;%family_cnt;%in;

    %end;
    %end;
    %)
    [*family/families]1
    %foreach;family; %if;(family_cnt != 1) [*invert] %if;(family.father.index = prev_family.father.index and family.mother.index = prev_family.mother.index) %nn; [*merge::] %end; %end; %nn; [*modify::family/families]0%if;(nb_families = 1) %end; [with] %spouse.first_name;.%spouse.occ; %spouse.surname; %nn; [*delete::family/families]0 [with] %spouse.first_name;.%spouse.occ; %spouse.surname; %end; %if;((first_name = "?" or surname = "?") and (nb_families != 0 or has_parents)) %elseif;(not is_male and not is_female) %nn; [*add::marriage/marriages]0 ([M/F]0) %nn; [*add::marriage/marriages]0 ([M/F]1) %else; %nn; [*add::marriage/marriages]0 %end; %if;(nb_children != 0) [*change children's names] %end; %if;has_possible_duplications; %sq; [*merge::possible duplications] %end;
    %define;hint(xx) [*to add a child to a family, use "%s":::xx] %end; %if;(nb_families != 0)

    %apply;hint([*modify::family/families]0)

    %end; %base_trailer; %copyright; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/js.txt0000660000175200017530000000010312664543647022736 0ustar guillaumeguillaume geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templx/0002770000175200017530000000000012664543647023101 5ustar guillaumeguillaumegeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templx/sources.txt0000660000175200017530000000056212664543647025327 0ustar guillaumeguillaume%( Template sources v 6.05d 2012/06/02 12:00:00 ddr/dd %) %if;(has_sources or has_linked_page.BIBLIO) %if;has_sources;

    [*source/sources]1: %foreach;source; - %source_type;: %source; %end;

    %end; %if;has_linked_page.BIBLIO;

    %apply;capitalize(linked_page.BIBLIO).

    %end; %end;geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templx/linked_pages.txt0000660000175200017530000000040312664543647026263 0ustar guillaumeguillaume%( Template linked_page v 6.05d 2012/06/02 12:00:00 ddr/dd %) %if;(not cancel_links and has_linked_pages)
    ([linked pages])
    %end;geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templx/anclist.txt0000660000175200017530000004314212664543647025302 0ustar guillaumeguillaume%doctype; %nn; %if;(evar.t = "E") %if;(public_name != "")%public_name;%else;%first_name;%end; %if;(qualifier != "") %qualifier;%end; %sp;%surname; %if;(alias != "") (%alias;)%end; - [*list eclair] - %elseif;(evar.t = "F") %if;(public_name != "")%public_name;%else;%first_name;%end; %if;(qualifier != "") %qualifier;%end; %sp;%surname; %if;(alias != "") (%alias;)%end; - [*surnames branch] - %else; %apply;a_of_b%with;[*ancestors]%and; %if;(public_name != "")%public_name;%else;%first_name;%end; %if;(qualifier != "") %qualifier;%end; %sp;%surname; %if;(alias != "") (%alias;)%end; %end; %if;(evar.t = "D") [up to] %pvar.1;%end; %end; %include.css; %base_header; %define;image_sosa(xxx,yyy) %nn; %end; %define;display_sosa(xx) %if;(bvar.display_sosa="" or bvar.display_sosa="yes") %if;xx.has_sosa; %if;not cancel_links;%end; %apply;image_sosa%with;%sosa_ref.first_name_key_strip;%sp; %sosa_ref.surname_key_strip; %and;%xx.sosa;%end; %if;not cancel_links;%end;%sp; %end; %end; %end; %define;image_MF(xx,wi_he) %if;(wizard and not cancel_links and not xx.is_restricted) %end; %if;xx.is_male; %nn; %if;(wizard and not cancel_links and not xx.is_restricted)%end; %sp; %end; %define;display_arrows() %if;not cancel_links;
    %if;has_referer; %end;
    %end; %end; %define;short_display_person(xx) %apply;display_sosa("xx") %if;(cancel_links or xx.is_restricted)%xx; %else;%xx;%end;%sp; %xx.title;%xx.dates;%if;xx.birthday; ([happy birthday to you!])%end; %end; %define;tothegen(xx) [*to the %s generation:::xx]%nn; %end; %define;togena(xx) %if;(xx = 1)[*specify::generation/generations]0%nn; %elseif;(xx = 2)[*to the parents]%nn; %elseif;(xx = 3)[*to the grandparents]%nn; %elseif;(xx = 4)[*to the great-grandparents]%nn; %else; %apply;tothegen%with; %apply;nth([nth (generation)], xx) %end; %end; %end; %define;list_eclair_by_date_or_events() %( list eclair sorted by date begin or number of individuals or number of events %) %empty_sorted_list; %foreach;ancestor_surname(nb_gena) %apply;add_in_sorted_list%with; %if;(evar.sort = "ind") %expr(9999999 - ancestor.nb_ind) %elseif;(evar.sort = "evt") %expr(9999999 - ancestor.nb_events) %else; %ancestor.date_begin.year; %end; %and;%ancestor.surname_end; %and;%ancestor.surname_begin; %and;%ancestor.place; %and;%ancestor.date_begin.prec; %and;%ancestor.date_begin.year; %and;%ancestor.date_end.prec; %and;%ancestor.date_end.year; %and;%ancestor.nb_ind; %and;%ancestor.nb_events; %end; %end; %if;not cancel_links;
    %end; %foreach;sorted_list_item; %nl; %end;
    [*surname/surnames]0 [*place] [*date begin] [*date end] [*nb individuals] [*nb events]
    %item.2;%item.3 %item.4; %nn; %if;(item.5 = "<") /%item.6; %elseif(item.5 = ">") %item.6;/%nn; %elseif;(item.5 = "|" or item.5 = "..") %item.6; %else; %item.5;%item.6; %end; %nn; %if;(item.7 = "<") /%item.8; %elseif(item.7 = ">") %item.8;/%nn; %elseif;(item.7 = "|" or item.7 = "..") %item.8; %else; %item.7;%item.8; %end; %item.9; %item.10;
    %empty_sorted_list; %end; %define;list_eclair() %( list eclair by alphabetic order %) %if;not cancel_links; %end; %foreach;ancestor_surname(nb_gena) %nl; %end;
    [*surname/surnames]0 [*place] [*date begin] [*date end] [*nb individuals] [*nb events]
    %ancestor.surname_end;%ancestor.surname_begin; %ancestor.place; %nn; %if;(ancestor.date_begin.prec = "<") /%ancestor.date_begin.year; %elseif;(ancestor.date_begin.prec = ">") %ancestor.date_begin.year;/%nn; %elseif;(ancestor.date_begin.prec = "|" or ancestor.date_begin.prec = "..") %ancestor.date_begin.year; %else; %ancestor.date_begin.prec;%ancestor.date_begin.year;%nn; %end; %nn; %if;(ancestor.date_end.prec = "<") /%ancestor.date_end.year; %elseif;(ancestor.date_end.prec = ">") %ancestor.date_end.year;/%nn; %elseif;(ancestor.date_end.prec = "|" or ancestor.date_end.prec = "..") %ancestor.date_end.year; %else; %ancestor.date_end.prec;%ancestor.date_end.year;%nn; %end; %ancestor.nb_ind; %ancestor.nb_events;
    %end; %define;surname_branch_by_number_of_branches() %( surnames branch sorted in descending order of number of branches %) %empty_sorted_list; %reset_count; %foreach;ancestor_surname(nb_gena) %incr_count; %apply;add_in_sorted_list%with %expr(9999999 - ancestor.nb_times) %and;%ancestor.surname_end; %and;%ancestor.surname_begin; %and;%ancestor.sosa_access; %and;%ancestor.place; %and;%ancestor.date_begin.prec; %and;%ancestor.date_begin.year; %and;%ancestor.date_end.prec; %and;%ancestor.date_end.year; %and;%ancestor.nb_times; %end; %end; %if;not cancel_links; %if;(count > 100)

    [*number of branches] : %foreach;sorted_list_item; %if;(prev_item.1 != item.1) %item.10 %end; %end;

    %end; %end; %if;not cancel_links;
    %end;
      %foreach;sorted_list_item; %if;(prev_item.1 != item.1) %nl;
    • [*number of branches] : %item.10; %nl; %end; %nl; %if;(item.1 != next_item.1)
      [*surname/surnames]0 [*place] [*date/dates]0
      %nn; %if;not cancel_links;%end; %item.2;%item.3; %if;not cancel_links;%end; %item.5; %if;(item.6 = "<")/%item.7;%elseif(item.6 = ">")%item.7;/%else;%item.6;%item.7;%end;%nn; -%nn; %if;(item.8 = "<")/%item.9;%elseif(item.8 = ">")%item.9;/%else;%item.8;%item.9;%end;
    • %end; %end;
    %empty_sorted_list; %end; %define;surname_branch_alphabetically() %( surnames branch alphabetically %) %if;not cancel_links;
    %end; %nl; %foreach;ancestor_surname(nb_gena) %nl; %end;
    [*surname/surnames]0 [*number of branches] [*place] [*date/dates]0
    %nn; %if;not cancel_links;%end; %ancestor.surname_end;%ancestor.surname_begin; %if;not cancel_links;%end; %ancestor.nb_times; %ancestor.place; %if;(ancestor.date_begin.prec = "<") /%ancestor.date_begin.year;%nn; %elseif;(ancestor.date_begin.prec = ">") %ancestor.date_begin.year;/%nn; %else; %ancestor.date_begin.prec;%ancestor.date_begin.year;%nn; %end; -%nn; %if;(ancestor.date_end.prec = "<") /%ancestor.date_end.year;%nn; %elseif;(ancestor.date_end.prec = ">") %ancestor.date_end.year;/%nn; %else; %ancestor.date_end.prec;%ancestor.date_end.year;%nn; %end;
    %end; %define;ancestors_horizontally(xx, nnn, ss1, ss2, ss3) %if;(nnn > 0) %if;(xx.has_parents) %apply;ancestors_horizontally( "xx.father", nnn - 1, "ss1     ", "ss1+----", "ss1|    ") %end; ss2%apply;image_MF("xx","13") %apply;short_display_person("xx") %if;(xx.has_parents) %apply;ancestors_horizontally( "xx.mother", nnn - 1, "ss3|    ", "ss3+----", "ss3     ") %end; %end; %end; %define;ancestors_by_list(xx, nnn) %if;(xx.has_parents and nnn > 1)
    • %apply;image_MF("xx.father","13") %apply;short_display_person("xx.father")%nl; %apply;ancestors_by_list("xx.father", nnn - 1)
    • %apply;image_MF("xx.mother","13") %apply;short_display_person("xx.mother")%nl; %apply;ancestors_by_list("xx.mother", nnn - 1)
    %end; %end; %let;central_index;%index;%in; %let;central_person;%first_name_key_strip;%sp;%surname_key_strip;%in; %let;nb_gena; %if;(bvar.max_anc_level = "")%apply;min(evar.v, max_anc_level, 7) %else;%apply;min(evar.v, max_anc_level, bvar.max_anc_level)%end; %in; %message_to_wizard;

    %nn; %if;(evar.t = "E") %if;(public_name != "")%public_name;%else;%first_name;%end; %if;(qualifier != "") %qualifier;%end; %sp;%surname; %if;(alias != "") (%alias;)%end; - [*list eclair] - %elseif;(evar.t = "F") %if;(public_name != "")%public_name;%else;%first_name;%end; %if;(qualifier != "") %qualifier;%end; %sp;%surname; %if;(alias != "") (%alias;)%end; - [*surnames branch] - %else; %apply;a_of_b%with;[*ancestors]%and; %if;(public_name != "")%public_name;%else;%first_name;%end; %if;(qualifier != "") %qualifier;%end; %sp;%surname; %if;(alias != "") (%alias;)%end; %end; %if;(evar.t = "D") [up to] %pvar.1;%end; %end;

    %apply;display_arrows() %if;(evar.v <= 1) [*specify::generation/generations]0. %else;

    %apply;togena(nb_gena).

    %if;(evar.t = "E" and evar.sort != "") %apply;list_eclair_by_date_or_events() %elseif;(evar.t = "E") %apply;list_eclair() %elseif;(evar.t = "F" and evar.sort = "on") %apply;surname_branch_by_number_of_branches() %elseif;(evar.t = "F") %apply;surname_branch_alphabetically() %elseif;(evar.t = "H")
    %apply;ancestors_horizontally( "self", nb_gena, "    ", "====", "    ")
    %elseif;(evar.t = "L") %apply;ancestors_by_list("self", nb_gena) %end; %end; %base_trailer; %copyright; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templx/notes.txt0000660000175200017530000000076512664543647025001 0ustar guillaumeguillaume%( Template notes v 6.05d 2012/06/02 12:00:00 ddr/dd %) %if;((wizard or friend or bvar.no_note_for_visitor="" or bvar.no_note_for_visitor="no") and (has_notes or has_linked_page.BNOTE or has_linked_page.NOTE))

    [*note/notes]1

    %if;(has_linked_page.BNOTE)

    %apply;capitalize(linked_page.BNOTE).

    %end; %if;(has_notes)%notes;%end; %if;(has_linked_page.NOTE)

    %apply;capitalize(linked_page.NOTE).

    %end;
    %end;geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templx/deslist.txt0000660000175200017530000003627012664543647025320 0ustar guillaumeguillaume%doctype; %nn; %apply;a_of_b_gr_eq_lev%with; [*descendants]%nn; %and; %if;(public_name!="")%public_name;%else;%first_name;%end; %if;(qualifier!="") %qualifier;%end; %sp;%surname; %end; %include.css; %base_header; %define;image_sosa(xxx,yyy) %nn; %end; %define;display_sosa(xx) %if;(bvar.display_sosa="" or bvar.display_sosa="yes") %if;xx.has_sosa; %if;not cancel_links;%end; %apply;image_sosa%with;%sosa_ref.first_name_key_strip;%sp; %sosa_ref.surname_key_strip; %and;%xx.sosa;%end; %if;not cancel_links;%end;%sp; %end; %end; %end; %define;image_MF(xx,wi_he) %if;(wizard and not cancel_links and not xx.is_restricted) %end; %if;xx.is_male; %nn; %if;(wizard and not cancel_links and not xx.is_restricted)%end; %sp; %end; %define;display_arrows() %if;not cancel_links;
    %if;has_referer; %end;
    %end; %end; %define;tothegen(xx) [*to the %s generation:::xx]%nn; %end; %define;togend(xx) %if;(xx=0)[*specify::generation/generations]0%nn; %elseif;(xx=1)[*to the children]%nn; %elseif;(xx=2)[*to the grandchildren]%nn; %elseif;(xx=3)[*to the great-grandchildren]%nn; %else; %apply;tothegen%with; %apply;nth([nth (generation)], xx) %end; %end; %end; %define;short_display_person(xx) %apply;display_sosa("xx") %if;(xx.index=central_index)%xx;%else; %if;(cancel_links or xx.is_restricted)%xx; %else;%xx;%end; %end;%sp; %xx.title;%xx.dates;%if;xx.birthday; ([happy birthday to you!])%end; %end; %define;somebody_long_info(xx) %if;xx.has_nobility_titles; %nn; %foreach;xx.nobility_title;, %nobility_title;%end; %nn; %end; %if;xx.has_birth_date;, %apply;nth([born],xx.sex) %xx.on_birth_date; %if;xx.has_birth_place; - %xx.birth_place;%end; %else; %if;xx.has_birth_place;, %apply;nth([born],xx.sex) - %xx.birth_place;%end; %end; %if;xx.has_baptism_date;, %apply;nth([baptized],xx.sex) %xx.on_baptism_date; %if;xx.has_baptism_place; - %xx.baptism_place;%end; %else; %if;xx.has_baptism_place;, %apply;nth([baptized],xx.sex) - %xx.baptism_place;%end; %end; %if;xx.is_dead;, %xx.died; %if;xx.has_death_date; %xx.on_death_date;%end; %if;xx.has_death_place; - %xx.death_place;%end; %if;(xx.has_linked_page.DEATH !="") %xx.linked_page.DEATH;%end; %if;xx.computable_death_age; [age at death:] %xx.death_age;%end; %if;xx.is_buried; , %apply;nth([buried],xx.sex) %if;xx.has_burial_date; %xx.on_burial_date;%end; %if;xx.has_burial_place; - %xx.burial_place;%end; %end; %if;xx.is_cremated; , %apply;nth([cremated],xx.sex) %if;xx.has_cremation_date; %xx.on_cremation_date;%end; %if;xx.has_cremation_place; - %xx.cremation_place;%end; %end; %end; %if;xx.has_occupation;, %apply;capitalize(xx.occupation)%end; %if;(xx.has_linked_page.OCCU) %apply;capitalize(xx.linked_page.OCCU)%nl; %end; %if (evar.rel="on" and xx.has_relations) %foreach;xx.relation;%nl; (%relation_type; :%sp; %if;has_relation_him; %apply;image_MF("relation_him","13") %apply;short_display_person("relation_him") %end; %if;has_relation_her; %if;has_relation_him; , %end; %apply;image_MF("relation_her","13") %apply;short_display_person("relation_her") %end;) %end; %foreach;xx.related;%nl; (%related_type; :%sp; %apply;image_MF("related","13") %apply;short_display_person("related")) %end; %end; %end; %define;married_to(is_male, date_place) %if;("is_male"=1) %if;are_married;[married%t to:::date_place]0%nn; %elseif;are_not_married;[relationship%t to:::date_place]0%nn; %elseif;are_engaged;[engaged%t to:::date_place]0%nn; %elseif;is_no_sexes_check;[relationship%t to:::date_place]0%nn; %elseif;is_no_mention;date_place [with]%nn; %end; %else; %if;are_married;[married%t to:::date_place]1%nn; %elseif;are_not_married;[relationship%t to:::date_place]1%nn; %elseif;are_engaged;[engaged%t to:::date_place]1%nn; %elseif;is_no_sexes_check;[relationship%t to:::date_place]1%nn; %elseif;is_no_mention;date_place [with]%nn; %end; %end; %end; %define;somebody_notes_and_sources(xx)
    %if;((wizard or friend or bvar.no_note_for_visitor="" or bvar.no_note_for_visitor="no") and evar.notes = "on") %if;(xx.has_linked_page.BNOTE or xx.has_notes or xx.has_linked_page.NOTE)
    %nn; %if;(xx.has_linked_page.BNOTE)

    %apply;capitalize(xx.linked_page.BNOTE).

    %end; %if;(xx.has_notes)%xx.notes;%end; %if;(xx.has_linked_page.NOTE)

    %apply;capitalize(xx.linked_page.NOTE).

    %end;
    %end; %end; %if;(evar.src = "on") %if;(xx.has_sources) [*source/sources]1: %foreach;xx.source; - %source_type;: %source; %end; %end; %if;xx.has_linked_page.BIBLIO;

    %apply;capitalize(xx.linked_page.BIBLIO).

    %end; %end;
    %end; %define;descendants_by_list(xx, yy, curlev, maxlev, famlev, ctr) %incr_count; %apply;image_MF("xx","13") %apply;display_sosa("xx") %nn; %if;(cancel_links or xx.is_restricted)%yy;%else; %yy;%end; %sp; %apply;somebody_long_info("xx") %if;(((evar.notes="on") and (xx.has_linked_page.BNOTE or xx.has_notes or xx.has_linked_page.NOTE) and (wizard or friend or bvar.no_note_for_visitor="" or bvar.no_note_for_visitor="no")) or (evar.src="on" and xx.has_sources)) %if;(evar.inline = "on") %apply;somebody_notes_and_sources("xx") %else; %sp;([*see] %ns;%sp; %if;not cancel_links;%end; %ctr; %if;not cancel_links;%end; )%nn; %end; %end; %foreach;xx.family; %if;(family_cnt=1)%end; %nl; %apply;capitalize%with; %apply;married_to%with; %xx.is_male; %and; %if;(on_marriage_date!="") %on_marriage_date;%end; %if;(marriage_place!=""), %marriage_place;, %end; %end;%sp; %end; %apply;image_MF("spouse","13") %apply;display_sosa("spouse") %nn; %if;(cancel_links or spouse.is_restricted)%spouse;%else; %spouse;%end; %sp; %apply;somebody_long_info("spouse") %if;(((evar.notes="on") and (spouse.has_linked_page.BNOTE or spouse.has_notes or spouse.has_linked_page.NOTE) and (wizard or friend or bvar.no_note_for_visitor="" or bvar.no_note_for_visitor="no")) or (evar.src="on" and spouse.has_sources)) %if;(evar.inline = "on") %apply;somebody_notes_and_sources("spouse") %else; %sp;([*see] %ns;%sp; %if;not cancel_links;%end; %ctr;-%family_cnt; %if;not cancel_links;%end; )%nn; %end; %end; %if;(evar.witn="on" and has_witnesses)%nl;([witness/witnesses]1 : %foreach;witness; %if;(not is_first),%nl;%end; %apply;image_MF("witness","13") %apply;short_display_person("witness") %end;)%sq; %end; %if;(evar.comm="on" and has_comment)%nl;(%comment;)%end; %if;are_divorced;, [divorced]%divorce_date;%end; %if;are_separated;, [separated]%end; %if;(curlev < maxlev) %if;((curlev=0) or (evar.t="M" and xx.is_male) or (evar.t="F" and xx.is_female) or (evar.t="L")) %if;(family.desc_level < famlev) , [see further] %elseif;(family.desc_level > famlev) , [see above] %elseif;has_children; , [having as children] %family.set_infinite_desc_level;
      %foreach;child;
    • %if;(evar.alwsurn="yes") %apply;descendants_by_list("child", "child", curlev+1, maxlev, famlev+1, count+1) %else; %apply;descendants_by_list("child", "child_name", curlev+1, maxlev, famlev+1, count+1) %end;%nl;
    • %end;%nl;
    %else; %if;(curlev=0)%nl;%nl;%end; .%nl; %end; %elseif;has_children;, ...%nl;%else;.%nl;%end; %else;.%nl; %end; %end; %end; %define;notes_by_list(xx, curlev, maxlev, famlev, ctr) %incr_count; %if;(((evar.notes="on") and (xx.has_linked_page.BNOTE or xx.has_notes or xx.has_linked_page.NOTE) and (wizard or friend or bvar.no_note_for_visitor="" or bvar.no_note_for_visitor="no")) or (evar.src="on" and xx.has_sources))
    %ns;%sp; %if;not cancel_links;%end; %ctr; %if;not cancel_links;%end; (%xx; %xx.dates;)
    %apply;somebody_notes_and_sources("xx") %end; %foreach;xx.family; %if;(((evar.notes="on") and (spouse.has_linked_page.BNOTE or spouse.has_notes or spouse.has_linked_page.NOTE) and (wizard or friend or bvar.no_note_for_visitor="" or bvar.no_note_for_visitor="no")) or (evar.src="on" and spouse.has_sources))
    %ns;%sp; %if;not cancel_links;%end; %ctr;-%family_cnt; %if;not cancel_links;%end; (%spouse; %spouse.dates;)
    %apply;somebody_notes_and_sources("spouse") %end; %if;(curlev < maxlev) %if;((curlev=0) or (evar.t="M" and xx.is_male) or (evar.t="F" and xx.is_female) or (evar.t="L")) %if;(family.desc_level < famlev)%nn; %elseif;(family.desc_level > famlev)%nn; %elseif;has_children; %family.set_infinite_desc_level; %foreach;child; %apply;notes_by_list("child", curlev+1, maxlev, famlev+1, count+1) %end; %end; %end; %end; %end; %end; %define;img_td(xx) %if;(xx.has_image) %if;(count = 0)%nl;%end; %incr_count; %nn; %if;not cancel_links;%end; %nn: %if;not cancel_links;%end; %nn; %apply;image_MF("xx", "13") %apply;short_display_person("xx") %if;(count >= 4) %reset_count; %end; %end; %end; %define;display_images(xx, curlev, maxlev, famlev, ctr) %apply;img_td("xx") %foreach;xx.family; %apply;img_td("spouse") %if;(curlev < maxlev) %if;((curlev = 0) or (evar.t="M" and xx.is_male) or (evar.t="F" and xx.is_female) or (evar.t="L")) %if;(family.desc_level < famlev)%nn; %elseif;(family.desc_level > famlev)%nn; %elseif;has_children; %family.set_infinite_desc_level; %foreach;child; %apply;display_images("child", curlev+1, maxlev, famlev+1, count+1) %end; %end; %end; %end; %end; %end; %define;by_list(xx) %let;ns; %if;(evar.notes="on" and evar.src="on")[*note/notes]1 [and] [*source/sources]1%nn; %elseif;(evar.notes="on")[*note/notes]1%nn; %elseif;(evar.src="on")[*source/sources]1%nn; %end; %in;

    %apply;togend(xx).

    %if;not cancel_links; %if;(((evar.notes = "on" or evar.src = "on") and evar.inline != "on") or evar.image = "on")

    [*see] : [*descendants]%sp;%nn; %if;((evar.notes = "on" or evar.src = "on") and evar.inline != "on") | %ns; %end; %if;(evar.image = "on") | [*image/images]1 %end;

    %end; %end; %reset_count; %apply;descendants_by_list("self", "self", 0, xx, 0, 1)%nl; [*total]: %expr(count-1) [[person/persons]1@(c)]%sp; ([spouses not included]). %if;((evar.notes="on" or evar.src="on") and evar.inline != "on") %reset_count; %reset_desc_level;

    %ns;

    %apply;notes_by_list("self", 0, xx, 0, 1)%nl;
    %end; %if;(evar.image ="on") %reset_count; %reset_desc_level;

    [*image/images]1

    %apply;display_images("self", 0, xx, 0, 1)%nl; %if;(count != 0)%end;
    %end; %end; %let;central_index;%index;%in; %let;central_person;%first_name_key_strip;%sp;%surname_key_strip;%in; %let;nb_gend; %if;(bvar.max_desc_level="")%apply;min(evar.v, max_desc_level, 12) %else;%apply;min(evar.v, max_desc_level, bvar.max_desc_level)%end; %in; %message_to_wizard;

    %nn; %apply;a_of_b_gr_eq_lev%with; [*descendants]%nn; %and; %if;(public_name!="")%public_name;%else;%first_name;%end; %if;(qualifier!="") %qualifier;%end; %sp;%surname; %if;(alias!="") (%alias;)%end; %end;

    %apply;display_arrows() %apply;by_list(nb_gend) %base_trailer; %copyright; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templx/anctree.txt0000660000175200017530000001636412664543647025274 0ustar guillaumeguillaume%if;(evar.t = "T")%doctype_transitional;%else;%doctype;%end; %nn; %if;(evar.t = "A")[*male line/female line]0%nn; %elseif;(evar.t = "C")[*male line/female line]1%nn; %else[*tree]%end; %if;(evar.t = "A" or evar.t = "C"):%sp; %if;(public_name != "")%public_name;%else;%first_name;%end; %if;(qualifier != "") %qualifier;%end; %surname; %end; %include.css; %base_header; %define;image_sosa(xxx,yyy) %nn; %end; %define;display_sosa(xx) %if;(bvar.display_sosa="" or bvar.display_sosa="yes") %if;xx.has_sosa; %if;not cancel_links;%end; %apply;image_sosa%with;%sosa_ref.first_name_key_strip;%sp; %sosa_ref.surname_key_strip; %and;%xx.sosa;%end; %if;not cancel_links;%end;%sp; %end; %end; %end; %define;image_MF(xx,wi_he) %if;(wizard and not cancel_links and not xx.is_restricted) %end; %if;xx.is_male; %nn; %if;(wizard and not cancel_links and not xx.is_restricted)%end; %sp; %end; %define;display_arrows() %if;not cancel_links;
    %if;has_referer; %end;
    %end; %end; %define;short_display_person(xx) %apply;display_sosa("xx") %if;(cancel_links or xx.is_restricted)%xx; %else;%xx;%end;%sp; %xx.title;%xx.dates;%if;xx.birthday; ([happy birthday to you!])%end; %end; %define;a_tree_line() %if;(not is_first) %foreach;cell; %if;(not is_first)   %end; %nn; %if;(cell.is_empty or cell.is_top) %else;|%end; %end; %end; %foreach;cell; %if;(not is_first)   %end; %nn; %if;(cell.is_empty) %nn; %else; %if;(evar.bd != "" and evar.bd > 0 or evar.color != "")%nl;
    %nn; %end; %apply;image_MF("cell.person","13") %apply;short_display_person("cell.person") %if;(evar.bd != "" and evar.bd > 0 or evar.color != "")
    %end; %if;(evar.image = "on" and cell.person.has_image) %nl;
    %nn; %if;not cancel_links;%end; %nn; %if;not cancel_links;%end;
    %end; %end; %end; %if;(not is_last) %foreach;cell; %if;(not is_first) %nn; %if;cell.is_right; %if;(evar.marriage = "on" and cell.family.marriage_date.year != "") %nn; - %cell.family.marriage_date.prec; %cell.family.marriage_date.year; - %else; %end; %else; %end; %end; %nn; %if;cell.is_empty; %nn; %elseif;cancel_links;|%nn; %else; |%nn; %end; %end; %foreach;cell; %if;(not is_first) %nn; %if;(cell.is_right)
    %nn; %else; %end; %end; %nn; %if;cell.is_empty; %nn; %elseif;cell.is_left;
    %nn; %elseif;cell.is_right;
    %nn; %else;|%end; %end; %end; %end; %define;male_line(xx, nn) %if;(nn > 0) %if;(xx.has_parents)%apply;male_line("xx.father", nn - 1)%end; %apply;image_MF("xx","13") %apply;short_display_person("xx") %if;("xx" != "self")|%end;%nl; %end; %end; %define;female_line(xx, nn) %if;(nn > 0) %if;(xx.has_parents)%apply;female_line("xx.mother", nn - 1)%end; %apply;image_MF("xx","13") %apply;short_display_person("xx") %if;("xx" != "self")|%end;%nl; %end; %end; %define;tree(xx) %foreach;ancestor_tree_line(xx) %apply;a_tree_line() %end;
    %end; %let;central_index;%index;%in; %let;central_person;%first_name_key_strip;%sp;%surname_key_strip;%in; %let;nb_gena; %if;(bvar.max_anc_tree = "")%apply;min(evar.v, max_anc_level, 7) %else;%apply;min(evar.v, max_anc_level, bvar.max_anc_tree)%end; %in; %message_to_wizard; %apply;display_arrows() %if;(evar.t = "T")
    %nn; //
    %apply;tree(nb_gena) %elseif;(evar.t = "A")
    %apply;male_line("self", nb_gena)
    %elseif;(evar.t = "C")
    %apply;female_line("self", nb_gena)
    %end; %base_trailer; %copyright; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templx/ancsosa.txt0000660000175200017530000012560212664543647025276 0ustar guillaumeguillaume%doctype; %nn; %if;(evar.t = "D") [*ancestors] ... [up to] ...%nn; %elseif;(evar.t = "N" and evar.only = "on") [*generation/generations]0 %evar.v; %else; %apply;a_of_b%with; %if;(evar.t = "M") %if;(evar.evt = "on")[*missing events]%else;[*missing ancestors]%end; %else;[*ancestors] %end; %and; %if;(public_name != "")%public_name;%else;%first_name;%end; %if;(qualifier != "") %qualifier;%end; %sp;%surname; %end; %end; %include.css; %base_header; %define;image_sosa(xxx,yyy) %nn; %end; %define;display_sosa(xx) %if;(bvar.display_sosa="" or bvar.display_sosa="yes") %if;xx.has_sosa; %if;not cancel_links;%end; %apply;image_sosa%with;%sosa_ref.first_name_key_strip;%sp; %sosa_ref.surname_key_strip; %and;%xx.sosa;%end; %if;not cancel_links;%end;%sp; %end; %end; %end; %define;image_MF(xx,wi_he) %if;(wizard and not cancel_links and not xx.is_restricted) %end; %if;xx.is_male; %nn; %if;(wizard and not cancel_links and not xx.is_restricted)%end; %sp; %end; %define;display_arrows() %if;not cancel_links;
    %if;has_referer; %end;
    %end; %end; %define;tothegen(xx) [*to the %s generation:::xx]%nn; %end; %define;thegen(xx) [*the %s generation:::xx]%nn; %end; %define;togena(xx) %if;(xx = 1)[*specify::generation/generations]0%nn; %elseif;(xx = 2)[*to the parents]%nn; %elseif;(xx = 3)[*to the grandparents]%nn; %elseif;(xx = 4)[*to the great-grandparents]%nn; %else; %apply;tothegen%with; %apply;nth([nth (generation)], xx) %end; %end; %end; %define;gena(xx) %if;(xx = 1)[*specify::generation/generations]0%nn; %elseif;(xx = 2)[*the parents]%nn; %elseif;(xx = 3)[*the grandparents]%nn; %elseif;(xx = 4)[*the great-grandparents]%nn; %else; %apply;thegen%with; %apply;nth([nth (generation)], xx) %end; %end; %end; %define;letter(xx) %apply;nth%with; /a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z %and;xx%end; %end; %define;married_to(is_male, date_place) %if;("is_male" = 1) %if;are_married;[married%t to:::date_place]0%nn; %elseif;are_not_married;[relationship%t to:::date_place]0%nn; %elseif;are_engaged;[engaged%t to:::date_place]0%nn; %elseif;is_no_sexes_check;[relationship%t to:::date_place]0%nn; %elseif;is_no_mention;date_place [with]%nn; %end; %else; %if;are_married;[married%t to:::date_place]1%nn; %elseif;are_not_married;[relationship%t to:::date_place]1%nn; %elseif;are_engaged;[engaged%t to:::date_place]1%nn; %elseif;is_no_sexes_check;[relationship%t to:::date_place]1%nn; %elseif;is_no_mention;date_place [with]%nn; %end; %end; %end; %define;short_display_person(xx) %apply;display_sosa("xx") %if;(xx.index=central_index)%xx;%else; %if;(cancel_links or xx.is_restricted)%xx; %else;%xx;%end; %end;%sp; %xx.title;%xx.dates; %end; %define;very_short_display_person(xx) %apply;display_sosa("xx") %if;(xx.index=central_index)%xx;%else; %if;(cancel_links or xx.is_restricted)%xx; %else;%xx;%end; %end; %end; %define;very_short_display_person_name(xx) %apply;display_sosa("xx") %if;(xx.index=central_index)%xx_name;%else; %if;(cancel_links or xx.is_restricted)%xx_name; %else;%xx_name;%end; %end; %end; %define;short_display_generations() %if;(evar.only != "on")

    %apply;togena(nb_gena).

    %end; %reset_count; %foreach;ancestor_level(nb_gena) %if;(evar.only != "on" or level = nb_gena) %nl; [*generation/generations]0 %level;
      %foreach;ancestor;
    • %nn; %if;(ancestor.interval != "") %ancestor.interval; %else; %if;(ancestor.same = "")%incr_count;%end; %if;(evar.sosab = 16)%ancestor.anc_sosa.hexa; %elseif;(evar.sosab = 8)%ancestor.anc_sosa.octal; %else;%ancestor.anc_sosa;%end;%sp; %if;(ancestor.same != "")=>%else;-%end;%sp; %apply;image_MF("ancestor","13") %if;(ancestor.same = "") %apply;short_display_person("ancestor") %else; %if;not cancel_links;%end; %ancestor.same; %if;not cancel_links;%end; %end; %end;
    • %end;
    %end; %end;

    [*total] : %count; [[person/persons]1@(c)]

    %end; %define;somebody_long_info(xx) %if;xx.has_aliases; %foreach;xx.alias;, [alias] %alias;%end; %end; %if;(("xx" = "ancestor" or xx.sosa_in_list = "") and xx.has_nobility_titles) %nn; %foreach;xx.nobility_title;, %nobility_title;%end; %nn; %end; %if;(xx.has_birth_date or xx.has_birth_place) , %apply;nth([born],xx.sex) %if;xx.has_birth_date; %xx.on_birth_date;%end; %if;xx.has_birth_place; - %xx.birth_place;%end; %end; %if;(xx.has_baptism_date or xx.has_baptism_place) , %apply;nth([baptized],xx.sex) %if;xx.has_baptism_date; %xx.on_baptism_date;%end; %if;xx.has_baptism_place; - %xx.baptism_place;%end; %end; %if;xx.is_dead;, %xx.died; %if;xx.has_death_date; %xx.on_death_date;%end; %if;xx.has_death_place; - %xx.death_place;%end; %if;(xx.has_linked_page.DEATH !="") %xx.linked_page.DEATH;%end; %if;xx.computable_death_age; [age at death:] %xx.death_age;%end; %if;xx.is_buried; , %apply;nth([buried],xx.sex) %if;xx.has_burial_date; %xx.on_burial_date;%end; %if;xx.has_burial_place; - %xx.burial_place;%end; %end; %if;xx.is_cremated; , %apply;nth([cremated],xx.sex) %if;xx.has_cremation_date; %xx.on_cremation_date;%end; %if;xx.has_cremation_place; - %xx.cremation_place;%end; %end; %end; %end; %define;somebody_extra_info(xx) %if;xx.has_occupation;, %apply;capitalize(xx.occupation)%end; %if;(xx.has_linked_page.OCCU) %apply;capitalize(xx.linked_page.OCCU)%nl; %end; %if;(evar.rel = "on" and xx.has_relations) %foreach;xx.relation;%nl; (%relation_type; :%sp; %if;has_relation_him; %apply;image_MF("relation_him","13") %apply;short_display_person("relation_him") %if;(relation_him.sosa_in_list != ""),%sp; [see]%sp; %if;not cancel_links;%end; %relation_him.sosa_in_list; %if;not cancel_links;%end; %end; %end; %if;has_relation_her; %if;has_relation_him; , %end; %apply;image_MF("relation_her","13") %apply;short_display_person("relation_her") %if;(relation_her.sosa_in_list != ""),%sp; [see]%sp; %if;not cancel_links;%end; %relation_her.sosa_in_list; %if;not cancel_links;%end; %end; %end;)%sp; %end; %foreach;xx.related;%nl; (%related_type;: %apply;image_MF("related","13") %apply;short_display_person("related") %if;(related.sosa_in_list != ""),%sp; [see]%sp; %if;not cancel_links;%end; %related.sosa_in_list; %if;not cancel_links;%end; %end;)%sp; %end; %end; %end; %define;somebody(xx) %apply;image_MF("xx","13") %apply;very_short_display_person("xx") %apply;somebody_long_info("xx") %apply;somebody_extra_info("xx") %end; %define;somebody_spouse_parent(xx) %apply;image_MF("spouse.xx","13") %apply;short_display_person("spouse.xx") %if;(spouse.xx.sosa_in_list != "")%sp; ([see]%sp; %if;not cancel_links;%end; %spouse.xx.sosa_in_list; %if;not cancel_links;%end; )%nn; %end; %end; %define;somebody_notes_and_sources(xx)
    %if;(evar.notes = "on") %if;(xx.has_linked_page.BNOTE or xx.has_notes or xx.has_linked_page.NOTE)
    %nn; %if;(xx.has_linked_page.BNOTE)

    %apply;capitalize(xx.linked_page.BNOTE).

    %end; %if;(xx.has_notes)%xx.notes;%end; %if;(xx.has_linked_page.NOTE)

    %apply;capitalize(xx.linked_page.NOTE).

    %end;
    %end; %end; %if;(evar.src = "on") %if;(xx.has_sources) [*source/sources]1:
      %foreach;xx.source;
    • %apply;capitalize(source_type): %source;
    • %end;
    %end; %if;xx.has_linked_page.BIBLIO;

    %apply;capitalize(xx.linked_page.BIBLIO).

    %end; %end;
    %end; %define;long_display_ancestor_personal() %apply;somebody("ancestor"). %if;(evar.only != "on" and ancestor.father_sosa != "") [*parents] :%sp; %if;not cancel_links;%end; %ancestor.father_sosa; %if;not cancel_links;%end; %sp;[and]%sp; %if;not cancel_links;%end; %ancestor.mother_sosa;.%nn; %if;not cancel_links;%end; %end; %if;(((evar.notes="on") and (ancestor.has_linked_page.BNOTE or ancestor.has_notes or ancestor.has_linked_page.NOTE)) or (evar.src="on" and ancestor.has_sources)) %if;(evar.inline = "on") %apply;somebody_notes_and_sources("ancestor") %else; %[%ns;%sp; %if;not cancel_links;%end; %ancestor.anc_sosa; %if;not cancel_links;%end; %].%nn; %end; %end; %if;(evar.siblings = "on") %foreach;ancestor.family; %if;(ancestor.index = index or family.index != ancestor.family.index) %apply;capitalize%with; %apply;married_to%with; %ancestor.is_male; %and; %if;(ancestor.index != index) (%family_cnt;)%end; %if;(on_marriage_date != "") %on_marriage_date;%end; %if;(marriage_place != ""), %marriage_place;, %end; %end;%sp; %end; %apply;somebody("spouse")%nn; %if;spouse.has_parents;,%sp; %apply;a_of_b%with; %if;spouse.is_male;[son/daughter/child]0 %else;[son/daughter/child]1%end; %and; %apply;somebody_spouse_parent("father") [and]%sp; %apply;somebody_spouse_parent("mother") %end; %end; %if;(evar.witn = "on" and has_witnesses) %sp;%nl;([witness/witnesses]1 :%sp; %foreach;witness; %if;(not is_first),%nl;%end; %apply;image_MF("witness","13") %apply;short_display_person("witness") %end; )%nn; %end; %if;(evar.comm = "on" and has_comment) ,%sp;(%comment;)%nn; %end; .%nn; %end; %end; %end; %end; %define;child_long_info(spec) %apply;image_MF("child","13") %if;(bvar.always_surname="yes") %apply;very_short_display_person("child") %else; %apply;very_short_display_person_name("child") %end; %apply;somebody_long_info("child") %if;(child.sosa_in_list != "").%nn; %if;(evar.only != "on") [*see]%sp; %if;not cancel_links;%end; %child.sosa_in_list; %if;not cancel_links;%end; .%nn; %end; %else; %foreach;child.family; %apply;somebody_extra_info("child"),%sp; %apply;capitalize%with; %apply;married_to%with; %child.is_male; %and; %if;(on_marriage_date != "") %on_marriage_date;%end; %if;(marriage_place != ""), %marriage_place;, %end; %end;%sp; %end; %apply;somebody("spouse")%nn; %if;spouse.has_parents;,%sp; %apply;a_of_b%with; %if;spouse.is_male;[son/daughter/child]0 %else;[son/daughter/child]1%end; %and; %apply;somebody_spouse_parent("father") [and]%sp; %apply;somebody_spouse_parent("mother") %end; .%nn; %end; %if;are_divorced; [*divorced]0%divorce_date; %elseif;are_separated; [*separated]0%nl;%end; .%nn; %end; %if;(((evar.notes="on") and (child.has_linked_page.BNOTE or child.has_notes or child.has_linked_page.NOTE)) or (evar.src="on" and child.has_sources)) %if;(evar.inline = "on") %apply;somebody_notes_and_sources("child") %else; %[%ns;%sp; %if;not cancel_links; %nn; %end; %ancestor.anc_sosa; %if;("spec" != "")-spec%end; %apply;letter(child_cnt) %if;not cancel_links;%end; %].%nn; %end; %end; %end; %end; %define;long_display_ancestor_families() %if;ancestor.is_male; ... %foreach;ancestor.family; %if;(family.index = ancestor.family.index) %apply;married_to%with %ancestor.is_male; %and; %if;(on_marriage_date != "") %on_marriage_date;%end; %if;(marriage_place != ""), %marriage_place;, %end; %end;... %end; %end; %else; %foreach;ancestor.family; %if;(family.index = ancestor.family.index) ... %if;(evar.witn = "on" and has_witnesses)([witness/witnesses]1: %foreach;witness; %if;(not is_first),%nl;%end; %apply;image_MF("witness","13") %apply;short_display_person("witness") %end;), %end; %if;(evar.comm = "on" and has_comment) %sp;(%comment;)%nl; %end; [having as children] : %nn;
      %foreach;child; %if;(evar.siblings = "on" or child.sosa_in_list != "")
    1. %apply;child_long_info("")
    2. %end; %end;
    %end; %end; %if;(evar.siblings = "on") %( father's other children %) %foreach;ancestor.spouse.family; %if;(spouse.index != ancestor.index and nb_children > 0) ... [having as children] : %nn; %if;not cancel_links;%end; %family.father.sosa_in_list; %if;not cancel_links;%end; %sp;(X %family_cnt; [with] %spouse;) :
      %foreach;child;
    1. %apply;child_long_info(family_cnt)
    2. %end;
    %end; %end; %( mother's other children %) %foreach;ancestor.family; %if;(spouse.index != ancestor.spouse.index and nb_children > 0) ... [having as children] : %nn; %if;not cancel_links;%end; %family.mother.sosa_in_list; %if;not cancel_links;%end; %sp;(X %family_cnt; [with] %spouse;) :
      %foreach;child;
    1. %apply;child_long_info(family_cnt)
    2. %end;
    %end; %end; %end; %end; %end; %define;child_notes_and_sources(spec) %if;(child.sosa_in_list = "") %if;(((evar.notes="on") and (child.has_linked_page.BNOTE or child.has_notes or child.has_linked_page.NOTE)) or (evar.src="on" and child.has_sources)) %nl;
    %ns;%sp; %if;not cancel_links; %nn; %end; %ancestor.anc_sosa; %if;("spec" != "")-spec%end; %apply;letter(child_cnt) %if;not cancel_links;%end; %sp;(%child; %child.dates;) :%sp;
    %apply;somebody_notes_and_sources("child") %end; %end; %end; %define;long_display_notes_and_sources()

    %ns;

    %foreach;ancestor_level; %if;(nb_gena != "" and level <= nb_gena and (evar.only != "on" or level = nb_gena)) %foreach;ancestor; %if;(ancestor.same = "") %if;(((evar.notes="on") and (ancestor.has_linked_page.BNOTE or ancestor.has_notes or ancestor.has_linked_page.NOTE)) or (evar.src="on" and ancestor.has_sources)) %nl;
    %ns;%sp; %if;not cancel_links; %nn; %end; %ancestor.anc_sosa; %if;not cancel_links;%end; %sp;(%ancestor; %ancestor.dates;) :%sp;
    %apply;somebody_notes_and_sources("ancestor") %end; %end; %if;(evar.siblings = "on" and ancestor.is_female and ancestor.same = "") %( siblings %) %if;(ancestor.index != self.index) %foreach;ancestor.family; %if;(family.index = ancestor.family.index) %foreach;child; %apply;child_notes_and_sources("") %end; %end; %end; %( father's other families %) %foreach;ancestor.spouse.family; %if;(spouse.index != ancestor.index) %foreach;child; %apply;child_notes_and_sources(family_cnt) %end; %end; %end; %( mother's other families %) %foreach;ancestor.family; %if;(spouse.index != ancestor.spouse.index) %foreach;child; %apply;child_notes_and_sources(family_cnt) %end; %end; %end; %end; %end; %end; %end; %end;
    %end; %define;long_display_images()

    [*image/images]1

    %reset_count; %foreach;ancestor_level; %if;(evar.v != "" and level <= evar.v and (evar.only != "on" or level = evar.v)) %foreach;ancestor; %if;(ancestor.same = "" and ancestor.has_image) %if;(count = 0) %end; %incr_count; %if;(count >= 4) %reset_count; %end; %end; %end; %end; %end; %if;(count !=0) %end;
    %nn; %if;not cancel_links;%end; %if;not cancel_links;%end; %nn; %apply;image_MF("ancestor", "13") %apply;short_display_person("ancestor")
    %end; %define;long_display_generations() %( long display generations %) %let;ns; %if;(evar.notes="on" and evar.src="on")[*note/notes]1 [and] [*source/sources]1%nn; %elseif;(evar.notes="on")[*note/notes]1%nn; %elseif;(evar.src="on")[*source/sources]1%nn; %end; %in; %if;not cancel_links; %if;(((evar.notes = "on" or evar.src = "on") and evar.inline != "on") or evar.image = "on")

    [*see] : [*ancestors]%sp;%nn; %if;((evar.notes = "on" or evar.src = "on") and evar.inline != "on") | %ns; %end; %if;(evar.image = "on") | [*image/images]1 %end;

    %end; %end; %if;(evar.only != "on")

    %apply;togena(nb_gena).

    %end; %foreach;ancestor_level(nb_gena) %if;(evar.only != "on" or level = nb_gena) [*generation/generations]0 %level; %foreach;ancestor; %nl;

    %if;(ancestor.same != "") %ancestor.anc_sosa; : %nn; [see]%sp; %if;not cancel_links;%end; %ancestor.same;.%nn; %if;not cancel_links;%end; %else; %ancestor.anc_sosa;%sp; %apply;long_display_ancestor_personal() %if;(ancestor.index != self.index) %apply;long_display_ancestor_families() %end; %end;

    %end; %end; %end; %if;(evar.inline != "on" and (evar.notes = "on" or evar.src = "on"))

    %apply;long_display_notes_and_sources() %end; %if;(evar.image = "on")

    %apply;long_display_images() %end; %end; %define;interval_dates(xxx, yyy) %if;(evar.after != "" and evar.before != "") %sp; [living between %s and %s:::xxx:yyy] %elseif;(evar.before != "") %sp; [living before %s:::yyy] %elseif;(evar.after != "") %sp; [living after %s:::xxx] %else; %( On n'affiche rien %) %end; %end; %define;dates_in_interval(xx) %if;(evar.after != "" and ((xx.birth_date.year = "" and xx.baptism_date.year = "" and xx.death_date.year = "" and xx.burial_date.year = "" and xx.cremated_date.year = "") or (xx.birth_date.year != "" and xx.birth_date.year < evar.after) or (xx.baptism_date.year != "" and xx.baptism_date.year < evar.after) or (xx.death_date.year != "" and xx.death_date.year < evar.after) or (xx.burial_date.year != "" and xx.burial_date.year < evar.after) or (xx.cremated_date.year != "" and xx.cremated_date.year < evar.after)) or evar.before != "" and ((xx.birth_date.year = "" and xx.baptism_date.year = "" and xx.death_date.year = "" and xx.burial_date.year = "" and xx.cremated_date.year = "") or (xx.birth_date.year != "" and xx.birth_date.year > evar.before) or (xx.baptism_date.year != "" and xx.baptism_date.year > evar.before) or (xx.death_date.year != "" and xx.death_date.year > evar.before) or (xx.burial_date.year != "" and xx.burial_date.year > evar.before) or (xx.cremated_date.year != "" and xx.cremated_date.year > evar.before)))dates_KO%nn; %else;dates_OK%end; %end; %define;living_interval_dates(xxx, yyy) %if;(evar.after != "" and evar.before != "") ,%sp;[living between %s and %s:::xxx:yyy] %elseif;(evar.before != "") ,%sp;[living before %s:::yyy] %elseif;(evar.after != "") ,%sp;[living after %s:::xxx] %else; %( On n'affiche rien %) %end; %end; %define;ancestor_missing_birth(xx) %if;(xx.has_birth_date or xx.has_birth_place) %if;xx.has_birth_date; %xx.slash_birth_date;%end; %if;xx.has_birth_place; - %xx.birth_place;%end; %else; %end; %end; %define;ancestor_missing_death(xx) %if;xx.is_dead; %if;xx.has_death_date; %xx.slash_death_date;%end; %if;xx.has_death_place; - %xx.death_place;%end; %else; %end; %end; %define;display_missing_ancestor_info(xx) %if;(evar.birth = "on") %apply;ancestor_missing_birth("xx") %end; %if;(evar.death = "on") %apply;ancestor_missing_death("xx") %end; %if;(evar.spouse = "on") %if;xx.has_families; %if;(not xx.has_parents and xx.first_name != "?" and xx.surname != "?") %foreach;xx.family; %if;(spouse.first_name != "?" and spouse.surname != "?") %if;(family_cnt > 1)%sp;%end; %apply;image_MF("spouse", "13") %apply;very_short_display_person("spouse") %end; %end; %end; %end; %end; %end; %define;missing_ancestors_alphabetically() %( missing ancestors alphabetically %)

    %apply;togena(nb_gena) %apply;living_interval_dates(evar.after, evar.before).

    %if;not cancel_links;
    %end; %empty_sorted_list; %reset_count; %foreach;ancestor_level(nb_gena) %foreach;ancestor; %if;(ancestor.same = "") %if;(((not ancestor.has_parents and ancestor.first_name != "?" and ancestor.surname != "?" and level < nb_gena) or ((ancestor.has_parents) and ((ancestor.father.first_name = "?" and ancestor.father.surname = "?") or (ancestor.mother.first_name = "?" and ancestor.mother.surname = "?")))) or (ancestor.has_families and ancestor.spouse.first_name = "?" and ancestor.spouse.surname = "?")) %if;(0<1) %( todo dates_in_interval %) %incr_count; %apply;add_in_sorted_list%with %ancestor.surname_end; %and;%ancestor.first_name; %and;%ancestor.surname_begin; %and;%ancestor.access; %and;%apply;image_MF("ancestor", "13") %and;%ancestor.nobility_title; %and;%apply;ancestor_missing_birth("ancestor") %and;%apply;ancestor_missing_death("ancestor") %and; %if;((not ancestor.has_parents and ancestor.first_name != "?" and ancestor.surname != "?" and level < nb_gena) or ((ancestor.has_parents) and ((ancestor.father.first_name = "?" and ancestor.father.surname = "?") or (ancestor.mother.first_name = "?" and ancestor.mother.surname = "?")))) %if;(not ancestor.has_parents) [*parents] %expr(ancestor.anc_sosa.v * 2) - %expr(ancestor.anc_sosa.v * 2 + 1) %elseif;((ancestor.father.first_name = "?" and ancestor.father.surname = "?") and (ancestor.mother.first_name = "?" and ancestor.mother.surname = "?")) [*parents] %expr(ancestor.anc_sosa.v * 2) - %expr(ancestor.anc_sosa.v * 2 + 1) %elseif;(ancestor.father.first_name = "?" and ancestor.father.surname = "?") [*father/mother]0 %expr(ancestor.anc_sosa.v * 2) %elseif;(ancestor.mother.first_name = "?" and ancestor.mother.surname = "?") [*father/mother]1 %expr(ancestor.anc_sosa.v * 2 + 1) %else; %sp; %end; %else; %sp; %end; %and; %if;(ancestor.has_families and ancestor.spouse.first_name = "?" and ancestor.spouse.surname = "?") %apply;nth([*husband/wife],ancestor.spouse.sex) %if;(ancestor.sex = "0") %expr(ancestor.anc_sosa.v + 1) %elseif;(ancestor.sex = "1") %expr(ancestor.anc_sosa.v -1) %end; %else;%sp;%end; %and;%apply;display_sosa("ancestor") %end; %end; %end; %end; %end; %end; %if;not cancel_links; %if;(count > 100)

    %foreach;sorted_list_item; %if;(initial(prev_item.1) != initial(item.1)) %apply;initial(item.1) %end; %end;

    %end; %end; %reset_count; %nl; %incr_count; %if;(evar.birth = "on") %incr_count; %end; %if;(evar.death = "on") %incr_count; %end; %let;nb_col;%count;%in; %reset_count; %foreach;sorted_list_item; %incr_count; %if;(initial(prev_item.1) != initial(item.1)) %nl; %end; %nl; %if;(evar.birth = "on") %end; %if;(evar.death = "on") %end; %end;
    [*person/persons]0[*birth date and birth place][*death date and death place]%incr_count;[*missing parents] %incr_count;[*missing spouse]
    %apply;initial(item.1)
    %nn; %if;not cancel_links; %item.5;%item.11;%item.1;%sp;%item.2;%item.3; %else; %item.5;%item.11;%item.1;%sp;%item.2;%item.3; %end; %if;(item.6 != ""), %item.6;%end; %item.7;%item.8;%item.9; %item.10;
    %empty_sorted_list;

    [*total] : %count; [[person/persons]1@(c)]

    %end; %define;missing_ancestors_by_generation() %( missing ancestors by generation %)

    %apply;togena(nb_gena) %apply;interval_dates(evar.after, evar.before)

    %if;not cancel_links;
    %end; %reset_count; %incr_count; %incr_count; %incr_count; %incr_count; %if;(evar.birth = "on") %incr_count; %end; %if;(evar.death = "on") %incr_count; %end; %if;(evar.spouse = "on") %incr_count; %end; %let;nb_col;%count;%in; %reset_count; %foreach;ancestor_level(nb_gena - 1) %apply;lazy_print%with; %nl; %end; %foreach;ancestor; %if;(ancestor.same = "") %if;(ancestor.first_name != "?" and ancestor.surname != "?") %if;(level < nb_gena) %if;((not ancestor.has_parents) or ((ancestor.father.first_name = "?" and ancestor.father.surname = "?") or (ancestor.mother.first_name = "?" and ancestor.mother.surname = "?"))) %( missing ancestor(s) %) %if;(0<1) %( todo dates_in_interval %) %lazy_force; %nl; %incr_count; %if;((not ancestor.has_parents) or ((ancestor.father.first_name = "?" and ancestor.father.surname = "?") and (ancestor.mother.first_name = "?" and ancestor.mother.surname = "?"))) %elseif;(ancestor.father.first_name = "?" and ancestor.father.surname = "?") %elseif;(ancestor.mother.first_name = "?" and ancestor.mother.surname = "?") %end; %apply;display_missing_ancestor_info("ancestor") %end; %end; %end; %end; %if;(ancestor.has_parents) %if;(ancestor.father.first_name = "?" and ancestor.father.surname = "?") %( mother without spouse %) %if;(0<1) %( todo dates_in_interval %) %lazy_force; %incr_count; %nl; %apply;display_missing_ancestor_info("ancestor.mother") %end; %end; %if;(ancestor.mother.first_name = "?" and ancestor.mother.surname = "?") %( father without spouse %) %if;(0<1) %( todo dates_in_interval %) %lazy_force; %incr_count; %nl; %apply;display_missing_ancestor_info("ancestor.father") %end; %end; %end; %end; %end; %end;
    [*missing sosa][*missing parents][*missing spouse][*person/persons]0[*birth date and birth place][*death date and death place][*spouse/spouses]1
    [*generation/generations]0 %level;
    %expr(ancestor.anc_sosa.v * 2) - %expr(ancestor.anc_sosa.v * 2 + 1) [*parents]%expr(ancestor.anc_sosa.v * 2) [*father/mother]0%expr(ancestor.anc_sosa.v * 2 + 1) [*father/mother]1%sp; %nn; %apply;image_MF("ancestor","13") %apply;very_short_display_person("ancestor")
    %expr(ancestor.anc_sosa.v * 2) %sp; [*husband/wife]0 %nn; %apply;image_MF("ancestor.mother","13") %apply;very_short_display_person("ancestor.mother")
    %expr(ancestor.anc_sosa.v * 2 + 1) %sp; [*husband/wife]1 %nn; %apply;image_MF("ancestor.father","13") %apply;very_short_display_person("ancestor.father")

    [*total] : %count; [[person/persons]1@(c)]

    %end; %define;ancestors_up_to_somebody() %( ancestors up to somebody %) %pvar.1.mark_descendants;
      %foreach;ancestor_level; %apply;lazy_print%with;
    • [*generation/generations]0 %level;%nl;
        %end; %if;(level <= evar.l + 1) %foreach;ancestor; %if;(ancestor.same = "" and ancestor.is_descendant) %lazy_force;
      • %ancestor.anc_sosa; -%sp; %apply;image_MF("ancestor","13") %apply;display_sosa("ancestor") %if;not cancel_links;%end; %ancestor; %if;not cancel_links;%end; %sp; %ancestor.title;%ancestor.dates;
      • %end; %end; %end; %if;lazy_printed;
      %nl;
    • %nl;%end; %end;
    %end; %define;ascend_table_header() %nl; [*Sosa]%nl; %( do not put %incr_count; here to obtain finally nb_col - 1 %) [*person/persons]0%nl; %incr_count; %if;(evar.birth = "on") [*date of birth]%nl; %incr_count; %end; %if;(evar.birth_place = "on") [*where born]%nl; %incr_count; %end; %if;(evar.marr = "on") [*spouse/spouses]1%nl; %incr_count; %end; %if;(evar.marr_date = "on") [*date of marriage]%nl; %incr_count; %end; %if;(evar.marr_place = "on") [*where married]%nl; %incr_count; %end; %if;(evar.child = "on") [*child/children]1 %incr_count; %end; %if;(evar.death = "on") [*date of death]%nl; %incr_count; %end; %if;(evar.death_place = "on") [*where dead]%nl; %incr_count; %end; %if;(evar.death_age = "on") [*age at death]%nl; %incr_count; %end; %if;(evar.occu = "on") [*occupation/occupations]1%nl; %incr_count; %end; %end; %define;ascend_table_row(xx) %let;rowsp; %if;(xx.nb_families>1) %sp;rowspan="%xx.nb_families" style="vertical-align: middle"%else;%end; %in; %foreach;xx.family; %nl; %if;(family_cnt=1) %nn; %if;(evar.sosab = 16)%xx.anc_sosa.hexa; %elseif;(evar.sosab = 8)%xx.anc_sosa.octal; %else;%xx.anc_sosa;%end; %end; %if;(xx.same = "" or evar.no_repeat != "on") %if;(family_cnt=1) %incr_count; %nn; %apply;image_MF("xx","13") %apply;very_short_display_person("xx") %if;(evar.birth = "on") %nn; %if;xx.has_birth_date;%xx.slash_birth_date;%else;%sp;%end; %end; %if;(evar.birth_place = "on") %nn; %if;xx.has_birth_place;%xx.birth_place;%else;%sp;%end; %end; %end; %if;(evar.marr = "on") %nn; %apply;image_MF("spouse","13") %apply;very_short_display_person("spouse") %end; %if;(evar.marr_date = "on") %nn; %if;(on_marriage_date="")%sp; %else;%slash_marriage_date;%end; %end; %if;(evar.marr_place = "on") %nn; %if;(marriage_place="")%sp; %else;%marriage_place;%end; %end; %if;(evar.child = "on") %nn; %nb_children; %end; %if;(family_cnt=1) %if;(evar.death = "on") %nn; %if;xx.has_death_date;%xx.slash_death_date;%else;%sp;%end; %end; %if;(evar.death_place = "on") %nn; %if;xx.has_death_place;%xx.death_place;%else;%sp;%end; %end; %if;(evar.death_age = "on") %nn; %if;xx.computable_death_age;%xx.death_age;%else;%sp;%end; %end; %if;(evar.occu = "on") %nn; %if;xx.has_occupation; %apply;capitalize(xx.occupation)%nn; %else;%sp;%end; %end; %end; %else; %if;(family_cnt=1) %nn; [*see]%sp; %if;not cancel_links;%end; %xx.same.v; %if;not cancel_links;%end; %end; %end; %end; %end; %define;ancestors_in_a_table() %( ancestors in a table %) %if;(evar.only != "on")

    %apply;togena(nb_gena).

    %end; %reset_count; %apply;ascend_table_header() %let;nb_colm1;%count;%in; %incr_count; %let;nb_col;%count;%in; %reset_count; %foreach;ancestor_level(nb_gena) %if;(evar.only != "on" or level = nb_gena) %if;(evar.gen = "on") %nl; %end; %foreach;ancestor; %apply;ascend_table_row("ancestor") %end; %end; %end;
    %nn; [*generation/generations]0 %level;%nn;

    [*total] : %count; [[person/persons]1@(c)]

    %end; %( Main %) %let;central_index;%index;%in; %let;central_person;%first_name_key_strip;%sp;%surname_key_strip;%in; %let;nb_gena; %if;(bvar.max_anc_level = "")%apply;min(evar.v, max_anc_level, 7) %else;%apply;min(evar.v, max_anc_level, bvar.max_anc_level)%end; %in; %message_to_wizard;

    %nn; %apply;a_of_b%with; %if;(evar.t = "M") %if;(evar.evt = "on")[*missing events]%else;[*missing ancestors]%end; %else;[*ancestors] %end; %and; %if;(public_name != "")%public_name;%else;%first_name;%end; %if;(qualifier != "") %qualifier;%end; %sp;%surname; %if;(alias != "") (%alias;)%end; %end; %if;(evar.t = "D") [up to] %pvar.1;%end;

    %apply;display_arrows() %if;(evar.v <= 1) [*specify::generation/generations]0. %else; %if;(evar.t = "N") %apply;short_display_generations() %elseif;(evar.t = "G") %apply;long_display_generations() %elseif;(evar.t = "M" and evar.al = "on") %apply;missing_ancestors_alphabetically() %elseif;(evar.t = "M" and evar.evt = "on") %include.miss_evt; %elseif;(evar.t = "M") %apply;missing_ancestors_by_generation() %elseif;(evar.t = "D") %apply;ancestors_up_to_somebody() %elseif;(evar.t = "Z") %apply;ancestors_in_a_table() %elseif;(evar.t = "P") %include.perso_short; %end; %end; %base_trailer; %copyright; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templx/relations.txt0000660000175200017530000000353612664543647025650 0ustar guillaumeguillaume%( Template relations v 6.06a 2012/07/30 12:00:00 ddr/dd %) %if;has_relations;

    [*relation/relations]1

      %foreach;relation; %if;(has_relation_him and has_relation_her)
    • %apply;capitalize(relation_type) :%nl;
        %apply;li_SDC("relation_him") %apply;image_MF("relation_him","13") %apply;short_display_person("relation_him") %apply;li_SDC("relation_her") %apply;image_MF("relation_her","13") %apply;short_display_person("relation_her")
    • %elseif;has_relation_him; %apply;li_SDC("relation_him")%apply;capitalize(relation_type) :%sp; %apply;image_MF("relation_him","13") %apply;short_display_person("relation_him") %elseif;has_relation_her; %apply;li_SDC("relation_her")%apply;capitalize(relation_type) :%sp; %apply;image_MF("relation_her","13") %apply;short_display_person("relation_her") %end; %end; %foreach;related; %apply;li_SDC("related")%apply;capitalize(related_type) :%sp; %apply;image_MF("related","13") %apply;short_display_person("related") %end; %foreach;witness_relation;
    • %nn; %if;(witness_relation.marriage_date.year>0) %witness_relation.marriage_date.year; :%sp; %end; %apply;witness_relation%with; %apply;image_MF("witness_relation.father","13")%sp; %apply;short_display_person("witness_relation.father")%and; %apply;image_MF("witness_relation.mother","13")%sp; %apply;short_display_person("witness_relation.mother") %end;
    • %nl; %end;
    %end;geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templx/links.txt0000660000175200017530000001134112664543647024761 0ustar guillaumeguillaume%( Template links v 6.07b 2013/02/11 12:00:00 ddr/dd %) %if;not cancel_links; %if;wizard; %end; %end;geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templa/0002770000175200017530000000000012664543647023052 5ustar guillaumeguillaumegeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templa/perso.txt0000660000175200017530000002770712664543647024757 0ustar guillaumeguillaume%doctype; %nn; %if;has_public_name; %if;has_qualifiers;%public_name; %qualifier; %else;%public_name; %surname;%end; %else; %if;has_qualifiers;%first_name; %qualifier; %else;%first_name; %surname;%end; %end; %include.css; %base_header; %define;include_file(file) %include.file; %end; %define;image_sosa(xxx,yyy) %nn; %end; %define;display_sosa(xx) %if;(bvar.display_sosa="" or bvar.display_sosa="yes") %if;xx.has_sosa; %if;not cancel_links;%end; %apply;image_sosa%with;%sosa_ref.first_name_key_strip;%sp; %sosa_ref.surname_key_strip; %and;%xx.sosa;%end; %if;not cancel_links;%end;%sp; %end; %end; %end; %define;image_MF(xx,wi_he) %if;(wizard and not cancel_links and not xx.is_restricted) %end; %if;xx.is_male; %nn; %if;(wizard and not cancel_links and not xx.is_restricted)%end; %sp; %end; %define;li_SD(xx)
  • %nn; %end; %define;li_SDC(xx) %if;xx.has_families; %reset_count; %foreach;family; %if;(nb_children>0)%incr_count;%end; %end; %end;
  • %nn; %end; %define;display_arrows() %if;not cancel_links;
    %if;has_referer; %end;
    %end; %end; %define;tothegen(xx) [to the %s generation:::xx]%nn; %end; %define;togena(xx) %if;(xx = 1)[specify::generation/generations]0%nn; %elseif;(xx = 2)[to the parents]%nn; %elseif;(xx = 3)[to the grandparents]%nn; %elseif;(xx = 4)[to the great-grandparents]%nn; %else; %apply;tothegen%with; %apply;nth([nth (generation)], xx) %end; %end; %end; %define;togend(xx) %if;(xx = 0)[specify::generation/generations]0%nn; %elseif;(xx = 1)[to the children]%nn; %elseif;(xx = 2)[to the grandchildren]%nn; %elseif;(xx = 3)[to the great-grandchildren]%nn; %else; %apply;tothegen%with; %apply;nth([nth (generation)], xx) %end; %end; %end; %define;short_display_person(xx) %apply;display_sosa("xx") %if;(xx.index=central_index)%xx;%else; %if;(cancel_links or xx.is_restricted)%xx; %else;%xx;%end; %end;%sp; %xx.title;%xx.dates; %end; %define;display_vertical(xx) %if;(xx.has_birth_date or xx.has_birth_place or xx.has_baptism_date or xx.has_baptism_place or xx.is_dead or xx.is_buried or xx.is_cremated or (xx.has_consanguinity and bvar.show_consang!="no") or xx.has_occupation or xx.has_linked_page.OCCU !="")
      %if;xx.has_birth_date;
    • %apply;capitalize(nth([born],xx.sex)) %xx.on_birth_date; %if;xx.birthday; ([happy birthday to you!])%end; %if;xx.has_birth_place; - %xx.birth_place;%end;
    • %nl; %else; %if;xx.has_birth_place;
    • %apply;capitalize(nth([born],xx.sex)) - %xx.birth_place;
    • %nl; %end; %end; %if;xx.has_baptism_date;
    • %apply;capitalize(nth([baptized],xx.sex)) %xx.on_baptism_date; %if;xx.has_baptism_place; - %xx.baptism_place;%end;
    • %nl; %else; %if;xx.has_baptism_place;
    • %apply;capitalize(nth([baptized],xx.sex)) - %xx.baptism_place;
    • %nl; %end; %end; %if;xx.computable_age;
    • [*age] : %xx.age;
    • %nl; %end; %if;xx.is_dead;
    • %apply;capitalize(xx.died) %if;xx.has_death_date; %xx.on_death_date;%end; %if;xx.has_death_place; - %xx.death_place;%end; %if;(xx.has_linked_page.DEATH !="") %xx.linked_page.DEATH;%end; %if;xx.computable_death_age;, [age at death:] %xx.death_age;%end;
    • %nl; %if;xx.is_buried;
    • %apply;capitalize(nth([buried],xx.sex)) %if;xx.has_burial_date; %xx.on_burial_date;%end; %if;xx.has_burial_place; - %xx.burial_place;%end;
    • %nl; %end; %if;xx.is_cremated;
    • %apply;capitalize(nth([cremated],xx.sex)) %if;xx.has_cremation_date; %xx.on_cremation_date;%end; %if;xx.has_cremation_place; - %xx.cremation_place;%end;
    • %nl; %end; %end; %if;xx.has_occupation;
    • %apply;capitalize(xx.occupation)
    • %nl; %end; %if;(xx.has_linked_page.OCCU)
    • %apply;capitalize(xx.linked_page.OCCU)
    • %nl; %end; %if;(xx.has_consanguinity and bvar.show_consang!="no")
    • [*consanguinity] : %xx.consanguinity;
    • %nl; %end;
    %end; %end; %define;married_to(masc, date_place) %if;masc; %if;are_married;[*married%t to:::date_place]0%nn; %elseif;are_not_married;[*relationship%t to:::date_place]0%nn; %elseif;are_engaged;[*engaged%t to:::date_place]0%nn; %elseif;is_no_sexes_check;[*relationship%t to:::date_place]0%nn; %elseif;is_no_mention;date_place [*with]%nn; %end; %else; %if;are_married;[*married%t to:::date_place]1%nn; %elseif;are_not_married;[*relationship%t to:::date_place]1%nn; %elseif;are_engaged;[*engaged%t to:::date_place]1%nn; %elseif;is_no_sexes_check;[*relationship%t to:::date_place]1%nn; %elseif;is_no_mention;date_place [*with]%nn; %end; %end; %end; %define;long_married(xx) %apply;married_to%with;%xx.is_male%and; %if;(marriage_place="") %if;(on_marriage_date="") %else; %on_marriage_date; %if;wedding_birthday; ([happy birthday to them!])%end; %end; %else; %if;(on_marriage_date=""), %marriage_place;, %else; %on_marriage_date; %if;wedding_birthday; ([happy birthday to them!])%end; , %marriage_place, %end; %end; %end; %end; %define;witness_relation(xxx,yyy) [*witness at marriage of %s and %s:::xxx:yyy] %end; %define;nav_with_sosa_ref(xxx) [*navigation with %t as Sosa reference:::xxx]%nn; %end; %let;central_index;%index;%in; %let;central_person;%first_name_key_strip;%sp;%surname_key_strip;%in; %message_to_wizard;
    %apply;image_MF("self","13")
    %apply;display_arrows()

    %if;has_public_name; %if;has_qualifiers;%public_name; %qualifier; %else;%public_name; %surname;%end; %else; %if;has_qualifiers;%first_name; %qualifier; %else; %if;cancel_links;%first_name; %surname; %else; %first_name; %surname; %end; %end; %end;

    %if;(has_sosa or has_qualifiers or has_aliases or has_nobility_titles or has_public_name or has_surnames_aliases or has_first_names_aliases or has_linked_page.HEAD)
    %if;has_sosa; %apply;display_sosa("self") [*Sosa]: %if;cancel_links;%sosa; %else;%sosa;%end; %end; %foreach;qualifier; %if;not is_first; %if;has_public_name;%public_name; %qualifier; %else;%first_name; %qualifier;%end; %end; %end; %foreach;alias; %alias; %end; %if;has_nobility_titles; %foreach;nobility_title; %if;not is_first;, %end; %nobility_title; %end; %end; %if;has_linked_page.HEAD;%linked_page.HEAD;%end; %if;(has_public_name or has_qualifiers) (%if;cancel_links;%first_name; %surname; %else; %first_name; %surname;%nn; %end;) %end; %foreach;surname_alias; (%first_name; %surname_alias;) %end; %foreach;first_name_alias; (%first_name_alias; %surname;) %end;

    %end; %if;has_image;
    %end; %apply;display_vertical("self") %if;has_image;
    %end; %if;has_parents;

    [*parents]

      %foreach;parent; %apply;li_SD("parent") %apply;image_MF("parent","13") %apply;short_display_person("parent") %end;
    %end; %if;has_families;

    [*marriage/marriages]1%sp; %if;(max_desc_level>0) [and::child/children]1%end;

      %foreach;family; %apply;li_SD("spouse") %apply;long_married("self")%sp; %apply;image_MF("spouse","13") %apply;short_display_person("spouse") %if;has_witnesses; ([witness/witnesses]w : %foreach;witness; %if;not is_first;, %end; %apply;image_MF("witness","13") %apply;short_display_person("witness")%nl; %end; )%end; %if;((wizard or friend or bvar.no_note_for_visitor="" or bvar.no_note_for_visitor="no") and has_comment) (%comment;)%end; %if;are_divorced;, [divorced]0%divorce_date;%end; %if;are_separated;, [separated]0%end; %if;has_children; , [having as children]0
        %foreach;child; %apply;li_SDC("child") %apply;image_MF("child","13") %apply;short_display_person("child") %end;
      %end; %if;(evar.opt = "from" and wizard)(%origin_file;)%nl;%end; %end;
    %end; %apply;include_file("templx/relations") %apply;include_file("templx/linked_pages") %apply;include_file("templx/notes") %apply;include_file("templx/sources") %apply;include_file("templx/links") %if;(evar_opt="misc")%misc_names;%end; %base_trailer; %copyright; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templa/anclist.txt0000660000175200017530000000013012664543647025241 0ustar guillaumeguillaume%define;include_file(file) %include.file; %end; %apply;include_file("templx/anclist")geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templa/deslist.txt0000660000175200017530000000013012664543647025253 0ustar guillaumeguillaume%define;include_file(file) %include.file; %end; %apply;include_file("templx/deslist")geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templa/anctree.txt0000660000175200017530000000013012664543647025225 0ustar guillaumeguillaume%define;include_file(file) %include.file; %end; %apply;include_file("templx/anctree")geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templa/ancsosa.txt0000660000175200017530000000013012664543647025233 0ustar guillaumeguillaume%define;include_file(file) %include.file; %end; %apply;include_file("templx/ancsosa")geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/updhist.txt0000660000175200017530000001211012664543647024003 0ustar guillaumeguillaume%doctype; [*history of updates] %include.css; %base_header; %message_to_wizard; %define;search_form(xxx) %if;(wizard or friend)

    %hidden; %if;(evar.m = "HIST_SEARCH" and found) %end;

    %end; %end; %if;not cancel_links;
    %if;(referer != "") << %end; ^^
    %end;

    [*history of updates]

    %if;(not cancel_links and (evar.m != "HIST_SEARCH" or not found)) %apply;search_form("") %end; %define;update_text(uu) %if;(uu = "ap")[add::person/persons]0%nn; %elseif;(uu = "mp")[modify::person/persons]0%nn; %elseif;(uu = "dp")[delete::person/persons]0%nn; %elseif;(uu = "fp")[merge::person/persons]1%nn; %elseif;(uu = "si")[send::image/images]0%nn; %elseif;(uu = "di")[delete::image/images]0%nn; %elseif;(uu = "af")[add::family/families]0%nn; %elseif;(uu = "mf")[modify::family/families]0%nn; %elseif;(uu = "df")[delete::family/families]0%nn; %elseif;(uu = "if")[invert::family/families]1%nn; %elseif;(uu = "ff")[merge::family/families]1%nn; %elseif;(uu = "cn")[change children's names]%nn; %elseif;(uu = "aa")[add::parents]%nn; %elseif;(uu = "mn")[modify::note/notes]1%nn; %elseif;(uu = "cp")[modify::place]%nn; %elseif;(uu = "cs")[modify::source/sources]0%nn; %elseif;(uu = "co")[modify::occupation/occupations]0%nn; %else;%appy;interp(uu) %nn; %end; %end; %if;(bvar.history_diff = "yes")%end %let;kk;%if;(evar.k = "")3%else;%evar.k%end;%in; %let;wiz;%if;(evar.wiz != "" and evar.n = "")%evar.wiz;%end;%in; %foreach;history_line(kk, evar.pos, wiz) %if;(bvar.history_diff = "yes") %end; %end;
    [history][*date/dates]0 [*person/persons]0 [*wizard/wizards/friend/friends/exterior]0 [*update]
    %if;(first_name != "" and person.has_history) [history] %else;   %end; %time; %if;(first_name != "") %person;%person.title; %person.dates; %if;(bvar.show_invisible = "on" and wizard and person.is_invisible)  (x)%nn; %end; %elseif;is_note; - %if;(note.page = "")[note/notes]1%else;%[%note.page;%]%end; %if;(note.part != "")- #%note.part; %nn; %end; %else; %key; %end; %if;(user != "") %if;(wiz = "") %user;%nn; %else; %user; %end; %end; %apply;update_text(update.var)
    %if;(pos != "")

    %hidden; %if;(wiz != "") (%wiz;) %end; %if;(wiz != "") %end;

    %end; %if;(evar.m = "HIST_SEARCH" and found)%apply;search_form("left")%end; %base_trailer; %copyright; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/upddata.txt0000660000175200017530000000552112664543647023755 0ustar guillaumeguillaume%doctype; %title; %include.css; %base_header; %if;not cancel_links;
    %if;(referer != "") << %end; ^^
    %end;

    %title;

    %define;print_short()

    [*select a letter] :

    %foreach;initial; %html_encode.ini; %end;

    %end; %define;print_long()
    [*help modify data]
    %foreach;entry; %end;
    %hidden;
    %end; %if;(nb_results > 1000) %apply;print_short() %else; %apply;print_long() %end; %base_trailer; %copyright; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/robot.txt0000660000175200017530000000077212664543647023463 0ustar guillaumeguillaume%doctype; Access refused

    Access refused

    This address has been considered to be a robot and its access has been automatically disconnected.

    Contact the site administrator to restore it.

    %copyright_nologo; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/moved.txt0000660000175200017530000000117112664543647023442 0ustar guillaumeguillaume%doctype; %bname; -> %bvar.moved; %include.css;

    %apply;interp([ en: The database "%bname;" has moved to: fr: La base de données "%bname;" se trouve maintenant à l'adresse: ])

    %bvar.moved;

    %base_trailer; %copyright; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/annivmenu.txt0000660000175200017530000000230212664543647024325 0ustar guillaumeguillaume%doctype; [*anniversaries] %include.css; %base_header; %if;not cancel_links;
    %if;(referer != "") << %end;
    %end;

    [*anniversaries]

    %base_trailer; %copyright; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templd/0002770000175200017530000000000012664543647023055 5ustar guillaumeguillaumegeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templd/perso.txt0000660000175200017530000006025412664543647024754 0ustar guillaumeguillaume%doctype; %nn; %if;has_public_name; %if;has_qualifiers;%public_name; %qualifier; %else;%public_name; %surname;%end; %else; %if;has_qualifiers;%first_name; %qualifier; %else;%first_name; %surname;%end; %end; %include.css; %base_header; %define;include_file(file) %include.file; %end; %define;image_sosa(xxx,yyy) %nn; %end; %define;display_sosa(xx) %if;(bvar.display_sosa="" or bvar.display_sosa="yes") %if;xx.has_sosa; %if;not cancel_links;%end; %apply;image_sosa%with;%sosa_ref.first_name_key_strip;%sp; %sosa_ref.surname_key_strip; %and;%xx.sosa;%end; %if;not cancel_links;%end;%sp; %end; %end; %end; %define;image_MF(xx,wi_he) %if;(wizard and not cancel_links and not xx.is_restricted) %end; %if;xx.is_male; %nn; %if;(wizard and not cancel_links and not xx.is_restricted)%end; %sp; %end; %define;li_SD(xx)
  • %nn; %end; %define;li_SDC(xx) %if;xx.has_families; %reset_count; %foreach;family; %if;(nb_children>0)%incr_count;%end; %end; %end;
  • %nn; %end; %define;display_arrows() %if;not cancel_links;
    %if;has_referer; %end;
    %end; %end; %define;tothegen(xx) [to the %s generation:::xx]%nn; %end; %define;togena(xx) %if;(xx = 1)[specify::generation/generations]0%nn; %elseif;(xx = 2)[to the parents]%nn; %elseif;(xx = 3)[to the grandparents]%nn; %elseif;(xx = 4)[to the great-grandparents]%nn; %else; %apply;tothegen%with; %apply;nth([nth (generation)], xx) %end; %end; %end; %define;togend(xx) %if;(xx = 0)[specify::generation/generations]0%nn; %elseif;(xx = 1)[to the children]%nn; %elseif;(xx = 2)[to the grandchildren]%nn; %elseif;(xx = 3)[to the great-grandchildren]%nn; %else; %apply;tothegen%with; %apply;nth([nth (generation)], xx) %end; %end; %end; %define;short_display_person(xx) %apply;display_sosa("xx") %if;(xx.index=central_index)%xx;%else; %if;(cancel_links or xx.is_restricted)%xx; %else;%xx;%end; %end;%sp; %xx.title;%xx.dates; %end; %define;display_vertical(xx) %if;(xx.has_birth_date or xx.has_birth_place or xx.has_baptism_date or xx.has_baptism_place or xx.is_dead or xx.is_buried or xx.is_cremated or (xx.has_consanguinity and bvar.show_consang!="no") or xx.has_occupation or xx.has_linked_page.OCCU !="")
      %if;xx.has_birth_date;
    • %apply;capitalize(nth([born],xx.sex)) %xx.on_birth_date; %if;xx.birthday; ([happy birthday to you!])%end; %if;xx.has_birth_place; - %xx.birth_place;%end;
    • %nl; %else; %if;xx.has_birth_place;
    • %apply;capitalize(nth([born],xx.sex)) - %xx.birth_place;
    • %nl; %end; %end; %if;xx.has_baptism_date;
    • %apply;capitalize(nth([baptized],xx.sex)) %xx.on_baptism_date; %if;xx.has_baptism_place; - %xx.baptism_place;%end;
    • %nl; %else; %if;xx.has_baptism_place;
    • %apply;capitalize(nth([baptized],xx.sex)) - %xx.baptism_place;
    • %nl; %end; %end; %if;xx.computable_age;
    • [*age] : %xx.age;
    • %nl; %end; %if;xx.is_dead;
    • %apply;capitalize(xx.died) %if;xx.has_death_date; %xx.on_death_date;%end; %if;xx.has_death_place; - %xx.death_place;%end; %if;(xx.has_linked_page.DEATH !="") %xx.linked_page.DEATH;%end; %if;xx.computable_death_age;, [age at death:] %xx.death_age;%end;
    • %nl; %if;xx.is_buried;
    • %apply;capitalize(nth([buried],xx.sex)) %if;xx.has_burial_date; %xx.on_burial_date;%end; %if;xx.has_burial_place; - %xx.burial_place;%end;
    • %nl; %end; %if;xx.is_cremated;
    • %apply;capitalize(nth([cremated],xx.sex)) %if;xx.has_cremation_date; %xx.on_cremation_date;%end; %if;xx.has_cremation_place; - %xx.cremation_place;%end;
    • %nl; %end; %end; %if;xx.has_occupation;
    • %apply;capitalize(xx.occupation)
    • %nl; %end; %if;(xx.has_linked_page.OCCU)
    • %apply;capitalize(xx.linked_page.OCCU)
    • %nl; %end; %if;(xx.has_consanguinity and bvar.show_consang!="no")
    • [*consanguinity] : %xx.consanguinity;
    • %nl; %end;
    %end; %end; %define;married_to(masc, date_place) %if;masc; %if;are_married;[*married%t to:::date_place]0%nn; %elseif;are_not_married;[*relationship%t to:::date_place]0%nn; %elseif;are_engaged;[*engaged%t to:::date_place]0%nn; %elseif;is_no_sexes_check;[*relationship%t to:::date_place]0%nn; %elseif;is_no_mention;date_place [*with]%nn; %end; %else; %if;are_married;[*married%t to:::date_place]1%nn; %elseif;are_not_married;[*relationship%t to:::date_place]1%nn; %elseif;are_engaged;[*engaged%t to:::date_place]1%nn; %elseif;is_no_sexes_check;[*relationship%t to:::date_place]1%nn; %elseif;is_no_mention;date_place [*with]%nn; %end; %end; %end; %define;long_married(xx) %apply;married_to%with;%xx.is_male%and; %if;(marriage_place="") %if;(on_marriage_date="") %else; %on_marriage_date; %if;wedding_birthday; ([happy birthday to them!])%end; %end; %else; %if;(on_marriage_date=""), %marriage_place;, %else; %on_marriage_date; %if;wedding_birthday; ([happy birthday to them!])%end; , %marriage_place, %end; %end; %end; %end; %define;witness_relation(xxx,yyy) [*witness at marriage of %s and %s:::xxx:yyy] %end; %define;nav_with_sosa_ref(xxx) [*navigation with %t as Sosa reference:::xxx]%nn; %end; %let;central_index;%index;%in; %let;central_person;%first_name_key_strip;%sp;%surname_key_strip;%in; %message_to_wizard;
    %apply;image_MF("self","13")
    %apply;display_arrows()

    %if;has_public_name; %if;has_qualifiers;%public_name; %qualifier; %else;%public_name; %surname;%end; %else; %if;has_qualifiers;%first_name; %qualifier; %else; %if;cancel_links;%first_name; %surname; %else; %first_name; %surname; %end; %end; %end;

    %if;(has_sosa or has_qualifiers or has_aliases or has_nobility_titles or has_public_name or has_surnames_aliases or has_first_names_aliases or has_linked_page.HEAD)
    %if;has_sosa; %apply;display_sosa("self") [*Sosa]: %if;cancel_links;%sosa; %else;%sosa;%end; %end; %foreach;qualifier; %if;not is_first; %if;has_public_name;%public_name; %qualifier; %else;%first_name; %qualifier;%end; %end; %end; %foreach;alias; %alias; %end; %if;has_nobility_titles; %foreach;nobility_title; %if;not is_first;, %end; %nobility_title; %end; %end; %if;has_linked_page.HEAD;%linked_page.HEAD;%end; %if;(has_public_name or has_qualifiers) (%if;cancel_links;%first_name; %surname; %else; %first_name; %surname;%nn; %end;) %end; %foreach;surname_alias; (%first_name; %surname_alias;) %end; %foreach;first_name_alias; (%first_name_alias; %surname;) %end;

    %end; %if;has_image;
    %end; %apply;display_vertical("self") %if;has_image;
    %end; %if;has_parents;

    [*parents]

      %foreach;parent; %apply;li_SD("parent") %apply;image_MF("parent","13") %apply;short_display_person("parent") %end;
    %end; %if;has_families;

    [*marriage/marriages]1%sp; %if;(max_desc_level>0) [and::child/children]1%end;

      %foreach;family; %apply;li_SD("spouse") %apply;long_married("self")%sp; %apply;image_MF("spouse","13") %apply;short_display_person("spouse") %if;spouse.has_parents; ([*parents] : %apply;image_MF("spouse.father","13") %apply;short_display_person("spouse.father")  &  %apply;image_MF("spouse.mother","13") %apply;short_display_person("spouse.mother"))%nn; %end; %if;has_witnesses; ([witness/witnesses]w : %foreach;witness; %if;not is_first;, %end; %apply;image_MF("witness","13") %apply;short_display_person("witness")%nl; %end; )%end; %if;((wizard or friend or bvar.no_note_for_visitor="" or bvar.no_note_for_visitor="no") and has_comment) (%comment;)%end; %if;are_divorced;, [divorced]0%divorce_date;%end; %if;are_separated;, [separated]0%end; %if;has_children; , [having as children]0
        %foreach;child; %apply;li_SDC("child") %apply;image_MF("child","13") %apply;short_display_person("child") %end;
      %end; %if;(evar.opt = "from" and wizard)(%origin_file;)%nl;%end; %end;
    %end; %if;has_parents;
    %if;has_siblings; %end;
    %if;(max_anc_level>3) %( line 1 : up to 8 great-grandparents %) %if;(father.has_parents and father.father.has_parents) %else; %end; %if;(father.has_parents and father.mother.has_parents) %else; %end; %if;(mother.has_parents and mother.father.has_parents) %else; %end; %if;(mother.has_parents and mother.mother.has_parents) %else; %end; %( line 2 : up to 8 vertical lines with number %) %if;(father.has_parents and father.father.has_parents) %end; %if;(father.has_parents and father.mother.has_parents) %end; %if;(mother.has_parents and mother.father.has_parents) %end; %if;(mother.has_parents and mother.mother.has_parents) %end; %( line 3: up to 4 horizontal lines %) %if;(father.has_parents and father.father.has_parents) %end; %if;(father.has_parents and father.mother.has_parents) %end; %if;(mother.has_parents and mother.father.has_parents) %end; %if;(mother.has_parents and mother.mother.has_parents) %end; %( line 4 : up to 4 vertical lines %) %if;(father.has_parents and father.father.has_parents) %end; %if;(father.has_parents and father.mother.has_parents) %end; %if;(mother.has_parents and mother.father.has_parents) %end; %if;(mother.has_parents and mother.mother.has_parents) %end; %end; %if;(max_anc_level>2) %( line 5 : up to 4 grandparents %) %if;father.has_parents; %else; %end; %if;mother.has_parents; %else; %end; %( line 6 : up to 4 vertical lines with number %) %if;father.has_parents; %end; %if;mother.has_parents; %end; %( line 7 : up to 2 horizontal lines %) %if;father.has_parents; %end; %if;mother.has_parents; %end; %( line 8 : up to 2 vertical lines %) %if;father.has_parents; %end; %if;mother.has_parents; %end; %end; %( line 9 : 2 parents %) %( line 10 : 2 vertical lines with number %) %( line 11 : 2 horizontal lines %) %( line 12 : 1 vertical line %) %( line 13 : 1 person %)

    [*ancestors]

    %nn; %apply;image_MF("father.father.father","10") %apply;short_display_person("father.father.father")   %nn; %apply;image_MF("father.father.mother","10") %apply;short_display_person("father.father.mother")  %nn; %apply;image_MF("father.mother.father","10") %apply;short_display_person("father.mother.father")   %nn; %apply;image_MF("father.mother.mother","10") %apply;short_display_person("father.mother.mother")  %nn; %apply;image_MF("mother.father.father","10") %apply;short_display_person("mother.father.father")   %nn; %apply;image_MF("mother.father.mother","10") %apply;short_display_person("mother.father.mother")  %nn; %apply;image_MF("mother.mother.father","10") %apply;short_display_person("mother.mother.father")   %nn; %apply;image_MF("mother.mother.mother","10") %apply;short_display_person("mother.mother.mother") 
    |8   |9 |10   |11 |12   |13 |14   |15
    %nn;

    %nn;
     %nn;

    %nn;
     %nn;

    %nn;
     %nn;

    %nn;
    | | | |
    %nn; %apply;image_MF("father.father","12") %apply;short_display_person("father.father")   %nn; %apply;image_MF("father.mother","12") %apply;short_display_person("father.mother")  %nn; %apply;image_MF("mother.father","12") %apply;short_display_person("mother.father")   %nn; %apply;image_MF("mother.mother","12") %apply;short_display_person("mother.mother") 
    |4   |5 |6   |7
    %nn;

    %nn;
     %nn;

    %nn;
    | |
    %nn; %apply;image_MF("father","13") %apply;short_display_person("father")   %nn; %apply;image_MF("mother","13") %apply;short_display_person("mother")
    |2   |3
    %nn;

    %nn;
    |
    %nn; %apply;image_MF("self","13") %apply;short_display_person("self")

    %sp; %sp; %if;(bvar.full_siblings="" or bvar.full_siblings="yes") [*full siblings]%nn; %else; [*siblings]%nn; %end;

      %foreach;father.child; %if;((bvar.full_siblings="" or bvar.full_siblings="yes") or child.index!=central_index) %apply;li_SDC("child") %apply;image_MF("child","13") %apply;short_display_person("child") %end; %end;
    %end; %apply;include_file("templx/relations") %apply;include_file("templx/linked_pages") %apply;include_file("templx/notes") %apply;include_file("templx/sources") %apply;include_file("templx/links") %if;(evar_opt="misc")%misc_names;%end; %base_trailer; %copyright; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templd/anclist.txt0000660000175200017530000000013012664543647025244 0ustar guillaumeguillaume%define;include_file(file) %include.file; %end; %apply;include_file("templx/anclist")geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templd/deslist.txt0000660000175200017530000000013012664543647025256 0ustar guillaumeguillaume%define;include_file(file) %include.file; %end; %apply;include_file("templx/deslist")geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templd/anctree.txt0000660000175200017530000000013012664543647025230 0ustar guillaumeguillaume%define;include_file(file) %include.file; %end; %apply;include_file("templx/anctree")geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templd/ancsosa.txt0000660000175200017530000000013012664543647025236 0ustar guillaumeguillaume%define;include_file(file) %include.file; %end; %apply;include_file("templx/ancsosa")geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/relmenu.txt0000660000175200017530000002723212664543647024005 0ustar guillaumeguillaume%doctype; [*link between]%sp; %if;(public_name != "")%public_name; %else;%first_name; %surname;%end; [and]0...%nn; %include.favicon; %include.js; %include.css; %base_header; %message_to_wizard; %define;nth_cousins(xx) [*%s cousins:::xx]%nn; %end; %include.perso_header;

    [*link between]%sp; %if;(public_name != "")%public_name;%else;%first_name;%end; %if;(qualifier != "") %qualifier;%end; %sp;%surname; %if;(alias != "") (%alias;)%end; %sp;[and]0...%nn;

    %define;relative_sosa(sosa_link) [Sosa number relative to %t:::sosa_link] %end; %base_trailer; %copyright; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/redirect.txt0000660000175200017530000000126212664543647024132 0ustar guillaumeguillaume%doctype; Address changed %include.css;

    Address changed

    [ en: The address of this service has changed. Please use now: fr: L'adresse du service a changé. Utiliser maintenant: it: L'indirizzo di questo service è cambiato. Utilizzate: ]

    %base_trailer; %copyright; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/favicon.txt0000660000175200017530000000036212664543647023756 0ustar guillaumeguillaume%if;is_male; %elseif;is_female; %else; %end; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/welcome.txt0000660000175200017530000005777112664543647024004 0ustar guillaumeguillaume%doctype; GeneWeb - %base.name; %include.js; %include.css; %base_header; %define;database() [ af: Stamboom ar: شجرة العائل bg: Cемейно дърво br: Bon roadoù ca: Base de dades cs: Rodokmen da: Family Tree de: Stammbaum en: Family Tree eo: Family Tree es: árbol genealógico et: Sugupuu fi: Sukupuu fr: Généalogie he: ×ילן יוחסין is: Ættfræði gagnagrunnur it: Albero genealogico lv: Ä£imenes koks nl: Stamboom no: Family Tree pl: Drzewo genealogiczne pt: árvore genealógica ro: Arbore genealogic ru: генеалогичеÑкое дерево sl: družinsko drevo sv: Family Tree zh: å®¶è­œ ] %end; %define;book_of(xx) [*book of %s:::xx] %end;
    %( Display the acces bloc if there is %) %( a password or an empty block if not %) %if; (bvar.wizard_passwd != "" or bvar.wizard_passwd_file != "" or bvar.friend_passwd != "" or bvar.friend_passwd_file != "")

    [*access] :

      %if;(not wizard and (bvar.wizard_passwd != "" or bvar.wizard_passwd_file != "")) %if;(not cgi and bvar.auth_file = "")
    • %sq; [wizard/wizards/friend/friends/exterior]0
    • %else;
      %hidden; [*user/password/cancel]1 ([wizard/wizards/friend/friends/exterior]0) :
      %end; %end; %if;(not friend and (bvar.friend_passwd != "" or bvar.friend_passwd_file != "")) %if;(not cgi and bvar.auth_file = "")
    • %sq; [wizard/wizards/friend/friends/exterior]2
    • %end; %end; %if;(wizard and (bvar.wizard_passwd != "" or bvar.wizard_passwd_file != ""))
    • [wizard/wizards/friend/friends/exterior]0%sq; %if;(user.ident != "") : %user.ident;%sq; %end; ([disconnect])
    • %end; %if;(friend and (bvar.friend_passwd != "" or bvar.friend_passwd_file != ""))
    • [wizard/wizards/friend/friends/exterior]2 ([disconnect])
    • %end;
    %else
    %end;

    %apply;database() %base.name;
    %base.nb_persons; [person/persons]1

    %if;just_friend_wizard;
    [ en: Wizard rights are now suspended for maintenance. fr: Les droits des magiciens sont actuellement suspendus pour maintenance. ]
    %end; %if;(bvar.motd != "")
    %apply;interp(bvar.motd)
    %end; %define;sosa_rel(xx) [Sosa number relative to %t:::xx] %end; %define;display_sosa_ref(xx) [*Sosa reference: %t:::xx] %end;
    %( end div search %)

    [*tools]


    %if;(bvar.counter != "no")%sq
    %apply;interp([ af: Daar was %nb_accesses; besoeke, %nb_accesses_to_welcome; van hulle aan hierdie blad, sedert %start_date;. bg: От %start_date; наÑам е имало %nb_accesses; поÑещениÑ, от които %nb_accesses_to_welcome; Ñа на наÑтоÑщата Ñтраница. br: gweladennoù a zo bet : %nb_accesses;, er bajenn-mañ : %nb_accesses_to_welcome;, abaoe an deiz-mañ : %start_date;. ca: Hi ha hagut %nb_accesses; consultes, de les quals %nb_accesses_to_welcome; en aquesta pàgina, des del %start_date;. cs: %nb_accesses; přístupů, z toho %nb_accesses_to_welcome; na tuto stránku, od %start_date;. da: Der har været %nb_accesses; opslag, %nb_accesses_to_welcome; af dem pÃ¥ denne side, siden %start_date;. de: Seit dem %start_date; gab es %nb_accesses; Zugriffe, davon %nb_accesses_to_welcome; auf diese Seite. en: There have been %nb_accesses; accesses, %nb_accesses_to_welcome;%sp; of them to this page, since %start_date;. eo: Estis %nb_accesses; alirejoj, el kiuj %nb_accesses_to_welcome; al ĉi tiu paÄo, ekde la %start_date;. es: Ha habido %nb_accesses; consultas, de las cuales %nb_accesses_to_welcome; corresponden a esta página, desde el %start_date;. et: Alates andmebaasi loomise päevast (%start_date;) on selle poole pöördutud %nb_accesses; korda, neist %nb_accesses_to_welcome; korda sellele lehele. fi: Tähän mennessä %nb_accesses; tapahtumaa, joista %nb_accesses_to_welcome; tälle sivulle %start_date; jälkeen. fr: Il y a eu %nb_accesses; consultations, dont %nb_accesses_to_welcome; à cette page, depuis le %start_date;. he: היו %nb_accesses; כניסות, כולל %nb_accesses_to_welcome; כניסות לעמוד ×–×”, מ××– %start_date;. is: Það hafa verið %nb_accesses; heimsóknir, %nb_accesses_to_welcome; af þeim á þessa síðu, síðan %start_date;. it: Dal %start_date; ci sono stati %nb_accesses; accessi, %nb_accesses_to_welcome; dei quali a questa pagina. lv: KopÅ¡ %D datu bÄze ir apmeklÄ“ta %nb_accesses; reizes, %nb_accesses_to_welcome; no tiem ir bijuÅ¡i Å¡inÄ« lappusÄ“. nl: Deze paginas zijn sinds %start_date; reeds %nb_accesses; maal bezocht, waaronder %nb_accesses_to_welcome; maal deze verwelkomingspagina. no: Det har vært %nb_accesses; aksesser, %nb_accesses_to_welcome; av dem til denne siden, siden %start_date;. pl: Baza zostaÅ‚a od %start_date; odwiedzona %nb_accesses; razy (w tym %nb_accesses_to_welcome; razy strona tytuÅ‚owa). pt: Houve %nb_accesses; consultas, das quais %nb_accesses_to_welcome; foram a esta página, desde %start_date;. ro: Au avut loc %nb_accesses; accese din care %nb_accesses_to_welcome; pe aceatsa pagina din %start_date; ru: Ð’Ñего было %nb_accesses; обращений, из них %nb_accesses_to_welcome; к Ñтой Ñтранице, Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ %start_date;. sl: %nb_accesses; dostopov, %nb_accesses_to_welcome; od teh na to stran, od %start_date;. sv: Det har varit %nb_accesses; Ã¥tkomster, %nb_accesses_to_welcome; av dem till den här sidan, sedan %start_date;. zh: å·²ç»æœ‰ %nb_accesses; 次访问数æ®åº“,其中 %nb_accesses_to_welcome; 次访问本主页, 自从 %start_date;。 ])%nl;
    %end;
    %apply;interp([ af: Indien u browser nie die bladsye outomaties byvoeg nie (wat u dwing om die dokument te herlaai), probeer die volgende link. bg: Ðко ВашиÑÑ‚ браузър не актуализира автоматично Ñтраниците, които Ñа модифицирани (принуждавайки Ви да ги презареждате Вие), опитайте Ñе да тръгнете от тази препратка. br: Ma ne nevesa ket ho merdeer ent-gefreek ar pajennoù kemmet (ha dre-se emañ ret deoc'h "nevesaat ar bajenn"), klakit merdeiñ gant al liamm-mañ. ca: Si el vostre navegador no actualitza automàticament les pàgines modificades (obligant-vos a fer actualitzar manualment la pàgina), proveu de navegar des d'aquest altre lloc. cs: Pokud Váš prohlížeÄ neprovádí automaticky obnovu upravených stránek (musíte používat tlaÄítko "obnovit"), zkuste prohlížení pÅ™es tento odkaz. da: Hvis din browser ikke automatisk opdaterer ændrede sider (nødvendiggør genindlæsning af det aktuelle dokument), prøv da at navigere herfra. de: Wenn die geänderten Seiten nicht automatisch aktualisiert werden (man muß ständig im Browser auf "Neu laden" klicken), bitte hier klicken. en: If your browser does not automatically update the modified pages (forcing you to do "reload current document"), try navigating from this link. eo: Se via navigisto ne aÅ­tomate Äisdatigas la modifigitajn paÄojn (se vi devas fari "reÅarÄi kurantan dokumenton"), provu ekde ĉi tiu legilo. es: Si las páginas modificadas no serán actualizadas automaticamente, favor de usar esta conexión: hier. et: Kui Su veebibrauser ei uuenda modifitseeritud lehekülgi automaatselt (pead andma käsu "lae käesolev dokument uuesti"), siis proovi alustada navigeerimist sellest viitest. fi: Mikäli selaimesi ei automaattisesti päivitä muutettuja sivuja (jolloin sinun täytyy "ladata uudelleen nykyinen dokumentti") kokeile tätä linkkiä. fr: Si votre navigateur ne met pas à jour automatiquement les pages modifiées (vous obligeant à faire "actualiser la page"), essayez la navigation à partir de ce lien. is: Ef vafrinn sem þú notar er í vandræðum með að uppfæra síðuna prófaðu þetta. it: Se il vostro navigatore non aggiorna automaticamente le pagine modificate (obbligandovi a fare « aggiorna »), provate a partire da questo collegamento. lv: Ja JÅ«su Interneta caurlÅ«kprogramma automÄtiski nepÄrlÄdÄ“ lappuses pÄ“c veiktajÄm izmaiņÄm (tÄdÄ“jÄdi radot Jums nepiecieÅ¡amÄ«bu "pÄrlÄdÄ“t tekoÅ¡o dokumentu"), tad pamēģiniet uzklikšķinÄt Å¡eit. nl: Indien Uw browser de gewijzigde pagina's niet automatisch toont (maar dit alleen doet na klikken op "Vernieuwen"), probeer het dan eens via deze link. no: Hvis din browser ikke automatisk oppdaterer endrede sider (krever oppfrisking av den aktuelle siden), prøv da Ã¥ navigere herfra. pl: Jeżeli twoja przeglÄ…darka nie odÅ›wieża automatycznie zmienionych stron (zmuszajÄ…c ciÄ™ do ich rÄ™cznego odÅ›wieżania), kliknij tutaj. pt: Se o seu browser não actualiza automaticamente as páginas modificadas (forçando a fazer "reload current document"), tente navegar desde este link. pt-br: Se o seu browser não atualiza automaticamente as páginas modificadas (forçando a fazer "reload current document"), tente navegar desde este link. ro: daca pagina modificata nu este actualizata in mod automat (trebue sa fortezi "reload current document") navigeaza cu acest link sl: ÄŒe vaÅ¡ brskalnik ne more obnavljati strani avtomatiÄno (morate "reload current document"), kliknite tukaj. sv: Om din webbläsare inte automatiskt uppdaterar de modifierade sidorna (vilket tvingar dig att uppdatera sidan hela tiden), försök dÃ¥ att navigera härifrÃ¥n. ])%nl;

    %base_trailer; %copyright; %define;language_link(xx,yy)%sq; xx %end;

    [ af: Taalvoorkeur/Language preference: ar: بإمكانك إختيار لغة أخرى من بين اللغات التالية: bg: Можете да изберете друг език за ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ¶Ð´Ñƒ Ñледните: br: Dibab a c'hellit ur yezh all etre ar re-mañ: ca: Podeu seleccionar una altre llengua, hi ha disponibles les següents: cs: Zvolte jazyk pro prohlížení databáze: da: Du kan vælge fremstilling pÃ¥ et andet sprog blandt de følgende: de: Blick auf: en: View in: eo: Vi povas elekti alian lingvon inter la sekvantajn: es: Ver en: et: Võid valida ka mõne muu keele järgnevatest: fi: Näytä: fr: Afficher en: it: Vista in: is: Þú getur valið milli eftirfarandi tungumála: lv: JÅ«s variet apskatÄ«t datu bÄzi arÄ« citÄs sekojoÅ¡Äs valodÄs: nl: Bekijk in het: no: Du kan velge sidevisning pÃ¥ et annet sprÃ¥k blant følgende: pl: Możesz wybrać inny jÄ™zyk spoÅ›ród nastÄ™pujÄ…cych: ro: poti sa alegi una din urmatoarele limbi pentru afisaj sl: Lahko izberete drug jezik: sv: Du kan välja ett annat sprÃ¥k bland de följande: ] %apply;language_link("Deutsch", "de") %apply;language_link("English", "en") %apply;language_link("Español", "es") %apply;language_link("Français", "fr") %apply;language_link("Italiano", "it") %apply;language_link("Nederlands", "nl") %apply;language_link("Norsk", "no") %apply;language_link("Suomi", "fi") %apply;language_link("Svenska", "sv")
    geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/perso.txt0000660000175200017530000000316612664543647023466 0ustar guillaumeguillaume%doctype; %nn; %if;has_public_name; %if;has_qualifiers;%public_name; %qualifier; %else;%public_name; %surname;%end; %else; %if;has_qualifiers;%first_name; %qualifier; %else;%first_name; %surname;%end; %end; %include.js; %include.css; %base_header; %message_to_wizard; %( Because Safari mobile is just a great browser that can't handle events... %) %( Added a div with an 'empty event' to handle the modify menu. %)
    %import;perso_utils %include.perso_header; %if;(bvar.perso_module_tplnb="" or bvar.perso_module_tplnb=0) %apply;show_templ("perso_module/etat_civil") %apply;show_templ("perso_module/parent_simple") %apply;show_templ("perso_module/union_simple") %apply;show_templ("perso_module/freresoeur_simple") %apply;show_templ("perso_module/relations") %apply;show_templ("perso_module/notes") %apply;show_templ("perso_module/sources") %apply;show_templ("perso_module/arbre_3gen_v_photo") %else; %for;i;0;bvar.perso_module_tplnb; %apply;get_templ(i) %end; %end;

    %if;(evar.opt = "misc")%misc_names;

    %end; %base_trailer; %copyright;

    %( the magic Safari div %) geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/forum.txt0000660000175200017530000002605512664543647023470 0ustar guillaumeguillaume%doctype; %nn; %if;(evar.m = "FORUM_ADD" or evar.m = "FORUM_ADD_OK")%nn; %if;can_post; [*add::message/previous message/previous messages/next message]0%nn; %else; [*incorrect request]%nn; %end; %elseif;(pos = "")[*database forum]%nn; %elseif;(message.subject = "" or message.subject = "-") [*database forum]%nn; %else; %message.subject.cut.50;%nn; %end; %include.css; %base_header; %message_to_wizard; %if;not cancel_links;
    %if;(referer != "") << %end;
    %end; %define;search_form(main)

    %hidden; %if;("main" != "true") %end;

    %end; %if;(evar.m = "FORUM_ADD") %( add a message %) %if;can_post;

    %nn; [*add::message/previous message/previous messages/next message]0%nn;

    %hidden;

    [*ident/email/subject]0
    [*ident/email/subject]1 ([optional])
    [*ident/email/subject]2 ([optional])

    [*message/previous message/previous messages/next message]0
    %let;name;Text%in; %include.accent;
    %if;is_moderated_forum; ([this forum is moderated]) %end;

    %else;

    %nn; [*incorrect request]

    %end; %elseif;(evar.m = "FORUM_ADD_OK") %( visualize a message before post %) %if;can_post;

    %nn; [*add::message/previous message/previous messages/next message]0%nn;

    %if;(message.ident != "" and message.text != "") %message.ident; %if;(message.email != "")%nn; %message.email;%end; %if;(message.subject != "") [*ident/email/subject]2: %message.subject; %end; %if;(message.access = "priv") [*access]: [private] %end; %message.time;
    %message.text.wiki;
    %end;

    %hidden;

    [*ident/email/subject]0
    [*ident/email/subject]1 ([optional])
    [*ident/email/subject]2 ([optional])

    [*message/previous message/previous messages/next message]0
    %sq;
    %let;name;Text%in; %include.accent;
    %if;(message.ident != "" and message.text != "") %if;(wizard or friend) %else; %end; %end; %if;is_moderated_forum; ([this forum is moderated]) %end;

    %else;

    %nn; [*incorrect request]

    %end; %elseif;(pos != "") %( display a message %) %if;(evar.m = "FORUM_SEARCH") %apply;search_form("false") %end; %let;col;%if;message.is_waiting; style="color:red"%end;%in; %if;message.is_waiting;

    %if;is_moderator;

    %hidden;

    %else; [*your message is waiting for validation]%nn; %end;

    %end; %if;(evar.m != "FORUM_VIEW")
    ([view source])
    %end; %message.ident; %if;(message.email != "")%nn; %message.email; %end; %if;supervisor; -%sp; %if;(message.wizard != "") [wizard/wizards/friend/friends/exterior]0:%sp; %sq; %message.wizard;%sp; %end; %if;(message.friend != "") [wizard/wizards/friend/friends/exterior]2: %message.friend;%sp; %end; ... %message.from; %end; %if;(message.subject != "") [*ident/email/subject]2: %message.subject; %end; %if;(message.access = "priv") [*access]: [private] %end; %message.time;

    %if;(evar.m = "FORUM_VIEW") %elseif;(message.wiki = "on")%message.text.wiki; %else;%message.text.nowiki;%end;
    %if;(message.wizard != "" and wizard and user.ident = message.wizard or manitou or supervisor)

    %hidden;
    %hidden;

    %end; %else; %( display message headers %)

    [*database forum]

    %apply;search_form("true") %if;can_post;

    %hidden;

    %end; %let;len;%if;(evar.len != "")%evar.len;%else;100%end;%in; %let;to;%if;(evar.to != "")%evar.to;%else;-1%end;%in; %foreach;message(to, len) %let;col;%if;message.is_waiting; style="color:red"%end;%in; %if;(message.date != message.prev_date) %if;(message.prev_date != "" and message.date.month != message.prev_date.month) %end; %end; %end; %if;(pos != "") %end;
     
    %message.date;
     %if;(message.access = "priv")*%else; %end;   %message.hour; %message.ident.cut.26; %nn; %if;(message.subject = "" or message.subject = "-") ... %message.text.cut.80;%nn; %else; %message.subject.cut.80;%nn; %end;
     
    %nn; [message/previous message/previous messages/next message]2
    %end; %base_trailer; %copyright; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/cousmenu.txt0000660000175200017530000000564012664543647024173 0ustar guillaumeguillaume%doctype; %nn; %apply;a_of_b_gr_eq_lev%with; [*cousins (general term)]%nn; %and; %if;(public_name != "")%public_name;%else;%first_name;%end; %if;(qualifier != "") %qualifier;%end; %sp;%surname; %end; %include.favicon; %include.css; %base_header; %message_to_wizard;

    %nn; %apply;a_of_b_gr_eq_lev%with; [*cousins (general term)]%nn; %and; %if;(public_name != "")%public_name;%else;%first_name;%end; %if;(qualifier != "") %qualifier;%end; %sp;%surname; %if;(alias != "") (%alias;)%end; %end;

    %define;nth_cousins(xx) [*%s cousins:::xx]%nn; %end; %if;not cancel_links;
    %if;(referer != "") << %end;
    %end;
    • %hidden; %if;access_by_key; %if;(occ != "0") %end; %else %end;

    • [*uncles and aunts]
    • %if;has_nephews_or_nieces;
    • [*nephews and nieces]
    • %end;
    %if;(died = "" and (wizard or friend)) %end; %base_trailer; %copyright; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/hed.txt0000660000175200017530000000007112664543647023066 0ustar guillaumeguillaume geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/perso_module/0002770000175200017530000000000012664543647024265 5ustar guillaumeguillaumegeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/perso_module/union_complet.txt0000660000175200017530000001631612664543647027707 0ustar guillaumeguillaume %( Copie des fonctions qui se trouvent dans perso.txt dont la SEULE modification est que la phrase NE commence PAS par une majuscule. %) %define;loc_married_to(sexx, date_place) %if;(sexx = 0 or sexx = 2) %if;are_married;[married%t to:::date_place]0%nn; %elseif;are_not_married;[relationship%t to:::date_place]0%nn; %elseif;are_engaged;[engaged%t to:::date_place]0%nn; %elseif;is_no_sexes_check;[relationship%t to:::date_place]0%nn; %elseif;is_no_mention;date_place [with]%nn; %end; %else; %if;are_married;[married%t to:::date_place]1%nn; %elseif;are_not_married;[relationship%t to:::date_place]1%nn; %elseif;are_engaged;[engaged%t to:::date_place]1%nn; %elseif;is_no_sexes_check;[relationship%t to:::date_place]1%nn; %elseif;is_no_mention;date_place [with]%nn; %end; %end; %end; %define;loc_long_married(xx) %apply;loc_married_to%with;%xx.sex%and; %if;(marriage_place = "") %if;(on_marriage_date = "") %else; %on_marriage_date; %if;wedding_birthday; ([happy birthday to them!])%end; %end; %else; %if;(on_marriage_date = ""), %marriage_place;, %else; %on_marriage_date; %if;wedding_birthday; ([happy birthday to them!])%end; , %marriage_place, %end; %end; %end; %end; %( ATTENTION: on n'utilise pas max_desc_level parce que c'est extremement gourmand sur les gros arbre puisqu'on calcule toute la descendance. Hors on n'a besoin de seulement savoir s'il y a des arrière petits enfant, d'où le code ci-dessous : 1 si on a des enfants 2 si on a des petits enfants 3 si on a des arrières petits endants %) %reset_count; %if;has_children; %incr_count; %foreach;family; %foreach;child; %foreach;family; %if;child.has_children; %if;(count<2) %incr_count; %end; %foreach;child; %foreach;family; %if;child.has_children; %if;(count<3) %incr_count; %end; %end; %end; %end; %end; %end; %end; %end; %end; %if;has_families;

    [*marriage/marriages]1%nn; %if;(count>0 and count>1) , [child/children]1%nn; %if;(count>1 and count>2) , [grandchildren] %else [and::grandchildren] %end; %if;(count>2) [and::great-grandchildren] %end; %else; %if;has_children; [and::child/children]1%end; %end;

      %( On remet les compteurs à zéro et on commence à compter à 1 %) %reset_count; %incr_count; %foreach;family; %apply;li_SD("spouse") %if;(wizard) [modify]%nn; %end; %apply;long_married("self")%sp; %apply;long_display_person("spouse")%sp; %if;spouse.has_parents; ([*parents] : %apply;image_MF("spouse.father","13") %apply;short_display_person("spouse.father")  &  %apply;image_MF("spouse.mother","13") %apply;short_display_person("spouse.mother"))%nn; %end; %if;has_witnesses;  ([witness/witnesses]w : %foreach;witness; %if;not is_first;, %end; %apply;image_MF("witness","13") %apply;short_display_person("witness")%nl; %end;) %end; %if;((wizard or friend or bvar.no_note_for_visitor="" or bvar.no_note_for_visitor="no") and has_comment) ([see] [note/notes]0) %incr_count; %end; %if;are_divorced;, [divorced]0%divorce_date;%sp;%end; %if;are_separated;, [separated]0%sp;%end; %if;has_children;[having as children]0 %( On sauvegarde l'ancienne valeur de count %) %let;prev_count;%count;%in;
        %foreach;child; %apply;li_SDC("child") %apply;image_MF("child","13") %apply;short_display_person("child") %if;child.has_families; %foreach;child.family; %if;(family_cnt!=1) %sp; %child;%child.title;%child.dates; %end;%sp;  %apply;loc_long_married("child") %apply;short_display_person("spouse") %if;(nb_children!=0)  [having as children]0
          %foreach;child; %apply;li_SDC("child") %apply;image_MF("child","11") %apply;short_display_person("child") %if;child.has_families; %foreach;child.family; %if;(family_cnt!=1) %child;%child.title;%child.dates;%nl; %end;  %apply;loc_long_married("child") %apply;short_display_person("spouse") %if;(nb_children!=0)  [having as children]0 :
          %nn;
            %foreach;child; %apply;li_SDC("child") %apply;image_MF("child","10") %apply;short_display_person("child") %end;
          %end; %end; %end; %end;
        %else;
        %end; %end; %end; %end;
      %( On rétablie l'ancienne valeur de count %) %apply;init_count(prev_count) %end; %if;(evar.opt = "from" and wizard)(%origin_file;)%nl;%end; %end;
    %end; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/perso_module/famille.txt0000660000175200017530000001616312664543647026445 0ustar guillaumeguillaume %define;not_married_no_descendants() [not married], [no descendants] %end; %( définition affichage de la puce d'un individu en compte tenu de ses éventuels enfants - aucune union, donc aucun enfant => cercle - au moins une union avec en tout aucun enfant => disque - au moins une union avec au moins un enfant => carré %) %define;type_puce_desc(nnn)
  • %end; %( définition affichage de la puce d'un individu en compte tenu de ses éventuels parents - aucun parent connu => cercle - au moins un parent connu => disque - les deux parents connus => carré %) %define;type_puce_asc(nnn) %if;nnn.has_parents; %if;(nnn.father != "? ?" and nnn.mother != "? ?" and nnn.mother != "de l'une de ses épouses")
  • %else;
  • %end; %else;
  • %end; %end; %define;access_ind(nnn) %if;(cancel_links or nnn.is_restricted) %nnn; %else; %nnn;%nnn.title; %end; %nnn.dates;%nl; %end; %define;type_wedding() %if;are_married; %if;(nb_children != 0) [married] %else; [married] %end; %elseif;are_not_married; [not married] %elseif;are_engaged; [engaged] %elseif;is_no_sexes_check; [relationship] %elseif;is_no_mention; [with] %end; %end; %( ATTENTION nb_families ne marche que pour la personne et les boucles sur enfants. Pour les relations (him, her et related) cela donne le nb_families de la personne d'où l'affichage sans nb d'enfants si la personne n'a qu'un mariage %) %define;detail_wedding() %apply;type_wedding() %if;(nb_families != 1)%family_cnt;%end; %if(family.marriage_date.year != "")(%family.marriage_date.year;)%end; %if;(nb_children != 0)
    %nb_children; %if;(nb_children=1)[child/children]0 %else;[child/children]1 %end; %end; %end; %define;desc_seq(yyy)
      %foreach;child; %( table pour les des enfants %)
      %apply;type_puce_desc("child") %apply;image_MF("child","11") %apply;display_sosa("child") %if;("yyy" = "parhigh") %( comme le code est utilisable dans la descendance des grands parents on teste father/mother, pour la descendance des parents on est tjrs dans else %) %if;(child.access = father.access or child.access = mother.access) %( ici on met les parents en gras %) %child;%child.title;%child.dates; %else; %apply;access_ind("child") %end; %else; %apply;access_ind("child") %end; %if;child.has_families; %foreach;child.family; %if;(family_cnt != 1), %end; %apply;detail_wedding() %end; %else; %apply;not_married_no_descendants() %end;
      %end;
    %end; %define;descendancy_grand_fathers(mmm,yyy) %foreach;mmm.father.family;
    %apply;type_puce_asc("mmm.father") %apply;image_MF("mmm.father","13") %apply;display_sosa("mmm.father") %if;(spouse.access = mmm.mother.access) %apply;access_ind("mmm.father") %else; %mmm.father;%mmm.father.title;%mmm.father.dates;%nl; %end; %apply;type_wedding() %if(family.marriage_date.year != "")(%family.marriage_date.year;)%end; %apply;type_puce_asc("spouse") %apply;image_MF("spouse","13") %apply;display_sosa("spouse") %if;(spouse.access = self.access) %spouse;%spouse.title;%spouse.dates; %apply;detail_wedding()
    %else; %apply;access_ind("spouse") %apply;desc_seq("yyy") %end; %end; %end; %define;descendancy_grand_mothers(mmm,yyy) %foreach;mmm.mother.family; %if;(spouse.access != mmm.father.access)
    %apply;type_puce_asc("mmm.mother") %apply;image_MF("mmm.mother","13") %apply;display_sosa("mmm.mother") %mmm.mother;%mmm.mother.title;%mmm.mother.dates;%nl; %apply;type_puce_asc("spouse") %apply;type_wedding() %if(family.marriage_date.year != "")(%family.marriage_date.year;)%end; %apply;image_MF("spouse","13") %apply;display_sosa("spouse") %if;(spouse.access = self.access) %spouse;%spouse.title;%spouse.dates; %apply;detail_wedding()
    %else; %apply;access_ind("spouse") %apply;desc_seq("yyy") %end; %end; %end; %end; %if;(not (father.has_parents and mother.has_parents)) %if;father.has_parents;

    [*paternal grand-parents], [uncles and aunts]1

    %elseif;mother.has_parents;

    [*maternal grand-parents], [uncles and aunts]1

    %end; %end; %if;father.has_parents; %end; %if;(not father.has_parents) %end;
    %if;mother.has_parents;

    [*paternal grand-parents], [uncles and aunts]1

    %end;
      %apply;descendancy_grand_fathers("father","parhigh") %apply;descendancy_grand_mothers("father","parhigh")
    %if;mother.has_parents; %if;father.has_parents;

    [*maternal grand-parents], [uncles and aunts]1

    %end;
      %apply;descendancy_grand_fathers("mother","parhigh") %apply;descendancy_grand_mothers("mother","parhigh")
    %end;
    geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/perso_module/parent_complet.txt0000660000175200017530000000142112664543647030037 0ustar guillaumeguillaume %if;has_parents;

    [*parents]

      %apply;li_SD("father") %apply;long_display_person("father")%sp; %foreach;father.family; %if;(spouse.access=mother.access) %apply;long_married("father") %end; %end; %apply;li_SD("mother") %apply;long_display_person("mother")%sp; %foreach;father.family; %if;(spouse.access=mother.access) %if(are_divorced or are_separated) %nn; %if;are_divorced;[divorced]0%divorce_date;%end; %if;are_separated;[separated]0%end; %end; %end; %end;
    %end; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/perso_module/parent_evolue.txt0000660000175200017530000000065712664543647027705 0ustar guillaumeguillaume %if;has_parents;

    [*parents]

      %apply;li_SD("father") %apply;short_display_person("father")%sp; %if;father.has_occupation;(%apply;capitalize(father.occupation))%nl;%end; %apply;li_SD("mother") %apply;short_display_person("mother")%sp; %if;mother.has_occupation;(%apply;capitalize(mother.occupation))%nl;%end;
    %end; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/perso_module/union_photo.txt0000660000175200017530000000474412664543647027377 0ustar guillaumeguillaume %if;has_families;

    [*marriage/marriages]1 %if;has_children; [and::child/children]1%end;

      %( On remet les compteurs à zéro et on commence à compter à 1 %) %reset_count; %incr_count; %foreach;family; %apply;li_SD("spouse") %if;spouse.has_image;
      [image/images]0 %end; %if;(wizard) [modify]%nn; %end; %apply;long_married("self")%sp; %apply;short_display_person("spouse")%sp; %if;spouse.has_parents; ([*parents] : %apply;short_display_person("spouse.father")  &  %apply;short_display_person("spouse.mother"))%nn; %end; %if;has_witnesses;  ([witness/witnesses]w : %foreach;witness; %if;not is_first;, %end; %apply;short_display_person("witness")%nl; %end;) %end; %if;((wizard or friend or bvar.no_note_for_visitor="" or bvar.no_note_for_visitor="no") and has_comment) ([see] [note/notes]0) %incr_count; %end; %if;are_divorced;, [divorced]0%divorce_date;%sp,%end; %if;are_separated;, [separated]0%sp;%end; %if;(spouse.has_image and not has_children);
      %end; %if;has_children;[having as children]0 %if;(spouse.has_image); %end; %( On sauvegarde l'ancienne valeur de count %) %let;prev_count;%count;%in;
        %foreach;child; %apply;li_SDC("child") %apply;short_display_person("child") %end;
      %( On rétablie l'ancienne valeur de count %) %apply;init_count(prev_count) %end; %if;(evar.opt = "from" and wizard)(%origin_file;)%nl;%end; %end;
    %end; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/perso_module/sources.txt0000660000175200017530000000055012664543647026510 0ustar guillaumeguillaume %if;(has_sources or has_linked_page.BIBLIO)

    [*source/sources]1

      %foreach;source;
    • %apply;capitalize(source_type): %source;
    • %end;
    %if;has_linked_page.BIBLIO; - [*bibliography]

    %apply;capitalize(linked_page.BIBLIO)

    %end; %end; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/perso_module/freresoeur_simple.txt0000660000175200017530000000563412664543647030567 0ustar guillaumeguillaume %if;has_siblings;

    %if;(bvar.full_siblings="yes") [*full siblings] %else; [*siblings] %end;

      %let;cur;%index;%in; %foreach;father.child; %if;(bvar.full_siblings="yes") %apply;short_display_siblings() %else; %if;(index!=cur) %apply;short_display_siblings() %end; %end; %end;
    %end; %if;has_parents; %if;(father.nb_families>1 or mother.nb_families>1) %reset_count; %foreach;father.family; %if;(spouse.index!=mother.index) %if;(nb_children>0)%incr_count;%end; %end; %end; %let;half_father;%count;%in; %reset_count; %foreach;mother.family; %if;(spouse.index!=father.index) %if;(nb_children>0)%incr_count;%end; %end; %end; %let;half_mother;%count;%in; %if;(half_father != 0 or half_mother != 0)

    [*half siblings]

    %if;(half_father != 0) %end; %if;(half_mother != 0) %end; %if;(father.nb_families > 1 and half_father != 0) %end; %if;(mother.nb_families > 1 and half_mother != 0) %end;
    [*on %s's side:::] %apply;short_display_person("father") [*on %s's side:::] %apply;short_display_person("mother")
    %foreach;father.family; %if;(spouse.index!=mother.index and half_father!=0 and spouse.has_children)
      %apply;li_SD("spouse") [with] %apply;short_display_person("spouse") %if;has_children;
        %foreach;child; %apply;short_display_siblings() %end;
      %end;
    %end; %end;
    %foreach;mother.family; %if;(spouse.index!=father.index and half_mother!=0 and spouse.has_children)
      %apply;li_SD("spouse") [with] %apply;short_display_person("spouse") %if;has_children;
        %foreach;child; %apply;short_display_siblings() %end;
      %end;
    %end; %end;
    %end; %end; %end; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/perso_module/arbre_5gen_h.txt0000660000175200017530000004621012664543647027350 0ustar guillaumeguillaume %define;access_ind(nnn) %if;(cancel_links or nnn.is_restricted) %nnn; %else; %nnn;%nnn.title; %end; %nnn.dates;%nl; %end; %define;access(num,nnn) num_ %apply;display_sosa("nnn") %if;("num" = 1) %self;%nnn.title;%nnn.dates; %else; %apply;access_ind("nnn") %end; %end; %if;has_parents;

    [*preview family tree]

    %if;father.has_parents; %if;father.father.has_parents; %if;father.father.father.has_parents;                                                                                     _____| %apply;access("16","father.father.father.father") %end;                                                         _____| %apply;access("8","father.father.father") %if;father.father.father.has_parents;                                                        /                            Â¯Â¯Â¯Â¯Â¯| %apply;access("17","father.father.father.mother") %else                                                        / %end; %end; %end; %if;father.has_parents;                            _____| %apply;access("4","father.father") %end; %if;father.has_parents; %if;father.father.has_parents; %if;father.father.mother.has_parents;                           /                           \                             _____| %apply;access("18","father.father.mother.father") %else                           /                           \ %end;                          /                             Â¯Â¯Â¯Â¯Â¯| %apply;access("9","father.father.mother") %if;father.father.mother.has_parents;                         /                                                           Â¯Â¯Â¯Â¯Â¯| %apply;access("19","father.father.mother.mother") %else                         / %end; %else                           / %end; %end; |%apply;access("2","father") %if;father.has_parents; %if;father.mother.has_parents; %if;father.mother.father.has_parents; |                       \                                                           _____| %apply;access("20","father.mother.father.father") %else |                       \ %end; |                        \                              _____| %apply;access("10","father.mother.father") %if;father.mother.father.has_parents; |                         \                            /                            Â¯Â¯Â¯Â¯Â¯| %apply;access("21","father.mother.father.mother") %else |                         \                            / %end; %else |                         \ %end; %end; %if;father.has_parents; |                          Â¯Â¯Â¯Â¯Â¯| %apply;access("5","father.mother") %end; %if;father.has_parents; %if;father.mother.has_parents; %if;father.mother.mother.has_parents; |                                                     \                             _____| %apply;access("22","father.mother.mother.father") %else |                                                     \ %end; |                                                      Â¯Â¯Â¯Â¯Â¯| %apply;access("11","father.mother.mother") %if;father.mother.mother.has_parents; |                                                                                   Â¯Â¯Â¯Â¯Â¯| %apply;access("23","father.mother.mother.mother") %end; %end; %end; |--%apply;access("1","self") %if;mother.has_parents; %if;mother.father.has_parents; %if;mother.father.father.has_parents; |                                                                                   _____| %apply;access("24","mother.father.father.father") %end; |                                                       _____| %apply;access("12","mother.father.father") %if;mother.father.father.has_parents; |                                                      /                            Â¯Â¯Â¯Â¯Â¯| %apply;access("25","mother.father.father.mother") %else |                                                      / %end; %end; %end; %if;mother.has_parents; |                          _____| %apply;access("6","mother.father") %end; %if;mother.has_parents; %if;mother.father.has_parents; %if;mother.father.mother.has_parents; |                         /                           \                             _____| %apply;access("26","mother.father.mother.father") %else |                         /                           \ %end; |                        /                             Â¯Â¯Â¯Â¯Â¯| %apply;access("13","mother.father.mother") %if;mother.father.mother.has_parents; |                       /                                                           Â¯Â¯Â¯Â¯Â¯| %apply;access("27","mother.father.mother.mother") %end; %else |                        / %end; %end; |%apply;access("3","mother") %if;mother.has_parents; %if;mother.mother.has_parents; %if;mother.mother.father.has_parents;                         \                                                           _____| %apply;access("28","mother.mother.father.father") %else                         \ %end;                          \                              _____| %apply;access("14","mother.mother.father") %if;mother.mother.father.has_parents;                           \                            /                            Â¯Â¯Â¯Â¯Â¯| %apply;access("29","mother.mother.father.mother") %else                           \                            / %end; %else                           \ %end; %end; %if;mother.has_parents;                            Â¯Â¯Â¯Â¯Â¯| %apply;access("7","mother.mother") %end; %if;mother.has_parents; %if;mother.mother.has_parents; %if;mother.mother.mother.has_parents;                                                        \                            _____| %apply;access("30","mother.mother.mother.father") %else                                                        \ %end;                                                         Â¯Â¯Â¯Â¯Â¯| %apply;access("15","mother.mother.mother") %if;mother.mother.mother.has_parents;                                                                                     Â¯Â¯Â¯Â¯Â¯| %apply;access("31","mother.mother.mother.mother") %end; %end; %end;
    %end; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/perso_module/parent_photo.txt0000660000175200017530000000316512664543647027534 0ustar guillaumeguillaume %if;has_parents;

    [*parents]

    %if;father.has_image; [image/images]0 %else;  %end;
      %apply;li_SD("father") %apply;short_display_person("father")%sp; %if;father.has_occupation;
    • %apply;capitalize(father.occupation)
    • %nl; %end;
    %if;mother.has_image; [image/images]0 %else;  %end;
      %apply;li_SD("mother") %apply;short_display_person("mother")%sp; %if;mother.has_occupation;
    • %apply;capitalize(mother.occupation)
    • %nl; %end;
    %end; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/perso_module/union_simple.txt0000660000175200017530000000350512664543647027531 0ustar guillaumeguillaume %if;has_families;

    [*marriage/marriages]1 %if;has_children; [and::child/children]1%end;

      %( On remet les compteurs à zéro et on commence à compter à 1 %) %reset_count; %incr_count; %foreach;family; %apply;li_SD("spouse") %if;(wizard) [modify]%nn; %end; %apply;long_married("self")%sp; %apply;short_display_person("spouse")%sp; %if;has_witnesses;  ([witness/witnesses]w : %foreach;witness; %if;not is_first;, %end; %apply;short_display_person("witness")%nl; %end;) %end; %if;((wizard or friend or bvar.no_note_for_visitor="" or bvar.no_note_for_visitor="no") and has_comment) ([see] [note/notes]0) %incr_count; %end; %if;are_divorced;, [divorced]0%divorce_date;%sp;%end; %if;are_separated;, [separated]0%sp;%end; %if;has_children;[having as children]0 %( On sauvegarde l'ancienne valeur de count %) %let;prev_count;%count;%in;
        %foreach;child; %apply;li_SDC("child") %apply;image_MF("child","13") %apply;short_display_person("child") %end;
      %( On rétablie l'ancienne valeur de count %) %apply;init_count(prev_count) %end; %if;(evar.opt = "from" and wizard)(%origin_file;)%nl;%end; %end;
    %end; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/perso_module/parent_simple.txt0000660000175200017530000000041712664543647027671 0ustar guillaumeguillaume %if;has_parents;

    [*parents]

      %apply;li_SD("father") %apply;short_display_person("father")%sp; %apply;li_SD("mother") %apply;short_display_person("mother")%sp;
    %end; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/perso_module/arbre_3gen_v.txt0000660000175200017530000000761312664543647027370 0ustar guillaumeguillaume %if;has_parents;

    [*preview family tree]

    %if;has_parents; %if;father.has_parents; %else; %end; %if;mother.has_parents; %else; %end; %if;father.has_parents; %end; %if;mother.has_parents; %end; %if;father.has_parents; %end; %if;mother.has_parents; %end; %if;father.has_parents; %end; %if;mother.has_parents; %end; %end;
    %nn; %apply;short_display_person("father.father")   %nn; %apply;short_display_person("father.mother")  %nn; %apply;short_display_person("mother.father")   %nn; %apply;short_display_person("mother.mother") 
    | || |






    ||
    %nn; %apply;short_display_person("father")   %nn; %apply;short_display_person("mother")
    | |



    |
    %nn; %apply;short_display_person("self")
    %end; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/perso_module/arbre_4gen_v.txt0000660000175200017530000002435512664543647027373 0ustar guillaumeguillaume %if;has_parents;

    [*preview family tree]

    %if;(has_parents and (father.has_parents or mother.has_parents)) %( line 1 : up to 8 great-grandparents %) %if;(father.has_parents and father.father.has_parents) %else; %end; %if;(father.has_parents and father.mother.has_parents) %else; %end; %if;(mother.has_parents and mother.father.has_parents) %else; %end; %if;(mother.has_parents and mother.mother.has_parents) %else; %end; %( line 2 : up to 8 vertical lines with number %) %if;(father.has_parents and father.father.has_parents) %end; %if;(father.has_parents and father.mother.has_parents) %end; %if;(mother.has_parents and mother.father.has_parents) %end; %if;(mother.has_parents and mother.mother.has_parents) %end; %( line 3: up to 4 horizontal lines %) %if;(father.has_parents and father.father.has_parents) %end; %if;(father.has_parents and father.mother.has_parents) %end; %if;(mother.has_parents and mother.father.has_parents) %end; %if;(mother.has_parents and mother.mother.has_parents) %end; %( line 4 : up to 4 vertical lines %) %if;(father.has_parents and father.father.has_parents) %end; %if;(father.has_parents and father.mother.has_parents) %end; %if;(mother.has_parents and mother.father.has_parents) %end; %if;(mother.has_parents and mother.mother.has_parents) %end; %end; %if;has_parents; %( line 5 : up to 4 grandparents %) %if;father.has_parents; %else; %end; %if;mother.has_parents; %else; %end; %( line 6 : up to 4 vertical lines with number %) %if;father.has_parents; %end; %if;mother.has_parents; %end; %( line 7 : up to 2 horizontal lines %) %if;father.has_parents; %end; %if;mother.has_parents; %end; %( line 8 : up to 2 vertical lines %) %if;father.has_parents; %end; %if;mother.has_parents; %end; %end; %( line 9 : 2 parents %) %( line 10 : 2 vertical lines with number %) %( line 11 : 2 horizontal lines %) %( line 12 : 1 vertical line %) %( line 13 : 1 person %)
    %nn; %apply;short_display_person("father.father.father")   %nn; %apply;short_display_person("father.father.mother")  %nn; %apply;short_display_person("father.mother.father")   %nn; %apply;short_display_person("father.mother.mother")  %nn; %apply;short_display_person("mother.father.father")   %nn; %apply;short_display_person("mother.father.mother")  %nn; %apply;short_display_person("mother.mother.father")   %nn; %apply;short_display_person("mother.mother.mother") 
    |8   |9 |10   |11 |12   |13 |14   |15
    %nn;

    %nn;
     %nn;

    %nn;
     %nn;

    %nn;
     %nn;

    %nn;
    | | | |
    %nn; %apply;short_display_person("father.father")   %nn; %apply;short_display_person("father.mother")  %nn; %apply;short_display_person("mother.father")   %nn; %apply;short_display_person("mother.mother") 
    |4   |5 |6   |7
    %nn;

    %nn;
     %nn;

    %nn;
    | |
    %nn; %apply;short_display_person("father")   %nn; %apply;short_display_person("mother")
    |2   |3
    %nn;

    %nn;
    |
    %nn; %apply;short_display_person("self")
    %end; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/perso_module/notes.txt0000660000175200017530000000314412664543647026157 0ustar guillaumeguillaume %if;((wizard or friend or bvar.no_note_for_visitor = "" or bvar.no_note_for_visitor = "no") and (has_notes or has_linked_page.BNOTE or has_linked_page.NOTE))

    [*note/notes]1

    [*individual notes]
    %if;(has_linked_page.BNOTE)

    %apply;capitalize(linked_page.BNOTE).

    %end; %notes; %if;(has_linked_page.NOTE)

    %apply;capitalize(linked_page.NOTE).

    %end;
    %end;

    %if;has_families; %( On remet les compteurs à zéro et on commence à compter à 1 %) %reset_count; %incr_count; %foreach;family; %if;((wizard or friend or bvar.no_note_for_visitor="" or bvar.no_note_for_visitor="no") and has_comment) %if;((count=1) and ((wizard or friend or bvar.no_note_for_visitor = "" or bvar.no_note_for_visitor = "no") and (has_notes or has_linked_page.BNOTE or has_linked_page.NOTE)))
    [*marriage notes]0
    %elseif;(count=1)

    [*marriage notes]0

    %end;
    [*marriage with] %spouse.first_name; %spouse.surname; ↑ :
    %comment;
    %incr_count; %end; %end; %end; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/perso_module/union_evolue.txt0000660000175200017530000000706412664543647027543 0ustar guillaumeguillaume %( Copie des fonctions qui se trouvent dans perso.txt dont la SEULE modification est que la phrase NE commence PAS par une majuscule. %) %define;loc_married_to(sexx, date) %if;(sexx = 0 or sexx = 2) %if;are_married;[married%t to:::date]0%nn; %elseif;are_not_married;[relationship%t to:::date]0%nn; %elseif;are_engaged;[engaged%t to:::date]0%nn; %elseif;is_no_sexes_check;[relationship%t to:::date]0%nn; %elseif;is_no_mention;date [with]%nn; %end; %else; %if;are_married;[married%t to:::date]1%nn; %elseif;are_not_married;[relationship%t to:::date]1%nn; %elseif;are_engaged;[engaged%t to:::date]1%nn; %elseif;is_no_sexes_check;[relationship%t to:::date]1%nn; %elseif;is_no_mention;date [with]%nn; %end; %end; %end; %define;loc_long_married(xx) %apply;loc_married_to%with;%xx.sex%and; %if;(on_marriage_date = "") %else; %on_marriage_date; %if;wedding_birthday; ([happy birthday to them!])%end; %end; %end; %end; %if;has_families;

    [*marriage/marriages]1 %if;has_children; [and::child/children]1%end;

      %( On remet les compteurs à zéro et on commence à compter à 1 %) %reset_count; %incr_count; %foreach;family; %apply;li_SD("spouse") %if;(wizard) [modify]%nn; %end; %apply;long_married("self")%sp; %apply;short_display_person("spouse")%sp; %if;spouse.has_parents; ([*parents] : %apply;short_display_person("spouse.father")  &  %apply;short_display_person("spouse.mother"))%nn; %end; %if;has_witnesses;  ([witness/witnesses]w : %foreach;witness; %if;not is_first;, %end; %apply;short_display_person("witness")%nl; %end;) %end; %if;((wizard or friend or bvar.no_note_for_visitor="" or bvar.no_note_for_visitor="no") and has_comment) ([see] [note/notes]0) %incr_count; %end; %if;are_divorced;, [divorced]0%divorce_date;%sp;%end; %if;are_separated;, [separated]0%sp;%end; %if;has_children;[having as children]0 %( On sauvegarde l'ancienne valeur de count %) %let;prev_count;%count;%in;
        %foreach;child; %apply;li_SDC("child") %apply;image_MF("child","13") %apply;short_display_person("child") %if;child.has_families; %foreach;child.family; %if;(family_cnt!=1) %sp; %child;%child.title;%child.dates; %end;%sp; %sp;%apply;loc_long_married("child")%sp; %apply;short_display_person("spouse") %end; %end; %end;
      %( On rétablie l'ancienne valeur de count %) %apply;init_count(prev_count) %end; %if;(evar.opt = "from" and wizard)(%origin_file;)%nl;%end; %end;
    %end; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/perso_module/relations.txt0000660000175200017530000000324512664543647027031 0ustar guillaumeguillaume %if;has_relations;

    [*relation/relations]1

      %foreach;relation; %if;(has_relation_him and has_relation_her)
    • %apply;capitalize(relation_type) :%nl;
        %apply;li_SDC("relation_him") %apply;image_MF("relation_him","13") %apply;short_display_person("relation_him") %apply;li_SDC("relation_her") %apply;image_MF("relation_her","13") %apply;short_display_person("relation_her")
    • %elseif;has_relation_him; %apply;li_SDC("relation_him")%apply;capitalize(relation_type) :%sp; %apply;image_MF("relation_him","13") %apply;short_display_person("relation_him") %elseif;has_relation_her; %apply;li_SDC("relation_her")%apply;capitalize(relation_type) :%sp; %apply;image_MF("relation_her","13") %apply;short_display_person("relation_her") %end; %end; %foreach;related; %apply;li_SDC("related")%apply;capitalize(related_type) :%sp; %apply;image_MF("related","13") %apply;short_display_person("related") %end; %foreach;witness_relation;
    • %nn; %if;(witness_relation.marriage_date.year>0) %witness_relation.marriage_date.year; : %end; %apply;witness_relation%with; %apply;short_display_person("witness_relation.father")%and; %apply;short_display_person("witness_relation.mother") %end;
    • %nl; %end;
    %end; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/perso_module/etat_civil.txt0000660000175200017530000000437712664543647027163 0ustar guillaumeguillaume%if;(has_birth_date or has_birth_place or has_baptism_date or has_baptism_place or is_dead or is_buried or is_cremated or (has_consanguinity and bvar.show_consang!="no") or has_occupation or has_linked_page.OCCU !="") %if;has_image;
    [image/images]0 %end;
      %if;has_birth_date;
    • %apply;capitalize(nth([born],sex)) %on_birth_date; %if;birthday; ([happy birthday to you!])%end; %if;has_birth_place; - %birth_place;%end;
    • %nl; %if;computable_age;
    • [*age] : %age;
    • %end; %else; %if;has_birth_place;
    • %apply;capitalize(nth([born],sex)) - %birth_place;
    • %nl; %end; %end; %if;has_baptism_date;
    • %apply;capitalize(nth([baptized],sex)) %on_baptism_date; %if;has_baptism_place; - %baptism_place;%end;
    • %nl; %else; %if;has_baptism_place;
    • %apply;capitalize(nth([baptized],sex)) - %baptism_place;
    • %nl; %end; %end; %if;is_dead;
    • %apply;capitalize(died) %if;has_death_date; %on_death_date;%end; %if;has_death_place; - %death_place;%end; %if;(has_linked_page.DEATH !="") %linked_page.DEATH;%end; %if;computable_death_age;, [age at death:] %death_age;%end;
    • %nl; %end; %if;is_buried;
    • %apply;capitalize(nth([buried],sex)) %if;has_burial_date; %on_burial_date;%end; %if;has_burial_place; - %burial_place;%end;
    • %nl; %end; %if;is_cremated;
    • %apply;capitalize(nth([cremated],sex)) %if;has_cremation_date; %on_cremation_date;%end; %if;has_cremation_place; - %cremation_place;%end;
    • %nl; %end; %if;has_occupation;
    • %apply;capitalize(occupation)
    • %nl; %end; %if;(has_linked_page.OCCU)
    • %apply;capitalize(linked_page.OCCU)
    • %nl; %end; %if;(has_consanguinity and bvar.show_consang!="no")
    • [*consanguinity] : %consanguinity;
    • %nl; %end;
    %if;has_image;
    %end; %end; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/perso_module/arbre_3gen_v_photo.txt0000660000175200017530000001263512664543647030601 0ustar guillaumeguillaume %if;has_parents;

    [*preview family tree]

    %if;has_parents; %if;father.has_parents; %else; %end; %if;mother.has_parents; %else; %end; %if;father.has_parents; %end; %if;mother.has_parents; %end; %if;father.has_parents; %end; %if;mother.has_parents; %end; %if;father.has_parents; %end; %if;mother.has_parents; %end; %end;
    %nn; %if;father.father.has_image; [image/images]0 %end; %apply;short_display_person("father.father")   %nn; %if;father.mother.has_image; [image/images]0 %end; %apply;short_display_person("father.mother")  %nn; %if;mother.father.has_image; [image/images]0 %end; %apply;short_display_person("mother.father")   %nn; %if;mother.mother.has_image; [image/images]0 %end; %apply;short_display_person("mother.mother") 
    | || |






    ||
    %nn; %if;father.has_image; [image/images]0 %end; %apply;short_display_person("father")   %nn; %if;mother.has_image; [image/images]0 %end; %apply;short_display_person("mother")
    | |



    |
    %nn; %if;self.has_image; [image/images]0 %end; %apply;short_display_person("self")
    %end; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/perso_module/freresoeur_complet.txt0000660000175200017530000000562412664543647030740 0ustar guillaumeguillaume %if;has_siblings;

    %if;(bvar.full_siblings="yes") [*full siblings] %else; [*siblings] %end;

      %let;cur;%index;%in; %foreach;father.child; %if;(bvar.full_siblings="yes") %apply;long_display_siblings() %else; %if;(index!=cur) %apply;long_display_siblings() %end; %end; %end;
    %end; %if;has_parents; %if;(father.nb_families>1 or mother.nb_families>1) %reset_count; %foreach;father.family; %if;(spouse.index!=mother.index) %if;(nb_children>0)%incr_count;%end; %end; %end; %let;half_father;%count;%in; %reset_count; %foreach;mother.family; %if;(spouse.index!=father.index) %if;(nb_children>0)%incr_count;%end; %end; %end; %let;half_mother;%count;%in; %if;(half_father != 0 or half_mother != 0)

    [*half siblings]

    %if;(half_father != 0) %end; %if;(half_mother != 0) %end; %if;(father.nb_families > 1 and half_father != 0) %end; %if;(mother.nb_families > 1 and half_mother != 0) %end;
    [*on %s's side:::] %apply;long_display_person("father") [*on %s's side:::] %apply;long_display_person("mother")
    %foreach;father.family; %if;(spouse.index!=mother.index and half_father!=0 and spouse.has_children)
      %apply;li_SD("spouse") [with] %apply;long_display_person("spouse") %if;has_children;
        %foreach;child; %apply;long_display_siblings() %end;
      %end;
    %end; %end;
    %foreach;mother.family; %if;(spouse.index!=father.index and half_mother!=0 and spouse.has_children)
      %apply;li_SD("spouse") [with] %apply;long_display_person("spouse") %if;has_children;
        %foreach;child; %apply;long_display_siblings() %end;
      %end;
    %end; %end;
    %end; %end; %end; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/random_css.txt0000660000175200017530000000633112664543647024463 0ustar guillaumeguillaume/* $Id: random_css.txt,v 1.10 2007-01-19 01:53:16 ddr Exp $ */ /* Copyright (c) 2006-2007 INRIA */ %define;bright_pastel_color() %let;h;%random.255;%in; %let;s;%random.64;%in; %let;v;%expr(192 + random.64)%in; rgb(%apply;red_of_hsv(h, s, v),%apply;green_of_hsv(h, s, v),%sq; %apply;blue_of_hsv(h, s, v))%sq; %end; %define;dark_col() %let;h;%random.255;%in; %let;s;255%in; %let;v;160%in; rgb(%apply;red_of_hsv(h, s, v),%apply;green_of_hsv(h, s, v),%sq; %apply;blue_of_hsv(h, s, v))%sq; %end; %random.init; %let;h;%random.255;%in; %let;s;%random.128;%in; %let;v;%expr(160 + random.96)%in; %let;bg; rgb(%apply;red_of_hsv(h, s, v),%apply;green_of_hsv(h, s, v),%sq; %apply;blue_of_hsv(h, s, v))%sq; %in; %let;h;%expr(h - 40 + random.80)%in; %let;v;%expr(v + 10 + random.20)%in; %let;bg2; rgb(%apply;red_of_hsv(h, s, v),%apply;green_of_hsv(h, s, v),%sq; %apply;blue_of_hsv(h, s, v))%sq; %in; #user-info { float: %right;; padding: 10px } %let;fs;%random.3;%in; %let;ph;%random.3;%in; %let;pv;%random.3;%in; #title { text-align: %sq; %if;(ph = 0)%left;%elseif;(ph = 1)%right;%else;center%end;;%sp; vertical-align: %sq; %if;(ph != 1 and pv = 0)top%sq; %elseif;(pv = 1)bottom%sq; %else;middle%end } #title { %sq; font-family:%sp; %let;f;%random.8;%in; %if;(f = 0)Times New Roman, serif%sq; %elseif;(f = 1)Trebuchet MS, sans-serif%sq; %elseif;(f = 2)Arial, Helvetica, sans-serif%sq; %elseif;(f = 3)Verdana, Arial, Helvetica, sans-serif%sq; %elseif;(f = 4)Courier New, Courier, monospace%sq; %elseif;(f = 5)Georgia, serif%sq; %elseif;(f = 6)Tahoma, sans-serif%sq; %elseif;(f = 7)Palatino, serif%sq; %end;;%sp; font-style: %if;(random.4 = 0)italic%else;normal%end; } #title { %sq; font-variant: %if;(random.5 = 0)small-caps%else;normal%end;;%sp; font-transform: %if;(random.10 = 0)uppercase%else;none%end;;%sp; font-weight: %if;(random.3 = 0)bold%else;normal%end; } #title { color: %apply;dark_col(); font-size: %expr;(80 + random.80)%% } body { margin: 0; background: %bg2;; color: %apply;dark_col() } :link { color: %apply;dark_col() } :visited { color: %apply;dark_col() } body {%sp; font-family:%sp; %let;f;%random.8;%in; %if;(f = 0)Times New Roman, serif%sq; %elseif;(f = 1)Trebuchet MS, sans-serif%sq; %elseif;(f = 2)Arial, Helvetica, sans-serif%sq; %elseif;(f = 3)Verdana, Arial, Helvetica, sans-serif%sq; %elseif;(f = 4)Courier New, Courier, monospace%sq; %elseif;(f = 5)Georgia, serif%sq; %elseif;(f = 6)Tahoma, sans-serif%sq; %elseif;(f = 7)Palatino, serif%sq; %end; } %let;pos1;%if;(random.2 = 0)%left;%else;%right;%end;%in; %let;pos2;%if;(random.2 = 0)%left;%else;%right;%end;%in; %let;sz;%if;(random.2 = 0)100%else;70%end;%in; #lang .title { display : none } #lang { width: 12%%; float: %pos1;; text-align: %pos2;; background: %bg; } #lang { padding: 30px 10px 10%% 10px } #lang a { display: block; font-size: %sz;%% } #lang a { text-decoration: none } #lang a:hover { text-decoration: underline } #lang .item img { display: none } #content { margin-%pos1;: 12%%; width: auto;%sp; font-size: %expr(90 + random.30)%% } #content .subtitle { text-align: center } /* end random_css */ geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/stats.txt0000660000175200017530000000363612664543647023476 0ustar guillaumeguillaume%doctype; [*statistics] %include.css; %base_header; %message_to_wizard; %if;not cancel_links;
    %if;(referer != "") << %end;
    %end;

    [*statistics]

    %define;births(nnn)[the latest %d births:::nnn]%end; %define;deaths(nnn)[the latest %t deaths:::nnn]%end; %define;marriages(nnn)[the latest %d marriages:::nnn]%end; %define;engaged(nnn) [the %d oldest couples perhaps still alive and engaged:::nnn]%nn; %end; %define;alive(nnn)[the %d oldest perhaps still alive:::nnn]%end; %define;lived(nnn)[the %d who lived the longest:::nnn]%end; %let;n;%if;(bvar.latest_event != "")%bvar.latest_event;%else;20%end;%in; %if;(wizard or friend) %end; %base_trailer; %copyright; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/css.txt0000660000175200017530000005743312664543647023134 0ustar guillaumeguillaume geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/menubar.txt0000660000175200017530000002767012664543647023775 0ustar guillaumeguillaume %define;marriage_with_txt(xx) [*marriage with %s:::xx] %end; %define;relationship_txt(xx) [*relationship by marriage with %s:::xx] %end; %define;navsosa(xx) [*navigation with %t as Sosa reference:::xx]. %end; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/advanced.txt0000660000175200017530000000777612664543647024116 0ustar guillaumeguillaume%doctype; [*advanced request] %include.css; %base_header;

    [*advanced request]

    %hidden;

    [*first name/first names]0

    [*surname/surnames]0

    %define;event(xx)
    [*place]
    [*after] %if;([ !dates order]0 = "ddmmyy" or [ !dates order]0 = "ddmmyyyy" or [ !dates order]0 = "dmyyyy") [year/month/day]2 [year/month/day]1 [year/month/day]0 %elseif;([ !dates order]0 = "mmddyyyy") [year/month/day]1 [year/month/day]2 [year/month/day]0 %else; [year/month/day]0 [year/month/day]1 [year/month/day]2 %end;
    [*before] %if;([ !dates order]0 = "ddmmyy" or [ !dates order]0 = "ddmmyyyy" or [ !dates order]0 = "dmyyyy") [year/month/day]2 [year/month/day]1 [year/month/day]0 %elseif;([ !dates order]0 = "mmddyyyy") [year/month/day]1 [year/month/day]2 [year/month/day]0 %else; [year/month/day]0 [year/month/day]1 [year/month/day]2 %end;
    %end;

    [*birth]

    %apply;event("birth")

    [*baptism]

    %apply;event("bapt")

    [*death]

    %apply;event("death")

    [*burial]

    %apply;event("burial")

    [*occupation/occupations]1

    [*sex]

    [*marriage/marriages]0

    [*married]
    %apply;event("marriage")

    [*maximum]: [person/persons]1

    %base_trailer; %copyright; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/renamed.txt0000660000175200017530000000134112664543647023742 0ustar guillaumeguillaume%doctype; %old; -> %new; %include.css;

    %old; -> %new;

    %apply;interp([ en: The database "%old;" has been renamed "%new;". Please use now: fr: La base de données "%old;" est renommée "%new;". Utiliser maintenant: it: La base di dati "%old;" ha cambiato nome "%new;". Utilizzate: ])

    %base_trailer; %copyright; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/calendar.txt0000660000175200017530000001245112664543647024104 0ustar guillaumeguillaume%doctype; [*calendar/calendars]1 %include.css; %base_header; %message_to_wizard; %if;not cancel_links;
    %if;(referer != "") << %end;
    %end;

    [*calendar/calendars]1

    %define;fun_day(ccc, nnn) %end; %define;fun_month(ccc, nnn, vvv, lll) %end; %define;fun_year(ccc, nnn) %end; %define;fun_julian_year(ccc, nnn) %let;year; %if;(date.julian.month < 3 or date.julian.month = 3 and date.julian.day < 25) %expr(date.nnn.year - 1)/%expr(date.nnn.year % 10) %else;%date.nnn.year;%end; %in; %end; %define;calendar(ccc, nnn, vvv, lll, fun_yyy) %if;([ !dates order] = "ddmmyy" or [ !dates order]0 = "ddmmyyyy" or [ !dates order]0 = "dmyyyy") %apply;fun_day("ccc", "nnn") %apply;fun_month("ccc", "nnn", "vvv", "lll") %apply;fun_yyy("ccc", "nnn") %elseif;([ !dates order] = "mmddyyyy") %apply;fun_month("ccc", "nnn", "vvv", "lll") %apply;fun_day("ccc", "nnn") %apply;fun_yyy("ccc", "nnn") %else; %apply;fun_yyy("ccc", "nnn") %apply;fun_month("ccc", "nnn", "vvv", "lll") %apply;fun_day("ccc", "nnn") %end; %end;
    - %apply;capitalize%with;%apply;nth([(week day)], date.week_day)%end; - %if;(date.julian_day = today.julian_day)%time;%end;
     

    %hidden;

    %if;([ !dates order] = "ddmmyy" or [ !dates order]0 = "ddmmyyyy" or [ !dates order]0 = "dmyyyy") %elseif;([ !dates order] = "mmddyyyy") %else; %end; %apply;calendar("g", "gregorian", 12, [(month)], "fun_year") %apply;calendar("j", "julian", 12, [(month)], "fun_julian_year") %apply;calendar("f", "french", 13, [(french revolution month)], "fun_year") %apply;calendar("h", "hebrew", 13, [(hebrew month)], "fun_year")
     [*year/month/day]2 [*year/month/day]1 [*year/month/day]0[*year/month/day]1 [*year/month/day]2 [*year/month/day]0[*year/month/day]0 [*year/month/day]1 [*year/month/day]2 
    [*gregorian/julian/french/hebrew]0
    [*gregorian/julian/french/hebrew]1
    [*gregorian/julian/french/hebrew]2
    [*gregorian/julian/french/hebrew]3
    %if;(date.moon_phase.index != 0) %apply;capitalize%with; %apply;nth([moon age/new moon/first quarter/full moon/last quarter], date.moon_phase.index) -%sp; %date.moon_phase.hour;:%date.moon_phase.minute; UT %end; %end; (%nn; [moon age/new moon/first quarter/full moon/last quarter]0%sp; = %date.moon_age;) [*julian day]:%sp; %if;(date.julian_day < 1000)%date.julian_day; %else;%date.julian_day.sep1000;%end;
    %base_trailer; %copyright; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/updind.txt0000660000175200017530000006014512664543647023621 0ustar guillaumeguillaume%doctype; %nn; %if;(evar_m = "MRG_IND_OK" or evar_m = "MRG_MOD_IND_OK") [*merge::person/persons]1 # %index; %elseif;(evar_m = "MOD_IND" or evar_m = "MOD_IND_OK") [*modify::person/persons]0 # %index; %else;[*add::person/persons]0%end; %include.js; %include.css; %base_header; %message_to_wizard; %include_perso_header; %define;date(xlab,xvar,xdt,xcond)
    xlab %if;([ !dates order]0 = "ddmmyy" or [ !dates order]0 = "ddmmyyyy" or [ !dates order]0 = "dmyyyy") %elseif;([ !dates order]0 = "mmddyyyy") %else; %end; ...
    [*calendar/calendars]0 [*precision]0
    %end; %define;source(xx)
    %end;

    %nn; %if;(evar_m = "MRG_IND_OK" or evar_m = "MRG_MOD_IND_OK") [*merge::person/persons]1 : %first_name; %surname; %if;(first_name != "?" and surname != "?") %sp;([reference key]: %first_name;.%if;(occ = "")0%else;%occ;%end; %surname) %end; %elseif;(evar_m = "MOD_IND" or evar_m = "MOD_IND_OK") [*modify::person/persons]0 : %first_name; %surname; %if;(first_name != "?" and surname != "?") %sp;([reference key]: %first_name;.%if;(occ = "")0%else;%occ;%end; %surname) %end; %else; [*add::person/persons]0%end;

    [*other action] : [*merge::] | [*delete::]

    %hidden; %if;(evar_m = "MRG_IND_OK" or evar_m = "MRG_MOD_IND_OK") %if;(evar_i2 != "") %end; %if;(evar_ini1 != "" and evar_ini2 != "") %end; %if;(evar.iexcl != "" or evar.fexcl != "") %if;(evar.iexcl != "") %end; %if;(evar.fexcl != "") %end; %end; %elseif;(evar_m = "MOD_IND" or evar_m = "MOD_IND_OK") %else; %end;

    [*sex] ?

    %if;has_qualifiers; %foreach;qualifier; %end; %elseif;(bvar.propose_qualifier != "no") %end; %if;has_aliases; %foreach;alias; %end; %elseif;(bvar.propose_alias != "no") %end; %if;has_first_names_aliases; %foreach;first_name_alias; %end; %else; %end; %if;has_surnames_aliases; %foreach;surname_alias; %end; %else; %end;
    [*surname alias]0 [*insert::surname alias]

    [*birth]

    [*born]2...
    %apply;date([*date/dates]0, "birth", "birth", "") %apply;source("birth")

    [*baptized]2...
    %apply;date([*date/dates]0, "bapt", "bapt", "") %apply;source("bapt")

    [*death]

    %apply;date([*date/dates]0, "death", "death", " onfocus='setDead()'")
    %apply;source("death")

    [*burial]

    %apply;date([*date/dates]0, "burial", "burial", "") %apply;source("burial")

    [*relation/relations]1

    %define;insert_relation(xx)
    %end; %define;relation_type(xx)
    %end; %define;one_relation(xcnt,xvar,xrel,xsex)
    ([sex]0 = xsex)
    %end; %apply;insert_relation("0")

    %if;has_relations; %foreach;relation; %apply;relation_type(cnt)

    %apply;one_relation(cnt,"fath","r_father",[M/F]0) %apply;one_relation(cnt,"moth","r_mother",[M/F]1)

    %apply;insert_relation(cnt)

    %end; %else; %apply;relation_type("1")

    %apply;one_relation("1","fath","r_father",[M/F]0) %apply;one_relation("1","moth","r_mother",[M/F]1)

    %apply;insert_relation("1")

    %end;

    [*title/titles]1

    %define;insert_title(xx)
    %end; %define;one_title(xcnt)
    %apply;date([*begin]0, "t_date_startxcnt", "title_date_start", "") %apply;date([*end]0, "t_date_endxcnt", "title_date_end", "") %end %apply;insert_title("0")

    %if;has_titles; %foreach;title; %apply;one_title(cnt)

    %apply;insert_title(cnt)

    %end; %else; %apply;one_title("1")

    %apply;insert_title("1")

    %end;
    [*access]0

    %let;name;notes%in; %include.toolbar;

    %sq;
    %let;name;notes%in; %include.accent;

    %base_trailer; %copyright; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/index.txt0000660000175200017530000000174512664543647023446 0ustar guillaumeguillaume%doctype; Base %include.css;

    [ en: Open a Tree fr: Ouvrir une généalogie ]

    [ en: Please, enter the name of the database you want to use: fr: Tapez à l'identique le nom de la généalogie que vous voulez utiliser : ]

    • =>

    [ en: Available Family Tree (use Gwsetup) fr: Listes des généalogies disponibles (utilise Gwsetup) ]

    %copyright; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/perso_utils.txt0000660000175200017530000001323312664543647024702 0ustar guillaumeguillaume%let;central_index;%index;%in; %define;show_templ(tpl) %include.tpl; %end; %define;get_templ(tplnum) %let;templ;perso_module/%bvar.perso_module_tplnum;%in %apply;show_templ(templ) %end; %( initialise le compteur à/avec la valeur passée en paramètre %) %define;init_count(prev_count) %reset_count; %for;i;0;prev_count; %incr_count; %end; %end; %define;li_SD(xx)
  • %nn; %end; %define;li_SDC(xx) %if;xx.has_families; %reset_count; %foreach;family; %if;(nb_children>0)%incr_count;%end; %end; %end;
  • %nn; %end; %define;image_MF(xx,wi_he) %if;(xx != "x x") %if;xx.is_male; [M/F]0%nn; %elseif;xx.is_female; [M/F]1%nn; %else; ?%nn; %end; %sp; %end; %end; %define;image_sosa(xxx,yyy) sosa%nn; %end; %define;nav_with_sosa_ref(xxx) [*navigation with %t as Sosa reference:::xxx]. %end; %define;witness_relation(xxx, yyy) [*witness at marriage of %s and %s:::xxx:yyy] %end; %define;display_sosa(xx) %if;(xx.has_sosa and bvar.display_sosa="yes") %if;not cancel_links;%end; %apply;image_sosa%with;%sosa_ref.first_name_key_strip;%sp; %sosa_ref.surname_key_strip; %and;%xx.sosa;%end; %if;not cancel_links;%end;%sp; %end; %end; %define;short_display_person(xx) %apply;display_sosa("xx") %if;(xx.index=central_index)%xx;%else; %if;(cancel_links or xx.is_restricted)%xx; %else;%xx;%end; %end; %xx.title;%xx.dates; %end; %define;long_display_person(xx) %apply;display_sosa("xx") %if;(xx.index=central_index)%xx;%else; %if;(cancel_links or xx.is_restricted)%xx; %else;%xx; %end; %if;xx.has_nobility_titles; %foreach;xx.nobility_title;, %nobility_title;%end; %end; %end; %nn; %if;xx.has_birth_date;, %apply;nth([born],xx.sex) %xx.on_birth_date; %if;xx.birthday; ([happy birthday to you!])%end; %if;xx.has_birth_place; - %xx.birth_place;%end; %else; %if;xx.has_birth_place;, %apply;nth([born],xx.sex) - %xx.birth_place;%end; %end; %if;xx.has_baptism_date;, %apply;nth([baptized],xx.sex) %xx.on_baptism_date; %if;xx.has_baptism_place; - %xx.baptism_place;%end; %else; %if;xx.has_baptism_place;, %apply;nth([baptized],xx.sex) - %xx.baptism_place;%end; %end; %if;xx.computable_age;, [age] : %xx.age; %end; %if;xx.is_dead;, %xx.died; %if;xx.has_death_date; %xx.on_death_date;%end; %if;xx.has_death_place; - %xx.death_place;%end; %if;xx.computable_death_age; [age at death:] %xx.death_age;%end; %end; %if;xx.is_buried; , %apply;nth([buried],xx.sex)%sp; %if;xx.has_burial_date; %xx.on_burial_date;%end; %if;xx.has_burial_place; - %xx.burial_place;%end; %end; %if;xx.is_cremated; , %apply;nth([cremated],xx.sex)%sp; %if;xx.has_cremation_date; %xx.on_cremation_date;%end; %if;xx.has_cremation_place; - %xx.cremation_place;%end; %end; %if;xx.has_occupation;, %apply;capitalize(xx.occupation)%end; %if;(xx.has_consanguinity and bvar.show_consang!="no"),%sp; [consanguinity] : %xx.consanguinity;%end; %end; %define;married_to(sexx, date_place) %if;(sexx = 0 or sexx = 2) %if;are_married;[*married%t to:::date_place]0%nn; %elseif;are_not_married;[*relationship%t to:::date_place]0%nn; %elseif;are_engaged;[*engaged%t to:::date_place]0%nn; %elseif;is_no_sexes_check;[*relationship%t to:::date_place]0%nn; %elseif;is_no_mention;date_place [*with]%nn; %end; %else; %if;are_married;[*married%t to:::date_place]1%nn; %elseif;are_not_married;[*relationship%t to:::date_place]1%nn; %elseif;are_engaged;[*engaged%t to:::date_place]1%nn; %elseif;is_no_sexes_check;[*relationship%t to:::date_place]1%nn; %elseif;is_no_mention;date_place [*with]%nn; %end; %end; %end; %define;long_married(xx) %apply;married_to%with;%xx.sex%and; %if;(marriage_place = "") %if;(on_marriage_date = "") %else; %on_marriage_date; %if;wedding_birthday; ([happy birthday to them!])%end; %end; %else; %if;(on_marriage_date = ""), %marriage_place;, %else; %on_marriage_date; %if;wedding_birthday; ([happy birthday to them!])%end; , %marriage_place, %end; %end; %end; %end; %define;short_display_siblings() %apply;li_SDC("child") %apply;image_MF("child","13") %apply;short_display_person("child")
  • %end; %define;long_display_siblings() %apply;li_SDC("child") %apply;image_MF("child","13") %apply;short_display_person("child") %if;child.has_families; %foreach;child.family; %if;(family_cnt!=1) %child;%child.title;%child.dates; %end; %apply;long_married("child") %apply;short_display_person("spouse") %end; %end; %end; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/anclist.txt0000660000175200017530000004212412664543647023770 0ustar guillaumeguillaume%doctype; %nn; %if;(evar.t = "F")- [*surnames branch] -%nn; %else %apply;a_of_b%with; %if;(evar.t = "M")[*missing ancestors]%else;[*ancestors]%end; %and; %if;(public_name != "")%public_name;%else;%first_name;%end; %if;(qualifier != "") %qualifier;%end; %sp;%surname; %end; %end; %include.css; %base_header; %message_to_wizard;

    %nn; %if;(evar.t = "F") %if;(public_name != "")%public_name;%else;%first_name;%end; %if;(qualifier != "") %qualifier;%end; %sp;%surname; %if;(alias != "") (%alias;)%end; - [*surnames branch] - %elseif;(evar.t = "E") %if;(public_name != "")%public_name;%else;%first_name;%end; %if;(qualifier != "") %qualifier;%end; %sp;%surname; %if;(alias != "") (%alias;)%end; - [*list eclair] - %else; %apply;a_of_b%with;[*ancestors]%and; %if;(public_name != "")%public_name;%else;%first_name;%end; %if;(qualifier != "") %qualifier;%end; %sp;%surname; %if;(alias != "") (%alias;)%end; %end; %if;(evar.t = "D") [up to] %pvar.1;%end; %end;

    %if;(evar.cgl != "on")
    %if;(referer != "") << %end;
    %end; %define;tothegen(xx) [*to the %s generation:::xx]%nn; %end; %define;togen(xx) %if;(xx = 1)[*specify::generation/generations]0%nn; %elseif;(xx = 2)[*to the parents]%nn; %elseif;(xx = 3)[*to the grandparents]%nn; %elseif;(xx = 4)[*to the great-grandparents]%nn; %else; %apply;tothegen%with; %apply;nth([nth (generation)], xx) %end; %end; %end; %define;ancestors_by_list(xx, nnn) %if;(xx.has_parents and nnn > 1)
    • %xx.father;%xx.father.title;%xx.father.dates;%nl; %apply;ancestors_by_list("xx.father", nnn - 1)
    • %xx.mother;%xx.mother.title;%xx.mother.dates;%nl; %apply;ancestors_by_list("xx.mother", nnn - 1)
    %end; %end; %define;ancestors_horizontally(pp, xx, ss1, ss2, ss3) %if;(xx > 0) %if;(pp.has_parents) %apply;ancestors_horizontally( "pp.father", xx - 1, "ss1     ", "ss1 +-- ", "ss1 |   ") %end; ss2%pp;%pp.title;%pp.dates; %if;(pp.has_parents) %apply;ancestors_horizontally( "pp.mother", xx - 1, "ss3 |   ", "ss3 +-- ", "ss3     ") %end; %end; %end; %if;(evar.v = "" or evar.v <= 1) [*specify::generation/generations]0. %else; %if;(evar.t = "L") %( by list %) %let;xx; %if;(bvar.max_anc_level = "")%apply;min(evar.v, max_anc_level, 7) %else;%apply;min(evar.v, max_anc_level, bvar.max_anc_level)%end; %in;

    %apply;togen(xx).

    %apply;ancestors_by_list("self", xx) %elseif;(evar.t = "H") %( horizontally %) %let;xx; %if;(bvar.max_anc_level = "")%apply;min(evar.v, max_anc_level, 7) %else;%apply;min(evar.v, max_anc_level, bvar.max_anc_level)%end; %in;

    %apply;togen(xx).

    %apply;ancestors_horizontally( "self", xx, "   ", "-- ", "   ")
    %elseif;(evar.t = "E" and evar.sort != "") %( list eclair sorted by date begin or number of individuals or number of events %) %empty_sorted_list; %foreach;ancestor_surname(evar.v) %apply;add_in_sorted_list%with; %if;(evar.sort = "ind") %ancestor.nb_ind; %elseif;(evar.sort = "evt") %ancestor.nb_events; %else; %ancestor.date_begin.year; %end; %and;%ancestor.surname_end; %and;%ancestor.surname_begin; %and;%ancestor.place; %and;%ancestor.date_begin.prec; %and;%ancestor.date_begin.year; %and;%ancestor.date_end.prec; %and;%ancestor.date_end.year; %and;%ancestor.nb_ind; %and;%ancestor.nb_events; %end; %end; %let;nb_gen;%apply;min(evar.v, max_anc_level)%in;

    %apply;togen(nb_gen).

    %foreach;sorted_list_item; %end;
    [*surname/surnames]0 [*place] [*date begin] [*date end] [*nb individuals] [*nb events]
    %item.2;%item.3 %item.4; %if;(item.5 = "<") /%item.6; %elseif(item.5 = ">") %item.6;/ %elseif;(item.5 = "|" or item.5 = "..") %item.6; %else; %item.5;%item.6; %end; %if;(item.7 = "<") /%item.7; %elseif(item.7 = ">") %item.8;/ %elseif;(item.7 = "|" or item.7 = "..") %item.8; %else; %item.7;%item.8; %end; %item.9; %item.10;
    %elseif;(evar.t = "E") %( list eclair by alphabetic order %) %let;nb_gen;%apply;min(evar.v, max_anc_level)%in;

    %apply;togen(nb_gen).

    %foreach;ancestor_surname(evar.v) %end;
    [*surname/surnames]0 [*place] [*date begin] [*date end] [*nb individuals] [*nb events]
    %ancestor.surname_end;%ancestor.surname_begin; %ancestor.place; %if;(ancestor.date_begin.prec = "<") /%ancestor.date_begin.year;%nn; %elseif;(ancestor.date_begin.prec = ">") %ancestor.date_begin.year;/%nn; %elseif;(ancestor.date_begin.prec = "|" or ancestor.date_begin.prec = "..") %ancestor.date_begin.year;%nn; %else; %ancestor.date_begin.prec;%ancestor.date_begin.year;%nn; %end; %if;(ancestor.date_end.prec = "<") /%ancestor.date_end.year;%nn; %elseif;(ancestor.date_end.prec = ">") %ancestor.date_end.year;/%nn; %elseif;(ancestor.date_end.prec = "|" or ancestor.date_end.prec = "..") %ancestor.date_end.year;%nn; %else; %ancestor.date_end.prec;%ancestor.date_end.year;%nn; %end; %ancestor.nb_ind; %ancestor.nb_events;
    %elseif;(evar.t = "F" and evar.sort = "on") %( surnames branch sorted by number of branches %) %empty_sorted_list; %reset_count; %foreach;ancestor_surname(evar.v) %incr_count; %apply;add_in_sorted_list( ancestor.nb_times, ancestor.surname_end, ancestor.surname_begin, ancestor.sosa_access, ancestor.place, ancestor.date_begin.prec, ancestor.date_begin.year, ancestor.date_end.prec, ancestor.date_end.year) %end; %let;nb_gen;%apply;min(evar.v, max_anc_level)%in;

    %apply;togen(nb_gen).

    %if;(count > 100)

    [*number of branches] : %foreach;sorted_list_item; %if;(prev_item.1 != item.1) %item.1; %end; %end;

    %end;

    [*help surname branch].

      %if;(count <= 100)
    • %nn; %end; %foreach;sorted_list_item; %if;(prev_item.1 != item.1 and count > 100)
    • %nn; %item.1;
    • [*surname/surnames]0 [*nb branches] [*place] [*date/dates]0
      %end; %if;(item.1 != next_item.1 and count > 100)
      [*surname/surnames]0 [*nb branches] [*place] [*date/dates]0
      %item.2;%item.3; %if;(evar.cgl != "on") %item.1; %else; %item.1; %end; %item.5; %if;(item.6 = "<") /%item.7; %elseif(item.6 = ">") %item.7;/ %elseif;(item.6 = "|" or item.6 = "..") %item.7; %else; %item.6;%item.7; %end;%nn; -%nn; %if;(item.8 = "<") /%item.9; %elseif(item.8 = ">") %item.9;/ %elseif;(item.8 = "|" or item.8 = "..") %item.9; %else; %item.8;%item.9; %end;
    • %end; %end; %if;(count <= 100) %end;

    %elseif;(evar.t = "F") %( surnames branch %) %let;nb_gen;%apply;min(evar.v, max_anc_level)%in;

    %apply;togen(nb_gen).

    [*help surname branch].

    %foreach;ancestor_surname(evar.v) %end;
    [*surname/surnames]0 [*nb branches] [*place] [*date/dates]0
    %ancestor.surname_end;%ancestor.surname_begin; %if;(evar.cgl != "on") %ancestor.nb_times; %else; %ancestor.nb_times; %end; %ancestor.place; %if;(ancestor.date_begin.prec = "<") /%ancestor.date_begin.year;%nn; %elseif;(ancestor.date_begin.prec = ">") %ancestor.date_begin.year;/%nn; %elseif;(ancestor.date_begin.prec = "|" or ancestor.date_begin.prec = "..") %ancestor.date_begin.year;%nn; %else; %ancestor.date_begin.prec;%ancestor.date_begin.year;%nn; %end; -%nn; %if;(ancestor.date_end.prec = "<") /%ancestor.date_end.year;%nn; %elseif;(ancestor.date_end.prec = ">") %ancestor.date_end.year;/%nn; %elseif;(ancestor.date_end.prec = "|" or ancestor.date_end.prec = "..") %ancestor.date_end.year;%nn; %else; %ancestor.date_end.prec;%ancestor.date_end.year;%nn; %end;
    %end; %end; %base_trailer; %copyright; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/perso_header.txt0000660000175200017530000000533212664543647024773 0ustar guillaumeguillaume %( On importe perso_utils pour l'inclusion hors template. %) %( Normalement, il n'est ajouté qu'une seule fois. %) %import;perso_utils %include.menubar; %if;not cancel_links;
    %if;(referer != "") << %end;
    %end;

    %apply;image_MF("self", "") %if;has_public_name; %if;has_qualifiers;%public_name; %qualifier; %else;%public_name; %surname;%end; %else; %if;has_qualifiers;%first_name; %qualifier; %else; %if;cancel_links;%first_name; %surname; %else; %first_name; %surname; %end; %end; %end; %if;(wizard)   %end;

    %if;(has_sosa or has_qualifiers or has_aliases or has_nobility_titles or has_public_name or has_surnames_aliases or has_first_names_aliases or has_linked_page.HEAD)
    %if;has_sosa; sosa [*Sosa]: %if;cancel_links;%sosa; %else;%sosa;%end; %end; %foreach;qualifier; %if;not is_first; %if;has_public_name;%public_name; %qualifier; %else;%first_name; %qualifier;%end; %end; %end; %foreach;alias; %alias; %end; %if;has_nobility_titles; %foreach;nobility_title; %if;not is_first;, %end; %nobility_title; %end; %end; %if;has_linked_page.HEAD;%linked_page.HEAD;%end; %if;(has_public_name or has_qualifiers) (%if;cancel_links;%first_name; %surname; %else; %first_name; %surname;%nn; %end;) %end; %foreach;surname_alias; (%first_name; %surname_alias;) %end; %foreach;first_name_alias; (%first_name_alias; %surname;) %end;

    %end; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/trl.txt0000660000175200017530000000141712664543647023134 0ustar guillaumeguillaume %if;(not cancel_links and evar.digest = "") %end; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templh/0002770000175200017530000000000012664543647023061 5ustar guillaumeguillaumegeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templh/perso.txt0000660000175200017530000003410712664543647024756 0ustar guillaumeguillaume%doctype; %nn; %if;has_public_name; %if;has_qualifiers;%public_name; %qualifier; %else;%public_name; %surname;%end; %else; %if;has_qualifiers;%first_name; %qualifier; %else;%first_name; %surname;%end; %end; %include.css; %base_header; %define;include_file(file) %include.file; %end; %define;image_sosa(xxx,yyy) %nn; %end; %define;display_sosa(xx) %if;(bvar.display_sosa="" or bvar.display_sosa="yes") %if;xx.has_sosa; %if;not cancel_links;%end; %apply;image_sosa%with;%sosa_ref.first_name_key_strip;%sp; %sosa_ref.surname_key_strip; %and;%xx.sosa;%end; %if;not cancel_links;%end;%sp; %end; %end; %end; %define;image_MF(xx,wi_he) %if;(wizard and not cancel_links and not xx.is_restricted) %end; %if;xx.is_male; %nn; %if;(wizard and not cancel_links and not xx.is_restricted)%end; %sp; %end; %define;li_SD(xx)
  • %nn; %end; %define;li_SDC(xx) %if;xx.has_families; %reset_count; %foreach;family; %if;(nb_children>0)%incr_count;%end; %end; %end;
  • %nn; %end; %define;display_arrows() %if;not cancel_links;
    %if;has_referer; %end;
    %end; %end; %define;tothegen(xx) [to the %s generation:::xx]%nn; %end; %define;togena(xx) %if;(xx = 1)[specify::generation/generations]0%nn; %elseif;(xx = 2)[to the parents]%nn; %elseif;(xx = 3)[to the grandparents]%nn; %elseif;(xx = 4)[to the great-grandparents]%nn; %else; %apply;tothegen%with; %apply;nth([nth (generation)], xx) %end; %end; %end; %define;togend(xx) %if;(xx = 0)[specify::generation/generations]0%nn; %elseif;(xx = 1)[to the children]%nn; %elseif;(xx = 2)[to the grandchildren]%nn; %elseif;(xx = 3)[to the great-grandchildren]%nn; %else; %apply;tothegen%with; %apply;nth([nth (generation)], xx) %end; %end; %end; %define;age_at_birth_of(xxx) [age at %s birth date:::xxx]%sp; %end; %define;short_display_person(xx) %apply;display_sosa("xx") %if;(xx.index=central_index)%xx;%else; %if;(cancel_links or xx.is_restricted)%xx; %else;%xx;%end; %end;%sp; %xx.title;%xx.dates; %end; %define;display_vertical(xx) %if;(xx.has_birth_date or xx.has_birth_place or xx.has_baptism_date or xx.has_baptism_place or xx.is_dead or xx.is_buried or xx.is_cremated or (xx.has_consanguinity and bvar.show_consang!="no") or xx.has_occupation or xx.has_linked_page.OCCU !="")
      %if;xx.has_birth_date;
    • %apply;capitalize(nth([born],xx.sex)) %xx.on_birth_date; %if;xx.birthday; ([happy birthday to you!])%end; %if;xx.has_birth_place; - %xx.birth_place;%end;
    • %nl; %else; %if;xx.has_birth_place;
    • %apply;capitalize(nth([born],xx.sex)) - %xx.birth_place;
    • %nl; %end; %end; %if;xx.has_baptism_date;
    • %apply;capitalize(nth([baptized],xx.sex)) %xx.on_baptism_date; %if;xx.has_baptism_place; - %xx.baptism_place;%end;
    • %nl; %else; %if;xx.has_baptism_place;
    • %apply;capitalize(nth([baptized],xx.sex)) - %xx.baptism_place;
    • %nl; %end; %end; %if;xx.computable_age;
    • [*age] : %xx.age;
    • %nl; %end; %if;xx.is_dead;
    • %apply;capitalize(xx.died) %if;xx.has_death_date; %xx.on_death_date;%end; %if;xx.has_death_place; - %xx.death_place;%end; %if;(xx.has_linked_page.DEATH !="") %xx.linked_page.DEATH;%end; %if;xx.computable_death_age;, [age at death:] %xx.death_age;%end;
    • %nl; %if;xx.is_buried;
    • %apply;capitalize(nth([buried],xx.sex)) %if;xx.has_burial_date; %xx.on_burial_date;%end; %if;xx.has_burial_place; - %xx.burial_place;%end;
    • %nl; %end; %if;xx.is_cremated;
    • %apply;capitalize(nth([cremated],xx.sex)) %if;xx.has_cremation_date; %xx.on_cremation_date;%end; %if;xx.has_cremation_place; - %xx.cremation_place;%end;
    • %nl; %end; %end; %if;xx.has_occupation;
    • %apply;capitalize(xx.occupation)
    • %nl; %end; %if;(xx.has_linked_page.OCCU)
    • %apply;capitalize(xx.linked_page.OCCU)
    • %nl; %end; %if;(xx.has_consanguinity and bvar.show_consang!="no")
    • [*consanguinity] : %xx.consanguinity;
    • %nl; %end;
    %end; %end; %define;married_to(masc, date_place) %if;masc; %if;are_married;[*married%t to:::date_place]0%nn; %elseif;are_not_married;[*relationship%t to:::date_place]0%nn; %elseif;are_engaged;[*engaged%t to:::date_place]0%nn; %elseif;is_no_sexes_check;[*relationship%t to:::date_place]0%nn; %elseif;is_no_mention;date_place [*with]%nn; %end; %else; %if;are_married;[*married%t to:::date_place]1%nn; %elseif;are_not_married;[*relationship%t to:::date_place]1%nn; %elseif;are_engaged;[*engaged%t to:::date_place]1%nn; %elseif;is_no_sexes_check;[*relationship%t to:::date_place]1%nn; %elseif;is_no_mention;date_place [*with]%nn; %end; %end; %end; %define;long_married(xx) %apply;married_to%with;%xx.is_male%and; %if;(marriage_place="") %if;(on_marriage_date="") %else; %on_marriage_date; %if;wedding_birthday; ([happy birthday to them!])%end; %end; %else; %if;(on_marriage_date=""), %marriage_place;, %else; %on_marriage_date; %if;wedding_birthday; ([happy birthday to them!])%end; , %marriage_place, %end; %end; %end; %end; %define;witness_relation(xxx,yyy) [*witness at marriage of %s and %s:::xxx:yyy] %end; %define;ancestors_horizontally(xx, nnn, ss1, ss2, ss3) %if;(nnn > 0) %if;(xx.has_parents) %apply;ancestors_horizontally( "xx.father", nnn - 1, "ss1     ", "ss1+----", "ss1|    ") %end; ss2%apply;image_MF("xx","13") %apply;short_display_person("xx") %if;(xx.has_parents) %apply;ancestors_horizontally( "xx.mother", nnn - 1, "ss3|    ", "ss3+----", "ss3     ") %end; %end; %end; %define;nav_with_sosa_ref(xxx) [*navigation with %t as Sosa reference:::xxx]%nn; %end; %let;central_index;%index;%in; %let;central_person;%first_name_key_strip;%sp;%surname_key_strip;%in; %message_to_wizard;
    %apply;image_MF("self","13")
    %apply;display_arrows()

    %if;has_public_name; %if;has_qualifiers;%public_name; %qualifier; %else;%public_name; %surname;%end; %else; %if;has_qualifiers;%first_name; %qualifier; %else; %if;cancel_links;%first_name; %surname; %else; %first_name; %surname; %end; %end; %end;

    %if;(has_sosa or has_qualifiers or has_aliases or has_nobility_titles or has_public_name or has_surnames_aliases or has_first_names_aliases or has_linked_page.HEAD)
    %if;has_sosa; %apply;display_sosa("self") [*Sosa]: %if;cancel_links;%sosa; %else;%sosa;%end; %end; %foreach;qualifier; %if;not is_first; %if;has_public_name;%public_name; %qualifier; %else;%first_name; %qualifier;%end; %end; %end; %foreach;alias; %alias; %end; %if;has_nobility_titles; %foreach;nobility_title; %if;not is_first;, %end; %nobility_title; %end; %end; %if;has_linked_page.HEAD;%linked_page.HEAD;%end; %if;(has_public_name or has_qualifiers) (%if;cancel_links;%first_name; %surname; %else; %first_name; %surname;%nn; %end;) %end; %foreach;surname_alias; (%first_name; %surname_alias;) %end; %foreach;first_name_alias; (%first_name_alias; %surname;) %end;

    %end; %if;has_image;
    %end; %apply;display_vertical("self") %if;has_image;
    %end; %if;has_parents;

    [*parents]

      %apply;li_SD("father") %apply;image_MF("father","13") %apply;short_display_person("father")%sp; %if;(father.has_birth_date and has_birth_date) ( %sp; :%sp; %father_age_at_birth;) %end; %apply;li_SD("mother") %apply;image_MF("mother","13") %apply;short_display_person("mother")%sp; %if;(mother.has_birth_date and has_birth_date) ( %sp; :%sp; %mother_age_at_birth;) %end;
    %end; %if;has_families;

    [*marriage/marriages]1%sp; %if;(max_desc_level>0) [and::child/children]1%end;

      %foreach;family; %apply;li_SD("spouse") %apply;long_married("self")%sp; %apply;image_MF("spouse","13") %apply;short_display_person("spouse") %if;has_witnesses; ([witness/witnesses]w : %foreach;witness; %if;not is_first;, %end; %apply;image_MF("witness","13") %apply;short_display_person("witness")%nl; %end; )%end; %if;((wizard or friend or bvar.no_note_for_visitor="" or bvar.no_note_for_visitor="no") and has_comment) (%comment;)%end; %if;are_divorced;, [divorced]0%divorce_date;%end; %if;are_separated;, [separated]0%end; %if;has_children; , [having as children]0
        %foreach;child; %apply;li_SDC("child") %apply;image_MF("child","13") %apply;short_display_person("child") %end;
      %end; %if;(evar.opt = "from" and wizard)(%origin_file;)%nl;%end; %end;
    %end; %if;has_siblings;

    %nn; %if;(bvar.full_siblings="" or bvar.full_siblings="yes") [*full siblings]%nn; %else; [*siblings]%nn; %end;

      %foreach;father.child; %if;((bvar.full_siblings="" or bvar.full_siblings="yes") or child.index!=central_index) %apply;li_SDC("child") %apply;image_MF("child","13") %apply;short_display_person("child") %end; %end;
    %end; %if;has_parents; %let;nbga;%apply;min(max_anc_level, 5)%in;

    [*ancestors]%sp; %apply;togena%with;%nbga%end;

    %apply;ancestors_horizontally("self", nbga, "    ", "====", "    ")
    %end; %apply;include_file("templx/relations") %apply;include_file("templx/linked_pages") %apply;include_file("templx/notes") %apply;include_file("templx/sources") %apply;include_file("templx/links") %if;(evar_opt="misc")%misc_names;%end; %base_trailer; %copyright; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templh/anclist.txt0000660000175200017530000000013012664543647025250 0ustar guillaumeguillaume%define;include_file(file) %include.file; %end; %apply;include_file("templx/anclist")geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templh/deslist.txt0000660000175200017530000000013012664543647025262 0ustar guillaumeguillaume%define;include_file(file) %include.file; %end; %apply;include_file("templx/deslist")geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templh/anctree.txt0000660000175200017530000000013012664543647025234 0ustar guillaumeguillaume%define;include_file(file) %include.file; %end; %apply;include_file("templx/anctree")geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templh/ancsosa.txt0000660000175200017530000000013012664543647025242 0ustar guillaumeguillaume%define;include_file(file) %include.file; %end; %apply;include_file("templx/ancsosa")geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/particles.txt0000660000175200017530000000026412664543647024320 0ustar guillaumeguillaumeaf_ av_ d' d’ dal_ de_ des_ di_ du_ of_ van_de_ van_den_ van_ von_und_zu_ von_ zu_ zur_ AF_ AV_ D' D’ DAL_ DE_ DES_ DI_ DU_ OF_ VAN_DE_ VAN_DEN_ VAN_ VON_und_ZU_ VON_ ZU_ ZUR_ geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/copyr.txt0000660000175200017530000000063012664543647023463 0ustar guillaumeguillaume geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templc/0002770000175200017530000000000012664543647023054 5ustar guillaumeguillaumegeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templc/perso.txt0000660000175200017530000004160712664543647024754 0ustar guillaumeguillaume%doctype; %nn; %if;has_public_name; %if;has_qualifiers;%public_name; %qualifier; %else;%public_name; %surname;%end; %else; %if;has_qualifiers;%first_name; %qualifier; %else;%first_name; %surname;%end; %end; %include.css; %base_header; %define;include_file(file) %include.file; %end; %define;image_sosa(xxx,yyy) %nn; %end; %define;display_sosa(xx) %if;(bvar.display_sosa="" or bvar.display_sosa="yes") %if;xx.has_sosa; %if;not cancel_links;%end; %apply;image_sosa%with;%sosa_ref.first_name_key_strip;%sp; %sosa_ref.surname_key_strip; %and;%xx.sosa;%end; %if;not cancel_links;%end;%sp; %end; %end; %end; %define;image_MF(xx,wi_he) %if;(wizard and not cancel_links and not xx.is_restricted) %end; %if;xx.is_male; %nn; %if;(wizard and not cancel_links and not xx.is_restricted)%end; %sp; %end; %define;li_SD(xx)
  • %nn; %end; %define;li_SDC(xx) %if;xx.has_families; %reset_count; %foreach;family; %if;(nb_children>0)%incr_count;%end; %end; %end;
  • %nn; %end; %define;display_arrows() %if;not cancel_links;
    %if;has_referer; %end;
    %end; %end; %define;tothegen(xx) [to the %s generation:::xx]%nn; %end; %define;togena(xx) %if;(xx = 1)[specify::generation/generations]0%nn; %elseif;(xx = 2)[to the parents]%nn; %elseif;(xx = 3)[to the grandparents]%nn; %elseif;(xx = 4)[to the great-grandparents]%nn; %else; %apply;tothegen%with; %apply;nth([nth (generation)], xx) %end; %end; %end; %define;togend(xx) %if;(xx = 0)[specify::generation/generations]0%nn; %elseif;(xx = 1)[to the children]%nn; %elseif;(xx = 2)[to the grandchildren]%nn; %elseif;(xx = 3)[to the great-grandchildren]%nn; %else; %apply;tothegen%with; %apply;nth([nth (generation)], xx) %end; %end; %end; %define;short_display_person(xx) %apply;display_sosa("xx") %if;(xx.index=central_index)%xx;%else; %if;(cancel_links or xx.is_restricted)%xx; %else;%xx;%end; %end;%sp; %xx.title;%xx.dates; %end; %define;display_vertical(xx) %if;(xx.has_birth_date or xx.has_birth_place or xx.has_baptism_date or xx.has_baptism_place or xx.is_dead or xx.is_buried or xx.is_cremated or (xx.has_consanguinity and bvar.show_consang!="no") or xx.has_occupation or xx.has_linked_page.OCCU !="")
      %if;xx.has_birth_date;
    • %apply;capitalize(nth([born],xx.sex)) %xx.on_birth_date; %if;xx.birthday; ([happy birthday to you!])%end; %if;xx.has_birth_place; - %xx.birth_place;%end;
    • %nl; %else; %if;xx.has_birth_place;
    • %apply;capitalize(nth([born],xx.sex)) - %xx.birth_place;
    • %nl; %end; %end; %if;xx.has_baptism_date;
    • %apply;capitalize(nth([baptized],xx.sex)) %xx.on_baptism_date; %if;xx.has_baptism_place; - %xx.baptism_place;%end;
    • %nl; %else; %if;xx.has_baptism_place;
    • %apply;capitalize(nth([baptized],xx.sex)) - %xx.baptism_place;
    • %nl; %end; %end; %if;xx.computable_age;
    • [*age] : %xx.age;
    • %nl; %end; %if;xx.is_dead;
    • %apply;capitalize(xx.died) %if;xx.has_death_date; %xx.on_death_date;%end; %if;xx.has_death_place; - %xx.death_place;%end; %if;(xx.has_linked_page.DEATH !="") %xx.linked_page.DEATH;%end; %if;xx.computable_death_age;, [age at death:] %xx.death_age;%end;
    • %nl; %if;xx.is_buried;
    • %apply;capitalize(nth([buried],xx.sex)) %if;xx.has_burial_date; %xx.on_burial_date;%end; %if;xx.has_burial_place; - %xx.burial_place;%end;
    • %nl; %end; %if;xx.is_cremated;
    • %apply;capitalize(nth([cremated],xx.sex)) %if;xx.has_cremation_date; %xx.on_cremation_date;%end; %if;xx.has_cremation_place; - %xx.cremation_place;%end;
    • %nl; %end; %end; %if;xx.has_occupation;
    • %apply;capitalize(xx.occupation)
    • %nl; %end; %if;(xx.has_linked_page.OCCU)
    • %apply;capitalize(xx.linked_page.OCCU)
    • %nl; %end; %if;(xx.has_consanguinity and bvar.show_consang!="no")
    • [*consanguinity] : %xx.consanguinity;
    • %nl; %end;
    %end; %end; %define;married_to(masc, date_place) %if;masc; %if;are_married;[*married%t to:::date_place]0%nn; %elseif;are_not_married;[*relationship%t to:::date_place]0%nn; %elseif;are_engaged;[*engaged%t to:::date_place]0%nn; %elseif;is_no_sexes_check;[*relationship%t to:::date_place]0%nn; %elseif;is_no_mention;date_place [*with]%nn; %end; %else; %if;are_married;[*married%t to:::date_place]1%nn; %elseif;are_not_married;[*relationship%t to:::date_place]1%nn; %elseif;are_engaged;[*engaged%t to:::date_place]1%nn; %elseif;is_no_sexes_check;[*relationship%t to:::date_place]1%nn; %elseif;is_no_mention;date_place [*with]%nn; %end; %end; %end; %define;long_married(xx) %apply;married_to%with;%xx.is_male%and; %if;(marriage_place="") %if;(on_marriage_date="") %else; %on_marriage_date; %if;wedding_birthday; ([happy birthday to them!])%end; %end; %else; %if;(on_marriage_date=""), %marriage_place;, %else; %on_marriage_date; %if;wedding_birthday; ([happy birthday to them!])%end; , %marriage_place, %end; %end; %end; %end; %define;witness_relation(xxx,yyy) [*witness at marriage of %s and %s:::xxx:yyy] %end; %define;nav_with_sosa_ref(xxx) [*navigation with %t as Sosa reference:::xxx]%nn; %end; %let;central_index;%index;%in; %let;central_person;%first_name_key_strip;%sp;%surname_key_strip;%in; %message_to_wizard;
    %apply;image_MF("self","13")
    %apply;display_arrows()

    %if;has_public_name; %if;has_qualifiers;%public_name; %qualifier; %else;%public_name; %surname;%end; %else; %if;has_qualifiers;%first_name; %qualifier; %else; %if;cancel_links;%first_name; %surname; %else; %first_name; %surname; %end; %end; %end;

    %if;(has_sosa or has_qualifiers or has_aliases or has_nobility_titles or has_public_name or has_surnames_aliases or has_first_names_aliases or has_linked_page.HEAD)
    %if;has_sosa; %apply;display_sosa("self") [*Sosa]: %if;cancel_links;%sosa; %else;%sosa;%end; %end; %foreach;qualifier; %if;not is_first; %if;has_public_name;%public_name; %qualifier; %else;%first_name; %qualifier;%end; %end; %end; %foreach;alias; %alias; %end; %if;has_nobility_titles; %foreach;nobility_title; %if;not is_first;, %end; %nobility_title; %end; %end; %if;has_linked_page.HEAD;%linked_page.HEAD;%end; %if;(has_public_name or has_qualifiers) (%if;cancel_links;%first_name; %surname; %else; %first_name; %surname;%nn; %end;) %end; %foreach;surname_alias; (%first_name; %surname_alias;) %end; %foreach;first_name_alias; (%first_name_alias; %surname;) %end;

    %end; %if;has_image;
    %end; %apply;display_vertical("self") %if;has_image;
    %end; %if;has_parents;

    [*parents]

      %foreach;parent; %apply;li_SD("parent") %apply;image_MF("parent","13") %apply;short_display_person("parent") %end;
    %end; %if;has_families;

    [*marriage/marriages]1%sp; %if;(max_desc_level>0) [and::child/children]1%end;

      %foreach;family; %apply;li_SD("spouse") %apply;long_married("self")%sp; %apply;image_MF("spouse","13") %apply;short_display_person("spouse") %if;has_witnesses; ([witness/witnesses]w : %foreach;witness; %if;not is_first;, %end; %apply;image_MF("witness","13") %apply;short_display_person("witness")%nl; %end; )%end; %if;((wizard or friend or bvar.no_note_for_visitor="" or bvar.no_note_for_visitor="no") and has_comment) (%comment;)%end; %if;are_divorced;, [divorced]0%divorce_date;%end; %if;are_separated;, [separated]0%end; %if;has_children; , [having as children]0
        %foreach;child; %apply;li_SDC("child") %apply;image_MF("child","13") %apply;short_display_person("child") %end;
      %end; %if;(evar.opt = "from" and wizard)(%origin_file;)%nl;%end; %end;
    %end; %if;has_parents;
    %if;has_siblings; %end;
    %if;(max_anc_level>2) %if;father.has_parents; %else; %end; %if;mother.has_parents; %else; %end; %if;father.has_parents; %end; %if;mother.has_parents; %end; %if;father.has_parents; %end; %if;mother.has_parents; %end; %if;father.has_parents; %end; %if;mother.has_parents; %end; %end;
    %nn;

    [*ancestors]0

    %nn; %apply;image_MF("father.father","10") %apply;short_display_person("father.father")   %nn; %apply;image_MF("father.mother","10") %apply;short_display_person("father.mother")  %nn; %apply;image_MF("mother.father","10") %apply;short_display_person("mother.father")   %nn; %apply;image_MF("mother.mother","10") %apply;short_display_person("mother.mother") 
    |   | |   |
    %nn;


     


    | |
    %nn; %apply;image_MF("father","13") %apply;short_display_person("father")   %nn; %apply;image_MF("mother","13") %apply;short_display_person("mother")
    |   |



    |
    %nn; %apply;image_MF("self","13") %apply;short_display_person("self")

    %sp; %sp; %if;(bvar.full_siblings="" or bvar.full_siblings="yes") [*full siblings]%nn; %else; [*siblings]%nn; %end;

      %foreach;father.child; %if;((bvar.full_siblings="" or bvar.full_siblings="yes") or child.index!=central_index) %apply;li_SDC("child") %apply;image_MF("child","13") %apply;short_display_person("child") %end; %end;
    %end; %apply;include_file("templx/relations") %apply;include_file("templx/linked_pages") %apply;include_file("templx/notes") %apply;include_file("templx/sources") %apply;include_file("templx/links") %if;(evar_opt="misc")%misc_names;%end; %base_trailer; %copyright; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templc/anclist.txt0000660000175200017530000000013012664543647025243 0ustar guillaumeguillaume%define;include_file(file) %include.file; %end; %apply;include_file("templx/anclist")geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templc/deslist.txt0000660000175200017530000000013012664543647025255 0ustar guillaumeguillaume%define;include_file(file) %include.file; %end; %apply;include_file("templx/deslist")geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templc/anctree.txt0000660000175200017530000000013012664543647025227 0ustar guillaumeguillaume%define;include_file(file) %include.file; %end; %apply;include_file("templx/anctree")geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templc/ancsosa.txt0000660000175200017530000000013012664543647025235 0ustar guillaumeguillaume%define;include_file(file) %include.file; %end; %apply;include_file("templx/ancsosa")geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/summary.txt0000660000175200017530000000246712664543647024036 0ustar guillaumeguillaume geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templf/0002770000175200017530000000000012664543647023057 5ustar guillaumeguillaumegeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templf/perso.txt0000660000175200017530000011447712664543647024765 0ustar guillaumeguillaume%doctype; %nn; %if;has_public_name; %if;has_qualifiers;%public_name; %qualifier; %else;%public_name; %surname;%end; %else; %if;has_qualifiers;%first_name; %qualifier; %else;%first_name; %surname;%end; %end; %include.css; %base_header; %define;include_file(file) %include.file; %end; %define;image_sosa(xxx,yyy) %nn; %end; %define;display_sosa(xx) %if;(bvar.display_sosa="" or bvar.display_sosa="yes") %if;xx.has_sosa; %if;not cancel_links;%end; %apply;image_sosa%with;%sosa_ref.first_name_key_strip;%sp; %sosa_ref.surname_key_strip; %and;%xx.sosa;%end; %if;not cancel_links;%end;%sp; %end; %end; %end; %define;image_MF(xx,wi_he) %if;(wizard and not cancel_links and not xx.is_restricted) %end; %if;xx.is_male; %nn; %if;(wizard and not cancel_links and not xx.is_restricted)%end; %sp; %end; %define;li_SD(xx)
  • %nn; %end; %define;li_SDC(xx) %if;xx.has_families; %reset_count; %foreach;family; %if;(nb_children>0)%incr_count;%end; %end; %end;
  • %nn; %end; %define;display_arrows() %if;not cancel_links;
    %if;has_referer; %end;
    %end; %end; %define;tothegen(xx) [to the %s generation:::xx]%nn; %end; %define;togena(xx) %if;(xx = 1)[specify::generation/generations]0%nn; %elseif;(xx = 2)[to the parents]%nn; %elseif;(xx = 3)[to the grandparents]%nn; %elseif;(xx = 4)[to the great-grandparents]%nn; %else; %apply;tothegen%with; %apply;nth([nth (generation)], xx) %end; %end; %end; %define;togend(xx) %if;(xx = 0)[specify::generation/generations]0%nn; %elseif;(xx = 1)[to the children]%nn; %elseif;(xx = 2)[to the grandchildren]%nn; %elseif;(xx = 3)[to the great-grandchildren]%nn; %else; %apply;tothegen%with; %apply;nth([nth (generation)], xx) %end; %end; %end; %define;short_display_person(xx) %apply;display_sosa("xx") %if;(xx.index=central_index)%xx;%else; %if;(cancel_links or xx.is_restricted)%xx; %else;%xx;%end; %end;%sp; %xx.title;%xx.dates;%if;xx.birthday; ([happy birthday to you!])%end; %end; %define;age_at_birth_of(xxx) [age at %s birth date:::xxx]%sp; %end; %define;display_vertical(xx) %if;(xx.has_birth_date or xx.has_birth_place or xx.has_baptism_date or xx.has_baptism_place or xx.is_dead or xx.is_buried or xx.is_cremated or (xx.has_consanguinity and bvar.show_consang!="no") or xx.has_occupation or xx.has_linked_page.OCCU !="")
      %if;(xx.index!=central_index)
    • %apply;image_MF("xx","13") %apply;display_sosa("xx") %if;(cancel_links or xx.is_restricted)%xx; %else;%xx;%end;%sp;
    • %nl; %if;xx.has_nobility_titles; %foreach;xx.nobility_title;
    • %apply;capitalize(nobility_title)
    • %nl; %end; %end; %end; %if;xx.has_birth_date;
    • %apply;capitalize(nth([born],xx.sex)) %xx.on_birth_date; %if;xx.birthday; ([happy birthday to you!])%end; %if;xx.has_birth_place; - %xx.birth_place;%end;
    • %nl; %else; %if;xx.has_birth_place;
    • %apply;capitalize(nth([born],xx.sex)) - %xx.birth_place;
    • %nl; %end; %end; %if;xx.has_baptism_date;
    • %apply;capitalize(nth([baptized],xx.sex)) %xx.on_baptism_date; %if;xx.has_baptism_place; - %xx.baptism_place;%end;
    • %nl; %else; %if;xx.has_baptism_place;
    • %apply;capitalize(nth([baptized],xx.sex)) - %xx.baptism_place;
    • %nl; %end; %end; %if;xx.computable_age;
    • [*age] : %xx.age;
    • %nl; %end; %if;xx.is_dead;
    • %apply;capitalize(xx.died) %if;xx.has_death_date; %xx.on_death_date;%end; %if;xx.has_death_place; - %xx.death_place;%end; %if;(xx.has_linked_page.DEATH !="") %xx.linked_page.DEATH;%end; %if;xx.computable_death_age;, [age at death:] %xx.death_age;%end;
    • %nl; %if;xx.is_buried;
    • %apply;capitalize(nth([buried],xx.sex)) %if;xx.has_burial_date; %xx.on_burial_date;%end; %if;xx.has_burial_place; - %xx.burial_place;%end;
    • %nl; %end; %if;xx.is_cremated;
    • %apply;capitalize(nth([cremated],xx.sex)) %if;xx.has_cremation_date; %xx.on_cremation_date;%end; %if;xx.has_cremation_place; - %xx.cremation_place;%end;
    • %nl; %end; %end; %if;xx.has_occupation;
    • %apply;capitalize(xx.occupation)
    • %nl; %end; %if;(xx.has_linked_page.OCCU)
    • %apply;capitalize(xx.linked_page.OCCU)
    • %nl; %end; %if;(xx.has_consanguinity and bvar.show_consang!="no")
    • [*consanguinity] : %xx.consanguinity;
    • %nl; %end;
    %else; %end; %end; %define;display_horizontal(xx) %if;(xx.index!=central_index) %apply;display_sosa("xx") %if;(cancel_links or xx.is_restricted)%xx; %else;%xx;%end;%sp; %if;xx.has_nobility_titles; %foreach;xx.nobility_title;, %nobility_title;%end; %end; %end; %nn; %if;has_parents; %if;(xx.index=father.index or xx.index=mother.index) %if;(has_birth_date and xx.has_birth_date)%sp; (%xx_age_at_birth)%end; %end; %end; %if;xx.has_birth_date;, %apply;nth([born],xx.sex) %xx.on_birth_date; %if;xx.birthday; ([happy birthday to you!])%end; %if;xx.has_birth_place; - %xx.birth_place;%end; %else; %if;xx.has_birth_place;, %apply;nth([born],xx.sex) - %xx.birth_place;%end; %end; %if;xx.has_baptism_date;, %apply;nth([baptized],xx.sex) %xx.on_baptism_date; %if;xx.has_baptism_place; - %xx.baptism_place;%end; %else; %if;xx.has_baptism_place;, %apply;nth([baptized],xx.sex) - %xx.baptism_place;%end; %end; %if;xx.computable_age;, [age] : %xx.age; %end; %if;xx.is_dead;, %xx.died; %if;xx.has_death_date; %xx.on_death_date;%end; %if;xx.has_death_place; - %xx.death_place;%end; %if;xx.computable_death_age; [age at death:] %xx.death_age;%end; %if;xx.is_buried; , %apply;nth([buried],xx.sex)%sp; %if;xx.has_burial_date; %xx.on_burial_date;%end; %if;xx.has_burial_place; - %xx.burial_place;%end; %end; %if;xx.is_cremated; , %apply;nth([cremated],xx.sex)%sp; %if;xx.has_cremation_date; %xx.on_cremation_date;%end; %if;xx.has_cremation_place; - %xx.cremation_place;%end; %end; %end; %if;xx.has_occupation;, %apply;capitalize(xx.occupation)%end; %if;(xx.has_consanguinity and bvar.show_consang!="no"),%sp; [consanguinity] : %xx.consanguinity;%end; %end; %define;married_to(masc, date_place) %if;masc; %if;are_married;[*married%t to:::date_place]0%nn; %elseif;are_not_married;[*relationship%t to:::date_place]0%nn; %elseif;are_engaged;[*engaged%t to:::date_place]0%nn; %elseif;is_no_sexes_check;[*relationship%t to:::date_place]0%nn; %elseif;is_no_mention;date_place [*with]%nn; %end; %else; %if;are_married;[*married%t to:::date_place]1%nn; %elseif;are_not_married;[*relationship%t to:::date_place]1%nn; %elseif;are_engaged;[*engaged%t to:::date_place]1%nn; %elseif;is_no_sexes_check;[*relationship%t to:::date_place]1%nn; %elseif;is_no_mention;date_place [*with]%nn; %end; %end; %end; %define;long_married(xx) %apply;married_to%with;%xx.is_male%and; %if;(marriage_place="") %if;(on_marriage_date="") %else; %on_marriage_date; %if;wedding_birthday; ([happy birthday to them!])%end; %end; %else; %if;(on_marriage_date=""), %marriage_place;, %else; %on_marriage_date; %if;wedding_birthday; ([happy birthday to them!])%end; , %marriage_place, %end; %end; %end; %end; %define;display_date_marriage_parent(xx) %foreach;xx.mother.family; %if;(spouse.access=xx.father.access) %if;(marriage_date.year!="")- %marriage_date.prec; %marriage_date.year; -%else; %end; %end; %end; %end; %define;witness_relation(xxx,yyy) [*witness at marriage of %s and %s:::xxx:yyy] %end; %define;display_sibling() %apply;li_SDC("child") %if;(child.has_image and child.index!=central_index)
    %end; %apply;image_MF("child","13") %apply;short_display_person("child") %if;child.has_families; %foreach;child.family; %if;(family_cnt!=1) %child;%child.title;%child.dates; %end; %apply;long_married("child") %apply;image_MF("spouse","13") %apply;short_display_person("spouse") %end; %end; %if;(child.has_image and child.index!=central_index)
    %end;
  • %end; %define;list_half_siblings()
      %apply;li_SD("spouse") %if;spouse.has_image;
      [with] %apply;image_MF("spouse","13") %apply;short_display_person("spouse")
      %else; [with] %apply;image_MF("spouse","13") %apply;short_display_person("spouse") %end; %if;has_children;
        %foreach;child; %apply;display_sibling() %end;
      %end;
    %end; %define;display_shared_parent(xxx) [*on %s's side:::xxx] %end; %define;nav_with_sosa_ref(xxx) [*navigation with %t as Sosa reference:::xxx]%nn; %end; %let;central_index;%index;%in; %let;central_person;%first_name_key_strip;%sp;%surname_key_strip;%in; %message_to_wizard;
    %apply;image_MF("self","13")
    %apply;display_arrows()

    %if;has_public_name; %if;has_qualifiers;%public_name; %qualifier; %else;%public_name; %surname;%end; %else; %if;has_qualifiers;%first_name; %qualifier; %else; %if;cancel_links;%first_name; %surname; %else; %first_name; %surname; %end; %end; %end;

    %if;(has_sosa or has_qualifiers or has_aliases or has_nobility_titles or has_public_name or has_surnames_aliases or has_first_names_aliases or has_linked_page.HEAD)
    %if;has_sosa; %apply;display_sosa("self") [*Sosa] : %if;cancel_links;%sosa; %else;%sosa;%end; %end; %foreach;qualifier; %if;not is_first; %if;has_public_name;%public_name; %qualifier; %else;%first_name; %qualifier;%end; %end; %end; %foreach;alias; %alias; %end; %if;has_nobility_titles; %foreach;nobility_title; %if;not is_first;, %end; %nobility_title; %end; %end; %if;has_linked_page.HEAD;%linked_page.HEAD;%end; %if;(has_public_name or has_qualifiers) (%if;cancel_links;%first_name; %surname; %else; %first_name; %surname;%nn; %end;) %end; %foreach;surname_alias; (%first_name; %surname_alias;) %end; %foreach;first_name_alias; (%first_name_alias; %surname;) %end;

    %end; %if;has_image;
    %end; %apply;display_vertical("self") %if;has_image;
    %end; %if;has_parents; %if;(father.has_image or mother.has_image)
    %if;father.has_image; %else; %end;

    [*parents]

    %if;(has_birth_date and (father.has_birth_date or mother.has_birth_date))
    %apply;age_at_birth_of(central_person)
    %nn; %if;father.has_birth_date;%father_age_at_birth; %else; %end; | %nn; %if;mother.has_birth_date; %mother_age_at_birth;%else; %end;
    %end;
    %if;mother.has_image; %else; %end;
    %apply;display_vertical("father") %foreach;father.family; %if;(spouse.access=mother.access) %apply;long_married("father") %if;are_divorced;[divorced]0%divorce_date;%end; %if;are_separated;[separated]0%end; %end; %end; %apply;display_vertical("mother")
    %else;

    [*parents]

      %apply;li_SD("father") %apply;image_MF("father","13") %apply;display_horizontal("father") %foreach;father.family; %if;(spouse.access=mother.access)%nn; %apply;long_married("father") %end; %end; %apply;li_SD("mother") %apply;image_MF("mother","13") %apply;display_horizontal("mother") %foreach;father.family; %if;(spouse.access=mother.access) %if(are_divorced or are_separated) %nn; %if;are_divorced;[divorced]0%divorce_date;%end; %if;are_separated;[separated]0%end; %end; %end; %end;
    %end; %end; %if;has_families;

    [*marriage/marriages]1%sp; %if;(max_desc_level>0) [and::child/children]1%end; %if;(max_desc_level>1) , [the grandchildren]%end; %if;(max_desc_level>2) , [the great-grandchildren]%end;

      %foreach;family; %apply;li_SD("spouse") %if;spouse.has_image;
      %end; %apply;long_married("self")%sp; %apply;image_MF("spouse","13") %apply;display_horizontal("spouse") %nn; %if;spouse.has_parents; ([parents] : %apply;image_MF("spouse.father","13") %apply;short_display_person("spouse.father")  &  %apply;image_MF("spouse.mother","13") %apply;short_display_person("spouse.mother")) %end; %if;has_witnesses; ([witness/witnesses]w : %foreach;witness; %if;not is_first;, %end; %apply;image_MF("witness","13") %apply;short_display_person("witness")%nl; %end; )%end; %nl; %if;((wizard or friend or bvar.no_note_for_visitor="" or bvar.no_note_for_visitor="no") and has_comment) (%comment;)%end; %if;are_divorced;, [divorced]0%divorce_date;%end; %if;are_separated;, [separated]0%end; %if;spouse.has_image;
      %end; %if;has_children; %nl; , [having as children]0
        %foreach;child; %apply;li_SDC("child") %if;child.has_image;
        %end; %apply;image_MF("child","13") %apply;short_display_person("child") %if;child.has_families; %foreach;child.family; %if;(family_cnt!=1) %sp; %child;%child.title;%child.dates;%end;  %apply;long_married("child") %apply;image_MF("spouse","13") %apply;short_display_person("spouse") %if;are_divorced; [divorced]0%divorce_date;%end; %if;are_separated; [separated]0%end; %if;(nb_children!=0)  [having as children]0 %if;(child.has_image and family_cnt=1)
        %end;%nl;
          %foreach;child; %apply;li_SDC("child") %apply;image_MF("child","11") %apply;short_display_person("child") %if;child.has_families; %foreach;child.family; %if;(family_cnt!=1) %child;%child.title;%child.dates;%nl;%end;  %apply;long_married("child") %apply;image_MF("spouse","11") %apply;short_display_person("spouse") %if;are_divorced; [divorced]0%divorce_date;%end; %if;are_separated; [separated]0%end; %if;(nb_children!=0)  [having as children]0 :
          %nn; %foreach;child; %if;(child_cnt!=1) , %end; %apply;image_MF("child","10") %apply;short_display_person("child") %end;
          %end; %end; %end; %end;
        %else; %if;(child.has_image and family_cnt=1) %else;%nl;%end; %end; %end; %else; %if;child.has_image;%nl;%end; %end; %end;
      %end; %if;(evar_opt="from" and wizard)(%origin_file;)%nl;%end; %end;
    %end; %if;has_siblings;

    %nn; %if;(bvar.full_siblings="" or bvar.full_siblings="yes") [*full siblings]%nn; %else; [*siblings]%nn; %end;

      %foreach;father.child; %if;((bvar.full_siblings="" or bvar.full_siblings="yes") or child.index!=central_index) %apply;display_sibling() %end; %end;
    %end; %if;has_parents; %if;(father.nb_families>1 or mother.nb_families>1) %reset_count; %foreach;father.family; %if;(spouse.index!=mother.index) %if;(nb_children>0)%incr_count;%end; %end; %end; %foreach;mother.family; %if;(spouse.index!=father.index) %if;(nb_children>0)%incr_count;%end; %end; %end; %if;(count!=0)

    [*half-siblings]

    %foreach;parent; %if;(parent.nb_families>1) %end; %end; %if;(father.nb_families>1) %end; %if;(mother.nb_families>1) %end;
    %apply;display_shared_parent%with; %apply;image_MF("parent","13") %apply;short_display_person("parent")%end;
    %foreach;father.family; %if;(spouse.index!=mother.index) %apply;list_half_siblings() %end; %end; %foreach;mother.family; %if;(spouse.index!=father.index) %apply;list_half_siblings() %end; %end;
    %end; %end; %end; %if;has_parents;
    %if;(max_anc_level>3) %( line 1 : up to 8 great-grandparents %) %if;(father.has_parents and father.father.has_parents) %else; %end; %if;(father.has_parents and father.mother.has_parents) %else; %end; %if;(mother.has_parents and mother.father.has_parents) %else; %end; %if;(mother.has_parents and mother.mother.has_parents) %else; %end; %( line 2 : up to 8 vertical lines with numbers and marriage dates %) %if;(father.has_parents and father.father.has_parents) %end; %if;(father.has_parents and father.mother.has_parents) %end; %if;(mother.has_parents and mother.father.has_parents) %end; %if;(mother.has_parents and mother.mother.has_parents) %end; %( line 3: up to 4 horizontal lines %) %if;(father.has_parents and father.father.has_parents) %end; %if;(father.has_parents and father.mother.has_parents) %end; %if;(mother.has_parents and mother.father.has_parents) %end; %if;(mother.has_parents and mother.mother.has_parents) %end; %( line 4 : up to 4 vertical lines %) %if;(father.has_parents and father.father.has_parents) %end; %if;(father.has_parents and father.mother.has_parents) %end; %if;(mother.has_parents and mother.father.has_parents) %end; %if;(mother.has_parents and mother.mother.has_parents) %end; %end; %if;(max_anc_level>2) %( line 5 : up to 4 grandparents %) %if;father.has_parents; %else; %end; %if;mother.has_parents; %else; %end; %( line 6 : up to 4 vertical lines with numbers and marriage dates %) %if;father.has_parents; %end; %if;mother.has_parents; %end; %( line 7 : up to 2 horizontal lines %) %if;father.has_parents; %end; %if;mother.has_parents; %end; %( line 8 : up to 2 vertical lines %) %if;father.has_parents; %end; %if;mother.has_parents; %end; %end; %( line 9 : 2 parents %) %( line 10 : 2 vertical lines with numbers and marriage date %) %( line 11 : 2 horizontal lines %) %( line 12 : 1 vertical line %) %( line 13 : 1 person %)

    [*ancestors]

    %nn; [*the great-grandparents]

    %nn; %apply;image_MF("father.father.father","10") %apply;short_display_person("father.father.father")   %nn; %apply;image_MF("father.father.mother","10") %apply;short_display_person("father.father.mother")  %nn; %apply;image_MF("father.mother.father","10") %apply;short_display_person("father.mother.father")   %nn; %apply;image_MF("father.mother.mother","10") %apply;short_display_person("father.mother.mother")  %nn; %apply;image_MF("mother.father.father","10") %apply;short_display_person("mother.father.father")   %nn; %apply;image_MF("mother.father.mother","10") %apply;short_display_person("mother.father.mother")  %nn; %apply;image_MF("mother.mother.father","10") %apply;short_display_person("mother.mother.father")   %nn; %apply;image_MF("mother.mother.mother","10") %apply;short_display_person("mother.mother.mother") 
    |8 %nn; %apply;display_date_marriage_parent("father.father") |9 |10 %nn; %apply;display_date_marriage_parent("father.mother") |11 |12 %nn; %apply;display_date_marriage_parent("mother.father") |13 |14 %nn; %apply;display_date_marriage_parent("mother.mother") |15
    %nn;

    %nn;
     %nn;

    %nn;
     %nn;

    %nn;
     %nn;

    %nn;
    | | | |

    %nn; [*the grandparents]

    %nn; %apply;image_MF("father.father","11") %apply;short_display_person("father.father")   %nn; %apply;image_MF("father.mother","11") %apply;short_display_person("father.mother")  %nn; %apply;image_MF("mother.father","11") %apply;short_display_person("mother.father")   %nn; %apply;image_MF("mother.mother","11") %apply;short_display_person("mother.mother") 
    |4 %nn; %apply;display_date_marriage_parent("father") |5 |6 %nn; %apply;display_date_marriage_parent("mother") |7
    %nn;

    %nn;
     %nn;

    %nn;
    | |

    [*the parents]

    %nn; %apply;image_MF("father","13") %apply;short_display_person("father")   %nn; %apply;image_MF("mother","13") %apply;short_display_person("mother")
    |2 %nn; %apply;display_date_marriage_parent("self") |3
    %nn;

    %nn;
    |
      %nn; %apply;image_MF("self","13") %apply;short_display_person("self")
    %end; %apply;include_file("templx/relations") %apply;include_file("templx/linked_pages") %apply;include_file("templx/notes") %apply;include_file("templx/sources") %apply;include_file("templx/links") %if;(evar_opt="misc")%misc_names;%end; %base_trailer; %copyright; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templf/anclist.txt0000660000175200017530000000013012664543647025246 0ustar guillaumeguillaume%define;include_file(file) %include.file; %end; %apply;include_file("templx/anclist")geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templf/deslist.txt0000660000175200017530000000013012664543647025260 0ustar guillaumeguillaume%define;include_file(file) %include.file; %end; %apply;include_file("templx/deslist")geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templf/anctree.txt0000660000175200017530000000013012664543647025232 0ustar guillaumeguillaume%define;include_file(file) %include.file; %end; %apply;include_file("templx/anctree")geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templf/ancsosa.txt0000660000175200017530000000013012664543647025240 0ustar guillaumeguillaume%define;include_file(file) %include.file; %end; %apply;include_file("templx/ancsosa")geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/deslist.txt0000660000175200017530000003004712664543647024003 0ustar guillaumeguillaume%doctype; %nn; %apply;a_of_b_gr_eq_lev%with; [*descendants]%nn; %and; %if;(public_name != "")%public_name;%else;%first_name;%end; %if;(qualifier != "") %qualifier;%end; %sp;%surname; %end; %include.css; %base_header; %message_to_wizard;

    %nn; %apply;a_of_b_gr_eq_lev%with; [*descendants]%nn; %and; %if;(public_name != "")%public_name;%else;%first_name;%end; %if;(qualifier != "") %qualifier;%end; %sp;%surname; %if;(alias != "") (%alias;)%end; %end;

    %if;not cancel_links;
    %if;(referer != "") << %end;
    %end; %define;tothegen(xx) [*to the %s generation:::xx]%nn; %end; %define;togen(xx) %if;(xx = 0)[*specify::generation/generations]0%nn; %elseif;(xx = 1)[*to the children]%nn; %elseif;(xx = 2)[*to the grandchildren]%nn; %elseif;(xx = 3)[*to the great-grandchildren]%nn; %else; %apply;tothegen%with; %apply;nth([nth (generation)], xx) %end; %end; %end; %define;link(xx) %if;(evar.cgl = "on")%xx;%else;%xx;%end; %xx.title;%xx.dates; %end; %define;p_link(aa, xx) %if;(evar.cgl = "on")xx%else;xx%end; %end; %define;somebody_long_info(xx) %if;xx.has_nobility_titles; %nn; %foreach;xx.nobility_title;, %nobility_title;%end; %nn; %end; %if;(xx.has_birth_date or xx.has_birth_place) , %if;xx.is_male;[born]0%elseif;xx.is_female;[born]1%else;[born]2%end; %if;xx.has_birth_date; %xx.on_birth_date;%end; %if;xx.has_birth_place;, %xx.birth_place;%end; %end; %if;(xx.has_baptism_date or xx.has_baptism_place) , %if;xx.is_male;[baptized]0%elseif;xx.is_female;[baptized]1%nn; %else;[baptized]2%end; %if;xx.has_baptism_date; %xx.on_baptism_date;%end; %if;xx.has_baptism_place;, %xx.baptism_place;%end; %end; %if;xx.is_dead;, %xx.died; %if;(xx.has_death_date) %xx.on_death_date;%end; %if;(xx.has_death_place), %xx.death_place;%end; %end; %if;xx.is_buried;, %if;xx.is_male;[buried]0%else;[buried]1%end; %if;xx.has_burial_date; %xx.on_burial_date;%end; %if;xx.has_burial_place;, %xx.burial_place;%end;%nl; %end; %if;xx.is_cremated;, %if;xx.is_male;[cremated]0%else;[cremated]1%end; %if;xx.has_cremation_date; %xx.on_cremation_date;%end; %if;xx.has_cremation_place;, %xx.cremation_place;%end;%nl; %end; %if;xx.computable_death_age;%sp; ([age at death:] %xx.death_age;)%nn; %end; %if;xx.has_occupation;, %xx.occupation;%end; %if;(evar.rel = "on" and xx.has_relations) %foreach;xx.relation;%nl; (%relation_type;: %if;has_relation_him;%apply;link(relation_him.var)%end;%nl; %if;has_relation_her;%apply;link(relation_her.var)%end;)%nn; %end; %foreach;xx.related;%nl; (%related_type;: %apply;link(related.var))%nn; %end; %end; %end; %define;married_to(is_male, date_place) %if;("is_male" = 1) %if;are_married;[married%t to:::date_place]0%nn; %elseif;are_not_married;[relationship%t to:::date_place]0%nn; %elseif;are_engaged;[engaged%t to:::date_place]0%nn; %elseif;is_no_sexes_check;[relationship%t to:::date_place]0%nn; %elseif;is_no_mention;date_place [with]%nn; %end; %else; %if;are_married;[married%t to:::date_place]1%nn; %elseif;are_not_married;[relationship%t to:::date_place]1%nn; %elseif;are_engaged;[engaged%t to:::date_place]1%nn; %elseif;is_no_sexes_check;[relationship%t to:::date_place]1%nn; %elseif;is_no_mention;date_place [with]%nn; %end; %end; %end; %define;descendants_by_list(xx, yy, curlev, maxlev, famlev, ctr) %if;(curlev = 0)

    %nl;%end; %if;(evar.cgl = "on" or xx.is_restricted)%yy;%nn; %else;%yy;%nn; %end; %nn; %apply;somebody_long_info("xx"). %if;((evar.notes = "on" and xx.has_notes and evar.inline = "on") or (evar.src = "on" and xx.has_sources and evar.inline = "on"))

    %if;(evar.notes = "on" and xx.has_notes) [*note/notes]0 : %apply;clean_html_tags(xx.notes) %end; %if;(evar.src = "on" and xx.has_sources) [*source/sources]1 : %foreach;xx.source; %source_type;: %apply;clean_html_tags(source) %if;(not is_last),%sp;%end; %end; %end;

    %end; %if;((((evar.notes="on" and xx.has_notes) and (wizard or friend or bvar.no_note_for_visitor="" or bvar.no_note_for_visitor="no")) or (evar.src="on" and xx.has_sources)) and evar.inline != "on")%sp; %[[*note/notes]0%sp;%nn;%ctr;%]%nn; %end %incr_count; %apply;lazy_print%with;%nl;%end; %foreach;xx.family; %if;(family_cnt != 1 and curlev = 0)

    %nl;%end; %lazy_force; %apply;capitalize%with; %apply;married_to%with; %xx.is_male; %and; %if;(on_marriage_date != "") %on_marriage_date;%end; %if;(marriage_place != ""), %marriage_place;,%end; %end; %end;%nl; %if;(evar.cgl = "on" or spouse.is_restricted)%spouse;%nn; %else;%spouse;%nn; %end; %nn; %apply;somebody_long_info("spouse") %if;((evar.notes = "on" and spouse.has_notes and evar.inline = "on") or (evar.src = "on" and spouse.has_sources and evar.inline = "on"))

    %if;(evar.notes = "on" and spouse.has_notes) [*note/notes]0 : %apply;clean_html_tags(spouse.notes) %end; %if;(evar.src = "on" and spouse.has_sources) [*source/sources]1 : %foreach;spouse.source; %source_type;: %apply;clean_html_tags(source) %if;(not is_last),%sp;%end; %end; %end;

    %end; %if;((((evar.notes="on" and spouse.has_notes) and (wizard or friend or bvar.no_note_for_visitor="" or bvar.no_note_for_visitor="no")) or (evar.src="on" and spouse.has_sources)) and evar.inline != "on")%sp; %[[*note/notes]0%sp;%nn;%ctr;-%family_cnt;%]%nn; %end; %if;(evar.witn = "on" and has_witnesses)%nl; ([witness/witnesses]1: %foreach;witness; %if;(not is_first),%nl;%end; %apply;link(witness.var) %end;)%sq; %end; %if;(evar.comm = "on" and has_comment)%nl;(%comment;)%end; %if;are_divorced;, [divorced]%end; %if;(curlev < maxlev) %if;(curlev = 0 or evar.t = "M" and xx.is_male or evar.t = "F" and xx.is_female or evar.t = "L") %if;(family.desc_level < famlev) , [see further]. %apply;lazy_print%with;%nl;%end; %elseif;(family.desc_level > famlev) , [see above]. %apply;lazy_print%with;%nl;%end; %elseif;has_children;

    ... [having as children]

    %family.set_infinite_desc_level; %if;(curlev = 0)

    %nl;%end;
      %foreach;child;
    • %if;(evar.alwsurn = "yes") %apply;descendants_by_list("child", "child", curlev+1, maxlev, famlev+1, count+1) %else; %apply;descendants_by_list("child", "child_name", curlev+1, maxlev, famlev+1, count+1) %end;
    • %end;
    %apply;lazy_print%with;%end; %else;. %if;(curlev = 0)%nl;

    %nl; %else;%apply;lazy_print%with;%nl;%end; %end; %end; %elseif;has_children;, ... %else;. %end; %else;.%nl; %apply;lazy_print%with;%nl;%end; %end; %end; %end; %define;notes_by_list(xx, curlev, maxlev, famlev, ctr) %incr_count; %if;(((evar.notes="on" and xx.has_notes) and (wizard or friend or bvar.no_note_for_visitor="" or bvar.no_note_for_visitor="no")) or (evar.src="on" and xx.has_sources))
    %ctr;%sp; (%xx; %xx.dates;)
    %if;((evar.notes="on" and xx.has_notes) and (wizard or friend or bvar.no_note_for_visitor="" or bvar.no_note_for_visitor="no"))
    %xx.notes;
    %end; %if;(evar.src="on" and xx.has_sources) [*source/sources]1: %foreach;xx.source; - %source_type;: %source; %end; %end;
    %end; %foreach;xx.family; %if;(((evar.notes="on" and spouse.has_notes) and (wizard or friend or bvar.no_note_for_visitor="" or bvar.no_note_for_visitor="no")) or (evar.src="on" and spouse.has_sources))
    %ctr; -%family_cnt;%sp; (%spouse; %spouse.dates;)
    %if;((evar.notes="on" and spouse.has_notes) and (wizard or friend or bvar.no_note_for_visitor="" or bvar.no_note_for_visitor="no"))
    %spouse.notes;
    %end; %if;(evar.src="on" and spouse.has_sources) [*source/sources]1: %foreach;spouse.source; - %source_type;: %source; %end; %end;
    %end; %if;(curlev < maxlev) %if;((curlev=0) or (evar.t="M" and xx.is_male) or (evar.t="F" and xx.is_female) or (evar.t="L")) %if;(family.desc_level < famlev)%nn; %elseif;(family.desc_level > famlev)%nn; %elseif;has_children; %family.set_infinite_desc_level; %foreach;child; %apply;notes_by_list("child", curlev+1, maxlev, famlev+1, count+1) %end; %end; %end; %end; %end; %end; %define;by_list(xx)

    %if;((evar.notes = "on" or evar.src = "on") and evar.inline != "on") [*see]: [*descendants]%sp;%nn; %end; %if;((evar.notes = "on" or evar.src = "on") and evar.inline != "on") | [*note/notes]1 %end;

    %reset_count;

    %apply;togen(xx).  

    %reset_count; %apply;descendants_by_list("self", "self", 0, xx, 0, 1)%nl;

    [*total]: %expr(count-1) [[person/persons]1@(c)]%sp; ([spouses not included]). %if;((evar.notes="on" or evar.src="on") and evar.inline != "on")

    %if;(evar.notes = "on")[*note/notes]1%else;[*source/sources]1%end;  

    %reset_count; %reset_desc_level; %apply;notes_by_list("self", 0, xx, 0, 1)%nl;
    %end;

    %end; %apply;by_list%with; %if;(bvar.max_desc_level = "")%apply;min(evar.v, max_desc_level, 12) %else;%apply;min(evar.v, max_desc_level, bvar.max_desc_level)%end; %end; %base_trailer; %copyright; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/anctree.txt0000660000175200017530000001430512664543647023754 0ustar guillaumeguillaume%if;(evar.t = "T")%doctype_transitional;%else;%doctype;%end; %nn; %if;(evar.t = "A")[*male line/female line]0%nn; %elseif;(evar.t = "C")[*male line/female line]1%nn; %else[*tree]%end; %if;(evar.t = "A" or evar.t = "C"):%sp; %if;(public_name != "")%public_name;%else;%first_name;%end; %if;(qualifier != "") %qualifier;%end; %surname; %end; %include.css; %base_header; %message_to_wizard; %define;a_tree_line() %if;(not is_first) %foreach;cell; %if;(not is_first)   %end; %nn; %if;(cell.is_empty or cell.is_top) %else;|%end; %end; %end; %foreach;cell; %if;(not is_first)   %end; %nn; %if;(cell.is_empty) %nn; %else; %if;(evar.bd != "" and evar.bd > 0 or evar.color != "")%nl;
    %nn; %end; %if;(evar.cgl = "on")%cell.person; %else; %cell.person;%nn; %end; %cell.person.title;%cell.person.dates; %if;(evar.bd != "" and evar.bd > 0 or evar.color != "")
    %end; %if;(evar.image = "on" and cell.person.has_image) %nl;
    %nn; %if;(evar.cgl != "on")%end; %nn; %if;(evar.cgl != "on")%end;
    %end; %end; %end; %if;(not is_last) %foreach;cell; %if;(not is_first) %nn; %if;cell.is_right; %if;(evar.marriage = "on" and cell.family.marriage_date.year != "") %nn; - %nn; %if;(cell.family.marriage_date.prec = "<") /%cell.family.marriage_date.year;%nn; %elseif;(cell.family.marriage_date.prec = ">") %cell.family.marriage_date.year;/%nn; %elseif;(cell.family.marriage_date.prec = "|" or cell.family.marriage_date.prec = "..") %cell.family.marriage_date.year;%nn; %else; %cell.family.marriage_date.prec;%cell.family.marriage_date.year;%nn; %end;  - %else; %end; %else; %end; %end; %nn; %if;cell.is_empty; %nn; %elseif;(evar.cgl = "on")|%nn; %else; |%nn; %end; %end; %foreach;cell; %if;(not is_first) %nn; %if;(cell.is_right)
    %nn; %else; %end; %end; %nn; %if;cell.is_empty; %nn; %elseif;cell.is_left;
    %nn; %elseif;cell.is_right;
    %nn; %else;|%end; %end; %end; %end; %define;male_line(xx, nn) %if;(nn > 0) %if;(xx.has_parents)%apply;male_line("xx.father", nn - 1)%end; %xx;%xx.title;%xx.dates; %if;(evar.image = "on" and xx.has_image) %if;(evar.cgl != "on")%end; [image/images]0 %if;(evar.cgl != "on")%end; %end; %if;("xx" != "self")|%end; %end;%nl; %end; %define;female_line(xx, nn) %if;(nn > 0) %if;(xx.has_parents)%apply;female_line("xx.mother", nn - 1)%end; %xx;%xx.title;%xx.dates; %if;(evar.image = "on" and xx.has_image) %if;(evar.cgl != "on")%end; [image/images]0 %if;(evar.cgl != "on")%end; %end; %if;("xx" != "self")|%end; %end;%nl; %end; %if;(evar.t = "T")%nn;
    %nn; //
    %end; %define;tree(xx) %foreach;ancestor_tree_line(xx) %apply;a_tree_line() %end;
    %end; %if;(evar.t = "T") %apply;tree%with; %if;(bvar.max_anc_tree = "")%apply;min(evar.v, max_anc_level, 7) %else;%apply;min(evar.v, max_anc_level, bvar.max_anc_tree)%end; %end; %elseif;(evar.t = "A")
    %apply;male_line("self", evar.v)
    %elseif;(evar.t = "C")
    %apply;female_line("self", evar.v)
    %end; %base_trailer; %copyright; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/ancsosa.txt0000660000175200017530000013060112664543647023760 0ustar guillaumeguillaume%doctype; %nn; %if;(evar.t = "D") [*ancestors] ... [up to] ...%nn; %elseif;(evar.t = "N" and evar.only = "on") [*generation/generations]0 %evar.v; %else; %apply;a_of_b%with; %if;(evar.t = "M") %if;(evar.evt = "on")[*missing events]%else;[*missing ancestors]%end; %else;[*ancestors] %end; %and; %if;(public_name != "")%public_name;%else;%first_name;%end; %if;(qualifier != "") %qualifier;%end; %sp;%surname; %end; %end; %include.css; %base_header; %message_to_wizard;

    %nn; %apply;a_of_b%with; %if;(evar.t = "M") %if;(evar.evt = "on")[*missing events]%else;[*missing ancestors]%end; %else;[*ancestors] %end; %and; %if;(public_name != "")%public_name;%else;%first_name;%end; %if;(qualifier != "") %qualifier;%end; %sp;%surname; %if;(alias != "") (%alias;)%end; %end; %if;(evar.t = "D") [up to] %pvar.1;%end;

    %if;(evar.cgl != "on")
    %if;(referer != "") << %end;
    %end; %let;central_index;%index;%in; %define;tothegen(xx) [*to the %s generation:::xx]%nn; %end; %define;thegen(xx) [*the %s generation:::xx]%nn; %end; %define;togena(xx) %if;(xx = 1)[*specify::generation/generations]0%nn; %elseif;(xx = 2)[*to the parents]%nn; %elseif;(xx = 3)[*to the grandparents]%nn; %elseif;(xx = 4)[*to the great-grandparents]%nn; %else; %apply;tothegen%with; %apply;nth([nth (generation)], xx) %end; %end; %end; %define;tothegen(xx) [*to the %s generation:::xx]%nn; %end; %define;thegen(xx) [*the %s generation:::xx]%nn; %end; %define;togen(xx) %if;(xx = 1)[*specify::generation/generations]0%nn; %elseif;(xx = 2)[*to the parents]%nn; %elseif;(xx = 3)[*to the grandparents]%nn; %elseif;(xx = 4)[*to the great-grandparents]%nn; %else; %apply;tothegen%with; %apply;nth([nth (generation)], xx) %end; %end; %end; %define;gen(xx) %if;(evar.xx = 1)[*specify::generation/generations]0%nn; %elseif;(evar.xx = 2)[*the parents]%nn; %elseif;(evar.xx = 3)[*the grandparents]%nn; %elseif;(evar.xx = 4)[*the great-grandparents]%nn; %else; %apply;thegen%with; %apply;nth([nth (generation)], evar.xx) %end; %end; %end; %define;image_MF(xx,wi_he) %if;(xx != "x x") %if;xx.is_male; [M/F]0%nn; %elseif;xx.is_female; [M/F]1%nn; %else; ?%nn; %end; %sp; %end; %end; %define;letter(xx) %apply;nth%with; /a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z %and;xx%end; %end; %define;living_interval_dates(xxx, yyy) %if;(evar.after != "" and evar.before != "") ,%sp;[living between %s and %s:::xxx:yyy] %elseif;(evar.before != "") ,%sp;[living before %s:::yyy] %elseif;(evar.after != "") ,%sp;[living after %s:::xxx] %else; %( On n'affiche rien %) %end; %end; %define;ancestor_missing_birth(xx) %if;(xx.has_birth_date or xx.has_birth_place) %if;xx.has_birth_date; %xx.slash_birth_date;%end; %if;xx.has_birth_place; - %xx.birth_place;%end; %elseif;(xx.has_baptism_date or xx.has_baptism_place) %if;xx.has_baptism_date; %xx.slash_baptism_date;%end; %if;xx.has_baptism_place; - %xx.baptism_place;%end; %else;   %end; %end; %define;ancestor_missing_death(xx) %if;xx.is_dead; %if;xx.has_death_date; %xx.slash_death_date;%end; %if;xx.has_death_place; - %xx.death_place;%end; %elseif;xx.is_buried; %if;xx.has_burial_date; %xx.slash_burial_date;%end; %if;xx.has_burial_place; - %xx.burial_place;%end; %elseif;xx.is_cremated; %if;xx.has_cremation_date; %xx.slash_cremation_date;%end; %if;xx.has_cremation_place; - %xx.cremation_place;%end; %else;   %end; %end; %define;display_missing_ancestor_info(xx) %if;(evar.birth = "on") %apply;ancestor_missing_birth("xx") %end; %if;(evar.death = "on") %apply;ancestor_missing_death("xx") %end; %if;(evar.spouse = "on") %if;xx.has_families; %if;(not xx.has_parents and xx.first_name != "?" and xx.surname != "?") %foreach;xx.family; %if;(spouse.first_name != "?" and spouse.surname != "?") %if;(family_cnt > 1),%sp;%end; %apply;image_MF("spouse", "11") %apply;link(spouse.access, spouse) %end; %end; %end; %end; %end; %end; %define;somebody_long_info(xx) %if;xx.has_aliases; %foreach;xx.alias;, [alias] %alias;%end; %end; %if;(("xx" = "ancestor" or xx.sosa_in_list = "") and xx.has_nobility_titles) %nn; %foreach;xx.nobility_title;, %nobility_title;%end; %nn; %end; %if;(xx.has_birth_date or xx.has_birth_place) , %if;xx.is_male;[born]0%elseif;xx.is_female;[born]1%else;[born]2%end; %if;xx.has_birth_date; %xx.on_birth_date;%end; %if;xx.has_birth_place;, %xx.birth_place;%end; %end; %if;(xx.has_baptism_date or xx.has_baptism_place) , %if;xx.is_male;[baptized]0%elseif;xx.is_female;[baptized]1%nn; %else;[baptized]2%end; %if;xx.has_baptism_date; %xx.on_baptism_date;%end; %if;xx.has_baptism_place;, %xx.baptism_place;%end; %end; %if;xx.is_dead;, %xx.died; %if;(xx.has_death_date) %xx.on_death_date;%end; %if;(xx.has_death_place), %xx.death_place;%end; %end; %if;xx.is_buried;, %if;xx.is_male;[buried]0%else;[buried]1%end; %if;xx.has_burial_date; %xx.on_burial_date;%end; %if;xx.has_burial_place;, %xx.burial_place;%end;%nl; %end; %if;xx.is_cremated;, %if;xx.is_male;[cremated]0%else;[cremated]1%end; %if;xx.has_cremation_date; %xx.on_cremation_date;%end; %if;xx.has_cremation_place;, %xx.cremation_place;%end;%nl; %end; %if;xx.computable_death_age;%sp; ([age at death:] %xx.death_age;)%nn; %end; %end; %define;link(aa, xx) %if;(evar.cgl = "on")xx%else;xx%end; %end; %define;link2(xx) %if;(evar.cgl = "on")%xx;%else;%xx;%end; %xx.title;%xx.dates; %end; %define;my_link(aa, xx, rr) %if;(evar.cgl = "on" or rr)xx%else;xx%end; %end; %define;somebody_extra_info(xx) %if;xx.has_occupation;, %xx.occupation;%end; %if;(evar.rel = "on" and xx.has_relations) %foreach;xx.relation;%nl; (%relation_type;: %if;has_relation_him; %apply;link2(relation_him.var) %if;(relation_him.sosa_in_list != ""), [see] %nn; %relation_him.sosa_in_list;%nn; %end; %end; %if;has_relation_her; %if;has_relation_him;,%nl;%end; %apply;link2(relation_her.var) %if;(relation_her.sosa_in_list != ""), [see] %nn; %relation_her.sosa_in_list;%nn; %end; %end;)%nn; %end; %foreach;xx.related;%nl; (%related_type;: %apply;link2(related.var) %if;(related.sosa_in_list != ""), [see] %nn; %related.sosa_in_list;%nn; %end;)%nn; %end; %end; %end; %define;somebody(xx) %apply;my_link(xx.access, xx, xx.is_restricted)%nn; %apply;somebody_long_info("xx") %apply;somebody_extra_info("xx") %end; %define;somebody_spouse_parent(xx) %apply;my_link(spouse.xx.access, spouse.xx, spouse.is_restricted)%nn; %if;spouse.xx.has_nobility_titles;, %nn; %spouse.xx.nobility_title;%nn; %end; %spouse.xx.dates; %if;(spouse.xx.sosa_in_list != "")%sp; ([see] %spouse.xx.sosa_in_list; )%nn; %end; %end; %define;image_sosa(xxx,yyy) sosa%nn; %end; %define;display_sosa(xx) %if;(xx.has_sosa and bvar.display_sosa="yes") %if;not cancel_links;%end; %apply;image_sosa%with;%sosa_ref.first_name_key_strip;%sp; %sosa_ref.surname_key_strip; %and;%xx.sosa;%end; %if;not cancel_links;%end;%sp; %end; %end; %define;short_display_person(xx) %apply;display_sosa("xx") %if;(xx.index=central_index)%xx;%else; %if;(cancel_links or xx.is_restricted)%xx; %else;%xx;%end; %end; %xx.title;%xx.dates; %end; %define;married_to(is_male, date_place) %if;("is_male" = 1) %if;are_married;[married%t to:::date_place]0%nn; %elseif;are_not_married;[relationship%t to:::date_place]0%nn; %elseif;are_engaged;[engaged%t to:::date_place]0%nn; %elseif;is_no_sexes_check;[relationship%t to:::date_place]0%nn; %elseif;is_no_mention;date_place [with]%nn; %end; %else; %if;are_married;[married%t to:::date_place]1%nn; %elseif;are_not_married;[relationship%t to:::date_place]1%nn; %elseif;are_engaged;[engaged%t to:::date_place]1%nn; %elseif;is_no_sexes_check;[relationship%t to:::date_place]1%nn; %elseif;is_no_mention;date_place [with]%nn; %end; %end; %end; %( Long display %) %define;child_notes(spec) %if;(child.sosa_in_list = "" and (evar.src = "on" and child.has_sources or evar.notes = "on" and child.has_notes))
    %ancestor.anc_sosa; %if;("spec" != "")-spec%end; %apply;letter(child_cnt):
    %if;(evar.notes = "on" and child.has_notes)
    %child.notes;
    %end; %if;(evar.src = "on" and child.has_sources) [*source/sources]1: %foreach;child.source; - %source_type;: %source; %end; %end;
    %end; %end; %define;long_display_notes()

    %if;(evar.notes = "on")[*note/notes]1%else;[*source/sources]1%end;  

    %foreach;ancestor_level; %if;(evar.v != "" and level <= evar.v and (evar.only != "on" or level = evar.v)) %foreach;ancestor; %if;((evar.src = "on" and ancestor.has_sources or evar.notes = "on" and ancestor.has_notes) and ancestor.same = "")
    %ancestor.anc_sosa;:
    %if;(evar.notes = "on" and ancestor.has_notes)
    %ancestor.notes;
    %end; %if;(evar.src = "on" and ancestor.has_sources) [*source/sources]1: %foreach;ancestor.source; - %source_type;: %source; %end; %end;
    %end; %if;(evar.siblings = "on" and ancestor.is_female and ancestor.same = "") %( siblings %) %if;(ancestor.index != self.index) %foreach;ancestor.family; %if;(family.index = ancestor.family.index) %foreach;child; %apply;child_notes("") %end; %end; %end; %( father's other families %) %foreach;ancestor.spouse.family; %if;(spouse.index != ancestor.index) %foreach;child; %apply;child_notes(family_cnt) %end; %end; %end; %( mother's other families %) %foreach;ancestor.family; %if;(spouse.index != ancestor.spouse.index) %foreach;child; %apply;child_notes(family_cnt) %end; %end; %end; %end; %end; %end; %end; %end;
    %end; %define;long_display_ancestor_personal() %apply;somebody("ancestor"). %if;(evar.only != "on" and ancestor.father_sosa != "") [*parents]:%sp; %ancestor.father_sosa;%sp; [and]%sp; %ancestor.mother_sosa;. %end; %if;(evar.siblings = "on") %foreach;ancestor.family; %if;(ancestor.index = index or family.index != ancestor.family.index) %apply;capitalize%with; %apply;married_to%with; %ancestor.is_male; %and; %if;(ancestor.index != index) (%family_cnt;)%end; %if;(on_marriage_date != "") %on_marriage_date;%end; %if;(marriage_place != ""), %marriage_place;, %end; %end;%sp; %end; %apply;somebody("spouse")%nn; %if;spouse.has_parents;,%sp; %apply;a_of_b%with; %if;spouse.is_male;[son/daughter/child]0 %else;[son/daughter/child]1%end; %and; %apply;somebody_spouse_parent("father") [and] %apply;somebody_spouse_parent("mother") %end; %end;. %end; %end; %end; %if;((evar.notes = "on" and ancestor.has_notes and evar.inline = "on") or (evar.src = "on" and ancestor.has_sources and evar.inline = "on"))

    %if;(evar.notes = "on" and ancestor.has_notes) [*note/notes]0 : %apply;clean_html_tags(ancestor.notes) %end; %if;(evar.src = "on" and ancestor.has_sources) [*source/sources]1 : %foreach;ancestor.source; %source_type;: %apply;clean_html_tags(source) %if;(not is_last),%sp;%end; %end; %end;

    %end; %if;((evar.notes = "on" and ancestor.has_notes or evar.src = "on" and ancestor.has_sources) and evar.inline != "on") %if;(evar.notes = "on")%[[*note/notes]0%sp; %else;%[[*source/sources]1%sp; %end; %ancestor.anc_sosa;%]. %end; %end; %define;child_long_info(spec) %apply;my_link(child.access, child.child_name, child.is_restricted)%nn;%nn; %apply;somebody_long_info("child") %if;(child.sosa_in_list != ""). %if;(evar.only != "on")[*see]%sp; %child.sosa_in_list;. %end; %else; %apply;somebody_extra_info("child"). %foreach;child.family; %if;(evar.inline= "on" and ((child.has_notes and evar.notes = "on") or (child.has_sources and evar.src = "on"))) %end; %apply;capitalize%with; %apply;married_to%with; %child.is_male; %and; %if;(on_marriage_date != "") %on_marriage_date;%end; %if;(marriage_place != ""), %marriage_place;, %end; %end;%sp; %end; %apply;somebody("spouse")%nn; %if;spouse.has_parents;,%sp; %apply;a_of_b%with; %if;spouse.is_male;[son/daughter/child]0 %else;[son/daughter/child]1%end; %and; %apply;somebody_spouse_parent("father") [and] %apply;somebody_spouse_parent("mother") %end; %end;. %if;are_divorced;[*divorced]0%divorce_date;.%nl; %elseif;are_separated;[*separated]0.%nl; %end; %end; %if;((evar.notes = "on" and child.has_notes and evar.inline = "on") or (evar.src = "on" and child.has_sources and evar.inline = "on"))

    %if;(evar.notes = "on" and child.has_notes) [*note/notes]0 : %apply;clean_html_tags(child.notes) %end; %if;(evar.src = "on" and child.has_sources) [*source/sources]1 : %foreach;child.source; %source_type;: %apply;clean_html_tags(source) %if;(not is_last),%sp;%end; %end; %end;

    %end; %if;((evar.notes = "on" and child.has_notes or evar.src = "on" and child.has_sources) and evar.inline != "on") %if;(evar.notes = "on")%[[*note/notes]0%sp; %else;%[[*source/sources]1%sp; %end; %ancestor.anc_sosa;%if;("spec" != "")-spec%end;%apply;letter(child_cnt) %]. %end; %end; %end; %define;long_display_ancestor_families() %if;ancestor.is_male; ... %foreach;ancestor.family; %if;(family.index = ancestor.family.index) %apply;married_to%with %ancestor.is_male; %and; %if;(on_marriage_date != "") %on_marriage_date;%end; %if;(marriage_place != ""), %marriage_place;, %end; %end;... %end; %end; %else; %foreach;ancestor.family; %if;(family.index = ancestor.family.index) ... %if;(evar.witn = "on" and has_witnesses)([witness/witnesses]1: %foreach;witness; %if;(not is_first),%nl;%end; %apply;link2(witness.var) %end;), %end; %if;(evar.comm = "on" and has_comment)(%comment;)%nl;%end; [having as children]:

      %foreach;child; %if;(evar.siblings = "on" or child.sosa_in_list != "")
    1. %apply;child_long_info("")
    2. %end; %end;

    %end; %end; %if;(evar.siblings = "on") %( father's other children %) %foreach;ancestor.spouse.family; %if;(spouse.index != ancestor.index and nb_children > 0) ... [having as children]%sp; %family.father.sosa_in_list; -(X%family_cnt;):

      %foreach;child;
    1. %apply;child_long_info(family_cnt)
    2. %end;

    %end; %end; %( mother's other children %) %foreach;ancestor.family; %if;(spouse.index != ancestor.spouse.index and nb_children > 0) ... [having as children]%sp; %family.mother.sosa_in_list; -(X%family_cnt;):

      %foreach;child;
    1. %apply;child_long_info(family_cnt)
    2. %end;

    %end; %end; %end; %end; %end; %define;dates_in_interval(xx) %if;(evar.after != "" and (xx.birth_date.year = "" and xx.baptism_date.year = "" and xx.death_date.year = "" and xx.burial_date.year = "" and xx.cremated_date.year = "" or xx.birth_date.year != "" and xx.birth_date.year < evar.after or xx.baptism_date.year != "" and xx.baptism_date.year < evar.after or xx.death_date.year != "" and xx.death_date.year < evar.after or xx.burial_date.year != "" and xx.burial_date.year < evar.after or xx.cremated_date.year != "" and xx.cremated_date.year < evar.after) or evar.before != "" and (xx.birth_date.year = "" and xx.baptism_date.year = "" and xx.death_date.year = "" and xx.burial_date.year = "" and xx.cremated_date.year = "" or xx.birth_date.year != "" and xx.birth_date.year > evar.before or xx.baptism_date.year != "" and xx.baptism_date.year > evar.before or xx.death_date.year != "" and xx.death_date.year > evar.before or xx.burial_date.year != "" and xx.burial_date.year > evar.before or xx.cremated_date.year != "" and xx.cremated_date.year > evar.before))false%nn; %else;true%end; %end; %( Display ascend in table %) %define;table_header() %reset_count; [*Sosa] %incr_count; [*person/persons]0 %incr_count; %if;(evar.birth = "on") [*date of birth] %incr_count; %end; %if;(evar.birth_place = "on") [*where born] %incr_count; %end; %if;(evar.marr = "on") [*spouse/spouses]1 %incr_count; %end; %if;(evar.marr_date = "on") [*date of marriage] %incr_count; %end; %if;(evar.marr_place = "on") [*where married] %incr_count; %end; %if;(evar.child = "on") [*nb children] %incr_count; %end; %if;(evar.death = "on") [*date of death] %incr_count; %end; %if;(evar.death_place = "on") [*where dead] %incr_count; %end; %if;(evar.death_age = "on") [*age at death] %incr_count; %end; %if;(evar.occu = "on") [*occupation/occupations]1 %incr_count; %end; %end; %define;table_row() %lazy_force; %if;(ancestor.same = "")%incr_count;%end; 1 and (evar.marr = "on" or evar.marr_date = "on" or evar.marr_place = "on"))rowspan="%ancestor.nb_families;"%end;> %if;(evar.sosab = 16)%ancestor.anc_sosa.hexa; %elseif;(evar.sosab = 8)%ancestor.anc_sosa.octal; %else;%ancestor.anc_sosa;%end; 1 and (evar.marr = "on" or evar.marr_date = "on" or evar.marr_place = "on"))rowspan="%ancestor.nb_families;"%end;> %apply;image_MF("ancestor", "11") %apply;link%with;%ancestor.access;%and; %ancestor; %end %ancestor.title; %if;(ancestor.same != "" and evar.repeat = "on") %sp;→ %if(evar.sosab = 16)%ancestor.same.hexa; %elseif(evar.sosab = 8)%ancestor.same.octal; %else;%ancestor.same;%end; %end; %if;(evar.birth = "on") 1 and (evar.marr = "on" or evar.marr_date = "on" or evar.marr_place = "on"))rowspan="%ancestor.nb_families;"%end;> %if;ancestor.has_birth_date; %ancestor.slash_birth_date; %elseif;ancestor.has_baptism_date; %ancestor.slash_baptism_date; %else;   %end; %end; %if;(evar.birth_place = "on") 1 and (evar.marr = "on" or evar.marr_date = "on" or evar.marr_place = "on"))rowspan="%ancestor.nb_families;"%end;> %if;ancestor.has_birth_date; %ancestor.birth_place; %elseif;ancestor.has_baptism_date; %ancestor.baptism_place; %else;   %end; %end; %if;(evar.marr = "on") %if;(ancestor.nb_families = 0)   %else; %foreach;ancestor.family; %if;(family_cnt = 1) 1) style="border-bottom:none" %end;> %apply;image_MF("spouse", "11") %apply;link%with;%spouse.access;%and; %spouse; %end; %end; %end; %end; %end; %if;(evar.marr_date = "on") %if;(ancestor.nb_families = 0)   %else; %foreach;ancestor.family; %if;(family_cnt = 1) 1) style="border-bottom:none" %end;> %if;(slash_marriage_date != "") %slash_marriage_date; %else;   %end; %end; %end; %end; %end; %if;(evar.marr_place = "on") %if;(ancestor.nb_families = 0)   %else; %foreach;ancestor.family; %if;(family_cnt = 1) 1) style="border-bottom:none" %end;> %if;(marriage_place != "") %marriage_place; %else;   %end; %end; %end; %end; %end; %if;(evar.child = "on") %if;(ancestor.nb_families = 0)   %else; %if;(evar.marr = "on" or evar.marr_date = "on" or evar.marr_place = "on") %foreach;ancestor.family; %if;(family_cnt = 1) 1) style="border-bottom:none" %end;> %nb_children; %end; %end; %else; %ancestor.nb_children; %end; %end; %end; %if;(evar.death = "on") 1 and (evar.marr = "on" or evar.marr_date = "on" or evar.marr_place = "on"))rowspan="%ancestor.nb_families;"%end;> %if;ancestor.has_death_date; %ancestor.slash_death_date; %elseif;ancestor.has_burial_date; %ancestor.slash_burial_date; %else;   %end; %end; %if;(evar.death_place = "on") 1 and (evar.marr = "on" or evar.marr_date = "on" or evar.marr_place = "on"))rowspan="%ancestor.nb_families;"%end;> %if;ancestor.has_death_date; %ancestor.death_place; %elseif;ancestor.has_burial_date; %ancestor.burial_place; %else;   %end; %end %if;(evar.death_age = "on") 1 and (evar.marr = "on" or evar.marr_date = "on" or evar.marr_place = "on"))rowspan="%ancestor.nb_families;"%end;> %ancestor.death_age; %end; %if;(evar.occu = "on") 1 and (evar.marr = "on" or evar.marr_date = "on" or evar.marr_place = "on"))rowspan="%ancestor.nb_families;"%end;> %if;(ancestor.has_occupation) %ancestor.occupation %else;   %end; %end; %end; %define;table_family() %if;(evar.marr = "on" or evar.marr_date = "on" or evar.marr_place = "on") %foreach;ancestor.family; %if;(family_cnt != 1) %if;(evar.marr = "on") %apply;image_MF("spouse", "11") %apply;link%with;%spouse.access;%and; %spouse; %end; %end; %if;(evar.marr_date = "on") %if;(slash_marriage_date != "") %slash_marriage_date; %else;   %end; %end; %if;(evar.marr_place = "on") %if;(marriage_place != "") %marriage_place; %else;   %end; %end; %if;(evar.child = "on") %nb_children; %end; %end; %end; %end; %end; %( Main %) %if;(evar.t = "P") %include.perso_short; %elseif;((evar.v = "" and evar.t != "D") or evar.v <= 1) [*specify::generation/generations]0. %else; %if;(evar.t = "N" and evar.only = "on") %( short display; only the selected generation %) %reset_count;
      %foreach;ancestor_level2; %if;(evar.v != "" and level = evar.v)
    • %nl;%apply;gen("v")%nl;
        %nl; %foreach;ancestor;
      • %sp; %if;(ancestor.interval != "")%ancestor.interval; %else; %if;(ancestor.same = "")%incr_count;%end; %ancestor.anc_sosa;%sp; %if;(ancestor.same != "")=>%else;-%end;%sp; %apply;link%with;%ancestor.access;%and; %if;(ancestor.same != "")%ancestor.same; %else;%ancestor;%end; %end; %if;(ancestor.same = "")%ancestor.title;%ancestor.dates;%end; %end;
      • %nl; %end;
    • %end; %end;

    [*total]: %count; [[person/persons]1@(c)]

    %elseif;(evar.t = "N") %( short display %) %let;nb_gen;%apply;min(evar.v, max_anc_level)%in;

    %apply;togen(nb_gen).

    %reset_count;
      %foreach;ancestor_level(nb_gen) %apply;lazy_print%with;
    • %nl;[*generation/generations]0 %level;%nl;
        %nl; %end; %foreach;ancestor; %lazy_force; %if;(ancestor.same = "")%incr_count;%end;
      • %nn; %if;(evar.sosab = 16)%ancestor.anc_sosa.hexa; %elseif;(evar.sosab = 8)%ancestor.anc_sosa.octal; %else;%ancestor.anc_sosa; %end;%sp; %if;(ancestor.same != "")=>%else;-%end;%sp; %apply;link%with;%ancestor.access;%and; %if;(ancestor.same != "")%nn; %if(evar.sosab = 16)%ancestor.same.hexa; %elseif(evar.sosab = 8)%ancestor.same.octal; %else;%ancestor.same; %end; %else;%ancestor; %end; %end; %if;(ancestor.same = "")%ancestor.title;%ancestor.dates;%end;
      • %nl; %end; %if;lazy_printed;
    • %end; %end;

    [*total]: %count; [[person/persons]1@(c)]

    %elseif;(evar.t = "M" and evar.evt = "on") %include.miss_evt; %elseif;(evar.t = "M" and evar.al = "on") %( missing ancestors alphabetically %) %let;nb_gen;%apply;min(evar.v, max_anc_level)%in;

    %apply;togen(nb_gen) %apply;living_interval_dates(evar.after, evar.before).

    %empty_sorted_list; %reset_count; %foreach;ancestor_level(nb_gen) %foreach;ancestor; %if;(ancestor.same = "") %if;(ancestor.first_name != "?" and ancestor.surname != "?" and (not ancestor.has_parents or (ancestor.has_families and (ancestor.spouse.first_name = "?" and ancestor.spouse.surname = "?")))) %if;(dates_in_interval(ancestor.var) = "true") %incr_count; %apply;add_in_sorted_list%with %ancestor.surname_end; %and;%ancestor.first_name; %and;%ancestor.surname_begin; %and;%ancestor.access; %and;%apply;image_MF("ancestor", "11") %and;%ancestor.nobility_title; %and;%apply;ancestor_missing_birth("ancestor") %and;%apply;ancestor_missing_death("ancestor") %and; %if;(not ancestor.has_parents) x %else;   %end; %and; %if;(ancestor.has_families and (ancestor.spouse.first_name = "?" and ancestor.spouse.surname = "?")) x %else;   %end; %end; %end; %end; %end; %end; %end; %let;nb_ind;%count;%in; %reset_count; %if;(nb_ind > 100)

    %foreach;sorted_list_item; %if;(initial(prev_item.1) != initial(item.1)) %apply;initial(item.1) %end; %end;

    %end;
      %if;(nb_ind <= 100)
    • %nn; %apply;initial(item.1) %if;(evar.birth = "on") %end; %if;(evar.death = "on") %end; %end; %foreach;sorted_list_item; %if;(initial(prev_item.1) != initial(item.1) and nb_ind > 100)
    • %nn; %apply;initial(item.1)
    • [*person/persons]0[*birth date and birth place][*death date and death place][*missing parents] [*missing spouse]
      %if;(evar.birth = "on") %end; %if;(evar.death = "on") %end; %end; %if;(evar.birth = "on") %end; %if;(evar.death = "on") %end; %if;(initial(item.1) != initial(next_item.1) and nb_ind > 100)
      [*person/persons]0[*birth date and birth place][*death date and death place][*missing parents] [*missing spouse]
      %if;(evar.cgl = "on") %item.5;%item.1;%sp;%item.2;%item.3; %else; %item.5;%item.1;%sp;%item.2;%item.3; %end; %if;(item.6 != ""), %item.6;%end; %item.7;%item.8; %item.9; %if;(initial(item.9) = "x")%incr_count;%incr_count;%end; %item.10; %if;(initial(item.10) = "x")%incr_count;%end;
    • %end; %end; %if;(nb_ind <= 100) %end;

    [*total]: %count; [[person/persons]1@(c)]

    %elseif;(evar.t = "M") %( missing ancestors by generation %) %let;nb_gen;%apply;min(evar.v, max_anc_level)%in;

    %apply;togen(nb_gen) %apply;living_interval_dates(evar.after, evar.before)

    %reset_count; %if;(evar.birth = "on") %incr_count; %end; %if;(evar.death = "on") %incr_count; %end; %if;(evar.spouse = "on") %incr_count; %end; %let;nb_col;%expr(count + 4)%in; %reset_count; %foreach;ancestor_level(nb_gen) %apply;lazy_print%with; %end; %foreach;ancestor; %if;(ancestor.same = "") %if;(not ancestor.has_parents and ancestor.first_name != "?" and ancestor.surname != "?") %if;(dates_in_interval(ancestor.var) = "true") %incr_count;%incr_count; %lazy_force; %apply;display_missing_ancestor_info("ancestor") %end; %elseif;(ancestor.has_parents) %if;(ancestor.father.first_name = "?" and ancestor.father.surname = "?") %if;(dates_in_interval(ancestor.mother.var) = "true") %incr_count; %lazy_force; %apply;display_missing_ancestor_info("ancestor.mother") %end; %end; %if;(ancestor.mother.first_name = "?" and ancestor.mother.surname = "?") %if;(dates_in_interval(ancestor.father.var) = "true") %incr_count; %lazy_force; %apply;display_missing_ancestor_info("ancestor.father") %end; %end; %end; %end; %end; %end;
    [*missing sosa] [*missing parents] [*missing spouse] [*person/persons]0[*birth date and birth place][*death date and death place][*spouse/spouses]1
    [*generation/generations]0 %expr(level+1)
    %expr(ancestor.anc_sosa.v * 2) - %expr(ancestor.anc_sosa.v * 2 + 1) x   %apply;image_MF("ancestor", "11") %apply;link(ancestor.access, ancestor) %ancestor.title;
    %expr(ancestor.anc_sosa.v * 2)   x %apply;image_MF("ancestor.mother", "11") %apply;link(ancestor.mother.access, ancestor.mother) %ancestor.mother.title;
    %expr(ancestor.anc_sosa.v * 2 + 1)   x %apply;image_MF("ancestor.father", "11") %apply;link(ancestor.father.access, ancestor.father) %ancestor.father.title;

    [*total]: %count; [[person/persons]1@(c)]

    %elseif;(evar.t = "G" and evar.only= "on") %( long display; only the selected generation %) %if;((evar.notes = "on" or evar.src = "on") and evar.inline != "on")

    [*see]: [*ancestors]%sp;%nn; %if;((evar.notes = "on" or evar.src = "on") and evar.inline != "on") | [*note/notes]1 %end;

    %end;

    %apply;gen("v").  

    %foreach;ancestor_level; %if;(evar.v != "" and level = evar.v) %foreach;ancestor; %if;(ancestor.same != "")

    %ancestor.anc_sosa;: [see] %ancestor.same;.

    %else;

    %ancestor.anc_sosa; %apply;long_display_ancestor_personal()

    %if;(ancestor.index != self.index)

    %apply;long_display_ancestor_families()

    %end; %end; %end; %end; %end; %if;((evar.notes = "on" or evar.src = "on") and evar.inline != "on")

    %apply;long_display_notes()

    %end; %elseif;(evar.t = "G") %( long display %) %if;((evar.notes = "on" or evar.src = "on") and evar.inline != "on")

    [*see]: [*ancestors]%sp;%nn; %if;((evar.notes = "on" or evar.src = "on") and evar.inline != "on") | [*note/notes]1 %end;

    %end; %let;nb_gen;%apply;min(evar.v, max_anc_level)%in;

    %apply;togen(nb_gen).  

    %foreach;ancestor_level(nb_gen)

    [*generation/generations]0 %level;

    %foreach;ancestor; %if;(ancestor.same != "")

    %ancestor.anc_sosa;: [see] %ancestor.same;.

    %else;

    %ancestor.anc_sosa; %apply;long_display_ancestor_personal()

    %if;(ancestor.index != self.index)

    %apply;long_display_ancestor_families()

    %end; %end; %end; %end; %if;((evar.notes = "on" or evar.src = "on") and evar.inline != "on")

    %apply;long_display_notes()

    %end; %elseif;(evar.t = "D") %( ancestors up to somebody %) %pvar.1.mark_descendants;
      %foreach;ancestor_level; %apply;lazy_print%with;
    • [*generation/generations]0 %level;%nl;
        %end; %if;(level <= evar.l + 1) %foreach;ancestor; %if;(ancestor.same = "" and ancestor.is_descendant) %lazy_force;
      • [Sosa] %ancestor.anc_sosa; -%sp; %ancestor;%nn; %ancestor.title;%ancestor.dates;
      • %end; %end; %end; %if;lazy_printed;
      %nl;
    • %nl;%end; %end;
    %elseif;(evar.t = "Z" and evar.only = "on")

    %apply;gen("v").

    %reset_count; %apply;table_header() %let;nb_col;%count;%in; %reset_count; %foreach;ancestor_level; %if;(evar.v != "" and level = evar.v) %if;(evar.gen = "on") %end; %foreach;ancestor; %apply;table_row() %if;(ancestor.nb_families > 1) %apply;table_family() %end; %end; %end; %end;
    [*generation/generations]0 %level;

    [*total]: %count; [[person/persons]1@(c)]

    %elseif;(evar.t = "Z") %let;nb_gen;%apply;min(evar.v, max_anc_level)%in;

    %apply;togen(nb_gen).

    %reset_count; %apply;table_header() %let;nb_col;%count;%in; %reset_count; %foreach;ancestor_level(nb_gen) %if;(evar.gen = "on") %end; %foreach;ancestor; %apply;table_row() %if;(ancestor.nb_families > 1) %apply;table_family() %end; %end; %end;
    [*generation/generations]0 %level;

    [*total]: %count; [[person/persons]1@(c)]

    %end; %end; %base_trailer; %copyright; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/desmenu.txt0000660000175200017530000002603712664543647024000 0ustar guillaumeguillaume%doctype; %nn; %apply;a_of_b_gr_eq_lev%with; [*descendants]%nn; %and; %if;(public_name != "")%public_name;%else;%first_name;%end; %if;(qualifier != "") %qualifier;%end; %sp;%surname; %end; %include.favicon; %include.js; %include.css; %base_header; %message_to_wizard; %include.perso_header;

    %nn; %apply;a_of_b_gr_eq_lev%with; [*descendants]%nn; %and; %if;(public_name != "")%public_name;%else;%first_name;%end; %if;(qualifier != "") %qualifier;%end; %sp;%surname; %if;(alias != "") (%alias;)%end; %end;

    %define;tothegen(xx) [*to the %s generation:::xx]%nn; %end;

    %hidden; %if;access_by_key; %if;(occ != "0") %end; %else %end;

    %if;(bvar.max_desc_level = "" and max_desc_level > 12) ([maximum] 12 [generation/generations]1) %elseif;(bvar.max_desc_level != "" and max_desc_level > bvar.max_desc_level) ([maximum] %bvar.max_desc_level; [generation/generations]1) %end;

    %if;(bvar.max_desc_level = "" and max_desc_level > 12) ([maximum] 12 [generation/generations]1) %elseif;(bvar.max_desc_level != "" and max_desc_level > bvar.max_desc_level) ([maximum] %bvar.max_desc_level; [generation/generations]1) %end;

    [*color]
    %if;(bvar.max_desc_level = "" and max_desc_level > 12) ([maximum] 12 [generation/generations]1) %elseif;(bvar.max_desc_level != "" and max_desc_level > bvar.max_desc_level) ([maximum] %bvar.max_desc_level; [generation/generations]1) %end;
    %base_trailer; %copyright; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/perso_short.txt0000660000175200017530000011527512664543647024712 0ustar guillaumeguillaume%( Display livre d'ascendance %) %( Copie sans majuscules %) %define;tothegen(xx) [to the %s generation:::xx]%nn; %end; %define;togen(xx) %if;(xx = 1)[specify::generation/generations]0%nn; %elseif;(xx = 2)[to the parents]%nn; %elseif;(xx = 3)[to the grandparents]%nn; %elseif;(xx = 4)[to the great-grandparents]%nn; %else; %apply;tothegen%with; %apply;nth([nth (generation)], xx) %end; %end; %end; %define;relation_type_txt(xx, sex) %if;("xx" = [adoptive father/adoptive mother/adoptive parents]2) %apply;capitalize(nth([adoptive father/adoptive mother/adoptive parents], sex)) %elseif;("xx" = [recognizing father/recognizing mother/recognizing parents]2) %apply;capitalize(nth([recognizing father/recognizing mother/recognizing parents], sex)) %elseif;("xx" = [candidate father/candidate mother/candidate parents]2) %apply;capitalize(nth([candidate father/candidate mother/candidate parents], sex)) %elseif;("xx" = [godfather/godmother/godparents]2) %apply;capitalize(nth([godfather/godmother/godparents], sex)) %elseif;("xx" = [foster father/foster mother/foster parents]2) %apply;capitalize(nth([foster father/foster mother/foster parents], sex)) %else; %apply;capitalize("xx") %end; %end; %define;relation_txt() %if;(on_marriage_date != "" or marriage_place != "") %if;are_married; [*married]%sp;%on_marriage_date;%sp;%if;(marriage_place != "")%sp;[in (place)]%sp;%marriage_place;%end;. %elseif;are_not_married; [*relation/relations]0%sp;%on_marriage_date;%sp;%if;(marriage_place != "")%sp;[in (place)]%sp;%marriage_place;%end;. %elseif;are_engaged; [*engaged]%sp;%on_marriage_date;%sp;%if;(marriage_place != "")%sp;[in (place)]%sp;%marriage_place;%end;. %elseif;is_no_sexes_check; [*relation/relations]0%sp;%on_marriage_date;%sp;%if;(marriage_place != "")%sp;[in (place)]%sp;%marriage_place;%end;. %elseif;is_no_mention; %apply;capitalize(on_marriage_date)%sp;%if;(marriage_place != "")%sp;[in (place)]%sp;%marriage_place;%end;. %end; %end; %end; %define;display_date(xx, with_rowspan) 1 and with_rowspan = 1) rowspan="%xx.nb_families;" %end;> %if;xx.has_birth_date;%xx.slash_birth_date; %elseif;xx.has_baptism_date;%xx.slash_baptism_date; %else;  %end; 1 and with_rowspan = 1) rowspan="%xx.nb_families;" %end;> %if;(xx.has_birth_date or xx.has_baptism_date or xx.has_death_date or xx.has_burial_date) - %else;   %end; 1 and with_rowspan = 1) rowspan="%xx.nb_families;" %end;> %if;xx.has_death_date;%xx.slash_death_date; %elseif;xx.has_burial_date;%xx.slash_burial_date; %else;  %end; %end; %define;display_family_siblings(xx, count) %foreach;xx.family; %if;(family_cnt != 1) %spouse; %nb_children; %end; %end; %end; %define;display_siblings(xx, count) 1) rowspan="%xx.nb_families;" %end;>%apply;image_MF("xx", "11") %xx; %apply;display_date("xx", 1) %foreach;xx.family; %if;(family_cnt = 1) %spouse; %end; %end; %foreach;xx.family; %if;(family_cnt = 1) %nb_children; %end; %end; %if;(xx.nb_families > 1) %apply;display_family_siblings("xx", count) %end; %end; %define;display_children(xx, count) %apply;image_MF("xx", "11") %xx; %apply;display_date("xx", 0) %xx.birth_place; %end; %define;display_union(xx)
    %if;(are_divorced or are_separated) %end;
    %spouse;%sp; %spouse.dates; %if;spouse.has_occupation; [*occupation/occupations]0: %spouse.occupation; %end;
    %apply;relation_txt() %if;xx.computable_marriage_age; %if;(are_married or are_engaged) %apply;capitalize(nth([groom/bride], xx.sex)): %xx.marriage_age;%sp; %else; %apply;capitalize(nth([conjoint/conjointe], xx.sex)): %xx.marriage_age;%sp; %end; %end; %if;(xx.computable_marriage_age and spouse.computable_marriage_age) %sp;-%sp; %end; %if;spouse.computable_marriage_age; %if;(are_married or are_engaged) %apply;capitalize(nth([groom/bride], spouse.sex)): %spouse.marriage_age; %else; %apply;capitalize(nth([conjoint/conjointe], spouse.sex)): %spouse.marriage_age; %end; %end;
    %if;are_divorced;[*divorced] %divorce_date;. %end; %if;are_separated;[*separated]. %end;

    %if;(evar.children = "on" and has_children) %foreach;child; %apply;display_children("child",child_cnt) %end;
    [*child/children]1 [*date/dates]1 [*where born]

    %end; %if;(evar.comm = "on" and has_comment)
    [*marriage notes]: %comment;

    %end; %end; %define;access_ind(nnn) %nnn;%sp;%nnn.dates;%nl; %end; %define;access(num,nnn) num_ %if;("num" = 1) %nnn;%nnn.title;%nnn.dates; %else; %apply;access_ind("nnn") %end; %end; %define;display_tree(xx) %if;xx.father.has_parents; %if;xx.father.father.has_parents; %if;xx.father.father.father.has_parents;                                                                                     _____| %apply;access("16","xx.father.father.father.father") %end;                                                         _____| %apply;access("8","xx.father.father.father") %if;xx.father.father.father.has_parents;                                                        /                            Â¯Â¯Â¯Â¯Â¯| %apply;access("17","xx.father.father.father.mother") %else                                                        / %end; %end; %end; %if;xx.father.has_parents;                            _____| %apply;access("4","xx.father.father") %end; %if;xx.father.has_parents; %if;xx.father.father.has_parents; %if;xx.father.father.mother.has_parents;                           /                           \                             _____| %apply;access("18","xx.father.father.mother.father") %else                           /                           \ %end;                          /                             Â¯Â¯Â¯Â¯Â¯| %apply;access("9","xx.father.father.mother") %if;xx.father.father.mother.has_parents;                         /                                                           Â¯Â¯Â¯Â¯Â¯| %apply;access("19","xx.father.father.mother.mother") %else                         / %end; %else                           / %end; %end; |%apply;access("2","xx.father") %if;xx.father.has_parents; %if;xx.father.mother.has_parents; %if;xx.father.mother.father.has_parents; |                       \                                                           _____| %apply;access("20","xx.father.mother.father.father") %else |                       \ %end; |                        \                              _____| %apply;access("10","xx.father.mother.father") %if;xx.father.mother.father.has_parents; |                         \                            /                            Â¯Â¯Â¯Â¯Â¯| %apply;access("21","xx.father.mother.father.mother") %else |                         \                            / %end; %else |                         \ %end; %end; %if;xx.father.has_parents; |                          Â¯Â¯Â¯Â¯Â¯| %apply;access("5","xx.father.mother") %end; %if;xx.father.has_parents; %if;xx.father.mother.has_parents; %if;xx.father.mother.mother.has_parents; |                                                     \                             _____| %apply;access("22","xx.father.mother.mother.father") %else |                                                     \ %end; |                                                      Â¯Â¯Â¯Â¯Â¯| %apply;access("11","xx.father.mother.mother") %if;xx.father.mother.mother.has_parents; |                                                                                   Â¯Â¯Â¯Â¯Â¯| %apply;access("23","xx.father.mother.mother.mother") %end; %end; %end; |--%apply;access("1","xx") %if;xx.mother.has_parents; %if;xx.mother.father.has_parents; %if;xx.mother.father.father.has_parents; |                                                                                   _____| %apply;access("24","xx.mother.father.father.father") %end; |                                                       _____| %apply;access("12","xx.mother.father.father") %if;xx.mother.father.father.has_parents; |                                                      /                            Â¯Â¯Â¯Â¯Â¯| %apply;access("25","xx.mother.father.father.mother") %else |                                                      / %end; %end; %end; %if;xx.mother.has_parents; |                          _____| %apply;access("6","xx.mother.father") %end; %if;xx.mother.has_parents; %if;xx.mother.father.has_parents; %if;xx.mother.father.mother.has_parents; |                         /                           \                             _____| %apply;access("26","xx.mother.father.mother.father") %else |                         /                           \ %end; |                        /                             Â¯Â¯Â¯Â¯Â¯| %apply;access("13","xx.mother.father.mother") %if;xx.mother.father.mother.has_parents; |                       /                                                           Â¯Â¯Â¯Â¯Â¯| %apply;access("27","xx.mother.father.mother.mother") %end; %else |                        / %end; %end; |%apply;access("3","xx.mother") %if;xx.mother.has_parents; %if;xx.mother.mother.has_parents; %if;xx.mother.mother.father.has_parents;                         \                                                           _____| %apply;access("28","xx.mother.mother.father.father") %else                         \ %end;                          \                              _____| %apply;access("14","xx.mother.mother.father") %if;xx.mother.mother.father.has_parents;                           \                            /                            Â¯Â¯Â¯Â¯Â¯| %apply;access("29","xx.mother.mother.father.mother") %else                           \                            / %end; %else                           \ %end; %end; %if;xx.mother.has_parents;                            Â¯Â¯Â¯Â¯Â¯| %apply;access("7","xx.mother.mother") %end; %if;xx.mother.has_parents; %if;xx.mother.mother.has_parents; %if;xx.mother.mother.mother.has_parents;                                                        \                            _____| %apply;access("30","xx.mother.mother.mother.father") %else                                                        \ %end;                                                         Â¯Â¯Â¯Â¯Â¯| %apply;access("15","xx.mother.mother.mother") %if;xx.mother.mother.mother.has_parents;                                                                                     Â¯Â¯Â¯Â¯Â¯| %apply;access("31","xx.mother.mother.mother.mother") %end; %end; %end; %end; %define;print_long_ind(xx)

    %xx;

    %apply;image_MF("xx", "13")
    %if;(evar.sosa = "on" and xx.has_sosa) sosa [*Sosa] %xx.sosa; %end;
    %if;(evar.image = "on" and xx.has_image)
    [image/images]0 %end;
      %if;xx.has_aliases;
    • [*alias]: %foreach;xx.alias; %if;not is_first;,%end; %alias; %end;
    • %end; %if;xx.has_nobility_titles;
    • [*title/titles]1: %foreach;xx.nobility_title; %if;not is_first;,%end; %nobility_title; %end;
    • %end; %if;xx.has_occupation;
    • [*occupation/occupations]0: %xx.occupation;
    • %end; %if;((xx.has_aliases or xx.has_nobility_titles or xx.has_occupation) and ((xx.has_birth_date or xx.has_birth_place) or (xx.has_baptism_date or xx.has_baptism_place) or (xx.has_death_date or xx.has_death_place) or (xx.has_burial_date or xx.has_burial_place)))
    • %end; %if;(xx.has_birth_date or xx.has_birth_place)
    • %apply;capitalize(nth([born],xx.sex)) %xx.on_birth_date; %if;xx.has_birth_place;%sp;[in (place)]%sp;%xx.birth_place;%end;
    • %end; %if;(xx.has_baptism_date or xx.has_baptism_place)
    • %apply;capitalize(nth([baptized],xx.sex)) %xx.on_baptism_date; %if;xx.has_baptism_place;%sp;[in (place)]%sp;%xx.baptism_place;%end;
    • %end; %if;(xx.has_death_date or xx.has_death_place)
    • %apply;capitalize(nth([died],xx.sex)) %xx.on_death_date; %if;xx.computable_death_age;%sp;[age at death:] %xx.death_age;,%end; %if;xx.has_death_place;%sp;[in (place)]%sp;%xx.death_place;%end;
    • %end; %if;(xx.has_burial_date or xx.has_burial_place)
    • %apply;capitalize(nth([buried],xx.sex)) %xx.on_burial_date; %if;xx.has_burial_place;%sp;[in (place)]%sp;%xx.burial_place;%end;
    • %end;
    %if;(evar.image = "on" and xx.has_image)
    %end;
    %if;(evar.parents = "on" and xx.has_parents)
    [*parents]
    [*father/mother]0: %xx.father; %if;(xx.father_age_at_birth != "")%sp;(%xx.father_age_at_birth;)%end; %if;xx.father.has_occupation; [*occupation/occupations]0: %xx.father.occupation; %end;
    [*father/mother]1: %xx.mother; %if;(xx.mother_age_at_birth != "")%sp;(%xx.mother_age_at_birth;)%end; %if;xx.mother.has_occupation; [*occupation/occupations]0: %xx.mother.occupation; %end;
    %end; %if;(evar.siblings = "on" and (xx.has_siblings or (xx.has_parents and (xx.father.nb_families > 1 or xx.mother.nb_families > 1))))
    %if;xx.has_siblings; %foreach;xx.father.child; %apply;display_siblings("child", child_cnt) %end; %end; %if;xx.has_parents; %if;(xx.father.nb_families > 1 or xx.mother.nb_families > 1) %reset_count; %foreach;xx.father.family; %if;(spouse.index != xx.mother.index) %if;(nb_children > 0)%incr_count;%end; %end; %end; %let;half_father;%count;%in; %reset_count; %foreach;xx.mother.family; %if;(spouse.index != xx.father.index) %if;(nb_children>0)%incr_count;%end; %end; %end; %let;half_mother;%count;%in; %if;(half_father != 0 or half_mother != 0) %if;xx.has_siblings;%end; %if;(half_father != 0) %foreach;xx.father.family; %if;(spouse.index != xx.mother.index and half_father!=0 and spouse.has_children) %if;has_children; %foreach;child; %apply;display_siblings("child", family_cnt) %end; %end; %end; %end; %end; %if;(half_mother != 0) %foreach;xx.mother.family; %if;(spouse.index != xx.father.index and half_mother!=0 and spouse.has_children) %if;has_children; %foreach;child; %apply;display_siblings("child", family_cnt) %end; %end; %end; %end; %end; %end; %end; %end;
    [*full siblings]
    [*name] [*date/dates]1 [*spouse/spouses]0 [*child/children]1
     
    [*half siblings]
    [*name] [*date/dates]1 [*spouse/spouses]0 [*child/children]1
    [*on %s's side:::] %xx.father; [with] %spouse;
    [*on %s's side:::] %xx.mother; [with] %spouse;
    %end; %reset_count; %if;xx.has_families; %foreach;xx.family; %if;has_witnesses; %incr_count; %end; %end; %end; %if;(evar.rel = "on" and (xx.has_relations or count > 0))
    %foreach;xx.relation; %if;(has_relation_him and has_relation_her) %apply;display_date("relation_him", 0) %apply;display_date("relation_her", 0) %elseif;has_relation_him; %apply;display_date("relation_him", 0) %elseif;has_relation_her; %apply;display_date("relation_her", 0) %end; %end; %foreach;xx.related; %apply;display_date("related", 0) %end; %if;xx.has_families; %foreach;xx.family; %if;has_witnesses; %foreach;witness; %apply;display_date("witness", 0) %end; %end; %end; %end;
    [*relation/relations]1
    [*name] [*date/dates]1
    %apply;image_MF("relation_him", "11") %relation_him; %sp; (%apply;relation_type_txt(relation_type, relation_him.sex))
    %apply;image_MF("relation_her", "11") %relation_her; %sp; (%apply;relation_type_txt(relation_type, relation_her.sex))
    %apply;image_MF("relation_him", "11") %relation_him; %sp; (%apply;capitalize(relation_type))
    %apply;image_MF("relation_her", "11") %relation_her; %sp; (%apply;capitalize(relation_type))
    %apply;image_MF("related", "11") %related; %sp; %if;(related = [foster son/foster daughter/foster child]0) (%apply;capitalize([foster son/foster daughter/foster child]2)) %elseif;(related = [foster son/foster daughter/foster child]1) (%apply;capitalize([foster son/foster daughter/foster child]2)) %else; (%apply;capitalize(related_type)) %end;
    %apply;image_MF("witness", "11") %witness; %sp; ([*witness/witnesses]0)
    %end; %if;(evar.marr = "on" and xx.has_families)
    [*marriage/marriages]1 %if;(evar.children = "on" and xx.has_children) [and::child/children]1%end;
    %foreach;xx.family; %apply;display_union("xx") %if;(family_cnt != xx.nb_families)
    %end; %end;
    %end; %if;(evar.note = "on" and xx.has_notes)
    [*note/notes]1
    %xx.notes;
    %end; %if;(evar.asc = "on" and xx.has_parents)
    [*ascendants tree]
    %apply;display_tree("xx")
    %end; %if;(evar.src = "on" and xx.has_sources)
    [*source/sources]1
      %foreach;xx.source;
    • %source_type;: %source;
    • %end;
    %end; %end;
    %let;nb_gen;%apply;min(evar.v, max_anc_level)%in; %if;(evar.v > 1) %apply;capitalize(nth([summary book ascendants], 3))%sp; %apply;togen(nb_gen).
      %foreach;ancestor_level(nb_gen) %apply;lazy_print%with;
    • [*generation/generations]0 %level;
    • %end; %foreach;ancestor; %lazy_force; %if;(ancestor.same = "")
    • %ancestor; %if;(evar.sosa = "on" and ancestor.has_sosa) ([n° Sosa] :%sp;%ancestor.sosa;) %end;
    • %end; %end; %end;

     

    %end; %foreach;ancestor_level(nb_gen) %foreach;ancestor; %if;(ancestor.same = "") %apply;print_long_ind("ancestor") %if;(not (is_last and level = nb_gen))

     

    %end; %end; %end; %end;
    geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/updhist_diff.txt0000660000175200017530000002353112664543647025004 0ustar guillaumeguillaume%doctype; [*revision history] %include.js; %include.css; %base_header; %if;not cancel_links;
    %if;(referer != "") << %end; ^^
    %end;

    %person;%nn; %if;(evar.t = "SUM"), [revision history] %else;, [difference between the two revisions] %end;

    %define;no_diff(xx) [*insufficient revision history for %s:::xx] %end; %define;print_summary() %if;(history_len >= 2) [*select the two revisions you want to compare]. %end;

    %hidden;

    %foreach;history_line; %end;
    [*compare] [*date/dates]0 [*wizard/wizards/friend/friends/exterior]0
    %apply;transl_date%with;%date;%end; %wizard;
    %if;(history_len >= 2) %else; %apply;no_diff(person) %end;
    %end; %define;empty()       %end; %define;print_diff_person() [*name] %before.first_name; %before.surname; %after.first_name; %after.surname; [*sex] %before.sex; %after.sex; [*public name] %before.public_name; %after.public_name; [*qualifier] %before.qualifiers; %after.qualifiers; [*alias] %before.aliases; %after.aliases; [*first name alias] %before.first_names_aliases; %after.first_names_aliases; [*surname alias] %before.surnames_aliases; %after.surnames_aliases; [*occupation/occupations]1 %before.occupation; %after.occupation; %apply;empty() [*birth] %before.birth; %after.birth; [*birth place] %before.birth_place; %after.birth_place; [*birth src] %before.birth_src; %after.birth_src; [*baptism] %before.baptism; %after.baptism; [*baptism place] %before.baptism_place; %after.baptism_place; [*baptism src] %before.baptism_src; %after.baptism_src; [*death] %before.death; %after.death; [*death place] %before.death_place; %after.death_place; [*death src] %before.death_src; %after.death_src; [*burial] %before.burial; %after.burial; [*burial place] %before.burial_place; %after.burial_place; [*burial src] %before.burial_src; %after.burial_src; %apply;empty() [*relation/relations]1 %before.relations; %after.relations; %apply;empty() [*title/titles]1 %before.titles; %after.titles; [*person source] %before.psources; %after.psources; [*note/notes]1 %before.notes; %after.notes; %apply;empty() [*access] %before.access; %after.access; %end; %define;print_diff_family() %foreach;family; [*marriage/marriages]0 %if;(before.marriage_type != "")%before.marriage_type;:%end; %before.spouse; %if;(after.marriage_type != "")%after.marriage_type;: %end;%after.spouse; [*marriage date] %before.marriage; %after.marriage; [*marriage place] %before.marriage_place; %after.marriage_place; [*marriage src] %before.marriage_src; %after.marriage_src; [*divorce] %before.divorce; %after.divorce; [*witness/witnesses]1 %before.witnesses; %after.witnesses; [*family source] %before.fsources; %after.fsources; [*comment] %before.comment; %after.comment; %apply;empty() [*child/children]1 %before.children; %after.children; %apply;empty() %end; %end; %define;print_diff() %apply;empty() %apply;print_diff_person() %apply;empty() %if;(nb_families > 0) %apply;print_diff_family() %end;
      [*revision of]: %apply;transl_date%with;%before.date;%end; [*revision of]: %apply;transl_date%with;%after.date;%end;
      [*wizard/wizards/friend/friends/exterior]0 %before.wizard; [*wizard/wizards/friend/friends/exterior]0 %after.wizard;

    [*person/persons]0

    [*family/families]0

    %end; %if;(evar.t = "SUM") %apply;print_summary() %else; %apply;print_diff() %end; %base_trailer; %copyright; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/updfam.txt0000660000175200017530000005470012664543647023612 0ustar guillaumeguillaume%doctype; %nn; %if;(evar_m = "ADD_FAM" or evar_m = "ADD_FAM_OK") [*add::family/families]0%nn; %elseif;(evar_m = "ADD_PAR")[*add::family/families]0%nn; %elseif;(evar_m = "MOD_FAM" or evar_m = "MOD_FAM_OK") [*modify::family/families]0 # %evar_i; %elseif;(evar_m = "MRG_DUP_FAM_Y_N" or evar_m = "MRG_FAM" or evar_m = "MRG_FAM_OK" or evar_m = "MRG_MOD_FAM_OK") [*merge::family/families]1 # %evar_i; %end; %include.js; %include.css; %base_header; %message_to_wizard; %include_perso_header; %define;date(xlab,xvar,xdate)
    xlab %if;([ !dates order]0 = "ddmmyy" or [ !dates order]0 = "ddmmyyyy" or [ !dates order]0 = "dmyyyy") %elseif;([ !dates order]0 = "mmddyyyy") %else; %end;
    [*calendar/calendars]0 [*precision]0
    %end; %define;source(xvar,xx)
    %end; %define;small_date(kind,xvar,xx,verbose) %if;([ !dates order]0 = "ddmmyy" or [ !dates order]0 = "ddmmyyyy" or [ !dates order]0 = "dmyyyy") %elseif;([ !dates order]0 = "mmddyyyy") %else; %end; %if;("verbose" = "true")%nn; %end;%nl; %end; %define;birth(xvar,xx,verbose) [*birth] %apply;small_date("birth","xvarb","xx","verbose") %end; %define;death(xvar,xx,verbose) [*death] %apply;small_date("death","xvard","xx","verbose") %end; %define;parent(xcnt,xx) %apply;birth("paxcnt","xx","true") %apply;death("paxcnt","xx","true")
    %end; %define;insert_parent(xcnt)
    [*insert::| | parents]
    %end;

    %nn; %if;(evar_m = "ADD_FAM" or evar_m = "ADD_FAM_OK") [*add::family/families]0 %elseif;(evar_m = "ADD_PAR") [*add::family/families]0 %elseif;(evar_m = "MOD_FAM" or evar_m = "MOD_FAM_OK") [*modify::family/families]0 # %evar_i; %elseif;(evar_m = "MRG_DUP_FAM_Y_N" or evar_m = "MRG_FAM" or evar_m = "MRG_FAM_OK" or evar_m = "MRG_MOD_FAM_OK") [*merge::family/families]1 # %evar_i; %end;

    %hidden; %if;(evar_ip != "")%nl;%end; %if;(evar_i != "")%nl;%end; %if;(evar_m = "ADD_FAM" or evar_m = "ADD_FAM_OK") %nl; %elseif;(evar_m = "ADD_PAR") %nl; %elseif;(evar_m = "MOD_FAM" or evar_m = "MOD_FAM_OK") %nl; %elseif;(evar_m = "MRG_DUP_FAM_Y_N" or evar_m = "MRG_FAM" or evar_m = "MRG_FAM_OK" or evar_m = "MRG_MOD_FAM_OK") %if;(evar_ini1 != "" and evar_ini2 != "") %end; %if;(evar.iexcl != "") %end; %if;(evar.fexcl != "") %end; %nl; %end;

    %foreach;parent; %if;(bvar.multi_parents != "yes")

    %parent.himher;

    %end;%nl; %apply;parent(cnt, "parent") %if;(bvar.multi_parents = "yes")%apply;insert_parent(cnt)%end; %end;

    [*marriage/marriages]0

    %apply;date([*date/dates]0, "marr", "marriage") %apply;source("marr", "marriage")

    [*witness/witnesses]1

    %foreach;witness;
    %end;

    [*divorce]

    %apply;date([*date/dates]0, "div", "divorce")

    [*child/children]1

    %define;insert_child(xcnt) %end; %define;invert_children(xcnt) %end; %define;child(xcnt) %apply;birth("chxcnt", "child", "false") %apply;death("chxcnt", "child", "false")
    %end;
    %apply;insert_child("0") %foreach;child; %if;(cnt != 1) %apply;invert_children(cnt) %end;
     
    %apply;child(cnt) %apply;insert_child(cnt) %end;

    [*source/sources]0

    %if;(bvar.origin_file = "on") %end;

    %base_trailer; %copyright; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/miss_evt.txt0000660000175200017530000003017312664543647024165 0ustar guillaumeguillaume%( Missing events table %) %define;has_missing_birth_date(xx) %if;(xx.has_birth_date or xx.has_baptism_date) %if;(evar.date = "on") %if;(xx.has_birth_date and (xx.birth_date.prec = "" and xx.birth_date.day != "")) %elseif;(xx.has_baptism_date and (xx.baptism_date.prec = "" and xx.baptism_date.day != "")) %else; %incr_count; %end; %end; %else; %incr_count; %end; %end; %define;has_missing_birth_place(xx) %if;(xx.has_birth_date) %if;not xx.has_birth_place; %incr_count; %end; %elseif;(xx.has_baptism_date) %if;not xx.has_baptism_place; %incr_count; %end; %else; %if;(not (xx.has_birth_place or xx.has_baptism_place)) %incr_count; %end; %end; %end; %define;has_missing_death_date(xx) %if;xx.is_dead; %if;(xx.has_death_date or xx.has_burial_date) %if;(evar.date = "on") %if;(xx.has_death_date and (xx.death_date.prec = "" and xx.death_date.day != "")) %elseif;(xx.has_burial_date and (xx.burial_date.prec = "" and xx.burial_date.day != "")) %else; %incr_count; %end; %end; %else; %incr_count; %end; %end; %end; %define;has_missing_death_place(xx) %if;xx.is_dead; %if;(xx.has_death_date) %if;not xx.has_death_place; %incr_count; %end; %elseif;(xx.has_burial_date) %if;not xx.has_burial_place; %incr_count; %end; %else; %if;(not (xx.has_death_place or xx.has_burial_place)) %incr_count; %end; %end; %end; %end; %define;has_missing_marriage_date() %if;(on_marriage_date = "") %incr_count; %else; %if;(evar.date = "on" and (marriage_date.prec != "" or marriage_date.day = "")) %incr_count; %end; %end; %end; %define;has_missing_marriage_place() %if;(marriage_place = "") %incr_count; %end; %end; %define;has_missing_events(xx) %reset_count; %apply;has_missing_birth_date("xx") %if;(count=0) %apply;has_missing_birth_place("xx") %end; %if;(count=0) %apply;has_missing_death_date("xx") %end; %if;(count=0) %apply;has_missing_death_place("xx") %end; %if;(count=0) %if;xx.has_families; %foreach;xx.family; %if;(count=0) %apply;has_missing_marriage_place() %end; %if;(count=0) %apply;has_missing_marriage_date() %end; %end; %end; %end; %end; %define;display_edit_ind_btn(label) %if;(wizard and not cancel_links) %else;   %end; %end; %define;display_edit_fam_btn() %if;(wizard and not cancel_links) %else;   %end; %end; %define;td_missing_events_rowspan(xx) %if;(xx.same = "" and (evar.marr = "on" or (is_first and level = 1)) and xx.nb_families > 1) rowspan="%xx.nb_families;" %nn; %end; %end; %define;td_missing_events(xx) %apply;td_missing_events_rowspan("xx")%nn; %if;(count > 0) bgcolor="#988C90" align="center" %nn; %else; bgcolor="#CCC3C6" %nn; %end; %end; %define;td_family_missing_events(xx) %if;(xx.nb_families > 1) style="border-bottom:none" %end; %nn; %end; %define;td_family_missing_style(xx) %apply;td_family_missing_events("xx") %if;(count>0) bgcolor="#988C90" align="center" %else; bgcolor="#CCC3C6" %end; %nn; %end; %define;table_missing_events(xx) %lazy_force; %xx.anc_sosa; %apply;image_MF("xx", "11") %apply;short_display_person("xx") %if;(xx.same != "" and evar.repeat = "on") %sp;-> [same ancestor as n° Sosa] %if(evar.sosab = 16)%xx.same.hexa; %elseif(evar.sosab = 8)%xx.same.octal; %else;%xx.same; %end; %end; %if;(xx.same = "") %reset_count; %apply;has_missing_birth_date("xx") %if;xx.has_birth_date; %xx.slash_birth_date; %if;(count>0)   %apply;display_edit_ind_btn("birth") %end; %elseif;xx.has_baptism_date; %xx.slash_baptism_date; %if;(count>0)   %apply;display_edit_ind_btn("birth") %end; %else; %apply;display_edit_ind_btn("birth") %end; %reset_count; %apply;has_missing_birth_place("xx") %if;xx.has_birth_date; %xx.birth_place; %if;(count>0)   %apply;display_edit_ind_btn("birth") %end; %elseif;xx.has_baptism_date; %xx.baptism_place; %if;(count>0)   %apply;display_edit_ind_btn("birth") %end; %else; %if;xx.has_birth_place; %xx.birth_place; %elseif;xx.has_baptism_place; %xx.baptism_place; %else;   %apply;display_edit_ind_btn("birth") %end; %end; %if;(evar.marr="on" or (is_first and level = 1)) %if;xx.has_families; %foreach;xx.family; %if;(family_cnt = 1) 1) style="border-bottom:none" %end; bgcolor="#CCC3C6"> %apply;image_MF("spouse", "11") %apply;short_display_person("spouse") %end; %end; %else;   %end; %else; %if;xx.has_families; %apply;image_MF("xx.spouse", "11") %apply;short_display_person("xx.spouse") %else;   %end; %end; %if;(evar.marr="on" or (is_first and level = 1)) %if;xx.has_families; %foreach;xx.family; %if;(family_cnt = 1) %reset_count; %apply;has_missing_marriage_date() %slash_marriage_date; %if(count>0)   %apply;display_edit_fam_btn() %end; %end; %end; %else;   %end; %else; %if;xx.has_families; %foreach;xx.family; %if;(spouse.index=xx.spouse.index) %reset_count; %apply;has_missing_marriage_date() %slash_marriage_date; %if(count>0)   %apply;display_edit_fam_btn() %end; %end; %end; %else;   %end; %end; %if;(evar.marr="on" or (is_first and level = 1)) %if;xx.has_families; %foreach;ancestor.family; %if;(family_cnt = 1) %reset_count; %apply;has_missing_marriage_place() %marriage_place; %if(count>0)   %apply;display_edit_fam_btn() %end; %end; %end; %else;   %end; %else; %if;ancestor.has_families; %foreach;ancestor.family; %if;(spouse.index=ancestor.spouse.index) %reset_count; %apply;has_missing_marriage_place() %marriage_place; %if(count>0)   %apply;display_edit_fam_btn() %end; %end; %end; %else;   %end; %end; %reset_count; %apply;has_missing_death_date("xx") %if;xx.has_death_date; %xx.slash_death_date; %if;(count>0)   %apply;display_edit_ind_btn("death") %end; %elseif;xx.has_burial_date; %xx.slash_burial_date; %if;(count>0)   %apply;display_edit_ind_btn("death") %end; %else; %if;xx.is_dead; %apply;display_edit_ind_btn("death") %else;   %end; %end; %reset_count; %apply;has_missing_death_place("xx") %if;xx.has_death_date; %xx.death_place; %if;(count>0)   %apply;display_edit_ind_btn("death") %end; %elseif;xx.has_burial_date; %xx.burial_place; %if;(count>0)   %apply;display_edit_ind_btn("death") %end; %else; %if;xx.has_death_place; %xx.death_place; %elseif;xx.has_burial_place; %xx.burial_place; %else;   %end; %if;(count>0) %apply;display_edit_ind_btn("death") %end; %end; %end; %end; %define;td_family_missing_events2(xx) style="border-top:none; %if;(xx.nb_families != family_cnt) border-bottom:none %end;" %nn; %end; %define;td_family_missing_style2(xx) %apply;td_family_missing_events2("xx") %if;(count>0) bgcolor="#988C90" align="center" %else; bgcolor="#CCC3C6" %end; %nn; %end; %define;table_family_missing_events(xx) %foreach;ancestor.family; %if;(family_cnt != 1) %apply;image_MF("spouse", "11") %apply;short_display_person("spouse") %reset_count; %apply;has_missing_marriage_date() %slash_marriage_date; %if(count>0)   %apply;display_edit_fam_btn() %end; %reset_count; %apply;has_missing_marriage_place() %marriage_place; %if(count>0)   %apply;display_edit_fam_btn() %end; %end; %end; %end; %( Main %) %let;nb_gena;%apply;min(evar.v, max_anc_level)%in;

    %apply;togena(nb_gena).

    %foreach;ancestor_level(nb_gena) %if;(evar.gen = "on") %end; %foreach;ancestor; %apply;has_missing_events("ancestor") %if;(count > 0 and ancestor != "? ?") %if;(ancestor.same = "" or evar.repeat = "on") %apply;table_missing_events("ancestor") %if;(ancestor.same="" and (evar.marr="on" or (is_first and level = 1)) and ancestor.nb_families > 1) %apply;table_family_missing_events("ancestor") %end; %end; %end; %end; %end;
    [*Sosa] [*person/persons]0 [*date of birth] [*where born] %if;(evar.marr="on")[*spouse/spouses]1%else;[*spouse/spouses]0%end; [*date of marriage] [*where married] [*date of death] [*where dead]
    [*generation/generations]0 %level;
    geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/robots.txt0000660000175200017530000000003412664543647023635 0ustar guillaumeguillaumeUser-Agent: * Disallow: / geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/upddatamenu.txt0000660000175200017530000000243512664543647024643 0ustar guillaumeguillaume%doctype; [*lists] %include.css; %base_header; %if;not cancel_links;
    %if;(referer != "") << %end;
    %end;

    [*lists]

    %base_trailer; %copyright; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templb/0002770000175200017530000000000012664543647023053 5ustar guillaumeguillaumegeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templb/perso.txt0000660000175200017530000003066612664543647024756 0ustar guillaumeguillaume%doctype; %nn; %if;has_public_name; %if;has_qualifiers;%public_name; %qualifier; %else;%public_name; %surname;%end; %else; %if;has_qualifiers;%first_name; %qualifier; %else;%first_name; %surname;%end; %end; %include.css; %base_header; %define;include_file(file) %include.file; %end; %define;image_sosa(xxx,yyy) %nn; %end; %define;display_sosa(xx) %if;(bvar.display_sosa="" or bvar.display_sosa="yes") %if;xx.has_sosa; %if;not cancel_links;%end; %apply;image_sosa%with;%sosa_ref.first_name_key_strip;%sp; %sosa_ref.surname_key_strip; %and;%xx.sosa;%end; %if;not cancel_links;%end;%sp; %end; %end; %end; %define;image_MF(xx,wi_he) %if;(wizard and not cancel_links and not xx.is_restricted) %end; %if;xx.is_male; %nn; %if;(wizard and not cancel_links and not xx.is_restricted)%end; %sp; %end; %define;li_SD(xx)
  • %nn; %end; %define;li_SDC(xx) %if;xx.has_families; %reset_count; %foreach;family; %if;(nb_children>0)%incr_count;%end; %end; %end;
  • %nn; %end; %define;display_arrows() %if;not cancel_links;
    %if;has_referer; %end;
    %end; %end; %define;tothegen(xx) [to the %s generation:::xx]%nn; %end; %define;togena(xx) %if;(xx = 1)[specify::generation/generations]0%nn; %elseif;(xx = 2)[to the parents]%nn; %elseif;(xx = 3)[to the grandparents]%nn; %elseif;(xx = 4)[to the great-grandparents]%nn; %else; %apply;tothegen%with; %apply;nth([nth (generation)], xx) %end; %end; %end; %define;togend(xx) %if;(xx = 0)[specify::generation/generations]0%nn; %elseif;(xx = 1)[to the children]%nn; %elseif;(xx = 2)[to the grandchildren]%nn; %elseif;(xx = 3)[to the great-grandchildren]%nn; %else; %apply;tothegen%with; %apply;nth([nth (generation)], xx) %end; %end; %end; %define;short_display_person(xx) %apply;display_sosa("xx") %if;(xx.index=central_index)%xx;%else; %if;(cancel_links or xx.is_restricted)%xx; %else;%xx;%end; %end;%sp; %xx.title;%xx.dates; %end; %define;display_vertical(xx) %if;(xx.has_birth_date or xx.has_birth_place or xx.has_baptism_date or xx.has_baptism_place or xx.is_dead or xx.is_buried or xx.is_cremated or (xx.has_consanguinity and bvar.show_consang!="no") or xx.has_occupation or xx.has_linked_page.OCCU !="")
      %if;xx.has_birth_date;
    • %apply;capitalize(nth([born],xx.sex)) %xx.on_birth_date; %if;xx.birthday; ([happy birthday to you!])%end; %if;xx.has_birth_place; - %xx.birth_place;%end;
    • %nl; %else; %if;xx.has_birth_place;
    • %apply;capitalize(nth([born],xx.sex)) - %xx.birth_place;
    • %nl; %end; %end; %if;xx.has_baptism_date;
    • %apply;capitalize(nth([baptized],xx.sex)) %xx.on_baptism_date; %if;xx.has_baptism_place; - %xx.baptism_place;%end;
    • %nl; %else; %if;xx.has_baptism_place;
    • %apply;capitalize(nth([baptized],xx.sex)) - %xx.baptism_place;
    • %nl; %end; %end; %if;xx.computable_age;
    • [*age] : %xx.age;
    • %nl; %end; %if;xx.is_dead;
    • %apply;capitalize(xx.died) %if;xx.has_death_date; %xx.on_death_date;%end; %if;xx.has_death_place; - %xx.death_place;%end; %if;(xx.has_linked_page.DEATH !="") %xx.linked_page.DEATH;%end; %if;xx.computable_death_age;, [age at death:] %xx.death_age;%end;
    • %nl; %if;xx.is_buried;
    • %apply;capitalize(nth([buried],xx.sex)) %if;xx.has_burial_date; %xx.on_burial_date;%end; %if;xx.has_burial_place; - %xx.burial_place;%end;
    • %nl; %end; %if;xx.is_cremated;
    • %apply;capitalize(nth([cremated],xx.sex)) %if;xx.has_cremation_date; %xx.on_cremation_date;%end; %if;xx.has_cremation_place; - %xx.cremation_place;%end;
    • %nl; %end; %end; %if;xx.has_occupation;
    • %apply;capitalize(xx.occupation)
    • %nl; %end; %if;(xx.has_linked_page.OCCU)
    • %apply;capitalize(xx.linked_page.OCCU)
    • %nl; %end; %if;(xx.has_consanguinity and bvar.show_consang!="no")
    • [*consanguinity] : %xx.consanguinity;
    • %nl; %end;
    %end; %end; %define;married_to(masc, date_place) %if;masc; %if;are_married;[*married%t to:::date_place]0%nn; %elseif;are_not_married;[*relationship%t to:::date_place]0%nn; %elseif;are_engaged;[*engaged%t to:::date_place]0%nn; %elseif;is_no_sexes_check;[*relationship%t to:::date_place]0%nn; %elseif;is_no_mention;date_place [*with]%nn; %end; %else; %if;are_married;[*married%t to:::date_place]1%nn; %elseif;are_not_married;[*relationship%t to:::date_place]1%nn; %elseif;are_engaged;[*engaged%t to:::date_place]1%nn; %elseif;is_no_sexes_check;[*relationship%t to:::date_place]1%nn; %elseif;is_no_mention;date_place [*with]%nn; %end; %end; %end; %define;long_married(xx) %apply;married_to%with;%xx.is_male%and; %if;(marriage_place="") %if;(on_marriage_date="") %else; %on_marriage_date; %if;wedding_birthday; ([happy birthday to them!])%end; %end; %else; %if;(on_marriage_date=""), %marriage_place;, %else; %on_marriage_date; %if;wedding_birthday; ([happy birthday to them!])%end; , %marriage_place, %end; %end; %end; %end; %define;witness_relation(xxx,yyy) [*witness at marriage of %s and %s:::xxx:yyy] %end; %define;nav_with_sosa_ref(xxx) [*navigation with %t as Sosa reference:::xxx]%nn; %end; %let;central_index;%index;%in; %let;central_person;%first_name_key_strip;%sp;%surname_key_strip;%in; %message_to_wizard;
    %apply;image_MF("self","13")
    %apply;display_arrows()

    %if;has_public_name; %if;has_qualifiers;%public_name; %qualifier; %else;%public_name; %surname;%end; %else; %if;has_qualifiers;%first_name; %qualifier; %else; %if;cancel_links;%first_name; %surname; %else; %first_name; %surname; %end; %end; %end;

    %if;(has_sosa or has_qualifiers or has_aliases or has_nobility_titles or has_public_name or has_surnames_aliases or has_first_names_aliases or has_linked_page.HEAD)
    %if;has_sosa; %apply;display_sosa("self") [*Sosa]: %if;cancel_links;%sosa; %else;%sosa;%end; %end; %foreach;qualifier; %if;not is_first; %if;has_public_name;%public_name; %qualifier; %else;%first_name; %qualifier;%end; %end; %end; %foreach;alias; %alias; %end; %if;has_nobility_titles; %foreach;nobility_title; %if;not is_first;, %end; %nobility_title; %end; %end; %if;has_linked_page.HEAD;%linked_page.HEAD;%end; %if;(has_public_name or has_qualifiers) (%if;cancel_links;%first_name; %surname; %else; %first_name; %surname;%nn; %end;) %end; %foreach;surname_alias; (%first_name; %surname_alias;) %end; %foreach;first_name_alias; (%first_name_alias; %surname;) %end;

    %end; %if;has_image;
    %end; %apply;display_vertical("self") %if;has_image;
    %end; %if;has_parents;

    [*parents]

      %foreach;parent; %apply;li_SD("parent") %apply;image_MF("parent","13") %apply;short_display_person("parent") %end;
    %end; %if;has_families;

    [*marriage/marriages]1%sp; %if;(max_desc_level>0) [and::child/children]1%end;

      %foreach;family; %apply;li_SD("spouse") %apply;long_married("self")%sp; %apply;image_MF("spouse","13") %apply;short_display_person("spouse") %if;has_witnesses; ([witness/witnesses]w : %foreach;witness; %if;not is_first;, %end; %apply;image_MF("witness","13") %apply;short_display_person("witness")%nl; %end; )%end; %if;((wizard or friend or bvar.no_note_for_visitor="" or bvar.no_note_for_visitor="no") and has_comment) (%comment;)%end; %if;are_divorced;, [divorced]0%divorce_date;%end; %if;are_separated;, [separated]0%end; %if;has_children; , [having as children]0
        %foreach;child; %apply;li_SDC("child") %apply;image_MF("child","13") %apply;short_display_person("child") %end;
      %end; %if;(evar.opt = "from" and wizard)(%origin_file;)%nl;%end; %end;
    %end; %if;has_siblings;

    %nn; %if;(bvar.full_siblings="" or bvar.full_siblings="yes") [*full siblings]%nn; %else; [*siblings]%nn; %end;

      %foreach;father.child; %if;((bvar.full_siblings="" or bvar.full_siblings="yes") or child.index!=central_index) %apply;li_SDC("child") %apply;image_MF("child","13") %apply;short_display_person("child") %end; %end;
    %end; %apply;include_file("templx/relations") %apply;include_file("templx/linked_pages") %apply;include_file("templx/notes") %apply;include_file("templx/sources") %apply;include_file("templx/links") %if;(evar_opt="misc")%misc_names;%end; %base_trailer; %copyright; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templb/anclist.txt0000660000175200017530000000013012664543647025242 0ustar guillaumeguillaume%define;include_file(file) %include.file; %end; %apply;include_file("templx/anclist")geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templb/deslist.txt0000660000175200017530000000013012664543647025254 0ustar guillaumeguillaume%define;include_file(file) %include.file; %end; %apply;include_file("templx/deslist")geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templb/anctree.txt0000660000175200017530000000013012664543647025226 0ustar guillaumeguillaume%define;include_file(file) %include.file; %end; %apply;include_file("templx/anctree")geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/templb/ancsosa.txt0000660000175200017530000000013012664543647025234 0ustar guillaumeguillaume%define;include_file(file) %include.file; %end; %apply;include_file("templx/ancsosa")geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/hd/etc/ancmenu.txt0000660000175200017530000003743712664543647023774 0ustar guillaumeguillaume%doctype; %nn; %apply;a_of_b%with; [*ancestors]%nn; %and; %if;(public_name != "")%public_name;%else;%first_name;%end; %if;(qualifier != "") %qualifier;%end; %sp;%surname; %end; %include.favicon; %include.js; %include.css; %base_header; %message_to_wizard; %include.perso_header;

    %nn; %apply;a_of_b%with; [*ancestors]%nn; %and; %if;(public_name != "")%public_name;%else;%first_name;%end; %if;(qualifier != "") %qualifier;%end; %sp;%surname; %if;(alias != "") (%alias;)%end; %end;

    %define;tothegen(xx) [*to the %s generation:::xx]%nn; %end;

    %hidden; %if;access_by_key; %if;(occ != "0") %end; %else %end;

    %( Positionne directement l'affiche du numéro sosa en base 10 %) %(
    Sosa base
    %)

    [*color]
    %( %)
    %base_trailer; %copyright; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/launch/0002770000175200017530000000000012664543647021674 5ustar guillaumeguillaumegeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/launch/Makefile0000660000175200017530000000132512664543647023334 0ustar guillaumeguillaume# $Id: Makefile,v 1.6 2007-09-12 09:58:44 ddr Exp $ # Copyright (c) 2006-2007 INRIA EXE=.out GWB=.. OBJS=../src/iovalue.cmo ../src/buff.cmo ../src/name.cmo ../src/mutil.cmo launch.cmo OCAMLI=-I ../src TARGET=launch$(EXE) TEST_DIR=test $$(basename "$<") = "$<" || { echo "Please run 'make' in directory '$$(dirname "$<")' first"; exit 1; } all: $(TARGET) $(TARGET): $(OBJS) ocamlc -I +labltk labltk.cma unix.cma $(OBJS) -o $(TARGET) clean: rm -f *.cm[io] *.out *.log depend: export LC_ALL=C; TOP=$(GWB) $(GWB)/tools/camlp5_depend.sh $(OCAMLI) $$(ls *.mli *.ml) | sed -e 's|\.\.|$$(GWB)|g' > .depend.new mv .depend.new .depend %.cmo: %.ml @$(TEST_DIR) ocamlc -pp camlp5r $(OCAMLI) -I +labltk -c $< include .depend geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/launch/gw/0002770000175200017530000000000012664543647022311 5ustar guillaumeguillaumegeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/launch/gw/launch_lex.txt0000660000175200017530000000304212664543647025172 0ustar guillaumeguillaume# $Id: launch_lex.txt,v 1.2 2007-01-19 01:53:16 ddr Exp $ # Copyright (c) 2006-2007 INRIA Apply en: Apply fr: Appliquer Available databases: en: Available databases: fr: Bases disponibles : Browse en: Browse fr: Naviguer Browser: en: Browser: fr: Navigateur : Browser(s): en: Browser(s): fr: Navigateur(s) : Cancel en: Cancel fr: Annuler Change options en: Change options fr: Changer les options Create a new database en: Create a new database fr: Créer une nouvelle base Databases directory: en: Databases directory: fr: Répertoire des bases : Enter the name: en: Enter the name: fr: Entrer le nom : GeneWeb binary directory: en: GeneWeb binary directory: fr: Répertoire des binaires de GeneWeb : GeneWeb system directory: en: GeneWeb system directory: fr: Répertoire système de GeneWeb : HTTP Authentication: en: HTTP Authentication: fr: Authentification HTTP : Next en: Next fr: Suivant No databases. en: No databases. fr: Pas de bases. OK en: OK fr: D'accord Port: en: Port: fr: Port : Prev en: Prev fr: Précédent Quit en: Quit fr: Quitter Restart en: Restart fr: Redémarrer Select en: Select fr: Selectionner Select browser language if any: en: Select browser language if any: fr: Selectionner la langue du navigateur : Server is running... en: Server is running... fr: Le serveur tourne... basic en: basic fr: basique digest en: digest fr: digest no en: no fr: non other: en: other: fr: autre : yes en: yes fr: oui geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/launch/.depend0000660000175200017530000000010412664543647023126 0ustar guillaumeguillaumelaunch.cmo: $(GWB)/src/mutil.cmi launch.cmx: $(GWB)/src/mutil.cmx geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/launch/launch.ml0000660000175200017530000006036412664543647023510 0ustar guillaumeguillaume(* $Id: launch.ml,v 1.34 2007-06-06 15:22:35 ddr Exp $ *) (* Copyright (c) 2006-2007 INRIA *) open Camltk; open Printf; type state = { tk_win : Widget.widget; config_env : mutable list (string * string); bin_dir : mutable string; sys_dir : mutable string; doc_dir : mutable string; port : mutable int; browser : mutable option string; bases_dir : mutable string; browser_lang : mutable bool; digest_auth : mutable bool; server_running : mutable option int; waiting_pids : mutable list int } ; value trace = ref False; value config_file = Filename.concat "gw" "config.txt"; value lexicon_file = Filename.concat "gw" "launch_lex.txt"; value lexicon_mtime = ref 0.0; value input_lexicon lang = do { let ht = Hashtbl.create 501 in Mutil.input_lexicon lang ht (fun () -> open_in lexicon_file); ht }; value unfreeze_lexicon = let lexicon = ref None in fun lang -> if Sys.file_exists lexicon_file then do { let stbuf = Unix.stat lexicon_file in if stbuf.Unix.st_mtime > lexicon_mtime.val then do { lexicon.val := None; lexicon_mtime.val := stbuf.Unix.st_mtime; } else (); match lexicon.val with [ Some lex -> Some lex | None -> do { let lex = input_lexicon lang in lexicon.val := Some lex; Some lex } ] } else None ; value default_lang = try Sys.getenv "LC_ALL" with [ Not_found -> try Sys.getenv "LC_MESSAGES" with [ Not_found -> try Sys.getenv "LANG" with [ Not_found -> "en" ] ] ] ; value lang = ref default_lang; value transl w = match unfreeze_lexicon lang.val with [ Some lex -> try Hashtbl.find lex w with [ Not_found -> "[" ^ w ^ "]" ] | None -> w ] ; value read_config_env () = match try Some (open_in config_file) with [ Sys_error _ -> None ] with [ Some ic -> loop [] where rec loop env = match try Some (input_line ic) with [ End_of_file -> None ] with [ Some line -> let len = String.length line in if len = 0 then loop env else if line.[0] = '#' then loop env else let bind = try let i = String.index line '=' in (String.sub line 0 i, String.sub line (i + 1) (len - i - 1)) with [ Not_found -> (line, "") ] in loop [bind :: env] | None -> do { close_in ic; env } ] | None -> [] ] ; value mkdir_p x = loop x where rec loop x = do { let y = Filename.dirname x in if y <> x && String.length y < String.length x then loop y else (); try Unix.mkdir x 0o777 with [ Unix.Unix_error _ _ _ -> () ]; } ; value write_config_env env = do { mkdir_p (Filename.dirname config_file); let oc = open_out config_file in List.iter (fun (k, v) -> fprintf oc "%s=%s\n" k v) env; close_out oc; }; value exec prog args out err = Unix.create_process prog (Array.of_list [prog :: args]) Unix.stdin out err ; value close_server state = match state.server_running with [ Some server_pid -> do { eprintf "Closing..."; flush stderr; (* Making a (empty) file STOP_SERVER to make the server stop. *) let stop_server = List.fold_left Filename.concat state.bases_dir ["cnt"; "STOP_SERVER"] in let oc = open_out stop_server in close_out oc; (* Send a phony connection to unblock it. *) let s = Unix.socket Unix.PF_INET Unix.SOCK_STREAM 0 in try Unix.connect s (Unix.ADDR_INET Unix.inet_addr_loopback state.port) with [ Unix.Unix_error _ _ _ -> () ]; try Unix.close s with [ Unix.Unix_error _ _ _ -> () ]; let _ : (int * _) = Unix.waitpid [] server_pid in state.server_running := None; eprintf "\n"; flush stderr; } | None -> () ] ; value clean_waiting_pids state = state.waiting_pids := List.filter (fun pid -> let (r, _) = Unix.waitpid [Unix.WNOHANG] pid in let _ = do { if r = pid then do { Printf.eprintf "--- pid ended %d\n" r; flush stderr } else () } in r <> pid) state.waiting_pids ; value browse state browser port dbn = do { let pid = match browser with [ Some browser -> exec browser [sprintf "http://localhost:%d/%s" port dbn] Unix.stdout Unix.stderr | None -> -1 ] in if pid = -1 then do { eprintf "Open http://localhost:%d/%s in your favorite browser.\n" port dbn; flush stderr; } else state.waiting_pids := [pid :: state.waiting_pids]; clean_waiting_pids state; }; value window_centering win = do { let main_frame = Frame.create win [] in let frame1 = Frame.create main_frame [] in grid [frame1] [Row 0]; Grid.row_configure main_frame 0 [Weight 1]; let frame2 = Frame.create main_frame [] in grid [frame2] [Row 1]; let frame3 = Frame.create main_frame [] in grid [frame3] [Row 2]; Grid.row_configure main_frame 2 [Weight 1]; pack [main_frame] [Expand True; Fill Fill_Both]; (frame2, main_frame) }; value tk_getOpenDir initialdir = let res = Protocol.tkEval [| Protocol.TkToken "tk_chooseDirectory"; Protocol.TkToken "-initialdir"; Protocol.TkToken initialdir |] in if res = "" then initialdir else res ; value button_create wid params comm = Button.create wid [Command comm :: params] ; value config state title v def select to_string from_string set prev next = match try Some (from_string (v ())) with [ Failure _ | Not_found -> None ] with [ Some v -> do { set state v; next state } | None -> do { let (frame, gframe) = window_centering state.tk_win in let tit = Label.create frame [Text (title ())] in let var = Textvariable.create () in Textvariable.set var (to_string def); let sel = select frame var in let kont f state = match try Some (from_string (Textvariable.get var)) with [ Failure _ -> None ] with [ Some d -> do { Pack.forget [gframe]; set state d; f state } | None -> () ] in let buts = match prev with [ Some (prev_var, prev) -> do { let buts = Frame.create frame [] in let kont_prev () = do { Pack.forget [gframe]; let state = {(state) with config_env = List.remove_assoc prev_var state.config_env} in kont prev state } in let but1 = button_create buts [Text (transl "Prev")] kont_prev in let but2 = button_create buts [Text (transl "Next")] (fun _ -> kont next state) in pack [but1] [Side Side_Left]; pack [but2] [Side Side_Right]; buts } | None -> button_create frame [Text (transl "Next")] (fun _ -> kont next state) ] in pack [tit; sel; buts] []; } ] ; value rec show_main state = do { clean_waiting_pids state; let databases = List.sort compare (List.filter (fun fn -> Filename.check_suffix fn ".gwb") (Array.to_list (Sys.readdir state.bases_dir))) in let (run_frame, gframe) = window_centering state.tk_win in let txt = Label.create run_frame [Text (transl "Server is running...")] in pack [txt] []; if databases = [] then do { let txt = Label.create run_frame [Text (transl "No databases.")] in pack [txt] []; } else do { let txt = Label.create run_frame [Text (transl "Available databases:")] in pack [txt] []; List.iter (fun dbn -> do { let bn = Filename.chop_extension dbn in let frame = Frame.create run_frame [] in let blab = Label.create frame [Text ("- " ^ bn ^ " -")] in let bbut = Button.create frame [Text (transl "Browse"); Command (fun _ -> browse state state.browser state.port bn)] in pack [blab] [Side Side_Left]; pack [bbut] [Side Side_Right]; pack [frame] [Side Side_Top; Fill Fill_X]; }) databases; }; let cbut = Button.create run_frame [Text (transl "Create a new database"); Command (fun _ -> do { Pack.forget [gframe]; new_database state; })] in let obut = Button.create run_frame [Text (transl "Change options"); Command (fun _ -> do { Pack.forget [gframe]; change_options state; })] in let rbut = Button.create run_frame [Text (transl "Restart"); Command (fun _ -> do { Pack.forget [gframe]; close_server state; launch_server state; })] in let wbut = Button.create run_frame [Text (transl "Quit"); Command closeTk] in pack [cbut; obut; rbut; wbut] [Fill Fill_X]; } and change_options state = do { clean_waiting_pids state; let (frame, gframe) = window_centering state.tk_win in let tv2 = do { let opt = Frame.create frame [] in let tv = Textvariable.create () in let lab = Label.create opt [Text (transl "Select browser language if any:")] in let val1 = Radiobutton.create opt [Text (transl "yes"); Value "yes"; Variable tv] in let val2 = Radiobutton.create opt [Text (transl "no"); Value "no"; Variable tv] in Textvariable.set tv (if state.browser_lang then "yes" else "no"); pack [lab] [Side Side_Left]; pack [val1; val2] [Side Side_Right]; pack [opt] [Fill Fill_X]; tv } in let tv3 = do { let opt = Frame.create frame [] in let lab = Label.create opt [Text (transl "HTTP Authentication:")] in let tv = Textvariable.create () in let val1 = Radiobutton.create opt [Text (transl "basic"); Value "basic"; Variable tv] in let val2 = Radiobutton.create opt [Text (transl "digest"); Value "digest"; Variable tv] in Textvariable.set tv (if state.digest_auth then "digest" else "basic"); pack [lab] [Side Side_Left]; pack [val1; val2] [Side Side_Right]; pack [opt] [Fill Fill_X]; tv } in let buts = do { let buts = Frame.create frame [] in let but1 = button_create buts [Text (transl "Cancel")] (fun _ -> do { Pack.forget [gframe]; show_main state; }) in let but2 = button_create buts [Text (transl "Apply")] (fun _ -> do { state.browser_lang := Textvariable.get tv2 = "yes"; state.digest_auth := Textvariable.get tv3 = "digest"; Pack.forget [gframe]; close_server state; launch_server state; }) in pack [but1] [Side Side_Left]; pack [but2] [Side Side_Right]; buts } in pack [(*tit; sel;*) buts] []; } and new_database state = do { clean_waiting_pids state; let (frame, gframe) = window_centering state.tk_win in let tit = Label.create frame [Text (transl "Enter the name:")] in let var = Textvariable.create () in Textvariable.set var ""; let sel = Entry.create frame [TextWidth 10; TextVariable var] in let buts = do { let buts = Frame.create frame [] in let but1 = button_create buts [Text (transl "Cancel")] (fun _ -> do { Pack.forget [gframe]; show_main state; }) in let but2 = button_create buts [Text (transl "OK")] (fun _ -> let s = Textvariable.get var in if s = "" then () else loop 0 where rec loop i = if i = String.length s then do { let db = Filename.concat state.bases_dir s in if Sys.file_exists (db ^ ".gwb") then () else do { let comm = Filename.concat state.bin_dir "gwc" in let pid = exec comm ["-o"; db] Unix.stdout Unix.stderr in let (_, _) = Unix.waitpid [] pid in Pack.forget [gframe]; show_main state; } } else match s.[i] with [ 'a'..'z' | 'A'..'Z' | '-' | '0'..'9' -> loop (i + 1) | _ -> () ]) in pack [but1] [Side Side_Left]; pack [but2] [Side Side_Right]; buts } in pack [tit; sel; buts] []; } and launch_server state = do { clean_waiting_pids state; let only = Unix.gethostname () in let fd = if trace.val then Unix.stdout else Unix.openfile "gwd.log" [Unix.O_WRONLY; Unix.O_CREAT; Unix.O_TRUNC] 0o666 in let stop_server = List.fold_left Filename.concat state.bases_dir ["cnt"; "STOP_SERVER"] in try Sys.remove stop_server with [ Sys_error _ -> () ]; let rest_of_args = try let v = List.assoc "gwd_args" state.config_env in if v = "" then [] else loop 0 0 [] where rec loop ibeg i list = if i = String.length v then List.rev [String.sub v ibeg (i - ibeg) :: list] else if v.[i] = ' ' then let a = String.sub v ibeg (i - ibeg) in loop (i + 1) (i + 1) [a :: list] else loop ibeg (i + 1) list with [ Not_found -> [] ] in let rest_of_args = if state.digest_auth then ["-digest" :: rest_of_args] else rest_of_args in let rest_of_args = if state.browser_lang then ["-blang" :: rest_of_args] else rest_of_args in let comm = Filename.concat state.bin_dir "gwd" in let args = ["-p"; sprintf "%d" state.port; "-only"; "localhost"; "-only"; "127.0.0.1"; "-only"; only; "-hd"; state.sys_dir; "-bd"; state.bases_dir; "-dd"; state.doc_dir :: rest_of_args] in eprintf "%s" comm; List.iter (fun a -> eprintf " %s" a) args; eprintf "\n"; flush stderr; let server_pid = exec comm args fd fd in let (pid, ps) = Unix.waitpid [Unix.WNOHANG] server_pid in if pid = 0 then () else do { eprintf "Cannot launch the server:"; eprintf " perhaps another server is running.\n"; eprintf "You must close it, if you want to try again.\n"; flush stderr; exit 2; }; state.server_running := Some server_pid; show_main state; }; value rec config_bases_dir state = config state (fun () -> transl "Databases directory:") (fun () -> List.assoc "bases_dir" state.config_env) state.bases_dir (fun frame var -> do { let sframe = Frame.create frame [] in let lab = Label.create sframe [TextVariable var] in let but = button_create sframe [Text (transl "Select")] (fun () -> let d = Textvariable.get var in Textvariable.set var (tk_getOpenDir d)) in pack [lab; but] []; sframe }) (fun s -> s) (fun s -> s) (fun state bases_dir -> state.bases_dir := bases_dir) (Some ("browser", config_browser)) (fun state -> do { let bases_dir = state.bases_dir in eprintf "bases_dir = %s\n" bases_dir; flush stderr; let config_env_bases_dir = try List.assoc "bases_dir" state.config_env with [ Not_found -> "" ] in if bases_dir <> config_env_bases_dir || not (Sys.file_exists config_file) then do { state.config_env := List.filter (fun (v, _) -> v <> "bases_dir") state.config_env @ [("bases_dir", bases_dir)]; write_config_env state.config_env } else (); mkdir_p bases_dir; launch_server state }) and config_browser state = let default_sys_bin_dir = match Sys.os_type with [ "Win32" | "Cygwin" -> "C:\\Program Files" | _ -> "/usr/bin" ] in let browsers () = let defbrofil = try Sys.getenv "DEFAULT_BROWSERS_FILE" with [ Not_found -> Filename.concat "gw" "browsers.txt" ] in let browsers = match try Some (open_in defbrofil) with [ Sys_error _ -> None ] with [ Some ic -> loop [] where rec loop list = match try Some (input_line ic) with [ End_of_file -> None ] with [ Some name -> loop [name :: list] | None -> do { close_in ic; list } ] | None -> [] ] in let default_browsers = match Sys.os_type with [ "Win32" | "Cygwin" -> ["C:\\Program Files\\Mozilla Firefox\\firefox.exe"; "C:\\Program Files\\Internet Explorer\\iexplore.exe"] | _ -> ["/usr/bin/firefox"; "/usr/bin/mozilla"] ] in List.filter Sys.file_exists (List.rev_append browsers default_browsers) in let browsers = lazy (browsers ()) in let other_browser_var = lazy (Textvariable.create ()) in let select frame var = do { let browsers = Lazy.force browsers in let other_browser_var = Lazy.force other_browser_var in let other_browser_dir = Textvariable.create () in Textvariable.set other_browser_dir default_sys_bin_dir; let sframe = Frame.create frame [] in let list = if browsers = [] then do { let bro = Label.create sframe [TextVariable other_browser_var] in Textvariable.set var "other"; bro } else do { let list = Frame.create sframe [] in List.iter (fun fn -> do { let frad = Frame.create list [] in let rad = Radiobutton.create frad [Text fn; Variable var; Value fn] in pack [rad] [Side Side_Left]; pack [frad] [Fill Fill_X]; }) browsers; let frad = Frame.create list [] in Textvariable.set other_browser_var (match state.browser with [ Some s -> if List.mem s browsers then transl "other:" else s | None -> transl "other:" ]); let rad = Radiobutton.create frad [TextVariable other_browser_var; Variable var; Value "other"] in pack [rad] [Side Side_Left]; pack [frad] [Fill Fill_X]; Textvariable.set var (match state.browser with [ Some s -> if List.mem s browsers then s else "other" | None -> List.hd browsers ]); list } in let but = button_create sframe [Text (transl "Select")] (fun () -> do { Textvariable.set var "other"; let ini_dir = Textvariable.get other_browser_dir in let br = Tk.getOpenFile [InitialDir ini_dir] in if br <> "" then do { Textvariable.set other_browser_var br; Textvariable.set other_browser_dir (Filename.dirname br); } else (); }) in pack [list; but] []; sframe } in let to_string = fun [ Some s -> s | None -> "" ] in let from_string s = let s = if s = "other" then Textvariable.get (Lazy.force other_browser_var) else s in let s = if s = "other" then "" else s in if s = "" then None else Some s in config state (fun () -> if Lazy.force browsers = [] then transl "Browser:" else transl "Browser(s):") (fun () -> List.assoc "browser" state.config_env) None select to_string from_string (fun state browser -> state.browser := browser) (Some ("port", config_port)) (fun state -> do { let browser = state.browser in match browser with [ Some browser -> eprintf "browser = %s\n" browser | None -> eprintf "no browser\n" ]; flush stderr; match browser with [ Some browser -> let config_env_browser = try List.assoc "browser" state.config_env with [ Not_found -> "" ] in if browser <> "" && browser <> config_env_browser then do { state.config_env := List.filter (fun (v, _) -> v <> "browser") state.config_env @ [("browser", browser)]; write_config_env state.config_env } else () | None -> () ]; config_bases_dir state }) and config_port state = config state (fun () -> transl "Port:") (fun () -> List.assoc "port" state.config_env) state.port (fun frame var -> do { let ent = Entry.create frame [TextWidth 5; TextVariable var] in Entry.selection_to ent End; ent }) string_of_int (fun s -> let i = int_of_string s in if i < 1024 then failwith "bad value" else i) (fun state port -> state.port := port) (Some ("sys_dir", config_sys_dir)) (fun state -> do { let port = state.port in eprintf "port = %d\n" port; flush stderr; let config_env_port = try int_of_string (List.assoc "port" state.config_env) with [ Failure _ | Not_found -> 0 ] in if port <> config_env_port || not (Sys.file_exists config_file) then do { state.config_env := List.filter (fun (v, _) -> v <> "port") state.config_env @ [("port", string_of_int port)]; write_config_env state.config_env } else (); config_browser state }) and config_sys_dir state = config state (fun () -> transl "GeneWeb system directory:") (fun () -> List.assoc "sys_dir" state.config_env) state.sys_dir (fun frame var -> do { let sframe = Frame.create frame [] in let lab = Label.create sframe [TextVariable var] in let but = button_create sframe [Text (transl "Select")] (fun () -> let d = Textvariable.get var in Textvariable.set var (tk_getOpenDir d)) in pack [lab; but] []; sframe }) (fun s -> s) (fun s -> s) (fun state sys_dir -> state.sys_dir := sys_dir) (Some ("bin_dir", config_bin_dir)) (fun state -> do { let sys_dir = state.sys_dir in eprintf "sys_dir = %s\n" sys_dir; flush stderr; let config_env_sys_dir = try List.assoc "sys_dir" state.config_env with [ Not_found -> "" ] in if sys_dir <> config_env_sys_dir || not (Sys.file_exists config_file) then do { state.config_env := List.filter (fun (v, _) -> v <> "sys_dir") state.config_env @ [("sys_dir", sys_dir)]; write_config_env state.config_env } else (); config_port state }) and config_bin_dir state = config state (fun () -> transl "GeneWeb binary directory:") (fun () -> List.assoc "bin_dir" state.config_env) state.bin_dir (fun frame var -> do { let sframe = Frame.create frame [] in let lab = Label.create sframe [TextVariable var] in let but = button_create sframe [Text (transl "Select")] (fun () -> let d = Textvariable.get var in Textvariable.set var (tk_getOpenDir d)) in pack [lab; but] []; sframe }) (fun s -> s) (fun s -> s) (fun state bin_dir -> state.bin_dir := bin_dir) None (fun state -> do { let bin_dir = state.bin_dir in eprintf "bin_dir = %s\n" bin_dir; flush stderr; let config_env_bin_dir = try List.assoc "bin_dir" state.config_env with [ Not_found -> "" ] in if bin_dir <> config_env_bin_dir || not (Sys.file_exists config_file) then do { state.config_env := List.filter (fun (v, _) -> v <> "bin_dir") state.config_env @ [("bin_dir", bin_dir)]; write_config_env state.config_env } else (); config_sys_dir state }) ; value default_bin_dir = "../src"; value default_sys_dir = "../hd"; value default_doc_dir = "../doc"; value default_port = 2317; value default_browser = None; value default_bases_dir = "../../gwbases"; value speclist = [("-trace", Arg.Set trace, " Trace server")]; value anon_fun s = raise (Arg.Bad (sprintf "Don't know what to do with %s" s)) ; value usage_msg = "Usage: launch [option]"; value main () = do { Arg.parse (Arg.align speclist) anon_fun usage_msg; let config_env = read_config_env () in let win = openTk () in let state = {config_env = config_env; tk_win = win; bin_dir = default_bin_dir; sys_dir = default_sys_dir; doc_dir = default_doc_dir; port = default_port; browser = default_browser; bases_dir = default_bases_dir; browser_lang = True; digest_auth = True; server_running = None; waiting_pids = []} in Encoding.system_set "utf-8"; Wm.minsize_set state.tk_win 400 300; config_bin_dir state; Sys.catch_break True; try mainLoop () with [ Sys.Break -> () ]; close_server state; eprintf "Bye\n"; flush stderr; }; Printexc.catch main (); geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/gui/0002770000175200017530000000000012664543647021206 5ustar guillaumeguillaumegeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/gui/Makefile0000660000175200017530000000175112664543647022651 0ustar guillaumeguillaume# $Id: Makefile,v 1.6 2007-09-12 09:58:44 ddr Exp $ # Copyright (c) 2006-2007 INRIA include ../tools/Makefile.inc LABLGTK2=+lablgtk2 OCAMLC=ocamlc.opt OCAMLOPT=ocamlopt.opt -annot GWB=.. OBJS=../src/version.cmo ../src/iovalue.cmo ../src/buff.cmo ../src/name.cmo ../src/mutil.cmo gui.cmo OCAMLI=-I ../src -I $(LABLGTK2) TEST_DIR=test $$(basename "$<") = "$<" || { echo "Please run 'make' in directory '$$(dirname "$<")' first"; exit 1; } all:: opt out:: gui.out $(RM) gui cp gui.out gui opt:: gui.opt $(RM) gui cp gui.opt gui gui.out: $(OBJS) $(OCAMLC) -I $(LABLGTK2) lablgtk.cma unix.cma $(OBJS) -o gui.out gui.opt: $(OBJS:.cmo=.cmx) $(OCAMLOPT) -I $(LABLGTK2) lablgtk.cmxa unix.cmxa $(OBJS:.cmo=.cmx) -o gui.opt clean:: $(RM) gui depend: export LC_ALL=C; TOP=$(GWB) $(GWB)/tools/camlp5_depend.sh $(OCAMLI) $$(ls *.mli *.ml) | sed -e 's|\.\.|$$(GWB)|g' > .depend.new mv .depend.new .depend %.cmo: %.ml @$(TEST_DIR) ocamlc -pp camlp5r $(OCAMLI) -I +lablgtk2 -c $< include .depend geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/gui/gui.ml0000660000175200017530000012056412664543647022333 0ustar guillaumeguillaume(* $Id: gui.ml,v 1.00 2011-12-25 15:36:35 flh Exp $ *) open Printf; type conf = { bases_dir : mutable string; port : mutable int; browser : mutable option string; log : mutable string; gui_arg : mutable list (string * string); gwd_arg : mutable list string; only_arg : mutable list string; server_running : mutable option int; waiting_pids : mutable list int } ; value bin_dir = let path = Filename.dirname (Sys.argv.(0)) in if Filename.is_relative path then Filename.concat (Sys.getcwd ()) path else path ; value trace = ref False; value default_lang = try Sys.getenv "LC_ALL" with [ Not_found -> try Sys.getenv "LC_MESSAGES" with [ Not_found -> try Sys.getenv "LANG" with [ Not_found -> "en" ] ] ] ; value lang = ref default_lang; value lexicon_mtime = ref 0.0; value lexicon_file = Filename.concat bin_dir "gui_lex.txt"; value config_gui_file = Filename.concat bin_dir "config.txt"; value config_gwd_file = Filename.concat bin_dir "gwd.arg"; value config_only_file = Filename.concat bin_dir "only.txt"; (**/**) (* Gestion du dictionnaire des langues pour GUI. *) value input_lexicon lang = do { let ht = Hashtbl.create 501 in Mutil.input_lexicon lang ht (fun () -> open_in lexicon_file); ht }; value unfreeze_lexicon = let lexicon = ref None in fun lang -> if Sys.file_exists lexicon_file then do { let stbuf = Unix.stat lexicon_file in if stbuf.Unix.st_mtime > lexicon_mtime.val then do { lexicon.val := None; lexicon_mtime.val := stbuf.Unix.st_mtime; } else (); match lexicon.val with [ Some lex -> Some lex | None -> do { let lex = input_lexicon lang in lexicon.val := Some lex; Some lex } ] } else None ; value transl w = match unfreeze_lexicon lang.val with [ Some lex -> try Hashtbl.find lex w with [ Not_found -> "[" ^ w ^ "]" ] | None -> w ] ; value capitale w = String.capitalize w ; (**/**) (* Fonctions utiles. *) value channel_redirector channel callback = do { let (cout,cin) = Unix.pipe () in Unix.dup2 cin channel ; let chan = GMain.Io.channel_of_descr cout in let len = 80 in let buf = Bytes.create len in GMain.Io.add_watch chan ~prio:0 ~cond:[`IN; `HUP; `ERR] ~callback: do { fun cond -> try if List.mem `IN cond then do { (* On Windows, you must use Io.read *) let len = GMain.Io.read chan ~buf ~pos:0 ~len in len >= 1 && (callback (String.sub buf 0 len)) } else False with [ _ -> False ] } }; value exec prog args out err = Unix.create_process prog (Array.of_list [prog :: args]) Unix.stdin out err ; value exec_wait conf prog args = do { let wnd = GWindow.window ~title:(capitale (transl "Processing")) ~position:`CENTER ~resizable:True ~width:600 ~height:300 () in ignore (wnd#connect#destroy ~callback:(fun _ -> ())); wnd#show(); let vbox = GPack.vbox ~spacing:5 ~packing:wnd#add () in let scrolled_window = GBin.scrolled_window ~border_width: 10 ~hpolicy: `AUTOMATIC ~vpolicy: `AUTOMATIC ~packing:vbox#add () in let vvbox = GPack.hbox ~border_width: 10 ~packing:scrolled_window#add_with_viewport () in vvbox #focus#set_vadjustment (Some scrolled_window#vadjustment); let redirect channel = let buffer = GText.buffer () in let _text = GText.view ~buffer ~editable:False ~packing:vvbox#add () in channel_redirector channel (fun c -> do {buffer#insert c; True}) in ignore (redirect Unix.stderr); let pid = exec prog args Unix.stdout Unix.stderr in (* On voudrait bien attendre la fin du process mais sinon wnd ne s'affiche pas ... *) let (_, _) = Unix.waitpid [] pid in () } ; value mkdir_p x = loop x where rec loop x = do { let y = Filename.dirname x in if y <> x && String.length y < String.length x then loop y else (); try Unix.mkdir x 0o777 with [ Unix.Unix_error _ _ _ -> () ]; } ; value rmdir conf dir = (* Récupère tous les fichiers et dossier d'un dossier *) (* et renvoie la liste des dossiers et la liste des fichiers. *) let read_files_folders fname = let list = List.map (fun file -> Filename.concat fname file) (Array.to_list (Sys.readdir fname)) in List.partition Sys.is_directory list in (* Parcours récursif de tous les dossiers *) let rec loop l folders files = match l with [ [] -> (folders, files) | [x :: l] -> let (fd, fi) = read_files_folders x in let l = List.rev_append l fd in let folders = List.rev_append fd folders in let files = List.rev_append fi files in loop l folders files ] in (* Toute l'arborescence de dir *) let (folders, files) = loop [dir] [] [] in do { List.iter (fun f -> try Unix.unlink f with [ _ -> () ]) files; List.iter (fun f -> try Unix.rmdir f with [ _ -> () ]) folders; try Unix.rmdir dir with [ Unix.Unix_error _ _ _ -> () ] } ; value rec cut_at_equal s = try let i = String.index s '=' in (String.sub s 0 i, String.sub s (succ i) (String.length s - succ i)) with [ Not_found -> (s, "") ] ; value read_base_env conf bname = let fname = Filename.concat conf.bases_dir (bname ^ ".gwf") in match try Some (open_in fname) with [ Sys_error _ -> None] with [ Some ic -> let env = loop [] where rec loop env = match try Some (input_line ic) with [End_of_file -> None] with [ Some s -> if s = "" || s.[0] = '#' then loop env else loop [cut_at_equal s :: env] | None -> List.rev env ] in do { close_in ic; env } | None -> [] ] ; value write_base_env conf bname env = let fname = Filename.concat conf.bases_dir (bname ^ ".gwf") in match try Some (open_out fname) with [ Sys_error _ -> None] with [ Some oc -> do { List.iter (fun (k, v) -> fprintf oc "%s=%s\n" k v) env; close_out oc } | None -> () ] ; value write_config_file conf = do { let fname = Filename.concat bin_dir "config.txt" in match try Some (open_out fname) with [ Sys_error _ -> None] with [ Some oc -> do { List.iter (fun (k, v) -> fprintf oc "%s=%s\n" k v) conf.gui_arg; close_out oc; } | None -> () ] }; value read_config_file () = match try Some (open_in config_gui_file) with [ Sys_error _ -> None ] with [ Some ic -> loop [] where rec loop env = match try Some (input_line ic) with [ End_of_file -> None ] with [ Some line -> let len = String.length line in if len = 0 then loop env else if line.[0] = '#' then loop env else let bind = try let i = String.index line '=' in (String.sub line 0 i, String.sub line (i + 1) (len - i - 1)) with [ Not_found -> (line, "") ] in loop [bind :: env] | None -> do { close_in ic; env } ] | None -> [] ] ; value config_browser () = let default_browsers = match Sys.os_type with [ "Win32" | "Cygwin" -> ["C:\\Program Files\\Mozilla Firefox\\firefox.exe"; "C:\\Program Files\\Internet Explorer\\iexplore.exe"] | _ -> ["/usr/bin/firefox"; "/usr/bin/mozilla"] ] in match List.filter Sys.file_exists default_browsers with [ [] -> None | [b :: l] -> Some b ] ; value clean_waiting_pids conf = conf.waiting_pids := List.filter (fun pid -> let (r, _) = Unix.waitpid [Unix.WNOHANG] pid in let _ = do { if r = pid then do { Printf.eprintf "--- pid ended %d\n" r; flush stderr } else () } in r <> pid) conf.waiting_pids ; value close_server conf = match conf.server_running with [ Some server_pid -> do { clean_waiting_pids conf; eprintf "Closing..."; flush stderr; (* Making a (empty) file STOP_SERVER to make the server stop. *) let stop_server = List.fold_left Filename.concat conf.bases_dir ["cnt"; "STOP_SERVER"] in let oc = open_out stop_server in close_out oc; (* Send a phony connection to unblock it. *) let s = Unix.socket Unix.PF_INET Unix.SOCK_STREAM 0 in try Unix.connect s (Unix.ADDR_INET Unix.inet_addr_loopback conf.port) with [ Unix.Unix_error _ _ _ -> () ]; try Unix.close s with [ Unix.Unix_error _ _ _ -> () ]; ignore (Unix.waitpid [] server_pid); conf.server_running := None; eprintf "\n"; flush stderr; } | None -> () ] ; (**/**) (* Autres interfaces graphique ou utilitaires. *) value select_dir parent initial_dir = do { let dialog = GWindow.file_chooser_dialog ~action:`SELECT_FOLDER ~parent () in dialog#add_button_stock `CANCEL `CANCEL ; dialog#add_select_button_stock `OPEN `OPEN ; let new_dir = if dialog#run () = `OPEN then match dialog#filename with [ Some dir -> dir | _ -> initial_dir ] else initial_dir in dialog#destroy (); new_dir }; value select_file parent initial_file = do { let dialog = GWindow.file_chooser_dialog ~action:`OPEN ~parent () in dialog#add_button_stock `CANCEL `CANCEL ; dialog#add_select_button_stock `OPEN `OPEN ; let new_file = if dialog#run () = `OPEN then match dialog#filename with [ Some file -> file | _ -> initial_file ] else initial_file in dialog#destroy (); new_file }; value error_popup msg = do { let wnd = GWindow.window ~title:(capitale (transl "error")) ~position:`CENTER ~resizable:True () in ignore (wnd#connect#destroy ~callback:(fun _ -> ())); let vbox = GPack.vbox ~spacing:5 ~packing:wnd#add () in let _label = GMisc.label ~text:msg ~packing:vbox#pack () in let bbox = GPack.button_box `HORIZONTAL ~border_width: 5 ~layout: `SPREAD ~packing: vbox#pack () in let btn_ok = GButton.button ~label:(transl "OK") ~packing:bbox#pack () in ignore (btn_ok#connect#clicked (fun () -> wnd#destroy ())); wnd#show (); }; value display_log conf = do { let wnd = GWindow.window ~title:(capitale (transl "log")) ~position:`CENTER ~resizable:True ~width:600 ~height:300 () in ignore (wnd#connect#destroy ~callback:(fun _ -> ())); let vbox = GPack.vbox ~spacing:5 ~packing:wnd#add () in let scrolled_window = GBin.scrolled_window ~border_width: 10 ~hpolicy: `AUTOMATIC ~vpolicy: `AUTOMATIC ~packing:vbox#add () in let vvbox = GPack.hbox ~border_width: 10 ~packing:scrolled_window#add_with_viewport () in vvbox #focus#set_vadjustment (Some scrolled_window#vadjustment); match try Some (open_in conf.log) with [Sys_error _ -> None] with [ Some ic -> do { let len = in_channel_length ic in (* TODO ! *) if len > 0 then do { let buf = Buffer.create len in Buffer.add_channel buf ic len; let text = GText.view ~packing:vvbox#add () in text#buffer#set_text (Buffer.contents buf) } else (); close_in ic; } | None -> () ]; let bbox = GPack.button_box `HORIZONTAL ~border_width: 5 ~layout: `EDGE ~packing: vbox#pack () in let btn_ok = GButton.button ~label:(transl "OK") ~packing:bbox#pack () in ignore (btn_ok#connect#clicked (fun () -> wnd#destroy ())); wnd#show(); }; value delete_base conf bname = do { let wnd = GWindow.window ~title:(capitale (transl "Confirm")) ~position:`CENTER ~resizable:True ~width:300 ~height:50 () in let vbox = GPack.vbox ~spacing:5 ~packing:wnd#add () in let bbox = GPack.button_box `HORIZONTAL ~border_width: 5 ~layout: `SPREAD ~packing: vbox#pack () in let btn_cancel = GButton.button ~label:(capitale (transl "cancel")) ~packing:bbox#pack () in ignore (btn_cancel#connect#clicked (fun () -> wnd#destroy ())); let btn_ok = GButton.button ~label:(transl "OK") ~packing:bbox#pack () in ignore (btn_ok#connect#clicked (fun () -> do { let base = Filename.concat conf.bases_dir (bname ^ ".gwb") in rmdir conf base; wnd#destroy (); (* TODO : revenir sur l'accueil *) })); wnd#show (); }; (**/**) (* Autres binaires. *) value read_error_cmd conf = match try Some (open_in conf.log) with [ Sys_error _ -> None ] with [ Some ic -> loop "" where rec loop msg = match try Some (input_line ic) with [ End_of_file -> None ] with [ Some line -> loop (msg ^ " " ^ line) | None -> do { close_in ic; msg } ] | None -> "error reading error_file" ] ; value browse conf url = do { let pid = match conf.browser with [ Some browser -> exec browser [url] Unix.stdout Unix.stderr | None -> -1 ] in if pid = -1 then error_popup (transl "open url in your favorite browser") else conf.waiting_pids := [pid :: conf.waiting_pids]; clean_waiting_pids conf; }; (**/**) (* Binaires GeneWeb. *) (* NB: Windows : let base = Filename.concat conf.bases_dir bname in Plante car il n'interprète pas les chemins avec espaces. On se place donc toujours dans le répertoire des bases dans launch_server. *) value gwc1 conf bname fname = (* Hack Windows, pas de Filename.concat mais juste bname *) let prog = Filename.concat bin_dir "gwc1" in let args = ["-v"; "-nc"; "-o"; bname] in let args = if fname <> "" then [fname :: args] else args in exec_wait conf prog args ; value gwc2 conf bname fname = let prog = Filename.concat bin_dir "gwc2" in let args = ["-v"; "-nc"; "-o"; bname] in let args = if fname <> "" then [fname :: args] else args in exec_wait conf prog args ; value ged2gwb conf bname fname = let prog = Filename.concat bin_dir "ged2gwb" in let args = ["-nc"; "-o"; bname] in let args = if fname <> "" then [fname :: args] else args in exec_wait conf prog args ; value ged2gwb2 conf bname fname = let prog = Filename.concat bin_dir "ged2gwb2" in let args = ["-nc"; "-o"; bname] in let args = if fname <> "" then [fname :: args] else args in exec_wait conf prog args ; value gwb2ged conf bname fname = let fname = fname ^ ".ged" in let prog = Filename.concat bin_dir "gwb2ged" in let args = [bname; "-o"; fname] in exec_wait conf prog args ; value gwu conf bname fname = let fname = fname ^ ".gw" in let prog = Filename.concat bin_dir "gwu" in let args = [bname; "-o"; fname] in exec_wait conf prog args ; value consang conf bname = let prog = Filename.concat bin_dir "consang" in let args = ["-i"; bname] in exec_wait conf prog args ; value update_nldb conf bname = let prog = Filename.concat bin_dir "update_nldb" in let args = [bname] in (* TODO il faut effacer le fichier avant de le re-créer *) (* rm bname/notes_links *) exec_wait conf prog args ; value check_base conf bname = let prog = Filename.concat bin_dir "check_base" in let args = [bname] in exec_wait conf prog args ; (**/**) (* Fonctions utilies pour les binaires GeneWeb. *) value print_default_gwf_file conf bname = let gwf = [ ("# File generated by GeneWeb", ""); ("access_by_key", "yes"); ("disable_forum", "yes"); ("hide_private_names", "no"); ("use_restrict", "no"); ("show_consang", "yes"); ("display_sosa", "yes"); ("place_surname_link_to_ind", "yes"); ("max_anc_level", "8"); ("max_anc_tree", "7"); ("max_desc_level", "12"); ("max_desc_tree", "4"); ("max_cousins", "2000"); ("max_cousins_level", "5"); ("latest_event", "20"); ("template", "*"); ("long_date", "no"); ("counter", "no"); ("full_siblings", "yes"); ("hide_advanced_request", "no") ] in let fname = Filename.concat conf.bases_dir (bname ^ ".gwf") in if Sys.file_exists fname then () else write_base_env conf bname gwf ; value create_base conf bname src_file = if bname = "" then () else do { if src_file = "" then gwc2 conf bname src_file else let fname = String.lowercase src_file in if Filename.check_suffix fname ".gw" then gwc2 conf bname src_file else if Filename.check_suffix fname ".ged" then ged2gwb2 conf bname src_file else error_popup (transl "Unknown file"); let gwf_file = Filename.concat conf.bases_dir (bname ^ ".gwf") in if Sys.file_exists gwf_file then () else print_default_gwf_file conf bname }; value rename_base conf bname new_name = let databases = List.sort compare (List.filter (fun fn -> Filename.check_suffix fn ".gwb") (Array.to_list (Sys.readdir conf.bases_dir))) in let databases = List.map Filename.chop_extension databases in if List.mem new_name databases then error_popup (capitale (transl "database already exists")) else let old_base = Filename.concat conf.bases_dir (bname ^ ".gwb") in let new_base = Filename.concat conf.bases_dir (new_name ^ ".gwb") in try Sys.rename old_base new_base with [ _ -> error_popup "error rename" ] ; value clean_database conf bname = do { gwu conf bname (bname ^ "_save"); rename_base conf bname (bname ^ "_old"); let fname = Filename.concat conf.bases_dir (bname ^ "_save.gw") in gwc2 conf bname fname; consang conf bname; update_nldb conf bname; }; value merge conf bnames bname parameters = do { (* TODO : même méthode que clean *) List.iter (fun bname -> let bname = Filename.concat conf.bases_dir (bname ^ ".gwb") in let c = Filename.concat bin_dir "gwu " ^ bname ^ " -o " ^ bname ^ ".gw" in let rc = Sys.command c in if rc > 1 then error_popup c else ()) bnames; let old_bases = List.fold_left (fun accu bname -> accu ^ " -sep " ^ bname ^ ".gw") "" bnames in let bname = Filename.concat conf.bases_dir bname in let c = Filename.concat bin_dir "gwc " ^ old_bases ^ " -f -o " ^ bname in let rc = Sys.command c in if rc > 1 then error_popup c else (); }; (* fonctions pour faciliter le transport des bases suite à une mise à jour. *) (* exporte toutes les bases au formet GW: base_name_date_today.gw *) (* on copie toutes les base dans le nouveau dossier bases *) (* on cherche tous les fichiers GW, et on les importe base_name *) value export_all_bases conf = let databases = List.sort compare (List.filter (fun fn -> Filename.check_suffix fn ".gwb") (Array.to_list (Sys.readdir conf.bases_dir))) in let today = "05_10_2012" in List.iter (fun s -> gwu conf s (s ^ "_" ^ today)) databases ; value import_all_bases conf = () ; (**/**) (* UI pratique *) value tmp_wnd conf bname f = do { let wnd = GWindow.window ~title:(capitale (transl "confirm")) ~position:`CENTER ~resizable:True () in ignore (wnd#connect#destroy ~callback:(fun _ -> ())); let vbox = GPack.vbox ~spacing:5 ~packing:wnd#add () in let hbox = GPack.hbox ~spacing:5 ~packing:vbox#pack () in let _label = GMisc.label ~text:(transl "enter a name") ~packing:hbox#pack () in let fname = ref "" in let entry = GEdit.entry ~text:"" ~packing:(hbox#pack ~expand:False ~fill:False ~padding:5) () in ignore (entry#connect#changed (fun () -> fname.val := entry#text)); let bbox = GPack.button_box `HORIZONTAL ~border_width: 5 ~layout: `SPREAD ~packing: vbox#pack () in let btn_cancel = GButton.button ~label:(capitale (transl "cancel")) ~packing:bbox#pack () in ignore (btn_cancel#connect#clicked (fun () -> wnd#destroy ())); let btn_ok = GButton.button ~label:(transl "OK") ~packing:bbox#pack () in ignore (btn_ok#connect#clicked (fun () -> do { wnd#destroy (); let fname = if fname.val = "" then "a" else fname.val in f conf bname fname })); wnd#show (); }; (**/**) (* Interface graphique. *) value main_window = do { ignore (GMain.init ()); let wnd = GWindow.window ~title:("GeneWeb - " ^ Version.txt) ~position:`CENTER ~resizable:True ~width:640 ~height:480 () in (* TODO : faire un close_server *) ignore (wnd#connect#destroy ~callback:GMain.quit); wnd }; value rec show_main conf = do { ignore (main_window#connect#destroy ~callback:(fun () -> do {close_server conf; GMain.quit ()})); main_window#show (); clean_waiting_pids conf; let databases = List.sort compare (List.filter (fun fn -> Filename.check_suffix fn ".gwb") (Array.to_list (Sys.readdir conf.bases_dir))) in let vbox = GPack.vbox ~spacing:5 ~packing:main_window#add () in let toolbar = GButton.toolbar ~orientation:`HORIZONTAL ~style:`BOTH ~packing:vbox#pack () in let icon name = let file = List.fold_left Filename.concat bin_dir ["images"; name] in let info = GDraw.pixmap_from_xpm ~file:file () in (GMisc.pixmap info ())#coerce in let inser_toolbar text tooltip icon_file callback = toolbar#insert_button ~text:text ~tooltip:tooltip ~tooltip_private:"Private" ~icon:(icon icon_file) ~callback:callback () in ignore (inser_toolbar (capitale (transl "create")) (capitale (transl "create a database")) "gui_create.png" (fun () -> do { vbox#destroy (); new_database conf; })); toolbar#insert_space (); ignore (inser_toolbar (capitale (transl "log")) (capitale (transl "view log")) "gui_log.png" (fun () -> display_log conf) ); toolbar#insert_space (); ignore (inser_toolbar (capitale (transl "doc")) (capitale (transl "view doc")) "gui_doc.png" (fun () -> let url = "http://opensource.geneanet.org/projects/geneweb/wiki" in ignore (browse conf url)) ); toolbar#insert_space (); (* TOTO : gérer le restart ignore (inser_toolbar (capitale (transl "setup")) (capitale (transl "setup GeneWeb")) "gui_setup.png" (fun () -> do { vbox#destroy (); setup_gui conf })); toolbar#insert_space (); *) (* inser_toolbar (capitale (transl "restart")) (capitale (transl "restart GeneWeb")) "gtk.xpm" (fun () -> do { vbox#destroy (); close_server conf; launch_server conf }); toolbar#insert_space (); *) ignore (inser_toolbar (capitale (transl "quit")) (capitale (transl "quit GeneWeb")) "gui_quit.png" (fun () -> do { vbox#destroy (); close_server conf; GMain.quit () })); if databases = [] then ignore (GMisc.label ~text:(capitale (transl "no databases.")) ~packing:vbox#pack ()) else do { let _label = GMisc.label ~text:((capitale (transl "available databases")) ^ " (" ^ (string_of_int (List.length databases) ^ "):")) ~packing:vbox#pack () in let scrolled_window = GBin.scrolled_window ~border_width: 10 ~hpolicy: `AUTOMATIC ~vpolicy: `AUTOMATIC ~packing:vbox#add () in let vvbox = GPack.vbox ~border_width: 10 ~packing:scrolled_window#add_with_viewport () in vvbox #focus#set_vadjustment (Some scrolled_window#vadjustment); let table = GPack.table ~rows:3 ~columns:3 ~row_spacings: 5 ~col_spacings: 5 ~packing:vvbox#pack () in loop 0 databases where rec loop i = fun [ [] -> () | [bname :: l] -> do { let bn = Filename.chop_extension bname in let _label = GMisc.label ~text:bn ~packing:(table#attach ~left:0 ~top:i) () in let bbut = GButton.button ~label:(capitale (transl "browse")) ~packing:(table#attach ~left:1 ~top:i) () in ignore (bbut#connect#clicked (fun () -> let url = Printf.sprintf "http://localhost:%d/%s" conf.port bn in ignore (browse conf url))); let bbut = GButton.button ~label:(capitale (transl "tools")) ~packing:(table#attach ~left:2 ~top:i) () in ignore (bbut#connect#clicked (fun () -> do { vbox#destroy (); tools conf bn })); loop (i+1) l }] } } and new_database conf = do { let vbox = GPack.box `VERTICAL ~spacing:5 ~packing:main_window#add () in let table = GPack.table ~rows:2 ~columns:2 ~row_spacings: 5 ~col_spacings: 5 ~packing:vbox#pack () in let _label = GMisc.label ~text:(capitale (transl "name of the database:")) ~packing:(table#attach ~left:0 ~top:0) () in let entry = GEdit.entry ~text:"" ~packing:(table#attach ~left:1 ~top:0) () in let _label= GMisc.label ~text:(capitale (transl "select a file")) ~packing:(table#attach ~left:0 ~top:1) () in let bbox = GPack.button_box `HORIZONTAL ~border_width: 5 ~layout: `SPREAD ~packing: (table#attach ~left:1 ~top:1) () in let select = GButton.button ~stock:`OPEN ~packing:bbox#pack () in let file = ref "" in ignore (select#connect#clicked (fun () -> file.val := select_file main_window "")); let bbox = GPack.button_box `HORIZONTAL ~border_width: 5 ~layout: `SPREAD ~packing: vbox#pack () in let btn_cancel = GButton.button ~label:(capitale (transl "cancel")) ~packing:bbox#pack () in ignore (btn_cancel#connect#clicked (fun () -> do { vbox#destroy (); show_main conf } ) ); let btn_ok = GButton.button ~label:(transl "OK") ~packing:bbox#pack () in ignore (btn_ok#connect#clicked (fun () -> do { create_base conf entry#text file.val; vbox#destroy (); show_main conf; })) } and setup_gui conf = do { let old_conf = { bases_dir = conf.bases_dir; port = conf.port; browser = conf.browser; log = conf.log; gui_arg = []; gwd_arg = [] ; only_arg = []; server_running = conf.server_running; waiting_pids = conf.waiting_pids } in let vbox = GPack.vbox ~spacing:5 ~packing:main_window#add () in let _label = GMisc.label ~text:(transl "setup GeneWeb") ~packing:vbox#pack () in let hbox = GPack.hbox ~spacing:5 ~packing:vbox#pack () in let _label = GMisc.label ~text:("Bases dir : " ^ conf.bases_dir) ~packing:hbox#pack () in let select = GButton.button ~stock:`OPEN ~packing:(hbox#pack ~expand:False) () in ignore (select#connect#clicked (fun () -> conf.bases_dir := select_dir main_window conf.bases_dir)) ; let hbox = GPack.hbox ~spacing:5 ~packing:vbox#pack () in let _label = GMisc.label ~text:"Port :" ~packing:(hbox#pack ~expand:False ~fill:False ~padding:5) () in let entry = GEdit.entry ~text:(string_of_int conf.port) ~packing:(hbox#pack ~expand:False ~fill:False ~padding:5) () in ignore (entry#connect#changed (fun () -> conf.port := int_of_string entry#text)); let browser = match conf.browser with [ Some browser -> browser | None -> "" ] in let hbox = GPack.hbox ~spacing:5 ~packing:vbox#pack () in let _label = GMisc.label ~text:("Browser : " ^ browser) ~packing:hbox#pack () in let select = GButton.button ~stock:`OPEN ~packing:(hbox#pack ~expand:False) () in ignore (select#connect#clicked (fun () -> let browser = select_file main_window bin_dir in let browser = if browser = "" then None else Some browser in conf.browser := browser)) ; let bbox = GPack.button_box `HORIZONTAL ~border_width: 5 ~layout: `SPREAD ~packing: vbox#pack () in let btn_cancel = GButton.button ~label:(transl "Cancel") ~packing:bbox#pack () in ignore (btn_cancel#connect#clicked (fun () -> do { vbox#destroy (); show_main old_conf } ) ) ; let btn_ok = GButton.button ~label:(transl "OK") ~packing:bbox#pack () in ignore (btn_ok#connect#clicked (fun () -> do { vbox#destroy (); let browser = match conf.browser with [ Some b -> b | None -> "" ] in let gui_arg = [("bd", conf.bases_dir); ("port", string_of_int conf.port); ("browser", browser)] in let conf = {(conf) with gui_arg = gui_arg} in write_config_file conf; close_server conf; launch_server conf })); } and config_gwf conf bname = do { let vbox = GPack.vbox ~spacing:5 ~packing:main_window#add () in let _label = GMisc.label ~text:(transl "Configuration gwf file of " ^ bname) ~packing:vbox#pack () in let scrolled_window = GBin.scrolled_window ~border_width: 10 ~hpolicy: `AUTOMATIC ~vpolicy: `AUTOMATIC ~packing:vbox#add () in let vvbox = GPack.vbox ~border_width: 10 ~packing:scrolled_window#add_with_viewport () in vvbox #focus#set_vadjustment (Some scrolled_window#vadjustment); let hbox = GPack.hbox ~spacing:5 ~packing:vvbox#pack () in let vbox_list = GPack.vbox ~spacing:5 ~packing:hbox#pack () in let benv = read_base_env conf bname in let benv_new = ref (List.map (fun (k, v) -> (k, ref v)) benv) in List.iter (fun (k, v) -> do { let hbox = GPack.hbox ~spacing:5 ~packing:vbox_list#pack () in let _label = GMisc.label ~text: (k ^ " : ") ~width: 200 ~packing:hbox#pack () in (* TODO : si la valeur vaut "yes" ou "no", on ajoute un bouton radio sinon on ajoute un champ texte if v.val = *) let entry = GEdit.entry ~text: v.val ~packing:(hbox#pack ~expand:False ~fill:False ~padding:5) () in ignore (entry#connect#changed (fun () -> v.val := entry#text)) } ) benv_new.val; let bbox = GPack.button_box `HORIZONTAL ~border_width: 5 ~layout: `SPREAD ~packing: vbox#pack () in let btn_cancel = GButton.button ~label:(transl "Cancel") ~packing:bbox#pack () in ignore (btn_cancel#connect#clicked (fun () -> do { vbox#destroy (); show_main conf } ) ); let btn_ok = GButton.button ~label:(transl "OK") ~packing:bbox#pack () in ignore (btn_ok#connect#clicked (fun () -> do { let new_benv = List.map (fun (k, v) -> (k, v.val)) benv_new.val in write_base_env conf bname new_benv; vbox#destroy (); show_main conf } ) ) } and tools conf bname = do { let vbox = GPack.vbox ~spacing:5 ~packing:main_window#add () in let _label = GMisc.label ~text:(transl "toolbox" ^ " " ^ bname) ~packing:vbox#pack () in let scrolled_window = GBin.scrolled_window ~border_width: 10 ~hpolicy: `AUTOMATIC ~vpolicy: `AUTOMATIC ~packing:vbox#add () in let vvbox = GPack.hbox ~border_width: 10 ~packing:scrolled_window#add_with_viewport () in vvbox #focus#set_vadjustment (Some scrolled_window#vadjustment); let table = GPack.table ~rows:2 ~columns:2 ~row_spacings: 5 ~col_spacings: 5 ~packing:vvbox#pack () in let _label = GMisc.label ~text:(transl "extract gw file") ~packing:(table#attach ~left:0 ~top:0) () in let bbut = GButton.button ~label:(transl "Extract GW") ~packing:(table#attach ~left:1 ~top:0) () in ignore (bbut#connect#clicked (fun () -> tmp_wnd conf bname gwu)); let _label = GMisc.label ~text:(transl "extract ged file") ~packing:(table#attach ~left:0 ~top:1) () in let bbut = GButton.button ~label:(transl "Extract GED") ~packing:(table#attach ~left:1 ~top:1) () in ignore (bbut#connect#clicked (fun () -> tmp_wnd conf bname gwb2ged)); let _label = GMisc.label ~text:(transl "setup base options") ~packing:(table#attach ~left:0 ~top:2) () in let bbut = GButton.button ~label:(transl "setup gwf file") ~packing:(table#attach ~left:1 ~top:2) () in ignore (bbut#connect#clicked (fun () -> do { vbox#destroy (); config_gwf conf bname })) ; let _label = GMisc.label ~text:(transl "Clean database") ~packing:(table#attach ~left:0 ~top:3) () in let bbut = GButton.button ~label:(transl "Clean") ~packing:(table#attach ~left:1 ~top:3) () in ignore (bbut#connect#clicked (fun () -> clean_database conf bname)); let _label = GMisc.label ~text:(transl "Rename") ~packing:(table#attach ~left:0 ~top:4) () in let bbut = GButton.button ~label:(transl "Rename") ~packing:(table#attach ~left:1 ~top:4) () in ignore (bbut#connect#clicked (fun () -> do { tmp_wnd conf bname rename_base; vbox#destroy (); show_main conf})); let _label = GMisc.label ~text:(transl "Delete") ~packing:(table#attach ~left:0 ~top:5) () in let bbut = GButton.button ~label:(transl "Delete") ~packing:(table#attach ~left:1 ~top:5) () in ignore (bbut#connect#clicked (fun () -> delete_base conf bname)); (* TODO GMisc.label ~text:"merge" ~packing:(table#attach ~left:0 ~top:0) (); let bbut = GButton.button ~label:(transl "Merge") ~packing:(table#attach ~left:1 ~top:0) () in ignore (bbut#connect#clicked (fun () -> ())); *) let _label = GMisc.label ~text:(transl "Consang") ~packing:(table#attach ~left:0 ~top:6) () in let bbut = GButton.button ~label:(transl "Consang") ~packing:(table#attach ~left:1 ~top:6) () in ignore (bbut#connect#clicked (fun () -> consang conf bname)); let _label = GMisc.label ~text:(transl "Update_nldb") ~packing:(table#attach ~left:0 ~top:7) () in let bbut = GButton.button ~label:(transl "Update_nldb") ~packing:(table#attach ~left:1 ~top:7) () in ignore (bbut#connect#clicked (fun () -> update_nldb conf bname)); let bbox = GPack.button_box `HORIZONTAL ~border_width: 5 ~layout: `EDGE ~packing: vbox#pack () in let btn_cancel = GButton.button ~label:(transl "Home") ~packing:bbox#pack () in ignore (btn_cancel#connect#clicked (fun () -> do { vbox#destroy (); show_main conf } ) ); } and launch_server conf = do { (* On se place dans le répertoire des bases (obligatoire pour Windows). *) Sys.chdir conf.bases_dir; clean_waiting_pids conf; (* TODO *) (* let cmd_log = Unix.openfile conf.log [Unix.O_WRONLY; Unix.O_CREAT; Unix.O_TRUNC] 0o666 in *) let gwd_log = if trace.val then Unix.stdout else let fname = Filename.concat conf.bases_dir "gwd.log" in Unix.openfile fname [Unix.O_WRONLY; Unix.O_CREAT; Unix.O_TRUNC] 0o666 in let stop_server = List.fold_left Filename.concat conf.bases_dir ["cnt"; "STOP_SERVER"] in try Sys.remove stop_server with [ Sys_error _ -> () ]; let prog = Filename.concat bin_dir "gwd" in let args = ["-hd"; bin_dir; "-bd"; conf.bases_dir; "-p"; sprintf "%d" conf.port] in let server_pid = exec prog args gwd_log gwd_log in let (pid, ps) = Unix.waitpid [Unix.WNOHANG] server_pid in if pid = 0 then () else do { eprintf "Cannot launch the server:"; eprintf " perhaps another server is running.\n"; eprintf "You must close it, if you want to try again.\n"; flush stderr; exit 2; }; conf.server_running := Some server_pid; show_main conf; }; value launch_config () = if Sys.file_exists config_gui_file then let gui_arg = read_config_file () in let bases_dir = List.assoc "bd" gui_arg in let port = int_of_string (List.assoc "port" gui_arg) in let browser = Some (List.assoc "browser" gui_arg) in let log = Filename.concat bases_dir "comm.log" in let conf = { bases_dir = bases_dir; port = port; browser = browser; log = log; gui_arg = gui_arg; gwd_arg = []; only_arg = []; server_running = None; waiting_pids = [] } in launch_server conf else do { let assistant = GAssistant.assistant () in assistant#misc#set_size_request ~width:450 ~height:300 (); assistant#set_title (transl "Setup GeneWeb"); let page_0 = GMisc.label ~text:(transl "This assistant will help you to setup GeneWeb") () in let bases_dir = ref "" in let page_1 = GPack.hbox ~spacing:5 () in let _label = GMisc.label ~text:(transl "select bases directory") ~packing:(page_1#pack ~expand:False ~fill:False ~padding:5) () in let bbox = GPack.button_box `HORIZONTAL ~border_width: 5 ~layout: `SPREAD ~packing:(page_1#pack ~expand:False ~fill:False ~padding:5) () in let select = GButton.button ~stock:`OPEN ~packing:(bbox#pack ~expand:False ~fill:False ~padding:5) () in ignore (select#connect#clicked (fun () -> do { bases_dir.val := select_dir assistant bases_dir.val; let num = assistant#current_page in let page = assistant#nth_page num in assistant#set_page_complete page (bases_dir.val <> "") })); let port = ref 2317 in let page_2 = GPack.hbox ~homogeneous:False ~spacing:5 () in let _label = GMisc.label ~text:(transl "enter port") ~packing:(page_2#pack ~expand:False ~fill:False ~padding:5) () in let entry = GEdit.entry ~text:(string_of_int port.val) ~packing:(page_2#pack ~expand:False ~fill:False ~padding:5) () in ignore (entry#connect#changed (fun () -> do { let txt = entry#text in port.val := int_of_string txt; let num = assistant#current_page in let page = assistant#nth_page num in assistant#set_page_complete page (String.length txt > 0) })); let browser = ref "" in let page_3 = GPack.hbox ~homogeneous:False ~spacing:5 () in let _label = GMisc.label ~text:(transl "select browser") ~packing:(page_3#pack ~expand:False ~fill:False ~padding:5) () in let bbox = GPack.button_box `HORIZONTAL ~border_width: 5 ~layout: `SPREAD ~packing:(page_3#pack ~expand:False ~fill:False ~padding:5) () in let select = GButton.button ~stock:`OPEN ~packing:(bbox#pack ~expand:False ~fill:False ~padding:5) () in ignore (select#connect#clicked (fun () -> do { browser.val := select_file assistant browser.val; let num = assistant#current_page in let page = assistant#nth_page num in assistant#set_page_complete page (browser.val <> "") })); match config_browser () with [ Some b -> let btn = GButton.check_button ~label:b ~packing:(page_3#pack ~expand:False ~fill:False ~padding:5) () in ignore (btn#connect#toggled ~callback:(fun () -> do { browser.val := b; let num = assistant#current_page in let page = assistant#nth_page num in assistant#set_page_complete page btn#active })) | None -> () ]; let page_4 = GMisc.label ~text:(transl "save preferences") () in ignore (assistant#append_page ~title:(transl "Introduction") ~page_type:`INTRO ~complete:True page_0#as_widget); ignore (assistant#append_page ~title:(transl "Setup bases directory") ~page_type:`CONTENT page_1#as_widget); ignore (assistant#append_page ~title:(transl "Setup port") ~page_type:`CONTENT ~complete:True page_2#as_widget); ignore (assistant#append_page ~title:(transl "Setup browser") ~page_type:`CONTENT page_3#as_widget); ignore (assistant#append_page ~title:(transl "Finnish") ~page_type: `CONFIRM ~complete:True page_4#as_widget); let save_config () = do { let gui_arg = [("bd", bases_dir.val); ("port", string_of_int port.val); ("browser", browser.val)] in let conf = { bases_dir = bases_dir.val; port = port.val; browser = Some browser.val; log = Filename.concat bases_dir.val "comm.log"; gui_arg = gui_arg; gwd_arg = []; only_arg = []; server_running = None; waiting_pids = [] } in (* TODO : On en a besoin avant ... *) (* mkdir_p conf.bases_dir; *) write_config_file conf; assistant#destroy (); launch_server conf } in ignore (assistant#connect#cancel ~callback:GMain.quit); ignore (assistant#connect#close ~callback:save_config); assistant#show (); }; (**/**) (* main *) value speclist = [("-trace", Arg.Set trace, " Trace server")]; value anon_fun s = raise (Arg.Bad (sprintf "Don't know what to do with %s" s)); value usage_msg = "Usage: gui [option]"; value main () = do { Arg.parse (Arg.align speclist) anon_fun usage_msg; launch_config (); let () = GMain.main () in Sys.catch_break True; eprintf "Bye\n"; flush stderr; }; Printexc.print main (); geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/gui/gw/0002770000175200017530000000000012664543647021623 5ustar guillaumeguillaumegeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/gui/gw/gui_lex.txt0000660000175200017530000000615612664543647024027 0ustar guillaumeguillaume# $Id: gui_lex.txt,v 1.2 2007-01-19 01:53:16 ddr Exp $ # Copyright (c) 2006-2007 INRIA error en: error fr: erreur OK en: Ok fr: Ok open url in your favorite browser en: open this url in your favorite browser fr: ouvrez cette url dans votre navigateur préféré Confirm en: confirm fr: confirmez cancel en: cancel fr: annuler database already exists en: database already exists fr: la base existe déjà log en: log fr: log create en: create fr: créer create a database en: create a database fr: créer une base view log en: view log fr: voir le log doc en: doc fr: doc view doc en: view doc fr: voir doc setup en: setup fr: paramètre setup GeneWeb en: setup GeneWeb fr: paramétrer GeneWeb quit en: quit fr: quitter quit GeneWeb en: quit GeneWen fr: quitter GeneWeb no databases. en: no databases. fr: pas de base. available databases en: available databases fr: base disponibles browse en: browse fr: parcourir tools en: tools fr: outils name of the database: en: name of the database: fr: nom de la base select a file en: select a file fr: selectionnez un fichier Configuration gwf file of en: Configuration gwf file of fr: configuration du fichier gwf de toolbox en: toolbox fr: Boîte à outil pour la base Unknown file en: Unknown file fr: Fichier inconnu enter a name en: enter a name fr: entrez un nom Setup GeneWeb en: Setup GeneWeb fr: Configurer GeneWeb This assistant will help you to setup GeneWeb en: This assistant will help you to setup GeneWeb fr: Cet assistant va vous aider à configurer GeneWeb select bases directory en: Select bases directory fr: Selectionnez le répertoire des bases enter port en: Setup eventually the port number fr: Configurez éventuellement le numéro de port select browser en: Select the browser you want to use fr: Selectionnez le navigateur que vous voulez utiliser save preferences en: Save preference fr: Enregistrer la configuration Introduction en: Introduction fr: Introduction Setup bases directory en: Setup bases directory fr: Configuration du répertoire des bases Setup port en: Setup port fr: Configuration du port Setup browser en: Setup browser fr: Configuration du navigateur Finnish en: Finnish fr: Terminer Home en: Home fr: Accueil extract gw file en: Save the base in the GeneWeb format fr: Sauvegarder la base au format GeneWeb Extract GW en: Save GW fr: Sauvegarde GW extract ged file en: Save the base in the Gedcom format fr: Sauvegarder la base au format Gedcom Extract GED en: Save Gedcom fr: Sauvegarde Gedcom setup base options en: Setup base options fr: Configurer les options de la base setup gwf file en: Setup gwf file fr: Configuration du fichier gwf Clean database en: Deep clean (save, import, consang, upd_nldb) fr: Netoyage en profondeur (export, import, consang, upd_nldb) Clean en: Clean fr: Netoyage Rename en: Rename fr: Renommer Delete en: Delete fr: Supprimer Consang en: Consang fr: Consang Update_nldb en: Update_nldb fr: Update_nldb geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/gui/.depend0000660000175200017530000000007612664543647022450 0ustar guillaumeguillaumegui.cmo: $(GWB)/src/mutil.cmi gui.cmx: $(GWB)/src/mutil.cmx geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/gui/README0000660000175200017530000000052112664543647022063 0ustar guillaumeguillaumeOVERVIEW: GUI is a Graphical User Interface that allow you to run GeneWeb and setup your databases through only one window. This is a beta version. To compile, you need the Objective Caml compiler which can be found at: http://caml.inria.fr/ocaml/ and Camlp5 at: http://pauillac.inria.fr/~ddr/camlp5/ and liblablgtk2-ocaml-dev geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/dag2html/0002770000175200017530000000000012664543647022124 5ustar guillaumeguillaumegeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/dag2html/Makefile0000660000175200017530000000134712664543647023570 0ustar guillaumeguillaume# $Id: Makefile,v 5.1 2007-07-11 16:15:21 ddr Exp $ BINDIR=/usr/local/bin MANDIR=/usr/local/share/man/man1 OCAMLC=ocamlc OCAMLOPT=ocamlopt OCARGS= OBJS=dag2html.cmo main.cmo all: dag2html out: dag2html.cmo opt: dag2html.cmx install: cp dag2html $(BINDIR)/. cp dag2html.1 $(MANDIR)/. dag2html: $(OBJS) $(OCAMLC) $(OBJS) -o dag2html clean: rm -f dag2html *.cm[oix] *.o .SUFFIXES: .ml .mli .cmo .cmx .cmi .ml.cmo: camlp5r $< -o $*.ppo $(OCAMLC) $(OCARGS) -c -impl $*.ppo rm -f $*.ppo .ml.cmx: camlp5r $< -o $*.ppo $(OCAMLOPT) $(OCARGS) -c -impl $*.ppo rm -f $*.ppo .mli.cmi: camlp5r $< -o $*.ppi $(OCAMLC) $(OCARGS) -c -intf $*.ppi rm -f $*.ppi main.cmo: dag2html.cmo dag2html.cmo: dag2html.cmi dag2html.cmx: dag2html.cmi geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/dag2html/LICENSE0000660000175200017530000004312712664543647023137 0ustar guillaumeguillaume GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/dag2html/dag2html.10000660000175200017530000000362012664543647023710 0ustar guillaumeguillaume.\" This program is free software; you can redistribute it and/or modify .\" it under the terms of the GNU General Public License as published by .\" the Free Software Foundation; either version 2 of the License, or .\" (at your option) any later version. .\" .\" This program is distributed in the hope that it will be useful, .\" but WITHOUT ANY WARRANTY; without even the implied warranty of .\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the .\" GNU General Public License for more details. .\" .\" You should have received a copy of the GNU General Public License .\" along with this program; if not, write to the Free Software .\" Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA .\" .TH DAG2HTML 1 "February 8, 2004" "dag2html" "Generates HTML code from genealogic DAGs" .SH NAME dag2html \- generates HTML code from genealogic DAGs .SH SYNOPSIS .B dag2html [\fIOPTION\fR] \fIFILE\fR .SH DESCRIPTION .B Dag2html generates HTML code from genealogic DAGs Generates HTML code from a DAG. It is well adapted for genealogic DAGs (it is used in the software GeneWeb, same author) but may be used for any kind of DAG. .SH OPTIONS .TP .BR -b\ table border .TP .BR -c char output .TP .BR -i apply algorithm from bottom to top .TP .BR -n no optimization .TP .BR -g no group .TP .BR -v print version number and exit .TP .BR -help,\ --help display this list of options .TP .BR -h , \ --help should tell you about what the command line options do, but doesn't yet :) .SH AUTHOR Written by Daniel de Rauglaudre . This manual page was originally written by Cyril Bouthors . .SH COPYRIGHT Copyright (c) 1998-2006 INRIA .br This is Free Software; this software is licensed under the GPL version 2, as published by the Free Software Foundation. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/dag2html/ex/0002770000175200017530000000000012664543647022540 5ustar guillaumeguillaumegeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/dag2html/ex/denmark0000660000175200017530000000055412664543647024107 0ustar guillaumeguillaume# Descendants de Frederik IX of Denmark (1899-1972) o Frederik IX of Denmark o Ingrid of Sweden - Margrethe II - Benedikte - Anne-Marie o Margrethe II - Frederik - Joachim o Joachim - Nikolai o Benedikte - Gustav - Alexandra - Nathalie o Alexandra - Richard o Anne-Marie - Alexia - Paul - Nikolaos - Theodora - Philippos o Paul - Maria Olympia - Constantin geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/dag2html/ex/gaulle0000660000175200017530000000100612664543647023730 0ustar guillaumeguillaume# Ancestors of Charles de Gaulle, French president (1890-1970) o Henri de Gaulle o Jeanne Maillot - Charles de Gaulle o Jules Emile Maillot o Julia Delannoy - Jeanne Maillot o Henri Louis Delannoy o Marie Angélique Mac Cartan - Julia Delannoy o Henri Maillot o Louise Constance Kolb - Jules Emile Maillot o Julien Philippe de Gaulle o Joséphine Maillot - Henri de Gaulle o Charles Louis Maillot o Marie Hermel - Joséphine Maillot o Jean Baptiste de Gaulle o Anne Sophie Rose Gaussen - Julien Philippe de Gaulle geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/dag2html/ex/louis80000660000175200017530000000715112664543647023711 0ustar guillaumeguillaume# Relationship links between Louis VIII le Lion (1187-1226) and # Hugues Capet (941-996) kings of France o Philippe II Auguste Capet, roi de France 1165-1223 o Isabelle de Hainaut, reine de France 1170-1190 - Louis VIII le Lion Capet, roi de France 1187-1226 o Thibaud IV le Grand de Champagne, comte de Blois 1093-1152 - Adèle de Champagne, reine de France ca 1140-1206 o Adèle de Champagne, reine de France ca 1140-1206 - Philippe II Auguste Capet, roi de France 1165-1223 o Louis VI le Gros Capet, roi de France 1081-1137 - Louis VII le Jeune Capet, roi de France 1120-1180 o Louis VII le Jeune Capet, roi de France 1120-1180 - Philippe II Auguste Capet, roi de France 1165-1223 o Philippe Ier Capet, roi de France 1052-1108 - Louis VI le Gros Capet, roi de France 1081-1137 o Henri Ier Capet, roi de France 1008-1060 - Philippe Ier Capet, roi de France 1052-1108 o Robert II le Pieux Capet, roi de France 972-1031 - Henri Ier Capet, roi de France 1008-1060 - Adélaïde Capet, comtesse de Corbie 1009-1079 o Adélaïde Capet, comtesse de Corbie 1009-1079 - Baudouin VI de Mons, comte de Flandre ca 1030-1070 - Robert Ier le Frison, comte de Flandre ca 1031-1093 - Mathilde de Flandre, reine d'Angleterre ca 1032-1083 o Hedwige Capet ca 975-1013/ - Rainier V, comte de Hainaut ca 997-1039/ o Rainier V, comte de Hainaut ca 997-1039/ - Richilde, comtesse de Hainaut ca 1027-1086 o Hugues Capet, roi de France ca 941-996 - Robert II le Pieux Capet, roi de France 972-1031 - Hedwige Capet ca 975-1013/ o Richilde, comtesse de Hainaut ca 1027-1086 - Baudouin II, comte de Hainaut 1056-1098 o Robert Ier le Frison, comte de Flandre ca 1031-1093 - Gertrude de Flandre ca 1070-1117 o Gertrude de Flandre ca 1070-1117 - Thierry III de Lorraine, comte de Flandre ca 1100-1168 o Marguerite Ière de Lorraine, comtesse de Flandre 1144-1194 o Baudouin V le Courageux, comte de Hainaut 1150-1195 - Isabelle de Hainaut, reine de France 1170-1190 o Baudouin IV le Bâtisseur, comte de Hainaut ca 1109-1171 - Baudouin V le Courageux, comte de Hainaut 1150-1195 o Baudouin III, comte de Hainaut ca 1087-1120 - Baudouin IV le Bâtisseur, comte de Hainaut ca 1109-1171 o Baudouin II, comte de Hainaut 1056-1098 - Baudouin III, comte de Hainaut ca 1087-1120 o Baudouin VI de Mons, comte de Flandre ca 1030-1070 - Baudouin II, comte de Hainaut 1056-1098 o Mathilde de Flandre, reine d'Angleterre ca 1032-1083 - Adèle de Normandie ca 1062-1137 o Thierry III de Lorraine, comte de Flandre ca 1100-1168 - Marguerite Ière de Lorraine, comtesse de Flandre 1144-1194 o Adèle de Normandie ca 1062-1137 - Thibaud IV le Grand de Champagne, comte de Blois 1093-1152 geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/dag2html/main.ml0000660000175200017530000001621312664543647023404 0ustar guillaumeguillaume(* $Id: main.ml,v 5.1 2006-10-15 15:39:38 ddr Exp $ *) open Dag2html; open Printf; value version = "1.02-exp"; (* input dag *) value strip_spaces str = let start = loop 0 where rec loop i = if i = String.length str then i else match str.[i] with [ ' ' | '\r' | '\n' | '\t' -> loop (i + 1) | _ -> i ] in let stop = loop (String.length str - 1) where rec loop i = if i = -1 then i + 1 else match str.[i] with [ ' ' | '\r' | '\n' | '\t' -> loop (i - 1) | _ -> i + 1 ] in if start = 0 && stop = String.length str then str else if start > stop then "" else String.sub str start (stop - start) ; value rec get_line ic = try let line = input_line ic in if String.length line > 0 && line.[0] = '#' then get_line ic else Some (strip_spaces line) with [ End_of_file -> None ] ; value input_dag ic = let rec find cnt s = fun [ [n :: nl] -> if n.valu = s then (n, idag_of_int cnt) else find (cnt - 1) s nl | [] -> raise Not_found ] in let add_node pl cl nl cnt = let cl = List.rev cl in let pl = List.rev pl in let (pl, pnl, nl, cnt) = List.fold_left (fun (pl, pnl, nl, cnt) p -> try let (n, p) = find (cnt - 1) p nl in ([p :: pl], [n :: pnl], nl, cnt) with [ Not_found -> let n = {pare = []; valu = p; chil = []} in let p = idag_of_int cnt in ([p :: pl], [n :: pnl], [n :: nl], cnt + 1) ]) ([], [], nl, cnt) pl in let pl = List.rev pl in let (cl, nl, cnt) = List.fold_left (fun (cl, nl, cnt) c -> try let (n, c) = find (cnt - 1) c nl in do { n.pare := n.pare @ pl; ([c :: cl], nl, cnt) } with [ Not_found -> let n = {pare = pl; valu = c; chil = []} in let c = idag_of_int cnt in ([c :: cl], [n :: nl], cnt + 1) ]) ([], nl, cnt) cl in let cl = List.rev cl in do { List.iter (fun p -> p.chil := p.chil @ cl) pnl; (nl, cnt) } in let rec input_parents nl pl cnt = fun [ Some "" -> input_parents nl pl cnt (get_line ic) | Some line -> match line.[0] with [ 'o' -> let p = strip_spaces (String.sub line 1 (String.length line - 1)) in if p = "" then failwith line else input_parents nl [p :: pl] cnt (get_line ic) | '-' -> if pl = [] then failwith line else input_children nl pl [] cnt (Some line) | _ -> failwith line ] | None -> if pl = [] then (nl, cnt) else failwith "end of file 1" ] and input_children nl pl cl cnt = fun [ Some "" -> input_children nl pl cl cnt (get_line ic) | Some line -> match line.[0] with [ 'o' -> if cl = [] then failwith line else let (nl, cnt) = add_node pl cl nl cnt in input_parents nl [] cnt (Some line) | '-' -> let c = strip_spaces (String.sub line 1 (String.length line - 1)) in if c = "" then failwith line else input_children nl pl [c :: cl] cnt (get_line ic) | _ -> failwith line ] | None -> if cl = [] then failwith "end of file 2" else add_node pl cl nl cnt ] in let (nl, _) = input_parents [] [] 0 (get_line ic) in {dag = Array.of_list (List.rev nl)} ; (* testing *) value map_dag f d = let a = Array.map (fun d -> {pare = d.pare; valu = f d.valu; chil = d.chil}) d.dag in {dag = a} ; value tag_dag d = let c = ref 'A' in map_dag (fun v -> let v = c.val in do { c.val := if c.val = 'Z' then 'a' else if c.val = 'z' then '1' else Char.chr (Char.code c.val + 1); String.make 1 v }) d ; (* *) value phony _ = False; value indi_txt n = n.valu; value vbar_txt n = ""; value print_char_table d t = let print_elem = fun [ Elem e -> Printf.eprintf " %s" d.dag.(int_of_idag e).valu | Ghost x -> Printf.eprintf " |" | Nothing -> Printf.eprintf " " ] in let print_span i j r = if j > 0 && t.table.(i).(j - 1).span = r then Printf.eprintf "---" else Printf.eprintf " -" in let print_newline = prerr_newline in for i = 0 to Array.length t.table - 1 do { for j = 0 to Array.length t.table.(i) - 1 do { print_elem t.table.(i).(j).elem }; print_newline (); for j = 0 to Array.length t.table.(i) - 1 do { print_span i j t.table.(i).(j).span }; print_newline () } ; value print_table border hts = do { printf "
    \n"; for i = 0 to Array.length hts - 1 do { printf "\n"; for j = 0 to Array.length hts.(i) - 1 do { let (colspan, align, td) = hts.(i).(j) in printf " 1 then printf " colspan=%d" colspan else (); *) if colspan = 1 && (td = TDitem " " || td = TDhr CenterA) then () else printf " colspan=%d" colspan; (**) match (align, td) with [ (LeftA, TDhr LeftA) -> printf " align=left" | (LeftA, _) -> () | (CenterA, _) -> printf " align=center" | (RightA, _) -> printf " align=right" ]; printf ">"; match td with [ TDitem s -> printf "%s" s | TDtext s -> printf "%s" s | TDbar _ -> printf "|" | TDhr align -> do { printf "
    printf " width=\"50%%\" align=left" | RightA -> printf " width=\"50%%\" align=right" | _ -> () ]; printf ">" } | TDnothing -> printf " " ]; printf "\n" } }; printf "
    \n" } ; value fname = ref ""; value invert = ref False; value char = ref False; value border = ref 0; value no_optim = ref False; value no_group = ref False; value print_version () = do { eprintf "Dag2html version %s\n" version; flush stderr; exit 0 } ; value speclist = [("-b", Arg.Int (fun x -> border.val := x), ": table border"); ("-c", Arg.Set char, ": char output"); ("-i", Arg.Set invert, ": apply algorithm from bottom to top"); ("-n", Arg.Set no_optim, ": no optimization"); ("-g", Arg.Set no_group, ": no group"); ("-v", Arg.Unit print_version, ": print version number and exit")] ; value anonfun s = fname.val := s; value usage = "Usage: " ^ Sys.argv.(0) ^ " [options] file\nwhere options are:" ; value main () = do { Arg.parse speclist anonfun usage; if fname.val = "" then do { Arg.usage speclist usage; exit 2 } else (); let d = input_dag (open_in fname.val) in if char.val then let d = tag_dag d in let t = table_of_dag phony no_optim.val invert.val no_group.val d in print_char_table d t else let t = table_of_dag phony no_optim.val invert.val no_group.val d in let hts = html_table_struct indi_txt vbar_txt phony d t in print_table border.val hts } ; Printexc.catch main (); geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/dag2html/dag2html.ml0000660000175200017530000012345612664543647024172 0ustar guillaumeguillaume(* $Id: dag2html.ml,v 5.0 2005-12-13 11:51:26 ddr Exp $ *) type dag 'a = { dag : mutable array (node 'a) } and node 'a = { pare : mutable list idag; valu : 'a; chil : mutable list idag } and idag = 'x ; external int_of_idag : idag -> int = "%identity"; external idag_of_int : int -> idag = "%identity"; type table 'a = { table : mutable array (array (data 'a)) } and data 'a = { elem : mutable elem 'a; span : mutable span_id } and elem 'a = [ Elem of 'a | Ghost of ghost_id | Nothing ] and span_id = 'x and ghost_id = 'x ; external span_id_of_int : int -> span_id = "%identity"; external int_of_span_id : span_id -> int = "%identity"; external ghost_id_of_int : int -> ghost_id = "%identity"; external int_of_ghost_id : ghost_id -> int = "%identity"; value new_span_id = let i = ref 0 in fun () -> do { incr i; span_id_of_int i.val } ; value new_ghost_id = let i = ref 0 in fun () -> do { incr i; ghost_id_of_int i.val } ; (* creating the html table structure *) type align = [ LeftA | CenterA | RightA ]; type table_data 'a 'b = [ TDitem of 'a | TDtext of string | TDhr of align | TDbar of option 'b | TDnothing ] ; type html_table_line 'a 'b = array (int * align * table_data 'a 'b); type html_table 'a 'b = array (html_table_line 'a 'b); value html_table_struct indi_txt vbar_txt phony d t = let phony = fun [ Elem e -> phony d.dag.(int_of_idag e) | Ghost _ -> False | Nothing -> True ] in let elem_txt = fun [ Elem e -> TDitem (indi_txt d.dag.(int_of_idag e)) | Ghost _ -> TDbar None | Nothing -> TDnothing ] in let bar_txt first_vbar = fun [ Elem e -> let b = if first_vbar then Some (vbar_txt d.dag.(int_of_idag e)) else None in TDbar b | Ghost _ -> TDbar None | Nothing -> TDnothing ] in let all_empty i = loop 0 where rec loop j = if j = Array.length t.table.(i) then True else match t.table.(i).(j).elem with [ Nothing -> loop (j + 1) | Elem _ | Ghost _ as e -> if phony e then loop (j + 1) else False ] in let line_elem_txt i = let les = loop [] 0 where rec loop les j = if j = Array.length t.table.(i) then les else let x = t.table.(i).(j) in let next_j = loop (j + 1) where rec loop j = if j = Array.length t.table.(i) then j else if t.table.(i).(j) = x then loop (j + 1) else j in let colspan = 3 * (next_j - j) in let les = [(1, LeftA, TDnothing) :: les] in let les = let td = if t.table.(i).(j).elem = Nothing then TDnothing else elem_txt t.table.(i).(j).elem in [(colspan - 2, CenterA, td) :: les] in let les = [(1, LeftA, TDnothing) :: les] in loop les next_j in Array.of_list (List.rev les) in let vbars_txt k i = let les = loop [] 0 where rec loop les j = if j = Array.length t.table.(i) then les else let x = t.table.(i).(j) in let next_j = loop (j + 1) where rec loop j = if j = Array.length t.table.(i) then j else if t.table.(i).(j) = x then loop (j + 1) else j in let colspan = 3 * (next_j - j) in let les = [(1, LeftA, TDnothing) :: les] in let les = let td = if k > 0 && t.table.(k - 1).(j).elem = Nothing || t.table.(k).(j).elem = Nothing then TDnothing else if phony t.table.(i).(j).elem then TDnothing else bar_txt (k <> i) t.table.(i).(j).elem in [(colspan - 2, CenterA, td) :: les] in let les = [(1, LeftA, TDnothing) :: les] in loop les next_j in Array.of_list (List.rev les) in let alone_bar_txt i = let les = loop [] 0 where rec loop les j = if j = Array.length t.table.(i) then les else let next_j = let x = t.table.(i).(j).span in let rec loop j = if j = Array.length t.table.(i) then j else if t.table.(i).(j).span = x then loop (j + 1) else j in loop (j + 1) in let colspan = 3 * (next_j - j) - 2 in let les = [(1, LeftA, TDnothing) :: les] in let les = if t.table.(i).(j).elem = Nothing || t.table.(i + 1).(j).elem = Nothing then [(colspan, LeftA, TDnothing) :: les] else let td = let all_ph = loop j where rec loop j = if j = next_j then True else if phony t.table.(i + 1).(j).elem then loop (j + 1) else False in if all_ph then TDnothing else TDbar None in [(colspan, CenterA, td) :: les] in let les = [(1, LeftA, TDnothing) :: les] in loop les next_j in Array.of_list (List.rev les) in let exist_several_branches i k = loop 0 where rec loop j = if j = Array.length t.table.(i) then False else let x = t.table.(i).(j).span in let e = t.table.(k).(j).elem in let rec loop1 j = if j = Array.length t.table.(i) then False else if t.table.(i).(j).elem = Nothing then loop j else if t.table.(i).(j).span <> x then loop j else if t.table.(k).(j).elem <> e then True else loop1 (j + 1) in loop1 (j + 1) in let hbars_txt i k = let les = loop [] 0 where rec loop les j = if j = Array.length t.table.(i) then les else let next_j = let e = t.table.(i).(j).elem in let x = t.table.(i).(j).span in let rec loop j = if j = Array.length t.table.(i) then j else if e = Nothing && t.table.(i).(j).elem = Nothing then loop (j + 1) else if t.table.(i).(j).span = x then loop (j + 1) else j in loop (j + 1) in let rec loop1 les l = if l = next_j then loop les next_j else do { let next_l = let y = t.table.(k).(l) in match y.elem with [ Elem _ | Ghost _ -> let rec loop l = if l = Array.length t.table.(i) then l else if t.table.(k).(l) = y then loop (l + 1) else l in loop (l + 1) | Nothing -> l + 1 ] in if next_l > next_j then do { Printf.eprintf "assert false i %d k %d l %d next_l %d next_j %d\n" i k l next_l next_j; flush stderr } else (); let next_l = min next_l next_j in let colspan = 3 * (next_l - l) - 2 in let les = match (t.table.(i).(l).elem, t.table.(i + 1).(l).elem) with [ (Nothing, _) | (_, Nothing) -> [(colspan + 2, LeftA, TDnothing) :: les] | _ -> let ph s = if phony t.table.(k).(l).elem then TDnothing else s in if l = j && next_l = next_j then let les = [(1, LeftA, TDnothing) :: les] in let s = ph (TDbar None) in let les = [(colspan, CenterA, s) :: les] in let les = [(1, LeftA, TDnothing) :: les] in les else if l = j then let les = [(1, LeftA, TDnothing) :: les] in let s = ph (TDhr RightA) in let les = [(colspan, RightA, s) :: les] in let s = ph (TDhr CenterA) in let les = [(1, LeftA, s) :: les] in les else if next_l = next_j then let s = ph (TDhr CenterA) in let les = [(1, LeftA, s) :: les] in let s = ph (TDhr LeftA) in let les = [(colspan, LeftA, s) :: les] in let les = [(1, LeftA, TDnothing) :: les] in les else let s = ph (TDhr CenterA) in [(colspan + 2, LeftA, s) :: les] ] in loop1 les next_l } in loop1 les j in Array.of_list (List.rev les) in let hts = loop [] 0 where rec loop hts i = if i = Array.length t.table then hts else if i = Array.length t.table - 1 && all_empty i then hts else let hts = [line_elem_txt i :: hts] in let hts = if i < Array.length t.table - 1 then let hts = [vbars_txt (i + 1) i :: hts] in let hts = if exist_several_branches i i then [alone_bar_txt i; hbars_txt i i :: hts] else hts in let hts = if exist_several_branches i (i + 1) && (i < Array.length t.table - 2 || not (all_empty (i + 1))) then [vbars_txt (i + 1) (i + 1); hbars_txt i (i + 1) :: hts] else hts in hts else hts in loop hts (i + 1) in Array.of_list (List.rev hts) ; (* transforming dag into table *) value ancestors d = loop 0 where rec loop i = if i = Array.length d.dag then [] else let n = d.dag.(i) in if n.pare = [] then [idag_of_int i :: loop (i + 1)] else loop (i + 1) ; value get_children d parents = merge_children [] parents where rec merge_children children el = List.fold_right (fun (x, _) children -> match x with [ Elem e -> let e = d.dag.(int_of_idag e) in List.fold_right (fun c children -> if List.mem c children then children else [c :: children]) e.chil children | Ghost _ | Nothing -> [] ]) el children ; value rec get_block t i j = if j = Array.length t.table.(i) then None else if j = Array.length t.table.(i) - 1 then let x = t.table.(i).(j) in Some ([(x.elem, 1)], 1, x.span) else let x = t.table.(i).(j) in let y = t.table.(i).(j + 1) in if y.span = x.span then match get_block t i (j + 1) with [ Some ([(x1, c1) :: list], mpc, span) -> let (list, mpc) = if x1 = x.elem then ([(x1, c1 + 1) :: list], max mpc (c1 + 1)) else ([(x.elem, 1); (x1, c1) :: list], max mpc c1) in Some (list, mpc, span) | _ -> assert False ] else Some ([(x.elem, 1)], 1, x.span) ; value group_by_common_children d list = let module O = struct type t = idag; value compare = compare; end in let module S = Set.Make O in let nlcsl = List.map (fun id -> let n = d.dag.(int_of_idag id) in let cs = List.fold_right S.add n.chil S.empty in ([id], cs)) list in let nlcsl = loop nlcsl where rec loop = fun [ [] -> [] | [(nl, cs) :: rest] -> let rec loop1 beg = fun [ [(nl1, cs1) :: rest1] -> if S.is_empty (S.inter cs cs1) then loop1 [(nl1, cs1) :: beg] rest1 else loop [(nl @ nl1, S.union cs cs1) :: List.rev_append beg rest1] | [] -> [(nl, cs) :: loop rest] ] in loop1 [] rest ] in List.fold_right (fun (nl, _) a -> let span = new_span_id () in List.fold_right (fun n a -> [{elem = Elem n; span = span} :: a]) nl a) nlcsl [] ; value copy_data d = {elem = d.elem; span = d.span}; value insert_columns t nb j = let t1 = Array.make (Array.length t.table) [| |] in do { for i = 0 to Array.length t.table - 1 do { let line = t.table.(i) in let line1 = Array.make (Array.length line + nb) line.(0) in t1.(i) := line1; let rec loop k = if k = Array.length line then () else do { if k < j then line1.(k) := copy_data line.(k) else if k = j then for r = 0 to nb do { line1.(k + r) := copy_data line.(k) } else line1.(k + nb) := copy_data line.(k); loop (k + 1) } in loop 0 }; {table = t1} } ; value rec gcd a b = if a < b then gcd b a else if b = 0 then a else gcd b (a mod b) ; value treat_new_row d t = let i = Array.length t.table - 1 in let rec loop t i j = match get_block t i j with [ Some (parents, max_parent_colspan, span) -> let children = get_children d parents in let children = if children = [] then [{elem = Nothing; span = new_span_id ()}] else List.map (fun n -> {elem = Elem n; span = new_span_id ()}) children in let simple_parents_colspan = List.fold_left (fun x (_, c) -> x + c) 0 parents in if simple_parents_colspan mod List.length children = 0 then let j = j + simple_parents_colspan in let children = let cnt = simple_parents_colspan / List.length children in List.fold_right (fun d list -> let rec loop cnt list = if cnt = 1 then [d :: list] else [copy_data d :: loop (cnt - 1) list] in loop cnt list) children [] in let (t, children_rest) = loop t i j in (t, children @ children_rest) else let parent_colspan = List.fold_left (fun scm (_, c) -> let g = gcd scm c in scm / g * c) max_parent_colspan parents in let (t, parents, _) = List.fold_left (fun (t, parents, j) (x, c) -> let to_add = parent_colspan / c - 1 in let t = loop c t j where rec loop cc t j = if cc = 0 then t else let t = insert_columns t to_add j in loop (cc - 1) t (j + to_add + 1) in (t, [(x, parent_colspan) :: parents], j + parent_colspan)) (t, [], j) parents in let parents = List.rev parents in let parents_colspan = parent_colspan * List.length parents in let children_colspan = List.length children in let g = gcd parents_colspan children_colspan in let (t, j) = let cnt = children_colspan / g in List.fold_left (fun (t, j) (_, c) -> let rec loop cc t j = if cc = 0 then (t, j) else let t = insert_columns t (cnt - 1) j in let j = j + cnt in loop (cc - 1) t j in loop c t j) (t, j) parents in let children = let cnt = parents_colspan / g in List.fold_right (fun d list -> let rec loop cnt list = if cnt = 0 then list else [d :: loop (cnt - 1) list] in loop cnt list) children [] in let (t, children_rest) = loop t i j in (t, children @ children_rest) | None -> (t, []) ] in loop t i 0 ; value down_it t i k y = do { t.table.(Array.length t.table - 1).(k) := t.table.(i).(k); for r = i to Array.length t.table - 2 do { t.table.(r).(k) := {elem = Ghost (new_ghost_id ()); span = new_span_id ()} } } ; (* equilibrate: in the last line, for all elem A, make fall all As, which are located at its right side above, to its line, A | i.e. transform all . into | A....... A......A *) value equilibrate t = let ilast = Array.length t.table - 1 in let last = t.table.(ilast) in let len = Array.length last in let rec loop j = if j = len then () else match last.(j).elem with [ Elem x -> let rec loop1 i = if i = ilast then loop (j + 1) else let rec loop2 k = if k = len then loop1 (i + 1) else match t.table.(i).(k).elem with [ Elem y when x = y -> do { down_it t i k y; loop 0 } | _ -> loop2 (k + 1) ] in loop2 0 in loop1 0 | Ghost _ | Nothing -> loop (j + 1) ] in loop 0 ; (* group_elem: transform all x y into x x A A A A *) value group_elem t = for i = 0 to Array.length t.table - 2 do { for j = 1 to Array.length t.table.(0) - 1 do { (* let x = match t.table.(i + 1).(j - 1).elem with [ Elem x -> Some x | _ -> None ] in let y = match t.table.(i + 1).(j).elem with [ Elem x -> Some x | _ -> None ] in *) match (t.table.(i + 1).(j - 1).elem, t.table.(i + 1).(j).elem) with [ (Elem x, Elem y) when x = y -> t.table.(i).(j).span := t.table.(i).(j - 1).span | _ -> () ] } } ; (* group_ghost: x x x x |a |a |a |a transform all |a |b into |a |a and all x y into x x y z y y A A A A *) value group_ghost t = for i = 0 to Array.length t.table - 2 do { for j = 1 to Array.length t.table.(0) - 1 do { match (t.table.(i + 1).(j - 1).elem, t.table.(i + 1).(j).elem) with [ (Ghost x, Ghost _) -> if t.table.(i).(j - 1).span = t.table.(i).(j).span then t.table.(i + 1).(j) := {elem = Ghost x; span = t.table.(i + 1).(j - 1).span} else () | _ -> () ]; match (t.table.(i).(j - 1).elem, t.table.(i).(j).elem) with [ (Ghost x, Ghost _) -> if t.table.(i + 1).(j - 1).elem = t.table.(i + 1).(j).elem then do { t.table.(i).(j) := {elem = Ghost x; span = t.table.(i).(j - 1).span}; if i > 0 then t.table.(i - 1).(j).span := t.table.(i - 1).(j - 1).span else () } else () | _ -> () ] } } ; (* group_children: transform all A A into A A x y x x *) value group_children t = for i = 0 to Array.length t.table - 1 do { let line = t.table.(i) in let len = Array.length line in for j = 1 to len - 1 do { if line.(j).elem = line.(j - 1).elem && line.(j).elem <> Nothing then line.(j).span := line.(j - 1).span else () } } ; (* group_span_by_common_children: in the last line, transform all A B into A B x y x x if A and B have common children *) value group_span_by_common_children d t = let module O = struct type t = idag; value compare = compare; end in let module S = Set.Make O in let i = Array.length t.table - 1 in let line = t.table.(i) in let rec loop j cs = if j = Array.length line then () else match line.(j).elem with [ Elem id -> let n = d.dag.(int_of_idag id) in let curr_cs = List.fold_right S.add n.chil S.empty in if S.is_empty (S.inter cs curr_cs) then loop (j + 1) curr_cs else do { line.(j).span := line.(j - 1).span; loop (j + 1) (S.union cs curr_cs) } | Ghost _ | Nothing -> loop (j + 1) S.empty ] in loop 0 S.empty ; value find_same_parents t i j1 j2 j3 j4 = loop i j1 j2 j3 j4 where rec loop i j1 j2 j3 j4 = if i = 0 then (i, j1, j2, j3, j4) else let x1 = t.(i - 1).(j1) in let x2 = t.(i - 1).(j2) in let x3 = t.(i - 1).(j3) in let x4 = t.(i - 1).(j4) in if x1.span = x4.span then (i, j1, j2, j3, j4) else let j1 = loop (j1 - 1) where rec loop j = if j < 0 then 0 else if t.(i - 1).(j).span = x1.span then loop (j - 1) else j + 1 in let j2 = loop (j2 + 1) where rec loop j = if j >= Array.length t.(i) then j - 1 else if t.(i - 1).(j).span = x2.span then loop (j + 1) else j - 1 in let j3 = loop (j3 - 1) where rec loop j = if j < 0 then 0 else if t.(i - 1).(j).span = x3.span then loop (j - 1) else j + 1 in let j4 = loop (j4 + 1) where rec loop j = if j >= Array.length t.(i) then j - 1 else if t.(i - 1).(j).span = x4.span then loop (j + 1) else j - 1 in loop (i - 1) j1 j2 j3 j4 ; value find_linked_children t i j1 j2 j3 j4 = loop i j1 j2 j3 j4 where rec loop i j1 j2 j3 j4 = if i = Array.length t - 1 then (j1, j2, j3, j4) else let x1 = t.(i).(j1) in let x2 = t.(i).(j2) in let x3 = t.(i).(j3) in let x4 = t.(i).(j4) in let j1 = loop (j1 - 1) where rec loop j = if j < 0 then 0 else if t.(i).(j).span = x1.span then loop (j - 1) else j + 1 in let j2 = loop (j2 + 1) where rec loop j = if j >= Array.length t.(i) then j - 1 else if t.(i).(j).span = x2.span then loop (j + 1) else j - 1 in let j3 = loop (j3 - 1) where rec loop j = if j < 0 then 0 else if t.(i).(j).span = x3.span then loop (j - 1) else j + 1 in let j4 = loop (j4 + 1) where rec loop j = if j >= Array.length t.(i) then j - 1 else if t.(i).(j).span = x4.span then loop (j + 1) else j - 1 in loop (i + 1) j1 j2 j3 j4 ; value mirror_block t i1 i2 j1 j2 = for i = i1 to i2 do { let line = t.(i) in let rec loop j1 j2 = if j1 >= j2 then () else do { let v = line.(j1) in line.(j1) := line.(j2); line.(j2) := v; loop (j1 + 1) (j2 - 1) } in loop j1 j2 } ; value exch_blocks t i1 i2 j1 j2 j3 j4 = for i = i1 to i2 do { let line = t.(i) in let saved = Array.copy line in for j = j1 to j2 do { line.(j4 - j2 + j) := saved.(j) }; for j = j3 to j4 do { line.(j1 - j3 + j) := saved.(j) } } ; value find_block_with_parents t i jj1 jj2 jj3 jj4 = loop i jj1 jj2 jj3 jj4 where rec loop ii jj1 jj2 jj3 jj4 = let (nii, njj1, njj2, njj3, njj4) = find_same_parents t i jj1 jj2 jj3 jj4 in if nii <> ii || njj1 <> jj1 || njj2 <> jj2 || njj3 <> jj3 || njj4 <> jj4 then let nii = min ii nii in let (jj1, jj2, jj3, jj4) = find_linked_children t nii njj1 njj2 njj3 njj4 in if njj1 <> jj1 || njj2 <> jj2 || njj3 <> jj3 || njj4 <> jj4 then loop nii jj1 jj2 jj3 jj4 else (nii, jj1, jj2, jj3, jj4) else (ii, jj1, jj2, jj3, jj4) ; value push_to_right d t i j1 j2 = let line = t.(i) in let rec loop j = if j = j2 then j - 1 else let ini_jj1 = match line.(j - 1).elem with [ Nothing -> j - 1 | x -> let rec same_value j = if j < 0 then 0 else if line.(j).elem = x then same_value (j - 1) else j + 1 in same_value (j - 2) ] in let jj1 = ini_jj1 in let jj2 = j - 1 in let jj3 = j in let jj4 = match line.(j).elem with [ Nothing -> j | x -> let rec same_value j = if j >= Array.length line then j - 1 else if line.(j).elem = x then same_value (j + 1) else j - 1 in same_value (j + 1) ] in let (ii, jj1, jj2, jj3, jj4) = find_block_with_parents t i jj1 jj2 jj3 jj4 in if jj4 < j2 && jj2 < jj3 then do { exch_blocks t ii i jj1 jj2 jj3 jj4; loop (jj4 + 1) } else if jj4 < j2 && jj1 = ini_jj1 && jj2 <= jj4 then do { mirror_block t ii i jj1 jj4; loop (jj4 + 1) } else j - 1 in loop (j1 + 1) ; value push_to_left d t i j1 j2 = let line = t.(i) in let rec loop j = if j = j1 then j + 1 else let jj1 = match line.(j).elem with [ Nothing -> j | x -> let rec same_value j = if j < 0 then 0 else if line.(j).elem = x then same_value (j - 1) else j + 1 in same_value (j - 1) ] in let jj2 = j in let jj3 = j + 1 in let ini_jj4 = match line.(j + 1).elem with [ Nothing -> j + 1 | x -> let rec same_value j = if j >= Array.length line then j - 1 else if line.(j).elem = x then same_value (j + 1) else j - 1 in same_value (j + 2) ] in let jj4 = ini_jj4 in let (ii, jj1, jj2, jj3, jj4) = find_block_with_parents t i jj1 jj2 jj3 jj4 in if jj1 > j1 && jj2 < jj3 then do { exch_blocks t ii i jj1 jj2 jj3 jj4; loop (jj1 - 1) } else if jj1 > j1 && jj4 = ini_jj4 && jj3 >= jj1 then do { mirror_block t ii i jj1 jj4; loop (jj1 - 1) } else j + 1 in loop (j2 - 1) ; value fill_gap d t i j1 j2 = let t1 = let t1 = Array.copy t.table in do { for i = 0 to Array.length t.table - 1 do { t1.(i) := Array.copy t.table.(i); for j = 0 to Array.length t1.(i) - 1 do { t1.(i).(j) := copy_data t.table.(i).(j) } }; t1 } in let j2 = push_to_left d t1 i j1 j2 in let j1 = push_to_right d t1 i j1 j2 in if j1 = j2 - 1 then do { let line = t1.(i - 1) in let x = line.(j1).span in let y = line.(j2).span in let rec loop y j = if j >= Array.length line then () else if line.(j).span = y || t1.(i).(j).elem = t1.(i).(j - 1).elem then do { let y = line.(j).span in line.(j).span := x; if i > 0 then t1.(i - 1).(j).span := t1.(i - 1).(j - 1).span else (); loop y (j + 1) } else loop line.(j).span (j + 1) in loop y j2; Some ({table = t1}, True) } else None ; value treat_gaps d t = let i = Array.length t.table - 1 in let rec loop t j = let line = t.table.(i) in if j = Array.length line then t else match line.(j).elem with [ Elem _ as y -> if y = line.(j - 1).elem then loop t (j + 1) else let rec loop1 t j1 = if j1 < 0 then loop t (j + 1) else if y = line.(j1).elem then match fill_gap d t i j1 j with [ Some (t, ok) -> if ok then loop t 2 else loop t (j + 1) | None -> loop t (j + 1) ] else loop1 t (j1 - 1) in loop1 t (j - 2) | _ -> loop t (j + 1) ] in if Array.length t.table.(i) = 1 then t else loop t 2 ; value group_span_last_row t = let row = t.table.(Array.length t.table - 1) in let rec loop i = if i >= Array.length row then () else do { match row.(i).elem with [ Elem _ | Ghost _ as x -> if x = row.(i - 1).elem then row.(i).span := row.(i - 1).span else () | _ -> () ]; loop (i + 1) } in loop 1 ; value has_phony_children phony d t = let line = t.table.(Array.length t.table - 1) in let rec loop j = if j = Array.length line then False else match line.(j).elem with [ Elem x -> if phony d.dag.(int_of_idag x) then True else loop (j + 1) | _ -> loop (j + 1) ] in loop 0 ; value tablify phony no_optim no_group d = let a = ancestors d in let r = group_by_common_children d a in let t = {table = [| Array.of_list r |]} in let rec loop t = let (t, new_row) = treat_new_row d t in if List.for_all (fun x -> x.elem = Nothing) new_row then t else let t = {table = Array.append t.table [| Array.of_list new_row |]} in let t = if no_group && not (has_phony_children phony d t) then t else let _ = if no_optim then () else equilibrate t in let _ = group_elem t in let _ = group_ghost t in let _ = group_children t in let _ = group_span_by_common_children d t in let t = if no_optim then t else treat_gaps d t in let _ = group_span_last_row t in t in loop t in loop t ; value fall d t = for i = 1 to Array.length t.table - 1 do { let line = t.table.(i) in let rec loop j = if j = Array.length line then () else match line.(j).elem with [ Ghost x -> let j2 = loop (j + 1) where rec loop j = if j = Array.length line then j - 1 else match line.(j).elem with [ Ghost y when y = x -> loop (j + 1) | _ -> j - 1 ] in let i1 = loop (i - 1) where rec loop i = if i < 0 then i + 1 else let line = t.table.(i) in if (j = 0 || line.(j - 1).span <> line.(j).span) && (j2 = Array.length line - 1 || line.(j2 + 1).span <> line.(j2).span) then loop (i - 1) else i + 1 in let i1 = if i1 = i then i1 else if i1 = 0 then i1 else if t.table.(i1).(j).elem = Nothing then i1 else i in do { if i1 < i then do { for k = i downto i1 + 1 do { for j = j to j2 do { t.table.(k).(j).elem := t.table.(k - 1).(j).elem; if k < i then t.table.(k).(j).span := t.table.(k - 1).(j).span else () } }; for l = j to j2 do { if i1 = 0 || t.table.(i1 - 1).(l).elem = Nothing then t.table.(i1).(l).elem := Nothing else t.table.(i1).(l) := if l = j || t.table.(i1 - 1).(l - 1).span <> t.table.(i1 - 1).(l).span then {elem = Ghost (new_ghost_id ()); span = new_span_id ()} else copy_data t.table.(i1).(l - 1) } } else (); loop (j2 + 1) } | _ -> loop (j + 1) ] in loop 0 } ; value fall2_cool_right t i1 i2 i3 j1 j2 = let span = t.table.(i2 - 1).(j1).span in do { for i = i2 - 1 downto 0 do { for j = j1 to j2 - 1 do { t.table.(i).(j) := if i - i2 + i1 >= 0 then t.table.(i - i2 + i1).(j) else {elem = Nothing; span = new_span_id ()} } }; for i = Array.length t.table - 1 downto 0 do { for j = j2 to Array.length t.table.(i) - 1 do { t.table.(i).(j) := if i - i2 + i1 >= 0 then t.table.(i - i2 + i1).(j) else {elem = Nothing; span = new_span_id ()} } }; let old_span = t.table.(i2 - 1).(j1).span in let rec loop j = if j = Array.length t.table.(i2 - 1) then () else if t.table.(i2 - 1).(j).span = old_span then do { t.table.(i2 - 1).(j).span := span; loop (j + 1) } else () in loop j1 } ; value fall2_cool_left t i1 i2 i3 j1 j2 = let span = t.table.(i2 - 1).(j2).span in do { for i = i2 - 1 downto 0 do { for j = j1 + 1 to j2 do { t.table.(i).(j) := if i - i2 + i1 >= 0 then t.table.(i - i2 + i1).(j) else {elem = Nothing; span = new_span_id ()} } }; for i = Array.length t.table - 1 downto 0 do { for j = j1 downto 0 do { t.table.(i).(j) := if i - i2 + i1 >= 0 then t.table.(i - i2 + i1).(j) else {elem = Nothing; span = new_span_id ()} } }; let old_span = t.table.(i2 - 1).(j2).span in let rec loop j = if j < 0 then () else if t.table.(i2 - 1).(j).span = old_span then do { t.table.(i2 - 1).(j).span := span; loop (j - 1) } else () in loop j2 } ; value do_fall2_right t i1 i2 j1 j2 = let i3 = loop_i (Array.length t.table - 1) where rec loop_i i = if i < 0 then 0 else let rec loop_j j = if j = Array.length t.table.(i) then loop_i (i - 1) else match t.table.(i).(j).elem with [ Nothing -> loop_j (j + 1) | _ -> i + 1 ] in loop_j j2 in let new_height = i3 + i2 - i1 in let t = if new_height > Array.length t.table then let rec loop cnt t = if cnt = 0 then t else let new_line = Array.init (Array.length t.table.(0)) (fun i -> {elem = Nothing; span = new_span_id ()}) in let t = {table = Array.append t.table [| new_line |]} in loop (cnt - 1) t in loop (new_height - Array.length t.table) t else t in do { fall2_cool_right t i1 i2 i3 j1 j2; t } ; value do_fall2_left t i1 i2 j1 j2 = let i3 = loop_i (Array.length t.table - 1) where rec loop_i i = if i < 0 then 0 else let rec loop_j j = if j < 0 then loop_i (i - 1) else match t.table.(i).(j).elem with [ Nothing -> loop_j (j - 1) | _ -> i + 1 ] in loop_j j1 in let new_height = i3 + i2 - i1 in let t = if new_height > Array.length t.table then let rec loop cnt t = if cnt = 0 then t else let new_line = Array.init (Array.length t.table.(0)) (fun i -> {elem = Nothing; span = new_span_id ()}) in let t = {table = Array.append t.table [| new_line |]} in loop (cnt - 1) t in loop (new_height - Array.length t.table) t else t in do { fall2_cool_left t i1 i2 i3 j1 j2; t } ; value do_shorten_too_long t i1 j1 j2 = do { for i = i1 to Array.length t.table - 2 do { for j = j1 to j2 - 1 do { t.table.(i).(j) := t.table.(i + 1).(j) } }; let i = Array.length t.table - 1 in for j = j1 to j2 - 1 do { t.table.(i).(j) := {elem = Nothing; span = new_span_id ()} }; t } ; value try_fall2_right t i j = match t.table.(i).(j).elem with [ Ghost _ -> let i1 = loop (i - 1) where rec loop i = if i < 0 then 0 else match t.table.(i).(j).elem with [ Ghost _ -> loop (i - 1) | _ -> i + 1 ] in let separated1 = loop (i1 - 1) where rec loop i = if i < 0 then True else if j > 0 && t.table.(i).(j - 1).span = t.table.(i).(j).span then False else loop (i - 1) in let j2 = let x = t.table.(i).(j).span in let rec loop j2 = if j2 = Array.length t.table.(i) then j2 else match t.table.(i).(j2) with [ {elem = Ghost _; span = y} when y = x -> loop (j2 + 1) | _ -> j2 ] in loop (j + 1) in let separated2 = loop (i + 1) where rec loop i = if i = Array.length t.table then True else if j2 = Array.length t.table.(i) then False else if t.table.(i).(j2 - 1).span = t.table.(i).(j2).span then False else loop (i + 1) in if not separated1 || not separated2 then None else Some (do_fall2_right t i1 (i + 1) j j2) | _ -> None ] ; value try_fall2_left t i j = match t.table.(i).(j).elem with [ Ghost _ -> let i1 = loop (i - 1) where rec loop i = if i < 0 then 0 else match t.table.(i).(j).elem with [ Ghost _ -> loop (i - 1) | _ -> i + 1 ] in let separated1 = loop (i1 - 1) where rec loop i = if i < 0 then True else if j < Array.length t.table.(i) - 1 && t.table.(i).(j).span = t.table.(i).(j + 1).span then False else loop (i - 1) in let j1 = let x = t.table.(i).(j).span in let rec loop j1 = if j1 < 0 then j1 else match t.table.(i).(j1) with [ {elem = Ghost _; span = y} when y = x -> loop (j1 - 1) | _ -> j1 ] in loop (j - 1) in let separated2 = loop (i + 1) where rec loop i = if i = Array.length t.table then True else if j1 < 0 then False else if t.table.(i).(j1).span = t.table.(i).(j1 + 1).span then False else loop (i + 1) in if not separated1 || not separated2 then None else Some (do_fall2_left t i1 (i + 1) j1 j) | _ -> None ] ; value try_shorten_too_long t i j = match t.table.(i).(j).elem with [ Ghost _ -> let j2 = let x = t.table.(i).(j).span in let rec loop j2 = if j2 = Array.length t.table.(i) then j2 else match t.table.(i).(j2) with [ {elem = Ghost _; span = y} when y = x -> loop (j2 + 1) | _ -> j2 ] in loop (j + 1) in let i1 = loop (i + 1) where rec loop i = if i = Array.length t.table then i else match t.table.(i).(j).elem with [ Elem _ -> loop (i + 1) | _ -> i ] in let i2 = loop i1 where rec loop i = if i = Array.length t.table then i else match t.table.(i).(j).elem with [ Nothing -> loop (i + 1) | _ -> i ] in let separated_left = loop i where rec loop i = if i = i2 then True else if j > 0 && t.table.(i).(j).span = t.table.(i).(j - 1).span then False else loop (i + 1) in let separated_right = loop i where rec loop i = if i = i2 then True else if j2 < Array.length t.table.(i) && t.table.(i).(j2 - 1).span = t.table.(i).(j2).span then False else loop (i + 1) in if not separated_left || not separated_right then None else if i2 < Array.length t.table then None else Some (do_shorten_too_long t i j j2) | _ -> None ] ; value fall2_right t = loop_i (Array.length t.table - 1) t where rec loop_i i t = if i <= 0 then t else let rec loop_j j t = if j < 0 then loop_i (i - 1) t else match try_fall2_right t i j with [ Some t -> loop_i (Array.length t.table - 1) t | None -> loop_j (j - 1) t ] in loop_j (Array.length t.table.(i) - 2) t ; value fall2_left t = loop_i (Array.length t.table - 1) t where rec loop_i i t = if i <= 0 then t else let rec loop_j j t = if j >= Array.length t.table.(i) then loop_i (i - 1) t else match try_fall2_left t i j with [ Some t -> loop_i (Array.length t.table - 1) t | None -> loop_j (j + 1) t ] in loop_j 1 t ; value shorten_too_long t = loop_i (Array.length t.table - 1) t where rec loop_i i t = if i <= 0 then t else let rec loop_j j t = if j >= Array.length t.table.(i) then loop_i (i - 1) t else match try_shorten_too_long t i j with [ Some t -> loop_i (Array.length t.table - 1) t | None -> loop_j (j + 1) t ] in loop_j 1 t ; (* top_adjust: deletes all empty rows that might have appeared on top of the table after the falls *) value top_adjust t = let di = loop 0 where rec loop i = if i = Array.length t.table then i else let rec loop_j j = if j = Array.length t.table.(i) then loop (i + 1) else if t.table.(i).(j).elem <> Nothing then i else loop_j (j + 1) in loop_j 0 in if di > 0 then do { for i = 0 to Array.length t.table - 1 - di do { t.table.(i) := t.table.(i + di) }; {table = Array.sub t.table 0 (Array.length t.table - di)} } else t ; (* bottom_adjust: deletes all empty rows that might have appeared on bottom of the table after the falls *) value bottom_adjust t = let last_i = loop (Array.length t.table - 1) where rec loop i = if i < 0 then i else let rec loop_j j = if j = Array.length t.table.(i) then loop (i - 1) else if t.table.(i).(j).elem <> Nothing then i else loop_j (j + 1) in loop_j 0 in if last_i < Array.length t.table - 1 then {table = Array.sub t.table 0 (last_i + 1)} else t ; (* invert *) value invert_dag d = let d = {dag = Array.copy d.dag} in do { for i = 0 to Array.length d.dag - 1 do { let n = d.dag.(i) in d.dag.(i) := {pare = List.map (fun x -> x) n.chil; valu = n.valu; chil = List.map (fun x -> x) n.pare} }; d } ; value invert_table t = let t' = {table = Array.copy t.table} in let len = Array.length t.table in do { for i = 0 to len - 1 do { t'.table.(i) := Array.init (Array.length t.table.(0)) (fun j -> let d = t.table.(len - 1 - i).(j) in {elem = d.elem; span = d.span}); if i < len - 1 then for j = 0 to Array.length t'.table.(i) - 1 do { t'.table.(i).(j).span := t.table.(len - 2 - i).(j).span } else () }; t' } ; (* main *) value table_of_dag phony no_optim invert no_group d = let d = if invert then invert_dag d else d in let t = tablify phony no_optim no_group d in let t = if invert then invert_table t else t in let _ = fall () t in let t = fall2_right t in let t = fall2_left t in let t = shorten_too_long t in let t = top_adjust t in let t = bottom_adjust t in t ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/dag2html/dag2html.mli0000660000175200017530000000206212664543647024330 0ustar guillaumeguillaume(* $Id: dag2html.mli,v 5.0 2005-12-13 11:51:26 ddr Exp $ *) type dag 'a = { dag : mutable array (node 'a) } and node 'a = { pare : mutable list idag; valu : 'a; chil : mutable list idag } and idag = 'x ; external int_of_idag : idag -> int = "%identity"; external idag_of_int : int -> idag = "%identity"; type table 'a = { table : mutable array (array (data 'a)) } and data 'a = { elem : mutable elem 'a; span : mutable span_id } and elem 'a = [ Elem of 'a | Ghost of ghost_id | Nothing ] and span_id = 'x and ghost_id = 'x ; type align = [ LeftA | CenterA | RightA ]; type table_data 'a 'b = [ TDitem of 'a | TDtext of string | TDhr of align | TDbar of option 'b | TDnothing ] ; type html_table_line 'a 'b = array (int * align * table_data 'a 'b); type html_table 'a 'b = array (html_table_line 'a 'b); value html_table_struct : (node 'a -> 'b) -> (node 'a -> 'c) -> (node 'a -> bool) -> dag 'a -> table idag -> array (array (int * align * table_data 'b 'c)); value table_of_dag : (node 'a -> bool) -> bool -> bool -> bool -> dag 'a -> table idag; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/dag2html/README0000660000175200017530000000253012664543647023003 0ustar guillaumeguillaumeOVERVIEW: Dag2html generates HTML code from a DAG. It is well adapted for genealogic DAGs (it is used in the software GeneWeb, same author) but may be used for any kind of DAG. It generates HTML tables. The display is therefore horizontally extensible. But it cannot be visible in browsers like Lynx which does not treat tables. Moreover the lines cannot cross: to resolve this problem, nodes are sometimes duplicated. This is the version 1.02. To compile, you need the Objective Caml compiler which can be found at: http://caml.inria.fr/ocaml/ and Camlp5 at: http://pauillac.inria.fr/~ddr/camlp5/ COPYRIGHT: All files marked in this distribution are copyright 2000-2005 Institut National de Recherche en Informatique et Automatique (INRIA) and distributed under the conditions stated in file LICENSE. They can be freely redistributed for non-commercial purposes, provided the copyright notice remains attached. INSTALLATION: Just do "make" to make it. To install it, do "make install". Examples of dags can be found in directory "ex": just type dag2html ex/dagfile The syntax can be easily deducted from these examples. Usage can be found by typing dag2html -help AUTHOR: Daniel de Rauglaudre daniel.de_rauglaudre@inria.fr http://pauillac.inria.fr/~ddr/ BUG REPORTS AND USER FEEDBACK: Send your bug reports by E-mail to the author above. geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/gwb2ged/0002770000175200017530000000000012664543647021743 5ustar guillaumeguillaumegeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/gwb2ged/Makefile0000660000175200017530000000205312664543647023402 0ustar guillaumeguillaume# $Id: Makefile,v 5.19 2007-09-12 09:58:44 ddr Exp $ include ../tools/Makefile.inc OCAMLI=-I ../src SRC_OBJS=../src/argl.cmo ../src/adef.cmo ../src/buff.cmo ../src/name.cmo ../src/ansel.cmo ../src/iovalue.cmo ../src/mutil.cmo ../src/futil.cmo ../src/dutil.cmo ../src/secure.cmo ../src/btree.cmo ../src/database.cmo ../src/db2.cmo ../src/db2disk.cmo ../src/diff.cmo ../src/gwdb.cmo ../src/checkItem.cmo ../src/gutil.cmo ../src/select.cmo ../src/version.cmo ../src/calendar.cmo OBJS=$(SRC_OBJS) gwb2ged.cmo all:: out out:: gwb2ged.out $(RM) gwb2ged cp gwb2ged.out gwb2ged opt:: gwb2ged.opt $(RM) gwb2ged cp gwb2ged.opt gwb2ged $(STRIP) gwb2ged clean:: $(RM) gwb2ged gwb2ged.out: $(OBJS) $(OCAMLC) -custom $(STATIC) unix.cma -I $(CAMLP5D) gramlib.cma $(OBJS) $(LIBUNIX) -o gwb2ged.out gwb2ged.opt: $(OBJS:.cmo=.cmx) $(OCAMLOPT) $(SRC_OBJS:.cmo=.cmx) -a -o x.cmxa $(OCAMLOPT) $(STATIC) unix.cmxa -I $(CAMLP5D) gramlib.cmxa x.cmxa gwb2ged.cmx $(LIBUNIX) -o gwb2ged.opt depend: TOP=.. ../tools/camlp5_depend.sh $(OCAMLI) *.ml* > .depend include .depend geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/gwb2ged/Makefile.Mac.depend0000660000175200017530000000053212664543647025337 0ustar guillaumeguillaumegwb2ged.cmoÄ ::src:adef.cmi ::src:ansel.cmo ::src:argl.cmo ¶ ::src:calendar.cmo ::src:def.cmi ::src:gutil.cmi ::src:iobase.cmi ¶ ::src:select.cmo ::src:version.cmo gwb2ged.cmxÄ ::src:adef.cmx ::src:ansel.cmx ::src:argl.cmx ¶ ::src:calendar.cmx ::src:def.cmi ::src:gutil.cmx ::src:iobase.cmx ¶ ::src:select.cmx ::src:version.cmx geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/gwb2ged/.depend0000660000175200017530000000065612664543647023211 0ustar guillaumeguillaumegwb2ged.cmo: ../src/adef.cmi ../src/ansel.cmo ../src/argl.cmo \ ../src/calendar.cmi ../src/def.cmi ../src/gutil.cmi ../src/gwdb.cmi \ ../src/mutil.cmi ../src/secure.cmi ../src/select.cmo ../src/version.cmo gwb2ged.cmx: ../src/adef.cmx ../src/ansel.cmx ../src/argl.cmx \ ../src/calendar.cmx ../src/def.cmi ../src/gutil.cmx ../src/gwdb.cmx \ ../src/mutil.cmx ../src/secure.cmx ../src/select.cmx ../src/version.cmx geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/gwb2ged/gwb2ged.ml0000660000175200017530000005561412664543647023630 0ustar guillaumeguillaume(* $Id: gwb2ged.ml,v 5.29 2008-01-08 11:58:46 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Def; open Gutil; open Gwdb; open Mutil; open Printf; type charset = [ Ansel | Ascii | Utf8 ] ; value charset = ref Utf8; value no_notes = ref False; value no_picture = ref False; value month_txt = [| "JAN"; "FEB"; "MAR"; "APR"; "MAY"; "JUN"; "JUL"; "AUG"; "SEP"; "OCT"; "NOV"; "DEC" |] ; value french_txt = [| "VEND"; "BRUM"; "FRIM"; "NIVO"; "PLUV"; "VENT"; "GERM"; "FLOR"; "PRAI"; "MESS"; "THER"; "FRUC"; "COMP" |] ; value hebrew_txt = [| "TSH"; "CSH"; "KSL"; "TVT"; "SHV"; "ADR"; "ADS"; "NSN"; "IYR"; "SVN"; "TMZ"; "AAV"; "ELL" |] ; value ged_month cal m = match cal with [ Dgregorian | Djulian -> if m >= 1 && m <= Array.length month_txt then month_txt.(m - 1) else failwith "ged_month" | Dfrench -> if m >= 1 && m <= Array.length french_txt then french_txt.(m - 1) else failwith "ged_month" | Dhebrew -> if m >= 1 && m <= Array.length hebrew_txt then hebrew_txt.(m - 1) else failwith "ged_month" ] ; value encode s = match charset.val with [ Ansel -> let s = if Mutil.utf_8_db.val then Mutil.iso_8859_1_of_utf_8 s else s in Ansel.of_iso_8859_1 s | Ascii -> if Mutil.utf_8_db.val then Mutil.iso_8859_1_of_utf_8 s else s | Utf8 -> if Mutil.utf_8_db.val then s else Mutil.utf_8_of_iso_8859_1 s ] ; value max_len = 78; value next_char_pair_overflows s len i = loop False (len + 1) (i + 1) where rec loop prec_was_space len i = if len < max_len then if i < String.length s then match s.[i] with [ ' ' | '\n' -> loop True (len + 1) (i + 1) | _ -> if prec_was_space then loop False (len + 1) (i + 1) else False ] else False else True ; value br = "
    "; value find_br s ini_i = let ini = " ' ' && next_char_pair_overflows s len i then do { fprintf oc "\n2 CONC %c" c; display_note_aux oc s (String.length "2 CONC .") (i + 1) } else do { output_char oc c; display_note_aux oc s (len + 1) (i + 1) } ; value display_note oc s = do { fprintf oc "1 NOTE "; display_note_aux oc (encode s) (String.length "1 NOTE ") 0; } ; value ged_header base oc ifile ofile = do { fprintf oc "0 HEAD\n"; fprintf oc "1 SOUR GeneWeb\n"; fprintf oc "2 VERS %s\n" Version.txt; fprintf oc "2 NAME %s\n" (Filename.basename Sys.argv.(0)); fprintf oc "2 CORP INRIA\n"; fprintf oc "3 ADDR http://www.geneweb.org\n"; fprintf oc "2 DATA %s\n" (let fname = Filename.basename ifile in if Filename.check_suffix fname ".gwb" then fname else fname ^ ".gwb"); try let tm = Unix.localtime (Unix.time ()) in let mon = ged_month Dgregorian (tm.Unix.tm_mon + 1) in do { fprintf oc "1 DATE %02d %s %d\n" tm.Unix.tm_mday mon (1900 + tm.Unix.tm_year); fprintf oc "2 TIME %02d:%02d:%02d\n" tm.Unix.tm_hour tm.Unix.tm_min tm.Unix.tm_sec; } with _ -> (); if ofile <> "" then fprintf oc "1 FILE %s\n" (Filename.basename ofile) else (); fprintf oc "1 GEDC\n"; match charset.val with [ Ansel | Ascii -> fprintf oc "2 VERS 5.5\n" | Utf8 -> fprintf oc "2 VERS 5.5.1\n" ]; fprintf oc "2 FORM LINEAGE-LINKED\n"; match charset.val with [ Ansel -> fprintf oc "1 CHAR ANSEL\n" | Ascii -> fprintf oc "1 CHAR ASCII\n" | Utf8 -> fprintf oc "1 CHAR UTF-8\n" ]; if no_notes.val then () else let s = base_notes_read base "" in if s = "" then () else display_note oc s; } ; value sub_string_index s t = loop 0 0 where rec loop i j = if j = String.length t then Some (i - j) else if i = String.length s then None else if s.[i] = t.[j] then loop (i + 1) (j + 1) else loop (i + 1) 0 ; value ged_1st_name base p = let fn = sou base (get_first_name p) in match get_first_names_aliases p with [ [n :: _] -> let fna = sou base n in match sub_string_index fna fn with [ Some i -> let j = i + String.length fn in String.sub fna 0 i ^ "\"" ^ fn ^ "\"" ^ String.sub fna j (String.length fna - j) | None -> fn ] | [] -> fn ] ; value string_of_list = loop "" where rec loop r = fun [ [s :: l] -> if r = "" then loop s l else loop (r ^ "," ^ s) l | [] -> r ] ; value ged_name base oc per = do { fprintf oc "1 NAME %s /%s/\n" (encode (Mutil.nominative (ged_1st_name base per))) (encode (Mutil.nominative (sou base (get_surname per)))); let n = sou base (get_public_name per) in if n <> "" then fprintf oc "2 GIVN %s\n" (encode n) else (); match get_qualifiers per with [ [nn :: _] -> fprintf oc "2 NICK %s\n" (encode (sou base nn)) | [] -> () ]; match get_surnames_aliases per with [ [] -> () | list -> let list = List.map (fun n -> encode (sou base n)) list in fprintf oc "2 SURN %s\n" (string_of_list list) ]; List.iter (fun s -> fprintf oc "1 NAME %s\n" (encode (sou base s))) (get_aliases per); } ; value ged_sex base oc per = match get_sex per with [ Male -> fprintf oc "1 SEX M\n" | Female -> fprintf oc "1 SEX F\n" | Neuter -> () ] ; value ged_calendar oc = fun [ Dgregorian -> () | Djulian -> fprintf oc "@#DJULIAN@ " | Dfrench -> fprintf oc "@#DFRENCH R@ " | Dhebrew -> fprintf oc "@#DHEBREW@ " ] ; value ged_date_dmy oc dt cal = do { match dt.prec with [ Sure -> () | About -> fprintf oc "ABT " | Maybe -> fprintf oc "EST " | Before -> fprintf oc "BEF " | After -> fprintf oc "AFT " | OrYear i -> fprintf oc "BET " | YearInt i -> fprintf oc "BET " ]; ged_calendar oc cal; if dt.day <> 0 then fprintf oc "%02d " dt.day else (); if dt.month <> 0 then fprintf oc "%s " (ged_month cal dt.month) else (); fprintf oc "%d" dt.year; match dt.prec with [ OrYear i -> do { fprintf oc " AND "; ged_calendar oc cal; fprintf oc "%d" i; } | YearInt i -> do { fprintf oc " AND "; ged_calendar oc cal; fprintf oc "%d" i; } | _ -> () ]; } ; value ged_date oc = fun [ Dgreg d Dgregorian -> ged_date_dmy oc d Dgregorian | Dgreg d Djulian -> ged_date_dmy oc (Calendar.julian_of_gregorian d) Djulian | Dgreg d Dfrench -> ged_date_dmy oc (Calendar.french_of_gregorian d) Dfrench | Dgreg d Dhebrew -> ged_date_dmy oc (Calendar.hebrew_of_gregorian d) Dhebrew | Dtext t -> fprintf oc "(%s)" t ] ; value ged_ev_detail oc n typ d pl src = do { match (typ, d, pl) with [ ("", None, "") -> fprintf oc " Y" | _ -> () ]; fprintf oc "\n"; if typ = "" then () else fprintf oc "%d TYPE %s\n" n typ; match d with [ Some d -> do { fprintf oc "%d DATE " n; ged_date oc d; fprintf oc "\n"; } | None -> () ]; if pl <> "" then fprintf oc "%d PLAC %s\n" n (encode pl) else (); if src <> "" then fprintf oc "%d SOUR %s\n" n (encode src) else (); } ; value adop_fam_list = ref []; value adop_fam_cnt = ref 0; value ged_adoption base (per_sel, fam_sel) oc per r = let sel = match (r.r_fath, r.r_moth) with [ (Some ip1, Some ip2) -> per_sel ip1 && per_sel ip2 | (Some ip1, _) -> per_sel ip1 | (_, Some ip2) -> per_sel ip2 | _ -> True ] in if sel then do { fprintf oc "1 ADOP Y\n"; adop_fam_list.val := [(r.r_fath, r.r_moth, get_key_index per) :: adop_fam_list.val]; incr adop_fam_cnt; fprintf oc "2 FAMC @F%d@\n" (nb_of_families base + adop_fam_cnt.val); fprintf oc "3 ADOP "; match (r.r_fath, r.r_moth) with [ (Some _, None) -> fprintf oc "HUSB" | (None, Some _) -> fprintf oc "WIFE" | (Some _, Some _) -> fprintf oc "BOTH" | _ -> () ]; fprintf oc "\n"; } else () ; value ged_fam_adop base oc i (fath, moth, child) = do { fprintf oc "0 @F%d@ FAM\n" i; match fath with [ Some i -> fprintf oc "1 HUSB @I%d@\n" (Adef.int_of_iper i + 1) | _ -> () ]; match moth with [ Some i -> fprintf oc "1 WIFE @I%d@\n" (Adef.int_of_iper i + 1) | _ -> () ]; } ; value ged_ind_ev_str base sel oc per = do { let pl = sou base (get_birth_place per) in let src = sou base (get_birth_src per) in match (Adef.od_of_codate (get_birth per), pl) with [ (None, "") -> () | (None, pl) -> do { fprintf oc "1 BIRT"; ged_ev_detail oc 2 "" None pl src; } | (od, pl) -> do { fprintf oc "1 BIRT"; ged_ev_detail oc 2 "" od pl src; } ]; List.iter (fun r -> if r.r_type = Adoption then ged_adoption base sel oc per r else ()) (get_rparents per); let pl = sou base (get_baptism_place per) in let src = sou base (get_baptism_src per) in match (Adef.od_of_codate (get_baptism per), pl) with [ (None, "") -> () | (od, pl) -> do { fprintf oc "1 BAPM"; ged_ev_detail oc 2 "" od pl src; } ]; let pl = sou base (get_death_place per) in let src = sou base (get_death_src per) in match get_death per with [ NotDead -> () | Death dr cd -> do { fprintf oc "1 DEAT"; ged_ev_detail oc 2 "" (Some (Adef.date_of_cdate cd)) pl src; } | DeadYoung | DeadDontKnowWhen | OfCourseDead -> do { fprintf oc "1 DEAT"; ged_ev_detail oc 2 "" None pl src; } | DontKnowIfDead -> fprintf oc "1 DEAT\n" ]; let pl = sou base (get_burial_place per) in let src = sou base (get_burial_src per) in match get_burial per with [ UnknownBurial -> () | Buried cod -> do { fprintf oc "1 BURI"; ged_ev_detail oc 2 "" (Adef.od_of_codate cod) pl src; } | Cremated cod -> do { fprintf oc "1 CREM"; ged_ev_detail oc 2 "" (Adef.od_of_codate cod) pl src; } ]; } ; value ged_title base oc per tit = do { fprintf oc "1 TITL "; fprintf oc "%s" (encode (sou base tit.t_ident)); match sou base tit.t_place with [ "" -> () | pl -> fprintf oc ", %s" (encode pl) ]; if tit.t_nth <> 0 then fprintf oc ", %d" tit.t_nth else (); fprintf oc "\n"; match (Adef.od_of_codate tit.t_date_start, Adef.od_of_codate tit.t_date_end) with [ (None, None) -> () | (Some sd, None) -> do { fprintf oc "2 DATE FROM "; ged_date oc sd; fprintf oc "\n"; } | (None, Some sd) -> do { fprintf oc "2 DATE TO "; ged_date oc sd; fprintf oc "\n"; } | (Some sd1, Some sd2) -> do { fprintf oc "2 DATE FROM "; ged_date oc sd1; fprintf oc " TO "; ged_date oc sd2; fprintf oc "\n"; } ]; match tit.t_name with [ Tmain -> fprintf oc "2 NOTE %s\n" (encode (sou base (get_public_name per))) | Tname n -> fprintf oc "2 NOTE %s\n" (encode (sou base n)) | Tnone -> () ]; } ; value ged_ind_attr_str base oc per = do { match sou base (get_occupation per) with [ "" -> () | occu -> fprintf oc "1 OCCU %s\n" (encode occu) ]; List.iter (ged_title base oc per) (get_titles per); } ; value ged_famc base (per_sel, fam_sel) oc asc = match get_parents asc with [ Some ifam -> if fam_sel ifam then fprintf oc "1 FAMC @F%d@\n" (Adef.int_of_ifam ifam + 1) else () | None -> () ] ; value ged_fams base (per_sel, fam_sel) oc ifam = if fam_sel ifam then fprintf oc "1 FAMS @F%d@\n" (Adef.int_of_ifam ifam + 1) else () ; value ged_godparent per_sel oc godp = fun [ Some ip -> if per_sel ip then do { fprintf oc "1 ASSO @I%d@\n" (Adef.int_of_iper ip + 1); fprintf oc "2 TYPE INDI\n"; fprintf oc "2 RELA %s\n" godp; } else () | None -> () ] ; value ged_witness fam_sel oc ifam = if fam_sel ifam then do { fprintf oc "1 ASSO @F%d@\n" (Adef.int_of_ifam ifam + 1); fprintf oc "2 TYPE FAM\n"; fprintf oc "2 RELA witness\n"; } else () ; value ged_asso base (per_sel, fam_sel) oc per = do { List.iter (fun r -> if r.r_type = GodParent then do { ged_godparent per_sel oc "GODF" r.r_fath; ged_godparent per_sel oc "GODM" r.r_moth; } else ()) (get_rparents per); List.iter (fun ic -> let c = poi base ic in if get_sex c = Male then List.iter (fun ifam -> let fam = foi base ifam in if array_mem (get_key_index per) (get_witnesses fam) then ged_witness fam_sel oc ifam else ()) (Array.to_list (get_family c)) else ()) (get_related per); } ; value ged_psource base oc per = match sou base (get_psources per) with [ "" -> () | s -> fprintf oc "1 SOUR %s\n" (encode s) ] ; value ged_multimedia_link base oc per = match sou base (get_image per) with [ "" -> () | s -> if not no_picture.val then do {fprintf oc "1 OBJE\n"; fprintf oc "2 FILE %s\n" s;} else () ] ; value ged_note base oc per = match sou base (get_notes per) with [ "" -> () | s -> display_note oc s ] ; value ged_marriage base oc fam = match (Adef.od_of_codate (get_marriage fam), sou base (get_marriage_place fam), get_relation fam) with (* Pourquoi ne pas exporter dans ce cas ? *) (*[ (None, "", Married | Engaged) -> ()*) [ (d, pl, _) -> do { fprintf oc "1 %s" (if get_relation fam = Engaged then "ENGA" else "MARR"); let typ = if get_relation fam = NoSexesCheckNotMarried || get_relation fam = NoSexesCheckMarried then "gay" else "" in ged_ev_detail oc 2 typ d pl (sou base (get_marriage_src fam)); if get_relation fam = NotMarried then fprintf oc "2 PLAC unmarried\n" else (); } ] ; value ged_divorce base oc fam = match get_divorce fam with [ NotDivorced -> () | Separated -> () | Divorced cd -> let d = Adef.od_of_codate cd in do { fprintf oc "1 DIV"; ged_ev_detail oc 2 "" d "" ""; } ] ; value ged_child base (per_sel, fam_sel) oc chil = if per_sel chil then fprintf oc "1 CHIL @I%d@\n" (Adef.int_of_iper chil + 1) else () ; value ged_fsource base oc fam = match sou base (get_fsources fam) with [ "" -> () | s -> fprintf oc "1 SOUR %s\n" (encode s) ] ; value ged_comment base oc fam = match sou base (get_comment fam) with [ "" -> () | s -> display_note oc s ] ; value has_personal_infos base per = if get_parents per <> None then True else if sou base (get_first_name per) <> "?" then True else if sou base (get_surname per) <> "?" then True else if get_birth per <> Adef.codate_None then True else if sou base (get_birth_place per) <> "" then True else if get_death per <> NotDead && get_death per <> DontKnowIfDead then True else if sou base (get_occupation per) <> "" then True else if get_titles per <> [] then True else False ; value ged_ind_record base sel oc i = let per = poi base (Adef.iper_of_int i) in if has_personal_infos base per then do { fprintf oc "0 @I%d@ INDI\n" (i + 1); ged_name base oc per; ged_sex base oc per; ged_ind_ev_str base sel oc per; ged_ind_attr_str base oc per; ged_famc base sel oc per; Array.iter (ged_fams base sel oc) (get_family per); ged_asso base sel oc per; ged_psource base oc per; ged_multimedia_link base oc per; ged_note base oc per; } else () ; value ged_fam_record base ((per_sel, fam_sel) as sel) oc i = let fam = foi base (Adef.ifam_of_int i) in if is_deleted_family fam then () else do { fprintf oc "0 @F%d@ FAM\n" (i + 1); ged_marriage base oc fam; ged_divorce base oc fam; if has_personal_infos base (poi base (get_father fam)) && per_sel (get_father fam) then fprintf oc "1 HUSB @I%d@\n" (Adef.int_of_iper (get_father fam) + 1) else (); if has_personal_infos base (poi base (get_mother fam)) && per_sel (get_mother fam) then fprintf oc "1 WIFE @I%d@\n" (Adef.int_of_iper (get_mother fam) + 1) else (); Array.iter (ged_child base sel oc) (get_children fam); ged_fsource base oc fam; ged_comment base oc fam; } ; value find_person base p1 po p2 = match person_of_key base p1 p2 po with [ Some ip -> ip | None -> do { printf "Not found: %s%s %s\n" p1 (if po = 0 then "" else " " ^ string_of_int po) p2; flush stdout; exit 2 } ] ; value surnames = ref []; value no_spouses_parents = ref False; value censor = ref 0; value with_siblings = ref False; value gwb2ged base ifile ofile anc desc mem = let anc = match anc with [ Some (p1, po, p2) -> Some (find_person base p1 po p2) | None -> None ] in let desc = match desc with [ Some (p1, po, p2) -> Some (find_person base p1 po p2) | None -> None ] in do { if not mem then do { load_ascends_array base; load_unions_array base; load_couples_array base; load_descends_array base; } else (); let oc = if ofile = "" then stdout else open_out ofile in let ((per_sel, fam_sel) as sel) = Select.functions base anc desc surnames.val None no_spouses_parents.val censor.val with_siblings.val (-1) in ged_header base oc ifile ofile; flush oc; for i = 0 to nb_of_persons base - 1 do { if per_sel (Adef.iper_of_int i) then ged_ind_record base sel oc i else () }; for i = 0 to nb_of_families base - 1 do { if fam_sel (Adef.ifam_of_int i) then ged_fam_record base sel oc i else () }; let _ = List.fold_right (fun adop i -> do { ged_fam_adop base oc i adop; i + 1 }) adop_fam_list.val (nb_of_families base + 1) in fprintf oc "0 TRLR\n"; flush oc; if ofile = "" then () else close_out oc; } ; value ifile = ref ""; value ofile = ref "a.ged"; value mem = ref False; value anc_1st = ref ""; value anc_occ = ref 0; value anc_2nd = ref ""; value desc_1st = ref ""; value desc_occ = ref 0; value desc_2nd = ref ""; type arg_state = [ ASnone | ASwaitAncOcc | ASwaitAncSurn | ASwaitDescOcc | ASwaitDescSurn ] ; value arg_state = ref ASnone; value errmsg = "Usage: " ^ Sys.argv.(0) ^ " \ [options] If both options -a and -d are used, intersection is assumed. If several options -s are used, union is assumed. Options are:" ; value speclist = [("-charset", Arg.String (fun x -> do { arg_state.val := ASnone; match x with [ "ASCII" -> charset.val := Ascii | "ANSEL" -> charset.val := Ansel | "UTF-8" -> charset.val := Utf8 | _ -> raise (Arg.Bad "bad -charset value") ] }), "[ASCII|ANSEL|UTF-8]: set charset; default is UTF-8."); ("-o", Arg.String (fun x -> do { ofile.val := x; arg_state.val := ASnone }), ": output file name (default: a.ged)"); ("-mem", Arg.Unit (fun () -> do { mem.val := True; arg_state.val := ASnone }), ": save memory space, but slower"); ("-a", Arg.String (fun s -> do { anc_1st.val := s; arg_state.val := ASwaitAncOcc }), "\"<1st_name>\" [num] \"\": select ancestors of"); ("-d", Arg.String (fun s -> do { desc_1st.val := s; arg_state.val := ASwaitDescOcc }), "\"<1st_name>\" [num] \"\": select descendants of"); ("-aws", Arg.String (fun s -> do { anc_1st.val := s; arg_state.val := ASwaitAncOcc; with_siblings.val := True; }), "\"<1st_name>\" [num] \"\" : select ancestors with siblings"); ("-s", Arg.String (fun x -> surnames.val := [x :: surnames.val]), "\"\" : select this surname (option usable several times)"); ("-nsp", Arg.Set no_spouses_parents, ": no spouses' parents (for options -s and -d)"); ("-nn", Arg.Set no_notes, ": no (database) notes"); ("-nopicture", Arg.Set no_picture, ": Don't extract individual picture."); ("-c", Arg.Int (fun i -> censor.val := i), "\ : When a person is born less than years ago, it is not exported unless it is Public. All the spouses and descendants are also censored.")] ; value anonfun s = match arg_state.val with [ ASnone -> if ifile.val = "" then ifile.val := s else raise (Arg.Bad "Cannot treat several databases") | ASwaitAncOcc -> try do { anc_occ.val := int_of_string s; arg_state.val := ASwaitAncSurn } with [ Failure _ -> do { anc_occ.val := 0; anc_2nd.val := s; arg_state.val := ASnone } ] | ASwaitAncSurn -> do { anc_2nd.val := s; arg_state.val := ASnone } | ASwaitDescOcc -> try do { desc_occ.val := int_of_string s; arg_state.val := ASwaitDescSurn } with [ Failure _ -> do { desc_occ.val := 0; desc_2nd.val := s; arg_state.val := ASnone } ] | ASwaitDescSurn -> do { desc_2nd.val := s; arg_state.val := ASnone } ] ; value main () = do { Argl.parse speclist anonfun errmsg; Secure.set_base_dir (Filename.dirname ifile.val); let anc = if anc_1st.val <> "" then if anc_2nd.val = "" then do { printf "Misused option -a\n"; printf "Use option -help for usage\n"; flush stdout; exit 2 } else Some (anc_1st.val, anc_occ.val, anc_2nd.val) else None in let desc = if desc_1st.val <> "" then if desc_2nd.val = "" then do { printf "Misused option -d\n"; printf "Use option -help for usage\n"; flush stdout; exit 2 } else Some (desc_1st.val, desc_occ.val, desc_2nd.val) else None in if ofile.val = "-" then ofile.val := "" else (); if ifile.val = "" then do { printf "Missing base name\n"; printf "Use option -help for usage\n"; flush stdout; exit 2 } else (); match try Some (Gwdb.open_base ifile.val) with [ Sys_error _ -> None ] with [ Some base -> gwb2ged base ifile.val ofile.val anc desc mem.val | None -> do { printf "Can't open base %s\n" ifile.val; flush stdout; exit 2 } ]; } ; Printexc.catch main (); geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/wserver/0002770000175200017530000000000012664543647022117 5ustar guillaumeguillaumegeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/wserver/Makefile0000660000175200017530000000062012664543647023554 0ustar guillaumeguillaume# $Id: Makefile,v 5.2 2010-09-23 17:16:49 ddr Exp $ include ../tools/Makefile.inc OBJS=wserver.cmo all:: pa_macro5.cmo $(OBJS) opt:: pa_macro5.cmo $(OBJS:.cmo=.cmx) pa_macro5.cmo: pa_macro5.ml camlp5r pa_extend.cmo q_MLast.cmo -o pa_macro5.ppo pa_macro5.ml ocamlc -c -I "`camlp5 -where`" -impl pa_macro5.ppo depend: TOP=.. ../tools/camlp5_depend.sh $(OCAMLI) *.ml* > .depend include .depend geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/wserver/wserver.ml0000660000175200017530000004740012664543647024152 0ustar guillaumeguillaume(* $Id: wserver.ml,v 5.15 2007-09-12 09:42:26 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Printf; value sock_in = ref "wserver.sin"; value sock_out = ref "wserver.sou"; value stop_server = ref "STOP_SERVER"; value noproc = ref False; value wserver_sock = ref Unix.stdout; value wsocket () = wserver_sock.val; value wserver_oc = ref stdout; value wrap_string = ref (fun s -> s); value wprint fmt = kprintf (fun s -> output_string wserver_oc.val (wrap_string.val s)) fmt ; value wflush () = flush wserver_oc.val; value hexa_digit x = if x >= 10 then Char.chr (Char.code 'A' + x - 10) else Char.chr (Char.code '0' + x) ; value hexa_val conf = match conf with [ '0'..'9' -> Char.code conf - Char.code '0' | 'a'..'f' -> Char.code conf - Char.code 'a' + 10 | 'A'..'F' -> Char.code conf - Char.code 'A' + 10 | _ -> 0 ] ; value gen_decode strip_spaces s = let rec need_decode i = if i < String.length s then match s.[i] with [ '%' | '+' -> True | _ -> need_decode (succ i) ] else False in let rec compute_len i i1 = if i < String.length s then let i = match s.[i] with [ '%' when i + 2 < String.length s -> i + 3 | _ -> succ i ] in compute_len i (succ i1) else i1 in let rec copy_decode_in s1 i i1 = if i < String.length s then let i = match s.[i] with [ '%' when i + 2 < String.length s -> do { let v = hexa_val s.[i+1] * 16 + hexa_val s.[i+2] in Bytes.set s1 i1 (Char.chr v); i + 3 } | '+' -> do { Bytes.set s1 i1 ' '; succ i } | x -> do { Bytes.set s1 i1 x; succ i } ] in copy_decode_in s1 i (succ i1) else s1 in let rec strip_heading_and_trailing_spaces s = if String.length s > 0 then if s.[0] = ' ' then strip_heading_and_trailing_spaces (String.sub s 1 (String.length s - 1)) else if s.[String.length s - 1] = ' ' then strip_heading_and_trailing_spaces (String.sub s 0 (String.length s - 1)) else s else s in if need_decode 0 then let len = compute_len 0 0 in let s1 = Bytes.create len in let s = copy_decode_in s1 0 0 in if strip_spaces then strip_heading_and_trailing_spaces s else s else s ; value decode = gen_decode True; value special = fun [ '\000'..'\031' | '\127'..'\255' | '<' | '>' | '"' | '#' | '%' | '{' | '}' | '|' | '\\' | '^' | '~' | '[' | ']' | '`' | ';' | '/' | '?' | ':' | '@' | '=' | '&' | '+' -> True | _ -> False ] ; value encode s = let rec need_code i = if i < String.length s then match s.[i] with [ ' ' -> True | x -> if special x then True else need_code (succ i) ] else False in let rec compute_len i i1 = if i < String.length s then let i1 = if special s.[i] then i1 + 3 else succ i1 in compute_len (succ i) i1 else i1 in let rec copy_code_in s1 i i1 = if i < String.length s then let i1 = match s.[i] with [ ' ' -> do { Bytes.set s1 i1 '+'; succ i1 } | c -> if special c then do { Bytes.set s1 i1 '%'; Bytes.set s1 (i1+1) (hexa_digit (Char.code c / 16)); Bytes.set s1 (i1+2) (hexa_digit (Char.code c mod 16)); i1 + 3 } else do { Bytes.set s1 i1 c; succ i1 } ] in copy_code_in s1 (succ i) i1 else s1 in if need_code 0 then let len = compute_len 0 0 in copy_code_in (Bytes.create len) 0 0 else s ; value nl () = wprint "\013\010"; value http answer = do { let answer = if answer = "" then "200 OK" else answer in wprint "HTTP/1.0 %s" answer; nl () }; value print_exc exc = match exc with [ Unix.Unix_error err fun_name arg -> do { prerr_string "\""; prerr_string fun_name; prerr_string "\" failed"; if String.length arg > 0 then do { prerr_string " on \""; prerr_string arg; prerr_string "\"" } else (); prerr_string ": "; prerr_endline (Unix.error_message err) } | Out_of_memory -> prerr_string "Out of memory\n" | Match_failure (file, first_char, last_char) -> do { prerr_string "Pattern matching failed, file "; prerr_string file; prerr_string ", chars "; prerr_int first_char; prerr_char '-'; prerr_int last_char; prerr_char '\n' } | Assert_failure (file, first_char, last_char) -> do { prerr_string "Assertion failed, file "; prerr_string file; prerr_string ", chars "; prerr_int first_char; prerr_char '-'; prerr_int last_char; prerr_char '\n' } | x -> do { prerr_string "Wserver: uncaught exception: "; prerr_string (Obj.magic (Obj.field (Obj.field (Obj.repr x) 0) 0)); if Obj.size (Obj.repr x) > 1 then do { prerr_char '('; for i = 1 to Obj.size (Obj.repr x) - 1 do { if i > 1 then prerr_string ", " else (); let arg = Obj.field (Obj.repr x) i in if not (Obj.is_block arg) then prerr_int (Obj.magic arg : int) else if Obj.tag arg = 252 then do { prerr_char '"'; prerr_string (Obj.magic arg : string); prerr_char '"' } else prerr_char '_'; }; prerr_char ')'; } else (); prerr_char '\n' } ] ; value print_err_exc exc = do { print_exc exc; flush stderr }; value case_unsensitive_eq s1 s2 = String.lowercase s1 = String.lowercase s2; value rec extract_param name stop_char = fun [ [x :: l] -> if String.length x >= String.length name && case_unsensitive_eq (String.sub x 0 (String.length name)) name then let i = loop (String.length name) where rec loop i = if i = String.length x then i else if x.[i] = stop_char then i else loop (i + 1) in String.sub x (String.length name) (i - String.length name) else extract_param name stop_char l | [] -> "" ] ; value buff = ref (Bytes.create 80); value store len x = do { if len >= String.length buff.val then buff.val := buff.val ^ Bytes.create (String.length buff.val) else (); Bytes.set buff.val len x; succ len }; value get_buff len = String.sub buff.val 0 len; value get_request strm = let rec loop len = parser [ [: `'\010'; s :] -> if len = 0 then [] else let str = get_buff len in [str :: loop 0 s] | [: `'\013'; s :] -> loop len s | [: `c; s :] -> loop (store len c) s | [: :] -> if len = 0 then [] else [get_buff len] ] in loop 0 strm ; IFDEF UNIX THEN value timeout tmout spid _ = do { Unix.kill spid Sys.sigkill; Unix.kill spid Sys.sigterm; let pid = Unix.fork () in if pid = 0 then if Unix.fork () = 0 then do { http ""; wprint "Content-type: text/html; charset=iso-8859-1"; nl (); nl (); wprint "Time out\n"; wprint "

    Time out

    \n"; wprint "Computation time > %d second(s)\n" tmout; wprint "\n"; wflush (); exit 0; } else exit 0 else (); let _ = Unix.waitpid [] pid in (); exit 2 } END; value get_request_and_content strm = let request = get_request strm in let content = match extract_param "content-length: " ' ' request with [ "" -> "" | x -> do { let str = Bytes.create (int_of_string x) in for i = 0 to String.length str - 1 do { Bytes.set str i (match strm with parser [ [: `x :] -> x | [: :] -> ' ' ]); }; str } ] in (request, content) ; value string_of_sockaddr = fun [ Unix.ADDR_UNIX s -> s | Unix.ADDR_INET a _ -> Unix.string_of_inet_addr a ] ; value sockaddr_of_string s = Unix.ADDR_UNIX s; value treat_connection tmout callback addr fd = do { IFDEF NOFORK THEN () ELSE IFDEF UNIX THEN if tmout > 0 then let spid = Unix.fork () in if spid > 0 then do { let _ (* : Sys.signal_behavior *) = Sys.signal Sys.sigalrm (Sys.Signal_handle (timeout tmout spid)) in (); let _ = Unix.alarm tmout in (); let _ = Unix.waitpid [] spid in (); let _ (* : Sys.signal_behavior *) = Sys.signal Sys.sigalrm Sys.Signal_default in (); exit 0; } else () else () ELSE () END END; let (request, script_name, contents) = let (request, contents) = let strm = let c = " " in Stream.from (fun _ -> if Unix.read fd c 0 1 = 1 then Some c.[0] else None) in get_request_and_content strm in let (script_name, contents) = match extract_param "GET /" ' ' request with [ "" -> (extract_param "POST /" ' ' request, contents) | str -> try let i = String.index str '?' in (String.sub str 0 i, String.sub str (i + 1) (String.length str - i - 1)) with [ Not_found -> (str, "") ] ] in (request, script_name, contents) in try callback (addr, request) script_name contents with [ Unix.Unix_error Unix.EPIPE "write" _ -> () | Sys_error "Broken pipe" -> () | exc -> print_err_exc exc ]; try wflush () with _ -> (); try flush stderr with _ -> (); }; value buff = Bytes.create 1024; IFDEF WIN95 THEN value copy_what_necessary t oc = let strm = let len = ref 0 in let i = ref 0 in Stream.from (fun _ -> do { if i.val >= len.val then do { len.val := Unix.read t buff 0 (String.length buff); i.val := 0; if len.val > 0 then output oc buff 0 len.val else (); } else (); if len.val = 0 then None else do { incr i; Some buff.[i.val - 1] } }) in let _ = get_request_and_content strm in () END; value rec list_remove x = fun [ [] -> failwith "list_remove" | [y :: l] -> if x = y then l else [y :: list_remove x l] ] ; IFDEF NOFORK THEN declare end ELSE value pids = ref [] END; IFDEF NOFORK THEN declare end ELSE value cleanup_verbose = ref True END; IFDEF NOFORK THEN declare end ELSE value cleanup_sons () = List.iter (fun p -> let pid = try fst (Unix.waitpid [Unix.WNOHANG] p) with [ Unix.Unix_error _ _ _ as exc -> do { if cleanup_verbose.val then do { eprintf "*** Why error on waitpid %d?\n" p; flush stderr; print_exc exc; eprintf "["; List.iter (fun p -> eprintf " %d" p) pids.val; eprintf "]\n"; flush stderr; cleanup_verbose.val := False; } else (); p } ] in if pid = 0 then () else pids.val := list_remove pid pids.val) pids.val END; IFDEF NOFORK THEN declare end ELSE value wait_available max_clients s = match max_clients with [ Some m -> do { if List.length pids.val >= m then (* let tm = Unix.localtime (Unix.time ()) in let _ = do { eprintf "*** %02d/%02d/%4d %02d:%02d:%02d " tm.Unix.tm_mday (succ tm.Unix.tm_mon) (1900 + tm.Unix.tm_year) tm.Unix.tm_hour tm.Unix.tm_min tm.Unix.tm_sec; eprintf "%d clients running; waiting...\n" m; flush stderr; } in *) let (pid, _) = Unix.wait () in (* let tm = Unix.localtime (Unix.time ()) in let _ = do { eprintf "*** %02d/%02d/%4d %02d:%02d:%02d " tm.Unix.tm_mday (succ tm.Unix.tm_mon) (1900 + tm.Unix.tm_year) tm.Unix.tm_hour tm.Unix.tm_min tm.Unix.tm_sec; eprintf "ok: place for another client\n"; flush stderr; } in *) pids.val := list_remove pid pids.val else (); if pids.val <> [] then cleanup_sons () else (); let stop_verbose = ref False in while pids.val <> [] && Unix.select [s] [] [] 15.0 = ([], [], []) do { cleanup_sons (); if pids.val <> [] && not stop_verbose.val then do { stop_verbose.val := True; let tm = Unix.localtime (Unix.time ()) in eprintf "*** %02d/%02d/%4d %02d:%02d:%02d %d process(es) remaining after cleanup (%d)\n" tm.Unix.tm_mday (succ tm.Unix.tm_mon) (1900 + tm.Unix.tm_year) tm.Unix.tm_hour tm.Unix.tm_min tm.Unix.tm_sec (List.length pids.val) (List.hd pids.val); flush stderr; () } else (); }; } | None -> () ] END; value wait_and_compact s = if Unix.select [s] [] [] 15.0 = ([], [], []) then do { eprintf "Compacting... "; flush stderr; Gc.compact (); eprintf "Ok\n"; flush stderr; } else () ; value skip_possible_remaining_chars fd = do { let b = "..." in try loop () where rec loop () = match Unix.select [fd] [] [] 5.0 with [ ([_], [], []) -> let len = Unix.read fd b 0 (String.length b) in if len = String.length b then loop () else () | _ -> () ] with [ Unix.Unix_error Unix.ECONNRESET _ _ -> () ] } ; value check_stopping () = if Sys.file_exists stop_server.val then do { flush stdout; eprintf "\nServer stopped by presence of file %s.\n" stop_server.val; eprintf "Remove that file to allow servers to run again.\n"; flush stderr; exit 0 } else () ; value accept_connection tmout max_clients callback s = do { IFDEF NOFORK THEN wait_and_compact s ELSE if noproc.val then wait_and_compact s else wait_available max_clients s END; let (t, addr) = Unix.accept s in check_stopping (); Unix.setsockopt t Unix.SO_KEEPALIVE True; IFDEF NOFORK THEN let cleanup () = do { try Unix.shutdown t Unix.SHUTDOWN_SEND with _ -> (); try Unix.shutdown t Unix.SHUTDOWN_RECEIVE with _ -> (); try Unix.close t with _ -> (); } in do { wserver_sock.val := t; wserver_oc.val := Unix.out_channel_of_descr t; treat_connection tmout callback addr t; cleanup (); } ELSE IFDEF UNIX THEN match try Some (Unix.fork ()) with _ -> None with [ Some 0 -> do { try do { if max_clients = None && Unix.fork () <> 0 then exit 0 else (); Unix.close s; wserver_sock.val := t; wserver_oc.val := Unix.out_channel_of_descr t; (* j'ai l'impression que cette fermeture fait parfois bloquer le serveur... try Unix.close t with _ -> (); *) treat_connection tmout callback addr t; } with [ Unix.Unix_error Unix.ECONNRESET "read" _ -> () | exc -> try do { print_err_exc exc; flush stderr; } with _ -> () ]; try Unix.shutdown t Unix.SHUTDOWN_SEND with _ -> (); try Unix.shutdown Unix.stdout Unix.SHUTDOWN_SEND with _ -> (); skip_possible_remaining_chars t; try Unix.shutdown t Unix.SHUTDOWN_RECEIVE with _ -> (); try Unix.shutdown Unix.stdin Unix.SHUTDOWN_RECEIVE with _ -> (); exit 0 } | Some id -> do { Unix.close t; if max_clients = None then let _ = Unix.waitpid [] id in () else pids.val := [id :: pids.val]; } | None -> do { Unix.close t; eprintf "Fork failed\n"; flush stderr } ] ELSE do { let oc = open_out_bin sock_in.val in let cleanup () = try close_out oc with _ -> () in try copy_what_necessary t oc with [ Unix.Unix_error _ _ _ -> () | exc -> do { cleanup (); raise exc } ]; cleanup (); IFDEF SYS_COMMAND THEN let comm = let stringify_if_spaces s = try let _ = String.index s ' ' in "\"" ^ s ^ "\"" with [ Not_found -> s ] in List.fold_left (fun s a -> s ^ stringify_if_spaces a ^ " ") "" (Array.to_list Sys.argv) ^ "-wserver " ^ string_of_sockaddr addr in let _ = Sys.command comm in () ELSE if noproc.val then do { let fd = Unix.openfile sock_in.val [Unix.O_RDONLY] 0 in let oc = open_out_bin sock_out.val in wserver_oc.val := oc; treat_connection tmout callback addr fd; flush oc; close_out oc; Unix.close fd; } else let pid = let env = Array.append (Unix.environment ()) [| "WSERVER=" ^ string_of_sockaddr addr |] in (* let args = Array.map (fun x -> "\"" ^ x ^ "\"") Sys.argv in *) let args = Sys.argv in (**) Unix.create_process_env Sys.argv.(0) args env Unix.stdin Unix.stdout Unix.stderr in let _ = Unix.waitpid [] pid in let ic = open_in_bin sock_in.val in close_in ic END; let cleanup () = do { try Unix.shutdown t Unix.SHUTDOWN_SEND with _ -> (); skip_possible_remaining_chars t; try Unix.shutdown t Unix.SHUTDOWN_RECEIVE with _ -> (); try Unix.close t with _ -> (); } in try let ic = open_in_bin sock_out.val in let cleanup () = try close_in ic with _ -> () in do { try loop () where rec loop () = let len = input ic buff 0 (String.length buff) in if len = 0 then () else do { loop_write 0 where rec loop_write i = let olen = Unix.write t buff i (len - i) in if i + olen < len then loop_write (i + olen) else (); loop () } with [ Unix.Unix_error _ _ _ -> () | exc -> do { cleanup (); raise exc } ]; cleanup (); } with [ Unix.Unix_error _ _ _ -> () | exc -> do { cleanup (); raise exc } ]; cleanup (); } END END } ; value f addr_opt port tmout max_clients g = match IFDEF NOFORK THEN None ELSE IFDEF WIN95 THEN IFDEF SYS_COMMAND THEN let len = Array.length Sys.argv in if len > 2 && Sys.argv.(len - 2) = "-wserver" then Some Sys.argv.(len - 1) else None ELSE try Some (Sys.getenv "WSERVER") with [ Not_found -> None ] END ELSE None END END with [ Some s -> IFDEF NOFORK THEN () ELSE IFDEF WIN95 THEN do { let addr = sockaddr_of_string s in let fd = Unix.openfile sock_in.val [Unix.O_RDONLY] 0 in let oc = open_out_bin sock_out.val in wserver_oc.val := oc; ignore (treat_connection tmout g addr fd); exit 0 } ELSE () END END | None -> do { check_stopping (); let addr = match addr_opt with [ Some addr -> try Unix.inet_addr_of_string addr with [ Failure _ -> (Unix.gethostbyname addr).Unix.h_addr_list.(0) ] | None -> Unix.inet_addr_any ] in let s = Unix.socket Unix.PF_INET Unix.SOCK_STREAM 0 in Unix.setsockopt s Unix.SO_REUSEADDR True; Unix.bind s (Unix.ADDR_INET addr port); Unix.listen s 4; IFDEF NOFORK THEN Sys.set_signal Sys.sigpipe Sys.Signal_ignore ELSE IFDEF UNIX THEN let _ = Unix.nice 1 in () ELSE () END END; let tm = Unix.localtime (Unix.time ()) in eprintf "Ready %4d-%02d-%02d %02d:%02d port" (1900 + tm.Unix.tm_year) (succ tm.Unix.tm_mon) tm.Unix.tm_mday tm.Unix.tm_hour tm.Unix.tm_min; eprintf " %d" port; eprintf "...\n"; flush stderr; while True do { try accept_connection tmout max_clients g s with [ Unix.Unix_error Unix.ECONNRESET "accept" _ -> () | Unix.Unix_error (Unix.EBADF | Unix.ENOTSOCK) "accept" _ as x -> (* oops! *) raise x | Sys_error "Broken pipe" -> () | exc -> print_err_exc exc ]; try wflush () with [ Sys_error _ -> () ]; try flush stdout with [ Sys_error _ -> () ]; flush stderr; }; } ] ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/wserver/pa_macro5.ml0000660000175200017530000003517012664543647024324 0ustar guillaumeguillaume(* camlp5r pa_extend.cmo q_MLast.cmo *) (* $Id: pa_macro5.ml,v 5.2 2011-01-17 13:21:53 ddr Exp $ *) (* Copyright (c) INRIA 2007-2010 *) (* Added statements: In structure items: DEFINE DEFINE = DEFINE = IFDEF THEN END IFDEF THEN ELSE END IFNDEF THEN END IFNDEF THEN ELSE END In signature items: DEFINE DEFINE = DEFINE = IFDEF THEN END IFDEF THEN ELSE END IFNDEF THEN END IFNDEF THEN ELSE END In expressions: IFDEF THEN ELSE END IFNDEF THEN ELSE END __FILE__ __LOCATION__ In patterns: IFDEF THEN ELSE END IFNDEF THEN ELSE END In types: IFDEF THEN ELSE END IFNDEF THEN ELSE END In constructors declarations, record label declarations and in match cases: IFDEF THEN ELSE END IFNDEF THEN ELSE END IFDEF THEN END IFNDEF THEN END A is either: OR AND NOT ( ) As Camlp5 options: -D -U After having used a DEFINE followed by "= ", you can use it in expressions *and* in patterns. If the expression defining the macro cannot be used as a pattern, there is an error message if it is used in a pattern. If the expression body of a DEFINE contains the identifier EVAL, the expression is evaluated at compile time. Only some kinds of expressions are interpreted (Char.chr, Char.code, binary + and -, characters, integers). The expression __FILE__ returns the current compiled file name. The expression __LOCATION__ returns the current location of itself. *) open Pcaml; type macro_value = [ MvExpr of list string and MLast.expr | MvType of list string and MLast.ctyp | MvNone ] ; type item_or_def 'a = [ SdStr of 'a | SdDef of string and macro_value | SdUnd of string | SdNop ] ; value rec list_remove x = fun [ [(y, _) :: l] when y = x -> l | [d :: l] -> [d :: list_remove x l] | [] -> [] ] ; value oversion = String.map (fun [ '0'..'9' as c -> c | _ -> '_' ]) Sys.ocaml_version ; value defined = ref [("CAMLP5", MvNone); ("CAMLP5_4_02", MvNone); ("CAMLP5_5_00", MvNone); ("OCAML_" ^ oversion, MvNone)] ; value is_defined i = (i = "STRICT" && Pcaml.strict_mode.val) || List.mem_assoc i defined.val ; value print_defined () = do { let deflist = if Pcaml.strict_mode.val then [("STRICT", MvNone) :: defined.val] else defined.val in List.iter (fun (d, v) -> do { print_string d; match v with [ MvExpr _ _ -> print_string " = " | MvType _ _ -> print_string " = " | MvNone -> () ]; print_newline () }) deflist; if Sys.interactive.val then () else exit 0 }; value loc = Ploc.dummy; value subst mloc env = loop where rec loop = fun [ <:expr< let $flag:rf$ $list:pel$ in $e$ >> -> let pel = List.map (fun (p, e) -> (p, loop e)) pel in <:expr< let $flag:rf$ $list:pel$ in $loop e$ >> | <:expr< if $e1$ then $e2$ else $e3$ >> -> <:expr< if $loop e1$ then $loop e2$ else $loop e3$ >> | <:expr< $e1$ $e2$ >> -> <:expr< $loop e1$ $loop e2$ >> | <:expr< $lid:x$ >> | <:expr< $uid:x$ >> as e -> try <:expr< $anti:List.assoc x env$ >> with [ Not_found -> e ] | <:expr< ($list:x$) >> -> <:expr< ($list:List.map loop x$) >> | <:expr< { $list:pel$ } >> -> let pel = List.map (fun (p, e) -> (p, loop e)) pel in <:expr< { $list:pel$ } >> | e -> e ] ; value substp mloc env = loop where rec loop = fun [ <:expr< $e1$ . $e2$ >> -> <:patt< $loop e1$ . $loop e2$ >> | <:expr< $e1$ $e2$ >> -> <:patt< $loop e1$ $loop e2$ >> | <:expr< $lid:x$ >> -> try <:patt< $anti:List.assoc x env$ >> with [ Not_found -> <:patt< $lid:x$ >> ] | <:expr< $uid:x$ >> -> try <:patt< $anti:List.assoc x env$ >> with [ Not_found -> <:patt< $uid:x$ >> ] | <:expr< $int:x$ >> -> <:patt< $int:x$ >> | <:expr< $chr:x$ >> -> <:patt< $chr:x$ >> | <:expr< $str:x$ >> -> <:patt< $str:x$ >> | <:expr< ($list:x$) >> -> <:patt< ($list:List.map loop x$) >> | <:expr< { $list:pel$ } >> -> let ppl = List.map (fun (p, e) -> (p, loop e)) pel in <:patt< { $list:ppl$ } >> | x -> Ploc.raise mloc (Failure "this macro cannot be used in a pattern (see its definition)") ] ; value substt mloc env = loop where rec loop = fun [ <:ctyp< $t1$ -> $t2$ >> -> <:ctyp< $loop t1$ -> $loop t2$ >> | <:ctyp< $t1$ $t2$ >> -> <:ctyp< $loop t1$ $loop t2$ >> | <:ctyp< ($list:tl$) >> -> <:ctyp< ($list:List.map loop tl$) >> | <:ctyp< $lid:x$ >> | <:ctyp< $uid:x$ >> as t -> try List.assoc x env with [ Not_found -> t ] | t -> t ] ; value cannot_eval e = let loc = MLast.loc_of_expr e in Ploc.raise loc (Stream.Error "can't eval") ; value rec eval = fun [ <:expr< Char.chr $e$ >> -> match eval e with [ <:expr< $int:i$ >> -> let c = Char.escaped (Char.chr (int_of_string i)) in <:expr< $chr:c$ >> | e -> cannot_eval e ] | <:expr< Char.code $e$ >> -> match eval e with [ <:expr< $chr:c$ >> -> let i = string_of_int (Char.code (Token.eval_char c)) in <:expr< $int:i$ >> | e -> cannot_eval e ] | <:expr< $op$ $x$ $y$ >> -> let f = eval op in let x = eval x in let y = eval y in match (x, y) with [ (<:expr< $int:x$ >>, <:expr< $int:y$ >>) -> let x = int_of_string x in let y = int_of_string y in match f with [ <:expr< $lid:"+"$ >> -> <:expr< $int:string_of_int (x + y)$ >> | <:expr< $lid:"-"$ >> -> <:expr< $int:string_of_int (x - y)$ >> | <:expr< $lid:"lor"$ >> -> let s = Printf.sprintf "0o%o" (x lor y) in <:expr< $int:s$ >> | _ -> cannot_eval op ] | _ -> cannot_eval op ] | <:expr< $uid:x$ >> as e -> try match List.assoc x defined.val with [ _ -> e ] with [ Not_found -> e ] | <:expr< $chr:_$ >> | <:expr< $int:_$ >> | <:expr< $lid:_$ >> as e -> e | e -> cannot_eval e ] ; value may_eval = fun [ <:expr< EVAL $e$ >> -> eval e | e -> e ] ; value incorrect_number loc l1 l2 = Ploc.raise loc (Failure (Printf.sprintf "expected %d parameters; found %d" (List.length l2) (List.length l1))) ; module Reloc = struct value expr _ _ e = e; value patt _ _ p = p; end ; value define eo x = do { match eo with [ MvExpr [] e -> EXTEND expr: LEVEL "simple" [ [ UIDENT $x$ -> may_eval (Reloc.expr (fun _ -> loc) 0 e) ] ] ; patt: LEVEL "simple" [ [ UIDENT $x$ -> let p = substp loc [] e in Reloc.patt (fun _ -> loc) 0 p ] ] ; END | MvExpr sl e -> EXTEND expr: LEVEL "apply" [ [ UIDENT $x$; param = SELF -> let el = match param with [ <:expr< ($list:el$) >> -> el | e -> [e] ] in if List.length el = List.length sl then let env = List.combine sl el in let e = subst loc env e in may_eval (Reloc.expr (fun _ -> loc) 0 e) else incorrect_number loc el sl ] ] ; patt: LEVEL "simple" [ [ UIDENT $x$; param = SELF -> let pl = match param with [ <:patt< ($list:pl$) >> -> pl | p -> [p] ] in if List.length pl = List.length sl then let e = may_eval (Reloc.expr (fun _ -> loc) 0 e) in let env = List.combine sl pl in let p = substp loc env e in Reloc.patt (fun _ -> loc) 0 p else incorrect_number loc pl sl ] ] ; END | MvType [] t -> EXTEND ctyp: LEVEL "simple" [ [ UIDENT $x$ -> t ] ] ; END | MvType sl t -> EXTEND ctyp: LEVEL "apply" [ [ UIDENT $x$; param = SELF -> let tl = match param with [ <:ctyp< ($list:tl$) >> -> tl | t -> [t] ] in if List.length tl = List.length sl then let env = List.combine sl tl in let t = substt loc env t in t else incorrect_number loc tl sl ] ] ; END | MvNone -> () ]; defined.val := [(x, eo) :: defined.val] }; value undef x = try do { let eo = List.assoc x defined.val in match eo with [ MvExpr [] _ -> do { DELETE_RULE expr: UIDENT $x$ END; DELETE_RULE patt: UIDENT $x$ END; } | MvExpr _ _ -> do { DELETE_RULE expr: UIDENT $x$; SELF END; DELETE_RULE patt: UIDENT $x$; SELF END; } | MvType [] _ -> do { DELETE_RULE ctyp: UIDENT $x$ END; } | MvType _ _ -> do { DELETE_RULE ctyp: UIDENT $x$; SELF END; } | MvNone -> () ]; defined.val := list_remove x defined.val } with [ Not_found -> () ] ; EXTEND GLOBAL: expr patt str_item sig_item constructor_declaration match_case; str_item: FIRST [ [ x = str_macro_def -> match x with [ SdStr [si] -> si | SdStr sil -> <:str_item< declare $list:sil$ end >> | SdDef x eo -> do { define eo x; <:str_item< declare end >> } | SdUnd x -> do { undef x; <:str_item< declare end >> } | SdNop -> <:str_item< declare end >> ] ] ] ; sig_item: FIRST [ [ x = sig_macro_def -> match x with [ SdStr [si] -> si | SdStr sil -> <:sig_item< declare $list:sil$ end >> | SdDef x eo -> do { define eo x; <:sig_item< declare end >> } | SdUnd x -> do { undef x; <:sig_item< declare end >> } | SdNop -> <:sig_item< declare end >> ] ] ] ; str_macro_def: [ [ "DEFINE"; i = uident; def = opt_macro_expr -> SdDef i def | "DEFINE_TYPE"; i = uident; def = opt_macro_type -> SdDef i def | "UNDEF"; i = uident -> SdUnd i | "IFDEF"; e = dexpr; "THEN"; d = str_item_or_macro; "END" -> if e then d else SdNop | "IFDEF"; e = dexpr; "THEN"; d1 = str_item_or_macro; "ELSE"; d2 = str_item_or_macro; "END" -> if e then d1 else d2 | "IFNDEF"; e = dexpr; "THEN"; d = str_item_or_macro; "END" -> if e then SdNop else d | "IFNDEF"; e = dexpr; "THEN"; d1 = str_item_or_macro; "ELSE"; d2 = str_item_or_macro; "END" -> if e then d2 else d1 ] ] ; sig_macro_def: [ [ "DEFINE"; i = uident; def = opt_macro_type -> SdDef i def | "DEFINE_TYPE"; i = uident; def = opt_macro_type -> SdDef i def | "UNDEF"; i = uident -> SdUnd i | "IFDEF"; e = dexpr; "THEN"; d = sig_item_or_macro; "END" -> if e then d else SdNop | "IFDEF"; e = dexpr; "THEN"; d1 = sig_item_or_macro; "ELSE"; d2 = sig_item_or_macro; "END" -> if e then d1 else d2 | "IFNDEF"; e = dexpr; "THEN"; d = sig_item_or_macro; "END" -> if e then SdNop else d | "IFNDEF"; e = dexpr; "THEN"; d1 = sig_item_or_macro; "ELSE"; d2 = sig_item_or_macro; "END" -> if e then d2 else d1 ] ] ; str_item_or_macro: [ [ d = str_macro_def -> d | si = LIST1 str_item -> SdStr si ] ] ; sig_item_or_macro: [ [ d = sig_macro_def -> d | si = LIST1 sig_item -> SdStr si ] ] ; opt_macro_expr: [ [ pl = macro_param; "="; e = expr -> MvExpr pl e | "="; e = expr -> MvExpr [] e | -> MvNone ] ] ; opt_macro_type: [ [ pl = LIST1 LIDENT; "="; t = ctyp -> MvType pl t | "="; t = ctyp -> MvType [] t | -> MvNone ] ] ; macro_param: [ [ sl = LIST1 LIDENT -> sl | "("; sl = LIST1 LIDENT SEP ","; ")" -> sl ] ] ; expr: LEVEL "top" [ [ "IFDEF"; e = dexpr; "THEN"; e1 = SELF; "ELSE"; e2 = SELF; "END" -> if e then e1 else e2 | "IFNDEF"; e = dexpr; "THEN"; e1 = SELF; "ELSE"; e2 = SELF; "END" -> if e then e2 else e1 ] ] ; expr: LEVEL "simple" [ [ LIDENT "__FILE__" -> <:expr< $str:Pcaml.input_file.val$ >> | LIDENT "__LOCATION__" -> let bp = string_of_int (Ploc.first_pos loc) in let ep = string_of_int (Ploc.last_pos loc) in <:expr< ($int:bp$, $int:ep$) >> ] ] ; patt: [ [ "IFDEF"; e = dexpr; "THEN"; p1 = SELF; "ELSE"; p2 = SELF; "END" -> if e then p1 else p2 | "IFNDEF"; e = dexpr; "THEN"; p1 = SELF; "ELSE"; p2 = SELF; "END" -> if e then p2 else p1 ] ] ; constructor_declaration: FIRST [ [ "IFDEF"; e = dexpr; "THEN"; x = SELF; "END" -> if e then x else Grammar.skip_item x | "IFDEF"; e = dexpr; "THEN"; x = SELF; "ELSE"; y = SELF; "END" -> if e then x else y | "IFNDEF"; e = dexpr; "THEN"; x = SELF; "END" -> if e then Grammar.skip_item x else x | "IFNDEF"; e = dexpr; "THEN"; x = SELF; "ELSE"; y = SELF; "END" -> if e then y else x ] ] ; match_case: FIRST [ [ "IFDEF"; e = dexpr; "THEN"; x = SELF; "END" -> if e then x else Grammar.skip_item x | "IFDEF"; e = dexpr; "THEN"; x = SELF; "ELSE"; y = SELF; "END" -> if e then x else y | "IFNDEF"; e = dexpr; "THEN"; x = SELF; "END" -> if e then Grammar.skip_item x else x | "IFNDEF"; e = dexpr; "THEN"; x = SELF; "ELSE"; y = SELF; "END" -> if e then y else x ] ] ; dexpr: [ [ x = SELF; "OR"; y = SELF -> x || y ] | [ x = SELF; "AND"; y = SELF -> y && y ] | [ "NOT"; x = SELF -> not x ] | [ i = uident -> is_defined i | "("; x = SELF; ")" -> x ] ] ; uident: [ [ i = UIDENT -> i ] ] ; END; Pcaml.add_option "-D" (Arg.String (define MvNone)) " Define for IFDEF instruction."; Pcaml.add_option "-U" (Arg.String undef) " Undefine for IFDEF instruction."; Pcaml.add_option "-defined" (Arg.Unit print_defined) " Print the defined macros and exit."; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/wserver/.depend0000660000175200017530000000006412664543647023356 0ustar guillaumeguillaumewserver.cmo: wserver.cmi wserver.cmx: wserver.cmi geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/wserver/wserver.mli0000660000175200017530000001024112664543647024314 0ustar guillaumeguillaume(* $Id: wserver.mli,v 5.5 2007-05-24 15:03:22 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) (* module [Wserver]: elementary web service *) value f : option string -> int -> int -> option int -> ((Unix.sockaddr * list string) -> string -> string -> unit) -> unit ; (* [Wserver.f addr port tmout maxc g] starts an elementary httpd server at port [port] in the current machine. The variable [addr] is [Some the-address-to-use] or [None] for any of the available addresses of the present machine. The port number is any number greater than 1024 (to create a client < 1024, you must be root). At each connection, the function [g] is called: [g (addr, request) scr cont] where [addr] is the client identification socket, [request] the browser request, [scr] the script name (extracted from [request]) and [cont] the stdin contents . The function [g] has [tmout] seconds to answer some text on standard output. If [maxc] is [Some n], maximum [n] clients can be treated at the same time; [None] means no limit. See the example below. *) value wprint : format4 'a unit string unit -> 'a; (* To be called to print page contents. *) value wflush : unit -> unit; (* To flush page contents print. *) value wrap_string : ref (string -> string); (* To specify a function which may transform the string printed by [sprint] below. *) value http : string -> unit; (* [Wserver.http answer] sends the http header where [answer] represents the answer status. If empty string, "200 OK" is assumed. *) value encode : string -> string; (* [Wserver.encode s] encodes the string [s] in another string where spaces and special characters are coded. This allows to put such strings in html links . This is the same encoding done by Web browsers in forms. *) value decode : string -> string; (* [Wserver.decode s] does the inverse job than [Wserver.code], restoring the initial string. The heading and trailing spaces are stripped. *) value gen_decode : bool -> string -> string; (* Like above but heading and trailing spaces are stripped only if bool parameter is True. [decode] = [gen_decode True]. *) value extract_param : string -> char -> list string -> string; (* [extract_param name stopc request] can be used to extract some parameter from a browser [request] (list of strings); [name] is a string which should match the beginning of a request line, [stopc] is a character ending the request line. For example, the string request has been obtained by: [extract_param "GET /" ' ']. Answers the empty string if the parameter is not found. *) value get_request_and_content : Stream.t char -> (list string * string); value wsocket : unit -> Unix.file_descr; value sock_in : ref string; value sock_out : ref string; (* Names of the files used in windows implementation to communicate http requests and html answers. Default "wserver.sin" and "wserver.sou". Can have relative or absolute paths. *) value stop_server : ref string; (* Name of the file whose presence tells the server to stop (at least one request is necessary to unfreeze the server to make it check that this file exits. Default "STOP_SERVER". Can have relative or absolute path. *) value noproc : ref bool; (* Example: - Source program "foo.ml": Wserver.f None 2371 60 None (fun _ s _ -> Wserver.html ""; Wserver.wprint "You said: %s...\n" s);; - Compilation: ocamlc -custom unix.cma -cclib -lunix wserver.cmo foo.ml - Run: ./a.out - Launch a Web browser and open the location: http://localhost:2368/hello (but see the remark below) - You should see a new page displaying the text: You said: hello... Possible problem: if the browser says that it cannot connect to "localhost:2368", try: "localhost.domain:2368" (the domain where your machine is) "127.0.0.1:2368" "machine:2368" (your machine name) "machine.domain:2368" (your machine name) "addr:2368" (your machine internet address) *) geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/etc/0002770000175200017530000000000012664543647021175 5ustar guillaumeguillaumegeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/etc/START.htm0000660000175200017530000002415112664543647022606 0ustar guillaumeguillaume GeneWeb geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/etc/MacOSX/0002770000175200017530000000000012664543647022267 5ustar guillaumeguillaumegeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/etc/MacOSX/GeneWeb.command0000770000175200017530000000225312664543647025146 0ustar guillaumeguillaume#!/bin/sh case "$LANG" in de*) LANG=de;; es*) LANG=es;; fr*) LANG=fr;; it*) LANG=it;; lv*) LANG=lv;; sv*) LANG=sv;; *) LANG=en;; esac DIR=`dirname $0`/ BASE=`dirname $0`/bases cd $DIR DIR=$PWD export LANG # echo -n "]2;GeneWeb" # echo -n "]1;GeneWeb" pids="" trap 'kill $pids' 1 2 if [ -f gwsetup.log ]; then mv gwsetup.log gwseup.log.old fi mkdir -p "$BASE" cd "$BASE" if [ -f gwd.log ]; then mv gwd.log gwd.log.old fi if test "$LANG" = "fr"; then echo "Demarrage de gwsetup..." else echo "Starting gwsetup..." fi "$DIR/gw/gwsetup" -gd "$DIR/gw" -lang $LANG > gwsetup.log 2>&1 & pid=$! sleep 1 if test "`ps $pid | wc -l`" -ne 2; then if test "$LANG" = "fr"; then echo Echec; else echo Failed; fi cat exit 1 fi pids="$pids $pid" if test "$LANG" = "fr"; then echo "Demarrage de gwd..." else echo "Starting gwd..." fi "$DIR/gw/gwd" -hd "$DIR/gw" > gwd.log 2>&1 & pids="$pids $!" echo if test "$LANG" = "fr"; then echo "Gardez cette fenetre ouverte tant que" echo "vous voulez utiliser GeneWeb dans votre" echo "navigateur" else echo "Keep this window open while you" echo "are using GeneWeb on your browser" fi open "$DIR/START.htm" cat geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/etc/a.gwf0000660000175200017530000003566012664543647022133 0ustar guillaumeguillaume# $Id: a.gwf,v 5.12 2007-01-23 14:24:10 ddr Exp $ # # Using body_prop to customize background, color is deprecated !!! # Please, use instead css_prop or customize default.css # Parameters in "" (background, color, etc) # Here is a palette of possibilities... test and choose one of them # if you want by removing the initial "#" # body_prop=bgcolor=#FFFFFF text=#333333 link=#006699 vlink=#999900 # body_prop=bgcolor=#FFFFEE text=#000000 link=#006699 vlink=#990000 # body_prop=bgcolor=#CCCCCC text=#000000 link=#0000CC vlink=#660066 # body_prop=bgcolor=#FFFF00 text=#FF6600 link=#FF0033 vlink=#336633 # body_prop=bgcolor=#CCCC66 text=#330000 link=#CC0000 vlink=#003300 # body_prop=bgcolor=#FFFF99 text=#330000 link=#CC0000 vlink=#333333 # body_prop=bgcolor=#99CCCC text=#000066 link=#0000CC vlink=#003366 # body_prop=bgcolor=#CC99FF text=#000000 link=#FF0033 vlink=#660066 # body_prop=bgcolor=#CCFF99 text=#666600 link=#006699 vlink=#003300 # body_prop=bgcolor=#FFCC00 text=#330000 link=#CC0000 vlink=#660066 # body_prop=bgcolor=#00FF33 text=#0000CC link=#FF0099 vlink=#660066 # body_prop=bgcolor=#006699 text=#CCFFCC link=#FFFF00 vlink=#00FFFF # body_prop=bgcolor=#330000 text=#FF6666 link=#FFCC00 vlink=#CCFF99 # body_prop=bgcolor=#003300 text=#CCCC66 link=#FFFFFF vlink=#FFFF00 # body_prop=bgcolor=#333333 text=#CCCCCC link=#FF6666 vlink=#CCCC66 # body_prop=bgcolor=#666600 text=#FFFFFF link=#FFFF00 vlink=#99CCFF # body_prop=bgcolor=#000000 text=#99CCFF link=#FFFF00 vlink=#CCCC66 # body_prop=bgcolor=#333333 text=#FFFFFF link=#99CCFF vlink=#CC99FF # body_prop=bgcolor=#CC0000 text=#FFFFFF link=#FFFF00 vlink=#00FFFF # For a background pattern, e.g. foo.jpg: # body_prop=background="geneweb?m=IM;v=/foo.jpg" # the file foo.jpg must be in the directory "images" # on CGI mode, replace 'geneweb' by the name of the CGI # css_prop # The file stylesheet.css must be in the directory "css". # Customize the default.css stylesheet or create your own one and # specify it to geneweb by adding this line in your gwf. # More about how to customize here : # http://opensource.geneanet.org/projects/geneweb/wiki/en_css css_prop=stylesheet # Highlight color highlight_color=#2f6400 # Friend can see all dates # Choose a password or leave it empty # Form: "user_id:password" or just "password" friend_passwd= # Alternative way for friend entry: authorization file. # The file must hold lines of the form "user:password". friend_passwd_file= # Wizard can see all dates and update the base # Choose a password or leave it empty # Form: "user_id:password" or just "password" wizard_passwd= # Alternative way for wizard entry: authorization file. # The file must hold lines of the form either: # user:password # user:password:comment # user:password:complete name:comment # The "complete name" is used in the page displaying the wizards by # alphabetic order and in wizard pages. If the wizard line contains # no complete name, the "user" is used. # The alphabetic order can be changed by adding a slash in the "complete # name" at the position you want the alphabetic comparison take place. For # example, with "Daniel de /Rauglaudre" as "complete name", it is ordered # at letter "R" (like "Rauglaudre") and in the form: # Rauglaudre (Daniel de) # but it his wizard page, it is displayed as "Daniel de Rauglaudre" without # the slash. wizard_passwd_file= # Manitou is a wizard who can: # - delete any forum message # - edit any wizard's notes # - see all connected wizards # - always see consanguinities # - stay wizard even when wizard_just_friend is set # - can apply a request "sleep=xx" to sleep xx seconds after a request # (useful e.g. to have time to look at the memory used) # Hir changes in database are not recorded in the history. # The variable must contain the wizard's user name: # manitou= # Wizards moderators file. # List of wizards moderating the database forum. # If empty or empty file, no moderation. # One wizard name by line. moderator_file= # Forum supervisor. The forum is not moderated but controlled afterwards. # This supervisor is a wizard who can delete any forum message. He can # see the real wizards or friend user names (since they can be hidden in # the "ident" area) and the IP address the message comes from. supervisor= # Notify change program (e.g. shell script) to be executed for each # database change. First argument is the name of the base, then the # individual and finaly the action performed. # If you want to test a specific change, such as, delete an individual, # you should test the fourth argument as equal to dp (delete person). # You can check the list of possible modifications in the updhist.txt file # (see update_text). # notify_change= # Wizard loosing his powers, becoming just a "friend" # Set it to "yes" or "no" wizard_just_friend=no # Generates pages with DOCTYPE HTML 4.01 (default XHTML 1.1) # doctype=html-4.01 # File recording a black list for the database forum. # forum_exclude_file= # Number of years for private access. Dates of persons whose age < this value # are not displayed (except for wizards, friends and public persons). private_years=150 # Hide the private persons names ("x" is displayed instead of their first # name or surname). hide_private_names=no # More restricted system to hide private names; the hidden persons are # not clickable, the links to their children, ancestors and spouses are # not accessible. use_restrict=no # Default language default_lang=fr # Authorization for wizards to send images (no: cannot; yes: can) can_send_image=yes # Maximum images size in bytes (which can be accepted in "send image"). # Default: no limit # max_images_size=... # Show consanguinity (if computed) in personal pages show_consang=yes # Death symbol in dates (default: christians' one) # death_symbol=† # Birth symbol in dates (default: christians' one) # birth_symbol=° # Allow the usage of the request m=KILL_ANC can_kill_ancestors=no # Optional path for images defined by the "image" field (i.e. *not* added # by "send image"). Applies only for images not found in the image/base # directory. This value, when set, could typically start with http://... # or file://... images_path= # Don't search images if normal visitor (i.e. neither "wizard" nor "friend"). # Useful if the images are hosted in a site protected by a password that # only wizards and friend know. no_image_for_visitor=no # Don't search notes if normal visitor (i.e. neither "wizard" nor "friend"). # Notes = individual note or Marriage note. no_note_for_visitor=yes/no # Global authorization file for this database (overriding the value # of the option "-auth" of "gwd"). This file must hold lines of the # form "user:password". Works only in server (not cgi) mode. auth_file= # Access by key, when set to "yes", generates HTML requests with # "n=first+name;p=surname;oc=number" instead of (shorter) "i=integer" # in URLs. Useful e.g. when doing a cleanup of the database (where the # integer access for persons may change) to let the service continue # correctly. access_by_key=no # Set to no if you don't want that the search by (nobility) titles be # proposed in the welcome page. propose_titles=yes # File for allowed titles/domains (empty => all allowed) allowed_titles_file= # After above, file for denied titles/domains denied_titles_file= # Print the tile of individual in an advanced way. Default is print only # first_name and surname. In the advanced way, search for the title name, # estate ... and print something clever. print_advanced_title=yes/no # Set to no if you don't want that the link "add a family" be added in # the welcome page for wizards. In "no", forbid also adding families not # connected to the rest. propose_add_family=yes # Set to no if you don't want the request by place/surname to be # proposed in the welcome page. propose_place_surname=yes # Set to yes if you want that the access to surnames and first names by # alphabetic order be fast (interesting for very big databases). Drawback: # the first page does not display the number of surname or first names fast_alphabetic=no # Link in the display place/surname point to some individual concerned # by the place (yes) or to the whole surname (no) place_surname_link_to_ind=no # Set to no if you want the advanced request link to be displayed hide_advanced_request=yes # Maximum level when displaying ancestors max_anc_level=8 # Maximum level when displaying ancestors by tree max_anc_tree=7 # Maximum_level when displaying descendants max_desc_level=12 # Maximum_level when displaying descendants by tree max_desc_tree=4 # Maximum number of displayed cousins max_cousins=2000 # Maximum level of displayed cousins max_cousins_level=5 # Number of latest events (birth, death) displayed latest_event=20 # Always display the children surnames even if same than father. # Applies in descendants page and in surname displaying page. # "yes" = do it; "no" = don't always_surname=no # History: set it to yes to save update traces in database (in file named # "history" in the database directory "base.gwb"). When such a file exists, # a link is displayed in the welcome page. # Warning: this text file grows indefinitively... you can edit it to remove # the old information if you want (oldest = begin of file) or you can remove # it when it is too large, if you prefer. history=no # History: set it to yes to save update traces in database (in a directory # named "history_d" in the database directory "base.gwb" or the directory # specified by history_path (view below)). It allows you to see the differences # between two modifications. # Warning: this directory grows indefinitively... history_diff=no # You can define a specific path where to store all the histories. If you # don't specify it, it will save the history in your database directory # (which is juste fine). history_path= # Consider persons having titles as public, i.e. even not friends can see # their dates; "yes" = consider; "no" = don't consider public_if_titles=no # Consider all persons having no date (birth, baptism, death, burial) as # public (except if their access is explicitely set to "private"); # "yes" = consider; "no" = don't consider public_if_no_date=no # Tell that in this database the order of places are registered inverted # (being more general to less general), e.g. "USA, New York" instead of # "New York, USA". Set it to "yes" if it is the case. Important for display # by places/surnames. places_inverted=no # Uncomment the following definition to specify that the present database has # been renamed: #renamed=newname # Select a default Sosa reference while navigating. This must be the # person's key (first-name dot number space surname). #default_sosa_ref=john.3 smith # Uncomment the following definition to specify that the present database has # been moved to another site: #moved=http://newaddress/and-so-on/ # Templates. # # Some pages, not all, have templates, including: # - the welcome page, welcome.txt # - the personal page, perso.txt # - the update person form, updind.txt # - the update family form, updfam.txt # The standard templates are located in the etc directory of the GeneWeb # distribution. # # Other templates can be added in the databases directory in a subdirectory # also named etc: e.g. etc/foo/perso.txt, etc/bar/perso.txt, # and so on. # # The "template" variable tells which templates are allowed for this # database and gives the default template. It is a list of directories # separated by commas. Empty directory means "the standard template". # Star means "any template". The first of the list gives the default # template # to be used. Examples: # # template=* any template allowed; default = standard one # template=foo,* any template allowed; default = foo # template=foo,bar only foo and bar templates allowed # template=foo, only foo and standard template allowed; default = foo # template=,foo only foo and standard template allowed; default = standard # template= only standard template allowed # template=foo only foo template allowed # # Default is template=database-name,* # The template to be used can be changed by adding ";templ=foo" in the URL # #template=a,* # Customized variables. # # You can define any variable here, starting with "var_". # # They will be replaced in the displayed "notes", "sources", "comments" # and in the database forum. If the variable name is "var_something", # it replaces all occurrences of "%vsomething;" in these texts. # # Example. if you define here: # var_who=Bond, James Bond # and if the notes is "My name is %vwho;.", the displayed text in the notes # will be: # My name is Bond, James Bond. expand_env=no # If yes, expand the (system) environment variables found in the values of # the customized variables. You can write ${xxx} to expand the variable # xxx. E.g., if HOME is /home/smith and if you define: # var_foo=my home is ${HOME}, guys! # the customized variable %vfoo; is expanded into: # my home is /home/smith, guys! # The default is "no" because it may be a security hole to allow accomodated # databases in a Web site to show the environment variables of the command # gwd. Check that before putting "expand_env" to "yes". # Message of the day. If set, display this message in the welcome page. # Can contain html tags. #motd= # Display the compilation time at bottom of pages. # display_compilation_time=off # Display the date with the explicit day in parenthesis. # Only works if the date is "exact" and *not* enter in "text mode" #long_date=yes/no # If disable_forum is set to yes, then all the request on the forum # are considered 'incorect request'. Default behaviour is that the forum # is *not* disable #disable_forum=yes/no # If counter is set to no, the counter for visiting geneweb's web pages is # *not* incremented. Default behaviour is that the counter is on (set to yes). #counter=yes/no # Default value if not specified is 5000 (which means that it will # take at most 5 seconds to realize a set of modifications (such as the # "set of places", "set of sources" ... #max_nb_update=2000 # Authorized wizards notes. By default, wizards notes are not allowed. #authorized_wizards_notes=yes/no # Custom the individual page. # Full documentation here http://opensource.geneanet.org/projects/geneweb/wiki/Fr_Template#Personnalisation-de-toutes-les-pages # # Basic explanation : # Add the element you want like this : #perso_module_0=etat_civil #perso_module_1=parent_simple #perso_module_2=union_simple #perso_module_3=freresoeur_simple #perso_module_4=relations #perso_module_5=notes #perso_module_6=sources #perso_module_7=arbre_3gen_v_photo # And the number of module #perso_module_tplnb=8 # List of available elements : # etat_civil # parent_simple # parent_evolue # parent_complet # parent_photo # union_simple # union_evolue # union_complet # union_photo # freresoeur_simple # freresoeur_complet # famille # relations # notes # sources # arbre_3gen_v # arbre_3gen_v_photo # arbre_4gen_v # arbre_5gen_h # display the picto sosa on the template perso.txt (individual page). #display_sosa=yes/no # display the individual in his 'own' siblings on the template perso.txt # (individual page). #full_siblings=yes/no geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/etc/Windows/0002770000175200017530000000000012664543647022627 5ustar guillaumeguillaumegeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/etc/Windows/icons/0002770000175200017530000000000012664543647023742 5ustar guillaumeguillaumegeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/etc/Windows/icons/gw_doc.ico0000660000175200017530000002362612664543647025710 0ustar guillaumeguillaume(fhŽ èö ¨Þ 00h†00¨î( €€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿwwwswpÿÿøpÈÿúªêp Š(fp<ÌÉd Ÿ€3LÇtʃŠp7LOÿúžêp¼ÌÌÄúÿp;ÏôÄÿÿpC¼ÌOÿÿpÌÄüÿÿpÿüÏÿÿÿÿÿ€ÿÿÿÿxˆˆˆˆ€àààÀ €€Àààààà( €€€€€€€€€ÀÀÀÀÜÀðʦ """)))UUUMMMBBB999€|ÿPPÿ“ÖÿìÌÆÖïÖçç©­3f™Ì3333f3™3Ì3ÿff3fff™fÌfÿ™™3™f™™™Ì™ÿÌÌ3ÌfÌ™ÌÌÌÿÿfÿ™ÿÌ3333f3™3Ì3ÿ3333333f33™33Ì33ÿ3f3f33ff3f™3fÌ3fÿ3™3™33™f3™™3™Ì3™ÿ3Ì3Ì33Ìf3Ì™3ÌÌ3Ìÿ3ÿ33ÿf3ÿ™3ÿÌ3ÿÿff3fff™fÌfÿf3f33f3ff3™f3Ìf3ÿffff3fffff™ffÌf™f™3f™ff™™f™Ìf™ÿfÌfÌ3fÌ™fÌÌfÌÿfÿfÿ3fÿ™fÿÌÌÿÿÌ™™™3™™™™Ì™™33™f™3Ì™ÿ™f™f3™3f™f™™fÌ™3ÿ™™3™™f™™™™™Ì™™ÿ™Ì™Ì3fÌf™Ì™™ÌÌ™Ìÿ™ÿ™ÿ3™Ìf™ÿ™™ÿÌ™ÿÿÌ™3ÌfÌ™ÌÌ™3Ì33Ì3fÌ3™Ì3ÌÌ3ÿÌfÌf3™ffÌf™ÌfÌ™fÿ̙̙3Ì™fÌ™™Ì™ÌÌ™ÿÌÌÌÌ3ÌÌfÌÌ™ÌÌÌÌÌÿÌÿÌÿ3™ÿfÌÿ™ÌÿÌÌÿÿÌ3ÿfÿ™Ì3ÿ33ÿ3fÿ3™ÿ3Ìÿ3ÿÿfÿf3Ìffÿf™ÿfÌÌfÿÿ™ÿ™3ÿ™fÿ™™ÿ™Ìÿ™ÿÿÌÿÌ3ÿÌfÿÌ™ÿÌÌÿÌÿÿÿ3Ìÿfÿÿ™ÿÿÌffÿfÿffÿÿÿffÿfÿÿÿf!¥___www†††–––ËË˲²²×××ÝÝÝãããêêêñññøøøðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿÿÿÿ ë ë¼¼¼¼¼¼¼*¼¼¼ ëóóó¼$¼¼ §ëÿôö›››$v›¼¼ § ŠŠŠw{IJHB¼§f§ÎÎνdžDio›’ês¦ÎΧΛ–#r˜¼ët­Î¬ööôö›ã››w¼ ëšÎ¬¬¬¬¬¬ó›¼ s ¬öö§Ù¬ôóó¼ ‘»§§è¬ôöôó¼’ ¬¬¬¬öÎôö¼’ë ëÿöö¬¬öööCCC ëÿööööööö’ö ëÿÿÿÿÿÿÿÿ’ ëììììììììì àààÀ €€Àààààà( @€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ‡wwwwww8ƒ7wpÿÿÿÿÿÿó8ÿÿpÿÿÿÿÿ €ÿÿpÿÿÿÿ¢pÿÿÿÿîªa®¯pÌÏÿÿÿÿêÆ ¿pLŒîfac¦jpLDÌÌÀN†¦.î ÄDLÌÌÊÈŒ"ˆŽî ÄDÌDLÌ®  Iÿpî ¨<ÌDÄÌOÿÿÿðDDN˜šîª«»®îsÌÄLÌOÿÿÿÿÿÿþ™šh˜®îp7ÌÄÌÌîîd–ªª¨ÿp7<ÌLÌÌÌÌÌÌÌÌÌîîª ÿp3¼ÌÌÌÌÌÌÌÌÌÌÌNïþªªª¯ÿp;³ÌÌÌÌÌÌÌÌÌÌÌOÿþªªÿÿpC¿ÌÌÌDDDDDÌÌÌOÿÿ¦ÿÿÿÿp;¼ÌÌOÿÿÿÌÌÌOÿÿÿÿÿÿÿpCûÌÌOÿÿÿÌÌÄÿÿÿÿÿÿÿÿpD;¼ÌÄÿÿðLÌÌÄÿÿÿÿÿÿÿÿpDÃûÌÌOÿÌÌÌÄÿÿÿÿÿÿÿÿpL;¼ÌÄDLÌÌÌOÿÿÿÿÿÿÿÿpLÃ;¼ÌÌÌÌÌÌOÿÿÿÿÿÿÿÿpÌÌ;<ÌÌÌÌÄÿüÿÿÿÿÿÿÿpÌÌÌÌÌÌÌÌOÿüÿÿÿÿÿÿÿpÌÌÌÌÌÌDÿÿüÿÿÿÿÿÿÿpüÌÌÌÄÿÿÿüÿÿÿwwwwpÿÿÿÌÌÿÿÿÌÿÿøˆˆˆˆ€ÿÿÿÿüÌÿüÏÿÿÿÿÿÿÿüÌÌÿÿÿÿÿÿxÿÿÿÿÿÿÿÿÿÿÿÿÿ÷€ÿÿÿÿÿÿÿÿÿÿÿÿÿxÿÿÿÿÿÿÿÿÿÿÿÿ÷€ÿÿÿÿÿÿÿÿÿÿÿÿxÿÿÿÿÿÿÿÿÿÿÿ÷€ÿÿÿÿÿÿÿÿÿÿÿxÿÿÿÿÿÿÿÿÿÿÿ‡€ÿÿÿÿÿÿÿÿÿÿÿˆÿÿÿÿÿÿÿÿÿÿÿ€ˆˆˆˆˆˆˆˆˆˆˆˆ€ÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀðàÇÀÏÀÏ€Ž„€€€€€€€ÀÀÀààððøüþÿÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀ?ÿÀÿÀÿÿÀÿÿÀÿÿÀÿÿÀÿÿÀÿ(0` €€€€€€€€€ÀÀÀÀÜÀðʦ """)))UUUMMMBBB999€|ÿPPÿ“ÖÿìÌÆÖïÖçç©­3f™Ì3333f3™3Ì3ÿff3fff™fÌfÿ™™3™f™™™Ì™ÿÌÌ3ÌfÌ™ÌÌÌÿÿfÿ™ÿÌ3333f3™3Ì3ÿ3333333f33™33Ì33ÿ3f3f33ff3f™3fÌ3fÿ3™3™33™f3™™3™Ì3™ÿ3Ì3Ì33Ìf3Ì™3ÌÌ3Ìÿ3ÿ33ÿf3ÿ™3ÿÌ3ÿÿff3fff™fÌfÿf3f33f3ff3™f3Ìf3ÿffff3fffff™ffÌf™f™3f™ff™™f™Ìf™ÿfÌfÌ3fÌ™fÌÌfÌÿfÿfÿ3fÿ™fÿÌÌÿÿÌ™™™3™™™™Ì™™33™f™3Ì™ÿ™f™f3™3f™f™™fÌ™3ÿ™™3™™f™™™™™Ì™™ÿ™Ì™Ì3fÌf™Ì™™ÌÌ™Ìÿ™ÿ™ÿ3™Ìf™ÿ™™ÿÌ™ÿÿÌ™3ÌfÌ™ÌÌ™3Ì33Ì3fÌ3™Ì3ÌÌ3ÿÌfÌf3™ffÌf™ÌfÌ™fÿ̙̙3Ì™fÌ™™Ì™ÌÌ™ÿÌÌÌÌ3ÌÌfÌÌ™ÌÌÌÌÌÿÌÿÌÿ3™ÿfÌÿ™ÌÿÌÌÿÿÌ3ÿfÿ™Ì3ÿ33ÿ3fÿ3™ÿ3Ìÿ3ÿÿfÿf3Ìffÿf™ÿfÌÌfÿÿ™ÿ™3ÿ™fÿ™™ÿ™Ìÿ™ÿÿÌÿÌ3ÿÌfÿÌ™ÿÌÌÿÌÿÿÿ3Ìÿfÿÿ™ÿÿÌffÿfÿffÿÿÿffÿfÿÿÿf!¥___www†††–––ËË˲²²×××ÝÝÝãããêêêñññøøøðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿÿÿÿ ë ë¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼smD#KK"#K¼¼¼¼¼ ëóóóóóóóóóóK*###"C¼ ëôöôôôóôóóóóóóK#$#¼ ëÿôöôóôóôóôóóóóóóK$#¼ ëÿöôöôöôóôóôóóóóqœ›qK#’¼ ëÿööôöôöôôôóôóó󜛛›wm#¼m’¼ ëÿöööôöôöôöôóôôópwwœ›œ›D#»p›{›q¼ eeeeeeëÿööööööôöôôôóóp{›››œ››*$C{{›{{¼ eüŠŠŠŠŠ……öööööööôöôöôô{›ÈÈȹœDJ#$#CW888¼ ê§ ŠŠe……§§öôöôôó›{ãããL*D###›I ùù¼ êŠ ë ……ÇŠŠŠŠŠŠŠöôô󛜛œ›œ›KHp#›NHHHr¼ êŠ …†Ç­ŠŠ­­­ÎΊŠóôv››¸¹¸IDI{v#›{{œ››¼ êêŠ …†ÇŠŠ­ÎÎÎÎÎÎÎÎ-¼½œœsss*–CkEm›{›œ›C êΊ ¦…†ŠÇŠ­ÎÎÎÎÎÎÎÎÎÎ-“#üüüq›#FãFãC›››œ¼ êΊC¦†§§Š­Îά¬¬¬ÎÎÎÎÎΞ˜œqD*D›œ#h®i“D ½Gã¼ Ί_†§ŠŠ­ÎÎŠŠŠŠŠŠŠÎÎγ{{›››Kœ››$"{{›{n½ã”¼ êά¦†Š§­Îάöööööö§ŠÎ³Ó³›œ›œ*œ›œ{I$JJJwÀ—r¼ ê®ÎŠ†Š§Š­Î¬öööööööö§­ÎÎÎΜGG—œ›{{\ûûû›››œ¼ ë®ÎΊ†Š­ÎάööööööööööööôöœGŽG—†GrJ {›œ–¼ ëJJÏÎÎ†Š¬ÎÎ………………………………………›››œ›…Gq{{›{{q¼ ëJëÎΊ†ŠÎÎÎÎÎÎγÎÓ³ÓÓÓÓÓÓÓ›œ›œ›œ{›{›{›{¼ JëQ®Îέ¬ÎÎÎÎÎγÎÓ³ÓÓÓÓÓÓÓÓ¬››rœ›{{›{{{›¼ mQss­ÎάÎÎÎÎγÎÓ³ÓÓÓÓÓÓÚÓÙ¬ôóôóœ{›Hó{›v¼ ëtí­ÎÎÎά¬¬¬¬¬¬¬¬¬ÓÚÚÓÚÓ¬ôôóóó›vóó¼ fsyyÏÎÎÎάÿÿÿÿÿÿÿ…¬ÚÛèÚÓÓ¬ôôôóóóóó¼ §†yšyÏÎÎάÿÿÿÿÿÿÿ…¬ÚèÛÚÚ¬ôöôóôóóóó¼ …Š™ ™ÏÎÎÔ¬ÿÿÿÿÿ§¬ÓÚÚèßÓ¬öôóôóóóóóó¼ §…Š™ ™­ÎÎÔ¬ÿÿÿ§¬ÓÚÚèáÚÓ¬ôöôóôóóóóóó¼ §…¬ï ™­´Î³§§§¬ÓÚÚèÚèÓ¬ööôöôóôóóóóó¼ §Š¬‘ïô´Î³Î³Ó³ÚÓÚÚÓÓ¬öööôôôóóóóóóó¼ §¬¬¬´™™´Î³Ó³ÓÓÚÚÓÓ¬ööö¬öôóôóóóóóóó¼ ‹¬¬¬¬ÎγγӳÓÓÓÓ¬öööö¬ôöôôóôóóóóó¼¼ ¬¬¬¬ÎγγӳӬ¬ööööö¬öôöôôóôóóó¼¼ ëÿö¬¬¬¬¬Ó³¬¬ööööööö¬ööôöôôóôóó¼¼ ëÿööööööÍÍÍÍöööööö¬¬öôöôöôôôó¼¼’ ëÿöööööööööÍÍÍööö¬¬öööööôöôó¼¼’’ ëÿöööööööööööÍÍÍͬöööööôöôó¼¼’’ë ëÿööööööööööööööööööööôöôöCCCCCCCCC ëÿöööööööööööööööööööööööô’ÿÿÿô¼’ ëÿöööööööööööööööööööööööö’ÿÿô¼’ ëÿöööööööööööööööööööööööö’ÿô¼’ ëÿöööööööööööööööööööööööö’ô¼’ ëÿöööööööööööööööööööööööö’¼’ ëÿöööööööööööööööööööööööö’¼’ ëÿöööööööööööööööööööööööö’’ ëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ’ ëìììììììììììììììììììììììììì ÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀðàÇÀÏÀÏ€Ž„€€€€€€€ÀÀÀààððøüþÿÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀ?ÿÀÿÀÿÿÀÿÿÀÿÿÀÿgeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/etc/Windows/icons/gw_link.ico0000660000175200017530000001114612664543647026072 0ustar guillaumeguillaume(Fhn èÖ ¨¾ ( €€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆƒˆÇÿÿ÷ ªê<ÌÇz'f3Lȉd Ÿ8LOôÊsz¼ÌÏúžê;ÏüÄúÿC¼ÌOÿøÌÄüÿøÿüÏðÿÿÿø÷pÿÿÿøwwwwwpÿÿààÀ €€Àààààà( €€€€€€€€€ÀÀÀÀÜÀðʦ """)))UUUMMMBBB999€|ÿPPÿ“ÖÿìÌÆÖïÖçç©­3f™Ì3333f3™3Ì3ÿff3fff™fÌfÿ™™3™f™™™Ì™ÿÌÌ3ÌfÌ™ÌÌÌÿÿfÿ™ÿÌ3333f3™3Ì3ÿ3333333f33™33Ì33ÿ3f3f33ff3f™3fÌ3fÿ3™3™33™f3™™3™Ì3™ÿ3Ì3Ì33Ìf3Ì™3ÌÌ3Ìÿ3ÿ33ÿf3ÿ™3ÿÌ3ÿÿff3fff™fÌfÿf3f33f3ff3™f3Ìf3ÿffff3fffff™ffÌf™f™3f™ff™™f™Ìf™ÿfÌfÌ3fÌ™fÌÌfÌÿfÿfÿ3fÿ™fÿÌÌÿÿÌ™™™3™™™™Ì™™33™f™3Ì™ÿ™f™f3™3f™f™™fÌ™3ÿ™™3™™f™™™™™Ì™™ÿ™Ì™Ì3fÌf™Ì™™ÌÌ™Ìÿ™ÿ™ÿ3™Ìf™ÿ™™ÿÌ™ÿÿÌ™3ÌfÌ™ÌÌ™3Ì33Ì3fÌ3™Ì3ÌÌ3ÿÌfÌf3™ffÌf™ÌfÌ™fÿ̙̙3Ì™fÌ™™Ì™ÌÌ™ÿÌÌÌÌ3ÌÌfÌÌ™ÌÌÌÌÌÿÌÿÌÿ3™ÿfÌÿ™ÌÿÌÌÿÿÌ3ÿfÿ™Ì3ÿ33ÿ3fÿ3™ÿ3Ìÿ3ÿÿfÿf3Ìffÿf™ÿfÌÌfÿÿ™ÿ™3ÿ™fÿ™™ÿ™Ìÿ™ÿÿÌÿÌ3ÿÌfÿÌ™ÿÌÌÿÌÿÿÿ3Ìÿfÿÿ™ÿÿÌffÿfÿffÿÿÿffÿfÿÿÿf!¥___www†††–––ËË˲²²×××ÝÝÝãããêêêñññøøøðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿÿÿÿ  ë¼¼¼¼¼¼¼*¼¼üøÿÿÿ¼$¼ü›››$v›¼üüüüŠw{IJHBüü½Ç†Dio›üöööö›–#r˜ûüüüüüü›ã››wûüööüó›ûüüüööó¼’üüüöüô¼’ëøÿööüüööCCC ëÿöööööö’ö ëÿÿÿÿÿÿÿ’ ëììììììììÿÿààÀ €€Àààààà( @€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿxˆˆˆˆˆˆ7s8ˆ€ÿÿÿÿÿÿó7ÿÿ€ÿÿÿÿÿ pÿÿ€ÿÿÿÿî§w¢€ÌÏÿÿÿÿîªa®¯€L|êÆ ¿€LDÌÌÏîfac¦j€ÄDLÌÌÀNv¦.î ÄDÌDLÊÇ|"w~î ® ffwxˆ÷wfïø0‘™fwxˆ÷wfêêᆪê¦fwxˆ÷wfžª ® fwxˆ÷w` šŠŠ¡è¦fwxˆ÷wfj¡ê¡ê˜fwxˆ÷wfj©®®»®¦fwxˆ÷wff®ªž®¨ffwxˆ÷wfff¦êêæffwxˆ÷wffffjffffwxˆ÷wwxˆ÷wˆˆˆˆˆˆˆˆˆˆwxˆ÷wwwwwwwwwwwwwxˆ÷wwwwwwwwwwwwwxˆÿÿÿÿÿÿÿÿÿÿÿÿÿøˆwwwwwwwwwwwwwˆ‡wwwwwwwwwwwwwøˆˆˆˆˆˆˆˆˆˆˆˆˆˆÿÿÿÿÿÿ€ÿÿÿ€À?à?ðøøøøøøøøøøøüÿÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿÀÿàÿðÿø?(0` ÿÿÿ€€€€€€€€€ÀÀÀÀÜÀðʦ@€€@@ÿ€€@ÿ@@€€ÿÿ€ÿÿÿ€ÿ€€€ÿ@€ÿ3f™Ì3333f3™3Ì3ÿff3fff™fÌfÿ™™3™f™™™Ì™ÿÌÌ3ÌfÌ™ÌÌÌÿÿfÿ™ÿÌ3333f3™3Ì3ÿ3333333f33™33Ì33ÿ3f3f33ff3f™3fÌ3fÿ3™3™33™f3™™3™Ì3™ÿ3Ì3Ì33Ìf3Ì™3ÌÌ3Ìÿ3ÿ33ÿf3ÿ™3ÿÌ3ÿÿff3fff™fÌfÿf3f33f3ff3™f3Ìf3ÿffff3fffff™ffÌf™f™3f™ff™™f™Ìf™ÿfÌfÌ3fÌ™fÌÌfÌÿfÿfÿ3fÿ™fÿÌÌÿÿÌ™™™3™™™™Ì™™33™f™3Ì™ÿ™f™f3™3f™f™™fÌ™3ÿ™™3™™f™™™™™Ì™™ÿ™Ì™Ì3fÌf™Ì™™ÌÌ™Ìÿ™ÿ™ÿ3™Ìf™ÿ™™ÿÌ™ÿÿÌ™3ÌfÌ™ÌÌ™3Ì33Ì3fÌ3™Ì3ÌÌ3ÿÌfÌf3™ffÌf™ÌfÌ™fÿ̙̙3Ì™fÌ™™Ì™ÌÌ™ÿÌÌÌÌ3ÌÌfÌÌ™ÌÌÌÌÌÿÌÿÌÿ3™ÿfÌÿ™ÌÿÌÌÿÿÌ3ÿfÿ™Ì3ÿ33ÿ3fÿ3™ÿ3Ìÿ3ÿÿfÿf3Ìffÿf™ÿfÌÌfÿÿ™ÿ™3ÿ™fÿ™™ÿ™Ìÿ™ÿÿÌÿÌ3ÿÌfÿÌ™ÿÌÌÿÌÿÿÿ3Ìÿfÿÿ™ÿÿÌffÿfÿffÿÿÿffÿfÿÿÿfÁÁÁ___www†††–––ËË˲²²×××ÝÝÝãããêêêñññøøøðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëëëëëëmmÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëëëëëì÷÷÷¼¼¼÷ìmCÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëëëëëì÷÷÷÷¼¼¼¼óòòòòñïìêCÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëëëëëì÷÷÷÷¼¼¼¼öööóñðï÷ïí÷ðïêêCÿÿÿÿÿÿÿÿÿÿÿëëëì÷÷÷÷¼¼¼¼óòñòòòïí¼ïìïïì÷ïíì¼ïêêCÿÿÿÿÿÿÿÿÿì÷÷÷¼¼òóòòòòííìíìíìïñì÷íííìêêCÿÿÿÿÿÿÿÿì÷¼ððïìí¼ìíðìíñì÷ì÷ì÷ñíííííì÷êCêêÿÿÿÿÿÿÿÿ÷÷ððñì÷ì÷ì÷ïííííííì¼÷÷ïïïïïêêêêêÿÿÿÿÿÿÿÿ÷÷ððíííííí¼÷¼÷¼÷ïïïïïïïïïïïïïêêêêêêêÿÿÿÿÿÿÿÿ÷÷¼÷í¼÷¼÷ïïïïïïïïïïïïïïïïïïïïêêêêêêêêêÿÿÿÿÿÿÿÿíïïïïïïïïïïïïïïïï¼¼¼¼¼¼íííïêêêêêêêêêÿÿÿÿÿÿÿÿïïïïïïïïïïïïïïïïïìììêêêê÷ìììïêêêêêêêêêÿÿÿÿÿÿÿÿóïïïïïïïïïïïïïïïïïííìììììíïïïïêêêêêêêêêÿÿÿÿÿÿÿÿóïOOOïïïïïïïïïïïïïïïïïïïïïïïïïêêêêêêêêêÿÿÿÿÿÿÿÿóï||Oïïïïïïïïïïïïïïïïï¼¼¼¼¼êêêêêêêêêÿÿÿÿÿÿÿÿóïïïïïïïïïïïï¼¼¼¼¼ïïïííííííêêêêêêêêÿÿÿÿÿÿÿÿóïïïï¼¼¼¼íííììëëmêêêêêêêëëëëëêêêêêêÿÿÿÿÿÿÿÿñóòòññï÷íìëëëëëëëëmmmmmmmêêêêêêëëëëëêêêêÿÿÿÿÿÿÿÿÿÿñññññ÷íìëëëëëmmmmmmmêêêêêêêêêêêëëëëêêÿÿÿÿÿÿÿÿÿÿÿÿÿññññí÷ìëmmmmmêêêêêêêêêêêêêêêêëëëëêÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñññï÷ííííííííííí÷÷÷÷ímmÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïïïïïïïïïïïïïïïïïïïïïïï÷÷÷÷÷÷ímmmÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿò¼¼¼¼ïïïïïïïïï÷úú÷÷÷ímmmÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿò¼¼¼¼¼ïïï÷÷÷÷÷ímmmÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿò¼¼lsmD#KKKJK÷÷ímmmmÿÿÿÿÿÿÿÿÿÿÿÿÿÿò¼¼l*###÷÷ímmmmÿÿÿÿÿÿÿÿÿÿÿÿÿÿò¼l#$*J÷÷ímmmmÿÿÿÿÿÿÿÿÿÿÿÿÿÿò¼llp’ÿ*D÷÷ímmmmÿÿÿÿÿÿÿÿÿÿÿÿÿÿòðlr›{›wm#ÿ’’ÿ÷÷ímmmmêÿÿÿÿÿÿÿÿÿÿÿÿÿòðlvI{›œ›D#»p›œq÷÷ímmmmêÿÿÿÿÿÿÿÿÿÿÿÿÿóðl›œ{{{››*$C{œ›{Iÿ÷÷÷mmmmêêÿÿÿÿÿÿÿÿÿÿÿÿóðl{vC#$*J# &&÷÷÷mmmmêêÿÿÿÿÿÿÿÿÿÿÿÿóðl{ùùùp#p#w{ÿÿÿÿ÷ï÷mmmmêêêÿÿÿÿÿÿÿÿÿÿÿóðl’œ{w¸IDI{vw›{{››÷ï÷mmmmêêêÿÿÿÿÿÿÿÿÿÿÿóðl-%›sXs*–CkDÀ{›{›C÷ï÷mmmmêêêÿÿÿÿÿÿÿÿÿÿÿòðl-%IüQüq›#FããL›{{œ÷ï÷mmmmêêêÿÿÿÿÿÿÿÿÿÿÿòñl{{››Cpv{$˜pkwo½”“÷ï÷mmmmêêêÿÿÿÿÿÿÿÿÿÿÿòñl{››Dv{vr$m{vKãùF÷ï÷mmmmêêêÿÿÿÿÿÿÿÿÿÿÿòñ¼lK¶G—œ›{{\ûû›{{œÿïï÷mmmmêêêÿÿÿÿÿÿÿÿÿÿÿòñ¼lKµG—†GrJ%F{›{–ïï÷mmmmêêêÿÿÿÿÿÿÿÿÿÿÿòñ¼l{{›…Gq{œ›{pïï÷mmmmêêêÿÿÿÿÿÿÿÿÿÿÿóñ¼l››{{{›››v{›v÷ï÷mmmmêêêÿÿÿÿÿÿÿÿÿÿÿóñ¼lv››{v›÷ï÷mmmmêêêÿÿÿÿÿÿÿÿÿÿÿóñ¼lv÷ï÷mmmmêêêÿÿÿÿÿÿÿÿÿÿÿóñ¼ííííííííííííííííííííííííïï÷mmmmêêêÿÿÿÿÿÿÿÿÿÿÿóòñññññññðððð¼¼¼¼ïïïïïïï÷mmmmììÿÿÿÿÿÿÿÿÿÿÿÿóòòññññññðððð¼¼¼¼ïïïïïïïmmììÿÿÿÿÿÿÿÿÿÿÿÿÿÿóòòòòòññññññðððððð¼¼¼¼¼¼ììÿÿÿÿÿÿÿÿÿÿàÿÿÿðÿÿøÿüÿ€ÿÿ?ÀðüÿÿÿÿÿÿÿÿÿÀÿøÿÿÿ€?ÿ€?ÿ€?ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/etc/Windows/icons/gw_temp.ico0000660000175200017530000001114612664543647026102 0ustar guillaumeguillaume(Fhn èÖ ¨¾ ( €€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ0™™™™™™ÿ÷™™™™ÿùŸù™ÿ™ ™ÿŸù™;»¹™Ÿÿ™™;»¹™ÿŸù™339Ÿù™ÿ™ÿ™™™™ª6™™™™Žò¨™™“0 ¦£ªÿ÷0jªª‰ÿ÷ú«ªˆˆpªª¨ÿÿÿpðˆˆˆ€ü€€€€€€ÀÀö( €€€€€€€€€ÀÀÀÀÜÀðȤ """)))UUUMMMBBB9993f™Ì3333f3™3Ì3ÿff3fff™fÌfÿ™™3™f™™™Ì™ÿÌÌ3ÌfÌ™ÌÌÌÿÿfÿ™ÿÌ3333f3™3Ì3ÿ3333333f33™33Ì33ÿ3f3f33ff3f™3fÌ3fÿ3™3™33™f3™™3™Ì3™ÿ3Ì3Ì33Ìf3Ì™3ÌÌ3Ìÿ3ÿ33ÿf3ÿ™3ÿÌ3ÿÿff3fff™fÌfÿf3f33f3ff3™f3Ìf3ÿffff3fffff™ffÌf™f™3f™ff™™f™Ìf™ÿfÌfÌ3fÌ™fÌÌfÌÿfÿfÿ3fÿ™fÿÌÌÿÿÌ™™™3™™™™Ì™™33™f™3Ì™ÿ™f™f3™3f™f™™fÌ™3ÿ™™3™™f™™™™™Ì™™ÿ™Ì™Ì3fÌf™Ì™™ÌÌ™Ìÿ™ÿ™ÿ3™Ìf™ÿ™™ÿÌ™ÿÿÌ™3ÌfÌ™ÌÌ™3Ì33Ì3fÌ3™Ì3ÌÌ3ÿÌfÌf3™ffÌf™ÌfÌ™fÿ̙̙3Ì™fÌ™™Ì™ÌÌ™ÿÌÌÌÌ3ÌÌfÌÌ™ÌÌÌÌÌÿÌÿÌÿ3™ÿfÌÿ™ÌÿÌÌÿÿÌ3ÿfÿ™Ì3ÿ33ÿ3fÿ3™ÿ3Ìÿ3ÿÿfÿf3Ìffÿf™ÿfÌÌfÿÿ™ÿ™3ÿ™fÿ™™ÿ™Ìÿ™ÿÿÌÿÌ3ÿÌfÿÌ™ÿÌÌÿÌÿÿÿ3Ìÿfÿÿ™ÿÿÌffÿfÿffÿÿÿffÿfÿÿÿfÁÁÁ___www†††–––ËË˲²²×××ÝÝÝãããêêêñññøøøðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿÿÿÿ0ùùùùùùùùùùùùùùøÿÿÿùùùùùùùùùøÿÿÿùùÿÿùùùÿÿùùùùùÿÿùÿÿùùù)ûûûûùùùùÿÿÿùùùù0ûûûûùùùÿÿùÿÿùùù)0)0$ùùÿÿùùùÿÿùùø››*qùùùùùùùùù¼›ÿI$#ùùùùùùùùùv›ŠD$››ùùùùù)0-½Ç›DG››ÿÿÿ)›››–PwPÿÿÿ–››››øøøøÿ¼››’{øÿÿÿÿÿÿøøøøøøøøü€€€€€€ÀÀö( @€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ™™™™™™ ™™™™™‡wwwwww™Ÿ™™Ÿ™ÿÿÿÿÿÿ™ÿù™ÿùÿÿÿÿÿù™ŸÿŸÿ™™ôDDDDù™™ÿÿù™™ÿÿÿÿÿù™™Ÿÿ™™™ ™™ÿÿù™™»»»»»»¹™ŸÿŸÿ™™»»»»»»»™ÿù™ÿù»»»»»»»™Ÿ™™Ÿ™»»»»»»»¹™™™™™33333330™™™™ÿÿÿÿÿÿp™™ôDDDDÿp€33ÿÿÿÿÿ÷pˆ30€30Oÿwpˆp333ÿÿð‡p3€ó?ÿÿøÿpp€3 ¨0‚ø÷ÿpˆ ®ª3ª®¯øpÿpˆp ¯¨13»¸ˆÿÿpˆpª®˜Žfjÿÿÿpˆpª¬ƒ©êª¯ÿÿÿpˆp Œ¨ãÚ®®ÿÿÿÿpwp êš©©©ÿˆˆˆ€ÿpªšª8ª¨ÿÿÿÿÿp ªê«¾®¯ÿÿÿÿÿp ªhªªÿÿÿÿÿÿp¢ªªªˆˆˆˆˆˆˆ€ `ÿÿüÿÿðððððððààààààðððððà€€€€@@€Àààðþÿÿ( @€€€€€€€€€ÀÀÀÀÜÀðȤ """)))UUUMMMBBB9993f™Ì3333f3™3Ì3ÿff3fff™fÌfÿ™™3™f™™™Ì™ÿÌÌ3ÌfÌ™ÌÌÌÿÿfÿ™ÿÌ3333f3™3Ì3ÿ3333333f33™33Ì33ÿ3f3f33ff3f™3fÌ3fÿ3™3™33™f3™™3™Ì3™ÿ3Ì3Ì33Ìf3Ì™3ÌÌ3Ìÿ3ÿ33ÿf3ÿ™3ÿÌ3ÿÿff3fff™fÌfÿf3f33f3ff3™f3Ìf3ÿffff3fffff™ffÌf™f™3f™ff™™f™Ìf™ÿfÌfÌ3fÌ™fÌÌfÌÿfÿfÿ3fÿ™fÿÌÌÿÿÌ™™™3™™™™Ì™™33™f™3Ì™ÿ™f™f3™3f™f™™fÌ™3ÿ™™3™™f™™™™™Ì™™ÿ™Ì™Ì3fÌf™Ì™™ÌÌ™Ìÿ™ÿ™ÿ3™Ìf™ÿ™™ÿÌ™ÿÿÌ™3ÌfÌ™ÌÌ™3Ì33Ì3fÌ3™Ì3ÌÌ3ÿÌfÌf3™ffÌf™ÌfÌ™fÿ̙̙3Ì™fÌ™™Ì™ÌÌ™ÿÌÌÌÌ3ÌÌfÌÌ™ÌÌÌÌÌÿÌÿÌÿ3™ÿfÌÿ™ÌÿÌÌÿÿÌ3ÿfÿ™Ì3ÿ33ÿ3fÿ3™ÿ3Ìÿ3ÿÿfÿf3Ìffÿf™ÿfÌÌfÿÿ™ÿ™3ÿ™fÿ™™ÿ™Ìÿ™ÿÿÌÿÌ3ÿÌfÿÌ™ÿÌÌÿÌÿÿÿ3Ìÿfÿÿ™ÿÿÌffÿfÿffÿÿÿffÿfÿÿÿfÁÁÁ___www†††–––ËË˲²²×××ÝÝÝãããêêêñññøøøðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿÿÿÿùùùùùùùùùùùùùùùùùùùùùùùùùøùùùÿùùùùùÿùùùøÿÿÿÿÿÿÿÿÿÿÿÿÿùùÿÿÿùùùÿÿÿùùøÿÿÿÿÿÿÿÿÿÿÿÿùùùùÿÿÿùÿÿÿùùùùøÿÿ_…_…_…_…_ÿùùùùùÿÿÿÿÿùùùùùøÿÿÿÿÿÿÿÿÿÿÿÿùùùùùùÿÿÿùùùùùùùùùùùÿÿÿÿÿùùùùù0ûûûûûûûûûûûûûùùùùÿÿÿùÿÿÿùùùù)ûûûûûûûûûûûûûûùùÿÿÿùùùÿÿÿùù0ûûûûûûûûûûûûûûùùùÿùùùùùÿùùù)ûûûûûûûûûûûûûûûùùùùùùùùùùù0)0)0)0)0)0)0)0)ùùùùùùùùùøÿÿÿÿÿÿÿÿÿÿÿÿÿ)ùùùùùøÿÿ…_…_…_…_…ÿÿø)0)0øÿÿÿÿÿÿÿÿÿÿÿÿøø)0)0øJ**K¼…_ÿÿÿøø)0)0øÿ*Kÿÿÿÿÿø)0)››ÿKnÿÿÿÿÿÿøÿÿÿø)0»wqœ›œ*Jœœ›¼ÿÿøÿÿÿøø)œ›²²œI**q›}}ÿÿøÿÿÿøø›œGGKq*KœqEøøøÿÿÿÿÿøø¼›œ››qJ›Jœœ››’ÿÿÿÿÿÿÿøø—H®üNIwFoq{{vÿÿÿÿÿÿÿøø¼NvC#v"CleIFF“ÿÿÿÿÿÿÿq{{pp{"v#JOJJmøøøøøøøøÿÿ¼‘®psJ676v{pÿÿÿÿÿÿÿÿÿÿÿvww¦ÿ {{vvp¼ÿÿÿÿÿÿÿÿÿÿÿvv{v{v{v{vÿÿÿÿÿÿÿÿÿÿÿÿÿ˜¼q{{qv{»øøøøøøøøøøøøøø¼rÿÿüÿÿðððððððààààààðððððà€€€€@@€Àààðþÿÿgeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/etc/Windows/icons/gw_object.ico0000660000175200017530000001114612664543647026403 0ustar guillaumeguillaume(Fhn èÖ ¨¾ ( €€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ™™ÿ™™™™÷™™™™ùŸù™ÿ™ù™ÿŸù™ù™Ÿÿ™™ù™ÿŸù™ Ÿù™ÿ™™™™™pw™™™™™™Ÿðpwpˆˆ÷ðÿÿÿðwwðÿÿøðˆˆˆˆ€àààààààà€ €àüü( €€€€€€€€€ÀÀÀÀÜÀðʦ>]|›ºÙð$$ÿHHÿllÿÿ´´ÿ>](|2›<ºFÙUð$mÿH…ÿlÿµÿ´Íÿ*>?]T|i›~º“Ùªð$¶ÿHÂÿlÎÿÚÿ´æÿ>>]]||››ººÙÙðð$ÿÿHÿÿlÿÿÿÿ´ÿÿ>*]?|T›iº~Ù“ðª$ÿ¶HÿÂlÿÎÿÚ´ÿæ>]|(›2º<ÙFðU$ÿmHÿ…lÿÿµ´ÿÍ>]|›ºÙð$ÿ$HÿHlÿlÿ´ÿ´>](|2›<ºFÙUðmÿ$…ÿHÿlµÿÍÿ´*>?]T|i›~º“Ùªð¶ÿ$ÂÿHÎÿlÚÿæÿ´>>]]||››ººÙÙððÿÿ$ÿÿHÿÿlÿÿÿÿ´>*]?|T›iº~Ù“ðªÿ¶$ÿÂHÿÎlÿÚÿæ´>]|(›2º<ÙFðUÿm$ÿ…HÿlÿµÿÍ´>]|›ºÙðÿ$$ÿHHÿllÿÿ´´>]|(›2º<ÙFðUÿ$mÿH…ÿlÿµÿ´Í>*]?|T›iº~Ù“ðªÿ$¶ÿHÂÿlÎÿÚÿ´æ>>]]||››ººÙÙððÿ$ÿÿHÿÿlÿÿÿÿ´ÿ*>?]T|i›~º“Ùªð¶$ÿÂHÿÎlÿÚÿæ´ÿ>](|2›<ºFÙUðm$ÿ…HÿlÿµÿÍ´ÿ,,,999EEERRR___lllxxx………’’’ŸŸŸ«««¸¸¸ÅÅÅÒÒÒÞÞÞëëëøøøðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿÿÿÿùùùùùøööùùùùùùùùùøöùùùùùùùùùøöùùÿÿùùùÿÿùùøöùùùÿÿùÿÿùùùøöùùùùÿÿÿùùùùøöùùùÿÿùÿÿùùùùùÿÿùùùÿÿùùùùùùùùùùùùùùùùùùùùùùùùùööøøøøööööööööööøööööööøÿøøøøøøøøøàààààààà€ €àüü( @€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ™™™™™™ ™™™™™™Ÿ™™Ÿ™wwwww™ÿù™ÿùÿÿÿÿù™ŸÿŸÿ™™÷wwy™™ÿÿù™™÷ÿ÷ÿy™™Ÿÿ™™™÷ÿ÷ÿy™™ÿÿù™™÷wwy™ŸÿŸÿ™™÷ÿ÷ÿw™ÿù™ÿù÷ÿ÷ÿw™Ÿ™™Ÿ™÷wwÿù™™™™™÷ÿ÷ÿÿÿ™™™™÷ÿ÷ÿÿÿ™™Ÿ÷wwwpwðÿÿÿÿÿÿ÷ðˆˆˆ àŠðÿ‡î£:æð€™ðÿ€€wwˆîh†êªðpŠŒÎˆª¯ðÿúŠ©ð‡zŽ£ºªÿ€ÿ掮ÿ€pÿÿøøÿÿww‡ˆˆˆˆÿÿÿÿÿÿÿwwwwwpÿÿÿÿÿÿ‡ÿÿÿÿÿÿ€ˆˆˆˆˆˆˆ€ÿÿüÿÿðÿÿàþþþþþþþþþþþþþþøø˜`xx`˜øøÿÀÿÀ?ÿÀ( @€€€€€€€€€ÀÀÀÀÜÀðʦÔðÿ±âÿŽÔÿkÆÿH¸ÿ%ªÿªÿ’Üz¹b–Js2PÔãÿ±ÇÿŽ«ÿkÿHsÿ%WÿUÿIÜ=¹1–%sPÔÔÿ±±ÿŽŽÿkkÿHHÿ%%ÿþܹ–sPãÔÿDZÿ«ŽÿkÿsHÿW%ÿUÿIÜ=¹1–%sPðÔÿâ±ÿÔŽÿÆkÿ¸Hÿª%ÿªÿ’Üz¹b–Js2PÿÔÿÿ±ÿÿŽÿÿkÿÿHÿÿ%ÿþþÜܹ¹––ssPPÿÔðÿ±âÿŽÔÿkÆÿH¸ÿ%ªÿªÜ’¹z–bsJP2ÿÔãÿ±ÇÿŽ«ÿkÿHsÿ%WÿUÜI¹=–1s%PÿÔÔÿ±±ÿŽŽÿkkÿHHÿ%%þܹ–sPÿãÔÿDZÿ«ŽÿkÿsHÿW%ÿUÜI¹=–1s%PÿðÔÿâ±ÿÔŽÿÆkÿ¸Hÿª%ÿªÜ’¹z–bsJP2ÿÿÔÿÿ±ÿÿŽÿÿkÿÿHÿÿ%þþÜܹ¹––ssPPðÿÔâÿ±ÔÿŽÆÿk¸ÿHªÿ%ªÿ’Üz¹b–Js2PãÿÔÇÿ±«ÿŽÿksÿHWÿ%UÿIÜ=¹1–%sPÔÿÔ±ÿ±ŽÿŽkÿkHÿH%ÿ%þܹ–sPÔÿã±ÿÇŽÿ«kÿHÿs%ÿWÿUÜI¹=–1s%PÔÿð±ÿâŽÿÔkÿÆHÿ¸%ÿªÿªÜ’¹z–bsJP2Ôÿÿ±ÿÿŽÿÿkÿÿHÿÿ%ÿÿþþÜܹ¹––ssPPòòòæææÚÚÚÎÎζ¶¶ªªªžžž’’’†††zzznnnbbbVVVJJJ>>>222&&&ðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿÿÿÿùùùùùùùùùùùùùùùùùùùùùùùùùùùùÿùùùùùÿùùùøùùÿÿÿùùùÿÿÿùùøöööööööööùùùùÿÿÿùÿÿÿùùùùøööùùùùùÿÿÿÿÿùùùùùøööööööùùùùùùÿÿÿùùùùùùøööööööùùùùùÿÿÿÿÿùùùùùøööùùùùÿÿÿùÿÿÿùùùùøööööööùùÿÿÿùùùÿÿÿùùøööööööùùùÿùùùùùÿùùùøöööööùùùùùùùùùùùøööööööööööùùùùùùùùùøöööööööööööùùùùùöøööööøöööööööööîöööööøøøøøøøøöö  îååööööø  ¬¬ ¢ööøøøö''òŸ,ööööøøøøí Š~òò¢ ¢¬éööø î~ü ò'%¬¬éöööøöö¬î Ÿ %%öøaê—ÁÑ¢¬åöööøøøöööŸ‹íŸ¬ öööøøøöööööö£öøöööööøøøøøøøøøöööööøööööööööööööøöøöööööööööööööøøöööööööööööööøøøøøøøøøøøøøøøøÿÿüÿÿðÿÿàþþþþþþþþþþþþþþøø˜`xx`˜øøÿÀÿÀ?ÿÀgeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/etc/Windows/icons/gwc.ico0000660000175200017530000001114612664543647025220 0ustar guillaumeguillaume(Fhn èÖ ¨¾ ( €€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿð þð™™wz§ð w÷ªðwÿððwwÿ÷pwww0"b®ærày>)'§Þãà ~ ªâðÿ€ÿûÁÛßßÿÃçÿÿÿÿÿÿÿ( €€€€€€€€€ÀÀÀÀÜÀðʦ>]|›ºÙð$$ÿHHÿllÿÿ´´ÿ>](|2›<ºFÙUð$mÿH…ÿlÿµÿ´Íÿ*>?]T|i›~º“Ùªð$¶ÿHÂÿlÎÿÚÿ´æÿ>>]]||››ººÙÙðð$ÿÿHÿÿlÿÿÿÿ´ÿÿ>*]?|T›iº~Ù“ðª$ÿ¶HÿÂlÿÎÿÚ´ÿæ>]|(›2º<ÙFðU$ÿmHÿ…lÿÿµ´ÿÍ>]|›ºÙð$ÿ$HÿHlÿlÿ´ÿ´>](|2›<ºFÙUðmÿ$…ÿHÿlµÿÍÿ´*>?]T|i›~º“Ùªð¶ÿ$ÂÿHÎÿlÚÿæÿ´>>]]||››ººÙÙððÿÿ$ÿÿHÿÿlÿÿÿÿ´>*]?|T›iº~Ù“ðªÿ¶$ÿÂHÿÎlÿÚÿæ´>]|(›2º<ÙFðUÿm$ÿ…HÿlÿµÿÍ´>]|›ºÙðÿ$$ÿHHÿllÿÿ´´>]|(›2º<ÙFðUÿ$mÿH…ÿlÿµÿ´Í>*]?|T›iº~Ù“ðªÿ$¶ÿHÂÿlÎÿÚÿ´æ>>]]||››ººÙÙððÿ$ÿÿHÿÿlÿÿÿÿ´ÿ*>?]T|i›~º“Ùªð¶$ÿÂHÿÎlÿÚÿæ´ÿ>](|2›<ºFÙUðm$ÿ…HÿlÿµÿÍ´ÿ,,,999EEERRR___lllxxx………’’’ŸŸŸ«««¸¸¸ÅÅÅÒÒÒÞÞÞëëëøøøðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿÿÿÿøööööööùøööú"øöùùùùùøööú"úöùùøøøöúúöùøöööøööùøøøøøöøööööøøêæ%#øøøøøø%é mp%êpp%%# ppî=îîpmppééépÿÿp%p opppòÿ€ÿûÁÛßßÿÃçÿÿÿÿÿÿÿ( @€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿððÿÿwp7pð™ÿÿ÷qw°ð™ÿÿïp3ðð ™™™™ðö£¢pð™™™™™wwæñpðð™™w÷ÿ¯ ð™™ÿwêêð™ÿÿ÷ÿð™ÿÿ÷ÿð™w÷÷÷ÿð™wwww÷ÿÿÿÿ÷÷ÿÿÿÿ÷pÿÿÿÿ÷s1wwwwwwpîó77pw®£®p ìês1꣩—c#aêî£zzêà~~w7®§ú“3ã7‘wp®w§®?§Ùãú³êç©yož® êîzêç®®®®¯êðÿÿ€ÿÿÿÿÿßÿÏÿÇøðñÇóÏóßóÿóÿóÿÿÿÿÿøü?ö?ÿÿàÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿÿÿÿÿ€ÿÿÀÿÿÀÿÿàÿÿàÿÿþ'ÿÿ( @€€€€€€€€€ÀÀÀÀÜÀðʦ>]|›ºÙð$$ÿHHÿllÿÿ´´ÿ>](|2›<ºFÙUð$mÿH…ÿlÿµÿ´Íÿ*>?]T|i›~º“Ùªð$¶ÿHÂÿlÎÿÚÿ´æÿ>>]]||››ººÙÙðð$ÿÿHÿÿlÿÿÿÿ´ÿÿ>*]?|T›iº~Ù“ðª$ÿ¶HÿÂlÿÎÿÚ´ÿæ>]|(›2º<ÙFðU$ÿmHÿ…lÿÿµ´ÿÍ>]|›ºÙð$ÿ$HÿHlÿlÿ´ÿ´>](|2›<ºFÙUðmÿ$…ÿHÿlµÿÍÿ´*>?]T|i›~º“Ùªð¶ÿ$ÂÿHÎÿlÚÿæÿ´>>]]||››ººÙÙððÿÿ$ÿÿHÿÿlÿÿÿÿ´>*]?|T›iº~Ù“ðªÿ¶$ÿÂHÿÎlÿÚÿæ´>]|(›2º<ÙFðUÿm$ÿ…HÿlÿµÿÍ´>]|›ºÙðÿ$$ÿHHÿllÿÿ´´>]|(›2º<ÙFðUÿ$mÿH…ÿlÿµÿ´Í>*]?|T›iº~Ù“ðªÿ$¶ÿHÂÿlÎÿÚÿ´æ>>]]||››ººÙÙððÿ$ÿÿHÿÿlÿÿÿÿ´ÿ*>?]T|i›~º“Ùªð¶$ÿÂHÿÎlÿÚÿæ´ÿ>](|2›<ºFÙUðm$ÿ…HÿlÿµÿÍ´ÿ,,,999EEERRR___lllxxx………’’’ŸŸŸ«««¸¸¸ÅÅÅÒÒÒÞÞÞëëëøøøðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿÿÿÿøööööööööööööööøöööööööùøöööööøøøå"êøöùùøööööööîò"øøööùùùøöööööpÿå""&ööùùùùùùùùùøööömd"pSòöùùùùùùùùùùøöøøøøqne"êåöùùùùùùøöøøöøöödÿêdöùùùùøöøöööøøpdpdøööùùùøöøööööööøööööùùøöøööööööøööööùùøöøøöøöøöøööööùùøöøøøøøøøøöøøööööööööööøöøøööööööööööøøêéæ#%##øööööööööööøé%##øøøøøøøøøøøøò%#égppò%%#òæ emfpf%#êdpefp‡‡fæ%##nMM1pf%m%æ#m òpfppméænædpdnîpp+î%=#îîdpdmîpé%%pé#æégépfpoéfé#édpéÿêÝùpéfn''pddòp…ÿp%dpdppfytêdpddò fofpdpdpdòopnîòÿÿ€ÿÿÿÿÿßÿÏÿÇøðñÇóÏóßóÿóÿóÿÿÿÿÿøü?ö?ÿÿàÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿÿÿÿÿ€ÿÿÀÿÿÀÿÿàÿÿàÿÿþ'ÿÿgeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/etc/Windows/icons/gw_lock.ico0000660000175200017530000001114612664543647026065 0ustar guillaumeguillaume(Fhn èÖ ¨¾ ( €€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿ°?°?°°°°°ð?³»{0úð·°¢!°ð°£¡ð¸°¢;€*žðó0òÿww÷ÿãÿÃÿÃÿãÿãÿãßãÁ€€€€€€Æ( €€€€€€€€€ÀÀÀÀÜÀðȤ """)))UUUMMMBBB9993f™Ì3333f3™3Ì3ÿff3fff™fÌfÿ™™3™f™™™Ì™ÿÌÌ3ÌfÌ™ÌÌÌÿÿfÿ™ÿÌ3333f3™3Ì3ÿ3333333f33™33Ì33ÿ3f3f33ff3f™3fÌ3fÿ3™3™33™f3™™3™Ì3™ÿ3Ì3Ì33Ìf3Ì™3ÌÌ3Ìÿ3ÿ33ÿf3ÿ™3ÿÌ3ÿÿff3fff™fÌfÿf3f33f3ff3™f3Ìf3ÿffff3fffff™ffÌf™f™3f™ff™™f™Ìf™ÿfÌfÌ3fÌ™fÌÌfÌÿfÿfÿ3fÿ™fÿÌÌÿÿÌ™™™3™™™™Ì™™33™f™3Ì™ÿ™f™f3™3f™f™™fÌ™3ÿ™™3™™f™™™™™Ì™™ÿ™Ì™Ì3fÌf™Ì™™ÌÌ™Ìÿ™ÿ™ÿ3™Ìf™ÿ™™ÿÌ™ÿÿÌ™3ÌfÌ™ÌÌ™3Ì33Ì3fÌ3™Ì3ÌÌ3ÿÌfÌf3™ffÌf™ÌfÌ™fÿ̙̙3Ì™fÌ™™Ì™ÌÌ™ÿÌÌÌÌ3ÌÌfÌÌ™ÌÌÌÌÌÿÌÿÌÿ3™ÿfÌÿ™ÌÿÌÌÿÿÌ3ÿfÿ™Ì3ÿ33ÿ3fÿ3™ÿ3Ìÿ3ÿÿfÿf3Ìffÿf™ÿfÌÌfÿÿ™ÿ™3ÿ™fÿ™™ÿ™Ìÿ™ÿÿÌÿÌ3ÿÌfÿÌ™ÿÌÌÿÌÿÿÿ3Ìÿfÿÿ™ÿÿÌffÿfÿffÿÿÿffÿfÿÿÿfÁÁÁ___www†††–––ËË˲²²×××ÝÝÝãããêêêñññøøøðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿÿÿÿ0û0ÿû)ÿû)û0û)û0ûøÿ0ÿû)øÿ$ÿ0ûûøû)ÿ›ÿ$ÿ)ûøøû››-D$ÿ0ûÿû-$-Dÿÿ)ûû›-$›ÿ)ûÿ-›$›ÿÿ)0øÿÿ-ÿÿøøøøø÷ÿãÿÃÿÃÿãÿãÿãßãÁ€€€€€€Æ( @€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿ0;³3»;?»;û; ;;;?»;û; ;;;?»;w?»;ˆû;ÿ€û3ÿÿø?»ƒÿÿ?€û¸»0ÿò/óø?»‹‹³÷j¯?€û¸xx»5ö¯13ø?»‡‡‡‹³g£??€?»¸¸¸¸³¦1:¯ÿø?»‹ ‹³Ç3wª¯ÿ€?»°p¸³1ª§"ÿø?»€‹³'g/ÿ€û°pp»7¬:¡:¢ø?»³¬£©¢¯€sÿÿð0ÿ¦§¦¯øp330?ÿ÷n`ÿ€ppÿÿú¯ÿÿÿÿ€wwwpþÿÿü?ÿÿøÿÿðÿÿðÿÿøÿÿüÿÿøÿÿðÿÿøÿÿüÿÿøÿÿðÏÿð‡ÿøÿøÿðÿàÀ?€€€€€?€ÿŸ ÿÏpÿàøÿ( @€€€€€€€€€ÀÀÀÀÜÀðȤ """)))UUUMMMBBB9993f™Ì3333f3™3Ì3ÿff3fff™fÌfÿ™™3™f™™™Ì™ÿÌÌ3ÌfÌ™ÌÌÌÿÿfÿ™ÿÌ3333f3™3Ì3ÿ3333333f33™33Ì33ÿ3f3f33ff3f™3fÌ3fÿ3™3™33™f3™™3™Ì3™ÿ3Ì3Ì33Ìf3Ì™3ÌÌ3Ìÿ3ÿ33ÿf3ÿ™3ÿÌ3ÿÿff3fff™fÌfÿf3f33f3ff3™f3Ìf3ÿffff3fffff™ffÌf™f™3f™ff™™f™Ìf™ÿfÌfÌ3fÌ™fÌÌfÌÿfÿfÿ3fÿ™fÿÌÌÿÿÌ™™™3™™™™Ì™™33™f™3Ì™ÿ™f™f3™3f™f™™fÌ™3ÿ™™3™™f™™™™™Ì™™ÿ™Ì™Ì3fÌf™Ì™™ÌÌ™Ìÿ™ÿ™ÿ3™Ìf™ÿ™™ÿÌ™ÿÿÌ™3ÌfÌ™ÌÌ™3Ì33Ì3fÌ3™Ì3ÌÌ3ÿÌfÌf3™ffÌf™ÌfÌ™fÿ̙̙3Ì™fÌ™™Ì™ÌÌ™ÿÌÌÌÌ3ÌÌfÌÌ™ÌÌÌÌÌÿÌÿÌÿ3™ÿfÌÿ™ÌÿÌÌÿÿÌ3ÿfÿ™Ì3ÿ33ÿ3fÿ3™ÿ3Ìÿ3ÿÿfÿf3Ìffÿf™ÿfÌÌfÿÿ™ÿ™3ÿ™fÿ™™ÿ™Ìÿ™ÿÿÌÿÌ3ÿÌfÿÌ™ÿÌÌÿÌÿÿÿ3Ìÿfÿÿ™ÿÿÌffÿfÿffÿÿÿffÿfÿÿÿfÁÁÁ___www†††–––ËË˲²²×××ÝÝÝãããêêêñññøøøðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿÿÿÿ0)0ûû))0ûû)û0ÿûû0û0ÿû)ûû0û)û)û0ÿûû0û0ÿû)ûû0û)û)û0ÿûû0ûøø)ÿûû)ûø)ÿû0ûøÿÿÿ0ÿû)0øÿÿÿÿÿ0ÿûû)øÿÿÿÿÿ*ÿ0ÿûûûû)øÿÿÿqqÿÿ*ÿ0ÿûûûûû)mÿÿqqqœÿ#**ÿ0ÿûûøøûû)gÿqœœÿ*#**ÿ0ÿûûøøøûû)mqœqœ*#**ÿ*ÿ)ÿûûûûûûû0qÿqœ##ÿÿÿÿÿÿ0ÿûûûûûû)®üq**®qqœqÿÿÿ)ÿûûûøûû0q##qœœœœqÿÿÿ0ÿûûûû)mœqq#qq®qÿÿÿ0ÿûûøøûû)mqü#œã##œqqÿø0ÿûûû)qœüœ##㜜ÿø0ÿÿÿÿÿ)ÿÿqqœqœqqÿÿø0)0)00ÿÿÿÿqqœqÿÿøøøÿÿÿÿÿœqÿÿÿøøÿÿÿÿÿÿÿøøøøøøøøþÿÿü?ÿÿøÿÿðÿÿðÿÿøÿÿüÿÿøÿÿðÿÿøÿÿüÿÿøÿÿðÏÿð‡ÿøÿøÿðÿàÀ?€€€€€?€ÿŸ ÿÏpÿàøÿgeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/etc/Windows/icons/ged2gwb.ico0000660000175200017530000001114612664543647025761 0ustar guillaumeguillaume(Fhn èÖ ¨¾ ( €€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿð ú ð™™ö2ð wºðÿðwwÿ÷pwwwððwr!zªª **rª¢p *÷ððÿ€ÿûÁÛßßÿÿÿÿÿÿÿÿ( €€€€€€€€€ÀÀÀÀÜÀðʦ>]|›ºÙð$$ÿHHÿllÿÿ´´ÿ>](|2›<ºFÙUð$mÿH…ÿlÿµÿ´Íÿ*>?]T|i›~º“Ùªð$¶ÿHÂÿlÎÿÚÿ´æÿ>>]]||››ººÙÙðð$ÿÿHÿÿlÿÿÿÿ´ÿÿ>*]?|T›iº~Ù“ðª$ÿ¶HÿÂlÿÎÿÚ´ÿæ>]|(›2º<ÙFðU$ÿmHÿ…lÿÿµ´ÿÍ>]|›ºÙð$ÿ$HÿHlÿlÿ´ÿ´>](|2›<ºFÙUðmÿ$…ÿHÿlµÿÍÿ´*>?]T|i›~º“Ùªð¶ÿ$ÂÿHÎÿlÚÿæÿ´>>]]||››ººÙÙððÿÿ$ÿÿHÿÿlÿÿÿÿ´>*]?|T›iº~Ù“ðªÿ¶$ÿÂHÿÎlÿÚÿæ´>]|(›2º<ÙFðUÿm$ÿ…HÿlÿµÿÍ´>]|›ºÙðÿ$$ÿHHÿllÿÿ´´>]|(›2º<ÙFðUÿ$mÿH…ÿlÿµÿ´Í>*]?|T›iº~Ù“ðªÿ$¶ÿHÂÿlÎÿÚÿ´æ>>]]||››ººÙÙððÿ$ÿÿHÿÿlÿÿÿÿ´ÿ*>?]T|i›~º“Ùªð¶$ÿÂHÿÎlÿÚÿæ´ÿ>](|2›<ºFÙUðm$ÿ…HÿlÿµÿÍ´ÿ,,,999EEERRR___lllxxx………’’’ŸŸŸ«««¸¸¸ÅÅÅÒÒÒÞÞÞëëëøøøðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿÿÿÿøööööööùøööW"Wöùùùùùøööm"SöùùøøøööWöùøöööøööùøøøøøöøööööøøòòîææòòøøøøøøòæîæêîòSW"êòæêWWWWWSêWWWWWSîêWWWWWòòSWWWæòòîîòÿ€ÿûÁÛßßÿÿÿÿÿÿÿÿ( @€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿðð™ÿÿwp7pð™ÿÿ÷swðð ™™™™ÿÿïp3ðð™™™™™ðöa¢pð™™wwöàpð™™w÷ÿ¯ ð™ÿwêêð™ÿÿ÷ÿð™ÿÿ÷ÿð™w÷÷÷ÿðwwww÷ÿÿÿÿ÷÷ÿÿÿÿ÷p€pxˆÿÿÿÿ÷ˆw÷xˆpwwwwww‡wwpwp€* xpwp€¢€pp***wpp¢¢¢¢¢ z****""r¢¢¢¢¢ pz*****'€p¢¢¢¢¢€‡ ****ˆ¢¢¢¢ˆˆ * xpp€ˆ‡x€ÿÿ€ÿÿÿßÿÏÿÇøðñÇóÏóßóÿóÿóÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿðÿÿøÿÿ( @€€€€€€€€€ÀÀÀÀÜÀðʦ>]|›ºÙð$$ÿHHÿllÿÿ´´ÿ>](|2›<ºFÙUð$mÿH…ÿlÿµÿ´Íÿ*>?]T|i›~º“Ùªð$¶ÿHÂÿlÎÿÚÿ´æÿ>>]]||››ººÙÙðð$ÿÿHÿÿlÿÿÿÿ´ÿÿ>*]?|T›iº~Ù“ðª$ÿ¶HÿÂlÿÎÿÚ´ÿæ>]|(›2º<ÙFðU$ÿmHÿ…lÿÿµ´ÿÍ>]|›ºÙð$ÿ$HÿHlÿlÿ´ÿ´>](|2›<ºFÙUðmÿ$…ÿHÿlµÿÍÿ´*>?]T|i›~º“Ùªð¶ÿ$ÂÿHÎÿlÚÿæÿ´>>]]||››ººÙÙððÿÿ$ÿÿHÿÿlÿÿÿÿ´>*]?|T›iº~Ù“ðªÿ¶$ÿÂHÿÎlÿÚÿæ´>]|(›2º<ÙFðUÿm$ÿ…HÿlÿµÿÍ´>]|›ºÙðÿ$$ÿHHÿllÿÿ´´>]|(›2º<ÙFðUÿ$mÿH…ÿlÿµÿ´Í>*]?|T›iº~Ù“ðªÿ$¶ÿHÂÿlÎÿÚÿ´æ>>]]||››ººÙÙððÿ$ÿÿHÿÿlÿÿÿÿ´ÿ*>?]T|i›~º“Ùªð¶$ÿÂHÿÎlÿÚÿæ´ÿ>](|2›<ºFÙUðm$ÿ…HÿlÿµÿÍ´ÿ,,,999EEERRR___lllxxx………’’’ŸŸŸ«««¸¸¸ÅÅÅÒÒÒÞÞÞëëëøøøðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿÿÿÿøööööööööööööööùøöööööööùùøöööööøøøå"êøöùùùøööööööîò"øøööùùùùùùùùùøöööööpWå""&ööùùùùùùùùùùøööömd"pSòöùùùùùùøöøøøøqne"êåöùùùùøöøøöøöödWêdöùùùøöøöööøøpdpdøööùùøöøööööööøööööùùøöøööööööøööööùùøöøøöøöøöøööööøöøøøøøøøøöøøööööööööööøöøøööööööööööøøòòîîîêææòòòòøööööööööööøòòîæòÿÿîòòÿîêæêøøøøøøøøøøøøòîUÿæîîêæêîîòUSWòòîæêòîîòSUWU"æêÿòîæòWUWUWUUæòòîêæWWWWWWWWWUSæê UUWUWUWUWUWUêUWWWWWWWWWWSîîSWUWUWUWUWSUæòêæWWWWWWWWWUîòòêæUWUWUWUWSæòòòîSUWWWWWUæòòòòêUWUUæîòòòîîîîòòòòòêîòÿÿ€ÿÿÿßÿÏÿÇøðñÇóÏóßóÿóÿóÿÿÿÿÿÿÿ€!ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿ€ÿÿàÿÿüÿÿgeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/etc/Windows/icons/gedcom.ico0000660000175200017530000001114612664543647025676 0ustar guillaumeguillaume(Fhn èÖ ¨¾ ( €€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿˆwˆˆ‡wˆwˆ€wp www¢‡‡wˆ "x‡¢¢¢pww‡ *****‡¢¢¢¢¢" ‡******‡¢¢¢¢¢¢x‡ **** €ˆp¢¢¢¢ €€ ***(€€p¢¢w€ˆˆˆwˆÀ€€€€àøü( €€€€€€€€€ÀÀÀÀÜÀðȤ """)))UUUMMMBBB9993f™Ì3333f3™3Ì3ÿff3fff™fÌfÿ™™3™f™™™Ì™ÿÌÌ3ÌfÌ™ÌÌÌÿÿfÿ™ÿÌ3333f3™3Ì3ÿ3333333f33™33Ì33ÿ3f3f33ff3f™3fÌ3fÿ3™3™33™f3™™3™Ì3™ÿ3Ì3Ì33Ìf3Ì™3ÌÌ3Ìÿ3ÿ33ÿf3ÿ™3ÿÌ3ÿÿff3fff™fÌfÿf3f33f3ff3™f3Ìf3ÿffff3fffff™ffÌf™f™3f™ff™™f™Ìf™ÿfÌfÌ3fÌ™fÌÌfÌÿfÿfÿ3fÿ™fÿÌÌÿÿÌ™™™3™™™™Ì™™33™f™3Ì™ÿ™f™f3™3f™f™™fÌ™3ÿ™™3™™f™™™™™Ì™™ÿ™Ì™Ì3fÌf™Ì™™ÌÌ™Ìÿ™ÿ™ÿ3™Ìf™ÿ™™ÿÌ™ÿÿÌ™3ÌfÌ™ÌÌ™3Ì33Ì3fÌ3™Ì3ÌÌ3ÿÌfÌf3™ffÌf™ÌfÌ™fÿ̙̙3Ì™fÌ™™Ì™ÌÌ™ÿÌÌÌÌ3ÌÌfÌÌ™ÌÌÌÌÌÿÌÿÌÿ3™ÿfÌÿ™ÌÿÌÌÿÿÌ3ÿfÿ™Ì3ÿ33ÿ3fÿ3™ÿ3Ìÿ3ÿÿfÿf3Ìffÿf™ÿfÌÌfÿÿ™ÿ™3ÿ™fÿ™™ÿ™Ìÿ™ÿÿÌÿÌ3ÿÌfÿÌ™ÿÌÌÿÌÿÿÿ3Ìÿfÿÿ™ÿÿÌffÿfÿffÿÿÿffÿfÿÿÿfÁÁÁ___www†††–––ËË˲²²×××ÝÝÝãããêêêñññøøøðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿÿÿÿ¼¼’’’mCC¼¼¼¼¼¼’C¼ÿÿ’¼¼ÿ’mCm¼’-ÿC’’mCm’’¼-'3¼¼’Cm¼’’¼'-3-"Cmÿ¼’C¼¼3-3-3--C¼¼’¼mC333333333-'C¼m--3-3-3-3-3-¼m-3333333333'’¼’'3-3-3-3-3'-C¼¼mC333333333-’¼¼mC-3-3-3-3'C¼¼¼’'-33333-C¼¼¼¼m-3--C’¼¼¼’’’’¼¼¼¼¼m’¼À€€€€€€Àðþ( @€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆˆˆ‡wwwwˆˆˆˆpwwwxˆˆˆwwwwxˆˆ€ÿÿÿø‡wx€ˆ€ÿÿ‡ˆÿø‡px€‡ÿÿ‡xÿÿÿˆ€ˆ ww‡pwwx€‡*2øpwwp€€¢¢ xÿ€xˆˆx€p**"xÿ‡wx€p"¢ ¢"xÿˆpxp***"ÿˆwx¢  ¢"wˆøx€* ****" x€¢ ¢ ¢¢¢"€** * ***"€¢¢¢¢¢ ¢ ¢ x€ * * "ˆ ¢¢¢ ¢ ˆ * x€ ¢¢  ¢¢ ¢ x** * *"ˆ€¢¢ ¢¢¢ˆˆp**** *"€ˆ"ª ¢ ¢ x€‡*ª * ˆˆ‡"¢ ¢€ˆ€** €ˆ‡" ˆˆpˆˆˆˆˆ€ÿÿÿ?þþøðàÀÀ€€€€€€€€€€€€€€€Ààø?üÿÿÀÿÿðÿÿüÿ( @€€€€€€€€€ÀÀÀÀÜÀðʦÔðÿ±âÿŽÔÿkÆÿH¸ÿ%ªÿªÿ’Üz¹b–Js2PÔãÿ±ÇÿŽ«ÿkÿHsÿ%WÿUÿIÜ=¹1–%sPÔÔÿ±±ÿŽŽÿkkÿHHÿ%%ÿþܹ–sPãÔÿDZÿ«ŽÿkÿsHÿW%ÿUÿIÜ=¹1–%sPðÔÿâ±ÿÔŽÿÆkÿ¸Hÿª%ÿªÿ’Üz¹b–Js2PÿÔÿÿ±ÿÿŽÿÿkÿÿHÿÿ%ÿþþÜܹ¹––ssPPÿÔðÿ±âÿŽÔÿkÆÿH¸ÿ%ªÿªÜ’¹z–bsJP2ÿÔãÿ±ÇÿŽ«ÿkÿHsÿ%WÿUÜI¹=–1s%PÿÔÔÿ±±ÿŽŽÿkkÿHHÿ%%þܹ–sPÿãÔÿDZÿ«ŽÿkÿsHÿW%ÿUÜI¹=–1s%PÿðÔÿâ±ÿÔŽÿÆkÿ¸Hÿª%ÿªÜ’¹z–bsJP2ÿÿÔÿÿ±ÿÿŽÿÿkÿÿHÿÿ%þþÜܹ¹––ssPPðÿÔâÿ±ÔÿŽÆÿk¸ÿHªÿ%ªÿ’Üz¹b–Js2PãÿÔÇÿ±«ÿŽÿksÿHWÿ%UÿIÜ=¹1–%sPÔÿÔ±ÿ±ŽÿŽkÿkHÿH%ÿ%þܹ–sPÔÿã±ÿÇŽÿ«kÿHÿs%ÿWÿUÜI¹=–1s%PÔÿð±ÿâŽÿÔkÿÆHÿ¸%ÿªÿªÜ’¹z–bsJP2Ôÿÿ±ÿÿŽÿÿkÿÿHÿÿ%ÿÿþþÜܹ¹––ssPPòòòæææÚÚÚÎÎζ¶¶ªªªžžž’’’†††zzznnnbbbVVVJJJ>>>222&&&ðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿÿÿÿççççççççççççççççïôõõóóòòñíççççççççìóëééêðóôðíççççççççççìóøãÿÿÿÿöãåèïñóôóñïçççççççìíñåÿÿÿâèéçäââãå÷øïñòñïççççìðõõíÿâããäøôôñïéäâÿââããçççççìñõõ»»õ÷âøñïê÷øñòõõóïíììøêçççìñ»»ÅÅ»ôøãåøòôðíêëíðóõòçççìõõÅÅÅÅÅ»ðåâãèñõóïêèç÷èèëççççñ»ÅÅÅÅÅÅ»õôíåâãçîòõõôòïîêççççñ»ÅÅÅÅõÅÅÅ»õôïèãâäèíñôðççççñ»ÅÅÅõõõõÅÅÅ»õóøåââãäçêêêççççóÅÅÅõõÅÅõõÅÅÅÅÅ»óïìèåãçêççççõÅÅÅõÅÅÅÅÅÅõõÅÅÅÅÅ»»õõõõõêçççìõõÅÅÅõõõÅÅÅõõõõõÅÅÅÅÅÅ»»õõìççìõ»ÅÅÅÅÅõõÅõõÅÅÅõÅõÅÅÅÅÅÅ»õõìççìõ»ÅÅÅÅÅÅÅÅõÅÅÅõÅÅõÅÅÅõÅÅ»ôëçççìõÅÅõõõõÅÅÅõõõõõÅõÅÅÅÅõÅ»îçççìñÅÅõÅÅõÅÅÅÅÅÅõÅÅõõõÅõÅÅõóçççìõÅÅõÅõõÅÅõõõÅÅÅõõÅÅõõÅÅïçççìõõÅõÅÅÅÅÅõÅõõõÅÅÅÅÅõÅÅ»õçççìíó»ÅõõÅÅõõõÅÅÅÅõõÅÅÅÅÅõðççççíõô»ÅÅÅÅõÅÅõÅÅõõõõÅÅÅÅõìçççìíô»ÅÅÅõõÅÅÅÅõÅÅõÅÅÅ»óçççççíóõ»ÅÅÅõõÅõÅÅÅõÅÅÅ!îççççççíó»ÅÅÅÅÅõõÅõõÅÅÅóççççççïõô»ÅÅÅÅõõÅÅ»óíçççççì»ÅÅÅÅÅÅòìçççççìóó»Å»»ìççççççììóïìçççççììììççÿÿÿÿþÿüÿøðàÀ€€€€Àà?øþÿ€ÿàÿÿüÿgeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/etc/Windows/icons/consang.ico0000660000175200017530000001114612664543647026070 0ustar guillaumeguillaume(Fhn èÖ ¨¾ ( €€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ  € ð ð # € # ¨   ( #€ð €€¢º¢ò¨ª¢€€  ²¯¢¢ò¯¨ò Š**º/*ª( €€€€€€€€€ÀÀÀÀÜÀðʦ>]|›ºÙð$$ÿHHÿllÿÿ´´ÿ>](|2›<ºFÙUð$mÿH…ÿlÿµÿ´Íÿ*>?]T|i›~º“Ùªð$¶ÿHÂÿlÎÿÚÿ´æÿ>>]]||››ººÙÙðð$ÿÿHÿÿlÿÿÿÿ´ÿÿ>*]?|T›iº~Ù“ðª$ÿ¶HÿÂlÿÎÿÚ´ÿæ>]|(›2º<ÙFðU$ÿmHÿ…lÿÿµ´ÿÍ>]|›ºÙð$ÿ$HÿHlÿlÿ´ÿ´>](|2›<ºFÙUðmÿ$…ÿHÿlµÿÍÿ´*>?]T|i›~º“Ùªð¶ÿ$ÂÿHÎÿlÚÿæÿ´>>]]||››ººÙÙððÿÿ$ÿÿHÿÿlÿÿÿÿ´>*]?|T›iº~Ù“ðªÿ¶$ÿÂHÿÎlÿÚÿæ´>]|(›2º<ÙFðUÿm$ÿ…HÿlÿµÿÍ´>]|›ºÙðÿ$$ÿHHÿllÿÿ´´>]|(›2º<ÙFðUÿ$mÿH…ÿlÿµÿ´Í>*]?|T›iº~Ù“ðªÿ$¶ÿHÂÿlÎÿÚÿ´æ>>]]||››ººÙÙððÿ$ÿÿHÿÿlÿÿÿÿ´ÿ*>?]T|i›~º“Ùªð¶$ÿÂHÿÎlÿÚÿæ´ÿ>](|2›<ºFÙUðm$ÿ…HÿlÿµÿÍ´ÿ,,,999EEERRR___lllxxx………’’’ŸŸŸ«««¸¸¸ÅÅÅÒÒÒÞÞÞëëëøøøðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿÿÿÿVVVVVúVVVVWVVVVVVæRñVç\ñRWññSñæVñVñæUææWñVéU9VúVDVúVJVJVJVú ÷Sé RíéîçSñW÷99ñçWçRRéDR9æRSçD JRñYèæMéUJVñRñRèDñ UæVñWæî9URWçRVçSR9UWñRURæUVDRRæJ( @€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ"  **********ª***    €Š  ð € °ˆ #ð€   ø ˆ"€ "€  * ó"€"ˆ  ° ˆ  ø ð"ð Š******ªªª*ª* ð € ð¢ð𢈠€ˆˆ*€‚ ˆ¢ð«ˆ¨€ò ˆŠó ˆ¨€ÿ€òˆ"ˆ/¯ ð"ð*ð¨ðˆ  € ¸ ò¢¢¿ò¢ªò¢¯¢ª»¢ ºƒ" €   ð* ð(‚ ú ¿+€    ¿¢¯û¢¢ª¨òªªú¢¯ú "   ¢¯ ¢¯¢ª¢ª¨òª«òª¯ò */""² ""ú ( @€€€€€€€€€ÀÀÀÀÜÀðʦÌÿÿ™ÿÿfÿÿ3ÿÿÿÌÿÌÌÿ™ÌÿfÌÿ3ÌÿÌÿÿ™ÿÌ™ÿ™™ÿf™ÿ3™ÿ™ÿÿfÿÌfÿ™fÿffÿ3fÿfÿÿ3ÿÌ3ÿ™3ÿf3ÿ33ÿ3ÿÌÿ™ÿfÿ3ÿÿÿÌÌÿÌ™ÿÌfÿÌfÿÌ3ÿÌÿÌÿÌÌÌÌÌ™ÌÌfÌÌ3ÌÌÌÌÿ™Ì̙̙™Ìf™Ì3™Ì™ÌÿfÌÌfÌ™fÌffÌ3fÌfÌÿ3ÌÌ3Ì™3Ìf3Ì33Ì3ÌÿÌÌÌ™ÌfÌ3ÌÌÿÿ™Ìÿ™™ÿ™fÿ™3ÿ™ÿ™ÿÌ™ÌÌ™™Ì™fÌ™3̙̙ÿ™™Ì™™™™™f™™3™™™™ÿf™Ìf™™f™ff™3f™f™ÿ3™Ì3™™3™f3™33™3™ÿ™Ì™™™f™3™™ÿÿfÌÿf™ÿffÿf3ÿfÿfÿÌfÌÌf™ÌffÌf3ÌfÌfÿ™fÌ™f™™ff™f3™f™fÿffÌff™fffff3ffffÿ3fÌ3f™3ff3f33f3fÿfÌf™fff3ffÿÿ3Ìÿ3™ÿ3fÿ33ÿ3ÿ3ÿÌ3ÌÌ3™Ì3fÌ33Ì3Ì3ÿ™3Ì™3™™3f™33™3™3ÿf3Ìf3™f3ff33f3f3ÿ33Ì33™33f3333333ÿ3Ì3™3f3333Ìÿ™ÿfÿ3ÿÿÌÌÌ™ÌfÌ3ÌÌÿ™Ì™™™f™3™™ÿfÌf™ffff3fÿ3Ì3™3f3333Ì™f3Ý»ªˆwUD"Ý»ªˆwUD"ÝÝÝUUUwwwwwwDDD"""wUD"ðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿÿÿÿÖäÖäääääääääääúäääääääääÄúäääääääääÖÊÊäèäÖ³^³XääÖï3êï3ääÖï3¡^ï3ãêäÖ‰3QWï3äÖêãê3‰,¡â33äè³^Öäâ3ïê3Äèì33³èäï3âÖäï3âʉéãê³ ‰âÖäâ3ïÖä‰3êã³Êʳ ³êãê3‰Öä3‰ÊÊìêãé÷÷äÖ‰3èä3ïÄÖ ¡äÄúää¡,äääúÄää¡,äú¡,ää¡RäÄúä÷3âÄèâ3‰èäâ3ïä­3ï3Äèâ3÷èĉ3âÖ¡^3‰äW÷ï3èÄï3åÊâ3ïÖ¡3‰3ä3ïï3Äè‰3êãê÷÷¡ ³³ }3ïï3Ä3‰Êʉ3ä3ïƒ, ³ï,Ê3ïêãé3‰Ê,ïé, ­,ê3ïèÄ3ïÖQ÷Ö¡3¡,è3ï³,,âÖ¡3Ö¡3âê› ì›,äääää},›ääää›,ääÄú,¡äãã},ääÄ­ }3‰åÊ¡3äè3ïÄÖâ3‰éã≠}èâ3ïêãê¡,äÖ3ïèÄì ›éì,,ç33âÊå­,äÖ3‰Äè­,Wääää, ,¡äääúÄä¡,ääúÄ},úää¡ Q¡ä³ ‰åÄéèÄï,ÖäÖï,èé› ³ãÄä¡ ¡äÄúÄääúÄ¡,Ääúä,QäÄúÄQQÄãÊÄÄä3‰éÄåéã­,ÊÖä‰,Êéãéê­ ¡Êgeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/etc/Windows/icons/gw_folder.ico0000660000175200017530000002362612664543647026416 0ustar guillaumeguillaume(fhŽ èö ¨Þ 00h†00¨î( €€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿwwwwwww¸¸¸¸·‹~k‹‡·§™¸·‹¬.®{‡¸ããz¸·‹ªNꋇ¸ºê踷ÿÿÿÿÿ÷{‹‹‹www¸¸·wwpÿÿÿÿ€€ÿÁÿÿÿ( €€€€€€€€€ÀÀÀÀÜÀðʦ """)))UUUMMMBBB999€|ÿPPÿ“ÖÿìÌÆÖïÖçç©­3f™Ì3333f3™3Ì3ÿff3fff™fÌfÿ™™3™f™™™Ì™ÿÌÌ3ÌfÌ™ÌÌÌÿÿfÿ™ÿÌ3333f3™3Ì3ÿ3333333f33™33Ì33ÿ3f3f33ff3f™3fÌ3fÿ3™3™33™f3™™3™Ì3™ÿ3Ì3Ì33Ìf3Ì™3ÌÌ3Ìÿ3ÿ33ÿf3ÿ™3ÿÌ3ÿÿff3fff™fÌfÿf3f33f3ff3™f3Ìf3ÿffff3fffff™ffÌf™f™3f™ff™™f™Ìf™ÿfÌfÌ3fÌ™fÌÌfÌÿfÿfÿ3fÿ™fÿÌÌÿÿÌ™™™3™™™™Ì™™33™f™3Ì™ÿ™f™f3™3f™f™™fÌ™3ÿ™™3™™f™™™™™Ì™™ÿ™Ì™Ì3fÌf™Ì™™ÌÌ™Ìÿ™ÿ™ÿ3™Ìf™ÿ™™ÿÌ™ÿÿÌ™3ÌfÌ™ÌÌ™3Ì33Ì3fÌ3™Ì3ÌÌ3ÿÌfÌf3™ffÌf™ÌfÌ™fÿ̙̙3Ì™fÌ™™Ì™ÌÌ™ÿÌÌÌÌ3ÌÌfÌÌ™ÌÌÌÌÌÿÌÿÌÿ3™ÿfÌÿ™ÌÿÌÌÿÿÌ3ÿfÿ™Ì3ÿ33ÿ3fÿ3™ÿ3Ìÿ3ÿÿfÿf3Ìffÿf™ÿfÌÌfÿÿ™ÿ™3ÿ™fÿ™™ÿ™Ìÿ™ÿÿÌÿÌ3ÿÌfÿÌ™ÿÌÌÿÌÿÿÿ3Ìÿfÿÿ™ÿÿÌffÿfÿffÿÿÿffÿfÿÿÿf!¥___www†††–––ËË˲²²×××ÝÝÝãããêêêñññøøøðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿÿÿÿ0yyyyyyyyyyyyy0Ú š ##š šššy0à ¼›C*vš ššy0à¼Öº##,,š šy0à ›­I›››˜š y0à ›*›#r˜š šy0à vw…››w š y0à  ¼›››   šy0ÃÃÃÃÃÃÃÃÃÃày0yyyyyyy0000000ôÃà 000000ÿÿÿÿ€€Àÿÿÿ( @€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿs333333333333330¸¸¸¸¸¸¸¸¸¸¸¸¸¸0‹‹‹‹‹‹‹‹‹‹0¸¸¸¸¸¸q8¸¸¸¸¸0‹‹‹‹‹‡ƒ1‹‹‹‹‹‹0¸¸¸¸¸ªq(¸¸¸¸0‹‹‹‹fª£7ª{‹‹‹‹0¸¸¸·¬Ì£gs¸¸¸¸0‹‹‹‡©™3 ‹‹‹‹0¸¸¸¸ªª¡& ªh¸¸¸0‹‹‹‚—»¶ªª‹‹‹0¸¸¸²‘!  ˜¸¸¸0‹‹‹‡ª¡ªª ›‹‹‹0¸¸¸¸vÁª¦™ª§¸¸¸0‹‹‹‹†É¬š™ª«‹‹‹0¸¸¸¸¶ª¬šª§¸¸¸¸0‹‹‹‹‹j*ªª§‹‹‹‹0¸¸¸¸¸¸·¦·x¸¸¸¸0‹‹‹‹‹‹‹‹‹‹‹‹‹‹0¸¸¸¸¸¸¸¸¸¸¸¸¸¸0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ0xˆˆˆˆˆˆˆwwwwwwwû‹‹‹‹‹‡¸¸¸¸¸pÿÿÿÿ÷wwwwpÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÀÿÿàÿÿðÿÿÿÿÿÿ( @€€€€€€€€€ÀÀÀÀÜÀðʦ """)))UUUMMMBBB999€|ÿPPÿ“ÖÿìÌÆÖïÖçç©­3f™Ì3333f3™3Ì3ÿff3fff™fÌfÿ™™3™f™™™Ì™ÿÌÌ3ÌfÌ™ÌÌÌÿÿfÿ™ÿÌ3333f3™3Ì3ÿ3333333f33™33Ì33ÿ3f3f33ff3f™3fÌ3fÿ3™3™33™f3™™3™Ì3™ÿ3Ì3Ì33Ìf3Ì™3ÌÌ3Ìÿ3ÿ33ÿf3ÿ™3ÿÌ3ÿÿff3fff™fÌfÿf3f33f3ff3™f3Ìf3ÿffff3fffff™ffÌf™f™3f™ff™™f™Ìf™ÿfÌfÌ3fÌ™fÌÌfÌÿfÿfÿ3fÿ™fÿÌÌÿÿÌ™™™3™™™™Ì™™33™f™3Ì™ÿ™f™f3™3f™f™™fÌ™3ÿ™™3™™f™™™™™Ì™™ÿ™Ì™Ì3fÌf™Ì™™ÌÌ™Ìÿ™ÿ™ÿ3™Ìf™ÿ™™ÿÌ™ÿÿÌ™3ÌfÌ™ÌÌ™3Ì33Ì3fÌ3™Ì3ÌÌ3ÿÌfÌf3™ffÌf™ÌfÌ™fÿ̙̙3Ì™fÌ™™Ì™ÌÌ™ÿÌÌÌÌ3ÌÌfÌÌ™ÌÌÌÌÌÿÌÿÌÿ3™ÿfÌÿ™ÌÿÌÌÿÿÌ3ÿfÿ™Ì3ÿ33ÿ3fÿ3™ÿ3Ìÿ3ÿÿfÿf3Ìffÿf™ÿfÌÌfÿÿ™ÿ™3ÿ™fÿ™™ÿ™Ìÿ™ÿÿÌÿÌ3ÿÌfÿÌ™ÿÌÌÿÌÿÿÿ3Ìÿfÿÿ™ÿÿÌffÿfÿffÿÿÿffÿfÿÿÿf!¥___www†††–––ËË˲²²×××ÝÝÝãããêêêñññøøøðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿÿÿÿ""""""""""""""""""""""""""""""0yyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"0õš š š  š š   š š  šš š ššš šy"0õ   š š  š  mJ##*##  ššš ššššy"0õš     š  šš *###  ššš ššššššy"0õ  š š  š   ’ ##Jš  ššš š  ššy"0õ         š›{wm$K#¼I   šššš šy"0õ š š  š pv{›{D#r{›wšššš ššššy"0õ       ’›Šüü›###vVVQšš šš š y"0õ      š¼{GGù##I#p  š  šššy"0õ    š   {{›{{#IvI{›{vš ššš šy"0õ       -½wûûûv#’E’{›{qš  šš y"0õ      š-½J##I{#oFDJJ  šš  šy"0õ       ˜{›{${›#J{›JÿG š   š y"0õ        ˜vÿ {{œvGG›{{¼  šš šy"0õ         vÿ&{…ã›GG{›{ š   š y"0õ         q{{›üù{›{{¼   š š šy"0õ          v›r›{›{›{¼  š    šy"0õ             ‘›v ’¼ š  šš   y"0õ             š š š   š   š šy"0õ                   š  š   š y 0õõõõõõõõõõõõõõõõõõõõõõõõõõõõõ0yyyyyyyyyyyyyyy000000000000000ö            0 0õ          0 0õ        0 000000000 ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÀÿÿàÿÿðÿÿÿÿÿÿ(0`€€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿ833333333333333333333330?¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸0?‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹0?¸¸¸¸¸¸¸¸¸wqqs8¸¸¸¸¸¸¸0?‹‹‹‹‹‹‹‹‹‡s1‹‹‹‹‹‹‹‹0?¸¸¸¸¸¸¸¸¸¸±7¸¸¸¸¸¸¸¸¸0?‹‹‹‹‹‹‹‹‹‹{‹‹‹‹‹‹‹‹‹0?¸¸¸¸¸¸¸¸z§±¸¸¸¸¸¸¸¸¸¸0?‹‹‹‹‹‹‹‹ê®§7‹w‹‹‹‹‹‹‹‹0?¸¸¸¸¸¸·ªªªázªç¸¸¸¸¸¸¸0?‹‹‹‹‹‹Šªªªãqꪮ‹‹‹‹‹‹‹0?¸¸¸¸¸¸z¬Ìês1{»¸¸¸¸¸¸¸0?‹‹‹‹‹‹ª©™“~y™›‹‹‹‹‹‹0?¸¸¸¸¸¸º®ªªç7âbg¸¸¸¸¸¸0?‹‹‹‹‹‹‡êªªwz§ªªªë‹‹‹‹‹0?¸¸¸¸¸¸/žë»::§~ªªê¸¸¸¸¸0?‹‹‹‹‹‹/“|Ìz:™™êªë‹‹‹‹‹0?¸¸¸¸¸¸/žq1ª:——9ù¸¸¸¸¸¸0?‹‹‹‹‹‹~ªª~ªsêªïÿ‹‹‹‹‹‹0?¸¸¸¸¸¸·ª®>ª~7wªúx¸¸¸¸¸0?‹‹‹‹‹‹‹Š™šî~©™ªª«‹‹‹‹‹0?¸¸¸¸¸¸¸º™šdù©™ªªè¸¸¸¸¸0?‹‹‹‹‹‹‹Žª®dùꪮw‹‹‹‹‹‹0?¸¸¸¸¸¸¸·êªªêªª®¸¸¸¸¸¸¸0?‹‹‹‹‹‹‹‹®çêªçꮋ‹‹‹‹‹‹0?¸¸¸¸¸¸¸¸¸¸¾ªè~踸¸¸¸¸¸0?‹‹‹‹‹‹‹‹‹‹‹®{‹‹‹‹‹‹‹‹‹0?¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸0?‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹0?¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸0?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ8¸¸¸¸¸¸¸¸¸¸¸³3333333330?‹‹‹‹‹‹‹‹‹‹‹0ø¸¸¸¸¸¸¸¸¸³?‹‹‹‹‹‹‹‹‹0ø¸¸¸¸¸¸¸³?‹‹‹‹‹‹‹0ÿÿÿÿÿÿó3333330ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?ÿÿ€ÿÿÀÿÿÿàÿÿÿðÿÿÿøÿÿÿüÿÿÿÿÿÿÿÿÿ(0` €€€€€€€€€ÀÀÀÀÜÀðʦ """)))UUUMMMBBB999€|ÿPPÿ“ÖÿìÌÆÖïÖçç©­3f™Ì3333f3™3Ì3ÿff3fff™fÌfÿ™™3™f™™™Ì™ÿÌÌ3ÌfÌ™ÌÌÌÿÿfÿ™ÿÌ3333f3™3Ì3ÿ3333333f33™33Ì33ÿ3f3f33ff3f™3fÌ3fÿ3™3™33™f3™™3™Ì3™ÿ3Ì3Ì33Ìf3Ì™3ÌÌ3Ìÿ3ÿ33ÿf3ÿ™3ÿÌ3ÿÿff3fff™fÌfÿf3f33f3ff3™f3Ìf3ÿffff3fffff™ffÌf™f™3f™ff™™f™Ìf™ÿfÌfÌ3fÌ™fÌÌfÌÿfÿfÿ3fÿ™fÿÌÌÿÿÌ™™™3™™™™Ì™™33™f™3Ì™ÿ™f™f3™3f™f™™fÌ™3ÿ™™3™™f™™™™™Ì™™ÿ™Ì™Ì3fÌf™Ì™™ÌÌ™Ìÿ™ÿ™ÿ3™Ìf™ÿ™™ÿÌ™ÿÿÌ™3ÌfÌ™ÌÌ™3Ì33Ì3fÌ3™Ì3ÌÌ3ÿÌfÌf3™ffÌf™ÌfÌ™fÿ̙̙3Ì™fÌ™™Ì™ÌÌ™ÿÌÌÌÌ3ÌÌfÌÌ™ÌÌÌÌÌÿÌÿÌÿ3™ÿfÌÿ™ÌÿÌÌÿÿÌ3ÿfÿ™Ì3ÿ33ÿ3fÿ3™ÿ3Ìÿ3ÿÿfÿf3Ìffÿf™ÿfÌÌfÿÿ™ÿ™3ÿ™fÿ™™ÿ™Ìÿ™ÿÿÌÿÌ3ÿÌfÿÌ™ÿÌÌÿÌÿÿÿ3Ìÿfÿÿ™ÿÿÌffÿfÿffÿÿÿffÿfÿÿÿf!¥___www†††–––ËË˲²²×××ÝÝÝãããêêêñññøøøðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿÿÿÿ0y0000000000000000000000000000000000000000000000õ š  š    š   š š šš š  ššš šš š šššššššššš š00õ      š š š š  š š  š šš  šš š ššš š šš šššš00õ  š š      š š  š msmDDDKKKJ"ššš šššš šššššš00õ      š š     š  ššmK***KKKšš  šš š šššš ššš00õ          š š  š   š*K*K*nš ššš ššššš š šš š00õ   š  š  š    š š š šKK*mš š š š š š ššššššš00õ            š   qœ›qšK*Kš š š ššš šššš š ššš00õ       š  š  š šœ›››wm*Cš ’’šš  šš š ššššš š00õ     š   š  š’vwwœ›œ›D*Jlœ›œ›’šš šš šš š ššš00õ            ¼›œ›››œ››*K*››œ›››š š  šš ššš š 00õ        š  š’œ›ÈÈȹœDJ*K*DqY8Y8š ššš šš šššš00õ            ¼››ãããL*D#**mœCùGùùšš š š šš š š00õ             œ›œ›œ›œ›KKœ#P›IHIHr š ššš  šššš00õ          š š’œ››¸¹¸IDK››Kw›››œ›› š š ššš š 00õ           Â-ÿ%œœûûû*–*œrDÀ›œ›œ›› š š š ššš00õ           ÂOÿ%#üüüq›*›oGãLœ›››œš š šš š š 00õ           ÂNâKœqD*D›œ*w”nŒ’*G½Gã š š š šš š00õ            q›œ›››Kœ››K*›œ››ã½ã”š š š šš šš00õ             q›œ›œ*œ›œDœ#$$Kw—À—r  š š š š š00õ               œGG—œ›q›œûûûä›››œšš š š š š 00õ               œGŽG—†ÿù›ùùù—œ›œ–  š š  š šš00õ               ›››œ›…ÿù››œ›››qq  š  š šš š 00õ               r›œ›œ›œ›œ›œ›œ›œ   š šš š  š š00õ                w››rœ›››œq››œ›š š    š šš š 00õ                    ¼œ›œ› qœ›Â   š š  š  š š00õ                     ¼œ›r    š  š š š š š š 00õ                          š   š      š  šš š00õ                            š  š š š  š   š 00õ                                    š  š š š00õõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõõ0yyyyyyyyyyyyyyyyyyyyyyyy000000000000000000000õ                      00õ                    00õ                  00õ                00õ              00õõõõõõõõõõõõõ00000000000000ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?ÿÿ€ÿÿÀÿÿÿàÿÿÿðÿÿÿøÿÿÿüÿÿÿÿÿÿÿÿÿgeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/etc/Windows/icons/ged2gw.ico0000660000175200017530000001114612664543647025617 0ustar guillaumeguillaume(Fhn èÖ ¨¾ ( €€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿ3p Æc~™™é“1 nsw¦êwz𠟣`êîððððwr!zªª **rª¢p *÷ððÿÃÿçûÁÛßßÿÿÿÿÿÿÿÿÿ( €€€€€€€€€ÀÀÀÀÜÀðʦ>]|›ºÙð$$ÿHHÿllÿÿ´´ÿ>](|2›<ºFÙUð$mÿH…ÿlÿµÿ´Íÿ*>?]T|i›~º“Ùªð$¶ÿHÂÿlÎÿÚÿ´æÿ>>]]||››ººÙÙðð$ÿÿHÿÿlÿÿÿÿ´ÿÿ>*]?|T›iº~Ù“ðª$ÿ¶HÿÂlÿÎÿÚ´ÿæ>]|(›2º<ÙFðU$ÿmHÿ…lÿÿµ´ÿÍ>]|›ºÙð$ÿ$HÿHlÿlÿ´ÿ´>](|2›<ºFÙUðmÿ$…ÿHÿlµÿÍÿ´*>?]T|i›~º“Ùªð¶ÿ$ÂÿHÎÿlÚÿæÿ´>>]]||››ººÙÙððÿÿ$ÿÿHÿÿlÿÿÿÿ´>*]?|T›iº~Ù“ðªÿ¶$ÿÂHÿÎlÿÚÿæ´>]|(›2º<ÙFðUÿm$ÿ…HÿlÿµÿÍ´>]|›ºÙðÿ$$ÿHHÿllÿÿ´´>]|(›2º<ÙFðUÿ$mÿH…ÿlÿµÿ´Í>*]?|T›iº~Ù“ðªÿ$¶ÿHÂÿlÎÿÚÿ´æ>>]]||››ººÙÙððÿ$ÿÿHÿÿlÿÿÿÿ´ÿ*>?]T|i›~º“Ùªð¶$ÿÂHÿÎlÿÚÿæ´ÿ>](|2›<ºFÙUðm$ÿ…HÿlÿµÿÍ´ÿ,,,999EEERRR___lllxxx………’’’ŸŸŸ«««¸¸¸ÅÅÅÒÒÒÞÞÞëëëøøøðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿÿÿÿêæ%#%éù mp%êpùùùùùp%%# ùùppî=îîpmùppééépÿùÿp%p opppòòòîææòòòÿæîæêîòSW"êòæêWWWWWSêWWWWWSîêWWWWWòòSWWWæòòîîòÿÃÿçûÁÛßßÿÿÿÿÿÿÿÿÿ( @€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿs1p™îó77p™w®£®p ™™™™ ìês1꣙™™™™©—c#a™™êî£zzêà™™~~w7®§™ú“3ã7‘wp™®w§®?™§Ùãú³ê癩yož® êîzêç®®®®¯êð€pxˆ€ˆw÷xˆp‡wwpwp€* xpwp€¢€pp***wpp¢¢¢¢¢ z****""r¢¢¢¢¢ pz*****'€p¢¢¢¢¢€‡ ****ˆ¢¢¢¢ˆˆ * xpp€ˆ‡x€ÿÿøÿÿü?ÿßö?ÿÏàÿÇ€ø€ð€ñÇ€óÏóßóÿ€óÿÀóÿÀÿÿàÿÿàÿÿþ'€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿàÿÿøÿÿ( @€€€€€€€€€ÀÀÀÀÜÀðʦ>]|›ºÙð$$ÿHHÿllÿÿ´´ÿ>](|2›<ºFÙUð$mÿH…ÿlÿµÿ´Íÿ*>?]T|i›~º“Ùªð$¶ÿHÂÿlÎÿÚÿ´æÿ>>]]||››ººÙÙðð$ÿÿHÿÿlÿÿÿÿ´ÿÿ>*]?|T›iº~Ù“ðª$ÿ¶HÿÂlÿÎÿÚ´ÿæ>]|(›2º<ÙFðU$ÿmHÿ…lÿÿµ´ÿÍ>]|›ºÙð$ÿ$HÿHlÿlÿ´ÿ´>](|2›<ºFÙUðmÿ$…ÿHÿlµÿÍÿ´*>?]T|i›~º“Ùªð¶ÿ$ÂÿHÎÿlÚÿæÿ´>>]]||››ººÙÙððÿÿ$ÿÿHÿÿlÿÿÿÿ´>*]?|T›iº~Ù“ðªÿ¶$ÿÂHÿÎlÿÚÿæ´>]|(›2º<ÙFðUÿm$ÿ…HÿlÿµÿÍ´>]|›ºÙðÿ$$ÿHHÿllÿÿ´´>]|(›2º<ÙFðUÿ$mÿH…ÿlÿµÿ´Í>*]?|T›iº~Ù“ðªÿ$¶ÿHÂÿlÎÿÚÿ´æ>>]]||››ººÙÙððÿ$ÿÿHÿÿlÿÿÿÿ´ÿ*>?]T|i›~º“Ùªð¶$ÿÂHÿÎlÿÚÿæ´ÿ>](|2›<ºFÙUðm$ÿ…HÿlÿµÿÍ´ÿ,,,999EEERRR___lllxxx………’’’ŸŸŸ«««¸¸¸ÅÅÅÒÒÒÞÞÞëëëøøøðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿÿÿÿêéæ#%##é%##ùò%#éùùgppò%%#òæùùù emfpf%#êdpeùùùùùùùùùfp‡‡fæ%##nMM1ùùùùùùùùùùpf%m%æ#m ùùùùùùòpfppméænædpdnùùùùîpp+î%=#îîdpdmùùùîpé%%pé#æégéùùpfpoéfé#édpéÿùùêÝùpéfn''pddòùùp…ÿp%dpdppfytêdpddò fofpdpdpdòopnîòòòîîîêææòòòòòòîæòÿÿîòòÿîêæêòîUÿæîîêòæêîîòUSWòòîæêòîîòSUWU"æêÿòîæòWUWUWUUæòòîêæWWWWWWWWWUSæê UUWUWUWUWUWUêUWWWWWWWWWWSîîSWUWUWUWUWSUæòêæWWWWWWWWWUîòòêæUWUWUWUWSæòòòîSUWWWWWUæòòòòêUWUUæîòòòîîîîòòòòòêîòÿÿøÿÿü?ÿßö?ÿÏàÿÇ€ø€ð€ñÇ€óÏóßóÿ€óÿÀóÿÀÿÿàÿÿàÿÿþ'€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿˆÿÿàÿÿüÿÿgeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/etc/Windows/icons/gw_config.ico0000660000175200017530000002362612664543647026410 0ustar guillaumeguillaume(fhŽ èö ¨Þ 00h†00¨î( €€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿwwwwwpÿÿÿÿÿpÿÿð0ÿpÿs³pÿÿ; ?pÿs³pÿó÷7ÿpþ£oÿpï:ÿÿpj¨ ÿpúã¨ïÿpúª®¯ÿpþêêðððŽÀ€€€€€€€€€€€€€Àê¯( €€€€€€€€€ÀÀÀÀÜÀðȤ """)))UUUMMMBBB9993f™Ì3333f3™3Ì3ÿff3fff™fÌfÿ™™3™f™™™Ì™ÿÌÌ3ÌfÌ™ÌÌÌÿÿfÿ™ÿÌ3333f3™3Ì3ÿ3333333f33™33Ì33ÿ3f3f33ff3f™3fÌ3fÿ3™3™33™f3™™3™Ì3™ÿ3Ì3Ì33Ìf3Ì™3ÌÌ3Ìÿ3ÿ33ÿf3ÿ™3ÿÌ3ÿÿff3fff™fÌfÿf3f33f3ff3™f3Ìf3ÿffff3fffff™ffÌf™f™3f™ff™™f™Ìf™ÿfÌfÌ3fÌ™fÌÌfÌÿfÿfÿ3fÿ™fÿÌÌÿÿÌ™™™3™™™™Ì™™33™f™3Ì™ÿ™f™f3™3f™f™™fÌ™3ÿ™™3™™f™™™™™Ì™™ÿ™Ì™Ì3fÌf™Ì™™ÌÌ™Ìÿ™ÿ™ÿ3™Ìf™ÿ™™ÿÌ™ÿÿÌ™3ÌfÌ™ÌÌ™3Ì33Ì3fÌ3™Ì3ÌÌ3ÿÌfÌf3™ffÌf™ÌfÌ™fÿ̙̙3Ì™fÌ™™Ì™ÌÌ™ÿÌÌÌÌ3ÌÌfÌÌ™ÌÌÌÌÌÿÌÿÌÿ3™ÿfÌÿ™ÌÿÌÌÿÿÌ3ÿfÿ™Ì3ÿ33ÿ3fÿ3™ÿ3Ìÿ3ÿÿfÿf3Ìffÿf™ÿfÌÌfÿÿ™ÿ™3ÿ™fÿ™™ÿ™Ìÿ™ÿÿÌÿÌ3ÿÌfÿÌ™ÿÌÌÿÌÿÿÿ3Ìÿfÿÿ™ÿÿÌffÿfÿffÿÿÿffÿfÿÿÿfÁÁÁ___www†††–––ËË˲²²×××ÝÝÝãããêêêñññøøøðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿÿÿÿøøÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿ)ÿÿøÿÿ)û)ÿøÿÿÿÿ)ûû)ÿøÿÿ)û)ÿøÿÿÿ$ÿ)ÿÿøÿ››*q¼ÿÿø›ÝI$#wÿÿÿÿøvwwD$››ÿÿøœww$nwwÿÿÿøÿw›xw››ÿÿÿøÿ›››››ÿÿÿÿøøÿøÿøÿÀ€€€€€€€€€€€€€Àê¯( @€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿwwwwwwwwwwppÿÿÿÿÿÿÿÿÿÿ÷ÿÿÿÿÿÿÿÿÿÿ÷ðÿÿðÿ÷ÿÿÿÿÿð0°0÷ðÿó»»³÷ÿÿÿÿÿ3³°÷ÿÿÿÿÿ;°€»0÷ð3³°÷ÿÿÿÿÿó»»³÷ð0°0÷ÿÿÿÿÿÿó3?ÿ÷ð÷ÿÿÿÿÿÿÿ÷ð3÷ÿŽªÿÿÿÿÿÿ÷ø®ê8êïÿÿÿÿ÷®o¨jÿÿÿÿ÷¡ÿÿÿÿ÷Ž®¨ ®oÿÿÿ÷Šªh¢‰˜êïÿÿÿ÷ªjˆúŸÿÿÿ÷ªæªá¨è¯ÿÿÿ÷ÿˆVþ›®¯÷úꪪêêïÿÿÿ÷újª®®¯ÿÿÿÿ÷ÿøêþïÿÿÿÿ÷ðÿðÿðÿøðÿðÿðÿøøˆøˆøˆø€ðàÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀàòI$¿( @€€€€€€€€€ÀÀÀÀÜÀðȤ """)))UUUMMMBBB9993f™Ì3333f3™3Ì3ÿff3fff™fÌfÿ™™3™f™™™Ì™ÿÌÌ3ÌfÌ™ÌÌÌÿÿfÿ™ÿÌ3333f3™3Ì3ÿ3333333f33™33Ì33ÿ3f3f33ff3f™3fÌ3fÿ3™3™33™f3™™3™Ì3™ÿ3Ì3Ì33Ìf3Ì™3ÌÌ3Ìÿ3ÿ33ÿf3ÿ™3ÿÌ3ÿÿff3fff™fÌfÿf3f33f3ff3™f3Ìf3ÿffff3fffff™ffÌf™f™3f™ff™™f™Ìf™ÿfÌfÌ3fÌ™fÌÌfÌÿfÿfÿ3fÿ™fÿÌÌÿÿÌ™™™3™™™™Ì™™33™f™3Ì™ÿ™f™f3™3f™f™™fÌ™3ÿ™™3™™f™™™™™Ì™™ÿ™Ì™Ì3fÌf™Ì™™ÌÌ™Ìÿ™ÿ™ÿ3™Ìf™ÿ™™ÿÌ™ÿÿÌ™3ÌfÌ™ÌÌ™3Ì33Ì3fÌ3™Ì3ÌÌ3ÿÌfÌf3™ffÌf™ÌfÌ™fÿ̙̙3Ì™fÌ™™Ì™ÌÌ™ÿÌÌÌÌ3ÌÌfÌÌ™ÌÌÌÌÌÿÌÿÌÿ3™ÿfÌÿ™ÌÿÌÌÿÿÌ3ÿfÿ™Ì3ÿ33ÿ3fÿ3™ÿ3Ìÿ3ÿÿfÿf3Ìffÿf™ÿfÌÌfÿÿ™ÿ™3ÿ™fÿ™™ÿ™Ìÿ™ÿÿÌÿÌ3ÿÌfÿÌ™ÿÌÌÿÌÿÿÿ3Ìÿfÿÿ™ÿÿÌffÿfÿffÿÿÿffÿfÿÿÿfÁÁÁ___www†††–––ËË˲²²×××ÝÝÝãããêêêñññøøøðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿÿÿÿøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿ)û)ÿÿøÿÿÿÿÿÿ)ûûûûû)ÿÿøÿÿÿÿÿÿÿÿÿÿÿ)0û00ûÿøÿÿÿÿÿÿÿÿÿÿÿ0ûûøûû0ÿøÿÿ)0û00ûÿøÿÿÿÿÿÿÿÿÿÿÿÿ)ûûûûû)ÿÿøÿÿ0)û)ÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿ)0)0ÿÿÿÿøÿÿÿÿøÿÿÿÿÿJ##ÿÿÿÿÿÿÿÿÿÿÿÿøÿÿ#Jÿÿøÿÿÿ››¼$Kÿÿÿÿÿÿÿÿÿÿÿÿÿøÿ»wqœ›œ#r{›wÿÿÿÿÿÿÿÿÿÿøÿœ›²²ÿI##vVVÿÿÿÿÿÿÿÿÿÿøÿ›œGGKqI#pÿÿÿÿÿÿÿÿÿÿøÿ¼›œ››qIvI{›{vÿÿÿÿÿÿÿÿø—ÿvv®vNDiGo›››ÿÿÿÿÿÿÿÿø¼ÿNvv#v$’n’FÿGÿÿÿÿÿÿÿÿøÿq{{pp{ÿ#Prw˜Pÿÿÿÿÿÿÿÿøÿÿ¼‘vpx›88›››ÿÿÿÿøÿÿvvwwvv››››wÿÿÿÿÿÿÿÿøÿÿvvv{v›››››ÿÿÿÿÿÿÿÿÿÿøÿÿÿv˜ÿq››’›{ÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿ¼ÿÿÿÿÿÿÿÿÿøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿøøÿøøÿøøÿøøÿøøÿøøÿøøÿøðàÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀàòI$¿(0`€€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ‡wwwwwwwwwwwwwww€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿpxÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷€ÿÿÿÿÿÿÿÿÿÿÿøÿÿÿ÷€ÿÿÿÿÿÿÿÿÿÿð°ˆÿ÷€ÿÿÿÿó³ ³0ÿ÷€ÿÿÿÿÿÿÿÿÿó»»»»0ÿ÷€ÿÿÿÿ÷;³3»ÿ÷€ÿÿÿÿÿÿÿÿÿ0 8;¸÷€ÿÿÿÿÿÿÿÿÿ;»0p;»0÷€ÿÿÿÿÿÿÿÿÿ3»8;¸÷€ÿÿÿÿÿÿÿÿÿÿ ³3»ÿ÷€ÿ{»»»0ÿ÷€ÿÿÿÿÿÿÿÿÿó³ »0ÿ÷€ÿ8ƒ³€ÿ÷€ÿÿÿÿÿÿÿÿÿÿÿó3ÿÿÿ÷€ÿ÷€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷€ÿ÷€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷€ÿ100÷€ÿÿÿÿÿÿÿÿÿÿÿÿ÷€ÿ10÷€ÿú®ªÿÿÿÿÿÿÿÿÿÿ÷€ÿöêæƒˆ¦ÿÿÿÿÿÿÿÿ÷€®ª®ª®jÿÿÿÿÿÿÿÿ÷€úìö¢18è«ÿÿÿÿÿÿÿÿ÷€Ž©“>aÿÿÿÿÿÿÿÿ÷€êæêf2£â hÿÿÿÿÿÿÿ÷€ªnlcjª®ÿÿÿÿÿÿÿ÷€Žÿž¨¨á¨˜îêÿÿÿÿÿÿÿ÷€Žÿ£>£Šˆ8ˆÿÿÿÿÿÿ÷€Šîfá6ㆪ¯ùÿÿÿÿÿÿÿ÷€®®£nªc¨(ˆÿÿÿÿÿÿÿ÷€ø©ážêë³¾êïÿÿÿÿÿÿ÷€ÿ®©¨O˜.®÷€ÿæêªïšî¦èÿÿÿÿÿÿÿ÷€ÿª®ª®n®ªÿÿÿÿÿÿÿÿ÷€ÿþêîêªêîÿÿÿÿÿÿÿÿ÷€ÿÿ®þ®¯€ÿÿÿÿÿÿÿÿ÷€ÿÿÿÿêÿÿÿÿÿÿÿÿÿÿ÷€÷÷÷÷÷÷÷÷ø€pÿpÿpÿpÿpÿpÿpÿpÿp€pÿpÿpÿpÿpÿpÿpÿpÿp€pˆpˆpˆpˆpˆpˆpˆpˆp€þü?øððððððððððððððððððððððððððððððððððððððððððøþ""""?ÿÿÿÿÿÿ(0` €€€€€€€€€ÀÀÀÀÜÀðȤ """)))UUUMMMBBB9993f™Ì3333f3™3Ì3ÿff3fff™fÌfÿ™™3™f™™™Ì™ÿÌÌ3ÌfÌ™ÌÌÌÿÿfÿ™ÿÌ3333f3™3Ì3ÿ3333333f33™33Ì33ÿ3f3f33ff3f™3fÌ3fÿ3™3™33™f3™™3™Ì3™ÿ3Ì3Ì33Ìf3Ì™3ÌÌ3Ìÿ3ÿ33ÿf3ÿ™3ÿÌ3ÿÿff3fff™fÌfÿf3f33f3ff3™f3Ìf3ÿffff3fffff™ffÌf™f™3f™ff™™f™Ìf™ÿfÌfÌ3fÌ™fÌÌfÌÿfÿfÿ3fÿ™fÿÌÌÿÿÌ™™™3™™™™Ì™™33™f™3Ì™ÿ™f™f3™3f™f™™fÌ™3ÿ™™3™™f™™™™™Ì™™ÿ™Ì™Ì3fÌf™Ì™™ÌÌ™Ìÿ™ÿ™ÿ3™Ìf™ÿ™™ÿÌ™ÿÿÌ™3ÌfÌ™ÌÌ™3Ì33Ì3fÌ3™Ì3ÌÌ3ÿÌfÌf3™ffÌf™ÌfÌ™fÿ̙̙3Ì™fÌ™™Ì™ÌÌ™ÿÌÌÌÌ3ÌÌfÌÌ™ÌÌÌÌÌÿÌÿÌÿ3™ÿfÌÿ™ÌÿÌÌÿÿÌ3ÿfÿ™Ì3ÿ33ÿ3fÿ3™ÿ3Ìÿ3ÿÿfÿf3Ìffÿf™ÿfÌÌfÿÿ™ÿ™3ÿ™fÿ™™ÿ™Ìÿ™ÿÿÌÿÌ3ÿÌfÿÌ™ÿÌÌÿÌÿÿÿ3Ìÿfÿÿ™ÿÿÌffÿfÿffÿÿÿffÿfÿÿÿfÁÁÁ___www†††–––ËË˲²²×××ÝÝÝãããêêêñññøøøðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿÿÿÿøøøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿÿÿÿÿÿÿøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûøøÿÿÿÿøøÿÿÿÿÿÿÿÿÿÿÿ)û)ûû))0ÿÿÿøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ0ûûûûûûûû)ÿÿÿøøÿÿÿÿÿÿÿÿÿÿÿ0ûû)0)ûûøÿÿÿøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ)û)øø)ûûøøÿøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ0ûûû00ûûû0ÿøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ)0ûû)øø)ûûøøÿøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûû)0)ûûøÿÿÿøøÿÿÿ0ûûûûûûû)ÿÿÿøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ)û)ûûû)0ÿÿÿøøÿÿÿ)øø0û0øÿÿÿÿøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ)0)ÿÿÿÿÿÿÿøøÿÿÿÿÿøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿÿÿÿÿøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿÿÿ’#*$#"#ÿÿøøÿÿÿÿÿÿÿ’#$#mÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿÿÿ’##Kÿÿøøÿÿÿÿ›{›ÿm$nÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿÿÿ¼l››{vC*D’qvlÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿ››{v››{v#$#{››vvÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿ’››²ÿÿœI##*qvV}}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿ¼{œGG$Kq#IKœpEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿ››{qwwpv$Iv)›H!!B¼ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿ›vv{¬­Ç#IDvv$›{v››ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøø›ÿ½F›rs’Kv#œ‘E’›œ›{œÿÿÿÿÿÿÿÿÿÿÿÿÿÿøø›ÿ½›J##K›{#–”FDKsJ’ÿÿÿÿÿÿÿÿÿÿÿÿÿÿøø››œNvw$#v›$Cln’IFÿGÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿ››{{›*p{›–v#PrOJ˜Pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿÿ˜rL› ù›{œ›X11X›{{wÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿÿÿ›››ù›‹…ÿGQEKrœ›{ÿÿÿÿøøÿÿÿ›v–ww››ÿ {››vvwÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿÿÿ›v››{v››v{››{vÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿÿÿÿ»v›–œ›{œw{››œÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿÿÿÿÿ››ÿ››››¼’»ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿÿÿÿÿÿÿÿÿ›rÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøøøøøøøøøøøøøøøøøøþü?øððððððððððððððððððððððððððððððððððððððððððøþ""""?ÿÿÿÿÿÿgeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/etc/Windows/icons/gwd.ico0000660000175200017530000002362612664543647025227 0ustar guillaumeguillaume(fhŽ èö ¨Þ 00h†00¨î( €€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆˆzwww‡x€wwpx€ÿÿÿÿÿø€€ˆˆˆˆˆ€€÷wwwwˆ÷3DGˆ÷`Gˆ÷¨¨¦ˆ÷ ꪈ÷ ˆÿÿÿÿÿˆ‡wwwwøˆˆˆˆˆ€€€€€€€€€€Àà( ÿÿÿ€€€€€ÀÀÀÀÜÀðʦ@€€@@ÿ€€@@€€ÿÿÿÿ€ÿ€€@€ÿ3f™Ì333f3ÿfÌfÿ™ÿÌÌ333f3™3Ì3333333f33™33Ì33ÿ3ff3f™tÊÿ3fÿ3™3™33™f3™™3™Ì3™ÿ3Ì33Ì™3ÌÌ3Ìÿ3ÿÿff3f33f3ff3™f3ÿffff3fffff™ffÌf™f™3f™ff™™f™Ìf™ÿfÌ3fÌ™fÌÌLÎÿfÿ3fÿÌ™™™3™™33™f™f3™3f™f™™fÌ™™3™™f™™™™™Ì™™ÿ™Ì™Ì3fÌf™Ì™™ÌÌ™Ìÿ™Ìf™ÿ™™ÿÿÌ™Ì33Ì3fÌ3™ÌfÌf3™ffÌf™ÌfÌ̙̙3Ì™fÌ™™Ì™ÌÌ™ÿÌÌÌÌ3ÌÌfÌÌ™ÌÌÌÌÌÿÌÿÌÿ3™ÿfÌÿ™ÌÿÌÌÿÿÿ33ÿ3fÿfÿf3Ìffÿf™ÿfÌÿ™ÿ™3ÿ™fÿ™™ÿ™Ìÿ™ÿÿÌÿÌ3ÿÌfÿÌ™ÿÌÌÿÌÿÿÿ3ÿÿ™ÿÿÌffÿfÿÿÿÿfÁÁÁ___www†††–––ËË˲²²×××ÝÝÝãããêêêñññøøøðûÿ¤  €€€ÿÿÿÿÿÿzéÿ}xÿÿÿÿÿÿœœœœœœ›šÿÿÿ¯¯¯¯¯§Ÿ§Ÿ§¯@šÿÿ§ŸŸŸŸŸ›¯§¯šššÿ _^ŸŸŸŸ§§@š@ÿ Ÿ§¯@@@@@@š@ÿÿÿX §¯¯¯¯¯¯š››šÿŸŸŸŸ^§¯šÿÿÿ ƒƒSSSSS§¯@ÿÿÿ ÿDx xÿÿS§¯@šÿÿ ƒœ$ ÿ§¯@šÿÿ CiM\\\_§¯@ššÿ ƒIMYYšÿ§¯@ššÿ ƒƒ\QM\S§¯@ššÿ ƒƒƒƒ\SSS§¯@ššÿ §¯@š›ÿŸŸ››ÿü€€€€à€€€€€€€€€€( @€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆwwwwwwwwwwwwx€wwwwwwwwwwwwxˆw"wwwwwwwxwwxˆ€wªwwwwpxˆ€wwwwwwxˆˆˆˆ‡xˆ€wwwwwwwwwwwwxˆ€ÿÿÿÿÿÿÿÿÿÿÿÿøˆ€ˆˆˆˆˆˆˆˆˆˆˆˆ‡ˆ€ˆx€ˆˆˆˆˆˆˆˆˆˆˆ‡€÷wwwwwwwwwx€ˆ€÷ÿÿÿÿÿÿÿÿÿxˆ÷DDDDDDDDOxˆ÷ ÌÌ̃<ÌÌOxˆ÷ ÌÌÌÌOxˆ÷ ÌÀ胢¬ÌOxˆ÷ Ìê0è ÌOxˆ÷ ÌŽn¦`ÌOxˆ÷ ̺ˆŠêÌOxˆ÷ Ì®®ªJŠÌOxˆ÷ Ì ªŠºèÌOxˆ÷ ÌÌêúê ÌOxˆ÷ ÌÌÌÎÌÌÌOxˆ÷Oxˆ÷ˆˆˆˆˆˆˆˆxˆ÷wwwwwwwwwxˆÿÿÿÿÿÿÿÿÿøˆwwwwwwwwwˆ‡wwwwwwwwwøˆˆˆˆˆˆˆˆˆˆ€€ààààààààààààààààààðøüþ( @ÿÿÿ€€€€€ÀÀÀÀÜÀðʦ@€€@@ÿ€€@@€€ÿÿÿÿ€ÿ€€@€ÿ3f™Ì333f3ÿfÌfÿ™ÿÌÌ333f3™3Ì3333333f33™33Ì33ÿ3ff3f™tÊÿ3fÿ3™3™33™f3™™3™Ì3™ÿ3Ì33Ì™3ÌÌ3Ìÿ3ÿÿff3f33f3ff3™f3ÿffff3fffff™ffÌf™f™3f™ff™™f™Ìf™ÿfÌ3fÌ™fÌÌLÎÿfÿ3fÿÌ™™™3™™33™f™f3™3f™f™™fÌ™™3™™f™™™™™Ì™™ÿ™Ì™Ì3fÌf™Ì™™ÌÌ™Ìÿ™Ìf™ÿ™™ÿÿÌ™Ì33Ì3fÌ3™ÌfÌf3™ffÌf™ÌfÌ̙̙3Ì™fÌ™™Ì™ÌÌ™ÿÌÌÌÌ3ÌÌfÌÌ™ÌÌÌÌÌÿÌÿÌÿ3™ÿfÌÿ™ÌÿÌÌÿÿÿ33ÿ3fÿfÿf3Ìffÿf™ÿfÌÿ™ÿ™3ÿ™fÿ™™ÿ™Ìÿ™ÿÿÌÿÌ3ÿÌfÿÌ™ÿÌÌÿÌÿÿÿ3ÿÿ™ÿÿÌffÿfÿÿÿÿfÁÁÁ___www†††–––ËË˲²²×××ÝÝÝãããêêêñññøøøðûÿ¤  €€€ÿÿÿÿÿÿzéÿ}xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ@@@@@@šÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ@@@@@@¯§§§§§šššÿÿÿÿÿÿÿÿÿÿÿ@@@@@@¯§§§§§ŸŸŸŸŸŸšššššÿÿÿÿ@@@@@¯§§§§§§ŸŸŸŸ§§Ÿšššššššÿÿ§§§ŸŸŸŸŸŸŸŸŸŸ¯¯›@@¯¯¯šššššššÿÿ¢ŸŸŸŸŸŸŸŸŸŸŸŸ¯¯¯ŸŸŸ@ššššššÿÿ¢Ÿ..ŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸšššššššÿÿ¢ŸMMŸŸŸŸŸŸ   ŸŸ§@šššššÿÿ¢ŸŸŸ     ¯››šššššš›››@š@ššÿÿ¡¡¡¡ Ÿ§¯›››››@@@@š@šššš@@››@@šÿÿÿÿÿ¡¡  Ÿ§¯@@@@@šššššš@šššš›››šÿÿÿÿÿÿÿÿ¡ Ÿ§§§§@@ÿÿÿÿÿÿÿÿŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸMM§§@›ÿÿÿÿÿÿÿÿ¡ŸŸŸŸ§§§@@ÿÿÿÿÿÿÿÿ¡ŸŸŸ§§§§)%*SSSSSS§@@@ÿÿÿÿÿÿÿ¡SƒƒƒƒƒƒS*SSSSSSS§§@@@ÿÿÿÿÿÿÿ¡Sƒƒœ¯xÿÿ*ÿ¯¯¯SSSS§@@@ÿÿÿÿÿÿÿ¡Sƒƒÿÿ\\x*A*\$ÿSSSS§@@@šÿÿÿÿÿÿ¡Sƒƒ\\MMCMM\xšSSS§§@@@šÿÿÿÿÿÿ¡Sƒƒ\¡¡CšSSS§@@@ššÿÿÿÿÿ¡Sƒƒ\IDCCCM##xÿSS§Ÿ@@@šššÿÿÿÿ¡Sƒÿœ\Sf$CC$\\\_SS§§@@@šššÿÿÿÿ¡Sƒ-œ)k€-$I'B\\\YSS§Ÿ@@@šššÿÿÿÿ¡SƒƒMM$C$?9'¯(ÿSS§§@@@šššÿÿÿÿ¡Sƒƒk\CCMC)I_/ÿSS§Ÿ@@@šššÿÿÿÿ¡SƒƒƒCkUCF)\\\xSSŸ§@@@šššÿÿÿÿ¡SƒƒƒD\MO}FM\Mx@jSSŸŸ@@@šššÿÿÿÿ¡SƒƒƒQM]Q\MIMMx@jSS§§@@@šššÿÿÿÿ¡Sƒƒƒƒƒƒƒj\xSSSSSSSŸ@@@šššÿÿÿÿ¡Ÿ§@@@šššÿÿÿÿ¡¡        ŸŸŸŸŸŸ@@œœœÿÿÿÿÿ¡¡¡¡¡¡¡¡¡¡¡¡¡¯¯ÿÿÿÿÿÿÿÿÀÿðü€€€€€€€ðþ?À?À?ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ?(0`€€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ÷wwwwwwwwwwwwwwwwwwx€÷wwwwwwwwwwwwwwwwwwxˆ÷wwwwwwwwwwwwwwwwwwxˆ€÷w"'wwwwwwwwwwwxwwwxˆˆ÷wª§wwwwwwpwxˆˆ÷wwwwwwwwwxˆˆˆˆˆˆˆwxˆˆ÷wwwwwwwwwwwwwwwwwwxˆˆ÷wwwwwwwwwwwwwwwwwwxˆˆ÷wwwwwwwwwwwwwwwwwwxˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆxˆ€ˆ‡ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆx÷wwwwwwwwwwwwwwwˆ€ˆ‡÷wwwwwwwwwwwwwwwˆˆˆ÷ÿÿÿÿÿÿÿÿÿÿÿÿÿwˆˆ÷tDDDDDDDDDDDDOwˆˆ÷pÌÌÌÌÌ3ÌÌÌÌOwˆˆ÷pÌÌÌÌÀ10 ÌÌÌOwˆˆ÷pÌÌÌÌn¯ª ÌÌÌOwˆˆ÷pÌÌÌÈîꓦâ¬ÌÌOwˆˆ÷pÌÌÊ®ª®®® ÌÌOwˆˆ÷pÌÌÈîú¡13‘¼ÌÌOwˆˆ÷pÌÌÌ®®®&ÌÌOwˆˆ÷pÌÌÊêëÁàáêêìÌOwˆˆ÷pĮ̀‰jª!©ž®¬ÌOwˆˆ÷pÌÌÂê :h ÿüÌOwˆˆ÷pÌÌ̪¨nªªŒÌOwˆˆ÷pÌÌ̪¬¦øëºêìÌOwˆˆ÷pÌÌ̪¦ù®®hÌÌOwˆˆ÷pÌÌÌÀêêêîêìÌÌOwˆˆ÷pÌÌÌÌÌÊ®¨®ÌÌÌOwˆˆ÷pÌÌÌÌÌÌÈÌÌÌÌÌOwˆˆ÷pOwˆˆ÷xˆˆˆˆˆˆˆˆˆˆˆˆwˆˆ÷wwwwwwwwwwwwwwwˆˆ÷wwwwwwwwwwwwwwwˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆwwwwwwwwwwwwwwwøˆ‡wwwwwwwwwwwwwwˆwwwwwwwwwwwwwwwøˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÿÿÿÿÿÿÀ?€€€€€€€€€€€Ààðøøøøøøøøøøøøøøøøøøøøøøøøøüþÿÿ€ÿÀ?ÿÿÿÿÿÿÿÿÿÿÿÿ(0` ÿÿÿ€€€€€ÀÀÀÀÜÀðʦ@€€@@ÿ€€@@€€ÿÿÿÿ€ÿ€€@€ÿ3f™Ì333f3ÿfÌfÿ™ÿÌÌ333f3™3Ì3333333f33™33Ì33ÿ3ff3f™tÊÿ3fÿ3™3™33™f3™™3™Ì3™ÿ3Ì33Ì™3ÌÌ3Ìÿ3ÿÿff3f33f3ff3™f3ÿffff3fffff™ffÌf™f™3f™ff™™f™Ìf™ÿfÌ3fÌ™fÌÌLÎÿfÿ3fÿÌ™™™3™™33™f™f3™3f™f™™fÌ™™3™™f™™™™™Ì™™ÿ™Ì™Ì3fÌf™Ì™™ÌÌ™Ìÿ™Ìf™ÿ™™ÿÿÌ™Ì33Ì3fÌ3™ÌfÌf3™ffÌf™ÌfÌ̙̙3Ì™fÌ™™Ì™ÌÌ™ÿÌÌÌÌ3ÌÌfÌÌ™ÌÌÌÌÌÿÌÿÌÿ3™ÿfÌÿ™ÌÿÌÌÿÿÿ33ÿ3fÿfÿf3Ìffÿf™ÿfÌÿ™ÿ™3ÿ™fÿ™™ÿ™Ìÿ™ÿÿÌÿÌ3ÿÌfÿÌ™ÿÌÌÿÌÿÿÿ3ÿÿ™ÿÿÌffÿfÿÿÿÿfÁÁÁ___www†††–––ËË˲²²×××ÝÝÝãããêêêñññøøøðûÿ¤  €€€ÿÿÿÿÿÿzéÿ}xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿššššššÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿššššššš¯§§§§šššÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿšššššššš¯§§§§§§ŸŸŸŸŸšššššÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿššššššš¯§§§§§§§ŸŸŸŸŸŸŸŸŸŸŸŸšššššššÿÿÿÿÿÿÿÿÿÿšššš¯§§§§§§ŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸšššššššššÿÿÿÿÿÿÿÿ§§§ŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸšššššššššÿÿÿÿÿÿÿÿ£ŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸœœœšššš§œœœŸšššššššššÿÿÿÿÿÿÿÿ¢ŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸœœœœœŸŸŸŸšššššššššÿÿÿÿÿÿÿÿ¢Ÿ...ŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸšššššššššÿÿÿÿÿÿÿÿ¢ŸMM.ŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸšššššššššÿÿÿÿÿÿÿÿ¢ŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸššššššššÿÿÿÿÿÿÿÿ¢ŸŸŸŸxx¯¯››@ššššššš›››››ššššššÿÿÿÿÿÿÿÿ¡¢¡¡¡¡Ÿ§œ››››››››@@@@@@@šššššš›››››ššššÿÿÿÿÿÿÿÿÿÿ¡¡¡¡¡§œ›››››@@@@@@@ššššššššššš››››ššÿÿÿÿÿÿÿÿÿÿÿÿÿ¡¡¡¡§¯›@@@@@šššššššššššššššš››››šÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡¡¡Ÿ§§§§§@@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸ§§§§§§@@@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡xxŸŸŸŸŸŸŸŸŸ§ªª§§§@@@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡ŸŸŸ§§§§§@@@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡ŸŸŸŸ§§§§@A%%***SSSSSSS§§@@@@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡xSƒƒƒƒƒƒƒƒS **SSSSSSSSS§§@@@@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡xSƒƒƒƒƒƒƒƒSSSSSSSSSSSS§§@@@@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡xSƒƒƒœœYC@ÿxœœœœœSSSSSS§§@@@@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡ SƒƒƒœÿMMMMY$ ÿ@YÿSSSSSS§§@@@@šÿÿÿÿÿÿÿÿÿÿÿÿÿ¡ SƒƒƒCII\M\I)?MM\DÿšSSSS§§@@@@šÿÿÿÿÿÿÿÿÿÿÿÿÿ¢ Sƒƒ\M\\M\M*\\\MM$ÿSSSS§§§@@@@ššÿÿÿÿÿÿÿÿÿÿÿÿ¢ SƒƒMC¡¡¡CÿSSSS§§§@@@@ššÿÿÿÿÿÿÿÿÿÿÿÿ¢ SƒƒƒM©$$C$C$ÿÿÿÿÿSSS§Ÿ§@@@@šššÿÿÿÿÿÿÿÿÿÿÿ¢ SƒƒYM\\IO\*\\*\MMM\\ÿSS§Ÿ§@@@@šššÿÿÿÿÿÿÿÿÿÿÿ¢ Sƒ-ƒMM5F)MbE@\M\M\$SS§Ÿ§@@@@šššÿÿÿÿÿÿÿÿÿÿÿ¡ Sƒ-ƒW0€\\B(–$\M\MSSS§Ÿ§@@@@šššÿÿÿÿÿÿÿÿÿÿÿ¡¡SƒƒMMMC$\\>DWMByBZSSS§Ÿ§@@@@šššÿÿÿÿÿÿÿÿÿÿÿ¡¡SƒƒƒMCM%)\\C\\*–'ÿSS§Ÿ§@@@@šššÿÿÿÿÿÿÿÿÿÿÿ¡¡SƒƒƒkM(((M\D\M777\M\MÿSSŸŸ§@@@@šššÿÿÿÿÿÿÿÿÿÿÿ¡¡SƒƒƒƒM((\8(\'M\M]SSSŸŸ§@@@@šššÿÿÿÿÿÿÿÿÿÿÿ¡¡Sƒƒƒƒƒ\M\M8k©\\\MMCšjSSSŸŸ§@@@@šššÿÿÿÿÿÿÿÿÿÿÿ¢¡SƒƒƒƒƒM\\M\CMMM\\\C@jjSS§Ÿ§@@@@šššÿÿÿÿÿÿÿÿÿÿÿ¢¡SƒƒƒƒƒjjjjSMCM$S\\SSSSSS§Ÿ§@@@@šššÿÿÿÿÿÿÿÿÿÿÿ¢¡xSƒƒƒƒƒƒƒƒƒjj\ESSSSSSSSSS§Ÿ§@@@@šššÿÿÿÿÿÿÿÿÿÿÿ¢¡xŸŸ§@@@@šššÿÿÿÿÿÿÿÿÿÿÿ¢¡¡¡¡¡¡¡¡    xxŸŸŸŸŸŸŸ§@@@@œœÿÿÿÿÿÿÿÿÿÿÿÿ¢¡¡¡¡¡¡¡¡    xxŸŸŸŸŸŸŸ@@œœÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¢¡¡¡¡¡¡¡¡¡¡¡      xxœœÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿþÿÿþÿÿ?ðððððððððüÿ€ÿðÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøøø?ø?ø?ø?ø?ø?ø?ø?ø?ø?ø?ø?ø?øøÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿgeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/etc/Windows/icons/gwb2ged.ico0000660000175200017530000001114612664543647025761 0ustar guillaumeguillaume(Fhn èÖ ¨¾ ( €€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿðpw r ™™z¢ª **rª¢p *÷ððÿÿðú:ðúðwúðÿðwwÿ÷pwwwÿ€ÿûÁÛß߀Áÿÿÿÿÿÿÿÿ( €€€€€€€€€ÀÀÀÀÜÀðʦ>]|›ºÙð$$ÿHHÿllÿÿ´´ÿ>](|2›<ºFÙUð$mÿH…ÿlÿµÿ´Íÿ*>?]T|i›~º“Ùªð$¶ÿHÂÿlÎÿÚÿ´æÿ>>]]||››ººÙÙðð$ÿÿHÿÿlÿÿÿÿ´ÿÿ>*]?|T›iº~Ù“ðª$ÿ¶HÿÂlÿÎÿÚ´ÿæ>]|(›2º<ÙFðU$ÿmHÿ…lÿÿµ´ÿÍ>]|›ºÙð$ÿ$HÿHlÿlÿ´ÿ´>](|2›<ºFÙUðmÿ$…ÿHÿlµÿÍÿ´*>?]T|i›~º“Ùªð¶ÿ$ÂÿHÎÿlÚÿæÿ´>>]]||››ººÙÙððÿÿ$ÿÿHÿÿlÿÿÿÿ´>*]?|T›iº~Ù“ðªÿ¶$ÿÂHÿÎlÿÚÿæ´>]|(›2º<ÙFðUÿm$ÿ…HÿlÿµÿÍ´>]|›ºÙðÿ$$ÿHHÿllÿÿ´´>]|(›2º<ÙFðUÿ$mÿH…ÿlÿµÿ´Í>*]?|T›iº~Ù“ðªÿ$¶ÿHÂÿlÎÿÚÿ´æ>>]]||››ººÙÙððÿ$ÿÿHÿÿlÿÿÿÿ´ÿ*>?]T|i›~º“Ùªð¶$ÿÂHÿÎlÿÚÿæ´ÿ>](|2›<ºFÙUðm$ÿ…HÿlÿµÿÍ´ÿ,,,999EEERRR___lllxxx………’’’ŸŸŸ«««¸¸¸ÅÅÅÒÒÒÞÞÞëëëøøøðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿÿÿÿòîææòòòöæîêîùòSW"êòæùùùùùêWWWWWSùùêWWWWWSîùêWWWWWòùòSWWWæòîîòøööööööøööZ"pöøööZ"ZöøøøöÿZöøöööøööøøøøøöøööööøøøøøøøøÿ€ÿûÁÛß߀Áÿÿÿÿÿÿÿÿ( @€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿˆwˆˆ‡wÿwˆ€wp ÷www™¢‡‡w™ˆ ø ™™™™‡¢¢ w™™™™™‡ *****™™‡¢¢¢¢¢" ™™‡******™‡¢¢¢¢¢¢x™‡ **** ˆ™ˆp¢¢¢¢ €™€ ***(€ˆ€p¢¢€‡ˆÿÿÿÿÿÿðˆˆwˆÿÿððÿÿwp7pðÿÿ÷swððÿÿïp3ðððöa¢pðwwöàpðw÷ÿ¯ ðÿwêêðÿÿ÷ÿðÿÿ÷ÿðw÷÷÷ÿðwwww÷ÿÿÿÿ÷÷ÿÿÿÿ÷pÿÿÿÿ÷wwwwwwÿÿÀÿÿ€ÿ߀ÿÏ€ÿÇøðñÇóÏóßóÿóÿóÿ€ÿÿÀ€ðüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ( @€€€€€€€€€ÀÀÀÀÜÀðʦ>]|›ºÙð$$ÿHHÿllÿÿ´´ÿ>](|2›<ºFÙUð$mÿH…ÿlÿµÿ´Íÿ*>?]T|i›~º“Ùªð$¶ÿHÂÿlÎÿÚÿ´æÿ>>]]||››ººÙÙðð$ÿÿHÿÿlÿÿÿÿ´ÿÿ>*]?|T›iº~Ù“ðª$ÿ¶HÿÂlÿÎÿÚ´ÿæ>]|(›2º<ÙFðU$ÿmHÿ…lÿÿµ´ÿÍ>]|›ºÙð$ÿ$HÿHlÿlÿ´ÿ´>](|2›<ºFÙUðmÿ$…ÿHÿlµÿÍÿ´*>?]T|i›~º“Ùªð¶ÿ$ÂÿHÎÿlÚÿæÿ´>>]]||››ººÙÙððÿÿ$ÿÿHÿÿlÿÿÿÿ´>*]?|T›iº~Ù“ðªÿ¶$ÿÂHÿÎlÿÚÿæ´>]|(›2º<ÙFðUÿm$ÿ…HÿlÿµÿÍ´>]|›ºÙðÿ$$ÿHHÿllÿÿ´´>]|(›2º<ÙFðUÿ$mÿH…ÿlÿµÿ´Í>*]?|T›iº~Ù“ðªÿ$¶ÿHÂÿlÎÿÚÿ´æ>>]]||››ººÙÙððÿ$ÿÿHÿÿlÿÿÿÿ´ÿ*>?]T|i›~º“Ùªð¶$ÿÂHÿÎlÿÚÿæ´ÿ>](|2›<ºFÙUðm$ÿ…HÿlÿµÿÍ´ÿ,,,999EEERRR___lllxxx………’’’ŸŸŸ«««¸¸¸ÅÅÅÒÒÒÞÞÞëëëøøøðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿÿÿÿòòîîîêææòòòòòòîæòÿÿîòòÿîêæêùòîUÿæîîêòæêîîùùòUSWòòîæêòîîùùùòSUWU"æêÿòîæùùùùùùùùùòòWUWUWUUæòòîùùùùùùùùùùòêæWWWWWWWWWUSæùùùùùùòê UUWUWUWUWUWUùùùùòêUWWWWWWWWWWSîùùùòîSWUWUWUWUWSUæòùùòêæWWWWWWWWWUîòùùòêæUWUWUWUWSæòùùòòîSUWWWWWUæòòòòêUWUUæîòòòîîîîòòøööööööööööööööòòòêîòøöööööööøöööööøøøå"êøöøööööööîò"øøööøöööööpÿå""&ööøööömd"pSòöøöøøøøqne"êåöøöøøöøöödÿêdöøöøöööøøpdpdøööøöøööööööøööööøöøööööööøööööøöøøöøöøöøööööøöøøøøøøøøöøøööööööööööøöøøööööööööööøøøööööööööööøøøøøøøøøøøøøÿÿÀÿÿ€ÿ߀ÿÏ€ÿÇ€øðñÇóÏóßóÿóÿ€óÿÿÿÀ€ðþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿgeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/etc/Windows/icons/gw_base.ico0000660000175200017530000002362612664543647026055 0ustar guillaumeguillaume(fhŽ èö ¨Þ 00h†00¨î( €€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿwwwwwpÿðpÿˆ3ˆ€pÿ`€pÿŠªšpÿ†ê¯€pøŠn®€pøˆŠˆpøÿÿ€ÿpøÿÿ€ÿpøˆˆ€ÿpøˆˆÿÿÿÿÿÿÿÿ€ˆˆˆˆ€àààààààààààààààà( €€€€€€€€€ÀÀÀÀÜÀðʦ>]|›ºÙð$$ÿHHÿllÿÿ´´ÿ>](|2›<ºFÙUð$mÿH…ÿlÿµÿ´Íÿ*>?]T|i›~º“Ùªð$¶ÿHÂÿlÎÿÚÿ´æÿ>>]]||ðûÿººÙÙðð$ÿÿHÿÿlÿÿÿÿ´ÿÿ>*]?|T›iº~Ù“ðª$ÿ¶HÿÂlÿÎÿÚ´ÿæ>]|(›2º<ÙFðU$ÿmHÿ…lÿÿµ´ÿÍ>]|›ºÙð$ÿ$HÿHlÿlÿ´ÿ´>](|2›<ºFÙUðmÿ$…ÿHÿlµÿÍÿ´*>?]T|i›~º“Ùªð¶ÿ$ÂÿHÎÿlÚÿæÿ´>>]]||››ººÙÙððÿÿ$ÿÿHÿÿlÿÿÿÿ´>*]?|T›iº~Ù“ðªÿ¶$ÿÂHÿÎlÿÚÿæ´>]|(›2º<ÙFðUÿm$ÿ…HÿlÿµÿÍ´>]|›ºÙðÿ$$ÿHHÿllÿÿ´´>]|(›2º<ÙFðUÿ$mÿH…ÿlÿµÿ´Í>*]?|T›iº~Ù“ðªÿ$¶ÿHÂÿlÎÿÚÿ´æ>>]]||››ººÙÙððÿ$ÿÿHÿÿlÿÿÿÿ´ÿ*>?]T|i›~º“Ùªð¶$ÿÂHÿÎlÿÚÿæ´ÿ>](|2›<ºFÙUðm$ÿ…HÿlÿµÿÍ´ÿ,,,999EEERRR___lllxxx………’’’ŸŸŸ«««¸¸¸ÅÅÅÒÒÒÞÞÞëëëøøøðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿÿÿÿøøø111ø11øø%%øøøø11øpæ%n1øø11øÿ##øø11ø’pÝpîø1øø¯yp(pòø1øøøøpøøø1ø1ø1111ø11ø1ø1111ø11ø1øøøøøø11ø1øøøøøø1ø11111111ø1ø11111111øøøøøøøøøøøàààààààààààààààà( @€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿwwwwwwwwwwwpÿÿÿÿÿÿÿÿÿÿÿpÿÿÿÿÿÿÿÿÿÿÿpÿÿÿÿðpÿÿÿÿˆˆˆ0ˆˆpÿÿÿÿÿÿ0ÿøpÿÿÿÿŽ0øpÿÿÿÿŠªãŠêpÿÿÿÿŠú39pÿÿÿÿŠ®aŽ pÿð)(ˆîªpÿˆˆˆ†é ©)ðpÿÿÿé 8#€pÿˆø‰ˆ¡Ž¨pÿÿÿˆŽªîªpÿˆøˆˆˆèˆˆÿpÿÿÿÿÿøÿÿÿpÿˆøˆøÿÿÿpÿÿÿÿÿøÿÿÿpÿˆøˆøÿÿÿpÿÿÿÿÿøÿÿÿpÿˆˆˆˆˆˆ€ÿˆˆˆˆˆˆÿÿxÿÿÿÿÿÿÿÿ÷€ÿÿÿÿÿÿÿÿxÿÿÿÿÿÿÿÿ‡€ÿÿÿÿÿÿÿÿˆÿÿÿÿÿÿÿÿ€ˆˆˆˆˆˆˆˆ€þþþþþþþþþþþþþþþþþþþþþþþþþþþþþ?þÿÿÿÿÿÿÿÿ( @€€€€€€€€€ÀÀÀÀÜÀðʦÔðÿ±âÿŽÔÿkÆÿH¸ÿ%ªÿªÿ’Üz¹b–Js2PÔãÿ±ÇÿŽ«ÿkÿHsÿ%WÿUÿIÜ=¹1–%sPÔÔÿ±±ÿŽŽÿkkÿHHÿ%%ÿþܹ–sPãÔÿDZÿ«ŽÿkÿsHÿW%ÿUÿIÜ=¹1–%sPðÔÿâ±ÿÔŽÿÆkÿ¸Hÿª%ÿªÿ’Üz¹b–Js2PÿÔÿÿ±ÿÿŽÿÿkÿÿHÿÿ%ÿþþÜܹ¹––ssPPÿÔðÿ±âÿŽÔÿkÆÿH¸ÿ%ªÿªÜ’¹z–bsJP2ÿÔãÿ±ÇÿŽ«ÿkÿHsÿ%WÿUÜI¹=–1s%PÿÔÔÿ±±ÿŽŽÿkkÿHHÿ%%þܹ–sPÿãÔÿDZÿ«ŽÿkÿsHÿW%ÿUÜI¹=–1s%PÿðÔÿâ±ÿÔŽÿÆkÿ¸Hÿª%ÿªÜ’¹z–bsJP2ÿÿÔÿÿ±ÿÿŽÿÿkÿÿHÿÿ%þþÜܹ¹––ssPPðÿÔâÿ±ÔÿŽÆÿk¸ÿHªÿ%ªÿ’Üz¹b–Js2PãÿÔÇÿ±«ÿŽÿksÿHWÿ%UÿIÜ=¹1–%sPÔÿÔ±ÿ±ŽÿŽkÿkHÿH%ÿ%þܹ–sPÔÿã±ÿÇŽÿ«kÿHÿs%ÿWÿUÜI¹=–1s%PÔÿð±ÿâŽÿÔkÿÆHÿ¸%ÿªÿªÜ’¹z–bsJP2Ôÿÿ±ÿÿŽÿÿkÿÿHÿÿ%ÿÿþþÜܹ¹––ssPPòòòæææÚÚÚÎÎζ¶¶ªªªžžž’’’†††zzznnnbbbVVVJJJ>>>222&&&ðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿÿÿÿøøööööööööööööööööööööööøööööööööööööööööööööööøööööööööööøööööööööøøøøøòíøøøöøööööööööøöööööööööøöøööööööööøöé ååøøøöøöøööööööööø££ ¬í¬ øöøöøööööööööø ÿ…òöøöøööööööööøö£«¬î ½åøöøöööø" êîÓé  ¬øöøööøøøøøøøŸ¢«éíòÿ'øöøööøöööööøö¬ Ó¯éÓøöøööøöøøöøøöö¬ÿ í ¬øöøööøöööööøøø  ¬  ¬éøøöøööøöøøöøøøøøøø éøøøøööøööøööööööööööøöööööööøööøöøøöøøöøøöøöööööööøööøööööööööööøöööööööøööøöøøöøøöøøöøöööööööøööøööööööööööøöööööööøööøøøøøøøøøøøøöøøööøøøøøøøøøøøøööøöööøøööööööööööööööööøööøøööööööööööööööööøöøøööööööööööööööööøøøööööööööööööööööøøøööööööööööööööööøøøøøøøøøøøøøøøøøøøþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ?þÿÿÿÿÿÿÿÿ(0`€€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿwwwwwwwwwwwwwwwwwwppwwwwwwwwwwwwwwwwwppÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿppÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿppÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿppÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿppÿÿÿÿÿðÿppÿÿÿÿÿˆˆˆˆ0ˆˆ€ÿppÿÿÿÿÿÿÿÿñ™Ÿÿÿÿ€ÿppÿÿÿÿÿÿðøˆˆˆÿ€ÿppÿÿÿÿÿÿŽèÿøÿ€ÿppÿÿÿÿÿªª  îÿ€ÿppÿÿÿÿÿ†®îî㪪 ÿ€ÿppÿÿÿÿÿŽïÿ€9‰›™ÿ€ÿppÿÿÿÿÿ®îîè €ÿppÿÿÿÿÿˆêlÌŽéîꪀÿppÿÿÿÿÿªªd„Œªêª€ÿppÿÿŠŽ1îH€€ÿppÿøˆˆˆúªª©Žî˜˜ÿppÿøÿÿÿþ˜šîª«»®îÿppÿøÿˆÿ8dªîîêÿ€ÿppÿøÿÿÿˆˆîîª ˆ€ÿppÿøÿÿÿˆˆˆˆŽª¨ª¨ˆ€ÿppÿøÿˆˆˆˆˆˆîˆˆˆˆÿppÿøÿÿÿÿÿÿÿÿÿøÿÿÿÿppÿøÿÿÿÿÿÿÿÿÿøÿÿÿÿppÿøÿˆˆˆˆøÿÿÿÿppÿøÿÿÿÿÿÿÿÿÿøÿÿÿÿppÿøÿÿÿÿÿÿÿÿÿøÿÿÿÿppÿøÿˆˆˆˆøÿÿÿÿppÿøÿÿÿÿÿÿÿÿÿøÿÿÿÿppÿøÿÿÿÿÿÿÿÿÿøÿÿÿÿppÿøˆˆˆˆˆˆˆˆˆˆÿÿÿÿppÿøˆˆˆˆˆˆˆˆˆˆÿÿÿÿppÿøˆˆˆˆˆˆˆˆˆˆÿÿÿÿÿppÿÿÿÿÿÿÿÿÿÿÿÿÿ÷wwwpÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷xÿÿÿÿÿÿÿÿÿÿÿÿÿÿw€ÿÿÿÿÿÿÿÿÿÿÿÿÿ÷xÿÿÿÿÿÿÿÿÿÿÿÿÿw€ÿÿÿÿÿÿÿÿÿÿÿÿÿ‡xÿÿÿÿÿÿÿÿÿÿÿÿÿ‡€ÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÿÿÿÿÿÿÿÀÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€?ÿ€ÿ€ÿÿ€ÿÿ€ÿÿÿÿÿÿÿ(0` €€€€€€€€€ÀÀÀÀÜÀðʦ>]|›ºÙð$$ÿHHÿllÿÿ´´ÿ>](|2›<ºFÙUð$mÿH…ÿlÿµÿ´Íÿ*>?]T|i›~º“Ùªð$¶ÿHÂÿlÎÿÚÿ´æÿ>>]]||››ðûÿÙÙðð$ÿÿHÿÿlÿÿÿÿ´ÿÿ>*]?|T›iº~Ù“ðª$ÿ¶HÿÂlÿÎÿÚ´ÿæ>]|(›2º<ÙFðU$ÿmHÿ…lÿÿµ´ÿÍ>]|›ºÙð$ÿ$HÿHlÿlÿ´ÿ´>](|2›<ºFÙUðmÿ$…ÿHÿlµÿÍÿ´*>?]T|i›~º“Ùªð¶ÿ$ÂÿHÎÿlÚÿæÿ´>>]]||››ººÙÙððÿÿ$ÿÿHÿÿlÿÿÿÿ´>*]?|T›iº~Ù“ðªÿ¶$ÿÂHÿÎlÿÚÿæ´>]|(›2º<ÙFðUÿm$ÿ…HÿlÿµÿÍ´>]|›ºÙðÿ$$ÿHHÿllÿÿ´´>]|(›2º<ÙFðUÿ$mÿH…ÿlÿµÿ´Í>*]?|T›iº~Ù“ðªÿ$¶ÿHÂÿlÎÿÚÿ´æ>>]]||››ººÙÙððÿ$ÿÿHÿÿlÿÿÿÿ´ÿ*>?]T|i›~º“Ùªð¶$ÿÂHÿÎlÿÚÿæ´ÿ>](|2›<ºFÙUðm$ÿ…HÿlÿµÿÍ´ÿ,,,999EEERRR___lllxxx………’’’ŸŸŸ«««¸¸¸ÅÅÅÒÒÒÞÞÞëëëøøøðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿÿÿÿøø2222222222222222222222222222222222ø2222222222222222222222222222222222ø2222222222222222222222222222222222ø2222222222222222222222222222222222ø2222222222222ø2222222222øøøøøøøøêæ#%%"#øøøøøø22ø2222222222ø22222222#%2222222ø22ø2222222222ø22222222%#øøøøøø22ø22ø2222222222ø222mfpm2%#î22222ø22ø22ø2222222222ø22òdndnd 2împnòø22ø22ø2222222222ømdpppfpp%æddpddø22ø22ø2222222222øppÿÿÿmæ# %é22ø22ø2222222222ø2pfpfpfp%km#pakkkê2ø22ø2222222222øêpnyŸüŸ#aæppeppdndî22ø2222222222UQ!dy‘‘‘#dæêêÝîfpnddê22ø2222ø\îfmæ%æpf#ÍêÝîæ!ø22ø222øøøøøøøø2pndn#ndnêêppp%îø22ø222ø222222ø22fí[fpddNûûûpppfø22ø222ø22øøø2ø22dêewêpppppd22ø22ø222ø222222øøøøpfpfpfdpdpdpdøøøø22ø222ø222222øøøøøøøøøpddpøddpøøøø22ø222ø22øøø2øøøøøøøøøøppøøøøøøøøø222ø222ø2222222222222222222ø222222222ø222ø2222222222222222222ø222222222ø222ø22øøø2øøø2øøø2øøø22ø222222222ø222ø2222222222222222222ø222222222ø222ø2222222222222222222ø222222222ø222ø22øøø2øøø2øøø2øøø22ø222222222ø222ø2222222222222222222ø222222222ø222ø2222222222222222222ø222222222ø222øøøøøøøøøøøøøøøøøøøøø222222222ø222øøøøøøøøøøøøøøøøøøøøø222222222ø222øøøøøøøøøøøøøøøøøøøøø2222222222ø222222222222222222222222222ø22222222222222222222222222øø22222222222222222222222222ø2222øø22222222222222222222222222ø222øø22222222222222222222222222ø22øø22222222222222222222222222ø2øø22222222222222222222222222øøø22222222222222222222222222øøø22222222222222222222222222øøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøÿÿÿÿÿÿÿÀÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€ÿ€?ÿ€ÿ€ÿÿ€ÿÿ€ÿÿÿÿÿÿÿgeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/etc/Windows/icons/gw_setup.ico0000660000175200017530000002362612664543647026303 0ustar guillaumeguillaume(fhŽ èö ¨Þ 00h†00¨î( €€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿpxnxîx¡ ®®x ¡Ð꧈€1ЪxpxÐpêç—pxw€§ª§ð€—€ ®£ww‡¬æˆ‡ z¤w§wp êêêîçzª~ ªüü#ð#à€€ÀÀ€€Ààààòÿ?( €€€€€€€€€ÀÀÀÀÜÀðȤ """)))UUUMMMBBB9993f™Ì3333f3™3Ì3ÿff3fff™fÌfÿ™™3™f™™™Ì™ÿÌÌ3ÌfÌ™ÌÌÌÿÿfÿ™ÿÌ3333f3™3Ì3ÿ3333333f33™33Ì33ÿ3f3f33ff3f™3fÌ3fÿ3™3™33™f3™™3™Ì3™ÿ3Ì3Ì33Ìf3Ì™3ÌÌ3Ìÿ3ÿ33ÿf3ÿ™3ÿÌ3ÿÿff3fff™fÌfÿf3f33f3ff3™f3Ìf3ÿffff3fffff™ffÌf™f™3f™ff™™f™Ìf™ÿfÌfÌ3fÌ™fÌÌfÌÿfÿfÿ3fÿ™fÿÌÌÿÿÌ™™™3™™™™Ì™™33™f™3Ì™ÿ™f™f3™3f™f™™fÌ™3ÿ™™3™™f™™™™™Ì™™ÿ™Ì™Ì3fÌf™Ì™™ÌÌ™Ìÿ™ÿ™ÿ3™Ìf™ÿ™™ÿÌ™ÿÿÌ™3ÌfÌ™ÌÌ™3Ì33Ì3fÌ3™Ì3ÌÌ3ÿÌfÌf3™ffÌf™ÌfÌ™fÿ̙̙3Ì™fÌ™™Ì™ÌÌ™ÿÌÌÌÌ3ÌÌfÌÌ™ÌÌÌÌÌÿÌÿÌÿ3™ÿfÌÿ™ÌÿÌÌÿÿÌ3ÿfÿ™Ì3ÿ33ÿ3fÿ3™ÿ3Ìÿ3ÿÿfÿf3Ìffÿf™ÿfÌÌfÿÿ™ÿ™3ÿ™fÿ™™ÿ™Ìÿ™ÿÿÌÿÌ3ÿÌfÿÌ™ÿÌÌÿÌÿÿÿ3Ìÿfÿÿ™ÿÿÌffÿfÿffÿÿÿffÿfÿÿÿfÁÁÁ___www†††–––ËË˲²²×××ÝÝÝãããêêêñññøøøðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿÿÿÿ’C*#%Cm¼#%ù$q›’’¼%ù$¼››m¼*q%u$›››››’’Cv›%u$¼›Öÿº’¼’#%u$›w’’mm’%z$¼v›mÿI¼oo$›˜-½J’ÿmm’’m¼›’qœ{w’ÿC’nm’G›››*’’’mCm¼mv¯¯›mÿmÿ’¼’mv–w›…’m›m’m’¼›››››››››’¼¼›››’›{¼üü#ð#à€€ÀÀ€€Ààààòÿ?( @€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿ311wxp1ùxp7¹ pxpùvæ xp0¹ ®®zxp7ù ¦êêêxp¡¹ jg®®®xp~¡ù¦êêêêæxpêá¹ ~®ÌÌn§xpaù0ªêÿÿ¦px‡1¹°~®™™øp!ùêæ¦çxð‡¹f  ®®®§÷ ÷ûð®gêêËÇ÷p÷êê /™~»·øp‡®® /™rËÌ€x€— êæð/™'ð ªw7 ª¦æà‘êwp ÷ù~®®ª®§wpxwêêæ–êàx‡xˆˆwwiÉ®£øˆˆˆðp ïüüæç÷ÿÿÿ  iÉ™¬Ï—wwwwªêççìÏ™êêêææçn®®¬Ï™®®®®p¦êêêêêêêêê  n®.®®ª®®®p§ªêêçvêçz®j ~p§ ÿÀÿÿàÿð?ÿø?ÿœ?þ?þ?ø?à?ÀÀÀÀààà€€€€Ààðøøüüüþÿ?ÿüÿþÿ( @€€€€€€€€€ÀÀÀÀÜÀðȤ """)))UUUMMMBBB9993f™Ì3333f3™3Ì3ÿff3fff™fÌfÿ™™3™f™™™Ì™ÿÌÌ3ÌfÌ™ÌÌÌÿÿfÿ™ÿÌ3333f3™3Ì3ÿ3333333f33™33Ì33ÿ3f3f33ff3f™3fÌ3fÿ3™3™33™f3™™3™Ì3™ÿ3Ì3Ì33Ìf3Ì™3ÌÌ3Ìÿ3ÿ33ÿf3ÿ™3ÿÌ3ÿÿff3fff™fÌfÿf3f33f3ff3™f3Ìf3ÿffff3fffff™ffÌf™f™3f™ff™™f™Ìf™ÿfÌfÌ3fÌ™fÌÌfÌÿfÿfÿ3fÿ™fÿÌÌÿÿÌ™™™3™™™™Ì™™33™f™3Ì™ÿ™f™f3™3f™f™™fÌ™3ÿ™™3™™f™™™™™Ì™™ÿ™Ì™Ì3fÌf™Ì™™ÌÌ™Ìÿ™ÿ™ÿ3™Ìf™ÿ™™ÿÌ™ÿÿÌ™3ÌfÌ™ÌÌ™3Ì33Ì3fÌ3™Ì3ÌÌ3ÿÌfÌf3™ffÌf™ÌfÌ™fÿ̙̙3Ì™fÌ™™Ì™ÌÌ™ÿÌÌÌÌ3ÌÌfÌÌ™ÌÌÌÌÌÿÌÿÌÿ3™ÿfÌÿ™ÌÿÌÌÿÿÌ3ÿfÿ™Ì3ÿ33ÿ3fÿ3™ÿ3Ìÿ3ÿÿfÿf3Ìffÿf™ÿfÌÌfÿÿ™ÿ™3ÿ™fÿ™™ÿ™Ìÿ™ÿÿÌÿÌ3ÿÌfÿÌ™ÿÌÌÿÌÿÿÿ3Ìÿfÿÿ™ÿÿÌffÿfÿffÿÿÿffÿfÿÿÿfÁÁÁ___www†††–––ËË˲²²×××ÝÝÝãããêêêñññøøøðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿÿÿÿmnJJ#D#K*##*#n’##*#*"##¼J’’’#Ko%%#’’¼m#mouù$#¼’’’’Jouù$#’qv›p¼’¼m¼ouù$#››{›w¼’’’KK#ouù$#¼¼l›v›{›v’¼m*’qouù$#»pwvq{œ››{œ’’’rœ{ouù$#›p›{›v›{›{›v’¼mv{›ozù$#¼’œ››Š²¬²œ›I’’’#qvozù$#Q¼{›vÿÿÿÿºpI#’¼’###ozù$#,¼›{œGGGG$K#C’¼¼mœpo ù$#q›{wqwqwpC’¼ÿÿ¼m›o ù$#Bl¼¼{›{œ››{m’¼ÿCm¼¼mœÃz%#{›v’rvv›{¬û­’ÿmIDm¼mIooov›{›v˜˜-ÿ½Fw›ûûû’ÿmP#mÿmCmm’Cœ››{œq—-ÿ½JHÇûÈ’ÿ¼mCÿ’moC’{›{›v’˜-ÿ½%JJ#*#K’ÿ¼ÿ’’Fãm’ssJ’¼qœœN{vwC$#w’ÿmÿlnCC’ÿFG“C˜›{œ››{–$J{œ›’’m’Cmm’’’mC’mq›{›{›p*p›{›"’¼¼’’¼’’’’’mm¼C˜rvL…i ù{›{J’ÿ¼ÿÿ¼¼¼¼¼¼’ÿm¼¼v…ÿ…ÿ…›psmÿÿ’mÿÿÿÿ¼¼¼Cp¼›vL…o&G{……ÿã’’QE’µ’¼’¼’{vv–www›……ÿG ›{›{›v›vwp¼q›{›{œ›……ÿGG{œ››{›{›¼¼v›v›{›v›{›v›{›v›{›v’»vœ›–rœ››{œ›w{œ››{œ¼¼˜¼¼q›{›{›q’v›{{»‘–››v¼›’»¼¼r¼ÿÀÿÿàÿð?ÿø?ÿœ?þ?þ?ø?à?ÀÀÀÀààà€€€€Ààðøøüüüþÿ?ÿüÿþÿ(0`€€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿww7730q‘1q‘0wwp—÷‡‘7›™øwù™w÷‡p¹™pwøwù™r¢wø‡¹™w®®§ø‡ù™zêêæçø‡¹™~®®®ªwø‡wù™zêêêê§ø‡¦á¹™wjj ®®®®wø‡.®¡ù™wêêêêêêêgø‡ êêá¹™n®®®®®®®ø‡®®¡ù™êêææææêæ7ø‡ªê¡¹™®®lÌÌήgø‡qù™êê¯ÿÿ÷`‘7ø‡p‘‘¹™ ®®y™™™'øˆp®ù™êê©‘™‘pvxøˆ‡ êq¹™~®®®®®®§ˆˆøp®!ù™'pêêêêêêxøp€ªá¹™ê¦n®®Ì¼Ç‡ xø ¡ù™®®pvêêæÌ¼Çøpázøá»™êêç"ÿ™®»»·øpcø»®® "ÿ™šæÌ¼Çøpázø§ êêç"ÿ™“Ì¼Çø‡xø ™‡®® "ÿ™1‘1‘ˆp€§¡‡§¢&ÿ™ggø€xøww‡™êêêêæq6ꀀf¦w‡÷÷®®®®®®§pwpŽ®®‡Ÿêêêêêqzêê §w êà‡p™—pw®®®®.®®§÷øˆp*wp€z‘ù™’êê7çøpˆ‡‡€™É™š®®§ø‡wˆˆxxwwx€ª¬üüúæÄÿ—øˆˆˆˆ‡‡‡‡™É™š¦Lÿ—øÿøˆˆxxxz©™‘wæDÿ—ø÷wÿˆˆˆˆð~®®®®¦Dÿ—ÿ~®ÿÿÿÿð êêêêæÄÿ“wêêçwwwwp®®®®®®®®®®®®®®`êêêêªêêêêêêêêêàz®®gn®®®®§®®®®v¦êêêêàªêêæ.®®®w®®`êêêpv¦~®gpÿüÿÿþÿÿÿ€ÿÿÿÀ€ÿÿÿð€ÿÿÿð€ÿÿýð€ÿÿà8€ÿÿÀ8€ÿÿÀ€ÿÿÀÿþÀÿðÿðÿðÿàÿàÿàÿàÿàÿðøøàÀ€À€Àààà ðþÿÿÿÿÿÿ€ÿ€ÿÿ€ÿÿÀÿÿààÿÿÿðÿÿÿøÿÿÿüÿÿÿÿþ¿ÿÿ(0` €€€€€€€€€ÀÀÀÀÜÀðȤ """)))UUUMMMBBB9993f™Ì3333f3™3Ì3ÿff3fff™fÌfÿ™™3™f™™™Ì™ÿÌÌ3ÌfÌ™ÌÌÌÿÿfÿ™ÿÌ3333f3™3Ì3ÿ3333333f33™33Ì33ÿ3f3f33ff3f™3fÌ3fÿ3™3™33™f3™™3™Ì3™ÿ3Ì3Ì33Ìf3Ì™3ÌÌ3Ìÿ3ÿ33ÿf3ÿ™3ÿÌ3ÿÿff3fff™fÌfÿf3f33f3ff3™f3Ìf3ÿffff3fffff™ffÌf™f™3f™ff™™f™Ìf™ÿfÌfÌ3fÌ™fÌÌfÌÿfÿfÿ3fÿ™fÿÌÌÿÿÌ™™™3™™™™Ì™™33™f™3Ì™ÿ™f™f3™3f™f™™fÌ™3ÿ™™3™™f™™™™™Ì™™ÿ™Ì™Ì3fÌf™Ì™™ÌÌ™Ìÿ™ÿ™ÿ3™Ìf™ÿ™™ÿÌ™ÿÿÌ™3ÌfÌ™ÌÌ™3Ì33Ì3fÌ3™Ì3ÌÌ3ÿÌfÌf3™ffÌf™ÌfÌ™fÿ̙̙3Ì™fÌ™™Ì™ÌÌ™ÿÌÌÌÌ3ÌÌfÌÌ™ÌÌÌÌÌÿÌÿÌÿ3™ÿfÌÿ™ÌÿÌÌÿÿÌ3ÿfÿ™Ì3ÿ33ÿ3fÿ3™ÿ3Ìÿ3ÿÿfÿf3Ìffÿf™ÿfÌÌfÿÿ™ÿ™3ÿ™fÿ™™ÿ™Ìÿ™ÿÿÌÿÌ3ÿÌfÿÌ™ÿÌÌÿÌÿÿÿ3Ìÿfÿÿ™ÿÿÌffÿfÿffÿÿÿffÿfÿÿÿfÁÁÁ___www†††–––ËË˲²²×××ÝÝÝãããêêêñññøøøðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿÿÿÿ’mmsnm#DCD#DKKKK"K#JK"K’m#*#$#*"K#K#*"m#K$m’m’mCK#K"KC$m"*’ÿ¼’m#*##mozuuù$#¼#’ÿ’’m*#no uuù$#m’ÿ¼’’#Jo uuù$#¼’’ÿ’’mmo uuù$#’lHpHm’¼’ÿ¼mmo uuù$#¼q{œ››{q’ÿ’’mo uuù$#m{›{›v›v‘¼’ÿ¼’’o uuù$#rœ››{›{›{w’’ÿ’’mC¼’mo uuù$#¼¼¼m{›v›{›v›{p’ÿ¼’m’Ipv›o uuù$#¼’pvpwIw{œ››{œ››w’ÿ’’mlpœ››{o uuù$#mw›{›{›v›{›{›{›vp’ÿ¼’’v›{›{›o uuù$#¼p›{œ››{›{›{œ››{›H’ÿ’’m›{›{œ›o uuù$#m›v›{›•›v›v#’ÿ¼mm#qv›{|o uuù$#’{œ››ÈÈÈÈÈȹ{œpD#’ÿ’’m*#DCqWo uuù$#m›{›vÀÿÿÿÿÿÿqpC*##’ÿ¼’’"J"$#%o uuù$#¼››{›—ãGãGãGL#*#DH’ÿ’µ’’›œICo uuù$#’vv›{r ù ù ùCIpmÿ’’’v›{Io uuù$#’œ››{œ››{œ››{œ›m¼ÿ¼’¼’ÿ’’››No uuù$#Nr¼H›{›{›v›{›{›{m¼ÿ¼mCC’¼’q{›o uuù$#›{pl’vœ››{›üüûüümÿ¼mCKIC’’ÿCw›o uuù$#››{›r¼mp›{›v›üüûüü’ÿ¼mv#CvCmÿ#woÿuuù$#›v›{›’Â--ÿÿ½%œ›œûûûûû’ÿ’’p*CœCmÿDmÀoÿzu›{œ››{C˜-'ÿÿ½%{›üüûüü’ÿ¼mw#D{Cmÿ®“moooov›{›{›mÂ-Oÿÿ“% #Iüüûüümÿ’¼m*#C’’ÿããLmÿ¼mC›{›{œH˜-'ÿÿ½%C##*###$#mÿmC’’ÿGooDCÿ’mwrOrI¼ÂONÿÿ˜KJœvqDD$*#Dvmÿ¼’ÿ’CniŒ“’mÿ¼mC½ùGùã¼N›{›{›{›v›vC##p›vmÿ’mÿpqrkwCÿ’’ÿ”o”“q{›{œ››{›{›DK"œ{›{m’’m’C{›{œ››mÿ¼mC½ããã”C’vv›{›v›{›vD#Jv›{›vr"rmm’Cv›{›Cmÿ’’mù ùFmm’q››{œ››{œJ*qœ››{œJD{mÿ’mEJKm’ÿ’¼’’q—rr’¼C’Hl{K ¶‚ù ùO›{›{#m›’ÿ¼mCCCmÿ¼’’’’’’mmœKGÿGGG—{œ››#q{mÿ’¼m’’¼’¼’’’¼’’m’m’¼C’v´ÿϧÿÏÖ•›pŠeÿÿG’ÿ¼’’¼’¼’’’’’’’’¼CmœKGÿŽGG&—›…†ÿÿG’ÿ¼ÿÿÿÿÿµ’¼’µ’¼m’{r$˜mKEKw›k……ÿÿG’ÿ¼ÿ’m’ÿÿ¼¼m’›{›{›{œ››{……ÿÿGmÿÿ’›{œ’ÿÿÿÿÿÿ¼ÿ¼ÿ’’¼v›{›v›{›v›pŠeÿÿGGmm›v›{›’’’’’’’’’’r››{œ››{œ››{œ››{œ››{œ››{œ››{œp’›{›{›v›{œ{›{›v›{›{›{›v›{›{›{v¼˜w››{›vrqœ››{›{›{œ›q{›{›{œ››H¼mNql’’N›v›{›v›{{Cq{›v›{›p¼¼pœ››{œ››H’q{œ››v¼I›{›{›v’¼mpql¼¼rœ››vr¼¼’m¼ÿüÿÿþÿÿÿ€ÿÿÿÀ€ÿÿÿà€ÿÿÿð€ÿÿýð€ÿÿà0€ÿÿÀ8€ÿÿÀ€ÿÿÀÿþÿðÿðÿàÿàÿàÿàÿàÿàÿðøøà€€€€€Ààà ðüÿÿÿÿÿÿÿ€ÿÿ€ÿÿÀÿÿà@ÿÿÿàÿÿÿðÿÿÿøÿÿÿÿþÿÿgeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/etc/Windows/icons/gwu.ico0000660000175200017530000001114612664543647025242 0ustar guillaumeguillaume(Fhn èÖ ¨¾ ( €€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿ30 a:™™ ¦  sª§þó ªfz` ª ðÿÿðúpðú§ðwªðÿðwwÿ÷pwwwÿÃÿçûÁÛß߀ÿÿÿÿÿÿÿÿ( €€€€€€€€€ÀÀÀÀÜÀðʦ>]|›ºÙð$$ÿHHÿllÿÿ´´ÿ>](|2›<ºFÙUð$mÿH…ÿlÿµÿ´Íÿ*>?]T|i›~º“Ùªð$¶ÿHÂÿlÎÿÚÿ´æÿ>>]]||››ººÙÙðð$ÿÿHÿÿlÿÿÿÿ´ÿÿ>*]?|T›iº~Ù“ðª$ÿ¶HÿÂlÿÎÿÚ´ÿæ>]|(›2º<ÙFðU$ÿmHÿ…lÿÿµ´ÿÍ>]|›ºÙð$ÿ$HÿHlÿlÿ´ÿ´>](|2›<ºFÙUðmÿ$…ÿHÿlµÿÍÿ´*>?]T|i›~º“Ùªð¶ÿ$ÂÿHÎÿlÚÿæÿ´>>]]||››ººÙÙððÿÿ$ÿÿHÿÿlÿÿÿÿ´>*]?|T›iº~Ù“ðªÿ¶$ÿÂHÿÎlÿÚÿæ´>]|(›2º<ÙFðUÿm$ÿ…HÿlÿµÿÍ´>]|›ºÙðÿ$$ÿHHÿllÿÿ´´>]|(›2º<ÙFðUÿ$mÿH…ÿlÿµÿ´Í>*]?|T›iº~Ù“ðªÿ$¶ÿHÂÿlÎÿÚÿ´æ>>]]||››ººÙÙððÿ$ÿÿHÿÿlÿÿÿÿ´ÿ*>?]T|i›~º“Ùªð¶$ÿÂHÿÎlÿÚÿæ´ÿ>](|2›<ºFÙUðm$ÿ…HÿlÿµÿÍ´ÿ,,,999EEERRR___lllxxx………’’’ŸŸŸ«««¸¸¸ÅÅÅÒÒÒÞÞÞëëëøøøðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿÿÿÿêæ%#%éù mp%êpùùùùùp%%# ùùppî=îîpmùppééépÿùÿp%p opppòøööööööøööZ"pöøööZ"ZöøøøöÿZöøöööøööøøøøøöøööööøøøøøøøøÿÃÿçûÁÛß߀ÿÿÿÿÿÿÿÿ( @€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿs0p™ îó“7p™¦®£®  ™™™™ ìês1꣙™™™™©“ca™™êî§vzêà™™~>—3n¦™ú—“ç9zp™®g§n™yùçö©ê癪™ožn êîzêç®®®n¯ÿÿÿÿÿÿð æðÿÿððÿÿwp7pðÿÿ÷swððÿÿïp3ðððöa¢pðwwöàpðw÷ÿ¯ ðÿwêêðÿÿ÷ÿðÿÿ÷ÿðw÷÷÷ÿðwwww÷ÿÿÿÿ÷÷ÿÿÿÿ÷pÿÿÿÿ÷wwwwwwÿÿøÿÿü?ÿßö?ÿÏàÿÇ€ø€ð€ñÇ€óÏóßóÿ€óÿÀóÿÀÿÿà€àþ'ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ( @€€€€€€€€€ÀÀÀÀÜÀðʦ>]|›ºÙð$$ÿHHÿllÿÿ´´ÿ>](|2›<ºFÙUð$mÿH…ÿlÿµÿ´Íÿ*>?]T|i›~º“Ùªð$¶ÿHÂÿlÎÿÚÿ´æÿ>>]]||››ººÙÙðð$ÿÿHÿÿlÿÿÿÿ´ÿÿ>*]?|T›iº~Ù“ðª$ÿ¶HÿÂlÿÎÿÚ´ÿæ>]|(›2º<ÙFðU$ÿmHÿ…lÿÿµ´ÿÍ>]|›ºÙð$ÿ$HÿHlÿlÿ´ÿ´>](|2›<ºFÙUðmÿ$…ÿHÿlµÿÍÿ´*>?]T|i›~º“Ùªð¶ÿ$ÂÿHÎÿlÚÿæÿ´>>]]||››ººÙÙððÿÿ$ÿÿHÿÿlÿÿÿÿ´>*]?|T›iº~Ù“ðªÿ¶$ÿÂHÿÎlÿÚÿæ´>]|(›2º<ÙFðUÿm$ÿ…HÿlÿµÿÍ´>]|›ºÙðÿ$$ÿHHÿllÿÿ´´>]|(›2º<ÙFðUÿ$mÿH…ÿlÿµÿ´Í>*]?|T›iº~Ù“ðªÿ$¶ÿHÂÿlÎÿÚÿ´æ>>]]||››ººÙÙððÿ$ÿÿHÿÿlÿÿÿÿ´ÿ*>?]T|i›~º“Ùªð¶$ÿÂHÿÎlÿÚÿæ´ÿ>](|2›<ºFÙUðm$ÿ…HÿlÿµÿÍ´ÿ,,,999EEERRR___lllxxx………’’’ŸŸŸ«««¸¸¸ÅÅÅÒÒÒÞÞÞëëëøøøðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿÿÿÿêéæ#%##é%##ùò%#éùùgppò%%#òæùùù emfpf%#êdpeùùùùùùùùùfp‡‡fæ%##nMM1ùùùùùùùùùùpf%m%æ#m ùùùùùùòpfppméænædpdnùùùùîpp+î%=#îîdpdmùùùîpé%%pé#æégéùùpfpoéfé#édpéÿùùêÝùpéfn''pddòùùp…ÿp%dpdppfytêdpddò fofpdpdpdòøööööööööööööööopnîòøöööööööøöööööøøøå"êøöøööööööîò"øøööøöööööpÿå""&ööøööömd"pSòöøöøøøøqne"êåöøöøøöøöödÿêdöøöøöööøøpdpdøööøöøööööööøööööøöøööööööøööööøöøøöøöøöøööööøöøøøøøøøøöøøööööööööööøöøøööööööööööøøøööööööööööøøøøøøøøøøøøøÿÿøÿÿü?ÿßö?ÿÏàÿÇ€ø€ð€ñÇ€óÏóßóÿ€óÿÀóÿÀÿÿà€àþ'ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿgeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/etc/Windows/icons/gw_text.ico0000660000175200017530000002362612664543647026127 0ustar guillaumeguillaume(fhŽ èö ¨Þ 00h†00¨î( €€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿwwwwwpÿÿÿÿÿpÿÿÿÿÿpÿÿpÿÿÿÿÿpÿÿpÿóÿÿÿpþ£oÿpï:ÿÿpj¨ ÿpúã¨ïÿpúª®¯ÿpþêêðððŽÀ€€€€€€€€€€€€€Àê¯( €€€€€€€€€ÀÀÀÀÜÀðȤ """)))UUUMMMBBB9993f™Ì3333f3™3Ì3ÿff3fff™fÌfÿ™™3™f™™™Ì™ÿÌÌ3ÌfÌ™ÌÌÌÿÿfÿ™ÿÌ3333f3™3Ì3ÿ3333333f33™33Ì33ÿ3f3f33ff3f™3fÌ3fÿ3™3™33™f3™™3™Ì3™ÿ3Ì3Ì33Ìf3Ì™3ÌÌ3Ìÿ3ÿ33ÿf3ÿ™3ÿÌ3ÿÿff3fff™fÌfÿf3f33f3ff3™f3Ìf3ÿffff3fffff™ffÌf™f™3f™ff™™f™Ìf™ÿfÌfÌ3fÌ™fÌÌfÌÿfÿfÿ3fÿ™fÿÌÌÿÿÌ™™™3™™™™Ì™™33™f™3Ì™ÿ™f™f3™3f™f™™fÌ™3ÿ™™3™™f™™™™™Ì™™ÿ™Ì™Ì3fÌf™Ì™™ÌÌ™Ìÿ™ÿ™ÿ3™Ìf™ÿ™™ÿÌ™ÿÿÌ™3ÌfÌ™ÌÌ™3Ì33Ì3fÌ3™Ì3ÌÌ3ÿÌfÌf3™ffÌf™ÌfÌ™fÿ̙̙3Ì™fÌ™™Ì™ÌÌ™ÿÌÌÌÌ3ÌÌfÌÌ™ÌÌÌÌÌÿÌÿÌÿ3™ÿfÌÿ™ÌÿÌÌÿÿÌ3ÿfÿ™Ì3ÿ33ÿ3fÿ3™ÿ3Ìÿ3ÿÿfÿf3Ìffÿf™ÿfÌÌfÿÿ™ÿ™3ÿ™fÿ™™ÿ™Ìÿ™ÿÿÌÿÌ3ÿÌfÿÌ™ÿÌÌÿÌÿÿÿ3Ìÿfÿÿ™ÿÿÌffÿfÿffÿÿÿffÿfÿÿÿfÁÁÁ___www†††–––ËË˲²²×××ÝÝÝãããêêêñññøøøðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿÿÿÿøøÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿøÿÿÿÿøÿÿÿÿÿÿÿÿÿÿøÿÿÿÿøÿÿÿ$ÿÿÿÿÿÿøÿ››*q¼ÿÿø›ÝI$#wÿÿÿÿøvwwD$››ÿÿøœww$nwwÿÿÿøÿw›xw››ÿÿÿøÿ›››››ÿÿÿÿøøÿøÿøÿÀ€€€€€€€€€€€€€Àê¯( @€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿwwwwwwwwwwppÿÿÿÿÿÿÿÿÿÿ÷ÿÿÿÿÿÿÿÿÿÿ÷ðÿÿÿÿÿÿ÷ÿÿÿÿÿÿÿÿÿÿ÷ðÿÿÿÿÿÿ÷ÿÿÿÿÿÿÿÿÿÿ÷ÿÿÿÿÿÿÿÿÿÿ÷ð÷ÿÿÿÿÿÿÿÿÿÿ÷ð÷ÿÿÿÿÿÿÿÿÿÿ÷ð÷ÿÿÿÿÿÿÿ÷ð3÷ÿŽªÿÿÿÿÿÿ÷ø®ê8êïÿÿÿÿ÷®o¨jÿÿÿÿ÷¡ÿÿÿÿ÷Ž®¨ ®oÿÿÿ÷Šªh¢‰˜êïÿÿÿ÷ªjˆúŸÿÿÿ÷ªæªá¨è¯ÿÿÿ÷ÿˆVþ›®¯÷úꪪêêïÿÿÿ÷újª®®¯ÿÿÿÿ÷ÿøêþïÿÿÿÿ÷ðÿðÿðÿøðÿðÿðÿøøˆøˆøˆø€ðàÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀàòI$¿( @€€€€€€€€€ÀÀÀÀÜÀðȤ """)))UUUMMMBBB9993f™Ì3333f3™3Ì3ÿff3fff™fÌfÿ™™3™f™™™Ì™ÿÌÌ3ÌfÌ™ÌÌÌÿÿfÿ™ÿÌ3333f3™3Ì3ÿ3333333f33™33Ì33ÿ3f3f33ff3f™3fÌ3fÿ3™3™33™f3™™3™Ì3™ÿ3Ì3Ì33Ìf3Ì™3ÌÌ3Ìÿ3ÿ33ÿf3ÿ™3ÿÌ3ÿÿff3fff™fÌfÿf3f33f3ff3™f3Ìf3ÿffff3fffff™ffÌf™f™3f™ff™™f™Ìf™ÿfÌfÌ3fÌ™fÌÌfÌÿfÿfÿ3fÿ™fÿÌÌÿÿÌ™™™3™™™™Ì™™33™f™3Ì™ÿ™f™f3™3f™f™™fÌ™3ÿ™™3™™f™™™™™Ì™™ÿ™Ì™Ì3fÌf™Ì™™ÌÌ™Ìÿ™ÿ™ÿ3™Ìf™ÿ™™ÿÌ™ÿÿÌ™3ÌfÌ™ÌÌ™3Ì33Ì3fÌ3™Ì3ÌÌ3ÿÌfÌf3™ffÌf™ÌfÌ™fÿ̙̙3Ì™fÌ™™Ì™ÌÌ™ÿÌÌÌÌ3ÌÌfÌÌ™ÌÌÌÌÌÿÌÿÌÿ3™ÿfÌÿ™ÌÿÌÌÿÿÌ3ÿfÿ™Ì3ÿ33ÿ3fÿ3™ÿ3Ìÿ3ÿÿfÿf3Ìffÿf™ÿfÌÌfÿÿ™ÿ™3ÿ™fÿ™™ÿ™Ìÿ™ÿÿÌÿÌ3ÿÌfÿÌ™ÿÌÌÿÌÿÿÿ3Ìÿfÿÿ™ÿÿÌffÿfÿffÿÿÿffÿfÿÿÿfÁÁÁ___www†††–––ËË˲²²×××ÝÝÝãããêêêñññøøøðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿÿÿÿøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿøÿÿÿÿÿJ##ÿÿÿÿÿÿÿÿÿÿÿÿøÿÿ#Jÿÿøÿÿÿ››¼$Kÿÿÿÿÿÿÿÿÿÿÿÿÿøÿ»wqœ›œ#r{›wÿÿÿÿÿÿÿÿÿÿøÿœ›²²ÿI##vVVÿÿÿÿÿÿÿÿÿÿøÿ›œGGKqI#pÿÿÿÿÿÿÿÿÿÿøÿ¼›œ››qIvI{›{vÿÿÿÿÿÿÿÿø—ÿvv®vNDiGo›››ÿÿÿÿÿÿÿÿø¼ÿNvv#v$’n’FÿGÿÿÿÿÿÿÿÿøÿq{{pp{ÿ#Prw˜Pÿÿÿÿÿÿÿÿøÿÿ¼‘vpx›88›››ÿÿÿÿøÿÿvvwwvv››››wÿÿÿÿÿÿÿÿøÿÿvvv{v›››››ÿÿÿÿÿÿÿÿÿÿøÿÿÿv˜ÿq››’›{ÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿ¼ÿÿÿÿÿÿÿÿÿøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿøøÿøøÿøøÿøøÿøøÿøøÿøøÿøðàÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀàòI$¿(0`€€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ‡wwwwwwwwwwwwwww€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿpxÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷€ÿÿÿÿÿÿÿÿÿÿÿ÷€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷€ÿÿÿÿÿÿÿÿÿÿÿ÷€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷€ÿ÷€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷€ÿ÷€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷€ÿ÷€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷€ÿ÷€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷€ÿ100÷€ÿÿÿÿÿÿÿÿÿÿÿÿ÷€ÿ10÷€ÿú®ªÿÿÿÿÿÿÿÿÿÿ÷€ÿöêæƒˆ¦ÿÿÿÿÿÿÿÿ÷€®ª®ª®jÿÿÿÿÿÿÿÿ÷€úìö¢18è«ÿÿÿÿÿÿÿÿ÷€Ž©“>aÿÿÿÿÿÿÿÿ÷€êæêf2£â hÿÿÿÿÿÿÿ÷€ªnlcjª®ÿÿÿÿÿÿÿ÷€Žÿž¨¨á¨˜îêÿÿÿÿÿÿÿ÷€Žÿ£>£Šˆ8ˆÿÿÿÿÿÿ÷€Šîfá6ㆪ¯ùÿÿÿÿÿÿÿ÷€®®£nªc¨(ˆÿÿÿÿÿÿÿ÷€ø©ážêë³¾êïÿÿÿÿÿÿ÷€ÿ®©¨O˜.®÷€ÿæêªïšî¦èÿÿÿÿÿÿÿ÷€ÿª®ª®n®ªÿÿÿÿÿÿÿÿ÷€ÿþêîêªêîÿÿÿÿÿÿÿÿ÷€ÿÿ®þ®¯€ÿÿÿÿÿÿÿÿ÷€ÿÿÿÿêÿÿÿÿÿÿÿÿÿÿ÷€÷÷÷÷÷÷÷÷ø€pÿpÿpÿpÿpÿpÿpÿpÿp€pÿpÿpÿpÿpÿpÿpÿpÿp€pˆpˆpˆpˆpˆpˆpˆpˆp€þü?øððððððððððððððððððððððððððððððððððððððððððøþ""""?ÿÿÿÿÿÿ(0` €€€€€€€€€ÀÀÀÀÜÀðȤ """)))UUUMMMBBB9993f™Ì3333f3™3Ì3ÿff3fff™fÌfÿ™™3™f™™™Ì™ÿÌÌ3ÌfÌ™ÌÌÌÿÿfÿ™ÿÌ3333f3™3Ì3ÿ3333333f33™33Ì33ÿ3f3f33ff3f™3fÌ3fÿ3™3™33™f3™™3™Ì3™ÿ3Ì3Ì33Ìf3Ì™3ÌÌ3Ìÿ3ÿ33ÿf3ÿ™3ÿÌ3ÿÿff3fff™fÌfÿf3f33f3ff3™f3Ìf3ÿffff3fffff™ffÌf™f™3f™ff™™f™Ìf™ÿfÌfÌ3fÌ™fÌÌfÌÿfÿfÿ3fÿ™fÿÌÌÿÿÌ™™™3™™™™Ì™™33™f™3Ì™ÿ™f™f3™3f™f™™fÌ™3ÿ™™3™™f™™™™™Ì™™ÿ™Ì™Ì3fÌf™Ì™™ÌÌ™Ìÿ™ÿ™ÿ3™Ìf™ÿ™™ÿÌ™ÿÿÌ™3ÌfÌ™ÌÌ™3Ì33Ì3fÌ3™Ì3ÌÌ3ÿÌfÌf3™ffÌf™ÌfÌ™fÿ̙̙3Ì™fÌ™™Ì™ÌÌ™ÿÌÌÌÌ3ÌÌfÌÌ™ÌÌÌÌÌÿÌÿÌÿ3™ÿfÌÿ™ÌÿÌÌÿÿÌ3ÿfÿ™Ì3ÿ33ÿ3fÿ3™ÿ3Ìÿ3ÿÿfÿf3Ìffÿf™ÿfÌÌfÿÿ™ÿ™3ÿ™fÿ™™ÿ™Ìÿ™ÿÿÌÿÌ3ÿÌfÿÌ™ÿÌÌÿÌÿÿÿ3Ìÿfÿÿ™ÿÿÌffÿfÿffÿÿÿffÿfÿÿÿfÁÁÁ___www†††–––ËË˲²²×××ÝÝÝãããêêêñññøøøðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿÿÿÿøøøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿÿÿÿÿøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿÿÿÿÿøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿÿÿÿÿøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿÿÿÿÿøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿÿÿ’#*$#"#ÿÿøøÿÿÿÿÿÿÿ’#$#mÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿÿÿ’##Kÿÿøøÿÿÿÿ›{›ÿm$nÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿÿÿ¼l››{vC*D’qvlÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿ››{v››{v#$#{››vvÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿ’››²ÿÿœI##*qvV}}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿ¼{œGG$Kq#IKœpEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿ››{qwwpv$Iv)›H!!B¼ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿ›vv{¬­Ç#IDvv$›{v››ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøø›ÿ½F›rs’Kv#œ‘E’›œ›{œÿÿÿÿÿÿÿÿÿÿÿÿÿÿøø›ÿ½›J##K›{#–”FDKsJ’ÿÿÿÿÿÿÿÿÿÿÿÿÿÿøø››œNvw$#v›$Cln’IFÿGÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿ››{{›*p{›–v#PrOJ˜Pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿÿ˜rL› ù›{œ›X11X›{{wÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿÿÿ›››ù›‹…ÿGQEKrœ›{ÿÿÿÿøøÿÿÿ›v–ww››ÿ {››vvwÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿÿÿ›v››{v››v{››{vÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿÿÿÿ»v›–œ›{œw{››œÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿÿÿÿÿ››ÿ››››¼’»ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿÿÿÿÿÿÿÿÿ›rÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøøøøøøøøøøøøøøøøøøþü?øððððððððððððððððððððððððððððððððððððððððððøþ""""?ÿÿÿÿÿÿgeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/etc/Windows/icons/gw2ged.ico0000660000175200017530000001114612664543647025617 0ustar guillaumeguillaume(Fhn èÖ ¨¾ ( €€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿðððw r!™™zªª **rª¢p *÷ðð3pÆc~é“1nsw¦êwz𠟣`êîðÿ€ÿûÁÛßßÿÁÃÿçÿÿÿÿÿÿÿ( €€€€€€€€€ÀÀÀÀÜÀðʦ>]|›ºÙð$$ÿHHÿllÿÿ´´ÿ>](|2›<ºFÙUð$mÿH…ÿlÿµÿ´Íÿ*>?]T|i›~º“Ùªð$¶ÿHÂÿlÎÿÚÿ´æÿ>>]]||››ººÙÙðð$ÿÿHÿÿlÿÿÿÿ´ÿÿ>*]?|T›iº~Ù“ðª$ÿ¶HÿÂlÿÎÿÚ´ÿæ>]|(›2º<ÙFðU$ÿmHÿ…lÿÿµ´ÿÍ>]|›ºÙð$ÿ$HÿHlÿlÿ´ÿ´>](|2›<ºFÙUðmÿ$…ÿHÿlµÿÍÿ´*>?]T|i›~º“Ùªð¶ÿ$ÂÿHÎÿlÚÿæÿ´>>]]||››ººÙÙððÿÿ$ÿÿHÿÿlÿÿÿÿ´>*]?|T›iº~Ù“ðªÿ¶$ÿÂHÿÎlÿÚÿæ´>]|(›2º<ÙFðUÿm$ÿ…HÿlÿµÿÍ´>]|›ºÙðÿ$$ÿHHÿllÿÿ´´>]|(›2º<ÙFðUÿ$mÿH…ÿlÿµÿ´Í>*]?|T›iº~Ù“ðªÿ$¶ÿHÂÿlÎÿÚÿ´æ>>]]||››ººÙÙððÿ$ÿÿHÿÿlÿÿÿÿ´ÿ*>?]T|i›~º“Ùªð¶$ÿÂHÿÎlÿÚÿæ´ÿ>](|2›<ºFÙUðm$ÿ…HÿlÿµÿÍ´ÿ,,,999EEERRR___lllxxx………’’’ŸŸŸ«««¸¸¸ÅÅÅÒÒÒÞÞÞëëëøøøðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿÿÿÿòîææòòòÿæîêîùòSW"êòæùùùùùêWWWWWSùùêWWWWWSîùêWWWWWòùòSWWWæòîîòêæ%#%é mp%êpp%%# ppî=îîpmppééépÿÿp%p opppòÿ€ÿûÁÛßßÿÁÃÿçÿÿÿÿÿÿÿ( @€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿˆwˆˆ‡wÿwˆ€wp ÷www™¢‡‡w™ˆ ø ™™™™‡¢¢ w™™™™™‡ *****™™‡¢¢¢¢¢" ™™‡******™‡¢¢¢¢¢¢x™‡ **** ˆ™ˆp¢¢¢¢ €™€ ***(€ˆ€p¢¢€‡ˆˆˆwˆs1pîó77pw®£®p ìês1꣩—c#aêî£zzêà~~w7®§ú“3ã7‘wp®w§®?§Ùãú³êç©yož® êîzêç®®®®¯êðÿÿÀÿÿ€ÿ߀ÿÏ€ÿÇøðñÇóÏóßóÿóÿóÿ€ÿÿÀÿÿðÿÿüøÿÿü?ÿÿö?ÿÿàÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿÿÿÿÿ€ÿÿÀÿÿÀÿÿàÿÿàÿÿþ'ÿÿ( @€€€€€€€€€ÀÀÀÀÜÀðʦ>]|›ºÙð$$ÿHHÿllÿÿ´´ÿ>](|2›<ºFÙUð$mÿH…ÿlÿµÿ´Íÿ*>?]T|i›~º“Ùªð$¶ÿHÂÿlÎÿÚÿ´æÿ>>]]||››ººÙÙðð$ÿÿHÿÿlÿÿÿÿ´ÿÿ>*]?|T›iº~Ù“ðª$ÿ¶HÿÂlÿÎÿÚ´ÿæ>]|(›2º<ÙFðU$ÿmHÿ…lÿÿµ´ÿÍ>]|›ºÙð$ÿ$HÿHlÿlÿ´ÿ´>](|2›<ºFÙUðmÿ$…ÿHÿlµÿÍÿ´*>?]T|i›~º“Ùªð¶ÿ$ÂÿHÎÿlÚÿæÿ´>>]]||››ººÙÙððÿÿ$ÿÿHÿÿlÿÿÿÿ´>*]?|T›iº~Ù“ðªÿ¶$ÿÂHÿÎlÿÚÿæ´>]|(›2º<ÙFðUÿm$ÿ…HÿlÿµÿÍ´>]|›ºÙðÿ$$ÿHHÿllÿÿ´´>]|(›2º<ÙFðUÿ$mÿH…ÿlÿµÿ´Í>*]?|T›iº~Ù“ðªÿ$¶ÿHÂÿlÎÿÚÿ´æ>>]]||››ººÙÙððÿ$ÿÿHÿÿlÿÿÿÿ´ÿ*>?]T|i›~º“Ùªð¶$ÿÂHÿÎlÿÚÿæ´ÿ>](|2›<ºFÙUðm$ÿ…HÿlÿµÿÍ´ÿ,,,999EEERRR___lllxxx………’’’ŸŸŸ«««¸¸¸ÅÅÅÒÒÒÞÞÞëëëøøøðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿÿÿÿòòîîîêææòòòòòòîæòÿÿîòòÿîêæêòîUÿæîîêòæêîîùòUSWòòîæêòîîùùòSUWU"æêÿòîæùùùòòWUWUWUUæòòîùùùùùùùùùòêæWWWWWWWWWUSæùùùùùùùùùùòê UUWUWUWUWUWUùùùùùùòêUWWWWWWWWWWSîùùùùòîSWUWUWUWUWSUæòùùùòêæWWWWWWWWWUîòùùòêæUWUWUWUWSæòùùòòîSUWWWWWUæòùùòòòêUWUUæîòòòîîîîòòòòòêîòêéæ#%##é%##ò%#égppò%%#òæ emfpf%#êdpefp‡‡fæ%##nMM1pf%m%æ#m òpfppméænædpdnîpp+î%=#îîdpdmîpé%%pé#æégépfpoéfé#édpéÿêÝùpéfn''pddòp…ÿp%dpdppfytêdpddò fofpdpdpdòopnîòÿÿÀÿÿ€ÿÿ€ÿ߀ÿÏ€ÿÇøðñÇóÏóßóÿ€óÿóÿÄÿÿðÿÿþøÿÿü?ÿÿö?ÿÿàÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿÿÿÿÿ€ÿÿÀÿÿÀÿÿàÿÿàÿÿþ'ÿÿgeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/etc/Windows/icons/gwlogo.bmp0000660000175200017530000003426612664543647025752 0ustar guillaumeguillaumeBM¶8v( ´@8m m d/$zODDDúúzz„úD„ïZúzzúúú„„„šÄ¯úúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÝ,ßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÒßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÑßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ýïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâþÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÜÿ!.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÁÍïÿýÞÿÁÿÿÿÿíÝïÿÿÿÿÿÿÿþÝïÿÿÿíÝßÿÿÿÿÿÿÿíßÿÿÿÿÿþÝÝÞÿÿÿÿÿÿÿþÝÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÑ,ïÿÿÿÑÿÿÿüßÿÿÑßÿòÿÿýÞÿÿÿÿÿÿÁÿÿÿÿÿÑ,ßÿÿÿÿÿÁ-ÿÿÿþÂßÿÿÿÿÿÿÿÿþ!ïÿÿáÿÿÿÑßÿÑÿñ.ÿâßÿÿÿÿýïÿÿÿÿÑßÿÿÿý-ÿÿüÿÿÿÿÿÿÿÿü-ÿÿñßÿÿÁ!ÿÑÿñÿÑ!ïÿÿÿýÏÿÿÿÿ!ïÿÿü"Ïÿá,ïÿÿÿÿÿÿáßíÁÎÿòßÿÿ!ÏþÒßáïñßÿÑ.þÒßÿÿÿþÿÿÿÿÑÿÿòÿí-ÿÑÂÿÿÿÿÿÿÑÿÿþÑßý/ÿÿ!ÿÿþïòßòïÿÑßÿþßÿÿÿÿ!ïÿÿÿÑïÿòÿÿîÿÁÿïÿÿÿÿÿÁÿÿÿþÒýÿÿ!ÿÿÿÿü.òßÿÑßÿÿÿÿÿÿÿÁÏÿÿÿÑ.ÿòÿÿÿÿ!ÿßÿÿÿÿÿ!ÿÿÿÿÿÑ.ÿÿÁÿÿÿÿýüßÿÑßÿÿÿÿÿÿÿÑÿÿÿáÝÒÿüÿÿÿÿ!ÿ!/ÿÿÿÿÿ!ïÿÿÿÿþÑÿÿÑßÿÿÿþíÏÿÑßÿÿÿÿÿÿÿñïÿÿòÿÿÒïýÿÿÿÿ!ÿñÿÿÿÿÿ!ßÿÿÿÿÿþÁÿÿÑ,ïÿ!!Ý/ÿá,ßÿÿÿÿüÏÿÿòÿÿÿÁÏý"Îÿ!ÿñÿÿÿÿÿÁÿÿÿÿÿÿý!ïÿáÜÿÁÂÿò-!ÿÿÿÿýÿÿýÿÿÿü/þÁïÑÿñÿÿÿÿÿÑïÿÿÿÿÿÿíÏÿòÏÑÿÑ/ÿü/òÿÿÿÿþïÿþÿÿÿÿÁÿ!ýÏÑÿñÿÿÿÿÿÑ/ÿÿÿÿÿÿÿâ/ÿü/üÿÑÁÿýÿýïÿÿÿÿ!Ïÿÿ!ÿÿÿÿáÿÁÿÁ/ÑÿñÿÿÿÿÿòÿÿÿÿÿÿÿÿÁÿþÿïÑòßÿ!ÿÿßÿÿÿÿ!ÿÿÁïÿÿÿýÿáÿÑáÿÑÿÿÿÿÿüÎÿÿÿÿÿÿÿý!ÿÿ!ÿßñýÿÿÁÿ!ßÿÿÿÿÑïÿÑßÿÿÿþ!ÿòÿñòÿ!ßÿÿÿÿþïÿÿÿÿÿÿÿì-ÿÿÑÿßáÿ!ïÿáÿ!ßÿÞÿÿÑ!.ÿá/ÿÿÿÿÁïýÏñüÿÏÿÿÿÿÿÁ.ÿÿÿÿÿÿÿÿÿÿÿüÿÞ!ÿÑßÿýÿ!ßýÿÿÑñÿòÿÿÿÿÑßÿÁ/ñýÿÿÿÿÿÿâßÿÿÿÿÿÿÿÿÿÿþ!,î!ÿüßÿÿÁ-ßâÿÿñüßüÿÿÿÿáßÿâÁþÿÁÏÿÿÿÿÿýïÿÿÿÿÿÿÿÿÿÿý!ÿþÂÿÿÜ,ïÿÿýÁÿ!ÿÿñÿ!ýÿÿÿÿñßÿÿÒÏÿ!ßüÿÿÿÿÿÿÿÁ-ÿÿÿÿÿÿÿÿÿÿÿÿÿíßÿÿÿÿÿÿÿÿÿÿÿÿÿÿíßýÿÿñÿÑîÿÿÿÿâßÿÿÿÿÿÝÿÿÁ/ÿíÞÿÿÿÿÿÿÿâ.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòßÿñÿüÁïÿÿü.ÿÿÿÿÿÿÿÿáÿÿÿÿÿÿÿÿÿÿþ!Îÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿá.ÿñÿÿ!!ßÿÿÑÿÿÿÿÿÿÿÿò.ÿÿÿÿÿÿÿÿÿÿâÎÿÿíÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÑßñÿÿñÏÿÿÁÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿÿÿÿþ!-Ý!ïÿÿÿÿÿÿÿÿÿÿÿÿÿÿóq31/ÿÿ!ÿÿÿÿÿÿÿÿþ!ßÿÿÿÿÿÿÿÿÿÿìÏÿÿÿÿÿÿÿ7ww3Âwwwwq7wwÿÿÂÿÿÿÿÿÿÿÿÿÁÿÿÿÿÿÿÿÿÿÿÿÑ/ÿÿÿÿÿÿÿÃ7wwwwwwwwwwwwwww7wwqÿþîÿÿÿÿÿÿÿÿÿáÿÿÿÿÿÿÿÿÿÿÿþ!ÿÿÿÿÿÿÿÿ0wwwwwwwwwwwwwwwq7wwqÿýÿÿÿÿÿÿÿÿÿÿüïÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿÿÿwwwwwwwwwwwwwww7wwsÿýÿÿÿÿÿÿÿÿÿÿýßÿÿÿÿÿÿÿÿÿÿÿÿìÿÿÿÿÿÿÿÿÿÿðwwwwwwwwwwwwwwws7w|1ÿþÿÿÿÿÿÿÿÿÿÿÿ!Ïÿÿÿÿÿÿÿÿÿÿÿÿÿíÿÿÿÿÿÿÿÿÿÿÿ7wwwwwwwwwwwwwwqw|þÿÿÏÿÿÿÿÿÿÿÿÿÿÿò/ÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÂ.ÿÿÿÿÿÿÿÿÿÿÿówwwwwwwwwwwwwwwqw0ÿÿâ/ÿÿ!ÿÿÿÿÿÿÿÿÿÿÿÿÿÂßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿíÝÝÿÿÿÿÿÿÿÿÿÿÿÿÿðwwwwwwwwwwwwwwws70ÿÿÿÿÜ,ïÿÿýßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ0wwwwwwwwwwwwwwwpÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüwwwwwwwwwwwwwwwÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀwwwwwwwwwwwwwwÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüwwwwwwwwwwwwpÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ0wwwwwwwwwwwp ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðwwwwwwwwwwwÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð7wwwwwwwwwp ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿówwwwwwwwwÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüwwwwwwwww ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ7wwwwwwww0Ïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿý,Ì-ÿÿÿÿÿÿÿwwwwwwwwÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÓ ÿÿÿÿÿÿ3wwwwwwwwÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿó6fff ßÿÿÿÿ0wwwwwwwp?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü6ffffmÿÿÿÿÐwwwwwwwÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀfffffff`ÿÿÿówwwwww|ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýfffffffflÿÿÿówwwwwwpÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿófffffffffÓÿÿÿówwwwwpÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðffffffffff0ÿÿü7wwwwwÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÆffffffffffcÿüwwwwwÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÐffffffffffff0ÿü7wwwww0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðfffffffffffff ýwwwwwÿÿÿÿÿÿÿÝ3<ÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÆffffffffffff`Íwwwwwÿÿÿÿÿý00=ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð6fffffffffffff wwwwwÿÿÿÿÜ0Ífffc ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðfffffffffffffwwwwwÿÿÿóffffffc?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÜ"03Íófffffffffffff7wwwwwÿÿü6ffffffffcßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü0fffffffffffffÀ7wwwww0ÿýÙ¬ ˆ£=êšffffffffffffffffÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ"""-îîîx‡‡†fffdDDM¼DDDDDw|fffww|fÞ©Ó ˆ£ í™Àæfffffffffffffffÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ""-îîxvfffdDDM¼DDDDDwp6fffww|fíŠÌˆ•î©¥fffffffffffffffÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ"""-îîîx‡‡€6fdDDM¼DDDDDwffffwww6fÌÌÎꮈžîîîîpÖfffffffffffff`?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ""-îîˆwwdDDM¼DDDDDpffffww6fˆˆˆˆˆˆˆˆˆˆˆsvfffffffffffff0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ"""-îîîxx‡‡wwwtDDM¼DDDDDpÆffffww6fˆˆˆˆˆˆˆˆˆˆˆw3ffffffffffffcÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ""-îî‡‡wwwwwwwp3wwws ffffbww6fˆˆˆˆˆˆˆˆˆˆˆww6fffffffffff ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ"""-îîîxˆx€îîîîîîîîîîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿffffffffffffffl7wwfffffff`wwwwww>ffffffffffff ™™™îé™™™™™ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀfffffffffffffflwwfffffff`wwwwww3Öfffffffffffhˆˆˆî興ˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóffffffffffffflwwfffffffcwpwwwwpfffffffffhˆˆˆî興ˆˆˆ/ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðfffffffffffflw|ffffffflwfffwwwwÖffffffffhˆˆˆî興ˆˆˆ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ0ffffffffffffl7w|fffffffwfff`wwˆxxxxxxxxxffffffffffff0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿófffffffffffmw|fffffffw ffff0xxxxxxxxxxffffffffffff`/ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüfffffhˆˆ¥Nˆˆˆˆˆ†ffffffw fffflˆˆˆˆˆˆˆˆˆˆffffffffffffcÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿó3Æfhˆˆ¥Nˆˆˆˆˆ†ffffffsfffffâ»»»»»»»»»»ffffffffffffl ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü0fhˆˆ¥Nˆˆˆˆˆ†ffffffws>ffffff»»»»»»»»»»fffffffffffffÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿó GeneWeb artistic design (including the tree used in the icons): Emmanuelle Visseaux GeneWeb program written by: Daniel de Raugladre geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/etc/Windows/README.txt0000660000175200017530000000307612664543647024332 0ustar guillaumeguillaumeOVERVIEW GeneWeb comprises two servers (programs that receive requests from the web browser and return information to it): - gwsetup: manages data bases: creating, deleting, renaming, merging, importing/exporting GEDCOM and so on. - gwd: provides the ability to read a data base, make changes, compute relationships, display ancestors and so on. The servers are just programs running in windows. You don't need to pay attention to them, but as long as you are using GeneWeb, you must not close their windows. In any case, they are launched minimized. Everything is done in your favorite Web browser, which carries on a dialog with these programs using the internet protocol. But you normally don't need to be connected to the Web. START To start GeneWeb, just double-click on the gwsetup icon and then on the gwd icon. They should appear in the task bar, at the bottom of the screen. Then double-click on "START.htm" to bring up your browser. It gives you a URL to click on in order to connect to the gwsetup service. STOP To stop, close the gwsetup and gwd windows. If you left them minimized, use the right button of your mouse for this operation. Windows might say that data may be lost. Don't worry about it. Just ignore this message. Nothing is lost. All the applications, including this README, can also be launched from the "Start" button, "Programs" Menu, "GeneWeb-xxx". --- If you are reading this file during the installation, close the present window to end the installation. To display it again, double-click on README. geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/etc/Windows/LISEZMOI.txt0000660000175200017530000000336112664543647024625 0ustar guillaumeguillaumeAPERCU GeneWeb est compose de deux serveurs (programmes qui recoivent des requetes du navigateur Web et leur renvoient des informations): - gwsetup: gere les bases de donnees: creation, suppression, renommage, fusion, import/export de GEDCOM, etc. - gwd: permet de consulter une base de donnees, faire des changements, calculer des liens de parente, afficher les ancetres, etc. Les serveurs sont juste des programmes qui tournent dans des fenetres. Vous n'avez pas besoin de savoir ce qui s'y passe, mais tant que vous utilisez GeneWeb, vous ne devez pas fermer leurs fenetres. Elles sont d'ailleurs lancees reduites. Tout se fait dans votre navigateur Web favori, qui discute avec ces programmes avec le protocole internet. Mais vous n'avez pas besoin normalement, d'etre connecte au Web. DEMARRAGE Pour demarrer avec GeneWeb, double-cliquez sur l'icone de gwsetup puis sur l'icone de gwd. Ils doivent apparaitre dans la barre des taches, en bas de l'ecran. Puis double-cliquez sur "START.htm" pour faire apparaitre votre navigateur. Il vous affiche une URL a cliquer pour vous connecter au service gwsetup. ARRET Pour arreter, fermez les fenetres gwsetup et gwd. Si vous les avez laissees reduites, utilisez le bouton droit de votre souris pour cette operation. Windows va peut etre vous dire que des donnees risquent d'etre perdues. Ne vous en faites pas et ignorez ce message. Rien n'est perdu en realite. Toutes les commandes, ce LISEZMOI compris, peuvent aussi etre lancees a partir du bouton "Demarrer", Menu "Programmes", "GeneWeb-xxx". --- Si vous lisez ce fichier pendant l'installation, fermez la presente fenetre pour terminer l'installation. Pour revoir ce fichier, double- cliquez sur LISEZMOI. geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/etc/README.txt0000660000175200017530000000136112664543647022673 0ustar guillaumeguillaumeGeneWeb 5.01 If you are under Windows: Double-click on the file "index.htm" of the directory "doc", and follow the instructions. If you are under Unix or Mac Launch your Web navigator. If you installed GeneWeb, for example in /home/smith/geneweb open the location: file:/home/smith/geneweb/gw/doc/index.htm and follow the instructions. ----------------- See the file CHANGES in the present directory for the changes since the previous versions. ----------------- GeneWeb is Copyright (c) 1998-2007 INRIA. Remarks, suggestions, questions, bug reports to: daniel.de_rauglaudre@inria.fr http://pauillac.inria.fr/~ddr/ Please specify the version number above and the system you use (Unix, Windows, Mac) geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/etc/LISEZMOI.distrib.txt0000660000175200017530000000121712664543647024630 0ustar guillaumeguillaumePour demarrer avec GeneWeb, il va vous falloir d'abord effectuer quelques commandes. Le plus simple est de lancer le programme "gwsetup". Il vous permettra d'effectuer ces commandes par l'intermediaire de votre navigateur Web. Tout vous sera explique dans la navigation. Sous Windows, double-cliquez sur "gwsetup". Sous Unix, lancez "gwsetup" dans un xterm. Sous MacOS X, lancez "gwsetup" dans un Terminal. Mais si vous preferez connaitre les commandes de base de GeneWeb, et que vous etes un habitue des commandes interactives (MSdos, shell), allez dans le repertoire "gw" et lisez le fichier LISEZMOI.txt. C'est une autre facon de demarrer. geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/etc/LISEZMOI.txt0000660000175200017530000000157612664543647023201 0ustar guillaumeguillaumeGeneWeb 5.01 Pour demarrer avec GeneWeb, suivez les instructions suivantes: Si vous etes sous Windows: Double-cliquez sur le fichier "index.htm" du repertoire "doc", et suivez les instructions. Si vous etes sous Unix ou Mac: Lancez votre navigateur Web. Si vous avez installe GeneWeb, par exemple dans /home/dupont/geneweb ouvrez la location: file:/home/dupont/geneweb/gw/doc/index.htm et suivez les instructions. ----------------- Voir le fichier CHANGES (en anglais) dans ce repertoire-ci pour les changements par rapport aux versions precedentes. ----------------- GeneWeb est Copyright (c) 1998-2007 INRIA. Remarques, suggestions, questions, rapports d'anomalie a: daniel.de_rauglaudre@inria.fr http://pauillac.inria.fr/~ddr/ Veuillez preciser le numero de version ci-dessus et le systeme sur lequel vous tournez (Unix, Windows, Mac). geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/0002770000175200017530000000000012664543647021562 5ustar guillaumeguillaumegeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/Makefile0000660000175200017530000000357412664543647023232 0ustar guillaumeguillaume# $Id: Makefile,v 5.1 2007-09-12 09:58:44 ddr Exp $ include ../tools/Makefile.inc OCAMLI=-I ../wserver -I ../src OBJS=../wserver/wserver.cmo ../src/version.cmo ../src/argl.cmo ../src/buff.cmo ../src/translate.cmo setup.cmo all:: out out:: setup.out $(RM) gwsetup cp setup.out gwsetup opt:: setup.opt $(RM) gwsetup cp setup.opt gwsetup $(STRIP) gwsetup clean:: $(RM) gwsetup *.bat $(RM) -rf test test: test_dir wrappers wrappers: if test "$(CAMLP5F)" = "-DWIN95"; then \ echo 'cd gw' > test/gwd.bat; \ echo 'gwd' >> test/gwd.bat; \ echo 'cd gw' > test/gwsetup.bat; \ echo 'gwsetup' >> test/gwsetup.bat; \ else \ (echo '#!/bin/sh'; \ echo 'mkdir -p bases'; \ echo 'cd bases'; \ echo 'exec ../gw/gwd -hd ../gw "$$@"') > test/gwd; \ (echo '#!/bin/sh'; \ echo 'mkdir -p bases'; \ echo 'cd bases'; \ echo 'exec ../gw/gwsetup -gd ../gw "$$@"') > test/gwsetup; \ chmod +x test/gwd test/gwsetup; \ fi cd test; ln -s ../../etc/START.htm . test_dir: mkdir test mkdir test/gw cd test/gw; ln -s ../../gwsetup gwsetup cd test/gw; ln -s ../.. setup cd test/gw; ln -s ../../../doc . cd test/gw; ln -s ../../../src/gwc . cd test/gw; cp ../../../src/gwd . cd test/gw; ln -s ../../../src/gwu . cd test/gw; ln -s ../../../src/consang . cd test/gw; ln -s ../../../hd/lang . cd test/gw; ln -s ../../../hd/images . cd test/gw; ln -s ../../../hd/etc . cd test/gw; ln -s ../../../ged2gwb/ged2gwb . cd test/gw; ln -s ../../../gwb2ged/gwb2ged . cd test/gw; ln -s ../../../etc/INSTALL.htm . cd test/gw; echo "127.0.0.1" > only.txt cd test/gw; echo "-setup_link" > gwd.arg setup.out: $(OBJS) $(OCAMLC) -custom $(STATIC) unix.cma $(LIBUNIX) $(OBJS) -o setup.out setup.opt: $(OBJS:.cmo=.cmx) $(OCAMLOPT) $(STATIC) unix.cmxa $(LIBUNIX) $(OBJS:.cmo=.cmx) -o setup.opt depend: TOP=.. ../tools/camlp5_depend.sh $(OCAMLI) *.ml* > .depend always: include .depend geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/0002770000175200017530000000000012664543647022503 5ustar guillaumeguillaumegeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/consang.htm0000660000175200017530000001133212664543647024644 0ustar guillaumeguillaume [ de: Blutsverwandtschaften en: Consanguinities es: Consanguinidades fi: Verisukulaiset fr: Consanguinités it: Consanguineità lv: Consanguinities sv: Blodsband ]

    [ de: Blutsverwandtschaften en: Consanguinities es: Consanguinidades fi: Verisukulaiset fr: Initialisation des consanguinités it: Consanguineità lv: Consanguinities sv: Blodsband ]

    [ de: Die Initialisierung der Blutsverwandtschaften ist notwendig, damit sie beim Abrufen der Datenbank angezeigt werden können. en: The initialization of consanguinities is necessary so that the consanguinities are displayed when browsing the database. es: La inicialización de las consanguinidades es necesaria para que estas sean visibles cuando uno explora la base. fi: Verisukulaisten käyttöönotto on tarpelliista jotta tietokantaa selatessa ne voidaan näyttää. fr: L'initialisation des consanguinités est nécessaire pour que les consanguinités s'affichent quand on navigue dans la base. it: L'inizializzazione delle consanuineità è necessaria per renderle visibili al momento di percorrere la base. lv: The initialization of consanguinities is necessary so that the consanguinities are displayed when browsing the database. sv: Beräkningen av blodsbanden är nödvändig för att blodsbanden ska visas i databasen. ]

    [ de: Wähle deine Datenbank mit dem zugehörigen Schalter. en: Select your database by clicking on the associated button. es: Seleccione su base de datos cliqueando en el botón asociado. fi: Valitse tietokantasi painamalla nappia alla. fr: Sélectionnez votre base de données en cliquant sur le bouton associé. it: Selezionate la vostra bese di dati cliccando sul bottone associato. lv: Select your database by clicking on the associated button. sv: Välj din databas genom att klicka på motsvarande knapp. ]

    %b{ | }
        %a
    - [ de: keine Datenbank vorhanden en: there is no database at present es: no existe ninguna base de datos actualmente fi: ei tietokantaa saatavilla fr: il n'y a aucune base de données actuellement it: attualmente non esiste nessuna base di dati lv: there is no database at present sv: det finns ingen databas för tillfället ]

    [ de: Falls gewünscht, wähle die folgende Option: en: Select the option if you want: es: Seleccione eventualmente la opción propuesta: fi: Valitse asetus jos haluat: fr: Sélectionnez éventuellement l'option proposée: it: Selezionate eventualmente l'opzione proposta: lv: Select the option if you want: sv: Välj option om du vill: ]

        [ de: Komplett neu berechnen. en: Restart the computing from scratch. es: Recomenzar el cálculo de toda la base. fi: Aloita laskenta alusta. fr: Recommencer le calcul sur toute la base. it: Ricominciare il calcolo su tutta la base. lv: Restart the computing from scratch. sv: Starta beräkning från början. ]

    [ de: Dann drücke diesen Knopf: en: Then press this button: es: Luego apoye en este botón: fi: Sitten paina tätä nappia: fr: Puis appuyez sur ce bouton: it: E poi cliccate su questo bottone: lv: Then press this button: sv: Tryck sedan på denna knapp: ]

    geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/consg_ok.htm0000660000175200017530000000516312664543647025023 0ustar guillaumeguillaume [ de: Operation durchgeführt en: Operation completed es: Operación terminada fi: Toiminto valmis fr: Opération terminée it: Operazione terminata lv: Darbîba pabeigta sv: Operationen klar ]

    [ de: Operation durchgeführt en: Operation completed es: Operación terminada fi: Toiminto valmis fr: Opération terminée it: Operazione terminata lv: Darbîba pabeigta sv: Operationen klar ]

    [ de: So. Die Operation "%d" auf der Datenbank "%a" ist beendet. en: So. The operation "%d" on the database "%a" is terminated. es: Hela aquí. La operación "%d" sobre la base "%a" ha terminado. fi: Toiminto "%d" tietokannassa "%a" on lopetettu. fr: Voilà. L'opération "%d" sur la base "%a" est terminée. it: L'operazione "%d" sulla base "%a" é terminata. lv: Kârtîbâ. Darbîba "%d" ar datu bâzi "%a" pabeigta. sv: Operationen "%d" på databasen "%a" är avslutad. ]

    [ de: Du kannst nun mit deiner Datenbank arbeiten... en: You can consult it: es: Ud puede consultarla: fi: Voit lukea sitä osoitteessa: fr: Vous pouvez la consulter: it: Ora potete consultarla lv: Jûs variet ar to darboties: sv: Du kan konsultera den: ]


    ... [ de: oder zurück zum Hauptmenü springen. en: or return to the main menu. es: o regresar al menú principal. fi: tai palaa päävalikkoon. fr: ou revenir au menu principal. it: o tornare al menu principale. lv: atgriezties galvenajâ izvçlnç. sv: eller återvända till huvudmenyn. ] geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/recover.htm0000660000175200017530000000544712664543647024673 0ustar guillaumeguillaume [ de: Eine bestehende Datenbank übernehmen - Phase 1 en: Recover a database - Phase 1 es: Recuperar una base - Fase 1 fr: Récupérer une base - Phase 1 it: Recuperare una base - Fase 1 lv: Datu bâzes atjauninâðana - 1. fâze sv: Återskapa en databas - fas 1 ]

    [ de: Eine bestehende Datenbank übernehmen en: Recover a database es: Recuperar una base fr: Récupérer une base it: Recuperare una base lv: Atjauninât datu bâzi sv: Återskapa en databas ]

    [ de: Gib den vollständigen Namen des Verzeichnisses an, in dem deine alte GeneWeb-Version installiert ist. en: Select the name of the directory where your old version of GeneWeb is located (it must contain a filen named gwu or gwu.exe). es: Indique Ud. el nombre completo de la carpeta en la cual se encuetra su versión aneterior de GeneWeb. fr: Sélectionnez le répertoire où se trouve votre ancienne version de GeneWeb (il doit contenir un fichier nommé gwu ou gwu.exe). it: Selezionate la directoty dove si trova la vecchia versione di GeneWeb (e che deve contenere un file chiamato gwu o gwu.exe). lv: Uzrakstiet pilnu kataloga vârdu, kurâ atrodas vecâs GeneWeb versijas datu bâze. sv: Skriv in hela namnet för katalogen där din gamla version av GeneWeb ligger. ]

    %j

    [ de: Dann drücke diesen Knopf: en: Then push this button: es: Apoye luego en este botón: fr: Puis appuyez sur ce bouton: it: Poi cliccate su questo bottone: lv: Tad nospiediet ðo podziòu: sv: Tryck sedan på knappen: ]

    geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/err_unkn.htm0000660000175200017530000000372512664543647025046 0ustar guillaumeguillaume [ de: Unbekannte Datei en: Unknown file es: Fichero desconocido fi: Tuntematon tiedosto fr: Fichier inconnu it: File sconosciuto lv: Nepazîstama datne sv: Okänd fil ]

    [ de: Unbekannte Datei en: Unknown file es: Fichero desconocido fi: Tuntematon tiedosto fr: Fichier inconnu it: File sconosciuto lv: Nepazîstama datne sv: Okänd fil ]


    [ de: Sorry, aber diese Datei ist nicht bekannt: en: Sorry, this file is unknown: es: Lamentablemente este fichero es desconocido: fi: Pahoittelen, tiedostotyyppi on tuntematon: fr: Désolé. Ce fichier est inconnu: it: Spiacente, questo file è sconosciuto: lv: Atvanojiet ðî datne nav pazîstama: sv: Denna fil är okänd: ]

      %a
    

    [ de: Kehre zurück auf die vorherige Seite und wähle eine richtige Datei aus. en: Return to the previous page and select the correct file. es: Regrece Ud a la página anterior y seleccione el fichero correcto. fi: Palaa edelliselle sivulle ja valitse oikea tiedosto. fr: Revenez en arrière et sélectionnez le bon fichier. it: Tornate indietro e selezionate il buon file. lv: Atgriezieties iepriekðçjâ lapâ un izvçlieties pareizu datni. sv: Återvänd till föregående sida och välj den rätta filen. ] geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/cleanup1.htm0000660000175200017530000000772112664543647024733 0ustar guillaumeguillaume [ de: Aufräumen - Phase 2 en: Clean up - Phase 2 es: Limpieza fi: Puhdistus - vaihe 2 fr: Nettoyage it: Pulizia - fase 2 lv: Sakopðana - 2. fâze sv: Rensa upp - fas 2 ]

    [ de: Aufräumen en: Cleaning up es: Limpieza fi: Puhdistaminen fr: Nettoyage it: Pulizia lv: Sakopðana sv: Rensa upp ]

    [ de: Wir fahren nun mit dem Aufräumen der Datenbank "%a" fort. en: We are going to proceed to the cleaning up of the database "%a". es: Vamos a proceder a la limpieza de la base "%a". fi: Jatkamme tietokannan "%a" puhdistamista. fr: Nous allons procéder au nettoyage de la base "%a". it: Ora procediamo alla pulizia della base "%a". lv: Datu bâzes "%a" sakopðanas proces tiks turpinâts. sv: Vi ska gå vidare med att rensa upp databasen "%a". ]

    [ de: Achtung: Diese Operation kann je nach Fall einige Sekunden oder Minuten dauern. Bitte habe Geduld. en: Warning: this operation can take some seconds or minutes, depending on the cases. Be patient. es: Atención: la operación puede tomar algunos segundos o algunos minutos, según el caso. Tenga paciencia. fi: Varoitus: tämä toiminto kestää hetken. Odota rauhallisesti. fr: Attention: l'opération peut prendre quelques secondes ou quelques minutes, suivant les cas. Soyez patient. it: Attenzione: l'operazione può prendere qualche secondo o quanche minuto, a seconda dei casi. Siate pazienti. lv: Brîdinâjums: tas var ilgt no daþâm sekundçm lîdz pat daþâm minûtçm, atkarîbâ no apstâkïiem. Lûdzu pacietîbu. sv: Varning: denna operation kan ta några sekunder eller minuter, beroende på fallet. Ha tålamod. ]

    [ de: Drücke den Knopf, um die Operation zu starten. en: Push the button below to start the operation. es: Apoye en el botón siguiente para lanzar la operación. fi: Paina nappia alla aloittaaksesi toiminnon. fr: Appuyez sur le bouton ci-dessous pour lancer l'opération. it: Cliccate sul bottone qui sotto per lanciare l'operazione. lv: Darbîbas uzsâkðanai nospiediet sekojoðo podziòu. sv: Tryck på knappen nedan för att starta operationen. ]

    %h

    [ de: Zu deiner Information: Diese Funktion entspricht der Ausführung der folgenden Kommandos: en: For information, this operation corresponds to the following commands: es: Por información, esta operación corresponde a la ejecución de los comandos siguientes: fi: Toiminto koostuu seuraavista komennoista: fr: Pour information, cette opération correspond à la suite des opérations suivantes: it: A titolo d'informazione, questa operazione corrisponde ai seguenti comandi: lv: Inormâcijai: Ðî darbîba atbilst sekojoðâm komandâm: sv: Denna operation motsvarar de följande kommandona: ]

         $ cd "%w"
         $ %x%/gwu %a -o tmp.gw
         $ mkdir old
         [
    de: Unter Unix:
    en: Under Unix:
    fi: Unixissa:
    fr: Sous Unix:
    it: Sotto Unix:
    ]
            $ rm -rf old/%a.gwb
            $ mv %a.gwb old/.
         [
    de: Unter MSdos:
    en: Under MSdos:
    fi: MS-DOS:ssa:
    fr: Sous MSdos:
    it: Sotto MSdos
    ]
            $ del old\%a.gwb\*.*
            $ rmdir old\%a.gwb
            $ move %a.gwb old\.
         $ %x%/gwc tmp.gw -nofail -o %a > comm.log
    
    geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/del_ok.htm0000660000175200017530000000561212664543647024455 0ustar guillaumeguillaume [ de: Databanken gelöscht en: Databases deleted es: Bases destruidas fi: Tietokannat tuhottu fr: Bases détruites it: Basi soppresse lv: Datubâzes izdzçstas sv: Databaser raderade ]

    [ de: Databanken gelöscht en: Databases deleted es: Bases destruidas fi: Tietokannat tuhottu fr: Bases détruites it: Basi soppresse lv: Datubâzes izdzçstas sv: Databaser raderade ]

    [ de: Dies sind die gelöschten Datenbanken: en: Here are the deleted databases: es: Eh aquí las bases que han sido destruidas: fi: Tässä on tuhotut tietokannat: fr: Voici les bases qui ont été détruites: it: Ecco le basi che sono state soppresse: lv: Sekojoðas datu bâzes ir izdzçstas: sv: Här är de raderade databaserna: ]

      %k{
    • %a|
    • - [ de: no selection en: no selection es: ninguna selección fi: ei valintaa fr: pas de sélection it: nessuna selezione lv: nav iezîmçtas sv: inga val ] -}

    [ de: Dies sind die verbleibenden Datenbanken: en: Here are the remaining databases: es: Eh aquí las bases que quedan: fi: Tässä on jäljellä olevat tietokannat: fr: Voici les bases qui restent: it: Ecco le basi che restano: lv: Sekojoðas datu bâzes ir palikuðas: sv: Här är de återstående databaserna: ]

      %b{
    • %a|
    • [ de: keine Datenbank vorhanden en: there is no database es: no queda ninguna base de datos fi: tietokantaa ei ole olemassa fr: il n'y a aucune base de données it: non rimane nessuna base di dati lv: nav nevienas datu bâzes sv: det finns ingen databas ]}

    [ de: Zurück zum Hauptmenü. en: Return to the main menu. es: Regrese Ud al menú principal. fi: Palaa päävalikkoon. fr: Revenez au menu principal. it: Tornate al menu principale. lv: Atgriezies galvenajâ izvçlnç. sv: Återvänd till huvudmenyn. ] geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/gwf_1.htm0000660000175200017530000012600012664543647024216 0ustar guillaumeguillaume [ de: Parameter "%a" en: Parameters "%a" es: Parámetros "%a" fr: Paramètres "%a" it: Parametri lv: "%a" parametri sv: Parametrar "%a" ]

    [ de: Parameter "%a" en: Parameters "%a" es: Parámetros "%a" fr: Paramètres "%a" it: Parametri lv: "%a" parametri sv: Parametrar "%a" ]

    [ de: Hier sind die Parameter der Datenbank %a. Nimm die geünschten Änderungen vor: en: Here are the parameters of the base %a. Change what you estimate necessary: es: He aquí los parámetros de la base %a. Cambie aquellos que Ud. estime necesarios: fr: Voici les paramètres de la base %a. Effectuez les modifications de votre choix: it: Ecco i parametri della base %a. Effettuate le modifiche desiderate: lv: Sekojoðie ir datu bâzes %a parametri. Mainiet, ja kas Jums ðíiet nepiecieðams: sv: Här är parametrarna för databasen %a. Ändra vad du anser nödvändigt: ]

    - body_prop -
    [ de: Erlaubt die Änderung der Hintergrundfarbe oder das Hinzufügen eines Hintergrundmusters, sowie das Ändern der Farbe von Text und Links. Seine Syntax entspricht der, die im HTML im "<body>"-Tag vor dem ">" erlaubt ist. Details findest du in deiner HTML-Dokumentation. Beispiel: en: Allows to change the background color, put a background pattern, or change the color of the text or the links. Its syntax is the one of HTML accepted in the tag "<body>" before the ">". See your HTML documentation. Example: es: Permite de configurar los colores de fondo, o de introducir un motivo asi como de cambiar el color del texto y de los enlaces. Su sintaxis es la sintaxis HTML aceptada en el "tag" "<body>" antes de ">". Lea Ud. su documentación HTML. Por ejemplo: fr: Permet de configurer les couleurs de fond, ou d'y mettre un motif et de changer la couleur du texte et des liens. Sa syntaxe est la syntaxe HTML acceptée dans le tag "<body>" avant le ">". Voyez votre documentation HTML. Exemple: it: Permette di configurare i colori di fondo, o di inserire un motivo e di cambiare il colore dei testi e dei links. La sua sintassi è la sintassi HTML accettata nel tag "<body>" prima di ">". Consultate la vostra documentazione HTML. Esempio: lv: Ar ðo Jûs variet mainît fonu, fona krâsu un arî norâþu krâsu. Ðî parametra sintakse atbilst HTML sintaksei pie "<body>" pirms ">". Skatiet HTML dokumentâciju. Piemçram: sv: Gör det möjligt att ändra bakgrunds färgen, att sätta in ett bakgrunds mönster eller att ändra färgen för texten eller länkarna. Syntaxen är den samma som HTML accepterar i taggen "<body>" före ">". Se din HTML dokumentation. Exempel: ]

         text=#CC0000 vlink=yellow
    

    [ de: Ein paar interessante Variablen... en: Some interesting variables... es: Algunas variable interesantes... fr: Quelques variables intéressantes... it: Alcune variabili interessanti... lv: Daþas nozîmîgâkâs vçrtîbas... sv: Några intressanta variabler... ]

    • background: [ de: Hintergrundbild (siehe auch diesen Hinweis) en: background image (see the note) es: imagen de fondo (vea la nota) fr: image de fond (voir la note) it: immagine di fondo (vedi la nota) lv: fona attçls (skatiet piezîmi) sv: bakgrundsbild (se noteringen) ]
    • bgcolor: [ de: Hintergrundfarbe en: background color es: color de fondo fr: couleur de fond it: colore di fondo lv: fona krâsa sv: bakgrundsfärg ]
    • text: [ de: Textfarbe en: text color es: color del texto fr: couleur du texte it: colore del testo lv: teksta krâsa sv: textfärg ]
    • link: [ de: Linkfarbe en: links color es: color de los enlaces fr: couleur des liens it: colore dei links lv: norâþu krâsa sv: länkfärg ]
    • vlink: [ de: Farbe für bereits besuchte Links en: color of already visited links es: color de los enlaces que ya han sido visitados fr: couleur des liens déjà visités it: colore dei links visitati lv: izmantoto norâþu krâsa sv: färg för de redan besökta länkarna ]

    [ de: Du kannst auch eine der vorgeschlagenen Farbkombinationen wählen. en: You can also select one of the proposed colors combinations. es: Ud. puede asi mismo seleccionar una de las combinaciones de colores propuestas. fr: Vous pouvez aussi sélectionner une des combinaisons de couleurs proposées. it: Potete anche selezionare una delle combinazioni di colore proposte. lv: Jûs variet arî izvçlçties arî kâdu no sekojoðâm gatavajâm krâsu kombinâcijâm. sv: Du kan också välja en av följande föreslagna färg kombinationer. ]

    [ de: Diese Konfiguration gilt nicht nur für die Willkommensseite, sondern für alle Seiten dieser Datenbank. en: This applies not only to the welcome page but to all the displayed pages for this database. es: Esto se aplica no solamente a la "Página de Recepción", sino también, a todas las páginas de esta base visualizables en la pantalla. fr: Ceci s'applique non seulement à la page d'accueil mais à toutes les pages affichées de cette base. it: Ciò sarà applicato non solo alla pagina di benvenuto, ma anche a tutte le altre pagine della base visualizzate. lv: Ðâdi tiks attçlota ne tikai sveicinâjuma lappause, bet arî uz visâm pârçjâm datu bâzes lappusçm. sv: Detta gäller inte bara för välkomstsidan utan för alla visade sidor för denna databas. ]


    [text/link/vlink]0 [text/link/vlink]1 [text/link/vlink]2 [text/link/vlink]0 [text/link/vlink]1 [text/link/vlink]2 [text/link/vlink]0 [text/link/vlink]1 [text/link/vlink]2
    [text/link/vlink]0 [text/link/vlink]1 [text/link/vlink]2 [text/link/vlink]0 [text/link/vlink]1 [text/link/vlink]2 [text/link/vlink]0 [text/link/vlink]1 [text/link/vlink]2
    [text/link/vlink]0 [text/link/vlink]1 [text/link/vlink]2 [text/link/vlink]0 [text/link/vlink]1 [text/link/vlink]2 [text/link/vlink]0 [text/link/vlink]1 [text/link/vlink]2
    [text/link/vlink]0 [text/link/vlink]1 [text/link/vlink]2 [text/link/vlink]0 [text/link/vlink]1 [text/link/vlink]2 [text/link/vlink]0 [text/link/vlink]1 [text/link/vlink]2
    [text/link/vlink]0 [text/link/vlink]1 [text/link/vlink]2 [text/link/vlink]0 [text/link/vlink]1 [text/link/vlink]2 [text/link/vlink]0 [text/link/vlink]1 [text/link/vlink]2
    [text/link/vlink]0 [text/link/vlink]1 [text/link/vlink]2 [text/link/vlink]0 [text/link/vlink]1 [text/link/vlink]2 [text/link/vlink]0 [text/link/vlink]1 [text/link/vlink]2
    [text/link/vlink]0 [text/link/vlink]1 [text/link/vlink]2

    - default_lang -
    [ de: Standardsprache. en: Default language. es: Lenguaje por defecto. fr: Langue par défaut. it: Lingua per difetto. lv: Noklusçtâ valoda. sv: Förvalt språk. ]

    [ de: Wenn dieser Wert "-" ist, wird die Standardsprache des Kommandos "gwd" verwendet. en: If it is "-", the default language of the command "gwd" is applied. es: Si es "-", es el lenguaje por defecto del comando "gwd" que se tendrá en cuenta. fr: Si c'est "-", c'est la langue par défaut de la commande "gwd" qui sera prise. it: Se è "-", è la lingua per difetto del comando "gwd" che sarà presa in considerazione. lv: Ja atstâsiet vçrtîbu "-", noklusçtâ valoda bûs tâ pati, kas "gwd" komandai. sv: Om det är "-", kommer det förvalda språket för kommandot "gwd" att gälla. ]

    - max_anc_level -
    [ de: Maximale Stufe bei der Anzeige von Vorfahren. en: Maximum level when displaying ancestors. fr: Niveau maximum dans l'affichage des ascendants. it: Livello massimo di visualizzazione degli antenati. ]

    [ de: Wenn Vorfahren angezeigt werden, soll die Anzahl der angezeigten Generationen limitiert werden. Per Default ist die Anzahl acht Generationen, aber du kannst hier eine andere Anzahl einstellen. en: When ancestors are displayed, limit the number of displayed generations. By default, it is 8 generations, but you can indicate a different value here. fr: Quand on affiche les ascendants, limite le nombre de générations affichables. C'est 8 par défaut, mais vous pouvez indiquer une valeur différente ici. it: Quando si visualizzano gli antenati, limita il numero delle parentele visualizzabili. Il numero per difetto è 8, ma potete indicare qui un valore diverso. ]

    - max_desc_level -
    [ de: Maximale Stufe bei der Anzeige von Nachfahren. en: Maximum level when displaying descendants. fr: Niveau maximum dans l'affichage des descendants. it: Livello massimo di visualizzazione dei discendenti. ]

    [ de: Wenn Nachfahren angezeigt werden, soll die Anzahl der angezeigten Generationen limitiert werden. Per Default ist die Anzahl zwölf Generationen, aber du kannst hier eine andere Anzahl einstellen. en: When descendants are displayed, limit the number of displayed generations. By default, it is 12 generations, but you can indicate a different value here. fr: Quand on affiche les descendants, limite le nombre de générations affichables. C'est 12 par défaut, mais vous pouvez indiquer une valeur différente ici. it: Quando si visualizzano i discendenti, limita il numero delle parentele visualizzabili. Il numero per difetto è 12, ma potete indicare qui un valore diverso. ]

    - max_anc_tree -
    [ de: Maximale Stufe bei der Anzeige von Vorfahren als Baum. en: Maximum level when displaying ancestors by tree. fr: Niveau maximum dans l'affichage des ascendants par arbre. it: Livello massimo di visualizzazione degli antenati per albero. ]

    [ de: Wenn Vorfahren in Baumstruktur angezeigt werden, soll die Anzahl der angezeigten Generationen limitiert werden. Per Default ist die Anzahl sieben Generationen, aber du kannst hier eine andere Anzahl einstellen. en: When ancestors are displayed by tree, limit the number of displayed generations. By default, it is 7 generations, but you can indicate a different value here. fr: Quand on affiche les ascendants par arbre, limite le nombre de générations affichables. C'est 7 par défaut, mais vous pouvez indiquer une valeur différente ici. it: Quando si visualizzano gli antenati per albero, limita il numero delle parentele visualizzabili. Il numero per difetto è 7, ma potete indicare qui un valore diverso. ]

    - max_desc_tree -
    [ de: Maximale Stufe bei der Anzeige von Nachkommen als Baum. en: Maximum level when displaying descendants by tree. fr: Niveau maximum dans l'affichage des descendants par arbre. it: Massimo livello della visualizzazione dei discendenti per albero. ]

    [ de: Wenn Nachkommen in Baumstruktur angezeigt werden, soll die Anzahl der angezeigten Generationen limitiert werden. Per Default ist die Anzahl vier Generationen, aber du kannst hier eine andere Anzahl einstellen. en: When descendants are displayed by tree, limit the number of displayed generations. By default, it is 4 generations, but you can indicate a different value here. fr: Quand on affiche les descendants par arbre, limite le nombre de générations affichables. C'est 4 par défaut, mais vous pouvez indiquer une valeur différente ici. it: Quando si visualizzano i discendenti per albero, limita il numero delle parentele visualizzabili. Il numero per difetto è 4, ma potete indicare qui un valore diverso. ]

    - history -
    [ de: Änderungshistorie en: History of updates fr: Historique des mises à jour it: Riassunto degli aggiornamenti ]

    [ de: Auf der Startseite auf Änderungen mit einem Link "Änderungshistorie" hinweisen.

    Technische Bemerkung: Die Update-Protokolle werden in einer Datei "history" im Datenbankverzeichnis (%a.gwb) gespeichert. Diese Datei wächst endlos. Du kannst sie editieren um alte Informationen zu löschen. Oder sie auch einfach löschen, wenn Du mit einer leeren Version neu beginnen willst. en: Ask to indicate the updates in the welcome pages as a link "history of updates".

    Remark (technical): the updates traces are saved in a file named "history" in the directory of the database (%a.gwb). This file grows indefinitively. You can edit it to remove the old information. Or you can also delete this file to restart empty. fr: Demande d'indiquer les mises à jour dans la page d'accueil sous le lien "historique des mises à jour".

    Remarque (technique): les traces des mises à jour sont sauvées dans un fichier de nom "history" dans le répertoire de la base de donnée (%a.gwb). Ce fichier grossit indéfiniment. Si vous voulez effacer les anciennes traces, il faut éditer ce fichier pour les supprimer. Ou vous pouvez aussi supprimer le fichier pour repartir à vide. it: Domanda d'indicare gli aggiornamenti nella pagina di benvenuto con il link "Riassunto degli aggiornamenti".

    Nota (tecnica): le tracce degli aggiornamenti sono salvate in un file chiamato "history" nella directory della base di dati (%a.gwb). Questo file cresce indefinitamente. Se volete cancellare le vecchie tracce, è necessario editare il file e cancellarle. Potete anche cancellare il file e ripartire con uno vuoto. ]

    [yes/no]0 [yes/no]1

    - images_path -
    [ de: Bildpfad en: Images path fr: Chemin d'accès aux images it: Path che porta alle immagini ]

    [ de: Wenn Du NICHT möchtest, dass deine Bilder am Standardort (Datenbankverzeichnis, Unterverzeichnis "images", Unter-Unterverzeichnis "%a") abgelegt werden, gib hier den Pfad zu dem Verzeichnis an, dass Du benutzen möchtest. Dieser Pfad ist ein URL: Wenn es sich um eine Webadresse handelt, muss sie mit http:// beginnen, falls es ein lokales Verzeichnis ist, mit file://.

    Dies betrifft die Bilder, die im Personenformular im Feld "Bild" eingegeben wurden, nicht aber Bilder, die über den Link "Bild senden" hochgeladen wurden. Letztere werden mit Standardnamen im Standardverzeichnis installiert. en: If do NOT want that your images are installed in the standard place (databases directory, sub-directory "images", sub-sub-directory "%a"), indicate here the path to the directory you want to use. This path is an URL: if it is a Web site, it must start with http://, if it is a local directory, it must start with file://.

    This concerns the images which are indicated in the person form, field "image". This does not concern the images installed by the link "send image" which are installed as a standard name in a standard place. fr: Si vous désirez que vos images ne soient pas installées dans l'endroit standard (répertoire des bases, sous-répertoire "images", sous-sous-répertoire "%a"), indiquez ici le chemin d'accès au répertoire que vous voulez utiliser. Ce chemin d'accès est une URL: si c'est un site Web, il doit commencer par http://, si c'est un répertoire local, il doit commencer par file://.

    Cela ne concerne que les images qui sont indiquées dans le formulaire des personnes, champ "image". Cela ne concerne pas les images installées par le lien "envoyer images" qui, elles, sont installées avec un nom standard dans le répertoire standard. it: Se volete che le vostre immagini non siano installate nella directory standard (directory della base di dati, sub-directory "images", sub-sub-directory "%a"), indicate ora il path della directory che volete usare. Il path è una URL; se si tratta di un sito web, deve iniziare con http://, se è una directory locale, deve iniziare con file://.

    Ciò riguarda solo le immagini che vengono indicate nel formulario delle persone, al record "image". Ciò non riguarda invece le immagini installate con il link "inviare immagine" che sono invece installate con un nome standard nella directory standard. ]

    - hide_advanced_request -
    [ de: Erweiterte Suche verbergen. en: Hide advanced request. fr: Cacher la requête évoluée. it: Nascondere la richiesta avanzata. ]

    [ de: Die erweiterte Suche erlaubt es, Recherchen gemäß bestimmter Kriterien auf der Datenbank durchzuführen. Da sie sehr unvollständig implementiert it, ist sie per Default verborgen. Wähle "Nein", um sie zu aktivieren. en: The advanced request allows to make researches in the data base. As it is very incomplete, it is hidden by default. Select "no" below to set it. fr: La requête évoluée permet de faire des recherches avec critères sur la base. Comme elle est très incomplète, elle est cachée par défaut. Sélectionnez "non" ci-dessous pour la remettre. it: La richiesta avanzata permette di fare delle ricerche sulla base con dei criteri precisi. Dato che il suo sviluppo è ancora incompleto, è nascosta per difetto. Selezionate "No" qui sopra per renderla visibile. ]

    [yes/no]0 [yes/no]1

    - friend_passwd -
    [ de: Kennwort für "Freunde". en: Password for "friends". es: Contraseña "amigo". fr: Mot de passe "ami". it: Password per "amico". lv: "Draugu" parole. sv: Passord för "friends". ]

    [ de: "Freunde" können alle Daten, Notizen und Fotos von Personen sehen, die vor weniger als einem Jahrhundert geboren wurden. Wer dieses Kennwort nicht eingegeben hat, kann diese Informationen nicht abrufen. en: "Friends" can see all dates, notes and photos of the persons born since less than one century. The ones who have not entered the below password will not see these informations. es: Los "amigos" pueden ver todas las fechas, notas y fotos de las personas nacidas después menos de un siglo. Aquellos que no han entrado la contraseña indicada a continuación no verán estas informaciones. fr: Les "amis" peuvent voir toutes les dates, notes et photos des personnes nées depuis moins d'un siècle. Ceux qui n'ont pas entré le mot de passe ci-dessous ne verront pas ces informations. it: Gli "amici" possono vedere tutte le date, note e fotografie delle persone nate da meno di un secolo. Gli utilizzatori che non avranno digitato la password non vedranno queste informazioni. lv: "Draugi" var apsatît visus datumus, piezîmes un fotogrâfijas par personâm, kuras dzimuðas pçdçjos simts gados. Citiem, kuri nebûs ievadîjuði ðo paroli, ðî informâcija nebûs pieejama. sv: "Friends" kan se alla datum, noteringar och bilder för personer födda det senaste århundradet. De som inte anger passordet nedan kommer inte att se denna information. ]

    [ de: Wenn dieser Eintrag leer bleibt, ist jeder ein "Freund". en: If this area is empty, everybody is a "friend". You can leave this area empty if your computer is not accessible from outside. es: Si esta zona está vacía todo el mundo es "amigo". fr: Si cette zone est vide, tout le monde est "ami". Vous pouvez laisser cette zone vide si votre ordinateur n'est pas accessible de l'extérieur. it: Se questa zona è vuota, tutti sono "amici". Potete lasciare questa zona vuota se il vostro computer non è accessibile dall'esterno. lv: Ja ðis lodziòð tiks atstâts tukðs, tad ikviens tiks uzskatîts par "draugu". sv: Om den lämnas tom, är alla en "friend". ]

    - wizard_passwd -
    [ de: Kennwort für "Wizards". en: Password for "Wizards". es: Contraseña "mago". fr: Mot de passe "magicien". it: Password "Wizard". lv: "Burvja" parole. sv: Passord för "Wizards". ]

    [ de: "Wizards" können darüberhinaus auch Änderungen an der Datenbank machen. en: "Wizards" can moreover make modifications in the database. es: Los "magos" pueden además efectuar modificaciones en la base de datos. fr: Les "magiciens" peuvent en outre faire des modifications dans la base de données. it: I possessori di password "Wizard" possono in più effettuare delle modifiche nella base di dati. lv: "Burvji" var veikt arî izmaiòas datu bâzç. sv: "Wizards" kan göra modifieringar i databasen. ]

    [ de: Wenn dieser Eintrag leer bleibt, ist jeder ein "Wizard". en: If this area is empty, everybody is a "wizard". You can leave this area empty if your computer is not accessible from outside. es: Si esta zona está vacía todo el mundo es "mago". fr: Si cette zone est vide, tout le monde est "magicien". Vous pouvez laisser cette zone vide si votre ordinateur n'est pas accessible de l'extérieur. it: Se questa zona è vuota, tutti sono "Wizard". Potete lasciare questa zona vuota se il vostro computer non è accessibile dall'esterno. lv: Ja ðis lodziòð tiks atsâts tukðs, tad ikviens tiks uzskatîts par "burvi". sv: Om den lämnas tom, är alla en "wizard". ]

    - wizard_just_friend -
    [ de: "Wizards" werden zu "Freunden". en: "Wizards" become simple "friend". es: Los "magos" se transforman en simples "amigos". fr: Les "magiciens" deviennent de simples "amis". it: I "Wizard" diventano semplici "amici" lv: "Burvji" kïûst par parastiem "draugiem". sv: "Wizards" blir enkla "friend". ]

    [ de: Wenn dieser Wert auf "ja" steht, verlieren "Wizards" die Berechtigung, Änderungen zu machen. en: If yes, the "wizards" loose their power to make updates. es: Si la opción si es escogida, los "magos" pierden su poder de actualisación. fr: Si oui, les "magiciens" perdent leur pouvoir de mise-à-jour. it: Se scegliete "Si", i "Wizard" perdono il loro privilegio di aggiornamento. lv: Ja "jâ", tad "burvji" zaudç savas iespçjas veikt izmaiòas datu bâzç. sv: Om "Yes", förlorar "wizards" deras behörighet att göra uppdateringar. ]

    [ de: Dies kann sinnvoll sein, um z. B. beim Aufräumen der Datenbank, wenn sie über das Internet zugreifbar ist, temporär zu vermeiden, daß "Wizards" Daten ändern, die durch die Operation verloren gehen würden. (Denke in diesem Fall daran, diese Option nach Beendigung des Aufräumens dann wieder zurückzusetzen.) en: This can be useful, temporarilly, when you make a cleanup of your database, if it is accessible to Internet, to avoid that "wizards" make changes which would be lost during the operation (remember to suppress this option after cleanup). es: Esto puede ser util, temporalmente, cuando uno realiza una limpieza de la base si esta es accesible por Internet, afin de evitar que los "magos" realizen actualizaciones, que serian perdidas durante esta operación (piense luego a suprimir esta opción después de finalizar la limpieza). fr: Cela peut-être utile, temporairement, quand on fait un nettoyage de la base, si elle est accessible sur Internet, pour éviter que des "magiciens" ne fassent des mises-à-jour qui seraient perdues pendant l'opération (penser alors à supprimer cette option après nettoyage). it: Ciò può essere utile, temporaneamente, se si fa una pulizia della base, se la base è accessibile su Internet, per evitare che dei "Wizard" facciano degli aggiornamenti che andrebbero perduti durante l'operazione (pensate a cancellare questa opzione dopo la pulizia). lv: Tas var bût noderîgi islaîcîgi, ja Jûs veicat datu bâzes sakopðanu. Ja tâ ir pieejama no Interneta, tad tas novçrð iespçju, ka "burvji" varçtu veikt izmaiòas, kas tiktu pazaudçtas sakopðanas laikâ (atcerieties pçc datu bâzes sakopðanas atcelt ðo aizliegumu). sv: Detta kan vara användbart, temporärt, när du gör en upprensning av din databas, om den är åtkomstbar över internet, för att undvika att "wizards" gör ändringar vilka skulle förloras under operationen (kom ihåg att ta bort denna option efter upprensningen). ]

    [yes/no]0 [yes/no]1

    - hide_private_names -
    [ de: Namen der zeitgenössischen Personen verbergen. en: Hide the private person's names. fr: Cacher les noms des personnes privées. it: Nascondere i nomi delle persone private. ]

    [ de: Verberge die Namen zeitgenössischer Personen, d.h. die Namen der Personen, die noch leben, oder genauer, die Personen, die jüger als ein Jahrhundert sind. en: Hide the names of the private persons, i.e. the still living persons or, more exactly, the persons of less than one century. fr: Cache les noms des personnes privées, c'est-à-dire les personnes vivantes, ou plus exactement, celles de moins de 100 ans. it: Nasconde i nomi delle persone private, ovvero le persone in vita o più esattamente quelle che hanno meno di 100 anni. ]

    [yes/no]0 [yes/no]1

    - can_send_image -
    [ de: Erlaubnis, Bilder zu senden. en: Ability to send images. es: Posibilidad de enviar imágenes. fr: Possibilité d'envoyer des images. it: Possibilità d'inviare delle immagini. lv: Atïaut sûtît attçlus. sv: Möjlighet att sända en bild. ]

    [ de: Wenn dieser Parameter auf "Ja" gesetzt wird, haben "Wizards" die Berechtigung, Bilder hochzuladen. en: If yes, the "wizards" are authorized to upload images. es: Si la opción "si" es escogida, los "magos" son autorisados a enviar imágenes por la red. fr: Si oui, les "magiciens" ont l'autorisation d'envoyer des images par le réseau. it: Se scegliete "Si", tutti i "Wizard" saranno autorizzati a inviare immagini sulla rete. lv: Ja jâ, tad "burvjiem" tiek atïauts iesûtît attçlus. sv: Om "Yes", har "wizards" behörighet att sända bilder. ]

    [ de: Dies kann auch bei lokalem Zugiff sinnvoll sein, um Bilder für jemanden zu installieren, da die Funktion das Bild automatisch mit dem richtigen Namen an die richtige Stelle kopiert. en: Can be useful in local, in order to be able to put an image for somebody, because the procedure installs automatically the image at the right place with the appropriate file name. es: Esto puede ser util a nivel local para poder así agregar una imagen a las personas, debido a que este proceso instala automáticamente la foto en el lugar adecuado con el nombre apropiado. fr: Peut être utile en local pour pouvoir mettre une image à des personnes, car la procédure installe automatiquement la photo au bon endroit avec le nom approprié. it: Può essere utile in locale per aggiungere un'immagine a delle persone, dato che la procedura installa automaticamente la foto nel posto giusto e col nome appropriato. lv: Tas var bût noderîgi, ja nepiecieðams kâdai personai pievienot attçlu, jo programma to automâtiski pievienos atbilstoðjâ vietâ ar atbilstoðo datnes nosaukumu. sv: Det kan vara användbart lokalt, när man vill sätta in en bild av någon, därför att proceduren lägger in bilden automatiskt på rätt plats och med rätt filnamn. ]

    [yes/no]0 [yes/no]1

    - renamed -
    [ de: Datenbank wurde umbenannt. en: Base has been renamed. es: Cambio de nombre de la base. fr: Base renommée. it: Cambio del nome della base. lv: Datu bâzei ir mainîts nosaukums. sv: Databasen har blivit omdöpt. ]

    [ de: Wenn du den Namen deiner Datenbank geändert hast, diese Datenbank aber schon seit langer Zeit bestand und du glaubst, daß viele Leute Links auf sie gemacht haben, dann behalte die Parameterdatei und trage hier den Namen der neuen Datenbank ein. Leute, die die Datenbank unter dem alten Namen abfragen, erhalten dann automatisch eine Seite mit einem Verweis auf die neue Datenbank, mit einem klickbaren Kommando, das auf der neuen Datenbank sofort den gleichen Befehl ausführt. en: If you changed the name of your database, but this database has been existed since a long time and you think that many people made links to it, keep this parameter file for this base and write here the new name of the database. People who consult the database with the old name receive then a page indicating them the new name to use with the same clickable request. es: Si Ud. ha cambiado el nombre de su base, pero que esta es una base que existe después de mucho tiempo, y que Ud. piensa que muchas personas han efectuado enlaces en ella, conserve el fichero de parámetros de esta base he indique a continuación el nuevo nombre de la base. Las personas que consultarán la base con el nombre antigüo recibirán una página que les indicará el nuevo nombre a utilizar con la misma demanda clicable. fr: Si vous avez changé le nom de votre base, mais que c'est une base qui existe depuis longtemps et que vous pensez que beaucoup de gens ont mis des liens dessus, conservez ce fichier de paramètres pour cette base et indiquez ci-dessous le nouveau nom de la base. Les gens qui consulteront la base avec l'ancien nom recevront une page qui leur indiquera le nouveau nom à utiliser avec leur même requête cliquable. it: Se avete cambiato di nome alla vostra base, ma si tratta di una base che esiste da molto tempo e supponete che molte persone vi hanno creato sopra dei bookmarks, conservate il file dei parametri di questa base e indicatevi il nome della nuova base. Le persone che consulteranno la base col suo vecchio nome riceveranno una pagina che indicherà loro il nuovo nome da utilizzare con la stessa richiesta cliccabile. lv: Ja Jûs iesiet nomainîjuði datu bâzes nosaukumu, kura jau ir eksistçjusi krietni ilgu laiku, un daudz ïauþu ir izveidojuði norâdes uz to, tad ierakstiet ðet vecâs datu bâzes nosaukumu. Uz pieprasîjumiem, kas tiks veikti ar veco datu bâzes nosaukumu, tiks atbildçts no jaunâs datu bâzes. sv: Om du ändrar namnet på din databas, men databasen har funnits ett bra tag och du tror att många personer har lagt upp länkar till den, behåll denna parameter fil för denna databas och skriv här det nya namnet för databasen. Personer som konsulterat databasen med det gamla namnet kommer då att se en sida som hänvisar dem till den nya databasen. ]

    [ de: Wenn dieses Feld leer ist, wurde die Datenbank nicht umbenannt. en: If this area is empty, the database has not been renamed. es: Si esta zona permanece vacia, la base no cambiará de nombre. fr: Si cette zone est vide, la base n'est pas renommée. it: Se questa zona resta vuota, la base non cambierà di nome. lv: Ja datu bâzei nosaukums nav mainîts, tad ðis lodziòð atstâjams tukðs. sv: Om den är tom, har databasen inte blivit omdöpt. ]

    [ de: Wenn Du möchtest, daß ein bestimmter Text am Ende jeder Seite angezeigt wird, gib ihn hier an. Du kannst HTML-Tags benutzen. en: If you want that a text appears in the bottom of each page, write it here. You can use HTML tags. es: Si Ud desea que un texto aparezca en la parte inferior de cada página, indíquela aquí. Ud. puede agregar allí las balizas HTML. fr: Si vous voulez qu'un texte apparaisse au base de chaque page, indiquez-le ici. Vous pouvez y mettre des balises HTML. it: Se volete che un testo appaia sul piede di ogni pagina, indicatelo qui. Potrete mettervi dei tags HTML. lv: Ðeit Jûs variet ierakstît tekstu, kurð tikts parâdîts katras lappuses beigâs. Jûs variet izmantot HTML sintaksi. sv: Om du vill att en text ska synas längst ner på varje sida, skriv den här. Du kan använda HTML taggar. ]

    [ de: Dann drücke diesen Knopf: en: Then push this button: es: Apoye a continuación en este botón: fr: Puis appuyez sur ce bouton: it: Poi cliccate su questo bottone: lv: Beigâs nospiediet ðo podziòu: sv: Tryck sedan på denna knapp: ]

    geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/list.htm0000660000175200017530000000604312664543647024172 0ustar guillaumeguillaume [ de: Databases en: Databases es: Bases de datos fi: Tietokannat fr: Bases de données it: Basi di dati lv: Datubâzes sv: Databaser ]

    [ de: Datenbanken en: Databases es: Bases de datos fi: Tietokannat fr: Bases de données it: Basi di dati lv: Datubâzes sv: Databaser ]

    [ de: Um eine Datenbank abfragen zu können, muß der gwd-Dienst gestartet worden sein. en: To consult a database, the gwd service must have been launched. es: Para consultar una base de datos, es necesario que el servicio gwd sea lanzado;. fi: Lukieksasi tietokantaa gwd palvelun täytyy olla käynnissä. fr: Pour consulter une base de données, il faut que le service gwd soit lancé. it: Per consultare una base di dati bisogna che il service gwd sia lanciato. lv: Lai uzsâktu darbu ar datu bâzçm, jâbût palaistam gwd servisam. sv: För att konsultera en databas, måste gwd servicen vara startad. ]

      %b{
    • %a|
    • [ de: keine Datenbank vorhanden en: there is no database at present es: ninguna base de datos existe actualmente fi: yhtään tietokantaa ei ole saatavilla fr: il n'y a aucune base de données actuellement it: attualmente non esiste nessuna base di dati lv: patreiz nav nevienas datu bâzes sv: det finns ingen databas för närvarande ]}

    [ de: Zurück zum Hauptmenü. en: Or go back to the main menu. es: O regrese Ud. al menú principal. fi: Tai mene takaisin päävalikkoon. fr: Ou revenez au menu principal. it: O tornate al menu principale. lv: Vai atgriezieties galvenajâ izvçlnç. sv: Eller gå tillbaka till huvudmenyn. ] geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/gwd_info.htm0000660000175200017530000001467012664543647025020 0ustar guillaumeguillaume [ de: Service gwd en: Service gwd es: Servicio gwd fr: Service gwd it: Service gwd lv: Gwd serviss sv: Servicen gwd lv: Gwd serviss ]

    [ de: Service gwd en: Service gwd es: Servicio gwd fr: Service gwd it: Service gwd lv: Gwd serviss sv: Servicen gwd lv: Gwd serviss ]

    [ de: Um den Service zu starten: en: To start the service: es: Para lanzar el servicio: fr: Pour démarrer le service: it: Per lanciare il service: lv: Lai palaistu servisu: sv: För att starta servicen: lv: Lai palaistu servisu: ]

    • [ de: Unter Windows verwende einen Doppelklick auf das "gwd"-Icon, dann kehre hierher zurück. en: Under Windows, launch the program "gwd". es: A partir de Windows, cliquear dos veces en el icono de "gwd", y luego regrese Ud. aquí. fr: Sous Windows, lancez le programme "gwd". it: Sotto Windows, lanciate il programma "gwd". lv: Windows vidç - dubultklikðíis uz "gwd" ikoniòas un tad atgriezieties ðeit. sv: Under Windows, dubbelklicka på "gwd" ikonen, gå sedan tillbaka hit. lv: Windows vidç - dubultklikðíis uz "gwd" ikoniòas un tad atgriezieties ðeit. ]

    • [ de: Unter Unix starte ein xterm und gib die folgenden Kommandos ein: en: Under Unix, launch an xterm and type the following commands: es: A partir de Unix, lanzar un xterm y ecribir con el teclado los comandos siguientes: fr: Sous Unix, lancez un xterm et tapez les commandes suivantes: it: Sotto Unix, lanciate un xterm e digitate i seguenti comandi: lv: Unix vidç - palaidiet xterm un uzrakstiet sekojoðas komandas: sv: Under Unix, starta ett xterm och skriv följande kommandon: lv: Unix vidç - palaidiet xterm un uzrakstiet sekojoðas komandas: ]

           $ cd "%w"
           $ %x%/gwd -hd %x
      

    • [ de: Unter Linux wird der Service automatisch gestartet, sofern du GeneWeb als RPM-Paket installiert hast. Wenn du den Dienst gestoppt hast und ihn neu starten möchtest, dann gib als root folgendes Kommando ein: en: Under Linux, if you installed GeneWeb as an rpm package, the service has been automatically launched. If you stopped it and want to restart it, become root and type: es: A partir de Linux con rpm, escriba en el taclado: fr: Sous Linux, si vous avez installé GeneWeb à partir un paquetage rpm, le service a été automatiquement lancé. Si vous l'avez arrêté et voulez le relancer, devenez root et tapez: it: Sotto Linux, se avete installato GeneWeb partendo da un pacchetto rpm, il service sarà automaticamente lanciato;. Se lo avete fermato e volete rilanciarlo, digitate, come root: lv: Linux vidç - ja Jûs esiet uzstâdîjuði GeneWeb kâ rpm paketi, tad serviss tiks automâtiski iedarbinâts. Ja Jûs to esiet apstâdinâjis un vçlaties to atsâkt, tad ieejiet pamatkatalogâ un ievadiet: sv: Under Linux, om du installerade GeneWeb som ett rpm paket, har servicen startat automatiskt. Om du har stoppat den och vill återstarta den, logga in som root och skriv: lv: Linux vidç - ja Jûs esiet uzstâdîjuði GeneWeb kâ rpm paketi, tad serviss tiks automâtiski iedarbinâts. Ja Jûs to esiet apstâdinâjis un vçlaties to atsâkt, tad ieejiet pamatkatalogâ un ievadiet: ]

           $ /etc/rc.d/init.d/gwd start
      

    [ de: Um den Service zu stoppen: en: To stop the service: es: Pora parar el servicio: fr: Pour arrêter le service: it: Per fermare il service: lv: Lai apstâdinâtu servisu: sv: För att stoppa servicen: lv: Lai apstâdinâtu servisu: ]

    • [ de: Unter Windows oder Unix drücke Control-C (bzw. Strg-C) in dem Fenster, wo gwd läuft. en: Under Windows or Unix, type "control C" in the window where it is running. es: A partir de Windows o Unix, escriba en el teclado "control C", (manteniendo apoyadas las dos teclas), en la "ventana" en la cual el programa ha sido lanzado. fr: Sous Windows ou Unix, tapez "control C" dans la fenêtre où il tourne. it: Sotto Windows o Unix, digitate "control C" nella finestra dove il service è stato lanciato. lv: Windows vai Unix vidç - nospiediet "ctrl C" pie aktîva loga, kurâ tas darbojas. sv: Under Windows eller Unix, tryck "control C" i fönstret där den körs. lv: Windows vai Unix vidç - nospiediet "ctrl C" pie aktîva loga, kurâ tas darbojas. ]

    • [ de: Unter Linux gib, sofern GeneWeb als RPM-Paket installiert ist, als root folgendes Kommando ein: en: Under Linux, if you installed GeneWeb as an rpm package, become root and type: es: A partir de Linux con rpm, escriba en el teclado: fr: Sous Linux, si vous avez installé GeneWeb par un paquetage rpm, devenez root et tapez: it: Sotto Linux, se avete installato GeneWeb a partire da un pacchetto rpm, digitate, come root: lv: Linux vidç - ja Jûs esiet uzstâdîjis GeneWeb kâ rpm paketi, ieejiet pamatkatalogâ un ievadiet: sv: Under Linux, om du installerade GeneWeb som ett rpm paket, logga in som root och skriv: lv: Linux vidç - ja Jûs esiet uzstâdîjis GeneWeb kâ rpm paketi, ieejiet pamatkatalogâ un ievadiet: ]

           $ /etc/rc.d/init.d/gwd stop
      
    geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/err_acc.htm0000660000175200017530000000555312664543647024622 0ustar guillaumeguillaume [ de: Zugriff verboten en: Forbidden access es: Acceso Prohibido fi: Pääsy evätty fr: Accès interdit it: Accesso vietato lv: Pieja liegta sv: Förbjuden åtkomst ]

    [ de: Zugriff verboten en: Forbidden access es: Acceso prohibido fi: Pääsy evätty fr: Accès interdit it: Accesso vietato lv: Pieja liegta sv: Förbjuden åtkomst ]

    [ de: Du bist nicht berechtigt, diesen Dienst zu nutzen. Nur die Adresse "%o" darf ihn verwenden. en: You are not allowed to access this service. Only the address "%o" can use it. es: Ud no esta autorizado a entrar en este servicio. Solo la dirección "%o" puede utilizarla. fi: Sinulla ei ole oikeuksia käyttää tätä palvelua. Vain osoitteella "%o" on lupa käyttää sitä. fr:

    Vous n'avez pas l'autorisation d'accéder à ce service. Seule l'adresse "%o" peut l'utiliser. it: Non avete l'autorizzazione di accedere a questo servizio. Solo l'indirizzo "%o" può farlo. lv: Jums ir liegta pieeja ðim servisam. Tikai no adreses "%o" var lietot ðo servisu. sv: Du har inte tillåtelse att komma åt denna service. Bara adressen "%o" kan göra det. ]

    [ de: Um dies zu ändern, bearbeite die Datei "%y" und ändere die Zeile, in der "%o" steht in "%a". en: To change that, edit the file named "%y" and change the line holding: "%o" into "%a". es: Para sobrepasar esta prohibición, edite Ud el fichero "%y" y remplace la linea que contiene "%o" por "%a". fi: Muuttaaksesi asetukset, muokkaa tiedostoa "%y" GeneWebin asennus- hakemistossa ja muuta rivi "%o" seuraavanlaiseksi "%a". fr: Pour outrepasser cet interdit, il faut éditer le fichier "%y" et remplacer la ligne contenant "%o" en "%a". it: Per aggirare questo divieto, bisogna editare il file "%y" e sostituire la linea contenente "%o" en "%a". lv: Pieejas iegûðanai jârediìç fails "%y" lînijâ, kas satur: "%o" jâieraksta "%a". sv: För att ändra det, editera filen "%y" och ändra raden som innehåller: "%o" till "%a". ] geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/gwd.htm0000660000175200017530000004422312664543647024002 0ustar guillaumeguillaume [ de: Parameter für "gwd" en: Parameters for "gwd" es: Parámetros de gwd fr: Paramètres de gwd it: Parametri di gwd lv: "gwd" parametri sv: Parametrar för "gwd" ]

    [ de: Parameter für "gwd" en: Parameters for "gwd" es: Parámetros de gwd fr: Paramétrage de gwd it: Parametri di gwd lv: "gwd" parametri sv: Parametrar för "gwd" ]

    [ de: Hier sind die Parameter für das Kommando "gwd". Du kannst die folgenden Werte änder: en: Here are the parameters of the command "gwd". Change the one you estimate necessary: es: A continuación se indican los parámetros del commando "gwd". Cambie aquellos que Ud. juzgue necesario: fr: Voici les paramètres de la commande "gwd". Vous pouvez modifier les paramètres suivants: it: Ecco i parametri del comando "gwd". Potete modificare i seguenti parametri: lv: Ðeit ir sekojoði komandas "gwd" parametri. Mainiet tos, ja uzskatiet par nepiecieðamu: sv: Här är parametrarna för kommandot "gwd". Ändra dem som du anser behövs: ]

    -lang [ de: Standardsprache. en: Default language. es: Lenguaje por defecto. fr: Langue par défaut. it: Lingua standard. lv: Noklusçtâ valoda. sv: Förvalt språk. ]

    [ de: Standardmäßig werden alle Seiten der Datenbank in dieser Sprache dargestellt. Wähle deine bevorzugte Sprache. en: By default, all the pages of the databases are displayed in this language. Select your prefered language. es: Por defecto, las páginas de todas las bases de datos son presentadas en este lenguaje. Seleccione su lenguaje preferido. fr: Par défaut, les pages de toutes les bases de données sont affichées dans cette langue. Sélectionnez votre langue de préférence. it: Come settaggio predefinito, le pagine di tutte le basi di dati vengono visualizzate in questa lingua. Selezionate la vostra lingua preferita. lv: Pçc noklusçjuma, visas datu bâzes lappuses tiek parâdîtas ðinî valodâ. Izvçlieties savu valodu. sv: Alla sidor för databasen visas i detta språk. Välj det språk du föredrar. ]

    [ de: Bei einer gegebenen Datenbank kann diese Auswahl immer noch über den speziellen Aufrufparameter geändert werden. Ebenso kann auf der Willkommensseite durch Anklicken einer Fahne immer noch eine andere Sprache gewählt werden. Insofern kann man diese Auswahl hier als "Standard-Standardsprache" betrachten. en: For a given database, you can still change this choice by configurating the specific parameters of this database. And in the welcome page of the base, you can still click on another flag to select another language. The present choice is therefore like a "default default" language. es: En una base de datos, uno puede nuevamente cambiar esta preferencia, configurando los parámetros específicos a esta base. Para ello, en la "Página de Recepción" de una base de datos, uno puede cliquear en una bandera afín de seleccionar otro lenguaje. La selección presente es entonces en cierto modo el lenguaje "por defecto por defecto". fr: Pour une base donnée, on peut encore changer ce choix en configurant les paramètres spécifiques à cette base de données. Et dans la page d'accueil d'une base de données, on peut encore cliquer sur un autre drapeau pour sélectionner une autre langue. Le choix présent est donc en quelque sorte la langue "par défaut par défaut". it: Per una base di dati, si può ancora cambiare questa scelta configurando i parametri specifici a questa base di dati. Nella pagina di benvenuto di una base di dati, si può ancora cliccare su una bandiera per selezionare un'altra lingua. La scelta presente è quindi in qualche modo la "lingua standard". lv: Ðai datu bâzei to joprojâm varçsiet mainît arî vçlâk. Un arî datubâzes sâkumlapâ Jûs varçsiet, uzklikðíinot uz cita karodziòa, izvçlçties citu valodu. Ðo parametru varçtu nosaukt par noklusçtâs noklusçto valodu. sv: För en given databas, kan du ändå ändra detta val genom att konfigurera de specifika parametrarna för denna databas. Och på välkomstsidan för databasen, kan du också byta språk genom att klicka på en flagga. Detta val är därför som ett "förvalt förvalt" språk. ]

    [ de: Falls "-" gewählt ist, gilt Französisch als Standardsprache. en: If "-" is selected, it is French. es: Si la selección es "-", el lenguaje por defecto es el francés. fr: Si c'est "-", c'est le français. it: Se la selezione egrave; "-", la lingua standard è il francese. lv: Ja ir atstâts "-" , tad tâ bûs franèu valoda. sv: Om "-" är valt, är det franska. ]

     
    -only [ de: Nur berechtigte Adressen. en: Only authorized address. es: Única dirección autorisada. fr: Seule adresse autorisée. it: Unico indirizzo autorizzato. lv: Tikai autorizçta adrese. sv: Endast behöriga adresser. ]

    [ de: Befehle werden nur von dieser Internet-Adresse akzeptiert. en: Only the requests from this Internet address are accepted. es: Unicamente las demandas provenientes de esta dirección Internet seran aceptadas. fr: Seules les requêtes provenant de cette adresse Internet seront acceptées. it: Solamente le richieste provenienti da questo indirizzo Internet saranno accettate. lv: Tikai no piepasîjumi no autorizçtas Interneta adrese tiek akceptçti. sv: Endast åtkomster från denna internet adress accepteras. ]

    [ de: Um herauszufinden, welchen Wert du hier für deinen Rechner einsetzen mußt, schaue dir die Trace-Ausgaben des Kommandos "gwd" an, die jedesmal ausgegeben werden, wenn du eine Abfrage an deine Datenbanken machst. Du mußt das eintragen, was dort hinter "From:" ausgegeben wird. en: To know which value put for your computer, look at the traces of the command "gwd" which are displayed each time you navigate in your databases. You have to put what you see behind the "From:". es: Para saber el valor a utilizar en su ordinador, mire Ud. las trazas del comando "gwd", que se presentan en la pantalla cada vez que Ud. explora una base de datos. Utilise lo que Ud. ve después de "From:". fr: Pour savoir quelle valeur mettre pour votre ordinateur, regardez les traces de la commande "gwd" qui s'affichent chaque fois que vous naviguez dans une base de données. Il faut mettre ce que vous voyez derrière le "From:". it: Per sapere quale valore mettere per il vostro computer, osservate le tracce del comando "gwd", che vengono visualizzate sullo schermo ogni volta che navigate nella base di dati. Bisogna mettere quello che vedete dopo "From:". lv: Lai uzzinâtu sava datora adresi, skatiet programmas "gwd" darbîbas pçdas, kas redzamas katru reizi, kad Jûs darbojoties ar savâm datu bâzçm. Ðeit Jums jâieraksta, tas ko Jûs redziet pçc "From:". sv: För att veta vilket värde du ska skriva in för din dator, titta på utskriften för kommandot "gwd" vilka visas varje gång du navigerar i din database. Du ska skriva in det som står efter "From:". ]

     
    -log [ de: Protokolldatei für Verbindungen. en: Connection log file. es: Fichero de trazas de conección. fr: Fichier de traces de connexion. it: File delle tracce di collegamento. lv: Pieprasîjumu reìistrâcijas datne. sv: Åtkomst loggfil. ]

    [ de: Standardmäßig werden die Verbindungs-Trace-Ausgaben in dem Fenster ausgegeben, in dem "gwd" läuft. Jedesmal, wenn du oder jemand anders auf eine deiner Datenbanken zugreift, werden dort vier oder fünf Zeilen ausgegeben. en: By default the connection traces appear in the window of "gwd". Each time you navigate, or somebody accesses to one of your databases, 4 or 5 lines are displayed. es: Por defecto, las trazas de conección aparecen en la "ventana" de "gwd". Cada vez que Ud. explora; o que alguien accede a una de sus bases de datos, uno ve que 4 o 5 líneas se presentan en dicha "ventana". fr: Par défaut, les traces de connexion apparaissent dans la fenêtre de "gwd". Chaque fois qu'on navigue, ou que quelqu'un accède à une de vos bases de données, on voit s'afficher 4 ou 5 lignes. it: Come settaggio standard, le tracce di collegamento appaiono nella finestra di "gwd". Ogni volta che si naviga o che qualcuno accede a una delle vostre basi di dati, vengono visualizzate in questa finestra 4 o 5 linee. lv: Pçc noklusçjuma pieprasîjumu pçdas parâdâs "gwd" logâ. Katru reizi, kad Jðu vai kâds cits darbojas ar kâdu no datu bâzçm, tiek parâdîtas 4 vai 5 paziòojumu rindiòas. sv: Åtkomst utskriften visas i "gwd" fönstret. Varje gång du navigerar, eller någon gör en åtkomst till din databas, visas 4 eller 5 rader. ]

    [ de: Wenn du möchtest, daß diese Daten stattdessen in einer Datei protokolliert werden, gib hier den gewünschten Dateinamen an. Die Datei wird im GeneWeb-Hauptverzeichnis angelegt (dort wo die Kommandos "gwsetup" und "gwd" stehen), falls sie nicht existiert. en: If you want that the traces rather go in a file, write here the name of the file here. This file will be created if it does not exist, in the main directory of GeneWeb where you see the commands "gwsetup" and "gwd". It will be extended at each request. es: Si Ud. desea que las trazas vayan mas bien hacia un fichero; indique aquí el nombre del fichero que Ud. desea utilizar. Este fichero será creado, en caso que el no exista aún, en la carpeta principal de GeneWeb donde Ud ve los comandos "gwsetup" y"gwd". A cada demanda de datos a su base, este fichero sera incrementado de las líneas de trazas correspondientes. fr: Si vous désirez que les traces aillent plutôt dans un fichier, indiquez ici le nom du fichier que vous désirez. Ce fichier sera créé, s'il n'existe pas, dans le répertoire principal de GeneWeb où vous voyez les commandes "gwsetup" et "gwd". Il sera rallongé à chaque requête. it: Se decidete di redirigere le tracce verso un file, indicate qui il nome del file desiderato. Se questo file non esiste, sarà creato nella directory principale di GeneWeb dove vedete i comandi "gwsetup" e "gwd". Sarà aggiornato ad ogni richiesta. lv: Ja Jûs labâk vçlaties pçdas tiek ierakstîtas datnç, tad ierakstiet ðeit datnes nosaukumu. Ja ðâda datne tiks izviedota (ja neeksistçs) galvenajâ GeneWeb katalogâ, kurâ atrodas arî komandas "gwsetup" un "gwd". Pçc katra pieprasîjuma ðî datne tiks papildinâta. sv: Om du istället vill att utskriften går till en fil, skriv namnet för filen här. Filen kommer att skapas, om den inte finns, i huvudkatalogen för GeneWeb där du ser kommandona "gwsetup" och "gwd". Den kommer att utökas för varje åtkomst. ]

     
    [ de: Es gibt noch weitere Parameter für das Kommando "gwd", aber diese sind hier nicht konfigurierbar, weil sie die Ausführung des "gwsetup" beeinträchtigen können. en: Other parameters exist for the command "gwd", but are not configurable here because they can perturbate the operation of "gwsetup". es: El comando "gwd" posee aún otros parámetros suplementarios, pero estos no son configurables aquí, debido al hecho que ellos pueden perturbar el funcionamiento del "gwsetup". fr: D'autres paramètres existent pour la commande "gwd", mais ils ne sont pas configurables ici, car ils peuvent perturber le fonctionnement de "gwsetup". it: Esistono altri parametri per il comando "gwd", ma non possono essere settati qui, perché possono perturbare il funzionamento di "gwsetup". lv: Citi "gwd" komandas parametri ðeit nav izmainâmi, jo tie var ietekmçt paðas "gwsetup" programmas darbîbu. sv: Det finns andra parametrar för kommandot "gwd", men de kan inte konfigureras här ifrån, därför att de kan hindra operationen av "gwsetup". ]
    [ de: In der Tat ist die Navigation mittels des "gwsetup" dazu gedacht, die Benutzung von GeneWeb einfacher zu machen, nicht um alle Möglichkeiten auszuprobieren. Zur Nutzung der übrigen Parameter ist ein wenig "Hackerwissen" erforderlich. Einige Informationen finden sich in der Dokumentation. en: Indeed, the navigation by "gwsetup" is mainly destinated to make the use of GeneWeb simpler, but does not allow to exploit quite all the possibilities. To find the other parameters and their use, you must be a little bit "hacker": some informations can be found in the documentation. es: En efecto la exploración a partir del "gwsetup" es destinada principalmente a hacer que la utilisación de GeneWeb sea más simple, pero no permite de explotar completamente todas las posibilidades del comando. Para encontrar los otros parámetros, así como su utilisación, es necesario de ser un poco "mañoso": Ud. encontrará algunas informaciones buscando bién en la documentación. fr: En effet, la navigation par "gwsetup" est principalement destinée à rendre plus simple l'utilisation de GeneWeb, mais ne permet pas d'en exploiter tout à fait toutes les possibilités. Pour trouver les autres paramètres et leur usage, il faut être un peu "bricoleur": quelques informations peuvent être trouvées en cherchant dans la documentation. it: In effetti, la navigazione con "gwsetup" è principalmente destinata a rendere più semplice l'utilizzazione di b>GeneWeb, ma non permette di sfruttarne pienamente tutte le possibilità. Per trovare altri parametri e conoscerne il loro uso, ci vuole un poco di "fai-da-te"; alcune informazioni possono essere trovate cercando nella documentazione. lv: Patieðâm "gwsetup" programmâ ir galvenokârt veidota, lai padarîtu GeneWeb lietoðanu vienkârðâku, bet tâ neïauj izmantot visas tâs iespçjas. Lai atrastu citus parametrus un to pielietojumu, Jums jâkïûst nedaudz par "hakeri": daþa informâcija ir atrodama dokumntâcijâ. sv: Faktiskt, navigation med "gwsetup" är huvudsakligen för att göra användandet av GeneWeb enklare, men det tillåter inte att utnyttja alla möjligheter. För att finna de andra parametrarna och deras användning, måste du vara lite av en "datahacker": en del av informationen kan hittas i dokumentationen. ]

    [ de: Dann drücke diesen Knopf: en: Then push this button: es: A continuación apoye Ud. en el botón: fr: Puis appuyez sur ce bouton: it: Poi cliccate su questo bottone: lv: Tad nospiediet ðo podziòu: sv: Tryck sedan på denna knapp: ]

    geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/gwu.htm0000660000175200017530000002023612664543647024021 0ustar guillaumeguillaume [ de: GeneWeb-Quelldatei extrahieren en: <title>Extract a GeneWeb source file es: Extracción de una fuente GeneWeb fr: Extraction d'un fichier source GeneWeb it: Estrazione di un file sorgente GeneWeb lv: Izveidot GeneWeb datni sv: Exportera en GeneWeb källfil ]

    [ de: GeneWeb-Quelldatei extrahieren en: Extract a GeneWeb source file es: Extracción de un fichero fuente GeneWeb fr: Extraction d'un fichier source GeneWeb it: Estrazione di un file sorgente GeneWeb lv: Izveidot GeneWeb datni sv: Exportera en GeneWeb källfil ]

    [ de: Wähle deine Datenbank: en: Select your database: es: Seleccione una base de datos: fr: Sélectionnez votre base de données: it: Selezionate la vostra base di dati: lv: Izvçlieties atbilstoðo datu bâzi: sv: Välj din databas: ]

    %b{| }
        %a
    - [ de: keine Datenbank vorhanden en: there is no database at present es: actualmente ninguna base de datos existe fr: il n'y a aucune base de données actuellement it: attualmente non esiste nessuna base di dati lv: nav nevienas datu bâzes sv: det finns ingen databas för tillfället ]

    [ de: Gib den Namen ein, den du deiner GeneWeb-Quelldatei geben möchtest. Er muß mit ".gw" enden. Wenn Du nichts eingibst, wird der Dateiname aus dem Namen deiner GeneWeb-Datenbank abgeleitet. en: Enter the name you want to give to your GeneWeb source file. Its name must end with the suffix ".gw". If you write nothing, its name will be deducted from the name of the database. es: Entre Ud. el nombre que Ud. desee dar a su fichero fuente GeneWeb. El debe terminar en ".gw". Si Ud. no mete nada, este será deducido del nombre de la base. fr: Entrez le nom que vous voulez donner à votre fichier source GeneWeb. Il doit se terminer par ".gw". Si vous ne mettez rien, ce sera déduit du nom de la base. it: Digitate il nome che volete attribuire al vostro file sorgente GeneWeb. Deve finire con ".gw". Se non mettete niente, il nome verrà dedotto da quello della base. lv: Ierakstiet datnes nosaukumu GeneWeb datnei. Nosaukumam jâbeidzas ar paplaðinâjumu ".gw". Ja Jûs neko neierakstîsiet, datnes vârds tiks izveidots no datu bâzes nosaukuma. sv: Skriv in namnet du vill kalla din GeneWeb källfil. Om du inte skriver någonting, kommer det att bli samma namn som databasen avslutad med ".gw". ]

    [ de: Wähle die gewünschten Optionen: en: Select the options you want: es: Seleccione las opciones que Ud. desee: fr: Sélectionnez les options que vous désirez: it: Selezionate le opzioni desiderate: lv: Iezîmçjiet atbilstoðos datnes izveides parametrus: sv: Välj de optioner du vill ha: ]

        [ de: Während der Operation sparsam mit dem Speicher umgehen (ist aber langsamer). en: Save memory space during operation (but it will be slower). es: Economizar el espacio memoria durante la operación (pero esta será mas lenta). fr: Économiser l'espace mémoire pendant l'opération (mais ce sera plus lent). it: Economizzare lo spazio-memoria durante l'operazione (che però sarà più lenta). lv: Taupît operatîvo atmiòu (process notiks lçnâk). sv: Spara minne under operationen (men det kommer att gå saktare). ]
     [ de: Nur die Vorfahren auswählen von... en: Extract only the ancestors of... es: No extraer los antepasados de... fr: N'extraire que les ancêtres de... it: Estrarre solo gli antenati di... lv: Atlasît tikai dotâs personas priekðteèus ... sv: Exportera endast anorna till... ]
    [ de: Vorname en: First name es: Nombre fr: Prénom it: Nome lv: Vârds sv: Förnamn ] [ de: Nr en: Num es: Núm fr: Num it: Numero lv: Num sv: Nummer ]
    [ de: Nachname en: Surname es: Apellido fr: Nom it: Cognome lv: Uzvârds sv: Efternamn ]
     [ de: Nur die Nachkommen auswählen von... en: Extract only the descendants of... es: Extraer solamente los descendientes de... fr: N'extraire que les descendants de... it: Estrarre solo i discendenti di... lv: Atlasît tikai dotâs personas pçcteèus ... sv: Exportera endast ättlingarna till... ]
    [ de: Vorname en: First name es: Nombre fr: Prénom it: Nome lv: Vârds sv: Förnamn ] [ de: Nr en: Num es: Núm fr: Num it: Num lv: Num sv: Nummer ]
    [ de: Nachname en: Surname es: Apellido fr: Nom it: Cognome lv: Uzvârds sv: Efternamn ]
    [ de: Falls du oben beide Optionen gewählt hast, wird die Schnittmenge extrahiert: Alle Personen die gleichzeitig Vorfahren des einen und Nachkommen des anderen sind. en: If you use both options above, the intersection is assumed: persons at the same time ancestors of the one and descendants of the other. es: Si Ud. utiliza las dos opciones anteriores, es la intersección que contará al mismo tiempo antepasados de uno y descendientes del otro. fr: Si vous utilisez les deux options ci-dessus, c'est l'intersection qui comptera: personnes à la fois ancêtres de l'un et descendants de l'autre. it: Se utilizzate insieme le due opzioni precedenti, è l'intersezione che serà presa in considerazione: ossia le persone che sono sia gli antenati dell'uno che i discendenti dell'altro. lv: Ja Jûs lietosiet abus iepriekðçjos nosacîjumus, tad tiks atlasîti tikai tie, kas atbildîs abiem nosacîjumiem: personas, kuras vienlaicîgi ir gan viena senèi, gan otra pçcteèi. sv: Om du väljer de båda valen ovan, kommer överlappning att antas: personer som samtidigt är anor av den ena och ättlingar av den andra. ]

    [ de: Dann drücke diesen Knopf: en: Then push this button: es: Apoye luego en este botón: fr: Puis appuyez sur ce bouton: it: Poi cliccate su questo bottone: lv: Beigâs nospiediet ðo podziòu: sv: Tryck sedan på denna knapp: ]

    geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/backg.htm0000660000175200017530000000630612664543647024270 0ustar guillaumeguillaume [ de: Hintergrundbild en: Background image es: Imagen de fondo fi: Taustakuva fr: Image de fond it: Immagine di fondo lv: Fona attçls sv: Bakgrundsbild ]

    [ de: Hintergrundbild en: Background image es: Imagen de fondo fi: Taustakuva fr: Fond d'écran it: Fondo dello schermo lv: Fona attçls sv: Bakgrundsbild ]

    • [ de: Um ein Hintergrundbild für die Datenbank "%o" anzugeben, gib hier den Dateinamen des Bildes ein: en: To specify a background image for the database "%o", you have to write it: es: Para utilizar una imagen de fondo en la base "%o", hay que meterla bajo la forma: fi: Määritelläksesi taustakuvan tietokannalle "%o", sinun pitää kirjoittaa se: fr: Pour indiquer une image de fond pour la base "%o", il faut la mettre sous la forme suivante: it: Per indicare un'immagine di fondo per la base "%o", bisogna farlo nella forma seguente: lv: Lai noteiktu fona attçlu datu bâzei "%o", jums jâuzraksta tas (aizvietojot "foo.jpg" jûsu attçla datnes reâlo nosaukumu): sv: För att specifiera en bakgrundsbild för databasen "%o", måste du skriva (byt ut "foo.jpg" mot det riktiga namnet för bildfilen): ]
           background="gwd%t{.exe}?m=IM;v=/[
      de: bla.jpg
      en: foo.jpg
      es: toto.jpg
      fi: esimerkki.jpg
      fr: toto.jpg
      it: pippo.jpg
      lv: foo.jpg
      sv: foo.jpg
      ]"
      

      [ de: Ersetze dabei "bla.jpg" durch den echten Bildnamen. en: replacing "foo.jpg" by the real name of your image file. es: remplazando para ello "toto.jpg" por el verdadero nombre de la imagen. fi: korvaa "esimerkki.jpg" oikealla kuvalla. fr: en remplaçant "toto.jpg" par le vrai nom de votre fichier image. it: rimpiazzando "pippo.jpg" col vero nome del vostro file immagine. ]

    • [ de: Lege die Bilddatei in folgendem Verzeichnis ab (Gegebenenfalls lege das Verzeichnis vorher an): en: Put the image file in the directory (possibly create it before): es: Meta ese fichero imagen en la carpeta (que Ud. creará eventualmente): fi: Laita kuva hakemistoon (mahdollisesti luo hakemisto): fr: Mettez ce fichier image dans le répertoire (que vous devrez éventuellement créer): it: Mettete questo file immagine nella directory (che dovrete eventualmente creare): lv: Ielieciet attçla datni katalogâ (iespçjams to pirms tam izveidojot): sv: Lägg bildfilen i katalogen (om den inte finns skapa den först): ]
           gw%/images
      
    geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/gw2gd_ok.htm0000660000175200017530000000557512664543647024733 0ustar guillaumeguillaume [ de: Operation durchgeführt en: Operation completed es: Operación terminada fi: Toiminto suoritettu fr: Opération terminée it: Operazione terminata lv: Darbîba pabeigta sv: Operationen klar ]

    [ de: Operation durchgeführt en: Operation completed es: Operación terminada fi: Toiminto suoritettu fr: Opération terminée it: Operazione terminata lv: Darbîba pabeigta sv: Operationen klar ]

    [ de: Die Extraktion der GEDCOM-Datei ist beendet. en: The extraction of the GEDCOM file is terminated. es: Bién. La extracción del fichero GEDCOM ha terminado. fi: GEDCOM-tiedoston vienti on lopetettu. fr: Voilà. L'extraction du fichier GEDCOM est terminée. it: L'estrazione del file GEDCOM è terminata. lv: GEDCOM datnes apstrâde ir pabeigta. sv: Exporten av GEDCOM-filen är avslutad. ]

    [ de: Es wurde eine Datei namens "%o" erzeugt. en: This has built a file named "%o". es: Esta operación ha creado un fichero que tiene por nombre "%o". fi: Tämä on luonut tiedoston nimeltä "%o". fr: Cela a construit un fichier de nom "%o". it: Questa operazione ha creato un file chiamato "%o". lv: Rezultâtâ ir izviedota datne: "%o". sv: Det har skapats en fil benämnd "%o". ]

    [ de: Diese Datei steht ihm Verzeichnis en: This file is in the directory es: Este fichero se encuentra en la carpeta fi: Tämä tiedosto on hakemistossa fr: Ce fichier se trouve dans le répertoire it: Questo file si trova nella directory ] "%w".

    [ de: Zurück zum Hauptmenü. en: You can return to the main menu. es: Si Ud. desea regresar al menú principal. fi: Voit palata päävalikkoon. fr: Vous pouvez revenir au menu principal. it: Potete tornare al menu principale. lv: Jûs variet atgriezties galvenajâ izvçlnç. sv: Du kan återvända till huvudmenyn. ] geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/intro.txt.dos0000660000175200017530000000562012664543647025165 0ustar guillaumeguillaume [ de: Willkommen zu GeneWeb %q en: Welcome to GeneWeb %q es: Bienvenido a GeneWeb %q fr: Bienvenue dans GeneWeb %q it: Benvenuti su GeneWeb %q lv: Sveicinaati GeneWeb %q Ghenealoghijas datu baazee sv: V„lkommen till GeneWeb %q ] [ de: Nimm deinen Webbrowser und ”ffne eine der folgenden Adressen: en: Go to your Web browser and open one of the following addresses: fr: Allez dans votre navigateur Web et ouvrez une des adresses suivantes: it: Lanciate il vostro navigatore Web e aprite uno dei seguenti indirizzi: ] http://127.0.0.1:%z/ http://localhost:%z/ [ de: Warnung: Damit dieses Programm funktioniert, darfst Du dieses Fenster nicht schließen! en: Warning: for this program to work, you must not close this window! fr: Attention: pour que cela fonctionne, vous ne devez pas fermer cette fenetre! it: Attenzione! Per poter navigare nella base, non dovete mai chiudere questa finestra! lv: Uzmaniibu: lai shii programma darbotos Juus nedriigstat aizveert sho logu! sv: Varning: f”r att det h„r programmet ska fungera, f†r du inte st„nga detta f”nster! ] [ de: Falls das nicht funktioniert, mußt du eventuell in deinem Webbrowser einige Optionen „ndern, wie zum Beispiel "Offline arbeiten" oder "Fr lokale Adressen keinen Proxy benutzen" oder "Fr die Adresse 'localhost' nicht mit dem Internet verbinden". en: If none of theses addresses work, you may have to configure, in your browser, options like "work off-line" or "do not use the proxy for local addresses" or "do not connect to Internet for the address 'localhost'". es: Si esto no funciona, es posible que Ud. haya configurado en su explorador algunas opciones de tipo "trabajar fuera de conecci¢n" o "no utilizar un proxy con las direcciones locales" o "no conectarse al internet con la direcci¢n 'localhost'". fr: Si aucune de ces adresses ne fonctionne, il se peut que vous ayez … configurer dans votre navigateur des options du genre "travailler hors connexion" ou "ne pas utiliser de proxy pour les adresses locales" ou "ne pas se connecter sur internet pour l'adresse 'localhost'". it: Se nessuno dei due indirizzi funziona, forse Š a causa del fatto che avete configurato nel vostro navigatore un'opzione del genere "lavorare off-line" oppure "non utilizzare il proxy per gli indirizzi locali" o "non collegarsi ad internet per l'indirizzo "localhost". lv: Ja pie iepriekshmineetajiem nosaciijumiem Juus nevariet pieklhuut pie GeneWeb, Jums iespeejams jaaiestaada savaa Interneta caurluukprogramaa sekojoýi noraadiijumi: "work off-line" vai "do not use the proxy for local addresses" vai "do not connect to Internet for the address 'localhost'". sv: Om det inte fungerar, kanske du m†ste st„lla in din webbl„sare med optioner som "arbeta off-line" eller "anv„nd inte en proxyserver f”r lokala adresser" eller "anslut inte till Internet f”r adressen 'localhost'". ] geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/bso.htm0000660000175200017530000002022412664543647023777 0ustar guillaumeguillaume [ de: Datenbank anlegen en: Creation of a database es: Creación de una base de datos fi: Tietokannan luonti fr: Création d'une généalogie it: Creazione di una base di dati lv: Datu bâzes izveidoðana sv: Skapa en databas ]

    [ de: Datenbank anlegen en: Creation of a database es: Creación de una base de datos fi: Tietokannan luonti fr: Création d'une généalogie it: Creazione di una base di dati lv: Datu bâzes izveidoðana sv: Skapa en databas ]

      %v{
    • [ de: Warnung: In deinem Verzeichnis existiert bereits eine Datenbank mit dem Namen "%o". Wenn du den "Ok"-Knopf drückst, wird sie gelöscht. en: Warning: there already exists a database with the name "%o" in your directory. If you push the button "Ok" below, it will be erased. es: Atención: una base llamada "%o" ya existe en su carpeta. Si Ud apoya en el botón "Ok" la base inicial sera borrada fi: Varoitus: tietokanta nimellä "%o" on jo luotuna hakemistossa. Mikäli painat "Ok" -nappia alla, olemassa oleva tietokanta tuhoutuu. fr: Attention: il existe déjà une généalogie de nom "%o" dans votre répertoire. Si vous appuyez sur le bouton "Ok" ci-dessous, cela va l'effacer. it: Attenzione: esiste una base di dati chiamata "%o" nella directory. Se cliccate sul bottone "Ok" qui sotto, essa sarà cancellata. lv: Brîdinâjums: ðâda datubâze "%o" jau eksistç Jûsu katalogâ. Ja Jûs nospiedîsiet podziòu "Ok" zemâk, datu bâze tiks dzçsta. sv: Varning: det existerar redan en databas med namnet "%o" i din katalog. Om du trycker på knappen "OK" nedan, kommer den att bli raderad. ]

      [ de: Falls du diese Funktion gerade schonmal ausgeführt hattest, dann war diese Datenbank wahrscheinlich das Ergebnis und daher kann dieser Fehler hier ignoriert werden. Andernfalls kehre auf die vorherige Seite zurück und wähle einen anderen Namen für deine Datenbank. en: If you just made this, it is probably its result, and therefore it is not important. Else, return to the previous page and choose another name for your database. es: Si Ud viene de realizar esta operación, debe probablemente tratarse de su resultado, entoces !no pasa nada!. Si no, regrese ha la posición anterior y escoja otro nombre para su base. fi: Jos juuri teit tietokannan, tämä on todennäköisesti tulos siitä ja siksi ei ole tärkeä. Muutoin, palaa edelliselle sivulle ja valitse toinen nimi tietokannalle. fr: Si vous venez déjà de faire cette manipulation, il s'agit probablement de son résultat, ce n'est donc pas grave. Sinon, revenez en arrière et choisissez un autre nom pour votre base. it: Se avete appena fatto questa operazione, si tratta probabilmente del suo risultato; niente di grave, quindi. Altrimenti, tornate indietro e scegliete un nuovo nome per la vostra base. lv: Ja Jûs tikai tikko esat to izveidojuði, tâ varbût ir izveides rezultâts, un tad tam nav nozîmes. Citâdi, atgriezieties uz iepriekðçjo lapu un izvçlieties citu datu bâzes nosaukumu. sv: Om du precis gjorde detta, har databasen blivit raderad nu. Annars, återvänd till föregående sida och välj ett annat namn för din databas. ]

      }

    • [ de: Wir legen nun eine Datenbank mit dem Namen "%o" an. Beachte: Je nach Fall kann diese Operation nur ein Augenzwinkern lang dauern, oder aber wenige Sekunden oder sogar einige Minuten benötigen. Bitte habe Geduld. en: We are going to create a database named "%o". Remark: this operation can answer in the twinkling of a eye or take some tenths of seconds or some minutes, depending on the cases. Be patient. es: Vamos a crear una base que tiene por nombre "%o". Remarca: esta operación puede efectuarse inmediatamente o tomar unas decenas de segundos o algunos minutos, en función del caso. Tenga paciencia. fi: Luomme tietokannan nimeltä "%o". Huomautus: tämä toiminto voi kestää hetken, riippuen tapauksesta. Ole kärsivällinen. fr: Nous allons créer une généalogie de nom "%o". Remarque: cette opération peut s'effectuer en un clin d'oeil ou prendre quelques dizaines de secondes ou quelques minutes, suivant les cas. Soyez patient. it: Ora creiamo una base di dati chiamata "%o". Nota: questa operazione si effettua in qualche secondo o in quanche minuto, secondo i casi. Siate paziente. lv: Tiks izveidota datu bâze "%o". Piezîme: ði darbîba var ilgt vienu acumirkli vai daþus desmitus sekunþu vai minûðu atkarîbâ no aptâkïiem. Esiet pacietîgs. sv: Vi ska nu skapa en databas benämnd "%o". Obs: denna operation kan gå blixtsnabbt eller ta tiotalet sekunder eller flera minuter, beroende på fallet. Ha tålamod. ]

      [ de: Drücke den Knopf, um die Datenbank anzulegen en: Push the button below to create you database es: Apoye en el botón inferior para crear su base de datos fi: Paina nappia alla luodaksesi tietokannan fr: Appuyez sur Ok pour créer votre généalogie it: Cliccate sul bottone qui sotto per creare la vostra base di dati lv: Nospiediet zemâk esoðo podziòu, lai izveidotu datu bâzi sv: Tryck på knappen nedan för att skapa din databas ]%v{
      [ de: und die alte Datenbank "%o" im Zielverzeichnis zu löschen en: , and overwrite the previous database "%o" of the target directory es: y destruir la base "%o" de la carpeta de llegada fi: , ja ylikirjoita tietokanta "%o" kohdehakemistosta fr: et écraser la base "%o" du répertoire d'arrivée it: e cancellare la base "%o" dalla directory di arrivo lv: , un dzçstu iepriekðçjo datu bâzi "%o" katalogâ sv: och radera den föregående databasen "%o" från målkatalogen ]}:

      %h

      [ de: Zu deiner Information: Diese Funktion entspricht der Ausführung der folgenden Kommandos: en: For information, this operation corresponds to the following commands: es: Por información, esta operación corresponde a los comandos siguientes: fi: Tiedoksi, tämä toiminto vastaa seuraavia komentoja: fr: Pour information, cette opération correspond à la suite des commandes suivantes: it: Per informazione, questa operazione corrisponde ai seguenti comandi: lv: Informâcijai: Ðî darbîba atbilst sekojoðâm komandâm: sv: Denna operation motsvarar de följande kommandona: ]

           $ cd "%w"
           $ %x%/%d%p > comm.log
      
      [ de: Hierbei wird ein Verzeichnis namens "%o.gwb" angelegt. en: This builds a directory named "%o.gwb". es: Esto creará una carpeta de nombre "%o.gwb". fi: Tämä luo hakemiston nimeltä "%o.gwb". fr: Cela fabriquera un répertoire de nom "%o.gwb". it: Verrà creata una directory chiamata "%o.gwb". lv: Tâs rezultâtâ tiks izveidots katalogs "%o.gwb". sv: Detta skapar en katalog benämnd "%o.gwb". ]
    geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/err_miss.htm0000660000175200017530000000440712664543647025044 0ustar guillaumeguillaume [ de: Fehlender Name en: Missing name es: Nombre faltante fi: Nimi puuttuu fr: Nom manquant it: Nome mancante lv: Trûkst nosaukuma sv: Det fattas namn ]

    [ de: Fehlender Name en: Missing name es: Nombre faltante fi: Nimi puuttuu fr: Nom manquant it: Nome mancante lv: Trûkst nosaukuma sv: Det fattas namn ]

    [ de: Dein Kommando kann nicht ausgeführt werden. Du hast nicht genügend Informationen angegeben. en: It is not possible to execute your command. You did not give enough information. es: La ejecución de su comando no es posible. Ud. no ha dado todas las informaciones necesarias. fi: Antamaasi komentoa ei ole mahdollista ajaa. Et antanut tarpeeksi tietoja. fr: Il n'est pas possible d'exécuter votre commande. Vous n'avez pas donné assez d'informations. it: Non è possibile eseguire il vostro comando. Non avete fornito informazioni sufficienti. lv: Nevar izpildît Jûsu doto komadu. Jûs nedevât pietiekamu informâciju. sv: Det är inte möjligt att utföra ditt kommando. Du angav inte tillräckligt med information. ]

    [ de: Gehe zurück auf die vorherige Seite. en: Go back to the previous page. es: Regrese Ud. a la página anterior. fi: Mene takaisin edelliselle sivulle. fr: Revenez à la page précédente. it: Tornate alla pagina precedente. lv: Argriezieties iepriekðçjâ lapâ. sv: Gå tillbaka till föregående sida. ] geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/err_smdr.htm0000660000175200017530000000324212664543647025032 0ustar guillaumeguillaume [error]

    [error]


    [ de: Du hast das gleiche Verzeichnis gewählt wie das dieser GeneWeb-Installation. en: You selected the same directory than the one of this GeneWeb distribution. es: Ud. ha seleccionado la misma carpeta que la de esta distribución de GeneWeb. fi: Valitsit saman hakemiston missä GeneWeb on. fr: Vous avez sélectionné le même répertoire que celui de cette distribution de GeneWeb. it: Avete selezionato la stessa directory della distribuzione GeneWeb. lv: Jûs esiet izvçlçjies vienu no GeneWeb programmas katalogiem. sv: Du valde samma katalog som denna GeneWeb distribution. ] geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/lexicon.txt0000660000175200017530000002031712664543647024707 0ustar guillaumeguillaume# $Id: lexicon.txt,v 5.4 2007-01-19 01:53:16 ddr Exp $ # Copyright (c) 1998-2007 INRIA !charset de: iso-8859-1 en: iso-8859-1 es: iso-8859-1 fr: iso-8859-1 it: iso-8859-1 lv: iso-8859-1 nl: iso-8859-1 sv: iso-8859-1 !languages af: af=Afrikaans/ca=Catalan/cs=Czeck/da=Deens/de=Duits/en=Engels/eo=Esperanto/es=Spaans/fi=Fins/fr=Frans/he=Hibreeus/is=Yslandies/it=Italiaans/nl=Nederlands/no=Noorweegs/pl=Pools/pt=Portugees/pt-br=Portugees-in-Brazilië/ru=Russies/sv=Sweeds/zh=Chinees bg: af=áóðñêè/bg=áúëãàðñêè/ca=êàòàëîíñêè/cs=÷åøêè/da=äàòñêè/de=íåìñêè/en=àíãëèéñêè/eo=åñïåðàíòî/es=èñïàíñêè/et=åñòîíñêè/fi=ôèíëàíäñêè/fr=ôðåíñêè/he=èâðèò/is=èñëàíäñêè/it=èòàëèàíñêè/lv=ëàòâèéñêè/nl=õîëàíäñêè/no=íîðâåæêè/pl=ïîëñêè/pt=ïîðòóãàëñêè/pt-br=áðàçèëñêî-ïîðòóãàëñêè/ro=ðóìúíñêè/ru=ðóñêè/sl=ñëîâåíñêè/sv=øâåäñêè/zh=êèòàéñêè br: af=afrikaaneg/bg=bulgareg/br=brezhoneg/ca=katalaneg/cs=tchekeg/da=daneg/de=alamaneg/en=saozneg/eo=esperanteg/es=spagnoleg/et=estonieg/fi=finneg/fr=galleg/he=hebreeg/is=islandeg/it=italianeg/lv=letoneg/nl=izelvroeg/no=norvegieg/pl=poloneg/pt=portugaleg/pt-br=portugaleg bro-Vrazil/ro=roumaneg/ru=rusianeg/sl=sloveneg/sv=svedeg/zh=sinaeg ca: af=africà/ca=català/cs=xec/da=danès/de=alemany/en=anglès/eo=esperanto/es=castellà/et=estó/fi=finlandès/fr=francès/he=hebreu/is=islandès/it=italià/lv=letó/nl=holandès/no=norueg/pl=polac/pt=portuguès/pt-br=brasiler/ru=rus/sl=eslovè/sv=suec/zh=Xinès cs: af=afrikán¹tina/bg=bulhar¹tina/cs=èe¹tina/da=dán¹tina/de=nìmèina/en=angliètina/eo=esperanto/es=¹panìl¹tina/fi=fin¹tina/fr=francouz¹tina/he=hebrej¹tina/is=island¹tina/it=ital¹tina/lv=loty¹¹tina/nl=holand¹tina/no=nor¹tina/pt=portugal¹tina/pt-br=brasil¹tina/ru=ru¹tina/sv=¹véd¹tina/zh=èín¹tina da: af=afrikaans/bg=bulgarsk/ca=katalansk/cs=tjekkisk/da=dansk/de=tysk/en=engelsk/eo=esperanto/es=spansk/et=estisk/fi=finsk/fr=fransk/he=hebraisk/is=islandsk/it=italiensk/lv=lettisk/nl=hollandsk/no=norsk/pl=polsk/pt=portugisisk/pt-br=brasiliansk-portugisisk/ro=rumænsk/ru=russisk/sl=slovensk/sv=svensk/zh=kinesisk de: af=Afrikaans/bg=Bulgarish/ca=Katalanisch/cs=Tschechisch/da=Dänisch/de=Deutsch/en=Englisch/eo=Esperanto/es=Spanisch/et=Estnisch/fi=Finnisch/fr=Französisch/he=Hebräisch/is=Isländisch/it=Italienisch/lv=Litauisch/nl=Holländisch/no=Norwegisch/pl=Polnisch/pt=Portugiesisch/pt-br=Brasil-Portugiesisch/ru=Russisch/sl=Slovenisch/sv=Schwedisch/zh=Chinesisch en: af=Afrikaans/bg=Bulgarian/br=Breton/ca=Catalan/cs=Czech/da=Danish/de=German/en=English/eo=Esperanto/es=Spanish/et=Estonian/fi=Finnish/fr=French/he=Hebrew/is=Icelandic/it=Italian/lv=Latvian/nl=Dutch/no=Norwegian/pl=Polish/pt=Portuguese/pt-br=Brazilian-Portuguese/ro=Romanian/ru=Russian/sl=Slovenian/sv=Swedish/zh=Chinese eo: bg=bulgara/en=anglo/eo=esperanto/fr=franco es: af=Afrikaans/bg=Búlgaro/ca=Catalán/cs=Checo/da=Danés/de=Alemán/en=Inglés/eo=Esperanto/es=Español/et=Estonio/fi=Finés/fr=Francés/he=Hebreo/is=Islandés/it=Italiano/lv=Lituano/nl=Neerlandés/no=Noruego/pl=Polaco/pt=Portugés/pt-br=Portugés de Brasil/ru=Ruso/sl=Esloveno/sv=Sueco/zh=Chino et: af=afrikaani/bg=bulgaaria/ca=katalaani/cs=tšehhi/da=taani/de=saksa/en=inglise/eo=esperanto/es=hispaania/et=eesti/fi=soome/fr=prantsuse/he=heebrea/is=islandi/it=itaalia/lv=läaut;ti/nl=hollandi/no=norra/pl=poola/pt=portugali/pt-br=brasiilia-portugali/ro=rumeenia/ru=vene/sl=sloveenia/sv=rootsi/zh=hiina fi: af=afrikaans/ca=katalaani/cs=tsekki/da=tanska/de=saksa/en=englanti/eo=esperanto/es=espanja/et=eesti/fi=suomi/fr=ranska/he=heprea/is=islanti/it=italia/lv=latvia/nl=hollanti/no=norja/pl=puola/pt=portugali/pt-br=brasilianportugali/ru=venäjä/sv=ruotsi/zh=kiina fr: af=afrikaans/bg=bulgare/br=breton/ca=catalan/cs=tchèque/da=danois/de=allemand/en=anglais/eo=espéranto/es=espagnol/et=estonien/fi=finnois/fr=français/he=hébreu/is=islandais/it=italien/lv=letton/nl=néerlandais/no=norvégien/pl=polonais/pt=portugais/pt-br=portugais-du-Brésil/ro=roumain/ru=russe/sl=slovène/sv=suédois/zh=chinois he: af=àôøé÷àðñ /cs=ö'ëéú /da=ãðéú /de=âøîðéú /en=àðâìéú /eo=àñôøðèå /es=ñôøãéú /fi=ôéðéú /fr=öøôúéú /he=òáøéú /is=àéñìðãéú /it=àéèì÷éú /lv=ìèååéú /no=ðåøáâéú /pt=ôåøèåâæéú /ru=øåñéú /sv=ùååãéú/zh=ñéðéú is: af=afrikanska/cs=tékkneska/da=danska/de=þýska/en=enska/eo=esperanto/es=spænska/fi=finnska/fr=franska/he=hebraska/is=íslenska/it=ítalska/lv=lettneska/nl=hollenska/no=norska/pt=portúgalska/pt-br=Brasil-portúgalska/ru=rússneska/sv=sænska/zh=kínverska it: af=afrikaans/bg=bulgaro/ca=catalano/cs=ceco/da=danese/de=tedesco/en=inglese/eo=esperanto/es=spagnolo/et=estone/fi=finlandese/fr=francese/he=ebraico/is=islandese/it=italiano/lv=lettone/nl=olandese/no=norvegese/pl=polacco/pt=portoghese/pt-br=portoghese-brasiliano/ru=russo/sl=sloveno/sv=svedese/zh=cinese lv: cs=Èehu/da=Dâòu/de=Vâcu/en=Angïu/eo=Esperanto/es=Spâòu/fi=Somu/fr=Franèu/he=Ebreju/is=Islandieðû/it=Itâïu/lv=Latvieðu/nl=Holandieðu/no=Norvçìu/pt=Portugâïu/pt-br=Brasil-Portugâïu/ru=Krievu/sv=Zviedru/zh=Íînieðu nl: af=Afrikaans/cs=Tsjechisch/da=Deens/de=Duits/en=Engels/eo=Esperanto/es=Spaans/fi=Fins/fr=Frans/he=Hebreeuws/is=IJslands/it=Italiaans/lv=Litouws/nl=Nederlands/no=Noors/pt=Portugees/pt-br=Brasil-Portugees/ru=Russisch/sv=Zweeds/zh=Chinees no: af=afrikaans/bg=bulgarsk/ca=katalansk/cs=tjekkisk/da=dansk/de=tysk/en=engelsk/eo=esperanto/es=spansk/et=estisk/fi=finsk/fr=fransk/he=hebraisk/is=islandsk/it=italiensk/lv=litauisk/nl=hollandsk/no=norsk/pl=polsk/pt=portugisisk/pt-br=Brasil-portugisisk/ru=russisk/sl=slovensk/sv=svensk/zh=kinesisk pl: af=afrikaans/bg=bu³garski/ca=kataloñski/cs=czeski/da=duñski/de=niemiecki/en=angielski/eo=esperanto/es=hiszpañski/et=estoñski/fi=fiñski/fr=francuski/he=hebrajski/is=islandzki/it=w³oski/lv=³otewski/nl=niderlandzki/no=norweski/pl=polski/pt=portugalski/pt-br=portugalski (Brazylia)/ru=rosyjski/sv=szwedzki/zh=chiñski pt: af=Afrikaans/ca=Catalã/cs=Checo/da=Dinamarquês/de=Alemão/en=Inglês/eo=Esperanto/es=Espanhol/et=Estoniano/fi=Finlandês/fr=Francês/he=Hebreu/is=Islandês/it=Italiano/lv=Lituano/nl=Holandês/no=Norueguês/pl=Polonês/pt=Português/pt-br=Português-do-Brasil/ru=Russo/sv=Sueco/zh=Chinês pt-br: af=Afrikaner/ca=Catalão/cs=Checo/da=Dinamarquês/de=Alemão/en=Inglês/eo=Esperanto/es=Espanhol/et=Estoniano/fi=Finlandês/fr=Francês/he=Hebreu/is=Islandês/it=Italiano/lv=Lituano/nl=Holandês/no=Norueguês/pl=Polonês/pt=Português/pt-br=Português-do-Brasil/ru=Russo/sv=Sueco/zh=Chinês ro: af=africaans/ca=catalana/cs=checha/da=daneza/de=germana/en=engleza/eo=esperanto/es=spaniola/fi=finlandeza/fr=franceza/he=evreiasca/is=islandeza/it=italiana/nl=olandeza/no=norvegiana/pl=poloneza/pt=potugeza/pt-br=portugeza-in-brazilia/ro=romaneste/ru=rusa/sv=suedeza/zh=chineza ru: af=àôðèêàíñêèé/bg=áîëãàðñêèé/ca=êàòàëàíñêèé/cs=÷åøñêèé/da=äàòñêèé/de=íåìåöêèé/en=àíãëèéñêèé/eo=ýñïåðàíòî/es=èñïàíñêèé/et=ýñòîíñêèé/fi=ôèíñêèé/fr=ôðàíöóçñêèé/he=èâðèò/is=èñëàíäñêèé/it=èòàëüÿíñêèé/lv=ëàòûøñêèé/nl=ãîëëàíäñêèé/no=íîðâåæñêèé/pl=ïîëüñêèé/pt=ïîðòóãàëüñêèé/pt-br=áðàçèëüñêî-ïîðòóãàëüñêèé/ru=ðóññêèé/sl=ñëàâÿíñêèé/sv=øâåäñêèé/zh=êèòàéñêèé sl: af=afrikaan¹èina/ca=katalon¹èina/cs=èe¹èina/da=dan¹èina/de=nem¹èina/en=angle¹èina/eo=esperanto/es=¹pan¹èina/et=eston¹èina/fi=fin¹èina/fr=franco¹èina/he=hebrej¹èina/is=island¹èina/it=italijan¹èina/lv=litvan¹èina/nl=nizozem¹èina/no=norve¹èina/pl=polj¹èina/pt=portugal¹èina/pt-br=brazilska-portugal¹èina/ru=ru¹èina/sl=sloven¹èina/sv=¹ved¹èina/zh=kitaj¹èina sv: af=afrikaans/bg=bulgariska/ca=katalanska/cs=tjeckiska/da=danska/de=tyska/en=engelska/eo=esperanto/es=spanska/et=estniska/fi=finska/fr=franska/he=hebreiska/is=isländska/it=italienska/lv=litauiska/nl=holländska/no=norska/pl=polska/pt=portugisiska/pt-br=brasiliansk-portugisiska/ro=rumänska/ru=ryska/sl=slovenska/sv=svenska/zh=kinesiska cancel en: Cancel fr: Annuler it: Annullare nl: annuleer error de: Fehler en: Error es: Error fr: Erreur it: Errore lv: Kïûda nl: Fout sv: Fel text/link/vlink en: text/link/vlink es: texto/enlace/visitado fr: texte/lien/visité it: testo/link/visitato nl: tekst/connectie/bezocht yes/no de: Ja/Nein en: Yes/No es: Si/No fr: oui/non it: Si/No lv: Yes/Nç nl: ja/nee sv: Yes/No geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/traces.htm0000660000175200017530000000520412664543647024476 0ustar guillaumeguillaume [ de: Trace-Ausgabe des letzten Kommandos en: Trace of the latest command es: Trazas del último comando fi: Edelliset komennot fr: Traces de la dernière commande it: Traccia dell'ultimo comando lv: Pçdçjâs komandas izpildes pçdas sv: Utskriften från det senaste kommandot lv: Pçdçjâs komandas izpildes pçdas ]

    [ de: Trace-Ausgabe des letzten Kommandos en: Traces of the latest command es: Trazas del último comando fi: Edelliset komennot fr: Traces de la dernière commande it: Traccia dell'ultimo comando lv: Pçdçjâs komandas izpildes pçdas sv: Utskriften från det senaste kommandot lv: Pçdçjâs komandas izpildes pçdas ]


    [ de: Hier ist der Inhalt der Datei "comm.log": en: Here is the contents of the file "comm.log": es: He aquí el contenido del fichero "comm.log": fi: Tässä tiedoston "comm.log" sisältö: fr: Voici le contenu du fichier "comm.log": it: Ecco il contenuto del file "comm.log" lv: Ðeit ir datnes "comm.log" saturs: sv: Här är innehållet i filen "comm.log": lv: Ðeit ir datnes "comm.log" saturs: ]

    %g{- [
    de: empty file
    en: empty file
    es: fichero vacio
    fi: tyhjä tiedosto
    fr: fichier vide
    it: file vuoto
    lv: datne ir tukða
    sv: tom fil
    lv: datne ir tukða
    ] -}
    
    [ de: Zurück zum Hauptmenü. en: You can return to the main menu. es: Ud puede regresar al menú principal. fi: Voit palata takaisin päävalikkoon. fr: Vous pouvez revenir au menu principal. it: Potete tornare al menu principale. lv: Jûs variet atgriezties galvenajâ izvçlnç. sv: Du kan återvända till huvudmenyn. ] geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/rename.htm0000660000175200017530000000434312664543647024467 0ustar guillaumeguillaume [ de: Datenbank umbenennen en: Renaming es: Cambio de nombre fr: Renommage it: Cambio di nome lv: Pârsaukðana sv: Döpa om ]

    [ de: Datenbank umbenennen en: Renaming es: Cambio de nombre fr: Renommage it: Cambio di nome lv: Pârsaukðana sv: Döpa om ]

    [ de: Ändere die Namen wie gewünscht: en: Change the names you want: es: Chambie el o los nombres que Ud. desee: fr: Changez le ou les noms que vous désirez: it: Cambiate il o i nomi che volete: lv: Izvçlieties nosaukumus, kurus Jûs vçlaties mainît: sv: Ändra de namn du vill: ]

    %b{ | }
    %a
    - [ de: keine Datenbank vorhanden en: there is no database at present es: ninguna base de datos existe actualmente fr: il n'y a aucune base de données actuellement it: attualmente non esiste nessuna base di dati lv: nav nevienas datu bâzes sv: det finns ingen databas för tillfället ]

    [ de: Dann drücke diesen Knopf: en: Then push this button: es: Apoye luego en este botón fr: Puis appuyez sur ce bouton: it: Poi cliccate su questo bottone: lv: Beigâs nospiediet sekojoðo podziòu: sv: Tryck sedan på denna knapp: ]

    geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/delete.htm0000660000175200017530000000572412664543647024466 0ustar guillaumeguillaume [ de: Datenbanken löschen en: Delete es: Supresión fi: Poista fr: Suppression it: Soppressione lv: Dzçst sv: Radera ]

    [ de: Datenbanken löschen en: Deletion of databases es: Supresión de bases de datos fi: Tietokantojen poistaminen fr: Suppression de bases de données it: Soppressione di basi di dati lv: Datu bâþu dzçðana sv: Radering av databaser ]

    [ de: Wähle die Datenbanken, die du löschen möchtest, mit dem zugehörigen Schalter. en: Select the database or databases you want to delete, by clicking on the associated buttons. es: Seleccione la o las bases que Ud desea destruir cliqueando en el, o los, botones asociados: fi: Valitse tietokanta tai tietokannat jotka haluat poistaa, klikkaamalla sille kuuluvaa nappia. fr: Sélectionnez la ou les bases que vous voulez détruire en cliquant sur le ou les boutons associés: it: Selezionate la o le basi di dati che volete sopprimere cliccando su il o i bottoni associati: lv: Iezîmçjiet datu bâzi vai datu bâzes, kuras Jûs vçlaties dzçst. sv: Välj den databas eller de databaser du vill radera, genom att klicka på motsvarande knappar. ]

    %b{ | }
    %a
    - [ de: keine Datenbank vorhanden en: there is no database at present es: actualmente no existe ninguna base de datos fi: ei tietokantaa saatavilla fr: il n'y a aucune base de données actuellement it: attualmente non esiste nessuna base di dati lv: patreiz nav nevienas datubâzes sv: det finns ingen databas för tillfället ]

    [ de: Dann drücke diesen Knopf: en: Then push this button: es: Luego apoye en este botón: fi: Sitten paina tätä nappia: fr: Puis appuyez sur ce bouton: it: Poi cliccate su questo bottone: lv: Tad nospiediet ðo podziòu: sv: Tryck sedan på denna knapp: ]

    geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/err_reco.htm0000660000175200017530000001632412664543647025022 0ustar guillaumeguillaume [error]

    [error]

    [ de: Das vorangegangene Kommando hat beim Beenden einen Fehler geliefert. Deine Datenbank "%o" wurde möglicherweise nicht angelegt. Du kannst dir seine Trace-Ausgaben ansehen, vielleicht kannst du die Erklärung für das Problem erkennen. en: The previous command exited with an error code. Your database "%o" may have not been created. Look at the traces, maybe you can find an explanation. es: El comando anterior ha terminado con un código de error. Es posible que su base de datos "%o" no haya sido creada. Consulte Ud. las trazas, es posible que allí encuentre Ud. una explicación. fi: Edellinen komento keskeytyi virheeseen. Tietokantaa "%o" ei välttämättä luotu. Katso täältä, jos löytäisit selityksen. fr: La commande précédente s'est terminée avec un code d'erreur. Il se peut que votre base de données "%o" n'ait pas été créée. Regardez dans les traces, peut-être y trouverez-vous une explication. it: Il comando precedente ha generato un codice di errore. Forse la base di dati "%o" non è stata creata. Consultate le tracce, forse vi troverete una spiegazione. lv: Ipriekðâjâ komanda beidza savu darbu ar kïûdas paziòojumu. Jûsu datu bâze iespçjams nav izveidota. Skatiet komandas darbîbas pçdas, iespçjams, ka varçsiet rast izskaidrojumu. sv: Föregående kommando avslutades med en felkod. Din databas "%o" kanske inte har skapats. Titta på utskriften, kanske kan du finna en förklaring. ]

    [ de: Möglicherweise kommst du von einer zu alten GeneWeb-Version. In diesem Fall solltest du es nochmal versuchen, wobei du die Option "GEDCOM-Datei verwenden" auswählen solltest (du kannst auch mit dem "zurück"-Knopf deines Browsers auf die Seite zurückgehen um das zu machen). en: You may have come from a too old version of GeneWeb. In this case, try again to do the transfer using the option to "pass by a GEDCOM file" (you can also go back to the previous screen to do it). es: Es posible que Ud. haya comenzado con una versión muy antigüa de GeneWeb. En ese caso, trate de nuevo de efectuar la transferencia utilizando la opción "pasar por un fichero GEDCOM". fi: Olet saattanut tulla vanhemmasta GeneWeb versiosta. Tässä tapauksessa kokeile uudestaan siirtoa käyttäen asetusta "GEDCOM tiedostona" (voit palata edelliselle sivulle). fr: Il se peut que vous soyez parti d'une trop ancienne version de GeneWeb. Dans ce cas, réessayez de faire le transfert en mettant l'option de "passer par un fichier GEDCOM". it: Forse siete partiti da una troppo vecchia versione di GeneWeb. In questo caso riprovate a fare il trasferimento aggiungendo l'opzione "passare per un file GEDCOM". lv: Iespçjams Jûsu dati nâk no pârâk vecas GeneWeb versijas. Tâdâ gadîjumâ mçìiniet vçlreiz veikt pârveidoðanu, lietojot iespçju "izmantojot GEDCOM datni" (to Jûs arî variet izdarît aizejot atpakï uz ieprieksçjo lapu). sv: Du kanske har gått från en alltför gammal version av GeneWeb. I det fallet, försök igen för att göra överföringen med optionen "genom en GEDCOM-fil". ]

    [ de: Falls du aber genau das schon versucht hast, und es immer noch nicht besser geklappt hat, solltest du den GeneWeb-Autor um Hilfe bitten. Sende ihm die Trace-Ausgaben des Kommandos. en: If you were already doing that, and it does not work better, ask the creator of the GeneWeb program. Send him the traces of the command. es: Si es justamente eso que Ud. viene de efectuar y que eso no resuelve el problema; pida consejo al creador del programa GeneWeb. Enviele las trazas del comando. fi: Jos teit sen jo eikä se toimi paremmin, kysy neuvoa GeneWeb tekijältä. Lähetä hänelle lista tehdyistä komennon jäljistä. fr: Si c'est précisément ce que vous venez de faire et que ça ne marche donc pas, demandez conseil au créateur du programme GeneWeb en lui envoyant les traces de la commande. it: Se è esattamente ciò che avete appena fatto, e non ha funzionato, domandate consiglio al creatore del programma GeneWeb inviandogli la traccia del comando. lv: Ja Jûs to jau esiet izmçìinâjis un tas nelîdzçja, jautâjiet GeneWeb programmas autoram. Nosûtiet viòam arî programas darbîbas pçdas. sv: Om du redan har gjort det och det inte fungerade bättre, fråga GeneWebs upphovsman. Sänd honom utskrifterna från kommandona. ]

    [ de: Zurück zum Hauptmenü. en: You can return to the main menu. es: Ud. puede regresar al menú principal. fi: Voit palata päävalikkoon. fr: Vous pouvez revenir au menu principal. it: Potete tornare al menu principale. lv: Jûs variet atgriezties galvenajâ izvçlnç. sv: Du kan återvända till huvudmenyn. ] geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/recover1.htm0000660000175200017530000001227612664543647024752 0ustar guillaumeguillaume [ de: Eine bestehende Datenbank übernehmen - Phase 2 en: Recover a database - Phase 2 es: Recuperar una base - Fase 2 fr: Récupérer une base - Phase 2 it: Recuperare una base - Fase 2 lv: Datu bâzes atjauninâðana - 2. fâze sv: Återskapa en databas - fas 2 ]

    [ de: Eine bestehende Datenbank übernehmen en: Recover a database es: Recuperar una base fr: Récupérer une base it: Recuperare una base lv: Datu bâzes atjauninâðana - 2. fâze sv: Återskapa en databas ]


    [ de: Verzeichnis en: Directory es: Carpeta: fr: Répertoire: it: Directory: lv: Katalogs sv: Katalog ]

      %a
    
    [ de: Wähle die Datenbank, die du übernehmen möchtest: en: Select the database you want to recover: es: Seleccione Ud. la base que desea recuperar: fr: Sélectionnez la base que vous voulez récupérer: it: Selezionate la base che volete recuperare: lv: Izvçlieties datu bâzi, kuru jûs vçlaties atjauninât: sv: Välj den databas du vill återskapa: ]

    %y{| }
    %a
    - [ de: keine Datenbanken in diesem Verzeichnis gefunden en: there is no databases in this directory es: ninguna base de datos existe en esta carpeta fr: il n'y a aucune base de données dans ce répertoire it: in questa directory non esiste nessuna base di dati lv: ðinî katalogâ nav nevienas datu bâzes sv: det finns inga databaser i denna katalog ]

    [ de: Gib den Namen an, den du deiner Datenbank geben möchtest. Wenn du nichts angibst, bekommt sie den gleichen Namen wie die alte Datenbank. en: Write the name you want to give to your database. By default, it will be the same in the new directory. es: Indique Ud. el nombre que Ud. desea dar a su base de datos. Por defecto; será el mismo en la nueva carpeta. fr: Indiquez le nom que vous voulez donner à votre base de données. Par défaut, ce sera le même dans le nouveau répertoire. it: Indicate il nome che volete dare alla vostra base di dati. Per difetto, sarà lo stesso nella nuova directory. lv: Ierakstiet datu bâzes nosaukumu, kâdâ vçlaties to nosaukt. Pçc noklusçjuma tas bûs tâds pats, kâ jaunais katalogs. sv: Skriv in namnet du vill kalla din databas. Skriver du ingenting kommer den att heta samma i den nya katalogen. ]

    [ de: Wenn gewünscht, wähle die folgende Option: en: You can select an option: es: Ud. puede seleccionar una opción: fr: Vous pouvez sélectionner une option: it: Potete selezionare una opzione: lv: Jûs variet izvçlçties arî iespçju: sv: Du kan välja en option: ]

    es: Pasar por un fichero GEDCOM. A priori, no es aconsejable, pero si esto no funciona con el procedimiento normal, ensaye con esta opción. fr: Passer par un fichier GEDCOM. A priori, c'est déconseillé, mais si ça ne fonctionne pas avec la procédure normale, essayez cette option. it: Passare per un file GEDCOM. A priori è un'operazione sconsigliata ma se non ottenete risultati usando la procedura normale, provate questa opzione. lv: Atjaunot caur GEDCOM datni. Vispâr tas nav ieteicams, bet ja parastajâ variantâ atjauninâðana neizdodas, tad izmçìiniet ðo iespçju. sv: Gå genom en GEDCOM-fil. Det är inte rekommenderat, men om det inte fungerar med den normala proceduren, försök med detta. ]
        [ de: Mittels GEDCOM-Datei übernehmen. A priori wird dies nicht empfohlen, jedoch solltest du diese Variante versuchen, wenn die normale Übernahme nicht funktioniert. en: Pass by a GEDCOM file. A priori, it is not recommended, but if it does not work with the normal procedure, try this option.

    [ de: Dann drücke diesen Knopf: en: Then push this button: es: Apoye luego en este botón: fr: Puis appuyez sur ce bouton: it: Poi cliccate su questo bottone: lv: Beigâs nospiediet ðo podziòu: sv: Tryck sedan på denna knapp: ]

    geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/gwf_ok.htm0000660000175200017530000001067612664543647024502 0ustar guillaumeguillaume [ de: Parameter geändert en: Parameters updated es: Parámetros de actualización fr: Paramètres mis-à-jour it: Parametri di aggiornamento lv: Parametri ir mainîti sv: Parametrar uppdaterade ]

    [ de: Parameter geändert en: Parameters updated es: Parámetros de actualización fr: Paramètres mis à jour it: Parametri di aggiornamento lv: Parametri ir mainîti sv: Parametrar uppdaterade ]

    [ de: Hier kannst du deine Parameteränderung ausprobieren: en: Here is an access to your database in order to test your parameters changing: es: He aquí un acceso a su base para probar los cambios de parámetros. fr: Voici un accès à votre base pour tester vos changements de paramètres. it: Ecco un accesso alla vostra base per testare le modifiche dei parametri. lv: Ðeit Jûs variet piekïût savai datu bâzei, lai pârbaudîtu, kâ izskatâs Jûsu datu bâze ar jauniem parametriem: sv: Här är en åtkomst till din databas för att testa dina parametrar: ]

    [ de: Zu deiner Information: en: For information: es: Por información: fr: Pour information: it: Per informazione: lv: Informâcijai: sv: För information: ]

    • [ de: Die Parameter sind in der Textdatei "%a.gwf" im Verzeichnis "%w". en: The parameters are recorded in the text file "%a.gwf" in the directory "%w". es: Los parámetros son registrados en el fichero texto "%a.gwf" en la carpeta "%w". fr: Les paramètres sont enregistrés dans le fichier texte "%a.gwf" dans le répertoire "%w". it: I parametri sono stati registrati nel file testo "%a.gwf" nella directory "%w". lv: Ðie parametri ir ierakstîti teksta datnç "%a.gwf" katalogâ "%w". sv: Parametrarna har sparats i textfilen "%a.gwf" i katalogen "%w". ]
    • [ de: Falls du einen Text angegeben hast, der am Fuß der Seiten angezeigt werden soll, wurde er in der Datei "%a.trl" im Unterverzeichnis "lang" des Verzeichnisses "%w" gespeichert. en: If you gave a text to put in the bottom of the pages, this text is recorded in the file named "%a.trl" in the subdirectory "lang" of the directory "%w". es: Si Ud. ha escogido la opción de agregar un texto en la parte inferior de las páginas, este texto es registrado en el fichero denominado "%a.trl" en la sub-carpeta "lang" de la carpeta "%w". fr: Si vous avez donné un texte à mettre au bas des pages, ce texte est enregistré dans la fichier de nom "%a.trl" dans le sous-répertoire "lang" du répertoire "%w". it: Se avete scelto l'opzione di aggiungere un testo in piede di pagina, questo testo è registrato nel file chiamato "%a.trl" nella sub-directory "lang" della directory "%w". lv: Ja Jûs norâdîjât arî katras lappuses noslçguma tekstu, tad ðis teksts ir ierakstîts datnç "%a.trl" kataloga "%w" apakðkatalogâ "lang". sv: Om du angav en text som ska stå längst ner på sidan, har denna text sparats i filen benämnd "%a.trl" i underkatalogen "lang" för katalogen "%w". ]

    [ de: Zurück zum Hauptmenü. en: You can return to the main menu. es: Ud. puede regresar al menú principal. fr: Vous pouvez revenir au menu principal. it: Potete tornare al menu principale. lv: Jûs variet atgriezties galvenajâ izvçlnç. sv: Du kan återvända till huvudmenyn. ] geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/bso_ok.htm0000660000175200017530000001211312664543647024466 0ustar guillaumeguillaume [ de: Datenbank angelegt en: Database created es: Base de datos creada fi: Tietokanta luotu fr: Généalogie créée it: Base di dati creata lv: Datu bâze izveidota sv: Databasen skapad ]

    [ de: Datenbank angelegt en: Database created es: Base de datos creada fi: Tietokanta luotu fr: Généalogie créée it: Base di dati creata lv: Datu bâze izveidota sv: Databasen skapad ]

    [ de: Die Operation ist beendet. Deine Datenbank namens "%o" wurde angelegt. en: Done. The operation is terminated. Your database named "%o" is created. es: Muy bien. La operación a terminado. Su base de datos de nombre "%o" ha sido creada. fi: Valmis. Toiminto on lopetettu. Tietokanta nimeltä "%0" on luotu. fr: L'opération est terminée: votre généalogie "%o" est créée. it: L'operazione è terminata. La vostra base di dati "%o" è stata creata. lv: Darîts. Datu bâzes izveidoðana ir pabeigta. Jûsu datu bâze "%o" ir izveidota. sv: Operationen är avklarad. Din databas benämnd "%o" är skapad. ]

    [ de: Um mit der Datenbank zu arbeiten und Änderungen daran vornehmen zu können, muß der gwd-Dienst gestartet sein. en: To consult your database, and possibly modify it, the gwd service must have been launched. es: Para consultarla y eventualmente modificarla, es necesario que el servicio gwd haya sido lanzado. fi: Lukieksasi tietokantaa ja muokataksesi sitä, gwd palvelun pitää olla päällä. fr: Pour la consulter et éventuellement la modifier, assurez-vous que gwd soit ouvert. it: Per consultarla ed eventualmente modificarla, bisogna che il service gwd sia attivo. lv: Lai darbotos ar Jûsu datubâzi, jâpalaiþ gwd serviss. sv: För att konsultera din databas och möjligen modifiera den, måste gwd servicen startas. ]

    [ de: Sofern dies der Fall ist, probiere die unten angegebene Adresse aus. Die angezeigte Seite ist die "Willkommensseite" deiner Datenbank. Setze ein Lesezeichen auf diese Seite. en: If it is, try the address below. The displayed page is called "welcome page" of your database. Bookmark it. es: Si tal es el caso, ensaye la dirección indicada a continuación. La página mostrada se llama la "Página de Recepción" de su base de datos. Agrégela a sus registros favoritos. fi: Jos se on tämä, kokeile osoitetta alapuolella. Näytettävää sivua kutsutaan tietokannan "tervetuloa" sivuksi. Lisää kirjainmerkki (bookmark). fr: Vous pourrez ensuite accéder à votre généalogie en suivant le lien ce-dessous. Vous pouvez l'ajouter aux signets de votre navigateur. it: Se gwd è attivo, provate con l'indirizzo qui sotto. La pagina visualizzata è la "pagina di benvenuto" della vostra base di dati. Mettetela tra i vostri bookmarks. lv: Ja tas jau darbojas mçìiniet uzklikðíinât uz saites, kas atrodas zemâk. Parâdîsies jûsu datu bâzes t.s. "sveicinâjuma lapa". Pierakstiet tâs adresi. sv: Om den är det, försök med adressen nedan. Den visade sidan kallas "välkomstsidan" för din databas. Lägg till den till dina Favoriter/Bokmärken. ]

    [ de: Zurück zum Hauptmenü. en: You can also return to the main menu. es: Ud puede también regresar al menú principal. fi: Tai voit palata päävalikkoon. fr: Vous pouvez aussi revenir au menu principal. it: Potete anche tornare al menu principale. lv: Jûs variet arî atgriezties galvenajâ izvçlnç . sv: Du kan också återvända till huvudmenyn. ] geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/bsi_err.htm0000660000175200017530000000634112664543647024645 0ustar guillaumeguillaume [error]

    [error]

    [ de: Das Kommando "%d" hat beim Beenden einen Fehler geliefert. Die Operation wurde möglicherweise nicht durchgeführt. en: The command "%d" exited with an error code. This operation may have not been done. es: El comado "%d" ha terminado con un código de error. Es posible que esta operación no haya podido efectuarse. fi: Komento "%d" keskeytyi virheeseen. Toimintoa ei välttämättä viety loppuun asti. fr: La commande "%d" s'est terminée avec un code d'erreur. Il se peut que cette opération n'ait pas pu être faite. it: Il comando "%d"si è terminato con un codice d'errore. Forse l'operazione non è stata portata a termine. lv: Komanda "%d" beidza savu adrbu ar kïudas kodue. Iespçjams, ka ðî darbîba nav veikta. sv: Kommandot "%d" avslutades med en felkod. Operationen kanske inte har blivit utförd. ]

    [ de: Hier sind die Trace-Ausgaben des Kommandos, vielleicht kannst du die Erklärung für das Problem erkennen: en: Here are the traces of the command, maybe you can find an explanation: es: Los indicios dejados por el comando son las siguientes, pueda ser que Ud. encuentre allí una explicación: fi: Tässä on komennon jäljitys, ehkä löydät selityksen: fr: Voici les traces de la commande, peut-être y trouverez-vous une explication: it: Ecco le tracce del comando; forse vi troverete una spiegazione: lv: Ðeit ir programmas darbîbas pçdas, iespçjams, ka Jûs varat atrast izskaidrojumu: sv: Här är utskriften från kommandot, kanske du kan finna en förklaring: ]

    %g{- [
    de: no traces
    en: no traces
    es: ningún indicio
    fi: ei jälkiä
    fr: pas de traces
    it: nessuna traccia
    lv: no traces
    sv: ingen utskrift
    ] -}
    

    [ de: Zurück zum Hauptmenü. en: Or you can return to the main menu. es: Si no Ud. puede regresar al menú principal. fi: Tai voit palata päävalikkoon. fr: Ou vous pouvez revenir au menu principal. it: Potete tornare al menu principale. lv: Vai Jûs varat atgriezties uz galveno izvçlni. sv: Eller du kan återvända till huvudmenyn. ] geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/gwb2ged.htm0000660000175200017530000002124612664543647024542 0ustar guillaumeguillaume [ de: GEDCOM-Datei extrahieren en: Extract a GEDCOM file es: Extracción de un fichero GEDCOM fi: Vie GEDCOM tiedosto fr: Extraction d'un fichier GEDCOM it: Estrazione di un file GEDCOM lv: Izveidot GEDCOM datni sv: Exportera en GEDCOM-fil ]

    [ de: GEDCOM-Datei extrahieren en: Extract a GEDCOM file es: Extracción de un fichero GEDCOM fi: Vie GEDCOM tiedosto fr: Extraction d'un fichier GEDCOM it: Estrazione di un file GEDCOM lv: Izveidot GEDCOM datni sv: Exportera en GEDCOM-fil ]

    [ de: Wähle deine Datenbank: en: Select your database: es: Seleccione Ud. su base de datos : fi: Valitse tietokanta: fr: Sélectionnez votre base de données: it: Selezionate la vostra base di dati: lv: Izvçlieties datu bâzi: sv: Välj din databas: ]

    %b{| }
        %a
    - [ de: keine Datenbank vorhanden en: there is no database at present es: actualmente ninguna base de datos existente fi: ei tietokantaa saatavilla fr: il n'y a aucune base de données actuellement it: attualmente non esiste nessuna base di dati lv: nav nevienas datu bâzes sv: det finns ingen databas för tillfället ]

    [ de: Gib den Namen ein, den du deiner GEDCOM-Datei geben möchtest. Falls du nichts eingibst, verwenden wir den Namen deiner Datenbank, gefolgt von der Endung en: Enter the name you want to give to your GEDCOM file. If you write nothing, it will be the name of the database ended by the suffix es: Entre Ud el nombre que desea dar a su fichero GEDCOM. Si Ud no mete nada, el nombre utilizado será el nombre de la base seguida del sufijo fi: Kirjoita nimi jonka haluat antaa GEDCOM tiedostolle. Jos et kirjoita mitään, tiedoston nimi on tyhjä ja päättyy sanaan fr: Entrez le nom que vous voulez donner à votre fichier GEDCOM. Si vous ne mettez rien, ce sera le nom de la base suivi du suffixe it: Digitate il nome che volete attribuire al vostro file GEDCOM. Se non mettete niente, il nome utilizzato sarà quello della base seguito dal suffisso lv: Ierakstiet Jûsu izvçlçto GEDCOM datnes nosaukumu. Ja Jûs to neierakstîsiet datne tiks nosaukta tâdâ paðâ vârdâ, kâ datu bâze ar paplaðinâjumu sv: Skriv namnet du vill kalla din GEDCOM-fil. Om du inte skriver någonting, kommer det att bli samma namn som databasen avslutat med ] ".ged".

    [ de: Wähle die gewünschten Optionen: en: Select the options you want: es: Seleccione Ud. las opciones deseadas: fi: Valitse asetukset jotka haluat: fr: Sélectionnez les options que vous désirez: if: Selezionate le opzioni desiderate: lv: Ivçlçties nepiecieðamos izveides parametrus: sv: Välj de optioner du vill ha: ]

        [ de: Kodiere die Zeichen in ASCII. en: Encode the characters in ASCII. es: Codificar los carácteres en ASCII. fi: Koodaa merkit ASCII muodossa. fr: Coder les caractères en ASCII. it: Codificare i caratteri in ASCII. lv: Burti ASCII kodçjumâ. sv: Koda tecknen i ASCII. ]
        [ de: Kodiere die Zeichen in ANSEL. en: Encode the characters in ANSEL. es: Codificar los carácteres en ANSEL. fr: Coder les caractères en ANSEL. it: Codificare i caratteri in ANSEL. lv: Burti ANSEL kodçjumâ. sv: Koda tecknen i ANSEL. ]
        [ de: Während der Operation sparsam mit dem Speicher umgehen (ist aber langsamer). en: Save the memory space during the operation (but it will be slower). es: Economizar el espacio-memoria durante la operación (pero esta sera mas lenta). fr: Économiser l'espace mémoire pendant l'opération (mais ce sera plus lent). it: Economizzare lo spazio-memoria durante l'operazione (che però sarà più lenta) lv: Darbîbas laikâ taupît operatîvo atmiòu (darbîba notiks lçnâk). sv: Spara minne under operationen (men det kommer att gå saktare). ]
    [ de: en: es: fr: it: lv: sv: ]
      [ de: Nur die Vorfahren auswählen von... en: Extract only the ancestors of... es: Extraer solamente los antepasados de... fr: N'extraire que les ancêtres de... it: Estrarre solamente gli antenati di... lv: Izmantot tikai... sv: Exportera endast anorna till... ]
    [ de: Vorname en: First name es: Nombre fr: Prénom it: Nome lv: Vârds sv: Förnamn ] N[ de: r en: um es: úm fr: um it: umero lv: r sv: ummer ]
    [ de: Nachname en: Surname es: Apellido fr: Nom it: Cognome lv: Uzvârds sv: Efternamn ]
     ...vecâkus
     [ de: Nur die Nachkommen auswählen von... en: Extract only the descendants of... es: Extraer solamente los descendientes de... fr: N'extraire que les descendants de... it: Estrarre solamente i discendenti di... lv: Izmantot tikai... ]
    [ de: Vorname en: First name es: Nombre fr: Prénom it: Nome lv: Vârds ] [ de: Nr en: Num es: Núm fr: Num it: Numero lv: Nr ]
    [ de: Nachname en: Surname es: Apellido fr: Nom it: Cognome lv: Uzvârds ]
    [ de: Falls du oben beide Optionen gewählt hast, wird die Schnittmenge extrahiert: Alle Personen die gleichzeitig Vorfahren des einen und Nachkommen des anderen sind. en: If you use both above options, the intersection is assumed: persons at the same time ancestors of the one and descendants of the other. es: Si Ud. utiliza las dos opciones indicadas más arriba, la intercepción de estas será la que contará: personas al mismo tiempo antepasados del uno y descendientes del otro. fr: Si vous utilisez les deux options ci-dessus, c'est l'intersection qui comptera: personnes à la fois ancêtres de l'un et descendants de l'autre. it: Se utilizzate insieme le due opzioni precedenti, è l'intersezione che sarà presa in considerazione; ossia le persone al tempo stesso antenati dell'uno e discendenti dell'altro. lv: Ja Jûs lietosiet abus iepriekðçjos parametrus, tiek izmantota pârklâðanâs: t.i. personas, kas vienlaicîgi ir vienam senèi un otram pçcteèi. sv: Om du väljer de båda valen ovan, kommer överlappning att antas: personer som samtidigt är anor av den ena och ättlingar av den andra. ]

    [ de: Dann drücke diesen Knopf: en: Then push this button: es: Finalmente apoye en el botón: fr: Puis appuyez sur ce bouton: it: Poi cliccate su questo bottone: lv: Tad nospiediet ðo podziòu: sv: Tryck sedan på denna knapp: ]

    geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/main.htm0000660000175200017530000003500612664543647024144 0ustar guillaumeguillaume Gwsetup - [ de: Hauptmenü en: Main menu es: Menú principal fi: Päävalikko fr: Menu principal it: Menu principale lv: Galvenâ izvçlne sv: Huvudmeny ]

    Gwsetup - [ de: Hauptmenü en: Main menu es: Menú principal fi: Päävalikko fr: Menu principal it: Menu principale lv: Galvenâ izvçlne sv: Huvudmeny ]

    [ de: Betrachte... en: Consult... es: Consultar... fi: Konsultoi... fr: Consulter... it: Consultare... lv: Darboties ar... sv: Konsultera... ]

    [ de: Lege eine Datenbank an... en: Create a database... es: Crear una base de datos... fi: Luo tietokanta... fr: Créer une base de données... it: Creare una base di dati... lv: Izveidot datu bâzi... sv: Skapa en databas... ]

    [ de: Extrahiere aus einer Datenbank... en: Extract from a database... es: Extraer de una base de datos... fi: Pura tietokannasta... fr: Extraire d'une base de données... it: Estrarre da una base di dati... lv: Izveidot no datu bâzes... sv: Exportera från en databas... ]

    [ de: Funktion auf eine Datenbank anwenden.... en: Apply on a database... es: Aplicar a una base de datos... fi: Hyväksy tietokantaan... fr: Appliquer sur une base de données... it: Applicare su una base di dati... lv: Veikt sekojoðas darbîbas ar datu bâzi... sv: Applicera på en databas... ]

    [ de: Konfiguriere... en: Configure... es: Configurar... fi: Konfiguroi... fr: Configurer... it: Configurare... lv: Mainît... sv: Konfigurera... ]


    [ de: ... oder gehe zurück auf die Installations-Startseite. en: ... or go back to the welcome page of "gwsetup" es: ... o regresar a la página de recepción del "gwsetup" fi: ... tai mene takaisin "gwsetup" -ohjelman tervetuloa sivulle fr: ... ou revenir à la page d'accueil de "gwsetup" it: ... o tornare alla pagina di benvenuto di "gwsetup" lv: ... vai atgriezties uz "gwsetup" sâkumlapu sv: ... eller gå tillbaka till välkomstsidan för "gwsetup" ]
    [ de: ... oder schaue in die vollständige GeneWeb-Dokumentation en: ... or consult the complete documentation of GeneWeb es: ... o consultar la documentación completa de GeneWeb fi: ... tai konsultoi GeneWeb dokumentaatiota fr: ... ou consulter la documentation complète de GeneWeb. it: ... o consultare la documentazione completa di GeneWeb. lv: ... vai skatît GeneWeb aprakstu sv: ... eller läs dokumentationen för GeneWeb ] geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/simple.htm0000660000175200017530000000407612664543647024514 0ustar guillaumeguillaume [ de: Einfache Methode en: Simple method es: Método simple fi: Yksinkertainen tapa fr: Méthode simple it: Metodo semplice lv: Vienkârðâ metode sv: Enkel metod ]

    [ de: Einfache Methode en: Simple method es: Método simple fi: Yksinkertainen tapa fr: Méthode simple it: Metodo semplice lv: Vienkârðâ metode sv: Enkel metod ]

    [ de: Gib den Namen ein, den deine Datenbank tragen soll: en: Write the name you want for your database : es: Escriba aquí el nombre que Ud. desea dar a su base de datos: fi: Anna tietokannan nimi : fr: Indiquez le nom que vous voulez donner à votre base de données : it: Indicate qui il nome che volete attribuire alla vostra base di dati: lv: Ierakstiet datu bâzes nosaukumu, kâdâ Jûs vçlaties lai tas bûtu: sv: Skriv in namnet du vill kalla din databas: ]

    [ de: Dann drücke diesen Knopf: en: Then push this button: es: Apoye luego en este botón: fi: Sitten paina tätä nappia: fr: Puis appuyez sur ce bouton: it: Poi cliccate su questo bottone: lv: Tad nospiediet ðo podziòu: sv: Tryck sedan på knappen: ]

    geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/ren_ok.htm0000660000175200017530000000505612664543647024477 0ustar guillaumeguillaume [ de: Operation durchgeführt en: Operation completed es: Operación terminada fr: Opération terminée it: Operazione terminata lv: Darîts sv: Operationen klar ]

    [ de: Operation durchgeführt en: Operation completed es: Operación terminada fr: Opération terminée it: Operazione terminata lv: Darîts sv: Operationen klar ]


    [ de: Deine Datenbank wurde umbenannt. Hier ist die neue Übersicht: en: Your databases have been renamed. Here is the new list: es: Sus bases de datos han cambiado de nombre. He aquí la nueva lista: fr: Vos bases de données ont été renommées. Voici la nouvelle liste: it: Le vostre basi di dati hanno cambiato nome. Ecco la nuova lista: lv: Jûsu datu bâzes ir pârsauktas. Ðeit ir jaunais datu bâzu saraksts: sv: Dina databaser har blivit omdöpta. Här är den nya listan: ]

      %b{
    • %a|
    • [ de: keine Datenbank vorhanden en: there is no database at present es: actualmente no hay ninguna base de datos fr: il n'y a aucune base de données actuellement it: attualmente non esiste nessuna base di dati lv: nav nevienas datu bâzes sv: det finns ingen databas för tillfället ]}

    [ de: Zurück zum Hauptmenü. en: You can return to the main menu. es: Ud. puede regresar al menú principal. fr: Vous pouvez revenir au menu principal. it: Potete tornare al menu principale. lv: Jûs variet atgriezties galvenajâ izvçlnç. sv: Du kan återvända till huvudmenyn. ] geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/ged2gwb2.htm0000660000175200017530000005134612664543647024630 0ustar guillaumeguillaume [ de: GEDCOM-Datei importieren en: Import a GEDCOM file es: Importación de un fichero GEDCOM fr: Importation d'un fichier GEDCOM it: Importazione di un file GEDCOM lv: GEDCOM datnes imports sv: Importera en GEDCOM-fil ]

    [ de: GEDCOM-Datei importieren en: Import a GEDCOM file es: Importación de un fichero GEDCOM fr: Importation d'un fichier GEDCOM it: Importazione di un file GEDCOM lv: GEDCOM datnes imports sv: Importera en GEDCOM-fil ]

    • [ de: Bitte eingeben vollständiger Name deiner GEDCOM-Datei. en: Select your GEDCOM file: es: Agregue Ud el nombre completo de su fichero GEDCOM. fr: Sélectionnez votre fichier GEDCOM. it: Selezionate il vostro file GEDCOM. lv: Ievadiet pilnu GEDCOM datnes nosaukumu. sv: Skriv det kompletta namnet på din GEDCOM-fil. ]

      %j

    • [ de: Name, den du deiner GeneWeb-Datenbank geben möchtest. Wenn du hier nichts eingibst, wird der Datenbankname aus dem Namen der GEDCOM-Datei abgeleitet. en: Enter The name you want to give to your GeneWeb database. If omitted, it will be deducted from the name of the GEDCOM file. es: El nombre que Ud. desea dar a su base de datos GeneWeb. Si Ud. no mete ningún nombre, él será deducido del nombre del fichero GEDCOM. fr: Entrez le nom que vous voulez donner à votre base de données GeneWeb. Si vous ne mettez rien, il sera déduit du nom du fichier GEDCOM. it: Digitate il nome che volete dare alla vostra base di dati GeneWeb. Se non mettete niente il nome sarà dedotto da quello del file GEDCOM. lv: Nosaukumu kurâ Jûs vçlties nosaukt savu GeneWeb datu bâzi. Ja neierakstîsiet, tad datu bâzes nosaukums tiks veidos no GEDCOM datnes nosaukuma. sv: Namnet du vill kalla din GeneWeb databas. Om namnet utelämnas, kommer det att bli härlätt från GEDCOM-filens namn. ]

    [ de: Sofern gewünscht, wähle bitte aus den folgenden Optionen: en: Select the options you want: es: Seleccione las opciones que Ud. desee : fr: Sélectionnez les options que vous désirez: it: Selezionate le opzioni desiderate: lv: Iezîmçjiet nepiecieðmâs papildus iespçjas: sv: Välj de optioner du vill ha: ]

        [ en: Put untreated GEDCOM tags in notes. fi: Pistä käsittelemättömät GEDCOM merkit lainausmerkkeihin. fr: Sauvegarder les tags GEDCOM non reconnus dans les notes. ]
        [ de: Vornamen in Kleinbuchstaben wandeln, nur Anfangsbuchstaben in groß. en: Convert first names to lowercase letters, with initials in uppercase. es: Forzar los nombres a estar en minúsculas. Meter sus iniciales en mayúsculas. fr: Convertit les prénoms en minuscules, avec leurs initiales en majuscules. it: Convertire i nomi in minuscolo, con le loro iniziali in maiuscolo. lv: Pârveidot personvârdus uz mazajiem burtiem ar pirmajiem lielajiem. sv: Forcera gemena förnamn, bara initialer behålls som versaler. ]
        [ de: Nachnamen in Kleinbuchstaben wandeln, nur Anfangsbuchstaben in groß. Kleinschreibung von Partikeln möglichst beibehalten. en: Convert surnames to lowercase letters, with initials in uppercase. Try to keep lowercase particles. es: Forzar los apellidos a estar en minúsculas. Meter sus iniciales en mayúsculas. Trate de mantener las partículas en minúsculas. fr: Convertit les noms de famille en minuscules, avec leurs initiales en majuscules. Essaye de garder les particules en minuscules. it: Convertire i cognomi in minuscolo, con le loro iniziali in maiuscolo. Cercate di mantenere le particelle in minuscolo. lv: Pârveidot uzvârdus uz mazajiem burtiem ar pirmajiem lielajiem. Mçginât saglabât partikulus ar mazajiem burtiem. sv: Forcera gemena efternamn, bara initialer behålls som versaler. ]
      [ de: Wenn der GEDCOM-Vorname mehrere, durch Kommata getrennte Namen enthält, soll beim Anlegen einer Person der erste dieser Namen der "Vorname" werden, während der vollständige GEDCOM-Vorname als "Vornamen-Alias" eingetragen wird. en: When creating a person, if the GEDCOM first name part holds several names separated by spaces, you can ask that the first of this names becomes the person "first name" and the complete GEDCOM first name part a "first name alias". es: Al crear una persona, si el campo nombre del fichero GEDCOM esta constituido de varios nombres, puede preguntar que el primero de ellos irá en el campo "nombre" y que el nombre completo se transforma en un "alias de nombre". fr: Au moment de la création d'une personne, si la partie prénom dans le GEDCOM est formée de plusieurs noms séparés par des espaces, on peut vouloir que le premier de ces noms aille dans la partie "prénom" et que le prénom complet devient un "prénom alias". it: Al momento della creazione di una persona, se la parte nome nel GEDCOM è formata da più nomi con degli spazi, potete chiedere che il primo di questi nomi vada nella parte "nome" e che il nome completo diventi un "alias di nome" lv: Ja personas vârds GEDCOM datnç satur vairâkus vârdus variet norâdît, lai pirmais no ðiem vârdiem kïûst par personas "pirmo vârdu" un GEDCOMa datnes pilnais vârds kïust par pirmâ vârda "pieòemto vârdu". sv: När man skapar en person, om förnamnen i GEDCOM-filen innehåller flera namn separerade med mellanslag, kan du be att den första av dessa blir en persons "förnamn" och GEDCOM-filens kompletta förnamnsdel blir ett "förnnamns alias". ]
        [ de: Diese Option aktivieren. en: Set this option. es: Poner esta opción. fr: Mettre cette option. it: Scegliere questa opzione. lv: Ieslçgt ðo iespçju sv: Sätt denna option. ]
      [ de: Normalerweise wird beim Anlegen einer Person, deren GEDCOM-Vorname wie ein öffentlicher Name aussieht, d.h. falls er folgendes beinhaltet:
    • Eine Zahl oder eine eine römische Zahl, von der angenommen wird, daß es sich um die Nummer eines Adelstitels handelt (z. B. George V)
    • Eines der Wörter: "der", "den", "die", "el", "le", "la", "the", von dem angenommen wird, daß es sich um den Beginn eines Beinamens handelt (z. B. William der Eroberer)
    dann wird der GEDCOM-Vorname der "Öffentliche Name" der Person und das erste Wort des GEDCOM-Vornamens wird ihr "Vorname". en: By default, when creating a person, if the GEDCOM first name part looks like a public name, i.e. holds:
    • A number or a roman number, supposed to be a number of a nobility title (e.g. George V)
    • One of the words: "der", "den", "die", "el", "le", "la", "the", supposed to be the beginning of a qualifier (e.g. William the Conqueror)
    then the GEDCOM first name part becomes the person "public name" and its first word his "first name". es: Por defecto, al crear una persona, si el campo nombre en el fichero GEDCOM se asemeja a un nombre público, es decir, si él contiene:
    • Un número ordinario o en cifras romanas, normalmente considerado como un número de un título de nobleza (por ejemplo: Luis XIV),
    • Una de las palabras: "der", "den", "die", "el", "le", "la", "the", normalmente utilizadas como particula inicial de un calificativo (por ejemplo: Guillermo el Conquistador),
    entonces el nombre en el fichero GEDCOM se transforma en un "nombre público" y la primera palabra del campo nombre va en el campo "nombre". fr: Par défaut, au moment de la création d'une personne, si la partie prénom dans le GEDCOM ressemble à un nom public, c'est-à-dire contient:
    • Un nombre normal ou en chiffres romains, censé être un numéro d'un titre de noblesse (exemple: Louis XIV),
    • Un des mots: "der", "den", "die", "el", "le", "la", "the", censé être le début d'un qualificatif (exemple: Guillaume le Conquérant),
    alors le prénom dans le GEDCOM devient un "nom public" et le premier mot de la partie prénom va dans la partie "prénom". it: Come settaggio standard, al momento della creazione di una persona, se la parte nome nel GEDCOM somiglia a un nome pubblico, cioè contiene:
    • un numero in cifre arabe o romane che potrebbe essere il numero di un titolo nobiliare (Esempio: Luigi XIV),
    • Una delle parole: "der", "den", "die", "el", "le", "il", "la", "the", considerati come l'inizio di un qualificativo (Esempio: Guglielmo il Conquistatore),
    allora il nome nel GEDCOM diventa un "nome pubblico" e la prima parola della parte nome va nella parte nome. lv: Noklusçtajâ variantâ GEDCOM standartâ pirmais vârds ir kâ oficiâlais vârds, t.i.tas var saturçt:
    • Romieði skaitli, kas apzîmç aristokrâta titlu (piemçram, George V)
    • Vienu no sekojoðiem vârdiem: "der", "den", "die", "el", "le", "la", "the", kâ kvalifikators (e.g. William the Conqueror)
    tâdâ gadîjumâ GEDCOMa pirmais vârds kïûst par personas "oficiâlo vârdu" un tâ pirmais vârds par personas vârdu. sv: Denna option är förvald: när man skapar en person, om GEDCOM-filens förnamnsdel ser ut som ett officiellt namn, dvs innehåller:
    • Ett nummer eller ett romersktnummer, förmodas det vara ett nummer för en kunglig- eller adelstitel (tex Gustaf V)
    • Ett av dessa ord: "der", "den", "die", "el", "le", "la", "the", förmodas vara en bestämmning till (tex William the Conqueror)
    då blir GEDCOM-filens förnamnsdel personens "officiellanamn" och första ordet dess "förnamn". ]
        [ de: Diese Option abschalten. en: Cancel this option. es: Anular esta opción. fr: Annuler cette option. it: Annullare questa opzione. lv: Izslçgt ðo iespçju sv: Välj bort denna option. ]
        [ de: Negative Datumsangaben erzeugen, falls Inkonsistenzen erkannt werden (z. B. Geburt nach Tod). en: Set negative dates when inconsistency (e.g. birth after death). es: En caso de incoherencia existente, tratar de incluir las fechas negativas (por ejemplo: nacimiento despues de su muerte). fr: Essayer de mettre des dates négatives s'il y a incohérence (exemple: naissance après la mort). it: In caso di incoerenza, provate a mettere delle date negative (Esempio: data di nascita posteriore a data di morte). lv: Pretrunu gadîjumâ viedot negatîvus datumus (piemçram, dzimðana pçc nâves). sv: Sätt negativt datum när datumen är motsägande varandra (tex födelse efter död). ]
        [ de: Keine negativen Datumsangaben: Ein Jahr mit vorangestelltem Minuszeichen soll nicht als negative Jahresangabe interpretiert werden. en: No negative dates: do not interpret a year preceded by a minus sign as a negative year. es: No aceptar las fechas negativas: no interpretar un año precedido de un signo menos "-" como una fecha negativa. fr: Pas de dates négatives: ne pas interpréter une année précédée du signe moins "-" comme une date négative. it: Non accettare le date negative: non interpretare un anno preceduto dal segno "-" come una data negativa. lv: Neveidot negatîvus datumus no esoðajiem negatîvajiem datumiem. sv: Inga negativa datum: tolka inte ett år med minus tecken framför som ett negativt år. ]
      [ de: GEDCOM-Dateien enthalten manchmal numerische Monatsangaben (von 1 bis 12). Der GEDCOM-Standard 5.5 schreibt aber vor, daß Monate durch Kürzel dargestellt werden (z. B. "MAY 1912" und nicht "05/1912"). Die Angabe "02/05/1912" ist mehrdeutig (bedeutet je nach Land "2. Mai 1912" oder "5. Februar 1912"). en: Some GEDCOM files sometimes write dates with numbered months (from 1 to 12). The GEDCOM standard 5.5 requires that the months be represented by identifiers (e.g. "MAY 1912" and not "05/1912"). The notation "02/05/1912" is ambiguous (means "May 2, 1912" or "February 5, 1912" according to the countries). es: Algunos ficheros GEDCOM utilizan a veces los números ordinarios para referirse a los meses (de 1 a 12). El estándar GEDCOM 5.5 exije que los meses sean representados por sus identificadores (por ej: "MAY 1912" y no "05/1912"). La notación "02/05/1912" es ambigüa; (puede significar "2 de mayo de 1912" o "5 de fevrero de 1912" según los diferentes paises). fr: Certains fichiers GEDCOM écrivent parfois les dates en mettant les mois avec des nombres (de 1 à 12). Le standard GEDCOM 5.5 exige que les mois soient représentés par des identificateurs (ex: "MAY 1912" et non pas "05/1912"). La notation "02/05/1912" est ambiguë (peut signifier "2 mai 1912" ou "5 février 1912" suivant les pays). it: Certi files GEDCOM scrivono talvolta le date indicando il mese con un numero (da 1 a 12); lo standard GEDCOM 5.5 esige che i mesi siano rappresentati da identificatori (esempio: "MAY 1912" e non "05/1912"). La notazione "02/05/1912" è ambigua; (può voler dire "2 maggio 1912" oppure "5 febbraio 1912", secondo i paesi). lv: Daþâs GEDCOM datnçs mçneði datumos tiek apzîmçti ar nummuriem (1-12). GEDCOM standarts 5.5 nosaka, ka mçðiem jâbût apzîmçtiem ar to nosaukumu saîsinâjumiem(piemçram "MAY 1912" un nevis "05/1912"). Datums "02/05/1912" ir daþâdi tulkojams (atkarîbâ no valsts tas ir 1912.gada 2.maijs vai 1912.gada 5.februâris). sv: En del GEDCOM-filer innehåller ibland datum med numrerade månader (från 1 till 12). GEDCOM-standarden version 5.5 kräver att månaderna ska skrivas med identifierare (tex "MAY 1912" och inte "05/1912"). Notationen "02/05/1912" är tvetydig (den kan antingen betyda "May 2, 1912" eller "February 5, 1912" beroende på land). ]
        [ de: Aus solchen Daten soll nur die Jahreszahl verwendet werden. en: For these dates, extract only the "year" part. es: Por este tipo de fechas, extraer solamente la parte "año". fr: Pour ces dates, n'extraire que la partie "année". it: Per queste date, estrarre solamente la parte "anno". lv: Ðâdiem datumiem atstât tikai gadu sv: För dessa datum, extrahera endast "år" delen. ]
        [ de: Interpretiere solche Daten als "Tag/Monat/Jahr". en: Interpret these dates as "day/month/year". es: Interpretar estas fechas como "día/mes/año". fr: Interpréter ces dates comme "jour/mois/année". it: Interpretare queste date come "giorno/mese/anno". lv: Pieòemt ðo datumus kâ "diena/mçnesis/gads" sv: Tolka dessa datum som "dag/månad/år". ]
        [ de: Interpretiere solche Daten als "Monat/Tag/Jahr". en: Interpret these dates as "month/day/year". es: Interpretar estas fechas como "mes/día/año". fr: Interpréter ces dates comme "mois/jour/année". it: Interpretare queste date come "mese/giorno/anno". lv: Pieòemt ðo datumus kâ "mçnesis/diena/gads" sv: Tolka dessa datum som "månad/dag/år". ]
      [ de: Die Kodierung für Sonderzeichen ist normalerweise im Kopf der GEDCOM-Datei angegeben. en: The accentuated characters encoding is normally specified in the GEDCOM header. es: El codage de los carácteres acentuados esta indicado en principio en el encabezamiento del fichero GEDCOM. fr: Le codage des lettres accentuées est en principe indiqué dans l'en-tête du fichier GEDCOM. it: La codifica dei caratteri accentuati è normalmente indicata nell'intestazione del file GEDCOM. lv: Uzsvçrtie burti parsti ir norâdîti GEDCOM datnes galvgaïa aprakstâ. sv: Hur de accentuerade tecknen är kodade är normalt specifierat i GEDCOM-huvudet. ]
        [ de: Beachte die Hinweise aus der GEDCOM-Datei. en: Follow the indications of the GEDCOM header. es: Seguir las indicaciones del encabezamiento del fichero GEDCOM. fr: Suivre les indications de l'en-tête du GEDCOM. it: Seguire le indicazioni dell'intestazione del file GEDCOM. lv: Sekot GEDCOM datnes galvgaïa apraksta norâdîjumam sv: Följ GEDCOM-huvudets information. ]
        [ de: Die Sonderzeichen folgen der ANSEL-Kodierung. en: The accentuated characters are in ANSEL encoding. es: Los carácteres acentuados están en codage ANSEL. fr: Les lettres accentuées sont en codage ANSEL. it: I caratteri accentuati sono codificati in ANSEL. lv: Uzsvçrtie burti ir ANSEL kodçjumâ. sv: De accentuerade tecknen är ANSEL kodade. ]
        [ de: Die Sonderzeichen folgen der ASCII-Kodierung . en: The accentuated characters are in ASCII encoding. es: Los carácteres acentuados están en codage ASCII. fr: Les lettres accentuées sont en codage ASCII. it: I caratteri accentuati sono codificati in ASCII. lv: Uzsvçrtie burti ir ASCII kodçjumâ. sv: De accentuerade tecknen är ASCII kodade. ]
        [ de: Die Sonderzeichen folgen der MSDOS-Kodierung. en: The accentuated characters are in MSDOS encoding. es: Los carácteres acentuados están en codage MSDOS. fr: Les lettres accentuées sont en codage MSDOS. it: I caratteri accentuati sono codificati in MSDOS. lv: Uzsvçrtie burti ir MSDOS kodçjumâ. sv: De accentuerade tecknen är MS-DOS kodade. ]

    [ de: Dann drücke auf "Ok". en: Then click on "Ok". es: Finalmente cliquerar en "Ok". fr: Puis cliquez sur "Ok". it: Poi cliccate su "Ok". lv: Tad nospiediet "Ok". sv: Klicka sedan på "OK". lv: Tad nospiediet "Ok". ]

    geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/gwf.htm0000660000175200017530000000474312664543647024007 0ustar guillaumeguillaume [ de: Parameter en: Parameters es: Parámetros fr: Paramètres it: Parametri lv: Parametri sv: parametrar ]

    [ de: Parameter en: Parameters es: Parámetros fr: Paramètres it: Parametri lv: Parametri sv: Parametrar ]

    [ de: Bitte wähle deine Datenbank mit dem zugehörigen Schalter: en: Select your database by clicking on the corresponding button: es: Seleccione Ud. su base de datos cliqueando en el botón asociado: fr: Sélectionnez votre base de données en cliquant sur le bouton associé: it: Selezionate la vostra base di dati cliccando sul bottone associato: lv: Ieklikðíinot atbilstoðjâ podziòâ, izvçlieties savu datu bâzi: sv: Välj din databas genom att klicka på motsvarande knapp: ]

    %b{ | }
        %a
    - [ de: keine Datenbank vorhanden en: there is no database at present es: actualmente no existe ninguna base de datos fr: il n'y a aucune base de données actuellement it: attualmente non esiste nessuna base di dati lv: patreiz nav nevienas datu bazes sv: det finns ingen databas för tillfället ]

    [ de: Dann drücke diesen Knopf: en: Then push this button: es: Apoye a continuación en este botón: fr: Puis appuyez sur ce bouton: it: Poi cliccate su questo bottone: lv: Tad nospiediet ðo podziòu: sv: Tryck sedan på denna knapp: ]

    geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/gwc.htm0000660000175200017530000001357212664543647024004 0ustar guillaumeguillaume [ de: GeneWeb-Quelldatei importieren en: Import a GeneWeb source file es: Importación d'un fichero fuente GeneWeb fr: Importation d'un fichier source GeneWeb it: Importazione di un file sorgente GeneWeb lv: GeneWeb resursdatnes imports sv: Importera en GeneWeb källfil ]

    [ de: GeneWeb-Quelldatei importieren en: Import of a GeneWeb source file es: Importación d'un fichero fuente GeneWeb fr: Importation d'un fichier source GeneWeb it: Importazione di un file sorgente GeneWeb lv: GeneWeb resursdatnes imports sv: Importera en GeneWeb källfil ]

    • [ de: Bitte gib folgende Daten ein kompletter Name deiner GeneWeb-Quelldatei (inklusive Endung ".gw"); en: Select the name of your GeneWeb source file (ending with ".gw"); es: Entre Ud el nombre completo de su fichero fuente GeneWeb (que termina en ".gw"). fr: Sélectionnnez votre fichier source GeneWeb (se terminant par ".gw"): it: Selezionate il vostro file sorgente GeneWeb (che finisce con ".gw"): lv: Ierakstiet pilnu GeneWeb resursdatnes nosaukumu (kas beidzas ar ".gw"). sv: Skriv in det kompletta namnet för din GeneWeb källfil (den måste sluta med ".gw"): ] %j

    • [ de: Den Namen, den du deiner GeneWeb-Datenbank geben möchtest. Wenn du nichts eingibst, wird der Name aus deiner GeneWeb-Quelldatei abgeleitet. en: Enter the name you want to give to your GeneWeb database. If you write nothing, it will be deducted from the GeneWeb source file. es: El nombre que Ud. desea dar a su base de datos GeneWeb. Si Ud. no escribe nada, el nombre se deducirá a partir del nombre del fichero fuente GeneWeb. fr: Entrez le nom que vous voulez donner à votre base de données GeneWeb.Si vous ne mettez rien, il sera déduit du nom du fichier source GeneWeb. it: Digitate il nome che volete dare alla vostra base di dati GeneWeb. Se non mettete niente il nome verrà dedotto da quello del file sorgente GeneWeb. lv: Ierakstiet nosaukumu, kâdâ Jûs vçlaties nosaukt savu GeneWeb datu bâzi. Ja nekas netiks ierakstîts, datu bâzes nosaukums tiks izveidots no GeneWeb resursdatnes nosaukuma. sv: Namnet du vill kalla din GeneWeb databas. Om du inte skriver någonting, kommer namnet att bli härlätt från GeneWeb källfilens namn. ]

    [ de: Wähle die gewünschten Optionen: en: Select the options you want: es: Seleccione las opciones que Ud. desee: fr: Sélectionnez les options que vous désirez: it: Selezionate le opzioni desiderate: lv: Izvçlieties atbilstoðos parametrus: sv: Välj de optioner du vill ha: ]

        [ de: Statistiken nach Abschluß der Operation ausgeben (sind dann in der Trace-Ausgabe sichtbar). en: Display some statistics at the end (they will be visible in the traces). es: Mostrar algunas estadísticas al final (ellas seran visibles en las trazas). fr: Afficher quelques statistiques à la fin (elles seront visibles dans les traces). it: Visualizzare alcune statistiche alla fine (saranno visibili nelle tracce). lv: Beigâs parâdît darbîbas statistiku (tâ bûs redzama programas darbîbâs pçdâs). sv: Visa statistik på slutet (den kommer att synas i utskriften). ]
        [ de: Datenkonsistenz nicht überprüfen. en: Do not check the consistency of the data. es: No verificar la coherencia de los datos. fr: Ne pas vérifier la cohérence des données. it: Non verificare la coerenza dei dati. lv: Nepârbaudît datu saskanîbu. sv: Kontrollera inte att databasens data är OK. ]
        [ de: Initialisierung der Blutsverwandtschaften auch durchführen. en: End by the initialization of consanguinities. es: Terminar por el cálculo previo de consanguinidad. fr: Terminer par le précalcul de consanguinité. it: Terminare con il pre-calcolo di consanguineità. lv: Nobeigt ar asinsradniecîbas pârrçíinu. sv: Avsluta med att beräkna blodsbanden. ]

    [ de: Dann drücke "Ok". en: Then click on "Ok". es: Finalmente cliquear en "Ok". fr: Puis cliquez sur "Ok". it: Poi cliccate su "Ok". lv: Tad nospiediet "Ok". sv: Klicka sedan på "OK". ]

    geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/recover2.htm0000660000175200017530000001600512664543647024745 0ustar guillaumeguillaume [ de: Eine bestehende Datenbank übernehmen - Phase 3 en: Recover a database - Phase 3 es: Recuperar una base - Fase 3 fr: Récupérer une base - Phase 3 it: Recuperare una base - Fase 3 lv: Datu bâzes atjauninâðana - 3. fâze sv: Återskapa en databas - fas 3 ]

    [ de: Eine bestehende Datenbank übernehmen en: Recover a database es: Recuperar una base fr: Récupérer une base it: Recuperare una base lv: Datu bâzes atjauninâðana - 2. fâze sv: Återskapa en databas ]


    %v{[ de: Warnung: Im Zielverzeichnis existiert bereits eine Datenbank mit dem Namen "%o". Wenn du den "Ok"-Knopf drückst, wird sie gelöscht.

    Falls du diese Funktion gerade schonmal ausgeführt hattest, dann war diese Datenbank wahrscheinlich das Ergebnis und daher kann dieser Fehler hier ignoriert werden. Andernfalls kehre auf die vorherige Seite zurück und wähle einen anderen Namen für deine Datenbank. en: Warning: there already exists a database named "%o" in the destination directory. If you push the button below, it will be erased. If you just made this handling, it is probably its result, therefore it is not important. Otherwise, go back and choose another name for your database. es: Atención: una base que tiene por nombre "%o" ya existe en la carpeta de destinación . Si Ud. apoya en el botón de la parte inferior; el fichero será borrado. Si Ud. viene de realizar esta manipulación, debe tratarse probablemente de su resultado, entonces no hay ningún problema. En caso contrario; regrese a la página anterior y escoja otro nombre para su base. fr: Attention: il existe déjà une base de nom "%o" dans le répertoire d'arrivée. Si vous appuyez sur le bouton ci-dessous, cela va l'effacer. Si vous venez déjà de faire cette manipulation, il s'agit probablement de son résultat, ce n'est donc pas grave. Sinon, revenez en arrière et choisissez un autre nom pour votre base. it: Attenzione: esiste una base chiamata "%o" nella directory di destinazione. Se cliccate sul bottone qui sotto la cancellerete. Se avete appena fatto questa manipolazione si tratta probabilmente del suo risultato e non c'è quindi niente di grave. Altrimenti, tornate indietro e sciegliete un altro nome per la vostra base. lv: Brîdinâjums: datu bâze ar nosaukumu "%o" jau eksistç dotajâ katalogâ. Ja Jûs nospiedîsiet zemâk esoðo podziòu ðî datu bâze tiks izdzçsta. Iespçjams, ka Jûs jau to esiet izveidojuði. Esiet uzmanîgi. Ja nepiecieðams, atgriezieties iepriekðçjâs lapâs un izvçlieties citu datu bâzes nosaukumu. sv: Varning: det finns redan en databas benämnd "%o" i målkatalogen. Om du trycker på knappen nedan kommer den att raderas. Om du inte vill det, gå tillbaka och välj ett annat namn för din databas. ]

    } [ de: Startverzeichnis und Datenbank: en: Starting directory and database: es: Carpeta y base inicial: fr: Répertoire et base de départ: it: Directory e base iniziale: lv: Vecâs datu bâzes katalogs un datu bâze: sv: Startkatalog och databas: ]

      %a
      %i
    
    [ de: Zielverzeichnis und Datenbank: en: Destination directory and database: es: Carpeta y base final: fr: Répertoire et base d'arrivée: it: Directory e base finale: lv: Jaunais datu bâzes katalogs un datu bâze: sv: Målkatalog och databas: ]
      %w
      %o
    

    [ de: Warnung: Je nach Fall kann diese Operation einige Sekunden oder Minuten benötigen. Bitte habe Geduld. en: Warning: the operation can take several seconds or minutes, depending on the case. Be patient. es: Atención: la operación puede tomar algunos segundos o algunos minutos, de acuerdo al caso. Sea paciente fr: Attention: l'opération peut prendre quelques secondes ou quelques minutes, suivant les cas. Soyez patient. it: Attenzione: l'operazione può prendere qualche secondo o qualche minuto, secondo i casi. Siate pazienti. lv: Brîdinâjums: Atkarîbâ no apstakïiem atjauninâðana var ilgt no daþâm sekundçm lîdz minûtçm. Esiet pacietîgs. sv: Varning: operationen kan ta flera sekunder eller minuter, beroende på fall. Ha tålamod. ]

    [ de: Drücke den Knopf, um die Operation zu starten en: Push the below button to launch the operation es: Apoye en el botón siguiente para lanzar la operación fr: Appuyez sur le bouton ci-dessous pour lancer l'opération it: Cliccate sul bottone qui sotto per lanciare l'operazione lv: Nospiediet zemâk esoðo podziòu, lai uzsâktu datu bâzes atjauninâðanu sv: Tryck på knappen nedan för att starta operationen ]%v{
    [ de: und die Datenbank "%o" im Zielverzeichnis zu löschen en: , and overwrite the database "%o" of the destination directory es: y destruir la "%o" de la carpeta final fr: et écraser la base "%o" du répertoire d'arrivée it: e cancellate la base "%o" nella directory finale lv: , un pârrakstîtu datu bâzi "%o" mçría katalogâ sv: och radera databasen "%o" i målkatalogen ]}:

    %h

    [ de: Zu deiner Information: Diese Funktion entspricht der Ausführung der folgenden Kommandos: en: For information, this operation corresponds to the following commands: es: Por información esta operación corresponde a la ejecución de los comandos siguientes: fr: Pour information, cette opération correspond à la suite des commandes suivantes: it: Per informazione, questa operazione corrisponde alla succesione dei seguenti comandi: lv: Informâcijai: ðî darbîba atbilst sekojoðâm komandâm: sv: Denna operation motsvarar de följande kommandona: ]

         $ cd "%a"
         $ .%/%U %i %O %w%/%T
         $ cd "%w"
         $ %x%Vsrc2new; %T -f -o %o > comm.log
    
    geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/cleanup.htm0000660000175200017530000001407312664543647024650 0ustar guillaumeguillaume [ de: Aufräumen en: Clean up es: Limpieza fi: Puhdista fr: Nettoyage it: Pulizia lv: Sakopðana sv: Upprensning ]

    [ de: Eine Datenbank aufräumen en: Cleaning up a database es: Limpieza de una base de datos fi: Tietokannan puhdistus fr: Nettoyage d'une base de données it: Pulizia di una base di dati lv: Datu bâzes sakopðana sv: Upprensning av en databas ]

    [ de: Wenn du viele Änderungen an deiner Datenbank vorgenommen hast, oder einfach nur viele Daten eingegeben hast, dann ist es empfehlenswert, sie aufzuräumen, insbesondere falls du feststellst, daß sich der Zugriff auf deine Datenbank verlangsamt hat. en: If you made many modifications in your database, or if you simply entered much data, it is advised to make a cleaning up, especially if you observe that the access to your database has slowed down. es: Si Ud ha efectuado muchas modificaciones en su base de datos, o simplemente si Ud. a entrado muchos datos, es aconsejable de realizar una limpieza, en particular si Ud constata que el acceso a su base de datos comienza a ser mas lento que de costumbre. fi: Jos olet tehnyt muutoksia tietokantaan, tai olet syöttänyt paljon tietoa on suositeltavaa että puhdistat sen, varsinkin jos huomaat että tietokannan käyttö on hidastunut. fr: Si vous avez fait beaucoup de modifications dans votre base de données, ou si vous avez simplement entré beaucoup de données, il est conseillé de faire un nettoyage, surtout si vous constatez que l'accès à votre base de données commence à ralentir. it: Se avete fatto molte modifiche alla vostra base di dati o se avete semplicemente aggiunto molti dati, vi consigliamo di realizzare una "pulizia", soprattutto se constatate un rallentamento nella consultazione della base. lv: Ja Jûs esat izdarîjuði daudz labojumus datu bazç, vai vienkârði pamatîgi papildinâjuði datu bâzi, tad ieteicams veikt datu bâzes sakopðanu, it seviðíi, ja Jûs esat ievçrojuði, ka datu bâzes darbîba kïuvusi lçnâka. sv: Om du har gjort många modifieringar i din databas, eller om du helt enkelt har skrivit in mycket data, är det rekommenderat att du gör en upprensning, speciellt om du ser att åtkomsten till din databas går saktare. ]

    • [ de: Um einfach aufzuräumen, wende die Initialisierung der Blutsverwandtschaft an. en: For a simple cleaning up, apply the initialisation of consanguinities. es: Para realizar una limpieza simple, aplique el programa de inicialisación de las consanguinidades. fi: Esimerkiksi puhdistaminen, sukulaisuudenkäyttöönotto. fr: Pour un nettoyage simple, appliquez le programme d'initialisation des consanguinités. it: Per una pulizia semplice, applicate il programma d'inizializzazione delle consanguineità. lv: Vienkârðai datu bâzes sakopðanai vieciet asinsradniecîbas pârrçíinâðanu. sv: För en enkel upprensning, använd beräkning av blodsband. ]

    • [ de: Um radikal aufzuräumen, wähle deine Datenbank aus, indem du den zugehörigen Schalter anklickst: en: For a radical cleaning up, select your database by clicking on the associated button: es: Para realizar una limplieza minuciosa, seleccione su base de datos cliqueando en el botón asociado: fi: Suorittaaksesi ison puhdistuksen, valitse tietokantasi painamalla nappia alta: fr: Pour un nettoyage en profondeur, sélectionnez votre base de données en cliquant sur le bouton associé: it: Per una pulizia profonda, selezionate la vostra base di dati cliccando sul bottone che le è associato. lv: Pamatîgâkai datu bâzes pârrçíinâðanai izvçlieties savu datu bâzi uzklikðíinot uz atbilstoðâs râdio podziòas: sv: För en radikal upprensning, välj din databas genom att klicka på motsvarande knapp: ]

      %b{ | }
          %a
      - [ de: keine Datenbank vorhanden en: there is no database at present es: actualmente ninguna base de datos existe fi: ei tietokantaa saatavilla fr: il n'y a aucune base de données actuellement it: attualmente non esiste nessuna base di dati lv: patreiz nav nekâdu datu sv: det finns ingen databas för tillfället ]

      [ de: Dann drücke diesen Knopf: en: Then push this button: es: Y a continuación apoye en el botón siguiente: fi: Sitten paina tätä nappia: fr: Puis appuyez sur ce bouton: it: E poi cliccate su questo bottone: lv: Pçc tam nospiediet ðo podziòu: sv: Tryck sedan på denna knapp: ]

    geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/gwd_ok.htm0000660000175200017530000001101612664543647024465 0ustar guillaumeguillaume [ de: Parameter geändert en: Parameters updated es: Parámetros actualizados fr: Paramètres mis-à-jour it: Parametri aggiornati lv: Mainîti parametri sv: Parametrar uppdaterade ]

    [ de: Parameter geändert en: Parameters updated es: Parámetros actualizados fr: Paramètres mis à jour it: Parametri aggiornati lv: Mainîti parametri sv: Parametrar uppdaterade ]

    [ de: Damit die Parameter wirksam werden, muß der gwd-Dienst (sofern er lief) gestoppt und neu gestartet werden. en: In order to take the parameters into account, the gwd service must be stopped, if it was running, and restarted. es: Para que los parámetros sean tomados en cuenta; es necesario parar el servicio gwd, en caso que el funcione, y a continuación lanzarlo nuevamente. fr: Pour que les paramètres soient pris en compte, il faut arrêter le service gwd, s'il tourne, et le relancer. it: Per far prendere in considerazione i parametri, bisogna fermare il service gwd, se sta girando, e rilanciarlo. lv: Lai parametru maiòa iedarbotos, gwd serviss jâapstâdina, ja tas jau darbojas, un jâpalaiþ no jauna. sv: För att parametrarna ska kunna börja användas, måste gwd servicen stoppas, om den var igång, och sedan återstartad. ]

    [ de: Zu deiner Information: Die Parameter sind in der Textdatei "gwd.arg" im Verzeichnis "gw" deiner GeneWeb-Installation gespeichert. en: Information: the parameters are recorded in a text file named "gwd.arg" in the directory "gw" of your GeneWeb distribution. es: Información: los parámetros son registrados en el fichero texto "gwd.arg", que se encuentra en la carpeta "gw", de su distribución GeneWeb. fr: Information: les paramètres sont enregistrés dans le fichier texte "gwd.arg" qui se trouve dans le répertoire "gw" de votre distribution GeneWeb. it: Informazione: i parametri sono registrati nel file testo "gwd.arg" che si trova nella directory "gw" della vostra distribuzione GeneWeb. lv: Informâcijai: parametri ir ierakstîti teksta datnç "gwd.arg" katalogâ "gw" Jûsu GeneWeb datòu komplektâ. sv: Information: parametrarna är lagrade i en textfil benämnd "gwd.arg" i katalogen "gw" för din GeneWeb distribution. ]

    [ de: Hier ist der Inhalt der Datei: en: Here is its contents: es: He aquí su contenido: fr: Voici son contenu: it: Ecco il suo contenuto: lv: Ðeit ir "gwd.arg" saturs: sv: Här är dess innehåll: ]

    %r{- [
    de: Datei leer
    en: empty file
    es: fichero vacio
    fr: fichier vide
    it: file vuoto
    sv: tom fil
    ] -}
    
    [ de: Zurück zum Hauptmenü. en: You can return to the main menu. es: Ud. puede regresar al menú principal. fr: Vous pouvez revenir au menu principal. it: Potete tornare al menu principale. lv: Jûs variet atgriezties uz galveno izvçlni. sv: Du kan återvända till huvudmenyn. ] geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/ged2gwb.htm0000660000175200017530000005134412664543647024544 0ustar guillaumeguillaume [ de: GEDCOM-Datei importieren en: Import a GEDCOM file es: Importación de un fichero GEDCOM fr: Importation d'un fichier GEDCOM it: Importazione di un file GEDCOM lv: GEDCOM datnes imports sv: Importera en GEDCOM-fil ]

    [ de: GEDCOM-Datei importieren en: Import a GEDCOM file es: Importación de un fichero GEDCOM fr: Importation d'un fichier GEDCOM it: Importazione di un file GEDCOM lv: GEDCOM datnes imports sv: Importera en GEDCOM-fil ]

    • [ de: Bitte eingeben vollständiger Name deiner GEDCOM-Datei. en: Select your GEDCOM file: es: Agregue Ud el nombre completo de su fichero GEDCOM. fr: Sélectionnez votre fichier GEDCOM. it: Selezionate il vostro file GEDCOM. lv: Ievadiet pilnu GEDCOM datnes nosaukumu. sv: Skriv det kompletta namnet på din GEDCOM-fil. ]

      %j

    • [ de: Name, den du deiner GeneWeb-Datenbank geben möchtest. Wenn du hier nichts eingibst, wird der Datenbankname aus dem Namen der GEDCOM-Datei abgeleitet. en: Enter The name you want to give to your GeneWeb database. If omitted, it will be deducted from the name of the GEDCOM file. es: El nombre que Ud. desea dar a su base de datos GeneWeb. Si Ud. no mete ningún nombre, él será deducido del nombre del fichero GEDCOM. fr: Entrez le nom que vous voulez donner à votre base de données GeneWeb. Si vous ne mettez rien, il sera déduit du nom du fichier GEDCOM. it: Digitate il nome che volete dare alla vostra base di dati GeneWeb. Se non mettete niente il nome sarà dedotto da quello del file GEDCOM. lv: Nosaukumu kurâ Jûs vçlties nosaukt savu GeneWeb datu bâzi. Ja neierakstîsiet, tad datu bâzes nosaukums tiks veidos no GEDCOM datnes nosaukuma. sv: Namnet du vill kalla din GeneWeb databas. Om namnet utelämnas, kommer det att bli härlätt från GEDCOM-filens namn. ]

    [ de: Sofern gewünscht, wähle bitte aus den folgenden Optionen: en: Select the options you want: es: Seleccione las opciones que Ud. desee : fr: Sélectionnez les options que vous désirez: it: Selezionate le opzioni desiderate: lv: Iezîmçjiet nepiecieðmâs papildus iespçjas: sv: Välj de optioner du vill ha: ]

        [ en: Put untreated GEDCOM tags in notes. fi: Pistä käsittelemättömät GEDCOM merkit lainausmerkkeihin. fr: Sauvegarder les tags GEDCOM non reconnus dans les notes. ]
        [ de: Vornamen in Kleinbuchstaben wandeln, nur Anfangsbuchstaben in groß. en: Convert first names to lowercase letters, with initials in uppercase. es: Forzar los nombres a estar en minúsculas. Meter sus iniciales en mayúsculas. fr: Convertit les prénoms en minuscules, avec leurs initiales en majuscules. it: Convertire i nomi in minuscolo, con le loro iniziali in maiuscolo. lv: Pârveidot personvârdus uz mazajiem burtiem ar pirmajiem lielajiem. sv: Forcera gemena förnamn, bara initialer behålls som versaler. ]
        [ de: Nachnamen in Kleinbuchstaben wandeln, nur Anfangsbuchstaben in groß. Kleinschreibung von Partikeln möglichst beibehalten. en: Convert surnames to lowercase letters, with initials in uppercase. Try to keep lowercase particles. es: Forzar los apellidos a estar en minúsculas. Meter sus iniciales en mayúsculas. Trate de mantener las partículas en minúsculas. fr: Convertit les noms de famille en minuscules, avec leurs initiales en majuscules. Essaye de garder les particules en minuscules. it: Convertire i cognomi in minuscolo, con le loro iniziali in maiuscolo. Cercate di mantenere le particelle in minuscolo. lv: Pârveidot uzvârdus uz mazajiem burtiem ar pirmajiem lielajiem. Mçginât saglabât partikulus ar mazajiem burtiem. sv: Forcera gemena efternamn, bara initialer behålls som versaler. ]
      [ de: Wenn der GEDCOM-Vorname mehrere, durch Kommata getrennte Namen enthält, soll beim Anlegen einer Person der erste dieser Namen der "Vorname" werden, während der vollständige GEDCOM-Vorname als "Vornamen-Alias" eingetragen wird. en: When creating a person, if the GEDCOM first name part holds several names separated by spaces, you can ask that the first of this names becomes the person "first name" and the complete GEDCOM first name part a "first name alias". es: Al crear una persona, si el campo nombre del fichero GEDCOM esta constituido de varios nombres, puede preguntar que el primero de ellos irá en el campo "nombre" y que el nombre completo se transforma en un "alias de nombre". fr: Au moment de la création d'une personne, si la partie prénom dans le GEDCOM est formée de plusieurs noms séparés par des espaces, on peut vouloir que le premier de ces noms aille dans la partie "prénom" et que le prénom complet devient un "prénom alias". it: Al momento della creazione di una persona, se la parte nome nel GEDCOM è formata da più nomi con degli spazi, potete chiedere che il primo di questi nomi vada nella parte "nome" e che il nome completo diventi un "alias di nome" lv: Ja personas vârds GEDCOM datnç satur vairâkus vârdus variet norâdît, lai pirmais no ðiem vârdiem kïûst par personas "pirmo vârdu" un GEDCOMa datnes pilnais vârds kïust par pirmâ vârda "pieòemto vârdu". sv: När man skapar en person, om förnamnen i GEDCOM-filen innehåller flera namn separerade med mellanslag, kan du be att den första av dessa blir en persons "förnamn" och GEDCOM-filens kompletta förnamnsdel blir ett "förnnamns alias". ]
        [ de: Diese Option aktivieren. en: Set this option. es: Poner esta opción. fr: Mettre cette option. it: Scegliere questa opzione. lv: Ieslçgt ðo iespçju sv: Sätt denna option. ]
      [ de: Normalerweise wird beim Anlegen einer Person, deren GEDCOM-Vorname wie ein öffentlicher Name aussieht, d.h. falls er folgendes beinhaltet:
    • Eine Zahl oder eine eine römische Zahl, von der angenommen wird, daß es sich um die Nummer eines Adelstitels handelt (z. B. George V)
    • Eines der Wörter: "der", "den", "die", "el", "le", "la", "the", von dem angenommen wird, daß es sich um den Beginn eines Beinamens handelt (z. B. William der Eroberer)
    dann wird der GEDCOM-Vorname der "Öffentliche Name" der Person und das erste Wort des GEDCOM-Vornamens wird ihr "Vorname". en: By default, when creating a person, if the GEDCOM first name part looks like a public name, i.e. holds:
    • A number or a roman number, supposed to be a number of a nobility title (e.g. George V)
    • One of the words: "der", "den", "die", "el", "le", "la", "the", supposed to be the beginning of a qualifier (e.g. William the Conqueror)
    then the GEDCOM first name part becomes the person "public name" and its first word his "first name". es: Por defecto, al crear una persona, si el campo nombre en el fichero GEDCOM se asemeja a un nombre público, es decir, si él contiene:
    • Un número ordinario o en cifras romanas, normalmente considerado como un número de un título de nobleza (por ejemplo: Luis XIV),
    • Una de las palabras: "der", "den", "die", "el", "le", "la", "the", normalmente utilizadas como particula inicial de un calificativo (por ejemplo: Guillermo el Conquistador),
    entonces el nombre en el fichero GEDCOM se transforma en un "nombre público" y la primera palabra del campo nombre va en el campo "nombre". fr: Par défaut, au moment de la création d'une personne, si la partie prénom dans le GEDCOM ressemble à un nom public, c'est-à-dire contient:
    • Un nombre normal ou en chiffres romains, censé être un numéro d'un titre de noblesse (exemple: Louis XIV),
    • Un des mots: "der", "den", "die", "el", "le", "la", "the", censé être le début d'un qualificatif (exemple: Guillaume le Conquérant),
    alors le prénom dans le GEDCOM devient un "nom public" et le premier mot de la partie prénom va dans la partie "prénom". it: Come settaggio standard, al momento della creazione di una persona, se la parte nome nel GEDCOM somiglia a un nome pubblico, cioè contiene:
    • un numero in cifre arabe o romane che potrebbe essere il numero di un titolo nobiliare (Esempio: Luigi XIV),
    • Una delle parole: "der", "den", "die", "el", "le", "il", "la", "the", considerati come l'inizio di un qualificativo (Esempio: Guglielmo il Conquistatore),
    allora il nome nel GEDCOM diventa un "nome pubblico" e la prima parola della parte nome va nella parte nome. lv: Noklusçtajâ variantâ GEDCOM standartâ pirmais vârds ir kâ oficiâlais vârds, t.i.tas var saturçt:
    • Romieði skaitli, kas apzîmç aristokrâta titlu (piemçram, George V)
    • Vienu no sekojoðiem vârdiem: "der", "den", "die", "el", "le", "la", "the", kâ kvalifikators (e.g. William the Conqueror)
    tâdâ gadîjumâ GEDCOMa pirmais vârds kïûst par personas "oficiâlo vârdu" un tâ pirmais vârds par personas vârdu. sv: Denna option är förvald: när man skapar en person, om GEDCOM-filens förnamnsdel ser ut som ett officiellt namn, dvs innehåller:
    • Ett nummer eller ett romersktnummer, förmodas det vara ett nummer för en kunglig- eller adelstitel (tex Gustaf V)
    • Ett av dessa ord: "der", "den", "die", "el", "le", "la", "the", förmodas vara en bestämmning till (tex William the Conqueror)
    då blir GEDCOM-filens förnamnsdel personens "officiellanamn" och första ordet dess "förnamn". ]
        [ de: Diese Option abschalten. en: Cancel this option. es: Anular esta opción. fr: Annuler cette option. it: Annullare questa opzione. lv: Izslçgt ðo iespçju sv: Välj bort denna option. ]
        [ de: Negative Datumsangaben erzeugen, falls Inkonsistenzen erkannt werden (z. B. Geburt nach Tod). en: Set negative dates when inconsistency (e.g. birth after death). es: En caso de incoherencia existente, tratar de incluir las fechas negativas (por ejemplo: nacimiento despues de su muerte). fr: Essayer de mettre des dates négatives s'il y a incohérence (exemple: naissance après la mort). it: In caso di incoerenza, provate a mettere delle date negative (Esempio: data di nascita posteriore a data di morte). lv: Pretrunu gadîjumâ viedot negatîvus datumus (piemçram, dzimðana pçc nâves). sv: Sätt negativt datum när datumen är motsägande varandra (tex födelse efter död). ]
        [ de: Keine negativen Datumsangaben: Ein Jahr mit vorangestelltem Minuszeichen soll nicht als negative Jahresangabe interpretiert werden. en: No negative dates: do not interpret a year preceded by a minus sign as a negative year. es: No aceptar las fechas negativas: no interpretar un año precedido de un signo menos "-" como una fecha negativa. fr: Pas de dates négatives: ne pas interpréter une année précédée du signe moins "-" comme une date négative. it: Non accettare le date negative: non interpretare un anno preceduto dal segno "-" come una data negativa. lv: Neveidot negatîvus datumus no esoðajiem negatîvajiem datumiem. sv: Inga negativa datum: tolka inte ett år med minus tecken framför som ett negativt år. ]
      [ de: GEDCOM-Dateien enthalten manchmal numerische Monatsangaben (von 1 bis 12). Der GEDCOM-Standard 5.5 schreibt aber vor, daß Monate durch Kürzel dargestellt werden (z. B. "MAY 1912" und nicht "05/1912"). Die Angabe "02/05/1912" ist mehrdeutig (bedeutet je nach Land "2. Mai 1912" oder "5. Februar 1912"). en: Some GEDCOM files sometimes write dates with numbered months (from 1 to 12). The GEDCOM standard 5.5 requires that the months be represented by identifiers (e.g. "MAY 1912" and not "05/1912"). The notation "02/05/1912" is ambiguous (means "May 2, 1912" or "February 5, 1912" according to the countries). es: Algunos ficheros GEDCOM utilizan a veces los números ordinarios para referirse a los meses (de 1 a 12). El estándar GEDCOM 5.5 exije que los meses sean representados por sus identificadores (por ej: "MAY 1912" y no "05/1912"). La notación "02/05/1912" es ambigüa; (puede significar "2 de mayo de 1912" o "5 de fevrero de 1912" según los diferentes paises). fr: Certains fichiers GEDCOM écrivent parfois les dates en mettant les mois avec des nombres (de 1 à 12). Le standard GEDCOM 5.5 exige que les mois soient représentés par des identificateurs (ex: "MAY 1912" et non pas "05/1912"). La notation "02/05/1912" est ambiguë (peut signifier "2 mai 1912" ou "5 février 1912" suivant les pays). it: Certi files GEDCOM scrivono talvolta le date indicando il mese con un numero (da 1 a 12); lo standard GEDCOM 5.5 esige che i mesi siano rappresentati da identificatori (esempio: "MAY 1912" e non "05/1912"). La notazione "02/05/1912" è ambigua; (può voler dire "2 maggio 1912" oppure "5 febbraio 1912", secondo i paesi). lv: Daþâs GEDCOM datnçs mçneði datumos tiek apzîmçti ar nummuriem (1-12). GEDCOM standarts 5.5 nosaka, ka mçðiem jâbût apzîmçtiem ar to nosaukumu saîsinâjumiem(piemçram "MAY 1912" un nevis "05/1912"). Datums "02/05/1912" ir daþâdi tulkojams (atkarîbâ no valsts tas ir 1912.gada 2.maijs vai 1912.gada 5.februâris). sv: En del GEDCOM-filer innehåller ibland datum med numrerade månader (från 1 till 12). GEDCOM-standarden version 5.5 kräver att månaderna ska skrivas med identifierare (tex "MAY 1912" och inte "05/1912"). Notationen "02/05/1912" är tvetydig (den kan antingen betyda "May 2, 1912" eller "February 5, 1912" beroende på land). ]
        [ de: Aus solchen Daten soll nur die Jahreszahl verwendet werden. en: For these dates, extract only the "year" part. es: Por este tipo de fechas, extraer solamente la parte "año". fr: Pour ces dates, n'extraire que la partie "année". it: Per queste date, estrarre solamente la parte "anno". lv: Ðâdiem datumiem atstât tikai gadu sv: För dessa datum, extrahera endast "år" delen. ]
        [ de: Interpretiere solche Daten als "Tag/Monat/Jahr". en: Interpret these dates as "day/month/year". es: Interpretar estas fechas como "día/mes/año". fr: Interpréter ces dates comme "jour/mois/année". it: Interpretare queste date come "giorno/mese/anno". lv: Pieòemt ðo datumus kâ "diena/mçnesis/gads" sv: Tolka dessa datum som "dag/månad/år". ]
        [ de: Interpretiere solche Daten als "Monat/Tag/Jahr". en: Interpret these dates as "month/day/year". es: Interpretar estas fechas como "mes/día/año". fr: Interpréter ces dates comme "mois/jour/année". it: Interpretare queste date come "mese/giorno/anno". lv: Pieòemt ðo datumus kâ "mçnesis/diena/gads" sv: Tolka dessa datum som "månad/dag/år". ]
      [ de: Die Kodierung für Sonderzeichen ist normalerweise im Kopf der GEDCOM-Datei angegeben. en: The accentuated characters encoding is normally specified in the GEDCOM header. es: El codage de los carácteres acentuados esta indicado en principio en el encabezamiento del fichero GEDCOM. fr: Le codage des lettres accentuées est en principe indiqué dans l'en-tête du fichier GEDCOM. it: La codifica dei caratteri accentuati è normalmente indicata nell'intestazione del file GEDCOM. lv: Uzsvçrtie burti parsti ir norâdîti GEDCOM datnes galvgaïa aprakstâ. sv: Hur de accentuerade tecknen är kodade är normalt specifierat i GEDCOM-huvudet. ]
        [ de: Beachte die Hinweise aus der GEDCOM-Datei. en: Follow the indications of the GEDCOM header. es: Seguir las indicaciones del encabezamiento del fichero GEDCOM. fr: Suivre les indications de l'en-tête du GEDCOM. it: Seguire le indicazioni dell'intestazione del file GEDCOM. lv: Sekot GEDCOM datnes galvgaïa apraksta norâdîjumam sv: Följ GEDCOM-huvudets information. ]
        [ de: Die Sonderzeichen folgen der ANSEL-Kodierung. en: The accentuated characters are in ANSEL encoding. es: Los carácteres acentuados están en codage ANSEL. fr: Les lettres accentuées sont en codage ANSEL. it: I caratteri accentuati sono codificati in ANSEL. lv: Uzsvçrtie burti ir ANSEL kodçjumâ. sv: De accentuerade tecknen är ANSEL kodade. ]
        [ de: Die Sonderzeichen folgen der ASCII-Kodierung . en: The accentuated characters are in ASCII encoding. es: Los carácteres acentuados están en codage ASCII. fr: Les lettres accentuées sont en codage ASCII. it: I caratteri accentuati sono codificati in ASCII. lv: Uzsvçrtie burti ir ASCII kodçjumâ. sv: De accentuerade tecknen är ASCII kodade. ]
        [ de: Die Sonderzeichen folgen der MSDOS-Kodierung. en: The accentuated characters are in MSDOS encoding. es: Los carácteres acentuados están en codage MSDOS. fr: Les lettres accentuées sont en codage MSDOS. it: I caratteri accentuati sono codificati in MSDOS. lv: Uzsvçrtie burti ir MSDOS kodçjumâ. sv: De accentuerade tecknen är MS-DOS kodade. ]

    [ de: Dann drücke auf "Ok". en: Then click on "Ok". es: Finalmente cliquerar en "Ok". fr: Puis cliquez sur "Ok". it: Poi cliccate su "Ok". lv: Tad nospiediet "Ok". sv: Klicka sedan på "OK". lv: Tad nospiediet "Ok". ]

    geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/delete_1.htm0000660000175200017530000000711112664543647024676 0ustar guillaumeguillaume [ de: Datenbanken löschen en: Deletion of databases es: Supresión de bases de datos fi: Tietokantojen poistaminen fr: Suppression de bases données it: Cancellazione di basi di dati lv: Datu bâþu dzçðana sv: Radering av databaser ]

    [ de: Datenbanken löschen en: Deletion of databases es: Supresión de bases de datos fi: Tietokantojen poistaminen fr: Suppression de bases de données it: Cancellazione di basi di dati lv: Datu bâþu dzçðana sv: Radering av databaser ]

    %k{|} [ de: Bist du sicher, daß du diese Datenbanken löschen möchtest? en: Are you sure you want to delete these databases? es: Esta Ud seguro de querer suprimir estas bases? fi: Oletko varma että haluat poistaa nämä tietokannat? fr: Êtes-vous sûr de vouloir supprimer ces bases? it: Siete sicuri di voler cancellare queste basi ? lv: Vai Jûs patieðâm vçlaties dzçst sekojoðas datu bâzes? sv: Är du säker att du vill radera dessa databaser? ]

      %k{
    • %a|
    • - [ de: no selection en: no selection es: ninguna selección fi: ei valintaa fr: pas de sélection it: nessuna selezione lv: nav iezîmçtas sv: inga val ] -}

    [ de: Achtung: Diese Auswahl ist unwiderruflich! Zur Bestätigung bitte diesen Kopf drücken: en: Warning: this suppression is definitive! To confirm, push this button. es: ¡Atención, esta supresión es definitiva ! Para confirmar, apoye Ud en este botón: fi: Varoitus: tämä poisto on lopullinen! Paina tätä nappia vahvistaaksesi. fr: Attention, cette suppression est définitive! Pour confirmer, appuyez sur ce bouton: it: Attenzione, questa azione è definitiva! Per confermare, cliccate su questo bottone: lv: Uzmanîbu: ðis brîdinâjums ir pçdçjais! Lai to apstiprinâtu, nospiediet ðo podziòu. sv: Varning: detta val är definitivt! För att bekräfta, tryck på denna knapp. ]

    [ de: Zurück zum Hauptmenü. en: Or return to the main menu. es: O, regrese Ud. al menú principal. fi: tai palaa päävalikkoon. fr: Ou revenez au menu principal. it: O tornate al menu principale. lv: Vai arî atgriezieties galvenajâ izvçlnç. sv: Eller återvänd till huvudmenyn. ] geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/simple2.htm0000660000175200017530000000410012664543647024562 0ustar guillaumeguillaume [ de: Einfache Methode en: Simple method es: Método simple fi: Yksinkertainen tapa fr: Méthode simple it: Metodo semplice lv: Vienkârðâ metode sv: Enkel metod ]

    [ de: Einfache Methode en: Simple method es: Método simple fi: Yksinkertainen tapa fr: Méthode simple it: Metodo semplice lv: Vienkârðâ metode sv: Enkel metod ]

    [ de: Gib den Namen ein, den deine Datenbank tragen soll: en: Write the name you want for your database : es: Escriba aquí el nombre que Ud. desea dar a su base de datos: fi: Anna tietokannan nimi : fr: Indiquez le nom que vous voulez donner à votre base de données : it: Indicate qui il nome che volete attribuire alla vostra base di dati: lv: Ierakstiet datu bâzes nosaukumu, kâdâ Jûs vçlaties lai tas bûtu: sv: Skriv in namnet du vill kalla din databas: ]

    [ de: Dann drücke diesen Knopf: en: Then push this button: es: Apoye luego en este botón: fi: Sitten paina tätä nappia: fr: Puis appuyez sur ce bouton: it: Poi cliccate su questo bottone: lv: Tad nospiediet ðo podziòu: sv: Tryck sedan på knappen: ]

    geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/err_ngw.htm0000660000175200017530000001213712664543647024663 0ustar guillaumeguillaume [error]

    [error]

    [ de: Du hast folgendes Verzeichnis ausgewählt: en: You selected the directory: es: Ud ha seleccionado la carpeta: fi: Valitsit hakemiston: fr: Vous avez sélectionné le répertoire: it: Avete selezionato la directory: lv: Jûs izvçlçjaties katalogu: sv: Du valde katalogen: ]

         %a
    
    [ de: Dieses Verzeichnis enthält aber nicht das Kommando "gwu", welches nötig ist, um die Datenbank zu übertragen. Bist Du sicher, daß dieses Verzeichnis ein GeneWeb-Installationsverzeichnis ist en: But it does not hold the command "gwu" required to transfer your database. Are you sure it is a GeneWeb distribution directory es: Pero ella no contiene el comando "gwu" necesario para transferir su base de datos. ¿está Ud. seguro de que se trata bien de una carpeta de una distribución GeneWeb fi: Mutta se ei sisällä komentoa "gwu" joka vaaditaan että voit siirtää tietokannan. Oletko varma että se on GeneWeb asennus hakemisto fr: Mais celui-ci ne contient pas la commande "gwu" nécessaire au transfert de votre base de données. Êtes-vous sûr qu'il s'agit bien d'un répertoire d'une distribution GeneWeb it: Ma questa non contiene il comando "gwu" necessario al trasferimento della vostra base di dati. Siete sicuri che si tratti della directory contenente una distribuzione GeneWeb lv: Bet tas nesatur komandu "gwu", kas nepiecieðama, lai pâvietotu (transfer) Jûsu datu bâzi. Vai Jûs esat pârliecinâts, ka tas ir GeneWeb izplatîðanas katlogs sv: Men den innehåller inte kommandot "gwu" nödvändig fär att överföra din databas. Är du säker på att det är en GeneWeb distributions katalog ]?

    [ de: Möglicherweise handelt es sich auch um eine sehr alte Version von GeneWeb, in der das Kommando "gwu" noch "gwb2gw" hieß. Wenn dies der Fall ist, benenne die Datei "gwb2gw" in diesem Verzeichnis um in "gwu" und versuche es erneut. en: Or else, it may be a very old version of GeneWeb where the command "gwu" was called "gwb2gw". If it is the case, rename the file "gwb2gw" into "gwu" in this directory and try again. es: Si tal es el caso, pueda ser que se trate de una versión muy antigüa de GeneWeb en la cual el comando "gwu" se llamaba "gwb2gw". Si es así, cambie el nombre del fichero "gwb2gw" por "gwu" en esa carpeta, he intente nuevamente. fi: Tai muuten, se voi olla erittäin vanha versioGeneWeb missä komentoa "gwu" kutsuttiin "gwb2gw" komennoksi". Jos asia on näin, uudelleen nimeä tiedosto "gwb2gw" tiedostoksi tässä hakemistossa ja kokeile uudestaan. fr: Il se peut également qu'il s'agisse d' une très ancienne version de GeneWeb dans laquelle la commande "gwu" s'appelait "gwb2gw". Si c'est le cas, renommez le fichier "gwb2gw" en "gwu" dans ce répertoire et réessayez. it: Può anche darsi che si tratti di una vecchia versione di GeneWeb in cui il comando "gwu" si chiamava "gwb2gw". Se è il caso, cambiate il nome di "gwb2gw" in "gwu". lv: Vai arî var bût, ka târ ir kâda ïoti veca GeneWeb versija, kurâ komanda "gwu" saucâs "gwb2gw". Tâdâ gadîjumâ, nomainiet datnes "gwb2gw" nosaukumu par "gwu" un mçìiniet vçlreiz. sv: Eller annars, kan det vara en väldigt gammal version av GeneWeb där kommandot "gwu" kallades "gwb2gw". Om så är fallet, döp om filen "gwb2gw" till "gwu" i denna katalog och försök igen. ]

    [ de: Kehre zur vorherigen Seite zurück. en: Return to the previous screen. es: Regrese Ud. a la pantalla anterior. fi: Palaa edelliselle sivulle. fr: Revenez à l'écran précédent. it: Tornate alla videata precedente. lv: Atgriezties iepriekðçjâ lapâ. sv: Återvänd till föregående sida. ] geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/update_nldb_ok.htm0000660000175200017530000000477712664543647026205 0ustar guillaumeguillaume [ de: Operation durchgeführt en: Operation completed es: Operación terminada fi: Toiminto valmis fr: Opération terminée it: Operazione terminata lv: Darbîba pabeigta sv: Operationen klar ]

    [ de: Operation durchgeführt en: Operation completed es: Operación terminada fi: Toiminto valmis fr: Opération terminée it: Operazione terminata lv: Darbîba pabeigta sv: Operationen klar ]

    [ de: So. Die Operation "%d" auf der Datenbank "%a" ist beendet. en: So. The operation "%d" on the database "%a" is terminated. es: Hela aquí. La operación "%d" sobre la base "%a" ha terminado. fi: Toiminto "%d" tietokannassa "%a" on lopetettu. fr: Voilà. L'opération "%d" sur la base "%a" est terminée. it: L'operazione "%d" sulla base "%a" é terminata. lv: Kârtîbâ. Darbîba "%d" ar datu bâzi "%a" pabeigta. sv: Operationen "%d" på databasen "%a" är avslutad. ]

    [ de: Du kannst nun mit deiner Datenbank arbeiten... en: You can consult it: es: Ud puede consultarla: fi: Voit lukea sitä osoitteessa: fr: Vous pouvez la consulter: it: Ora potete consultarla lv: Jûs variet ar to darboties: sv: Du kan konsultera den: ]


    ... [ de: oder zurück zum Hauptmenü springen. en: or return to the main menu. es: o regresar al menú principal. fi: tai palaa päävalikkoon. fr: ou revenir au menu principal. it: o tornare al menu principale. lv: atgriezties galvenajâ izvçlnç. sv: eller återvända till huvudmenyn. ] geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/merge_1.htm0000660000175200017530000001316412664543647024540 0ustar guillaumeguillaume [ de: Datenbanken zusammenführen en: Merging databases fr: Fusion de bases de données it: Fusione di basi di dati sv: Sammanslagning av databaser ]

    [ de: Datenbanken zusammenführen en: Merging databases fr: Fusion de bases de données it: Fusione di basi di dati sv: Sammanslagning av databaser ]

    %v{[ de: Warnung: Es existiert bereits eine Datenbank mit dem Namen "%o" in deinem Verzeichnis. Wenn Du den "Ok"-Knopf unten drückst, wird diese Datenbank gelöscht! en: Warning: there already exists a database with the name "%o" in your directory. If you push the button "Ok" below, it will be erased. fr: Attention: il existe déjà une base de nom "%o" dans votre répertoire. Si vous appuyez sur le bouton "Ok" ci-dessous, cela va l'effacer. it: Attenzione: existe già una base chiamata "%o" nella vostra directory. Se cliccate sul bottone "Ok" qui sotto, la base sarà cancellata. sv: Varning: det finns redan en databas med namnet "%o" i din katalog. Om du trycker knappen "OK" nedan, kommer den att raderas. ]

    [ de: Wenn du diese Operation gerade schonmal durchgeführt hat, war das wahrscheinlich das Ergebnis, und ist dann unwichtig. Andernfalls kehre auf die vorherige Seite zurück und wähle einen anderen Namen für deine Datenbank. en: If you just made this, it is probably its result, and therefore it is not important. Else, return to the previous page and choose another name for your database. fr: Si vous venez déjà de faire cette manipulation, il s'agit probablement de son résultat, ce n'est donc pas grave. Sinon, revenez en arrière et choisissez un autre nom pour votre base. it: Se avete appena effettuato questa operazione, si tratta probabilmente del suo risultato. Non è grave. Altrimenti, tornate indietro e scegliete un altro nome per la vostra base. sv: Om du just gjorde detta, är den nu nog raderad och därför är det inte viktigt. Annars, återvänd till föregående sida och välj ett annat namn för din databas. ]

    }

    [ de: Wir legen nun eine Datenbank namens "%o" aus den folgenden Datenbanken an: en: We are going to create a database named "%o" from the following databases: fr: Nous allonc créer une base de nom "%o" à partir des bases suivantes: it: Ora creeremo la base chiamata "%o" a partire dalle seguenti basi: sv: Vi ska skapa en databas med namn "%o" från de följande databaser: ]

      %s{
    • %a|}

    [ de: Bemerkung: Diese Operation kann entweder innerhalb eines Augenzwinkerns erledigt sein, oder aber einige Zehntelsekunden oder mehrere Minuten dauern, abhängig vom jeweiligen Fall. Bitte sei geduldig. en: Remark: this operation can answer in the twinkling of a eye or take some tenths of seconds or some minutes, depending on the cases. Be patient. fr: Remarque: cette opération peut s'effectuer en un clin d'oeil ou prendre quelques dizaines de secondes ou quelques minutes, suivant les cas. Soyez patient. it: Nota: questa operazione si può fare in un batter d'occhio, in qualche secondo o qualche minuto, secondo i casi. Siate pazienti. sv: Obs: denna operation kan gå blixtsnabbt eller ta tiotalet sekunder eller flera minuter, beroende på fallet. Ha tålamod. ]

    [ de: Drücke den Knopf unten um deine Datenbank anzulegen en: Push the button below to create your database fr: Appuyez sur le bouton ci-dessous pour créer votre base de données it: Cliccate sul bottone qui sotto per creare la vostra base di dati sv: Klicka knappen nedan för att skapa din databas ]%v{
    [ de: und die vorige Datenbank "%o" im Zielverzeichnis zu überschreiben en: , and overwrite the previous database "%o" of the target directory fr: et écraser la base "%o" du répertoire d'arrivée it: e cancellare la base "%o" dalla directory di destinazione sv: och skriva över den tidigare databasen "%o" i mål katalogen ]}:

    %h

    [ de: Zur Information: Diese Operation entspricht folgenden Kommandos: en: For information, this operation corresponds to the following commands: fr: Pour information, cette opération correspond à la suite des commandes suivantes: it: Per informazione, questa operazione corrisponde ai seguenti comandi: sv: Denna operation motsvarar de följande kommandona: ]

         $ cd "%w"
    %s{     $ %x%/gwu %a -o %a.gw|}     $ %x%/gwc %s{-sep %a.gw |}\-f -o %o
    
    geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/clean_ok.htm0000660000175200017530000001037512664543647024775 0ustar guillaumeguillaume [ de: Operation durchgeführt en: Operation completed es: Operación terminada fi: Toiminto suoritettu fr: Opération terminée it: Operazione terminata lv: Darbîba pabeigta sv: Operationen klar ]

    [ de: Operation durchgeführt en: Operation completed es: Operación terminada fi: Toiminto suoritettu fr: Opération terminée it: Operazione terminata lv: Darbîba pabeigta sv: Operationen klar ]

    [ de: Deine Datenbank "%a" wurde erfolgreich aufgeräumt. en: So. The cleaning up of you database "%a" is completed. es: Hela aquí. La limpieza de su base "%a" ha terminado. fi: Tietokannan puhdistaminen "%a" on valmis. fr: Le nettoyage de votre base "%a" est terminé. it: La pulizia della base "%a" è stata portata a termine. lv: Darîts. Jûsu datu bâzes "%a" sakopðana ir pabeigta. sv: Upprensningen av din databas "%a" är klar. ]

    [ de: Die Datenbank wurde erfolgreich neu erzeugt: Die alte Version steht im Unterverzeichnis "old" im Verzeichnis "%w". Falls es Probleme geben sollte, kannst du die alte Version wiederherstellen. en: Your database has been completely rebuilt: the old version is on the subdirectory "old" of the directory "%w". You can recover it in case of problem. es: Su base ha sido completamente reconstruida: la versión anterior se encuentra en la sub-carpeta "old" de la carpeta "%w". Ud podrá recuperarla en caso de problema. fi: Tietokantasi on nyt kokonaan uudelleen rakennettu: vanha versio on "%w" alahakemistossa. Voit palauttaa sen ongelman tullessa. fr: Votre base a été complètement reconstruite: l'ancienne version se trouve dans le sous-répertoire "old" du répertoire "%w". Vous pouvez l'y récupérer en cas de problème. it: La vostra base è stata completamente ricostruita; la precedente versione si trova nella sub-directory "old" della directory "%w". lv: Jûsu datu bâze ir pilîbâ pârveidota: vecâ versija glabâjas GeneWeb izplatîðanas komplekta kataloga "%w" apakðkatalogâ "old". Problçmu gadîjumâ Jûs to variet to atjaunot. sv: Din databas har blivit helt återskapad, den gamla versionen finns i underkatalogen "old" i katalogen "%w". Du kan återskapa den om det blir något problem. ]

    [ de: Du kannst nun mit deiner superaufgeräumten neuen Datenbank arbeiten... en: You can consult your very clean new database... es: Ud. puede consultar su nueva base bien "limpia"... fi: Voit lukea uutta puhdasta tietokantaasi... fr: Vous pouvez consulter votre nouvelle base toute propre... it: Ora potete consultare la vostra nuova base ben "pulita"... lv: Jûs variet griezties pie Jûsu atjauninâtâs datu bâzes... sv: Du kan nu konsultera din nya rena databas... ]


    ... [ de: oder zurück zum Hauptmenü springen. en: or return to the main menu. es: o regresar al menú principal. fi: tai palata päävalikkoon. fr: ou revenir au menu principal. it: o tornare al menu principale. lv: vai atgriezties galvenajâ izvçlnç. sv: eller återvända till huvudmenyn. ] geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/merge.htm0000660000175200017530000001472412664543647024323 0ustar guillaumeguillaume [ de: Datenbanken zusammenführen en: Merging databases fr: Fusion de bases de données it: Fusione di basi di dati sv: Sammanslagning av databaser ]

    [ de: Datenbanken zusammenführen en: Merging databases fr: Fusion de généalogies it: Fusione di basi di dati sv: Sammanslagning av databaser ]

    [ de: Alle Datenbanken, die zusammengeführt werden sollen, müssen unter GeneWeb verfügbar sein. en: All your databases to be merged must be first under GeneWeb. fr: Il faut d'abord que toutes vos bases à fusionner soient sous GeneWeb. it: Prima bisogna che tutte le basi da fondere assieme siano al formato GeneWeb. sv: Alla databaser som ska slås samman måste finnas under GeneWeb. ]

    [ de: Falls das nicht der Fall ist, sondern einige von ihnen z.B. nur als GEDCOM-Dateien oder GeneWeb-Quelldateien vorliegen, kehre zum Hauptmenü zurück, um sie unter GeneWeb anzulegen, dann kehre hierher zurück. en: If it is not the case, if, for example, some of them are just GEDCOM files or GeneWeb source files, return to the main menu to create them under GeneWeb, then go back to this page. fr: Si ce n'est pas le cas, si, par exemple, certaines d'entre elles sont sous forme GEDCOM ou fichiers source GeneWeb, revenez au menu principal pour les créer sous GeneWeb, puis revenez à cette page. it: Se non è il caso e certune, ad esempio, sono al formato GEDCOM o file sorgente GeneWeb, tornate al menu principale per crearle sotto GeneWeb, poi ritornate a questa pagina. sv: Om det inte är så, om till exempel, någon av dem bara är GEDCOM filer eller GeneWeb källfiler, gå tilbaka till huvudmenyn för att skapa dem under GeneWeb, gå sedan tillbaka till denna sida. ]

    [ de: Wenn das geschehen ist, wähle die Datenbanken, die du zusammenführen möchtest: en: Once done, select the databases you want to merge by pushing their associated buttons: fr: Une fois fait, sélectionnez les bases que vous voulez fusionner en cliquant sur leur bouton associé: it: Una volta fatto ciò, selezionate le basi che volete fondere cliccando sul bottone che è loro associato: sv: När du är klar, välj de databaser du vill slå samman genom att klicka i deras knappar: ]

    %b{ | }
    %a
    - [ de: keine Datenbank vorhanden en: there is no database at present fr: il n'y a aucune base de données actuellement it: attualmente non esiste nessuna base di dati sv: det finns ingen databas för närvarande ]

    [ de: Gib den Namen ein, den du deiner resultierenden Datenbank geben willst: en: Indicate the name you want to give to your resulting database: fr: Indiquez le nom que vous voulez donner à votre base de données résultante: it: Indicate il nome che volete dare alla base di dati risultante: sv: Skriv namnet du vill ge din databas: ]

    [ de: Dann drücke diesen Knopf: en: Then push this button: fr: Puis appuyez sur ce bouton: it: Poi cliccate su questo bottone: sv: Tryck sedan denna knapp: ]

    [ de: Bemerkung: Das Zusammenführen geschieht durch simple Konkatenation der Datenbanken. Es wird keine Überprüfung auf identische Personen durchgeführt. Nach dem Zusammenführen musst du deshalb die möglicherweise nun doppelt vorhandenen Personen oder Familien ausfindig machen und sie einzeln zusammenführen. Siehe dazu die Documentation. en: Remark: merging consists on simple concatenation of the databases. There is no research for identical persons. After merging, you therefore have to research the possible doubled persons or families and merge them. See the documentation. fr: Remarque: la fusion consiste en la simple concaténation des bases de données. Il n'y a pas de recherche de personnes identiques. Après la fusion, il faudra donc rechercher les éventuelles personnes et familles en double et les fusionner. Voir la documentation. it: Nota: Una fusione consiste in una semplice concatenazione delle basi di dati. Non viene effettuata nessuna ricerca di persone identiche. Dopo la fusione, bisognerà ricercare le eventuali persone o famiglie doppie e fonderle. Vedi la documentazione. sv: Obs: sammanslagningen lägger helt enkelt ihop databaserna. Det är ingen kontroll av identiska personer. Efter sammanslagningen, måste du därför undersöka möjligheten att det finns dubbla personer eller familjer och slå ihop dem. Se dokumentationen. ] geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/err_name.htm0000660000175200017530000000674312664543647025016 0ustar guillaumeguillaume [ de: Falscher Name en: Incorrect name es: Nombre incorrecto fi: Virheellinen nimi fr: Nom incorrect it: Nome non conforme lv: Nederîgs nosaukums sv: Felaktigt namn ]

    [ de: Falscher Name en: Incorrect name es: Nombre incorrecto fi: Virheellinen nimi fr: Nom incorrect it: Nome non conforme lv: Nederîgs nosaukums sv: Felaktigt namn ]

    [ de: Du kannst "%o" nicht als Datenbanknamen verwenden, da unerlaubte Zeichen enthalten sind. en: You cannot choose "%o" as database name, because it holds forbidden characters. es: Ud. no puede escoger "%o" como un nombre para su base de datos debido a que él contiene uno o varios carácteres prohibidos. fi: Et voi valita tietokannan nimeksi "%o" koska se sisältää kiellettyjä merkkejä. fr: Vous ne pouvez pas choisir "%o" comme nom de base de données car il contient des caractères interdits. it: Non potete scegliere "%o" come nome della vostra base perché contiene dei caratteri vietati. lv: Jûs nevarat nosaukt datu bâzi ðâdi - "%o", jo nosaukums satur aizliegtâs (rezervçtâs) zîmes. sv: Du kan inte välja "%o" som din databas namn, därför namnet innhåller förbjudna tecken. ]

    [ de: Der Name einer Datenbank kann nur aus einfachen Buchstaben (klein oder groß, keine Sonderzeichen oder Umlaute), Ziffern und dem Zeichen "-" bestehen. Alle anderen Zeichen (insbesondere das Leerzeichen) sind verboten. en: The name of a database is made of non accentuated letters (uppercase or lowercase), digits and of the character "-". Other characters (particularly space) are forbidden. es: El nombre de una base de datos debe estar constituida de letras, (mayúsculas o minúsculas) sin ningún tipo de acento, de cifras y del carácter "-". Todos los otros carácteres (en particular el "espacio") son prohibidos. fi: Tietokannan nimen pitää koostua ei aksenttisista kirjaimista, numeroista tai "-" merkistä. Muut merkit (kuten välilyönti) on kielletty. fr: Le nom d'une base de données est constitué de lettres non accentuées (majuscules ou minuscules), de chiffres et du caractère "-". Tout autre caractère (en particulier l'espace) est interdit. it: Il nome di una base di dati è costituito da lettere non accentuate (maiuscole o minuscole), di cifre e dal carattere "-". Tutti gli altri caratteri sono proibiti. lv: Datu bâzes nosaukums drîkst saturçt tikai burtus bez garumzîmçm un mîkstinâjumiem (lielos vai mazos), skaitïus un zîmi "-". Citas rakstu zîmes (ieskaitot atstarpi) ir aizliegtas. sv: Namnet för databasen kan bestå av bokstäver (versaler eller gemena), siffror och tecknet "-". Andra tecken (speciellt mellanslag) är förbjudna. ] geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/bso_err.htm0000660000175200017530000000661612664543647024660 0ustar guillaumeguillaume [error]

    [error]

    [ de: Das vorangegangene Kommando hat beim Beenden einen Fehler geliefert. Deine Datenbank wurde möglicherweise nicht angelegt. en: The previous command exited with an error code. Your database may have not been created. es: El comando anterior ha terminado con un código de error. Es posible que su base de datos "%o" no haya sido creada. fi: Edellinen komento keskeytyi virheeseen. On mahdollista ettei tietokantaa luotu. fr: La commande précédente s'est terminée avec un code d'erreur. Il se peut que votre base de données "%o" n'ait pas été créée. it: Il precedente comando ha generato un codice di errore. La vostra base "%o" non è forse stata creata. lv: Iepriekðçjâ komanda beidza savu darbu ar kïûdas kodu. Iespçjams, ka Jûsu datu bâze nav izviedota. sv: Det föregående kommandot avslutades med en felkod. Din databas kanske har skapats. ]

    [ de: Du kannst dir seine Trace-Ausgaben ansehen, vielleicht kannst du die Erklärung für das Problem erkennen. en: Look at the traces, maybe you can find an explanation. es: Vea Ud en las trazas, pueda ser que allí Ud encuentre una explicación. fi: Katso jäljitystä, ehkä löydät selityksen. fr: Regardez dans les traces, peut-être y trouverez-vous une explication. it: Date un'occhiata nelle tracce, forse vi troverete una spiegazione. lv: Skatiet comandas darbîbas pçdas, iespçjams, ka varçsiet atrast izskaidrojumu. sv: Titta på utskriften, kanske du kan finna en förklaring. ]

    [ de: Zurück zum Hauptmenü. en: Or you can return to the main menu. es: O Ud. puede regresar al menú principal. fi: Tai voit palata päävalikkoon. fr: Ou vous pouvez revenir au menu principal. it: Oppure potete tornare al menu principale. lv: Vai arî atgriezieties galvenajâ izvçlnç. sv: Eller du kan återvända till huvudmenyn. ] geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/err_outd.htm0000660000175200017530000000422412664543647025041 0ustar guillaumeguillaume [ de: Seite nicht aktuell en: Page outdated es: Página no actualizada fi: Sivu on vanhentunut fr: Page non à jour it: Pagina non aggiornata lv: Lapa novecojusi sv: Sidan är gammal ]

    [ de: Seite nicht aktuell en: Page outdated es: Página no actualizada fi: Sivu on vanhentunut fr: Page non à jour it: Pagina non aggiornata lv: Lapa novecojusi sv: Sidan är gammal ]


    [ de: Die vorherige Seite enthält veraltete Daten. en: The previous page is outdated. es: La página anterior no ha sido actualizada. fi: Edellinen sivu on vanhentunut. fr: La page précédente n'est pas à jour. it: La pagina precedente non è stata aggiornata. lv: Iepriekðçjâ lapa ir novecojusi. sv: Den föregående sidan är gammal. ]

    [ de: Bitte gehe zurück und führe die Funktion "Seite neu laden" deines Webbrowsers aus. en: Go backward and select "reload" in your Web browser. es: Vuelva a la posición anterior y seleccione "actualizar" en su explorador Web. fi: Palaa edelliselle sivulle ja valitse "reload"/"refresh" ("päivitä"), riippun selaimesta ja kielestä. fr: Revenez en arrière et sélectionnez "actualiser" dans votre navigateur Web. it Tornate indietro e selezionate "Ricarica" nel vostro navigatore web. lv: Aizejiet atpakaï un pârlâdçjiet lapu ("reload" komada caurlûkprogrammâ). sv: Gå tillbaka och välj "reload" i din webbläsare. ] geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/err_ndir.htm0000660000175200017530000000336612664543647025030 0ustar guillaumeguillaume [error]

    [error]

    [ de: Es gibt kein Verzeichnis mit diesem Namen: en: There is no directory with this name: es: No existe ninguna carpeta con el nombre: fi: Hakemistoa tällä nimellä ei ole: fr: Il n'y a pas de répertoire portant ce nom: it: Non esiste una directory con questo nome: lv: Katalogs ar ðâdu nosaukumu neeksistç: sv: Det finns ingen katalog med det namnet: ]

         %a
    

    [ de: Bitte kehre zurück auf die vorherige Seite und gib einen korrekten Verzeichnisnamen ein. en: Return to the previous screen and write the good directory. es: Regrese Ud. a la pantalla anterior e indique la carpeta correcta. fi: Palaa edelliselle sivulle ja kirjoita oikea hakemisto. fr: Revenez à l'écran précédent et indiquez le bon répertoire. it: Tornate alla videata precedente ed indicate la directory corretta. lv: Atgriezieties iepriekðçjâ lapâ un ierakstiet pareizo kataloga nosakumu. sv: Återvänd till föregående sida och skriv in den rätta katalogen. ] geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/bsi.htm0000660000175200017530000000706312664543647023777 0ustar guillaumeguillaume [ de: Funktion "%d" ausführen en: Application of "%d" es: Aplicación de "%d" fi: "%d" ohjelma fr: Application de "%d" it: Applicazione di "%d" lv: "%d" lietoðana sv: Applicering av "%d" ]

    [ de: Funktion "%d" ausführen en: Application of "%d" es: Aplicación de "%d" fi: "%d" ohjelma fr: Application de "%d" it: Applicazione di "%d" lv: "%d" lietoðana sv: Applicering av "%d" ]

    [ de: Die Funktion "%d" wird nun auf deiner Datenbank "%a" ausgeführt. Warnung: Das kann, abhängig vom Einzelfall, zwischen einigen Sekunden und mehreren Minuten dauern. Bitte habe Geduld. en: The operation "%d" will be applied on your database "%a". Warning: it can take some seconds or some minutes, depending on the case. Be patient. es: La operación "%d" va a aplicarse a su base "%a". Atención: la operación puede durar algunos segundos o algunos minutos, de acuerdo al caso. Sea paciente. fi: Toiminto "%d" hyväksytään tietokantaasi "%a". Varoitus: toiminto kestää hetken. Ole kärsivällinen. fr: L'opération "%d" va être appliquée sur votre base "%a". Attention: l'opération peut prendre quelques secondes ou quelques minutes, suivant les cas. Soyez patient. it: L'operazione viene applicata alla vostra base. Attenzione: l'operazione può prendere qualche secondo o qualche minuto, secondo i casi. Siate pazienti. lv: Darbîba "%d" tiks lietota datu bâzei "%a". Brîdinâjums: tas var aizòemt daðas sekundes, vai minûtes, atkarîbâ no nosacîjumiem. Esiet pacietîgs. sv: Operationen "%d" kommer att appliceras på din databas "%a". Varning: det kan ta några sekunder eller några minuter, beroende på fallet. Ha tålamod. ]

    [ de: Drücke diesen Knopf um zu starten: en: Push the button below to start: es: Apoyar sobre el botón inferior para comenzar: fi: Paina alla olevaa nappia aloittaaksesi: fr: Appuyez sur le bouton ci-dessous pour démarrer: it: Per iniziare, cliccate sul bottone qui sotto: lv: Nospiediet podziòu zemâk, lai sâktu: sv: Tryck på knappen nedan för att starta: ]

    %h

    [ de: Zu deiner Information: Diese Funktion entspricht der Ausführung der folgenden Kommandos: en: For information, this operation corresponds to the following commands: es: Por información, esta operación corresponde a los comandos siguientes: fi: Tiedoksi, tämä toiminto vastaa seuraavia komentoja: fr: Pour information, cette opération correspond à la suite des commandes suivantes: it: Per informazione, questa operazione corrisponde ai seguenti comandi: lv: Informâcijai: ðî darbîba atbilst sekojoðâm komandâm: sv: Denna operation motsvarar de följande kommandona: ]

         $ cd "%w"
         $ %x%/%d%p > comm.log
    
    geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/gwu_ok.htm0000660000175200017530000000563412664543647024517 0ustar guillaumeguillaume [ de: Operation durchgeführt en: Operation completed es: Operación terminada fr: Opération terminée it: Operazione terminata lv: Darîts sv: Operationen klar ]

    [ de: Operation durchgeführt en: Operation completed es: Operación terminada fr: Opération terminée it: Operazione terminata lv: Darîts sv: Operationen klar ]

    [ de: Die Extraktion der GeneWeb-Quelldatei ist beendet. en: The extraction of the GeneWeb source file is terminated. es: Bién. La extracción de su fichero fuente GeneWeb ha terminado. fr: L'extraction du fichier GeneWeb est terminée. it: L'estrazione del file GeneWeb è terminata. lv: GeneWeb datnes izveide ir pabeigta. sv: Exporteringen av GeneWeb källfilen är avslutad. ]

    [ de: Es wurde eine Daten namens "%o" erzeugt. en: This has built a file named "%o". es: Esta operación ha creado un fichero de nombre "%o". fr: Cela a construit un fichier de nom "%o". it: Questa operazione ha creato un file chiamato "%o". lv: Rezultâtâ izveidota datne: "%o". sv: Den har skapat en fil benämnd "%o". ]

    [ de: Diese Datei steht im Verzeichnis "%w". en: This file is in the directory "%w". es: Este fichero se encuentra en la carpeta "%w". fr: Ce fichier se trouve dans le répertoire "%w". it: Questo file si trova nella directory "%w". ]

    [ de: Zurück zum Hauptmenü. en: You can return to the main menu. es: Si Ud. lo desea, regrese al menú principal. fr: Vous pouvez revenir au menu principal. it: Potete tornare al menu principale. lv: Jûs variet atgriezties galvenajâ izvçlnç. sv: Du kan återvända till huvudmenyn. ] geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/intro.txt0000660000175200017530000000562012664543647024401 0ustar guillaumeguillaume [ de: Willkommen zu GeneWeb %q en: Welcome to GeneWeb %q es: Bienvenido a GeneWeb %q fr: Bienvenue dans GeneWeb %q it: Benvenuti su GeneWeb %q lv: Sveicinaati GeneWeb %q Ghenealoghijas datu baazee sv: Välkommen till GeneWeb %q ] [ de: Nimm deinen Webbrowser und öffne eine der folgenden Adressen: en: Go to your Web browser and open one of the following addresses: fr: Allez dans votre navigateur Web et ouvrez une des adresses suivantes: it: Lanciate il vostro navigatore Web e aprite uno dei seguenti indirizzi: ] http://127.0.0.1:%z/ http://localhost:%z/ [ de: Warnung: Damit dieses Programm funktioniert, darfst Du dieses Fenster nicht schließen! en: Warning: for this program to work, you must not close this window! fr: Attention: pour que cela fonctionne, vous ne devez pas fermer cette fenetre! it: Attenzione! Per poter navigare nella base, non dovete mai chiudere questa finestra! lv: Uzmaniibu: lai shii programma darbotos Juus nedriigstat aizveert sho logu! sv: Varning: för att det här programmet ska fungera, får du inte stänga detta fönster! ] [ de: Falls das nicht funktioniert, mußt du eventuell in deinem Webbrowser einige Optionen ändern, wie zum Beispiel "Offline arbeiten" oder "Für lokale Adressen keinen Proxy benutzen" oder "Für die Adresse 'localhost' nicht mit dem Internet verbinden". en: If none of theses addresses work, you may have to configure, in your browser, options like "work off-line" or "do not use the proxy for local addresses" or "do not connect to Internet for the address 'localhost'". es: Si esto no funciona, es posible que Ud. haya configurado en su explorador algunas opciones de tipo "trabajar fuera de conección" o "no utilizar un proxy con las direcciones locales" o "no conectarse al internet con la dirección 'localhost'". fr: Si aucune de ces adresses ne fonctionne, il se peut que vous ayez à configurer dans votre navigateur des options du genre "travailler hors connexion" ou "ne pas utiliser de proxy pour les adresses locales" ou "ne pas se connecter sur internet pour l'adresse 'localhost'". it: Se nessuno dei due indirizzi funziona, forse è a causa del fatto che avete configurato nel vostro navigatore un'opzione del genere "lavorare off-line" oppure "non utilizzare il proxy per gli indirizzi locali" o "non collegarsi ad internet per l'indirizzo "localhost". lv: Ja pie iepriekshmineetajiem nosaciijumiem Juus nevariet pieklhuut pie GeneWeb, Jums iespeejams jaaiestaada savaa Interneta caurluukprogramaa sekojoýi noraadiijumi: "work off-line" vai "do not use the proxy for local addresses" vai "do not connect to Internet for the address 'localhost'". sv: Om det inte fungerar, kanske du måste ställa in din webbläsare med optioner som "arbeta off-line" eller "använd inte en proxyserver för lokala adresser" eller "anslut inte till Internet för adressen 'localhost'". ] geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/gwc2.htm0000660000175200017530000001357412664543647024070 0ustar guillaumeguillaume [ de: GeneWeb-Quelldatei importieren en: Import a GeneWeb source file es: Importación d'un fichero fuente GeneWeb fr: Importation d'un fichier source GeneWeb it: Importazione di un file sorgente GeneWeb lv: GeneWeb resursdatnes imports sv: Importera en GeneWeb källfil ]

    [ de: GeneWeb-Quelldatei importieren en: Import of a GeneWeb source file es: Importación d'un fichero fuente GeneWeb fr: Importation d'un fichier source GeneWeb it: Importazione di un file sorgente GeneWeb lv: GeneWeb resursdatnes imports sv: Importera en GeneWeb källfil ]

    • [ de: Bitte gib folgende Daten ein kompletter Name deiner GeneWeb-Quelldatei (inklusive Endung ".gw"); en: Select the name of your GeneWeb source file (ending with ".gw"); es: Entre Ud el nombre completo de su fichero fuente GeneWeb (que termina en ".gw"). fr: Sélectionnnez votre fichier source GeneWeb (se terminant par ".gw"): it: Selezionate il vostro file sorgente GeneWeb (che finisce con ".gw"): lv: Ierakstiet pilnu GeneWeb resursdatnes nosaukumu (kas beidzas ar ".gw"). sv: Skriv in det kompletta namnet för din GeneWeb källfil (den måste sluta med ".gw"): ] %j

    • [ de: Den Namen, den du deiner GeneWeb-Datenbank geben möchtest. Wenn du nichts eingibst, wird der Name aus deiner GeneWeb-Quelldatei abgeleitet. en: Enter the name you want to give to your GeneWeb database. If you write nothing, it will be deducted from the GeneWeb source file. es: El nombre que Ud. desea dar a su base de datos GeneWeb. Si Ud. no escribe nada, el nombre se deducirá a partir del nombre del fichero fuente GeneWeb. fr: Entrez le nom que vous voulez donner à votre base de données GeneWeb.Si vous ne mettez rien, il sera déduit du nom du fichier source GeneWeb. it: Digitate il nome che volete dare alla vostra base di dati GeneWeb. Se non mettete niente il nome verrà dedotto da quello del file sorgente GeneWeb. lv: Ierakstiet nosaukumu, kâdâ Jûs vçlaties nosaukt savu GeneWeb datu bâzi. Ja nekas netiks ierakstîts, datu bâzes nosaukums tiks izveidots no GeneWeb resursdatnes nosaukuma. sv: Namnet du vill kalla din GeneWeb databas. Om du inte skriver någonting, kommer namnet att bli härlätt från GeneWeb källfilens namn. ]

    [ de: Wähle die gewünschten Optionen: en: Select the options you want: es: Seleccione las opciones que Ud. desee: fr: Sélectionnez les options que vous désirez: it: Selezionate le opzioni desiderate: lv: Izvçlieties atbilstoðos parametrus: sv: Välj de optioner du vill ha: ]

        [ de: Statistiken nach Abschluß der Operation ausgeben (sind dann in der Trace-Ausgabe sichtbar). en: Display some statistics at the end (they will be visible in the traces). es: Mostrar algunas estadísticas al final (ellas seran visibles en las trazas). fr: Afficher quelques statistiques à la fin (elles seront visibles dans les traces). it: Visualizzare alcune statistiche alla fine (saranno visibili nelle tracce). lv: Beigâs parâdît darbîbas statistiku (tâ bûs redzama programas darbîbâs pçdâs). sv: Visa statistik på slutet (den kommer att synas i utskriften). ]
        [ de: Datenkonsistenz nicht überprüfen. en: Do not check the consistency of the data. es: No verificar la coherencia de los datos. fr: Ne pas vérifier la cohérence des données. it: Non verificare la coerenza dei dati. lv: Nepârbaudît datu saskanîbu. sv: Kontrollera inte att databasens data är OK. ]
        [ de: Initialisierung der Blutsverwandtschaften auch durchführen. en: End by the initialization of consanguinities. es: Terminar por el cálculo previo de consanguinidad. fr: Terminer par le précalcul de consanguinité. it: Terminare con il pre-calcolo di consanguineità. lv: Nobeigt ar asinsradniecîbas pârrçíinu. sv: Avsluta med att beräkna blodsbanden. ]

    [ de: Dann drücke "Ok". en: Then click on "Ok". es: Finalmente cliquear en "Ok". fr: Puis cliquez sur "Ok". it: Poi cliccate su "Ok". lv: Tad nospiediet "Ok". sv: Klicka sedan på "OK". ]

    geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/welcome.htm0000660000175200017530000003555112664543647024660 0ustar guillaumeguillaume GeneWeb - Gwsetup

    [ de: Verwaltung und Erstellung en: Management and creation es: Ggestión y Creación fr: Gestion et création it: Gestione e la creazione lv: Vadiba un veidosana sv: ledning och skapande ]



    [ de: Sparen en: Save es: Ahorrar fi: säästää fr: Sauvegarder it: Salvare lv: Iznemot sv: Spara ]
    [ de: Familienstammbaum erstellen en: Create Family Tree es: Crear árbol genealógico fi: Luo Family Tree fr: Créer une généalogie it: Crea l'albero genealogico lv: Izveidot Family Tree sv: Skapa Family Tree ]



    [ de: Erweiterte Optionen en: Advanced Options es: Opciones avanzadas fi: Lisäasetukset fr: Options avancées it: Opzioni avanzate lv: Papildus opcijas sv: Avancerade alternativ ]
    [ de: Konfigurieren en: Configure es: Configurar fi: Määritä fr: Configurer it: Configura lv: Konfiguret sv: Konfigurera ]

    [ de: Du kannst auch auf die komplette GeneWeb-Dokumentation zugreifen. en: You can also consult the complete documentation of GeneWeb. es: Ud puede igualmente consultar la documentación completa de GeneWeb. fr: Vous pouvez également consulter la documentation complète de GeneWeb. it: Potete anche consultare la documentazione completa di GeneWeb. lv: Kâ arî Jûs variet skatît pilnîgu GeneWeb aprakstu . sv: Du kan också konsultera den kompletta dokumentationen för GeneWeb. ]

    [ en: Display in: fr: Afficher en : ] Deutsch English Español Français Italiano Latviesu Svenska
    geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/update_nldb.htm0000660000175200017530000000552412664543647025503 0ustar guillaumeguillaume [ de: Update_nldb en: Update_nldb es: Update_nldb fi: Update_nldb fr: Update_nldb it: Update_nldb lv: Update_nldb sv: Update_nldb ]

    [ de: Aktualisieren Sie Links-Seite / Familien-Chronik en: Update links page / family chronicle es: Actualizar página de enlaces / crónica familiar fi: Päivitä linkit sivu / sukukronikka fr: Mise à jour des liens fiche/chronique familiale it: Aggiornamento pagina dei link / famiglia cronaca lv: AtjauninÄt saites lapu / Ä£imenes hroniku sv: Uppdatera länksida / släktkrönika ]

    [ de: Wähle deine Datenbank mit dem zugehörigen Schalter. en: Select your database by clicking on the associated button. es: Seleccione su base de datos cliqueando en el botón asociado. fi: Valitse tietokantasi painamalla nappia alla. fr: Sélectionnez votre base de données en cliquant sur le bouton associé. it: Selezionate la vostra bese di dati cliccando sul bottone associato. lv: Select your database by clicking on the associated button. sv: Välj din databas genom att klicka pÃ¥ motsvarande knapp. ]

    %b{ | }
        %a
    - [ de: keine Datenbank vorhanden en: there is no database at present es: no existe ninguna base de datos actualmente fi: ei tietokantaa saatavilla fr: il n'y a aucune base de données actuellement it: attualmente non esiste nessuna base di dati lv: there is no database at present sv: det finns ingen databas för tillfället ]

    [ de: Dann drücke diesen Knopf: en: Then press this button: es: Luego apoye en este botón: fi: Sitten paina tätä nappia: fr: Puis appuyez sur ce bouton: it: E poi cliccate su questo bottone: lv: Then press this button: sv: Tryck sedan pÃ¥ denna knapp: ]

    geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/err_cnfl.htm0000660000175200017530000000304612664543647025011 0ustar guillaumeguillaume [error]

    [error]

    [ de: Der Name "%o" wird mehrfach benutzt. en: The name "%o" is used several times. es: El nombre "%o" es utilisado varias veces. fi: Nimi "%o" on käytetty useaan otteeseen. fr: Le nom "%o" est utilisé plusieurs fois. it: Il nome "%o" è utilizzato più volte. lv: Vârds "%o" jau eksistç. sv: Namnet "%o" är använt flera gånger. ]

    [ de: Bitte kehre auf die vorherige Seite zurück und korrigiere den Fehler. en: Return to the previous page and correct. es: Regrese a la página anterior y corrija el error. fi: Palaa edelliselle sivulle ja korjaa. fr: Revenez à la page précédente et corrigez. it: Tornate alla pagina precedente e correggete. lv: Atgriezieties iepriekðçjâ lapâ un izlabojiet. sv: Återvänd till den föregående sidan och rätta till. ] geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/lang/save.htm0000660000175200017530000001303712664543647024156 0ustar guillaumeguillaume [ de: Sichern und restaurieren en: Save and Restore es: Copia de Seguridad y Restauración fr: Sauvegarde et Restauration it: Copia di sicurezza e ripristino dati lv: Saglabâðana un atjaunoðana sv: Spara och återskapa ]

    [ de: Sichern und restaurieren en: Save and Restore es: Copia de Seguridad y Restauración fr: Sauvegarde et restauration it: Copia di sicurezza e ripristino dati lv: Saglabâðana un atjaunoðana sv: Spara och återskapa ]


    [ de: Um deine Datenbank zu sichern, verwende die Extraktion einer GeneWeb-Quelldatei. Dann kopiere die so erhaltene Datei irgendwo anders auf die Platte, oder, noch besser, auf ein externes Medium (z. B. Diskette). en: To save your database, apply the extraction of a GeneWeb source file. Then copy the obtained file elsewhere in the disk, or better, on an external support (floppy disk for example). es: Para efectuar una copia de seguridad de su base de datos, aplique Ud. la extracción de un fichero fuente GeneWeb. Copie luego el fichero asi obtenido en alguna otra parte del disco duro, o mucho mejor en un soporte externo (disquete por ejemplo). fr: Pour sauvegarder votre base de données, appliquez l'extraction d'un fichier source GeneWeb. Puis copiez le fichier ainsi obtenu autre part sur le disque, ou mieux, sur un support externe (disquette par exemple). it: Per effettuare una copia di sicurezza della vostra base procedete l'estrazione di un file sorgente GeneWeb. Poi copiate il file così ottenuto altrove sul disco, o meglio, su un supporto esterno (un zip o un floppy per esempio). lv: Lai saglabâtu datu bâzi, izveidojiet GeneWeb datni. Tad to iekopçjiet droðâ vietâ. sv: För att spara din databas, använd exportera en GeneWeb källfil. Kopiera sedan den skapade filen någon annanstans på hårddisken, eller bättre, till en annat media (diskett till exempel). ]

    [ de: Um eine Datenbank zu restaurieren, verwende die Funktion Datenbank aus GeneWeb-Quelldatei erzeugen. en: To restore a database, apply the creation from a GeneWeb source file. es: Para restaurar una base de datos, aplique Ud. la creación a partir de un fichero fuente GeneWeb. fr: Pour restaurer une base de donnée appliquez la création à partir d'un fichier source GeneWeb. it: Per ripristinare il contenuto di una base di dati effettuate una creazione partendo da un file sorgente GeneWeb. lv: Lai atjaunotu datu bâzi, izmantojiet datu bâzes izveidoðanu no GeneWeb datnes. sv: För att återskapa en databas, använd importera en GeneWeb källfil. ]

    [ de: Um eine Datenbank zu restaurieren, verwende die Funktion Datenbank aus GeneWeb-Quelldatei erzeugen (gwc2). en: To restore a database, apply the creation from a GeneWeb source file (gwc2). es: Para restaurar una base de datos, aplique Ud. la creación a partir de un fichero fuente GeneWeb (gwc2). fr: Pour restaurer une base de donnée appliquez la création à partir d'un fichier source GeneWeb (gwc2). it: Per ripristinare il contenuto di una base di dati effettuate una creazione partendo da un file sorgente GeneWeb (gwc2). lv: Lai atjaunotu datu bâzi, izmantojiet datu bâzes izveidoðanu no GeneWeb datnes (gwc2). sv: För att återskapa en databas, använd importera en GeneWeb källfil (gwc2). ]

    [ de: Zurück zum Hauptmenü. en: You can return to the main menu. es: Ud. puede regresar al menú principal. fr: Vous pouvez revenir au menu principal. it: Potete tornare al menu principale. lv: Jûs variet atgriezties galvenajâ izvçlnç. sv: Du kan återvända till huvudmenyn. ] geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/setup.ml0000660000175200017530000016345312664543647023267 0ustar guillaumeguillaume(* camlp5r *) (* $Id: setup.ml,v 5.8 2007-09-12 09:58:44 ddr Exp $ *) open Printf; value port = ref 2316; value default_lang = ref "en"; value setup_dir = ref "."; value bin_dir = ref ""; value lang_param = ref ""; value only_file = ref ""; value slashify s = let s1 = Bytes.copy s in do { for i = 0 to String.length s - 1 do { Bytes.set s1 i (match s.[i] with [ '\\' -> '/' | x -> x ]) }; s1 } ; value quote_escaped s = let rec need_code i = if i < String.length s then match s.[i] with [ '"' | '&' | '<' | '>' -> True | x -> need_code (succ i) ] else False in let rec compute_len i i1 = if i < String.length s then let i1 = match s.[i] with [ '"' -> i1 + 6 | '&' -> i1 + 5 | '<' | '>' -> i1 + 4 | _ -> succ i1 ] in compute_len (succ i) i1 else i1 in let rec copy_code_in s1 i i1 = if i < String.length s then let i1 = match s.[i] with [ '"' -> do { String.blit """ 0 s1 i1 6; i1 + 6 } | '&' -> do { String.blit "&" 0 s1 i1 5; i1 + 5 } | '<' -> do { String.blit "<" 0 s1 i1 4; i1 + 4 } | '>' -> do { String.blit ">" 0 s1 i1 4; i1 + 4 } | c -> do { Bytes.set s1 i1 c; succ i1 } ] in copy_code_in s1 (succ i) i1 else s1 in if need_code 0 then let len = compute_len 0 0 in copy_code_in (Bytes.create len) 0 0 else s ; value rec list_remove_assoc x = fun [ [(x1, y1) :: l] -> if x = x1 then l else [(x1, y1) :: list_remove_assoc x l] | [] -> [] ] ; value rec list_assoc_all x = fun [ [] -> [] | [(a, b) :: l] -> if a = x then [b :: list_assoc_all x l] else list_assoc_all x l ] ; type config = { lang : string; comm : string; env : list (string * string); request : list string; lexicon : Hashtbl.t string string } ; value transl conf w = try Hashtbl.find conf.lexicon w with [ Not_found -> "[" ^ w ^ "]" ] ; value charset conf = try Hashtbl.find conf.lexicon " !charset" with [ Not_found -> "iso-8859-1" ] ; value nl () = Wserver.wprint "\013\010"; value header_no_page_title conf title = do { Wserver.http ""; Wserver.wprint "Content-type: text/html; charset=%s" (charset conf); nl (); nl (); Wserver.wprint "\ "; Wserver.wprint "\n"; Wserver.wprint " \n"; Wserver.wprint " "; title True; Wserver.wprint "\n"; Wserver.wprint "\n"; Wserver.wprint "\n" } ; value abs_setup_dir () = if Filename.is_relative setup_dir.val then Filename.concat (Sys.getcwd ()) setup_dir.val else setup_dir.val ; value trailer conf = do { Wserver.wprint "\n
    \n"; Wserver.wprint "

    \n" ; Wserver.wprint "
    \n"; Wserver.wprint "
    \n"; Wserver.wprint "\n"; Wserver.wprint " Version %s Copyright © 1998-2012\n\n" Version.txt; Wserver.wprint "
    \n" ; Wserver.wprint "
    \n" ; (* finish the html page *) Wserver.wprint "\n"; Wserver.wprint "\n"; } ; value header conf title = do { header_no_page_title conf title; Wserver.wprint "

    "; title False; Wserver.wprint "

    \n"; } ; value strip_control_m s = loop 0 0 where rec loop i len = if i = String.length s then Buff.get len else if s.[i] = '\r' then loop (i + 1) len else loop (i + 1) (Buff.store len s.[i]) ; value strip_spaces str = let start = loop 0 where rec loop i = if i = String.length str then i else match str.[i] with [ ' ' | '\r' | '\n' | '\t' -> loop (i + 1) | _ -> i ] in let stop = loop (String.length str - 1) where rec loop i = if i = -1 then i + 1 else match str.[i] with [ ' ' | '\r' | '\n' | '\t' -> loop (i - 1) | _ -> i + 1 ] in if start = 0 && stop = String.length str then str else if start > stop then "" else String.sub str start (stop - start) ; value code_varenv = Wserver.encode; value decode_varenv = Wserver.decode; value getenv env label = decode_varenv (List.assoc (decode_varenv label) env); value p_getenv env label = try Some (getenv env label) with [ Not_found -> None ] ; value s_getenv env label = try getenv env label with [ Not_found -> "" ]; value rec skip_spaces s i = if i < String.length s && s.[i] = ' ' then skip_spaces s (i + 1) else i ; value create_env s = let rec get_assoc beg i = if i = String.length s then if i = beg then [] else [String.sub s beg (i - beg)] else if s.[i] = ';' || s.[i] = '&' then let next_i = skip_spaces s (succ i) in [String.sub s beg (i - beg) :: get_assoc next_i next_i] else get_assoc beg (succ i) in let rec separate i s = if i = String.length s then (s, "") else if s.[i] = '=' then (String.sub s 0 i, String.sub s (succ i) (String.length s - succ i)) else separate (succ i) s in List.map (separate 0) (get_assoc 0 0) ; value numbered_key k = if k = "" then None else match k.[String.length k - 1] with [ '1'..'9' as c -> Some (String.sub k 0 (String.length k - 1), c) | _ -> None ] ; value stringify s = try let _ = String.index s ' ' in "\"" ^ s ^ "\"" with [ Not_found -> s ] ; value parameters = loop "" where rec loop comm = fun [ [(k, s) :: env] -> let k = strip_spaces (decode_varenv k) in let s = strip_spaces (decode_varenv s) in if k = "" || s = "" then loop comm env else if k = "opt" then loop comm env else if k = "anon" then loop (comm ^ " " ^ stringify s) env else match numbered_key k with [ Some (k, '1') -> let (s, env) = loop ("\"" ^ s ^ "\"") env where rec loop s = fun [ [(k1, s1) :: env] as genv -> match numbered_key k1 with [ Some (k1, _) when k1 = k -> let s1 = strip_spaces (decode_varenv s1) in let s = if s1 = "" then s else s ^ " \"" ^ s1 ^ "\"" in loop s env | _ -> (s, genv) ] | [] -> (s, []) ] in loop (comm ^ " -" ^ k ^ " " ^ s) env | Some _ -> loop comm env | None -> if s = "none" then loop comm env else if s = "on" then loop (comm ^ " -" ^ k) env else if s.[0] = '_' then loop (comm ^ " -" ^ k ^ stringify s) env else if s.[String.length s - 1] = '_' then loop (comm ^ " -" ^ s ^ k) env else loop (comm ^ " -" ^ k ^ " " ^ stringify s) env ] | [] -> comm ] ; value rec list_replace k v = fun [ [] -> [(k, v)] | [(k1, v1) :: env] when k1 = k -> [(k1, v) :: env] | [kv :: env] -> [kv :: list_replace k v env] ] ; value conf_with_env conf k v = {(conf) with env = list_replace k v conf.env}; value all_db dir = let list = ref [] in let dh = Unix.opendir dir in do { try while True do { let e = Unix.readdir dh in if Filename.check_suffix e ".gwb" then list.val := [Filename.chop_suffix e ".gwb" :: list.val] else () } with [ End_of_file -> () ]; Unix.closedir dh; list.val := List.sort compare list.val; list.val } ; value selected env = List.fold_right (fun (k, v) env -> if v = "on_" then [k :: env] else env) env [] ; value parse_upto lim = loop 0 where rec loop len = parser [ [: `c when c = lim :] -> Buff.get len | [: `c; a = loop (Buff.store len c) :] -> a ] ; value is_directory x = try (Unix.lstat x).Unix.st_kind = Unix.S_DIR with [ Unix.Unix_error _ _ _ -> False ] ; value server_string conf = let s = Wserver.extract_param "host: " '\r' conf.request in try let i = String.rindex s ':' in String.sub s 0 i with [ Not_found -> "127.0.0.1" ] ; value referer conf = Wserver.extract_param "referer: " '\r' conf.request ; value only_file_name () = if only_file.val = "" then Filename.concat setup_dir.val "only.txt" else only_file.val ; value macro conf = fun [ '/' -> IFDEF UNIX THEN "/" ELSE "\\" END | 'a' -> strip_spaces (s_getenv conf.env "anon") | 'c' -> stringify setup_dir.val | 'd' -> conf.comm | 'i' -> strip_spaces (s_getenv conf.env "i") | 'l' -> conf.lang | 'm' -> server_string conf | 'n' -> referer conf | 'o' -> strip_spaces (s_getenv conf.env "o") | 'p' -> parameters conf.env | 'q' -> Version.txt | 'u' -> Filename.dirname (abs_setup_dir ()) | 'x' -> stringify bin_dir.val | 'w' -> slashify (Sys.getcwd ()) | 'y' -> Filename.basename (only_file_name ()) | '%' -> "%" | c -> "BAD MACRO " ^ String.make 1 c ] ; value get_variable strm = loop 0 where rec loop len = match strm with parser [ [: `';' :] -> Buff.get len | [: `c :] -> loop (Buff.store len c) ] ; value get_binding strm = loop 0 where rec loop len = match strm with parser [ [: `'=' :] -> let k = Buff.get len in (k, get_variable strm) | [: `c :] -> loop (Buff.store len c) ] ; value variables bname = let dir = Filename.concat setup_dir.val "setup" in let fname = Filename.concat (Filename.concat dir "lang") bname in let ic = open_in fname in let strm = Stream.of_channel ic in let (vlist, flist) = loop ([], []) where rec loop (vlist, flist) = match strm with parser [ [: `'%' :] -> let (vlist, flist) = match strm with parser [ [: `('E' | 'C') :] -> let (v, _) = get_binding strm in if not (List.mem v vlist) then ([v :: vlist], flist) else (vlist, flist) | [: `'V' :] -> let v = get_variable strm in if not (List.mem v vlist) then ([v :: vlist], flist) else (vlist, flist) | [: `'F' :] -> let v = get_variable strm in if not (List.mem v flist) then (vlist, [v :: flist]) else (vlist, flist) | [: :] -> (vlist, flist) ] in loop (vlist, flist) | [: `_ :] -> loop (vlist, flist) | [: :] -> (vlist, flist) ] in do { close_in ic; (List.rev vlist, flist) } ; value nth_field s n = loop 0 0 where rec loop nth i = let j = try String.index_from s i '/' with [ Not_found -> String.length s ] in if nth = n then String.sub s i (j - i) else if j = String.length s then s else loop (nth + 1) (j + 1) ; value translate_phrase lang lexicon s n = let n = match n with [ Some n -> n | None -> 0 ] in try let s = Hashtbl.find lexicon s in nth_field s n with [ Not_found -> "[" ^ nth_field s n ^ "]" ] ; value rec copy_from_stream conf print strm = try while True do { match Stream.next strm with [ '[' -> match Stream.peek strm with [ Some '\n' -> let s = parse_upto ']' strm in let (s, alt) = Translate.inline conf.lang '%' (macro conf) s in let s = if alt then "[" ^ s ^ "]" else s in print s | _ -> let s = loop 0 where rec loop len = match strm with parser [ [: `']' :] -> Buff.get len | [: `c :] -> loop (Buff.store len c) | [: :] -> Buff.get len ] in let n = match strm with parser [ [: `('0'..'9' as c) :] -> Some (Char.code c - Char.code '0') | [: :] -> None ] in print (translate_phrase conf.lang conf.lexicon s n) ] | '%' -> let c = Stream.next strm in match c with [ 'b' -> for_all conf print (all_db ".") strm | 'e' -> do { print "lang="; print conf.lang; List.iter (fun (k, s) -> if k = "opt" then () else do { print ";"; print k; print "="; print s; () }) conf.env } | 'g' -> print_specific_file conf print "comm.log" strm | 'h' -> do { print "\n"; List.iter (fun (k, s) -> if k = "opt" then () else do { print "\n"; () }) conf.env } | 'j' -> print_selector conf print | 'k' -> for_all conf print (fst (List.split conf.env)) strm | 'r' -> print_specific_file conf print (Filename.concat setup_dir.val "gwd.arg") strm | 's' -> for_all conf print (selected conf.env) strm | 't' -> print_if conf print (IFDEF UNIX THEN False ELSE True END) strm | 'v' -> let out = strip_spaces (s_getenv conf.env "o") in print_if conf print (Sys.file_exists (out ^ ".gwb")) strm | 'y' -> for_all conf print (all_db (s_getenv conf.env "anon")) strm | 'z' -> print (string_of_int port.val) | 'A'..'Z' | '0'..'9' as c -> match c with [ 'C' | 'E' -> let (k, v) = get_binding strm in match p_getenv conf.env k with [ Some x -> if x = v then print (if c = 'C' then " checked" else " selected") else () | None -> () ] | 'L' -> let lang = get_variable strm in let lang_def = transl conf " !languages" in print (Translate.language_name lang lang_def) | 'V' | 'F' -> let k = get_variable strm in match p_getenv conf.env k with [ Some v -> print v | None -> () ] | _ -> match p_getenv conf.env (String.make 1 c) with [ Some v -> match strm with parser [ [: `'{' :] -> let s = parse_upto '}' strm in do { print "\""; print s; print "\""; if v = s then print " selected" else () } | [: `'[' :] -> let s = parse_upto ']' strm in do { print "\""; print s; print "\""; if v = s then print " checked" else () } | [: :] -> print (strip_spaces v) ] | None -> print "BAD MACRO" ] ] | c -> print (macro conf c) ] | c -> print (String.make 1 c) ] } with [ Stream.Failure -> () ] and print_specific_file conf print fname strm = match Stream.next strm with [ '{' -> let s = parse_upto '}' strm in if Sys.file_exists fname then do { let ic = open_in fname in if in_channel_length ic = 0 then copy_from_stream conf print (Stream.of_string s) else copy_from_stream conf print (Stream.of_channel ic); close_in ic } else copy_from_stream conf print (Stream.of_string s) | _ -> () ] and print_selector conf print = let sel = try getenv conf.env "sel" with [ Not_found -> try Sys.getenv "HOME" with [ Not_found -> Sys.getcwd () ] ] in let list = let sel = IFDEF WIN95 THEN if String.length sel = 3 && sel.[1] = ':' && sel.[2] = '\\' then sel ^ "." else sel ELSE sel END in try let dh = Unix.opendir sel in loop [] where rec loop list = match try Some (Unix.readdir dh) with [ End_of_file -> None ] with [ Some x -> let list = if x = ".." then [x :: list] else if String.length x > 0 && x.[0] = '.' then list else [x :: list] in loop list | None -> List.sort compare list ] with [ Unix.Unix_error _ _ _ -> [".."] ] in do { print "
    \n";
        print "     ";
        print "";
        print sel;
        print "\n";
        let list =
          List.map
            (fun x ->
               let d =
                 if x = ".." then
                   IFDEF WIN95 THEN
                     if sel.[String.length sel - 1] <> '\\' then
                       Filename.dirname sel ^ "\\"
                     else Filename.dirname sel
                   ELSE Filename.dirname sel END
                 else Filename.concat sel x
               in
               let x = if is_directory d then Filename.concat x "" else x in
               (d, x))
            list
        in
        let max_len =
          List.fold_left (fun max_len (_, x) -> max max_len (String.length x))
            0 list
        in
        let min_interv = 2 in
        let line_len = 72 in
        let n_by_line = max 1 ((line_len + min_interv) / (max_len + min_interv)) in
        let newline () = print "\n          " in
        newline ();
        loop 1 list where rec loop i =
          fun
          [ [(d, x) :: list] ->
              do {
                print "
                     if k = "sel" then ()
                     else do { print k; print "="; print v; print ";" })
                  conf.env;
                print "sel=";
                print (code_varenv d);
                print "\">";
                print x;
                print "";
                if i = n_by_line then do {
                  newline ();
                  loop 1 list;
                }
                else if list = [] then newline ()
                else do {
                  print (String.make (max_len + 2 - String.length x) ' ');
                  loop (i + 1) list
                }
              }
          | [] -> print "\n" ];
        print "
    \n"; } and print_if conf print cond strm = match Stream.next strm with [ '{' -> let s = parse_upto '}' strm in if cond then copy_from_stream conf print (Stream.of_string s) else () | _ -> () ] and for_all conf print list strm = match Stream.next strm with [ '{' -> let s_exist = parse_upto '|' strm in let s_empty = parse_upto '}' strm in let eol = match strm with parser [ [: `'\\' :] -> False | [: :] -> True ] in if list <> [] then List.iter (fun db -> let conf = conf_with_env conf "anon" db in do { copy_from_stream conf print (Stream.of_string s_exist); if eol then print "\n" else () }) list else do { copy_from_stream conf print (Stream.of_string s_empty); if eol then print "\n" else () } | _ -> () ] ; value print_file conf bname = let dir = Filename.concat setup_dir.val "setup" in let fname = Filename.concat (Filename.concat dir "lang") bname in let ic_opt = try Some (open_in fname) with [ Sys_error _ -> None ] in match ic_opt with [ Some ic -> do { Wserver.http ""; Wserver.wprint "Content-type: text/html; charset=%s" (charset conf); nl (); nl (); copy_from_stream conf (fun x -> Wserver.wprint "%s" x) (Stream.of_channel ic); close_in ic; trailer conf } | None -> let title _ = Wserver.wprint "Error" in do { header conf title; Wserver.wprint "
    • \n"; Wserver.wprint "Cannot access file \"%s\".\n" fname; Wserver.wprint "
    \n"; trailer conf; raise Exit } ] ; value error conf str = do { header conf (fun _ -> Wserver.wprint "Incorrect request"); Wserver.wprint "%s\n" (String.capitalize str); trailer conf } ; value exec_f comm = let s = comm ^ " > " ^ "comm.log" in do { eprintf "$ cd \"%s\"\n" (Sys.getcwd ()); flush stderr; eprintf "$ %s\n" s; flush stderr; Sys.command s } ; value good_name s = loop 0 where rec loop i = if i = String.length s then True else match s.[i] with [ 'a'..'z' | 'A'..'Z' | '0'..'9' | '-' -> loop (i + 1) | _ -> False ] ; value out_name_of_ged in_file = let f = Filename.basename in_file in if Filename.check_suffix f ".ged" then Filename.chop_suffix f ".ged" else if Filename.check_suffix f ".GED" then Filename.chop_suffix f ".GED" else f ; value out_name_of_gw in_file = let f = Filename.basename in_file in if Filename.check_suffix f ".gw" then Filename.chop_suffix f ".gw" else if Filename.check_suffix f ".GW" then Filename.chop_suffix f ".GW" else f ; value basename s = loop (String.length s - 1) where rec loop i = if i < 0 then s else match s.[i] with [ 'a'..'z' | 'A'..'Z' | '0'..'9' | '_' | '.' -> loop (i - 1) | _ -> String.sub s (i + 1) (String.length s - i - 1) ] ; value setup_gen conf = match p_getenv conf.env "v" with [ Some fname -> print_file conf (basename fname) | _ -> error conf "request needs \"v\" parameter" ] ; value print_default_gwf_file conf = let gwf = [ "access_by_key=yes"; "disable_forum=yes"; "hide_private_names=no"; "use_restrict=no"; "show_consang=yes"; "display_sosa=yes"; "place_surname_link_to_ind=yes"; "max_anc_level=8"; "max_anc_tree=7"; "max_desc_level=12"; "max_desc_tree=4"; "max_cousins=2000"; "max_cousins_level=5"; "latest_event=20"; "template=*"; "long_date=no"; "counter=no"; "full_siblings=yes"; "hide_advanced_request=no" ] in let bname = try List.assoc "o" conf.env with [ Not_found -> "" ] in let dir = Sys.getcwd () in let fname = Filename.concat dir (bname ^ ".gwf") in if Sys.file_exists fname then () else do { let oc = open_out fname in List.iter (fun s -> fprintf oc "%s\n" s) gwf; close_out oc } ; value simple conf = let ged = match p_getenv conf.env "anon" with [ Some f -> strip_spaces f | None -> "" ] in let ged = if Filename.check_suffix (String.lowercase ged) ".ged" then ged else "" in let out_file = match p_getenv conf.env "o" with [ Some f -> strip_spaces f | _ -> "" ] in let out_file = if ged = "" then out_file else if out_file = "" then out_name_of_ged ged else out_file in let env = [("f", "on") :: conf.env] in let env = list_replace "anon" ged env in let conf = {comm = if ged = "" then "gwc" else "ged2gwb"; env = list_replace "o" out_file env; lang = conf.lang; request = conf.request; lexicon = conf.lexicon} in if ged <> "" && not (Sys.file_exists ged) then print_file conf "err_unkn.htm" else if out_file = "" then print_file conf "err_miss.htm" else if not (good_name out_file) then print_file conf "err_name.htm" else print_file conf "bso.htm" ; value simple2 conf = let ged = match p_getenv conf.env "anon" with [ Some f -> strip_spaces f | None -> "" ] in let ged = if Filename.check_suffix (String.lowercase ged) ".ged" then ged else "" in let out_file = match p_getenv conf.env "o" with [ Some f -> strip_spaces f | _ -> "" ] in let out_file = if ged = "" then out_file else if out_file = "" then out_name_of_ged ged else out_file in let env = [("f", "on") :: conf.env] in let env = list_replace "anon" ged env in let conf = {comm = if ged = "" then "gwc2" else "ged2gwb2"; env = list_replace "o" out_file env; lang = conf.lang; request = conf.request; lexicon = conf.lexicon} in if ged <> "" && not (Sys.file_exists ged) then print_file conf "err_unkn.htm" else if out_file = "" then print_file conf "err_miss.htm" else if not (good_name out_file) then print_file conf "err_name.htm" else print_file conf "bso.htm" ; value gwc_or_ged2gwb out_name_of_in_name conf = let in_file = match p_getenv conf.env "anon" with [ Some f -> strip_spaces f | None -> "" ] in let out_file = match p_getenv conf.env "o" with [ Some f -> strip_spaces f | _ -> "" ] in let out_file = if out_file = "" then out_name_of_in_name in_file else out_file in let conf = conf_with_env conf "o" out_file in if in_file = "" || out_file = "" then print_file conf "err_miss.htm" else if not (Sys.file_exists in_file) then print_file conf "err_unkn.htm" else if not (good_name out_file) then print_file conf "err_name.htm" else print_file conf "bso.htm" ; value gwc2_or_ged2gwb2 out_name_of_in_name conf = let in_file = match p_getenv conf.env "anon" with [ Some f -> strip_spaces f | None -> "" ] in let out_file = match p_getenv conf.env "o" with [ Some f -> strip_spaces f | _ -> "" ] in let out_file = if out_file = "" then out_name_of_in_name in_file else out_file in let conf = conf_with_env conf "o" out_file in if in_file = "" || out_file = "" then print_file conf "err_miss.htm" else if not (Sys.file_exists in_file) then print_file conf "err_unkn.htm" else if not (good_name out_file) then print_file conf "err_name.htm" else print_file conf "bso.htm" ; value gwc_check conf = let conf = {(conf) with env = [("nofail", "on"); ("f", "on") :: conf.env]} in gwc_or_ged2gwb out_name_of_gw conf ; value gwc2_check conf = let conf = {(conf) with env = [("nofail", "on"); ("f", "on") :: conf.env]} in gwc2_or_ged2gwb2 out_name_of_gw conf ; value ged2gwb_check conf = let conf = {(conf) with env = [("f", "on") :: conf.env]} in gwc_or_ged2gwb out_name_of_ged conf ; value ged2gwb2_check conf = let conf = {(conf) with env = [("f", "on") :: conf.env]} in gwc2_or_ged2gwb2 out_name_of_ged conf ; (*ifdef WIN95 then*) value infer_rc conf rc = if rc > 0 then rc else match p_getenv conf.env "o" with [ Some out_file -> if Sys.file_exists (out_file ^ ".gwb") then 0 else 2 | _ -> 0 ] ; value gwc conf = let rc = let comm = stringify (Filename.concat bin_dir.val "gwc") in exec_f (comm ^ parameters conf.env) in let rc = IFDEF WIN95 THEN infer_rc conf rc ELSE rc END in do { let gwo = strip_spaces (s_getenv conf.env "anon") ^ "o" in try Sys.remove gwo with [ Sys_error _ -> () ]; eprintf "\n"; flush stderr; if rc > 1 then print_file conf "bso_err.htm" else do { print_default_gwf_file conf; print_file conf "bso_ok.htm" } } ; value gwc2 conf = let rc = let comm = stringify (Filename.concat bin_dir.val "gwc2") in exec_f (comm ^ parameters conf.env) in let rc = IFDEF WIN95 THEN infer_rc conf rc ELSE rc END in do { let gwo = strip_spaces (s_getenv conf.env "anon") ^ "o" in try Sys.remove gwo with [ Sys_error _ -> () ]; eprintf "\n"; flush stderr; if rc > 1 then print_file conf "bso_err.htm" else do { print_default_gwf_file conf; print_file conf "bso_ok.htm" } } ; value gwu_or_gwb2ged_check suffix conf = let in_file = match p_getenv conf.env "anon" with [ Some f -> strip_spaces f | None -> "" ] in let out_file = match p_getenv conf.env "o" with [ Some f -> Filename.basename (strip_spaces f) | None -> "" ] in let out_file = if out_file = "" || out_file = Filename.current_dir_name then in_file ^ suffix else if Filename.check_suffix out_file suffix then out_file else if Filename.check_suffix out_file (String.uppercase suffix) then out_file else out_file ^ suffix in let conf = conf_with_env conf "o" out_file in if in_file = "" then print_file conf "err_miss.htm" else print_file conf "bsi.htm" ; value gwu = gwu_or_gwb2ged_check ".gw"; value gwb2ged = gwu_or_gwb2ged_check ".ged"; value gwb2ged_or_gwu_1 ok_file conf = let rc = let comm = stringify (Filename.concat bin_dir.val conf.comm) in exec_f (comm ^ parameters conf.env) in do { eprintf "\n"; flush stderr; if rc > 1 then print_file conf "bsi_err.htm" else let conf = conf_with_env conf "o" (Filename.basename (s_getenv conf.env "o")) in print_file conf ok_file } ; value gwb2ged_1 = gwb2ged_or_gwu_1 "gw2gd_ok.htm"; value gwu_1 = gwb2ged_or_gwu_1 "gwu_ok.htm"; value consang_check conf = let in_f = match p_getenv conf.env "anon" with [ Some f -> strip_spaces f | None -> "" ] in if in_f = "" then print_file conf "err_miss.htm" else print_file conf "bsi.htm" ; value update_nldb_check conf = let in_f = match p_getenv conf.env "anon" with [ Some f -> strip_spaces f | None -> "" ] in if in_f = "" then print_file conf "err_miss.htm" else print_file conf "bsi.htm" ; value has_gwu dir = match try Some (Unix.opendir dir) with [ Unix.Unix_error _ _ _ -> None ] with [ Some dh -> let gwu_found = try loop () where rec loop () = let e = Unix.readdir dh in IFDEF UNIX THEN match e with [ "gwu" -> raise Exit | _ -> loop () ] ELSE match String.lowercase e with [ "gwu.exe" -> raise Exit | _ -> loop () ] END with [ End_of_file -> False | Exit -> True ] in do { Unix.closedir dh; gwu_found } | None -> False ] ; value recover conf = let init_dir = match p_getenv conf.env "anon" with [ Some f -> strip_spaces f | None -> "" ] in let (init_dir, dir_has_gwu) = if has_gwu init_dir then (init_dir, True) else let dir = init_dir in if has_gwu dir then (dir, True) else let dir = Filename.dirname init_dir in if has_gwu dir then (dir, True) else let dir = Filename.concat dir "gw" in if has_gwu dir then (dir, True) else (init_dir, False) in let conf = conf_with_env conf "anon" init_dir in let dest_dir = Sys.getcwd () in if init_dir = "" then print_file conf "err_miss.htm" else if init_dir = dest_dir then print_file conf "err_smdr.htm" else if not (Sys.file_exists init_dir) then print_file conf "err_ndir.htm" else if (IFDEF UNIX THEN try (Unix.stat (Filename.concat init_dir ".")).Unix.st_ino = (Unix.stat (Filename.concat dest_dir ".")).Unix.st_ino with [ Unix.Unix_error _ _ _ -> False ] ELSE False END) then print_file conf "err_smdr.htm" else if not dir_has_gwu then print_file conf "err_ngw.htm" else print_file conf "recover1.htm" ; value recover_1 conf = let in_file = match p_getenv conf.env "i" with [ Some f -> strip_spaces f | None -> "" ] in let out_file = match p_getenv conf.env "o" with [ Some f -> strip_spaces f | None -> "" ] in let by_gedcom = match p_getenv conf.env "ged" with [ Some "on" -> True | _ -> False ] in let out_file = if out_file = "" then in_file else out_file in let conf = conf_with_env conf "o" out_file in if in_file = "" then print_file conf "err_miss.htm" else if not (good_name out_file) then print_file conf "err_name.htm" else let (old_to_src, o_opt, tmp, src_to_new) = if not by_gedcom then ("gwu", " > ", "tmp.gw", "gwc") else ("gwb2ged", " -o ", "tmp.ged", "ged2gwb") in let conf = {(conf) with env = [("U", old_to_src); ("O", o_opt); ("T", tmp); ("src2new", src_to_new) :: conf.env]} in print_file conf "recover2.htm" ; value recover_2 conf = let init_dir = match p_getenv conf.env "anon" with [ Some f -> strip_spaces f | None -> "" ] in let in_file = match p_getenv conf.env "i" with [ Some f -> strip_spaces f | None -> "" ] in let out_file = match p_getenv conf.env "o" with [ Some f -> strip_spaces f | None -> "" ] in let by_gedcom = match p_getenv conf.env "ged" with [ Some "on" -> True | _ -> False ] in let (old_to_src, o_opt, tmp, src_to_new) = if not by_gedcom then ("gwu", " > ", "tmp.gw", "gwc") else ("gwb2ged", " -o ", "tmp.ged", "ged2gwb") in let out_file = if out_file = "" then in_file else out_file in let conf = conf_with_env conf "o" out_file in let dir = Sys.getcwd () in let rc = try do { eprintf "$ cd \"%s\"\n" init_dir; flush stderr; Sys.chdir init_dir; let c = Filename.concat "." old_to_src ^ " " ^ in_file ^ o_opt ^ stringify (Filename.concat dir tmp) in eprintf "$ %s\n" c; flush stderr; Sys.command c } with e -> do { Sys.chdir dir; raise e } in let rc = if rc = 0 then do { eprintf "$ cd \"%s\"\n" dir; flush stderr; Sys.chdir dir; let c = Filename.concat bin_dir.val src_to_new ^ " " ^ tmp ^ " -f -o " ^ out_file ^ " > " ^ "comm.log" in eprintf "$ %s\n" c; flush stderr; let rc = Sys.command c in let rc = IFDEF WIN95 THEN infer_rc conf rc ELSE rc END in eprintf "\n"; flush stderr; rc } else rc in do { if rc > 1 then do { Sys.chdir dir; print_file conf "err_reco.htm" } else print_file conf "bso_ok.htm" } ; value rmdir dir = (* Récupère tous les fichiers et dossier d'un dossier *) (* et renvoie la liste des dossiers et la liste des fichiers. *) let read_files_folders fname = let list = List.map (fun file -> Filename.concat fname file) (Array.to_list (Sys.readdir fname)) in List.partition Sys.is_directory list in (* Parcours récursif de tous les dossiers *) let rec loop l folders files = match l with [ [] -> (folders, files) | [x :: l] -> let (fd, fi) = read_files_folders x in let l = List.rev_append l fd in let folders = List.rev_append fd folders in let files = List.rev_append fi files in loop l folders files ] in (* Toute l'arborescence de dir *) let (folders, files) = loop [dir] [] [] in do { List.iter (fun f -> try Unix.unlink f with [ _ -> () ]) files; List.iter (fun f -> try Unix.rmdir f with [ _ -> () ]) folders; try Unix.rmdir dir with [ Unix.Unix_error _ _ _ -> () ] } ; value rm_base dir = rmdir dir; value cleanup conf = let in_base = match p_getenv conf.env "anon" with [ Some f -> strip_spaces f | None -> "" ] in let conf = {(conf) with comm = "."} in if in_base = "" then print_file conf "err_miss.htm" else print_file conf "cleanup1.htm" ; value cleanup_1 conf = let in_base = match p_getenv conf.env "anon" with [ Some f -> strip_spaces f | None -> "" ] in let in_base_dir = in_base ^ ".gwb" in do { eprintf "$ cd \"%s\"\n" (Sys.getcwd ()); flush stderr; let c = Filename.concat bin_dir.val "gwu" ^ " " ^ in_base ^ " -o tmp.gw" in eprintf "$ %s\n" c; flush stderr; let _ = Sys.command c in eprintf "$ mkdir old\n"; try Unix.mkdir "old" 0o755 with [ Unix.Unix_error _ _ _ -> () ]; IFDEF UNIX THEN eprintf "$ rm -rf old/%s\n" in_base_dir ELSE do { eprintf "$ del old\\%s\\*.*\n" in_base_dir; eprintf "$ rmdir old\\%s\n" in_base_dir } END; flush stderr; rm_base (Filename.concat "old" in_base_dir); IFDEF UNIX THEN eprintf "$ mv %s old/.\n" in_base_dir ELSE eprintf "$ move %s old\\.\n" in_base_dir END; flush stderr; Sys.rename in_base_dir (Filename.concat "old" in_base_dir); let c = Filename.concat bin_dir.val "gwc" ^ " tmp.gw -nofail -o " ^ in_base ^ " > comm.log 2>&1" in eprintf "$ %s\n" c; flush stderr; let rc = Sys.command c in let rc = IFDEF WIN95 THEN infer_rc conf rc ELSE rc END in eprintf "\n"; flush stderr; if rc > 1 then let conf = {(conf) with comm = "gwc"} in print_file conf "bsi_err.htm" else print_file conf "clean_ok.htm" } ; value rec check_new_names conf l1 l2 = match (l1, l2) with [ ([(k, v) :: l], [x :: m]) -> if k <> x then do { print_file conf "err_outd.htm"; raise Exit } else if not (good_name v) then do { let conf = {(conf) with env = [("o", v) :: conf.env]} in print_file conf "err_name.htm"; raise Exit } else check_new_names conf l m | ([], []) -> () | _ -> do { print_file conf "err_outd.htm"; raise Exit } ] ; value rec check_rename_conflict conf = fun [ [x :: l] -> if List.mem x l then do { let conf = {(conf) with env = [("o", x) :: conf.env]} in print_file conf "err_cnfl.htm"; raise Exit } else check_rename_conflict conf l | [] -> () ] ; value rename conf = let rename_list = List.map (fun (k, v) -> (k, strip_spaces (decode_varenv v))) conf.env in try do { check_new_names conf rename_list (all_db "."); check_rename_conflict conf (snd (List.split rename_list)); List.iter (fun (k, v) -> if k <> v then Sys.rename (k ^ ".gwb") ("_" ^ k ^ ".gwb") else ()) rename_list; List.iter (fun (k, v) -> if k <> v then Sys.rename ("_" ^ k ^ ".gwb") (v ^ ".gwb") else ()) rename_list; print_file conf "ren_ok.htm" } with [ Exit -> () ] ; value delete conf = print_file conf "delete_1.htm"; value delete_1 conf = do { List.iter (fun (k, v) -> if v = "del" then rm_base (k ^ ".gwb") else ()) conf.env; print_file conf "del_ok.htm" } ; value merge conf = let out_file = match p_getenv conf.env "o" with [ Some f -> strip_spaces f | _ -> "" ] in let conf = {(conf) with comm = "."} in let bases = selected conf.env in if out_file = "" || List.length bases < 2 then print_file conf "err_miss.htm" else if not (good_name out_file) then print_file conf "err_name.htm" else print_file conf "merge_1.htm" ; value merge_1 conf = let out_file = match p_getenv conf.env "o" with [ Some f -> strip_spaces f | _ -> "" ] in let bases = selected conf.env in let dir = Sys.getcwd () in do { eprintf "$ cd \"%s\"\n" dir; flush stderr; Sys.chdir dir; let rc = loop bases where rec loop = fun [ [] -> 0 | [b :: bases] -> let c = Filename.concat bin_dir.val "gwu" ^ " " ^ b ^ " -o " ^ b ^ ".gw" in do { eprintf "$ %s\n" c; flush stderr; let r = Sys.command c in if r = 0 then loop bases else r } ] in let rc = if rc <> 0 then rc else do { let c = Filename.concat bin_dir.val "gwc" ^ List.fold_left (fun s b -> if s = "" then " " ^ b ^ ".gw" else s ^ " -sep " ^ b ^ ".gw") "" bases ^ " -f -o " ^ out_file ^ " > comm.log 2>&1" in eprintf "$ %s\n" c; flush stderr; Sys.command c } in if rc > 1 then print_file conf "bso_err.htm" else print_file conf "bso_ok.htm" } ; value rec cut_at_equal s = try let i = String.index s '=' in (String.sub s 0 i, String.sub s (succ i) (String.length s - succ i)) with [ Not_found -> (s, "") ] ; value read_base_env bname = let fname = bname ^ ".gwf" in match try Some (open_in fname) with [ Sys_error _ -> None ] with [ Some ic -> let env = loop [] where rec loop env = match try Some (input_line ic) with [ End_of_file -> None ] with [ Some s -> if s = "" || s.[0] = '#' then loop env else loop [cut_at_equal s :: env] | None -> env ] in do { close_in ic; env } | None -> [] ] ; value read_gwd_arg () = let fname = Filename.concat setup_dir.val "gwd.arg" in match try Some (open_in fname) with [ Sys_error _ -> None ] with [ Some ic -> let list = loop [] where rec loop list = match try Some (input_line ic) with [ End_of_file -> None ] with [ Some "" -> loop list | Some s -> loop [s :: list] | None -> list ] in do { close_in ic; let rec loop env = fun [ [x :: l] -> if x.[0] = '-' then let x = String.sub x 1 (String.length x - 1) in match l with [ [y :: l] when y.[0] <> '-' -> loop [(x, y) :: env] l | _ -> loop [(x, "") :: env] l ] else loop env l | [] -> List.rev env ] in loop [] (List.rev list) } | None -> [] ] ; value file_contents fname = match try Some (open_in fname) with [ Sys_error _ -> None ] with [ Some ic -> loop 0 where rec loop len = match try Some (input_char ic) with [ End_of_file -> None ] with [ Some '\r' -> loop len | Some c -> loop (Buff.store len c) | None -> do { close_in ic; Buff.get len } ] | None -> "" ] ; value gwf conf = let in_base = match p_getenv conf.env "anon" with [ Some f -> strip_spaces f | None -> "" ] in if in_base = "" then print_file conf "err_miss.htm" else let benv = read_base_env in_base in let trailer = quote_escaped (file_contents (Filename.concat "lang" (in_base ^ ".trl"))) in let conf = {(conf) with env = List.map (fun (k, v) -> (k, quote_escaped v)) benv @ [("trailer", trailer) :: conf.env]} in print_file conf "gwf_1.htm" ; value gwf_1 conf = let in_base = match p_getenv conf.env "anon" with [ Some f -> strip_spaces f | None -> "" ] in let benv = read_base_env in_base in let (vars, files) = variables "gwf_1.htm" in do { let oc = open_out (in_base ^ ".gwf") in let body_prop = match p_getenv conf.env "proposed_body_prop" with [ Some "" | None -> s_getenv conf.env "body_prop" | Some x -> x ] in fprintf oc "# File generated by \"setup\"\n\n"; List.iter (fun k -> match k with [ "body_prop" -> if body_prop = "" then () else fprintf oc "body_prop=%s\n" body_prop | _ -> fprintf oc "%s=%s\n" k (s_getenv conf.env k) ]) vars; List.iter (fun (k, v) -> if List.mem k vars then () else fprintf oc "%s=%s\n" k v) benv; close_out oc; let trl = strip_spaces (strip_control_m (s_getenv conf.env "trailer")) in let trl_file = Filename.concat "lang" (in_base ^ ".trl") in try Unix.mkdir "lang" 0o755 with [ Unix.Unix_error _ _ _ -> () ]; try if trl = "" then Sys.remove trl_file else do { let oc = open_out trl_file in output_string oc trl; output_string oc "\n"; close_out oc } with [ Sys_error _ -> () ]; print_file conf "gwf_ok.htm" } ; value gwd conf = let aenv = read_gwd_arg () in let get v = try List.assoc v aenv with [ Not_found -> "" ] in let conf = {(conf) with env = [("default_lang", get "lang"); ("only", get "only"); ("log", Filename.basename (get "log")) :: conf.env]} in print_file conf "gwd.htm" ; value gwd_1 conf = let oc = open_out (Filename.concat setup_dir.val "gwd.arg") in let print_param k = match p_getenv conf.env k with [ Some v when v <> "" -> fprintf oc "-%s\n%s\n" k v | _ -> () ] in do { match p_getenv conf.env "setup_link" with [ Some v -> fprintf oc "-setup_link\n" | _ -> () ]; print_param "only"; match p_getenv conf.env "default_lang" with [ Some v when v <> "" -> fprintf oc "-lang\n%s\n" v | _ -> () ]; print_param "log"; close_out oc; print_file conf "gwd_ok.htm" } ; value ged2gwb conf = let rc = let comm = stringify (Filename.concat bin_dir.val conf.comm) in exec_f (comm ^ " -fne '\"\"'" ^ parameters conf.env) in let rc = IFDEF WIN95 THEN infer_rc conf rc ELSE rc END in do { eprintf "\n"; flush stderr; if rc > 1 then print_file conf "bso_err.htm" else do { print_default_gwf_file conf; print_file conf "bso_ok.htm" } } ; value ged2gwb2 conf = let rc = let comm = stringify (Filename.concat bin_dir.val conf.comm) in exec_f (comm ^ " -fne '\"\"'" ^ parameters conf.env) in let rc = IFDEF WIN95 THEN infer_rc conf rc ELSE rc END in do { eprintf "\n"; flush stderr; if rc > 1 then print_file conf "bso_err.htm" else do { print_default_gwf_file conf; print_file conf "bso_ok.htm" } } ; value consang conf ok_file = let rc = let comm = stringify (Filename.concat bin_dir.val conf.comm) in exec_f (comm ^ parameters conf.env) in do { eprintf "\n"; flush stderr; if rc > 1 then print_file conf "bsi_err.htm" else print_file conf ok_file } ; value update_nldb conf ok_file = let rc = let comm = stringify (Filename.concat bin_dir.val conf.comm) in exec_f (comm ^ parameters conf.env) in do { eprintf "\n"; flush stderr; if rc > 1 then print_file conf "bsi_err.htm" else print_file conf ok_file } ; value separate_slashed_filename s = loop 0 where rec loop i = match try Some (String.index_from s i '/') with [ Not_found -> None ] with [ Some j -> if j > i then [String.sub s i (j - i) :: loop (j + 1)] else loop (j + 1) | None -> if i >= String.length s then [] else [String.sub s i (String.length s - i)] ] ; value start_with s x = let slen = String.length s in let xlen = String.length x in slen >= xlen && String.sub s 0 xlen = x ; value end_with s x = let slen = String.length s in let xlen = String.length x in slen >= xlen && String.sub s (slen - xlen) xlen = x ; value print_typed_file conf typ fname = let ic_opt = try Some (open_in_bin fname) with [ Sys_error _ -> None ] in match ic_opt with [ Some ic -> do { Wserver.http ""; Wserver.wprint "Content-type: %s" typ; nl (); Wserver.wprint "Content-length: %d" (in_channel_length ic); nl (); nl (); try while True do { let c = input_char ic in Wserver.wprint "%c" c } with [ End_of_file -> () ]; close_in ic; } | None -> let title _ = Wserver.wprint "Error" in do { header conf title; Wserver.wprint "
    • \n"; Wserver.wprint "Cannot access file \"%s\".\n" fname; Wserver.wprint "
    \n"; trailer conf; raise Exit } ] ; value raw_file conf s = let fname = List.fold_left Filename.concat setup_dir.val (separate_slashed_filename s) in let typ = if end_with s ".png" then "image/png" else if end_with s ".jpg" then "image/jpeg" else if end_with s ".gif" then "image/gif" else if end_with s ".css" then "text/css" else "text/html" in print_typed_file conf typ fname ; value has_gwb_directories dh = try let rec loop () = let e = Unix.readdir dh in if Filename.check_suffix e ".gwb" then True else loop () in loop () with [ End_of_file -> do { Unix.closedir dh; False } ] ; value setup_comm_ok conf = fun [ "gwsetup" -> setup_gen conf | "simple" -> simple conf | "simple2" -> simple2 conf | "recover" -> recover conf | "recover_1" -> recover_1 conf | "recover_2" -> recover_2 conf | "cleanup" -> cleanup conf | "cleanup_1" -> cleanup_1 conf | "rename" -> rename conf | "delete" -> delete conf | "delete_1" -> delete_1 conf | "merge" -> merge conf | "merge_1" -> merge_1 conf | "gwc" -> match p_getenv conf.env "opt" with [ Some "check" -> gwc_check conf | _ -> gwc conf ] | "gwc2" -> match p_getenv conf.env "opt" with [ Some "check" -> gwc2_check conf | _ -> gwc2 conf ] | "gwu" -> match p_getenv conf.env "opt" with [ Some "check" -> gwu conf | _ -> gwu_1 conf ] | "ged2gwb" -> match p_getenv conf.env "opt" with [ Some "check" -> ged2gwb_check conf | _ -> ged2gwb conf ] | "ged2gwb2" -> match p_getenv conf.env "opt" with [ Some "check" -> ged2gwb2_check conf | _ -> ged2gwb2 conf ] | "gwb2ged" -> match p_getenv conf.env "opt" with [ Some "check" -> gwb2ged conf | _ -> gwb2ged_1 conf ] | "consang" -> match p_getenv conf.env "opt" with [ Some "check" -> consang_check conf | _ -> consang conf "consg_ok.htm" ] | "update_nldb" -> match p_getenv conf.env "opt" with [ Some "check" -> update_nldb_check conf | _ -> update_nldb conf "update_nldb_ok.htm" ] | "gwf" -> gwf conf | "gwf_1" -> gwf_1 conf | "gwd" -> gwd conf | "gwd_1" -> gwd_1 conf | x -> if start_with x "doc/" || start_with x "images/" || start_with x "css/" then raw_file conf x else error conf ("bad command: \"" ^ x ^ "\"") ] ; value setup_comm conf comm = match p_getenv conf.env "cancel" with [ Some _ -> setup_gen {(conf) with env = [("lang", conf.lang); ("v", "main.htm")]} | None -> setup_comm_ok conf comm ] ; value string_of_sockaddr = fun [ Unix.ADDR_UNIX s -> s | Unix.ADDR_INET a _ -> Unix.string_of_inet_addr a ] ; value local_addr = "127.0.0.1"; value only_addr () = let fname = only_file_name () in match try Some (open_in fname) with [ Sys_error _ -> None ] with [ Some ic -> let v = try input_line ic with [ End_of_file -> local_addr ] in do { close_in ic; v } | None -> local_addr ] ; value lindex s c = pos 0 where rec pos i = if i = String.length s then None else if s.[i] = c then Some i else pos (i + 1) ; value input_lexicon lang = let t = Hashtbl.create 501 in try let ic = open_in (List.fold_right Filename.concat [setup_dir.val; "setup"; "lang"] "lexicon.txt") in let derived_lang = match lindex lang '-' with [ Some i -> String.sub lang 0 i | _ -> "" ] in try do { try while True do { let k = find_key (input_line ic) where rec find_key line = if String.length line < 4 then find_key (input_line ic) else if String.sub line 0 4 <> " " then find_key (input_line ic) else line in let k = String.sub k 4 (String.length k - 4) in let rec loop line = match lindex line ':' with [ Some i -> let line_lang = String.sub line 0 i in do { if line_lang = lang || line_lang = derived_lang && not (Hashtbl.mem t k) then let v = if i + 1 = String.length line then "" else String.sub line (i + 2) (String.length line - i - 2) in Hashtbl.add t k v else (); loop (input_line ic) } | None -> () ] in loop (input_line ic) } with [ End_of_file -> () ]; close_in ic; t } with e -> do { close_in ic; raise e } with [ Sys_error _ -> t ] ; value setup (addr, req) comm env_str = let conf = let env = create_env env_str in if env = [] && (comm = "" || String.length comm = 2) then let lang = if comm = "" then default_lang.val else String.lowercase comm in let lexicon = input_lexicon lang in {lang = lang; comm = ""; env = env; request = req; lexicon = lexicon} else let (lang, env) = match p_getenv env "lang" with [ Some x -> (x, list_remove_assoc "lang" env) | _ -> (default_lang.val, env) ] in let lexicon = input_lexicon lang in {lang = lang; comm = comm; env = env; request = req; lexicon = lexicon} in let saddr = string_of_sockaddr addr in let s = only_addr () in if s <> saddr then do { let conf = {(conf) with env = [("anon", saddr); ("o", s)]} in eprintf "Invalid request from \"%s\"; only \"%s\" accepted.\n" saddr s; flush stderr; print_file conf "err_acc.htm" } else if conf.comm = "" then print_file conf "welcome.htm" else setup_comm conf comm ; value wrap_setup a b c = do { IFDEF WIN95 THEN do { (* another process have been launched, therefore we lost variables; and we cannot parse the arg list again, because of possible spaces in arguments which may appear as separators *) try default_lang.val := Sys.getenv "GWLANG" with [ Not_found -> () ]; try setup_dir.val := Sys.getenv "GWGD" with [ Not_found -> () ]; try bin_dir.val := Sys.getenv "GWGD" with [ Not_found -> () ] } ELSE () END; try setup a b c with [ Exit -> () ] } ; value copy_text lang fname = let dir = Filename.concat setup_dir.val "setup" in let fname = Filename.concat dir fname in match try Some (open_in fname) with [ Sys_error _ -> None ] with [ Some ic -> let conf = {lang = lang; comm = ""; env = []; request = []; lexicon = Hashtbl.create 1} in do { copy_from_stream conf print_string (Stream.of_channel ic); flush stdout; close_in ic } | _ -> do { printf "\nCannot access file \"%s\".\n" fname; printf "Type \"Enter\" to exit\n? "; flush stdout; let _ = input_line stdin in (); exit 2 } ] ; value set_gwd_default_language_if_absent lang = let env = read_gwd_arg () in let fname = Filename.concat setup_dir.val "gwd.arg" in match try Some (open_out fname) with [ Sys_error _ -> None ] with [ Some oc -> let lang_found = ref False in do { List.iter (fun (k, v) -> do { fprintf oc "-%s\n" k; if k = "lang" then lang_found.val := True else (); if v <> "" then fprintf oc "%s\n" v else (); }) env; if not lang_found.val then fprintf oc "-lang\n%s\n" lang else (); close_out oc } | None -> () ] ; value daemon = ref False; value usage = "Usage: " ^ Filename.basename Sys.argv.(0) ^ " [options] where options are:"; value speclist = [("-lang", Arg.String (fun x -> lang_param.val := x), ": default lang"); ("-daemon", Arg.Set daemon, ": Unix daemon mode."); ("-p", Arg.Int (fun x -> port.val := x), ": Select a port number (default = " ^ string_of_int port.val ^ "); > 1024 for normal users."); ("-only", Arg.String (fun s -> only_file.val := s), ": File containing the only authorized address"); ("-gd", Arg.String (fun x -> setup_dir.val := x), ": gwsetup directory"); ("-bindir", Arg.String (fun x -> bin_dir.val := x), ": binary directory (default = value of option -gd)") :: IFDEF SYS_COMMAND THEN [("-wserver", Arg.String (fun _ -> ()), " (internal feature)")] ELSE [] END] ; value anonfun s = raise (Arg.Bad ("don't know what to do with " ^ s)); value null_reopen flags fd = IFDEF UNIX THEN do { let fd2 = Unix.openfile "/dev/null" flags 0 in Unix.dup2 fd2 fd; Unix.close fd2 } ELSE () END ; value setup_available_languages = ["de"; "en"; "es"; "fr"; "it"; "lv"; "sv"]; value intro () = let (default_gwd_lang, default_setup_lang) = IFDEF UNIX THEN let s = try Sys.getenv "LANG" with [ Not_found -> "" ] in if List.mem s Version.available_languages then (s, if List.mem s setup_available_languages then s else "en") else let s = try Sys.getenv "LC_CTYPE" with [ Not_found -> "" ] in if String.length s >= 2 then let s = String.sub s 0 2 in if List.mem s Version.available_languages then (s, if List.mem s setup_available_languages then s else "en") else (default_lang.val, default_lang.val) else (default_lang.val, default_lang.val) ELSE (default_lang.val, default_lang.val) END in do { Argl.parse speclist anonfun usage; if bin_dir.val = "" then bin_dir.val := setup_dir.val else (); default_lang.val := default_setup_lang; let (gwd_lang, setup_lang) = if daemon.val then IFDEF UNIX THEN do { let setup_lang = if String.length lang_param.val < 2 then default_setup_lang else lang_param.val in printf "To start, open location http://localhost:%d/\n" port.val; flush stdout; if Unix.fork () = 0 then do { Unix.close Unix.stdin; null_reopen [Unix.O_WRONLY] Unix.stdout } else exit 0; (default_gwd_lang, setup_lang) } ELSE (default_gwd_lang, default_setup_lang) END else do { let (gwd_lang, setup_lang) = if String.length lang_param.val < 2 then do { copy_text "" "intro.txt"; let x = String.lowercase (input_line stdin) in if String.length x < 2 then (default_gwd_lang, default_setup_lang) else let x = String.sub x 0 2 in (x, x) } else (lang_param.val, lang_param.val) in copy_text setup_lang (Filename.concat "lang" "intro.txt"); (gwd_lang, setup_lang) } in set_gwd_default_language_if_absent gwd_lang; default_lang.val := setup_lang; IFDEF WIN95 THEN do { Unix.putenv "GWLANG" setup_lang; Unix.putenv "GWGD" setup_dir.val } ELSE () END; printf "\n"; flush stdout } ; value main () = do { IFDEF UNIX THEN intro () ELSE IFDEF SYS_COMMAND THEN let len = Array.length Sys.argv in if len > 2 && Sys.argv.(len - 2) = "-wserver" then () else intro () ELSE try let _ = Sys.getenv "WSERVER" in () with [ Not_found -> intro () ] END END; Wserver.f None port.val 0 None wrap_setup } ; main (); geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/.depend0000660000175200017530000000034212664543647023020 0ustar guillaumeguillaumesetup.cmo: ../src/argl.cmo ../src/buff.cmo ../src/translate.cmi \ ../src/version.cmo ../wserver/wserver.cmi setup.cmx: ../src/argl.cmx ../src/buff.cmx ../src/translate.cmx \ ../src/version.cmx ../wserver/wserver.cmx geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/setup/intro.txt0000660000175200017530000000042312664543647023454 0ustar guillaumeguillaume* Deutsche Version: "de" eingeben * English version: type "en" * Version espanola: escribir en el teclado "es" * Suomalainen versio: kirjoita "fi" * Version francaise: tapez "fr" * Versione italiana: digitate "it" * Latvieðu versija: type "lv" * Svensk version: skriv "sv" ? geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/0002770000175200017530000000000012664543647022062 5ustar guillaumeguillaumegeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/misc/0002770000175200017530000000000012664543647023015 5ustar guillaumeguillaumegeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/misc/birthdays0000660000175200017530000000346012664543647024733 0ustar guillaumeguillaume#!/bin/sh # # $version 0.01 # # Get the "Birthdays" page from a GeneWeb database. # Output all birthdays near a day or whole month # # Quick hack for GeneWeb linux users # by Falko Trojahn # # Needed programs: bash lynx grep # # # Arguments: without args, give us the birthdays from the localhost # GeneWeb Database (PLEASE change GWBASE according to your # database dir) # month as argument number one, get all anniversaries for this month # $1 if there is an argument 1, this is the geneweb host we use, # e.g. localhost:2317/base (optional) # $2 if there is an argument 2, it is the number of the month, # e. g. 12 for december (optional) # # crontab usage: # put the script in your home path (or whereever your sysadmin # permitted you to do so) and put the following two lines # (without the "#", fill in your correct link) into your crontab: # # 1 0 * * * ~/birthdays localhost\:2317/base # 1 0 1 * * ~/birthdays localhost\:2317/base `date +\%m` # # short usage: # 1 0 * * * ~/birthdays # 1 0 1 * * ~/birthdays month # # Whenever there is an anniversary in one of the following days, # you get a mail! # # Put the Name of your GeneWeb-Database here: # GWBASE=familie # # No lines to change from here # # echo $0 if [ -z $1 ] ; then genewebhost="localhost:2317/$GWBASE" selection="" elif [ $1 == month ] ; then genewebhost="localhost:2317/$GWBASE" selection=";v=`date +\%m`" elif [ -z $2 ] ; then genewebhost=$1 else genewebhost=$1 selection=";v=$2" fi lynx -dump -width 200 http://$genewebhost\?m=AN$selection | grep "[\*\|\+|\,]"| grep -v http lynx -dump -width 200 http://$genewebhost\?m=AM$selection | grep "[\*\|\+|\,]"| grep -v http # # End of Script # geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/lex/0002770000175200017530000000000012664543647022652 5ustar guillaumeguillaumegeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/lex/Makefile0000660000175200017530000000076112664543647024315 0ustar guillaumeguillaume# $Id: Makefile.lex, v 0.1 2014-10-10 23:25:31 ipfix Exp $ EXEC = lex_utils CAMLOPT = ocamlopt.opt CAMLDEP = ocamldep LIBS=str.cma SOURCES = lex_utils.ml all: depend $(EXEC).opt OPTOBJS = $(SOURCES:.ml=.cmx) $(EXEC).opt: $(OPTOBJS) $(CAMLOPT) $(LIBS:.cma=.cmxa) $(OPTOBJS) -o $(EXEC) .SUFFIXES: .ml .mli .cmo .cmi .cmx .ml.cmx: $(CAMLOPT) -c $< clean: rm -f *.cm[iox] *~ .*~ *.o *.annot #*# rm -f $(EXEC) rm -f $(EXEC).opt depend: $(CAMLDEP) *.mli *.ml > .depend include .depend geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/lex/lex_utils.ml0000660000175200017530000002606212664543647025221 0ustar guillaumeguillaume(* Build : ocamlopt.opt lex_utils.ml -o lex_utils *) (**/**) (* Utils. *) let start_with s p = String.length p <= String.length s && String.sub s 0 (String.length p) = p ;; let skip_to_next_message ic = let rec loop () = let line = input_line ic in if start_with line " " then line else loop () in loop () ;; let get_all_versions ic = let rec loop accu = let line = try input_line ic with End_of_file -> "" in if line = "" then accu else try let i = String.index line ':' in let lang = String.sub line 0 i in let transl = String.sub line (i + 1) (String.length line - i - 1) in loop ((lang, transl) :: accu) with Not_found -> accu in loop [] ;; (**/**) (* Missing or unused translation. *) let get_files dir = (* Récupère tous les fichiers et dossier d'un dossier *) (* et renvoie la liste des dossiers et la liste des fichiers. *) let read_files_folders fname = let list = List.map (fun file -> Filename.concat fname file) (Array.to_list (Sys.readdir fname)) in List.partition Sys.is_directory list in (* Parcours récursif de tous les dossiers *) let rec loop l folders files = match l with | [] -> (folders, files) | x :: l -> let (fd, fi) = read_files_folders x in let l = List.rev_append l fd in let folders = List.rev_append fd folders in let files = List.rev_append fi files in loop l folders files in (* Toute l'arborescence de dir *) let (folders, files) = loop [dir] [] [] in (folders, files) ;; let get_ml_files repo = let (folders, files) = get_files repo in List.filter (fun x -> Filename.check_suffix x ".ml") files ;; let get_tpl_files repo = let (folders, files) = get_files repo in List.filter (fun x -> Filename.check_suffix x ".txt") files ;; (* Récupère tous les identifiants de message de lexicon. *) let get_lexicon_msg lexicon = let lex = ref [] in match try Some (open_in lexicon) with Sys_error _ -> None with | Some ic -> (try while true do let msg = skip_to_next_message ic in lex := msg :: !lex done with End_of_file -> ()); close_in ic; List.rev_map (fun w -> String.sub w 4 (String.length w - 4)) !lex | None -> !lex ;; let cut_all_msg_src s = let list = ref [] in let i = ref 0 in let regexp = Str.regexp "transl" in try while true do i := Str.search_forward regexp s !i; let start = String.index_from s !i '"' in let stop = let rec loop k = let stop = String.index_from s k '"' in if s.[stop - 1] = '\\' then loop (stop + 1) else stop in loop (start + 1) in list := String.sub s (start + 1) (stop - start - 1) :: !list; i := stop + 1 done; !list with Not_found -> !list ;; let get_msg_src repo = let msg = ref [] in let regexp = Str.regexp "transl .* \"" in List.iter (fun src -> match try Some (open_in src) with Sys_error _ -> None with | Some ic -> (try while true do let line = input_line ic in let has_msg = try ignore (Str.search_forward regexp line 0); true with Not_found -> false in if has_msg then msg := line :: !msg else () done with End_of_file -> ()); close_in ic; | None -> ()) (get_ml_files repo); List.fold_left (fun accu msg -> List.rev_append (cut_all_msg_src msg) accu) [] !msg ;; let cut_all_msg s = let list = ref [] in let i = ref 0 in try while true do let start = String.index_from s !i '[' in let stop = String.index_from s (start + 1) ']' in let w = if s.[start + 1] = '*' then String.sub s (start + 2) (stop - start - 2) else String.sub s (start + 1) (stop - start - 1) in let w = try (* loop si msg contient ':' *) let i = String.index w ':' in if (i + 2) < String.length w && w.[i + 1] = ':' && w.[i + 2] = ':' then String.sub w 0 i else w with Not_found -> w in let multi_msg w = try let i = String.index w ':' in if (i + 1) < String.length w && w.[i + 1] = ':' then list := (String.sub w 0 i) :: (String.sub w (i+2) (String.length w - i - 2)) :: !list else list := w :: !list with Not_found -> list := w :: !list in let not_msg = List.exists (fun x -> start_with w x) ["type="; "value="; "name="; "id="] in if not_msg then () else multi_msg w; i := stop + 1 done; !list with Not_found -> !list ;; let get_msg_tpl repo = let msg = ref [] in let regexp = Str.regexp "[*?[a-z]+]" in List.iter (fun tpl -> match try Some (open_in tpl) with Sys_error _ -> None with | Some ic -> (try while true do let line = input_line ic in let has_msg = try ignore (Str.search_forward regexp line 0); true with Not_found -> false in if has_msg then msg := line :: !msg else () done with End_of_file -> ()); close_in ic; | None -> ()) (get_tpl_files repo); List.fold_left (fun accu msg -> List.rev_append (cut_all_msg msg) accu) [] !msg ;; module StringSet = Set.Make (struct type t = string let compare = Pervasives.compare end) ;; let sort_uniq cmp l = let list = List.fold_left (fun accu e -> StringSet.add e accu) StringSet.empty l in List.sort cmp (StringSet.elements list) ;; (* Essaie de chercher tous les identifiants de message du répository et *) (* recherche s'il ne sont plus utilisés pour au contraire non trdauit. *) let missing_or_unused_msg lexicon repo log = let lexicon = if Filename.is_relative lexicon then Filename.concat (Sys.getcwd ()) lexicon else lexicon in let repo = if Filename.is_relative repo then Filename.concat (Sys.getcwd ()) repo else repo in let repo_src = Filename.concat repo "src" in let repo_tpl = List.fold_left Filename.concat repo ["hd"; "etc"] in let lex = get_lexicon_msg lexicon in let msg_src = get_msg_src repo in let msg_tpl = get_msg_tpl repo_tpl in let msg = sort_uniq (fun x y -> Pervasives.compare (String.lowercase x) (String.lowercase y)) (List.rev_append msg_src msg_tpl) in if log then begin (match try Some (open_out "log_lex") with Sys_error _ -> None with | Some oc -> List.iter (fun w -> Printf.fprintf oc "%s\n" w) lex; close_out oc | None -> ()); (match try Some (open_out "log_msg") with Sys_error _ -> None with | Some oc -> List.iter (fun w -> Printf.fprintf oc "%s\n" w) msg; close_out oc | None -> ()); print_endline "View log_lex for lexicon msg and log_msg for src and tpl msg." end else begin Printf.fprintf stdout "\nMessage not used anymore in %s and %s :\n" repo_src repo_tpl; flush stdout; List.iter (fun w -> if List.mem w msg then () else print_endline w) lex; Printf.fprintf stdout "\nMessage from %s and %s not in lexicon :\n" repo_src repo_tpl; flush stdout; List.iter (fun w -> if List.mem w lex then () else print_endline w) msg end ;; (**/**) (* Missing translation. *) let lang_gw = [ "af"; "bg"; "br"; "ca"; "cs"; "da"; "de"; "en"; "eo"; "es"; "et"; "fi"; "fr"; "he"; "is"; "it"; "lv"; "nl"; "no"; "pl"; "pt"; "pt-br"; "ro"; "ru"; "sl"; "sv"; "zh" ] ;; let lang_gnt = [ "de"; "en"; "es"; "fi"; "fr"; "it"; "nl"; "no"; "sv" ] ;; let lang_cust = ref [] ;; let missing_languages list languages = List.fold_left (fun accu lang -> if not (List.mem_assoc lang list) then (lang :: accu) else accu) [] languages ;; let print_transl_en_fr list = let en_transl = try List.assoc "en" list with Not_found -> "" in let fr_transl = try List.assoc "fr" list with Not_found -> "" in if en_transl <> "" then print_endline ("en:" ^ en_transl); if fr_transl <> "" then print_endline ("fr:" ^ fr_transl) ;; let missing_translation lexicon languages = match try Some (open_in lexicon) with Sys_error _ -> None with | Some ic -> (try while true do let msg = skip_to_next_message ic in let list = get_all_versions ic in let list' = missing_languages list languages in if list' <> [] then begin print_endline msg; print_transl_en_fr list; List.iter (fun lang -> print_endline (lang ^ ":")) (List.rev list'); print_string "\n" end done with End_of_file -> ()); close_in ic | None -> () ;; (**/**) (* Sorting. *) module Lex_map = Map.Make (struct type t = string let compare x y = compare (String.lowercase x) (String.lowercase y) end) ;; let sort_lexicon lexicon = let lex_sort = ref Lex_map.empty in (match try Some (open_in lexicon) with Sys_error _ -> None with | Some ic -> (try while true do let msg = skip_to_next_message ic in let list = get_all_versions ic in let list' = List.sort (fun (x, _) (y, _) -> compare x y) list in lex_sort := Lex_map.add msg list' !lex_sort done with End_of_file -> ()); close_in ic | None -> ()); Lex_map.iter (fun msg list -> print_endline msg; List.iter (fun (lang, transl) -> print_endline (lang ^ ":" ^ transl)) list; print_string "\n") !lex_sort ;; (**/**) (* Main. *) let lexicon = ref "" ;; let lex_sort = ref false ;; let missing_gw = ref false ;; let missing_gnt = ref false ;; let repo = ref "" ;; let log = ref false ;; let speclist = [("-sort", Arg.Set lex_sort, ": sort the lexicon (both key and content)."); ("-missing_gw", Arg.Set missing_gw, ": print missing translation managed by gw."); ("-missing_gnt", Arg.Set missing_gnt, ": print missing translation managed by gnt."); ("-missing_one", Arg.String (fun x -> lang_cust := x :: !lang_cust), ": print missing translation for these languages."); ("-repo", Arg.String (fun x -> repo := x), ": check missing or unused key word."); ("-log", Arg.Set log, ": option for repo. Print in log files instead of stdout.")]; ;; let anonfun s = lexicon := s ;; let usage = "Usage: lex_utils [options] lexicon" ;; let main () = Arg.parse speclist anonfun usage; if !lexicon = "" then (Arg.usage speclist usage; exit 2); if !lex_sort then sort_lexicon !lexicon else if !missing_gw then missing_translation !lexicon lang_gw else if !missing_gnt then missing_translation !lexicon lang_gnt else if !lang_cust <> [] then missing_translation !lexicon !lang_cust else if !repo <> "" then missing_or_unused_msg !lexicon !repo !log else () ;; Printexc.catch main () geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/gwbase/0002770000175200017530000000000012664543647023332 5ustar guillaumeguillaumegeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/gwbase/etc/0002770000175200017530000000000012664543647024105 5ustar guillaumeguillaumegeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/gwbase/etc/Makefile0000660000175200017530000001534212664543647025551 0ustar guillaumeguillaume# $Id: Makefile,v 4.36 2009-03-11 10:58:50 deraugla Exp $ include Makefile.inc GWB=../../../ OCAMLI=-I $(GWB)/src STD_OBJS=$(GWB)/src/adef.cmo $(GWB)/src/buff.cmo $(GWB)/src/name.cmo $(GWB)/src/iovalue.cmo $(GWB)/src/mutil.cmo $(GWB)/src/futil.cmo $(GWB)/src/dutil.cmo $(GWB)/src/btree.cmo $(GWB)/src/secure.cmo $(GWB)/src/database.cmo $(GWB)/src/db2.cmo $(GWB)/src/db2disk.cmo $(GWB)/src/diff.cmo $(GWB)/src/gwdb.cmo $(GWB)/src/checkItem.cmo $(GWB)/src/gutil.cmo GENEANET_OBJS=$(GWB)/src/adef.cmo $(GWB)/src/iovalue.cmo $(GWB)/src/buff.cmo $(GWB)/src/name.cmo $(GWB)/src/ansel.cmo $(GWB)/src/mutil.cmo $(GWB)/src/futil.cmo $(GWB)/src/dutil.cmo $(GWB)/src/btree.cmo $(GWB)/src/secure.cmo $(GWB)/src/database.cmo $(GWB)/src/db2.cmo $(GWB)/src/db2disk.cmo $(GWB)/src/diff.cmo $(GWB)/src/gwdb.cmo $(GWB)/src/checkItem.cmo $(GWB)/src/gutil.cmo $(GWB)/src/argl.cmo geneanet.cmo CLAVIER_OBJS=clavier.cmo CONNEX_OBJS=$(GWB)/src/argl.cmo $(GWB)/src/adef.cmo $(GWB)/src/buff.cmo $(GWB)/src/name.cmo $(GWB)/src/ansel.cmo $(GWB)/src/iovalue.cmo $(GWB)/src/mutil.cmo $(GWB)/src/futil.cmo $(GWB)/src/dutil.cmo $(GWB)/src/btree.cmo $(GWB)/src/secure.cmo $(GWB)/src/database.cmo $(GWB)/src/db2.cmo $(GWB)/src/db2disk.cmo $(GWB)/src/diff.cmo $(GWB)/src/gwdb.cmo $(GWB)/src/checkItem.cmo $(GWB)/src/gutil.cmo $(GWB)/src/lock.cmo connex.cmo HIST_OBJS=$(GWB)/src/argl.cmo $(GWB)/src/adef.cmo $(GWB)/src/buff.cmo $(GWB)/src/name.cmo $(GWB)/src/iovalue.cmo $(GWB)/src/mutil.cmo $(GWB)/src/futil.cmo $(GWB)/src/dutil.cmo $(GWB)/src/btree.cmo $(GWB)/src/secure.cmo $(GWB)/src/database.cmo $(GWB)/src/db2.cmo $(GWB)/src/db2disk.cmo $(GWB)/src/diff.cmo $(GWB)/src/gwdb.cmo $(GWB)/src/checkItem.cmo $(GWB)/src/gutil.cmo hist.cmo SELROY_OBJS=$(GWB)/src/argl.cmo $(GWB)/src/adef.cmo $(GWB)/src/iovalue.cmo $(GWB)/src/buff.cmo $(GWB)/src/name.cmo $(GWB)/src/mutil.cmo $(GWB)/src/futil.cmo $(GWB)/src/dutil.cmo $(GWB)/src/btree.cmo $(GWB)/src/secure.cmo $(GWB)/src/database.cmo $(GWB)/src/db2.cmo $(GWB)/src/db2disk.cmo $(GWB)/src/diff.cmo $(GWB)/src/gwdb.cmo $(GWB)/src/checkItem.cmo $(GWB)/src/gutil.cmo select.cmo $(GWB)/src/calendar.cmo selroy.cmo CHKIMG_OBJS=$(GWB)/src/argl.cmo $(GWB)/src/adef.cmo $(GWB)/src/buff.cmo $(GWB)/src/name.cmo $(GWB)/src/iovalue.cmo $(GWB)/src/mutil.cmo $(GWB)/src/futil.cmo $(GWB)/src/dutil.cmo $(GWB)/src/btree.cmo $(GWB)/src/secure.cmo $(GWB)/src/database.cmo $(GWB)/src/db2.cmo $(GWB)/src/db2disk.cmo $(GWB)/src/diff.cmo $(GWB)/src/gwdb.cmo $(GWB)/src/checkItem.cmo $(GWB)/src/gutil.cmo chkimg.cmo CONSMOY_OBJS=$(GWB)/src/argl.cmo $(GWB)/src/adef.cmo $(GWB)/src/buff.cmo $(GWB)/src/name.cmo $(GWB)/src/iovalue.cmo $(GWB/src/mutil.cmo $(GWB)/src/futil.cmo $(GWB)/src/dutil.cmo $(GWB)/src/btree.cmo $(GWB)/src/secure.cmo $(GWB)/src/database.cmo $(GWB)/src/db2.cmo $(GWB)/src/diff.cmo $(GWB)/src/gwdb.cmo $(GWB)/src/checkItem.cmo $(GWB)/src/gutil.cmo consmoy.cmo CLEOPATRE_OBJS=$(STD_OBJS) gwlib.cmo cleopatre.cmo POPULE_OBJS=$(STD_OBJS) gwlib.cmo $(GWB)/src/calendar.cmo $(GWB)/src/outbase.cmo popule.cmo MODIF_OBJS=$(STD_OBJS) modif.cmo PUBLIC_OBJS=$(STD_OBJS) public.cmo PUBLIC2_OBJS=$(STD_OBJS) $(GWB)/src/progrBar.cmo public2.cmo DONADELLO_OBJS=$(STD_OBJS) donadello.cmo PARTICULE_OBJS=$(STD_OBJS) particule.cmo LUNE_OBJS=$(STD_OBJS) $(GWB)/src/calendar.cmo lune.cmo TITRES_OBJS=$(STD_OBJS) titres.cmo GWCK_OBJS=$(STD_OBJS) $(GWB)/src/lock.cmo $(GWB)/src/progrBar.cmo gwck.cmo NBDESC_OBJS=$(STD_OBJS) $(GWB)/src/progrBar.cmo nbdesc.cmo all:: opt out:: connex.out hist.out selroy.out chkimg.out consmoy.out cleopatre.out lune.out popule.out public.out public2.out titres.out gwck.out opt:: connex.opt hist.opt selroy.opt chkimg.opt consmoy.opt lune.opt popule.opt public.opt public2.opt titres.opt gwck.opt nbdesc.opt odif.opt: $(MODIF_OBJS:.cmo=.cmx) $(OCAMLOPT) unix.cmxa $(LIBUNIX) $(MODIF_OBJS:.cmo=.cmx) -o modif.opt titres.out: $(TITRES_OBJS) $(OCAMLC) unix.cma $(LIBUNIX) $(TITRES_OBJS) -o titres.out titres.opt: $(TITRES_OBJS:.cmo=.cmx) $(OCAMLOPT) unix.cmxa $(LIBUNIX) $(TITRES_OBJS:.cmo=.cmx) -o titres.opt public.out: $(PUBLIC_OBJS) $(OCAMLC) unix.cma $(LIBUNIX) $(PUBLIC_OBJS) -o public.out public.opt: $(PUBLIC_OBJS:.cmo=.cmx) $(OCAMLOPT) unix.cmxa $(LIBUNIX) $(PUBLIC_OBJS:.cmo=.cmx) -o public.opt public2.opt: $(PUBLIC2_OBJS:.cmo=.cmx) $(OCAMLOPT) unix.cmxa $(LIBUNIX) $(PUBLIC2_OBJS:.cmo=.cmx) -o public2.opt particule.out: $(PARTICULE_OBJS) $(OCAMLC) -custom unix.cma $(LIBUNIX) $(PARTICULE_OBJS) -o particule.out donadello.out: $(DONADELLO_OBJS) $(OCAMLC) -custom unix.cma $(LIBUNIX) $(DONADELLO_OBJS) -o donadello.out donadello.opt: $(DONADELLO_OBJS:.cmo=.cmx) $(OCAMLOPT) unix.cmxa $(LIBUNIX) $(DONADELLO_OBJS:.cmo=.cmx) -o donadello.opt cleopatre.out: $(CLEOPATRE_OBJS) $(OCAMLC) -custom unix.cma $(LIBUNIX) $(CLEOPATRE_OBJS) -o cleopatre.out lune.out: $(LUNE_OBJS) $(OCAMLC) unix.cma $(LIBUNIX) $(LUNE_OBJS) -o lune.out lune.opt: $(LUNE_OBJS:.cmo=.cmx) $(OCAMLOPT) unix.cmxa $(LIBUNIX) $(LUNE_OBJS:.cmo=.cmx) -o lune.opt popule.out: $(POPULE_OBJS) $(OCAMLC) unix.cma $(LIBUNIX) $(POPULE_OBJS) -o popule.out popule.opt: $(POPULE_OBJS:.cmo=.cmx) $(OCAMLOPT) unix.cmxa $(LIBUNIX) $(POPULE_OBJS:.cmo=.cmx) -o popule.opt geneanet.out: $(GENEANET_OBJS) $(OCAMLC) -custom unix.cma $(LIBUNIX) $(GENEANET_OBJS) -o geneanet.out connex.out: $(CONNEX_OBJS) $(OCAMLC) -custom unix.cma $(LIBUNIX) $(CONNEX_OBJS) -o connex.out connex.opt: $(CONNEX_OBJS:.cmo=.cmx) $(OCAMLOPT) unix.cmxa $(LIBUNIX) $(CONNEX_OBJS:.cmo=.cmx) -o connex.opt hist.out: $(HIST_OBJS) $(OCAMLC) -custom unix.cma $(LIBUNIX) $(HIST_OBJS) -o hist.out hist.opt: $(HIST_OBJS:.cmo=.cmx) $(OCAMLOPT) unix.cmxa $(LIBUNIX) $(HIST_OBJS:.cmo=.cmx) -o hist.opt selroy.opt: $(SELROY_OBJS:.cmo=.cmx) $(OCAMLOPT) unix.cmxa $(SELROY_OBJS:.cmo=.cmx) $(LIBUNIX) -o selroy.opt selroy.out: $(SELROY_OBJS) $(OCAMLC) -custom unix.cma $(LIBUNIX) $(SELROY_OBJS) -o selroy.out chkimg.out: $(CHKIMG_OBJS) $(OCAMLC) unix.cma $(CHKIMG_OBJS) $(LIBUNIX) -o chkimg.out chkimg.opt: $(CHKIMG_OBJS:.cmo=.cmx) $(OCAMLOPT) unix.cmxa $(CHKIMG_OBJS:.cmo=.cmx) $(LIBUNIX) -o chkimg.opt consmoy.out: $(CONSMOY_OBJS) $(OCAMLC) unix.cma $(CONSMOY_OBJS) $(LIBUNIX) -o consmoy.out consmoy.opt: $(CONSMOY_OBJS:.cmo=.cmx) $(OCAMLOPT) unix.cmxa $(CONSMOY_OBJS:.cmo=.cmx) $(LIBUNIX) -o consmoy.opt gwck.out: $(GWCK_OBJS) $(OCAMLC) -custom $(STATIC) unix.cma $(LIBUNIX) $(GWCK_OBJS) -o gwck.out gwck.opt: $(GWCK_OBJS:.cmo=.cmx) $(OCAMLOPT) $(STATIC) unix.cmxa $(LIBUNIX) $(GWCK_OBJS:.cmo=.cmx) -o gwck.opt nbdesc.opt: $(NBDESC_OBJS:.cmo=.cmx) $(OCAMLOPT) $(STATIC) unix.cmxa $(LIBUNIX) $(NBDESC_OBJS:.cmo=.cmx) -o nbdesc.opt clavier.out: $(CLAVIER_OBJS) $(OCAMLC) -custom $(CLAVIER_OBJS) -o clavier.out depend: export LC_ALL=C; TOP=$(GWB) $(GWB)/tools/camlp5_depend.sh $(OCAMLI) $$(ls *.ml) | sed -e 's|$(GWB)|$$(GWB)|g' > .depend.new mv .depend.new .depend include .depend geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/gwbase/etc/camlp5_comm.sh0000770000175200017530000000076512664543647026646 0ustar guillaumeguillaume#!/bin/sh # $Id: camlp5_comm.sh,v 4.1 2007-09-04 03:06:50 deraugla Exp $ ARGS1= FILE= while test "" != "$1"; do case $1 in *.ml*) FILE=$1;; *) ARGS1="$ARGS1 $1";; esac shift done head -1 $FILE >/dev/null || exit 1 set - `head -1 $FILE` if test "$2" = "camlp5r" -o "$2" = "camlp5o" -o "$2" = "camlp5"; then COMM="$2" shift; shift ARGS2=`echo $* | sed -e "s/[()*]//g"` else COMM=camlp5r ARGS2= fi echo $COMM $ARGS2 $ARGS1 $FILE $COMM $ARGS2 $ARGS1 $FILE geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/gwbase/etc/nbdesc.ml0000660000175200017530000001037412664543647025701 0ustar guillaumeguillaume(* camlp4r *) (* $Id: nbdesc.ml,v 4.7 2007-10-28 06:57:31 deraugla Exp $ *) open Def; open Gwdb; open Printf; value designation base ip p = let first_name = p_first_name base p in let surname = p_surname base p in if first_name = "?" || surname = "?" then "i=" ^ string_of_int (Adef.int_of_iper ip) else Mutil.iso_8859_1_of_utf_8 (first_name ^ "." ^ string_of_int (get_occ p) ^ " " ^ surname) ; value before_date d d1 = if d1.year < d.year then True else if d1.year > d.year then False else if d1.month < d.month then True else if d1.month > d.month then False else if d1.prec > d.prec then True else if d1.prec < d.prec then False else if d1.day < d.day then True else if d1.day > d.day then False else True ; value string_of_date d = string_of_int d.year; value apply base date nb_ind f = do { let cnt = ref 0 in for i = 0 to nb_ind - 1 do { let ip = Adef.iper_of_int i in let p = poi base ip in match Adef.od_of_codate (get_birth p) with [ Some (Dgreg b_dmy _) -> let alive_at_that_date = if before_date date b_dmy then match get_death p with [ Death _ cd -> match Adef.date_of_cdate cd with [ Dgreg d_dmy _ -> before_date d_dmy date | _ -> False ] | NotDead -> True | _ -> False ] else False in if alive_at_that_date then do { f cnt.val ip p; incr cnt } else () | Some (Dtext _) | None -> () ]; }; cnt.val }; (**) value glop = ref 0; (**) value mark_cnt = ref 0; value number_of_desc base mark ip p = do { incr mark_cnt; let curr_mark = mark_cnt.val in loop [] 0 [] (Array.to_list (get_family p)) where rec loop nb_list nb new_gen = fun [ [ifam :: ifaml] -> do { let (nb, new_gen) = if mark.(Adef.int_of_ifam ifam) = curr_mark then (nb, new_gen) else do { mark.(Adef.int_of_ifam ifam) := curr_mark; let fam = foi base ifam in let ipa = get_children fam in let nb = nb + Array.length ipa in let new_gen = Array.fold_left (fun ifaml ip -> let p = poi base ip in Array.to_list (get_family p) @ ifaml) new_gen ipa in (nb, new_gen) } in loop nb_list nb new_gen ifaml; } | [] -> match new_gen with [ [] -> List.rev nb_list | _ -> (* let _ = do { if List.length nb_list > glop.val then do { glop.val := List.length nb_list; printf "\n%s gen %d" (designation base ip p) glop.val; flush stdout; } else () } in *) loop [nb :: nb_list] 0 [] new_gen ] ] }; value nb_desc bname date = do { let base = Gwdb.open_base bname in let () = Gwdb.load_descends_array base in let () = Gwdb.load_unions_array base in let nb_ind = nb_of_persons base in let nb_fam = nb_of_families base in let nb_liv = apply base date nb_ind (fun _ _ _ -> ()) in printf "nombre de personnes vivantes en %s : %d\n" (string_of_date date) nb_liv; flush stdout; let mark = Array.make nb_fam 0 in let nb_desc = ref [] in ProgrBar.start (); ignore (apply base date nb_ind (fun cnt ip p -> do { ProgrBar.run cnt nb_liv; let nb_list = number_of_desc base mark ip p in nb_desc.val := loop nb_desc.val nb_list where rec loop l1 l2 = match (l1, l2) with [ ([x1 :: l1], [x2 :: l2]) -> [x1+x2 :: loop l1 l2] | (_, []) -> l1 | ([], _) -> l2 ]; }) : int); ProgrBar.finish (); let (nb_gen, nb_tot) = List.fold_left (fun (nb_gen, nb_tot) nb_at_gen -> do { printf "nombre moyen de descendants à la génération %2d :" nb_gen; printf " %7.2f\n" (float nb_at_gen /. float nb_liv); (nb_gen + 1, nb_tot + nb_at_gen) }) (1, 0) nb_desc.val in printf "nombre de descendants moyen = %.2f\n" (float nb_tot /. float nb_liv); flush stdout; }; value date year = {day = 0; month = 0; year = year; prec = Sure; delta = 0}; value main () = let bname = Sys.argv.(1) in let year = int_of_string Sys.argv.(2) in nb_desc bname (date year) ; main (); geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/gwbase/etc/Makefile.inc0000660000175200017530000000164012664543647026315 0ustar guillaumeguillaume# $Id: Makefile.inc,v 4.5 2009-03-11 10:58:50 deraugla Exp $ D=. CAMLP5_COMM=$D/camlp5_comm.sh -I $(GWB)/src pa_macro.cmo CAMLP5F=-DUNIX CAMLP5D=`camlp5 -where` LIBUNIX=-cclib -lunix OCAMLC=ocamlc.opt OCAMLOPT=ocamlopt.opt OCAMLI= RM=/bin/rm -f EXE= TEST_DIR=test $$(basename "$<") = "$<" || { echo "*** cannot make '$@'"; echo "*** please run 'make' in directory '$$(dirname "$<")' first"; exit 1; } all:: opt:: clean:: $(RM) *.out *.opt *.cm[oixa] *.cmxa *.pp[oi] *.o *.obj *.lck *.bak *~ .#* .SUFFIXES: .ml .cmo .mli .cmi .cmx .mli.cmi: @$(TEST_DIR) @$(CAMLP5_COMM) $(CAMLP5F) $< -o $*.ppi $(OCAMLC) $(OCAMLI) -I $(CAMLP5D) -c -intf $*.ppi $(RM) $*.ppi .ml.cmo: @$(TEST_DIR) @$(CAMLP5_COMM) $(CAMLP5F) $< -o $*.ppo $(OCAMLC) $(OCAMLI) -I $(CAMLP5D) -c -impl $*.ppo $(RM) $*.ppo .ml.cmx: @$(TEST_DIR) @$(CAMLP5_COMM) $(CAMLP5F) $< -o $*.ppo $(OCAMLOPT) $(OCAMLI) -I $(CAMLP5D) -c -impl $*.ppo $(RM) $*.ppo geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/gwbase/etc/public.ml0000660000175200017530000001344212664543647025720 0ustar guillaumeguillaume(* camlp4r *) (* $Id: public.ml,v 4.26 2007-01-19 09:03:02 deraugla Exp $ *) open Def; open Gwdb; open Printf; value year_of p = match (Adef.od_of_codate (get_birth p), Adef.od_of_codate (get_baptism p), get_death p, CheckItem.date_of_death (get_death p)) with [ (_, _, NotDead, _) -> None | (Some (Dgreg d _), _, _, _) -> Some d.year | (_, Some (Dgreg d _), _, _) -> Some d.year | (_, _, _, Some (Dgreg d _)) -> Some d.year | _ -> None ] ; value most_recent_year_of p = match (Adef.od_of_codate (get_birth p), Adef.od_of_codate (get_baptism p), get_death p, CheckItem.date_of_death (get_death p)) with [ (_, _, NotDead, _) -> None | (_, _, _, Some (Dgreg d _)) -> Some d.year | (_, Some (Dgreg d _), _, _) -> Some d.year | (Some (Dgreg d _), _, _, _) -> Some d.year | _ -> None ] ; value is_old lim_year p = match year_of p with [ Some y -> y < lim_year | None -> False ] ; value nb_gen_by_century = 2; value nb_desc_gen lim_year p = match most_recent_year_of p with [ Some year -> (lim_year - year) * nb_gen_by_century / 100 | None -> 0 ] ; value changes = ref False; value mark_descendants base scanned old lim_year = loop where rec loop p ndgen = if not scanned.(Adef.int_of_iper (get_key_index p)) then do { let dt = most_recent_year_of p in let ndgen = match dt with [ Some y -> do { scanned.(Adef.int_of_iper (get_key_index p)) := True; if y < lim_year then nb_desc_gen lim_year p else 0 } | None -> ndgen ] in if ndgen > 0 then do { old.(Adef.int_of_iper (get_key_index p)) := True; let ndgen = ndgen - 1 in for i = 0 to Array.length (get_family p) - 1 do { let ifam = (get_family p).(i) in let fam = foi base ifam in let sp = Gutil.spouse (get_key_index p) fam in old.(Adef.int_of_iper sp) := True; let children = get_children fam in for ip = 0 to Array.length children - 1 do { let p = poi base children.(ip) in loop p ndgen } } } else () } else () ; value mark_ancestors base scanned lim_year is_quest_string = loop where rec loop p = if not scanned.(Adef.int_of_iper (get_key_index p)) then do { scanned.(Adef.int_of_iper (get_key_index p)) := True; if not (is_old lim_year p) && get_access p = IfTitles && get_titles p = [] && not (is_quest_string (get_first_name p)) && not (is_quest_string (get_surname p)) then do { (**) let _ = do { printf "%s\n" (Gutil.designation base p); flush stdout; } in (**) match year_of p with [ Some y -> if y >= lim_year then do { eprintf "ça déconne %s %d\n" (Gutil.designation base p) y; flush stderr; } else () | None -> () ]; (**) let p = {(gen_person_of_person p) with access = Public} in patch_person base p.key_index p; changes.val := True; } else (); match get_parents p with [ Some ifam -> let cpl = foi base ifam in do { loop (poi base (get_father cpl)); loop (poi base (get_mother cpl)); } | None -> () ]; } else () ; value public_everybody bname = let base = Gwdb.open_base bname in do { for i = 0 to nb_of_persons base - 1 do { let p = poi base (Adef.iper_of_int i) in if get_access p <> Public then let p = {(gen_person_of_person p) with access = Public} in patch_person base p.key_index p else (); }; commit_patches base; } ; value public_all bname lim_year = let base = Gwdb.open_base bname in let () = load_ascends_array base in let () = load_couples_array base in let old = Array.make (nb_of_persons base) False in do { let scanned = Array.make (nb_of_persons base) False in for i = 0 to nb_of_persons base - 1 do { if not scanned.(i) then do { let p = poi base (Adef.iper_of_int i) in mark_descendants base scanned old lim_year p 0 } else (); }; let scanned = Array.make (nb_of_persons base) False in for i = 0 to nb_of_persons base - 1 do { if old.(i) && not scanned.(i) then do { let p = poi base (Adef.iper_of_int i) in mark_ancestors base scanned lim_year is_quest_string p } else (); }; if changes.val then commit_patches base else (); } ; value public_some bname lim_year key = let base = Gwdb.open_base bname in match Gutil.person_ht_find_all base key with [ [ip] -> let p = poi base ip in let scanned = Array.make (nb_of_persons base) False in let () = load_ascends_array base in let () = load_couples_array base in do { mark_ancestors base scanned lim_year is_quest_string p; if changes.val then commit_patches base else (); } | _ -> do { Printf.eprintf "Bad key %s\n" key; flush stderr; exit 2 } ] ; value lim_year = ref 1850; value ind = ref ""; value bname = ref ""; value everybody = ref False; value speclist = [("-y", Arg.Int (fun i -> lim_year.val := i), "limit year (default = " ^ string_of_int lim_year.val ^ ")"); ("-everybody", Arg.Set everybody, "set flag public to everybody"); ("-ind", Arg.String (fun x -> ind.val := x), "individual key")] ; value anonfun i = bname.val := i; value usage = "Usage: public [-y #] [-ind key] base"; value main () = do { Arg.parse speclist anonfun usage; if bname.val = "" then do { Arg.usage speclist usage; exit 2; } else (); let gcc = Gc.get () in gcc.Gc.max_overhead := 100; Gc.set gcc; if everybody.val then public_everybody bname.val else if ind.val = "" then public_all bname.val lim_year.val else public_some bname.val lim_year.val ind.val } ; main (); geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/gwbase/etc/utf8-to-iso.sh0000770000175200017530000000102612664543647026537 0ustar guillaumeguillaume#!/bin/sh #cd (* exec ocaml camlp4r.cma $0 *) "."; (* $Id: utf8-to-iso.sh,v 1.1 2006-11-03 11:09:42 deraugla Exp $ *) value iso_8859_1_of_utf_8 ic = try loop () where rec loop () = do { let c = input_char ic in match Char.code c with [ 0xC2 -> print_char (input_char ic) | 0xC3 -> print_char (Char.chr (Char.code (input_char ic) + 0x40)) | _ -> print_char c ]; if c = '\n' then flush stdout else (); loop () } with [ End_of_file -> flush stdout ] ; iso_8859_1_of_utf_8 stdin; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/gwbase/etc/popule.ml0000660000175200017530000002074512664543647025752 0ustar guillaumeguillaume(* camlp4r *) (* $Id: popule.ml,v 4.31 2007-02-16 10:35:39 deraugla Exp $ *) open Def; open Gwdb; open Printf; Mutil.verbose.val := False; value h_first_names = [| "Albert"; "Bernard"; "Cyrille"; "Daniel"; "Éric"; "François"; "Gérard"; "Hervé"; "Isidore"; "Jacques"; "Kevin"; "Louis"; "Michel"; "Nicolas"; "Octave"; "Philippe"; "Quentin"; "René"; "Sylvain"; "Thierry"; "Urbain"; "Vincent"; "Wolfgang"; "Xavier"; "Yann"; "Zébulon" |] ; value f_first_names = [| "Anne"; "Brigitte"; "Cécile"; "Denise"; "Emmanuelle"; "Fanny"; "Geneviève"; "Hélène"; "Isabelle"; "Joëlle"; "Karine"; "Lise"; "Marie"; "Noëlle"; "Odile"; "Patricia"; "Quitterie"; "Rosine"; "Sidonie"; "Thérèse"; "Ursule"; "Vanessa"; "Wilfried"; "Xavière"; "Yvonne"; "Zoé" |] ; value char1 = let a = [| ""; "b"; "c"; "ch"; "d"; "f"; "g"; "gr"; "h"; "j"; "l"; "m"; "p"; "r"; "s"; "t"; "v" |] in fun () -> a.(Random.int (Array.length a)) ; value char2 = let a = [| "a"; "ail"; "al"; "ar"; "as"; "au"; "e"; "é"; "el"; "er"; "i"; "o"; "ou"; "u" |] in fun () -> a.(Random.int (Array.length a)) ; value char3 = let a = [| "b"; "c"; "ch"; "d"; "f"; "g"; "gl"; "l"; "m"; "n"; "p"; "r"; "s"; "t"; "th"; "v"; "z" |] in fun () -> a.(Random.int (Array.length a)) ; value char4 = let a = [| "a"; "ai"; "ail"; "ar"; "au"; "e"; "eil"; "er"; "i"; "il"; "o"; "u" |] in fun () -> a.(Random.int (Array.length a)) ; value char5 = let a = [| "b"; "ch"; "d"; "g"; "gn"; "gu"; "l"; "n"; "p"; "r"; "t"; "th"; "tr"; "v"; "vr" |] in fun () -> a.(Random.int (Array.length a)) ; value char6 = let a = [| "al"; "an"; "at"; "ay"; "e"; "é"; "eau"; "ert"; "es"; "et"; "ie"; "ier"; "in"; "our"; "y" |] in fun () -> a.(Random.int (Array.length a)) ; value nameize _ = let two = Random.int 4 <> 0 in let len = 0 in let len = if two then len else let len = Buff.mstore len (char1 ()) in let len = Buff.mstore len (char2 ()) in len in let len = Buff.mstore len (char3 ()) in let len = let c4 = char4 () in let c5 = char5 () in let len = Buff.mstore len c4 in match c4.[String.length c4 - 1] with [ 'l' | 'r' when String.length c5 > 1 -> loop c5 where rec loop c5 = match c5.[String.length c5 - 1] with [ 'l' | 'r' -> loop (char5 ()) | _ -> Buff.mstore len c5 ] | _ -> Buff.mstore len c5 ] in let len = Buff.mstore len (char6 ()) in String.uppercase (Buff.get len) ; value h_fn n = let n1 = h_first_names.(Random.int (Array.length h_first_names)) in let n2 = h_first_names.(Random.int (Array.length h_first_names)) in if n1 = n2 then n1 else n1 ^ "-" ^ n2 ; value f_fn n = let n1 = f_first_names.(Random.int (Array.length f_first_names)) in let n2 = f_first_names.(Random.int (Array.length f_first_names)) in if n1 = n2 then n1 else n1 ^ "-" ^ n2 ; value add_indi (base, cnt, bname) (fn, sn1, sn2, oc) sex = do { if cnt.val >= 300 then do { cnt.val := 0; commit_patches base.val; Gwdb.apply_base1 base.val (fun base -> let bname = base.Dbdisk.data.Dbdisk.bdir in Outbase.output bname base); base.val := Gwdb.open_base bname; } else (); incr cnt; let sn = if sn2 = "" then sn1 else sn1 ^ " " ^ sn2 in Gwlib.add_indi base.val (fn, sn, oc) sex } ; value mkcelib size = loop [] (max 1 (size / 3)) where rec loop list n = if n = 0 then list else let i = Random.int size in if List.mem i list then loop list n else loop [i :: list] (n - 1) ; value popule bname size ngen gyear = let h = Array.make size (Adef.iper_of_int 0, "", "") in let f = Array.make size (Adef.iper_of_int 0, "", "") in let base = ref (Gwdb.open_base bname) in let base_info = (base, ref 0, bname) in let d = let d = Unix.localtime (Unix.time ()) in let day = d.Unix.tm_mday in let month = d.Unix.tm_mon + 1 in let year = d.Unix.tm_year + 1900 - 1 in {day = day; month = month; year = year - gyear * (ngen - 1) - 2; prec = Sure; delta = 0} in do { Random.self_init (); let gcc = Gc.get () in gcc.Gc.max_overhead := 100; Gc.set gcc; let jd = Calendar.sdn_of_gregorian d in let (persons_get, persons_set) = persons_array base.val in for i = 0 to size - 1 do { let surn = nameize i in let ip = add_indi base_info (h_fn 0, surn, "", 1) Male in h.(i) := (ip, surn, ""); let x = persons_get (Adef.int_of_iper ip) in let d = Calendar.gregorian_of_sdn Sure (jd + Random.int 365) in let x = {(x) with birth = Adef.codate_of_od (Some (Dgreg d Dgregorian))} in persons_set (Adef.int_of_iper ip) x; let surn = nameize i in let ip = add_indi base_info (f_fn 0, surn, "", 1) Female in f.(i) := (ip, surn, ""); let x = persons_get (Adef.int_of_iper ip) in let d = Calendar.gregorian_of_sdn Sure (jd + Random.int 365) in let x = {(x) with birth = Adef.codate_of_od (Some (Dgreg d Dgregorian))} in persons_set (Adef.int_of_iper ip) x; }; loop (mkcelib size) {(d) with year = d.year + gyear} 2 where rec loop celib d n = if n > ngen then () else do { let jd = Calendar.sdn_of_gregorian d in eprintf "%d." n; flush stderr; for i = 0 to size - 1 do { if List.mem i celib then () else do { let (ifath, hsn1, hsn2) = h.(i) in let (imoth, fsn1, fsn2) = f.(i) in let (sn1, sn2) = match Random.int 15 with [ 0 -> (nameize (), "") | 1 | 2 | 3 | 4 -> (fsn1, "") | _ -> (hsn1, "") ] (* match Random.int 15 with [ 0 -> (nameize (), "") | 1 -> (fsn1, hsn1) | 2 -> (hsn1, fsn1) | 3 -> (fsn1, fsn2) | _ -> (hsn1, hsn2) ] *) in let h_before_f = Random.int 2 = 0 in let list = if False (*Random.int 5 = 0*) then [] else do { let ip = add_indi base_info (h_fn n, sn1, sn2, n) Male in h.(i) := (ip, sn1, sn2); let x = persons_get (Adef.int_of_iper ip) in let sh_h = if h_before_f then 0 else 2 * 365 in let d = Calendar.gregorian_of_sdn Sure (jd + sh_h + Random.int 365) in let x = {(x) with birth = Adef.codate_of_od (Some (Dgreg d Dgregorian))} in persons_set (Adef.int_of_iper ip) x; [ip]; } in let list = if False (*Random.int 5 = 0*) then list else do { let ip = add_indi base_info (f_fn n, sn1, sn2, n) Female in f.(i) := (ip, sn1, sn2); let x = persons_get (Adef.int_of_iper ip) in let sh_f = if h_before_f then 2 * 365 else 0 in let d = Calendar.gregorian_of_sdn Sure (jd + sh_f + Random.int 365) in let x = {(x) with birth = Adef.codate_of_od (Some (Dgreg d Dgregorian))} in persons_set (Adef.int_of_iper ip) x; if h_before_f then list @ [ip] else [ip :: list]; } in let _ : ifam = Gwlib.add_fam base.val ifath imoth list in (); }; }; for i = 0 to size - 2 do { let rf = i + Random.int (size - i - 1) + 1 in let tmp = f.(i) in f.(i) := f.(rf); f.(rf) := tmp; }; loop (mkcelib size) {(d) with year = d.year + gyear} (n + 1); } ; eprintf "\n"; commit_patches base.val; Gwdb.apply_base1 base.val (fun base -> let bname = base.Dbdisk.data.Dbdisk.bdir in Outbase.output bname base); } ; value size = ref 100; value ngen = ref 200; value gyear = ref 20; value bname = ref ""; value speclist = [("-s", Arg.Int (fun i -> size.val := i), "size = nb of men = nb of women (" ^ string_of_int size.val ^ ")"); ("-n", Arg.Int (fun i -> ngen.val := i), "nb of generations (" ^ string_of_int ngen.val ^ ")"); ("-g", Arg.Int (fun i -> gyear.val := i), "age at mariage (" ^ string_of_int gyear.val ^ ")")] ; value anonfun i = bname.val := i; value usage = "Usage: popule base [args]"; value main () = do { Arg.parse speclist anonfun usage; if bname.val = "" then do { Arg.usage speclist usage; exit 2; } else (); popule bname.val size.val ngen.val gyear.val; } ; main (); geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/gwbase/etc/2utf8.sh0000770000175200017530000000171612664543647025417 0ustar guillaumeguillaume#!/bin/sh # $Id: 2utf8.sh,v 1.1 2005-02-04 01:38:18 ddr Exp $ sed -e 's/\$/\\\$/g' -e 's/"/\\"/g' $1 | awk " BEGIN { f=\"\" } /^]/ { f=\"\" } /^af/ { f=\"iso-8859-1\" } /^bg/ { f=\"windows-1251\" } /^br/ { f=\"iso-8859-1\" } /^ca/ { f=\"iso-8859-1\" } /^cs/ { f=\"iso-8859-2\" } /^da/ { f=\"iso-8859-1\" } /^de/ { f=\"iso-8859-1\" } /^en/ { f=\"iso-8859-1\" } /^eo/ { f=\"iso-8859-1\" } /^es/ { f=\"iso-8859-1\" } /^et/ { f=\"iso-8859-15\" } /^fi/ { f=\"iso-8859-1\" } /^fr/ { f=\"iso-8859-1\" } /^he/ { f=\"iso-8859-8\" } /^is/ { f=\"iso-8859-1\" } /^it/ { f=\"iso-8859-1\" } /^lv/ { f=\"iso-8859-1\" } /^nl/ { f=\"iso-8859-1\" } /^no/ { f=\"iso-8859-1\" } /^pl/ { f=\"iso-8859-2\" } /^pt/ { f=\"iso-8859-1\" } /^ro/ { f=\"iso-8859-2\" } /^ru/ { f=\"windows-1251\" } /^sl/ { f=\"iso-8859-2\" } /^sv/ { f=\"iso-8859-1\" } /^zh/ { f=\"gb2312\" } f != \"\" { system(\"echo \\\"\" \$0 \"\\\" | iconv -f \" f \" -t utf-8\") } f == \"\" { system(\"echo \\\"\" \$0 \"\\\"\") } " geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/gwbase/etc/link.pl0000660000175200017530000000201212664543647025371 0ustar guillaumeguillaume #!/usr/bin/perl -w #help # /data/src/gwbase/etc/connex.opt -a ../roglo |perl link.pl |sort -r >connex.txt # # Roglo #$BASE="roglo"; $nbfam = 0; $nbcnx = 0; $nbone = 0; $szbloc = 0; $nbbloc = 0; @blocs = (0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0); while (<>) { # next unless (/^\*/); if (/^Connex.+length (\d+)/) { $nbbloc++; $szbloc = $1; $nbfam += $1; $blocs[$1] ++ if ($1<16); $nbone++ if ($1==1); $nbcnx = $1 if ($nbcnx < $1); chomp; $_ = sprintf("\n*%04d ",$1).$_; } elsif (/^i=(\d+)$/) { $_ = " ?$1"; } elsif (/\(i=(\d+)\)/) { $_ = " ?$1"; } elsif (/^ - (.+)\.(\d+) (.+)\n/) { $_ = " [[$1/$3/$2/$1 $3]]"; } print; #if ($szbloc>1); } print "\n*Statistiques\n*Résultat : $nbfam familles réparties en $nbbloc blocs.\n"; printf "*Meilleur bloc connexe : $nbcnx. => Connexité : %2.2f%%.\n*Mais $nbone familles restent isolées (%2.2f%%)\n", 100*$nbcnx/$nbfam, 100*$nbone/$nbfam; print "*Liste : "; for ($i=1;$i<16;$i++) { print $blocs[$i]."($i) "; } print "\n";geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/gwbase/etc/unicode2win1251.sh0000770000175200017530000000100312664543647027173 0ustar guillaumeguillaume#!/bin/sh #cd (* exec ocaml camlp4r.cma $0 *) "."; (* $Id: unicode2win1251.sh,v 4.1 2002-09-26 09:43:11 ddr Exp $ *) value ic = stdin; value oc = stdout; try while True do { let c1 = input_char ic in let c2 = input_char ic in if c2 = Char.chr 0 then output_char oc c1 else if c2 = Char.chr 4 then let n = Char.code c1 + 0xb0 in if n >= 0 && n < 256 then output_char oc (Char.chr n) else output_char oc '?' else output_char oc '?'; } with [ End_of_file -> flush stdout ]; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/gwbase/etc/geneanet.txt0000660000175200017530000057173012664543647026450 0ustar guillaumeguillaumeibn Abd-ar-Rahman;calife de Cordoue;;;1;;;;;M d'Acigné;;1023;1579;3;;;;;M d' Acigné;;1684;1684;1;;;;;M d'Acquigny;;1210;1210;1;;;;;M d'Acre;;1272;1307;1;;;;;M Adam de Flamare;;1837;1849;2;;;;;M Aéton;;1689;1689;1;;;;;M d'Agoult;dame de Trets;;;1;;;;;M d' Aguesseau;;1737;1794;1;;;;;M d'Ahlefeldt;;1551;1741;7;;;;;M d'Ahlefeldt;;1672;1726;1;Copenhague;;;;M d'Aichelberg;;1674;1762;1;;;;;M de l'Aigle;;1045;1085;1;Sainte-Suzanne;;;;M de l'Aigle;comte du Perche;1080;1165;4;;;;;M d'Aigremont;;1230;1304;2;;;;;M d'Ailly;;1435;1470;2;;;;;M Alber;;1495;1692;5;;;;;M d'Albert;;1678;1704;3;;;;;M d'Albert;duc de Luynes;1578;1621;1;Mornas;;;;M d'Albert;duc de Luynes;1620;1758;3;Paris;;;;M d'Albi;;860;860;1;;;;;M d'Albion;;943;943;1;;;;;M d'Albon;comte;1045;1228;10;;;;;M d'Albon;comte;1095;1142;1;La Bussière;;;;M d'Albret;comte de Dreux;1400;1415;1;Azincourt;;;;M d'Albret;infante de Navarre;1115;1555;28;;;;;M d'Albret;reine de Navarre;1528;1572;1;à Pau;;;;M d'Albuquerque;comte;1339;1435;2;;;;;M Aldobrandini;;1585;1646;1;;;;;M Alen;;1722;1850;2;;;;;M d'Alençon;;1031;1031;4;;;;;M Allafort;seigneur de Lascoux;1700;1792;2;;;;;M Allaire;;1628;1702;1;Saint-Malo;;;;M Allais;;1676;1771;3;;;;;M Alleman;;1488;1488;1;;;;;M Alliata Campaglia;;1844;1844;1;;;;;M d'Almayne;;1235;1271;1;;;;;M Aloigny de Rochefort;;1691;1691;1;;;;;M d'Alsace;;819;1037;2;;;;;M d'Alsace;duc;;;1;;;ALS;FRA;M d'Altena;comte;1249;1249;1;;;;;M d'Altenbourg;comte du Sundgau;970;1050;6;;;;;M Alvarez de Tolède;;1522;1562;4;;;;;M Alvarez de Tolède;duc d'Albe de Tormes;1508;1582;1;Piedrahita, Avila;;;;M d'Amalon;;1150;1172;1;;;;;M Ambard;;1642;1658;1;Cassis;;;;M Ambard;;1667;1673;2;Le Prêcheur;;;;M d'Amboise;;1107;1485;10;;;;;M Ameline;;1580;1580;1;;;;;M d'Amiens;;795;1050;3;;;;;M d'Amstel;;1315;1377;1;;;;;M d'Andechs;;906;1279;10;;;;;M d'Andechs;reine de France;1196;1201;1;Château de Poissy;;;FRA;M Anderson;;1241;1241;1;;;;;M Andoin;;1755;1755;1;;;;;M Andre;;1629;1629;1;;;;;M Andre;;1662;1675;1;Le Prêcheur;;;;M Andreae;;1528;1624;2;;;;;M d'Anduze;;1115;1227;8;;;;;M Angar;;1717;1839;4;;;;;M Ange;dame de Roumanie;1294;1311;1;;;;ROM;M Ange;empereur de Constantinople;1155;1318;21;;;;;M d'Angle;seigneur d'Oiré;1110;1402;7;;;;;M d'Angleterre;;927;1093;5;;;;;M d'Angleterre;roi;1003;1066;1;à Islib, Oxfordshire;;ENG;GBR;M d'Angleterre;roi;1051;1125;1;;;ENG;GBR;M des Anglos-Saxons;roi;843;871;1;Merton, Devon, Angleterre;;;;M des Anglos-Saxons;roi;870;924;1;Farndon, Cheshire, Angleterre;;;;M des Anglos-Saxons;roi d'York;902;902;1;Holme, West Yorkshire, Angleterre;;;;M des Anglos-Saxons;roi de Wessex;775;951;16;;;;;M des Anglos-Saxons;roi de Wessex;849;899;1;Wantage, Oxfordshire, Angleterre;;;;M d'Angoulême;;1547;1575;1;Fontainebleau;;;;M d'Angoulême;comte;830;1844;41;;;;;M d'Angoulême;comte;1115;1179;1;Messine, Italie;;;;M d'Angoulême;duc;1573;1650;1;Le Fayet;;;;M d'Angoulême;duc d'Orléans;1549;1574;2;;;;FRA;M d'Angoulême;reine d'Angleterre;1186;1246;1;à Fontevrault;;ENG;GBR;M d'Angoulême;roi de France;1494;1547;1;à Cognac;;;FRA;M d'Angoulême;roi de France;1519;1559;1;Saint-Germain-en-Laye;;;FRA;M d'Angoulême;roi de France;1544;1560;1;Fontainebleau;;;FRA;M d'Angoulême;roi de France;1551;1589;1;Saint-Cloud;;;FRA;M d'Angoulême-Lusignan;;1220;1220;1;;;;;M d'Anhalt;prince;1170;1252;1;;;;;M d'Anhalt-Bernbourg;prince;1300;1834;14;;;;;M d'Anhalt-Bernbourg;princesse;1746;1823;1;Bernbourg;;;;M d'Anhalt-Bernbourg-Hoym;prince;1669;1766;2;;;;;M d'Anhalt-Bernbourg-Schaumbourg-Hoym;prince;1693;1828;4;;;;;M d'Anhalt-Bernbourg-Schaumbourg-Hoym;princesse;1797;1817;1;Hoym;;;;M d'Anhalt-Coethen;prince;1575;1802;8;;;;;M d'Anhalt-Dessau;prince;1567;1817;11;;;;;M d'Anhalt-Zerbst;;1679;1740;1;Gotha;;;;M d'Anhalt-Zerbst;impératrice de Russie;1729;1796;1;Stettin;;;;M d'Anhalt-Zerbst;prince;1230;1747;25;;;;;M d'Anhalt-Zerbst;princesse;1563;1718;2;Zerbst;;;;M d'Anjou;comte;972;1040;1;Metz;;;;M d'Anjou;prince de Tarente;1315;1364;1;Naples;;;;M d'Anjou;reine d'Angleterre;1430;1482;1;;;ENG;GBR;M d'Anjou;reine de France;1404;1463;1;;;;FRA;M d'Anjou;reine de Naples;1326;1382;1;à Naples;;;ITA;M d'Anjou;reine de Naples;1373;1435;1;Naples;;;ITA;M d'Anjou;reine de Pologne;1372;1399;1;;;;POL;M d'Anjou;roi d'Albanie;1318;1335;1;;;;ALB;M d'Anjou;roi de Hongrie;1288;1395;3;;;;HUN;M d'Anjou;roi de Naples;1226;1480;4;;;;ITA;M d'Anjou;roi de Naples;1254;1309;1;Casanova;;;ITA;M d'Anjou;roi de Naples;1327;1345;1;Aversa;;;ITA;M d'Anjou;roi de Naples;1345;1386;1;à Buda;;;ITA;M d'Anjou;vicomte d'Angers;888;1597;70;;;;;M d'Anthenaise;;1148;1350;2;;;;;M d'Antioche;impératrice de Constantinople;1183;1321;5;;;;;M d'Antioche;roi de Chypre;1284;1284;1;Tyr;;;;M d'Antioche-Lusignan;roi de Chypre;1334;1473;2;Nicosie;;;;M d'Antioche-Lusignan;roi de Chypre;1382;1487;4;;;;;M d'Antoing;;965;965;2;;;;;M d'Apchier;;1636;1636;3;;;;;M Apraxine;;1667;1716;2;;;;;M d'Apremont;;1542;1692;2;;;;;M d'Aquitaine;;911;1153;8;;;;;M d'Aquitaine;;950;972;1;Poitiers;;;;M d'Aquitaine;;1024;1077;1;Rome;;;;M d'Aquitaine;;1100;1159;1;Jaca, Espagne;;;;M d'Aquitaine;duc;875;1126;3;;;AQU;FRA;M d'Aquitaine;duc;935;963;1;à Poitiers;;AQU;FRA;M d'Aquitaine;duc;935;994;1;Saint-Maixent, France;;AQU;FRA;M d'Aquitaine;duc;960;1030;1;à Maillezais;;AQU;FRA;M d'Aquitaine;duc;1024;1086;1;Chizé;;AQU;FRA;M d'Aquitaine;duc;1099;1137;1;Toulouse;;AQU;FRA;M d'Aquitaine;duchesse;1122;1204;1;Fontevrault;;AQU;FRA;M d'Aragon;;1198;1559;46;;;;;M d'Aragon;;1300;1330;1;Styrie;;;;M d'Aragon;;1334;1358;1;Bilbao;;;;M d'Aragon;;1428;1445;1;Coimbra, Portugal;;;;M d'Aragon;;1457;1508;1;Ischia;;;;M d'Aragon;;1470;1524;1;Naples;;;;M d'Aragon;duc d'Athènes;1317;1338;2;;;;GRC;M d'Aragon;reine;1136;1174;1;Barcelone, Espagne;;ARA;ESP;M d'Aragon;reine d'Angleterre;1485;1536;1;;;ENG;GBR;M d'Aragon;reine de Castille;1479;1555;1;Tordesillas;;CYL;ESP;M d'Aragon;reine de France;1247;1271;1;à Cosenza, Calabre;;;FRA;M d'Aragon;roi;1036;1516;13;;;ARA;ESP;M d'Aragon;roi;1073;1134;1;Burgos, Espagne;;ARA;ESP;M d'Aragon;roi;1076;1149;1;Huesca, Espagne;;ARA;ESP;M d'Aragon;roi;1152;1196;1;Perpignan;;ARA;ESP;M d'Aragon;roi;1265;1336;2;Barcelone;;ARA;ESP;M d'Aragon;roi de Naples;1423;1504;2;;;;ITA;M d'Aragon;roi de Naples;1449;1496;1;Milan;;;ITA;M d'Aragon;roi de Naples;1467;1496;1;à Naples;;;ITA;M d'Aragon-Majorque;roi de Majorque;1336;1375;1;Perpignan;;;;M Arbald;;955;955;2;;;;;M d'Arcemale;seigneur de Breuil-Langon;1610;1610;1;;;;;M Archambault;;1677;1677;1;Loches;;;;M Ardenet des Touches;;1792;1792;1;;;;;M d'Ardennes;;932;998;3;;;;;M d'Arenberg;comtesse;1299;1823;7;;;;;M d'Argental;;1050;1050;1;;;;;M d'Argies;dame de Catheu;1160;1334;5;;;;;M d'Arkel;;1385;1415;1;;;;;M d'Arles;;1003;1032;1;Melun;;;;M d'Arles;comte;844;999;9;;;;;M d'Arles;roi d'Italie;947;947;1;Arles;;;ITA;M d'Arles;roi d'Italie;950;950;1;;;;ITA;M d'Arlon;comte;1025;1070;2;;;;;M d'Armagnac;;1410;1473;1;Mortagne-au-Perche;;;;M d'Armagnac;comte;940;1539;24;;;;;M Arnesson;jarl de Halland;1059;1059;2;;;;;M d'Arnoul;;1630;1647;2;;;;;M d'Artois;;1289;1348;1;Senlis;;;;M d'Artois;comte;1216;1250;1;bataille de la mansoura;;;;M d'Artois;comte;1250;1302;1;à Courtrai;;;;M d'Artois;comte d'Eu;1356;1387;1;Apulia;;;;M d'Artois;comte d'Eu;1358;1397;1;Micalizo, Anatolie;;;;M d'Artois;dame de Brie-Comte-Robert;1285;1425;6;;;;;M d'Artois;regente de Navarre;1248;1329;2;Paris;;;;M d'Artois;seigneur de Conches;1269;1298;1;Furnes, Belgique;;;;M d'Ascanie;;1080;1465;50;;;;;M d'Ascanie;duc de Saxe;1100;1170;1;à Stendal;;;;M Asen;tsar de Bulgarie;1238;1257;1;;;;BGR;M Asénide;;1196;1196;2;;;;;M Asénide;roi de Bulgarie;1196;1258;6;;;;BGR;M d'Aspremont;;1282;1470;2;;;;;M Asselin;;1799;1799;1;Case-Pilote;;;;M Asselin;;1820;1820;1;Les Trois-Ilets;;;;M Asselin du Chambuert;;1797;1797;1;Fort-St-Pierre;;;;M Asselin du Chambuert;;1821;1821;1;St-Pierre;;;;M Asselineau;;1725;1725;1;Ste-Marie;;;;M Assier;;1596;1771;2;Montpellier;;;;M Assier;;1627;1716;2;Mauguio;;;;M Assier;;1723;1770;6;;;;;M Assier;;1733;1800;1;Rivière-Salée;;;;M Assier de Mariette;;1742;1764;1;;;;;M Assier de Montferrier;;1772;1896;9;;;;;M Assier de Montout;;1740;1779;1;;;;;M Assier de Montrose;;1737;1840;2;Grande Anse (Lorrain);;;;M Assier de Montrose;;1768;1865;13;;;;;M Assier de Montrose;;1822;1894;1;Bordeaux;;;;M Assier de Pompignan;;1735;1762;1;Le morne Garnier;;;;M Assier de Pompignan;;1752;1893;25;;;;;M Assier du Hamelin;;1743;1873;10;;;;;M Assier du Louison;;1746;1819;1;;;;;M d'Assigny;;1686;1717;1;Treigny;;;;M d'Assigny;écuyer;1419;1657;11;;;;;M d'Astarac;comte;;;5;;;;;M Astorg;;1795;1795;1;Rivière-Salée;;;;M des Asturies;roi;693;1103;9;;;;;M d'Ath;;1075;1136;3;;;;;M Aubester;;1628;1656;1;Écosse;;;;M Aubéry;;1810;1846;1;St-Pierre;;;;M d'Aubigné;;1329;1739;4;;;;;M d'Aubigny;comte d'Arundel;1118;1240;6;;;;;M Aubin;;1624;1651;1;;;;;M Aubin;;1651;1706;2;St-Pierre;;;;M Aubry;;1806;1806;1;;;;;M d'Aubusson;;1469;1469;5;;;;;M Audebert;;1506;1506;1;Confolens;;;;M Audebert;;1815;1815;1;Ste-Marie;;;;M Audebert;seigneur de Laubuge;;;1;;;;;M Audebert de Laubuge;;1690;1690;1;;;;;M d'Audiffredy;;1820;1820;1;Les Trois-Ilets;;;;M Audley;;1374;1374;1;;;;;M Audrin;;1610;1610;1;;;;;M Audrin;;1662;1695;1;Case-Pilote;;;;M d'Auga;;1579;1661;5;;;;;M Augrain;;1784;1802;2;Le Robert;;;;M d'Aulnay;;1305;1324;4;;;;;M d'Aumale;comte;1015;1343;3;;;;;M d'Aumale;comte d' Aumale;1264;1302;1;bataille de Courtrai;;;;M d'Aumont;duc;1709;1826;2;Paris;;;;M d'Aumont;duc;1732;1799;1;Château de Guiscard;;;;M d'Aumont;duc;;;1;;;;;M d'Autrey;;1140;1140;1;;;;;M d'Autriche;;1013;1154;5;;;;;M d'Autriche;margrave;928;1102;3;;;;AUT;M d'Autriche-Este;;1772;1849;4;;;;;M d'Autriche-Este;archevêque d'Esztergom;1776;1848;2;Milan;;;;M d'Autriche-Este;archiduc d'Autriche;1754;1806;1;Vienne;;;AUT;M d'Autriche-Este;archiduchesse;1773;1846;2;Milan;;;AUT;M d'Autriche-Este;archiduchesse;1787;1816;1;Monza;;;AUT;M d'Autriche-Este;duc de Modène;1819;1875;2;Modène;;;;M d'Autun;;1000;1019;1;;;;;M d'Auvergne;;819;1437;22;;;;;M d'Auvergne;comte;1000;1332;15;;;AUV;FRA;M d'Auvergne;comte;1282;1325;1;Paris;;AUV;FRA;M d'Auvergne;comtesse de Forez;1358;1417;1;Cleppé en Forez, Loire, France;;;;M d'Auvergne;reine de France;1326;1360;1;;;;FRA;M d'Avaugour;;1220;1327;6;;;;;M d'Avesnes;;1310;1354;1;château de Murat en Bourbonnais;;;;M d'Avesnes;dame de Hans;1168;1369;17;;;;;M d'Avignon;;1024;1024;1;;;;;M d'Aviz;;1386;1447;1;East Shefford, Berkshire, Angleterre;;;;M d'Aviz;;1388;1449;2;Lisbonne, Portugal;;;;M d'Aviz;;1436;1467;1;Torres Vedras, Portugal;;;;M d'Aviz;;1527;1545;1;Coimbra;;;;M d'Aviz;cardinal;1378;1614;25;;;;;M d'Aviz;duc de Viséu;1394;1460;1;Oporto, Portugal;;;;M d'Aviz;duchesse de Bourgogne;1397;1472;1;Évora;;;;M d'Aviz;grand-Maître;1390;1443;3;Santarem, Portugal;;;;M d'Aviz;impératrice Romain-Germanique;1503;1539;1;Lisbonne;;;;M d'Aviz;prince de Catalogne;1429;1466;1;au Portugal;;;;M d'Aviz;reine de Castille;1439;1475;1;;;CYL;ESP;M d'Aviz;roi de Portugal;1357;1433;1;Lisbonne, Portugal;;;PRT;M d'Aviz;roi de Portugal;1391;1438;1;Vizeu, Portugal;;;PRT;M d'Aviz;roi de Portugal;1432;1580;5;;;;PRT;M d'Aviz;roi de Portugal;1554;1578;1;Lisbonne;;;PRT;M d'Avranches;;1055;1055;1;;;;;M Árpád;;978;1338;32;;;;;M Árpád;roi de Hongrie;1013;1060;1;Zirc;;;HUN;M Árpád;roi de Hongrie;1016;1290;18;;;;HUN;M Árpád;roi de Hongrie;1147;1172;1;Esztergom;;;HUN;M Árpád;roi de Hongrie;1250;1301;1;Venise;;;HUN;M de Babenberg;duc de Bavière;1107;1299;14;;;;;M de Babenberg;margrave d'Autriche;1073;1246;7;;;;AUT;M Babou de la Bourdaisière;;1559;1593;1;Issoire;;;;M Baciocchi;duc de Lucques;1762;1841;1;;;;;M de Backnang;;1091;1091;1;Salerne;;;;M Bacon;;1746;1746;1;;;;;M de Bade;;1655;1701;1;Bade;;;;M de Bade;comte de Brisgau;1040;1074;1;abbaye de Cluny;;;;M de Bade;duc d'Autriche;1248;1250;1;;;;AUT;M de Bade;duc de Zähringen;1078;1841;69;;;;;M de Bade;margrave;1162;1190;1;Antioche;;;;M de Bade;margrave;1728;1830;4;Karlsruhe;;;;M de Bade;princesse;1781;1826;1;Karlsruhe, Allemagne;;;;M de Bade-Durlach;;1512;1579;1;Sigmaringen;;;;M de Bade-Durlach;;1595;1651;1;Saarbrucken;;;;M de Bade-Durlach;margrave;1482;1789;25;;;;;M de Bade-Durlach;margrave;1647;1709;1;Ueckermünde;;;;M de Bade-Durlach;margrave;1679;1738;2;Carlsburg;;;;M de Bade-Durlach;prince héritier;1703;1732;1;Stuttgart;;;;M de Bade-Hachberg;;1480;1543;1;;;;;M Baillard;;1557;1557;1;;;;;M Baillardel;;1645;1704;1;Fort-St-Pierre;;;;M Baillardel;;1667;1701;2;;;;;M Baillardel;Martinique en 1638;1605;1660;1;Dieppe;;;;M Baillet de Latour;comtesse;1788;1840;1;;;;;M Balbi;;1710;1710;1;;;;;M de Balbiano;;1695;1719;1;;;;;M Baliol;;1285;1285;2;;;;;M de Baliol;;1281;1345;3;;;;;M de Ballabriga;;1758;1820;2;;;;;M Balliol;régent d'Écosse;1233;1363;3;;;SCT;GBR;M Bally;;1763;1843;1;Marseille;;;;M Bally;Marchand droguiste puis négociant à Marseille depuis 1738;1716;1784;1;Région de Montpellier;;;;M Bally;Ménager (métayer), négociant à Marseille;1711;1711;1;Montpellier;;;;M Bally;Travailleur de Terre;1679;1679;1;Baillargues;;;;M de Balzac d'Entragues;;1541;1633;2;;;;;M de Balçareni;;1005;1079;1;;;;;M Banny;;1668;1689;1;Trinité;;;;M Banny;Martinique avant 1664;1634;1671;2;;;;;M de Bar;;1396;1396;1;Nikopolis;;;;M de Bar;comte;977;1462;21;;;;;M de Bar;comte;1310;1336;1;Famagusta;;;;M de Bar;comte de Marle;1409;1415;1;Azincourt;;;;M Baranchon;;1660;1704;1;La Réole;;;;M de Barbancon-Werchin;;1520;1593;1;;;;;M de Barbarin;seigneur de la Borderie;1643;1643;1;;;;;M Barberini;;1630;1699;1;;;;;M de Barbezieux;;1285;1320;2;;;;;M Barbier;;1690;1703;2;Le Carbet;;;;M Barbier;;1746;1788;4;;;;;M Barbier;;1759;1759;1;Le Gros-Morne;;;;M Barbier;;1766;1791;2;Le Lamentin;;;;M de Barby;comtesse;1637;1637;1;;;;;M de Barby;comtesse;1641;1684;1;Rosenbourg;;;;M de Barby-Muhlingen;comte de Muhlingen;1450;1641;7;;;;;M de Barcelone;;897;1236;21;;;;;M de Barcelone;prince d'Aragon;1113;1162;1;San Dalmazio de Turin, Italie;;ARA;ESP;M Barclay;seigneur de Brechin;1378;1378;2;;;;;M Baron;;1626;1651;1;;;;;M Baron;;1822;1859;1;Bernadets-Dessus, Dept. Hautes Pyrenees, France;;;;M de Barral;;1743;1821;1;;;;;M de Barres;;1263;1291;1;;;;;M des Barres;;1188;1273;3;;;;;M de Barry;;1176;1263;1;;;;;M de Barthe;;1711;1759;1;;;;;M Baseliers;;1553;1615;2;;;;;M de Basse-Lorraine;duc;953;1014;7;;;;;M Bathory;prince de Transylvanie;1572;1613;1;Gyulafehervar;;;;M Bathory;roi de Pologne;1533;1586;1;Szilágysomlyó (aujourd'hui Simleu Silvaniei), Roumanie;;;POL;M de Baudement;seigneur de Braine;1075;1204;4;;;;;M Baudet du Savary;;1840;1840;1;;;;;M Baudin;;1650;1824;7;;;;;M Baudoin;;1577;1619;1;;;;;M de Bauffremont;;1447;1447;2;;;;;M de Baugé;;1090;1294;8;;;;;M Bauhof;;1557;1631;2;;;;;M de Baumez;sire;;;2;;;;;M Baur;;1504;1585;1;;;;;M des Baux;;1116;1538;15;;;;;M des Baux;comte d'Andria;1290;1351;1;Naples, Italie;;;;M de Bavière;;1306;1330;1;Vienne;;;;M de Bavière;comte;800;990;14;;;;;M de Bavière-Ingolstadt;;1337;1447;3;;;;;M de Bavière-Landshut;;1339;1503;8;;;;;M de Bavière-Neubourg;comte palatin de Neubourg;1615;1690;1;Neubourg;;;;M de Bavière-Neubourg;comtesse palatine;1547;1748;9;;;;;M de Bavière-Neubourg;comtesse palatine de Neubourg;1655;1720;1;Dusseldorf;;;;M de Bavière-Neubourg;reine d'Espagne;1667;1740;1;Düsseldorf;;;ESP;M de Bayning;;1639;1639;1;;;;;M Beaton;;1522;1522;2;;;;;M Beauchamp;comte de Warwick;1240;1468;4;;;;;M Beauchamp de Betso;baron;1413;1482;2;;;;;M de Beauchesne;;1686;1686;1;Blois, Loir-et-Cher;;;;M de Beaudiner;dame;1294;1337;1;;;;;M Beaudoin;;;;1;Dieppe;;;;M de Beauffremont;;1440;1490;1;;;;;M Beaufort;comte de Somerset;1371;1509;13;;;;;M de Beaugency;seigneur;1040;1132;10;;;;;M Beauharnais;;1499;1561;3;;;;;M de Beauharnais;;1599;1847;12;;;;;M de Beauharnais;;1636;1636;1;Les Presteaux de La Boische, Loiret;;;;M de Beauharnais;comte;1756;1819;1;La Rochelle;;;;M de Beauharnais;comte des Roches-Baritaud;1717;1784;1;Rochefort, France;;;;M de Beauharnais;prince français;1781;1824;1;München, Allemagne;;;;M de Beauharnais;princesse de Leuchtenberg;1816;1852;2;Munich (Allemagne);;;;M de Beauharnais;princesse de Leuchtenberg;1840;1843;1;Saint-Pétersbourg (Russie);;;;M de Beauharnais;vicomte;1760;1794;1;Fort-Royal (auj Fort-de-France), Martinique;;;;M de Beaujeu;dame de Belleroche;1107;1245;12;;;;;M de Beaumarchais;;1280;1280;1;;;;;M de Beaumetz;seigneur de Mirebeau;1215;1323;2;;;;;M Beaumont;lord;1342;1432;2;;;;;M de Beaumont;vicomte;1186;1356;4;;;;;M de Beaumont Sur Oise;;1096;1096;1;;;;;M de Beaumont-Gâtinais;;1160;1191;1;Acre, Palestine;;;;M de Beaumont-Gâtinais;;1214;1277;4;;;;;M de Beaumont-Maine;;1048;1301;8;;;;;M de Beaumont-le-Roger;;1130;1130;1;Tunbridge, Kent, Angleterre;;;;M de Beaumont-le-Roger;comte;1104;1166;1;Leicester, Angleterre;;;;M de Beaumont-le-Roger;comte de Leicester;1050;1118;1;Pont-Audemer;;;;M de Beaumont-le-Roger;comte de Leicester;1104;1206;4;;;;;M de Beauregard;seigneur de Channoir;1647;1647;1;;;;;M de Beauvau;;996;1474;7;;;;;M de Beauvoir;;1100;1300;2;;;;;M des Beaux;;1314;1314;1;;;;;M du Bec;;1678;1678;1;;;;;M Beckford;;1760;1844;1;Fonthill, Wiltshire;;;;M Belain d'Esnanbuc;;1574;1589;1;Cailleville;;;;M Belland;;1743;1817;2;;;;;M de Bellanger de Rebourseaux;;1712;1842;5;;;;;M Bellay;;1667;1667;1;;;;;M du Bellay;;1361;1389;2;;;;;M Belleste;Marchand à Dieppe;;;2;;;;;M de Bellevile-Montaigu;dame de Montaigu;1300;1359;1;;;;;M de Belleville-Montaigu;;1210;1303;4;;;;;M Belloncle;;1793;1800;2;;;;;M de Beloeil;;1165;1165;1;;;;;M Benard;;1644;1698;1;;;;;M Beneteau Cardin;;1748;1783;2;Grande Anse (Lorrain);;;;M Beneteau Laprairie;;1659;1732;1;La Rochelle;;;;M Beneteau Laprairie;;1711;1770;1;Grande Anse (Lorrain);;;;M Bennett;comtesse d'Arlington;1667;1722;2;;;;;M de Bentheim;comte de Bentheim-Steinfurt;1460;1562;3;;;;;M de Bentheim-Tecklenbourg;comte de Bentheim;1554;1670;4;;;;;M Bentinck;comte de Portland;1649;1809;3;;;;;M Bentinck;duc de Portland;1681;1726;1;en Jamaique;;;;M de Berg;comte de Berg-Heerenberg;1114;1506;9;;;;;M Berger des Rivières;;1681;1681;1;;;;;M de Bergerac;;1250;1250;2;;;;;M de Bergh;;1613;1657;1;;;;;M de Beringhes;;1493;1493;1;;;;;M de Bermond de Caylar;;1715;1715;1;;;;;M de Bermondet;;1654;1724;1;;;;;M Bernadotte;;1683;1760;1;;;;;M Bernadotte;;1711;1780;1;Pau, France;;;;M Bernadotte;roi de Suède;1763;1844;1;Pau, Bearn, France;;;SWE;M Bernard Cordier;;1789;1812;2;Les Anses d'Arlet;;;;M Bernard Cordier;;1826;1826;1;Anses d'Arlet;;;;M de Bernard de Feissal;;1785;1821;2;St-Pierre;;;;M de Bernard de Feissal;;1819;1819;1;Le Mouillage (St-Pierre);;;;M de Bernard de Feissal;;1826;1826;1;;;;;M de Bernicie;;920;920;1;;;;;M Bernus;;1804;1804;1;Basse-Pointe;;;;M Bernus;;1841;1841;1;Lorrain;;;;M Berry;Blanchisseur du linge du corps du Roi;1655;1759;2;Le Pecq, act. Yvelines;;;;M Berry;Lavandier du linge du corps du Roy. Officier chez le comte d'Artois;1719;1775;1;Le Pecq, act Yvelines;;;;M de Berry;;1759;1807;1;Saint Germain en Laye, France;;;;M de Berry;;1796;1841;1;à Fort-Royal;;;;M de Berry;duc;1340;1435;3;;;;;M de Berry;duchesse d'Auvergne;1375;1434;1;Lyon, act Rhône, France;;AUV;FRA;M Bertin;;1668;1734;2;;;;;M Bertin de Marostel;Chevau Léger, Garde.;1666;1666;1;;;;;M Beslivier;seigneur de Fontmorte;1642;1642;1;;;;;M Beslivier de Prin;;1732;1732;2;;;;;M de Bethizy de Mezieres;;1706;1757;1;;;;;M Bethlen;;1530;1590;1;;;;;M Bethlen;roi de Hongrie;1580;1629;1;;;;HUN;M de Bettau;;1030;1086;1;;;;;M Betulius;;1662;1699;1;;;;;M de Beuren;évêque de Strasbourg;1047;1103;3;;;;;M de Beuthen;duc;1306;1317;2;;;;;M de Beuze;;1697;1701;2;;;;;M de Beuze;;1712;1712;1;Fort-Royal, Martinique;;;;M de Beuze;Lieutenant de cavalerie;1678;1687;1;Bonneville Arch. Rouen;;;;M de Béarn;;1078;1319;8;;;;;M Béchameil de Nointel;;1692;1692;1;;;;;M de Béhague;;1734;1809;1;;;;;M de Bénévent;;849;1444;5;;;;;M Béraut;;1793;1836;1;à Terraude;;;;M Béraut;Cultivateur;;;1;;;;;M de Bésalu;;992;1020;5;;;;;M de Béthune;seigneur;1129;1605;10;;;;;M de Béthune;seigneur;1200;1248;1;Palestine;;;;M de Béziers;;1105;1105;2;;;;;M de Bickenbach;;1450;1530;1;;;;;M Bidenbach;;1500;1630;5;;;;;M von Biedenfeld;;1560;1588;1;;;;;M de Bielsko;duc;1246;1246;2;;;;;M de Biencourt;;1664;1664;1;;;;;M Bigod;comte de Norfolk;1225;1270;1;;;;;M de Bigorre;comte;965;1225;17;;;;;M Bigot de Terland;;1725;1725;2;;;;;M Biguet;;1748;1828;1;Sermaize (Marne);;;;M Biguet;Entrepreneur de bâtiments;;;1;;;;;M Biguet;Marinier jusqu'en 1808;1778;1797;1;Sermaize;;;;M Bilfinger;;1652;1761;2;;;;;M Billet;;1712;1782;1;;;;;M Binard;;1608;1721;3;;;;;M Bingham;;1781;1781;1;London;;;;M de Bionne;;1679;1724;1;Le Prêcheur;;;;M de Bionne;;1728;1795;1;St-Pierre;;;;M de Bionne;Chirurgien au Prêcheur;1647;1675;1;Flaville (Normandie);;;;M Birot;;1705;1705;1;Le Marigot;;;;M Birot;;1724;1724;1;Trinité;;;;M Birot;;1732;1732;1;Ste-Marie;;;;M Birot;Martinique avant 1664;1638;1743;3;;;;;M Birot Avenant;;1752;1752;1;Trinité;;;;M Birot Avenant;;1775;1810;3;Le Gros-Morne;;;;M Birot Avenant;;1809;1809;1;Gros-Morne;;;;M Birot Avenant;;1831;1831;1;Gros-Morne, Martinique;;;;M Birot Avenant Montlouis;;1778;1778;1;Le Gros-Morne;;;;M Birot Desgranges;;1810;1810;1;Le Gros-Morne;;;;M de Bisceglie;prince de Salerne;1481;1500;1;;;;;M von Bismarck;;1667;1840;4;;;;;M Bjelke;;1428;1436;3;;;;;M Bjelke;;1568;1592;1;Bråborg, Suède;;;;M Blanc;;1772;1772;1;St-Pierre;;;;M Blanchard du Boust;;1575;1575;1;;;;;M Blanchetiere;;1724;1724;1;Trinité;;;;M de Blecourt;;1495;1495;1;;;;;M de Bleschamp;;1778;1855;2;;;;;M de Blois;comtesse de Boulogne;943;1230;20;;;;;M de Blois;roi d'Angleterre;1097;1154;1;;;ENG;GBR;M Blome;;1575;1646;2;;;;;M Blondeau;;1677;1677;2;;;;;M Blondeau;;1677;1677;1;Saumur;;;;M de Blondeaux;;1599;1599;1;;;;;M Blondel;;1626;1817;7;;;;;M Blondel de La Rougery;chevalier de Saint-Louis;1747;1870;15;;;;;M von Bock und Polach;;1799;1847;1;;;;;M Bodet de la Fenestre;;1819;1819;1;;;;;M Bodulgate;;1380;1440;1;;;;;M de Boelaere;;1207;1207;2;;;;;M de Bogen;comte;1094;1198;3;;;;;M Boggiana;;1686;1686;1;;;;;M de Bohun;comte de Hereford;1171;1399;4;;;;;M von Boineburg;;1583;1632;1;;;;;M de Boisselet;;1491;1604;7;;;;;M Boleyn;;1477;1539;2;;;;;M Boleyn;reine d'Angleterre;1501;1536;1;;;ENG;GBR;M Bollioud de Saint-Julien;;1737;1737;2;;;;;M Bonaparte;;1629;1741;5;Ajaccio, Corse-du-Sud;;;;M Bonaparte;empereur des Français;1602;1860;19;;;;;M Bonaparte;empereur des Français;1769;1821;1;Ajaccio, Corse;;;;M Bonaparte;roi de Naples;1768;1844;1;;;;ITA;M Bonde;;1376;1417;2;;;;;M Bonde;roi de Suède;1409;1470;1;;;;SWE;M Bonfils;;1679;1782;2;;;;;M Bonjour;;1658;1680;1;Martinique;;;;M Bonjour;;1677;1700;1;Marin;;;;M Bonjour;Garde de Thoisy;;;1;;;;;M Bonnaire;;1835;1835;1;;;;;M Bonnenfant;;1448;1448;2;;;;;M Bonnenfant;;1683;1736;1;Le Marigot;;;;M Bonnet du Gennetay;;1547;1547;1;;;;;M Bonneville Bonneterre;;1780;1780;1;Le Gros-Morne;;;;M de Bonngau;;891;991;5;;;;;M Bonnin;;1834;1834;1;;;;;M Boothby;;1848;1848;1;West Twyford, Midx;;;;M di Borbone;;1741;1763;1;Buen Retiro;;;;M di Borbone;;1773;1802;1;Naples;;;;M di Borbone;;1814;1898;1;Palerme;;;;M di Borbone;duc de Parme;1720;1866;13;;;;;M di Borbone;duchesse de Berry;1798;1870;1;Notre-Dame de Paris;;;;M di Borbone;princesse de Naples;1772;1807;1;Naples;;;ITA;M di Borbone;princesse de Naples;1784;1806;1;;;;ITA;M di Borbone;reine d'Espagne;1751;1819;1;San Ildefonso;;;ESP;M de Borbón;;1718;1848;10;;;;;M de Borbón;;1771;1774;1;Escorial;;;;M de Borbón;;1777;1782;1;San Ildefonso;;;;M de Borbón;;1779;1798;1;Aranjuez;;;;M de Borbón;infant d'Espagne;1786;1812;1;Rio de Janeiro, Brésil;;;ESP;M de Borbón;infante d'Espagne;1745;1792;1;Naples;;;ESP;M de Borbón;infante d'Espagne;1775;1830;1;Aranjuez, Madrid;;;ESP;M de Borbón;roi d'Espagne;1683;1746;1;Versailles;;;ESP;M de Borbón;roi d'Espagne;1707;1724;1;Madrid;;;ESP;M de Borbón;roi d'Espagne;1713;1833;4;;;;ESP;M de Borbón;roi d'Espagne;1748;1819;1;Pottici;;;ESP;M de Bordeaux;;1195;1351;4;;;;;M des Bordes;;1587;1587;2;;;;;M de Bordesoulle;;1842;1842;1;;;;;M Borel;;1768;1791;1;Saint-Pierre Fort;;;;M Borel de Miracle;;1770;1770;1;;;;;M Borghese-Aldobrandini;;1812;1838;1;;;;;M Borghèse;prince;1775;1832;1;;;;;M Borgia;duc de Valentinois;1474;1519;3;Rome;;;;M Borgia;pape;1431;1503;1;Jávita, Espagne;;;;M Borgia;prince de Squillace;1481;1552;3;;;;;M de Borselen-Wittem;;1495;1536;1;;;;;M Bosc;;1790;1790;1;Chateaudouble, 26;;;;M Boscquet de Saint Martin;;1699;1699;1;;;;;M Boteler;;1604;1604;1;;;;;M de Bothmer;;1697;1748;1;La Hague;;;;M de Bothmer;seigneur;1620;1732;2;;;;;M Boucher;;1696;1696;1;Le Carbet;;;;M de Bouchout;;1440;1476;1;;;;;M Boudan;;1674;1674;1;;;;;M Boudin;;1765;1841;1;;;;;M Boudon;;1674;1706;1;;;;;M Bouilhat;;1714;1714;2;;;;;M de Bouillé;;1480;1579;3;;;;;M du Bouillonney;;1712;1760;1;Champobert;;;;M Boulin;;1763;1763;1;Macouba;;;;M Boullanger;;1642;1642;1;St-Christophe;;;;M de Boulogne;comte de Dammartin;850;1260;19;;;;;M de Boulogne;comtesse d'Auvergne;1389;1423;1;;;AUV;FRA;M Bourbon;;1841;1841;1;Lorrain;;;;M de Bourbon;;1220;1274;1;Dreux;;;;M de Bourbon;;1310;1402;1;Avignon;;;;M de Bourbon;;1328;1387;1;Naples;;;;M de Bourbon;;1334;1383;2;Vincennes;;;;M de Bourbon;;1342;1427;1;Louvre, Paris;;;;M de Bourbon;;1347;1401;1;Poissy;;;;M de Bourbon;;1493;1583;1;chateau de Ham;;;;M de Bourbon;;1522;1525;1;Château de la Fète, Picardie, France;;;;M de Bourbon;;1732;1820;4;Versailles;;;;M de Bourbon;;1764;1794;1;à Versailles;;;;M de Bourbon;;1818;1818;1;Elysée-Bourbon;;;;M de Bourbon;comte de la Marche;1315;1361;1;Lyon;;;;M de Bourbon;duc;1280;1342;1;Pontoise;;;;M de Bourbon;duc;1311;1356;1;Poitiers;;;;M de Bourbon;duc;1336;1410;1;Montluçon en Bourbonnais, Allier, France;;;;M de Bourbon;duc;1381;1434;1;Londres;;;;M de Bourbon;duc d'Aquitaine;1753;1754;1;;;AQU;FRA;M de Bourbon;reine d'Angleterre;1609;1669;1;;;ENG;GBR;M de Bourbon;reine d'Espagne;1603;1644;1;Fontainebleau;;;ESP;M de Bourbon;reine de France;1337;1378;1;Vincennes;;;FRA;M de Bourbon;roi de France;1553;1824;11;;;;FRA;M de Bourbon;roi de France;1601;1643;1;Fontainebleau;;;FRA;M de Bourbon;roi de France;1757;1836;1;Château de Versailles;;;FRA;M de Bourbon;roi de Naples;1370;1438;1;;;;ITA;M de Bourbon;roi de Navarre;1518;1562;1;Les Andelys;;;;M de Bourbon;régente de Savoie;1340;1402;1;Mâcon;;;;M de Bourbon;seigneur;1048;1821;157;;;;;M de Bourbon;seigneur;1197;1242;1;Cognat, Allier, France;;;;M de Bourbon;seigneur de Beaujeu;1388;1404;1;Hôtel de Bourbon, Paris;;;;M de Bourbon;évêque de Nevers;1523;1590;1;La Ferté-sous-Jouarre;;;;M de Bourbon-Condé;;1556;1556;1;Roucy, Aisne, France;;;;M de Bourbon-Condé;;1557;1557;1;Nogent-le-Rotrou, Eure-et-Loir, France;;;;M de Bourbon-Condé;;1562;1563;1;Gandelou-en-Brie, Aisne, France;;;;M de Bourbon-Condé;;1563;1563;1;Muret;;;;M de Bourbon-Condé;;1564;1564;1;Dijon;;;;M de Bourbon-Condé;;1564;1564;1;château de Roucy;;;;M de Bourbon-Condé;;1610;1610;1;palais du Louvre, Paris, France;;;;M de Bourbon-Condé;;1648;1648;1;Paris;;;;M de Bourbon-Condé;cardinal de Vendôme;1562;1594;1;Gandelu-en-Brie, Aisne, France;;;;M de Bourbon-Condé;prince de Condé;1530;1569;1;Château de Vendôme, Loir-et-Cher, France;;;;M de Bourbon-Condé;prince de Condé;1552;1830;36;;;;;M de Bourbon-Condé;prince de Conti;1558;1614;1;La Ferté-sous-Jouarre, Seine-et-Marne, France;;;;M de Bourbon-Conti;duchesse de Bourbon;1689;1759;2;;;;;M de Bourbon-Conti;prince de Conti;1629;1825;6;Paris;;;;M de Bourbon-Conti;roi de Pologne;1664;1709;1;Paris;;;POL;M de Bourbon-Montpensier;;1515;1539;1;chateau d'Amboise;;;;M de Bourbon-Montpensier;;1546;1582;1;Anvers;;;;M de Bourbon-Montpensier;comte de Montpensier;1403;1627;6;;;;;M de Bourbon-Montpensier;duc de Montpensier;1573;1608;1;Reims;;;;M de Bourbon-Montpensier;prince de Dombes;1490;1527;1;Rome;;;;M de Bourbon-Montpensier;prince de La Roche-sur-Yon;1473;1561;2;Moulins;;;;M de Bourbon-Montpensier;prince de La Roche-sur-Yon;1513;1582;1;chateau de Champagny;;;;M de Bourbourg;;1214;1214;3;;;;;M Bourcel;;1768;1768;1;Case-Pilote;;;;M de Bourchenu;;1664;1664;3;;;;;M Bourchier;comte d'Essex;1406;1483;2;;;;;M Bourdeau d'Antony;;1771;1821;1;Limoges. Egl Stpierre du Q;;;;M Bourdeau d'Antony;;1805;1832;1;Limoges Egl St Etienne, 87;;;;M Bourdeau de La Chevalerie;;1680;1784;2;;;;;M Bourdeau de La Gueusserie;;1626;1676;1;;;;;M Bourdin;;1792;1792;1;Grande Anse (Lorrain);;;;M Bourdineau;;1561;1561;3;;;;;M de Bourg;;1240;1319;2;;;;;M de Bourgelas;;1692;1695;3;;;;;M de Bourgelas de Bonneterre;;1692;1770;2;;;;;M Bourgeois;;1628;1732;4;;;;;M de Bourgogne;;1213;1248;1;Carcassonne, France;;;;M de Bourgogne;;1270;1323;1;Chambly;;;;M de Bourgogne;;1292;1304;1;bataille de Mons en Puelle;;;;M de Bourgogne;;1378;1467;2;Dijon;;;;M de Bourgogne;;1390;1463;1;Bruges;;;;M de Bourgogne;comte d'Autun;856;1511;133;;;;;M de Bourgogne;comte de Boulogne;1323;1346;1;à Aiguillon;;;;M de Bourgogne;comte de Galice;1060;1107;1;Grajal, Espagne;;;;M de Bourgogne;comte de Mâcon;1060;1102;1;Ascalon, Palestine;;;;M de Bourgogne;comte de Portugal;1066;1112;1;Dijon, France;;;PRT;M de Bourgogne;comtesse de Nevers;1265;1280;1;Auxerre;;;;M de Bourgogne;dame de Bourbon;1272;1310;1;château de Murat en Bourbonnais;;;;M de Bourgogne;duc;1011;1076;1;Fleurey sur Ouche;;;;M de Bourgogne;duc;1056;1093;1;abbaye de Cluny;;;;M de Bourgogne;duc;1060;1102;1;Tarsus, Grêce;;;;M de Bourgogne;duc;1148;1192;1;Tyr;;;;M de Bourgogne;duc;1342;1404;1;Pontoise, France;;;;M de Bourgogne;duc;1371;1419;1;Dijon, France;;;;M de Bourgogne;duchesse de Brabant;1457;1482;1;Bruxelles;;;;M de Bourgogne;prince d'Orange;1361;1418;1;Paris;;;;M de Bourgogne;roi de France;890;1330;2;;;;FRA;M de Bourgogne;roi de Portugal;1110;1383;8;;;;PRT;M de Bourgogne;régente de l'Empire;931;999;1;Monastère de Seltz, Alsace;;;;M de Bourgogne;seigneur d'Arguel;1337;1366;1;siège de Mésembria;;;;M de Bourgogne Transjurane;duc;888;888;2;;;;;M de Bourgogne-Comté;;1188;1188;2;;;;;M de Bourgogne-Comté;comte de Mâcon;1125;1184;1;Mâcon;;;;M de Bourgogne-Montagu;;1195;1195;1;;;;;M de Bournonville;comte de Henin-Letard;1533;1764;9;;;;;M Bourreau;;1607;1607;3;;;;;M Bouteiller;;1661;1661;1;;;;;M de Bouville;;1265;1265;1;;;;;M de Bouzonville;;1075;1075;3;;;;;M Bowes de Streatlam;;1749;1800;1;;;;;M Bowes-Lyon;comte de Strathmore;1773;1846;2;;;;;M Boyd;comte d'Arran;1467;1473;1;;;;;M Boyer;;1712;1800;3;;;;;M Boyer de Sainte Geneviève;;1631;1697;1;;;;;M Boyle;Lord de Clifford;1661;1754;4;;;;;M de Boyslèsve;seigneur de Forsan;1531;1551;4;;;;;M da Bozzi;;1682;1682;2;;;;;M de Brabant;;1104;1406;20;;;;;M de Brabant;;1224;1288;1;Compiègne, France;;;;M de Brabant;cardinal;1166;1192;1;à Liège;;;;M de Brabant;duc;1160;1235;1;Cologne, Allemagne;;;;M de Brabant;duc;1207;1248;1;Louvain, Belgique;;;;M de Brabant;reine de France;1254;1321;1;;;;FRA;M de Brabant-Arschott;;1304;1304;1;;;;;M Brachet;;1599;1599;4;;;;;M Brachienne Vasselot;seigneur de Danemarie;1422;1422;2;;;;;M de Bracquemont;;1410;1415;1;;;;;M de Bragance;;1402;1834;32;;;;;M de Bragance;duc;1380;1461;1;Chaves;;;;M de Bragance;reine d'Angleterre;1638;1705;1;;;ENG;GBR;M de Bragance;roi de Portugal;1604;1834;9;;;;PRT;M de Bragance;roi de Portugal;1767;1826;1;Lisbonne;;;PRT;M Brahé;comte;1629;1689;4;;;;;M Branas d'Andrinople;;1204;1204;1;;;;;M de Brancas;;1667;1667;1;Paris;;;;M Brandon;duc de Suffolk;1484;1559;2;;;;;M Brankovitch;;1411;1516;10;;;;;M Braque;;1544;1544;8;;;;;M Brastberger;;1572;1635;1;;;;;M de Brederode;;1505;1567;1;;;;;M de Breslau;duc;1216;1352;2;;;;;M de Bressey;;1710;1710;1;;;;;M de Bressey;;1733;1785;1;Conde-sur-Iton;;;;M de Bretagne;;1297;1377;1;Montoire;;;;M de Bretagne;dame de Brie-Comte-Robert;1270;1327;1;Vincennes;;;;M de Bretagne;dame de Nogent-le-Rotrou;1296;1363;1;Ypres;;;;M de Bretagne;duc des Bretons;851;1506;36;;;;;M de Bretagne;reine de France;1477;1514;1;;;;FRA;M de Bretagne d'Avaugour;comte;1493;1608;4;;;;;M de Bretagne d'Avaugour;comte;1581;1657;2;Paris;;;;M de Breteuil;;1020;1020;2;;;;;M du Breuil;seigneur des Vories;1511;1511;2;;;;;M Breuilh;;1728;1802;1;;;;;M Breuilh;;1787;1868;1;Enraud, 87;;;;M Breuilh;;1789;1834;1;Limoges, 87;;;;M Breuilh;;1802;1802;1;Limoges ?, 87;;;;M Breuillard;;1788;1814;2;;;;;M de Breze;;1461;1577;3;;;;;M de Breze;comte de Maulévrier;1463;1531;1;Anet;;;;M Brezing;;1625;1832;6;;;;;M de Briansk;prince;1341;1342;2;;;;;M Briard;;1758;1804;2;;;;;M Brice;;1653;1725;1;Le Carbet;;;;M de Brieg;;1342;1386;2;;;;;M de Brienne;comte;1200;1200;1;Melun;;;;M de Brienne;comte d' Eu;1294;1294;1;Clermont-en Beauvaisis;;;;M de Brienne;empereur d'Orient;1148;1237;1;Tolède, Espagne;;;;M de Brienne;reine de Jérusalem;1225;1228;1;à Andria;;;;M de Brienne;vicomte de Beaumont;1024;1362;24;;;;;M Briere de L'Isle;;1846;1846;1;Le François;;;;M Brignole-Sale;;1737;1813;1;Wimbledon;;;;M Brignole-Sale;doge de Gênes;;;1;;;;;M de Brilhac;;1521;1521;1;;;;;M de Brimeu;;1460;1500;1;;;;;M de Briollay;;969;1120;7;;;;;M de Bronkhorst;;1270;1310;1;;;;;M Brossa;jarl;;;2;;;;;M de Brosse;vicomte;960;1513;6;;;;;M de la Brosse;seigneur;1693;1693;1;;;;;M de Brouilhac;;1825;1825;1;;;;;M Brown;;1705;1785;3;;;;;M de Broyes;;1089;1187;5;;;;;M Bruce;roi d'Irlande;1318;1318;1;;;;IRL;M Bruce;roi d'Écosse;1274;1371;2;;;SCT;GBR;M Bruce;seigneur d'Annandale;1210;1745;12;;;;;M Brudenall;;1707;1837;3;;;;;M de Brudenell;;1722;1722;1;;;;;M Brun;seigneur de la Forêt-Mérigot;1583;1583;2;;;;;M de Brunswick-Gottingen;duc;1379;1444;2;;;;;M de Brunswick-Göttingen;;1390;1432;1;Brunswick;;;;M de Brus;;1230;1230;2;;;;;M de Bueil;;1049;1651;2;;;;;M Buisson;;1632;1839;2;;;;;M de Bulgarie;;1209;1332;3;;;;;M de Bulkeley;;1700;1700;1;;;;;M de Bullion;;1706;1760;1;;;;;M de Burdelot;;1630;1630;1;;;;;M de Buren;;1420;1480;1;;;;;M de Burgat;;1599;1599;2;;;;;M de Burgh;comte d'Ulster;1312;1363;3;;;ULS;GBR;M de Burgh;comte de Kent;1221;1695;3;;;;;M de Burghausen;comte;1128;1142;1;;;;;M Burnaby;;1771;1825;1;;;;;M de Busca;marquis de Bosco;1115;1115;2;;;;;M Butler;comte d'Ormonde;1463;1710;3;;;;;M de Byzance;;919;1011;3;;;;;M de Caboet;;1185;1185;1;;;;;M de Cabrera;;1202;1202;2;;;;;M Cacqueray de Valmenière;;1706;1706;1;Fort-Royal, Martinique;;;;M Cacqueray de Valmenière;Capitaine de Vaisseau, Martinique 1651, Gouverneur de Grenade.;1664;1664;1;Saint-Saens;;;;M de Cadogan;;1719;1751;1;;;;;M Caffier Descostières;;1792;1792;1;Sainte-Marie;;;;M Caillard de Ballon;;1628;1628;2;;;;;M Caillaut;;1632;1651;1;;;;;M Calderon;Actrice;;;1;;;;;M de Calonne;marquis de Courtebonne;;;1;;;;;M de Calonne de Courtebonne;;1799;1828;1;;;;;M Camasse;;1757;1757;1;;;;;M de Cambout;;1622;1674;1;Paris;;;;M de Cambrai;;920;952;3;;;;;M Campbell;;1816;1816;1;;;;;M Canalis;comtesse de Saint-Sébastien;1678;1769;2;;;;;M de Candé;;1035;1054;2;;;;;M Cane;;1398;1412;1;Pavie;;;;M Canella;;1070;1184;2;;;;;M von Canstatt;baronne;;;1;;;;;M Cantacuzène;empereur d'Orient;1293;1383;3;;;;;M Capet;;1284;1305;1;Paris;;;;M Capet;comte de Vermandois;1057;1102;1;Tarse, Turquie;;;;M Capet;comtesse de Corbie;1009;1079;1;Messine, Italie;;;;M Capet;comtesse de Leicester;1085;1131;1;Meulan;;;;M Capet;dame d'Abbeville;974;1392;46;;;;;M Capet;reine d'Angleterre;1158;1318;2;;;ENG;GBR;M Capet;reine d'Angleterre;1292;1358;1;à Paris;;ENG;GBR;M Capet;roi de France;941;1226;3;Paris;;;FRA;M Capet;roi de France;972;1031;1;Orléans;;;FRA;M Capet;roi de France;1008;1060;1;Vitry-aux-Loges;;;FRA;M Capet;roi de France;1052;1108;1;Meulan;;;FRA;M Capet;roi de France;1081;1137;1;Herbst;;;FRA;M Capet;roi de France;1165;1223;1;Gonesse;;;FRA;M Capet;roi de France;1214;1270;1;Poissy;;;FRA;M Capet;roi de France;1245;1285;1;à Poissy;;;FRA;M Capet;roi de France;1268;1314;1;Fontainebleau;;;FRA;M Capet;roi de France;1289;1328;4;;;;FRA;M Capet;seigneur de Courtenay;1125;1182;1;Palestine;;;;M de Carcassonne;;991;1066;3;;;;;M de Cardona;;1180;1289;2;;;;;M de Carency;;1265;1265;1;;;;;M de Carinthie;roi de Bohême;890;1369;19;;;;;M de Carlat;;1050;1050;1;;;;;M de Carnazet;;1521;1633;3;;;;;M de Carnazet;;1595;1595;1;château d'Achy, Oise;;;;M Carolingien;;843;870;1;Auxerre;;;;M Carolingien;empereur d'Occident;747;814;1;Aix-la-Chapelle, Allemagne;;;;M Carolingien;empereur d'Occident;823;877;1;Modène, Italie;;;;M Carolingien;roi d'Aquitaine;803;866;3;;;AQU;FRA;M Carolingien;roi d'Aquitaine;846;879;1;Compiègne, France;;AQU;FRA;M Carolingien;roi de France;863;882;1;Francfort, Allemagne;;;FRA;M Carolingien;roi de France;864;987;5;;;;FRA;M Carolingien;évêque de Metz;582;1021;48;;;;;M Carpenter;;1783;1811;1;;;;;M Carpentier;;1754;1839;1;Gand;;;;M de Carrara;;1367;1430;2;;;;;M Carreau Gaschereau;;1759;1892;11;;;;;M Carreau Gaschereau;;1775;1847;1;New-York;;;;M Carreau de Gaschereau;;1706;1748;1;Vernay (Le Mans);;;;M Carreau de Gaschereau;;1736;1791;1;Trinité;;;;M Carreau de Gaschereau;;1774;1774;2;;;;;M de Carrick;comte;1271;1292;2;;;;;M de Carrière;;1596;1596;1;;;;;M de Carvoisin;;1531;1560;2;;;;;M de Carvoisin;;1595;1595;1;château d'Achy, Oise;;;;M de Casado de Monteleon;;1725;1761;1;La Hague;;;;M Cassius de Linval;;1821;1821;1;Fort-St-Pierre;;;;M de Castelbon-Cerdagne;;1185;1203;2;;;;;M de Castell;comte;1482;1631;3;;;;;M de Castell-Castell;;1703;1777;1;Castell;;;;M de Castell-Castell;comte;1641;1709;1;Remlingen;;;;M de Castell-Castell;comte;1668;1707;12;;;;;M de Castell-Remlingen;comte;1610;1717;4;;;;;M de Castell-Rüdenhausen;comte;1722;1849;2;;;;;M de Castelnau;baron;1085;1158;8;;;;;M de Castille;;960;1530;39;;;;;M de Castille;;1126;1189;1;Palencia, Espagne;;;;M de Castille;;1136;1160;1;Orléans;;;;M de Castille;;1188;1252;1;Palencia;;;;M de Castille;;1222;1222;1;Tolède, Espagne;;;;M de Castille;comte;965;1504;18;;;CYL;ESP;M de Castille;comtesse de Ponthieu;1244;1290;1;Harby;;;;M de Castille;duc de Molina;1203;1272;1;Salamanque;;;;M de Castille;empereur d'Espagne;1039;1109;1;Tolède, Espagne;;;ESP;M de Castille;grand-Maître de l'Ordre de Santiago;1334;1358;1;Séville;;;;M de Castille;reine;1081;1126;1;Saldana, Espagne;;CYL;ESP;M de Castille;roi;1311;1350;1;Salamanque;;CYL;ESP;M de Castille;roi;1334;1369;1;Burgos;;CYL;ESP;M de Castro;;1320;1479;8;;;;;M Cattaciolo;;1602;1602;2;;;;;M de Caumont;duc de Lauzun;1294;1730;6;;;;;M du Caurroy;;1696;1696;1;Le Prêcheur;;;;M du Caurroy;;1738;1771;3;Le François;;;;M Cavendisch-Bentinck;lord;1780;1826;1;;;;;M Cavendish;comte de Devonshire;1552;1794;10;;;;;M Cavendish-Harley;;1715;1785;1;;;;;M Cazeneuve;;1803;1851;4;;;;;M Cecil;;1638;1638;1;;;;;M de Celis;;1858;1858;1;;;;;M de la Cerda;baron de Lunel;1270;1379;3;;;;;M de la Cerda;infant de Castille;1253;1275;1;;;CYL;ESP;M Céloron de Blainville;;1710;1710;1;;;;;M de Chabannais;seigneur de Confolens;964;1245;8;;;;;M Chabanneau;;1841;1841;1;à Bordeaux (Gironde);;;;M de Chabannes;seigneur de Curton;1484;1484;1;;;;;M Chabot;duc de Rohan;1646;1655;1;chateau de Chanteloup;;;;M de Chabot;;1050;1180;11;;;;;M de Chabot;comtesse de Charny;1565;1652;1;hotel d'Elboeuf a Paris;;;;M Chachere;;1654;1654;2;;;;;M de Chalençon;;1295;1407;4;;;;;M Chaleu;chevalier;1371;1399;2;;;;;M de Chalon;;1160;1160;2;;;;;M de Chalus;;1734;1821;1;;;;;M de Cham;comte;;;2;;;;;M Chamaillart;vicomtesse de Beaumont;1425;1425;1;chateau d'Argentan;;;;M de Chambon;dame de Combrailles;1165;1180;1;;;;;M de Chamborant;seigneur de Boucheron;1647;1660;2;;;;;M du Champ;;1743;1743;1;;;;;M de Champagne;;1224;1283;1;Hédé;;;;M de Champagne;comte de Blois;1093;1306;12;;;;;M de Champagne;reine de France;1140;1206;1;Paris;;;FRA;M de Champagne;reine de France;1271;1305;1;Bar-sur-Aube;;;FRA;M de Champagne;roi de Navarre;1201;1253;1;Troyes;;;;M de Champagne;roi de Navarre;1269;1274;1;Pampelune;;;;M de Champagne;évêque de Chartres;1135;1202;1;à Reims;;;;M de Chanteloup;;1579;1579;1;Chartres;;;;M Chapon;;1666;1755;3;;;;;M Chaponnel;;1633;1678;1;Bellombre, 89;;;;M Chappotin;;1685;1685;1;Escolives, 89;;;;M Chapt de Rastignac;;1817;1817;1;;;;;M Chardin;;1718;1785;1;Fresneau, 60;;;;M Chardin;;1756;1832;1;Ivry le Temple, 60;;;;M Chardin;;1757;1835;1;;;;;M de Charenton;;1115;1195;3;;;;;M de Charette de La Contrie;;1827;1827;1;Paris;;;;M Charon;;1657;1673;1;;;;;M Charpillon;;1842;1842;1;Rhône;;;;M Chartier;;1610;1682;1;Bretagne;;;;M Chartier;;1655;1655;1;;;;;M Chateau;;1713;1765;2;;;;;M Chateau;;1720;1763;1;Marseille;;;;M Chateau Sainte-Marie;;1792;1824;2;Sainte-Marie;;;;M de Chateaubriant;;1240;1240;8;;;;;M Chatenay;;1666;1666;1;Le Carbet;;;;M Chatenay;;1713;1785;1;Gros Morne;;;;M Chatenay;;1772;1796;2;;;;;M Chatenay;Martinique avant 1660;1624;1678;1;La Jonchère, Vendée;;;;M Chatenay-Vaucourt;;1759;1803;1;Le Gros-Morne;;;;M Chatenay-Vaucourt;;1787;1787;1;Gros Morne;;;;M Chatenay-Vaucourt;;1815;1836;1;à Fort-de-France (Martinique);;;;M de Chatillon;;1756;1777;4;;;;;M Chaudrier;;1417;1514;6;;;;;M Chauvet;;1838;1838;1;;;;;M de Chauvigny;;1302;1502;7;;;;;M Chaworth;;1282;1322;2;;;;;M de Chazelles de Beauregard;;1712;1712;1;;;;;M de Châlon;comte;875;1228;15;;;;;M de Châlons;;1321;1321;2;;;;;M de Château-Gonthier;;1192;1192;1;;;;;M de Château-Porcien;;1087;1087;1;;;;;M de Château-du-Loir;;1099;1099;1;;;;;M de Châteaubriand;;1465;1509;1;;;;;M de Châteaudun;dame de Château-du-Loir;972;1259;13;;;;;M de Châteaumur;seigneur;1200;1286;6;;;;;M de Châteauneuf;;1248;1353;3;;;;;M de Châteauneuf du Tournel;;1259;1259;1;;;;;M de Châtellerault;;1103;1130;1;Châtellerault;;;;M de Châtellerault;dame;1075;1315;6;;;;;M de Châtellerault;vicomte;1077;1151;1;Noyers;;;;M de Châtillon;;1304;1304;1;Saint Pol;;;;M de Châtillon;comte de Penthièvre;1340;1404;1;Clisson, Loire Atlantique, France;;;;M de Châtillon;seigneur;1080;1470;34;;;;;M de Châtillon;seigneur;1110;1146;1;Palestine;;;;M de Châtillon;seigneur d'Outre-Jourdain;1120;1187;1;Hittin, Palestine;;;;M de Châtillon;seigneur de Leuze;1302;1302;1;bataille de Courtrai;;;;M de Châtillon-Blois;comte de Dunois;1386;1391;1;Beaumont, Hainaut;;;;M de Châtillon-Blois;comte de Penthièvre;1406;1479;3;;;;;M Cheirouze;Comtesse von Lemberg;1752;1775;1;Paris, France;;;;M Chenin;chevalier de Mauzé;1255;1436;4;;;;;M du Chesne de Saint-Léger;;1832;1832;1;;;;;M de Chester;comte;1187;1187;1;;;;;M Chestov;;1590;1631;2;;;;;M Chevalier;;1723;1723;2;;;;;M de Chevigné;;1839;1839;1;;;;;M Chéneaux;;1728;1760;1;Bayeux;;;;M Chéneaux;;1765;1820;1;Thorigny-sur-Vire,14;;;;M Chéneaux;;1802;1883;7;;;;;M Chéneaux de Leyritz;;1833;1833;1;;;;;M Chérémétiev;;1581;1581;2;;;;;M de Chièvres;;1120;1150;1;;;;;M de Chimay;;1190;1240;2;;;;;M de Chiny;comte;1060;1125;3;;;;;M du Chiron;;1603;1603;2;;;;;M Chobert;;1802;1802;1;Chatel-Censoir, 89;;;;M de Choiseul;comte de Stainville;1195;1794;24;;;;;M Chouquet;;1680;1680;1;Marin;;;;M Churchill;;1730;1730;2;;;;;M de Cibo;;1725;1790;1;;;;;M Cicéron;;1824;1840;1;St-Pierre;;;;M de Ciechanowiec-Kiszka;;1590;1606;1;;;;;M de Cilly;comte;1380;1451;4;;;;;M Claparede;;1596;1596;1;Montpellier;;;;M de Clare;;1130;1130;1;Tunbridge, Kent, Angleterre;;;;M de Clare;;1171;1171;1;Waterford, Irlande;;;;M de Clare;;1189;1189;1;Londres, Angleterre;;;;M Clary;;1725;1794;1;St. Ferreol, Marseille, France;;;;M Clary;reine de Naples;1771;1845;1;;;;ITA;M de Clary et Aldringen;;1772;1772;1;Vienne;;;;M de Clave;comte de Gloucester;1240;1313;5;;;;;M Claverie;;1768;1768;1;Fort-de-France;;;;M de Clavesana;margrave de Savone;1090;1224;4;;;;;M Clerc;;1846;1846;1;Le François;;;;M de Clermont;;1285;1372;3;Paris;;;;M de Clermont;comte;1080;1436;18;;;;;M de Clermont;comte;1256;1317;1;Clermont en Beauvaisis;;;;M de Clermont de Nesle;comte de Clermont;1208;1288;3;;;;;M de Clermont de Nesle;seigneur de Nesle;1245;1302;1;Courtrai, Belgique;;;;M de Clermont-Tonnerre;;1722;1769;1;;;;;M de Clervaux;;1809;1809;1;;;;;M de Clèves;;1515;1557;1;à Düsseldorf;;;;M de Clèves;comte de La Mark;905;1633;29;;;;;M de Clèves;comtesse d'Eu;1548;1633;1;Paris;;;;M de Clèves;duc;1373;1481;2;Clèves;;;;M de Clèves;duc de Juliers;1516;1592;1;Dusseldorf;;;;M de Clèves;duc de Nivernais;1544;1564;1;Nevers;;;;M de Clémont;;1418;1427;2;;;;;M de Clérieux;;1140;1140;1;;;;;M de Clinchamp;seigneur de la Brizardière;1610;1650;2;;;;;M de Clisson;;1175;1448;7;;;;;M de Clisson;dame de Champtoceau;1366;1441;1;Clisson, Loire Atlantique, France;;;;M Cobbam;lord;1428;1454;2;;;;;M de Coche;;1250;1250;1;;;;;M de Cochefilet;;1657;1719;1;;;;;M Cochet;;1648;1700;1;Grande Anse (Lorrain);;;;M Cochet;;1678;1749;1;Le Marigot;;;;M Cochrane;comte de Dundonald;1676;1690;2;;;;;M Cochrane;comte de Dundonald;1687;1720;1;Paisley;;;;M Cochrane;lady;1709;1786;1;Bath;;;;M de Coesme;;1581;1601;1;Saint-Arnoul en Beauce;;;;M de Coesme;seigneur de Lucé;;;1;;;;;M de Coesmes;baron de Luce;;;2;;;;;M Coëffier d'Effiat;;1630;1630;1;;;;;M de Coëtivy;comte de Taillebourg;1480;1501;2;;;;;M de Cohausen;;1775;1822;1;;;;;M Colard;;1688;1688;1;;;;;M Colbert;;1667;1747;4;;;;;M de Colditz;;1480;1520;1;;;;;M de Coligny;;1089;1620;8;;;;;M de Coligny;comte;1490;1522;1;Dax;;;;M de Coligny;comte;1519;1572;1;Chatillon sur Loing;;;;M Collart;;1709;1709;1;Fort-Royal;;;;M de Collart;écuyer;1721;1742;2;;;;;M Colonna;prince;1661;1672;2;;;;;M Colonna d'Istria;;1691;1691;1;Sollacaro, Corse-du-Sud;;;;M de Comborn;;1070;1086;1;Uzerche;;;;M de Comborn;vicomte;910;1157;9;;;;;M de Commercy;;1258;1275;1;;;;;M de Comminges;;1150;1336;7;;;;;M Comnène;préfet d'Orient;960;1202;21;;;;;M de Comps;;1130;1188;1;;;;;M Comyn;;1303;1325;5;;;;;M de Conflans;;1339;1339;1;;;;;M de Considat de la Courtaudie;;1590;1640;1;;;;;M Constancin du Chatenet;;1757;1831;1;Bellac;;;;M de Constantinople;empereur;1259;1332;2;;;;;M de Conversano;comte;1100;1103;2;;;;;M Cooper;;1838;1838;1;;;;;M de Corbeil;;978;978;1;;;;;M de Cordes;;1335;1546;8;;;;;M Cordier;;1753;1753;1;Le Vauclin;;;;M Cordier;;1770;1770;1;St-Esprit;;;;M Cordier Beaufond;;1799;1799;1;Saint-Pierre (Mouillage);;;;M Cordier Beaufond;;1826;1826;1;Anses d'Arlet;;;;M Cormenier;;1653;1653;1;;;;;M Cornaro;;1468;1468;1;;;;;M von Cornberg;;1553;1659;2;;;;;M de Cornouaille;comte;1025;1058;1;;;;;M de Cornouailles;comte;1100;1175;5;;;;;M de Corquilleroy;seigneur de la Bellamairie;1548;1596;2;;;;;M Corret;;1834;1834;1;Limoges Egl Stmichel, 87;;;;M Corvin;roi de Hongrie;1443;1490;1;;;;HUN;M de Cossé;duc de Brissac;1562;1621;1;Chateau d'Estelan;;;;M de Cossé;duc de Brissac;1585;1651;1;chateau de Pouancé;;;;M de Cossé;duc de Brissac;1668;1792;3;Paris;;;;M de Cossé;duc de Brissac;1702;1848;7;;;;;M Costallat;;1824;1824;1;Limoges Egl St Pierre, 87;;;;M Coste;;1763;1763;1;;;;;M Costes;;1741;1788;1;;;;;M Cottrell;;1750;1846;2;Faversham (Kent);;;;M de Coucy;;1161;1222;1;Braine, Aisne, France;;;;M de Coucy;seigneur;1132;1805;17;;;;;M de Coucy;seigneur;1135;1191;1;Saint-Jean d'Acre, Israël;;;;M du Coudray;;1670;1735;1;Moulevrier, Maine et Loir;;;;M du Coudray;Ml des Comptes Nantes;1616;1679;1;Matheret, près de Fontenay-le-Comte, Vendée;;;;M de Couhé;seigneur de l'Estang;1504;1504;1;;;;;M de Couhé de Lusignan;;1787;1787;1;;;;;M Coula;;1682;1739;1;Montferrier;;;;M de Coulaines;;1389;1417;2;;;;;M des Coumans;khan;1255;1290;2;;;;;M Couraud de Salvert;;1759;1759;2;;;;;M de Courlande;;1646;1711;2;Mitau;;;;M de Courlande;duc;1610;1845;4;;;;;M de Courlande-Kettler;duc;1517;1640;2;;;;;M de Courlandon;;1290;1328;1;;;;;M de la Court;seigneur de la Chaignelière;1652;1652;2;;;;;M de Courtenay;comte de Devon;985;1539;25;;;;;M de Courtenay;comtesse d'Auxerre;1188;1256;1;Fontevrault;;;;M de Courtenay;héritière de Conches;1250;1275;1;Rome, Italie;;;;M de Courtenay;seigneur de Champignelle;1168;1239;1;Palestine;;;;M Courtois;;1687;1687;1;Basse-Pointe;;;;M Courtois;;1751;1751;1;Le Trou-au-Chat;;;;M de Coustières;dame;;;1;;;;;M Coustin;seigneur de Puymartin;1691;1691;2;;;;;M de Coutinh;;1529;1534;2;;;;;M de la Couture Renom;;1628;1628;1;;;;;M de Craon;;1255;1292;1;Paris, France;;;;M de Craon;seigneur;958;1420;25;;;;;M Crassous;chevalier de Saint-Louis;1754;1831;1;Fort Saint-Pierre;;;;M Cratz de Schaffenstein;;1580;1635;2;;;;;M Crespin;;1737;1737;1;;;;;M Crespon;;1025;1025;1;;;;;M Crespy;;1740;1818;1;;;;;M de Crépy;;1020;1020;7;;;;;M de Croatie;;965;1181;3;;;;;M Croise;;1629;1677;1;Rennes;;;;M Croise;;1679;1697;1;Grande Anse (Lorrain);;;;M de Croix;comte de Clerfayt;1731;1778;2;;;;;M de Cronberg;;1385;1440;1;;;;;M de la Cropte;dame de Lanquais;;;1;;;;;M du Cros;;1610;1610;1;;;;;M Crosnier de Lassichère;;1811;1869;2;;;;;M Crosnier de Monterfil;;1763;1763;1;Le Moule;;;;M Crosnier de Monterfil;;1787;1787;1;Guadeloupe;;;;M Crosnier des Vignes;;1787;1787;1;Guadeloupe;;;;M Crouppier de Romans;;1737;1808;1;;;;;M de Croy;marquis de Havre;1549;1613;1;Bruxelles;;;;M de Croy;prince de Chimay;1496;1549;1;Bruxelles, Belgique;;;;M de Croy-Arschot;duc d'Arschot;1526;1595;1;Valenciennes;;;;M de Croy-Arschot;prince de Chimay;1522;1551;1;chateau Quievraing;;;;M de Croy-Arschot;princesse de Chimay;1563;1635;1;Beaumont;;;;M de Croy-Havre;princesse;1673;1714;1;Bologna;;;;M de Croÿ;comte de Porcean;1385;1686;14;;;;;M de Croÿ;seigneur;1365;1415;1;Azincourt;;;;M de Crussol;duc d' Uzès;1581;1802;4;Paris;;;;M de Crussol;duc d'Uzès;1604;1680;1;chateau d'Uzès;;;;M de Crussol;duc d'Uzès;1642;1692;1;en son hotel parisien;;;;M de Crussol;seigneur;1215;1843;14;;;;;M de Crussol;seigneur;1452;1473;1;Villemagne;;;;M de Cuisseaux;;1131;1131;1;;;;;M de Culant;seigneur;1115;1323;8;;;;;M de Culemborg;seigneur;1335;1540;6;;;;;M de Cumont;;1789;1789;1;;;;;M de Cusance;;1637;1663;1;;;;;M Czartoryska;princesse;1742;1837;2;;;;;M Czartoryski;prince;1734;1854;2;;;;;M Daccard;;1646;1682;1;Barbade;;;;M Daccard;;1677;1699;1;Case-Pilote;;;;M Dages;;1849;1849;1;;;;;M de Dagsbourg;comtesse;925;1225;6;;;;;M Daguier;;1618;1618;2;;;;;M de Daillon;;1500;1540;1;;;;;M Dalassène;;1020;1020;1;;;;;M Dalbanne;;1840;1840;1;;;;;M Damas;vicomte de Châlon-sur-Saône;1341;1497;8;;;;;M Damas de Thianges;;1670;1670;2;;;;;M de Damian de Vernegues;;1798;1833;2;;;;;M de Dammartin;comte d'Aumale;1180;1239;1;Abbeville;;;;M de Dammartin;comtesse de Ponthieu;1128;1279;9;;;;;M de Dammartin;seigneur de Lillebonne;1155;1200;1;Londres, Angleterre;;;;M de Dampierre;comte de Nevers;1247;1322;1;Auxerre;;;;M de Dampierre;comtesse de Namur;1335;1363;1;Copenhague;;;;M de Dampierre;duchesse de Bourgogne;1350;1405;1;Gent;;;;M de Dampierre;seigneur;1090;1659;28;;;;;M Dampierre de Millancourt;;1665;1736;1;St-Christophe;;;;M Dampierre de Millancourt;;1693;1732;1;Le Trou-au-Chat;;;;M de Dampierre de Millancourt;St-Christophe en 1634;1622;1651;1;Abbeville;;;;M de Danemark;roi;1014;1038;7;;;;;M de Danemark;roi d'Angleterre;985;1035;1;;;ENG;GBR;M Danilowicz;;1607;1661;2;;;;;M de Danneskjold-Samsoe;comte;1699;1823;3;;;;;M Dantrague;;1681;1737;2;;;;;M Daubaignan;;1824;1824;1;;;;;M de Daun-Falkenstein;comte de Falkenstein;1540;1682;4;;;;;M David;;1642;1814;5;;;;;M David;;1767;1809;1;Limoges, 87;;;;M de Dax;;1130;1190;3;;;;;M Debonnaire;;1640;1680;1;;;;;M Degrand;;1823;1823;1;;;;;M Deguerre;;1754;1754;1;;;;;M Delage;;1837;1838;1;Limoges, 87;;;;M Delage;;1839;1839;1;Limoges (St Etienne), 87;;;;M Delage;;1840;1840;1;Limoges (St Etienne), 87;;;;M Demassias;;1667;1730;1;Limoges;;;;M Demassias;;1715;1730;1;Le Marigot;;;;M Denis;;1683;1683;1;;;;;M Denuelle de La Plaigne;;1868;1868;1;;;;;M Derinly;;1747;1747;1;;;;;M Des Vergers d'Auroy de Chambry;;1788;1788;1;Le François;;;;M Des Vergers d'Auroy de Maupertuis;;1765;1765;1;Le François;;;;M Desaint;Aide Major milice Trinité;1730;1730;1;;;;;M Desaint;Lieutenant de cavalerie;1725;1787;2;Trinité;;;;M Descassaux-Bontemps;;1722;1722;1;;;;;M Deschamps;;1639;1842;2;;;;;M Desclefs;;1669;1669;1;Le Marigot;;;;M Desfriches;;1697;1697;1;Angers;;;;M Desfriches;;1697;1723;1;Ste-Marie;;;;M Desfriches;;1761;1761;1;Grande Anse (Lorrain);;;;M Desfriches;;1796;1796;1;Sainte-Marie;;;;M Desfriches;;1800;1800;1;Le Trou-au-Chat;;;;M Desgaudes;;1730;1730;1;Trinité;;;;M Desgaudes;Tailleur d'habits. Ht Capesterre;;;1;;;;;M Deshayes;;1638;1708;1;Coutance;;;;M Deshayes;;1672;1689;1;Basse-Pointe;;;;M Deslauriez;;1619;1658;2;;;;;M Desmazes;;1762;1762;1;Fort-Royal;;;;M Desmazes;;1797;1823;1;Cayes (St Domingue);;;;M Desmazes;;1823;1823;1;Fort-de-France;;;;M Desmier;seigneur d'Olbreuse;1580;1621;1;;;;;M Desmier d'Olbreuse;;1639;1723;1;;;;;M Desmier d'Olbreuse;seigneur d'Olbreuse;1608;1660;1;La Rochelle, France;;;;M Desmoulins;;1745;1745;1;;;;;M Desvaux de La Martinière;;1840;1840;2;;;;;M des Deux-Bourgognes;roi;964;1005;5;;;;;M des Deux-Bourgognes;roi;1032;1032;1;Lausanne;;;;M de Deux-Ponts;comte;1329;1570;11;;;;;M Devereux;;1616;1616;3;;;;;M Deville;;1642;1809;2;;;;;M Deville;;1830;1830;1;Carbet;;;;M Deygluss;;1758;1758;1;;;;;M Décasse;;1755;1839;1;;;;;M de Déols;seigneur;;;12;;;;;M Diaz de Haro;;1287;1287;1;;;;;M de Dicy;;1592;1592;1;;;;;M de Diessen;;1026;1113;3;;;;;M de Diest-Sichem;;1425;1472;1;;;;;M de Dietrichstein;;1610;1777;6;;;;;M Dieudonné de La Barrière;;1807;1807;1;;;;;M de Digoine;;1390;1390;1;;;;;M de Dillingen;;964;1289;2;;;;;M de Dinan;;1135;1139;4;;;;;M de Dinan-Montafilant;dame de Châteaubriant;1500;1500;1;;;;;M de Dinteville;seigneur de Chenêts;1373;1373;1;;;;;M Doé;;1785;1785;1;;;;;M du Dognon;seigneur de la Sandonie;1680;1711;1;;;;;M de Dohna-Carwinden;;1661;1724;1;;;;;M de Dohna-Leistenau;burgrave;1698;1786;2;;;;;M de Dohna-Schlobitten;comte;1661;1728;1;;;;;M Dolgorouki;prince;1624;1625;2;;;;;M Domain;;1733;1733;1;;;;;M de Domene;;1137;1137;1;;;;;M du Donjon;;1110;1110;1;;;;;M de Donzy;;1040;1225;9;;;;;M Doria;;1290;1359;2;;;;;M Dormoy;;1849;1849;1;;;;;M de Dornberg;;1804;1835;1;;;;;M Dorsonville;;1632;1708;2;;;;;M Douat;seigneur de Jeu;;;2;;;;;M de Doué;;987;987;1;;;;;M Douglas;comte d'Angus;1489;1578;6;;;;;M Douglas;duc de Hamilton;1634;1694;1;Abbaye de Holyrood;;;;M de Douglas;duc de Touraine;1369;1424;3;;;;;M Douglas-Hamilton;;1684;1736;1;Edimbourg;;;;M Douglas-Hamilton;duc de Hamilton;1658;1712;1;Hyde Park;;;;M Douglas-Hamilton;duc de Hamilton;1703;1743;1;St.George's Hanover Square;;;;M Douglas-Hamilton;duc de Hamilton;1740;1819;1;;;;;M Doukas Lascaris;empereur de Nicée;1250;1250;1;;;;;M Doukas Vatatzès;empereur de Nicée;1193;1254;1;;;;;M Drauglaudre;Amodiateur du Prieuré de Sermaize, aubergiste;1714;1801;1;Versailles;;;;M Drauglaudre;Huissier, puis garde-champêtre;1767;1847;14;Sermaize;;;;M de Dreux;comte;1185;1234;1;Braine, Aisne, France;;;;M de Dreux;comte;1211;1240;1;Nicosie, Chypre;;;;M de Dreux;comtesse d'Auxonne;965;1478;26;;;;;M de Dreux;duc de Bretagne;1191;1250;1;Méditerranée;;;;M de Dreux;vidame d'Esneval;1372;1415;1;Azincourt;;;;M Droglo;Postillon du duc (ou prince) de Condé;;;1;;;;;M Drouet;;1637;1746;3;;;;;M Drouet;;1696;1696;1;Le Carbet;;;;M Drouet;;1726;1726;1;Le Prêcheur;;;;M Drummond;;1364;1401;4;;;;;M Dubet;;1721;1721;2;;;;;M Dublancq Laborde;;1863;1863;1;;;;;M Dubois;;1651;1651;1;;;;;M Dubruel;;1724;1804;1;à Bordeaux (Gironde);;;;M Dubruel de Broglio;;1690;1752;1;;;;;M Dubruil;;1739;1800;1;;;;;M Ducasse;;1788;1855;1;;;;;M Duchamp de Chastaigné;;1654;1883;20;;;;;M Duchamp de Chastaigné;Droguiste épicier;1806;1889;1;St. Pierre, Martinique;;;;M Duchamp de Chastaigné;Premier Duchamp;1745;1851;2;Case-Pilote;;;;M Duchesne de Denant;;1821;1821;2;;;;;M Ducommun;;1740;1740;1;Switzerland;;;;M Ducpetiaux;;1741;1827;3;;;;;M Ducpetiaux;;1780;1849;1;Bruxelles;;;;M Dudley;duc de Northumberland;1553;1554;2;;;;;M Dueze;;1220;1271;2;;;;;M Duhamel;;1626;1626;1;;;;;M Dulieu;;1803;1803;1;Verdun;;;;M Dulieu;;1803;1879;8;;;;;M Dulieu;;1805;1848;1;Trinité;;;;M Dumas;;1691;1772;1;Bordeaux Saint-André Mardi;;;;M Dumas;;1699;1699;1;;;;;M Dumas;;1734;1798;1;Gros Morne;;;;M Dumas;Procureur président de Bordeaux;1643;1703;1;La Réole;;;;M Dupin;;1650;1808;7;;;;;M Dupin d'Aiguemorte;;1250;1372;4;;;;;M Dupin de Francueil;;1715;1777;1;;;;;M Dupin de La Noue;;1645;1682;2;;;;;M Dupin de La Salle;;1381;1635;9;;;;;M Dupin de Saint Cyr;;1800;1866;1;Sainte-Croix-de-Mareuil;;;;M Dupin de Saint Cyr;;1842;1842;1;;;;;M Dupin des Vinsons;;1653;1725;5;;;;;M Dupin du Montet;;1689;1777;9;;;;;M Dupont;;1744;1744;1;;;;;M Dupouy;;1804;1804;1;St-Pierre;;;;M Dupré;;1619;1680;2;;;;;M Durand;;1711;1711;1;Baillargues;;;;M Durand;Barralier (tonnelier);1688;1688;1;Saint-Brés;;;;M Durand;Barrallier (Tonnelier);1616;1616;1;Saint-Bris;;;;M Durand Decourt;;1796;1796;1;Le Gros-Morne;;;;M Durant;;1679;1679;2;;;;;M Durey de Sauroy;;1732;1732;1;;;;;M de Durfort;;1605;1753;5;;;;;M de Durfort;duc de Duras;1684;1800;3;Paris;;;;M de Durfort;duchesse de Mazarin;1735;1781;1;Paris, France;;;;M Durieu;;1807;1807;1;;;;;M de Dutour de Minvielle;;1748;1748;1;;;;;M Duval;;1646;1754;3;;;;;M Duval;;1712;1792;2;Grande Anse (Lorrain);;;;M Duval;;1727;1727;1;Les Trois-Ilets;;;;M Duval;;1766;1766;1;Fort-Royal, Martinique;;;;M Duval;Lieutenant de Milice.;1636;1663;1;Rouen;;;;M Duval Dugué;;1823;1823;1;;;;;M Duval La Branche;;1744;1782;2;Grande Anse (Lorrain);;;;M Duval Valmond;;1823;1823;1;Grand'Anse;;;;M Duval de La Roche;;1699;1754;1;;;;;M Dyel;;1528;1769;2;;;;;M Dyel de Graville;;1542;1617;2;Cailleville;;;;M Dyel de Graville;;1676;1676;1;;;;;M Dyel de Graville;;1678;1678;1;la Martinique;;;;M Dyel de Graville;;1712;1712;1;Le Prêcheur;;;;M Dyel de Graville;;1729;1729;1;Le Carbet, Martinique;;;;M Dyel de Graville;Capitaine de régiment en Normandie;1649;1649;1;Cany Caniel;;;;M Dyel de Vaudroque;;1627;1664;2;;;;;M Dyel de Vaudroque;;1632;1649;1;Cailleville;;;;M Dyel de Vaurocq et du Parquet;;1565;1589;1;Cailleville;;;;M Díaz de Vivar;;1043;1099;2;;;;;M d'Eberstein;;1259;1284;2;;;;;M d'Egmont;;1517;1554;1;Bruxelles;;;;M d'Egmont;seigneur;1310;1622;20;;;;;M d'Eicken;;1560;1636;1;;;;;M de Eilsz;;920;920;1;;;;;M d'Eisset;;1634;1634;2;;;;;M d'Elter;héritière d'Apremont;;;1;;;;;M Emenot Desloriez;;1698;1698;1;;;;;M Emenot Desloriez Reoliere;;1739;1800;3;Le Trou-au-Chat;;;;M Emenot Desloriez Reoliere;;1825;1825;1;Le Gros-Morne;;;;M Emo-Capodilista;comte;1800;1843;1;;;;;M d'Enghien;comte de Brienne;1185;1446;12;;;;;M Engrand;;1725;1821;3;;;;;M d'Entéça;comtesse d'Urgel;1300;1327;1;;;;;M Entringer;;1524;1583;2;;;;;M d'Eppenstein;seigneur;1018;1538;12;;;;;M d'Erbach;comte;1475;1742;17;;;;;M d'Erbach;comte;1643;1758;2;Furstenau;;;;M d'Erbach-Schönberg;comte;1691;1758;1;Waldenbourg;;;;M d'Erbach-Schönberg;comtesse;1721;1848;14;;;;;M Erdoedy;comte;1795;1856;2;;;;;M Ernoult;;1815;1828;2;Ste-Marie;;;;M Ernoult;;1848;1848;2;;;;;M Escoffier;;1781;1833;1;Ivry le Temple, 60;;;;M d'Escoussens;;1320;1345;1;;;;;M d'Esneval;dame;1404;1421;1;Chateau d'Ivry;;;;M d' Espagne;;1578;1578;2;;;;;M d'Espaigne;;1664;1664;1;;;;;M d'Esparbes de Lussau;;1684;1684;1;;;;;M de l'Espine;;1678;1678;1;Le Pecq, act. Yvelines;;;;M des Essarts;comtesse de Romorantin;1588;1651;1;;;;;M de l'Estang;;1635;1635;1;;;;;M d'Este;;1731;1803;1;Modène, Italie;;;;M d'Este;comtesse de Gisors;1531;1607;1;Paris;;;;M d'Este;duc de Modène;1610;1658;1;à Modène;;;;M d'Este;duchesse de Milan;1475;1497;1;Ferrare;;;;M d'Este;marquis de Saint-Martin;953;1803;93;;;;;M d'Este;princesse de Carrare;1750;1829;1;Modène;;;;M d'Este;reine d'Angleterre;1658;1718;1;;;ENG;GBR;M Esterhàzy de Galantha;prince;1765;1833;1;;;;;M d'Estourmel;;1570;1630;1;;;;;M d'Estouteville;duchesse;1490;1560;6;;;;;M d'Estrées;;1486;1599;2;;;;;M d'Estrées;;1559;1609;1;Chartres;;;;M d'Estrées;duc d' Estrées;1573;1670;1;Paris;;;;M Estrid;;1175;1236;1;Corbeil;;;;M Estrid;roi de Danemark;1018;1412;46;;;;;M Estrid;roi de Suède;1106;1134;1;;;;SWE;M d'Etissac;;1587;1587;1;;;;;M d'Eu;;1058;1213;7;;;;;M d'Everstein;comte;1335;1607;4;;;;;M d'Evreux;;1061;1061;1;;;;;M Eyriaud;;1663;1663;1;;;;;M d'Écosse;;1040;1295;17;;;;;M d'Écosse;reine d'Angleterre;1080;1118;1;Westminster;;ENG;GBR;M d'Écosse;roi;1001;1040;1;Dunsinane, Écosse;;SCT;GBR;M d'Écosse;roi;1031;1286;10;;;SCT;GBR;M d'Écry;;1254;1254;1;;;;;M d'Évreux;comte de Beaumont-le-Roger;1341;1372;1;Apulia;;;;M d'Évreux;comte de Longueville;1336;1363;1;Vernon;;;;M d'Évreux;roi de Navarre;1035;1441;21;;;;;M Fabre;;1681;1870;7;;;;;M Fabre;;1768;1768;1;Fort-de-France;;;;M Fabre;;1779;1779;1;Marseille;;;;M de Fabrique Saint-Tours;;1791;1791;1;Trou-au-Chat;;;;M de Fabrique Saint-Tours;;1822;1822;1;Le Diamant;;;;M Fabulet;;1661;1732;1;Le Prêcheur;;;;M Fabulet;;1664;1664;1;;;;;M Fabulet;;1696;1785;2;Grande Anse (Lorrain);;;;M de Fadally;;1785;1785;2;;;;;M Fagot;;1766;1766;1;;;;;M de Falkenstein;;1253;1409;2;;;;;M de Falkenstein;seigneur;1285;1290;1;Frauenberg;;;;M de Falkenstein-Munzenberg;;1360;1391;1;;;;;M de Farci;écuyer;1697;1697;2;;;;;M Fargier;;1777;1777;1;Marseille;;;;M Farnèse;cardinal;1520;1589;1;Valentano;;;;M Farnèse;duc de Castro;1531;1553;1;au Siège de Hesdin;;;;M Farnèse;duc de Parme;1545;1592;1;Rome;;;;M Farnèse;duc de Parme;1612;1646;1;Parme;;;;M Farnèse;gouverneur de Bologne;1339;1731;24;;;;;M Farnèse;pape;1468;1549;1;Canino;;;;M Farnèse;reine d'Espagne;1692;1766;1;à Parme;;;ESP;M de Farou;;1681;1681;1;;;;;M Fauchon;;1804;1804;1;Basse-Pointe;;;;M de Faucigny;;1030;1268;8;;;;;M de Faucogney;seigneur;1335;1335;1;;;;;M du Fauget;;1689;1689;1;;;;;M Faure;;1736;1821;3;;;;;M Faure;;1767;1767;1;Rivière-Pilote;;;;M Faurien;;1715;1715;2;;;;;M de Fay;;1135;1165;2;;;;;M de Faye;;1174;1174;2;;;;;M Fayet;;1752;1752;1;;;;;M Fayolle;;1723;1723;1;Grande Anse (Lorrain);;;;M de Ferrete;comte;;;1;;;;;M de Ferrete;comtesse;1300;1351;1;Basel;;;;M de Ferrette;;1076;1076;1;;;;;M Ferry;;1634;1692;1;Le Marigot;;;;M Festetics;comte;1786;1846;2;;;;;M Fettiplace;;1423;1423;1;;;;;M Fébvrier;;1620;1678;1;Rennes;;;;M Fébvrier Mézaillet;Capitaine de Milice;1717;1746;1;Marin;;;;M Fébvrier Mézaillet Lamothe;;1669;1747;1;Vauclin;;;;M Fébvrier de Méraillet;;1774;1793;1;Vauclin;;;;M de Fézensac;comte;895;960;2;;;;;M de Fiennes;baron de Tingry;1210;1353;9;;;;;M Fieschi;pape;1254;1287;7;;;;;M Fiesque;;1433;1433;1;;;;;M de Fiesque;comte de Lavagna;1251;1283;2;;;;;M Figaret;;1679;1679;1;Baillargues;;;;M Figaret;Menuisier;;;1;;;;;M von Filseck;;1593;1647;1;;;;;M de Finance;;1741;1741;1;;;;;M de Finck à Finckenstein;;1700;1728;1;;;;;M Fitte;;1787;1787;1;Gros-Morne;;;;M Fitz Flaad;;1080;1101;1;;;;;M Fitzalan;;1172;1577;7;;;;;M Fitzalan;comte d'Arundel;1306;1416;2;Arundel Castle, West Sussex, Angleterre;;;;M Fitzalan;comte d'Arundel;1411;1415;1;Londres;;;;M Fitzherbert;;1778;1781;1;;;;;M Fitzjames;duc de Berwick;1670;1734;1;devant Philippsbourg;;;;M Fitzjames;duc de Fitzjames;1702;1787;2;Saint-Germain-en-Laye;;;;M Fitzroy;duc de Grafton;1663;1690;1;Oxford, Angleterre;;;;M Fitzroy;duc de Richmond;1519;1782;6;;;;;M de Flandre;comte;862;879;1;Auxerre;;;;M de Flandre;comte;884;1372;23;;;;;M de Flandre;comte;1012;1067;1;Lille, France;;;;M de Flandre;comte;1055;1071;1;à Cassel;;;;M de Flandre;reine d'Angleterre;1032;1083;1;Caen;;ENG;GBR;M de Flaveau;baronne;1773;1791;2;;;;;M de Fleckenstein;baronne;1553;1595;1;;;;;M Fleming;lady;1530;1552;1;;;;;M de Flemming;comtesse;1746;1835;1;;;;;M Fleurantin;;1632;1632;1;;;;;M de Flotte;;1100;1250;6;;;;;M Foese;;1677;1754;1;;;;;M de Foix;;1484;1506;1;Bude;;;;M de Foix;comte;1260;1315;1;Pontoise;;;;M de Foix;comte de Bigorre;1010;1538;33;;;;;M Folkunga;;1317;1370;1;Rostock;;;;M Folkunga;duc de Finlande;1302;1318;1;Nykoeping;;;;M Folkunga;duc de Sudermanie;1312;1318;1;chateau Nykoping;;;;M Folkunga;jarl de Suède;1200;1359;3;;;;SWE;M Folkunga;roi de Norvège;1245;1387;11;;;;;M Folkunga;roi de Suède;1237;1302;1;chateau Nykoping;;;SWE;M Folkunga;roi de Suède;1240;1290;1;Visingso;;;SWE;M Folkunga;roi de Suède;1316;1374;1;chateau Bohus;;;SWE;M de Fombesse;;1681;1681;1;;;;;M Fontaine;;1810;1810;2;;;;;M de Fontange;;1715;1747;1;;;;;M Fonteneau;;1626;1671;1;;;;;M de Forcalquier;;1106;1178;4;;;;;M de Forez;comte;1075;1383;11;;;;;M de Forez;comte;1299;1358;1;couvent des Cordeliers, Sainte-Colombe, près de Vienne;;;;M de Formbach;comte;1020;1088;2;;;;;M Forsans;;1833;1833;1;;;;;M Fortier;;1733;1866;18;;;;;M Fortier;;1772;1809;1;Basse-Pointe;;;;M Fosse;;1807;1807;1;;;;;M de Fou;;1482;1482;1;;;;;M Foucquet;marquis de La Varenne;1590;1670;2;;;;;M Fourcade;;1637;1760;3;;;;;M de Fouvens;;1203;1203;1;;;;;M Fraissinet;;1627;1627;1;Mauguio;;;;M de Franconie;empereur Romain-Germanique;783;1143;23;;;;;M François;;1775;1818;1;Flirey (54);;;;M de Freibourg;comtesse;1286;1335;2;;;;;M de Fresne;dame du Plessis-Godehoust;1235;1235;1;;;;;M de Freteval;;1175;1195;2;;;;;M des Friches;;1755;1755;1;Ste-Marie;;;;M de Friesen;;1610;1732;2;;;;;M Friesenhausen;;1696;1764;1;;;;;M Frigière;;1823;1828;1;Le Mouillage Saint-Pierre, Martinique;;;;M de Frijs;;1699;1723;1;;;;;M de Frioul;empereur d'Occident;843;924;1;Vérone, Italie;;;;M de Frioul;marquis;835;910;4;;;;;M de Frise;margrave;1036;1044;2;;;;;M de Frise Occidentale;;1020;1050;2;;;;;M de Frolois;;1372;1406;1;;;;;M de Fronhoffer;;1770;1770;1;;;;;M de Fronsac;;1020;1020;1;;;;;M Fugger de Babenhausen;prince;1800;1836;1;;;;;M de Furstenberg;comtesse;1377;1674;7;;;;;M de Furstenberg-Heiligenberg;;1659;1701;1;Munich, Allemagne;;;;M de Furstenberg-Stuhlingen;comte;1602;1680;2;;;;;M de Fürstenberg-Heiligenberg;comtesse;1634;1705;1;;;;;M de Fürstenberg-Weitra;landgrave;1776;1848;2;;;;;M Gabras;;1162;1162;1;;;;;M Gabrielli;prince;1773;1841;1;;;;;M Gaigneron;;1592;1610;1;;;;;M Gaigneron;;1713;1713;1;Le Lamentin, Martinique;;;;M Gaigneron;Domestique chez Pléjot 1680. Sergent de Milice.;1656;1680;1;Saint-Pierre, Martinique;;;;M Gaigneron;Martinique vers 1655;1629;1656;1;Loches;;;;M Gaigné;;1635;1635;1;;;;;M Gaillard;;1580;1844;3;;;;;M Gaillard;;1824;1824;1;Sainte-Marie;;;;M de Gaillard;;1530;1580;1;;;;;M Gaillot;;1712;1750;1;Saint-Germain-en-Laye;;;;M Gaisberger;;1535;1613;1;;;;;M Galard;;1688;1688;1;;;;;M Galeotte d'Albarel;;1707;1707;1;;;;;M Galibert;;1757;1790;2;;;;;M de Galicie;;1245;1285;1;Presbourg;;;;M de Galicie;prince;1184;1335;11;;;;;M de Galles;prince;1222;1253;2;;;;;M Gallet Charlery;;1779;1779;1;Trinité;;;;M Gallet de Saint-Aurin;;1751;1786;2;Le Lamentin;;;;M Gallet de Saint-Aurin;;1788;1788;1;Le François;;;;M Gallet de Saint-Aurin;;1807;1807;1;Saint-Pierre (Le Mouillage);;;;M Gallet de Saint-Aurin;;1826;1826;1;Le Trou-au-Chat;;;;M Gallet de Saint-Aurin;;1842;1842;1;Le Carbet;;;;M Gallice;;1722;1840;3;;;;;M Gallier;;1638;1787;3;;;;;M de Galloway;seigneur;1209;1290;2;;;;;M de Gamard;;1780;1846;3;;;;;M de Gand;prince d'Isenghien;964;1767;12;;;;;M Garel;;1664;1664;1;;;;;M de Garlande;comte de Rochefort;1069;1224;9;;;;;M Garnier;;1561;1609;2;Saint-Malo;;;;M Garnier;;1796;1821;1;Fort-Royal, Martinique;;;;M Garnier;Maitre chirugien à Sainte-Lucie;1772;1795;1;Royan;;;;M Garnier Laroche;;1774;1774;1;;;;;M Garnier de Laroche;;1778;1807;1;Fort-Royal, Martinique;;;;M Garnier de Laroche;Capitaine FR: Hon la Jambette;1716;1784;1;Le Lamentin, Martinique;;;;M Garnier de Laroche;Capitaine de "l'Hercule";1624;1735;2;Saint-Malo;;;;M Garnier de Laroche;Capitaine de milice FR;1748;1823;1;Fort-Royal;;;;M de Gascogne;;890;1011;6;;;;;M Gasztold;palatin de Troki;1537;1542;1;;;;;M Gaudin;;1676;1676;1;St-Pierre;;;;M Gaudin;;1703;1703;1;Case-Pilote;;;;M Gaulard;;1718;1742;1;;;;;M Gaultier;;1646;1646;1;;;;;M Gauné de Cazau;;1727;1858;3;;;;;M de Gavarret;;1145;1145;3;;;;;M de Gavre;;1207;1286;10;;;;;M de Gâtinais;comte;1004;1046;3;;;;;M de Gedern;;1237;1251;1;;;;;M de Gelre;;1190;1247;1;Dillenbourg;;;;M Gence;;1669;1673;1;;;;;M Gence;;1669;1695;1;Le Prêcheur;;;;M Gence;;1695;1712;1;Grande Anse (Lorrain);;;;M de Genève;comte;1061;1392;14;;;;;M Geniel;;1770;1770;2;;;;;M de Gennep;;1370;1419;1;;;;;M de Gentile;;1766;1876;25;;;;;M de Gentils de La Breuille;;1751;1751;1;;;;;M de Geoffre de Chabrignac;;1776;1776;1;;;;;M de Gera-Plauen;;1510;1531;1;;;;;M Germa;;1818;1842;1;;;;;M de Germanie;empereur d'Occident;795;855;1;Altdorf, Allemagne;;;;M de Germanie;roi de Lotharingie;835;869;1;Piacenza, Italie;;;;M de Germanie;roi de Provence;827;925;5;;;;;M de Geroldseck;;1400;1440;1;;;;;M de Geuder gt Rabensteiner;baronne;1755;1790;1;;;;;M Geyer de Geyersberg;baron;1729;1772;1;Urach;;;;M Geyer de Geyersberg;baronne;1768;1820;1;Karlsruhe;;;;M Gédoin;;1657;1657;1;;;;;M Gérard;;1698;1744;1;Bushey Park;;;;M Gérard;lady;1678;1839;3;;;;;M Gérard;lord;1662;1684;1;Rose Tavern, Covent Garden;;;;M de Gévaudan;;937;1116;10;;;;;M Gibert;;1693;1747;1;;;;;M Gibert;;1728;1794;1;Coulommiers;;;;M Gibert;;1771;1771;1;Le Gros-Morne;;;;M Gibert de Lametz;;1765;1797;1;Paris, France;;;;M Giesen de Kirchheim;;1788;1788;1;;;;;M Gigon Desgranges;;1778;1781;2;Le Gros-Morne;;;;M Gigon Desgranges St-Louis;;1780;1780;1;Le Gros-Morne;;;;M Gigon Desgranges St-Louis;;1807;1807;1;;;;;M Gigon Zécoté;;1807;1831;2;Le Lamentin;;;;M de Gijon;;1420;1480;1;Sintra, Portugal;;;;M de Gilbert;;1701;1701;1;;;;;M de Gilbert de L'Homel;;1741;1741;1;;;;;M Gillet;;1659;1659;1;;;;;M Gillier;;1696;1696;1;;;;;M Gillotin;;1812;1812;1;;;;;M Gillotin;;1832;1842;1;Bruxelles;;;;M Gillotin;;1848;1848;1;Pont-l'Eveque;;;;M Girard;;1719;1719;1;;;;;M de Girardin;;1710;1710;1;Fort-Royal;;;;M de Girardin;écuyer;;;1;;;;;M Giraud du Poyet;;1688;1688;1;Saint-Christophe;;;;M Giraud du Poyet;;1723;1723;1;Fort-Royal, Martinique;;;;M Giraud du Poyet;Lieutenant du Roi, Martinique. Gouverneur de la Guadeloupe.;1660;1706;1;Ance à Louveb Saint-Christophe;;;;M Giraudelle;;1631;1699;1;Le Carbet;;;;M Giron;;1234;1256;5;;;;;M de Gironde;;1294;1345;3;;;;;M de Gislain de Bontin;;1829;1835;2;;;;;M des Gittons-Baronnière;seigneur de Cerzé;1718;1718;2;;;;;M de Gleiberg;;990;1146;2;;;;;M de Gleichen-Blankenhain;;1480;1567;1;;;;;M de Gleichen-Remda;;1530;1570;1;Waldenbourg;;;;M de Gleichen-Remda;comte de Gleichen;1504;1598;3;;;;;M de Gleichen-Tonna;cotme de Gleichen;1480;1578;2;;;;;M Glinskaïa;régente de Russie;1527;1538;1;Moscou;;;;M Glinski;prince;;;1;;;;;M de Glogau;duc;1260;1361;4;;;;;M de Glogow;duc;1249;1273;1;;;;;M de Gloucester;comte;1189;1217;2;;;;;M de Glymes;;1417;1551;5;;;;;M de Glymes;;1495;1524;1;Wouw;;;;M Gobeil;;1689;1689;1;;;;;M Gobert de Bouillon;;1664;1706;2;Le Marigot;;;;M Gobert de Bouillon;Martinique avant 1665;1621;1680;1;Languedoc;;;;M Godard Descasseaux;;1770;1772;1;Trinité;;;;M Godard Duval;;1761;1761;1;Le Gros-Morne;;;;M Godard Duval;Martinique avant 1660;1624;1690;2;;;;;M Godard des Casseaux Bondi;Major Capesterre;1723;1723;1;Fort-Royal, Martinique;;;;M Godard des Casseaux Bondi;Premier Capitaine, Capesterre Martinique.;;;1;;;;;M Godet;;1624;1624;1;;;;;M Godounov;tsar de Russie;1551;1605;3;;;;;M Godounova;;1581;1603;1;;;;;M Goiby;;1625;1801;4;;;;;M Goiby;;1724;1739;2;Le Trou-au-Chat;;;;M Golovine;;1724;1767;2;;;;;M de Goltz;;1553;1553;1;;;;;M de Gometz;;1028;1028;1;;;;;M de Gondrecourt;;1135;1135;2;;;;;M Gondron;;1776;1847;1;Sarrebourg;;;;M Gondron;;1836;1836;1;St. Martinville, Louisiana;;;;M de Gontaut;;1600;1600;1;;;;;M Gontcharova;;1815;1831;1;;;;;M de Gonzague;;1356;1746;52;;;;;M de Gonzague;;1566;1686;3;Mantua;;;;M de Gonzague;;1616;1684;1;à Paris;;;;M de Gonzague;duc de Nevers;1580;1637;1;Paris;;;;M de Gonzague;reine de Pologne;1611;1667;1;Paris;;;POL;M Gonzalès;comte de Lara;1125;1125;1;;;;;M Gonçalves;;1045;1110;4;;;;;M Gordon;;1783;1786;1;Château de La Tour, Pays de Vaud;;;;M Gordon;comte d'Aboyne;1724;1732;1;Charlton-Aboyne;;;;M Gordon;comte d'Aboyne;1728;1794;1;Edimbourg;;;;M Gordon;comte d'Aybone;1702;1702;2;;;;;M de Goret;;1744;1765;1;;;;;M von Goretzky;;1740;1796;1;;;;;M de Goritz;;1274;1313;1;Konigsfelden, Suisse;;;;M de Goritz;comte de Tirol;1258;1258;2;;;;;M de Gorz;;1345;1391;1;;;;;M Gosselin;;;;1;Paris;;;;M de Gotterwick;;1395;1448;1;;;;;M Gouasblin;;1571;1651;2;;;;;M Goufet;;1657;1657;1;Limoges Egl St Maurice, 87;;;;M de Gouffier;;1686;1755;1;;;;;M Gouge;;1798;1845;1;;;;;M de Goulaine;;1260;1321;2;;;;;M de Goulard;seigneur de Beauvais;;;2;;;;;M de Gournay;;1118;1118;2;;;;;M Goursat;;1819;1842;1;;;;;M de Gouvernain;;1840;1840;1;;;;;M Gouyer Choisy;;1798;1822;2;Le Gros-Morne;;;;M de Goyon de Matignon;comte de Thorigny;1644;1790;6;;;;;M de Gr.Strelitz;duc;1359;1360;2;;;;;M Graham;comtesse de Menteith;1361;1469;3;;;;;M de Grailly;vicomte de Benauge;1230;1413;5;;;;;M de Gramont;duc;1639;1727;4;;;;;M de Grancey;;1320;1466;5;;;;;M de Grancey;seigneur;1331;1380;1;Grandvilliers, Lorraine;;;;M de Grandmesnil;;1135;1212;1;;;;;M de Grandpré;;1224;1275;9;;;;;M de Grandsaigne;seigneur;1338;1704;7;;;;;M de Grandsaigne;seigneur de la Flotte;1506;1506;1;Confolens;;;;M de Grandseigne;marquise;1610;1666;1;;;;;M de la Grange d'Arquien;marquis;1641;1716;2;;;;;M Grano;;1843;1843;1;Roseau;;;;M de Gratereau des Graulges;;1759;1759;1;;;;;M de Greques;;1460;1500;1;;;;;M Grey;duc de Suffolk;1508;1554;1;;;;;M Grey;reine d'Irlande;1537;1554;1;;;;IRL;M Gréau de Saint Marsault;;1763;1763;2;;;;;M Grébélyanovith;despote de Serbie;1389;1427;6;;;;;M Grifeo;prince de Partanna;1814;1814;1;;;;;M du Griffon;;1584;1584;2;;;;;M Grimaldi;;1223;1841;48;;;;;M Grimon;;1771;1771;1;;;;;M Grison;;1679;1712;1;;;;;M Grisot;;1767;1767;1;Bussey les Gy, Haute Saône;;;;M Grisot;;1773;1816;1;Fort-Royal, Martinique;;;;M Grisot;Notaire à Bussey les Gy, Haute Saône;;;1;;;;;M Grossmann;;1725;1795;1;;;;;M Grouchetski;;1680;1681;2;;;;;M Groudna-Groudzinski;princesse de Lowicz;1799;1831;2;;;;;M Grout;;1684;1844;2;;;;;M Gruyer;;1738;1827;1;Alliancelles;;;;M Gryphius;;1598;1674;1;;;;;M de Grünne;comte;1805;1841;2;;;;;M de Guader;;1095;1168;1;;;;;M de Gudensberg;héritière de Hesse;1148;1148;1;;;;;M de Gueldre;;945;1168;4;;;;;M de Gueldre;;1465;1547;1;Bruxelles;;;;M de Guenani;;1680;1710;1;;;;;M du Guescelin;;1405;1405;1;;;;;M Guériff;dame de la Guérivière;1359;1359;1;;;;;M Guérin;;1605;1692;1;;;;;M Guibert;;1638;1716;2;Le Carbet;;;;M Guillaume;;1746;1746;1;;;;;M Guillaume des Fontaines;;1722;1722;1;;;;;M Guillot;;1645;1645;1;;;;;M Guimard;;1632;1632;1;;;;;M Guimon;;1777;1777;1;;;;;M Guines;;1699;1769;1;Le Gros-Morne;;;;M Guines;;1725;1767;1;Trinité;;;;M de Guines;;964;1282;11;;;;;M de Guingamp;comtesse;;;1;;;;;M Guingat;;1744;1744;1;;;;;M Guiot;seigneur de Saint-Quentin;1632;1632;1;;;;;M de Guise;seigneur;1070;1631;6;;;;;M Gutekunst;;1662;1729;1;;;;;M Guttormson;;1184;1230;3;;;;;M Guyon de La Rocheguyon;;1713;1795;1;;;;;M Guyot;seigneur de Saint-Barbant;1621;1621;2;;;;;M Guyot d'Asnières;seigneur d'Asnières;1514;1514;3;;;;;M de Guzman;dame d'Albe de Liste;1479;1479;3;;;;;M de Guzmán;;1195;1195;1;Alarcos;;;;M de Guzmán;duc de Medina Sidonia;1233;1638;6;;;;;M de Guzmán;reine de Portugal;1613;1666;1;;;;PRT;M Gyldenlove;stadhouder de Norvège;1638;1704;2;;;;;M Gyldenlove-Danneskjold;comte Danneskjold à Samsoe;1674;1728;2;;;;;M de Görlitz;duc;1370;1451;2;;;;;M de Habsbourg;;1251;1304;1;Munich;;;;M de Habsbourg;;1257;1322;1;Wittenberg;;;;M de Habsbourg;;1279;1282;1;Landshut;;;;M de Habsbourg;;1280;1364;1;Konigsfelden;;;;M de Habsbourg;;1291;1312;1;Pise;;;;M de Habsbourg;;1295;1324;1;Steiermatk;;;;M de Habsbourg;;1416;1578;4;Wiener Neustadt;;;;M de Habsbourg;;1507;1507;1;Salzbourg;;;;M de Habsbourg;;1507;1578;1;Torquemada;;;;M de Habsbourg;;1515;1557;1;Cordoba;;;;M de Habsbourg;;1526;1741;3;Linz;;;;M de Habsbourg;;1528;1590;2;Prague;;;;M de Habsbourg;;1528;1679;7;Madrid;;;;M de Habsbourg;;1532;1685;9;Innsbruck;;;;M de Habsbourg;;1560;1618;1;Burglitz, Bohême;;;;M de Habsbourg;;1610;1617;1;Lerma;;;;M de Habsbourg;;1611;1612;1;Escurial;;;;M de Habsbourg;archiduc d' Autriche;1572;1572;1;Judenbourg;;;;M de Habsbourg;archiduc d'Autriche;1614;1662;1;Graz;;;AUT;M de Habsbourg;archiduchesse d'Autriche;1465;1618;2;Wiener Neustadt;;;AUT;M de Habsbourg;cardinal;1558;1600;1;Rome;;;;M de Habsbourg;comte;1076;1629;34;;;;;M de Habsbourg;comte;1263;1281;1;Breisach;;;;M de Habsbourg;duc d'Autriche;1271;1290;1;Prague;;;AUT;M de Habsbourg;duc d'Autriche;1283;1307;1;Horazd'ovice;;;AUT;M de Habsbourg;duc d'Autriche;1289;1330;1;Gutenstein, Autriche;;;AUT;M de Habsbourg;duc d'Autriche;1293;1757;11;Vienne;;;AUT;M de Habsbourg;duc d'Autriche;1349;1395;1;à Vienne;;;AUT;M de Habsbourg;duc d'Autriche;1377;1424;1;Bruck an der Mur;;;AUT;M de Habsbourg;duc d'Autriche antérieure;1382;1621;2;;;;AUT;M de Habsbourg;duc d'Autriche antérieure;1427;1665;3;Innsbruck;;;AUT;M de Habsbourg;duchesse de Savoie;1480;1530;2;Bruxelles;;;;M de Habsbourg;duchesse de Silésie;1392;1392;1;Schweidnitz;;;;M de Habsbourg;empereur Romain-Germanique;1255;1308;1;Brugg, Argovie;;;;M de Habsbourg;empereur Romain-Germanique;1415;1493;1;Innsburg;;;;M de Habsbourg;empereur Romain-Germanique;1500;1558;1;Gent;;;;M de Habsbourg;empereur Romain-Germanique;1503;1564;1;Alcala de Henares;;;;M de Habsbourg;empereur Romain-Germanique;1574;1665;13;Graz;;;;M de Habsbourg;gouvernante des Pays-Bas;1522;1586;1;Pamele, Flandres;;;;M de Habsbourg;prince des Asturies;1545;1603;2;Valladolid;;;;M de Habsbourg;prince-évêque de Liège;1505;1557;1;prob. Gent;;;;M de Habsbourg;princesse;1566;1633;2;Ségovie;;;;M de Habsbourg;reine d'Espagne;1584;1611;1;Graz;;;ESP;M de Habsbourg;reine d'Espagne;1634;1696;1;Vienne;;;ESP;M de Habsbourg;reine de France;1554;1592;1;à Vienne;;;FRA;M de Habsbourg;reine de France;1601;1666;1;Madrid;;;FRA;M de Habsbourg;reine de France;1638;1683;1;l'Escurial;;;FRA;M de Habsbourg;reine de Hongrie;1505;1558;1;;;;HUN;M de Habsbourg;reine de Pologne;1436;1505;1;Vienne;;;POL;M de Habsbourg;reine de Pologne;1573;1644;2;Graz;;;POL;M de Habsbourg;reine de Pologne;1653;1697;1;Regensbourg;;;POL;M de Habsbourg;reine de Portugal;1498;1558;1;Louvain;;;PRT;M de Habsbourg;reine de Portugal;1683;1754;1;Vienne;;;PRT;M de Habsbourg;roi d'Espagne;1527;1665;3;Valladolid;;;ESP;M de Habsbourg;roi d'Espagne;1578;1700;3;Madrid;;;ESP;M de Habsbourg;roi de Castille;1478;1506;1;Bruges;;CYL;ESP;M de Habsbourg;roi de Hongrie;1397;1780;2;Vienne;;;HUN;M de Habsbourg;roi de Hongrie;1440;1457;1;Komron;;;HUN;M de Habsbourg;roi des Romains;1218;1291;1;Limbourg;;;;M de Habsbourg;régente du duché de Lorraine;1293;1756;26;Vienne;;;;M de Habsbourg-Lorraine;;1737;1849;26;;;;;M de Habsbourg-Lorraine;;1817;1842;1;Pest;;;;M de Habsbourg-Lorraine;;1821;1844;1;Milan;;;;M de Habsbourg-Lorraine;archiduc d'Autriche;1756;1801;1;Vienne;;;AUT;M de Habsbourg-Lorraine;archiduc d'Autriche;1776;1847;1;Florence;;;AUT;M de Habsbourg-Lorraine;empereur Romain-Germanique;1708;1765;1;Nancy;;;;M de Habsbourg-Lorraine;gouvernante des Pays-Bas;1738;1895;17;Vienne;;;;M de Habsbourg-Lorraine;grand-Maître de l'Ordre Teutonique;1767;1870;9;Florence;;;;M de Habsbourg-Lorraine;prince impérial;1783;1853;1;Pise;;;;M de Habsbourg-Lorraine;prince palatin de Hongrie;1772;1795;1;Florence;;;HUN;M de Habsbourg-Lorraine;reine de France;1755;1793;1;Vienne;;;FRA;M de Habsbourg-Lorraine;reine de Naples;1752;1814;1;Vienne;;;ITA;M de Hainaut;comte;850;1289;28;;;;;M de Hainaut;comte;1056;1098;1;Palestine;;;;M de Hainaut;comte;1150;1195;1;Mons, Belgique;;;;M de Hainaut;reine de France;1170;1190;1;Valenciennes;;;FRA;M de Hainaut-Avesnes;princesse d'Archaïe;1318;1318;1;;;;;M de Haldensleben;;1116;1116;1;;;;;M de Halewijn;;1544;1581;1;;;;;M Halicz;;1251;1298;2;;;;;M Halys;;1316;1316;2;;;;;M de Ham;;1012;1012;5;;;;;M Hamilton;duc d'Abercorn;1440;1885;7;;;;;M Hamilton;duchesse de Hamilton;1632;1716;1;Hamilton;;;;M de Hanau;;1310;1370;1;;;;;M de Hanau-Lichtenberg;comte;1462;1736;12;;;;;M de Hanau-Munzenberg;;1576;1612;1;Hanau;;;;M de Hanau-Munzenberg;comte;1335;1688;15;;;;;M de Hanovre;;1737;1813;1;St.James Palace;;;;M de Hanovre;;1766;1828;1;Buckingham House, St. James Park, London;;;;M de Hanovre;;1796;1817;1;Esher, Surrey, Angleterre;;;;M de Hanovre;;1819;1819;1;Dunkirk, France;;;;M de Hanovre;;1819;1819;1;Hanovre, Basse Saxe, Allemagne;;;;M de Hanovre;;1820;1821;1;Londres, Angleterre;;;;M de Hanovre;;1822;1822;1;Bushy Park, Middlesex;;;;M de Hanovre;;1824;1824;1;;;;;M de Hanovre;duc de Cumberland;1721;1851;11;;;;;M de Hanovre;duc de Kent;1767;1820;1;Sidmouth,Devon, Angleterre;;;;M de Hanovre;prince de Galles;1707;1751;1;Chapel Royal, St.James Palace;;;;M de Hanovre;princesse de Grande-Bretagne;1687;1757;1;Berlin, Allemagne;;;GBR;M de Hanovre;princesse de Grande-Bretagne;1723;1772;1;Cassel;;;GBR;M de Hanovre;princesse de Grande-Bretagne;1724;1751;1;Leicester House, St Martin's, Londres, Angleterre;;;GBR;M de Hanovre;roi de Grande-Bretagne;1660;1727;1;Hanover, Allemagne;;;GBR;M de Hanovre;roi de Grande-Bretagne;1683;1837;4;;;;GBR;M de Hanovre;roi de Grande-Bretagne;1738;1820;1;Chapel royal, St. James palace, London, Angleterre;;;GBR;M d'Haraucourt;;1465;1550;1;;;;;M d'Harcourt;;1240;1488;14;;;;;M d'Harcourt;comte;1342;1389;1;Louvre, Paris;;;;M d'Harcourt;comte d' Harcourt;1346;1346;1;bataille de Crecy;;;;M d' Harcourt;;1772;1772;1;;;;;M de Hardegg;;1634;1676;1;;;;;M de Hardegg-sur-Glaz;comte;1594;1684;2;;;;;M Hardouineau;;1696;1744;4;;;;;M Hardy;;1750;1792;2;Grande Anse (Lorrain);;;;M Hardy;Premier Hardy en Martinique;1700;1700;1;Le Mans;;;;M Hardy de Saint Omer;;1802;1841;1;;;;;M Hardy des Sources;;1701;1778;4;Grande Anse (Lorrain);;;;M Hardy des Sources;;1836;1843;2;;;;;M Harpprecht;;1560;1779;5;;;;;M de Harrach;comte;1696;1814;3;;;;;M Hartmann;;1594;1638;1;;;;;M Hashim;prophète;570;632;1;La Mecque;;;;M Hastings;;1250;1250;1;;;;;M de Haucke;comte;1737;1830;2;;;;;M Hauff;;1622;1665;1;;;;;M de Haute-Lorraine;duc;954;1274;18;;;;;M d'Hautefort;;1764;1764;1;;;;;M de Hauteville;;1200;1200;1;Melun;;;;M de Hauteville;duc de Naples;1144;1144;1;;;;ITA;M de Hauteville;duc de Pouille;1015;1198;28;;;;;M de Hauteville;roi de Sicile;1095;1154;1;Palerme;;;;M de Hauteville;roi de Sicile;1185;1198;1;en Sicile;;;;M Havre;;1771;1771;1;Grande Anse (Lorrain);;;;M de la Haye;seigneur de Masjoubert;1554;1806;4;;;;;M des Hayes de Bonneval;;1691;1753;1;St-Aubin de Bonneval;;;;M des Hayes de Bonneval;;1738;1786;1;Perche;;;;M des Hayes de Bonneval;;1779;1813;1;St-Pierre;;;;M Hayot;;1770;1770;1;St-Esprit;;;;M Hayot;;1799;1799;1;Saint-Pierre (Mouillage);;;;M Hayot;;1812;1812;1;Les Anses d'Arlet;;;;M Hayot;;1842;1842;1;Le Carbet;;;;M de Haze;;1668;1668;1;;;;;M Hecquet;;1625;1685;1;Le Pecq, act. Yvelines;;;;M de Helfenstein;;1589;1638;1;Teschen;;;;M de Helfenstein;comte;1524;1601;2;;;;;M Heller;;1502;1617;5;;;;;M de Hengebach;;1217;1217;1;;;;;M de Henkel-Donnersmarck;comtesse de Henkel;1670;1732;1;Baruth;;;;M de Henneberg;comte;1157;1567;14;;;;;M de Henneberg-Schleusingen;;1366;1366;1;;;;;M Henriquez;;1497;1497;1;Perpignan, France;;;;M Henriquez;amiral de Castille;;;1;;;CYL;ESP;M Henriquez;comte d'Albe de Liste;1425;1583;7;;;;;M Henriquez;seigneur de Médina de Rioseco;1354;1429;1;Guadalcanal;;;;M Henry;;1663;1716;1;Vauclin;;;;M Henry Saint-Amour;Lieutenant de Milice;1629;1629;1;Vervin-Aubenton, Picardie;;;;M Hepburn;duc d'Orkney;1536;1578;1;Malmo;;;;M Herard;;1671;1749;1;St-Christophe;;;;M Hertel de Cournoyer;;1747;1747;1;Montréal;;;;M Hervieux;;1604;1604;1;;;;;M Hervieux;;1654;1707;1;la Martinique;;;;M de Hesbaye;;794;818;1;;;;;M de Hesse;;1453;1489;1;Cassel;;;;M de Hesse;landgrave;1244;1413;2;Marbourg;;;;M de Hesse;landgrave;1272;1848;41;;;;;M de Hesse;landgrave;1504;1567;1;Marburg;;;;M de Hesse-Cassel;;1661;1683;1;Potsdam, Brandebourg, Allemagne;;;;M de Hesse-Cassel;landgrave;1572;1847;25;;;;;M de Hesse-Cassel;landgrave;1654;1787;5;Cassel;;;;M de Hesse-Cassel;landgrave;1689;1753;1;Marburg;;;;M de Hesse-Cassel;princesse;1789;1867;1;Gottorp, Schleswig;;;;M de Hesse-Cassel;roi de Suède;1676;1751;1;Kassel, Hessen, Allemagne;;;SWE;M de Hesse-Darmstadt;;1708;1764;1;Mantua;;;;M de Hesse-Darmstadt;landgrave;1547;1830;34;;;;;M de Hesse-Darmstadt;landgrave;1605;1808;7;Darmstadt;;;;M de Hesse-Darmstadt;landgrave;1667;1739;1;Gotha, Schloss Friedenstein;;;;M de Hesse-Darmstadt;landgravine;1754;1832;1;Prenzlau;;;;M de Hesse-Darmstadt;landgravine;1765;1796;1;Darmstadt, Allemagne;;;;M de Hesse-Darmstadt;évêque d'Augsbourg;1699;1768;1;Bruxelles;;;;M de Hesse-Eschwege;princesse;1617;1702;3;;;;;M de Hesse-Hombourg;landgrave;1585;1846;10;;;;;M de Hesse-Philippsthal;landgrave;1655;1849;15;;;;;M de Hesse-Philippsthal;landgrave;1695;1810;2;Philippsthal;;;;M de Hesse-Philippsthal-Barchfeld;landgrave;1692;1799;2;;;;;M de Hesse-Philippsthal-Barchfeld;princesse;1732;1795;1;Ypres;;;;M de Hesse-Rheinfels-Rotenbourg;landgrave;1623;1693;1;Cologne;;;;M de Hesse-Rheinfels-Rotenbourg;landgrave;1648;1778;6;;;;;M de Hesse-Rheinfels-Rotenbourg;landgravine;1677;1739;1;Rheinfels;;;;M de Hesse-Rheinfels-Wanfried;;1688;1728;1;Wanfried;;;;M de Hesse-Wanfried;Landgrave;1649;1711;1;Rheinfels;;;;M Heurteaux;;1641;1641;1;;;;;M Heurteaux;;1686;1686;1;St-Pierre;;;;M Heuze;;1818;1818;1;;;;;M d'Hébrard;;1601;1601;1;;;;;M Héquet;;1676;1755;2;Le Pecq, act. Yvelines;;;;M d'Héricourt;;1349;1349;1;;;;;M Hill de Dungannon;;1742;1831;1;;;;;M Hocquart de Montfermeil;;1726;1779;1;;;;;M Hodebourg;;1687;1747;1;Le Mans;;;;M Hodebourg;;1717;1791;1;Le François;;;;M Hodebourg;Notaire Royal au Mans;;;1;;;;;M Hodebourg des Brosses;;1754;1799;1;Le François;;;;M Hodebourg des Brosses;;1791;1791;1;;;;;M de Hohenberg;;1230;1281;1;Vienne;;;;M de Hohenberg;comte;1121;1343;3;;;;;M d'Hohenems;comte;1654;1691;1;;;;;M de Hohenlohe;;1310;1371;1;;;;;M de Hohenlohe-Bartenstein-Jagstberg;prince;1766;1766;1;;;;;M de Hohenlohe-Langenbourg;;1679;1751;1;Sarrebruck;;;;M de Hohenlohe-Langenbourg;comte;1584;1837;5;;;;;M de Hohenlohe-Langenbourg;comte;1659;1835;4;Langenbourg;;;;M de Hohenlohe-Neuenstein;;1546;1610;1;Weikersheim;;;;M de Hohenlohe-Neuenstein;comte;1517;1709;8;;;;;M de Hohenlohe-Waldenbourg;comte de Hohenlohe;1440;1724;17;;;;;M de Hohenstaufen;;1047;1307;38;;;;;M de Hohenstaufen;roi d'Italie;1093;1152;1;;;;ITA;M de Hohenstein;;1570;1570;1;;;;;M de Hohenzollern;;1335;1377;1;Munich, Allemagne;;;;M de Hohenzollern;;1360;1414;1;Nurenberg;;;;M de Hohenzollern;;1430;1495;1;Copenhague, Danemark;;;;M de Hohenzollern;;1548;1604;1;Sigmaringen;;;;M de Hohenzollern;;1599;1655;1;Königsberg, Allemagne;;;;M de Hohenzollern;comte;1516;1576;1;Bruxelles, Belgique;;;;M de Hohenzollern;comte de Zollern;1061;1860;179;;;;;M de Hohenzollern;duc en Prusse;1657;1801;6;Berlin, Allemagne;;;;M de Hohenzollern;margrave d'Ansbach;1460;1737;2;Ansbach;;;;M de Hohenzollern;prince de Prusse;1772;1806;1;Saalfeld;;;;M de Hohenzollern;électeur de Brandebourg;1414;1486;1;Tangermünde;;;;M de Hohenzollern;électeur de Brandebourg;1455;1499;1;Arnebourg;;;;M de Hohenzollern;électeur de Brandebourg;1525;1629;2;Berlin;;;;M de Hohenzollern-Hechingen;comte;1545;1847;8;;;;;M de Hohenzollern-Sigmaringen;Prince;1605;1689;2;Munich;;;;M de Hohenzollern-Sigmaringen;Prince;1673;1785;3;Sigmaringen;;;;M de Hohenzollern-Sigmaringen;comte;1547;1853;5;;;;;M de Hohenzollern-s'Heerenberg;Comte;1704;1737;1;Sigmaringen;;;;M de Hohenzollern-s'Heerenberg;Comtesse;1727;1787;1;château s'Heerenberg;;;;M de Hohnstein;;1410;1559;3;;;;;M de Holiczky-Sternberk;;1570;1633;1;;;;;M Holland;comte de Kent;1349;1360;1;Rouen, Normandie, France;;;;M Holland;comte de Kent;1350;1434;5;;;;;M de Hollande;;1072;1094;1;Montreuil-sur-Mer;;;;M de Hollande;comte;943;1374;17;;;;;M de Hollande;comte;1140;1190;1;Antioche;;;;M de Hollande;comte;1210;1234;1;Noyon ou Corbie;;;;M de Holstein;;1255;1325;1;Kalmar;;;;M de Holstein;comte;1190;1436;11;;;;;M de Holstein-Gottorp;;1573;1625;1;Nyköping, Suède;;;;M de Holstein-Gottorp;;1649;1728;1;Gottorp;;;;M de Holstein-Gottorp;;1759;1818;1;Eutin;;;;M de Holstein-Gottorp;duc;1526;1823;29;;;;;M de Holstein-Gottorp;duc d'Ostrogothie;1750;1803;1;Drottningholm, Stockholm, Suède;;;;M de Holstein-Gottorp;prince de Suède;1798;1844;2;;;;SWE;M de Holstein-Gottorp;princesse;1636;1715;1;Stockholm, Suède;;;;M de Holstein-Gottorp;princesse de Suède;1753;1837;2;Stockholm, Suède;;;SWE;M de Holstein-Gottorp;roi de Suède;1710;1771;1;Gottorp, Allemagne;;;SWE;M de Holstein-Gottorp;roi de Suède;1746;1818;2;Riddarholmen, Stockholm, Suède;;;SWE;M de Holstein-Itzehoe;;1250;1289;1;;;;;M de Holstein-Plon;comte;1253;1770;6;;;;;M de Holstein-Schauenbourg;;1430;1638;5;;;;;M de Holstein-Segeberg;;1276;1323;1;;;;;M d'Holszany;princesse lithuano-russe;1405;1461;2;;;;;M de Holzapfel;comtesse;1640;1707;1;;;;;M de Honolstein;;1460;1536;1;;;;;M de Honstein;comtesse;1360;1404;3;;;;;M de Honstein-Hohenstein;;1470;1585;2;;;;;M de Horn-Beaucignies;;1733;1826;1;;;;;M de Horn-Hautekerke;;1627;1693;1;Bruxelles, Belgique;;;;M de Horn-Hautekerke;comte;1582;1648;1;;;;;M de Horn-Hautekerke;comte;1602;1663;1;Stavele;;;;M Hoskins;;1718;1777;1;;;;;M Hoston;;1845;1845;1;;;;;M de la Houssaye Godard;;1725;1725;1;Ste-Marie;;;;M de la Houssaye du Rivage;;1826;1826;1;Le Trou-au-Chat;;;;M Howard;;1414;1572;8;;;;;M Howard;duc de Norfolk;1430;1485;1;à Bosworth;;;;M Howard;duc de Norfolk;1473;1554;1;à Kenninghall, Norfolk;;;;M Howard;reine d'Angleterre;1522;1542;1;à Londres;;ENG;GBR;M de Hoya;comte;1404;1513;3;;;;;M de Hoym;;1669;1741;1;Droyssig;;;;M de Hoym-Droyssig;;1631;1711;1;;;;;M Hoyos;;1772;1828;2;Vienne;;;;M Hoyos-Sprinzenstein;;1799;1799;1;;;;;M Hubert;;1630;1676;6;;;;;M Hubert;;1690;1690;1;Saint-Christophe;;;;M Huc;;1700;1700;1;ClairacAgenais,;;;;M Huc;;1705;1761;1;Macouba;;;;M Huc;;1728;1788;1;Ste-Marie;;;;M Hugonin;;1769;1769;1;Trinité;;;;M Hugonneau;;1640;1640;2;;;;;M Huguet;;1613;1637;1;Chinon;;;;M Humblot;;1858;1858;1;;;;;M Hummel;;1701;1798;2;;;;;M de Huntingdon;comte;1070;1130;2;;;;;M Hunyady;;1385;1457;2;;;;;M Hurault;;1611;1611;1;;;;;M Hurepel;comte de Clermont;1200;1252;2;;;;;M Hurlot;;1785;1785;1;St-Pierre;;;;M Huyghues;;1750;1838;5;;;;;M Huyghues;Capitaine Aide Major de Cavalerie;1728;1787;1;Vauclin;;;;M Huyghues Despointes;;1792;1848;10;;;;;M Huyghues Despointes;;1840;1841;1;Trinité;;;;M Huyghues Despointes;Capitaine de Milice au Bataillon de la Trinité. Habitant sucrier au Robert.;1757;1872;4;Le Robert;;;;M Huyghues Despointes;Maire du Robert, Membre du conseil général de la Martinique.;1809;1859;2;Le Robert, Martinique;;;;M Huyghues Lacour;;1724;1724;1;Rivière-Pilote;;;;M Huyghues Lacour;;1753;1753;1;Le Vauclin;;;;M Huyghues Lacour;;1791;1791;1;Le François;;;;M Huyghues Lacour;;1816;1816;1;Fort-St-Pierre;;;;M Huyghues Lacour;;1837;1837;1;Saint-Pierre;;;;M Huyghues Saint-Croix;;1768;1832;1;;;;;M Hvide;;1163;1163;2;;;;;M Hyde;comte de Charendon;1635;1671;2;;;;;M d'Ibelin;seigneur;1175;1216;5;;;;;M Imperiali;prince de Franca-Villa;1662;1662;1;;;;;M d'Ingrandes;;1100;1100;1;;;;;M d'Iré;;1054;1160;7;;;;;M d'Isenbourg;comte;1460;1667;5;;;;;M d'Isenbourg-Birstein;comtesse;1680;1739;1;;;;;M d'Isenbourg-Budingen;;1422;1633;14;;;;;M d'Isenbourg-Wied;;1400;1430;1;;;;;M d'Isenburg Grenzau;;1510;1572;1;;;;;M des Isles;;1573;1573;1;Vittefleur;;;;M d'Istrie;comte;1040;1070;3;;;;;M d'Italie;;806;936;6;;;;;M d'Italie;roi;775;810;1;;;;ITA;M d'Italie;roi;797;818;1;Vermandois;;;ITA;M Iñiga;roi de Pampelune;;;7;;;;;M Jablonowski;;1660;1727;2;;;;;M Jabouin Canot;;1823;1823;1;Fort-de-France;;;;M Jacob;;1570;1607;2;;;;;M Jacquart;;1788;1788;1;Marseille;;;;M Jagellon;;1464;1512;1;Francfort sur l'Oder;;;;M Jagellon;;1476;1503;1;Nessau;;;;M Jagellon;;1526;1583;1;Stockholm, Suède;;;;M Jagellon;cardinal;1457;1573;8;;;;;M Jagellon;princesse de Pologne;1478;1534;1;Sandomir;;;POL;M Jagellon;reine de Hongrie;1503;1547;1;Prague;;;HUN;M Jagellon;roi de Bohême;1456;1516;1;Cracovie;;;;M Jagellon;roi de Hongrie;1506;1526;1;;;;HUN;M Jagellon;roi de Pologne;1351;1596;7;;;;POL;M Jagellon;roi de Pologne;1427;1492;1;Grodno;;;POL;M von Jagow;;1705;1741;1;;;;;M de Jaham;;1752;1752;1;Le Robert;;;;M de Jaham;;1802;1802;1;Le Lamentin;;;;M de Jaham;;1837;1837;1;Saint-Pierre;;;;M Jaham Beaupré;;1723;1723;1;Grande Anse (Lorrain);;;;M Jaham Beaupré;;1765;1765;1;Ste-Lucie;;;;M Jaham Desfontaines;;1662;1724;1;Le Marigot;;;;M Jaham Desprez;;1676;1676;1;;;;;M Jaham Desprez;;1715;1715;1;Le Carbet;;;;M Jaham Dupre;;1645;1729;1;;;;;M Jaham Dupre;;1680;1699;1;Le Marigot;;;;M Jaham de Courcilly;;1783;1784;2;Le Robert;;;;M Jaham de Plainval;;1702;1832;2;Le Marigot;;;;M Jaham de Saint-Fremont;;1820;1820;1;Ste-Marie;;;;M Jaham de Vertpré;;1610;1685;1;St-MarsPoitou,;;;;M Jaham de Vertpré;;1649;1675;1;;;;;M Jaham des Prés;;1652;1703;1;Marigot, Martinique;;;;M Jaham des Prés;;1681;1703;1;;;;;M Jaham des Rivières;;1712;1712;1;Le Prêcheur;;;;M de Jaillard de la Maronnière;seigneur de la Maronnière;;;2;;;;;M de la Jaille;;1480;1480;1;;;;;M Janret;;1758;1787;2;;;;;M Janssens;;1558;1558;1;;;;;M Jarry;;1659;1659;1;Le Lude, Sarthe;;;;M de Jauer;duc;1316;1346;1;;;;;M Jeannin de Castille;;1705;1705;1;Arcueil;;;;M de Jéhan;;1744;1819;1;;;;;M de Jérusalem;;1129;1160;1;;;;;M Jimena;roi de Pampelune;925;994;5;;;;;M Joffre;;1844;1844;1;;;;;M Johanson;roi de Suède;1234;1234;1;;;;SWE;M de Joigny;comtesse;1080;1336;8;;;;;M de Joinville;comtesse de Vaudémont;1110;1450;13;;;;;M Jolly;;1642;1694;1;Paris (probable), 75;;;;M Jonanovitch;;1764;1842;1;;;;;M de Jorna;;1791;1791;1;Trou-au-Chat;;;;M de Jorna;;1795;1795;1;Rivière-Salée;;;;M de Jorna;;1822;1822;1;Le Diamant;;;;M Jouanne;;1772;1837;2;;;;;M Jouanneau;;1698;1698;2;;;;;M Jouhaud;;1804;1838;2;Limoges, 87;;;;M Jouhaud;;1810;1872;1;Limoges (St Michel), 87;;;;M Joulin;;1768;1837;2;;;;;M Joullain;;1724;1724;1;Le Trou-au-Chat;;;;M Jourdain Dubois;;1660;1755;1;François;;;;M Jourdain Dubois;;1667;1700;1;Case Pilote;;;;M Jourdain Dubois;;;;1;Case-Pilote;;;;M Jourdain Dubois;Capitaine de Milice;1678;1678;1;Carbet;;;;M Jourdanneau;sénéchal de Brilhac;1687;1687;2;;;;;M Jouvet;;1745;1745;1;;;;;M de Joyeuse;Duc;1562;1615;1;Carcassonne;;;;M de Joyeuse;duc;1561;1587;1;bataille de Coutras;;;;M de Joyeuse;duc;1563;1608;1;Chateau de Couiza;;;;M de Joyeuse;duchesse;1585;1656;1;Le Louvre, Paris;;;;M de Joyeuse;seigneur de Bothéon;1477;1592;3;;;;;M de Juelich;comte;1177;1425;10;;;;;M de Juelich;comte;1218;1218;1;Damiette;;;;M de Juliers;duc;1562;1609;1;;;;;M de Juliers et Berg;comte;1455;1543;2;;;;;M Jung;;1567;1618;1;;;;;M de Jutland;roi de Danemark;1144;1146;2;;;;;M Kaas;;1727;1804;1;Bödstrup;;;;M Kaas;;1746;1800;1;Nestved;;;;M Kaas;;1776;1843;1;;;;;M de Kabardie;prince;1561;1569;2;;;;;M Kamaterina;;1134;1211;2;;;;;M Karageorgevitch;seigneur de Serbie;1752;1830;3;;;;;M Karolyi;;1622;1622;1;;;;;M des Kassoubes;duc;1248;1282;2;;;;;M von Katte;;1633;1714;2;;;;;M de Katzenelnbogen;;1220;1288;1;Mayence;;;;M de Katzenelnbogen;comte;1345;1517;7;;;;;M de Kazan;prince;1506;1523;1;;;;;M Keighley;;1580;1580;1;;;;;M Keith;;1449;1449;3;;;;;M Keller;;1582;1672;2;;;;;M Keppel;comte d'Abermarle;1702;1768;4;;;;;M de Kerpen;;1782;1841;1;;;;;M Kerr;;1830;1830;1;;;;;M Kettler;duc de Courlande;1692;1711;1;;;;;M de Kettler;;1613;1682;1;;;;;M de Khevenhuller;;1608;1676;1;;;;;M de Khevenhüller-Metsch;prince;1732;1801;1;;;;;M de Kholm;prince;1471;1504;2;;;;;M Khovanski;prince;1516;1569;2;;;;;M Khuen v.Lichtenberg und Belasi;;1712;1712;1;;;;;M de Kiev;grand-duc;980;1212;7;;;;;M Kinsky;comte Kinski;1784;1831;2;;;;;M Kinsky de Wchinitz et Tettau;;1751;1836;3;;;;;M de Kinzisgau;comte;910;992;2;;;;;M de Kirchberg;burgrave;1531;1827;5;;;;;M de Kirchberg;burgrave;1751;1777;1;Hachenberg;;;;M de Kirchberg;comte de Hachenbourg;1683;1749;1;Farnroda;;;;M de Kirchberg;comte de Hachenbourg;1709;1751;1;Hachenbourg;;;;M Kirn;;1693;1749;1;;;;;M de Klebelsberg;;1829;1829;1;;;;;M de Kleist;;1747;1814;1;;;;;M Koenig;;1526;1571;1;;;;;M de Kohary;prince;1767;1826;1;;;;;M Koltovski;;1572;1626;2;;;;;M Kontromanitch;ban de Bosnie;1312;1353;1;;;;;M Kontromanitch;reine de Hongrie;1339;1387;1;à Novigrad, Croatie;;;HUN;M Korn;;1682;1714;4;;;;;M de Kornely;;1765;1827;1;;;;;M von Koschembahr;;1774;1807;1;;;;;M Kottulinski;comte;1707;1788;2;;;;;M Krag till Juelland;;1675;1754;1;;;;;M Krasinski;comte;1742;1796;2;;;;;M Krimmel;;1612;1699;2;;;;;M Krtich;roi de Bosnie;1418;1463;5;;;;;M Krummedige;;1451;1451;2;;;;;M de Kunowitz;;1671;1754;1;Cassel;;;;M de Kunowitz;comte de Kunowitz-Ostra;1624;1722;2;;;;;M de Kurzbach;;1572;1625;1;;;;;M de Kybourg;comte;1217;1272;5;;;;;M de Kyvelioc;comte de Chester;1190;1231;2;;;;;M de L'Isle-Bouchard;;1075;1119;1;;;;;M de L'Isle-Marivaux;;1542;1560;2;;;;;M de La Barthe;;1195;1195;5;;;;;M de La Baume Le Blanc;duchesse de La Vallière;1644;1780;4;;;;;M de La Borde;;1527;1527;1;;;;;M de La Bussière;;1698;1698;1;;;;;M La Caille;;1651;1651;1;St-Christophe;;;;M de La Fayolle de La Tourne;;1664;1664;1;;;;;M de La Fayolle de La Tourne;;1698;1698;1;Montrigaud, 26;;;;M de La Ferté de Mun;;1644;1644;1;;;;;M de La Guerche;;1167;1192;3;;;;;M de La Guiche;;1645;1645;3;;;;;M de La Hante Belle Isle;;1763;1763;1;Le Trou-au-Chat;;;;M de La Hante Belle Isle;;1791;1791;1;Le François;;;;M de La Hante Saint-Alby;;1816;1816;1;Fort-St-Pierre;;;;M de La Haye;;1718;1718;1;Grande Anse (Lorrain);;;;M de La Houssaye;;1661;1703;1;la Martinique;;;;M de La Houssaye;;1724;1786;1;Ste-Marie;;;;M de La Houssaye;Martinique avant 1660;1638;1796;5;;;;;M de La Houssaye Godard;;1744;1744;1;Grande Anse (Lorrain);;;;M de La Houssaye Sainte-Croix;;1750;1750;1;Le Gros-Morne;;;;M de La Houssaye Sainte-Croix;;1781;1781;1;St-Pierre;;;;M de La Houssaye-Duvigny;;1755;1850;2;Ste-Marie;;;;M de La Lande Patry;;1155;1155;1;;;;;M de La Ligotière;;1737;1760;1;;;;;M de La Londe;;1569;1569;1;;;;;M de La March;;856;903;1;;;;;M de La March;duc des Austrasiens;830;886;1;Paris;;;;M de La Marche;comte;910;1110;10;;;;;M de La Marck;;1558;1591;3;;;;;M de La Mark;comte;1273;1542;13;;;;;M de La Marque;;1135;1135;1;;;;;M de La Mothe-Houdancourt;;1671;1671;1;;;;;M de La Pause;baron de La Garde;1503;1503;1;;;;;M de La Porte;;1623;1657;1;Poincy, Seine-et-Marne;;;;M de La Porte;duc de La Meilleraye;1602;1664;1;chateau de La Meilleraye;;;;M de La Porte;duc de La Meilleraye;1632;1713;1;Meilleraye;;;;M de La Porte;écuyer;1729;1729;3;;;;;M de La Porte Mazarin;duc de La Meilleraye;1666;1738;3;Paris;;;;M de La Roche;héritière de Châteauneuf;1316;1316;3;;;;;M de La Roche Bernard;;1245;1304;1;;;;;M de La Roche Derrien;;1202;1269;2;;;;;M de La Roche-Sur-Ognon;;1230;1291;6;;;;;M de La Roche-Tesson;;1150;1150;2;;;;;M de La Roche-en-Régnier;baron;1245;1339;3;;;;;M de La Rochefoucauld;duc;1588;1650;1;chateau de La Rochefoucauld;;;;M de La Rochefoucauld;duc;1613;1762;3;Paris;;;;M de La Rochefoucauld;duc;1634;1714;1;Versailles;;;;M de La Rochefoucauld;duc;1743;1792;1;Gisors;;;;M de La Rochefoucauld;seigneur;1185;1848;31;;;;;M de La Rue;;1705;1705;1;Grande Anse (Lorrain);;;;M de La Salle;;1667;1667;1;Lyon;;;;M de La Salle;;1697;1697;1;Le Prêcheur;;;;M de La Sonde;;1634;1634;1;;;;;M de La Tour;comte d'Auvergne;;;2;;;AUV;FRA;M de La Tour;seigneur;1389;1512;5;;;;;M de La Tour d'Auvergne;;1150;1793;16;;;;;M de La Tour d'Auvergne;comte d'Auvergne;1467;1501;2;;;AUV;FRA;M de La Tour d'Auvergne;duc de Bouillon;1706;1792;2;Paris;;;;M de La Tour d'Auvergne;seigneur;1225;1270;1;Tunis, Tunisie;;;;M de La Tour du Pin;dame de Cuiseaux;1273;1347;1;Cuiseaux;;;;M de La Tour du Pin;dauphin de Viennois;1050;1337;10;;;;;M de La Tremouille;;1501;1696;3;;;;;M de La Tremouille;duc de Thouars;1620;1672;1;Chateau de Thouars;;;;M de La Tremouille;duc de Thouars;1655;1709;1;La Haye;;;;M de La Tremouille;duc de Thouars;1683;1719;1;Paris;;;;M de La Trémouille;duc de Thouars;1521;1629;2;;;;;M de La Trémouille;duc de Thouars;1566;1674;2;Chateau de Thouars;;;;M de La Veigne;;1789;1789;1;;;;;M de La Vie;;1250;1250;1;;;;;M de La Vie de Villemur;vicomte de Calvignac;1280;1383;2;;;;;M Labbe;;1745;1745;1;St. Louis Cathedral, New Orleans, Louisiana;;;;M Labbe;;1806;1819;1;St. Grigoire de Vievre, France;;;;M Labbe;;1807;1807;2;St. Martin Parish, Louisiana;;;;M Labbe;;1808;1875;2;St. Martinville, Louisiana;;;;M de Laberaudie;;1225;1225;1;;;;;M Labiche;;1627;1627;1;Paris,75;;;;M de Laborde Lacarriere;;1726;1726;1;Le Prêcheur;;;;M de Laborde Lacarriere;;1753;1753;1;Le Vauclin;;;;M de Lacombe;;1751;1751;1;;;;;M Lacquant;Martinique avant 1671;1643;1673;1;Guyenne;;;;M de Lacquant;;1696;1696;4;;;;;M de Lacy;comtesse de Lincoln;1281;1348;2;;;;;M Lafargue;;1729;1786;1;;;;;M de Lafond de l'Espérance;;1660;1660;2;St-Christophe;;;;M Lafontaine;;1756;1831;2;;;;;M de Lagarrigue;;1180;1849;47;;;;;M de Lagarrigue de Bach;;1759;1824;3;;;;;M de Lagarrigue de Francarville;;1601;1735;9;;;;;M de Lagarrigue de La Tournerie;;1590;1656;2;;;;;M de Lagarrigue de Meillac;;1706;1849;18;;;;;M de Lagarrigue de Miramont;;1579;1639;2;;;;;M de Lagarrigue de Montcausson;;1586;1715;5;;;;;M de Lagarrigue de Saint Loup;;1751;1751;2;;;;;M de Lagasne;;1810;1810;1;;;;;M de Lagrange;;1799;1799;1;;;;;M de Laguarigue;;1658;1744;4;;;;;M de Laguarigue de Courcelles;;1727;1797;1;;;;;M de Laguarigue de La Tournerie;;1659;1795;8;;;;;M de Laguarigue de La Tournerie;Martinique en 1690;1623;1702;1;Sens;;;;M de Laguarigue de Miramont;;1753;1753;1;;;;;M de Laguarigue de Morange;;1755;1755;1;;;;;M de Laguarigue de Rocourt;;1669;1762;5;;;;;M de Laguarigue de Saint Isle;;1710;1785;7;;;;;M de Laguarigue de Savigny;;1660;1831;9;;;;;M de Laguarigue de Silly;;1696;1785;6;;;;;M de Laguarigue de Survilliers;;1668;1748;1;St-Christophe;;;;M de Laguarigue de Survilliers;;1702;1845;9;;;;;M de Laguarigue de Survilliers;;1774;1831;1;Ste-Marie;;;;M de Laguarigue de Survilliers;;1804;1884;1;Bordeaux;;;;M de Laguarigue de Survilliers de Laissée;;1699;1771;1;Ste-Marie;;;;M de Laguarigue de Survilliers de Laissée;;1736;1756;1;;;;;M de Lajus;;1799;1799;1;Case-Pilote;;;;M de Lalaing;;1390;1570;3;;;;;M Lalanne Dufond;;1848;1848;1;;;;;M de Lalanne de Père;;1651;1651;1;;;;;M Lallemand;;1701;1701;1;;;;;M Lallemand;;1751;1751;1;Le Trou-au-Chat;;;;M Lallemand;;1775;1775;1;Case-Pilote;;;;M Lallemand;;1787;1822;2;Le Gros-Morne;;;;M de Lalung;;1637;1693;1;Azay-le-Brûlé;;;;M de Lalung;;1680;1751;1;Basse-Pointe;;;;M de Lalung;;1706;1774;4;Grande Anse (Lorrain);;;;M Lalung de Ferrol;;1741;1769;1;Grande Anse (Lorrain);;;;M Lalung de Ferrol;;1783;1864;1;Ste-Marie;;;;M de Lamballe;;1135;1135;1;;;;;M de Lamberg;;1790;1790;2;;;;;M de Lamberg;;1828;1828;1;Vienne;;;;M Landais Lestaupinière;;1771;1771;1;Le Gros-Morne;;;;M Landais Lestaupinière;;1809;1809;1;Gros-Morne;;;;M de la Lande;seigneur de Lage-Cautand;1611;1611;1;;;;;M de Landsberg;;1318;1318;1;;;;;M Lang;;1648;1799;8;;;;;M Langellier Bellevue;;1819;1819;1;Le Mouillage (St-Pierre);;;;M Langellin;;1742;1742;1;;;;;M Langlois;;1720;1720;1;Le Lamentin;;;;M de Lannefranque;;1800;1800;1;;;;;M de Lannoy;;1510;1654;3;;;;;M de Lanques;sire;1412;1418;2;;;;;M de Laon;comte;749;783;2;;;;;M Laporte;;1691;1821;4;;;;;M de Lara;;1140;1358;9;;;;;M de Lara;dame;1285;1351;1;Palencia;;;;M Lascaris;;1218;1501;4;;;;;M Laslier;;1604;1735;3;;;;;M de Lassat;seigneur de Pressigny;1763;1763;3;;;;;M de Lastic;dame de Collat;1420;1441;2;;;;;M de Lastre;;1780;1831;1;Mouillage;;;;M Lathiere-Lavergne;;1842;1842;1;Oradour sur Vayre, 87;;;;M de Launay;;1723;1723;2;;;;;M de Launay;;1780;1780;1;Le Gros-Morne;;;;M de Launay;;1815;1815;1;Sainte-Marie;;;;M Laurens;;1766;1814;1;Limoges(St Maurice la Citte;;;;M du Lausitz;;1205;1255;2;;;;;M de Lautrec;vicomte;;;2;;;;;M de Laval;dame;1466;1466;1;Vitré;;;;M de Laval;dame de Perrier;1095;1529;19;;;;;M de Lavalette;;1769;1830;1;;;;;M de Lavardin;;1133;1133;1;;;;;M de Lavaud;dame;1482;1511;3;;;;;M Lavechef;;1695;1779;1;Le Pecq, act. Yvelines;;;;M Lavechef du Parc;;1653;1703;1;Le Pecq, act. Yvelines;;;;M Lavie;;1782;1782;1;Grande Anse (Lorrain);;;;M de Lavigne;;1646;1712;1;Paris;;;;M de Lavigne;Avocat, conseiller du Roi, Bailli de Sainte-Suzanne;1638;1818;11;;;;;M de Lavigne;Avocat, directeur de la Compagnie de la Terre Ferme 1656, Ouarapiché, Martinique;1609;1659;1;Sainte-Suzanne;;;;M de Lavigne Grandval;;1723;1744;3;;;;;M de Lavigne Sainte-Suzanne;;1692;1767;1;Le François, Martinique;;;;M de Lavigne Sainte-Suzanne;;1732;1838;20;;;;;M de Lavigne Sainte-Suzanne;;1744;1771;1;François;;;;M de Lavigne Sainte-Suzanne;;1792;1841;1;Le François (Martinique);;;;M de Lavigne Turpin;;1734;1800;5;;;;;M de Lavigne Turpin Bonnaire;;1773;1801;2;;;;;M de Lavigne de Grandval;;1690;1781;1;Le François;;;;M de Lavigne de Grandval;;1704;1729;1;François;;;;M de Lavigne de Grandval;chevalier de Saint-Louis;1648;1731;1;Paris Saint Séverin;;;;M Lawless;;1829;1829;1;;;;;M Lazur;;1735;1740;1;Paris;;;;M Le Balleux;;1658;1658;1;la Martinique;;;;M Le Balleux;;1751;1765;2;Le Lamentin;;;;M Le Balleux;Martinique avant 1660;1664;1748;4;;;;;M Le Belloux;;1733;1733;2;;;;;M Le Boeuf;;1672;1719;2;;;;;M Le Bourguignon;;1571;1571;1;;;;;M Le Bouteiller de Senlis;;1653;1653;1;;;;;M Le Breton;;1528;1528;1;;;;;M Le Caruyer;;1644;1644;3;;;;;M Le Caruyer de Beauvais;;1766;1834;4;;;;;M Le Chantier;;1513;1513;1;;;;;M Le Cocq de Saint-Vertunien;dame;;;1;;;;;M Le Cordier;;1778;1815;1;Port-Louis;;;;M Le Cordier;Lieutenant de Vaisseau;1787;1787;1;Port Louis;;;;M Le Curieux Belmard;;;;1;Ste-Lucie;;;;M Le Curieux Durival;;1751;1751;1;Le Lamentin;;;;M Le Curieux Grandcourt;;1775;1775;1;Case-Pilote;;;;M Le Curieux Laferronnay;;1846;1846;1;Le Carbet;;;;M Le Curieux Laferronnay;;;;1;Ste-Lucie;;;;M Le Curieux des Cailles;;1723;1723;1;Le Carbet;;;;M Le Danois;;1680;1680;1;Case-Pilote;;;;M Le Danois;Martinique avant 1660;;;1;;;;;M Le Fevre;;1789;1789;1;Les Anses d'Arlet;;;;M Le Fort;;1618;1683;1;L'Ile de Ré;;;;M Le Fort;;1694;1739;1;Case-Pilote;;;;M Le Geay;;1634;1634;1;;;;;M Le Geay;;1660;1720;1;Le Marigot;;;;M Le Gendre de La Bretesque;;1768;1837;2;Rivière-Pilote;;;;M Le Gras de Vaubercey;;1766;1842;1;Montgenost, Marne;;;;M Le Lièvre de La Grange;;1843;1843;1;;;;;M Le Maigne du Plat;;1669;1669;1;;;;;M Le Maire;;1703;1703;1;Case-Pilote;;;;M Le Maistre;;1778;1801;2;Le Lamentin;;;;M Le Massif;;1776;1776;1;Le Mouillage (St-Pierre);;;;M Le Masson de Rancé;;1840;1840;1;;;;;M Le Mercier;;1627;1627;1;Le Lude, Sarthe;;;;M Le Merle;;1637;1710;2;Saint-Christophe;;;;M Le Merle de Beaufond;;1741;1829;5;;;;;M Le Merle de Beaufond;;1742;1792;1;Le François;;;;M Le Merle de Beaufond;;1781;1866;1;Le Lamentin;;;;M Le Merle de Beaufond;;1797;1839;1;Fort-Royal, Martinique;;;;M Le Merle de Beaufond;Capitaine Grenadiers;1702;1809;2;Le Lamentin, Martinique;;;;M Le Mesle;;1628;1679;1;Morlaix;;;;M Le Mesle;;1710;1710;1;Fort-St-Pierre;;;;M Le Mesle;;1724;1833;2;Grande Anse (Lorrain);;;;M Le Monnier;;1643;1720;1;Dieppe;;;;M Le Moyne;;1657;1724;1;Grande Anse (Lorrain);;;;M Le Normand de Morando;;1769;1843;1;;;;;M Le Pelletier;;1630;1698;1;Mortain;;;;M Le Pelletier;Capitaine de Milice;1712;1712;1;Fort-St-Pierre,,,,;;;;M Le Pelletier;Martinique en 1676;1596;1678;1;Mortain,,,,;;;;M Le Pelletier Dugant;;1715;1715;1;Le Carbet;;;;M Le Pelletier Grandair;;1709;1733;2;Fort-Royal;;;;M Le Pelletier de Beuze;;1731;1755;1;Le François, Martinique;;;;M Le Pelletier de Beuze;;1741;1787;2;;;;;M Le Pelletier de Saint-Rémy;;1765;1765;1;Ste-Lucie;;;;M Le Pelletier de Saint-Rémy;;1838;1838;3;;;;;M Le Pelletier des Ravinières;;1788;1788;1;Case Pilote, Martinique;;;;M Le Pelletier du Clary;;1717;1792;3;Case-Pilote;;;;M Le Pelletier du Clary;;1807;1837;4;;;;;M Le Percher;;1681;1761;1;Trinité;;;;M Le Percher;Sergent de bande 1678;1638;1638;1;;;;;M Le Quoy;;;;1;Paris;;;;M Le Riche;;1165;1165;1;;;;;M Le Roux;;1616;1616;2;;;;;M Le Roux;;1677;1752;1;St-Pierre;;;;M Le Roux de Bordemond;;1617;1617;1;Grainville;;;;M Le Roux de Chapelle;;1754;1822;1;;;;;M Le Roy de Granchamps;;1538;1538;1;;;;;M Le Sade;;1643;1723;2;Grande Anse (Lorrain);;;;M Le Sage;;1703;1703;1;Le Carbet;;;;M Le Sage;;1752;1752;1;Trinité;;;;M Le Sage;;1796;1815;2;Sainte-Marie;;;;M Le Sage;;1828;1836;1;Ste-Marie;;;;M Le Saulnier;;1554;1554;1;;;;;M Le Selliers;;1629;1629;1;;;;;M Le Sueux;;1645;1645;1;;;;;M Le Tellier;marquis de Louvois;1783;1844;3;;;;;M Le Vassoir de Latouche;;1636;1636;2;;;;;M Le Vassor;;1499;1718;5;;;;;M Le Vassor;;1636;1636;1;Paris,75;;;;M Le Vassor;;;;2;Paris;;;;M Le Vassor de La Chardonniere;;1763;1763;1;Le Moule;;;;M Le Vassor de Latouche;;1683;1683;1;;;;;M de Lebarten;;868;1044;7;;;;;M Leblanc;;1500;1500;1;France;;;;M Leblanc;;1799;1799;1;St.James Parish;;;;M Leblanc;;;;8;;;;;M Lebreton Beauséjour;;1805;1805;1;;;;;M Lechalouppe;;1634;1669;1;;;;;M Leclerc;seigneur de Montbas;1506;1802;4;;;;;M Lecocq;;1643;1678;2;;;;;M Lecomte;Martinique avant 1671;1640;1680;1;;;;;M Lecomte Marsilly;;1692;1728;1;Le Marigot;;;;M Lecomte de Marsilly;;1728;1839;2;Grande Anse (Lorrain);;;;M Leconte;;1661;1703;1;Paris;;;;M Leconte;;1685;1720;2;Le Marigot;;;;M Lefebvre;;1787;1787;1;;;;;M Lefebvre Bonneterre;;1767;1767;1;Case-Pilote;;;;M Lefébure;;1642;1758;4;;;;;M Lefort;A confirmer;;;1;;;;;M Legaluppi;;1629;1629;1;Ajaccio, Corse-du-Sud;;;;M Legaluppi;;1645;1645;1;;;;;M Legay;;1689;1689;1;;;;;M Leger;;1724;1813;1;Petit Failly,Brreanncon), 60;;;;M de Lehndorff;comte;1723;1800;2;;;;;M de Leicester;;1120;1190;1;Durazzo, Italie;;;;M de Leicester;;1150;1215;1;;;;;M de Leinster;;1171;1171;1;Waterford, Irlande;;;;M de Leisnig-Penig;;1508;1560;1;;;;;M Lejonhufvud;;1512;1512;1;;;;;M Lejonhufvud;;1516;1551;1;Stockholm, Suède;;;;M Lembert;;1644;1820;4;;;;;M Lemire;;1781;1781;1;St-Pierre;;;;M de Lemos;comte;1542;1558;2;;;;;M Leneze;;1632;1632;1;;;;;M de Lenfernat;;1491;1661;5;;;;;M de Lengenfeld;;1115;1115;2;;;;;M Lennox;duc de Richmond;1672;1860;8;;;;;M Lennox;duc de Richmond-Lennox;1764;1819;1;au Canada;;;;M de Lennox;;1392;1457;2;;;;;M de Lennox;comte;1345;1425;1;Stirling, Écosse;;;;M de Lenoncourt;;1576;1602;1;;;;;M Leo;;1584;1681;2;;;;;M de Leon;;1092;1372;7;;;;;M Leonard;;1650;1718;1;Gand;;;;M Leonard;;1686;1736;2;Grande Anse (Lorrain);;;;M Lepeuple;;1786;1790;2;;;;;M de Lerchenfeld-Prennberg;baronne;1801;1801;1;;;;;M Lesade;;1761;1820;3;;;;;M de Leslie;comte;1692;1737;1;;;;;M Lesme;;1803;1803;1;Limoges Egl St Etienne, 87;;;;M Lesme;;1804;1824;3;Limoges, 87;;;;M Lesme;;1808;1842;1;Limoges Egl St Pierre, 87;;;;M Lesme;;1811;1811;1;Limoges Egl St Pierre, 87;;;;M Lesseps;;1690;1801;3;;;;;M Lestaing;;1794;1794;1;;;;;M de Lestibaudois de La Vallee;;1717;1717;1;Case-Pilote;;;;M Lestrade;;1838;1838;1;Le Robert;;;;M Lesueur;;1661;1661;1;Dieppe;;;;M Leszczynska;reine de France;1703;1768;1;;;;FRA;M Leszczynski;;1630;1703;1;;;;;M Leszczynski;roi de Pologne;1677;1766;1;;;;POL;M de Leuchtenberg;;1537;1579;1;Dillenbourg;;;;M de Leuchtenberg;landgrave;1502;1555;1;;;;;M Levesque;seigneur de la Courmorant;1529;1529;2;;;;;M de Leyritz;;1681;1764;1;Bordeaux;;;;M de Leyritz;;1742;1822;1;Grande Anse (Lorrain);;;;M de Leyritz;;1762;1887;10;;;;;M de Lezay;;1695;1695;3;;;;;M de Lezay-Marnesia;;1768;1791;1;Moutonne;;;;M de Lezay-Marnesia;marquis;1735;1800;1;Metz, France;;;;M de Lezay-Marnesia;marquis de Lezay;1699;1778;1;Lons-le-Saunier;;;;M Lezier;;1653;1653;2;;;;;M de León;roi;994;1028;1;Viseu;;;;M de León;roi;1016;1037;1;à Támara;;;;M de León;roi des Asturies;791;1067;14;;;;;M Lécapène;empereur d'Orient;919;961;2;;;;;M Léontiev;;1706;1706;2;;;;;M de Lévis;duc de Ventadour;1553;1591;1;chateau de la Voulte;;;;M de Lévis;duc de Ventadour;1593;1622;1;Beaucaire;;;;M de Lévis;duc de Ventadour;1600;1649;1;Brive la Gaillarde;;;;M de Lévis;seigneur de Mirepoix;1190;1727;8;;;;;M de Lévis-Florensac;;1336;1380;3;;;;;M de Lévis-Mirepoix;seigneur de Mirepoix;1232;1304;3;;;;;M de Lichtenberg;;1329;1495;3;;;;;M de Liechtenstein;seigneur;1156;1865;94;;;;;M de Liegnitz;duc;1372;1691;9;;;;;M de Ligne;comte d'Arenberg;1525;1568;1;Heiligerlee;;;;M de Ligne;seigneur de Barbancon;1500;1814;2;;;;;M de Ligne-Arenberg;;1601;1665;1;Gent;;;;M de Ligne-Arenberg;prince d'Arenberg;1550;1616;1;Vollenhove;;;;M de Lille;châtelain;1205;1338;3;;;;;M de Limbourg;régente du duché de Lorraine;963;1313;14;;;;;M de Limbourg-Lenne;;1465;1500;1;;;;;M de Limoges;vicomte de Ségur;840;1291;20;;;;;M Limousin;;1565;1565;1;Limoges ?, 87;;;;M Limousin;;1590;1590;1;, Ls;;;;M Limousin;;1659;1659;1;Limogesegl St Maurice, 87;;;;M Limousin;;1659;1659;1;St Maurice de la Citte, 8 ;;;;M de Limpurg-Gaildorf;;1542;1712;5;;;;;M de Limpurg-Gaildorf;baron;1596;1734;3;Gaildorf;;;;M de Limpurg-Sontheim;baron;1611;1645;1;Sommershausen;;;;M de Limpurg-Sontheim;seigneur de Limpurg en Obersontheim;1536;1691;4;;;;;M de Limpurg-Speckfeld;seigneur;1474;1588;4;;;;;M de Linange;;1695;1766;1;Mettenheim;;;;M de Linange;comte;1237;1818;36;;;;;M de Linange;comte de Linange-Dagsbourg-Heidesheim;1662;1698;1;Broich;;;;M de Linange;prince;1763;1814;1;Durckheim, Allemagne;;;;M de Linange-Westerbourg;;1604;1667;1;Westerbourg;;;;M de Linange-Westerbourg;comte;1487;1635;3;;;;;M Linch;;1736;1736;2;;;;;M de Lindau-Ruppin;;1430;1511;1;;;;;M von Lindau-Ruppin;;1280;1343;1;;;;;M de Linselstein;;949;949;1;;;;;M de Lippe;comte;1200;1614;7;;;;;M de Lippe;comte;1527;1563;1;Detmold;;;;M de Lippe-Detmold;;1598;1638;1;Detmold;;;;M de Lippe-Detmold;comte;1554;1782;6;;;;;M de Lippe-Detmold;comte;1671;1752;2;Cassel;;;;M de Lithuanie;grand-duc;1260;1453;18;;;;;M Littée;;1795;1820;2;Ste-Marie;;;;M Littée;;1796;1824;3;;;;;M de Lizarazu;;1358;1358;1;;;;;M de Lobdabourg-Arnshaugk;;1300;1359;2;;;;;M de Lobkowitz;;1568;1677;3;;;;;M de Lobkowitz;;1683;1750;1;Vienne;;;;M de Lobkowitz;comte;1655;1715;1;Neustadt, Bohême;;;;M Lockhart;;1673;1731;1;;;;;M Lockhart;;1724;1738;1;Darnaway, co Moray;;;;M de Locquant;;1735;1735;3;;;;;M Locquet de Blossac;;1816;1816;1;;;;;M de Lodron;;1510;1556;1;;;;;M de Loeben;comtesse;1714;1714;1;;;;;M Logie;;1364;1364;1;;;;;M de Lomagne;;1000;1204;7;;;;;M de Lombardie;;769;773;2;;;;;M de Lomegau;;920;920;2;;;;;M de Lomenil;;1620;1620;1;;;;;M de Londeÿs;;1692;1692;1;Veyrac (87);;;;M de Londeÿs;baron de Puyférier;;;2;;;;;M le Long;;1738;1738;1;;;;;M de Longueville;duc;1595;1672;3;;;;;M de Longvilliers de Poincy;;1524;1595;2;;;;;M de Longvilliers de Poincy;;1570;1596;1;Anet en Brie;;;;M de Longwy;comtesse de Bar-sur-Seine;1538;1561;5;;;;;M de Longwy-Metz;;995;1092;2;;;;;M de Lonvilliers;;1652;1652;1;;;;;M de Loon;comte;1192;1192;2;;;;;M de Loon-Heinsberg;;1424;1502;1;Breda;;;;M de Loon-Heinsberg;;1426;1446;1;Weilbourg;;;;M de Loon-Heinsberg;;1443;1469;1;Mainz;;;;M de Loon-Heinsberg;comte de Loon;1325;1448;4;;;;;M de Looz;;1100;1400;7;;;;;M Lopoukhine;;1672;1731;2;;;;;M de Lor;;1339;1347;2;;;;;M de Lordat;;1779;1800;1;;;;;M de Loret;;1770;1770;1;Bordeaux;;;;M de Loret;;1791;1791;1;;;;;M de Lorraine;;890;939;1;Andernach, Allemagne;;;;M de Lorraine;;1170;1210;1;Louvain, Belgique;;;;M de Lorraine;;1397;1456;1;Sarrebrück;;;;M de Lorraine;;1522;1568;1;Diest;;;;M de Lorraine;;1529;1596;3;Joinville;;;;M de Lorraine;;1545;1621;1;chateau de Deneuvre;;;;M de Lorraine;;1550;1606;1;chateau de Saint-Germain;;;;M de Lorraine;;1563;1563;1;Deneuvre;;;;M de Lorraine;;1564;1625;1;chateau de Nomeny;;;;M de Lorraine;;1574;1631;1;château d'Eu;;;;M de Lorraine;;1648;1719;1;Montjeu;;;;M de Lorraine;;1702;1711;4;chateau de Lunéville;;;;M de Lorraine;;1705;1705;1;Arcueil;;;;M de Lorraine;abbesse de Remiremont;1700;1711;2;palais ducal de Nancy;;;;M de Lorraine;abbesse de Saint-Pierre a Reims;1522;1657;9;chateau de Joinville;;;;M de Lorraine;cardinal;1555;1588;1;Dampierre;;;;M de Lorraine;cardinal de Vaudémont;1561;1694;4;Paris;;;;M de Lorraine;comtesse de Flandre;860;1780;120;;;;;M de Lorraine;duc;1451;1508;1;chateau de Fains;;;;M de Lorraine;duc;1489;1550;4;Bar-le-Duc;;;;M de Lorraine;duc;1517;1623;8;Nancy;;;;M de Lorraine;duc de Bar;1699;1700;1;Bar Le Duc;;;;M de Lorraine;duc de Guise;1496;1550;1;chateau de Conde-sur-Moselle;;;;M de Lorraine;duc de Guise;1519;1577;3;chateau de Bar-le-Duc;;;;M de Lorraine;duchesse;1410;1453;1;à Launay, près de Saumur;;;;M de Lorraine;eveque de Toul;1572;1587;1;Mayence;;;;M de Lorraine;prince de Joinville;1550;1588;1;chateau de Blois;;;;M de Lorraine;reine d'Écosse;1515;1560;1;Bar-le-Duc;;SCT;GBR;M de Lorraine;reine de France;1553;1601;1;Nomeny;;;FRA;M de Lorraine;évêque d'Orléans;1299;1299;1;;;;FRA;M de Lorraine-Aumale;;1600;1638;1;;;;;M de Lorraine-Aumale;duc;1555;1631;1;Bruxelles;;;;M de Lorraine-Brionne;duc;1753;1787;2;;;;;M Loubet;;1140;1140;1;;;;;M de Loutsk;prince;1207;1258;2;;;;;M de Louvain;comte;987;1180;12;;;;;M Louveau de La Guigneraye;;1837;1837;2;Rivière-Pilote;;;;M Louvet;;1422;1828;4;;;;;M Luce de La Payre;;1692;1692;1;Le Lamentin;;;;M de Luciot;;1739;1739;1;;;;;M du Lude;;1030;1030;1;;;;;M de Luna;;1372;1406;2;;;;;M de Lunéville;;985;985;1;;;;;M de Lusignan;comtesse d' Eu;1095;1299;29;;;;;M de Lusignan;prince de Galilée;1316;1343;1;château de Bourbon;;;;M de Lusignan;roi de Chypre;1195;1218;1;Tripoli;;;;M Luszensky de Reglice et Lusna;;1790;1790;2;;;;;M Luttrel;comte de Carhampton;1742;1808;2;;;;;M de Lutzelbourg;;1632;1689;1;;;;;M de Lutzelstein;;1520;1560;1;;;;;M de Luxembourg;;1315;1349;1;Maubuisson;;;;M de Luxembourg;;1342;1442;3;Prague;;;;M de Luxembourg;comte de Saint-Pol;1340;1371;1;Baësirder;;;;M de Luxembourg;comte de Saint-Pol;1385;1433;1;Rambures;;;;M de Luxembourg;duc;980;1613;51;;;;;M de Luxembourg;duc de Piney;1583;1616;1;Jargeau;;;;M de Luxembourg;duchesse de Piney;1607;1680;1;Ligny;;;;M de Luxembourg;empereur Romain-Germanique;1274;1313;1;Buonconvento, près de Sienne, Italie;;;;M de Luxembourg;princesse de Martigues;1562;1623;1;Lamballe;;;;M de Luxembourg;roi de Bohême;1296;1346;1;Luxembourg;;;;M de Luxembourg;seigneur de Ligny;1245;1288;1;Woringen, Allemagne;;;;M de Luxembourg-Fiennes;;1495;1557;1;;;;;M de Luxembourg-Ligny;;1488;1566;2;;;;;M de Luynes;;1733;1733;1;Fort-Royal;;;;M de Luynes;;1767;1767;1;Rivière-Pilote;;;;M de Luynes;;1797;1797;1;Fort-St-Pierre;;;;M Lyher;;1442;1490;2;;;;;M Lyon;;1376;1739;2;;;;;M Lyon de Strathmore;comte de Strathmore;1737;1776;1;;;;;M de Löwenstein-Wertheim;comte;1627;1734;3;Wertheim;;;;M de Löwenstein-Wertheim;comte de Löwenstein-Wertheim-Virnebourg;1598;1657;1;Lowenstein;;;;M de Löwenstein-Wertheim-Freudenberg;;1783;1847;1;;;;;M de Löwenstein-Wertheim-Rochefort;comte;1616;1753;5;;;;;M de Löwenstein-Wertheim-Virnebourg;;1629;1816;4;;;;;M Maansdatter;;1550;1612;1;Satakunda, Finland;;;;M de Maasgau;;890;890;5;;;;;M Mac Culloc;;1811;1811;1;Dublin (Irlande);;;;M Mac Hugh;;1811;1811;1;Dublin (Irlande);;;;M Mac Hugh;;1843;1843;1;Roseau;;;;M de Machecoul;;1250;1256;2;;;;;M de Machicourt;;1705;1759;1;;;;;M de Macon;;967;967;2;;;;;M Magnin;;1770;1787;1;;;;;M Magnol-Dumas;;1807;1807;1;Limoges, 87;;;;M des Magyars;duc;997;1014;2;;;;;M des Magyars;roi de Hongrie;970;1038;1;Esztergom;;;HUN;M de Maigne du Plat;;1670;1706;1;;;;;M de Maignelais;seigneur;;;2;;;;;M de Maillard de La Combe;;1735;1809;2;;;;;M de Maillard de La Combe;;1772;1827;1;La Combe;;;;M de Maillard de La Combe;;1820;1859;1;château de la Combe;;;;M Maillet;;1685;1752;1;Bourd du Prélois St Onge;;;;M Maillet;;1714;1768;2;Rivière-Pilote;;;;M Maillet Dumaine;;1717;1750;1;Rivière Pilote;;;;M Maillet Dumaine;;1754;1812;1;Le François;;;;M Maillet Dumaine;;1771;1771;1;;;;;M de Maillé;;1456;1456;2;;;;;M de Maillé;marquise de Brézé;1628;1694;1;Brézé, Maine-et-Loire, France;;;;M de Mailly;dame de Conti;1766;1789;3;;;;;M de Mailly-Nesle;;1712;1741;1;;;;;M du Maine;comte;800;1085;23;;;;;M Maingaud;;1710;1782;1;St Maurice de la Citte, 87;;;;M Majer;;1695;1821;2;;;;;M de Majorque;infant;1278;1345;2;;;;;M de Majorque;roi;1243;1311;1;Montpellier;;;;M de Majorque;roi;1315;1349;1;Catane;;;;M Malatesta;;1418;1425;1;;;;;M Malerba;;1723;1723;1;;;;;M Malide;;1795;1795;1;;;;;M de Malines;seigneur;1225;1306;3;;;;;M Mallet;;1636;1636;1;Les Presteaux de La Boische, Loiret;;;;M de Maloyaroslav;prince;1433;1485;2;;;;;M de Maltitz;;1238;1333;1;;;;;M Malyouta-Skouratov;;1605;1605;2;;;;;M de Man;roi;1248;1248;1;;;;;M Manceau;;1608;1608;1;;;;;M Mancini;;1656;1760;2;;;;;M Mancini;duc de Nevers;1676;1798;2;Paris;;;;M Mancini;duchesse de Mercoeur;1636;1715;6;Rome;;;;M de Manderscheid;comte;1447;1611;7;;;;;M de Manderscheid-Blankenheim;comte;1480;1831;8;;;;;M de Manderscheid-Gerolstein;comte;1564;1650;2;;;;;M de Manderscheid-Virnebourg;comte;1508;1648;4;;;;;M Mandon;;1691;1822;6;;;;;M de Manneville;;1728;1762;1;;;;;M Manny;lord;1354;1372;1;;;;;M de Mansfeld;comte de Mansfeld-Vorderort;1360;1638;35;;;;;M de Mansfeld;comtesse;1522;1537;1;Offenbach;;;;M de Mar;comte;1296;1296;2;;;;;M Maranda;;1636;1725;1;Angoulême;;;;M Maranda;;1677;1694;1;Le Marin;;;;M de Maranon;;1035;1060;1;;;;;M de Marans;;1738;1738;1;;;;;M Marchet;;1777;1777;1;Villetoureix, Dordogne, France;;;;M de Marcillac;;1718;1788;1;;;;;M de Mareuil;;1150;1207;2;;;;;M de Marigny;;1140;1140;1;;;;;M de la Maronnière;;1679;1679;1;;;;;M de Marque;;1637;1637;1;;;;;M Marraud;;1664;1714;2;Agen;;;;M Marraud;;1701;1776;1;Macouba;;;;M Marraud de Sigalony;;1698;1857;2;Macouba;;;;M Marraud de Sigalony;;1733;1765;1;Grande Anse (Lorrain);;;;M Marraud de Sigalony;;1766;1874;5;;;;;M Marraud des Grottes;;1728;1728;1;Ste-Marie;;;;M Marraud des Grottes;;1737;1877;45;;;;;M Marraud des Grottes;;1763;1763;1;Macouba;;;;M de Marseille;;999;1212;6;;;;;M Marshal;comte de Pembroke;1224;1241;3;;;;;M Marshall;;1143;1143;1;Pembroke Pembrokeshire, Pays de Galles;;;;M Marshall;;1189;1189;1;Londres, Angleterre;;;;M Marshall;comtesse de Pembroke;1190;1248;1;;;;;M Marteau;;1623;1678;1;;;;;M Marteau;;1638;1638;1;Saumur;;;;M Martin;;1712;1712;1;Cul de sac à vaches;;;;M Martin;Directeur général des vivres de la Marine aux Isles;;;1;;;;;M Martin de La Martinière;;1629;1629;2;;;;;M Martin de La Martinière;;1712;1791;2;Paris;;;;M Martin de La Martinière;;1792;1839;1;Saint-Pierre, Martinique;;;;M Martin de La Martinière;;1809;1848;1;Martinique;;;;M Martin de La Martinière;;1819;1819;1;à Saint-Pierre (Martinique);;;;M Martin de La Martinière;;;;1;Villeneuve en Champagne;;;;M Martin des Martinieres;;1837;1837;1;Rivière-Pilote;;;;M Martineau;;1795;1795;1;Ste-Marie;;;;M de Martinitz;comte;1650;1656;2;;;;;M Martinozzi;;1637;1672;2;;;;;M Martinozzi;duchesse de Modène;1635;1687;1;Fano;;;;M Massé;;1614;1614;1;BeauvoirVendée,;;;;M Massé;;1637;1700;1;L'Ile de Ré;;;;M de Massias de Bonne;;1686;1686;1;Limoges;;;;M de Massias de Bonne;;1701;1701;1;St-Pierre;;;;M de Matha;;1170;1170;4;;;;;M de Mathefelon;;1248;1419;3;;;;;M Matheillon Cossois;;1807;1807;1;;;;;M Matheillon Cossois;;1825;1825;1;Le Gros-Morne;;;;M Mathey;;1816;1836;1;Dieuze;;;;M Mathieu;;1669;1669;1;Le Marigot;;;;M Maubert;;1270;1323;1;;;;;M Mauclerc de Lepinay;;1765;1792;1;St-Pierre;;;;M Maugée;;1720;1720;1;Le Lamentin;;;;M Maugée;;1750;1775;2;Le Gros-Morne;;;;M Maugée;;1754;1754;1;;;;;M de Mauléon;;1045;1226;6;;;;;M de Maulmont;;1280;1280;1;;;;;M de Maunoury;seigneur du Murault;1617;1636;2;;;;;M de Maure;;1600;1600;1;;;;;M Maurensanne;;1806;1806;1;Limoges Egl St Michel, 87;;;;M Mauriac;;1835;1835;1;;;;;M de Mausigny;;1376;1376;1;;;;;M de Mayence;;1100;1100;1;;;;;M de Mayenne;;1110;1246;9;;;;;M de Mayenne;;1168;1220;1;Égypte;;;;M de Mazarin;duchesse;;;1;;;;;M Mazarini;cardinal;1602;1661;1;Abruzzes;;;;M de Mazovie;;1394;1429;1;Varsovie;;;;M de Mazovie;duc;1291;1313;2;;;;;M de Mâcon;comte;910;965;2;;;;;M de Meaux;;979;979;2;;;;;M de Meaux Rocourt;;1629;1687;1;;;;;M de Mecklembourg;prince des Obodrites;1160;1329;22;;;;;M de Mecklembourg-Güstrow;duc;1590;1721;6;;;;;M de Mecklembourg-Güstrow;duchesse;1659;1749;2;Güstrow;;;;M de Mecklembourg-Schwerin;duc;1683;1778;2;Grabow;;;;M de Mecklembourg-Schwerin;duc de Mecklembourg;1318;1837;2;Schwerin;;;;M de Mecklembourg-Schwerin;duc de Mecklembourg;1361;1842;57;;;;;M de Mecklembourg-Schwerin;prince héritier;1778;1819;1;Ludwigslust;;;;M de Mecklembourg-Schwerin;roi de Suède;1340;1412;1;à Doberan;;;SWE;M de Mecklembourg-Schwerin-Grabow;;1685;1735;1;Berlin, Allemagne;;;;M de Mecklembourg-Stargard;duc;1321;1532;9;;;;;M de Mecklembourg-Strelitz;;1744;1818;1;Mirow, Mecklembourg-Strelitz;;;;M de Mecklembourg-Strelitz;;1769;1818;1;Hanover;;;;M de Mecklembourg-Strelitz;;1773;1839;1;Hannovre;;;;M de Mecklembourg-Strelitz;duc;1658;1708;1;Güstrow;;;;M de Mecklembourg-Strelitz;duc;1686;1841;11;;;;;M de Mecklembourg-Strelitz;duchesse;1694;1752;2;Strelitz;;;;M de Mehun;;1216;1216;1;;;;;M de Meingau;;900;955;2;;;;;M de Melanda;;995;1022;1;;;;;M de Melgueil;;1055;1145;8;;;;;M de Mello;seigneur;1080;1350;14;;;;;M de Melun;;835;1724;3;;;;;M de Melun;;1328;1389;1;Château de Monceau;;;;M de Melun-Espinoy;prince d'Espinoy;1520;1666;3;;;;;M Menant;;1732;1732;1;Ste-Marie;;;;M de Mendoza;marquis de Zenetta;1508;1580;4;;;;;M Menegault;;1703;1703;1;Le Trou-au-Chat;;;;M Menu;;1726;1796;2;;;;;M de Mercie;comte;889;911;1;;;;;M de Mercie;roi;853;874;1;Rome, Italie;;;;M Mercier;seigneur de la Motte-Malitard;1744;1744;1;;;;;M de Mercoeur;;1095;1290;8;;;;;M Meriel;;1648;1648;6;;;;;M Merillon;;1787;1804;2;;;;;M de Merode;baronne;1578;1640;1;Antwerpen;;;;M de Merode;comte;1627;1794;6;;;;;M de Merode;comte;1797;1840;1;Braunschweig;;;;M de Merode;marquis de Westerloo;1674;1830;2;Bruxelles;;;;M de Merode-Groesbeek;comtesse;1688;1695;1;;;;;M de Merode-Montfort;comte;1662;1773;4;;;;;M de Merode-Westerloo;baronne;1649;1701;1;Bruxelles;;;;M Mery de Neuville;;1821;1821;1;Fort-St-Pierre;;;;M de Mesle;;1285;1329;1;;;;;M de Mesmes;;1655;1655;1;;;;;M de Metternich;;1580;1614;1;;;;;M de Metz;;902;963;6;;;;;M Metzsch;;1507;1580;1;;;;;M de Mezetsk;prince;1470;1483;2;;;;;M de Médicis;grand-duc de Toscane;1414;1737;41;;;;;M de Médicis;grand-duc de Toscane;1590;1679;4;Florence;;;;M de Médicis;reine de France;1519;1589;1;à Florence;;;FRA;M de Médicis;reine de France;1573;1642;1;;;;FRA;M Mélentiéva;;1576;1576;1;;;;;M de Méranie;duc;1213;1269;5;;;;;M de Mérédieu;seigneur de Chanlebout;1764;1764;2;;;;;M de Mier;;1796;1869;2;;;;;M Migliaccio;duchesse de Floridia;1770;1826;2;;;;;M Mignot;;1648;1680;1;St-Pierre;;;;M Mignot;;1658;1677;2;;;;;M Milhe;;1688;1688;1;Saint-Brés;;;;M Milhe;Boulanger;1669;1669;1;Le Crès;;;;M Milhe;Boulanger;;;1;;;;;M de Millau;;985;1050;4;;;;;M Millon;;1677;1677;1;Case-Pilote;;;;M Millon;;1698;1698;4;;;;;M Millon de Sainte-Claire;;1807;1807;1;Le Lamentin;;;;M Millot;;1660;1660;1;;;;;M Millot de Lore;;1677;1677;1;Loches;;;;M Millot de Lore;;1679;1701;1;St-Médard d'Evres (Touraine);;;;M Millot de Lore;;1716;1766;1;Ste-Marie;;;;M Miloslavskaïa;;1625;1669;1;;;;;M de Miramont;;1530;1530;2;;;;;M de Mirebeau;;1185;1185;1;;;;;M Miron de Pont-Leroy;;1831;1831;1;;;;;M de Moers;comte;1360;1547;15;;;;;M Mohun;lord;1396;1431;2;;;;;M Mohylanka;prince;1591;1638;1;Warszawa;;;;M Molandrin;;1723;1723;1;Le Carbet;;;;M de Moldavie;prince;1433;1504;1;Borzesti (aujourd'hui Gheorghe Gheorghiu-Dej);;;;M de Moldavie;prince de Mogdavie;1482;1505;2;;;;;M de Molina;;1260;1321;1;;;;;M de Mompelgard;;1387;1444;1;;;;;M de Moncada;;1321;1321;1;;;;;M de Moncade;vicomte de Béarn;1180;1223;3;;;;;M de Monceaux;;1563;1563;2;;;;;M de Monchy;;1125;1162;2;;;;;M de Monferrat;roi de Salonique;1150;1207;1;;;;;M de Mongascon;dame;;;1;;;;;M Monnel Mancroix;;1708;1792;1;;;;;M Monnier;;1718;1718;1;;;;;M de Mons;;1085;1131;3;;;;;M Monsalard;;1753;1753;1;;;;;M de Monschau;;1175;1214;1;;;;;M de Mont d'Or;;1782;1828;1;Vaugneray (à l'Ouest de Lyon);;;;M de Mont d'Or;marquis;1793;1793;1;;;;;M de Mont-Saint-Jean;;1172;1223;3;;;;;M Montagu;comte de Salisbury;1406;1462;2;;;;;M de Montagu;seigneur;1196;1348;6;;;;;M Montaigne;;1645;1707;1;Le Marin;;;;M Montaigne;;1693;1693;1;St-Christophe;;;;M Montaigu de Marcoussis;;1398;1398;1;;;;;M de Montauban;;1443;1497;1;;;;;M de Montault;;1656;1698;1;;;;;M de Montaut;seigneur de Mussidan;1335;1777;5;;;;;M de Montbazon;seigneur;1304;1407;5;;;;;M de Montbéliard;;1076;1128;4;;;;;M de Montboissier;;1255;1271;2;;;;;M de Montdidier;comte de Ramerupt;1031;1129;5;;;;;M de Montfaucon;dame d'Erry;1128;1411;7;;;;;M de Montferrat;margrave;961;1566;29;;;;;M de Montfort;;1061;1117;1;Fontevrault;;;;M de Montfort;;1123;1181;1;Montfort l'Amaury;;;;M de Montfort;;1160;1229;1;Varilhes;;;;M de Montfort;;1228;1249;1;Nicosie, Chypre;;;;M de Montfort;;1530;1568;1;Orléans;;;;M de Montfort;comte;1165;1218;1;Toulouse, France;;;;M de Montfort;comte de Bigorre;1195;1220;1;Castelnaudary;;;;M de Montfort;comte de Montfort-l'Amaury;1192;1241;1;Otrante, Italie;;;;M de Montfort;dame d'Epernon;1028;1759;24;;;;;M de Montfort-Bregenz;;1510;1544;1;;;;;M Montgomerie;lady;1697;1738;1;;;;;M Montgomery;;1438;1438;1;;;;;M de Montgommery;comte d'Alençon;1095;1189;5;;;;;M de Monthermer;comte de Gloucester;1297;1323;1;;;;;M de Monthiers;;1574;1574;2;;;;;M de Montjay;;1090;1090;1;;;;;M de Montlaur;;1220;1278;2;;;;;M de Montlezun;vicomtesse d'Auvillar;1130;1150;1;;;;;M de Montlhéry;;1089;1104;8;;;;;M de Montluçon;sire;1165;1165;4;;;;;M de Montmirail;;1194;1267;4;;;;;M de Montmorency;;1594;1650;1;Pézenas, Hérault, France;;;;M de Montmorency;connetable de France;1493;1567;1;Chantilly;;;FRA;M de Montmorency;duc;1073;1801;36;;;;;M de Montmorency;duc;1530;1579;1;Écouen;;;;M de Montmorency;duc;1534;1614;1;Chantilly;;;;M de Montmorency;duc;1595;1632;1;Toulouse;;;;M de Montmorency;duc de Piney;1628;1695;1;Paris;;;;M de Montmorency;duc de Piney;1662;1726;1;Ligny;;;;M de Montmorency;seigneur de Marly;1135;1204;1;Constantinople;;;;M de Montmorency-Laval;;1239;1260;2;;;;;M de Montpellier;seigneur;1129;1219;12;;;;;M de Montrevault;;945;1048;4;;;;;M Monval;;1770;1770;1;Trinité;;;;M Monza;;1534;1534;1;Vincence, Italie;;;;M de Morat;seigneur de Lavaud de Blanzac;1692;1692;1;;;;;M de Moray;mormaer;;;2;;;;;M Moreau;;1686;1761;4;;;;;M Moreau;;1727;1727;1;St. Louis Cathedral, New Orleans, Louisiana;;;;M Moreau de Montcheuil;;1744;1820;1;Saint-Martial de Valette;;;;M Moreau de Montcheuil;;1777;1850;1;Bordeaux;;;;M Moreau de Villejalet;;1715;1821;3;;;;;M Moret;;1745;1794;1;Paris, France;;;;M de Morialmes;dame;1190;1190;4;;;;;M Morillon;;1633;1700;3;;;;;M Morin;;1610;1850;4;;;;;M Morin;;1767;1778;1;Limoges , Egl Stmaurice, 87;;;;M de Moritz;;1650;1685;1;Jacobstadt;;;;M Morlot;;1670;1737;2;;;;;M de Mortagne;;1031;1031;1;;;;;M de Mortain;;1058;1087;2;;;;;M de Mortemart;;1185;1255;1;;;;;M de Mortemer;;1160;1184;1;;;;;M Mortimer;comte de March;1352;1425;5;;;;;M Moser;;1486;1552;2;;;;;M Moser von Filseck;;1553;1734;6;;;;;M Moser von Filseck und Weilerberg;;1525;1595;1;;;;;M Mosley;;1844;1844;1;;;;;M Moth;;1654;1700;1;;;;;M Motier;;1706;1706;1;;;;;M Motier de La Fayette;marquis de La Fayette;1757;1837;1;;;;;M Mouchard;;1708;1782;2;La Rochelle;;;;M Mouchard de Chaban;;1737;1813;1;Paris, France;;;;M Mouret;;1789;1834;1;La Maison Neuve Cne Oradour;;;;M de Mousson;;1037;1037;2;;;;;M de Moussy;;1430;1430;2;;;;;M Mouton;;1656;1740;1;;;;;M de Mouy;marquis;;;1;;;;;M de Mouy;marquise;1572;1627;1;chateau de Thugny;;;;M Mowbray;lord;1361;1481;4;;;;;M Moyeux;;1698;1698;3;;;;;M ibn Muhammad;calife de Cordoue;;;1;;;;;M de Mullot;;1807;1807;1;;;;;M de Mullot de Charmoy;;1752;1752;1;;;;;M Munk;;1598;1658;2;;;;;M de Munsterberg;;1500;1531;1;;;;;M de Munsterberg-Oels;;1601;1659;1;;;;;M Murat;;1793;1847;2;;;;;M Murat;roi de Naples;1771;1815;1;;;;ITA;M Mure;;1347;1347;2;;;;;M Murray;;1768;1830;1;;;;;M Murray;comte de Dunmore;1661;1710;1;Knowsley;;;;M Murray;lady;1687;1710;1;Whitehall;;;;M Mutinet de La Carnoye;;1714;1714;2;;;;;M Muñoz;duc de Riansares;1833;1833;1;;;;;M N...;;683;920;15;;;;;M de Naeyer;;1601;1601;1;Bruxelles (Hinisterrae ?);;;;M de Naeyer;;1624;1624;1;Ath (Belgique);;;;M de Naeyer;;1630;1630;1;Gand;;;;M de Naeyer;;1659;1659;1;Gand, paroisse St Bavon;;;;M de Naeyer;;1700;1700;1;Gand, Belgique;;;;M de Naeyer;;1756;1846;1;Gand (Belgique);;;;M Nagoï;;1580;1612;2;;;;;M Nagu;;1779;1779;1;;;;;M de Namur;comte;915;1363;16;;;;;M de Nangis;dame;1100;1100;1;;;;;M de Nantes;comte;827;1162;19;;;;;M Nantiac;;1667;1707;1;;;;;M de Narbonne;;1165;1239;1;Narbonne, France;;;;M de Narbonne;comte de Molina;897;1281;15;;;;;M de Narbonne-Pelet;;1050;1176;6;;;;;M Narichkine;;1623;1694;3;;;;;M de Nassau;comte;1135;1459;18;;;;;M de Nassau;comte;1180;1351;3;Dillenbourg;;;;M de Nassau;empereur Romain-Germanique;1255;1298;1;Göllheim;;;;M de Nassau-Dillenbourg;;1441;1514;1;Celle;;;;M de Nassau-Dillenbourg;;1491;1547;1;Vianden;;;;M de Nassau-Dillenbourg;comte;1380;1661;15;Dillenbourg;;;;M de Nassau-Dillenbourg;comte;1430;1739;18;;;;;M de Nassau-Dillenbourg;comte de Nassau-Dietz;1410;1544;5;Breda;;;;M de Nassau-Hadamar;prince;1674;1740;2;Hadamar;;;;M de Nassau-Idstein;comte;1603;1760;3;;;;;M de Nassau-Ottweiler;;1653;1773;3;Ottweiler;;;;M de Nassau-Ottweiler;comte;1625;1728;2;;;;;M de Nassau-Sarrebruck;comte;1423;1769;6;Sarrebruck;;;;M de Nassau-Sarrebruck;comtesse;1464;1774;10;;;;;M de Nassau-Siegen;;1587;1643;2;;;;;M de Nassau-Siegen;;1613;1669;1;Siegen;;;;M de Nassau-Siegen;;1622;1694;2;Culemborg;;;;M de Nassau-Siegen;;1625;1700;1;Arolsen;;;;M de Nassau-Siegen;comte;1561;1661;3;Dillenbourg;;;;M de Nassau-Usingen;prince;1635;1823;5;;;;;M de Nassau-Weilbourg;;1362;1383;1;Marbourg;;;;M de Nassau-Weilbourg;;1560;1634;1;Strasbourg, France;;;;M de Nassau-Weilbourg;;1572;1607;1;Berlebourg;;;;M de Nassau-Weilbourg;;1582;1635;1;Metz, France;;;;M de Nassau-Weilbourg;comte;1288;1857;26;;;;;M de Nassau-Weilbourg;comte;1368;1429;1;Sarrebrück;;;;M de Nassau-Weilbourg;comte;1504;1559;1;Weilnau;;;;M de Nassau-Weilbourg;comte;1537;1593;1;Ottweiler;;;;M de Nassau-Weilbourg;duc de Nassau;1792;1839;1;Kirchheimbolanden;;;;M de Nassau-Weilbourg;princesse;1546;1829;2;Weilbourg;;;;M de Nassau-Weilbourg;princesse;1776;1841;1;Kircheimbolanden;;;;M de Nassau-Wiesbaden-Idstein;comte;1307;1594;12;;;;;M de Nassau-Wiesbaden-Idstein;comte;1419;1480;1;Breda;;;;M de Nassau-Wiesbaden-Idstein;comte;1490;1558;1;Keulen;;;;M de Navailles;dame;1330;1381;1;;;;;M de Navarre;roi;1000;1234;16;;;;;M de Navarre;roi;1132;1229;2;Pampelune, Espagne;;;;M de Navarre;roi;1144;1150;1;Leon, Espagne;;;;M Navarro;;1510;1510;1;;;;;M de Neipperg;comte;1775;1829;1;;;;;M de Nellenbourg;;912;912;1;;;;;M Nemanya;empereur des Serbes;1308;1355;1;Diavoli;;;;M Nemanya;grand-joupan de Rascie;1136;1371;17;;;;;M Nemanya;prince de Serbie;1114;1200;1;Ribnica, Yougoslavie;;;;M Nemanya;roi de Serbie;1280;1280;1;monastère Sopocani;;;;M Nemanya;roi de Serbie;1334;1334;1;Zvecan;;;;M Nepveu;;1674;1674;1;;;;;M de Nesle;comte de Soissons;1095;1306;13;;;;;M de Nesmond;;1667;1667;2;;;;;M de Nettancourt de Passavant;;1723;1760;1;Bar-le-Duc;;;;M de Nettancourt-Vaubécourt;;1701;1794;2;Nettancourt;;;;M de Neuenahr;;1551;1626;1;;;;;M de Neufchatel;;1495;1544;1;;;;;M Neuffer;;1629;1778;3;;;;;M de Neuville;;1170;1707;4;;;;;M de Neuville de Grez;;1265;1327;1;;;;;M de Nevers;comte;975;1192;18;;;;;M de Nevers;comte;1110;1161;1;Auxerre;;;;M Neville;baron Neville de Raby;1329;1495;11;;;;;M Neville;baron Neville de Raby;1341;1388;1;Newcastle upon Tyne, Tyne and Wear, Angleterre;;;;M Neville;comte de Westmorland;1363;1425;1;Raby Castle, Durham, Angleterre;;;;M de Nice;;1032;1032;4;;;;;M de Nimptsch;;1773;1773;1;Breslau;;;;M Ninot;Forgeron;1806;1842;1;Nantois;;;;M de Noailles;;1578;1824;14;;;;;M de Noailles;duc;1620;1678;1;son hotel parisien;;;;M de Noailles;duc;1650;1708;1;chateau de Versaillles;;;;M de Noailles;duc;1713;1793;1;Versailles;;;;M du Noble;;1712;1712;1;;;;;M Noel;;1687;1704;2;;;;;M de Nogaret;duc d'Epernon;1622;1622;1;;;;;M de Nogaret de La Valette;;1581;1581;1;;;;;M de Nordgau;;951;1020;6;;;;;M de Normandie;;1053;1085;1;Saint-Jean d'Acre, Israël;;;;M de Normandie;;1102;1120;1;dans le Naufrage de la Blanche-Nef;;;;M de Normandie;comte de Flandre;1101;1128;1;à Aalst;;;;M de Normandie;duc;860;932;1;Norvège;;;;M de Normandie;duc;932;1147;20;;;;;M de Normandie;duc;942;942;1;en Picardie;;;;M de Normandie;duc;1010;1035;1;à Nicée (Asie Mineure);;;;M de Normandie;duc;1054;1134;1;au château de Cardiff;;;;M de Normandie;impératrice du Saint-Empire;1102;1167;1;Londres;;;;M de Normandie;roi d'Angleterre;1028;1087;1;à Falaise?;;ENG;GBR;M de Normandie;roi d'Angleterre;1056;1100;1;près de Lyndhurst, Hampshire;;ENG;GBR;M de Normandie;roi d'Angleterre;1068;1135;1;Selby, Yorkshire, Angleterre;;ENG;GBR;M de Northeim;duc de Bavière;1050;1141;6;;;;;M de Northumberland;;1010;1090;3;;;;;M de Norvège;;1042;1042;1;;;;;M Noury;;1817;1817;1;;;;;M de Novgorod;prince;1137;1221;4;;;;;M de Noyers;seigneur;1180;1374;7;;;;;M O'Murphy;;1737;1815;1;;;;;M Odoievski;prince;1555;1569;2;;;;;M Odone;;1657;1657;1;Ajaccio, Corse-du-Sud;;;;M d'Oignies;comte;1510;1791;2;;;;;M d'Oignies;princesse de Grimberghe;1760;1842;1;Bruxelles;;;;M d'Oiselet;baron;1208;1497;8;;;;;M d'Oisy;seigneur;1075;1165;5;;;;;M d'Oldenbourg;;1583;1658;1;Rotenbourg, Hesse;;;;M d'Oldenbourg;;1685;1687;1;Whitehall Palace a Londres;;;;M d'Oldenbourg;;1686;1687;1;chateau de Windsor;;;;M d'Oldenbourg;;1690;1690;1;Saint James Palace;;;;M d'Oldenbourg;;1692;1692;1;Syon House a Brentford;;;;M d'Oldenbourg;;1693;1693;1;Berkeley House;;;;M d'Oldenbourg;;1696;1698;2;Windsor;;;;M d'Oldenbourg;comte de Oldenbourg-Oldenbourg;1272;1849;131;;;;;M d'Oldenbourg;corégente du duché de Lorraine;1521;1590;1;Tortona;;;;M d'Oldenbourg;duc de Gloucester;1689;1700;1;Hampton Court;;;;M d'Oldenbourg;duc de Glücksbourg;1785;1831;1;Lindenau;;;;M d'Oldenbourg;duc de Holstein-Sonderbourg-Augustenbourg;1765;1814;2;Augustenburg;;;;M d'Oldenbourg;prince de Danemark;1653;1708;1;chapelle royale de Saint James Palace;;;;M d'Oldenbourg;princesse de Danemark;1771;1843;1;Christiansborg;;;;M d'Oldenbourg;roi de Danemark;1426;1813;3;Copenhague, Danemark;;;;M d'Oldenbourg;roi de Danemark;1455;1513;1;Ålborg, Danemark;;;;M d'Oldenbourg;roi de Danemark;1723;1766;1;Altona, Allemagne;;;;M Olivier Prevert;;1736;1736;1;Grande Anse (Lorrain);;;;M Olivier Prevert;;1763;1763;1;St-Pierre;;;;M Olremans;;1742;1778;1;;;;;M Opalinski;comte;1680;1747;2;;;;;M d'Opole;duc;1239;1293;4;;;;;M d'Oppeln;duc;1360;1413;4;;;;;M d'Orange;;1411;1521;3;;;;;M d'Orange;;1605;1674;1;Cherbourg, Manche;;;;M d'Orange;;1620;1620;1;Région Huivillé ou Siouville Hague 22 km SO Cherbourg;;;;M d'Orange;;1641;1669;1;Capesterre, Guadeloupe;;;;M d'Orange;prince;1438;1475;1;chateau d'Orange;;;;M d'Orange;prince;1443;1502;1;Chateau de Nozeroy;;;;M d'Orange d'Hurville;;1554;1554;1;;;;;M d'Orange-Nassau;;1578;1648;1;Antwerpen;;;;M d'Orange-Nassau;prince d'Orange;1533;1584;1;au Château de Dillenburg;;;;M d'Orange-Nassau;prince d'Orange;1554;1848;23;;;;;M d'Orange-Nassau;prince d'Orange;1626;1650;1;à La Haye;;;;M d'Orange-Nassau;prince de Nassau-Dietz;1686;1711;1;Cassel;;;;M d'Orange-Nassau;roi d'Angleterre;1650;1702;1;;;ENG;GBR;M d'Orange-Nassau;roi des Pays-Bas;1772;1849;2;La Haye;;;;M d'Orfeuille;seigneur de Luché;1573;1573;2;;;;;M d'Orlamuende;margrave de Meissen;;;2;;;;;M de Orlamuenden;;1055;1087;2;;;;;M d'Orleans-Rothelin;marquis de Rothelin;1620;1792;5;;;;;M d'Orléans;;1409;1432;1;Blois;;;;M d'Orléans;;1449;1501;1;Bray-sur-Seine;;;;M d'Orléans;;1662;1847;2;Paris;;;;M d'Orléans;duc;1336;1793;9;;;;FRA;M d'Orléans;duc de Chartres;1810;1842;1;Palermo;;;;M d'Orléans;duchesse de Chartres;842;1850;26;;;;;M d'Orléans;princesse de Commercy;1676;1744;1;à Saint-Cloud;;;;M d'Orléans;reine des Belges;1812;1850;1;Compiegne;;;BEL;M d'Orléans-Longueville;;1548;1601;1;Paris, France;;;;M d'Orléans-Longueville;duc de Dunois;1447;1600;9;;;;;M Ormson;;1438;1450;2;;;;;M d'Ornano;;1645;1645;1;Paris;;;;M Orséolo;;1015;1015;1;;;;;M Orsini;;1450;1520;2;;;;;M d'Ortenbourg;comtesse;;;3;;;;;M Orth;;1530;1742;5;;;;;M Ortlöpp;;1791;1843;1;;;;;M d'Orville;;1807;1807;2;;;;;M Ory;;1691;1760;1;;;;;M Osiander;;1534;1766;7;;;;;M d'Ossétie;;1206;1206;1;;;;;M d'Ostfriesland;comte;1462;1634;8;;;;;M d'Ostphalie;;965;1003;2;;;;;M Ostrogska;princesse;1560;1579;1;Wilno;;;;M d'Ottingen;comte;1304;1747;9;;;;;M d'Ottingen-Baldern;comte d'Ottingen-Wallerstein;1516;1626;2;;;;;M d'Ottingen-Baldern;comte d'Ottingen-Wallerstein;1544;1602;1;Sigmaringen;;;;M d'Ottingen-Flohberg;;1523;1560;1;;;;;M d'Ottingen-Katzenstein;;1619;1688;1;;;;;M d'Ottingen-Ottingen;comte;1486;1664;10;;;;;M Ottingen-Spielberg;;1703;1737;1;;;;;M d'Ottingen-Spielberg;comte;1693;1812;4;;;;;M Ouallet;;1600;1680;1;Le Prêcheur;;;;M Ouallet;;1649;1727;1;Grande Anse (Lorrain);;;;M Oudinot;;1807;1837;1;Nantois (55);;;;M Ozenne;;1745;1745;1;St. Louis Cathedral, New Orleans, Louisiana;;;;M Ozenne;;1806;1806;1;St. Martinville, Louisiana;;;;M Ozenne;Cooper/ Wine and Liqueur Merchant;1699;1743;2;St. Lo, Normandy;;;;M Ozenne;Landowner;1740;1819;1;New Orleans, Louisiana;;;;M Ozier;;1643;1720;1;Saint-Christophe;;;;M Paar;prince;1744;1812;1;;;;;M Pachéco;duc d'Escalona;1563;1615;1;;;;;M de Padilla;;1352;1361;2;;;;;M de Pailley;;1398;1398;1;;;;;M Pain de Thevigne;;1797;1797;1;;;;;M Paintret;;1620;1715;2;Le Pecq, act. Yvelines;;;;M Paletski;prince;1547;1569;2;;;;;M Paléologue;empereur d'Orient;1198;1503;12;;;;;M de Pallant;;1480;1620;4;;;;;M de Palmeira;;1110;1154;1;;;;;M de Panthoufleau;;1524;1524;1;;;;;M Pantin de la Hamelinière;;1256;1270;2;;;;;M Papin;;1626;1682;1;Nantes;;;;M Papin;;1658;1697;1;Cul de sac à vaches;;;;M Papin;;1679;1679;1;Carbet;;;;M Papin L'Epine;;1666;1766;2;Le Lamentin;;;;M Papin L'Epine;;1696;1696;1;Le Prêcheur;;;;M Papin L'Epine;Martinique en 1647;1626;1667;1;Hennebon, Bretagne;;;;M Papin de La Bazodière;;1746;1746;1;Guadeloupe;;;;M Paquot;;1763;1816;1;Virty-en-Perthois;;;;M Parade;Sellier;1809;1809;1;;;;;M Parant;;1778;1778;1;Le Lamentin;;;;M Paravicini;;1741;1741;1;Ajaccio, Corse-du-Sud;;;;M Pardaillan de Gondrin;Marquis de Gondrin;1712;1799;3;;;;;M Pardaillan de Gondrin;duc d' Antin;1665;1757;2;Paris;;;;M Pardaillan de Gondrin;duc d' Antin;1707;1743;1;Versailles;;;;M de Pareds;;1200;1200;1;;;;;M de Paris;comte;808;835;2;;;;;M de Parisot;;1672;1672;1;;;;;M Parr;reine d'Angleterre;1512;1548;1;à Sudeley Castle;;ENG;GBR;M de Parthenay;;1190;1329;12;;;;;M de Parthenay-Soubise;;1554;1631;1;Parc en Poitou;;;;M Pascal;;1766;1847;1;Marseille;;;;M Pascal;Négociant. Président du Tribunal de Commerce;1729;1794;1;Marseille, Saint-Férréol;;;;M Pasquet du Randon;;1754;1766;2;;;;;M Pastoureau;;1630;1630;1;;;;;M de Pastoureau;;1628;1628;1;;;;;M Paul;;1720;1793;2;Marseille;;;;M de Paviot de Nantillois;;1810;1844;1;;;;;M Payen;;1321;1697;3;;;;;M Payen de Montpipeau;;1320;1320;1;;;;;M Pays;;1627;1659;2;Le Lude, Sarthe;;;;M Pecoil de La Villedieu;;1720;1720;1;;;;;M de Pellegars de Malhortie;;1772;1832;1;;;;;M Pellerin de La Touche;;1824;1824;1;;;;;M Pelletier;;1624;1720;3;;;;;M de Pelsez;;1801;1801;1;;;;;M Penicaud;;1470;1831;5;;;;;M Penicaud;;1606;1869;27;Limoges, 87;;;;M Penicaud;;1662;1686;1;St Maurice de la Citte, 87;;;;M Penicaud;;1671;1741;2;Limoges Egl St Maurice, 87;;;;M Penicaud;;1739;1805;2;Limoges;;;;M Penicaud;;1740;1800;1;Limoges , Egl Stmaurice, 87;;;;M Penicaud;;1772;1829;1;Limoges Egl St Etienne, 87;;;;M Penicaud;;1774;1806;1;Limoges ?;;;;M Penicaud;;1808;1808;1;Limoges Egl St Etienne;;;;M Penicaud;;1816;1877;1;Limoges (St Michel), 87;;;;M Penicaud;;1827;1827;1;Limoges Egl St Michel, 87;;;;M Penicaud;;1834;1834;1;Limoges Egl Stmichel, 87;;;;M de Penthièvre;comte;1055;1138;4;;;;;M du Perche;comte;1067;1143;5;;;;;M de Percin;;1820;1848;1;;;;;M Percy;;1198;1500;9;;;;;M de Percy;;1154;1154;1;;;;;M Pereira;;1401;1420;1;Leyria;;;;M Pereira;gouverneur de Trancoso;1225;1225;6;;;;;M Perez de Lara;;1176;1180;2;;;;;M Peri;;1691;1691;1;Sollacaro, Corse-du-Sud;;;;M Pernstein;;1566;1642;1;;;;;M Perriollat;;1698;1714;3;Montrigaud, 26;;;;M Perriollat;;1749;1749;1;Serres, 26;;;;M Perriollat;;1790;1790;1;Chateaudouble, 26;;;;M Perriollat;;1842;1842;1;Rhône;;;;M Perrone di San Martino;;1789;1849;1;;;;;M de Person;;1769;1847;2;;;;;M du Peschin;;1416;1416;1;;;;;M Pesset;Lieutenant 1677.;;;2;;;;;M de Petersdorf;;1624;1705;1;;;;;M Petin;baronne de Bayrstorff;1796;1838;1;;;;;M Petit;;1782;1782;1;Macouba;;;;M Petit;;1803;1803;1;St-Pierre;;;;M de Petit-Montrevault;;1035;1035;1;;;;;M Petitjean Roget;;1810;1836;1;Luneville;;;;M de Peyre;seigneur;;;2;;;;;M Peyronnel;;1658;1739;1;;;;;M de Peñafiel;comte;1269;1381;4;;;;;M Peÿs;seigneur du Mottai;1667;1692;2;;;;;M Pébay;;1760;1826;1;à Baudian;;;;M de Périgord;comte;864;1539;15;;;;;M de Périgord;comte;1140;1205;1;Palestine;;;;M de Pérusse des Cars;;1165;1165;1;;;;;M de Pétrovitch-Niégoch;prince évêque de Monténégro;1735;1830;10;;;;;M Pétry;;1767;1767;1;Rochefort;;;;M Pétry;Chirurgien Major des Troupes martiniquaises, régiment de Halleville;1758;1758;1;Mulhouse;;;;M de Pfirt;;1275;1344;3;;;;;M Phélippeau;;1546;1546;1;;;;;M Phélypeaux de Ponchartrain;;1731;1731;1;;;;;M de Pianezza;marquis;1659;1659;1;;;;;M Piast;duc de Pologne;965;1370;9;;;;POL;M Piast;duc de Pozman;1018;1425;57;;;;;M Piast;reine de Pologne;1288;1335;1;Koniggratz;;;POL;M Piast;roi de Pologne;1257;1296;1;Rogozno;;;POL;M Piast;régente de Hongrie;1305;1380;1;au Château de Buda;;;HUN;M Pic de La Mirandole;;1552;1552;2;;;;;M Picard;;1631;1631;1;;;;;M Picault;;1641;1666;1;Annet en Brie;;;;M Picault;;1711;1711;2;;;;;M Pichery;;1692;1692;1;Le Lamentin;;;;M Pichery;;1724;1724;1;Rivière-Pilote;;;;M Pichery des Gazons;;1763;1763;1;Le Trou-au-Chat;;;;M de Picquigny;;1531;1531;1;;;;;M de Piennes;seigneur de Montaudier;1571;1571;2;;;;;M de Pierre-Buffière;;1335;1335;1;;;;;M de Pierrefitte;;1130;1130;1;;;;;M de Pierrefonds;;1095;1095;1;;;;;M de Pierrepont;comte de Roucy;1205;1251;1;Flandres;;;;M de Pierrepont;comte de Roucy;1260;1304;1;Mons en Pévèle;;;;M de Pierrepont;comte de Roucy;1285;1346;1;Crécy;;;;M de Pierrepont;seigneur de Roucy;1175;1364;8;;;;;M de Pietra Santa;;1723;1723;1;;;;;M de Pietra Santa;;1743;1743;1;Ajaccio, Corse-du-Sud;;;;M Piétresson de Saint-Aubin;;1705;1705;1;;;;;M Pigace;seigneur de Nouzières;1453;1453;2;;;;;M de Pilcza;;1417;1420;2;;;;;M du Pin;;995;1856;142;;;;;M du Pin;seigneur de Saint-Cyr;1692;1741;1;Veyrac (87);;;;M du Pin;seigneur de Saint-Cyr;1760;1790;1;Bonnefond;;;;M du Pin;seigneur des Bâtiments;1701;1762;1;Saint-Saud Coussière, Dordogne;;;;M du Pin de Beyssat;;1839;1839;1;;;;;M du Pin de Verinas;;1699;1699;1;;;;;M du Pin de la Guérivière;vicomte;1789;1874;7;;;;;M de la Pinardière;;1631;1631;1;;;;;M Pinchaut;;1443;1443;1;;;;;M Pinel de La Pahun;;1697;1697;1;;;;;M Pinot;seigneur de Verinas;1647;1655;2;;;;;M de Pisseleu;;1525;1604;3;;;;;M Planck;;1726;1833;3;;;;;M Plantagenêt;;1156;1296;2;Londres;;;;M Plantagenêt;;1360;1415;1;Leicester Castle, Leicestershire, Angleterre;;;;M Plantagenêt;comte de Lancastre;1277;1322;1;Pontefract;;;;M Plantagenêt;comte de Lancastre;1281;1345;1;Grosmont Castle;;;;M Plantagenêt;comtesse d'Ulster;1355;1379;1;;;ULS;GBR;M Plantagenêt;duc de Normandie;1113;1541;67;;;;;M Plantagenêt;reine d'Angleterre;1465;1503;1;à Westminster;;ENG;GBR;M Plantagenêt;roi d'Angleterre;1133;1189;1;Le Mans, France;;ENG;GBR;M Plantagenêt;roi d'Angleterre;1155;1483;11;;;ENG;GBR;M Plantagenêt;roi d'Angleterre;1157;1199;1;Oxford;;ENG;GBR;M Plantagenêt;roi d'Angleterre;1367;1400;1;Bordeaux;;ENG;GBR;M Plantagenêt;roi d'Angleterre;1452;1485;1;Fotheringhay, Northamptonshire;;ENG;GBR;M de Plesse;;1533;1600;1;;;;;M du Plessis;;1511;1653;3;Paris;;;;M du Plessis;;1542;1618;5;;;;;M du Plessis;sire de Richelieu;1548;1590;1;Richelieu;;;;M du Plessis de La Savonnière;;1690;1690;2;;;;;M du Plessis de Richelieu;duc d' Aiguillon;1683;1750;1;Londres;;;;M du Plessis de Richelieu;duc de Richelieu;1629;1715;1;Le Havre de Grace;;;;M du Plessis de Richelieu;duc de Richelieu;1696;1822;3;Paris;;;;M du Plessis-Liancourt;;1611;1659;2;;;;;M Plissonneau;;1660;1679;1;;;;;M Plissonneau;;1697;1697;1;Basse-Pointe;;;;M Plissonneau;Martinique avant 1670;1675;1675;1;Nantes;;;;M Plissonneau Duquesne;;1778;1778;1;Grande Anse (Lorrain);;;;M Plissonneau Duquesne;;1782;1823;1;Fort-St-Pierre;;;;M Plissonneau Duquesne;;1805;1839;1;Le Mouillage (St-Pierre);;;;M Plissonneau La Montagne;;1741;1741;1;Grande Anse (Lorrain);;;;M Plomet;;1669;1669;1;Le Crès;;;;M Plomet;Boulanger;;;1;;;;;M de Plument;seigneur de la Bertraudie;1630;1659;4;;;;;M Pocquet de Puilhery;;1779;1779;1;Trinité;;;;M de Podiebrad;seigneur de Kunstadt;1403;1530;11;;;;;M de Poher;comte;;;1;;;;;M de Poisdebon;;1710;1710;2;;;;;M de Poitiers;duchesse de Valentinois;1499;1566;1;Anet;;;;M de Poitiers;prince d'Antioche;845;1486;6;;;;;M de Poitiers-Valentinois;comte;1125;1343;10;;;;;M de Polanen;héritière de Breda;1392;1445;1;Breda;;;;M de Polanen;seigneur de Breda;1350;1394;1;;;;;M de Polastron;;1749;1793;1;;;;;M Pole;lord Montague;1494;1558;5;;;;;M de la Pole;;1440;1525;6;;;;;M de Polignac;;1223;1847;13;;;;;M de Poligny;;1695;1695;1;;;;;M de Pologne;;1147;1201;2;;;;;M de Polotsk;prince;1239;1239;2;;;;;M de Polovtzy;khan;1318;1318;2;;;;;M de Poméranie;duc;1177;1569;25;;;;;M de Poméranie;duc;1454;1523;1;Stolp;;;;M de Poméranie-Stolp;;1392;1410;1;Bruck;;;;M de Poméranie-Stolp;duc de Poméranie;1316;1393;2;;;;;M de Pomérélie;duc;1219;1313;4;;;;;M de Pommarède d'Auga;;1590;1590;1;;;;;M Ponce de Leon;;1292;1292;2;;;;;M Poncy;;1681;1887;2;;;;;M Poncy;;1726;1726;1;Marseille;;;;M Poncy;;1783;1803;2;St-Pierre;;;;M de Pons;dame de Mareuil;1170;1278;6;;;;;M du Pont;;1270;1270;1;;;;;M de Ponthieu;;795;1387;23;;;;;M de Ponthieu;;1199;1250;1;Compiègne;;;;M de Ponthieu;comte;1142;1191;1;Saint-Jean d'Acre, Israël;;;;M Ponthon;;1230;1347;7;;;;;M de Ponthon;;1560;1849;7;;;;;M de Ponthon;;1772;1835;1;Sarrebourg;;;;M Pontier;;1793;1793;1;Saint-Pierre;;;;M de Pontrohart;dame;1205;1234;1;;;;;M de Pontville;vicomte de Rochechouart;1579;1579;4;;;;;M de Pontville-Rochechouart;;1494;1494;1;;;;;M de Porhoët;comte;1148;1234;3;;;;;M Porry;;1788;1788;1;Marseille;;;;M Porry;;1821;1821;1;Martinique;;;;M Porse;duc de Halland méridional;1327;1330;1;;;;;M Portret;;1751;1816;1;;;;;M Posse;comte;1782;1826;2;;;;;M Potérat de Billy;;1769;1769;2;;;;;M Pothuau;;1752;1752;1;Le Robert;;;;M Pothuau Desgatières;;1748;1748;1;Vauclin;;;;M Pothuau de Luppé;;1783;1783;1;Le Robert;;;;M Potocka;;1616;1642;1;Slutsk, Bielorussie;;;;M Potocka;comtesse;1780;1862;1;;;;;M Potocki;comte;1780;1850;2;;;;;M Potocki;palatin de Braclaw;1568;1631;1;Potok Zloty;;;;M de Pottenstein;;1055;1055;2;;;;;M de Pouancé;;1089;1134;2;;;;;M Pouchkine;Poète;1799;1837;1;Moscou, Russie;;;;M Poullet;;1690;1690;1;Le Carbet;;;;M Poullet;;1722;1722;2;;;;;M Poullet Bellecour;;1753;1753;1;;;;;M Poullet Bellecour;;1780;1787;2;Le Gros-Morne;;;;M Poussard;;1580;1648;2;;;;;M Poutrel;;1641;1758;3;;;;;M de Pouzols;;1675;1675;1;;;;;M Pozzo di Borgo;;1645;1645;5;;;;;M Pozzo di Borgo;;1660;1660;1;Alata, Corse-du-Sud;;;;M de Prades;;1409;1409;1;;;;;M de Presles;;1400;1440;1;;;;;M de Preuilly;;1105;1133;6;;;;;M de Preuilly;;1151;1151;1;Mayenne;;;;M Prévost;;1673;1673;1;Le Pecq, act. Yvelines;;;;M Prévost;;1763;1763;1;;;;;M Prévoteau Le Pelletier du Clary;;1840;1840;1;;;;;M de Prie;dame de Cors;1422;1422;1;;;;;M Prinsault;;1616;1616;1;;;;;M Prinsaut;seigneur de Pleau;1591;1591;2;;;;;M de Prittwitz-Gaffron;;1624;1683;1;Breslau;;;;M Proa de L'Orme;;1764;1848;2;;;;;M de Promnitz;baron;1624;1776;3;Dittersbach;;;;M de Promnitz;comte;1564;1732;4;;;;;M de Prosing;;1631;1692;1;Thurn, Autriche;;;;M de Provence;;1223;1291;1;Amesbury, Wiltshire;;;;M de Provence;comte;1180;1209;1;Palerme, Italie;;;;M de Provence;reine de France;1221;1295;1;Saint-Maime, près Forcalquier;;;FRA;M de Provence;roi;822;1267;32;;;;;M des Prunes du Vivier;;1808;1808;1;;;;;M Przemyslide;;1269;1297;1;Prague;;;;M Przemyslide;;1292;1330;1;Wischehrad;;;;M Przemyslide;duc de Bohême;1005;1336;64;;;;;M Przemyslide;roi de Bohême;1233;1278;1;Dürnkrut, Marchfeld;;;;M Przemyslide;roi de Hongrie;1289;1306;1;;;;HUN;M PucheuILaplace;;1686;1773;1;;;;;M de Puteani;baronne;1787;1787;1;;;;;M de Putelendorf;;1182;1182;1;;;;;M de Putten;;1265;1321;3;;;;;M du Puy du Fou;;1129;1129;1;;;;;M Pyvart;;1644;1686;2;Blois, Loir-et-Cher;;;;M de Pyvart de Chastullé;;1722;1767;3;;;;;M de Querelles;;1808;1846;1;;;;;M de Querfurt;;1386;1521;3;;;;;M Quesmin Desvollieres;;1801;1832;2;Le Lamentin;;;;M Quet;;1616;1616;1;Saint-Bris;;;;M de Quélus;dame;;;1;;;;;M de Raabs;burgrave de Nuremberg;1184;1221;2;;;;;M Rabbe;;1712;1712;1;;;;;M Raby;;1753;1843;5;Limoges, 87;;;;M de Racines;;1565;1565;1;;;;;M Radzivill;hetman de Lithuanie;1480;1551;2;;;;;M Radziwill;prince;1547;1603;1;Kososna;;;;M Radziwill;prince;1579;1620;1;Wilno;;;;M Radziwill;prince;1585;1640;1;Swiadosc;;;;M Radziwill;prince;1612;1655;1;Popiela;;;;M Radziwill;prince;1620;1669;1;Danzig;;;;M Radziwill;prince;1775;1835;1;;;;;M Radziwill;princesse;1640;1695;2;Konigsberg;;;;M Ragnwald;jarl;;;2;;;;;M Ragot;;1508;1508;1;;;;;M Ragueneau;;1680;1680;1;Paris, 75;;;;M de Raigecourt;;1710;1710;1;;;;;M de Ramerupt;comte;1040;1118;3;;;;;M Ramée;;1620;1706;1;;;;;M Ramminger;;1594;1660;2;;;;;M Ramolino;;1644;1743;2;Ajaccio, Corse-du-Sud;;;;M Ramolino;;1686;1836;7;;;;;M Rampont;Originaire de Metz;1660;1742;2;;;;;M Rampont de Surville;;1702;1783;1;Etain (Lorraine);;;;M Rampont de Surville;;1733;1808;1;Fort-Royal;;;;M de Rancon;;1141;1269;9;;;;;M de Randerode;;1350;1415;1;;;;;M de Rantzau;comte;1614;1665;3;;;;;M Ranvier;;1654;1807;3;;;;;M de Rastel;;1623;1623;1;;;;;M Rastelli;;1630;1630;1;Ajaccio, Corse-du-Sud;;;;M de Rath;comtesse de Nienbourg;1669;1740;1;;;;;M Ratineau;seigneur du Moissat;1710;1757;2;;;;;M de Rauglaudre;;1780;1848;1;Sermaize (Marne);;;;M de Rauglaudre;;1837;1837;1;Alliancelles;;;;M de Ravensberg;;1338;1389;1;;;;;M de Ravensbourg;comtesse;1297;1338;1;;;;;M Rayevski;;1641;1641;2;;;;;M Raymond;;1715;1819;2;;;;;M de Raymond;comte;1790;1790;2;;;;;M Razoumovski;comte;1709;1771;1;;;;;M de Razuns;baronne;1432;1477;1;;;;;M de Rechignevoisin;seigneur de Guron;1650;1650;1;;;;;M de Regensbourg;;915;915;1;;;;;M de Regenstein-Blankenbourg;comte;1489;1634;3;;;;;M de Reims;;813;830;2;;;;;M Reinaud;seigneur du Mas-Landrie;1662;1662;2;;;;;M Renault;;1619;1692;2;Le Prêcheur;;;;M de Renialme;;1306;1593;10;;;;;M de Rennes;comte;877;1017;7;;;;;M Renoult;;1720;1762;2;Le François;;;;M Renz;;1588;1779;8;;;;;M de Reuss à Ebersdorf;comte;1662;1779;3;;;;;M de Reuss à Ebersdorf;comtesse;1757;1831;1;Ebersdorf;;;;M de Reuss à Gera;seigneur;1530;1650;6;;;;;M de Reuss à Greiz;;1752;1824;1;Obergreiz;;;;M de Reuss à Greiz;comte;1696;1722;1;Dresde;;;;M de Reuss à Greiz;comte de Reuss à Obergreiz;1722;1800;1;Obergreitz;;;;M de Reuss à Greiz;seigneur;1464;1836;8;;;;;M de Reuss à Koestritz;;1719;1770;1;Kostritz;;;;M de Reuss à Koestritz;;1748;1798;1;Copenhague;;;;M de Reuss à Koestritz;comte;1681;1748;1;Schleiz;;;;M de Reuss à Koestritz;comte;1707;1783;1;Dietersbach;;;;M de Reuss à Koestritz;prince;1753;1841;2;;;;;M de Reuss à Lobenstein;comte;1621;1782;2;;;;;M de Reuss à Obergreiz;;1597;1697;4;;;;;M de Reuss à Schleiz;;1726;1773;1;Staffelstein;;;;M de Reuss à Schleiz;comte;1639;1744;3;Schleiz;;;;M Revault;;1656;1692;1;Le Prêcheur;;;;M Revault;;1700;1770;1;Grande Anse (Lorrain);;;;M de Reventlov;;1711;1779;1;;;;;M de Reventlow;comte;1693;1743;2;;;;;M de Reynal de Saint-Michel;;1771;1771;1;Grande Anse (Lorrain);;;;M de Reynal de Saint-Michel;;1772;1883;21;;;;;M Reynaud d'Alleins;;1768;1768;1;;;;;M de Reynel;;1182;1231;7;;;;;M Reynoird;;1779;1779;1;Marseille;;;;M Reynoird;;1826;1826;1;;;;;M Rémi;;1689;1689;1;;;;;M de Rémy;;1640;1640;1;;;;;M de Réthel;;1135;1325;13;;;;;M Rézard de Wouves;;1771;1802;2;Le François;;;;M von Rhau;;1711;1748;1;;;;;M de Rheineck;;1176;1176;1;Jerusalem;;;;M de Rheineck;;1475;1543;1;;;;;M de Rheinfelden;;1053;1061;4;;;;;M de Rheinfelden;roi des Romains;1030;1080;1;Hohenmölsen;;;;M de Rheingau;;960;960;1;;;;;M de Rheingelheim;reine de Germanie;890;968;1;Westphalie;;;;M Rhédey;comtesse de Hohenstein;1812;1841;2;;;;;M Ribadeau;;1630;1803;5;;;;;M Ribadeau du Mas;;1761;1799;1;;;;;M de Ribagorce;;960;960;2;;;;;M Ribbing;;1597;1662;2;;;;;M de Ribeaupierre;comte;1598;1673;1;Rappoltsweiler;;;;M de Ribeaupierre;seigneur;1495;1683;4;;;;;M Richard de Saint-Priest;;1488;1488;2;;;;;M de Richemont;comte;1137;1201;4;;;;;M de la Rie;seigneur;1553;1594;2;;;;;M de Riedenbourg;burgrave de Ratisbonne;1121;1121;2;;;;;M Riedesel;;1771;1805;1;;;;;M de Rieneck;;1460;1525;2;;;;;M de Rietberg;comte;1405;1540;4;;;;;M de Rieux;;1463;1570;4;;;;;M Rimbaud;;1773;1773;1;Marseille;;;;M Rimbaud;;1802;1802;1;Martinique;;;;M de Ringelheim;;897;897;1;;;;;M de Riom;comte;1692;1741;1;;;;;M de Rion;dame de Gergy;1221;1221;1;;;;;M Riou;;1777;1777;1;Rennes (St Etienne);;;;M de la Rivière;seigneur du Peschin;1500;1500;3;;;;;M Robelot;;1668;1668;1;;;;;M Robertien;;892;1005;7;;;;;M Robertien;duc de Neustrie;820;866;1;à Brissarthe, Maine-et-Loire;;;;M Robertien;duc des Francs;897;956;1;Paris;;;;M Robertien;roi de France;864;898;1;;;;FRA;M Robertien;roi de France;866;923;1;Soissons;;;FRA;M Robineau;;1565;1565;1;Mailly-lechateau, 89;;;;M Robineau;;1642;1699;1;Paris, 75;;;;M Robineau;;1642;1764;3;;;;;M Robineau;;1668;1687;1;Escolives, 89;;;;M Robineau;;1691;1762;1;Bellombre, 89;;;;M Robineau;;1725;1823;2;Mailly le Chateau, 89;;;;M de Robineau;seigneur de Gajoubert;1733;1733;2;;;;;M Robinet;;1766;1766;1;;;;;M Roblot;;1662;1775;2;Le Diamant;;;;M Roby;;1686;1686;1;St Maurice de la Citte, 87;;;;M Roche;;1848;1848;1;West Twyford, Midx;;;;M de la Roche;duc d'Athènes;1275;1275;1;;;;GRC;M de Rochechouart;duc de Mortemart;1636;1812;5;Paris;;;;M de Rochechouart;duc de Mortemart;1681;1746;1;Soisy sous Etiolles;;;;M de Rochechouart;duc de Mortemart;1682;1757;1;Bayeux;;;;M de Rochechouart;vicomte;1000;1839;38;;;;;M de Rochechouart;vicomte;1305;1356;1;Maupertuis, Vienne, France;;;;M de Rochechouart Pontville;;1634;1711;3;;;;;M de Rochefort;vicomte de Donges;1076;1327;11;;;;;M des Roches;sénéchal d'Anjou;1165;1220;3;;;;;M de Rodemachern;;1450;1500;1;;;;;M de Rodenmachern;;1445;1480;1;;;;;M de Rodez;comte;1090;1313;7;;;;;M de Rodez;comte;1175;1221;1;Saint-Jean d'Acre, Israël;;;;M Rodis von Thunderfeldt;comtesse de Thunderfeldt;1777;1822;2;;;;;M Rodriguez de Vivar;;1103;1103;1;;;;;M de Rogendorf;;1579;1650;1;;;;;M de Rohan;;1804;1846;1;Bruxelles;;;;M de Rohan;duc;1579;1638;1;Chateau de Blain;;;;M de Rohan;duc de Montbazon;1655;1727;1;chateau de Rochefort en Yveline;;;;M de Rohan;duc de Montbazon;1688;1757;1;chateau de Sainte-Maure;;;;M de Rohan;duc de Montbazon;1764;1836;1;Versailles;;;;M de Rohan;prince de Guemene;1633;1699;1;Coupvray;;;;M de Rohan;princesse de Maubuisson;1646;1839;6;Paris;;;;M de Rohan;vicomte;1308;1352;1;Moron;;;;M de Rohan;vicomte;1550;1607;2;Blain;;;;M de Rohan;vicomte de Porhoet;1066;1843;45;;;;;M de Rohan-Chabot;dame de Soubise;1648;1709;1;;;;;M de Rohan-Chabot;duc de Rohan;1652;1738;2;Paris;;;;M de Rohan-Chabot;duc de Rohan;1710;1791;1;Nice;;;;M Roibet;;1749;1749;1;Serres, 26;;;;M Roignan;;1776;1776;1;Le Mouillage (St-Pierre);;;;M Roignan;;1807;1807;1;Saint-Pierre (Le Mouillage);;;;M Roland;;1760;1816;1;;;;;M Romanet;;1699;1725;1;Ste-Marie;;;;M Romanet;;1700;1723;1;Le Marigot;;;;M Romanet;;1705;1705;1;Limogeseglstmaurice G.G.94;;;;M de Romano;;1240;1251;2;;;;;M Romanov;;1543;1740;17;;;;;M Romanov;impératrice de Russie;1709;1762;1;à Kolomenskoïe;;;;M Romanov;régente de Russie;1657;1725;2;Moscou;;;;M Romanov-Holstein-Gottorp;;1783;1801;1;Saint-Pétersbourg;;;;M Romanov-Holstein-Gottorp;;1784;1803;1;St. Petersburg;;;;M Romanov-Holstein-Gottorp;empereur de Russie;1728;1865;10;;;;;M Romanov-Holstein-Gottorp;grande-duchesse de Russie;1819;1876;1;Tsarkoe Selo (Russie);;;;M de Roncherolles;;1739;1739;1;;;;;M de Ronsard;Poète;1524;1585;1;Couture;;;;M de Ronsard;seigneur de La Possonnière;1485;1544;5;;;;;M de Roquefeuil;comptor de Nant;1150;1331;8;;;;;M de Roquelaure;;1601;1708;2;;;;;M Ros;lord;1362;1362;3;;;;;M de Rosenberg;seigneur;1316;1595;2;;;;;M de Rosenfeld;;1495;1538;1;;;;;M de Rosenthal;seigneur;1425;1475;2;;;;;M de Rosoy;;1171;1171;3;;;;;M de Ross;comte;1355;1387;3;;;;;M Rossignol;;1645;1713;1;St-Christophe;;;;M de Rostov;;1294;1297;5;;;;;M de Rostrenen;;1270;1371;2;;;;;M de Rotselaar;;1405;1460;1;;;;;M de Rott;;1078;1078;1;;;;;M de Roucy;;1388;1415;1;Azincourt;;;;M de Roucy;;1406;1459;1;St-Etienne de Dreux;;;;M de Roucy;;1538;1576;1;Siiege de Soissons;;;;M de Roucy;;1579;1590;1;Chartres;;;;M de Roucy;;1747;1819;1;St Michel en Thiierache;;;;M de Roucy;;1781;1847;1;Paris, 75;;;;M de Roucy;;1783;1847;1;Noyon, 60;;;;M de Roucy;comte;926;1815;23;;;;;M de Roucy;comte;951;990;1;Reims;;;;M de Roucy;dame de Conti;1535;1564;1;Condé en Brie, Aisne, France;;;;M de Roucy-Monceau;;1677;1749;2;Monceau;;;;M de Roucy-Origny;;1648;1692;2;;;;;M de Roucy-Ramerup;comte de Roucy;1196;1200;2;;;;;M de Roucy-Sainte Preuve;;1580;1640;1;;;;;M de Rouergue;comtesse d'Agen;830;985;14;;;;;M Rouet;;1350;1403;1;Lincoln, Lincolnshire, Angleterre;;;;M de Rougemont;;1310;1350;1;;;;;M Rouillon;;1692;1692;1;;;;;M Roullays;;1546;1570;2;;;;;M Roussane;;1753;1753;1;Le Vauclin;;;;M Rousseau;;1715;1715;1;Macouba;;;;M Rousseau;;1783;1783;1;St-Pierre;;;;M de Rouveroy;;1420;1465;1;;;;;M de Rouvrois;;1728;1774;1;;;;;M de Rouvrois;duc de Saint-Simon;1698;1746;1;en son hotel parisien;;;;M Roux;;1690;1784;4;;;;;M della Rovere;;1622;1694;2;;;;;M Roy;;1677;1677;1;Case-Pilote;;;;M Roy;;1698;1707;2;;;;;M Roy Camille;;1798;1798;1;Le Gros-Morne;;;;M Roy de Belleville;;1849;1849;1;;;;;M Royer;;1545;1545;2;;;;;M Royer;;1647;1691;1;Rennes;;;;M Royer;;1675;1692;1;Le Prêcheur;;;;M de Rubempré;dame;1505;1730;2;;;;;M Rueb;;1535;1574;1;;;;;M de Ruellan;;1621;1621;1;;;;;M Ruffo;duchesse de Sessa;1434;1434;2;;;;;M Ruire;;1768;1768;1;Le Trou-au-Chat;;;;M de Rumigny;seigneur;1050;1648;16;;;;;M de Runkel;comte d'Isenburg-Wied;1400;1502;2;;;;;M Rurikide;;1024;1075;1;Reims;;;;M Rurikide;grand-duc de Kiev;1043;1598;116;;;;;M Russel;duc de Bedford;1766;1905;3;;;;;M de Russel;;1688;1688;1;;;;;M de Ryazan;grand-duc;1464;1483;1;;;;;M de Rye;marquis de Varambon;1597;1598;1;;;;;M de Rye-Varax;comte de Varax;1540;1666;3;;;;;M Rügen;duc de Rügen;1272;1272;2;;;;;M de Rügen;duc;1195;1312;4;;;;;M de Saale;;1522;1566;1;;;;;M de Saarwerden;;1350;1420;1;;;;;M de Sablé;;1035;1210;7;;;;;M Sabouraud;seigneur de Lage-Pariole;1614;1614;1;;;;;M Sabourov;;1505;1571;4;;;;;M Sabran;;1297;1315;1;;;;;M de Sabran;comtesse de Gap;1178;1215;4;;;;;M de Saffenberg;;1136;1216;2;;;;;M de Sagan;duc;1363;1390;2;;;;;M Saint John;;1672;1672;1;;;;;M de Saint-Amadour;vicomtesse de Guiguen;1580;1580;2;;;;;M de Saint-Avit;;1475;1475;1;;;;;M de Saint-Bris;;1115;1115;1;;;;;M de Saint-Jean;;1728;1809;1;Boëol-Bezing, France;;;;M de Saint-Julien;;1415;1415;1;;;;;M de Saint-Martin;seigneur de Bagnac;1482;1482;2;;;;;M de Saint-Mesmin;;1506;1531;2;;;;;M de Saint-Omer;;1064;1278;3;;;;;M de Saint-Ouen de Hausselaire;;1664;1664;1;Saint-Saens;;;;M de Saint-Ours;;1710;1710;1;;;;;M de Saint-Ours;chevalier;1717;1759;1;Montréal;;;;M de Saint-Ours-L'Échaillon;chevalier;1787;1787;1;;;;;M de Saint-Palais;;1497;1497;1;;;;;M de Saint-Pol;comte;1130;1232;9;;;;;M de Saint-Pol;comte;1150;1205;1;Palestine;;;;M de Saint-Séverin;;1335;1335;1;;;;;M de Saint-Valéry;;1043;1250;8;;;;;M de Saint-Verrain;;1304;1304;2;;;;;M de Sainte-Croix;;1299;1299;2;;;;;M de Sainte-Maure;seigneur;1255;1664;5;;;;;M Saintmartin;;1814;1883;1;Périgueux;;;;M Saintmartin;;1843;1843;1;;;;;M de Salerne;;1058;1058;1;;;;;M de Salignac;;1464;1464;4;;;;;M de Salisbury;;1143;1143;1;Pembroke Pembrokeshire, Pays de Galles;;;;M des Salles de Boismarcel;;1789;1836;1;;;;;M de Salligny;;1798;1879;1;Reims;;;;M de Salligny;seigneur de Matignicourt;1759;1806;5;;;;;M à Salm;;1687;1700;1;;;;;M de Salm;comte;1189;1627;24;;;;;M de Salm-Dhaun;comte;1645;1791;2;Dhaun;;;;M de Salm-Dhaun;comte de Salm;1492;1733;8;;;;;M de Salm-Kyrbourg;comte;1529;1657;6;;;;;M de Salm-Kyrbourg;comte de Salm;1545;1673;3;Kyrbourg;;;;M de Salm-Kyrburg;Princesse;1760;1841;1;Paris;;;;M de Salm-Neufville;;1547;1673;6;;;;;M de Salm-Refferscheid;comte;1623;1688;2;;;;;M Salovoï;;1575;1575;2;;;;;M de Saluces;marquis;1129;1244;5;;;;;M de Saluzzo;;1431;1474;1;;;;;M Salvetto-Salvetti;;1845;1845;1;;;;;M Salviati;;1461;1543;2;;;;;M de San-Severino;;1343;1343;2;;;;;M de Sandoval;duc de Lerma;;;2;;;;;M Sandoz;;1455;1533;1;Le Locle, Neuchatel, Switzerland;;;;M Sandoz;;1489;1846;6;;;;;M Sandoz;;1630;1877;7;Dombresson, Neuchatel, Switzerland;;;;M Sandoz;;1740;1740;1;Switzerland;;;;M Sandoz;;1842;1842;1;St. Martinville,Louisiana;;;;M Sandoz;;;;1;1560;;;;M Sanson du Loisel;;1777;1836;1;Noyon Rue du Nord;;;;M Saravie-Saint-Marc;;1747;1784;1;;;;;M Saravie-Saint-Marc;;1760;1830;1;à Bordeaux (Gironde);;;;M Saravy;;1697;1697;1;;;;;M Sarrazin;;1839;1839;1;;;;;M de Sarrebruck;;1120;1460;5;;;;;M de Sarrebruck;;1344;1344;1;siiege d'Arras;;;;M de Sarrebrück;comte;1135;1147;2;;;;;M de Sassenage;dame de Beaumont;1449;1471;2;;;;;M Sauerma de Jeltsch;;1663;1708;1;Laskowitz;;;;M Sauerma de Jeltsch;baron de Jeltsch;1600;1664;1;Jeltsch;;;;M Saulger de Saint-Maurice;;1718;1718;2;;;;;M Saulger de Saint-Maurice;;1765;1786;2;Le Lamentin;;;;M Saulger de Saint-Maurice;;1829;1829;1;Fort-Royal;;;;M de Saulx-Tavannes;;1587;1587;1;;;;;M Saunders;;1588;1588;1;;;;;M Sauvage;;1556;1556;1;;;;;M de Sauzay;;1643;1643;1;;;;;M de Savary de Bresse;;1792;1792;1;;;;;M Savatte;;1666;1666;1;;;;;M de Savoie;;1100;1154;1;Abbaye de Montmartre;;;;M de Savoie;;1298;1336;1;Brabant;;;;M de Savoie;;1532;1568;1;Fontainebleau;;;;M de Savoie;;1792;1840;1;Turin;;;;M de Savoie;comte;1334;1451;2;Chambéry;;;;M de Savoie;comte en Savoie;980;1836;116;;;;;M de Savoie;marquis de Villars;1580;1580;1;Paris;;;;M de Savoie;reine d'Espagne;1688;1714;1;;;;ESP;M de Savoie;reine de France;1439;1483;1;;;;FRA;M de Savoie-Achaïe;prince d'Achaïe;1278;1418;5;;;;;M de Savoie-Carignan;;1800;1856;1;Paris;;;;M de Savoie-Carignan;prince de Carignan;1596;1849;25;;;;;M de Savoie-Nemours;reine de Portugal;1646;1683;1;;;;PRT;M de Savoie-Vaud;duc;1503;1511;2;;;;;M de Savoie-Villars;marquise de Villars;1560;1611;1;Soissons;;;;M de Savone;;1020;1118;2;;;;;M Savy de La Chaume;;1766;1766;2;;;;;M de Saxe;;1071;1126;1;Altdorf, Allemagne;;;;M de Saxe;duc;845;1777;44;;;;;M de Saxe;duc;995;1059;1;Lunebourg, Allemagne;;;;M de Saxe-Altenbourg;duc de Saxe-Hildburghausen;1763;1854;4;;;;;M de Saxe-Cobourg;;1817;1817;1;Esher, Surrey, Angleterre;;;;M de Saxe-Cobourg;duc de Brabant;1833;1834;1;;;;;M de Saxe-Cobourg;roi des Belges;1790;1865;1;Cobourg;;;BEL;M de Saxe-Cobourg-et-Gotha;duc;1784;1844;1;;;;;M de Saxe-Hildburghausen;;1760;1776;1;Hildburghausen;;;;M de Saxe-Hildburghausen;duc;1655;1780;5;;;;;M de Saxe-Lauenbourg;;1513;1535;1;Stockholm, Suède;;;;M de Saxe-Lauenbourg;duc;1246;1733;20;;;;;M de Saxe-Meiningen;duc;1649;1849;7;;;;;M de Saxe-Weimar-Eisenach;duc;1688;1828;4;;;;;M de Saxe-Weimar-Eisenach;duchesse en Saxe;1786;1816;1;Weimar;;;;M de Say;dame de Clun;;;1;;;;;M de Sayn-Hachenbourg;comte;1417;1609;10;;;;;M de Sayn-Hombourg;comte de Sayn-Wittgenstein;1400;1570;3;;;;;M de Sayn-Wittgenstein;;1561;1631;2;Berlebourg;;;;M de Sayn-Wittgenstein;;1585;1633;1;Dillenbourg;;;;M de Sayn-Wittgenstein;;1639;1671;1;Wertheim;;;;M de Sayn-Wittgenstein;comte;1532;1701;13;;;;;M de Sayn-Wittgenstein;comte;1569;1656;2;Weilbourg;;;;M de Sayn-Wittgenstein;comtesse de Sayn-Wittgenstein-Hombourg;1646;1678;1;Hombourg;;;;M de la Scala;;1325;1384;1;;;;;M de Scharffenstein;;1629;1680;1;Mainz;;;;M de Schaumbourg-Lippe;comte;1694;1777;1;Alverdissen;;;;M de Schaumbourg-Lippe;comte;1723;1787;1;Rinteln;;;;M von Scheel;;1778;1836;1;;;;;M Schenk de Landsberg;;1510;1568;2;;;;;M de Schertz;;1633;1690;1;Bukovine;;;;M Schikhardt;;1755;1833;1;;;;;M de Schlabrendorf;;1773;1773;1;Breslau;;;;M de Schlabrendorf;;1799;1799;1;;;;;M de Schleswig-Holstein-Glücksbourg;princesse;1749;1812;1;;;;;M Schlick de Passau;;1475;1538;1;;;;;M de Schlieben;comte;1688;1827;3;;;;;M de Schomberg;;1653;1706;1;;;;;M de Schonbourg-Glauchau;seigneur;1456;1606;4;;;;;M de Schonbourg-Glauchau;seigneur;1486;1534;1;Dresde;;;;M de Schonbourg-Glauchau;seigneur;1532;1581;1;Glauchau;;;;M de Schonbourg-Lichtenstein;comte;1601;1664;2;;;;;M de Schonbourg-Penig;seigneur de Schonbourg-Glauchau;1556;1625;2;Penig;;;;M de Schonbourg-Waldenbourg;seigneur;1530;1566;1;Glaucha;;;;M de Schonbourg-Waldenbourg;seigneur;1559;1606;1;Waldenbourg;;;;M de Schonbourg-Waldenbourg;seigneur;1563;1809;5;;;;;M de Schonfeld;;1644;1681;1;;;;;M Schuebel;;1606;1689;2;;;;;M Schuepper;;1627;1688;1;;;;;M Schuler;;1550;1666;3;;;;;M de Schwamberg;;1599;1648;1;;;;;M de Schwarzbourg;;1416;1539;3;;;;;M de Schwarzbourg-Blankenbourg;comte;1418;1612;13;;;;;M de Schwarzbourg-Rudolstadt;comte;1537;1708;17;;;;;M de Schwarzbourg-Rudolstadt;prince;1641;1718;2;Rudolstadt;;;;M de Schwarzbourg-Rudolstadt;princesse;1700;1780;1;Rathsfeld;;;;M de Schwarzbourg-Sondershausen;comte;1532;1700;17;;;;;M de Schwarzbourg-Sondershausen;prince;1647;1849;2;Sondershausen;;;;M de Schwarzbourg-Sondershausen;prince;1738;1806;1;Ebeleben;;;;M de Schwarzbourg-Sondershausen;princesse;1681;1751;1;Schwarzbourg;;;;M de Schwarzenberg;prince;1741;1782;1;;;;;M de Schweidnitz;duc;1286;1320;2;;;;;M de Schweinfurt;;1017;1058;6;;;;;M Schweppenhauser;;1751;1833;1;;;;;M de Schwerin;comte;1359;1377;2;;;;;M de Scorailles;;1145;1254;4;;;;;M Scott;duc de Monmouth;1649;1685;2;;;;;M Segrave;lord;1338;1353;1;;;;;M de Segrie;dame de Morainville;1436;1490;2;;;;;M Seitz;;1768;1812;1;Darmstadt;;;;M Senamaud;;1622;1622;1;;;;;M Senaude;;1632;1632;1;Calais;;;;M de Sens;;908;1024;7;;;;;M de Serbie;prince;1129;1129;2;;;;;M Seton Montgomerie;comte d'Eglintoun;1660;1729;1;Eglintoun;;;;M Seton Montgomerie;lady;1694;1757;1;;;;;M Sevin;;1654;1694;2;;;;;M Seymour;baron Seymour de Sudeley;1508;1549;1;à Londres;;;;M Seymour;duc de Somerset;1476;1801;7;;;;;M Seymour;protecteur d'Angleterre;1500;1552;1;à Londres;;ENG;GBR;M Seymour;reine d'Angleterre;1509;1537;1;à Hampton Court;;ENG;GBR;M Séguier;;1641;1704;3;;;;;M de Sémur;seigneur;955;1109;3;;;;;M de Séran;;1565;1565;2;;;;;M de Séverac;;1115;1181;1;Montpellier;;;;M Sforza;;1465;1510;2;Milan;;;;M Sforza;;1495;1558;1;Bari;;;;M Sforza;comte de Pesaro;1369;1535;13;;;;;M Sforza;duc de Bari;1452;1508;1;Vigevano;;;;M Sforza;duc de Milan;1401;1466;1;à San Miniato;;;;M Sforza;duc de Milan;1444;1476;1;Milan, Italie;;;;M Sibié;;1815;1815;1;;;;;M Sicaire Migot de Blanzac;;1751;1751;1;;;;;M Sieber;;1640;1714;1;;;;;M Sigalony;;1650;1701;1;Provence;;;;M Sigalony;;1700;1700;1;Macouba;;;;M de Signau;;1325;1325;1;;;;;M de Silésie-Schweidnitz;;1339;1362;1;;;;;M de Silly;comtesse de Rochefort;1536;1536;1;;;;;M Siméonis;;1730;1771;1;Marseille;;;;M Siméonis;Notaire Royal à Marseille.;;;2;;;;;M de Simmern;;1561;1589;1;Heidelberg, Allemagne;;;;M de Simmern;princesse palatine;1618;1680;1;à Heidelberg;;;;M de Simmern;princesse palatine de Bavière;1454;1730;30;;;;;M Simonnet;;1722;1722;2;;;;;M Sinclair;comte d'Orkney;;;2;;;;;M Sinson;;1829;1829;1;Fort-Royal;;;;M Sinson Sainville;;1792;1792;1;Case-Pilote;;;;M de Sirck;;1452;1452;1;;;;;M de Sirck-Moncler;;1435;1489;1;;;;;M Siredey;;1758;1758;1;;;;;M de Sirk;;1437;1520;1;;;;;M Sisos;;1831;1831;1;;;;;M de Sisteron;;1001;1024;2;;;;;M de Sivrieu;;1511;1511;1;Paris;;;;M Skakke;roi de Norvège;1136;1184;2;;;;;M Skavronski;;1680;1680;1;Jacobstadt;;;;M Skavronski;impératrice de Russie;1684;1727;1;;;;;M Skule;;1225;1270;2;;;;;M de Smaland;;1302;1302;1;;;;;M Smith;;1765;1836;1;;;;;M de Smolensk;prince;1221;1422;6;;;;;M Smythe;;1756;1837;1;;;;;M Sobakine;;1571;1571;2;;;;;M Sobieska;;1702;1740;2;;;;;M Sobieski;;1580;1737;3;;;;;M Sobieski;roi de Pologne;1624;1696;1;;;;POL;M de Soissons;;1058;1073;2;;;;;M de Solms;comte;1340;1433;2;;;;;M de Solms-Baruth;comte;1627;1847;2;;;;;M de Solms-Baruth;comte;1670;1800;3;Baruth;;;;M de Solms-Braunfels;;1426;1814;14;;;;;M de Solms-Braunfels;;1602;1675;1;Braunfels;;;;M de Solms-Braunfels;comte;1563;1623;1;La Hague;;;;M de Solms-Hohensolms;;1545;1689;3;;;;;M de Solms-Laubach;;1579;1631;1;Laubach;;;;M de Solms-Laubach;comte;1521;1783;24;;;;;M de Solms-Lich;;1420;1594;7;;;;;M de Solms-Neubourg;comte;1608;1663;2;;;;;M de Solms-Rodelheim;comte;1623;1680;1;Baruth;;;;M de Solms-Rodelheim;comte;1664;1765;2;Rodelheim;;;;M de Solms-Rodelheim et Assenheim;contesse;;;1;;;;;M de Solms-Sonnenwalde;comtesse;1672;1708;1;;;;;M Soltykov;;1664;1724;2;;;;;M de Sombreffe-Kerpen;;1489;1518;1;;;;;M Somerset;;1713;1726;1;;;;;M Somis;;1737;1815;1;St. Ferreol, Marseille, France;;;;M de Sommerschenbourg;comte palatin;1182;1189;2;;;;;M de Sonnenberg;;1430;1480;1;;;;;M de Sons;;1699;1744;1;;;;;M Sorba;;1644;1644;1;Ajaccio, Corse-du-Sud;;;;M Sorhaindo;;1741;1741;1;Grande Anse (Lorrain);;;;M de Sortambosc;seigneur de Sainte-Marguerite;1627;1627;2;;;;;M de Souabe;;849;1050;19;;;;;M de Soubernon;;1249;1249;1;;;;;M Soueff;;1609;1609;1;Saint-Malo;;;;M de Soulz;;1495;1625;4;;;;;M de Soulzbach;comte;1078;1799;15;;;;;M de Soulzbach;comte palatin;1622;1733;2;Soulzbach;;;;M de Soulzbach;comtesse palatine;1650;1681;1;Schlackenworth;;;;M de Sousa;;1250;1250;2;;;;;M Souvain;;1361;1361;2;;;;;M de Souvigny;;1107;1107;1;;;;;M de Souvigny Sur Jaligny;;1082;1082;1;;;;;M de Souzdal;;1366;1407;1;;;;;M de Spangen;baron;1638;1735;3;;;;;M de Spangen-d'Uyternesse;comte;1715;1826;2;;;;;M de Spangen-d'Uyternesse;comtesse;1797;1845;1;Bruxelles;;;;M de Spanheim;;1150;1200;1;;;;;M de Spanheim-Heinsberg;;1280;1343;1;;;;;M Spencer;;1588;1615;13;;;;;M Spencer;;1737;1771;1;St.George's Hanover Square;;;;M Spencer;;1781;1781;1;London;;;;M Spinola;seigneur de Molfetta;1641;1709;3;;;;;M de Spinuzzi;comte;1741;1792;2;;;;;M de Spolete;;829;851;2;;;;;M von Sponeck;;1730;1804;1;Stuttgart;;;;M de Sponheim;;1268;1340;4;;;;;M de Stade;;955;1011;2;;;;;M de Staden;comte;1144;1152;2;;;;;M de Stafford;lord;1349;1563;12;;;;;M de Stahleck;comte palatin du Rhin;1127;1156;1;;;;;M de Stainville;;1500;1571;1;;;;;M Stanley;comte de Derby;1504;1504;1;;;;;M de Staritsa;duc;1560;1597;2;;;;;M de Starodoub;prince;1403;1403;2;;;;;M de Staufen;;1252;1600;3;;;;;M Stehlin;;1574;1597;1;;;;;M de Stein-Liebenstein;;1777;1849;1;;;;;M Stenbock;;1535;1621;1;Torpa, Västergötland, Suède;;;;M de Sternberg;seigneur;1425;1809;4;;;;;M Stewart;;1204;1788;16;;;;;M Stewart;;1298;1298;1;Falkirk, Écosse;;;;M Stewart;;1333;1333;1;Halidon Hill, Northumberland, Angleterre;;;;M Stewart;;1392;1429;1;Orléans, France;;;;M Stewart;;1575;1615;1;a la tour de Londres;;;;M Stewart;comte de Galloway;1694;1746;1;Glasserton;;;;M Stewart;comte de Galloway;1694;1773;1;Edimbourg;;;;M Stewart;comte de Lennox;1513;1513;1;Flodden, Northumberland, Angleterre;;;;M Stewart;lady;1759;1762;1;Aboyne Castle;;;;M Stockmayer;;1706;1788;3;;;;;M Stokes;;1554;1581;1;;;;;M de Stolberg;comte;1396;1520;3;;;;;M de Stolberg-Gedern;prince;1693;1796;2;Gedern;;;;M de Stolberg-Gedern;prince;1722;1834;4;;;;;M de Stolberg-Wernigerode;;1506;1580;1;Stolberg;;;;M de Stolberg-Wernigerode;;1531;1599;1;Breuberg;;;;M de Stolberg-Wernigerode;;1599;1634;1;Landau;;;;M de Stolberg-Wernigerode;comte;1467;1854;15;;;;;M Strechniev;;1608;1645;2;;;;;M de Strijen;;1250;1273;1;;;;;M Stuart;;1433;1480;1;Dunfermline, Écosse;;;;M Stuart;comte de Lennox;1516;1571;1;Château de Stirling, Écosse;;;;M Stuart;duc d'Albany;1340;1807;31;;;;;M Stuart;duc d'Albany;1541;1541;1;chateau de Falkland;;;;M Stuart;duc d'Albany;1545;1567;1;Temple Newsome;;;;M Stuart;duc de Rothesay;1540;1541;1;Saint-Andrews;;;;M Stuart;duchesse d'Orléans;1644;1670;1;;;;FRA;M Stuart;reine d'Angleterre;1665;1714;1;Saint James Palace;;ENG;GBR;M Stuart;reine d'Écosse;1542;1587;1;chateau de Linlithgow;;SCT;GBR;M Stuart;roi d'Angleterre;1566;1694;6;;;ENG;GBR;M Stuart;roi d'Angleterre;1633;1701;1;Londres;;ENG;GBR;M Stuart;roi d'Écosse;1337;1406;1;à Strathclyde;;SCT;GBR;M Stuart;roi d'Écosse;1452;1488;1;Stirling;;SCT;GBR;M Stuart;roi d'Écosse;1512;1542;1;Linlithgow palace;;SCT;GBR;M Stuart;sénéchal d'Écosse;1292;1513;5;;;SCT;GBR;M Stuve;;1472;1472;2;;;;;M Stuve;régent de Suède;1440;1503;1;;;;SWE;M de Sualefeld;;984;984;1;;;;;M Sudro;;1762;1762;1;Fort-Royal;;;;M de Suède;;1095;1254;11;;;;;M de Suède;roi;1066;1250;16;;;;SWE;M de Sully;;1252;1285;1;Aragon;;;;M de Sully;seigneur;1080;1499;25;;;;;M de Sully;seigneur de la Chapelle;1224;1269;1;Italie;;;;M Sune;;1243;1253;1;;;;;M de Supplinbourg;comte;1075;1143;3;;;;;M de Surgères;dame d'Aulnay;1175;1493;5;;;;;M de Sutherland;comte;1345;1370;1;;;;;M de Suze;;1007;1091;3;;;;;M de Swabie;;1146;1146;1;;;;;M de Swidnica;duc;1290;1326;1;;;;;M Swinford;;1366;1366;1;;;;;M Taets;;1395;1565;4;;;;;M de Taillebourg;;1147;1147;2;;;;;M Taillevis;;1510;1545;2;;;;;M Taingault;;1653;1653;3;;;;;M Talbot;;1416;1419;1;;;;;M Talma;;1737;1737;1;;;;;M de Taroja;;1180;1180;1;;;;;M de Tartas;vicomte;1135;1230;3;;;;;M Tartenson;;;;1;Anses d'Arlet;;;;M Tartenson;Chirurgien à Saint-Christophe 1664;;;1;Senez, Basses Alpes;;;;M Tartenson des Ruisseaux;;1704;1770;1;Trinité;;;;M Tartenson des Ruisseaux;;1782;1853;1;Martinique;;;;M Tartenson des Ruisseaux;;1788;1788;1;Trinité, Martinique;;;;M Tascher;;1462;1462;3;;;;;M de Tascher;seigneur de La Pagerie;1552;1552;1;;;;;M Tascher de La Pagerie;;1565;1839;12;;;;;M Tascher de La Pagerie;;1763;1814;1;Trois-Ilets, Martinique;;;;M Tascher de La Pagerie;écuyer;1735;1790;1;Le Carbet, Martinique;;;;M Tasse;;1587;1652;1;;;;;M de Tattenbach;;1675;1714;1;Geilsdorf;;;;M de Tattenbach;comte;1621;1693;1;Geilsddorf;;;;M Taveau;;1509;1509;1;;;;;M Taveau de Laubuge;;1643;1643;1;;;;;M de Taxis;;1560;1628;3;;;;;M de Tecklenbourg;;1453;1557;4;;;;;M de Tecklenbourg-Lingen;;1532;1582;1;;;;;M Teles de Meneses;reine de Portugal;1371;1386;1;Trás-os-Montes;;;PRT;M Telles de Meneses;;1225;1225;1;;;;;M Tellez de Meneses;dame de Montealegre;1246;1246;2;;;;;M de Tende;duchesse de Milan;1372;1418;1;Tende;;;;M de Tengling;comtesse;;;1;;;;;M Tenremonde;héritière de Tenremonde;1185;1224;2;;;;;M Tercy;;1712;1712;1;;;;;M de Teschen;duc;1306;1317;3;;;;;M Testelin;;1456;1513;1;;;;;M Texier;vicomte d'Hautefeuille;1738;1809;1;;;;;M Texier de Lafont;seigneur de Lafont;1689;1714;2;;;;;M de Teyssières;;1756;1836;1;;;;;M de Teyssières de Bellechize;;1757;1806;1;;;;;M de Teyssières de Mas de Champ;;1787;1836;1;;;;;M Theaux;;1755;1873;2;Bernadets-Dessus, Dept. Hautes Pyrenees, France;;;;M Theaux;;1843;1848;2;;;;;M Theron;;1798;1798;1;;;;;M Thery;;1751;1751;1;Le Lamentin;;;;M Theuvenin;;1648;1754;3;;;;;M Theuvenin;;1717;1783;1;Gros Morne;;;;M Theuvenin;;1737;1817;5;Le Gros-Morne;;;;M Theuvenin;;1787;1787;1;Gros-Morne;;;;M Thevenin;;1814;1814;1;Limoges Egl Stpierre, 87;;;;M Thevenin;;1816;1816;1;Limoges Egl Stpierre, 87;;;;M Thevenin;;1817;1821;2;;;;;M Thevenin;;1842;1842;1;Limoges Eglise St Pierre, 8;;;;M de Théligny;;1542;1542;2;;;;;M Thénerel Ducoudray;;1793;1793;1;Saint-Pierre;;;;M Thibault;;1705;1705;1;Grande Anse (Lorrain);;;;M Thibault;;1826;1826;1;Ste-Marie;;;;M de Thienne;;1534;1534;1;Vincence, Italie;;;;M de Thienne;;1569;1569;1;Pressigny;;;;M de Thienne;;1599;1633;2;;;;;M de Thiennes;;1485;1556;2;;;;;M de Thiern;;1055;1055;2;;;;;M Thierry;;1644;1644;1;Blois, Loir-et-Cher;;;;M Thierry du Bocage;;1753;1753;1;;;;;M Thiersant;;1640;1723;1;;;;;M Thomas;;1634;1693;1;Le Prêcheur;;;;M Thomas;;1650;1721;4;;;;;M Thomas;;1811;1842;1;Vexaincourt (88);;;;M de Thoré;;1833;1833;1;;;;;M Thorkel;;1302;1302;1;;;;;M de Thouars;baillistre de Bretagne;1155;1213;1;Chemillé, France;;;;M de Thouars;duchesse de Bretagne;1020;1308;16;;;;;M de Thouars;vicomte;1024;1093;1;Thouars;;;;M Thoumas de Bosmie;;1808;1808;2;;;;;M de Thoune;comte;1661;1723;5;;;;;M de Thurgovie;;880;880;1;;;;;M de Thuringe;comte;1080;1275;20;;;;;M Tiberge;;1715;1764;1;Le Lamentin;;;;M Tiberge;;1807;1807;2;;;;;M Tiberge;Martinique vers 1713;1684;1713;1;Paris;;;;M de Tiercelin;seigneur de la Chapelle-Baton;;;2;;;;;M Tilney;;1472;1497;2;;;;;M de Tirol;comtesse;1279;1279;1;;;;;M de Tolédo;;1596;1596;2;;;;;M de Tonnay-Charente;;1240;1263;1;;;;;M de Tonnerre;;1030;1085;5;;;;;M de Toron;sire;1191;1191;1;;;;;M de Torres;héritière des provinces sardes de Torres et de Gallura;1238;1255;1;;;;;M Torterue;;1708;1708;1;La Rochelle;;;;M de Tortia;;1379;1379;1;;;;;M de Toscane;;950;1003;1;Gand, Belgique;;;;M de Toscane;marquis;824;1007;10;;;;;M de Toscane;roi d'Italie;900;975;2;;;;ITA;M Touchet;dame de Belleville;1549;1638;1;;;;;M de Toucy;dame;1200;1317;3;;;;;M Toullouppe;;1698;1698;1;;;;;M de Toulouse;;940;1271;16;;;;;M de Toulouse;comte;1042;1222;2;Toulouse;;;;M de Toulouse;comte;1103;1148;1;près de Tripoli, en Syrie;;;;M de Toulouse;comte;1134;1194;1;Nîmes;;;;M de Toulouse;comte;1197;1249;1;Beaucaire;;;;M de Toulouse;comte de Tripoli;1098;1137;1;Palestine;;;;M Tour;;1821;1821;1;Martinique;;;;M de la Tour;vicomte de Turenne;;;3;;;;;M de la Tour du Pin la Charce;marquis;1779;1832;1;;;;;M de Tour-et-Taxis;;1706;1756;1;;;;;M de Tour-et-Taxis;comte;1621;1739;3;Bruxelles, Belgique;;;;M de Tour-et-Taxis;prince;1704;1773;1;Francfort sur le Main;;;;M de Tour-et-Taxis;prince;1733;1805;1;Francfort;;;;M de Tour-et-Taxis;prince;1770;1827;1;Regensbourg;;;;M de Tournai;;1154;1193;6;;;;;M du Tournel;;1215;1215;1;;;;;M de Tournon;seigneur;1465;1465;3;;;;;M de Tournon-Roussillon;;1540;1600;1;;;;;M de Tours;;821;851;1;;;;;M de Tourzel;dame de Busset;1498;1498;1;;;;;M Trastemirez;;1033;1038;1;;;;;M de Trautmannsdorf;;1587;1653;1;;;;;M Traversier;;1630;1677;3;;;;;M Traversier;;1697;1697;1;Basse-Pointe;;;;M de Traves;;1100;1100;1;;;;;M du Traynel;;1135;1223;4;;;;;M de Trazegnies;;1811;1835;1;;;;;M de Trazeignies;seigneur de Blicquy;1092;1192;5;;;;;M Tremblet;;1718;1718;1;Grande Anse (Lorrain);;;;M Trencavel;;1032;1193;11;;;;;M de Treves;;951;951;1;;;;;M Trezin de Cangey;;1802;1802;1;Le François;;;;M de Trèves;;909;909;1;;;;;M de Tréguier;comte;1110;1190;1;Mayenne;;;;M Triboulliet;;1653;1749;1;;;;;M Tricot;;1741;1741;3;;;;;M de Trie;;1270;1270;2;;;;;M Trillard;;1739;1811;3;Rennes;;;;M Trillard;;1782;1834;1;Lorient;;;;M Trillard;Huissier au Parlement de Bretagne;;;1;;;;;M Trivulce;;1638;1638;1;;;;;M Trokin;;1827;1827;1;;;;;M de Troppau;duc;1350;1363;2;;;;;M de Troussebois;seigneur de Lormet;;;2;;;;;M de Troyes;dame de Lachy;884;884;2;;;;;M de Truhendingen;;1278;1301;1;;;;;M de Tschernembl;;1563;1601;1;Windeck;;;;M de Tubingen;;1162;1609;2;;;;;M Tucker;;1778;1845;1;;;;;M Tudor;;1400;1461;1;Hereford, Hereford and Worcester, Angleterre;;;;M Tudor;comte de Richmond;1430;1502;4;;;;;M Tudor;reine d'Angleterre;1516;1558;1;Greenwich;;ENG;GBR;M Tudor;reine d'Écosse;1489;1541;1;;;SCT;GBR;M Tudor;reine de France;1496;1533;1;;;;FRA;M Tudor;roi d'Angleterre;1457;1603;4;;;ENG;GBR;M de Turenne;vicomte;951;1243;16;;;;;M de Turenne;vicomte;1142;1143;1;Saint-Paul-La Roche, Dordogne, France;;;;M de Turenne;vicomte;1143;1191;1;Saint-Jean d'Acre, Israël;;;;M Turpin;;1625;1640;1;Paris;;;;M Tusoli;;1660;1660;1;Alata, Corse-du-Sud;;;;M Tusoli;;1708;1708;1;Ajaccio, Corse-du-Sud;;;;M Tusset;;1653;1653;1;;;;;M de Tver;;1345;1467;5;;;;;M de Tyrol;comte;1344;1373;1;;;;;M de Tyrol-Carinthie;comte de Tyrol;;;2;;;;;M Tzimiskès;empereur d'Orient;925;991;2;;;;;M d'Ugnadin;;1605;1670;1;;;;;M Ungnadin;comtesse de Sonnegg;1573;1606;1;;;;;M Ungnadin-Sonnegg;baron de Sonnegg;1530;1605;1;;;;;M Urbino;;1527;1563;1;;;;;M d'Urgel;comte;1055;1443;8;;;;;M d'Uzès;vicomtesse;1125;1125;4;;;;;M Vacherot;;1632;1782;4;;;;;M du Val;;1665;1725;1;Fort-Royal, Martinique;;;;M du Val;;1696;1781;1;Rivière-Salée;;;;M du Val;seigneur de Grandchamps;1584;1584;2;;;;;M de Valence;;1281;1319;1;;;;;M de Valenciennes;;920;920;1;;;;;M de Valley;;1140;1200;3;;;;;M de Valois;;1308;1383;1;Paris;;;;M de Valois;;1373;1418;1;chateau d'Essay;;;;M de Valois;comte;1270;1325;1;Carenne;;;;M de Valois;dame de Mirebeau;965;1562;74;;;;;M de Valois;impératrice titulaire de Constantinople;1301;1346;1;à Naples;;;;M de Valois;reine d'Angleterre;1389;1437;2;à Paris;;ENG;GBR;M de Valois;reine d'Espagne;1545;1568;1;à Fontainebleau;;;ESP;M de Valois;roi de France;1293;1522;7;;;;FRA;M de Valois;roi de France;1337;1380;1;Vincennes;;;FRA;M de Valons;;1773;1847;1;;;;;M Van Bomberghen;;1490;1539;1;;;;;M Van Borselen;comte d'Ostrevant;1432;1432;1;;;;;M Van Hontsum;;1553;1693;5;;;;;M Van den Cruyce;;1540;1540;2;;;;;M Vanesson;;1774;1798;1;Fains (55);;;;M Vanhoudenhoven de Vieillecourt;;1690;1713;1;Fort-Royal;;;;M Vanhoudenhoven de Vieillecourt;Procureur Général;1645;1715;1;Le François;;;;M de Vannes;comte;877;907;4;;;;;M Vanonse;;1697;1697;1;;;;;M Vaque;;1726;1726;1;Marseille;;;;M Varachaud;;1590;1590;1;, Ls;;;;M de Varennes;;1070;1304;10;;;;;M de Varennes;comtesse de Surrey;1137;1199;1;Surrey, Angleterre;;;;M Varnier;;1720;1720;1;;;;;M Vasa;;1376;1655;22;;;;;M Vasa;;1619;1651;1;Varsovie;;;;M Vasa;duc d'Ostrogothie;1589;1618;1;Uppsala, Suède;;;;M Vasa;duc de Sudermanie;1601;1622;1;Reval;;;;M Vasa;princesse de Suède;1539;1627;6;;;;SWE;M Vasa;princesse de Suède;1568;1625;1;Eskilstuna, Suède;;;SWE;M Vasa;princesse de Suède;1584;1638;1;Nyköping, Suède;;;SWE;M Vasa;roi de Pologne;1566;1632;1;Gripsholm, Suède;;;POL;M Vasa;roi de Pologne;1595;1648;1;;;;POL;M Vasa;roi de Pologne;1609;1672;1;Nevers;;;POL;M Vasa;roi de Suède;1496;1560;1;Uppland, Suède;;;SWE;M Vasa;roi de Suède;1533;1689;4;Stockholm, Suède;;;SWE;M Vasa;roi de Suède;1537;1592;1;Stegeborg, Suède;;;SWE;M Vassiltchikova;;1575;1575;1;;;;;M Vatable;;1789;1835;5;;;;;M de Vathaire;seigneur de Champcornille;1527;1895;30;;;;;M de Vathaire de Charmoy;;1721;1829;7;;;;;M de Vathaire de Guerchy;;1771;1846;2;;;;;M de Vathaire de Montreparé;;1742;1847;5;;;;;M de Vathaire du Fort;;1772;1827;1;;;;;M Vatier;;1641;1641;1;;;;;M Vauclin;;1639;1663;1;Hautot-le-Vatois;;;;M Vauclin;;1663;1663;1;St-Pierre;;;;M de Vaudémont;comte;1060;1348;13;;;;;M de Vaulabelle ( Tenaille );;1698;1760;1;Mailly Le Chateau, 89;;;;M de Vaulabelle ( Tenaille );;1734;1806;1;Mailly-le-Chateau, 89;;;;M de Vaulabelle ( Tenaille );;1771;1816;1;;;;;M de Vaulabelle (Tenaille de);;1535;1651;2;;;;;M de Vaulabelle (Tenaille de);;1616;1696;1;Mailly la Ville, 89;;;;M de Vaulabelle (Tenaille de);;1661;1732;1;Mailly-la-Ville;;;;M de Vaulabelle (Tenaille de);;1695;1765;1;Mailly la Ville;;;;M Vautor;;1707;1707;2;;;;;M de Vegena;;1047;1047;1;;;;;M de Velasco;duchesse;1329;1607;3;;;;;M de Veldenz;comte palatin;1370;1592;3;;;;;M Veliaminov;boyard;1404;1404;2;;;;;M de Vendôme;comte;970;1412;21;;;;;M de Vendôme;comte;1200;1249;1;Nicosie, Chypre;;;;M de Vendômois;;1420;1420;1;;;;;M de Veneur;;1540;1600;1;;;;;M de Venisy;;1167;1167;2;;;;;M de Ventadour;;1100;1155;1;Mont Cassin, Italie;;;;M de Ventadour;vicomte;1151;1375;6;;;;;M Verdier;;1716;1822;3;;;;;M de Verdilhac;seigneur de La Vergne;1715;1777;5;;;;;M de Verdun;;920;1015;5;;;;;M Vere;comte d'Oxford;1532;1532;2;;;;;M Verger;;1818;1818;1;;;;;M des Vergers;écuyer;1530;1591;3;;;;;M des Vergers d'Auroy;;1704;1704;1;Saint-Christophe;;;;M des Vergers d'Auroy;;1713;1713;1;;;;;M des Vergers d'Auroy;;1720;1750;1;François, Martinique;;;;M des Vergers de Mauperthuy;;1723;1773;5;;;;;M des Vergers de Mauperthuy;;;;1;Anses d'Arlet;;;;M des Vergers de Mauperthuy;Chevau Léger, Garde, Capitaine au Régiment de Moraugis.;1630;1661;1;Annet en Brie;;;;M des Vergers de Mauperthuy;seigneur de Sannois;1714;1714;1;St-Christophe;;;;M des Vergers de Sannois;;1639;1834;11;;;;;M des Vergers de Sannois;;1670;1710;1;Fort-Royal;;;;M des Vergers de Sannois;;1736;1807;1;Trois-Îlets, Martinique;;;;M des Vergers de Sannois;seigneur de Sannois;1592;1624;1;Amiens, Somme;;;;M des Vergers de Sannois;seigneur de Sannois;1595;1657;1;Poincy, Seine-et-Marne;;;;M des Vergers de Sannois;seigneur de Sannois;1660;1700;1;Le Lamentin, Martinique;;;;M Vergnaud;;1827;1827;1;Limoges Egl St Michel, 87;;;;M de Vergy;;979;1430;19;;;;;M de Verineau;seigneur de Veyrat;1701;1701;2;;;;;M de Vermandois;;818;902;2;Vermandois;;;;M de Vermandois;;880;1023;16;;;;;M de Vermandois;comtesse;1062;1120;1;Meulan, Yvelines, France;;;;M de Vermeilles;;1346;1361;1;;;;;M Verneuil;seigneur de La Peyre;1763;1792;1;;;;;M de Verneuil;;1606;1680;1;;;;;M Verneuil de La Peyre;seigneur de La Valette;;;1;;;;;M de Verteuil;;1844;1844;1;;;;;M Veyrier du Potiche;;1715;1782;2;Macouba;;;;M Veyrier du Potiche;;1763;1763;1;St-Pierre;;;;M de Vérone;prince;1363;1363;1;;;;;M de Vialard;;1586;1591;1;;;;;M de Vianden;;1310;1376;1;Dillenbourg;;;;M de Vienne;comte;1175;1410;10;;;;;M de Viennois;dauphin;1304;1323;2;;;;;M de la Vieuville;;1630;1678;1;;;;;M de la Vieville;;1430;1500;1;;;;;M de Vigneau de Bizanos;;1742;1742;1;;;;;M Vignier;seigneur de Saint-Père de Nuzy;1538;1538;2;;;;;M de Vignory;seigneur;1055;1262;4;;;;;M Vilain;;1797;1797;1;Trinité;;;;M Vilain;;1831;1831;1;Le Lamentin;;;;M de Viliers;;1629;1629;1;;;;;M de Villareal;;1447;1452;2;;;;;M de Villars;;1569;1569;1;Pressigny;;;;M de Ville;;1629;1629;2;;;;;M de Villebéon;seigneur;1210;1282;2;;;;;M de Villehardouin;princesse d'Archaïe;1235;1311;6;;;;;M de Villemomble;;1195;1214;1;;;;;M de Villersexel;;1335;1368;1;;;;;M Villiers;;1604;1689;7;;;;;M de Villiers;;1578;1604;4;;;;;M de Villiers de Masjoubert;;1586;1594;1;;;;;M Vincent;;1728;1728;1;Saint-Saud Coussière, Dordogne;;;;M Vincent;seigneur de Bonnefonds;;;1;;;;;M de Vinstingen;;1445;1491;1;;;;;M de Vintschgau;;771;783;1;;;;;M de Virnebourg;;1303;1343;1;Virnebourg;;;;M de Virnebourg;;1410;1480;4;;;;;M Visconti;;1350;1414;1;Milan;;;;M Visconti;archevêque de Milan;1295;1447;24;;;;;M de Vitebsk;;1207;1318;3;;;;;M de Vitré;;1023;1248;11;;;;;M Vitry;;1688;1698;2;;;;;M Vive;;1818;1884;1;;;;;M Viviès;;1797;1797;1;Trinité;;;;M Viviès;;1832;1832;1;Le Lamentin;;;;M de Vivonne;;1628;1628;1;;;;;M de Vladimir;prince;1108;1123;1;;;;;M de Vladimir Volinsk;prince;1207;1247;2;;;;;M de Voels;baron;1575;1648;2;;;;;M de Vohbourg;margrave;1147;1147;2;;;;;M de Vohenstrauss;;1557;1597;1;;;;;M Voisin;;1636;1636;1;;;;;M Voisin;;1688;1742;1;Grande Anse (Lorrain;;;;M Volland;;1480;1480;3;;;;;M de Vouvant;;1069;1069;1;;;;;M Wake;lord;1325;1349;2;;;;;M de Walbeck;;949;949;1;;;;;M de Walcourt-Rochefort;;1418;1441;1;;;;;M de Waldbourg;;1500;1567;1;;;;;M de Waldburg zu Wolfegg und Zeil;;1488;1589;4;;;;;M de Waldburg zu Zeil;Comte de Zeil;1569;1720;4;;;;;M de Waldburg zu Zeil;comtesse;1702;1739;1;chateau de Zeil;;;;M de Waldeck;comte;1380;1702;13;;;;;M de Waldeck;comte;1614;1699;2;Culemborg;;;;M de Waldeck;prince;1620;1692;1;Arolsen;;;;M de Waldeck;prince;1676;1728;1;Landau;;;;M de Waldeck;prince;1704;1763;1;Hanau;;;;M de Waldeck-Wildungen;;1558;1599;1;Dillenbourg;;;;M de Waldeck-Wildungen;;1636;1669;1;Wildungen;;;;M de Waldeck-Wildungen;comte de Waldeck;1445;1678;11;;;;;M de Waldeck-et-Pyrmont;;1664;1813;2;Arolsen;;;;M de Waldeck-et-Pyrmont;prince;1789;1845;1;Weil b.Basel;;;;M de Waldstein;comte;1731;1775;1;;;;;M Walewska;;1789;1817;1;;;;;M de Wallenrodt;;1695;1775;1;Ragnit;;;;M Wallenstein;;1530;1530;1;;;;;M Walpole;;1736;1807;2;;;;;M de Wardenbourg;;1464;1538;1;;;;;M de Warwick;comte;1429;1492;2;;;;;M de Wassemberg;comte de Gueldre;1060;1218;10;;;;;M de Wassemburg;;987;987;2;;;;;M Watts;;1682;1711;1;Londres;;;;M de Wavrin;;1154;1193;7;;;;;M de Weede;baronne;1685;1724;1;;;;;M Weigen;;1645;1719;1;;;;;M de Weimar;;1040;1040;1;;;;;M de Weissenbach;;1630;1680;1;Eisleben;;;;M Weissgerber;;1595;1645;1;;;;;M Welf;;1673;1742;1;Lunebourg;;;;M Welf;;1764;1788;1;Treptow;;;;M Welf;;1769;1811;1;Antoinettenruh;;;;M Welf;comte;863;1840;159;;;;;M Welf;duc de Bavière;1074;1126;1;Revensbourg, Allemagne;;;;M Welf;duc de Brunswick;1268;1318;1;eglise Saint Blaise a Brunswixck;;;;M Welf;duc de Brunswick-Bevern;1680;1735;1;Bevern;;;;M Welf;duc de Brunswick-Lunebourg;1629;1698;1;Herzberg;;;;M Welf;duc de Brunswick-Lunebourg;1713;1780;1;Braunschweig;;;;M Welf;duc de Brunswick-Lunebourg;1735;1806;1;Wolfenbüttel, Brunswick;;;;M Welf;duchesse de Saxe-Weimar;1739;1807;1;à Wolfenbüttel;;;;M Welf;empereur Romain-Germanique;1175;1218;1;en Normandie;;;;M Welf;princesse d'Ahlden;1666;1726;1;Allemagne;;;;M Welf;princesse de Brunswick-Hanovre;1668;1705;1;Iburg;;;;M Welf;princesse de Brunswick-Wolfenbüttel;1691;1802;4;Wolfenbüttel;;;;M Wellesley;comte de Mormington;1735;1842;2;;;;;M Welser;baronne de Zinnenbourg;1527;1580;1;;;;;M de Werdenberg-Heiligenberg;comtesse;1434;1467;1;;;;;M de Werle;;1284;1312;1;eglise Saint Blaise a Brunswixck;;;;M de Werle;prince;1262;1291;1;Saal;;;;M de Werle-Waren;prince;1377;1377;2;;;;;M de Wertheim;;1340;1553;4;;;;;M de Westerbourg;;1315;1418;3;;;;;M de Wetterau;;900;973;3;;;;;M de Wettin;;1449;1501;1;Weimar;;;;M de Wettin;;1468;1524;1;Grimma, Saxe;;;;M de Wettin;;1609;1671;1;Dresden;;;;M de Wettin;;1683;1764;3;Saalfeld;;;;M de Wettin;;1691;1720;1;Arolsen;;;;M de Wettin;;1691;1743;1;Zeitz;;;;M de Wettin;;1799;1832;1;Dresde;;;;M de Wettin;duc de Saxe;1425;1539;3;Meissen;;;;M de Wettin;duc de Saxe;1443;1500;1;à Grimma;;;;M de Wettin;duc de Saxe-Cobourg-Saalfeld;1724;1810;3;Coburg;;;;M de Wettin;duc de Saxe-Gotha;1646;1808;6;Gotha;;;;M de Wettin;duc de Saxe-Gotha-Altenbourg;1601;1675;1;Altenbourg;;;;M de Wettin;margrave de Saxe-Ostmark;1034;1873;120;;;;;M de Wettin;princesse de Saxe-Weissenfels;1648;1724;2;Halle;;;;M de Wettin;reine de Naples;1724;1760;1;;;;ITA;M de Wettin;roi de Pologne;1670;1767;3;;;;POL;M White-Le Blanc;;1768;1768;1;;;;;M de Wied;comte;1425;1588;8;;;;;M de Wied-Runkel;prince;1763;1824;1;;;;;M de Wignacourt;;1750;1778;1;;;;;M de Wilczek;;1792;1847;1;;;;;M Willoughby;;1588;1588;1;;;;;M de Windisch-Graëtz;comtesse;1784;1848;1;;;;;M Winter Durennel;;1843;1843;1;;;;;M Wintheim;;1772;1772;1;Carénage;;;;M Winzelhaeuser;;1495;1559;1;;;;;M Wirtemberger;;1470;1470;1;;;;;M Wisniowecki;;1612;1651;3;;;;;M Wisniowecki;roi de Pologne;1640;1673;1;;;;POL;M de Wittelsbach;;1373;1872;6;Munich;;;;M de Wittelsbach;;1381;1408;1;Amberg;;;;M de Wittelsbach;;1419;1524;3;Heidelberg;;;;M de Wittelsbach;;1637;1717;1;Bischweiler;;;;M de Wittelsbach;;1725;1816;1;Ribeauville;;;;M de Wittelsbach;comte de Lowenstein-Wertheim;1530;1611;1;Vaihingen;;;;M de Wittelsbach;comte de Lowenstein-Wertheim-Rochefort;1616;1718;2;Rochefort;;;;M de Wittelsbach;comte de Löwenstein-Wertheim;1568;1735;2;Wertheim;;;;M de Wittelsbach;comte de Scheyern;1072;1877;164;;;;;M de Wittelsbach;comtesse palatine de Deux-Ponts-Birkenfeld;1721;1774;1;Strasbourg, France;;;;M de Wittelsbach;duc de Bavière;1117;1183;1;Pfullendorf;;;;M de Wittelsbach;duc de Bavière;1548;1864;2;Vienne;;;;M de Wittelsbach;duchesse de Modène;1823;1914;1;Wurzburg;;;;M de Wittelsbach;héritier d'Espagne;1692;1699;1;;;;ESP;M de Wittelsbach;prince de Lowenstein-Wertheim-Rochefort;1722;1838;2;Kleinheubach;;;;M de Wittelsbach;prince de Lowenstein-Wertheim-Rochefort;1783;1849;1;Bartenstein;;;;M de Wittelsbach;prince de Lowenstein-Wertheim-Rosenberg;1762;1814;1;Nancy;;;;M de Wittelsbach;prince palatin de Deux-Ponts;1589;1652;1;Stockholm;;;;M de Wittelsbach;princesse de Bavière;1788;1851;1;München, Allemagne;;;;M de Wittelsbach;reine de France;1371;1435;1;à Munich;;;FRA;M de Wittelsbach;roi de Bavière;1756;1825;1;Mannheim, Allemagne;;;;M de Wittelsbach;roi de Hongrie;1261;1313;1;;;;HUN;M de Wittelsbach;roi de Suède;1622;1660;1;Nyköping, Suède;;;SWE;M de Wittelsbach;roi de Suède;1655;1741;3;Stockholm, Suède;;;SWE;M de Wittelsbach;roi de Suède;1682;1718;2;;;;SWE;M de Wittelsbach;roi des Romains;1352;1410;1;à Amberg;;;;M de Wittelsbach;électeur-archevêque de Cologne;1577;1650;1;à Munich;;;;M von Witzleben;;1598;1671;2;;;;;M de Woevre;;;;8;;;;;M de Wolfstein;comte;1644;1737;2;;;;;M Woodville;comte de Rivers;1380;1491;5;;;;;M Woodville;reine d'Angleterre;1437;1492;1;à Londres;;ENG;GBR;M de Wrbna et Freudenthal;comtesse;1799;1863;1;;;;;M Wriothesley;;1615;1615;1;;;;;M de Wroclaw;duc;1235;1296;6;;;;;M Wuerttemberger;;1450;1503;1;;;;;M de Wurmbrand-Stuppach;comtesse;1699;1763;1;;;;;M de Wurtemberg;;1447;1505;1;Wernigerode;;;;M de Wurtemberg;;1767;1817;1;Montriond;;;;M de Wurtemberg;comte;1226;1852;86;;;;;M de Wurtemberg;comte;1265;1873;4;Stuttgart;;;;M de Wurtemberg;duchesse;1797;1855;1;Karlruhe;;;;M de Wurtemberg;roi;1754;1816;2;Treptow;;;;M Ybleron;;1614;1614;1;;;;;M Ybleron;;1659;1699;1;Le Prêcheur;;;;M Yngling;;1297;1312;1;Oslo;;;;M Yngling;reine d'Écosse;1283;1290;1;;;SCT;GBR;M Yngling;roi de Norvège;1015;1360;30;;;;;M d'York;roi;926;926;1;;;;;M Zamoyska;;1623;1672;1;;;;;M Zamoyski;comte;1716;1792;1;;;;;M de Zaozersk;prince;1436;1436;2;;;;;M von Zaworziz;;1664;1740;1;;;;;M Zápolya;comte de Zips;1495;1571;4;;;;;M Zápolya;roi de Hongrie;1487;1540;1;;;;HUN;M de Zelcking-Durnstein;;1603;1646;1;;;;;M de Zeutsch;;1624;1689;1;Eisleben;;;;M de Zeutsch;;1666;1699;1;;;;;M de Zevenbergen;;1460;1510;1;;;;;M Ziegler;;1757;1810;1;;;;;M de Zinzendorf;;1636;1709;1;Pottendorf;;;;M de Zinzendorf;;1659;1683;1;Pressbourg;;;;M de Zinzendorf;comte;1590;1743;3;;;;;M de Zinzendorf;comte;1620;1677;1;Vienne;;;;M de Zinzendorf-Pottendorf;;1605;1655;1;;;;;M de Zooteghem;;1193;1219;2;;;;;M Zuern;;1775;1795;1;;;;;M de Zutphen;;1095;1145;4;;;;;M de Zutphen;comte;1055;1113;1;Corvey;;;;M geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/gwbase/etc/probot.ml0000660000175200017530000000416712664543647025753 0ustar guillaumeguillaume(* camlp4r *) (* $Id: probot.ml,v 1.7 2006-10-05 13:37:58 deraugla Exp $ *) open Printf; value magic_robot = "GWRB0007"; module W = Map.Make (struct type t = string; value compare = compare; end); type norfriwiz = [ Normal | Friend of string | Wizard of string ]; type who = { acc_times : list float; oldest_time : float; nb_connect : int; nbase : string; utype : norfriwiz } ; type excl = { excl : mutable list (string * ref int); who : mutable W.t who; max_conn : mutable (int * string) } ; value input_excl = let b = Bytes.create (String.length magic_robot) in fun ic -> do { really_input ic b 0 (String.length b); if b <> magic_robot then raise Not_found else (input_value ic : excl) } ; value main () = let xcl = input_excl (open_in_bin "cnt/robot") in let tm_now = Unix.time () in do { if xcl.excl <> [] then printf "excl\n" else (); List.iter (fun (s, ri) -> printf " \"%s\" %d\n" s ri.val) xcl.excl; printf "who\n"; let sorted_who = List.sort (fun (k1, w1) (k2, w2) -> compare (List.hd w1.acc_times) (List.hd w2.acc_times)) (W.fold (fun k x l -> [(k, x) :: l]) xcl.who []) in List.iter (fun (k, w) -> let tml = w.acc_times in let tm0 = w.oldest_time in let cnt = w.nb_connect in let bn = w.nbase in let nfw = w.utype in do { printf " %s (%d)" k cnt; match nfw with [ Wizard n -> printf " (\027[31mwiz %s%s\027[30m)" bn (if n = "" then "" else " " ^ n) | Friend n -> printf " (\027[34mfri %s%s\027[30m)" bn (if n = "" then "" else " " ^ n) | Normal -> () ]; printf "\n"; printf " "; let cnt = ref 0 in let siz = List.length tml in List.iter (fun tm -> do { incr cnt; if True || cnt.val <= 8 || cnt.val > siz - 8 then printf "-%g" (tm_now -. tm) else if cnt.val = 9 then printf "-..." else (); }) tml; printf "\n"; }) sorted_who; printf "max_conn\n"; printf " %d \"%s\"\n" (fst xcl.max_conn) (snd xcl.max_conn); flush stdout; } ; main (); geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/gwbase/etc/select.ml0000660000175200017530000000771412664543647025726 0ustar guillaumeguillaume(* $Id: select.ml,v 4.17 2007-01-19 09:03:03 deraugla Exp $ *) (* Copyright (c) 2000-2006 INRIA *) (* *) open Def; open Gutil; open Gwdb; value select_ancestors base per_tab fam_tab flag = loop where rec loop iper = let i = Adef.int_of_iper iper in if per_tab.(i) land flag <> 0 then () else do { per_tab.(i) := per_tab.(i) lor flag; match get_parents (poi base iper) with [ Some ifam -> let i = Adef.int_of_ifam ifam in if fam_tab.(i) land flag <> 0 then () else do { fam_tab.(i) := fam_tab.(i) lor flag; let cpl = foi base ifam in loop (get_father cpl); loop (get_mother cpl); } | None -> () ] } ; value ok_titles = ["roi"; "reine"; "empereur"]; value has_titles base p = List.exists (fun t -> List.mem (sou base t.t_ident) ok_titles) (get_titles p) ; value parents_has_titles base p = match get_parents p with [ Some ifam -> let cpl = foi base ifam in has_titles base (poi base (get_father cpl)) || has_titles base (poi base (get_mother cpl)) | None -> False ] ; value gen_good_dates base p birth_lim death_lim = let death_ok = match get_death p with [ Death _ cd -> match Adef.date_of_cdate cd with [ Dgreg d _ -> d.year <= death_lim | _ -> False ] | _ -> False ] in if death_ok then True else let birth_ok = match Adef.od_of_codate (get_birth p) with [ Some (Dgreg d _) -> d.year <= birth_lim | _ -> False ] in birth_ok ; value good_dates base p = if gen_good_dates base p 1830 1900 then True else match get_parents p with [ Some ifam -> let cpl = foi base ifam in gen_good_dates base (poi base (get_father cpl)) 1780 1800 || gen_good_dates base (poi base (get_mother cpl)) 1780 1800 | None -> False ] ; value rec select_closure base per_tab fam_tab flag ip = if per_tab.(Adef.int_of_iper ip) = 1 then do { let u = poi base ip in per_tab.(Adef.int_of_iper ip) := flag; match get_parents (poi base ip) with [ Some ifam -> let cpl = foi base ifam in do { select_closure base per_tab fam_tab flag (get_father cpl); select_closure base per_tab fam_tab flag (get_mother cpl); } | None -> () ]; for i = 0 to Array.length (get_family u) - 1 do { let ifam = (get_family u).(i) in let desc = foi base ifam in if fam_tab.(Adef.int_of_ifam ifam) = 1 then do { fam_tab.(Adef.int_of_ifam ifam) := flag; for i = 0 to Array.length (get_children desc) - 1 do { select_closure base per_tab fam_tab flag (get_children desc).(i) }; () } else () }; () } else () ; value functions base anc desc surnames no_spouses_parents = let per_tab = Array.make (nb_of_persons base) 0 in let fam_tab = Array.make (nb_of_families base) 0 in do { for i = 0 to nb_of_persons base - 1 do { let p = poi base (Adef.iper_of_int i) in let iaper = Adef.iper_of_int i in if has_titles base p || parents_has_titles base p || good_dates base p then select_ancestors base per_tab fam_tab 1 iaper else () }; for i = 0 to nb_of_persons base - 1 do { if per_tab.(i) == 1 then let u = poi base (Adef.iper_of_int i) in for i = 0 to Array.length (get_family u) - 1 do { let ifam = (get_family u).(i) in let cpl = foi base ifam in fam_tab.(Adef.int_of_ifam ifam) := 1; per_tab.(Adef.int_of_iper (get_father cpl)) := 1; per_tab.(Adef.int_of_iper (get_mother cpl)) := 1; () } else () }; match person_of_key base "juan carlos" "de borbon" 0 with [ Some ip -> do { select_closure base per_tab fam_tab 3 ip; (fun i -> per_tab.(Adef.int_of_iper i) == 3, fun i -> fam_tab.(Adef.int_of_ifam i) == 3) } | None -> failwith "not found juan carlos.0 de borbon" ] } ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/gwbase/etc/arabe.html0000660000175200017530000001175412664543647026054 0ustar guillaumeguillaume Arabe




    Valid XHTML 1.1!

    geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/gwbase/etc/unicode.utf8.html0000660000175200017530000001534612664543647027316 0ustar guillaumeguillaume Unicode Keyboard



    Valid XHTML 1.1!

    geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/gwbase/etc/connex.ml0000660000175200017530000001534312664543647025736 0ustar guillaumeguillaume(* $Id: connex.ml,v 4.20 2013-10-06 17:35:18 deraugla Exp $ *) (* Copyright (c) 1999 INRIA *) open Def; open Gutil; open Gwdb; value all = ref False; value detail = ref 0; value ignore = ref []; value ignore_files = ref True; value ask_for_delete = ref 0; value rec merge_families ifaml1f ifaml2f = match (ifaml1f, ifaml2f) with [ ([ifam1 :: ifaml1], [ifam2 :: ifaml2]) -> let m1 = List.memq ifam1 ifaml2 in let m2 = List.memq ifam2 ifaml1 in if m1 && m2 then merge_families ifaml1 ifaml2 else if m1 then [ifam2 :: merge_families ifaml1f ifaml2] else if m2 then [ifam1 :: merge_families ifaml1 ifaml2f] else if ifam1 == ifam2 then [ifam1 :: merge_families ifaml1 ifaml2] else [ifam1; ifam2 :: merge_families ifaml1 ifaml2] | (ifaml1, []) -> ifaml1 | ([], ifaml2) -> ifaml2 ] ; value rec filter f = fun [ [x :: l] -> if f x then [x :: filter f l] else filter f l | [] -> [] ] ; value connected_families base ifam cpl = loop [ifam] [] [get_father cpl] where rec loop ifaml ipl_scanned = fun [ [ip :: ipl] -> if List.memq ip ipl_scanned then loop ifaml ipl_scanned ipl else let u = poi base ip in let ifaml1 = Array.to_list (get_family u) in let ifaml = merge_families ifaml ifaml1 in let ipl = List.fold_right (fun ifam ipl -> let cpl = foi base ifam in [get_father cpl; get_mother cpl :: ipl]) ifaml1 ipl in loop ifaml [ip :: ipl_scanned] ipl | [] -> ifaml ] ; value neighbourgs base ifam = let fam = foi base ifam in let ifaml = connected_families base ifam fam in let ifaml = match get_parents (poi base (get_father fam)) with [ Some ifam -> [ifam :: ifaml] | None -> ifaml ] in let ifaml = match get_parents (poi base (get_mother fam)) with [ Some ifam -> [ifam :: ifaml] | None -> ifaml ] in let ifaml = List.fold_left (fun ifaml ip -> let u = poi base ip in List.fold_left (fun ifaml ifam -> [ifam :: ifaml]) ifaml (Array.to_list (get_family u))) ifaml (Array.to_list (get_children fam)) in ifaml ; value utf8_designation base p = let first_name = p_first_name base p in let surname = p_surname base p in let s = first_name ^ "." ^ string_of_int (get_occ p) ^ " " ^ surname in if first_name = "?" || surname = "?" then s ^ " (i=" ^ string_of_int (Adef.int_of_iper (get_key_index p)) ^ ")" else s ; value print_family base ifam = do { let fam = foi base ifam in let p = poi base (get_father fam) in if sou base (get_first_name p) = "?" || sou base (get_surname p) = "?" then Printf.printf "i=%d" (Adef.int_of_iper (get_key_index p)) else Printf.printf " - %s" (utf8_designation base p); Printf.printf "\n"; Printf.printf " - %s\n" (utf8_designation base (poi base (get_mother fam))); }; value kill_family base fam ip = let u = {family = Array.of_list []} in patch_union base ip u ; value kill_parents base ip = let a = {parents = None; consang = Adef.fix (-1)} in patch_ascend base ip a ; value effective_del base (ifam, fam) = do { kill_family base fam (get_father fam); kill_family base fam (get_mother fam); Array.iter (kill_parents base) (get_children fam); Gwdb.delete_family base ifam; }; value move base = do { load_ascends_array base; load_unions_array base; load_couples_array base; load_descends_array base; let nb_fam = nb_of_families base in let mark = Array.make nb_fam False in let min = ref max_int in let max = ref 0 in for i = 0 to nb_fam - 1 do { let ifam = Adef.ifam_of_int i in let fam = foi base ifam in let origin_file = get_origin_file fam in if List.mem (sou base origin_file) ignore.val then () else let (nb, ifaml) = loop 0 [] [ifam] where rec loop nb rfaml = fun [ [] -> (nb, rfaml) | [ifam :: ifaml] -> let j = Adef.int_of_ifam ifam in if not (is_deleted_family (foi base ifam)) && not mark.(j) && (ignore_files.val || eq_istr (get_origin_file fam) origin_file) then do { mark.(j) := True; let nl = neighbourgs base ifam in let rfaml = if nb > detail.val then if ask_for_delete.val > 0 && nb <= ask_for_delete.val then [ifam :: rfaml] else [] else [ifam :: rfaml] in loop (nb + 1) rfaml (List.rev_append nl ifaml) } else loop nb rfaml ifaml ] in if nb > 0 && (all.val || nb <= min.val) then do { if nb <= min.val then min.val := nb else (); if nb >= max.val then max.val := nb else (); Printf.printf "Connex component \"%s\" length %d\n" (sou base origin_file) nb; if detail.val == nb then List.iter (print_family base) ifaml else print_family base ifam; flush stdout; if ask_for_delete.val > 0 && nb <= ask_for_delete.val then do { Printf.eprintf "Delete that branch (y/N) ? "; flush stderr; let r = input_line stdin in if r = "y" then do { List.iter (fun ifam -> do { let fam = foi base ifam in if not (is_deleted_family fam) then effective_del base (ifam, fam) else (); }) ifaml; Printf.eprintf "%d families deleted\n" (List.length ifaml); flush stderr; } else do { Printf.printf "Nothing done.\n"; flush stdout; } } else (); } else (); }; if ask_for_delete.val > 0 then Gwdb.commit_patches base else (); }; value bname = ref ""; value usage = "usage: " ^ Sys.argv.(0) ^ " "; value speclist = [("-a", Arg.Set all, ": all connex components"); ("-d", Arg.Int (fun x -> detail.val := x), " : detail for this length"); ("-i", Arg.String (fun x -> ignore.val := [x :: ignore.val]), " : ignore this file"); ("-bf", Arg.Clear ignore_files, ": by origin files"); ("-del", Arg.Int (fun i -> ask_for_delete.val := i), " : ask for deleting branches whose size <= that value")] ; value main () = do { Arg.parse speclist (fun s -> bname.val := s) usage; if ask_for_delete.val > 0 then match Lock.control (Mutil.lock_file bname.val) False (fun () -> move (Gwdb.open_base bname.val)) with [ Some () -> () | None -> do { Printf.eprintf "Base locked. Try again.\n"; flush stdout } ] else move (Gwdb.open_base bname.val) } ; main (); geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/gwbase/etc/lune.ml0000660000175200017530000000464212664543647025407 0ustar guillaumeguillaume(* camlp4r *) (* $Id: lune.ml,v 4.7 2006-10-30 09:37:58 deraugla Exp $ *) open Def; open Gwdb; open Printf; value bname = ref ""; value lune bname = let base = Gwdb.open_base bname in let moon_age = Array.make 31 0 in let moon_phase = Array.make 5 0 in let nbb = ref 0 in do { for i = 0 to nb_of_persons base -1 do { let p = poi base (Adef.iper_of_int i) in match Adef.od_of_codate (get_birth p) with [ Some (Dgreg dt _) -> if dt.prec = Sure && dt.delta = 0 && dt.day > 0 then do { incr nbb; let jd = Calendar.sdn_of_gregorian dt in let (mp, ma) = Calendar.moon_phase_of_sdn jd in moon_age.(ma - 1) := moon_age.(ma - 1) + 1; let i = match mp with [ None -> 0 | Some (Calendar.NewMoon, _, _) -> 1 | Some (Calendar.FirstQuarter, _, _) -> 2 | Some (Calendar.FullMoon, _, _) -> 3 | Some (Calendar.LastQuarter, _, _) -> 4 ] in moon_phase.(i) := moon_phase.(i) + 1; } else () | _ -> () ]; }; printf "Influence de la lune sur les naissances.\n\n"; printf "Nombre de personnes = %d\n" nbb.val; printf "\n"; printf "Naissances :\n\n"; printf "- à la nouvelle lune : %d (%.3f%%)\n" moon_phase.(1) (100.0 *. float moon_phase.(1) /. float nbb.val); printf "- au premier quartier : %d (%.3f%%)\n" moon_phase.(2) (100.0 *. float moon_phase.(2) /. float nbb.val); printf "- à la pleine lune : %d (%.3f%%)\n" moon_phase.(3) (100.0 *. float moon_phase.(3) /. float nbb.val); printf "- au dernier quartier : %d (%.3f%%)\n" moon_phase.(4) (100.0 *. float moon_phase.(4) /. float nbb.val); printf "- entre deux phases : %d (%.3f%%)\n" moon_phase.(0) (100.0 *. float moon_phase.(0) /. float nbb.val); printf "\n"; printf "Naissances en fonction de l'âge de la lune:\n\n"; printf "\tâge\tnombre\t%%/total\n"; for i = 0 to Array.length moon_age - 1 do { printf "\t%2d\t%d\t%.3f%%\n" (i + 1) moon_age.(i) (float moon_age.(i) *. 100.0 /. float nbb.val); }; flush stdout; } ; value speclist = [] ; value anonfun i = bname.val := i; value usage = "Usage: superstition base"; value main () = do { Arg.parse speclist anonfun usage; if bname.val = "" then do { Arg.usage speclist usage; exit 2; } else (); lune bname.val } ; main (); geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/gwbase/etc/consmoy.ml0000660000175200017530000000137412664543647026132 0ustar guillaumeguillaume(* $Id: consmoy.ml,v 4.7 2006-10-04 10:51:20 deraugla Exp $ *) (* Copyright (c) 2000 INRIA *) open Def; open Gwdb; open Printf; value consmoy bname base = let cons = ref 0.0 in do { for i = 0 to nb_of_persons base - 1 do { let a = aoi base (Adef.iper_of_int i) in cons.val := cons.val +. Adef.float_of_fix (get_consang a) }; printf "average consanguinity: %f\n" (cons.val /. float (nb_of_persons base)); flush stdout; () } ; value bname = ref ""; value usage = "usage: " ^ Sys.argv.(0) ^ " "; value speclist = []; value main () = do { Argl.parse speclist (fun s -> bname.val := s) usage; let base = Gwdb.make_base (Iobase.input bname.val) in consmoy bname.val base } ; Printexc.catch main (); geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/gwbase/etc/geneanet.ml0000660000175200017530000002106612664543647026231 0ustar guillaumeguillaume(* $Id: geneanet.ml,v 4.16 2007-01-19 09:03:02 deraugla Exp $ *) open Def; open Gutil; open Gwdb; value limit_date = 1850; value sou base s = Ansel.to_iso_8859_1 (sou base s); value in_file = ref ""; value rec mark_ancestors base mark i = if mark.(i) = False then do { mark.(i) := True; match get_parents (poi base (Adef.iper_of_int i)) with [ Some ifam -> let cpl = foi base ifam in do { mark_ancestors base mark (Adef.int_of_iper (get_father cpl)); mark_ancestors base mark (Adef.int_of_iper (get_mother cpl)); } | None -> () ] } else () ; value main_title base = let val = fun [ "empereur" | "impératrice" -> 6 | "roi" | "reine" -> 5 | "prince" | "princesse" -> 4 | "duc" | "duchesse" -> 3 | "comte" | "comtesse" -> 2 | "vicomte" | "vicomtesse" -> 1 | _ -> 0 ] in let rec loop r = fun [ [] -> r | [x :: l] -> if x.t_name == Tmain then Some x else match r with [ Some t -> if val (sou base x.t_ident) > val (sou base t.t_ident) then loop (Some x) l else loop r l | None -> loop (Some x) l ] ] in loop None ; value min_or_max_date f a base p = let a = match Adef.od_of_codate (get_birth p) with [ Some (Dgreg d _) -> f d.year a | _ -> a ] in let a = match CheckItem.date_of_death (get_death p) with [ Some (Dgreg d _) -> f d.year a | _ -> a ] in let a = List.fold_left (fun a ifam -> let fam = foi base ifam in let a = match Adef.od_of_codate (get_marriage fam) with [ Some (Dgreg d _) -> f d.year a | _ -> a ] in let a = match get_divorce fam with [ Divorced cod -> match Adef.od_of_codate cod with [ Some (Dgreg d _) -> f d.year a | _ -> a ] | _ -> a ] in a) a (Array.to_list (get_family p)) in a ; value region_of_person base p = match main_title base (get_titles p) with [ Some t -> match sou base t.t_place with [ "d'Alsace" -> "ALS" | "d'Angleterre" -> "ENG" | "d'Aquitaine" -> "AQU" | "d'Aragon" -> "ARA" | "d'Auvergne" -> "AUV" | "de Castille" -> "CYL" | "d'Ulster" -> "ULS" | "d'Écosse" -> "SCT" | _ -> "" ] | _ -> "" ] ; value country_of_person base p = match main_title base (get_titles p) with [ Some t -> match sou base t.t_place with [ "d'Albanie" -> "ALB" | "d'Alsace" -> "FRA" | "d'Angleterre" -> "GBR" | "d'Aquitaine" -> "FRA" | "d'Aragon" -> "ESP" | "d'Athènes" -> "GRC" | "d'Autriche antérieure" -> "AUT" | "d'Autriche inférieure" -> "AUT" | "d'Autriche" -> "AUT" | "d'Autriche-Este" -> "AUT" | "d'Auvergne" -> "FRA" | "d'Espagne" -> "ESP" | "d'Irlande" -> "IRL" | "d'Italie" -> "ITA" | "d'Orléans" -> "FRA" | "d'Ulster" -> "GBR" | "d'Écosse" -> "GBR" | "de Belgique" | "des Belges" -> "BEL" | "de Brésil" -> "BRA" | "de Bulgarie" -> "BGR" | "de Castille" -> "ESP" | "de France" -> "FRA" | "de Grande-Bretagne" -> "GBR" | "de Grèce" -> "GRC" | "de Hongrie" -> "HUN" | "de Naples" -> "ITA" | "de Pologne" -> "POL" | "de Portugal" -> "PRT" | "de Roumanie" -> "ROM" | "de Suède" -> "SWE" | "" -> "" | x -> (* do Printf.eprintf "%s\n" x; flush stderr; return *) "" ] | _ -> "" ] ; value place_of_person base p = let s = sou base (get_birth_place p) in if s <> "" then s else let s = sou base (get_death_place p) in if s <> "" then s else List.fold_left (fun s ifam -> if s <> "" then s else let fam = foi base ifam in sou base (get_marriage_place fam)) "" (Array.to_list (get_family p)) ; value info_of_person base p = match main_title base (get_titles p) with [ Some t -> let title = sou base t.t_ident in let place = sou base t.t_place in if place <> "" && place <> sou base (get_surname p) then title ^ " " ^ place else title | None -> sou base (get_occupation p) ] ; value infinity = 10000; value begin_of_person base p = min_or_max_date min infinity base p; value end_of_person base p = min_or_max_date max 0 base p; value to_be_inserted base p = let b = end_of_person base p in if b = 0 then False else b < limit_date ; type line = { name : string; info : mutable string; dbeg : mutable int; dend : mutable int; nbindi : mutable int; place : string; subregion : string; region : string; country : string } ; value line_of_person base p = {name = sou base (get_surname p); info = info_of_person base p; dbeg = begin_of_person base p; dend = end_of_person base p; nbindi = 1; place = place_of_person base p; subregion = ""; region = region_of_person base p; country = country_of_person base p} ; value compare_lines l1 l2 = if l1.name < l2.name then -1 else if l1.name > l2.name then 1 else if l1.place < l2.place then -1 else if l1.place > l2.place then 1 else if l1.subregion < l2.subregion then -1 else if l1.subregion > l2.subregion then 1 else if l1.region < l2.region then -1 else if l1.region > l2.region then 1 else if l1.country < l2.country then -1 else if l1.country > l2.country then 1 else 0 ; module Line = Map.Make (struct type t = line; value compare = compare_lines; end) ; value print_line line = (**) if line.info <> "" || line.dbeg <> infinity || line.dend <> 0 || line.nbindi > 5 || line.place <> "" || line.subregion <> "" then do { (**) Printf.printf "%s;" line.name; Printf.printf "%s;" line.info; if line.dbeg = infinity then Printf.printf ";" else Printf.printf "%d;" line.dbeg; if line.dend = 0 then Printf.printf ";" else Printf.printf "%d;" line.dend; Printf.printf "%d;" line.nbindi; Printf.printf "%s;" line.place; Printf.printf "%s;" line.subregion; Printf.printf "%s;" line.region; Printf.printf "%s;" line.country; Printf.printf "M"; Printf.printf "\n"; () } else (**) () ; value order_lines l1 l2 = if l1.name <> l2.name then Gutil.alphabetic l1.name l2.name < 0 else if l1.info < l2.info then True else if l1.info > l2.info then False else if l1.dbeg < l2.dbeg then True else if l1.dbeg > l2.dbeg then False else if l1.dend < l2.dend then True else if l1.dend > l2.dend then False else if l1.place < l2.place then True else if l1.place > l2.place then False else if l1.subregion < l2.subregion then True else if l1.subregion > l2.subregion then False else if l1.region < l2.region then True else if l1.region > l2.region then False else if l1.country < l2.country then True else if l1.country > l2.country then False else True ; value geneanet base = let mark = Array.make (nb_of_persons base) False in let lines = ref Line.empty in do { load_ascends_array base; load_unions_array base; load_couples_array base; for i = 0 to nb_of_persons base - 1 do { if mark.(i) then () else if to_be_inserted base (poi base (Adef.iper_of_int i)) then mark_ancestors base mark i else () }; for i = 0 to nb_of_persons base - 1 do { let p = poi base (Adef.iper_of_int i) in let surname = sou base (get_surname p) in if mark.(i) && surname <> "?" && surname <> "x" then let line = line_of_person base p in try let line1 = Line.find line lines.val in do { line1.dbeg := min line.dbeg line1.dbeg; line1.dend := max line.dend line1.dend; line1.nbindi := line1.nbindi + 1; if line1.info = "" || line.dbeg = line1.dbeg then line1.info := line.info else (); () } with [ Not_found -> lines.val := Line.add line line lines.val ] else () }; (let list = Line.fold (fun _ line list -> [line :: list]) lines.val [] in let list = Sort.list order_lines list in List.iter print_line list); () } ; value main () = let speclist = [] in let errmsg = "Usage: geneanet " in do { Argl.parse speclist (fun s -> in_file.val := s) errmsg; if in_file.val = "" then do { Printf.eprintf "Missing file\n"; Printf.eprintf "Use option -help for usage\n"; flush stderr; exit 1 } else (); let base = Gwdb.open_base in_file.val in geneanet base; flush stdout; } ; Printexc.catch main (); geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/gwbase/etc/titres.ml0000660000175200017530000000205312664543647025750 0ustar guillaumeguillaume(* camlp4r *) (* $Id: titres.ml,v 1.4 2006-10-30 09:37:58 deraugla Exp $ *) open Def; open Gwdb; open Printf; module Buff = Buff.Make (struct value buff = ref (Bytes.create 80); end); value lower_utf_8 s = loop 0 0 where rec loop i len = if i >= String.length s then Buff.get len else let c = if Name.nbc s.[i] = 1 then Char.lowercase s.[i] else s.[i] in loop (i + 1) (Buff.store len c) ; value titres bname = let base = Gwdb.open_base bname in do { for i = 0 to nb_of_persons base - 1 do { let p = poi base (Adef.iper_of_int i) in List.iter (fun t -> printf "%s/%s\n" (lower_utf_8 (sou base t.t_ident)) (lower_utf_8 (sou base t.t_place))) (get_titles p) }; flush stdout; } ; value bname = ref ""; value speclist = [] ; value anonfun i = bname.val := i; value usage = "Usage: titres base"; value main () = do { Arg.parse speclist anonfun usage; if bname.val = "" then do { Arg.usage speclist usage; exit 2; } else (); titres bname.val } ; main (); geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/gwbase/etc/geneanet.head0000660000175200017530000000023312664543647026513 0ustar guillaumeguillaumeenvoyer à database@geneanet.org subject: submit Sourcename: roglo Password: iyacubmqvm Defaultcountry: FRA Defaultregion: Defaultsubregion: Delimiter: ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/gwbase/etc/chkimg.ml0000660000175200017530000000330012664543647025674 0ustar guillaumeguillaume(* $Id: chkimg.ml,v 4.9 2007-09-04 03:06:50 deraugla Exp $ *) (* Copyright (c) 2000 INRIA *) open Gutil; open Def; open Printf; value get_images_names bname = let dh = Unix.opendir (Filename.concat "images" bname) in let list = ref [] in do { try while True do { list.val := [Unix.readdir dh :: list.val] } with [ End_of_file -> () ]; Unix.closedir dh; list.val } ; value check_key_aux base ifname fname = try let d2 = String.rindex fname '.' in let d1 = String.rindex_from fname (d2 - 1) '.' in do { if d2 = d1 then raise Not_found else (); let fn = String.sub fname 0 d1 in let sn = String.sub fname (d2 + 1) (String.length fname - d2 - 1) in let oc = int_of_string (String.sub fname (d1 + 1) (d2 - d1 - 1)) in let ip = Gwdb.person_of_key base fn sn oc in if ip = None then raise Not_found else () } with [ Not_found -> do { printf "... nobody: %s\n" ifname; flush stdout } | x -> do { printf "error at %s\n" fname; flush stdout; raise x } ] ; value check_key base fname = if Filename.check_suffix fname ".jpg" then check_key_aux base fname (Filename.chop_suffix fname ".jpg") else if Filename.check_suffix fname ".gif" then check_key_aux base fname (Filename.chop_suffix fname ".gif") else printf "... alone: %s\n" fname ; value chkimg bname base = let list = get_images_names bname in do { List.iter (check_key base) list; flush stdout } ; value bname = ref ""; value usage = "usage: " ^ Sys.argv.(0) ^ " "; value speclist = []; value main () = do { Argl.parse speclist (fun s -> bname.val := s) usage; let base = Gwdb.open_base bname.val in chkimg bname.val base } ; Printexc.catch main (); geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/gwbase/etc/cleopatre.ml0000660000175200017530000000140312664543647026412 0ustar guillaumeguillaume(* $Id: cleopatre.ml,v 4.10 2006-12-23 22:47:37 deraugla Exp $ *) open Def; open Gwdb; value main bname = let base = Gwdb.open_base bname in let ip1 = Gwlib.add_indi base ("Ptolémée", "d'Égypte", 0) Male in let ip2 = Gwlib.add_indi base ("Cléopâtre", "d'Égypte", 0) Female in do { (let rec loop n ip1 ip2 = if n = 50 then () else let x = string_of_int n in let ip3 = Gwlib.add_indi base ("Ptolémée " ^ x, "d'Égypte", 0) Male in let ip4 = Gwlib.add_indi base ("Cléopâtre " ^ x, "d'Égypte", 0) Female in let _ifam = Gwlib.add_fam base ip1 ip2 [ip3; ip4] in loop (n + 1) ip3 ip4 in loop 2 ip1 ip2); commit_patches base; } ; main Sys.argv.(1); geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/gwbase/etc/clavier.ml0000660000175200017530000000047512664543647026071 0ustar guillaumeguillaume(* $Id: clavier.ml,v 4.1 2006-12-23 22:47:37 deraugla Exp $ *) value main () = do { for i = 0 to 255 do { if i >= 32 && i < 128 || i >= 161 then Printf.printf "%c " (Char.chr i) else Printf.printf ". "; if i mod 8 == 7 then Printf.printf "\n" else (); }; flush stdout; }; Printexc.catch main (); geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/gwbase/etc/h2u.sh0000770000175200017530000000475212664543647025150 0ustar guillaumeguillaume#!/bin/sh # $Id: h2u.sh,v 1.4 2005-07-26 12:13:24 ddr Exp $ # Conversion DOC -> WDOC dans GeneWeb cat $1 | sed \ -e 's/\r//g' \ -e 's/
    //g' \ -e 's/
    //g' \ -e 's|||g' \ -e 's|||g' \ -e 's|||g' \ -e 's|||g' \ -e 's/HREF/href/g' \ -e 's|||g' \ -e 's|<[aA] NAME|]*[^<]*$/{N' \ -e 's/\n/ /}' \ -e '/

    /{p' \ -e 's|^.*

    \(.*\)

    .*$|\1|' \ -e 's|<[^>]*>||g}' \ -e 's|

    |==|g' \ -e 's|

    |===|g' \ -e '/==/{' \ -e 't hh' \ -e ': hh' \ -e 's|

    ||' \ -e 's|||' \ -e 't ok' \ -e 'N' \ -e 'b hh' \ -e ': ok' \ -e 's/\n/ /g' \ -e 's|| ==|' \ -e 's|| ===|' \ -e 's|]*> *||g' \ -e 's|||g' \ -e 's|
    ||g' \ -e 't next' \ -e ': next' \ -e 's|]*>\).*$|\1|' \ -e 'G' \ -e 's|== *]*> *|== |' \ -e 's|== [0-9.]* *|== |' \ -e '}' \ -e '/$/{N' \ -e 's/\n//}' \ -e '/\([a-z]*\)|\1|g' \ -e 's|\([^<]*\)|[[[\1\2/\3]]]|g' \ -e 's|\[\[\[\([^]]*\)\]\]\]|[[[\1]]]|g' \ -e '//d' | sed \ -e 's|GeneWeb|{GeneWeb}|g' \ -e 's|GeneWeb|{GeneWeb}|g' \ -e 's|m=DOC;v=\(..\)/\([^.]*\)\.htm|lang=\1;m=WDOC;f=\2|'g \ -e 's/â/â/g' \ -e 's/À/À/g' \ -e 's/à\?/à/g' \ -e 's/Å\?/Ã…/g' \ -e 's/å\?/Ã¥/g' \ -e 's/Ä/Ä/g' \ -e 's/ä/ä/g' \ -e 's/Ç/Ç/g' \ -e 's/ç/ç/g' \ -e 's/è\?/è/g' \ -e 's/É/É/g' \ -e 's/é/é/g' \ -e 's/ê/ê/g' \ -e 's/ë\?/ë/g' \ -e 's/î/î/g' \ -e 's/ì\?/ì/g' \ -e 's/ï\?/ï/g' \ -e 's/ó/ó/g' \ -e 's/ô/ô/g' \ -e 's/ò/ò/g' \ -e 's/Ö/Ö/g' \ -e 's/ö\?/ö/g' \ -e 's/ß/ß/g' \ -e 's/ù\?/ù/g' \ -e 's/û/û/g' \ -e 's/Ü/Ü/g' \ -e 's/ü/ü/g' \ -e '1a\' \ -e 'aaa' | sed \ -e '2,/^ *$/d' \ -e '1a\' \ -e '' geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/gwbase/etc/.depend0000660000175200017530000001024412664543647025345 0ustar guillaumeguillaumechkimg.cmo: $(GWB)/src/argl.cmo $(GWB)/src/def.cmi \ $(GWB)/src/gutil.cmi $(GWB)/src/gwdb.cmi chkimg.cmx: $(GWB)/src/argl.cmx $(GWB)/src/def.cmi \ $(GWB)/src/gutil.cmx $(GWB)/src/gwdb.cmx cleopatre.cmo: $(GWB)/src/def.cmi $(GWB)/src/gwdb.cmi \ gwlib.cmo cleopatre.cmx: $(GWB)/src/def.cmi $(GWB)/src/gwdb.cmx \ gwlib.cmx connex.cmo: $(GWB)/src/adef.cmi $(GWB)/src/def.cmi \ $(GWB)/src/gutil.cmi $(GWB)/src/gwdb.cmi \ $(GWB)/src/lock.cmi $(GWB)/src/mutil.cmi connex.cmx: $(GWB)/src/adef.cmx $(GWB)/src/def.cmi \ $(GWB)/src/gutil.cmx $(GWB)/src/gwdb.cmx \ $(GWB)/src/lock.cmx $(GWB)/src/mutil.cmx consmoy.cmo: $(GWB)/src/adef.cmi $(GWB)/src/argl.cmo \ $(GWB)/src/def.cmi $(GWB)/src/gwdb.cmi consmoy.cmx: $(GWB)/src/adef.cmx $(GWB)/src/argl.cmx \ $(GWB)/src/def.cmi $(GWB)/src/gwdb.cmx geneanet.cmo: $(GWB)/src/adef.cmi $(GWB)/src/ansel.cmo \ $(GWB)/src/argl.cmo $(GWB)/src/checkItem.cmi \ $(GWB)/src/def.cmi $(GWB)/src/gutil.cmi \ $(GWB)/src/gwdb.cmi geneanet.cmx: $(GWB)/src/adef.cmx $(GWB)/src/ansel.cmx \ $(GWB)/src/argl.cmx $(GWB)/src/checkItem.cmx \ $(GWB)/src/def.cmi $(GWB)/src/gutil.cmx \ $(GWB)/src/gwdb.cmx gwck.cmo: $(GWB)/src/adef.cmi $(GWB)/src/def.cmi \ $(GWB)/src/gwdb.cmi $(GWB)/src/lock.cmi \ $(GWB)/src/mutil.cmi $(GWB)/src/progrBar.cmi gwck.cmx: $(GWB)/src/adef.cmx $(GWB)/src/def.cmi \ $(GWB)/src/gwdb.cmx $(GWB)/src/lock.cmx \ $(GWB)/src/mutil.cmx $(GWB)/src/progrBar.cmx gwlib.cmo: $(GWB)/src/adef.cmi $(GWB)/src/def.cmi \ $(GWB)/src/gwdb.cmi gwlib.cmx: $(GWB)/src/adef.cmx $(GWB)/src/def.cmi \ $(GWB)/src/gwdb.cmx hist.cmo: $(GWB)/src/argl.cmo $(GWB)/src/def.cmi \ $(GWB)/src/gutil.cmi $(GWB)/src/gwdb.cmi hist.cmx: $(GWB)/src/argl.cmx $(GWB)/src/def.cmi \ $(GWB)/src/gutil.cmx $(GWB)/src/gwdb.cmx lune.cmo: $(GWB)/src/adef.cmi $(GWB)/src/calendar.cmi \ $(GWB)/src/def.cmi $(GWB)/src/gwdb.cmi lune.cmx: $(GWB)/src/adef.cmx $(GWB)/src/calendar.cmx \ $(GWB)/src/def.cmi $(GWB)/src/gwdb.cmx modif.cmo: $(GWB)/src/adef.cmi $(GWB)/src/def.cmi \ $(GWB)/src/gutil.cmi $(GWB)/src/name.cmi modif.cmx: $(GWB)/src/adef.cmx $(GWB)/src/def.cmi \ $(GWB)/src/gutil.cmx $(GWB)/src/name.cmx nbdesc.cmo: $(GWB)/src/adef.cmi $(GWB)/src/def.cmi \ $(GWB)/src/gwdb.cmi $(GWB)/src/mutil.cmi \ $(GWB)/src/progrBar.cmi nbdesc.cmx: $(GWB)/src/adef.cmx $(GWB)/src/def.cmi \ $(GWB)/src/gwdb.cmx $(GWB)/src/mutil.cmx \ $(GWB)/src/progrBar.cmx popule.cmo: $(GWB)/src/adef.cmi $(GWB)/src/buff.cmo \ $(GWB)/src/calendar.cmi $(GWB)/src/def.cmi \ $(GWB)/src/gwdb.cmi gwlib.cmo $(GWB)/src/mutil.cmi \ $(GWB)/src/outbase.cmi popule.cmx: $(GWB)/src/adef.cmx $(GWB)/src/buff.cmx \ $(GWB)/src/calendar.cmx $(GWB)/src/def.cmi \ $(GWB)/src/gwdb.cmx gwlib.cmx $(GWB)/src/mutil.cmx \ $(GWB)/src/outbase.cmx public.cmo: $(GWB)/src/adef.cmi \ $(GWB)/src/checkItem.cmi $(GWB)/src/def.cmi \ $(GWB)/src/gutil.cmi $(GWB)/src/gwdb.cmi public.cmx: $(GWB)/src/adef.cmx \ $(GWB)/src/checkItem.cmx $(GWB)/src/def.cmi \ $(GWB)/src/gutil.cmx $(GWB)/src/gwdb.cmx public2.cmo: $(GWB)/src/adef.cmi \ $(GWB)/src/checkItem.cmi $(GWB)/src/def.cmi \ $(GWB)/src/gutil.cmi $(GWB)/src/gwdb.cmi \ $(GWB)/src/progrBar.cmi public2.cmx: $(GWB)/src/adef.cmx \ $(GWB)/src/checkItem.cmx $(GWB)/src/def.cmi \ $(GWB)/src/gutil.cmx $(GWB)/src/gwdb.cmx \ $(GWB)/src/progrBar.cmx select.cmo: $(GWB)/src/adef.cmi $(GWB)/src/def.cmi \ $(GWB)/src/gutil.cmi $(GWB)/src/gwdb.cmi select.cmx: $(GWB)/src/adef.cmx $(GWB)/src/def.cmi \ $(GWB)/src/gutil.cmx $(GWB)/src/gwdb.cmx selroy.cmo: $(GWB)/src/adef.cmi $(GWB)/src/argl.cmo \ $(GWB)/src/buff.cmo $(GWB)/src/calendar.cmi \ $(GWB)/src/def.cmi $(GWB)/src/gutil.cmi \ $(GWB)/src/gwdb.cmi select.cmo selroy.cmx: $(GWB)/src/adef.cmx $(GWB)/src/argl.cmx \ $(GWB)/src/buff.cmx $(GWB)/src/calendar.cmx \ $(GWB)/src/def.cmi $(GWB)/src/gutil.cmx \ $(GWB)/src/gwdb.cmx select.cmx titres.cmo: $(GWB)/src/adef.cmi $(GWB)/src/buff.cmo \ $(GWB)/src/def.cmi $(GWB)/src/gwdb.cmi \ $(GWB)/src/name.cmi titres.cmx: $(GWB)/src/adef.cmx $(GWB)/src/buff.cmx \ $(GWB)/src/def.cmi $(GWB)/src/gwdb.cmx \ $(GWB)/src/name.cmx geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/gwbase/etc/synopsie.html0000660000175200017530000000212612664543647026644 0ustar guillaumeguillaume Synesthésie

    Synesthésie...

    Pour moi, les voyelles ou sons suivants, s'ils avaient des couleurs, ce seraient :

    a e i o u an on in



    geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/gwbase/etc/.cvsignore0000660000175200017530000000002612664543647026102 0ustar guillaumeguillaume*.cm[iox] *.out *.opt geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/gwbase/etc/utf8.sh0000770000175200017530000000132012664543647025324 0ustar guillaumeguillaume#!/bin/sh #cd (* exec ocaml camlp4r.cma $0 *) "."; (* $Id: utf8.sh,v 1.2 2005-07-22 01:46:29 ddr Exp $ *) for i = 0 to 127 do { print_char (Char.chr i); }; print_endline ""; for i = 0b11000000 to 0b11011111 do { Printf.printf "0x%02X00 " i; for j = 0b10000000 to 0b10111111 do { print_char (Char.chr i); print_char (Char.chr j); }; print_endline ""; }; print_endline ""; for i = 0b11100000 to 0b11101111 do { for j = 0b10000000 to 0b10111111 do { Printf.printf "0x%02X%02X00 " i j; for k = 0b10000000 to 0b10111111 do { print_char (Char.chr i); print_char (Char.chr j); print_char (Char.chr k); }; print_endline ""; }; print_endline ""; }; print_endline ""; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/gwbase/etc/hist.ml0000660000175200017530000000204012664543647025401 0ustar guillaumeguillaume(* $Id: hist.ml,v 4.7 2006-10-30 09:37:58 deraugla Exp $ *) (* Copyright (c) 1999 INRIA *) open Def; open Gutil; open Gwdb; open Printf; value line_tpl = "0000-00-00 00:00:00 xx ."; value person_of_line_exists base line = let i = try String.index line ']' + 2 with [ Not_found -> 20 ] in let key = String.sub line (i + 3) (String.length line - i - 3) in match person_ht_find_all base key with [ [ip] -> True | _ -> False ] ; value histselect bname base = let () = load_strings_array base in let ic = open_in (Filename.concat (bname ^ ".gwb") "history") in try while True do { let line = input_line ic in if person_of_line_exists base line then printf "%s\n" line else (); flush stdout } with [ End_of_file -> close_in ic ] ; value bname = ref ""; value usage = "usage: " ^ Sys.argv.(0) ^ " "; value speclist = []; value main () = do { Argl.parse speclist (fun s -> bname.val := s) usage; let base = Gwdb.open_base bname.val in histselect bname.val base } ; Printexc.catch main (); geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/gwbase/etc/Makefile.public0000660000175200017530000000115312664543647027021 0ustar guillaumeguillaume# $Id: Makefile.public,v 1.4 2008-03-31 11:36:28 deraugla Exp $ GW=../../geneweb/src OBJS=$(GW)/secure.cmo $(GW)/buff.cmo $(GW)/name.cmo $(GW)/iovalue.cmo $(GW)/mutil.cmo $(GW)/db2.cmo $(GW)/adef.cmo $(GW)/db2disk.cmo $(GW)/futil.cmo $(GW)/btree.cmo $(GW)/dutil.cmo $(GW)/database.cmo $(GW)/gwdb.cmo $(GW)/checkItem.cmo $(GW)/gutil.cmo all: public public2 clean: rm -f *.o *.cm[iox] public public2 public: public.cmx ocamlopt.opt unix.cmxa $(OBJS:.cmo=.cmx) $< -o $@ public2: public2.cmx ocamlopt.opt unix.cmxa $(OBJS:.cmo=.cmx) $(GW)/progrBar.cmx $< -o $@ %.cmx: %.ml ocamlopt.opt -c -pp camlp5r -I $(GW) $< geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/gwbase/etc/gwlib.ml0000660000175200017530000000427212664543647025547 0ustar guillaumeguillaume(* $Id: gwlib.ml,v 4.21 2007-01-18 19:44:50 deraugla Exp $ *) open Def; open Gwdb; value add_indi base (fn, sn, nb) sex = let ip = Adef.iper_of_int (nb_of_persons base) in let empty_string = insert_string base "" in let np = {first_name = insert_string base fn; surname = insert_string base sn; occ = nb; image = empty_string; public_name = empty_string; qualifiers = []; aliases = []; first_names_aliases = []; surnames_aliases = []; titles = []; rparents = []; related = []; occupation = empty_string; sex = sex; access = IfTitles; birth = Adef.codate_None; birth_place = empty_string; birth_src = empty_string; baptism = Adef.codate_None; baptism_place = empty_string; baptism_src = empty_string; death = NotDead; death_place = empty_string; death_src = empty_string; burial = UnknownBurial; burial_place = empty_string; burial_src = empty_string; notes = empty_string; psources = empty_string; key_index = ip} in let na = {parents = None; consang = Adef.fix (-1)} in let nu = {family = [| |]} in do { patch_person base ip np; patch_ascend base ip na; patch_union base ip nu; ip } ; value add_fam base fath moth children = let ifam = Adef.ifam_of_int (nb_of_families base) in let empty_string = insert_string base "" in let fam = {marriage = Adef.codate_None; marriage_place = empty_string; marriage_src = empty_string; witnesses = [| |]; relation = Married; divorce = NotDivorced; comment = empty_string; origin_file = empty_string; fsources = empty_string; fam_index = ifam} in let cpl = Adef.couple fath moth in let des = {children = Array.of_list children} in let ufath = poi base fath in let umoth = poi base moth in do { patch_family base ifam fam; patch_couple base ifam cpl; patch_descend base ifam des; let ufath = {family = Array.append (get_family ufath) [| ifam |]} in patch_union base fath ufath; let umoth = {family = Array.append (get_family umoth) [| ifam |]} in patch_union base moth umoth; List.iter (fun ip -> let a = {parents = Some ifam; consang = Adef.fix (-1)} in patch_ascend base ip a) children; ifam } ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/gwbase/etc/public2.ml0000660000175200017530000001070212664543647025776 0ustar guillaumeguillaume(* camlp4r *) (* $Id: public2.ml,v 4.1 2008-03-31 11:34:34 deraugla Exp $ *) open Printf; open Def; open Gwdb; value year_of p = match (Adef.od_of_codate (get_birth p), Adef.od_of_codate (get_baptism p), get_death p, CheckItem.date_of_death (get_death p)) with [ (_, _, NotDead, _) -> None | (Some (Dgreg d _), _, _, _) -> Some d.year | (_, Some (Dgreg d _), _, _) -> Some d.year | (_, _, _, Some (Dgreg d _)) -> Some d.year | _ -> None ] ; value find_dated_ancestor base p = loop 1 [get_key_index p] where rec loop nb_gen iplist = if iplist = [] then None else let anc_list = List.fold_left (fun anc_list ip -> match get_parents (poi base ip) with [ Some ifam -> let fam = foi base ifam in [get_mother fam; get_father fam :: anc_list] | None -> anc_list ]) [] iplist in loop_ind anc_list where rec loop_ind = fun [ [ip :: iplist] -> let p = poi base ip in match year_of p with [ Some year -> Some (p, year, nb_gen) | None -> loop_ind iplist ] | [] -> loop (nb_gen + 1) anc_list ] ; value nb_years_by_gen = 30; value change_somebody_access base lim_year trace p year_of_p = if year_of_p = None && get_access p = IfTitles then match find_dated_ancestor base p with [ Some (a, year, nb_gen) -> do { let acc = if year + nb_gen * nb_years_by_gen > lim_year then Private else Public in let gp = {(gen_person_of_person p) with access = acc} in patch_person base gp.key_index gp; if trace then do { printf "%s -> " (Gutil.designation base p); if acc = Private then printf "private" else printf "public"; printf " (anc %d gen %s year %d)" nb_gen (Gutil.designation base a) year; printf "\n"; flush stdout; Some acc } else None } | None -> None ] else None ; value public_all bname lim_year trace = do { let base = Gwdb.open_base bname in let () = load_ascends_array base in let () = load_couples_array base in let n = nb_of_persons base in let changes = ref False in ProgrBar.start (); for i = 0 to n - 1 do { ProgrBar.run i n; let ip = Adef.iper_of_int i in let p = poi base ip in if year_of p = None && get_access p = IfTitles then do { match change_somebody_access base lim_year trace p (year_of p) with [ Some _ -> changes.val := True | None -> let fama = get_family p in loop 0 where rec loop i = if i = Array.length fama then () else let ifam = fama.(i) in let isp = Gutil.spouse ip (foi base ifam) in let sp = poi base isp in let year_of_sp = year_of sp in let acc_opt = match year_of_sp with [ Some year -> Some (if year > lim_year then Private else Public) | None -> change_somebody_access base lim_year trace sp year_of_sp ] in match acc_opt with [ Some acc -> do { let gp = {(gen_person_of_person p) with access = acc} in patch_person base gp.key_index gp; changes.val := True; if trace then do { printf "%s -> " (Gutil.designation base p); if acc = Private then printf "private" else printf "public"; printf " (inherited from spouse %s)" (Gutil.designation base sp); printf "\n"; flush stdout; } else (); } | None -> loop (i + 1) ] ] } else (); }; if changes.val then commit_patches base else (); ProgrBar.finish (); }; value lim_year = ref 1850; value trace = ref False; value bname = ref ""; value speclist = [("-y", Arg.Int (fun i -> lim_year.val := i), "limit year (default = " ^ string_of_int lim_year.val ^ ")"); ("-t", Arg.Set trace, "trace changed persons")] ; value anonfun i = bname.val := i; value usage = "Usage: public [-y #] [-t] base"; value main () = do { Arg.parse speclist anonfun usage; if bname.val = "" then do { Arg.usage speclist usage; exit 2; } else (); public_all bname.val lim_year.val trace.val; }; main (); geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/gwbase/etc/modif.ml0000660000175200017530000000464512664543647025545 0ustar guillaumeguillaume(* $Id: modif.ml,v 4.4 2005-01-17 12:53:08 ddr Exp $ *) (* Copyright (c) 1999 INRIA *) open Def; open Gutil; open Printf; value insert_string base s = try base.func.index_of_string s with [ Not_found -> let i = Adef.istr_of_int base.data.strings.len in do { base.func.patch_string i s; i } ] ; value has_infos p = match p.death with [ Death _ _ -> True | _ -> False ] ; value modif base = let changes = ref False in do { for i = 0 to base.data.persons.len - 1 do { let p = base.data.persons.get i in let fn = p_first_name base p in let sn = p_surname base p in if match fn with [ "ne" -> True | _ -> False ] then do { eprintf "."; flush stderr; let fn' = match p.sex with [ Male -> "Nn" | Female -> "Ne" | _ -> "N" ] in let sn' = sn in try let p' = person_ht_find_unique base fn' sn' p.occ in do { eprintf "\nconflit %s avec %s..." (designation base p) (designation base (poi base p')); flush stderr; let occ' = Gutil.find_free_occ base fn' sn' 0 in eprintf " rempl occ par %d\n" occ'; flush stderr; p.occ := occ'; raise Not_found; (* comme ça, ça fait le reste... *) } with [ Not_found -> do { p.first_name := insert_string base fn'; p.surname := insert_string base sn'; base.func.patch_person p.cle_index p; base.func.patch_name (Name.lower (fn' ^ " " ^ sn')) p.cle_index; changes.val := True; } ]; } else () }; if changes.val then do { base.func.commit_patches (); eprintf " Attention: il n'est pas sûr que les index aient été complètement mis à jour. Pour faire bien, il faudrait vérifier si le programme le fait correctement. Dans le doute, il est probablement préférable de faire gwu et gwc (nettoyage) pour compléter le travail et avoir une base correcte. On peut encore annuler les modifs en supprimant le fichier patches, s'il était vide au départ."; flush stderr; } else (); eprintf "\n"; flush stderr; } ; value bname = ref ""; value usage = "usage: " ^ Sys.argv.(0) ^ " "; value speclist = []; value main () = let cnt = ref 0 in do { Arg.parse speclist (fun s -> bname.val := s) usage; let base = Iobase.input bname.val in modif base; } ; main (); geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/gwbase/etc/selroy.ml0000660000175200017530000006714312664543647025766 0ustar guillaumeguillaume(* $Id: selroy.ml,v 4.20 2007-01-19 09:04:03 deraugla Exp $ *) (* Copyright (c) 2000-2006 INRIA *) open Def; open Gutil; open Gwdb; type mfam = { m_ifam : ifam; m_fam : family; m_fath : person; m_moth : person; m_chil : array person } ; value soy y = if y == 0 then "-0" else string_of_int y; value print_date_dmy oc d = do { match d.prec with [ About -> Printf.fprintf oc "~" | Maybe -> Printf.fprintf oc "?" | Before -> Printf.fprintf oc "<" | After -> Printf.fprintf oc ">" | _ -> () ]; if d.day == 0 && d.month == 0 then Printf.fprintf oc "%s" (soy d.year) else if d.day == 0 then Printf.fprintf oc "%d/%s" d.month (soy d.year) else Printf.fprintf oc "%d/%d/%s" d.day d.month (soy d.year); match d.prec with [ OrYear y -> Printf.fprintf oc "|%s" (soy y) | YearInt y -> Printf.fprintf oc "..%s" (soy y) | _ -> () ]; () } ; value spaces_to_underscore s = do { for i = 0 to String.length s - 1 do { if s.[i] = ' ' then Bytes.set s i '_' else () }; s } ; value print_date oc = fun [ Dgreg d Dgregorian -> print_date_dmy oc d | Dgreg d Djulian -> do { print_date_dmy oc (Calendar.julian_of_gregorian d); Printf.fprintf oc "J"; () } | Dgreg d Dfrench -> do { print_date_dmy oc (Calendar.french_of_gregorian d); Printf.fprintf oc "F"; () } | Dgreg d Dhebrew -> do { print_date_dmy oc (Calendar.hebrew_of_gregorian d); Printf.fprintf oc "H"; () } | Dtext t -> Printf.fprintf oc "0(%s)" (spaces_to_underscore t) ] ; value print_date_option oc = fun [ Some d -> print_date oc d | None -> () ] ; value starting_char s = match s.[0] with [ 'a'..'z' | 'A'..'Z' | 'à'..'ý' | 'À'..'Ý' | ' ' -> True | '?' -> if s = "?" then True else False | _ -> False ] ; value gen_correct_string no_colon s = loop 0 0 where rec loop i len = if i == String.length s then Buff.get len else if i == 0 && not (starting_char s) then loop (i + 1) (Buff.store (Buff.store len '_') s.[0]) else match s.[i] with [ ' ' -> loop (i + 1) (Buff.store len '_') | '_' | '\\' -> loop (i + 1) (Buff.store (Buff.store len '\\') s.[i]) | ':' when no_colon -> let len = Buff.store len '\\' in loop (i + 1) (Buff.store (Buff.store len '\\') s.[i]) | c -> loop (i + 1) (Buff.store len c) ] ; value s_correct_string = gen_correct_string False; value correct_string base is = s_correct_string (sou base is); value correct_string_no_colon base is = gen_correct_string True (sou base is); value has_infos_not_dates base p = get_first_names_aliases p <> [] || get_surnames_aliases p <> [] || sou base (get_public_name p) <> "" || get_qualifiers p <> [] || get_aliases p <> [] || get_titles p <> [] || sou base (get_occupation p) <> "" || sou base (get_birth_place p) <> "" || sou base (get_baptism_place p) <> "" || sou base (get_death_place p) <> "" || sou base (get_psources p) <> "" ; value has_infos base p = has_infos_not_dates base p || get_birth p <> Adef.codate_None || get_baptism p <> Adef.codate_None || get_death p <> NotDead ; value print_if_no_empty oc base lab is = if sou base is = "" then () else Printf.fprintf oc " %s %s" lab (correct_string base is) ; value print_first_name_alias oc base is = Printf.fprintf oc " {%s}" (correct_string base is) ; value print_surname_alias oc base is = Printf.fprintf oc " #salias %s" (correct_string base is) ; value print_nick_name oc base is = Printf.fprintf oc " #nick %s" (correct_string base is) ; value print_alias oc base is = Printf.fprintf oc " #alias %s" (correct_string base is) ; value print_burial oc base b = match b with [ Buried cod -> do { Printf.fprintf oc " #buri"; match Adef.od_of_codate cod with [ Some d -> do { Printf.fprintf oc " "; print_date oc d; () } | _ -> () ]; () } | Cremated cod -> do { Printf.fprintf oc " #crem"; match Adef.od_of_codate cod with [ Some d -> do { Printf.fprintf oc " "; print_date oc d; () } | _ -> () ]; () } | UnknownBurial -> () ] ; value print_title oc base t = let t_date_start = Adef.od_of_codate t.t_date_start in let t_date_end = Adef.od_of_codate t.t_date_end in do { Printf.fprintf oc " ["; match t.t_name with [ Tmain -> Printf.fprintf oc "*" | Tname s -> Printf.fprintf oc "%s" (correct_string base s) | Tnone -> () ]; Printf.fprintf oc ":"; Printf.fprintf oc "%s" (correct_string_no_colon base t.t_ident); Printf.fprintf oc ":"; Printf.fprintf oc "%s" (correct_string_no_colon base t.t_place); if t.t_nth <> 0 then Printf.fprintf oc ":" else match (t_date_start, t_date_end) with [ (Some _, _) | (_, Some _) -> Printf.fprintf oc ":" | _ -> () ]; print_date_option oc t_date_start; if t.t_nth <> 0 then Printf.fprintf oc ":" else match t_date_end with [ Some _ -> Printf.fprintf oc ":" | _ -> () ]; print_date_option oc t_date_end; if t.t_nth <> 0 then Printf.fprintf oc ":%d" t.t_nth else (); Printf.fprintf oc "]"; () } ; (* main_title = backward compatibility (installed version 2.01); should be removed one day... *) value main_title = let val = fun [ "empereur" | "impératrice" -> 6 | "roi" | "reine" -> 5 | "prince" | "princesse" -> 4 | "duc" | "duchesse" -> 3 | "comte" | "comtesse" -> 2 | "vicomte" | "vicomtesse" -> 1 | _ -> 0 ] in fun base p -> let rec loop r = fun [ [] -> r | [x :: l] -> if x.t_name == Tmain then Some x else match r with [ Some t -> if val (sou base x.t_ident) > val (sou base t.t_ident) then loop (Some x) l else loop r l | None -> loop (Some x) l ] ] in loop None p.titles ; value print_infos oc base is_child print_sources p = do { List.iter (print_first_name_alias oc base) (get_first_names_aliases p); List.iter (print_surname_alias oc base) (get_surnames_aliases p); match get_public_name p with [ s when sou base s <> "" -> Printf.fprintf oc " (%s)" (correct_string base s) | _ -> () ]; print_if_no_empty oc base "#image" (get_image p); List.iter (print_nick_name oc base) (get_qualifiers p); List.iter (print_alias oc base) (get_aliases p); (* backward compatibility (installed version 2.01) match p.titles with [ [_] | [] -> () | [t0 :: _] -> match main_title base p with [ Some t -> if t = t0 then () else t.t_name := Tmain | _ -> () ] ]; *) List.iter (print_title oc base) (get_titles p); match get_access p with [ IfTitles -> () | Public -> Printf.fprintf oc " #apubl" | Private -> Printf.fprintf oc " #apriv" ]; print_if_no_empty oc base "#occu" (get_occupation p); if print_sources then print_if_no_empty oc base "#src" (get_psources p) else (); match Adef.od_of_codate (get_birth p) with [ Some d -> do { Printf.fprintf oc " "; print_date oc d; () } | _ -> if get_baptism p <> Adef.codate_None then () else match get_death p with [ Death _ _ | DeadYoung | DeadDontKnowWhen -> Printf.fprintf oc " 0" | DontKnowIfDead when not is_child && not (has_infos_not_dates base p) && p_first_name base p <> "?" && p_surname base p <> "?" -> Printf.fprintf oc " 0" | _ -> () ] ]; print_if_no_empty oc base "#bp" (get_birth_place p); print_if_no_empty oc base "#bs" (get_birth_src p); match Adef.od_of_codate (get_baptism p) with [ Some d -> do { Printf.fprintf oc " !"; print_date oc d; () } | _ -> () ]; print_if_no_empty oc base "#pp" (get_baptism_place p); print_if_no_empty oc base "#ps" (get_baptism_src p); match get_death p with [ Death dr d -> do { Printf.fprintf oc " "; match dr with [ Killed -> Printf.fprintf oc "k" | Murdered -> Printf.fprintf oc "m" | Executed -> Printf.fprintf oc "e" | Disappeared -> Printf.fprintf oc "s" | _ -> () ]; print_date oc (Adef.date_of_cdate d); () } | DeadYoung -> Printf.fprintf oc " mj" | DeadDontKnowWhen -> Printf.fprintf oc " 0" | DontKnowIfDead -> match (Adef.od_of_codate (get_birth p), Adef.od_of_codate (get_baptism p)) with [ (Some _, _) | (_, Some _) -> Printf.fprintf oc " ?" | _ -> () ] | NotDead -> () ]; print_if_no_empty oc base "#dp" (get_death_place p); print_if_no_empty oc base "#ds" (get_death_src p); print_burial oc base (get_burial p); print_if_no_empty oc base "#rp" (get_burial_place p); print_if_no_empty oc base "#rs" (get_burial_src p); () } ; value print_parent oc base mark fam_sel fam p = let has_printed_parents = match get_parents p with [ Some ifam -> fam_sel ifam | None -> False ] in let first_parent_definition = if mark.(Adef.int_of_iper (get_key_index p)) then False else do { mark.(Adef.int_of_iper (get_key_index p)) := True; True } in let pr = not has_printed_parents && first_parent_definition in let has_infos = if pr then has_infos base p else False in let first_name = sou base (get_first_name p) in let surname = sou base (get_surname p) in do { Printf.fprintf oc "%s %s%s" (s_correct_string surname) (s_correct_string first_name) (if get_occ p == 0 || first_name = "?" || surname = "?" then "" else "." ^ string_of_int (get_occ p)); if pr then if has_infos then print_infos oc base False True p else if first_name <> "?" && surname <> "?" then Printf.fprintf oc " 0" else () else (); () } ; value print_child oc base fam_surname print_sources p = do { Printf.fprintf oc "-"; match get_sex p with [ Male -> Printf.fprintf oc " h" | Female -> Printf.fprintf oc " f" | _ -> () ]; Printf.fprintf oc " %s" (s_correct_string (sou base (get_first_name p))); if get_occ p == 0 || p_first_name base p = "?" || p_surname base p = "?" then () else Printf.fprintf oc ".%d" (get_occ p); if get_surname p <> fam_surname then Printf.fprintf oc " %s" (s_correct_string (sou base (get_surname p))) else (); print_infos oc base True print_sources p; Printf.fprintf oc "\n"; () } ; value bogus_person base p = p_first_name base p = "?" && p_surname base p = "?" ; value common_children_sources base children = if Array.length children <= 1 then None else let rec loop i src = if i == Array.length children then let s = sou base src in if s = "" then None else Some src else let p = children.(i) in if get_psources p == src then loop (i + 1) src else None in loop 1 (get_psources children.(0)) ; value array_forall f a = loop 0 where rec loop i = if i == Array.length a then True else if f a.(i) then loop (i + 1) else False ; value empty_family base m = bogus_person base m.m_fath && bogus_person base m.m_moth && array_forall (bogus_person base) m.m_chil ; value print_witness oc base mark p notes_pl_p = do { Printf.fprintf oc "%s %s%s" (correct_string base (get_surname p)) (correct_string base (get_first_name p)) (if get_occ p = 0 then "" else "." ^ string_of_int (get_occ p)); if Array.length (get_family p) = 0 && get_parents p = None && not mark.(Adef.int_of_iper (get_key_index p)) then do { mark.(Adef.int_of_iper (get_key_index p)) := True; if has_infos base p then print_infos oc base False True p else Printf.fprintf oc " 0"; match sou base (get_notes p) with [ "" -> () | _ -> notes_pl_p.val := [p :: notes_pl_p.val] ]; () } else (); () } ; value print_family oc base mark (per_sel, fam_sel) fam_done notes_pl_p m = let fam = m.m_fam in do { Printf.fprintf oc "fam "; print_parent oc base mark fam_sel fam m.m_fath; Printf.fprintf oc " +"; print_date_option oc (Adef.od_of_codate (get_marriage fam)); match get_relation fam with [ NotMarried -> Printf.fprintf oc " #nm" | Engaged -> Printf.fprintf oc " #eng" | _ -> () ]; print_if_no_empty oc base "#mp" (get_marriage_place fam); print_if_no_empty oc base "#ms" (get_marriage_src fam); match get_divorce fam with [ NotDivorced | Separated -> () | Divorced d -> let d = Adef.od_of_codate d in do { Printf.fprintf oc " -"; print_date_option oc d; () } ]; Printf.fprintf oc " "; print_parent oc base mark fam_sel fam m.m_moth; Printf.fprintf oc "\n"; Array.iter (fun ip -> let p = poi base ip in do { Printf.fprintf oc "wit"; match get_sex p with [ Male -> Printf.fprintf oc " m" | Female -> Printf.fprintf oc " f" | _ -> () ]; Printf.fprintf oc ": "; print_witness oc base mark p notes_pl_p; Printf.fprintf oc "\n"; () }) (get_witnesses fam); match sou base (get_fsources fam) with [ "" -> () | s -> Printf.fprintf oc "src %s\n" (correct_string base (get_fsources fam)) ]; let print_sources = match common_children_sources base m.m_chil with [ Some s -> do { Printf.fprintf oc "csrc %s\n" (correct_string base s); False } | _ -> True ] in do { match get_comment fam with [ txt when sou base txt <> "" -> Printf.fprintf oc "comm %s\n" (sou base txt) | _ -> () ]; match Array.length m.m_chil with [ 0 -> () | _ -> let fam_surname = get_surname m.m_fath in do { Printf.fprintf oc "beg\n"; Array.iter (fun p -> if per_sel (get_key_index p) then print_child oc base fam_surname print_sources p else ()) m.m_chil; Printf.fprintf oc "end\n"; } ] }; fam_done.(Adef.int_of_ifam m.m_ifam) := True; } ; value get_persons_with_notes base m list = let fath = m.m_fath in let moth = m.m_moth in let list = match (sou base (get_notes fath), get_parents fath) with [ ("", _) | (_, Some _) -> list | _ -> [fath :: list] ] in let list = match (sou base (get_notes moth), get_parents moth) with [ ("", _) | (_, Some _) -> list | _ -> [moth :: list] ] in List.fold_right (fun p list -> match sou base (get_notes p) with [ "" -> list | _ -> [p :: list] ]) (Array.to_list m.m_chil) list ; value print_notes_for_person oc base p = let notes = sou base (get_notes p) in let surn = s_correct_string (p_surname base p) in let fnam = s_correct_string (p_first_name base p) in if notes <> "" && surn <> "?" && fnam <> "?" then do { Printf.fprintf oc "\n"; Printf.fprintf oc "notes %s %s%s\n" surn fnam (if get_occ p == 0 then "" else "." ^ string_of_int (get_occ p)); Printf.fprintf oc "beg\n"; Printf.fprintf oc "%s\n" notes; Printf.fprintf oc "end notes\n"; () } else () ; value rec list_memf f x = fun [ [] -> False | [a :: l] -> f x a || list_memf f x l ] ; value eq_key p1 p2 = get_key_index p1 == get_key_index p2; value print_notes oc base ml per_sel pl = let pl = List.fold_right (get_persons_with_notes base) ml pl in let pl = List.fold_right (fun p pl -> if list_memf eq_key p pl then pl else [p :: pl]) pl [] in List.iter (fun p -> if per_sel (get_key_index p) then print_notes_for_person oc base p else ()) pl ; value get_persons_with_relations base m list = let fath = m.m_fath in let moth = m.m_moth in let list = match (get_rparents fath, get_parents fath) with [ ([], _) | (_, Some _) -> list | _ -> [fath :: list] ] in let list = match (get_rparents moth, get_parents moth) with [ ([], _) | (_, Some _) -> list | _ -> [moth :: list] ] in let list = List.fold_right (fun ip list -> let p = poi base ip in match (get_rparents p, get_parents p) with [ ([], _) | (_, Some _) -> list | _ -> [p :: list] ]) (Array.to_list (get_witnesses m.m_fam)) list in List.fold_right (fun p list -> match get_rparents p with [ [] -> list | _ -> [p :: list] ]) (Array.to_list m.m_chil) list ; value print_relation_parent oc base mark defined_p p = do { Printf.fprintf oc "%s %s%s" (correct_string base (get_surname p)) (correct_string base (get_first_name p)) (if get_occ p = 0 then "" else "." ^ string_of_int (get_occ p)); if Array.length (get_family p) = 0 && get_parents p = None && not mark.(Adef.int_of_iper (get_key_index p)) then do { mark.(Adef.int_of_iper (get_key_index p)) := True; if has_infos base p then print_infos oc base False True p else Printf.fprintf oc " 0"; defined_p.val := [p :: defined_p.val]; () } else (); () } ; value print_relation_for_person oc base mark def_p p r = let fath = match r.r_fath with [ Some ip -> let p = poi base ip in if sou base (get_first_name p) = "?" || sou base (get_surname p) = "?" then None else Some p | None -> None ] in let moth = match r.r_moth with [ Some ip -> let p = poi base ip in if sou base (get_first_name p) = "?" || sou base (get_surname p) = "?" then None else Some p | None -> None ] in match (fath, moth) with [ (None, None) -> () | _ -> do { Printf.fprintf oc "- "; match r.r_type with [ Adoption -> Printf.fprintf oc "adop" | Recognition -> Printf.fprintf oc "reco" | CandidateParent -> Printf.fprintf oc "cand" | GodParent -> Printf.fprintf oc "godp" | FosterParent -> Printf.fprintf oc "fost" ]; match (fath, moth) with [ (Some _, None) -> Printf.fprintf oc " fath" | (None, Some _) -> Printf.fprintf oc " moth" | _ -> () ]; Printf.fprintf oc ": "; match (fath, moth) with [ (Some fath, None) -> print_relation_parent oc base mark def_p fath | (None, Some moth) -> print_relation_parent oc base mark def_p moth | (Some fath, Some moth) -> do { print_relation_parent oc base mark def_p fath; Printf.fprintf oc " + "; print_relation_parent oc base mark def_p moth; () } | _ -> () ]; Printf.fprintf oc "\n"; () } ] ; value print_relations_for_person oc base mark def_p p = let surn = correct_string base (get_surname p) in let fnam = correct_string base (get_first_name p) in if surn <> "?" || fnam <> "?" then do { Printf.fprintf oc "\n"; Printf.fprintf oc "rel %s %s%s\n" surn fnam (if get_occ p == 0 then "" else "." ^ string_of_int (get_occ p)); Printf.fprintf oc "beg\n"; List.iter (print_relation_for_person oc base mark def_p p) (get_rparents p); Printf.fprintf oc "end\n"; () } else () ; value print_relations oc base mark per_sel ml = let pl = List.fold_right (get_persons_with_relations base) ml [] in let pl = List.fold_right (fun p pl -> if list_memf eq_key p pl then pl else [p :: pl]) pl [] in let rec loop = fun [ [] -> () | [p :: pl] -> let def_p = ref [] in do { if get_rparents p <> [] && per_sel (get_key_index p) then do { print_relations_for_person oc base mark def_p p; List.iter (print_notes_for_person oc base) def_p.val; () } else (); loop (pl @ def_p.val) } ] in loop pl ; value rec merge_families ifaml1f ifaml2f = match (ifaml1f, ifaml2f) with [ ([ifam1 :: ifaml1], [ifam2 :: ifaml2]) -> let m1 = List.memq ifam1 ifaml2 in let m2 = List.memq ifam2 ifaml1 in if m1 && m2 then merge_families ifaml1 ifaml2 else if m1 then [ifam2 :: merge_families ifaml1f ifaml2] else if m2 then [ifam1 :: merge_families ifaml1 ifaml2f] else if ifam1 == ifam2 then [ifam1 :: merge_families ifaml1 ifaml2] else [ifam1; ifam2 :: merge_families ifaml1 ifaml2] | (ifaml1, []) -> ifaml1 | ([], ifaml2) -> ifaml2 ] ; value rec filter f = fun [ [x :: l] -> if f x then [x :: filter f l] else filter f l | [] -> [] ] ; value connected_families base fam_sel ifam cpl = loop [ifam] [] [get_father cpl] where rec loop ifaml ipl_scanned = fun [ [ip :: ipl] -> if List.memq ip ipl_scanned then loop ifaml ipl_scanned ipl else let u = poi base ip in let ifaml1 = Array.to_list (get_family u) in let ifaml1 = filter fam_sel ifaml1 in let ifaml = merge_families ifaml ifaml1 in let ipl = List.fold_right (fun ifam ipl -> let cpl = foi base ifam in [get_father cpl; get_mother cpl :: ipl]) ifaml1 ipl in loop ifaml [ip :: ipl_scanned] ipl | [] -> ifaml ] ; value find_person base p1 po p2 = match Gwdb.person_of_key base p1 p2 po with [ Some ip -> ip | None -> do { Printf.printf "Not found: %s%s %s\n" p1 (if po == 0 then "" else " " ^ string_of_int po) p2; flush stdout; exit 2 } ] ; value surnames = ref []; value no_spouses_parents = ref False; value gwu base out_dir out_oc src_oc_list anc desc = let anc = match anc with [ Some (p1, po, p2) -> Some (find_person base p1 po p2) | None -> None ] in let desc = match desc with [ Some (p1, po, p2) -> Some (find_person base p1 po p2) | None -> None ] in let ((per_sel, fam_sel) as sel) = Select.functions base anc desc surnames.val no_spouses_parents.val in let fam_done = Array.make (nb_of_families base) False in let mark = Array.make (nb_of_persons base) False in let out_oc_first = ref True in let origin_file fname = if out_dir = "" then (out_oc, out_oc_first) else if fname = "" then (out_oc, out_oc_first) else try List.assoc fname src_oc_list.val with [ Not_found -> let oc = open_out (Filename.concat out_dir fname) in let x = (oc, ref True) in do { src_oc_list.val := [(fname, x) :: src_oc_list.val]; x } ] in do { for i = 0 to nb_of_families base - 1 do { let ifam = Adef.ifam_of_int i in let fam = foi base ifam in if is_deleted_family fam then () else do { if fam_done.(i) then () else if fam_sel ifam then let (oc, first) = origin_file (sou base (get_origin_file fam)) in let ifaml = connected_families base fam_sel ifam fam in let ml = List.fold_right (fun ifam ml -> let fam = foi base ifam in let m = {m_ifam = ifam; m_fam = fam; m_fath = poi base (get_father fam); m_moth = poi base (get_mother fam); m_chil = Array.map (fun ip -> poi base ip) (get_children fam)} in if empty_family base m then ml else [m :: ml]) ifaml [] in if ml <> [] then do { let notes_pl_p = ref [] in if not first.val then Printf.fprintf oc "\n" else (); first.val := False; List.iter (print_family oc base mark sel fam_done notes_pl_p) ml; print_notes oc base ml per_sel notes_pl_p.val; print_relations oc base mark per_sel ml; () } else () else (); () } }; let s = base_notes_read base "" in if s = "" then () else do { let (oc, first) = origin_file (base_notes_origin_file base) in if not first.val then Printf.fprintf oc "\n" else (); Printf.fprintf oc "notes\n"; Printf.fprintf oc "%s\n" s; Printf.fprintf oc "end notes\n"; } } ; value in_file = ref ""; value out_file = ref ""; value out_dir = ref ""; value anc_1st = ref ""; value anc_occ = ref 0; value anc_2nd = ref ""; value desc_1st = ref ""; value desc_occ = ref 0; value desc_2nd = ref ""; type arg_state = [ ASnone | ASwaitAncOcc | ASwaitAncSurn | ASwaitDescOcc | ASwaitDescSurn ] ; value arg_state = ref ASnone; value mem = ref False; value speclist = [("-o", Arg.String (fun s -> out_file.val := s), " output file name (else stdout)"); ("-odir", Arg.String (fun s -> out_dir.val := s), " create files from original name in directory (else on -o file)"); ("-mem", Arg.Set mem, " save memory space, but slower"); ("-a", Arg.String (fun s -> do { anc_1st.val := s; arg_state.val := ASwaitAncOcc }), "\"<1st_name>\" [num] \"\" : select ancestors of..."); ("-d", Arg.String (fun s -> do { desc_1st.val := s; arg_state.val := ASwaitDescOcc }), "\"<1st_name>\" [num] \"\" : select descendants of..."); ("-s", Arg.String (fun x -> surnames.val := [x :: surnames.val]), "\"\" : select this surname (option usable several times)"); ("-nsp", Arg.Set no_spouses_parents, ": no spouses' parents (for option -s)")] ; value anon_fun s = match arg_state.val with [ ASnone -> in_file.val := s | ASwaitAncOcc -> try do { anc_occ.val := int_of_string s; arg_state.val := ASwaitAncSurn } with [ Failure _ -> do { anc_occ.val := 0; anc_2nd.val := s; arg_state.val := ASnone } ] | ASwaitAncSurn -> do { anc_2nd.val := s; arg_state.val := ASnone } | ASwaitDescOcc -> try do { desc_occ.val := int_of_string s; arg_state.val := ASwaitDescSurn } with [ Failure _ -> do { desc_occ.val := 0; desc_2nd.val := s; arg_state.val := ASnone } ] | ASwaitDescSurn -> do { desc_2nd.val := s; arg_state.val := ASnone } ] ; value errmsg = "Usage: " ^ Sys.argv.(0) ^ " [options] If both options -a and -d are used, intersection is assumed. If several options -s are used, union is assumed. When option -s is used, the options -a and -d are ignored. Options are:" ; value main () = do { Argl.parse speclist anon_fun errmsg; if in_file.val = "" then do { Printf.printf "Missing base\n"; Printf.printf "Use option -help for usage\n"; flush stdout; exit 2 } else (); let anc = if anc_1st.val <> "" then if anc_2nd.val = "" then do { Printf.printf "Misused option -a\n"; Printf.printf "Use option -help for usage\n"; flush stdout; exit 2 } else Some (anc_1st.val, anc_occ.val, anc_2nd.val) else None in let desc = if desc_1st.val <> "" then if desc_2nd.val = "" then do { Printf.printf "Misused option -d\n"; Printf.printf "Use option -help for usage\n"; flush stdout; exit 2 } else Some (desc_1st.val, desc_occ.val, desc_2nd.val) else None in let base = Gwdb.open_base in_file.val in let src_oc_list = ref [] in let () = load_ascends_array base in let () = load_strings_array base in if not mem.val then do { load_couples_array base; load_unions_array base; load_descends_array base; } else (); let out_oc = if out_file.val = "" then stdout else open_out out_file.val in gwu base out_dir.val out_oc src_oc_list anc desc; List.iter (fun (src, (oc, _)) -> do { flush oc; close_out oc; () }) src_oc_list.val; flush out_oc; if out_file.val = "" then () else close_out out_oc; () } ; Printexc.catch main (); geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/gwbase/etc/gwck.ml0000660000175200017530000001651112664543647025375 0ustar guillaumeguillaume(* camlp5r *) (* $Id: gwck.ml,v 4.13 2009-03-11 10:58:51 deraugla Exp $ *) #load "pa_lock.cmo"; open Def; open Gwdb; open Printf; value designation base ip p = let first_name = p_first_name base p in let surname = p_surname base p in if first_name = "?" || surname = "?" then "i=" ^ string_of_int (Adef.int_of_iper ip) else Mutil.iso_8859_1_of_utf_8 (first_name ^ "." ^ string_of_int (get_occ p) ^ " " ^ surname) ; value check_keys base nb_ind fix = do { printf "Check keys\n"; flush stdout; ProgrBar.start (); for i = 0 to nb_ind - 1 do { ProgrBar.run i nb_ind; let ip = Adef.iper_of_int i in let p = poi base ip in let fn = sou base (get_first_name p) in let sn = sou base (get_surname p) in let occ = get_occ p in if fn <> "?" && sn <> "?" then match Gwdb.person_of_key base fn sn occ with [ Some ip2 -> if ip2 <> ip then do { ProgrBar.suspend (); printf "*** key %s.%d %s is \"%s\"\n" fn occ sn (designation base ip (poi base ip2)); flush stdout; Gwdb.patch_key base ip fn sn occ; printf "*** fixed\n"; flush stdout; fix.val := True; ProgrBar.restart i nb_ind; } else () | None -> do { ProgrBar.suspend (); printf "*** key %s.%d %s = no anwser\n" fn occ sn; flush stdout; Gwdb.patch_key base ip fn sn occ; printf "*** fixed\n"; flush stdout; fix.val := True; ProgrBar.restart i nb_ind; } ] else (); }; ProgrBar.finish (); }; value check_families_parents base nb_fam = do { printf "Check families' parents\n"; flush stdout; ProgrBar.start (); for i = 0 to nb_fam - 1 do { ProgrBar.run i nb_fam; let ifam = Adef.ifam_of_int i in let fam = foi base ifam in if is_deleted_family fam then () else let a = get_parent_array fam in for j = 0 to Array.length a - 1 do { let ip = a.(j) in if Mutil.array_mem ifam (get_family (poi base ip)) then () else do { ProgrBar.suspend (); printf "*** no family for : %s\n" (designation base ip (poi base ip)); flush stdout; ProgrBar.restart i nb_fam; }; } }; ProgrBar.finish (); }; value check_families_children base nb_fam fix = do { printf "Check families' children\n"; flush stdout; ProgrBar.start (); for i = 0 to nb_fam - 1 do { ProgrBar.run i nb_fam; let ifam = Adef.ifam_of_int i in let fam = foi base ifam in if is_deleted_family fam then () else let children = get_children fam in for j = 0 to Array.length children - 1 do { let ip = children.(j) in let a = poi base ip in match get_parents a with [ Some ifam1 -> if ifam1 != ifam then do { printf "*** bad parents : %s\n" (designation base ip (poi base ip)); flush stdout; } else () | None -> do { ProgrBar.suspend (); printf "*** no parents : %s in family\n %s & %s\n" (designation base ip (poi base ip)) (let ip = get_father fam in designation base ip (poi base ip)) (let ip = get_mother fam in designation base ip (poi base ip)); flush stdout; patch_ascend base ip {parents = Some ifam; consang = get_consang a}; fix.val := True; ProgrBar.restart i nb_fam; } ]; }; }; ProgrBar.finish (); }; value check_persons_parents base nb_ind fix = do { printf "Check persons' parents\n"; flush stdout; ProgrBar.start (); for i = 0 to nb_ind - 1 do { ProgrBar.run i nb_ind; let ip = Adef.iper_of_int i in let a = poi base ip in match get_parents a with [ Some ifam -> let fam = foi base ifam in if is_deleted_family fam then do { printf "*** parent family deleted: %s\n" (designation base ip (poi base ip)); flush stdout; patch_ascend base ip {parents = None; consang = Adef.fix (-1)}; fix.val := True; } else let children = get_children fam in if Mutil.array_mem ip children then () else do { printf "*** not in parent's family: %s\n" (designation base ip (poi base ip)); flush stdout; let children = Array.append children [| ip |] in patch_descend base ifam {children = children}; fix.val := True; } | None -> () ]; }; ProgrBar.finish (); }; value check_persons_families base nb_ind fix = do { printf "Check persons' families\n"; flush stdout; ProgrBar.start (); for i = 0 to nb_ind - 1 do { ProgrBar.run i nb_ind; let ip = Adef.iper_of_int i in let u = poi base ip in let ifams = get_family u in for j = 0 to Array.length ifams - 1 do { let ifam = ifams.(j) in let cpl = foi base ifam in if Mutil.array_mem ip (get_parent_array cpl) then () else do { ProgrBar.suspend (); printf "*** not father or mother of hir family: %s\n" (designation base ip (poi base ip)); flush stdout; let ifams = Array.append (Array.sub ifams 0 j) (Array.sub ifams (j + 1) (Array.length ifams - j - 1)) in patch_union base ip {family = ifams}; printf "*** fixed\n"; flush stdout; fix.val := True; ProgrBar.restart i nb_ind; } }; }; ProgrBar.finish (); }; value check_witnesses base nb_fam fix = do { printf "Check witnesses\n"; flush stdout; ProgrBar.start (); for i = 0 to nb_fam - 1 do { ProgrBar.run i nb_fam; let ifam = Adef.ifam_of_int i in let fam = foi base ifam in let witn = get_witnesses fam in let ifath = get_father fam in for j = 0 to Array.length witn - 1 do { let ip = witn.(j) in let p = poi base ip in if not (List.memq ifath (get_related p)) then do { ProgrBar.suspend (); let imoth = get_mother fam in printf "*** in marriage: %s & %s\n" (designation base ifath (poi base ifath)) (designation base ifath (poi base imoth)); printf "*** witness has no pointer to marriage: %s\n" (designation base ip p); flush stdout; patch_person base ip {(gen_person_of_person p) with related = [ifath :: get_related p]}; printf "*** fixed\n"; fix.val := True; flush stdout; ProgrBar.restart i nb_fam; } else (); }; }; ProgrBar.finish (); }; value check bname = do { let base = Gwdb.open_base bname in let fix = ref False in let nb_fam = nb_of_families base in let nb_ind = nb_of_persons base in check_keys base nb_ind fix; check_families_parents base nb_fam; check_families_children base nb_fam fix; check_persons_parents base nb_ind fix; check_persons_families base nb_ind fix; check_witnesses base nb_fam fix; if fix.val then Gwdb.commit_patches base else do { printf "No change\n"; flush stdout; } }; value main () = let bname = Sys.argv.(1) in lock Mutil.lock_file bname with [ Accept -> check bname | Refuse -> do { eprintf "Cannot lock database. Try again.\n"; flush stderr; } ] ; main (); geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/gwdiff/0002770000175200017530000000000012664543647023330 5ustar guillaumeguillaumegeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/gwdiff/Makefile0000660000175200017530000000126112664543647024767 0ustar guillaumeguillaume# $Id: Makefile,v 5.1 2007-09-12 09:58:44 ddr Exp $ include ../../tools/Makefile.inc TOP=../.. OCAMLI=-I $(TOP)/src GWDIFF_OBJS=$(TOP)/src/argl.cmo $(TOP)/src/adef.cmo $(TOP)/src/name.cmo $(TOP)/src/buff.cmo $(TOP)/src/gutil.cmo $(TOP)/src/btree.cmo $(TOP)/src/iovalue.cmo $(TOP)/src/iobase.cmo $(TOP)/src/calendar.cmo gwdiff.cmo all:: gwdiff.opt gwdiff.out: $(GWDIFF_OBJS) $(OCAMLC) -custom unix.cma $(GWDIFF_OBJS) $(LIBUNIX) -o gwdiff.out gwdiff.opt: $(GWDIFF_OBJS:.cmo=.cmx) $(OCAMLOPT) unix.cmxa $(GWDIFF_OBJS:.cmo=.cmx) $(LIBUNIX) -o gwdiff.opt depend: TOP=$(TOP) $(TOP)/tools/camlp5_depend.sh $(OCAMLI) `ls *.mli *.ml` > .depend.new mv .depend.new .depend include .depend geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/gwdiff/gwdiff.ml0000660000175200017530000005061212664543647025133 0ustar guillaumeguillaume(* $Id: gwdiff.ml,v 5.0 2005-12-13 11:51:26 ddr Exp $ *) (* Copyright (c) 2001 Ludovic LEDIEU *) open Def; open Gutil; (*= TODO ===================================================================== - Improve the way not to check several time the same persons. =========================================================================== *) value in_file1 = ref ""; value in_file2 = ref ""; value html = ref False; value root = ref ""; value cr = ref ""; type messages = [ MsgBadChild of iper | MsgBirthDate | MsgBirthPlace | MsgChildMissing of iper | MsgChildren of iper | MsgDeathDate | MsgDeathPlace | MsgDivorce | MsgFirstName | MsgOccupation | MsgParentsMissing | MsgMarriageDate | MsgMarriagePlace | MsgSex | MsgSpouseMissing of iper | MsgSpouses of iper | MsgSurname ] ; value person_string base iper = let p = poi base iper in let fn = sou base p.first_name in let sn = sou base p.surname in if sn = "?" || fn = "?" then fn ^ " " ^ sn ^ " (#" ^ string_of_int (Adef.int_of_iper iper) ^ ")" else fn ^ "." ^ (string_of_int p.occ) ^ " " ^ sn ; value person_link bname base iper target = if html.val then Printf.sprintf "%s" root.val bname (Adef.int_of_iper iper) target (person_string base iper) else person_string base iper ; value print_message base1 base2 msg = do { Printf.printf " "; match msg with [ MsgBadChild iper1 -> Printf.printf "can not isolate one child match: %s" (person_link in_file1.val base1 iper1 "base1") | MsgBirthDate -> Printf.printf "birth date" | MsgBirthPlace -> Printf.printf "birth place" | MsgChildMissing iper1 -> Printf.printf "child missing: %s" (person_link in_file1.val base1 iper1 "base1") | MsgChildren iper1 -> Printf.printf "more than one child match: %s" (person_link in_file1.val base1 iper1 "base1") | MsgDeathDate -> Printf.printf "death (status or date)" | MsgDeathPlace -> Printf.printf "death place" | MsgDivorce -> Printf.printf "divorce" | MsgFirstName -> Printf.printf "first name" | MsgOccupation -> Printf.printf "occupation" | MsgParentsMissing -> Printf.printf "parents missing" | MsgMarriageDate -> Printf.printf "marriage date" | MsgMarriagePlace -> Printf.printf "marriage place" | MsgSex -> Printf.printf "sex" | MsgSpouseMissing iper1 -> Printf.printf "spouse missing: %s" (person_link in_file1.val base1 iper1 "base1") | MsgSpouses iper1 -> Printf.printf "more than one spouse match: %s" (person_link in_file1.val base1 iper1 "base1") | MsgSurname -> Printf.printf "surname" ]; Printf.printf "%s" cr.val } ; value print_f_messages base1 base2 ifam1 ifam2 res = let c1 = coi base1 ifam1 in let c2 = coi base2 ifam2 in do { Printf.printf "%s x %s%s/ %s x %s%s" (person_link in_file1.val base1 c1.father "base1") (person_link in_file1.val base1 c1.mother "base1") cr.val (person_link in_file2.val base2 c2.father "base2") (person_link in_file2.val base2 c2.mother "base2") cr.val; List.iter (print_message base1 base2) res } ; value print_p_messages base1 base2 iper1 iper2 res = do { Printf.printf "%s / %s%s" (person_link in_file1.val base1 iper1 "base1") (person_link in_file2.val base2 iper2 "base2") cr.val; List.iter (print_message base1 base2) res } ; value compatible_names src_name dest_name_list = let src_name = Name.lower src_name in let dest_name_list = List.map Name.lower dest_name_list in List.mem src_name dest_name_list ; value compatible_str_field istr1 istr2 = (Adef.int_of_istr istr1 = 0) || (Adef.int_of_istr istr2 != 0) ; value dmy_to_sdn_range_l dmy = let sdn_of_dmy dmy = let sdn = Calendar.sdn_of_gregorian dmy in let sdn = if dmy.month = 0 || dmy.day = 0 then sdn + 1 else sdn in let sdn2 = if dmy.delta != 0 then sdn + dmy.delta else let dmy2 = { year = if dmy.month = 0 || (dmy.month = 12 && dmy.day = 0) then (dmy.year +1) else dmy.year; month = if dmy.month = 0 then 1 else if dmy.day = 0 then if dmy.month = 12 then 1 else dmy.month + 1 else dmy.month; day = if dmy.day = 0 then 1 else dmy.day; prec = if dmy.month = 0 || dmy.day = 0 then Before else Sure; delta = dmy.delta } in let sdn2 = Calendar.sdn_of_gregorian dmy2 in if dmy2.prec = Before then sdn2 - 1 else sdn2 in (sdn, sdn2) in match dmy.prec with [ Sure -> let (sdn1, sdn2) = sdn_of_dmy dmy in [ (Some sdn1, Some sdn2) ] | Maybe -> let (sdn1, sdn2) = sdn_of_dmy dmy in [ (Some sdn1, Some sdn2) ; (None, None) ] | About -> let (sdn1, sdn2) = sdn_of_dmy dmy in let delta = (sdn2 - sdn1 + 1) * 5 in [ (Some (sdn1 - delta), Some (sdn2 + delta)) ] | Before -> let (sdn1, sdn2) = sdn_of_dmy dmy in [ (None, Some sdn2) ] | After -> let (sdn1, sdn2) = sdn_of_dmy dmy in [ (Some sdn1, None) ] | OrYear y -> let dmy2 = { year = y + 1; month = 0; day = 0; prec = Sure; delta = 0 } in let (sdn11, sdn12) = sdn_of_dmy dmy in let (sdn21, sdn22) = sdn_of_dmy dmy2 in [ (Some sdn11, Some sdn12) ; (Some sdn21, Some sdn22) ] | YearInt y -> let dmy2 = { year = y + 1; month = 0; day = 0; prec = Sure; delta = 0 } in let (sdn11, sdn12) = sdn_of_dmy dmy in let (sdn21, sdn22) = sdn_of_dmy dmy2 in [ (Some sdn11, Some sdn22) ] ] ; value compatible_sdn (sdn11, sdn12) (sdn21, sdn22) = if (sdn21, sdn22) = (None, None) then True else let bool1 = match (sdn11, sdn21) with [ (Some sdn1, Some sdn2) -> sdn1 <= sdn2 | (None, _) -> True | (Some _, None) -> False ] in let bool2 = match (sdn12, sdn22) with [ (Some sdn1, Some sdn2) -> sdn1 >= sdn2 | (None, _) -> True | (Some _, None) -> False ] in bool1 && bool2 ; value compatible_sdn_l sdn1_l sdn2 = List.fold_left (fun r sdn1 -> r || (compatible_sdn sdn1 sdn2)) False sdn1_l ; value compatible_sdn_ll sdn1_l sdn2_l = List.fold_left (fun r sdn2 -> r && (compatible_sdn_l sdn1_l sdn2)) True sdn2_l ; value compatible_dmys dmy1 dmy2 = compatible_sdn_ll (dmy_to_sdn_range_l dmy1) (dmy_to_sdn_range_l dmy2) ; value compatible_dates date1 date2 = let compatible_cals cal1 cal2 = match (cal1, cal2) with [ (Dgregorian, Djulian) | (Dgregorian, Dfrench) -> True | _ -> cal1 = cal2 ] in if date1 = date2 then True else match (date1, date2) with [ (Dgreg dmy1 cal1, Dgreg dmy2 cal2) -> compatible_dmys dmy1 dmy2 && compatible_cals cal1 cal2 | (Dgreg _ _, Dtext _) -> False | (Dtext _, _) -> True ] ; value compatible_codates codate1 codate2 = let od1 = Adef.od_of_codate codate1 in let od2 = Adef.od_of_codate codate2 in match (od1, od2) with [ (Some date1, Some date2) -> compatible_dates date1 date2 | (Some _, None) -> False | (None, _) -> True ] ; value compatible_birth base1 base2 p1 p2 = let get_birth person = if person.birth = Adef.codate_None then person.baptism else person.birth in let birth1 = get_birth p1 in let birth2 = get_birth p2 in let res1 = if compatible_codates birth1 birth2 then [] else [ MsgBirthDate ] in let res2 = if compatible_str_field p1.birth_place p2.birth_place then [] else [ MsgBirthPlace ] in res1 @ res2 ; value compatible_death base1 base2 p1 p2 = let bool1 = p1.death = p2.death || match (p1.death, p2.death) with [ (Death _ cdate1, Death _ cdate2) -> let date1 = Adef.date_of_cdate cdate1 in let date2 = Adef.date_of_cdate cdate2 in compatible_dates date1 date2 | (NotDead, _) | (DeadYoung, Death _ _) | (DeadDontKnowWhen, Death _ _ | DeadYoung | DeadDontKnowWhen) | (DontKnowIfDead, _) -> True | _ -> False ] in let res1 = if bool1 then [] else [ MsgDeathDate ] in let res2 = if compatible_str_field p1.death_place p2.death_place then [] else [ MsgDeathPlace ] in res1 @ res2 ; value compatible_sexes base1 base2 p1 p2 = if p1.sex = p2.sex then [] else [ MsgSex ] ; value compatible_occupations base1 base2 p1 p2 = if compatible_str_field p1.occupation p2.occupation then [] else [ MsgOccupation ] ; value compatible_persons_ligth base1 base2 p1 p2 = let fn1 = sou base1 p1.first_name in let fn2 = sou base2 p2.first_name in let afn2 = [fn2 :: List.map (sou base2) p2.first_names_aliases] in let sn1 = sou base1 p1.surname in let sn2 = sou base2 p2.surname in let asn2 = [sn2 :: List.map (sou base2) p2.surnames_aliases] in let res1 = if compatible_names fn1 afn2 then [] else [ MsgFirstName ] in let res2 = if compatible_names sn1 asn2 then [] else [ MsgSurname ] in res1 @ res2 ; value compatible_persons base1 base2 p1 p2 = compatible_persons_ligth base1 base2 p1 p2 @ compatible_sexes base1 base2 p1 p2 @ compatible_birth base1 base2 p1 p2 @ compatible_death base1 base2 p1 p2 @ compatible_occupations base1 base2 p1 p2 ; value rec find_compatible_persons_ligth base1 base2 iper1 iper2_list = match iper2_list with [ [] -> [] | [ head :: rest ] -> let p1 = poi base1 iper1 in let p2 = poi base2 head in let c_rest = find_compatible_persons_ligth base1 base2 iper1 rest in if compatible_persons_ligth base1 base2 p1 p2 = [] then [ head :: c_rest ] else c_rest ] ; value rec find_compatible_persons base1 base2 iper1 iper2_list = match iper2_list with [ [] -> [] | [ head :: rest ] -> let p1 = poi base1 iper1 in let p2 = poi base2 head in let c_rest = find_compatible_persons base1 base2 iper1 rest in if compatible_persons base1 base2 p1 p2 = [] then [ head :: c_rest ] else c_rest ] ; value compatible_unions base1 base2 iper1 iper2 ifam1 ifam2 = let get_spouse base iper ifam = let c = coi base ifam in if iper = c.father then poi base c.mother else poi base c.father in let spouse1 = get_spouse base1 iper1 ifam1 in let spouse2 = get_spouse base2 iper2 ifam2 in compatible_persons_ligth base1 base2 spouse1 spouse2 ; value rec find_compatible_unions base1 base2 iper1 iper2 ifam1 ifam2_list = match ifam2_list with [ [] -> [] | [ head :: rest ] -> let c_rest = find_compatible_unions base1 base2 iper1 iper2 ifam1 rest in if compatible_unions base1 base2 iper1 iper2 ifam1 head = [] then [ head :: c_rest ] else c_rest ] ; value compatible_divorces d1 d2 = match (d1, d2) with [ (Divorced codate1, Divorced codate2) -> compatible_codates codate1 codate2 | (Divorced _, _) -> False | _ -> True ] ; value compatible_marriages base1 base2 ifam1 ifam2 = let f1 = foi base1 ifam1 in let f2 = foi base2 ifam2 in let res1 = if compatible_codates f1.marriage f2.marriage then [] else [ MsgMarriageDate ] in let res2 = if compatible_divorces f1.divorce f2.divorce then [] else [ MsgDivorce ] in let res3 = if compatible_str_field f1.marriage_place f2.marriage_place then [] else [ MsgMarriagePlace ] in let res = res1 @ res2 @ res3 in if res = [] then () else print_f_messages base1 base2 ifam1 ifam2 res ; value pdiff base1 base2 iper1 iper2 = let p1 = poi base1 iper1 in let p2 = poi base2 iper2 in let res = compatible_persons base1 base2 p1 p2 in if res = [] then () else print_p_messages base1 base2 iper1 iper2 res ; value compatible_parents base1 base2 iper1 iper2 = let a1 = (aoi base1 iper1).parents in let a2 = (aoi base2 iper2).parents in match (a1, a2) with [ (Some ifam1, Some ifam2) -> let c1 = coi base1 ifam1 in let c2 = coi base2 ifam2 in let _ = pdiff base1 base2 c1.father c2.father in let _ = pdiff base1 base2 c1.mother c2.mother in compatible_marriages base1 base2 ifam1 ifam2 | (None, _) -> () | (Some _, None) -> print_p_messages base1 base2 iper1 iper2 [ MsgParentsMissing ] ] ; value rec ddiff base1 base2 iper1 iper2 d_tab = let d_check = d_tab.(Adef.int_of_iper iper1) in if List.mem iper2 d_check then () else let _ = d_tab.(Adef.int_of_iper iper1) := [iper2 :: d_check ] in let spouse c iper = if iper = c.father then c.mother else c.father in let rec udiff base1 base2 iper1 iper2 r ifam1 ifam2 = let fd b1 b2 ip2_list ip1 = match find_compatible_persons_ligth b1 b2 ip1 ip2_list with [ [ip2] -> ddiff base1 base2 ip1 ip2 d_tab | [] -> print_p_messages base1 base2 iper1 iper2 [ MsgChildMissing ip1 ] | rest_list -> match find_compatible_persons b1 b2 ip1 rest_list with [ [best_ip2] -> ddiff base1 base2 ip1 best_ip2 d_tab | [] -> print_p_messages base1 base2 iper1 iper2 [ MsgBadChild ip1 ] | _ -> print_p_messages base1 base2 iper1 iper2 [ MsgChildren ip1 ] ] ] in let c1 = coi base1 ifam1 in let c2 = coi base2 ifam2 in let p1 = spouse c1 iper1 in let p2 = spouse c2 iper2 in let d1 = Array.to_list (doi base1 ifam1).children in let d2 = Array.to_list (doi base2 ifam2).children in do { pdiff base1 base2 p1 p2; List.iter (fd base1 base2 d2) d1 } in let fu b1 b2 ifam2_list ifam1 = match find_compatible_unions b1 b2 iper1 iper2 ifam1 ifam2_list with [ [ifam2] -> do { compatible_marriages b1 b2 ifam1 ifam2; compatible_parents b1 b2 (spouse (coi base1 ifam1) iper1) (spouse (coi base2 ifam2) iper2); udiff b1 b2 iper1 iper2 True ifam1 ifam2 } | [] -> print_p_messages base1 base2 iper1 iper2 [ MsgSpouseMissing (spouse (coi base1 ifam1) iper1) ] | _ -> print_p_messages base1 base2 iper1 iper2 [ MsgSpouses (spouse (coi base1 ifam1) iper1) ] ] in let u1 = Array.to_list (uoi base1 iper1).family in let u2 = Array.to_list (uoi base2 iper2).family in do { pdiff base1 base2 iper1 iper2; List.iter (fu base1 base2 u2) u1 } ; value rec find_top base1 base2 iper1 iper2 = let p1 = poi base1 iper1 in let p2 = poi base2 iper2 in if compatible_persons_ligth base1 base2 p1 p2 = [] then let a1 = (aoi base1 iper1).parents in let a2 = (aoi base2 iper2).parents in match (a1, a2) with [ (Some ifam1, Some ifam2) -> let c1 = coi base1 ifam1 in let c2 = coi base2 ifam2 in let f_top_list = find_top base1 base2 c1.father c2.father in let m_top_list = find_top base1 base2 c1.mother c2.mother in f_top_list @ m_top_list | _ -> [(iper1, iper2)] ] else do { Printf.printf " Warning: %s doesn't match %s%s" (person_link in_file1.val base1 iper1 "base1") (person_link in_file2.val base2 iper2 "base2") cr.val; [] } ; value addiff base1 base2 iper1 iper2 d_tab = let topdiff (iper1, iper2) = do { Printf.printf "==> %s / %s%s" (person_link in_file1.val base1 iper1 "base1") (person_link in_file2.val base2 iper2 "base2") cr.val; ddiff base1 base2 iper1 iper2 d_tab } in do { Printf.printf "Building top list...%s" cr.val; let top_list = find_top base1 base2 iper1 iper2 in Printf.printf "Top list built.%s" cr.val; List.iter topdiff top_list } ; (* Main *) value gwdiff base1 base2 iper1 iper2 d_mode ad_mode = let desc_tab = Array.make base1.data.persons.len [] in match (d_mode, ad_mode) with [ (True, _) | (False, False) -> ddiff base1 base2 iper1 iper2 desc_tab | (False, True) -> addiff base1 base2 iper1 iper2 desc_tab ] ; value p1_fn = ref ""; value p1_occ = ref 0; value p1_sn = ref ""; value p2_fn = ref ""; value p2_occ = ref 0; value p2_sn = ref ""; type arg_state = [ ASnone | ASwaitP1occ | ASwaitP1sn | ASwaitP2occ | ASwaitP2sn ] ; value arg_state = ref ASnone; value mem = ref False; value d_mode = ref False; value ad_mode = ref False; value speclist = [("-1", Arg.String (fun s -> do { p1_fn.val := s; arg_state.val := ASwaitP1occ }), " : (mandatory) defines starting person in base1"); ("-2", Arg.String (fun s -> do { p2_fn.val := s; arg_state.val := ASwaitP2occ }), " : (mandatory) defines starting person in base2"); ("-ad", Arg.Set ad_mode, ": checks descendants of all ascendants "); ("-d", Arg.Set d_mode, ": checks descendants (default)"); ("-html", Arg.String (fun s -> do { html.val := True; root.val := s }), ": HTML format used for report"); ("-mem", Arg.Set mem, ": save memory space, but slower") ] ; value anonfun s = match arg_state.val with [ ASnone -> if in_file1.val = "" then in_file1.val := s else if in_file2.val = "" then in_file2.val := s else raise (Arg.Bad "Too much arguments") | ASwaitP1occ -> try do { p1_occ.val := int_of_string s; arg_state.val := ASwaitP1sn } with [ Failure _ -> raise (Arg.Bad "Numeric value for occ (-1)!") ] | ASwaitP1sn -> do { p1_sn.val := s; arg_state.val := ASnone } | ASwaitP2occ -> try do { p2_occ.val := int_of_string s; arg_state.val := ASwaitP2sn } with [ Failure _ -> raise (Arg.Bad "Numeric value for occ (-2)!") ] | ASwaitP2sn -> do { p2_sn.val := s; arg_state.val := ASnone }] ; value errmsg = "Usage: " ^ Sys.argv.(0) ^ " \ [options] base1 base2 Options are: " ; value check_args () = do { Argl.parse speclist anonfun errmsg; if in_file1.val = "" then do { Printf.printf "Missing reference data base\n"; Printf.printf "Use option -help for usage\n"; flush stdout; exit 2 } else (); if in_file2.val = "" then do { Printf.printf "Missing destination data base\n"; Printf.printf "Use option -help for usage\n"; flush stdout; exit 2 } else (); if p1_fn.val = "" then do { Printf.printf "-1 parameter is mandatory\n"; Printf.printf "Use option -help for usage\n"; flush stdout; exit 2 } else (); if p1_sn.val = "" then do { Printf.printf "Incomplete -1 parameter\n"; Printf.printf "Use option -help for usage\n"; flush stdout; exit 2 } else (); if p2_fn.val = "" then do { Printf.printf "-2 parameter is mandatory\n"; Printf.printf "Use option -help for usage\n"; flush stdout; exit 2 } else (); if p2_sn.val = "" then do { Printf.printf "Incomplete -2 parameter\n"; Printf.printf "Use option -help for usage\n"; flush stdout; exit 2 } else () } ; value main () = let _ = check_args () in let _ = if not html.val then cr.val := "\n" else cr.val := "
    \n" in (* Reference base *) let base1 = Iobase.input in_file1.val in let _ = base1.data.ascends.array () in let _ = base1.data.strings.array () in let _ = if not mem.val then let _ = base1.data.persons.array () in let _ = base1.data.families.array () in let _ = base1.data.couples.array () in let _ = base1.data.unions.array () in let _ = base1.data.descends.array () in () else () in (* Destination base *) let base2 = if in_file1.val != in_file2.val then let base2 = Iobase.input in_file2.val in let _ = base2.data.ascends.array () in let _ = base2.data.strings.array () in let _ = if not mem.val then let _ = base2.data.persons.array () in let _ = base2.data.families.array () in let _ = base2.data.couples.array () in let _ = base2.data.unions.array () in let _ = base2.data.descends.array () in () else () in base2 else (* Reference = Destination *) base1 in let iper1 = person_ht_find_unique base1 p1_fn.val p1_sn.val p1_occ.val in let iper2 = person_ht_find_unique base2 p2_fn.val p2_sn.val p2_occ.val in do { if html.val then Printf.printf "\n" else (); gwdiff base1 base2 iper1 iper2 d_mode.val ad_mode.val; if html.val then Printf.printf "\n" else () } ; Printexc.catch main (); geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/gwdiff/.depend0000660000175200017530000000051012664543647024563 0ustar guillaumeguillaumegwdiff.cmo: ../../src/adef.cmi ../../src/argl.cmo ../../src/calendar.cmi \ ../../src/def.cmi ../../src/gutil.cmi ../../src/iobase.cmi \ ../../src/name.cmi gwdiff.cmx: ../../src/adef.cmx ../../src/argl.cmx ../../src/calendar.cmx \ ../../src/def.cmi ../../src/gutil.cmx ../../src/iobase.cmx \ ../../src/name.cmx geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/gwdiff/README0000660000175200017530000000345112664543647024212 0ustar guillaumeguillaumeOVERVIEW: gwdiff will help you to target differences between two GeneWeb databases. So far it needs your help to know what to compare. Two modes are available: - descendants checks (option -d): it will compare the descendants of the person you have found in both databases (Spouses and their parents are compared too) - descendants of all ascendants (option -ad): it will found ascendants of the person you have found in both databases that are available in both data bases. For each top person identified, it will compare its decendants in both databases. USAGE: Your cousin has just sent you a new GEDCOM file, import it to GeneWeb (data base b1). You want to update your database (b2) according to b1 database. Now, find a person defined in both databases (ex.: Jean DUPONT). In base b1, it is "Jean.0 DUPONT"; in base b2, it is "Jean.3 DUPONT". Run the following command: gwdiff -d -1 Jean 0 DUPONT -2 Jean 3 DUPONT b1 b2 If your are interested in the descendants of its ascendants, you can try: gwdiff -ad -1 Jean 0 DUPONT -2 Jean 3 DUPONT b1 b2 So far, the checks include: - first name: value from b1 has to be found in b2 (first name or first name aliases) - surname: value from b1 has to be found in b2 (surname or surname aliases) - birth date - birth place: if it is set in b1, it has to be set in b2 (whatever the value) - death status - death date - death place: if it is set in b1, it has to be set in b2 (whatever the value) - occupation: if it is set in b1, it has to be set in b2 (whatever the value) - marriage date - marriage place: if it is set in b1, it has to be set in b2 (whatever the value) - divorce date - spouses - parents of spouses - children BUG REPORTS AND USER FEEDBACK: Send your bug reports by E-mail to: Ludovic LEDIEU: lledieu@free.fr geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/gwpublic/0002770000175200017530000000000012664543647023676 5ustar guillaumeguillaumegeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/gwpublic/Makefile0000660000175200017530000000172512664543647025342 0ustar guillaumeguillaume# $Id: Makefile.gwpublic,v 1.4 2008/03/31 11:36:28 deraugla Exp $ GW=../../src OBJS=$(GW)/secure.cmo $(GW)/buff.cmo $(GW)/name.cmo $(GW)/iovalue.cmo $(GW)/mutil.cmo $(GW)/db2.cmo $(GW)/adef.cmo $(GW)/db2disk.cmo $(GW)/futil.cmo $(GW)/btree.cmo $(GW)/dutil.cmo $(GW)/database.cmo $(GW)/gwdb.cmo $(GW)/checkItem.cmo $(GW)/gutil.cmo $(GW)/consang.cmo all: gwpublic1 gwpublic2 gwpublic2priv gwprivate gwiftitles clean: rm -f *.o *.cm[iox] gwpublic1 gwpublic2 gwpublic2priv gwprivate gwiftitles gwpublic1: gwpublic1.cmx ocamlopt.opt unix.cmxa $(OBJS:.cmo=.cmx) $< -o $@ gwpublic2: gwpublic2.cmx ocamlopt.opt unix.cmxa $(OBJS:.cmo=.cmx) $(GW)/progrBar.cmx $< -o $@ gwpublic2priv: gwpublic2priv.cmx ocamlopt.opt unix.cmxa $(OBJS:.cmo=.cmx) $(GW)/progrBar.cmx $< -o $@ gwprivate: gwprivate.cmx ocamlopt.opt unix.cmxa $(OBJS:.cmo=.cmx) $< -o $@ gwiftitles: gwiftitles.cmx ocamlopt.opt unix.cmxa $(OBJS:.cmo=.cmx) $< -o $@ %.cmx: %.ml ocamlopt.opt -c -pp camlp5r -I $(GW) $< geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/gwpublic/gwiftitles.ml0000660000175200017530000000314712664543647026415 0ustar guillaumeguillaume(* camlp4r *) (* $Id: public.ml,v 4.26 2007/01/19 09:03:02 deraugla Exp $ *) open Def; open Gwdb; open Printf; value private_everybody bname = let base = Gwdb.open_base bname in do { for i = 0 to nb_of_persons base - 1 do { let p = poi base (Adef.iper_of_int i) in if get_access p <> IfTitles then let p = {(gen_person_of_person p) with access = IfTitles} in patch_person base p.key_index p else (); }; commit_patches base; } ; value private_some bname key = let base = Gwdb.open_base bname in match Gutil.person_ht_find_all base key with [ [ip] -> let p = poi base ip in do { if get_access p <> IfTitles then let p = {(gen_person_of_person p) with access = IfTitles} in patch_person base p.key_index p else (); commit_patches base; } | _ -> do { Printf.eprintf "Bad key %s\n" key; flush stderr; exit 2 } ] ; value ind = ref ""; value bname = ref ""; value everybody = ref False; value speclist = [("-everybody", Arg.Set everybody, "set flag iftitles to everybody [lent!]"); ("-ind", Arg.String (fun x -> ind.val := x), "individual key")] ; value anonfun i = bname.val := i; value usage = "Usage: gwiftitles [-everybody] [-ind key] base"; value main () = do { Arg.parse speclist anonfun usage; if bname.val = "" then do { Arg.usage speclist usage; exit 2; } else (); let gcc = Gc.get () in gcc.Gc.max_overhead := 100; Gc.set gcc; if everybody.val then private_everybody bname.val else private_some bname.val ind.val } ; main (); geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/gwpublic/documentations.txt0000660000175200017530000000300312664543647027466 0ustar guillaumeguillaume 1. Compilation --------------- installation caml urpmi ocaml camlp5 mettre gwpublic dans repertoire geneweb-5.01/ modifier Makefile avec le bon chemin, ex: GW=../../geneweb-5.01-new/src puis make 2. Utilisation -------------- lancer public à la racine des bases cd /home/travauxjlm/geneweb/bases [jacques@localhost bases]$ ./gwpublic1 jerome *** read ascends *** read couples Jean.0 GALICON Pour public2 avec log mettre -t: ./gwpublic2 -y 1900 -t jerome Pour public2priv avec log mettre -t: ./gwpublic2priv -y 1900 -t jerome Pour private ../gwprivate -ind "Jeanne.0 BERERD" jerome (ca met en privé Jeanne Bererd) mettre en public Jeanne.0 BERERD" et tout ses ascendants (utile pour mettre un SOSA) ../gwpublic1 -ind "Jeanne.0 BERERD" jerome Egalement pour les tests: ../gwiftitles -everybody jerome (mets tout le monde en iftitles) ../gwpublic1 -everybody jerome (met tout le monde en public) ../gwprivate -everybody jerome (met tout le monde en privé) Les deux scripts: gwPublic1. Il prend les individus de de plus de 100 ans et met en "public" tous les ascendants sans dates [ et ? ses descendants à raison de 3 génération par siecle (Daniel avait mis 2 générations par siecle).] gwPublic2 mets en public les conjoints de personne public et pour une personne il regarde si dans les ancetres on peut recalculer un plus de 100 ans (en comptant 30 ans par generation) gwpublic2priv mets en public les personnes de plus de 100 ans en calculant (30 ans par génération) et en privé les personnes de moins de 100 ans. geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/gwpublic/gwpublic2priv.ml0000660000175200017530000001264612664543647027037 0ustar guillaumeguillaume(* camlp4r *) (* $Id: public2.ml,v 4.1 2008/03/31 11:34:34 deraugla Exp $ *) open Printf; open Def; open Gwdb; value year_of p = match (Adef.od_of_codate (get_birth p), Adef.od_of_codate (get_baptism p), get_death p, CheckItem.date_of_death (get_death p)) with [ (_, _, NotDead, _) -> None | (Some (Dgreg d _), _, _, _) -> Some d.year | (_, Some (Dgreg d _), _, _) -> Some d.year | (_, _, _, Some (Dgreg d _)) -> Some d.year | _ -> None ] ; value find_dated_ancestor base p = let mark = Array.make (nb_of_persons base) False in loop 1 [get_key_index p] where rec loop nb_gen iplist = if iplist = [] then None else let anc_list = List.fold_left (fun anc_list ip -> match get_parents (poi base ip) with [ Some ifam -> let fam = foi base ifam in [get_mother fam; get_father fam :: anc_list] | None -> anc_list ]) [] iplist in (* Dans le cas où le nombre d'implexes est très élevé, le calcul *) (* peut être très long car on le refait plusieurs fois pour les *) (* mêmes personnes. On rend donc la liste unique. *) let anc_list = Mutil.list_uniq anc_list in let anc_list = List.filter (fun ip -> not mark.(Adef.int_of_iper ip)) anc_list in let () = List.iter (fun ip -> mark.(Adef.int_of_iper ip) := True) anc_list in loop_ind anc_list where rec loop_ind = fun [ [ip :: iplist] -> let p = poi base ip in match year_of p with [ Some year -> Some (p, year, nb_gen) | None -> loop_ind iplist ] | [] -> loop (nb_gen + 1) anc_list ] ; value nb_years_by_gen = 30; value change_somebody_access base lim_year trace p year_of_p spouse = (* Dans le cas d'un calcul par rapport au conjoint, on ignore *) (* le statu parce qu'il a pu être modifié précédemment. *) if year_of_p = None && (get_access p = IfTitles || spouse) then match find_dated_ancestor base p with [ Some (a, year, nb_gen) -> do { let acc = if year + nb_gen * nb_years_by_gen > lim_year then Private else Public in let gp = {(gen_person_of_person p) with access = acc} in patch_person base gp.key_index gp; if trace then do { printf "%s -> " (Gutil.designation base p); if acc = Private then printf "private" else printf "public"; printf " (anc %d gen %s year %d)" nb_gen (Gutil.designation base a) year; printf "\n"; flush stdout; } else (); Some acc } | None -> None ] else None ; value public_all bname lim_year trace = do { let base = Gwdb.open_base bname in let () = load_ascends_array base in let () = load_couples_array base in let n = nb_of_persons base in let changes = ref False in Consang.check_noloop base (fun [ OwnAncestor p -> do { printf "I cannot deal this database.\n"; printf "%s is his own ancestors\n" (Gutil.designation base p); flush stdout; exit 2 } | _ -> assert False ]); ProgrBar.start (); for i = 0 to n - 1 do { ProgrBar.run i n; let ip = Adef.iper_of_int i in let p = poi base ip in if year_of p = None && get_access p = IfTitles then do { match change_somebody_access base lim_year trace p (year_of p) False with [ Some _ -> changes.val := True | None -> let fama = get_family p in loop 0 where rec loop i = if i = Array.length fama then () else let ifam = fama.(i) in let isp = Gutil.spouse ip (foi base ifam) in let sp = poi base isp in let year_of_sp = year_of sp in let acc_opt = match year_of_sp with [ Some year -> Some (if year > lim_year then Private else Public) | None -> change_somebody_access base lim_year trace sp year_of_sp True ] in match acc_opt with [ Some acc -> do { let gp = {(gen_person_of_person p) with access = acc} in patch_person base gp.key_index gp; changes.val := True; if trace then do { printf "%s -> " (Gutil.designation base p); if acc = Private then printf "private" else printf "public"; printf " (inherited from spouse %s)" (Gutil.designation base sp); printf "\n"; flush stdout; } else (); } | None -> loop (i + 1) ] ] } else (); }; if changes.val then commit_patches base else (); ProgrBar.finish (); }; value lim_year = ref 1900; value trace = ref False; value bname = ref ""; value speclist = [("-y", Arg.Int (fun i -> lim_year.val := i), "limit year (default = " ^ string_of_int lim_year.val ^ ")"); ("-t", Arg.Set trace, "trace changed persons")] ; value anonfun i = bname.val := i; value usage = "Usage: public [-y #] [-t] base"; value main () = do { Arg.parse speclist anonfun usage; if bname.val = "" then do { Arg.usage speclist usage; exit 2; } else (); public_all bname.val lim_year.val trace.val; }; main (); geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/gwpublic/gwprivate.ml0000660000175200017530000000530112664543647026236 0ustar guillaumeguillaume(* camlp4r *) (* $Id: public.ml,v 4.26 2007/01/19 09:03:02 deraugla Exp $ *) open Def; open Gwdb; open Printf; value input_person file = do { let pl = ref [] in match try Some (open_in file) with [ Sys_error _ -> None ] with [ Some ic -> do { try while True do { let line = input_line ic in pl.val := [ line :: pl.val ] } with [ End_of_file -> () ]; close_in ic } | None -> do { Printf.eprintf "Error while opening file %s\n" file; flush stderr; }] ; List.rev pl.val }; value private_everybody bname = let base = Gwdb.open_base bname in do { for i = 0 to nb_of_persons base - 1 do { let p = poi base (Adef.iper_of_int i) in if get_access p <> Private then let p = {(gen_person_of_person p) with access = Private} in patch_person base p.key_index p else (); }; commit_patches base; } ; value private_some bname key = let base = Gwdb.open_base bname in match Gutil.person_ht_find_all base key with [ [ip] -> let p = poi base ip in do { if get_access p <> Private then let p = {(gen_person_of_person p) with access = Private} in patch_person base p.key_index p else (); commit_patches base; } | _ -> do { Printf.eprintf "Bad key %s\n" key; flush stderr; (* Si on appel private_some sur une liste et qu'il y'a une mauvaise clé, alors on quitte tout le script, c'est un peu radical. *) (*exit 2*) } ] ; value private_some_list bname file = if Sys.file_exists file then let pl = input_person file in List.iter (private_some bname) pl else do { Printf.eprintf "File does not exist : %s\n" file; flush stderr; exit 2 } ; value list_ind = ref ""; value ind = ref ""; value bname = ref ""; value everybody = ref False; value speclist = [("-everybody", Arg.Set everybody, "set flag private to everybody [option lente!]"); ("-ind", Arg.String (fun x -> ind.val := x), "individual key"); ("-list-ind", Arg.String (fun s -> list_ind.val := s), " file to the list of persons")] ; value anonfun i = bname.val := i; value usage = "Usage: private [-everybody] [-ind key] base"; value main () = do { Arg.parse speclist anonfun usage; if bname.val = "" then do { Arg.usage speclist usage; exit 2; } else (); let gcc = Gc.get () in gcc.Gc.max_overhead := 100; Gc.set gcc; if everybody.val then private_everybody bname.val else if list_ind.val = "" then private_some bname.val ind.val else private_some_list bname.val list_ind.val } ; main (); geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/gwpublic/gwpublic1.ml0000660000175200017530000001452612664543647026134 0ustar guillaumeguillaume(* camlp4r *) (* $Id: public.ml,v 4.26 2007/01/19 09:03:02 deraugla Exp $ *) open Def; open Gwdb; open Printf; value year_of p = match (Adef.od_of_codate (get_birth p), Adef.od_of_codate (get_baptism p), get_death p, CheckItem.date_of_death (get_death p)) with [ (_, _, NotDead, _) -> None | (Some (Dgreg d _), _, _, _) -> Some d.year | (_, Some (Dgreg d _), _, _) -> Some d.year | (_, _, _, Some (Dgreg d _)) -> Some d.year | _ -> None ] ; value most_recent_year_of p = match (Adef.od_of_codate (get_birth p), Adef.od_of_codate (get_baptism p), get_death p, CheckItem.date_of_death (get_death p)) with [ (_, _, NotDead, _) -> None | (_, _, _, Some (Dgreg d _)) -> Some d.year | (_, Some (Dgreg d _), _, _) -> Some d.year | (Some (Dgreg d _), _, _, _) -> Some d.year | _ -> None ] ; value is_old lim_year p = match year_of p with [ Some y -> y < lim_year | None -> False ] ; value nb_gen_by_century = 3; value nb_desc_gen lim_year p = match most_recent_year_of p with [ Some year -> (lim_year - year) * nb_gen_by_century / 100 | None -> 0 ] ; value changes = ref False; value mark_descendants base scanned old lim_year = loop where rec loop p ndgen = if not scanned.(Adef.int_of_iper (get_key_index p)) then do { let dt = most_recent_year_of p in (* a t-il plus de 100 ans *) let ndgen = match dt with [ Some y -> do { scanned.(Adef.int_of_iper (get_key_index p)) := True; if y < lim_year then nb_desc_gen lim_year p else 0 } | None -> ndgen ] in if ndgen > 0 then do { old.(Adef.int_of_iper (get_key_index p)) := True; let ndgen = ndgen - 1 in for i = 0 to Array.length (get_family p) - 1 do { let ifam = (get_family p).(i) in let fam = foi base ifam in let sp = Gutil.spouse (get_key_index p) fam in old.(Adef.int_of_iper sp) := True; let children = get_children fam in for ip = 0 to Array.length children - 1 do { let p = poi base children.(ip) in loop p ndgen } } } else () } else () ; value mark_ancestors base scanned lim_year titled is_quest_string = loop where rec loop p = if not scanned.(Adef.int_of_iper (get_key_index p)) then do { scanned.(Adef.int_of_iper (get_key_index p)) := True; (* si pas de date ou date > lim_year *) if not (is_old lim_year p) && get_access p <> Public && (titled || get_titles p = []) && not (is_quest_string (get_first_name p)) && not (is_quest_string (get_surname p)) then do { match year_of p with [ Some y -> if y >= lim_year then do { eprintf "Problem of date ! %s %d\n" (Gutil.designation base p) y; flush stderr; } else () | None -> () ]; let p = {(gen_person_of_person p) with access = Public} in patch_person base p.key_index p; changes.val := True; } else (); match get_parents p with [ Some ifam -> let cpl = foi base ifam in do { loop (poi base (get_father cpl)); loop (poi base (get_mother cpl)); } | None -> () ]; } else () ; value public_everybody bname = let base = Gwdb.open_base bname in do { for i = 0 to nb_of_persons base - 1 do { let p = poi base (Adef.iper_of_int i) in if get_access p <> Public then let p = {(gen_person_of_person p) with access = Public} in patch_person base p.key_index p else (); }; commit_patches base; } ; value public_all bname lim_year titled = do { let base = Gwdb.open_base bname in let () = load_ascends_array base in let () = load_couples_array base in Consang.check_noloop base (fun [ OwnAncestor p -> do { printf "I cannot deal this database.\n"; printf "%s is his own ancestors\n" (Gutil.designation base p); flush stdout; exit 2 } | _ -> assert False ]); let old = Array.make (nb_of_persons base) False in do { let scanned = Array.make (nb_of_persons base) False in for i = 0 to nb_of_persons base - 1 do { if not scanned.(i) then do { let p = poi base (Adef.iper_of_int i) in mark_descendants base scanned old lim_year p 0 } else (); }; let scanned = Array.make (nb_of_persons base) False in for i = 0 to nb_of_persons base - 1 do { if old.(i) && not scanned.(i) then do { let p = poi base (Adef.iper_of_int i) in mark_ancestors base scanned lim_year titled is_quest_string p } else (); }; if changes.val then commit_patches base else (); } }; value public_some bname lim_year titled key = let base = Gwdb.open_base bname in match Gutil.person_ht_find_all base key with [ [ip] -> let p = poi base ip in let scanned = Array.make (nb_of_persons base) False in let () = load_ascends_array base in let () = load_couples_array base in do { mark_ancestors base scanned lim_year titled is_quest_string p; if changes.val then commit_patches base else (); } | _ -> do { Printf.eprintf "Bad key %s\n" key; flush stderr; exit 2 } ] ; value lim_year = ref 1900; value ind = ref ""; value bname = ref ""; value everybody = ref False; value titled = ref True; value speclist = [("-y", Arg.Int (fun i -> lim_year.val := i), "limit year (default = " ^ string_of_int lim_year.val ^ ")"); ("-ct", Arg.Clear titled, "check if the person has a title (default = don't check)"); ("-everybody", Arg.Set everybody, "set flag public to everybody"); ("-ind", Arg.String (fun x -> ind.val := x), "individual key")] ; value anonfun i = bname.val := i; value usage = "Usage: public1 [-everybody] [-y #] [-ind key] base"; value main () = do { Arg.parse speclist anonfun usage; if bname.val = "" then do { Arg.usage speclist usage; exit 2; } else (); let gcc = Gc.get () in gcc.Gc.max_overhead := 100; Gc.set gcc; if everybody.val then public_everybody bname.val else if ind.val = "" then public_all bname.val lim_year.val titled.val else public_some bname.val lim_year.val titled.val ind.val } ; main (); geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/contrib/gwpublic/gwpublic2.ml0000660000175200017530000001244712664543647026135 0ustar guillaumeguillaume(* camlp4r *) (* $Id: public2.ml,v 4.1 2008/03/31 11:34:34 deraugla Exp $ *) open Printf; open Def; open Gwdb; value year_of p = match (Adef.od_of_codate (get_birth p), Adef.od_of_codate (get_baptism p), get_death p, CheckItem.date_of_death (get_death p)) with [ (_, _, NotDead, _) -> None | (Some (Dgreg d _), _, _, _) -> Some d.year | (_, Some (Dgreg d _), _, _) -> Some d.year | (_, _, _, Some (Dgreg d _)) -> Some d.year | _ -> None ] ; value find_dated_ancestor base p = let mark = Array.make (nb_of_persons base) False in loop 1 [get_key_index p] where rec loop nb_gen iplist = if iplist = [] then None else let anc_list = List.fold_left (fun anc_list ip -> match get_parents (poi base ip) with [ Some ifam -> let fam = foi base ifam in [get_mother fam; get_father fam :: anc_list] | None -> anc_list ]) [] iplist in (* Dans le cas où le nombre d'implexes est très élevé, le calcul *) (* peut être très long car on le refait plusieurs fois pour les *) (* mêmes personnes. On rend donc la liste unique. *) let anc_list = Mutil.list_uniq anc_list in let anc_list = List.filter (fun ip -> not mark.(Adef.int_of_iper ip)) anc_list in let () = List.iter (fun ip -> mark.(Adef.int_of_iper ip) := True) anc_list in loop_ind anc_list where rec loop_ind = fun [ [ip :: iplist] -> let p = poi base ip in match year_of p with [ Some year -> Some (p, year, nb_gen) | None -> loop_ind iplist ] | [] -> loop (nb_gen + 1) anc_list ] ; value nb_years_by_gen = 30; value change_somebody_access base lim_year trace p year_of_p = if year_of_p = None && get_access p = IfTitles then match find_dated_ancestor base p with [ Some (a, year, nb_gen) -> do { let acc = if year + nb_gen * nb_years_by_gen > lim_year then IfTitles else Public in let gp = {(gen_person_of_person p) with access = acc} in patch_person base gp.key_index gp; if trace && acc <> IfTitles then do { printf "%s -> " (Gutil.designation base p); if acc = Private then printf "private" else printf "public"; printf " (anc %d gen %s year %d)" nb_gen (Gutil.designation base a) year; printf "\n"; flush stdout; Some acc } else None } | None -> None ] else None ; value public_all bname lim_year trace = do { let base = Gwdb.open_base bname in let () = load_ascends_array base in let () = load_couples_array base in Consang.check_noloop base (fun [ OwnAncestor p -> do { printf "I cannot deal this database.\n"; printf "%s is his own ancestors\n" (Gutil.designation base p); flush stdout; exit 2 } | _ -> assert False ]); let n = nb_of_persons base in let changes = ref False in ProgrBar.start (); for i = 0 to n - 1 do { ProgrBar.run i n; let ip = Adef.iper_of_int i in let p = poi base ip in if year_of p = None && get_access p = IfTitles then do { match change_somebody_access base lim_year trace p (year_of p) with [ Some _ -> changes.val := True | None -> let fama = get_family p in loop 0 where rec loop i = if i = Array.length fama then () else let ifam = fama.(i) in let isp = Gutil.spouse ip (foi base ifam) in let sp = poi base isp in let year_of_sp = year_of sp in let acc_opt = match year_of_sp with [ Some year -> Some (if year > lim_year then IfTitles else Public) | None -> change_somebody_access base lim_year trace sp year_of_sp ] in match acc_opt with [ Some acc -> do { let gp = {(gen_person_of_person p) with access = acc} in patch_person base gp.key_index gp; changes.val := True; if trace && acc <> IfTitles then do { printf "%s -> " (Gutil.designation base p); if acc = Private then printf "private" else printf "public"; printf " (inherited from spouse %s)" (Gutil.designation base sp); printf "\n"; flush stdout; } else (); } | None -> loop (i + 1) ] ] } else (); }; if changes.val then commit_patches base else (); ProgrBar.finish (); }; value lim_year = ref 1900; value trace = ref False; value bname = ref ""; value speclist = [("-y", Arg.Int (fun i -> lim_year.val := i), "limit year (default = " ^ string_of_int lim_year.val ^ ")"); ("-t", Arg.Set trace, "trace changed persons")] ; value anonfun i = bname.val := i; value usage = "Usage: public [-y #] [-t] base"; value main () = do { Arg.parse speclist anonfun usage; if bname.val = "" then do { Arg.usage speclist usage; exit 2; } else (); public_all bname.val lim_year.val trace.val; }; main (); geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/tools/0002770000175200017530000000000012664543647021562 5ustar guillaumeguillaumegeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/tools/camlp5_comm.sh0000770000175200017530000000102512664543647024311 0ustar guillaumeguillaume#!/bin/sh # $Id: camlp5_comm.sh,v 5.2 2010-09-23 17:16:49 ddr Exp $ ARGS1="$TOP/wserver/pa_macro5.cmo" FILE= while test "" != "$1"; do case $1 in *.ml*) FILE=$1;; *) ARGS1="$ARGS1 $1";; esac shift done head -1 $FILE >/dev/null || exit 1 set - $(head -1 $FILE) if test "$2" = "camlp5r" -o "$2" = "camlp5o" -o "$2" = "camlp5"; then COMM=$(echo "$2" | sed -e 's/camlp5/camlp5/g') shift; shift ARGS2=$(echo $* | sed -e "s/[()*]//g") else COMM=camlp5r ARGS2= fi echo $COMM $ARGS2 $ARGS1 $FILE 1>&2 $COMM $ARGS2 $ARGS1 $FILE geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/tools/Makefile.inc.win0000660000175200017530000000176612664543647024577 0ustar guillaumeguillaume# $Id: Makefile.inc.win,v 5.7 2007-09-12 09:58:44 ddr Exp $ GW_DIR= TOP=.. CAMLP5_COMM=TOP=$(TOP) $(TOP)/tools/camlp5_comm.sh CAMLP5F=-DWIN95 CAMLP5D=+camlp5 LIBUNIX=-cclib -lunix OCAMLC=ocamlc.opt -warn-error A OCAMLOPT=ocamlopt.opt -warn-error A OCAMLI= OCAMLD= STRIP=true RM=rm -f EXE=.exe STATIC= TEST_DIR=test $$(basename "$<") = "$<" || { echo "Please run 'make' in directory '$$(dirname "$<")' first"; exit 1; } include $(GW_DIR)/tools/Makefile.ocaml all:: opt:: clean:: $(RM) *.out *.opt *.cm[oixa] *.cmxa *.pp[oi] *.o *.a *.obj *.lib *.lck *.bak *~ .#* *.annot .SUFFIXES: .ml .cmo .mli .cmi .cmx .mli.cmi: @$(TEST_DIR) @$(CAMLP5_COMM) $(CAMLP5F) $< -o $*.ppi $(OCAMLC) $(OCAMLI) -I $(CAMLP5D) -c -intf $*.ppi $(RM) $*.ppi .ml.cmo: @$(TEST_DIR) @$(CAMLP5_COMM) $(CAMLP5F) $< -o $*.ppo $(OCAMLC) $(OCAMLI) $(OCAMLD) -I $(CAMLP5D) -c -impl $*.ppo $(RM) $*.ppo .ml.cmx: @$(TEST_DIR) @$(CAMLP5_COMM) $(CAMLP5F) $< -o $*.ppo $(OCAMLOPT) $(OCAMLI) -I $(CAMLP5D) -c -impl $*.ppo $(RM) $*.ppo geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/tools/camlp5_depend.sh0000660000175200017530000000240412664543647024615 0ustar guillaumeguillaume#!/bin/sh -e # $Id: camlp5_depend.sh,v 5.2 2009-03-11 10:56:09 ddr Exp $ FILES= DEPARGS= while [ "$1" != "" ]; do case $1 in *.ml*) FILES="$FILES $1";; *) DEPARGS="$DEPARGS $1";; esac shift done PR_DEP="-I $TOP/src pr_dep.cmo" for FILE in $FILES; do head -1 $FILE >/dev/null || exit 1 set - $(head -1 $FILE) if test "$2" = "camlp5r" -o "$2" = "camlp5o" -o "$2" = "camlp5"; then COMM=$(echo "$2" | sed -e 's/camlp5/camlp5/g') shift; shift ARGS=$(echo $* | sed -e "s/[()*]//g") else COMM=camlp5r ARGS= fi ARGS2="$DEPARGS" echo $COMM $PR_DEP pa_macro.cmo $ARGS -- $ARGS2 $FILE >&2 $COMM $PR_DEP pa_macro.cmo $ARGS -- $ARGS2 $FILE done for FILE in $FILES; do head -1 $FILE >/dev/null || exit 1 set - $(head -1 $FILE) if test "$2" = "camlp5r" -o "$2" = "camlp5o" -o "$2" = "camlp5"; then COMM=$(echo "$2" | sed -e 's/camlp5/camlp5/g') shift; shift ARGS=$(echo $* | sed -e "s/[()*]//g") DEPS= for i in $ARGS; do if test $(echo $i | sed "s/^\(..\).*$/\1/") = "./"; then DEP=$(echo $i | sed "s/^..\(.*\)$/\1/") DEPS="$DEPS $DEP" fi done if test "$DEPS" != ""; then BASE=$(basename $FILE .ml) echo $BASE.cmo $BASE.cmx: $DEPS fi fi done geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/tools/Makefile.inc.unix0000660000175200017530000000201612664543647024752 0ustar guillaumeguillaume# $Id: Makefile.inc.unix,v 1.6 2007-09-12 09:58:44 ddr Exp $ GW_DIR= TOP=.. CAMLP5_COMM=TOP=$(TOP) $(TOP)/tools/camlp5_comm.sh CAMLP5F=-DUNIX CAMLP5D=+camlp5 LIBUNIX=-cclib -lunix OCAMLC=ocamlc.opt -warn-error A OCAMLOPT=ocamlopt.opt -warn-error A OCAMLI= OCAMLD= STRIP=strip RM=/bin/rm -f EXE= STATIC=-ccopt -static STATIC= TEST_DIR=test $$(basename "$<") = "$<" || { echo "Please run 'make' in directory '$$(dirname "$<")' first"; exit 1; } include $(GW_DIR)/tools/Makefile.ocaml all:: opt:: clean:: $(RM) *.out *.opt *.cm[oixa] *.cmxa *.pp[oi] *.o *.a *.obj *.lib *.lck *.bak *~ .#* *.annot .SUFFIXES: .ml .cmo .mli .cmi .cmx .mli.cmi: @$(TEST_DIR) @$(CAMLP5_COMM) $(CAMLP5F) $< -o $*.ppi $(OCAMLC) $(OCAMLI) -I $(CAMLP5D) -c -intf $*.ppi $(RM) $*.ppi .ml.cmo: @$(TEST_DIR) @$(CAMLP5_COMM) $(CAMLP5F) $< -o $*.ppo $(OCAMLC) $(OCAMLI) $(OCAMLD) -I $(CAMLP5D) -c -impl $*.ppo $(RM) $*.ppo .ml.cmx: @$(TEST_DIR) @$(CAMLP5_COMM) $(CAMLP5F) $< -o $*.ppo $(OCAMLOPT) $(OCAMLI) -I $(CAMLP5D) -c -impl $*.ppo $(RM) $*.ppo geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/tools/Makefile.ocaml.inc0000660000175200017530000000002012664543647025053 0ustar guillaumeguillaumeCAMLP5D=+camlp5 geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/rpm/0002770000175200017530000000000012664543647021220 5ustar guillaumeguillaumegeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/rpm/Makefile0000660000175200017530000000041712664543647022661 0ustar guillaumeguillaume# $Id: Makefile,v 5.2 2007-09-12 09:42:26 ddr Exp $ VERSION=5.01 RELEASE=1 DESTDIR=/usr/src/RPM all: @echo "make install (as root)" install: sed -e "s/VERSION/$(VERSION)/" -e "s/RELEASE/$(RELEASE)/" geneweb.spec > $(DESTDIR)/SPECS/geneweb-$(VERSION)-$(RELEASE).spec geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/rpm/geneweb-logrotate0000660000175200017530000000024312664543647024553 0ustar guillaumeguillaume/var/log/gwd.log { postrotate /etc/rc.d/init.d/gwd restart endscript } /var/log/gwsetup.log { postrotate /etc/rc.d/init.d/gwd restart endscript } geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/rpm/geneweb-initrc.sh0000660000175200017530000000272212664543647024460 0ustar guillaumeguillaume#!/bin/sh # chkconfig: 345 99 01 # # gwd: Starts the genealogy Server # # Version: @(#) /etc/rc.d/init.d/gwd 1.0 # # description: Starts and stops the genealogy Server at boot time and shutdown. # # processname: gwd # hide: true # Source function library. if [ -f /etc/rc.d/init.d/functions ]; then . /etc/rc.d/init.d/functions fi # See how we were called. case "$1" in start) echo "Starting GeneWeb Services:" touch /var/log/gwd.log /var/log/gwsetup.log chown geneweb /var/log/gwd.log /var/log/gwsetup.log mkdir -p /home/geneweb/bases chmod a+rw /home/geneweb/bases cd /home/geneweb/bases hd=../gw/gw $hd/gwd -log /var/log/gwd.log -daemon -hd $hd -setup_link $hd/gwsetup -daemon -gd $hd 2>> /var/log/gwsetup.log touch /var/lock/subsys/gwd ;; stop) echo -n "Shutting down GeneWeb Services: " cd /home/geneweb/bases hd=../gw/gw killproc $hd/gwd killproc $hd/gwsetup rm -f /var/lock/subsys/gwd echo ;; status) status gwd ;; restart) echo -n "Restarting GeneWeb Services: " mkdir -p /home/geneweb/bases cd /home/geneweb/bases hd=../gw/gw killproc $hd/gwd killproc $hd/gwsetup echo touch /var/log/gwd.log /var/log/gwsetup.log chown geneweb /var/log/gwd.log /var/log/gwsetup.log $hd/gwd -log /var/log/gwd.log -daemon -hd $hd -setup_link $hd/gwsetup -daemon -gd $hd 2>> /var/log/gwsetup.log touch /var/lock/subsys/gwd ;; *) echo "*** Usage: gwd {start|stop|status|restart}" exit 1 esac exit 0 geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/rpm/geneweb.spec0000660000175200017530000001120212664543647023503 0ustar guillaumeguillaume# $Id: geneweb.spec,v 5.0 2005-12-13 11:51:26 ddr Exp $ Summary: Genealogy software with a Web interface Name: geneweb Version: VERSION Release: RELEASE Copyright: GPL Vendor: INRIA Group: Applications Source: ftp://ftp.inria.fr/INRIA/Projects/cristal/geneweb/Src/geneweb-%{version}.tar.gz URL: http://www.geneweb.org/ Packager: Daniel de Rauglaudre # Requires: ld-linux.so.2 libc.so.6 libm.so.6 libm.so.6(GLIBC_2.1) libm.so.6(GLIBC_2.0) libc.so.6(GLIBC_2.1) libc.so.6(GLIBC_2.0) BuildRoot: /tmp/%{name}-%{version} Prefix: /usr Summary(de): eine genealogische Software mit einem Web-Interface Summary(fr): un logiciel de généalogie doté d'une interface Web Summary(nl): een genealogisch programma met een www-interface Summary(se): ett genealogi program med ett webbinterface %description GeneWeb is a genealogy software with a Web interface. It can be used off-line or as a Web service. %description -l de GeneWeb ist eine genealogische Software mit einem Web-Interface. Sie kann off-line oder als ein Web-Service genutzt werden. %description -l fr GeneWeb est un logiciel de généalogie doté d'une interface Web. Il peut être utilisé non connecté au réseau ou comme un service Web. %description -l nl GeneWeb is een genealogisch programma met een www-interface, dat kan gebruikt worden op computers met of zonder permanente verbinding met het Internet. %description -l se GeneWeb är ett genealogi program med ett webbinterface. Det kan användas nedkopplad eller som en webbtjänst. %prep rm -rf $RPM_BUILD_ROOT %setup %build make opt make distrib %install mkdir -p $RPM_BUILD_ROOT/home/geneweb mkdir -p $RPM_BUILD_ROOT/etc/rc.d/init.d mkdir -p $RPM_BUILD_ROOT/etc/logrotate.d cp -r distribution $RPM_BUILD_ROOT/home/geneweb/gw cp rpm/geneweb-initrc.sh $RPM_BUILD_ROOT/etc/rc.d/init.d/gwd cp rpm/geneweb-logrotate $RPM_BUILD_ROOT/etc/logrotate.d/gwd %clean make clean rm -rf $RPM_BUILD_ROOT %pre /usr/sbin/groupadd geneweb || : /usr/sbin/useradd -d /home/geneweb -g geneweb -c "GeneWeb database" geneweb || : chmod a+rx /home/geneweb %post chown -R geneweb.geneweb /home/geneweb/gw # SuSE compatibility if (test -e "/etc/SuSE-release") ; then ln -s /etc/rc.d/init.d/gwd /etc/init.d/gwd fi #end chkconfig --add gwd /etc/rc.d/init.d/gwd start %preun /etc/rc.d/init.d/gwd stop chkconfig --del gwd rm -f /etc/init.d/gwd %postun # cd /home/geneweb/gw/gw # rm -rf doc etc images lang setup gwtp_tmp %files %defattr(-,geneweb,geneweb) %attr(6750, geneweb, geneweb) /home/geneweb/gw/gw/gwd %attr(6750, geneweb, geneweb) /home/geneweb/gw/gw/gwsetup %attr(6750, geneweb, geneweb) /home/geneweb/gw/gw/ged2gwb %attr(6750, geneweb, geneweb) /home/geneweb/gw/gw/gwb2ged %attr(6750, geneweb, geneweb) /home/geneweb/gw/gw/gwc %attr(6750, geneweb, geneweb) /home/geneweb/gw/gw/gwu %attr(6750, geneweb, geneweb) /home/geneweb/gw/gw/consang %attr(6750, geneweb, geneweb) /home/geneweb/gw/gw/gwtp_tmp/gwtp %attr(755, root, root) /etc/rc.d/init.d/gwd %attr(644, root, root) /etc/logrotate.d/gwd /home/geneweb/gw/LICENSE.txt /home/geneweb/gw/LISEZMOI.txt /home/geneweb/gw/README.txt /home/geneweb/gw/gw/CHANGES.txt /home/geneweb/gw/gw/INSTALL.htm /home/geneweb/gw/gw/LICENSE.txt /home/geneweb/gw/gw/LISEZMOI.txt /home/geneweb/gw/gw/README.txt /home/geneweb/gw/gw/a.gwf /home/geneweb/gw/gw/doc /home/geneweb/gw/gw/etc /home/geneweb/gw/gw/gwtp_tmp/README /home/geneweb/gw/gw/gwtp_tmp/lang /home/geneweb/gw/gw/images /home/geneweb/gw/gw/lang /home/geneweb/gw/gw/only.txt /home/geneweb/gw/gw/setup /home/geneweb/gw/gwd /home/geneweb/gw/gwsetup %defattr(-,root,root) #%doc doc/* %changelog * Sat Nov 10 2000 Daniel de Rauglaudre - Used chkconfig (Eddie Bindt's hint) * Thu Nov 9 2000 Ludovic Ledieu - Simplified files list (a directory includes its contents). It's thus easier to maintain the list. - Removed doc in /usr/doc/geneweb- * Tue Nov 7 2000 Daniel de Rauglaudre Version 3.10 - No more installation of geneweb-initrc.sh in SOURCES: it is directly copied from BUILD/geneweb-xx/rpm. In that file, added -log for gwd and gwsetup. - Added /etc/logrotate.d/gwd * Sun Apr 9 2000 Daniel de Rauglaudre Version 3.03-2 - added set user id bit also for gwc gwu ged2gwb gwb2ged consang because were not launched as geneweb user (seemed to depend on the Linux version) * Tue Dec 7 1999 Daniel de Rauglaudre Version 3.01 - updated the file list * Mon Oct 4 1999 Daniel de Rauglaudre Version 2.07-2 - added RPM_BUILD_ROOT to %install the package in /tmp * Sun Sep 6 1999 Daniel de Rauglaudre Version 2.06-5 - updated file list * Sun Sep 5 1999 Daniel de Rauglaudre Version 2.06-4 Deleted option -r in useradd (Redhat specific) * Sat Aug 14 1999 Dan Kegel Created. geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/README0000660000175200017530000000311212664543647021276 0ustar guillaumeguillaumeOVERVIEW: GeneWeb is a genealogy software with a Web interface. It can be used off-line or as a Web service. This is the version 5.03 To compile, you need the Objective Caml compiler which can be found at: http://caml.inria.fr/ocaml/ and Camlp5 at: http://pauillac.inria.fr/~ddr/camlp5/ CONTENTS: CHANGES changes (for genealogists non programmers) ICHANGES changes (for programmers) LICENSE license notice configure configure script Makefile main Makefile README this file INSTALL installation file contrib users contributions dag2html library to create html trees doc users' html documentation etc additional files for distribution ged2gwb converter GEDCOM -> GeneWeb gwb2ged converter GeneWeb -> GEDCOM gwtp CGI to upload and download databases launch a launcher of the geneweb server hd html and image files for GeneWeb program rpm files to create Linux rpm packages setup service (gwsetup) to launch commands in a Web navigator src sources of main programs tools tools for compiling wserver library for creating Web services COPYRIGHT: All files marked in this distribution are Copyright (c) 1998-2011 INRIA (Institut National de Recherche en Informatique et Automatique) and distributed under the conditions stated in file LICENSE. They can be freely redistributed for non-commercial purposes, provided the copyright notice remains attached. INSTALLATION: You can compile on Unix, Windows or MacOS X machines. See the file INSTALL for installation instructions. HOME PAGE GeneWeb home page is at: http://www.geneweb.org/ geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/man/0002770000175200017530000000000012664543647021175 5ustar guillaumeguillaumegeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/man/gwc.10000660000175200017530000000176212664543647022044 0ustar guillaumeguillaume.TH gwc 1 "2002 October 16th" .SH NAME gwc \- Create a GeneWeb database .SH SYNOPSIS .B gwc [ .I options ] [ .I files ] .br .SH DESCRIPTION .I gwc creates a starter database for use by .IR GeneWeb. .PP The primary documentation of .I gwc is in the HTML documentation, which you can find in the documentation directory (/usr/share/doc/geneweb on Debian systems). .br Please look there for complete and up-to-date documentation. .PP .SH OPTIONS .PP .TP 8 .B \-help command-line help .TP .B \-o output database (default: a.gwb) .TP .BI \-c only compiling .TP .BI \-f Remove database if already existing .TP .BI \-stats Print statistics .TP .BI \-nc No consistency check .TP .BI \-cg Compute consanguinity .TP .BI \-sep Separate all persons in next file .TP .BI \-sh \f\\f Shift all persons numbers in next files .TP .BI \-ds set the source field for persons and families without source data .TP .BI \-mem Save memory, but slower .TP .BI \-nolock do not lock database .PP .SH SEE ALSO gwc2(1) geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/man/gwb2ged.10000660000175200017530000000264112664543647022602 0ustar guillaumeguillaume.TH gwb2ged 1 "2002 October 20" .UC 4 .SH NAME gwb2ged \- Dump a GeneWeb database to a GEDCOM File .SH SYNOPSIS .B gwb2ged [ .I \ ] [ .I options ] .br .SH DESCRIPTION .I gwb2ged dumps a .IR GeneWeb database to a GEDCOM file. .PP The primary documentation of .I gwb2ged is in the HTML documentation, which you can find in the documentation directory (/usr/share/doc/geneweb on Debian systems). .br Please look there for complete and up-to-date documentation. .PP .SH OPTIONS .PP If both options -a and -d are used, intersection is assumed. .br If several options -s are used, union is assumed. .TP 8 .B \-help command-line help .TP .B \-o output file name (default: a.ged) .TP .B \-charset [ASCII|ANSEL]: Set charset. Default is ASCII. Warning: value ANSEL works correctly only on iso-8859-1 encoded databases. .TP .B \-o output file name (default: a.ged) .TP .B \-mem save memory space, but slower .TP .B \-a "<1st_name>" [num] "" select ancestors of .TP .B \-d "<1st_name>" [num] "" select descendants of .TP .B \-aws "<1st_name>" [num] "" select ancestors with siblings .TP .B \-s "" select this surname (option usable several times) .TP .B \-nsp no spouses' parents (for options -s and -d) .TP .B \-nn no (database) notes .TP .B \-c When a person is born less than years ago, it is not exported unless it is Public. All the spouses and descendants are also censored. geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/man/gwc2.10000660000175200017530000000152412664543647022122 0ustar guillaumeguillaume.TH gwc2 1 "2007 September 12th" .SH NAME gwc \- Create a GeneWeb database .SH SYNOPSIS .B gwc2 [ .I options ] [ .I files ] .br .SH DESCRIPTION .I gwc creates a database for use by .IR GeneWeb. .PP It is a new database system, different from the ones built by the command gwc. .PP .SH OPTIONS .PP .TP 8 .B \-help command-line help .TP .B \-o output database (default: a.gwb) .TP .BI \-c only compiling .TP .BI \-f Remove database if already existing .TP .BI \-stats Print statistics .TP .BI \-nc No consistency check .TP .BI \-cg Compute consanguinity .TP .BI \-sep Separate all persons in next file .TP .B \-sh Shift all persons numbers in next files .TP .BI \-ds set the source field for persons and families without source data .TP .BI \-mem Save memory, but slower .TP .BI \-nolock do not lock database .PP .SH SEE ALSO gwc(1) geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/man/ged2gwb.10000660000175200017530000000620412664543647022601 0ustar guillaumeguillaume.TH ged2gwb 1 "2002 October 20th" .SH NAME ged2gwb \- Create a GeneWeb database from a GEDCOM file .SH SYNOPSIS .B ged2gwb [ .I \ ] [ .I options ] .br .SH DESCRIPTION .I ged2gwb creates a starter database for use by .IR GeneWeb , from a GEDCOM file. .PP The primary documentation of .I ged2gwb is in the HTML documentation, which you can find in the documentation directory (/usr/share/doc/geneweb on Debian systems). .br Please look there for complete and up-to-date documentation. .PP .SH OPTIONS .PP .TP 8 .B \-help command-line help .TP .B \-o output database (default: a.gwb) .TP .B \-f Remove database if already existing .TP .B \-log Redirect log trace to this file. .TP .B \-lf - Lowercase first names - .br Convert first names to lowercase letters, with initials in uppercase. .TP .B \-ls - Lowercase surnames - .br Convert surnames to lowercase letters, with initials in uppercase. Try to keep lowercase particles. .TP .B \-us - Uppercase surnames - .br Convert surnames to uppercase letters. .TP .B \-fne be - First names enclosed - .br When creating a person, if the GEDCOM first name part holds a part between 'b' (any character) and 'e' (any character), it is considered to be the usual first name: e.g. -fne '""' or -fne "()". .TP .B \-efn - Extract first names - .br When creating a person, if the GEDCOM first name part holds several names, the first of this names becomes the person "first name" and the complete GEDCOM first name part a "first name alias". .TP .B \-no_efn - Dont extract first names - [default] .br Cancels the previous option. .TP .B \-epn - Extract public names - [default] When creating a person, if the GEDCOM first name part looks like a public name, i.e. holds: .br * a number or a roman number, supposed to be a number of a nobility title, .br * one of the words: "der", "den", "die", "el", "le", "la", "the", supposed to be the beginning of a qualifier, then the GEDCOM first name part becomes the person "public name" and its first word his "first name". .TP .B \-no_epn Cancels the previous option. .TP .B \-no_pit - No public if titles - .br Do not consider persons having titles as public .TP .B \-tnd - Try negative dates - .br Set negative dates when inconsistency (e.g. birth after death) .TP .B \-no_nd - No negative dates - .br Don't interpret a year preceded by a minus sign as a negative year .TP .B \-udi x-y - Undefined death interval - .br Set the interval for persons whose death part is undefined: .br - if before x years, they are considered as alive .br - if after y year, they are considered as death .br - between x and y year, they are considered as "don't know" .br Default x is 80 and y is 120 .TP .B \-uin - Untreated in notes - .br Put untreated GEDCOM tags in notes .TP .B \-ds - Default source - .br Set the source field for persons and families without source data .TP .B \-dates_dm Interpret months-numbered dates as day/month/year .TP .B \-dates_md Interpret months-numbered dates as month/day/year .TP .B \-charset [ANSEL|ASCII|MSDOS] - charset decoding - .br Force given charset decoding, overriding the possible setting in GEDCOM geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/man/gwsetup.10000660000175200017530000000150412664543647022754 0ustar guillaumeguillaume.TH gwsetup 1 "2005 November 28th" .SH NAME gwsetup \- Interactive interface to Geneweb databases management .SH SYNOPSIS .B gwsetup [ .I options ] .br .SH DESCRIPTION .I gwsetup helps in .IR GeneWeb databases management. .PP The primary documentation of .I gwsetup is in the HTML documentation, which you can find in the documentation directory (/usr/share/doc/geneweb on Debian systems). .br Please look there for complete and up-to-date documentation. .PP .SH OPTIONS .PP .TP 8 .B \-help command-line help .TP .B \-lang default language .TP .B \-daemon use as a Unix daemon .TP .B \-p select a port number (default=2316) .TP .B \-only path to the file containing the IP address of the authorized host .TP .B \-log redirect log trace to this file. .TP .B \-gd path of the geneweb share directory geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/man/gwu.10000660000175200017530000000420012664543647022054 0ustar guillaumeguillaume.TH gwu 1 "2002 October 16th" .SH NAME gwu \- Dump a GeneWeb database .SH SYNOPSIS .B gwu [ .I options ] \< .I base_file \> .br .SH DESCRIPTION .I gwu dumps the contents of the .IR GeneWeb database to standard output. It's a good way to backup the database in a neutral form, and can facilitate upgrades to new software. .PP The primary documentation of .I gwu is in the HTML documentation, which you can find in the documentation directory (/usr/share/doc/geneweb on Debian systems). .br Please look there for complete and up-to-date documentation. .PP .SH OPTIONS .PP .TP 20 .B \-help command-line help .TP .B \-o output file name (else stdout) .TP .B \-odir create files from original name in directory (else on -o file) .TP .B \-mem save memory space, but slower .TP .B \-a "<1st_name>" [num] "" select ancestors of ... .TP .B \-d "<1st_name>" [num] "" select descendants of ... .TP .B \-ad "<1st_name>" [num] "" select ancestors of ... and all their descendants (has no effect if \-a and/or \-d used, option \-nsp is forced). .TP .B \-aws "<1st_name>" [num] "" select ancestors with siblings .TP .B \-s "" select this surname (option usable several times) .TP .B \-nsp no spouses' parents (for options -s and -d) .TP .B \-nn no (database) notes .TP .B \-c When a person is born less than years ago, it is not exported unless it is Public. All the spouses and descendants are also censored. .TP .B \-sep "1st_name.num surname" To use together with the option "-odir": separate this person and all his ancestors and descendants sharing the same surname. All the concerned families are displayed on standard output instead of their associated files. This option can be used several times. .TP .B \-sep_only_file With option "-sep", tells to separate only groups of that file. .TP .B \-sep_limit When using the option "-sep", groups of families can become isolated in the files. Gwu reconnects them to the separated families (i.e. displays them to standard output) if the size of these groups is less than 21. The present option changes this limit. geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/man/gwd.10000660000175200017530000000710612664543647022043 0ustar guillaumeguillaume.TH GENEWEB 1 "2004 Aug 12" "GeneWeb" .UC 4 .SH NAME gwd \- Launches the GeneWeb Process .SH SYNOPSIS .B gwd [ .I command-line switches ] .br .SH DESCRIPTION .I gwd launches the GeneWeb "daemon" process. Once this is done, you can attach to it using a web browser to view your genealogical data. .br Connect to the GeneWeb process using a standard web browser using the following: .br http://localhost:2317/base http://127.0.0.1:2317/base http://address:2317/base http://address:port/base .br where "base" is the name of the database file. .br GeneWeb is coded in the functional language Objective CAML, and can be extended with byte-code or compiled code written in that language. .PP The primary documentation of .I gwd is in the .I HTML .IR , documentation, which you can find in the documentation directory (/usr/share/doc/geneweb on Debian systems). .br Please look there for complete and up-to-date documentation. .PP .SM GeneWeb Options .PP .TP 8 .B \-help Show possible options and switches .TP 8 .B \-hd Path to the 'lang' directory .TP 8 .B \-dd Path to the documentation directory .TP 8 .B \-bd Path to the GeneWeb database. .TP 8 .B \-wd Path to the socket communications (Windows) and access count. .TP 8 .B \-cgi Force cgi mode. .TP 8 .B \-images_url URL for GeneWeb images (default: gwd send them) .TP 8 .B \-images_dir Same than previous but directory name relative to current .TP 8 .B \-a Select a specific address (default = any address of this computer) .TP 8 .B \-p Select a port number (default = 2317); > 1024 for normal users. .TP 8 .B \-setup_link Display a link to local gwsetup in bottom of pages. .TP 8 .B \-wizard Set a wizard password: access to all dates and updating. .TP 8 .B \-friend Set a friend password: access to all dates. .TP 8 .B \-wjf Wizard just friend (permanently) .TP 8 .B \-lang Set a default language (default: en). .TP 8 .B \-blang Select the user browser language if any. .TP 8 .B \-only
    Only accept queries from IP address
    . .TP 8 .B \-auth Authorization file to restrict access. The file must hold lines of the form "user:password". .TP 8 .B \-log Redirect log trace to this file. .TP 8 .B \-nolock Do not lock files before writing. .TP 8 .B \-robot_xcl , Exclude connections when more than requests in seconds. .TP 8 .B \-login_tmout Login timeout for entries with passwords in CGI mode (default 1800s) .TP 8 .B \-redirect Send a message to say that this service has been redirected to .TP 8 .B \-trace_failed_passwd Print the failed passwords in log .TP 8 .B \-max_clients Max number of clients treated at the same time (default: no limit) (daemon only) .TP 8 .B \-conn_tmout Connection timeout (default 120s; 0 means no limit) .TP 8 .B \-daemon Unix daemon mode. .SH "LICENSE" .PP Geneweb is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. .PP .B Note : this copyright does not cover .I genealogic data bases generated by GeneWeb, nor the use of GeneWeb as Web site server or CGI - this is merely considered normal use of GeneWeb, and does not fall under the the heading of "derived work". Also note that the GPL above is copyrighted by the Free Software Foundation, but the instance of code that it refers to (the software GeneWeb) is copyrighted by .I INRIA. .\" This manual page was extended extended by Debian developers. geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/man/consang.10000660000175200017530000000117312664543647022710 0ustar guillaumeguillaume.TH GENEWEB 1 "2000 July 22" .UC 4 .SH NAME consang \- Computer Genealogical Consanguinities .SH SYNOPSIS .B consang [ .I file ] .br .SH DESCRIPTION .I consang calculates the consanguinities in the .IR E Geneweb database passed at the command line. .br The displaying of consanguinities is done when consulting the database, in the personal records, and while computing relationships. .PP The primary documentation of .I consang is in the .I HTML .IR , documentation, which you can find in the documentation directory (/usr/share/doc/geneweb on Debian systems). .br Please look there for complete and up-to-date documentation. .PP geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/0002770000175200017530000000000012664543647021211 5ustar guillaumeguillaumegeneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/Makefile0000660000175200017530000002012612664543647022651 0ustar guillaumeguillaume# $Id: Makefile,v 5.53 2008-11-03 15:40:10 ddr Exp $ include ../tools/Makefile.inc PREFIX=/usr OCAMLI=-I ../wserver -I ../dag2html GWC_OBJS=argl.cmo lock.cmo adef.cmo iovalue.cmo buff.cmo name.cmo mutil.cmo secure.cmo btree.cmo futil.cmo dutil.cmo database.cmo db2.cmo db2disk.cmo diff.cmo outbase.cmo gwdb.cmo pqueue.cmo progrBar.cmo consang.cmo consangAll.cmo checkItem.cmo check.cmo calendar.cmo notesLinks.cmo gwcomp.cmo db1link.cmo gwc.cmo GWC2_OBJS=calendar.cmo adef.cmo iovalue.cmo buff.cmo name.cmo mutil.cmo gwcomp.cmo argl.cmo lock.cmo progrBar.cmo secure.cmo iochan.cmo futil.cmo db2.cmo db2out.cmo notesLinks.cmo db2disk.cmo dutil.cmo btree.cmo database.cmo gwdb.cmo consang.cmo consangAll.cmo checkItem.cmo check.cmo db2link.cmo gwc2.cmo CONSANG_OBJS=argl.cmo lock.cmo adef.cmo iovalue.cmo buff.cmo name.cmo mutil.cmo secure.cmo btree.cmo futil.cmo dutil.cmo progrBar.cmo database.cmo db2.cmo db2disk.cmo db2out.cmo diff.cmo outbase.cmo gwdb.cmo pqueue.cmo consang.cmo consangAll.cmo mk_consang.cmo GWD_OBJS1=../wserver/wserver.cmo ../dag2html/dag2html.cmo argl.cmo lock.cmo adef.cmo iovalue.cmo buff.cmo name.cmo mutil.cmo secure.cmo btree.cmo futil.cmo dutil.cmo database.cmo db2.cmo db2disk.cmo diff.cmo gwdb.cmo checkItem.cmo gutil.cmo pqueue.cmo consang.cmo num.cmo version.cmo translate.cmo gwlib.cmo notesLinks.cmo util.cmo calendar.cmo templDate.cmo templ.cmo hutil.cmo date.cmo update.cmo wiki.cmo history_diff.cmo history.cmo notes.cmo wiznotes.cmo srcfile.cmo dag.cmo perso.cmo updateInd.cmo updateIndOk.cmo updateFam.cmo updateFamOk.cmo place.cmo updateData.cmo GWD_OBJS2=merge.cmo mergeFamOk.cmo mergeFam.cmo mergeInd.cmo mergeIndOk.cmo mergeDup.cmo changeChildren.cmo sendImage.cmo relationLink.cmo relation.cmo descend.cmo birthday.cmo cousins.cmo alln.cmo some.cmo searchName.cmo advSearchOk.cmo birthDeath.cmo title.cmo doc.cmo forum.cmo image.cmo request.cmo base64.cmo robot.cmo GWD_OBJS=$(GWD_OBJS1) $(GWD_OBJS2) compilation.cmo gwd.cmo GWU_OBJS=argl.cmo adef.cmo iovalue.cmo buff.cmo name.cmo mutil.cmo secure.cmo btree.cmo futil.cmo dutil.cmo database.cmo db2.cmo db2disk.cmo diff.cmo gwdb.cmo checkItem.cmo gutil.cmo select.cmo calendar.cmo notesLinks.cmo progrBar.cmo gwu.cmo PHONYGWD_OBJS=../wserver/wserver.cmo argl.cmo phonygwd.cmo PROBOT_OBJS=probot.cmo MOSTDESC_OBJS=argl.cmo secure.cmo buff.cmo name.cmo iovalue.cmo mutil.cmo adef.cmo futil.cmo diff.cmo dutil.cmo btree.cmo database.cmo db2.cmo db2disk.cmo gwdb.cmo consang.cmo pqueue.cmo num.cmo mostdesc.cmo FPLA_OBJS=argl.cmo secure.cmo buff.cmo name.cmo iovalue.cmo mutil.cmo adef.cmo futil.cmo diff.cmo dutil.cmo btree.cmo database.cmo db2.cmo db2disk.cmo gwdb.cmo fpla.cmo UPDATE_NLDB_OBJS=secure.cmo buff.cmo name.cmo adef.cmo iovalue.cmo mutil.cmo btree.cmo futil.cmo dutil.cmo database.cmo db2.cmo db2disk.cmo diff.cmo gwdb.cmo checkItem.cmo gutil.cmo argl.cmo notesLinks.cmo progrBar.cmo update_nldb.cmo CHECK_BASE_OBJS=buff.cmo name.cmo iovalue.cmo mutil.cmo adef.cmo futil.cmo diff.cmo secure.cmo dutil.cmo btree.cmo database.cmo db2.cmo db2disk.cmo gwdb.cmo progrBar.cmo checkItem.cmo consang.cmo check.cmo check_base.cmo all:: out out:: gwlib.ml opt:: gwlib.ml out:: def_syn.cmo ansel.cmo gwc1.out gwc2.out consang.out gwd.out gwu.out update_nldb.out check_base.out i18n_check.out $(RM) gwc gwc2 consang gwd gwu check_base cp gwc1.out gwc cp gwc1.out gwc1 cp gwc2.out gwc2 cp consang.out consang cp gwd.out gwd cp gwu.out gwu cp update_nldb.out update_nldb cp check_base.out check_base opt:: def_syn.cmo ansel.cmx gwc1.opt gwc2.opt consang.opt gwd.opt gwu.opt update_nldb.opt check_base.opt $(RM) gwc consang gwd gwu cp gwc1.opt gwc cp gwc1.opt gwc1 cp gwc2.opt gwc2 cp consang.opt consang cp gwd.opt gwd cp gwu.opt gwu cp update_nldb.opt update_nldb cp check_base.opt check_base $(STRIP) gwc gwc2 consang gwd gwu update_nldb check_base compilation.cmo: $(GWD_OBJS1) $(GWD_OBJS2) gwd.cmo $(MAKE) compilation.ml @$(CAMLP5_COMM) compilation.ml -o compilation.ppo $(OCAMLC) -c -impl compilation.ppo $(RM) compilation.ppo compilation.cmx: $(GWD_OBJS1:.cmo=.cmx) $(GWD_OBJS2.cmo=.cmx) gwd.cmx $(MAKE) compilation.ml @$(CAMLP5_COMM) compilation.ml -o compilation.ppo $(OCAMLOPT) -c -impl compilation.ppo $(RM) compilation.ppo compilation.ml: always > compilation.ml echo "open Def;" >> compilation.ml echo "value (wd, d, h) = ($$(date "+%u, {day=%d;month=%m;year=%Y;prec=Sure;delta=0}, \"%T %Z\""));" >> compilation.ml echo "value ct conf = Printf.sprintf \" (%4d-%02d-%02d %s)\" d.year d.month d.day h;" >> compilation.ml echo "Util.compilation_time_hook.val := ct;" >> compilation.ml clean:: $(RM) gwc gwc1 gwc2 consang gwd gwu update_nldb check_base gwlib.ml gwlib.ml: echo "value prefix =" > gwlib.ml echo " try Sys.getenv \"GWPREFIX\" with" >> gwlib.ml echo " [ Not_found -> \"$(PREFIX)\" ]" | \ sed -e 's|\\|/|g' >> gwlib.ml echo ";" >> gwlib.ml gwc1.out: $(GWC_OBJS) $(OCAMLC) -custom $(STATIC) unix.cma $(GWC_OBJS) $(LIBUNIX) -o gwc1.out gwc1.opt: $(GWC_OBJS:.cmo=.cmx) $(OCAMLOPT) $(STATIC) unix.cmxa $(GWC_OBJS:.cmo=.cmx) $(LIBUNIX) -o gwc1.opt gwc2.out: $(GWC2_OBJS) $(OCAMLC) -custom $(STATIC) unix.cma $(GWC2_OBJS) $(LIBUNIX) -o gwc2.out gwc2.opt: $(GWC2_OBJS:.cmo=.cmx) $(OCAMLOPT) $(STATIC) unix.cmxa $(GWC2_OBJS:.cmo=.cmx) $(LIBUNIX) -o gwc2.opt consang.out: $(CONSANG_OBJS) $(OCAMLC) -custom $(STATIC) unix.cma $(LIBUNIX) $(CONSANG_OBJS) -o consang.out consang.opt: $(CONSANG_OBJS:.cmo=.cmx) $(OCAMLOPT) $(STATIC) unix.cmxa $(LIBUNIX) $(CONSANG_OBJS:.cmo=.cmx) -o consang.opt gwd.out: $(GWD_OBJS) $(OCAMLC) -custom $(STATIC) $(OCAMLD) unix.cma str.cma -I $(CAMLP5D) gramlib.cma $(GWD_OBJS) $(LIBUNIX) -o gwd.out gwd.opt: $(GWD_OBJS:.cmo=.cmx) $(OCAMLOPT) $(GWD_OBJS1:.cmo=.cmx) -a -o x1.cmxa $(OCAMLOPT) $(GWD_OBJS2:.cmo=.cmx) -a -o x2.cmxa $(OCAMLOPT) $(STATIC) unix.cmxa str.cmxa -I $(CAMLP5D) gramlib.cmxa x1.cmxa x2.cmxa compilation.cmx gwd.cmx $(LIBUNIX) -o gwd.opt gwu.out: $(GWU_OBJS) $(OCAMLC) -custom $(STATIC) unix.cma $(LIBUNIX) $(GWU_OBJS) -o gwu.out gwu.opt: $(GWU_OBJS:.cmo=.cmx) $(OCAMLOPT) $(STATIC) unix.cmxa $(LIBUNIX) $(GWU_OBJS:.cmo=.cmx) -o gwu.opt phonygwd.out: $(PHONYGWD_OBJS) $(OCAMLC) -custom $(STATIC) unix.cma $(LIBUNIX) $(PHONYGWD_OBJS) -o phonygwd.out probot.out: $(PROBOT_OBJS) $(OCAMLC) -custom $(STATIC) unix.cma $(LIBUNIX) $(PROBOT_OBJS) -o probot.out mostdesc.out: $(MOSTDESC_OBJS) $(OCAMLC) -custom $(STATIC) unix.cma $(LIBUNIX) $(MOSTDESC_OBJS) -o mostdesc.out mostdesc.opt: $(MOSTDESC_OBJS:.cmo=.cmx) $(OCAMLOPT) $(STATIC) unix.cmxa $(LIBUNIX) $(MOSTDESC_OBJS:.cmo=.cmx) -o mostdesc.opt fpla.out: $(FPLA_OBJS) $(OCAMLC) -custom $(STATIC) unix.cma $(LIBUNIX) $(FPLA_OBJS) -o fpla.out fpla.opt: $(FPLA_OBJS:.cmo=.cmx) $(OCAMLOPT) $(STATIC) unix.cmxa $(LIBUNIX) $(FPLA_OBJS:.cmo=.cmx) -o fpla.opt update_nldb.out: $(UPDATE_NLDB_OBJS) $(OCAMLC) -custom $(STATIC) unix.cma $(LIBUNIX) $(UPDATE_NLDB_OBJS) -o update_nldb.out update_nldb.opt: $(UPDATE_NLDB_OBJS:.cmo=.cmx) $(OCAMLOPT) $(STATIC) unix.cmxa $(LIBUNIX) $(UPDATE_NLDB_OBJS:.cmo=.cmx) -o update_nldb.opt check_base.out: $(CHECK_BASE_OBJS) $(OCAMLC) -custom $(STATIC) unix.cma $(LIBUNIX) $(CHECK_BASE_OBJS) -o check_base.out check_base.opt: $(CHECK_BASE_OBJS:.cmo=.cmx) $(OCAMLOPT) $(STATIC) unix.cmxa $(LIBUNIX) $(CHECK_BASE_OBJS:.cmo=.cmx) -o check_base.opt i18n_check.out: i18n_check.cmo $(OCAMLC) i18n_check.cmo -o i18n_check.out i18n: pr_transl.cmo always if test -f i18n; then mv i18n i18n.bak; fi export LC_ALL=C; \ OBJS=`(grep -w -c "transl conf" *.ml; grep -w -c "transl_nth conf" *.ml) | grep -v :0 | sed s/:.*$$// | sort | uniq`; \ ( \ for i in $$OBJS; do \ echo $$i 1>&2; \ camlp5r pa_macro.cmo ./pa_lock.cmo ./pa_html.cmo ./pr_transl.cmo pa_extend.cmo $$i; \ done; \ cat ../hd/etc/*.txt ../hd/lang/start_utf8.txt ../hd/lang/advanced.txt | sed -e 's/%\[//g' -e 's/%]//g' -e 's/\]/\]\n/g' | grep "\[" | sed -e "s/^.*\[\*\?//" -e "s/::.*$$//" -e "s/].*$$//" \ ) | \ sort | uniq | grep -v '^$$' > i18n always: depend: $(MAKE) pr_dep.cmo def_syn.cmo gwlib.ml $(MAKE) pa_lock.cmo pa_html.cmo q_codes.cmo export LC_ALL=C; TOP=.. ../tools/camlp5_depend.sh $(OCAMLI) $$(ls *.mli *.ml) > .depend.new mv .depend.new .depend include .depend geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/wiki.ml0000660000175200017530000007614012664543647022515 0ustar guillaumeguillaume(* camlp5r ./pa_html.cmo *) (* $Id: wiki.ml,v 5.31 2007-09-12 09:58:44 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Config; open Hutil; open Printf; open Util; (* TLSW: Text Language Stolen to Wikipedia = title level 1 = == title level 2 == ... ====== title level 6 ====== * list ul/li item * list ul/li item ** list ul/li item 2nd level ** list ul/li item 2nd level ... # list ol/li item : indentation list dl/dd item ; list dl dt item ; dd item ''italic'' '''bold''' '''''bold+italic''''' [[first_name/surname/oc/text]] link; 'text' displayed [[first_name/surname/text]] link (oc = 0); 'text' displayed [[first_name/surname]] link (oc = 0); 'first_name surname' displayed [[[notes_subfile/text]]] link to a sub-file; 'text' displayed [[[notes_subfile]]] link to a sub-file; 'notes_subfile' displayed empty line : new paragraph lines starting with space : displayed as they are (providing 1/ there are at least two 2/ there is empty lines before and after the group of lines). __TOC__ : summary __SHORT_TOC__ : short summary (unnumbered) __NOTOC__ : no (automatic) numbered summary *) module Buff2 = Buff.Make (struct value buff = ref (Bytes.create 80); end); module Buff = Buff.Make (struct value buff = ref (Bytes.create 80); end); value first_cnt = 1; value tab lev s = String.make (2 * lev) ' ' ^ s; value section_level s len = loop 1 (len - 2) 4 where rec loop i j k = if i > 5 then i else if len > k && s.[i] = '=' && s.[j] = '=' then loop (i + 1) (j - 1) (k + 2) else i ; value notes_aliases conf = let fname = match p_getenv conf.base_env "notes_alias_file" with [ Some f -> Util.base_path [] f | None -> Filename.concat (Util.base_path [] (conf.bname ^ ".gwb")) "notes.alias" ] in match try Some (Secure.open_in fname) with [ Sys_error _ -> None ] with [ Some ic -> loop [] where rec loop list = match try Some (input_line ic) with [ End_of_file -> None ] with [ Some s -> let list = try let i = String.index s ' ' in [(String.sub s 0 i, String.sub s (i + 1) (String.length s - i - 1)) :: list] with [ Not_found -> list ] in loop list | None -> do { close_in ic; list } ] | None -> [] ] ; value map_notes aliases f = try List.assoc f aliases with [ Not_found -> f ] ; value fname_of_path (dirs, file) = List.fold_right Filename.concat dirs file; value str_start_with str i x = loop i 0 where rec loop i j = if j = String.length x then True else if i = String.length str then False else if str.[i] = x.[j] then loop (i + 1) (j + 1) else False ; type wiki_info = { wi_mode : string; wi_file_path : string -> string; wi_cancel_links : bool; wi_person_exists : (string * string * int) -> bool; wi_always_show_link : bool } ; value syntax_links conf wi s = let slen = String.length s in loop 0 1 0 0 where rec loop quot_lev pos i len = let (len, quot_lev) = if i = slen || List.exists (str_start_with s i) ["
  • "; "

    "] then let len = match quot_lev with [ 1 -> Buff.mstore len "" | 2 -> Buff.mstore len "" | 3 -> Buff.mstore len "" | _ -> len ] in (len, 0) else (len, quot_lev) in if i = slen then Buff.get len else if s.[i] = '%' && i < slen - 1 && List.mem s.[i+1] ['['; ']'; '{'; '}'; '''] then loop quot_lev pos (i + 2) (Buff.store len s.[i+1]) else if s.[i] = '%' && i < slen - 1 && s.[i+1] = '/' then loop quot_lev pos (i + 2) (Buff.mstore len conf.xhs) else if s.[i] = '{' then let (b, j) = loop 0 (i + 1) where rec loop len j = if j = slen then (Buff2.get len, j) else if j < slen - 1 && s.[j] = '%' then loop (Buff2.store len s.[j+1]) (j + 2) else if s.[j] = '}' then (Buff2.get len, j + 1) else loop (Buff2.store len s.[j]) (j + 1) in let s = sprintf "%s" b in loop quot_lev pos j (Buff.mstore len s) (* interesting idea, but perhaps dangerous (risk of hidden messages and use of database forum by ill-intentioned people to communicate)... else if str_start_with s i "[\n" then let j = try String.index_from s (i+2) ']' + 1 with [ Not_found -> slen ] in let b = String.sub s (i + 2) (j - i - 3) in let (tb, _) = Translate.inline conf.lang '%' (String.make 1) b in loop quot_lev pos j (Buff.mstore len tb) *) else if i <= slen - 5 && s.[i] = ''' && s.[i+1] = ''' && s.[i+2] = ''' && s.[i+3] = ''' && s.[i+4] = ''' && (quot_lev = 0 || quot_lev = 3) then let s = if quot_lev = 0 then "" else "" in loop (3 - quot_lev) pos (i + 5) (Buff.mstore len s) else if i <= slen - 3 && s.[i] = ''' && s.[i+1] = ''' && s.[i+2] = ''' && (quot_lev = 0 || quot_lev = 2) then let s = if quot_lev = 0 then "" else "" in loop (2 - quot_lev) pos (i + 3) (Buff.mstore len s) else if i <= slen - 2 && s.[i] = ''' && s.[i+1] = ''' && (quot_lev = 0 || quot_lev = 1) then let s = if quot_lev = 0 then "" else "" in loop (1 - quot_lev) pos (i + 2) (Buff.mstore len s) else match NotesLinks.misc_notes_link s i with [ NotesLinks.WLpage j fpath1 fname1 anchor text -> let (fpath, fname) = let aliases = notes_aliases conf in let fname = map_notes aliases fname1 in match NotesLinks.check_file_name fname with [ Some fpath -> (fpath, fname) | None -> (fpath1, fname1) ] in let c = let f = wi.wi_file_path (fname_of_path fpath) in if Sys.file_exists f then "" else " style=\"color:red\"" in let t = if wi.wi_cancel_links then text else sprintf "%s" (commd conf) wi.wi_mode fname anchor c text in loop quot_lev pos j (Buff.mstore len t) | NotesLinks.WLperson j (fn, sn, oc) name _ -> let t = if wi.wi_cancel_links then name else if wi.wi_person_exists (fn, sn, oc) then sprintf "%s" pos (commd conf) (code_varenv fn) (code_varenv sn) (if oc = 0 then "" else ";oc=" ^ string_of_int oc) name else if wi.wi_always_show_link then let s = " style=\"color:red\"" in sprintf "%s" pos (commd conf) (code_varenv fn) (code_varenv sn) (if oc = 0 then "" else ";oc=" ^ string_of_int oc) s name else sprintf "%s" (commd conf) (if conf.hide_names then "x x" else name) in loop quot_lev (pos + 1) j (Buff.mstore len t) | NotesLinks.WLwizard j wiz name -> let t = let s = if name <> "" then name else wiz in if wi.wi_cancel_links then s else sprintf "%s" (commd conf) wiz s in loop quot_lev (pos + 1) j (Buff.mstore len t) | NotesLinks.WLnone -> loop quot_lev pos (i + 1) (Buff.store len s.[i]) ] ; value toc_list = ["__NOTOC__"; "__TOC__"; "__SHORT_TOC__"]; value lines_list_of_string s = loop False [] 0 0 where rec loop no_toc lines len i = if i = String.length s then (List.rev (if len = 0 then lines else [Buff.get len :: lines]), no_toc) else if s.[i] = '\n' then let line = Buff.get len in let no_toc = List.mem line toc_list || no_toc in loop no_toc [line :: lines] 0 (i + 1) else loop no_toc lines (Buff.store len s.[i]) (i + 1) ; value adjust_ul_level rev_lines old_lev new_lev = if old_lev < new_lev then [tab (old_lev + 1) "
      " :: rev_lines] else let rev_lines = [List.hd rev_lines ^ "" :: List.tl rev_lines] in loop rev_lines old_lev where rec loop rev_lines lev = if lev = new_lev then rev_lines else loop [tab lev "
    " :: rev_lines] (lev - 1) ; value message_txt conf i = transl_nth conf "visualize/show/hide/summary" i; value sections_nums_of_tlsw_lines lines = let (lev, _, cnt, rev_sections_nums) = List.fold_left (fun (prev_lev, indent_stack, cnt, sections_nums) s -> let len = String.length s in if len > 2 && s.[0] = '=' && s.[len-1] = '=' then let slev = section_level s len in let (lev, stack) = loop prev_lev indent_stack where rec loop lev stack = match stack with [ [(prev_num, prev_slev) :: rest_stack] -> if slev < prev_slev then match rest_stack with [ [(_, prev_prev_slev) :: _] -> if slev > prev_prev_slev then let stack = [(prev_num, slev) :: rest_stack] in loop lev stack else loop (lev - 1) rest_stack | [] -> let stack = [(prev_num + 1, slev) :: rest_stack] in (lev - 1, stack) ] else if slev = prev_slev then let stack = [(prev_num + 1, slev) :: rest_stack] in (lev - 1, stack) else let stack = [(1, slev) :: stack] in (lev, stack) | [] -> let stack = [(1, slev) :: stack] in (lev, stack) ] in let section_num = let nums = List.map fst stack in String.concat "." (List.rev_map string_of_int nums) in (lev + 1, stack, cnt + 1, [(lev, section_num) :: sections_nums]) else (prev_lev, indent_stack, cnt, sections_nums)) (0, [], first_cnt, []) lines in List.rev rev_sections_nums ; value remove_links s = loop 0 0 where rec loop len i = if i = String.length s then Buff.get len else let (len, i) = match NotesLinks.misc_notes_link s i with [ NotesLinks.WLpage j _ _ _ text -> (Buff.mstore len text, j) | NotesLinks.WLperson j k name text -> let text = match text with [ Some text -> if text = "" then name else text | None -> name ] in (Buff.mstore len text, j) | NotesLinks.WLwizard j _ text -> (Buff.mstore len text, j) | NotesLinks.WLnone -> (Buff.store len s.[i], i + 1) ] in loop len i ; value summary_of_tlsw_lines conf short lines = let sections_nums = sections_nums_of_tlsw_lines lines in let (rev_summary, lev, cnt, _) = List.fold_left (fun (summary, prev_lev, cnt, sections_nums) s -> let s = remove_links s in let len = String.length s in if len > 2 && s.[0] = '=' && s.[len-1] = '=' then let slev = section_level s len in let (lev, section_num, sections_nums) = match sections_nums with [ [(lev, sn) :: sns] -> (lev, sn, sns) | [] -> (0, "fuck", []) ] in let summary = let s = sprintf "%s%s" cnt (if short then "" else section_num ^ " - ") (Gutil.strip_spaces (String.sub s slev (len - 2 * slev))) in if short then if summary = [] then [s] else [s; ";" :: summary] else let line = tab (lev + 1) "
  • " ^ s in [line :: adjust_ul_level summary (prev_lev - 1) lev] in (summary, lev + 1, cnt + 1, sections_nums) else (summary, prev_lev, cnt, sections_nums)) ([], 0, first_cnt, sections_nums) lines in if cnt <= first_cnt + 2 then (* less that 3 paragraphs : summary abandonned *) ([], []) else let rev_summary = if short then rev_summary else ["" :: adjust_ul_level rev_summary (lev - 1) 0] in let lines = ["
    "; ""; "
    "; "
    " ^ capitale (message_txt conf 3) ^ ""; ""; "
    "; "
    " :: List.rev_append rev_summary ["
    "; "
    "; "
    "; ""]] in (lines, sections_nums) ; value string_of_modify_link conf cnt empty = fun [ Some (can_edit, mode, sfn) -> if conf.wizard then let mode_pref = if can_edit then "MOD" else "VIEW" in sprintf "%s(%s)%s\n" (if empty then "

    " else sprintf "

    " conf.right conf.left) (commd conf) mode_pref mode cnt (if sfn = "" then "" else ";f=" ^ sfn) (if can_edit then transl_decline conf "modify" "" else transl conf "view source") (if empty then "

    " else "
    ") else "" | None -> "" ] ; value rec tlsw_list tag1 tag2 lev list sl = let btag2 = "<" ^ tag2 ^ ">" in let etag2 = "" in let list = [tab lev ("<" ^ tag1 ^ ">") :: list] in let list = loop list sl where rec loop list = fun [ [s1 :: ([s2 :: _] as sl)] -> if String.length s2 > 0 && List.mem s2.[0] ['*'; '#'; ':'; ';'] then let list = [tab lev btag2 ^ s1 :: list] in let (list, sl) = do_sub_list s2.[0] lev list sl in loop [tab lev etag2 :: list] sl else let (s1, ss1) = sub_sub_list lev tag2 s1 in loop [tab lev btag2 ^ s1 ^ etag2 ^ ss1 :: list] sl | [s1] -> let (s1, ss1) = sub_sub_list lev tag2 s1 in [tab lev btag2 ^ s1 ^ etag2 ^ ss1 :: list] | [] -> list ] in [tab lev ("") :: list] and sub_sub_list lev tag2 s1 = if tag2 = "dt" && String.contains s1 ':' then let i = String.index s1 ':' in let s = String.sub s1 0 i in let ss = "\n" ^ tab (lev + 1) "
    " ^ String.sub s1 (i + 1) (String.length s1 - i - 1) ^ "
    " in (s, ss) else (s1, "") and do_sub_list prompt lev list sl = let (tag1, tag2) = match prompt with [ '*' -> ("ul", "li") | '#' -> ("ol", "li") | ':' -> ("dl", "dd") | ';' -> ("dl", "dt") | _ -> assert False ] in let (list2, sl) = loop [] sl where rec loop list = fun [ [s :: sl] -> if String.length s > 0 && s.[0] = prompt then let s = String.sub s 1 (String.length s - 1) in loop [s :: list] sl else (list, [s :: sl]) | [] -> (list, []) ] in let list = tlsw_list tag1 tag2 (lev + 1) list (List.rev list2) in match sl with [ [s :: _] -> if String.length s > 0 && List.mem s.[0] ['*'; '#'; ':'; ';'] then do_sub_list s.[0] lev list sl else (list, sl) | [] -> (list, sl) ] ; value rec hotl conf wlo cnt edit_opt sections_nums list = fun [ ["__NOTOC__" :: sl] -> hotl conf wlo cnt edit_opt sections_nums list sl | ["__TOC__" :: sl] -> let list = match wlo with [ Some lines -> let (summary, _) = summary_of_tlsw_lines conf False lines in List.rev_append summary list | None -> list ] in hotl conf wlo cnt edit_opt sections_nums list sl | ["__SHORT_TOC__" :: sl] -> let list = match wlo with [ Some lines -> let (summary, _) = summary_of_tlsw_lines conf True lines in List.rev_append summary list | None -> list ] in hotl conf wlo cnt edit_opt sections_nums list sl | ["" :: sl] -> let parag = let rec loop1 parag = fun [ ["" :: sl] -> Some (parag, sl, True) | [s :: sl] -> if List.mem s.[0] ['*'; '#'; ':'; ';'; '='] || List.mem s toc_list then if parag = [] then None else Some (parag, [s :: sl], True) else if s.[0] = ' ' && parag = [] then loop2 [s] sl else loop1 [s :: parag] sl | [] -> Some (parag, [], True) ] and loop2 parag = fun [ ["" :: sl] -> Some (parag, sl, False) | [s :: sl] -> if s.[0] = ' ' then loop2 [s :: parag] sl else loop1 parag [s :: sl] | [] -> Some (parag, [], True) ] in loop1 [] sl in let (list, sl) = match parag with [ Some ([], _, _) | None -> (list, sl) | Some (parag, sl, False) when List.length parag >= 2 -> (["" :: parag @ ["
    " :: list]], ["" :: sl])
            | Some (parag, sl, _) ->
                (["

    " :: parag @ ["

    " :: list]], ["" :: sl]) ] in hotl conf wlo cnt edit_opt sections_nums list sl | [s :: sl] -> let len = String.length s in let tago = if len > 0 then match s.[0] with [ '*' -> Some ("ul", "li") | '#' -> Some ("ol", "li") | ':' -> Some ("dl", "dd") | ';' -> Some ("dl", "dt") | _ -> None ] else None in match tago with [ Some (tag1, tag2) -> let (sl, rest) = select_list_lines conf s.[0] [] [s :: sl] in let list = tlsw_list tag1 tag2 0 list sl in hotl conf wlo cnt edit_opt sections_nums list ["" :: rest] | None -> if len > 2 && s.[0] = '=' && s.[len-1] = '=' then let slev = section_level s len in let (section_num, sections_nums) = match sections_nums with [ [(_, a) :: l] -> (a ^ " - ", l) | [] -> ("", []) ] in let s = let style = if slev <= 3 then " class=\"subtitle\"" else "" in sprintf "%s%s" slev style section_num (String.sub s slev (len-2*slev)) slev in let list = if wlo <> None then let s = sprintf "

    " cnt in [s:: list] else list in let list = let s = string_of_modify_link conf cnt False edit_opt in if s = "" then list else [s :: list] in hotl conf wlo (cnt + 1) edit_opt sections_nums list [s :: sl] else hotl conf wlo cnt edit_opt sections_nums [s :: list] sl ] | [] -> List.rev list ] and select_list_lines conf prompt list = fun [ [s :: sl] -> let len = String.length s in if len > 0 && s.[0] = '=' then (List.rev list, [s :: sl]) else if len > 0 && s.[0] = prompt then let s = String.sub s 1 (len - 1) in let (s, sl) = loop s sl where rec loop s1 = fun [ [""; s :: sl] when String.length s > 1 && s.[0] = prompt && s.[1] = prompt -> let br = "" in loop (s1 ^ br ^ br) [s :: sl] | [s :: sl] -> if String.length s > 0 && s.[0] = '=' then (s1, [s :: sl]) else if String.length s > 0 && s.[0] <> prompt then loop (s1 ^ "\n" ^ s) sl else (s1, [s :: sl]) | [] -> (s1, []) ] in select_list_lines conf prompt [s :: list] sl else (List.rev list, [s :: sl]) | [] -> (List.rev list, []) ] ; value html_of_tlsw conf s = let (lines, _) = lines_list_of_string s in let sections_nums = match sections_nums_of_tlsw_lines lines with [ [_] -> [] | l -> l ] in hotl conf (Some lines) first_cnt None sections_nums [] ["" :: lines] ; value html_with_summary_of_tlsw conf wi edit_opt s = let (lines, no_toc) = lines_list_of_string s in let (summary, sections_nums) = if no_toc then ([], []) else summary_of_tlsw_lines conf False lines in let (rev_lines_before_summary, lines) = loop [] lines where rec loop lines_bef = fun [ [s :: sl] -> if String.length s > 1 && s.[0] = '=' then (lines_bef, [s :: sl]) else loop [s :: lines_bef] sl | [] -> (lines_bef, []) ] in let lines_before_summary = hotl conf (Some lines) first_cnt None [] [] (List.rev rev_lines_before_summary) in let lines_after_summary = hotl conf (Some lines) first_cnt edit_opt sections_nums [] lines in let s = syntax_links conf wi (String.concat "\n" (lines_before_summary @ summary @ lines_after_summary)) in if lines_before_summary <> [] || lines = [] then let s2 = string_of_modify_link conf 0 (s = "") edit_opt in s2 ^ "

    \n" ^ s else s ; value rev_extract_sub_part s v = let (lines, _) = lines_list_of_string s in loop [] 0 first_cnt lines where rec loop lines lev cnt = fun [ [s :: sl] -> let len = String.length s in if len > 2 && s.[0] = '=' && s.[len-1] = '=' then if v = first_cnt - 1 then lines else let nlev = section_level s len in if cnt = v then loop [s :: lines] nlev (cnt + 1) sl else if cnt > v then if nlev > lev then loop [s :: lines] lev (cnt + 1) sl else lines else loop lines lev (cnt + 1) sl else if cnt <= v then loop lines lev cnt sl else loop [s :: lines] lev cnt sl | [] -> lines ] ; value extract_sub_part s v = List.rev (rev_extract_sub_part s v); value print_sub_part_links conf edit_mode sfn cnt0 is_empty = tag "p" begin if cnt0 >= first_cnt then stagn "a" "href=\"%sm=%s%s;v=%d\"" (commd conf) edit_mode sfn (cnt0 - 1) begin Wserver.wprint "<<"; end else (); stagn "a" "href=\"%sm=%s%s\"" (commd conf) edit_mode sfn begin Wserver.wprint "^^"; end; if not is_empty then stagn "a" "href=\"%sm=%s%s;v=%d\"" (commd conf) edit_mode sfn (cnt0 + 1) begin Wserver.wprint ">>"; end else (); end ; value print_sub_part_text conf wi edit_opt cnt0 lines = let lines = List.map (fun [ "__TOC__" | "__SHORT_TOC__" -> sprintf "

    ...%s...

    " (message_txt conf 3) | "__NOTOC__" -> "" | s -> s ]) lines in let lines = hotl conf None cnt0 edit_opt [] [] lines in let s = String.concat "\n" lines in let s = syntax_links conf wi s in let s = if cnt0 < first_cnt then let s2 = string_of_modify_link conf 0 (s = "") edit_opt in s2 ^ s else s in Wserver.wprint "%s\n" s ; value print_sub_part conf wi can_edit edit_mode sub_fname cnt0 lines = let edit_opt = Some (can_edit, edit_mode, sub_fname) in let sfn = if sub_fname = "" then "" else ";f=" ^ sub_fname in do { print_sub_part_links conf edit_mode sfn cnt0 (lines = []); print_sub_part_text conf wi edit_opt cnt0 lines; } ; value print_mod_view_page conf can_edit mode fname title env s = do { let s = List.fold_left (fun s (k, v) -> s ^ k ^ "=" ^ v ^ "\n") "" env ^ s in let mode_pref = if can_edit then "MOD_" else "VIEW_" in let (has_v, v) = match p_getint conf.env "v" with [ Some v -> (True, v) | None -> (False, 0) ] in let sub_part = if not has_v then s else String.concat "\n" (extract_sub_part s v) in let is_empty = sub_part = "" in let sfn = if fname = "" then "" else ";f=" ^ code_varenv fname in header conf title; if can_edit then tag "div" "style=\"font-size:80%%;float:%s;margin-%s:3em\"" conf.right conf.left begin Wserver.wprint "("; stag "a" "href=\"%sm=%s%s%s\"" (commd conf) mode (if has_v then ";v=" ^ string_of_int v else "") sfn begin Wserver.wprint "%s" (message_txt conf 0); end; Wserver.wprint ")\n"; end else (); print_link_to_welcome conf (if can_edit then False else True); if can_edit && has_v then print_sub_part_links conf (mode_pref ^ mode) sfn v is_empty else (); tag "form" "method=\"post\" action=\"%s\"" conf.command begin tag "p" begin Util.hidden_env conf; if can_edit then xtag "input" "type=\"hidden\" name=\"m\" value=\"MOD_%s_OK\"" mode else (); if has_v then xtag "input" "type=\"hidden\" name=\"v\" value=\"%d\"" v else (); if fname <> "" then xtag "input" "type=\"hidden\" name=\"f\" value=\"%s\"" fname else (); if can_edit then let digest = Iovalue.digest s in xtag "input" "type=\"hidden\" name=\"digest\" value=\"%s\"" digest else (); begin_centered conf; tag "table" "border=\"1\"" begin tag "tr" begin tag "td" begin tag "table" begin match Util.open_etc_file "toolbar" with [ Some ic -> tag "tr" begin tag "td" begin Templ.copy_from_templ conf [("name", "notes")] ic; end; end | None -> () ]; tag "tr" begin tag "td" begin stag "textarea" "name=\"notes\" rows=\"25\" cols=\"110\"%s" (if can_edit then "" else " readonly=\"readonly\"") begin Wserver.wprint "%s" (quote_escaped sub_part); end; end; end; match Util.open_etc_file "accent" with [ Some ic -> tag "tr" begin tag "td" begin Templ.copy_from_templ conf [("name", "notes")] ic; end; end | None -> () ]; end; if can_edit then do { xtag "br"; xtag "input" "type=\"submit\" value=\"Ok\""; } else (); end; end; end; end_centered conf; end; end; trailer conf; }; value insert_sub_part s v sub_part = let (lines, _) = lines_list_of_string s in let (lines, sl) = loop False [] 0 first_cnt lines where rec loop sub_part_added lines lev cnt = fun [ [s :: sl] -> let len = String.length s in if len > 2 && s.[0] = '=' && s.[len-1] = '=' then if v = first_cnt - 1 then (if sub_part = "" then [] else [""; sub_part], [s :: sl]) else let nlev = section_level s len in if cnt = v then let lines = if sub_part = "" then lines else [""; sub_part :: lines] in loop True lines nlev (cnt + 1) sl else if cnt > v then if nlev > lev then loop sub_part_added lines lev (cnt + 1) sl else (lines, [s :: sl]) else loop sub_part_added [s :: lines] lev (cnt + 1) sl else if cnt <= v then loop sub_part_added [s :: lines] lev cnt sl else loop sub_part_added lines lev cnt sl | [] -> let lines = if sub_part_added then lines else if sub_part = "" then lines else [""; sub_part :: lines] in (lines, []) ] in String.concat "\n" (List.rev_append lines sl) ; value rec find_env s i = match try Some (String.index_from s i '=', String.index_from s i '\n') with [ Not_found -> None ] with [ Some (j, k) -> if j > i && j < k then let is_key = loop i where rec loop i = if i = j then True else match s.[i] with [ 'A'..'Z' -> loop (i + 1) | _ -> False ] in if is_key then let key = String.sub s i (j - i) in let v = String.sub s (j + 1) (k - j - 1) in let (env, i) = find_env s (k + 1) in ([(key, v) :: env], i) else ([], i) else ([], i) | None -> ([], i) ] ; value split_title_and_text s = let (env, i) = find_env s 0 in let s = if i = 0 then s else String.sub s i (String.length s - i) in if try List.assoc "TITLE" env with [ Not_found -> "" ] = "" then (* just compatibility with prev impl (could be removed at release) *) let (tit, txt) = try let i = String.index s '\n' in let tit = String.sub s 0 i in let txt = String.sub s (i + 1) (String.length s - i - 1) in (tit, txt) with [ Not_found -> (s, "") ] in let (tit, txt) = if String.length tit > 0 && tit.[0] = '=' || String.contains tit '<' || String.contains tit '[' then ("", s) else (tit, txt) in let env = if tit <> "" then [("TITLE", tit) :: env] else env in (env, txt) else (env, s) ; value print_ok conf wi edit_mode fname title_is_1st s = let title _ = Wserver.wprint "%s" (Util.capitale (Util.transl conf "notes modified")) in do { Hutil.header_no_page_title conf title; tag "div" "style=\"text-align:center\"" begin Wserver.wprint "--- "; title (); Wserver.wprint " ---\n"; end; Hutil.print_link_to_welcome conf True; let get_v = Util.p_getint conf.env "v" in let v = match get_v with [ Some v -> v | None -> 0 ] in let (title, s) = if v = 0 && title_is_1st then let (env, s) = split_title_and_text s in (try List.assoc "TITLE" env with [ Not_found -> "" ], s) else ("", s) in let (lines, _) = lines_list_of_string s in let lines = if v = 0 && title <> "" then let title = Printf.sprintf "

    %s

    \n" title in [title :: lines] else lines in print_sub_part conf wi conf.wizard edit_mode fname v lines; Hutil.trailer conf } ; value print_mod_ok conf wi edit_mode fname read_string commit string_filter title_is_1st = let fname = fname (Util.p_getenv conf.env "f") in try match edit_mode fname with [ Some edit_mode -> let old_string = let (e, s) = read_string fname in List.fold_left (fun s (k, v) -> s ^ k ^ "=" ^ v ^ "\n") "" e ^ s in let sub_part = match Util.p_getenv conf.env "notes" with [ Some v -> Mutil.strip_all_trailing_spaces v | None -> failwith "notes unbound" ] in let digest = match Util.p_getenv conf.env "digest" with [ Some s -> s | None -> "" ] in if digest <> Iovalue.digest old_string then Update.error_digest conf else let s = match Util.p_getint conf.env "v" with [ Some v -> insert_sub_part old_string v sub_part | None -> sub_part ] in do { if s <> old_string then commit fname s else (); let sub_part = string_filter sub_part in print_ok conf wi edit_mode fname title_is_1st sub_part; } | None -> Hutil.incorrect_request conf ] with [ Update.ModErr -> () ] ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/db2link.ml0000660000175200017530000010763512664543647023103 0ustar guillaumeguillaume(* camlp5r *) (* $Id: db2link.ml,v 5.18 2012-01-27 08:53:53 ddr Exp $ *) (* Copyright (c) 2006-2008 INRIA *) open Def; open Futil; open Gwcomp; open Printf; value default_source = ref ""; value do_check = ref True; value do_consang = ref False; value pr_stats = ref False; type file_info = { f_curr_src_file : mutable string; f_curr_gwo_file : mutable string; f_separate : mutable bool; f_has_separates : mutable bool; f_sep_file_inx : mutable int } ; value max_warnings = 10; value max_errors = 10; type family = { fam : gen_family iper string; cpl : gen_couple iper; des : gen_descend iper } ; type file_field 'a = { oc_dat : out_channel; oc_acc : out_channel; dname : string; start_pos : option Iovalue.header_pos; sz32 : mutable int; sz64 : mutable int; item_cnt : mutable int; valu : 'a -> Obj.t } ; type gen = { g_pcnt : mutable int; g_fcnt : mutable int; g_scnt : mutable int; g_file_info : file_info; g_error : mutable bool; g_error_cnt : mutable int; g_warning_cnt : mutable int; g_first_av_occ : Hashtbl.t (Adef.istr * Adef.istr) int; g_tmp_dir : string; g_particles : list string; g_strings : Hashtbl.t string Adef.istr; g_index_of_key : Hashtbl.t Db2.key2 iper; g_occ_of_key : mutable array (Hashtbl.t Db2.key2 int); g_person_fields : list (file_field (gen_person iper string)); g_family_fields : list (file_field family); g_person_parents : (Iochan.t * out_channel); g_person_unions : (Iochan.t * out_channel); g_person_rparents : (Iochan.t * out_channel); g_person_related : (Iochan.t * Iochan.t); g_person_notes : (Iochan.t * out_channel)} ; value person_fields_arr = [("first_name", fun so -> Obj.repr so.first_name); ("surname", fun so -> Obj.repr so.surname); ("occ", fun so -> Obj.repr so.occ); ("image", fun so -> Obj.repr so.image); ("public_name", fun so -> Obj.repr so.public_name); ("qualifiers", fun so -> Obj.repr so.qualifiers); ("aliases", fun so -> Obj.repr so.aliases); ("first_names_aliases", fun so -> Obj.repr so.first_names_aliases); ("surnames_aliases", fun so -> Obj.repr so.surnames_aliases); ("titles", fun so -> Obj.repr so.titles); ("occupation", fun so -> Obj.repr so.occupation); ("sex", fun so -> Obj.repr so.sex); ("access", fun so -> Obj.repr so.access); ("birth", fun so -> Obj.repr so.birth); ("birth_place", fun so -> Obj.repr so.birth_place); ("birth_src", fun so -> Obj.repr so.birth_src); ("baptism", fun so -> Obj.repr so.baptism); ("baptism_place", fun so -> Obj.repr so.baptism_place); ("baptism_src", fun so -> Obj.repr so.baptism_src); ("death", fun so -> Obj.repr so.death); ("death_place", fun so -> Obj.repr so.death_place); ("death_src", fun so -> Obj.repr so.death_src); ("burial", fun so -> Obj.repr so.burial); ("burial_place", fun so -> Obj.repr so.burial_place); ("burial_src", fun so -> Obj.repr so.burial_src); ("psources", fun so -> Obj.repr so.psources)] ; value family_fields_arr = [("marriage", fun so -> Obj.repr so.fam.marriage); ("marriage_place", fun so -> Obj.repr so.fam.marriage_place); ("marriage_src", fun so -> Obj.repr so.fam.marriage_src); ("witnesses", fun so -> Obj.repr so.fam.witnesses); ("relation", fun so -> Obj.repr so.fam.relation); ("divorce", fun so -> Obj.repr so.fam.divorce); ("comment", fun so -> Obj.repr so.fam.comment); ("origin_file", fun so -> Obj.repr so.fam.origin_file); ("fsources", fun so -> Obj.repr so.fam.fsources); ("father", fun so -> Obj.repr (Adef.father so.cpl)); ("mother", fun so -> Obj.repr (Adef.mother so.cpl)); ("children", fun so -> Obj.repr so.des.children)] ; value input_particles part_file = if part_file = "" then ["af "; "d'"; "d’"; "dal "; "de "; "di "; "du "; "of "; "van "; "von und zu "; "von "; "zu "; "zur "; "AF "; "D'"; "D’"; "DAL "; "DE "; "DI "; "DU "; "OF "; "VAN "; "VON UND ZU "; "VON "; "ZU "; "ZUR "] else Mutil.input_particles part_file ; value particules_file = ref ""; value unique_key_string gen s = let s = Name.lower (Mutil.nominative s) in try Hashtbl.find gen.g_strings s with [ Not_found -> do { let istr = Adef.istr_of_int gen.g_scnt in Hashtbl.add gen.g_strings s istr; gen.g_scnt := gen.g_scnt + 1; istr } ] ; value key_hashtbl_find ht k = Hashtbl.find ht (Db2.key2_of_key k); value key_hashtbl_add ht k v = Hashtbl.add ht (Db2.key2_of_key k) v; value occ_of_key_ht gen = do { let i = gen.g_file_info.f_sep_file_inx in let len = Array.length gen.g_occ_of_key in if i >= len then let new_len = max (i + 1) (2 * len + 1) in gen.g_occ_of_key := Array.append gen.g_occ_of_key (Array.init (new_len - len) (fun _ -> Hashtbl.create 1)) else (); gen.g_occ_of_key.(i) }; value find_first_available_occ gen so fn sn = let occ = try Hashtbl.find gen.g_first_av_occ (fn, sn) with [ Not_found -> 0 ] in loop occ where rec loop occ = let k1 = (fn, sn, occ) in match try Some (key_hashtbl_find gen.g_index_of_key k1) with [ Not_found -> None ] with [ Some _ -> loop (occ + 1) | None -> do { gen.g_warning_cnt := gen.g_warning_cnt - 1; if gen.g_warning_cnt > 0 then do { eprintf "Warning: %s: %s.%d %s renumbered %d\n" gen.g_file_info.f_curr_gwo_file so.first_name so.occ so.surname occ; flush stderr; } else (); key_hashtbl_add (occ_of_key_ht gen) (fn, sn, so.occ) occ; Hashtbl.replace gen.g_first_av_occ (fn, sn) occ; occ; } ] ; value output_item v ff = do { Iovalue.size_32.val := ff.sz32; Iovalue.size_64.val := ff.sz64; Iovalue.output ff.oc_dat v; ff.sz32 := Iovalue.size_32.val; ff.sz64 := Iovalue.size_64.val; ff.item_cnt := ff.item_cnt + 1; }; value output_field so ff = do { output_binary_int ff.oc_acc (pos_out ff.oc_dat); output_item (ff.valu so) ff; }; value int_size = 4; value insert_person1 gen so = do { if so.first_name <> "?" && so.surname <> "?" then do { let fn = unique_key_string gen so.first_name in let sn = unique_key_string gen so.surname in let k = (fn, sn, so.occ) in try do { if gen.g_file_info.f_separate then ignore (key_hashtbl_find (occ_of_key_ht gen) k : int) else ignore (key_hashtbl_find gen.g_index_of_key k : iper); gen.g_error_cnt := gen.g_error_cnt - 1; if gen.g_error_cnt > 0 then do { eprintf "File \"%s\"\n" gen.g_file_info.f_curr_gwo_file; eprintf "Error: already defined %s.%d %s\n" so.first_name so.occ so.surname } else (); flush stderr; gen.g_error := True; } with [ Not_found -> do { let (k, so) = if gen.g_file_info.f_separate then let occ = find_first_available_occ gen so fn sn in ((fn, sn, occ), {(so) with occ = occ}) else (k, so) in let (k, so) = let psources = if so.psources = "" then default_source.val else so.psources in (k, {(so) with psources = psources}) in key_hashtbl_add gen.g_index_of_key k (Adef.iper_of_int gen.g_pcnt); List.iter (output_field so) gen.g_person_fields; Iochan.seek (fst gen.g_person_parents) (int_size * gen.g_pcnt); Iochan.output_binary_int (fst gen.g_person_parents) (-1); Iochan.seek (fst gen.g_person_unions) (int_size * gen.g_pcnt); Iochan.output_binary_int (fst gen.g_person_unions) (-1); Iochan.seek (fst gen.g_person_rparents) (int_size * gen.g_pcnt); Iochan.output_binary_int (fst gen.g_person_rparents) (-1); Iochan.seek (fst gen.g_person_related) (int_size * gen.g_pcnt); Iochan.output_binary_int (fst gen.g_person_related) (-1); Iochan.seek (fst gen.g_person_notes) (int_size * gen.g_pcnt); Iochan.output_binary_int (fst gen.g_person_notes) (-1); gen.g_pcnt := gen.g_pcnt + 1; } ] } else (); }; value insert_somebody1 gen sex = fun [ Undefined key -> () | Defined so -> let so = {(so) with sex = sex} in insert_person1 gen so ] ; value insert_family1 gen co fath_sex moth_sex witl fo deo = do { let _ifath = insert_somebody1 gen fath_sex (Adef.father co) in let _imoth = insert_somebody1 gen moth_sex (Adef.mother co) in Array.iter (fun key -> insert_person1 gen key) deo.children; List.iter (fun (so, sex) -> insert_somebody1 gen sex so) witl; }; value iter_option f = fun [ Some x -> f x | None -> () ] ; value insert_relation1 gen r = do { iter_option (insert_somebody1 gen Male) r.r_fath; iter_option (insert_somebody1 gen Female) r.r_moth; }; value insert_rparents1 gen sb sex rl = do { insert_somebody1 gen sex sb; List.iter (insert_relation1 gen) rl }; value insert_bnotes1 gen notesname str = do { let nfname = if notesname = "" then "notes" else let f = match NotesLinks.check_file_name notesname with [ Some (dl, f) -> List.fold_right Filename.concat dl f | None -> "bad" ] in Filename.concat "notes_d" f in let fname = List.fold_left Filename.concat gen.g_tmp_dir ["base_d"; nfname ^ ".txt"] in Mutil.mkdir_p (Filename.dirname fname); let oc = open_out fname in output_string oc str; close_out oc; if notesname = "" then do { let fname = List.fold_left Filename.concat gen.g_tmp_dir ["base_d"; "notes_of.txt"] in let oc = open_out fname in fprintf oc "%s\n" gen.g_file_info.f_curr_src_file; close_out oc; } else (); }; value write_file_contents fname text = do { let oc = open_out fname in output_string oc text; close_out oc; }; value insert_wiznotes1 gen wizid str = do { let wizdir = List.fold_left Filename.concat gen.g_tmp_dir ["base_d"; "wiznotes_d"] in Mutil.mkdir_p wizdir; let fname = Filename.concat wizdir wizid ^ ".txt" in write_file_contents fname str; }; value insert_gwo_1 gen = fun [ Family cpl fs ms witl fam des -> insert_family1 gen cpl fs ms witl fam des | Notes key str -> () | Relations sb sex rl -> insert_rparents1 gen sb sex rl | Bnotes nfname str -> insert_bnotes1 gen nfname str | Wnotes wizid str -> insert_wiznotes1 gen wizid str ] ; value empty_person = {first_name = ""; surname = ""; occ = 0; image = ""; first_names_aliases = []; surnames_aliases = []; public_name = ""; qualifiers = []; aliases = []; titles = []; rparents = []; related = []; occupation = ""; sex = Neuter; access = IfTitles; birth = Adef.codate_None; birth_place = ""; birth_src = ""; baptism = Adef.codate_None; baptism_place = ""; baptism_src = ""; death = DontKnowIfDead; death_place = ""; death_src = ""; burial = UnknownBurial; burial_place = ""; burial_src = ""; notes = ""; psources = ""; key_index = Adef.iper_of_int 0} ; value insert_undefined2 gen key fn sn sex = do { if key.pk_first_name <> "?" && key.pk_surname <> "?" then key_hashtbl_add gen.g_index_of_key (fn, sn, key.pk_occ) (Adef.iper_of_int gen.g_pcnt) else (); if gen.g_file_info.f_has_separates then do { gen.g_error_cnt := gen.g_error_cnt - 1; if gen.g_error_cnt > 0 then do { gen.g_error_cnt := -1; eprintf "Error: option -sep does not work when there are undefined persons\n"; flush stderr; } else (); gen.g_error := True; } else if do_check.val then do { gen.g_warning_cnt := gen.g_warning_cnt - 1; if gen.g_warning_cnt > 0 then eprintf "Warning: adding undefined %s.%d %s\n" (Name.lower key.pk_first_name) key.pk_occ (Name.lower key.pk_surname) else (); flush stderr; } else (); let so = {(empty_person) with first_name = key.pk_first_name; surname = key.pk_surname; occ = key.pk_occ; sex = sex} in List.iter (output_field so) gen.g_person_fields; Iochan.seek (fst gen.g_person_parents) (int_size * gen.g_pcnt); Iochan.output_binary_int (fst gen.g_person_parents) (-1); Iochan.seek (fst gen.g_person_unions) (int_size * gen.g_pcnt); Iochan.output_binary_int (fst gen.g_person_unions) (-1); Iochan.seek (fst gen.g_person_rparents) (int_size * gen.g_pcnt); Iochan.output_binary_int (fst gen.g_person_rparents) (-1); Iochan.seek (fst gen.g_person_related) (int_size * gen.g_pcnt); Iochan.output_binary_int (fst gen.g_person_related) (-1); Iochan.seek (fst gen.g_person_notes) (int_size * gen.g_pcnt); Iochan.output_binary_int (fst gen.g_person_notes) (-1); gen.g_pcnt := gen.g_pcnt + 1; Adef.iper_of_int (gen.g_pcnt - 1) }; value get_undefined2 gen key sex = let fn = unique_key_string gen key.pk_first_name in let sn = unique_key_string gen key.pk_surname in let occ = if gen.g_file_info.f_separate then try key_hashtbl_find (occ_of_key_ht gen) (fn, sn, key.pk_occ) with [ Not_found -> key.pk_occ ] else key.pk_occ in try key_hashtbl_find gen.g_index_of_key (fn, sn, occ) with [ Not_found -> insert_undefined2 gen key fn sn sex ] ; value get_person2 gen so sex = if so.first_name <> "?" && so.surname <> "?" then do { let fn = unique_key_string gen so.first_name in let sn = unique_key_string gen so.surname in let occ = if gen.g_file_info.f_separate then try key_hashtbl_find (occ_of_key_ht gen) (fn, sn, so.occ) with [ Not_found -> so.occ ] else so.occ in try key_hashtbl_find gen.g_index_of_key (fn, sn, occ) with [ Not_found -> failwith (sprintf "*** bug not found %s.%d %s" so.first_name so.occ so.surname) ] } else do { let so = if so.sex = Neuter then {(so) with sex = sex} else so in List.iter (output_field so) gen.g_person_fields; Iochan.seek (fst gen.g_person_parents) (int_size * gen.g_pcnt); Iochan.output_binary_int (fst gen.g_person_parents) (-1); Iochan.seek (fst gen.g_person_unions) (int_size * gen.g_pcnt); Iochan.output_binary_int (fst gen.g_person_unions) (-1); Iochan.seek (fst gen.g_person_rparents) (int_size * gen.g_pcnt); Iochan.output_binary_int (fst gen.g_person_rparents) (-1); Iochan.seek (fst gen.g_person_related) (int_size * gen.g_pcnt); Iochan.output_binary_int (fst gen.g_person_related) (-1); Iochan.seek (fst gen.g_person_notes) (int_size * gen.g_pcnt); Iochan.output_binary_int (fst gen.g_person_notes) (-1); gen.g_pcnt := gen.g_pcnt + 1; Adef.iper_of_int (gen.g_pcnt - 1) } ; value get_somebody2 gen sex = fun [ Undefined key -> get_undefined2 gen key sex | Defined so -> get_person2 gen so sex ] ; value insert_related gen irp ip = do { let (ioc_acc, ioc_dat) = gen.g_person_related in Iochan.seek ioc_acc (int_size * Adef.int_of_iper irp); let pos1 = Iochan.input_binary_int ioc_acc in let pos2 = Iochan.seek_end ioc_dat in Iochan.output_value_no_header ioc_dat (Adef.int_of_iper ip); Iochan.output_value_no_header ioc_dat pos1; Iochan.seek ioc_acc (int_size * Adef.int_of_iper irp); Iochan.output_binary_int ioc_acc pos2; }; value insert_family2 gen co fath_sex moth_sex witl fo deo = do { let ifath = get_somebody2 gen fath_sex (Adef.father co) in let imoth = get_somebody2 gen moth_sex (Adef.mother co) in let children = Array.map (fun key -> get_person2 gen key Neuter) deo.children in let witn = List.map (fun (so, sex) -> do { let ip = get_somebody2 gen sex so in insert_related gen ip ifath; ip }) witl in let fam = {fam ={(fo) with witnesses = Array.of_list witn}; cpl = Adef.couple ifath imoth; des = {children = children}} in List.iter (output_field fam) gen.g_family_fields; let pos_acc_fath = pos_out (snd gen.g_person_unions) in Iochan.seek (fst gen.g_person_unions) (int_size * Adef.int_of_iper ifath); let pos_data_fath = Iochan.input_binary_int (fst gen.g_person_unions) in Iochan.seek (fst gen.g_person_unions) (int_size * Adef.int_of_iper ifath); Iochan.output_binary_int (fst gen.g_person_unions) pos_acc_fath; Iovalue.output (snd gen.g_person_unions) gen.g_fcnt; Iovalue.output (snd gen.g_person_unions) pos_data_fath; let pos_acc_moth = pos_out (snd gen.g_person_unions) in Iochan.seek (fst gen.g_person_unions) (int_size * Adef.int_of_iper imoth); let pos_data_moth = Iochan.input_binary_int (fst gen.g_person_unions) in Iochan.seek (fst gen.g_person_unions) (int_size * Adef.int_of_iper imoth); Iochan.output_binary_int (fst gen.g_person_unions) pos_acc_moth; Iovalue.output (snd gen.g_person_unions) gen.g_fcnt; Iovalue.output (snd gen.g_person_unions) pos_data_moth; let pos_acc_parents = pos_out (snd gen.g_person_parents) in Array.iter (fun iper -> do { Iochan.seek (fst gen.g_person_parents) (int_size * Adef.int_of_iper iper); Iochan.output_binary_int (fst gen.g_person_parents) pos_acc_parents }) children; Iovalue.output (snd gen.g_person_parents) gen.g_fcnt; gen.g_fcnt := gen.g_fcnt + 1 }; value insert_notes2 gen key str = do { let ip = get_undefined2 gen key Neuter in let pos = pos_out (snd gen.g_person_notes) in Iovalue.output (snd gen.g_person_notes) str; Iochan.seek (fst gen.g_person_notes) (int_size * Adef.int_of_iper ip); Iochan.output_binary_int (fst gen.g_person_notes) pos; }; value map_option f = fun [ Some x -> Some (f x) | None -> None ] ; value insert_relation_parent2 gen ip sex k = do { let irp = get_somebody2 gen sex k in insert_related gen irp ip; irp }; value insert_relation2 gen ip r = let r_fath = map_option (insert_relation_parent2 gen ip Male) r.r_fath in let r_moth = map_option (insert_relation_parent2 gen ip Female) r.r_moth in {r_type = r.r_type; r_fath = r_fath; r_moth = r_moth; r_sources = 0} ; value insert_rparents2 gen sb sex rl = do { let ip = get_somebody2 gen sex sb in let rl = List.map (insert_relation2 gen ip) rl in let pos = pos_out (snd gen.g_person_rparents) in Iovalue.output (snd gen.g_person_rparents) rl; Iochan.seek (fst gen.g_person_rparents) (int_size * Adef.int_of_iper ip); Iochan.output_binary_int (fst gen.g_person_rparents) pos; }; value insert_gwo_2 gen = fun [ Family cpl fs ms witl fam des -> insert_family2 gen cpl fs ms witl fam des | Notes key str -> insert_notes2 gen key str | Relations sb sex rl -> insert_rparents2 gen sb sex rl | Bnotes nfname str -> () | Wnotes wizid str -> () ] ; value open_out_field_unknown_size d valu = do { let oc_dat = open_out_bin (Filename.concat d "data1") in let oc_acc = open_out_bin (Filename.concat d "access1") in {oc_dat = oc_dat; oc_acc = oc_acc; dname = d; start_pos = None; sz32 = 0; sz64 = 0; item_cnt = 0; valu = valu} }; value close_out_field_known_size pad ff = do { close_out ff.oc_dat; close_out ff.oc_acc; (* making input_value header of "data" file, and copying "data1" file *) let oc_dat = open_out_bin (Filename.concat ff.dname "data") in let start_pos = Iovalue.create_output_value_header oc_dat in Iovalue.size_32.val := ff.sz32; Iovalue.size_64.val := ff.sz64; Iovalue.output_block_header oc_dat 0 ff.item_cnt; let acc_shift = pos_out oc_dat in let fname1 = Filename.concat ff.dname "data1" in let ic_dat = open_in_bin fname1 in try while True do { output_byte oc_dat (input_byte ic_dat) } with [ End_of_file -> () ]; let _ : int = Iovalue.patch_output_value_header oc_dat start_pos in close_out oc_dat; close_in ic_dat; Sys.remove fname1; (* making "access" file from "access1" file with shift *) let oc_acc = open_out_bin (Filename.concat ff.dname "access") in let fname = Filename.concat ff.dname "access1" in let ic_acc = open_in_bin fname in try while True do { output_binary_int oc_acc (input_binary_int ic_acc + acc_shift); } with [ End_of_file -> () ]; close_out oc_acc; close_in ic_acc; Sys.remove fname; (* test *) Db2out.check_input_value "Db2link.close_out_field_known_size" (Filename.concat ff.dname "data") ff.item_cnt; }; (* used only by "reorder_fields": should be simplified *) value open_out_field d len valu = do { let oc_dat = open_out_bin (Filename.concat d "data2") in let oc_acc = open_out_bin (Filename.concat d "access2") in let start_pos = Iovalue.create_output_value_header oc_dat in Iovalue.output_block_header oc_dat 0 (max len Db2out.phony_min_size); assert (pos_out oc_dat = Db2.first_item_pos len); {oc_dat = oc_dat; oc_acc = oc_acc; start_pos = Some start_pos; dname = d; sz32 = Iovalue.size_32.val; sz64 = Iovalue.size_64.val; item_cnt = 0; valu = valu} }; (* used only by "reorder_fields": should be simplified *) value close_out_field pad ff len = do { close_out ff.oc_acc; ff.item_cnt := len; for i = ff.item_cnt + 1 to Db2out.phony_min_size do { output_item (ff.valu pad) ff; }; Iovalue.size_32.val := ff.sz32; Iovalue.size_64.val := ff.sz64; let start_pos = match ff.start_pos with [ Some s -> s | None -> assert False ] in ignore (Iovalue.patch_output_value_header ff.oc_dat start_pos : int); Iovalue.output_block_header ff.oc_dat 0 ff.item_cnt; assert (pos_out ff.oc_dat = Db2.first_item_pos ff.item_cnt); close_out ff.oc_dat; (* test *) Db2out.check_input_value "Db2link.close_out_field" (Filename.concat ff.dname "data2") ff.item_cnt; }; value no_person empty_string ip = {first_name = empty_string; surname = empty_string; occ = 0; image = empty_string; first_names_aliases = []; surnames_aliases = []; public_name = empty_string; qualifiers = []; titles = []; rparents = []; related = []; aliases = []; occupation = empty_string; sex = Neuter; access = Private; birth = Adef.codate_None; birth_place = empty_string; birth_src = empty_string; baptism = Adef.codate_None; baptism_place = empty_string; baptism_src = empty_string; death = DontKnowIfDead; death_place = empty_string; death_src = empty_string; burial = UnknownBurial; burial_place = empty_string; burial_src = empty_string; notes = empty_string; psources = empty_string; key_index = ip} ; value pad_per = no_person "" (Adef.iper_of_int 0); value no_family empty_string ifam = {fam = {marriage = Adef.codate_None; marriage_place = empty_string; marriage_src = empty_string; witnesses = [| |]; relation = Married; divorce = NotDivorced; comment = empty_string; origin_file = empty_string; fsources = empty_string; fam_index = ifam}; cpl = Adef.couple (Adef.iper_of_int 0) (Adef.iper_of_int 0); des = {children = [| |]}} ; value pad_fam = no_family "" (Adef.ifam_of_int 0); value compress_type_string len field_d e ic = do { Db2out.output_value_array_compress field_d e len "" (fun oc_acc output_item -> do { seek_in ic (Db2.first_item_pos len); try while True do { let s : string = Iovalue.input ic in assert (Obj.tag (Obj.repr s) = Obj.string_tag); let pos = output_item s in output_binary_int oc_acc pos } with [ End_of_file -> () ] }) }; value compress_type_list_string len field_d e ic = do { let oc_acc = open_out_bin (Filename.concat field_d ("access" ^ e)) in let oc_dat = open_out_bin (Filename.concat field_d ("data" ^ e)) in let oc_ext = open_out_bin (Filename.concat field_d "data2.ext") in let ht = Hashtbl.create 1 in seek_in ic (Db2.first_item_pos len); try let items_cnt = ref 0 in while True do { let sl : list string = Iovalue.input ic in if Obj.is_block (Obj.repr sl) then do { assert (Obj.tag (Obj.repr sl) = 0); assert (Obj.size (Obj.repr sl) = 2); } else assert (Obj.magic sl = 0); match sl with [ [_ :: _] -> do { output_binary_int oc_acc (pos_out oc_ext); let sl = List.map (Db2out.output_item_compress_return_pos oc_dat ht items_cnt) sl in Iovalue.output oc_ext (sl : list int) } | [] -> output_binary_int oc_acc (-1) ] } with [ End_of_file -> () ]; close_out oc_ext; close_out oc_dat; close_out oc_acc; }; value compress_type_list_title len field_d e ic = do { let oc_acc = open_out_bin (Filename.concat field_d ("access" ^ e)) in let oc_dat = open_out_bin (Filename.concat field_d ("data" ^ e)) in let oc_ext = open_out_bin (Filename.concat field_d "data2.ext") in let ht = Hashtbl.create 1 in seek_in ic (Db2.first_item_pos len); try let items_cnt = ref 0 in while True do { let tl : list (gen_title string) = Iovalue.input ic in match tl with [ [_ :: _] -> do { output_binary_int oc_acc (pos_out oc_ext); let tl = List.map (map_title_strings (Db2out.output_item_compress_return_pos oc_dat ht items_cnt)) tl in Iovalue.output oc_ext (tl : list (gen_title int)) } | [] -> output_binary_int oc_acc (-1) ] } with [ End_of_file -> () ]; close_out oc_ext; close_out oc_dat; close_out oc_acc; }; value compress_fields nper nfam tmp_dir = List.iter (fun (f1, f2, compress_type, len) -> do { let field_d = List.fold_left Filename.concat tmp_dir ["base_d"; f1; f2] in let ic = open_in_bin (Filename.concat field_d "data") in if Mutil.verbose.val then do { eprintf "compressing %s..." f2; flush stderr; } else (); compress_type len field_d "2" ic; close_in ic; List.iter (fun n -> do { let f = Filename.concat field_d n in Mutil.remove_file f; Sys.rename (Filename.concat field_d (n ^ "2")) f; }) ["data"; "access"]; if Mutil.verbose.val then do { Printf.eprintf "\n"; flush stderr } else (); }) [("person", "baptism_place", compress_type_string, nper); ("person", "baptism_src", compress_type_string, nper); ("person", "birth_place", compress_type_string, nper); ("person", "birth_src", compress_type_string, nper); ("person", "burial_place", compress_type_string, nper); ("person", "burial_src", compress_type_string, nper); ("family", "comment", compress_type_string, nfam); ("person", "death_place", compress_type_string, nper); ("person", "death_src", compress_type_string, nper); ("person", "first_name", compress_type_string, nper); ("family", "fsources", compress_type_string, nfam); ("person", "image", compress_type_string, nper); ("family", "marriage_place", compress_type_string, nfam); ("family", "marriage_src", compress_type_string, nfam); ("person", "occupation", compress_type_string, nper); ("family", "origin_file", compress_type_string, nfam); ("person", "psources", compress_type_string, nper); ("person", "public_name", compress_type_string, nper); ("person", "surname", compress_type_string, nper); ("person", "aliases", compress_type_list_string, nper); ("person", "first_names_aliases", compress_type_list_string, nper); ("person", "qualifiers", compress_type_list_string, nper); ("person", "surnames_aliases", compress_type_list_string, nper); ("person", "titles", compress_type_list_title, nper)] ; value read_int_array_field (ic_acc, ic_dat) n = do { seek_in ic_acc (4 * n); let pos = input_binary_int ic_acc in loop [] pos where rec loop list pos = if pos = -1 then Array.of_list list else do { seek_in ic_dat pos; let i = Iovalue.input ic_dat in loop [i :: list] (Iovalue.input ic_dat) } }; value reorder_type_list_int field_d ic_acc ic_dat ff = do { let item_cnt = ref 0 in try while True do { let x = read_int_array_field (ic_acc, ic_dat) item_cnt.val in output_field x ff; incr item_cnt; } with [ End_of_file -> () ]; }; value reorder_fields tmp_dir nper = List.iter (fun (f1, f2, reorder_type, len) -> do { let field_d = List.fold_left Filename.concat tmp_dir ["base_d"; f1; f2] in let ic_acc = open_in_bin (Filename.concat field_d "access") in let ic_dat = open_in_bin (Filename.concat field_d "data") in if Mutil.verbose.val then do { eprintf "reordering %s..." f2; flush stderr; } else (); let ff = open_out_field field_d len Obj.repr in reorder_type field_d ic_acc ic_dat ff; close_out_field [| |] ff len; close_in ic_dat; close_in ic_acc; List.iter (fun n -> do { let f = Filename.concat field_d n in Mutil.remove_file f; Sys.rename (Filename.concat field_d (n ^ "2")) f; }) ["data"; "access"]; if Mutil.verbose.val then do { Printf.eprintf "\n"; flush stderr } else (); }) [("person", "family", reorder_type_list_int, nper)] ; value output_command_line bdir = do { let oc = open_out (Filename.concat bdir "command.txt") in fprintf oc "%s" Sys.argv.(0); for i = 1 to Array.length Sys.argv - 1 do { fprintf oc " %s" Sys.argv.(i) }; fprintf oc "\n"; close_out oc; }; value output_particles_file tmp_dir particles = do { let fname = List.fold_left Filename.concat tmp_dir ["base_d"; "particles.txt"] in let oc = open_out fname in List.iter (fun s -> fprintf oc "%s\n" (Mutil.tr ' ' '_' s)) particles; close_out oc; }; value set_error base x = do { printf "\nError: "; Check.print_base_error stdout base x; }; value set_warning base = fun [ UndefinedSex _ -> () | x -> do { printf "\nWarning: "; Check.print_base_warning stdout base x; } ] ; value fold_option fsome vnone = fun [ Some v -> fsome v | None -> vnone ] ; value changed_p (ip, p, o_sex, o_rpar) = let p = Gwdb.dsk_person_of_person p in let _p = {(p) with sex = fold_option (fun s -> s) p.sex o_sex; rparents = fold_option (List.map (Futil.map_relation_ps (fun p -> p) (fun s -> Adef.istr_of_int 0))) p.rparents o_rpar} in let i = Adef.int_of_iper ip in do { Printf.eprintf "person %d not changed\n" i; flush stderr } ; value mkdir_and_open_out_field_unknown_size tmp_dir (name, valu) = do { let d = Filename.concat tmp_dir name in try Mutil.mkdir_p d with _ -> (); open_out_field_unknown_size d valu }; (* ******************************************************************** *) (* [Fonc] link : (file_info -> unit -> Gwcomp.gw_syntax option) -> *) (* string -> bool *) (** [Description] : TODO [Args] : - next_family_fun : - bdir : nom de la base. [Retour] : [Rem] : Non exporté en clair hors de ce module. *) (* ******************************************************************** *) value link next_family_fun bdir = do { let tmp_dir = Filename.concat "gw_tmp" bdir in Mutil.remove_dir tmp_dir; try Mutil.mkdir_p tmp_dir with _ -> (); let person_d = List.fold_left Filename.concat tmp_dir ["base_d"; "person"] in let family_d = List.fold_left Filename.concat tmp_dir ["base_d"; "family"] in try Mutil.mkdir_p person_d with _ -> (); try Mutil.mkdir_p family_d with _ -> (); let person_fields = List.map (mkdir_and_open_out_field_unknown_size person_d) person_fields_arr in let family_fields = List.map (mkdir_and_open_out_field_unknown_size family_d) family_fields_arr in let person_parents = do { let d = Filename.concat person_d "parents" in try Mutil.mkdir_p d with _ -> (); (Iochan.openfile (Filename.concat d "access") True, open_out_bin (Filename.concat d "data")) } in let person_unions = do { let d = Filename.concat person_d "family" in try Mutil.mkdir_p d with _ -> (); (Iochan.openfile (Filename.concat d "access") True, open_out_bin (Filename.concat d "data")) } in let person_rparents = do { let d = Filename.concat person_d "rparents" in try Mutil.mkdir_p d with _ -> (); (Iochan.openfile (Filename.concat d "access") True, open_out_bin (Filename.concat d "data")) } in let person_related = do { let d = Filename.concat person_d "related" in try Mutil.mkdir_p d with _ -> (); (Iochan.openfile (Filename.concat d "access") True, Iochan.openfile (Filename.concat d "data") True) } in let person_notes = do { let d = Filename.concat person_d "notes" in try Mutil.mkdir_p d with _ -> (); (Iochan.openfile (Filename.concat d "access") True, open_out_bin (Filename.concat d "data")) } in let fi = {f_curr_src_file = ""; f_curr_gwo_file = ""; f_separate = False; f_has_separates = False; f_sep_file_inx = 0} in let gen = {g_pcnt = 0; g_fcnt = 0; g_scnt = 0; g_file_info = fi; g_error = False; g_error_cnt = max_errors + 1; g_warning_cnt = max_warnings + 1; g_first_av_occ = Hashtbl.create 1; g_tmp_dir = tmp_dir; g_particles = input_particles particules_file.val; g_strings = Hashtbl.create 1; g_index_of_key = Hashtbl.create 1; g_occ_of_key = [| |]; g_person_fields = person_fields; g_family_fields = family_fields; g_person_parents = person_parents; g_person_unions = person_unions; g_person_rparents = person_rparents; g_person_related = person_related; g_person_notes = person_notes} in if Mutil.verbose.val then do { eprintf "pass 1: creating persons...\n"; flush stderr } else (); let next_family = next_family_fun fi in loop () where rec loop () = match next_family () with [ Some fam -> do { insert_gwo_1 gen fam; loop () } | None -> () ]; Gc.compact (); if Mutil.verbose.val then do { eprintf "pass 2: creating families...\n"; flush stderr } else (); let next_family = next_family_fun fi in loop () where rec loop () = match next_family () with [ Some fam -> do { insert_gwo_2 gen fam; loop () } | None -> () ]; if gen.g_warning_cnt < 0 then do { eprintf "Warning: %d more warnings...\n" (-gen.g_warning_cnt); flush stderr; } else (); if gen.g_error_cnt < 0 then do { eprintf "Error: %d more errors...\n" (-gen.g_error_cnt); flush stderr; } else (); List.iter (close_out_field_known_size pad_per) person_fields; List.iter (close_out_field_known_size pad_fam) family_fields; Iochan.close (fst person_notes); close_out (snd person_notes); Iochan.close (fst person_related); Iochan.close (snd person_related); Iochan.close (fst person_rparents); close_out (snd person_rparents); Iochan.close (fst person_unions); close_out (snd person_unions); Iochan.close (fst person_parents); close_out (snd person_parents); Gc.compact (); let person_of_key_d = List.fold_left Filename.concat tmp_dir ["base_d"; "person_of_key"] in try Mutil.mkdir_p person_of_key_d with _ -> (); Db2out.output_hashtbl person_of_key_d "iper_of_key.ht" (gen.g_index_of_key : Hashtbl.t Db2.key2 iper); Hashtbl.clear gen.g_index_of_key; Db2out.output_hashtbl person_of_key_d "istr_of_string.ht" (gen.g_strings : Hashtbl.t string Adef.istr); Hashtbl.clear gen.g_strings; Gc.compact (); compress_fields gen.g_pcnt gen.g_fcnt tmp_dir; reorder_fields tmp_dir gen.g_pcnt; Db2out.make_indexes (Filename.concat tmp_dir "base_d") gen.g_pcnt gen.g_particles; output_particles_file tmp_dir gen.g_particles; if Mutil.verbose.val then do { Printf.eprintf "pcnt %d\n" gen.g_pcnt; Printf.eprintf "fcnt %d\n" gen.g_fcnt; Printf.eprintf "scnt %d\n" gen.g_scnt; flush stderr; } else (); if not gen.g_error then do { Mutil.mkdir_p bdir; let dir = Filename.concat bdir "base_d" in let old_dir = Filename.concat bdir "base_d~" in Mutil.remove_dir old_dir; try Sys.rename dir old_dir with [ Sys_error _ -> () ]; Sys.rename (Filename.concat tmp_dir "base_d") dir; Mutil.remove_dir old_dir; try Unix.rmdir tmp_dir with [ Unix.Unix_error _ _ _ -> () ]; try Unix.rmdir "gw_tmp" with [ Unix.Unix_error _ _ _ -> () ]; output_command_line bdir; if do_check.val || do_consang.val then do { let base = Gwdb.open_base bdir in if do_check.val then Check.check_base base (set_error base) (set_warning base) (fun _ -> True) changed_p pr_stats.val else (); if do_consang.val then let _ : option _ = ConsangAll.compute base (-1) True False in () else (); } else (); True } else False }; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/request.ml0000660000175200017530000007707212664543647023247 0ustar guillaumeguillaume(* camlp5r ./def_syn.cmo ./pa_lock.cmo ./pa_html.cmo *) (* $Id: request.ml,v 5.61 2008-11-03 15:40:10 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Config; open Def; open Gutil; open Gwdb; open Hutil; open Util; value person_is_std_key conf base p k = let k = Name.strip_lower k in if k = Name.strip_lower (p_first_name base p ^ " " ^ p_surname base p) then True else if List.exists (fun n -> Name.strip n = k) (person_misc_names base p (nobtit conf base)) then True else False ; value select_std_eq conf base pl k = List.fold_right (fun p pl -> if person_is_std_key conf base p k then [p :: pl] else pl) pl [] ; value very_unknown conf = match (p_getenv conf.env "n", p_getenv conf.env "p") with [ (Some nom, Some prenom) -> let title _ = Wserver.wprint "%s: \"%s %s\"" (capitale (transl conf "not found")) prenom nom in do { rheader conf title; print_link_to_welcome conf False; trailer conf; } | _ -> incorrect_request conf ] ; value unknown conf n = let title _ = Wserver.wprint "%s: \"%s\"" (capitale (transl conf "not found")) n in do { rheader conf title; print_link_to_welcome conf False; trailer conf; } ; value relation_print conf base p = let p1 = match p_getint conf.senv "ei" with [ Some i -> do { conf.senv := []; if i >= 0 && i < nb_of_persons base then Some (pget conf base (Adef.iper_of_int i)) else None } | None -> match find_person_in_env conf base "1" with [ Some p1 -> do { conf.senv := []; Some p1 } | None -> None ] ] in Relation.print conf base p p1 ; value person_selected conf base p = match p_getenv conf.senv "em" with [ Some "R" -> relation_print conf base p | Some mode -> incorrect_request conf | None -> Perso.print conf base p ] ; value compact_list conf base xl = let pl = sort_person_list base xl in let pl = List.fold_right (fun p pl -> match pl with [ [p1 :: _] when get_key_index p = get_key_index p1 -> pl | _ -> [p :: pl] ]) pl [] in pl ; value cut_words str = loop 0 0 where rec loop beg i = if i < String.length str then match str.[i] with [ ' ' -> if beg = i then loop (succ beg) (succ i) else [String.sub str beg (i - beg) :: loop (succ i) (succ i)] | _ -> loop beg (succ i) ] else if beg = i then [] else [String.sub str beg (i - beg)] ; value try_find_with_one_first_name conf base n = let n1 = Name.abbrev (Name.lower n) in match Mutil.lindex n1 ' ' with [ Some i -> let fn = String.sub n1 0 i in let sn = String.sub n1 (i + 1) (String.length n1 - i - 1) in let (list, _) = Some.persons_of_fsname conf base base_strings_of_surname (spi_find (persons_of_surname base)) get_surname sn in let pl = List.fold_left (fun pl (_, _, ipl) -> List.fold_left (fun pl ip -> let p = pget conf base ip in let fn1 = Name.abbrev (Name.lower (sou base (get_first_name p))) in if List.mem fn (cut_words fn1) then [p :: pl] else pl) pl ipl) [] list in pl | None -> [] ] ; value name_with_roman_number str = loop False 0 0 where rec loop found len i = if i = String.length str then if found then Some (Buff.get len) else None else match str.[i] with [ '0'..'9' as c -> let (n, i) = loop (Char.code c - Char.code '0') (i + 1) where rec loop n i = if i = String.length str then (n, i) else match str.[i] with [ '0'..'9' as c -> loop (10 * n + Char.code c - Char.code '0') (i + 1) | _ -> (n, i) ] in loop True (Buff.mstore len (Mutil.roman_of_arabian n)) i | c -> loop found (Buff.store len c) (i + 1) ] ; value find_all conf base an = let sosa_ref = Util.find_sosa_ref conf base in let sosa_nb = try Some (Num.of_string an) with [ Failure _ -> None ] in match (sosa_ref, sosa_nb) with [ (Some p, Some n) -> if n <> Num.zero then match Util.branch_of_sosa conf base (get_key_index p) n with [ Some [(ip, _) :: _] -> ([pget conf base ip], True) | _ -> ([], False) ] else ([], False) | _ -> match person_of_string_key base an with [ Some ip -> let pl = let p = pget conf base ip in if is_hidden p then [] else [p] in let pl = if not conf.wizard && not conf.friend then List.fold_right (fun p pl -> if not (is_hide_names conf p) || Util.fast_auth_age conf p then [p :: pl] else pl) pl [] else pl in (pl, False) | None -> let ipl = person_not_a_key_find_all base an in let (an, ipl) = if ipl = [] then match name_with_roman_number an with [ Some an1 -> let ipl = person_ht_find_all base an1 in if ipl = [] then (an, []) else (an1, ipl) | None -> (an, ipl) ] else (an, ipl) in let pl = List.fold_left (fun l ip -> let p = pget conf base ip in if is_hidden p then l else [p :: l]) [] ipl in let spl = select_std_eq conf base pl an in let pl = if spl = [] then if pl = [] then try_find_with_one_first_name conf base an else pl else spl in let pl = if not conf.wizard && not conf.friend then List.fold_right (fun p pl -> if not (is_hide_names conf p) || Util.fast_auth_age conf p then [p :: pl] else pl) pl [] else pl in (compact_list conf base pl, False) ] ] ; value specify conf base n pl = let title _ = Wserver.wprint "%s : %s" n (transl conf "specify") in let n = Name.crush_lower n in let ptll = List.map (fun p -> let tl = ref [] in let add_tl t = tl.val := let rec add_rec = fun [ [t1 :: tl1] -> if eq_istr t1.t_ident t.t_ident && eq_istr t1.t_place t.t_place then [t1 :: tl1] else [t1 :: add_rec tl1] | [] -> [t] ] in add_rec tl.val in let compare_and_add t pn = let pn = sou base pn in if Name.crush_lower pn = n then add_tl t else match get_qualifiers p with [ [nn :: _] -> let nn = sou base nn in if Name.crush_lower (pn ^ " " ^ nn) = n then add_tl t else () | _ -> () ] in do { List.iter (fun t -> match (t.t_name, get_public_name p) with [ (Tname s, _) -> compare_and_add t s | (_, pn) when sou base pn <> "" -> compare_and_add t pn | _ -> () ]) (nobtit conf base p); (p, tl.val) }) pl in do { header conf title; conf.cancel_links := False; print_link_to_welcome conf True; (* Si on est dans un calcul de parenté, on affiche *) (* l'aide sur la sélection d'un individu. *) Util.print_tips_relationship conf; Wserver.wprint "
      \n"; (* Construction de la table des sosa de la base *) let () = Perso.build_sosa_ht conf base in List.iter (fun (p, tl) -> tag "li" begin Perso.print_sosa conf base p True; match tl with [ [] -> Wserver.wprint "\n%s" (referenced_person_title_text conf base p) | [t :: _] -> do { tag "a" "href=\"%s%s\"" (commd conf) (acces conf base p) begin Wserver.wprint "%s" (titled_person_text conf base p t); end; List.iter (fun t -> Wserver.wprint "%s" (one_title_text conf base p t)) tl; } ]; Wserver.wprint "%s" (Date.short_dates_text conf base p); if authorized_age conf base p then match get_first_names_aliases p with [ [] -> () | fnal -> do { Wserver.wprint "\n("; Mutil.list_iter_first (fun first fna -> do { if not first then Wserver.wprint ", " else (); Wserver.wprint "%s" (sou base fna); }) fnal; Wserver.wprint ")"; } ] else (); let spouses = List.fold_right (fun ifam spouses -> let cpl = foi base ifam in let spouse = pget conf base (spouse (get_key_index p) cpl) in if p_surname base spouse <> "?" then [spouse :: spouses] else spouses) (Array.to_list (get_family p)) [] in match spouses with [ [] -> () | [h :: hl] -> let s = List.fold_left (fun s h -> s ^ ",\n" ^ person_title_text conf base h) (person_title_text conf base h) hl in Wserver.wprint ", & %s\n" s ]; end) ptll; Wserver.wprint "
    \n"; trailer conf; } ; (* Make the "special" environement; "em=mode;ei=n" *) value set_senv conf vm vi = do { conf.senv := [("em", vm); ("ei", vi)]; match p_getenv conf.env "image" with [ Some "on" -> conf.senv := conf.senv @ [("image", "on")] | _ -> () ]; match p_getenv conf.env "long" with [ Some "on" -> conf.senv := conf.senv @ [("long", "on")] | _ -> () ]; match p_getenv conf.env "spouse" with [ Some "on" -> conf.senv := conf.senv @ [("spouse", "on")] | _ -> () ]; match p_getenv conf.env "et" with [ Some x -> conf.senv := conf.senv @ [("et", x)] | _ -> () ]; match p_getenv conf.env "cgl" with [ Some "on" -> conf.senv := conf.senv @ [("cgl", "on")] | _ -> () ]; match p_getenv conf.env "bd" with [ None | Some ("0" | "") -> () | Some x -> conf.senv := conf.senv @ [("bd", x)] ]; match p_getenv conf.env "color" with [ Some x -> conf.senv := conf.senv @ [("color", code_varenv x)] | _ -> () ]; } ; value make_senv conf base = let get x = Util.p_getenv conf.env x in match (get "em", get "ei", get "ep", get "en", get "eoc") with [ (Some vm, Some vi, _, _, _) -> set_senv conf vm vi | (Some vm, None, Some vp, Some vn, voco) -> let voc = match voco with [ Some voc -> try int_of_string voc with [ Failure _ -> 0 ] | None -> 0 ] in let ip = match person_of_key base vp vn voc with [ Some ip -> ip | None -> do { incorrect_request conf; raise Exit } ] in let vi = string_of_int (Adef.int_of_iper ip) in set_senv conf vm vi | _ -> () ] ; value updmenu_print = Perso.interp_templ "updmenu"; value family_m conf base = match p_getenv conf.env "m" with [ Some "A" -> match find_person_in_env conf base "" with [ Some p -> Perso.print_ascend conf base p | _ -> very_unknown conf ] | Some "ADD_FAM" when conf.wizard -> UpdateFam.print_add conf base | Some "ADD_FAM_OK" when conf.wizard -> UpdateFamOk.print_add conf base | Some "ADD_IND" when conf.wizard -> UpdateInd.print_add conf base | Some "ADD_IND_OK" when conf.wizard -> UpdateIndOk.print_add conf base | Some "ADD_PAR" when conf.wizard -> UpdateFam.print_add_parents conf base | Some "ANM" -> Birthday.print_anniversaries conf base | Some "AN" -> match p_getenv conf.env "v" with [ Some x -> Birthday.print_birth conf base (int_of_string x) | _ -> Birthday.print_menu_birth conf base ] | Some "AD" -> match p_getenv conf.env "v" with [ Some x -> Birthday.print_dead conf base (int_of_string x) | _ -> Birthday.print_menu_dead conf base ] | Some "AM" -> match p_getenv conf.env "v" with [ Some x -> Birthday.print_marriage conf base (int_of_string x) | _ -> Birthday.print_menu_marriage conf base ] | Some "AS_OK" -> AdvSearchOk.print conf base | Some "B" when conf.wizard || conf.friend -> BirthDeath.print_birth conf base | Some "C" -> match find_person_in_env conf base "" with [ Some p -> Cousins.print conf base p | _ -> very_unknown conf ] | Some "CAL" -> Date.print_calendar conf base | Some "CHG_CHN" when conf.wizard -> ChangeChildren.print conf base | Some "CHG_CHN_OK" when conf.wizard -> ChangeChildren.print_ok conf base | Some "CHG_FAM_ORD" when conf.wizard -> UpdateFam.print_change_order conf base | Some "CHG_FAM_ORD_OK" when conf.wizard -> UpdateFamOk.print_change_order_ok conf base | Some "CONN_WIZ" when conf.wizard -> Wiznotes.connected_wizards conf base | Some "D" -> match find_person_in_env conf base "" with [ Some p -> Descend.print conf base p | _ -> very_unknown conf ] | Some "DAG" -> Dag.print conf base | Some "DEL_FAM" when conf.wizard -> UpdateFam.print_del conf base | Some "DEL_FAM_OK" when conf.wizard -> UpdateFamOk.print_del conf base | Some "DEL_IMAGE" when conf.wizard && conf.can_send_image -> SendImage.print_del conf base | Some "DEL_IMAGE_OK" when conf.wizard && conf.can_send_image -> SendImage.print_del_ok conf base | Some "DEL_IND" when conf.wizard -> UpdateInd.print_del conf base | Some "DEL_IND_OK" when conf.wizard -> UpdateIndOk.print_del conf base (* Fonction obsolète, la documentation n'étant plus à jour *) (* | Some "DOC" -> Doc.print conf *) | Some "FORUM" -> match p_getenv conf.base_env "disable_forum" with [ Some "yes" -> incorrect_request conf | _ -> Forum.print conf base ] | Some "FORUM_ADD" -> match p_getenv conf.base_env "disable_forum" with [ Some "yes" -> incorrect_request conf | _ -> Forum.print_add conf base ] | Some "FORUM_ADD_OK" -> match p_getenv conf.base_env "disable_forum" with [ Some "yes" -> incorrect_request conf | _ -> Forum.print_add_ok conf base ] | Some "FORUM_DEL" -> match p_getenv conf.base_env "disable_forum" with [ Some "yes" -> incorrect_request conf | _ -> Forum.print_del conf base ] | Some "FORUM_P_P" -> match p_getenv conf.base_env "disable_forum" with [ Some "yes" -> incorrect_request conf | _ -> Forum.print_access_switch conf base ] | Some "FORUM_SEARCH" -> match p_getenv conf.base_env "disable_forum" with [ Some "yes" -> incorrect_request conf | _ -> Forum.print_search conf base ] | Some "FORUM_VAL" -> match p_getenv conf.base_env "disable_forum" with [ Some "yes" -> incorrect_request conf | _ -> Forum.print_valid conf base ] | Some "FORUM_VIEW" -> match p_getenv conf.base_env "disable_forum" with [ Some "yes" -> incorrect_request conf | _ -> Forum.print conf base ] | Some "H" -> match p_getenv conf.env "v" with [ Some f -> Srcfile.print conf base f | None -> Hutil.incorrect_request conf ] | Some "HIST" -> History.print conf base | Some "HIST_CLEAN" when conf.wizard -> History_diff.print_clean conf base | Some "HIST_CLEAN_OK" when conf.wizard -> History_diff.print_clean_ok conf base | Some "HIST_DIFF" -> History_diff.print conf base | Some "HIST_SEARCH" -> History.print_search conf base | Some "IMH" -> Image.print_html conf base | Some "INV_FAM" when conf.wizard -> UpdateFam.print_inv conf base | Some "INV_FAM_OK" when conf.wizard -> UpdateFamOk.print_inv conf base | Some "KILL_ANC" when conf.wizard -> MergeInd.print_kill_ancestors conf base | Some "LB" when conf.wizard || conf.friend -> BirthDeath.print_birth conf base | Some "LD" when conf.wizard || conf.friend -> BirthDeath.print_death conf base | Some "LINKED" -> match find_person_in_env conf base "" with [ Some p -> Perso.print_what_links conf base p | _ -> very_unknown conf ] | Some "LL" -> BirthDeath.print_longest_lived conf base | Some "LM" when conf.wizard || conf.friend -> BirthDeath.print_marriage conf base | Some "LEX" -> Srcfile.print_lexicon conf base | Some "MISC_NOTES" -> Notes.print_misc_notes conf base | Some "MISC_NOTES_SEARCH" -> Notes.print_misc_notes_search conf base | Some "MOD_DATA" when conf.wizard -> UpdateData.print_mod conf base | Some "MOD_DATA_OK" when conf.wizard -> UpdateData.print_mod_ok conf base | Some "MOD_FAM" when conf.wizard -> UpdateFam.print_mod conf base | Some "MOD_FAM_OK" when conf.wizard -> UpdateFamOk.print_mod conf base | Some "MOD_IND" when conf.wizard -> UpdateInd.print_mod conf base | Some "MOD_IND_OK" when conf.wizard -> UpdateIndOk.print_mod conf base | Some "MOD_NOTES" when conf.wizard -> Notes.print_mod conf base | Some "MOD_NOTES_OK" when conf.wizard -> Notes.print_mod_ok conf base (* Fonction obsolète, la documentation n'étant plus à jour *) (* | Some "MOD_WDOC" when conf.wizard -> Doc.print_mod_wdoc conf *) (* | Some "MOD_WDOC_OK" when conf.wizard -> Doc.print_mod_wdoc_ok conf base *) | Some "MOD_WIZNOTES" when conf.authorized_wizards_notes -> Wiznotes.print_mod conf base | Some "MOD_WIZNOTES_OK" when conf.authorized_wizards_notes -> Wiznotes.print_mod_ok conf base | Some "MRG" when conf.wizard -> match find_person_in_env conf base "" with [ Some p -> Merge.print conf base p | _ -> very_unknown conf ] | Some "MRG_DUP" when conf.wizard -> MergeDup.main_page conf base | Some "MRG_DUP_IND_Y_N" when conf.wizard -> MergeDup.answ_ind_y_n conf base | Some "MRG_DUP_FAM_Y_N" when conf.wizard -> MergeDup.answ_fam_y_n conf base | Some "MRG_FAM" when conf.wizard -> MergeFam.print conf base | Some "MRG_FAM_OK" when conf.wizard -> MergeFamOk.print_merge conf base | Some "MRG_MOD_FAM_OK" when conf.wizard -> MergeFamOk.print_mod_merge conf base | Some "MRG_IND" when conf.wizard -> MergeInd.print conf base | Some "MRG_IND_OK" when conf.wizard -> MergeIndOk.print_merge conf base | Some "MRG_MOD_IND_OK" when conf.wizard -> MergeIndOk.print_mod_merge conf base | Some "N" -> match p_getenv conf.env "v" with [ Some v -> Some.surname_print conf base Some.surname_not_found v | _ -> Alln.print_surnames conf base ] | Some "NG" -> (* Rétro-compatibilité <= 6.06 *) let env = match p_getenv conf.env "n" with [ Some n -> match p_getenv conf.env "t" with [ Some "P" -> [("fn", n) :: conf.env] | Some "N" -> [("sn", n) :: conf.env] | _ -> [("n", n) :: conf.env] ] | None -> conf.env ] in let conf = {(conf) with env = env} in (* Nouveau mode de recherche. *) match p_getenv conf.env "select" with [ Some "input" | None -> (* Récupère le contenu non vide de la recherche. *) let real_input label = match p_getenv conf.env label with [ Some s -> if s = "" then None else Some s | None -> None ] in (* Recherche par clé, sosa, alias ... *) let search n = let (pl, sosa_acc) = find_all conf base n in match pl with [ [] -> (* S'il n'y a pas de résultat, on recherche par nom. *) do { conf.cancel_links := False; Some.surname_print conf base unknown n } | [p] -> if sosa_acc || Gutil.person_of_string_key base n <> None || person_is_std_key conf base p n then person_selected conf base p else specify conf base n pl | pl -> specify conf base n pl ] in match real_input "n" with [ Some n -> search n | None -> match (real_input "fn", real_input "sn") with [ (Some fn, Some sn) -> search (fn ^ " " ^ sn) | (Some fn, None) -> do { conf.cancel_links := False; Some.first_name_print conf base fn } | (None, Some sn) -> do { conf.cancel_links := False; Some.surname_print conf base unknown sn } | (None, None) -> incorrect_request conf ] ] | Some i -> relation_print conf base (pget conf base (Adef.iper_of_int (int_of_string i))) ] | Some "NOTES" -> Notes.print conf base | Some "OA" when conf.wizard || conf.friend -> BirthDeath.print_oldest_alive conf base | Some "OE" when conf.wizard || conf.friend -> BirthDeath.print_oldest_engagements conf base | Some "P" -> match p_getenv conf.env "v" with [ Some v -> Some.first_name_print conf base v | None -> Alln.print_first_names conf base ] | Some "POP_PYR" when conf.wizard || conf.friend -> BirthDeath.print_population_pyramid conf base | Some "PS" -> Place.print_all_places_surnames conf base | Some "R" -> match find_person_in_env conf base "" with [ Some p -> relation_print conf base p | _ -> very_unknown conf ] | Some "REQUEST" when conf.wizard -> let title _ = () in do { header conf title; Wserver.wprint "
    \n";
            List.iter (Wserver.wprint "%s\n") conf.request;
            Wserver.wprint "
    \n"; trailer conf; } | Some "RL" -> RelationLink.print conf base | Some "RLM" -> Relation.print_multi conf base | Some "S" -> SearchName.print conf base specify unknown | Some "SND_IMAGE" when conf.wizard && conf.can_send_image -> SendImage.print conf base | Some "SND_IMAGE_OK" when conf.wizard && conf.can_send_image -> SendImage.print_send_ok conf base | Some "SRC" -> match p_getenv conf.env "v" with [ Some f -> Srcfile.print_source conf base f | _ -> Hutil.incorrect_request conf ] | Some "STAT" -> BirthDeath.print_statistics conf base | Some "CHANGE_WIZ_VIS" when conf.wizard -> Wiznotes.change_wizard_visibility conf base | Some "TT" -> Title.print conf base | Some "U" when conf.wizard -> match find_person_in_env conf base "" with [ Some p -> updmenu_print conf base p | _ -> very_unknown conf ] | Some "VIEW_WIZNOTES" when conf.wizard && conf.authorized_wizards_notes -> Wiznotes.print_view conf base (* Fonction obsolète, la documentation n'étant plus à jour *) (* | Some "WDOC" -> Doc.print_wdoc conf *) | Some "WIZNOTES" when conf.authorized_wizards_notes -> Wiznotes.print conf base | Some "WIZNOTES_SEARCH" when conf.authorized_wizards_notes -> Wiznotes.print_search conf base | Some mode -> incorrect_request conf | None -> match find_person_in_env conf base "" with [ Some p -> person_selected conf base p | _ -> very_unknown conf ] ] ; value print_no_index conf base = let title _ = Wserver.wprint "%s" (Util.capitale (transl conf "link to use")) in let link = url_no_index conf base in do { header conf title; tag "ul" begin html_li conf; tag "a" "href=\"http://%s\"" link begin Wserver.wprint "%s" link; end; end; print_link_to_welcome conf False; trailer conf; } ; value special_vars = ["alwsurn"; "cgl"; "dsrc"; "em"; "ei"; "ep"; "en"; "eoc"; "escache"; "et"; "iz"; "log_cnl"; "log_pwd"; "log_uid"; "long"; "manitou"; "nz"; "ocz"; "pz"; "pure_xhtml"; "size"; "spouse"; "templ"] ; value only_special_env = List.for_all (fun (x, _) -> List.mem x special_vars); value extract_henv conf base = do { match find_sosa_ref conf base with [ Some p -> let x = let first_name = p_first_name base p in let surname = p_surname base p in if Util.accessible_by_key conf base p first_name surname then [("pz", code_varenv (Name.lower first_name)); ("nz", code_varenv (Name.lower surname)); ("ocz", string_of_int (get_occ p))] else [("iz", string_of_int (Adef.int_of_iper (get_key_index p)))] in conf.henv := conf.henv @ x | None -> () ]; match p_getenv conf.env "dsrc" with [ Some "" | None -> () | Some s -> conf.henv := conf.henv @ [("dsrc", code_varenv s)] ]; match p_getenv conf.env "templ" with [ None -> () | Some s -> conf.henv := conf.henv @ [("templ", code_varenv s)] ]; match p_getenv conf.env "escache" with [ Some _ -> let v = escache_value base in conf.henv := conf.henv @ [("escache", v)] | None -> () ]; match p_getenv conf.env "alwsurn" with [ Some x -> conf.henv := conf.henv @ [("alwsurn", x)] | None -> () ]; match p_getenv conf.env "pure_xhtml" with [ Some x -> conf.henv := conf.henv @ [("pure_xhtml", x)] | None -> () ]; match p_getenv conf.env "size" with [ Some x -> conf.henv := conf.henv @ [("size", x)] | None -> () ]; match p_getenv conf.env "manitou" with [ Some "off" -> conf.henv := conf.henv @ [("manitou", "off")] | Some _ | None -> () ]; } ; value set_owner conf = IFDEF UNIX THEN let s = Unix.stat (Util.base_path [] (conf.bname ^ ".gwb")) in try do { Unix.setgid s.Unix.st_gid; Unix.setuid s.Unix.st_uid; } with [ Unix.Unix_error _ _ _ -> () ] ELSE () END ; value thousand oc x = Num.print (output_string oc) "," (Num.of_int x); value log_count conf (log_file, log_oc, flush_log) r = if conf.cgi && log_file = "" then () else match r with [ Some (welcome_cnt, request_cnt, start_date) -> let oc = log_oc () in do { Printf.fprintf oc " #accesses %a (#welcome %a) since %s\n" thousand (welcome_cnt + request_cnt) thousand welcome_cnt start_date; flush_log oc; } | None -> () ] ; value print_moved conf base s = match Util.open_etc_file "moved" with [ Some ic -> let env = [("bname", conf.bname)] in do { Util.html conf; Util.nl (); Templ.copy_from_templ conf env ic; } | None -> let title _ = Wserver.wprint "%s -> %s" conf.bname s in do { Hutil.header_no_page_title conf title; Wserver.wprint "The database %s has moved to:\n
    \n" conf.bname; stag "a" "href=\"%s\"" s begin Wserver.wprint "%s" s; end; Wserver.wprint "\n
    \n"; Hutil.trailer conf; } ] ; value cnt_trace = ref 50; value trace_keys base (fn, sn, occ) ipo = do { if cnt_trace.val < 0 then () else match ipo with [ None -> do { Printf.eprintf "(\"%s\", \"%s\", \"%d\") deleted\n" fn sn occ; flush stderr; } | Some ip -> do { decr cnt_trace; let p = poi base ip in let fn1 = sou base (get_first_name p) in let sn1 = sou base (get_surname p) in let occ1 = get_occ p in if Name.lower (Mutil.nominative fn1) = fn && Name.lower (Mutil.nominative sn1) = sn && occ1 = occ then do { Printf.eprintf "(\"%s\", \"%s\", \"%d\") ok\n" fn sn occ; flush stderr; } else do { Printf.eprintf "Error %s.%d %s with key = (\"%s\", \"%s\", \"%d\")\n" fn1 occ1 sn1 fn sn occ; flush stderr; } } ]; }; value treat_request conf base log = do { match (p_getenv conf.base_env "moved", p_getenv conf.env "opt", p_getenv conf.env "m") with [ (Some s, _, _) -> print_moved conf base s | (_, Some "no_index", _) -> print_no_index conf base | (_, _, Some "IM") -> Image.print conf base | _ -> do { set_owner conf; extract_henv conf base; make_senv conf base; let conf = match Util.default_sosa_ref conf base with [ Some p -> {(conf) with default_sosa_ref = (get_key_index p, Some p)} | None -> conf ] in if only_special_env conf.env then do { match p_getenv conf.base_env "counter" with [ Some "no" -> () | _ -> let r = Srcfile.incr_welcome_counter conf in log_count conf log r ]; Srcfile.print_start conf base } else do { match p_getenv conf.base_env "counter" with [ Some "no" -> () | _ -> let r = Srcfile.incr_request_counter conf in log_count conf log r ] ; match p_getenv conf.env "ptempl" with [ Some tname when p_getenv conf.base_env "ptempl" = Some "yes" -> match find_person_in_env conf base "" with [ Some p -> Perso.interp_templ tname conf base p | None -> family_m conf base ] | _ -> family_m conf base ]; }; } ]; Wserver.wflush (); }; value treat_request_on_possibly_locked_base conf bfile log = match try Left (Gwdb.open_base bfile) with e -> Right e with [ Left base -> do { if Mutil.utf_8_db.val then () else do { Hashtbl.clear conf.lexicon; let fname = Filename.concat "lang" "lexicon.txt" in Mutil.input_lexicon conf.lang conf.lexicon (fun () -> Secure.open_in (Util.search_in_lang_path fname)); conf.charset := try Hashtbl.find conf.lexicon " !charset" with [ Not_found -> "iso-8859-1" ]; }; try treat_request conf base log with exc -> do { close_base base; raise exc }; close_base base; } | Right e -> let transl conf w = try Hashtbl.find conf.lexicon w with [ Not_found -> "[" ^ w ^ "]" ] in let title _ = Wserver.wprint "%s" (Util.capitale (transl conf "error")) in do { Hutil.rheader conf title; Wserver.wprint "
      "; Util.html_li conf; Wserver.wprint "%s" (Util.capitale (transl conf "cannot access base")); Wserver.wprint " \"%s\".
    \n" conf.bname; match e with [ Sys_error _ -> () | _ -> Wserver.wprint "Internal message: %s\n" (Printexc.to_string e) ]; Hutil.trailer conf; } ] ; value this_request_updates_database conf = match p_getenv conf.env "m" with [ Some ("FORUM_ADD_OK" | "FORUM_DEL" | "FORUM_VAL") -> True | Some x when conf.wizard -> match x with [ "ADD_FAM_OK" | "ADD_IND_OK" | "CHANGE_WIZ_VIS" | "CHG_CHN_OK" | "CHG_FAM_ORD_OK" | "DEL_FAM_OK" | "DEL_IMAGE_OK" | "DEL_IND_OK" | "INV_FAM_OK" | "KILL_ANC" | "MOD_FAM_OK" | "MOD_IND_OK" | "MOD_NOTES_OK" | "MOD_WIZNOTES_OK" | "MRG_DUP_IND_Y_N" | "MRG_DUP_FAM_Y_N" | "MRG_IND" | "MRG_MOD_FAM_OK" | "MRG_MOD_IND_OK" | "MOD_DATA_OK" | "SND_IMAGE_OK" -> True | _ -> False ] | _ -> False ] ; (* type t = [ Accept | Refuse ]; *) value treat_request_on_base conf log = let bfile = Util.base_path [] (conf.bname ^ ".gwb") in if this_request_updates_database conf then (**) lock Mutil.lock_file bfile with (* match if Sys.file_exists "refuse" then Refuse else Accept with *) [ Accept -> treat_request_on_possibly_locked_base conf bfile log | Refuse -> Update.error_locked conf ] else treat_request_on_possibly_locked_base conf bfile log ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/gutil.ml0000660000175200017530000002071312664543647022671 0ustar guillaumeguillaume(* $Id: gutil.ml,v 5.52 2007-01-19 01:53:16 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Def; open Gwdb; open Mutil; value string_sub s i len = let i = min (String.length s) (max 0 i) in let len = min (String.length s - i) (max 0 len) in String.sub s i len ; value utf_8_intern_byte c = utf_8_db.val && Char.code c >= 0x80 && Char.code c < 0xC0; value designation base p = let first_name = p_first_name base p in let nom = p_surname base p in iso_8859_1_of_utf_8 (first_name ^ "." ^ string_of_int (get_occ p) ^ " " ^ nom) ; value father = Adef.father; value mother = Adef.mother; value couple multi fath moth = if not multi then Adef.couple fath moth else Adef.multi_couple fath moth ; value parent_array = Adef.parent_array; value spouse ip cpl = if ip = get_father cpl then get_mother cpl else get_father cpl ; value person_ht_add base s ip = patch_name base s ip; value person_is_key base p k = let k = Name.crush_lower k in if k = Name.crush_lower (p_first_name base p ^ " " ^ p_surname base p) then True else if List.exists (fun x -> k = Name.crush_lower x) (person_misc_names base p get_titles) then True else False ; value find_num s i = loop i i where rec loop start i = if i = String.length s then None else match s.[i] with [ '0'..'9' -> loop start (i + 1) | c -> if i = start then if c = ' ' then loop (start + 1) (start + 1) else None else Some (int_of_string (String.sub s start (i - start)), i) ] ; value split_key s i = loop i where rec loop i = if i = String.length s then None else if s.[i] = '.' then match find_num s (i + 1) with [ Some (occ, j) -> let first_name = String.sub s 0 i in let surname = String.sub s j (String.length s - j) in Some (i, first_name, occ, surname) | None -> loop (i + 1) ] else loop (i + 1) ; value person_of_string_key base s = loop 0 where rec loop i = match split_key s i with [ Some (i, first_name, occ, surname) -> match person_of_key base first_name surname occ with [ Some ip -> Some ip | None -> loop (i + 1) ] | None -> None ] ; value person_not_a_key_find_all base s = let ipl = persons_of_name base s in let rec select = fun [ [ip :: ipl] -> if person_is_key base (poi base ip) s then let ipl = select ipl in if List.mem ip ipl then ipl else [ip :: ipl] else select ipl | [] -> [] ] in select ipl ; value person_ht_find_all base s = match person_of_string_key base s with [ Some p -> [p] | None -> person_not_a_key_find_all base s ] ; value find_same_name base p = let f = p_first_name base p in let s = p_surname base p in let ipl = person_ht_find_all base (f ^ " " ^ s) in let f = Name.strip_lower f in let s = Name.strip_lower s in let pl = List.fold_left (fun pl ip -> let p = poi base ip in if Name.strip_lower (p_first_name base p) = f && Name.strip_lower (p_surname base p) = s then [p :: pl] else pl) [] ipl in List.sort (fun p1 p2 -> compare (get_occ p1) (get_occ p2)) pl ; value gen_strip_spaces strip_heading str = let start = if strip_heading then loop 0 where rec loop i = if i = String.length str then i else match str.[i] with [ ' ' | '\r' | '\n' | '\t' -> loop (i + 1) | _ -> i ] else 0 in let stop = loop (String.length str - 1) where rec loop i = if i = -1 then i + 1 else match str.[i] with [ ' ' | '\r' | '\n' | '\t' -> loop (i - 1) | _ -> i + 1 ] in if start = 0 && stop = String.length str then str else if start > stop then "" else String.sub str start (stop - start) ; value strip_spaces = gen_strip_spaces True; value alphabetic_utf_8 n1 n2 = let rec loop i1 i2 = if i1 >= String.length n1 && i2 >= String.length n2 then i1 - i2 else if i1 >= String.length n1 then -1 else if i2 >= String.length n2 then 1 else let (cv1, ii1) = Name.unaccent_utf_8 False n1 i1 in let (cv2, ii2) = Name.unaccent_utf_8 False n2 i2 in let c = if cv1 = cv2 then compare (String.sub n1 i1 (ii1 - i1)) (String.sub n2 i2 (ii2 - i2)) else compare cv1 cv2 in if c = 0 then loop ii1 ii2 else c in if n1 = n2 then 0 else loop 0 0 ; value alphabetic_value = let tab = Array.make 256 0 in do { for i = 0 to 255 do { tab.(i) := 10 * i }; tab.(Char.code 'à') := tab.(Char.code 'a') + 1; tab.(Char.code 'á') := tab.(Char.code 'a') + 2; tab.(Char.code 'â') := tab.(Char.code 'a') + 3; tab.(Char.code 'è') := tab.(Char.code 'e') + 1; tab.(Char.code 'é') := tab.(Char.code 'e') + 2; tab.(Char.code 'ê') := tab.(Char.code 'e') + 3; tab.(Char.code 'ë') := tab.(Char.code 'e') + 4; tab.(Char.code 'ô') := tab.(Char.code 'o') + 1; tab.(Char.code 'Á') := tab.(Char.code 'A') + 2; tab.(Char.code 'Æ') := tab.(Char.code 'A') + 5; tab.(Char.code 'È') := tab.(Char.code 'E') + 1; tab.(Char.code 'É') := tab.(Char.code 'E') + 2; tab.(Char.code 'Ö') := tab.(Char.code 'O') + 4; tab.(Char.code '?') := 3000; fun x -> tab.(Char.code x) } ; value alphabetic_iso_8859_1 n1 n2 = let rec loop i1 i2 = if i1 = String.length n1 && i2 = String.length n2 then i1 - i2 else if i1 = String.length n1 then -1 else if i2 = String.length n2 then 1 else let c1 = n1.[i1] in let c2 = n2.[i2] in if alphabetic_value c1 < alphabetic_value c2 then -1 else if alphabetic_value c1 > alphabetic_value c2 then 1 else loop (succ i1) (succ i2) in if n1 = n2 then 0 else loop (initial n1) (initial n2) ; value alphabetic n1 n2 = (* if utf_8_db.val then alphabetic_utf_8 n1 n2 else alphabetic_iso_8859_1 n1 n2 *) alphabetic_iso_8859_1 n1 n2 (**) ; value alphabetic_order n1 n2 = if utf_8_db.val then alphabetic_utf_8 n1 n2 else alphabetic_iso_8859_1 n1 n2 ; value arg_list_of_string line = loop [] 0 0 None where rec loop list i len quote = if i = String.length line then if len = 0 then List.rev list else List.rev [Buff.get len :: list] else match (quote, line.[i]) with [ (Some c1, c2) -> if c1 = c2 then loop list (i + 1) len None else loop list (i + 1) (Buff.store len c2) quote | (None, ' ') -> let list = if len = 0 then list else [Buff.get len :: list] in loop list (i + 1) 0 quote | (None, ('"' | ''' as c)) -> loop list (i + 1) 0 (Some c) | (None, c) -> loop list (i + 1) (Buff.store len c) None ] ; value sort_person_list base pl = List.sort (fun p1 p2 -> match (Adef.od_of_codate (get_birth p1), get_death p1, Adef.od_of_codate (get_birth p2), get_death p2) with [ (Some d1, _, Some d2, _) -> if CheckItem.strictly_before d1 d2 then -1 else 1 | (Some d1, _, _, Death _ d2) -> if CheckItem.strictly_before d1 (Adef.date_of_cdate d2) then -1 else 1 | (_, Death _ d1, Some d2, _) -> if CheckItem.strictly_before (Adef.date_of_cdate d1) d2 then -1 else 1 | (_, Death _ d1, _, Death _ d2) -> if CheckItem.strictly_before (Adef.date_of_cdate d1) (Adef.date_of_cdate d2) then -1 else 1 | (Some _, _, _, _) -> 1 | (_, Death _ _, _, _) -> 1 | (_, _, Some _, _) -> -1 | (_, _, _, Death _ _) -> -1 | _ -> let c = alphabetic (p_surname base p1) (p_surname base p2) in if c = 0 then let c = alphabetic (p_first_name base p1) (p_first_name base p2) in if c = 0 then compare (get_occ p1) (get_occ p2) else c else c ]) pl ; value find_free_occ base f s i = let ipl = persons_of_name base (f ^ " " ^ s) in let first_name = Name.lower f in let surname = Name.lower s in let list_occ = loop [] ipl where rec loop list = fun [ [ip :: ipl] -> let p = poi base ip in if not (List.mem (get_occ p) list) && first_name = Name.lower (p_first_name base p) && surname = Name.lower (p_surname base p) then loop [get_occ p :: list] ipl else loop list ipl | [] -> list ] in let list_occ = List.sort compare list_occ in loop 0 list_occ where rec loop cnt1 = fun [ [cnt2 :: list] -> if cnt1 = cnt2 then loop (cnt1 + 1) list else cnt1 | [] -> cnt1 ] ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/checkItem.ml0000660000175200017530000010306012664543647023436 0ustar guillaumeguillaume(* $Id: checkItem.ml,v 1.11 2007-09-05 13:16:45 ddr Exp $ *) (* Copyright (c) 2006-2007 INRIA *) open Def; open Gwdb; type base_error = error person; type base_warning = warning person family title; type base_misc = misc person family title; (* Constants used for computing the warnings. *) value max_age_btw_cpl = 50; value max_days_btw_sibl = 10; value max_month_btw_sibl = 7; value lim_date_death = 1900; value max_death_after_lim_date_death = 105; value max_death_before_lim_date_death = 100; value min_parent_age = 11; value max_father_age = 70; value max_mother_age = 55; value lim_date_marriage = 1850; value min_age_marriage = 13; value average_marriage_age = 20; value common_prec p1 p2 = if p1 = p2 then p1 else match (p1, p2) with [ (Sure, _) -> p2 | (_, Sure) -> p1 | _ -> Maybe ] ; value leap_year a = if a mod 100 = 0 then a / 100 mod 4 = 0 else a mod 4 = 0 ; value nb_days_in_month = let tb = [| 31; 28; 31; 30; 31; 30; 31; 31; 30; 31; 30; 31 |] in fun m a -> if m = 2 && leap_year a then 29 else if m >= 1 && m <= 12 then tb.(m - 1) else 0 ; value time_elapsed d1 d2 = let prec = common_prec d1.prec d2.prec in match d1 with [ {day = 0; month = 0; year = a1} -> {day = 0; month = 0; year = d2.year - a1; prec = prec; delta = 0} | {day = 0; month = m1; year = a1} -> match d2 with [ {day = 0; month = 0; year = a2} -> {day = 0; month = 0; year = a2 - a1; prec = prec; delta = 0} | {day = 0; month = m2; year = a2} -> let r = 0 in let (month, r) = if m1 + r <= m2 then (m2 - m1 - r, 0) else (m2 - m1 - r + 12, 1) in let year = a2 - a1 - r in {day = 0; month = month; year = year; prec = prec; delta = 0} | {day = j2; month = m2; year = a2} -> let r = 0 in let (month, r) = if m1 + r <= m2 then (m2 - m1 - r, 0) else (m2 - m1 - r + 12, 1) in let year = a2 - a1 - r in {day = 0; month = month; year = year; prec = prec; delta = 0} ] | {day = j1; month = m1; year = a1} -> match d2 with [ {day = 0; month = 0; year = a2} -> {day = 0; month = 0; year = a2 - a1; prec = prec; delta = 0} | {day = 0; month = m2; year = a2} -> let r = 0 in let (month, r) = if m1 + r <= m2 then (m2 - m1 - r, 0) else (m2 - m1 - r + 12, 1) in let year = a2 - a1 - r in {day = 0; month = month; year = year; prec = prec; delta = 0} | {day = j2; month = m2; year = a2} -> let (day, r) = if j1 <= j2 then (j2 - j1, 0) else (j2 - j1 + nb_days_in_month m1 a1, 1) in let (month, r) = if m1 + r <= m2 then (m2 - m1 - r, 0) else (m2 - m1 - r + 12, 1) in let year = a2 - a1 - r in {day = day; month = month; year = year; prec = prec; delta = 0} ] ] ; value strictly_before_dmy d1 d2 = let {day = d; month = m; year = y; prec = p} = time_elapsed d2 d1 in if y < 0 then True else if y > 0 then False else if m < 0 then True else if m > 0 then False else if d < 0 then True else if d > 0 then False else if d1.prec = d2.prec then False else if d1.prec = Before && d2.prec = After then True else False ; value strictly_before d1 d2 = match (d1, d2) with [ (Dgreg d1 _, Dgreg d2 _) -> strictly_before_dmy d1 d2 | _ -> False ] ; value strictly_after_dmy d1 d2 = let {day = d; month = m; year = y; prec = p} = time_elapsed d1 d2 in if y < 0 then True else if y > 0 then False else if m < 0 then True else if m > 0 then False else if d < 0 then True else if d > 0 then False else if d2.prec = d1.prec then False else if d2.prec = Before && d1.prec = After then True else False ; value strictly_after d1 d2 = match (d1, d2) with [ (Dgreg d1 _, Dgreg d2 _) -> strictly_after_dmy d1 d2 | _ -> False ] ; (* ********************************************************************** *) (* [Fonc] compare_date : date -> date -> int *) (** [Description] : Fonction de comparaison de deux dates. On ne tiens pas compte de la précision de la date. (Fonction identique à Date.ml) [Args] : - d1 : la première date - d2 : la deuxième date [Retour] : int [Rem] : Non exporté en clair hors de ce module. *) (* ********************************************************************** *) value compare_date d1 d2 = match (d1, d2) with [ (Dgreg dmy1 _, Dgreg dmy2 _) -> match Pervasives.compare dmy1.year dmy2.year with [ 0 -> match Pervasives.compare dmy1.month dmy2.month with [ 0 -> (* Si l'une des deux dates n'est pas complète (mois ou jour *) (* égal à zéro), alors on ne distingue pas les deux dates. *) if dmy1.day = 0 || dmy2.day = 0 then 0 else Pervasives.compare dmy1.day dmy2.day | x -> (* Idem ci-dessus. *) if dmy1.month = 0 || dmy2.month = 0 then 0 else x ] | x -> x] | (Dgreg dmy1 _, Dtext _) -> 1 | (Dtext _, Dgreg dmy2 _) -> -1 | (Dtext _, Dtext _) -> 0 ] ; value date_of_death = fun [ Death _ cd -> Some (Adef.date_of_cdate cd) | _ -> None ] ; value birth_before_death base warning p = match (Adef.od_of_codate (get_birth p), get_death p) with [ (Some d1, Death _ d2) -> let d2 = Adef.date_of_cdate d2 in if strictly_after d1 d2 then warning (BirthAfterDeath p) else () | _ -> () ] ; value titles_after_birth base warning p t = let t_date_start = Adef.od_of_codate t.t_date_start in let t_date_end = Adef.od_of_codate t.t_date_end in do { match (t_date_start, t_date_end) with [ (Some d1, Some d2) -> if strictly_after d1 d2 then warning (TitleDatesError p t) else () | _ -> () ]; match Adef.od_of_codate (get_birth p) with [ Some d1 -> do { match t_date_start with [ Some d -> if strictly_after d1 d then warning (TitleDatesError p t) else () | None -> () ]; match t_date_end with [ Some d -> if strictly_after d1 d then warning (TitleDatesError p t) else () | None -> () ]; () } | _ -> () ]; } ; value today = let utm = Unix.time () in let tm = Unix.localtime utm in {day = tm.Unix.tm_mday; month = succ tm.Unix.tm_mon; year = tm.Unix.tm_year + 1900; prec = Sure; delta = 0} ; value check_person_age base warning p = (* On pourrait faire un calcul sur la descendance ou l'ascendance si *) (* on ne trouve rien ... mais c'est peut être un peu trop gourmand *) (* juste pour un warning ? *) let first_found_date = match (Adef.od_of_codate (get_birth p), Adef.od_of_codate (get_baptism p)) with [ (Some (Dgreg d _), _) -> Some d | (_, Some (Dgreg d _)) -> Some d | _ -> let rec loop i = if i >= Array.length (get_family p) then None else let fam = foi base (get_family p).(i) in match Adef.od_of_codate (get_marriage fam) with [ Some (Dgreg d _) -> let d = {(d) with year = d.year - average_marriage_age} in Some d | _ -> loop (i + 1) ] in loop 0 ] in let is_dead = match get_death p with [ Death _ _ | DeadYoung | DeadDontKnowWhen -> True | OfCourseDead -> True (* Cas spécial. *) | _ -> False ] in if is_dead then match (first_found_date, date_of_death (get_death p)) with [ (Some d1, Some (Dgreg d2 _)) -> let a = time_elapsed d1 d2 in if d2.year > lim_date_death then if a.year > max_death_after_lim_date_death then warning (DeadOld p a) else () else if a.year > max_death_before_lim_date_death then warning (DeadOld p a) else () | _ -> () ] else () ; value try_to_fix_relation_sex base warning p_ref = do { let p_index = Some (get_key_index p_ref) in let fixed = ref 0 in let not_fixed = ref 0 in let changed_related = List.fold_right (fun ip changed_related -> let p = poi base ip in let (rparents, changed, not_changed) = List.fold_right (fun rel (rparents, changed, not_changed) -> let (rel, changed, not_changed) = match (p_index = rel.r_fath, p_index = rel.r_moth) with [ (True, False) -> if get_sex p_ref = Female then match rel.r_moth with [ Some ip -> let oth_p = poi base ip in if get_sex oth_p = Male then let rel = {(rel) with r_fath = rel.r_moth; r_moth = p_index} in (rel, changed + 1, not_changed) else (rel, changed, not_changed + 1) | None -> let rel = {(rel) with r_fath = None; r_moth = p_index} in (rel, changed + 1, not_changed) ] else (rel, changed, not_changed) | (False, True) -> if get_sex p_ref = Male then match rel.r_fath with [ Some ip -> let oth_p = poi base ip in if get_sex oth_p = Female then let rel = {(rel) with r_moth = rel.r_fath; r_fath = p_index} in (rel, changed + 1, not_changed) else (rel, changed, not_changed + 1) | None -> let rel = {(rel) with r_moth = None; r_fath = p_index} in (rel, changed + 1, not_changed) ] else (rel, changed, not_changed) | (False, False) -> (rel, changed, not_changed) | (True, True) -> (rel, changed, not_changed + 1) ] in ([rel :: rparents], changed, not_changed)) (get_rparents p) ([], 0, 0) in let _ = do { fixed.val := fixed.val + changed; not_fixed.val := not_fixed.val + not_changed } in if changed > 0 then [(ip, p, None, Some rparents) :: changed_related] else changed_related) (get_related p_ref) [] in warning (IncoherentSex p_ref fixed.val not_fixed.val); if fixed.val > 0 then Some changed_related else None }; value related_sex_is_coherent base warning p_ref = let p_index = Some (get_key_index p_ref) in let merge_sex g1 g2 = match (g1, g2) with [ (Some Male, Some Male) -> Some Male | (Some Female, Some Female) -> Some Female | (Some Neuter, Some g) -> Some g | (Some g, Some Neuter) -> Some g | _ -> None ] in let check_sex sex rparents = List.fold_left (fun g rel -> match (p_index = rel.r_fath, p_index = rel.r_moth) with [ (True, False) -> merge_sex g (Some Male) | (False, True) -> merge_sex g (Some Female) | (False, False) -> g | (True, True) -> None ]) sex rparents in let new_sex = List.fold_left (fun g ip -> let p = poi base ip in check_sex g (get_rparents p)) (Some (get_sex p_ref)) (get_related p_ref) in match new_sex with [ Some g -> if get_sex p_ref != g then Some [(get_key_index p_ref, p_ref, Some g, None)] else None | None -> try_to_fix_relation_sex base warning p_ref ] ; value check_difference_age_between_cpl base warning ifath imoth = let fath = poi base ifath in let moth = poi base imoth in let find_date p = match (Adef.od_of_codate (get_birth p), Adef.od_of_codate (get_baptism p)) with [ (Some (Dgreg d _), _) -> Some d | (_, Some (Dgreg d _)) -> Some d | _ -> None ] in match (find_date fath, find_date moth) with [ (Some d1, Some d2) -> let a = time_elapsed d1 d2 in if a.year > max_age_btw_cpl then warning (BigAgeBetweenSpouses fath moth a) else () | _ -> () ] ; value year_of d = d.year; value check_normal_marriage_date_for_someone base error warning witn fam ip = let p = poi base ip in match Adef.od_of_codate (get_marriage fam) with [ Some (Dgreg g2 _ as d2) -> do { match Adef.od_of_codate (get_birth p) with [ Some (Dgreg g1 _ as d1) -> if strictly_before d2 d1 then if witn then warning (WitnessDateBeforeBirth p) else warning (MarriageDateBeforeBirth p) else if not witn && year_of g2 > lim_date_marriage && year_of (time_elapsed g1 g2) < min_age_marriage then warning (YoungForMarriage p (time_elapsed g1 g2)) else () | _ -> () ]; match get_death p with [ Death _ d3 -> let d3 = Adef.date_of_cdate d3 in if strictly_after d2 d3 then if witn then warning (WitnessDateAfterDeath p) else warning (MarriageDateAfterDeath p) else () | _ -> () ]; } | _ -> () ] ; (* ************************************************************************* *) (* [Fonc] check_normal_marriage_date_for_witness : base -> (Def.error -> unit) -> (Def.warning -> unit) -> (ifam * family) -> unit *) (** [Description] : Vérifie les dates des témoins par rapport à la date du mariage. [Args] : - base : base - error : fonction qui ajoute une erreur à la liste des erreurs - warning : fonction qui ajoute un warning à la liste des warnings - ifam : ifam - family : family [Retour] : Néant [Rem] : Non exporté en clair hors de ce module. *) (* ************************************************************************* *) value check_normal_marriage_date_for_witness base error warning (ifam, fam) = let wl = foi base ifam in List.iter (fun ip -> check_normal_marriage_date_for_someone base error warning True fam ip) (Array.to_list (get_witnesses wl)) ; (* ************************************************************************* *) (* [Fonc] check_normal_marriage_date_for_parent : base -> (Def.error -> unit) -> (Def.warning -> unit) -> (ifam * family) -> unit *) (** [Description] : Vérifie les dates du conjoint1 et du conjoint2 par rapport à la date du mariage. [Args] : - base : base - error : fonction qui ajoute une erreur à la liste des erreurs - warning : fonction qui ajoute un warning à la liste des warnings - ifam : ifam - family : family [Retour] : Néant [Rem] : Non exporté en clair hors de ce module. *) (* ************************************************************************* *) value check_normal_marriage_date_for_parent base error warning (ifam, fam) = do { let cpl = foi base ifam in check_normal_marriage_date_for_someone base error warning False fam (get_father cpl); check_normal_marriage_date_for_someone base error warning False fam (get_mother cpl); check_difference_age_between_cpl base warning (get_father cpl) (get_mother cpl) } ; (* * Semi sort children by birth dates. * If all children have birth dates, no problem. * Otherwise, sorting groups of consecutive children who have dates. * In not possible cases, try to keep order of children of same sex. * ex: G1, B2 being resp. girl and boy with date(G1) < date(B2) * and G and B begin resp. girls boys without dates * if order is ... B2 B B B G1 ... it becomes ... G1 B2 B B B ... * if order is ... B2 G G G G1 ... it becomes ... G G G G1 B2 ... * if order is ... B2 G B G G1 ... no change (a warning appears). *) value semi_sort base a before comp di = loop where rec loop i = if i < 0 || i >= Array.length a then () else let p1 = poi base a.(i) in let d1 = match Adef.od_of_codate (get_birth p1) with [ Some d1 -> Some d1 | None -> Adef.od_of_codate (get_baptism p1) ] in match d1 with [ Some d1 -> loop_j None (i - di) where rec loop_j sex_interm_sib j = if j < 0 || j >= Array.length a then loop (i + di) else let p2 = poi base a.(j) in let d2 = match Adef.od_of_codate (get_birth p2) with [ Some d2 -> Some d2 | None -> Adef.od_of_codate (get_baptism p2) ] in match d2 with [ Some d2 -> if comp d1 d2 then do { let j = match sex_interm_sib with [ Some s -> if s = get_sex p1 then None else if s = get_sex p2 then Some j else None | None -> Some j ] in match j with [ Some j -> let k = loop_k (j - di) where rec loop_k k = if k < 0 || k >= Array.length a then k + di else let p3 = poi base a.(k) in let d3 = match Adef.od_of_codate (get_birth p3) with [ Some d3 -> Some d3 | None -> Adef.od_of_codate (get_baptism p3) ] in match d3 with [ Some d3 -> if comp d1 d3 then loop_k (k - di) else k + di | None -> k + di ] in do { match before.val with [ Some _ -> () | None -> before.val := Some (Array.copy a) ]; let ip = a.(i) in loop_up i where rec loop_up j = if j = k then () else do { a.(j) := a.(j - di); loop_up (j - di) }; a.(k) := ip; loop (i + di) } | None -> loop (i + di) ] } else loop (i + di) | None -> match sex_interm_sib with [ Some s -> if s = get_sex p2 then loop_j sex_interm_sib (j - di) else loop (i + di) | None -> loop_j (Some (get_sex p2)) (j - di) ] ] | None -> loop (i + di) ] ; value sort_children base children = do { let before = ref None in semi_sort base children before strictly_before 1 1; semi_sort base children before strictly_after ~-1 1; semi_sort base children before strictly_before 1 1; match before.val with [ Some b -> Some (b, children) | None -> None ] }; value sort_children2 base warning ifam des = let b = get_children des in match sort_children base b with [ None -> b | Some (b, a) -> do { warning (ChangedOrderOfChildren ifam des b a); a } ] ; (* ********************************************************************** *) (* [Fonc] check_marriages_order : base -> (Def.warning -> unit) -> person -> unit *) (** [Description] : Trie les famillies en fonction des dates de mariages. [Args] : - base : base de donnée - warning : fonction qui ajoute un warning à la liste des warnings - p : person [Retour] : Néant [Rem] : Non exporté en clair hors de ce module. *) (* ********************************************************************** *) value check_marriages_order base warning p = do { let b = Array.copy (get_family p) in (* Astuce : on construire un tableau identique à la famille dans *) (* lequel on remplace toutes les dates inconnues par la dernière *) (* date maximale que l'on ait vu. *) (* Exemple : Ma (mariage sans date), et M3 après M1 *) (* ordre initial Ma M5 Mb M3 M1 ... devient Ma M1 M3 M5 Mb *) let (_, a) = Array.fold_left (fun (max_date, tab) ifam -> let fam = foi base ifam in let date = match Adef.od_of_codate (get_marriage fam) with [ Some d -> Some d | None -> max_date ] in let max_date = match (date, max_date) with [ (Some d1, Some d2) -> if compare_date d1 d2 = 1 then Some d1 else Some d2 | (Some d1, None) -> Some d1 | _ -> max_date ] in (max_date, Array.append tab [| (ifam, date) |])) (None, [| |]) (get_family p) in Array.stable_sort (fun (f1, d1) (f2, d2) -> match (d1, d2) with [ (Some d1, Some d2) -> compare_date d1 d2 | _ -> 0 ] ) a; let a = Array.map (fun (f, _) -> f) a in if a <> b then do { warning (ChangedOrderOfMarriages p b a); let rec loop i fam = if i = Array.length fam then () else do { fam.(i) := a.(i); loop (i + 1) fam } in loop 0 (get_family p) } else () }; value close_siblings base error warning x np ifam des = match (np, Adef.od_of_codate (get_birth x)) with [ (None, _) -> () | (Some (elder, d1), Some d2) -> match (d1, d2) with [ (Dgreg d1 _, Dgreg d2 _) -> let d = time_elapsed d1 d2 in (* On vérifie les jumeaux ou naissances proches. *) if d.year = 0 && d.month = 0 && d.day < max_days_btw_sibl then () else if d.year = 0 && d.month < max_month_btw_sibl then warning (CloseChildren ifam des elder x) else () | _ -> () ] | _ -> () ] ; value born_after_his_elder_sibling base error warning x np ifam des = match (np, Adef.od_of_codate (get_birth x), get_death x) with [ (None, _, _) -> () | (Some (elder, d1), Some d2, _) -> if strictly_after d1 d2 then warning (ChildrenNotInOrder ifam des elder x) else () | (Some (elder, d1), _, Death _ d2) -> let d2 = Adef.date_of_cdate d2 in if strictly_after d1 d2 then warning (ChildrenNotInOrder ifam des elder x) else () | _ -> () ] ; value child_born_after_his_parent base error warning x iparent = let parent = poi base iparent in match (Adef.od_of_codate (get_birth parent), Adef.od_of_codate (get_birth x), date_of_death (get_death x)) with [ (Some (Dgreg g1 _ as d1), Some (Dgreg g2 _ as d2), _) -> if strictly_after d1 d2 then warning (ParentBornAfterChild parent x) else let a = time_elapsed g1 g2 in if year_of a < min_parent_age then warning (ParentTooYoung parent a) else if (get_sex parent = Female && year_of a > max_mother_age) || (get_sex parent = Male && year_of a > max_father_age) then warning (ParentTooOld parent a) else () | (Some (Dgreg g1 _ as d1), _, Some (Dgreg g2 _ as d2)) -> if strictly_after d1 d2 then warning (ParentBornAfterChild parent x) else let a = time_elapsed g1 g2 in if year_of a < min_parent_age then warning (ParentTooYoung parent a) else () | _ -> () ] ; value child_born_before_mother_death base warning x imoth = let mother = poi base imoth in match (Adef.od_of_codate (get_birth x), get_death mother) with [ (Some d1, Death _ d2) -> let d2 = Adef.date_of_cdate d2 in if strictly_after d1 d2 then warning (MotherDeadAfterChildBirth mother x) else () | _ -> () ] ; value possible_father base warning x ifath = let father = poi base ifath in match (Adef.od_of_codate (get_birth x), date_of_death (get_death father)) with [ (Some (Dgreg {prec = Before} _), _) | (_, Some (Dgreg {prec = After} _)) -> () | (Some (Dgreg d1 _), Some (Dgreg d2 _)) -> let a2 = match d2 with [ {prec = YearInt a2} -> a2 | {prec = OrYear a2} -> a2 | {year = a} -> a ] in if year_of d1 > a2 + 1 then warning (DeadTooEarlyToBeFather father x) else () | _ -> () ] ; value child_has_sex warning child = if get_sex child = Neuter then warning (UndefinedSex child) else () ; (* ************************************************************************* *) (* [Fonc] check_marriage_sex : base -> (Def.error -> unit) -> (Def.warning -> unit) -> (ifam * family) -> unit *) (** [Description] : Vérifie le sex du couple et s'il est correct la date de naissance par rapport à la date de décès. [Args] : - base : base - error : fonction qui ajoute une erreur à la liste des erreurs - warning : fonction qui ajoute un warning à la liste des warnings - family : family [Retour] : Néant [Rem] : Non exporté en clair hors de ce module. *) (* ************************************************************************* *) value check_marriage_sex base error warning fam = let cpl = fam in let fath = poi base (get_father cpl) in let moth = poi base (get_mother cpl) in do { match get_sex fath with [ Male -> birth_before_death base warning fath | Female | Neuter -> if get_relation fam = NoSexesCheckNotMarried || get_relation fam = NoSexesCheckMarried then () else error (BadSexOfMarriedPerson fath) ]; match get_sex moth with [ Female -> birth_before_death base warning moth | Male | Neuter -> if get_relation fam = NoSexesCheckNotMarried || get_relation fam = NoSexesCheckMarried then () else error (BadSexOfMarriedPerson moth) ] }; (* ************************************************************************* *) (* [Fonc] check_children : base -> (Def.error -> unit) -> (Def.warning -> unit) -> (ifam * family) -> unit *) (** [Description] : Vérifie toutes les informations des enfants d'une famille. [Args] : - base : base - error : fonction qui ajoute une erreur à la liste des erreurs - warning : fonction qui ajoute un warning à la liste des warnings - ifam : ifam - family : family [Retour] : Néant [Rem] : Non exporté en clair hors de ce module. *) (* ************************************************************************* *) value check_children base error warning (ifam, fam) = let cpl = fam in let des = fam in let after = sort_children2 base warning ifam des in let _ = List.fold_left (fun np child -> let child = poi base child in do { birth_before_death base warning child; born_after_his_elder_sibling base error warning child np ifam des; close_siblings base error warning child np ifam des; child_born_after_his_parent base error warning child (get_father cpl); child_born_after_his_parent base error warning child (get_mother cpl); child_born_before_mother_death base warning child (get_mother cpl); possible_father base warning child (get_father cpl); child_has_sex warning child; match Adef.od_of_codate (get_birth child) with [ Some d -> Some (child, d) | _ -> np ] }) None (Array.to_list after) in () ; value has_family_sources fam = not (is_empty_string (get_fsources fam) && is_empty_string (get_marriage_src fam)) ; value has_person_sources p = not (is_empty_string (get_psources p) && is_empty_string (get_baptism_src p) && is_empty_string (get_birth_src p) && is_empty_string (get_death_src p) && is_empty_string (get_burial_src p)) ; (* ************************************************************************* *) (* [Fonc] check_sources : base -> (Def.misc -> unit) -> ifam -> family -> unit *) (** [Description] : Il y a un avertissment 'miscellaneous' si aucune des personnes (conjoint1 ET conjoint2) n'a de sources (indiduelles ou familliales). [Args] : - base : base - misc : fonction qui ajoute un misc à la liste des miscs - ifam : ifam - fam : family [Retour] : Néant [Rem] : Non exporté en clair hors de ce module. *) (* ************************************************************************* *) value check_sources base misc ifam fam = if has_family_sources fam then () else let cpl = foi base ifam in let fath = poi base (get_father cpl) in let moth = poi base (get_mother cpl) in if has_person_sources fath && has_person_sources moth then () else misc MissingSources ; (* main *) (* ************************************************************************* *) (* [Fonc] person : base -> (Def.warning -> unit) -> person -> unit *) (** [Description] : Vérifie les warnings d'une personne à la validation du formulaire individu. [Args] : - base : base - warning : fonction qui ajoute un warning à la liste des warnings - p : person [Retour] : Néant [Rem] : Non exporté en clair hors de ce module. *) (* ************************************************************************* *) value person base warning p = do { birth_before_death base warning p; check_person_age base warning p; List.iter (titles_after_birth base warning p) (get_titles p); related_sex_is_coherent base warning p; }; (* ************************************************************************* *) (* [Fonc] family : base -> (Def.error -> unit) -> (Def.warning -> unit) -> ifam -> family -> unit *) (** [Description] : En cas de modification d'une famille, on vérifie toutes les personnes accessibles après la validation du formulaire (famille). Vérifie s'il y a des erreurs ou des warnings pour le couple, les parents du couple, les témoins et les enfants du couple. [Args] : - base : base - error : fonction qui ajoute une erreur à la liste des erreurs - warning : fonction qui ajoute un warning à la liste des warnings - ifam : ifam - fam : family [Retour] : Néant [Rem] : Non exporté en clair hors de ce module. *) (* ************************************************************************* *) value family base error warning ifam fam = do { check_marriage_sex base error warning fam; check_normal_marriage_date_for_parent base error warning (ifam, fam); check_normal_marriage_date_for_witness base error warning (ifam, fam); check_children base error warning (ifam, fam); let father = poi base (get_father fam) in let mother = poi base (get_mother fam) in check_marriages_order base warning father; check_marriages_order base warning mother; } ; (* ************************************************************************* *) (* [Fonc] reduce_family : base -> (Def.error -> unit) -> (Def.warning -> unit) -> ifam -> family -> unit *) (** [Description] : En cas de modification d'une personne, on ne vérifie que les personnes accessibles après la validation du formulaire (individu). Vérifie s'il y a des erreurs ou des warnings pour le couple, les parents du couple et les enfants du couple. [Args] : - base : base - error : fonction qui ajoute une erreur à la liste des erreurs - warning : fonction qui ajoute un warning à la liste des warnings - ifam : ifam - fam : family [Retour] : Néant [Rem] : Non exporté en clair hors de ce module. *) (* ************************************************************************* *) value reduce_family base error warning ifam fam = do { check_marriage_sex base error warning fam; check_normal_marriage_date_for_parent base error warning (ifam, fam); check_children base error warning (ifam, fam) } ; (* ************************************************************************* *) (* [Fonc] check_other_fields : base -> (Def.misc -> unit) -> ifam -> family -> unit *) (** [Description] : Vérifie les autres champs de saisie des formulaires individu et famille. [Args] : - base : base - misc : fonction qui ajoute un misc à la liste des miscs - ifam : ifam - fam : family [Retour] : Néant [Rem] : Exporté en clair hors de ce module. *) (* ************************************************************************* *) value check_other_fields base misc ifam fam = do { check_sources base misc ifam fam } ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/def.mli0000660000175200017530000001302512664543647022452 0ustar guillaumeguillaume(* $Id: def.mli,v 5.22 2008-01-08 11:58:46 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) type choice 'a 'b = [ Left of 'a | Right of 'b ]; type iper = Adef.iper; type ifam = Adef.ifam; type cdate = Adef.cdate; type codate = Adef.codate; type date = Adef.date == [ Dgreg of dmy and calendar | Dtext of string ] and calendar = Adef.calendar == [ Dgregorian | Djulian | Dfrench | Dhebrew ] and dmy = Adef.dmy == { day : int; month : int; year : int; prec : precision; delta : int } and precision = Adef.precision == [ Sure | About | Maybe | Before | After | OrYear of int | YearInt of int ] ; type relation_kind = [ Married | NotMarried | Engaged | NoSexesCheckNotMarried | NoMention | NoSexesCheckMarried ] ; type divorce = [ NotDivorced | Divorced of codate | Separated ]; type death_reason = [ Killed | Murdered | Executed | Disappeared | Unspecified ] ; type death = [ NotDead | Death of death_reason and cdate | DeadYoung | DeadDontKnowWhen | DontKnowIfDead | OfCourseDead ] ; type burial = [ UnknownBurial | Buried of codate | Cremated of codate ]; type access = [ IfTitles | Public | Private ]; type gen_title_name 'string = [ Tmain | Tname of 'string | Tnone ]; type gen_title 'string = { t_name : gen_title_name 'string; t_ident : 'string; t_place : 'string; t_date_start : codate; t_date_end : codate; t_nth : int } ; type relation_type = [ Adoption | Recognition | CandidateParent | GodParent | FosterParent ] ; type gen_relation 'person 'string = { r_type : relation_type; r_fath : option 'person; r_moth : option 'person; r_sources : 'string } ; type sex = [ Male | Female | Neuter ]; (* person *) type gen_person 'person 'string = { first_name : 'string; surname : 'string; occ : int; image : 'string; public_name : 'string; qualifiers : list 'string; aliases : list 'string; first_names_aliases : list 'string; surnames_aliases : list 'string; titles : list (gen_title 'string); rparents : list (gen_relation 'person 'string); related : list iper; occupation : 'string; sex : sex; access : access; birth : codate; birth_place : 'string; birth_src : 'string; baptism : codate; baptism_place : 'string; baptism_src : 'string; death : death; death_place : 'string; death_src : 'string; burial : burial; burial_place : 'string; burial_src : 'string; notes : 'string; psources : 'string; key_index : iper } ; type gen_ascend 'family = { parents : option 'family; consang : Adef.fix } ; type gen_union 'family = { family : array 'family } ; (* family *) type gen_family 'person 'string = { marriage : codate; marriage_place : 'string; marriage_src : 'string; witnesses : array 'person; relation : relation_kind; divorce : divorce; comment : 'string; origin_file : 'string; fsources : 'string; fam_index : ifam } ; type gen_couple 'person = Adef.gen_couple 'person; type gen_descend 'person = { children : array 'person } ; type error 'person = [ AlreadyDefined of 'person | OwnAncestor of 'person | BadSexOfMarriedPerson of 'person ] ; type warning 'person 'descend 'title = [ BigAgeBetweenSpouses of 'person and 'person and dmy | BirthAfterDeath of 'person | IncoherentSex of 'person and int and int | ChangedOrderOfChildren of ifam and 'descend and array iper and array iper | ChangedOrderOfMarriages of 'person and array ifam and array ifam | ChildrenNotInOrder of ifam and 'descend and 'person and 'person | CloseChildren of ifam and 'descend and 'person and 'person | DeadOld of 'person and dmy | DeadTooEarlyToBeFather of 'person and 'person | IncoherentAncestorDate of 'person and 'person | MarriageDateAfterDeath of 'person | MarriageDateBeforeBirth of 'person | MotherDeadAfterChildBirth of 'person and 'person | ParentBornAfterChild of 'person and 'person | ParentTooOld of 'person and dmy | ParentTooYoung of 'person and dmy | TitleDatesError of 'person and 'title | UndefinedSex of 'person | WitnessDateAfterDeath of 'person | WitnessDateBeforeBirth of 'person | YoungForMarriage of 'person and dmy ] ; type misc 'person 'descend 'title = [ MissingSources ]; type rn_mode = [ RnAll | Rn1Ln | RnDeg ]; (* Historique des modifications *) type base_changed 'person 'string = [ U_Add_person of gen_person 'person 'string | U_Modify_person of gen_person 'person 'string and gen_person 'person 'string | U_Delete_person of gen_person 'person 'string | U_Merge_person of gen_person 'person 'string and gen_person 'person 'string and gen_person 'person 'string | U_Send_image of gen_person 'person 'string | U_Delete_image of gen_person 'person 'string | U_Add_family of gen_person 'person 'string and gen_family 'person 'string | U_Modify_family of gen_person 'person 'string and gen_family 'person 'string and gen_family 'person 'string | U_Delete_family of gen_person 'person 'string and gen_family 'person 'string | U_Invert_family of gen_person 'person 'string and ifam | U_Merge_family of gen_person 'person 'string and gen_family 'person 'string and gen_family 'person 'string and gen_family 'person 'string | U_Change_children_name of gen_person 'person 'string and list ((string * string * int * iper) * (string * string * int *iper)) | U_Add_parent of gen_person 'person 'string and gen_family 'person 'string | U_Kill_ancestors of gen_person 'person 'string | U_Multi of gen_person 'person 'string | U_Notes of option int and string ] ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/alln.ml0000660000175200017530000003616212664543647022500 0ustar guillaumeguillaume(* camlp5r ./pa_html.cmo *) (* $Id: alln.ml,v 5.24 2007-09-12 09:58:44 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Config; open Def; open Gutil; open Gwdb; open Hutil; open Mutil; open Util; value default_max_cnt = 2000; (* tools *) value string_start_with ini s = loop 0 0 where rec loop i1 i2 = if i1 = String.length ini then True else if i2 = String.length s then if ini.[i1] = '_' then loop (i1 + 1) i2 else False else if s.[i2] = ini.[i1] || s.[i2] = ' ' && ini.[i1] = '_' then loop (i1 + 1) (i2 + 1) else False ; value combine_by_ini ini list = let list = loop [] list where rec loop new_list = fun [ [] -> new_list | [(k, s, cnt) :: list] -> do { let ini_k = if String.length k > String.length ini then String.sub k 0 (index_of_next_char k (String.length ini)) else k ^ String.make (String.length ini + 1 - String.length k) '_' in for i = 0 to String.length ini_k - 1 do { if ini_k.[i] = ' ' then Bytes.set ini_k i '_' else () }; let new_list = if ini_k = "_" then new_list else match new_list with [ [] -> [(ini_k, [(s, cnt)])] | [(ini_k1, l) :: ll] -> if ini_k1 = ini_k then [(ini_k1, [(s, cnt) :: l]) :: ll] else [(ini_k, [(s, cnt)]); (ini_k1, l) :: ll] ] in loop new_list list } ] in List.fold_left (fun new_l (ini_k, l) -> [(ini_k, List.rev l) :: new_l]) [] list ; value combine_by_count list = let list = loop [] list where rec loop new_list = fun [ [] -> new_list | [(_, s, cnt) :: list] -> let new_list = match new_list with [ [] -> [(cnt, [s])] | [(cnt1, l) :: ll] -> if cnt1 = cnt then [(cnt1, [s :: l]) :: ll] else [(cnt, [s]); (cnt1, l) :: ll] ] in loop new_list list ] in List.fold_left (fun new_l (cnt, l) -> [(cnt, List.rev l) :: new_l]) [] list ; value alphab_string conf base is_surname s = if is_surname then if Mutil.utf_8_db.val then surname_end base s ^ surname_begin base s else old_surname_end s ^ old_surname_begin s else s ; value lower_if_not_utf8 s = if Mutil.utf_8_db.val then s else Name.lower s ; value capitalize_if_not_utf8 s = if Mutil.utf_8_db.val then s else String.capitalize s ; value lowercase_if_not_utf8 s = if Mutil.utf_8_db.val then s else String.lowercase s ; value new_name_key base s = let part = Util.get_particle base s in if part = "" then s else let i = String.length part in String.sub s i (String.length s - i) ^ " " ^ String.sub s 0 i ; value name_key_compatible base s = if Mutil.utf_8_db.val then new_name_key base s else Mutil.name_key s ; (* print *) value print_title conf base is_surnames ini len = do { if len >= 2 then if is_surnames then Wserver.wprint (fcapitale (ftransl conf "the %d surnames")) len else Wserver.wprint (fcapitale (ftransl conf "the %d first names")) len else if is_surnames then Wserver.wprint "%s" (capitale (transl_nth conf "surname/surnames" 0)) else Wserver.wprint "%s" (capitale (transl_nth conf "first name/first names" 0)); if ini <> "" then Wserver.wprint " %s %s" (transl conf "starting with") (capitalize_if_not_utf8 ini) else Wserver.wprint " (%d %s)" (nb_of_persons base) (Util.translate_eval ("@(c)" ^ transl_nth conf "person/persons" 1)); }; value displayify s = if Mutil.utf_8_db.val then loop 0 0 where rec loop i len = if i = String.length s then Buff.get len else let nbc = Name.nbc s.[i] in if nbc < 0 || i + nbc > String.length s then Buff.get (Buff.mstore len "...") else loop (i + nbc) (Buff.gstore len s i nbc) else String.capitalize s ; value tr c1 s2 s = loop 0 0 where rec loop i len = if i = String.length s then Buff.get len else if String.unsafe_get s i = c1 then loop (i + 1) (Buff.mstore len s2) else loop (i + 1) (Buff.store len (String.unsafe_get s i)) ; value print_alphabetic_big conf base is_surnames ini list len too_big = do { let title _ = print_title conf base is_surnames ini len in let mode = if is_surnames then "N" else "P" in header conf title; tag "p" begin List.iter (fun (ini_k, _) -> stagn "a" "href=\"%sm=%s;tri=A;k=%s\"" (commd conf) mode (Util.code_varenv ini_k) begin Wserver.wprint "%s" (tr '_' " " (displayify ini_k)); end) list; end; if len <= default_max_cnt && not too_big then do { stagn "p" begin Wserver.wprint "%s:" (capitale (transl conf "the whole list")); end; tag "ul" begin stagn "li" begin stag "a" "href=\"%sm=%s;tri=A;o=A;k=%s\"" (commd conf) mode ini begin Wserver.wprint "%s" (transl conf "long display"); end; end; stagn "li" begin stag "a" "href=\"%sm=%s;tri=S;o=A;k=%s\"" (commd conf) mode ini begin Wserver.wprint "%s" (transl conf "short display"); end; end; stagn "li" begin stag "a" "href=\"%sm=%s;tri=S;o=A;k=%s;cgl=on\"" (commd conf) mode ini begin Wserver.wprint "%s + %s" (transl conf "short display") (transl conf "cancel GeneWeb links"); end; end; end; } else (); trailer conf; }; value print_alphabetic_all conf base is_surnames ini list len = do { let title _ = print_title conf base is_surnames ini len in let mode = if is_surnames then "N" else "P" in header conf title; tag "p" begin List.iter (fun (ini_k, _) -> let ini = capitalize_if_not_utf8 ini_k in stagn "a" "href=\"#%s\"" ini begin Wserver.wprint "%s" (Mutil.tr '_' ' ' ini); end) list; end; tag "ul" begin List.iter (fun (ini_k, l) -> let ini = capitalize_if_not_utf8 ini_k in tag "li" begin stagn "a" "id=\"%s\"" ini_k begin Wserver.wprint "%s" (Mutil.tr '_' ' ' ini); end; tag "ul" begin List.iter (fun (s, cnt) -> stagn "li" begin let href = "m=" ^ mode ^ ";v=" ^ code_varenv (lower_if_not_utf8 s) ^ ";t=A" in wprint_geneweb_link conf href (alphab_string conf base is_surnames s); Wserver.wprint " (%d)" cnt; end) l; end; end) list; end; trailer conf; }; value print_alphabetic_small conf base is_surnames ini list len = do { let title _ = print_title conf base is_surnames ini len in let mode = if is_surnames then "N" else "P" in header conf title; if list = [] then () else tag "ul" begin List.iter (fun (_, s, cnt) -> stagn "li" begin stag "a" "href=\"%sm=%s;v=%s;t=A\"" (commd conf) mode (code_varenv (lower_if_not_utf8 s)) begin Wserver.wprint "%s" (alphab_string conf base is_surnames s); end; Wserver.wprint " (%d)" cnt; end) list; end; trailer conf; }; value print_frequency_any conf base is_surnames list len = do { let title _ = print_title conf base is_surnames "" len in let mode = if is_surnames then "N" else "P" in let n = ref 0 in header conf title; tag "ul" begin List.iter (fun (cnt, l) -> if n.val > default_max_cnt then () else tag "li" begin Wserver.wprint "%d\n" cnt; tag "ul" begin List.iter (fun s -> stagn "li" begin stag "a" "href=\"%sm=%s;v=%s\"" (commd conf) mode (code_varenv (Name.lower s)) begin Wserver.wprint "%s" (alphab_string conf base is_surnames s); end; incr n; end) l; end; end) list; end; trailer conf; }; (* selection *) value select_names conf base is_surnames ini need_whole_list = let iii = if is_surnames then persons_of_surname base else persons_of_first_name base in let (list, len) = let start_k = Mutil.tr '_' ' ' ini in match try Some (spi_first iii (capitalize_if_not_utf8 start_k)) with [ Not_found -> None ] with [ Some istr -> loop istr 0 [] where rec loop istr len list = let s = nominative (sou base istr) in let k = name_key_compatible base s in if string_start_with ini k then let (list, len) = if s <> "?" then let my_list = spi_find iii istr in let my_list = List.fold_left (fun l ip -> if is_patched_person base ip then let p = poi base ip in let isn = if is_surnames then get_surname p else get_first_name p in if eq_istr isn istr then [ip :: l] else l else [ip :: l]) [] my_list in let my_list = if conf.use_restrict then List.fold_left (fun l ip -> if is_restricted conf base ip then l else [ip :: l]) [] my_list else my_list in let cnt = List.length my_list in if cnt = 0 then (list, len) else match list with [ [(k1, s1, cnt1) :: list1] -> if k = k1 then ([(k1, s1, cnt1 + cnt) :: list1], len - 1) else ([(k, s, cnt) :: list], len) | [] -> ([(k, s, cnt)], len) ] else (list, len) in match try Some (spi_next iii istr need_whole_list) with [ Not_found -> None ] with [ Some (istr, dlen) -> loop istr (len + dlen) list | None -> (list, len) ] else (list, len) | None -> ([], 0) ] in let (list, len) = let lim = match p_getint conf.env "atleast" with [ Some x -> x | None -> 0 ] in List.fold_left (fun (list, len) (k, s, cnt) -> if cnt >= lim then ([(k, s, cnt) :: list], len) else (list, len - 1)) ([], len) list in (list, if Mutil.utf_8_db.val then False else True, len) ; value compare2 s1 s2 = if Mutil.utf_8_db.val then Gutil.alphabetic_utf_8 s1 s2 else compare s1 s2 ; value print_frequency conf base is_surnames = let () = load_strings_array base in let (list, _, len) = select_names conf base is_surnames "" True in let list = List.sort (fun (k1, _, cnt1) (k2, _, cnt2) -> if cnt1 > cnt2 then -1 else if cnt1 < cnt2 then 1 else compare2 k1 k2) list in let list = combine_by_count list in print_frequency_any conf base is_surnames list len ; value print_alphabetic conf base is_surnames = let ini = match p_getenv conf.env "k" with [ Some k -> lowercase_if_not_utf8 k | _ -> "" ] in let fast = p_getenv conf.base_env "fast_alphabetic" = Some "yes" && ini = "" in let _ = if fast || String.length ini < 2 then load_strings_array base else () in let all = match p_getenv conf.env "o" with [ Some "A" -> True | _ -> False ] in let (list, len) = if fast then loop [] 0 'Z' where rec loop list len c = let list = [(String.make 1 c, "", 1) :: list] in if c = 'A' then (list, len) else loop list (len + 1) (Char.chr (Char.code c - 1)) else let (list, sorted, len) = select_names conf base is_surnames ini all in let list = if sorted then list else List.sort (fun (k1, _, _) (k2, _, _) -> compare2 k1 k2) list in (list, len) in if fast then let list = List.map (fun (s, _, _) -> (s, 1)) list in print_alphabetic_big conf base is_surnames ini list 1 True else if len >= 50 || ini = "" then let list = combine_by_ini ini list in if all then if len > default_max_cnt then incorrect_request conf else print_alphabetic_all conf base is_surnames ini list len else print_alphabetic_big conf base is_surnames ini list len False else print_alphabetic_small conf base is_surnames ini list len ; (* short print *) value print_alphabetic_short conf base is_surnames ini list len = do { let title _ = print_title conf base is_surnames ini len in let mode = if is_surnames then "N" else "P" in let need_ref = len >= 250 in header conf title; if need_ref then tag "p" begin List.iter (fun (ini_k, _) -> let ini = capitalize_if_not_utf8 ini_k in stagn "a" "href=\"#%s\"" ini begin Wserver.wprint "%s" (Mutil.tr '_' ' ' ini); end) list; end else (); List.iter (fun (ini_k, l) -> let ini = capitalize_if_not_utf8 ini_k in tag "p" begin list_iter_first (fun first (s, cnt) -> do { let href = if not conf.cancel_links then " href=\"" ^ commd conf ^ "m=" ^ mode ^ ";v=" ^ code_varenv (lower_if_not_utf8 s) ^ ";t=A\"" else "" in let name = if first && need_ref then " id=\"" ^ ini ^ "\"" else "" in if not first then Wserver.wprint ",\n" else (); if href <> "" || name <> "" then Wserver.wprint "" href name else (); Wserver.wprint "%s" (alphab_string conf base is_surnames s); if href <> "" || name <> "" then Wserver.wprint "" else (); Wserver.wprint " (%d)" cnt; }) l; Wserver.wprint "\n"; end) list; trailer conf; }; value print_short conf base is_surnames = let ini = match p_getenv conf.env "k" with [ Some k -> lowercase_if_not_utf8 k | _ -> "" ] in let _ = if String.length ini < 2 then load_strings_array base else () in let (list, sorted, len) = select_names conf base is_surnames ini True in if len > default_max_cnt then incorrect_request conf else let list = if sorted then list else List.sort (fun (k1, _, _) (k2, _, _) -> compare2 k1 k2) list in let list = combine_by_ini ini list in print_alphabetic_short conf base is_surnames ini list len ; (* main *) value print_surnames conf base = match p_getenv conf.env "tri" with [ Some "F" -> print_frequency conf base True | Some "S" -> print_short conf base True | _ -> print_alphabetic conf base True ] ; value print_first_names conf base = match p_getenv conf.env "tri" with [ Some "F" -> print_frequency conf base False | Some "S" -> print_short conf base False | _ -> print_alphabetic conf base False ] ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/argl.ml0000660000175200017530000001075512664543647022477 0ustar guillaumeguillaume(* $Id: argl.ml,v 5.3 2007-01-19 01:53:16 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Printf; value action_arg s sl = fun [ Arg.Set r -> if s = "" then do { r.val := True; Some sl } else None | Arg.Clear r -> if s = "" then do { r.val := False; Some sl } else None | Arg.Rest f -> do { List.iter f [s :: sl]; Some [] } | Arg.String f -> if s = "" then match sl with [ [s :: sl] -> do { f s; Some sl } | [] -> None ] else do { f s; Some sl } | Arg.Int f -> if s = "" then match sl with [ [s :: sl] -> try do { f (int_of_string s); Some sl } with [ Failure "int_of_string" -> None ] | [] -> None ] else try do { f (int_of_string s); Some sl } with [ Failure "int_of_string" -> None ] | Arg.Float f -> if s = "" then match sl with [ [s :: sl] -> do { f (float_of_string s); Some sl } | [] -> None ] else do { f (float_of_string s); Some sl } | x -> IFDEF OCAML_307 THEN match x with [ Arg.Unit f -> if s = "" then do { f (); Some sl } else None | Arg.Set_string r -> if s = "" then match sl with [ [s :: sl] -> do { r.val := s; Some sl } | [] -> None ] else do { r.val := s; Some sl } | Arg.Set_int r -> if s = "" then match sl with [ [s :: sl] -> try do { r.val := (int_of_string s); Some sl } with [ Failure "int_of_string" -> None ] | [] -> None ] else try do { r.val := (int_of_string s); Some sl } with [ Failure "int_of_string" -> None ] | Arg.Set_float r -> if s = "" then match sl with [ [s :: sl] -> do { r.val := (float_of_string s); Some sl } | [] -> None ] else do { r.val := (float_of_string s); Some sl } | Arg.Symbol syms f -> match (if s = "" then sl else [s :: sl]) with [ [s :: sl] when List.mem s syms -> do { f s; Some sl } | _ -> None ] | x -> assert False ] ELSE match x with [ Arg.Unit f -> if s = "" then do { f (); Some sl } else None | x -> assert False ] END ] ; value common_start s1 s2 = loop 0 where rec loop i = if i = String.length s1 || i = String.length s2 then i else if s1.[i] = s2.[i] then loop (i + 1) else i ; value rec parse_arg s sl = fun [ [(name, action, _) :: spec_list] -> let i = common_start s name in if i = String.length name then try action_arg (String.sub s i (String.length s - i)) sl action with [ Arg.Bad _ -> parse_arg s sl spec_list ] else parse_arg s sl spec_list | [] -> None ] ; value rec parse_aux spec_list anon_fun = fun [ [] -> [] | [s :: sl] -> if String.length s > 1 && s.[0] = '-' then match parse_arg s sl spec_list with [ Some sl -> parse_aux spec_list anon_fun sl | None -> [s :: parse_aux spec_list anon_fun sl] ] else do { (anon_fun s : unit); parse_aux spec_list anon_fun sl } ] ; value parse_arg_list spec_list anon_fun remaining_args = let spec_list = List.sort (fun (k1, _, _) (k2, _, _) -> compare k2 k1) spec_list in try parse_aux spec_list anon_fun remaining_args with [ Arg.Bad s -> do { eprintf "Error: %s\n" s; eprintf "Use option -help for usage\n"; flush stderr; exit 2 } ] ; value usage speclist errmsg = do { printf "%s\n" errmsg; List.iter (fun (key, _, doc) -> printf " %s %s\n" key doc) speclist; flush stdout; } ; value parse_list spec_list anonfun errmsg list = match parse_arg_list spec_list anonfun list with [ [] -> () | ["-help" :: sl] -> do { usage spec_list errmsg; exit 0 } | [s :: sl] -> do { eprintf "%s: unknown or misused option\n" s; eprintf "Use option -help for usage\n"; flush stderr; exit 2 } ] ; value parse spec_list anonfun errmsg = let remaining_args = List.rev (loop [] (Arg.current.val + 1)) where rec loop l i = if i = Array.length Sys.argv then l else let s = let s = Sys.argv.(i) in let len = String.length s in if len > 2 && s.[0] = '"' && s.[len-1] = '"' then String.sub s 1 (len-2) else s in loop [s :: l] (i + 1) in parse_list spec_list anonfun errmsg remaining_args ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/pr_dep.ml0000660000175200017530000002406312664543647023020 0ustar guillaumeguillaume(* camlp5r *) (* $Id: pr_dep.ml,v 5.9 2008-01-12 08:41:18 ddr Exp $ *) #load "q_MLast.cmo"; open MLast; value not_impl name x = do { let desc = if Obj.is_block (Obj.repr x) then "tag = " ^ string_of_int (Obj.tag (Obj.repr x)) else "int_val = " ^ string_of_int (Obj.magic x) in Printf.eprintf "pr_depend: not impl: %s; %s\n" name desc; flush stderr }; module StrSet = Set.Make (struct type t = string; value compare = compare; end) ; value fset = ref StrSet.empty; value addmodule s = fset.val := StrSet.add s fset.val; value list = List.iter; value option f = fun [ Some x -> f x | None -> () ] ; value vala f v = Pcaml.vala_mapa f (fun _ -> ()) v; value longident = fun [ [s; _ :: _] -> addmodule s | _ -> () ] ; value rec ctyp = fun [ TyAcc _ t _ -> ctyp_module t | TyAli _ t1 t2 -> do { ctyp t1; ctyp t2 } | TyApp _ t1 t2 -> do { ctyp t1; ctyp t2 } | TyAny _ -> () | TyArr _ t1 t2 -> do { ctyp t1; ctyp t2 } | TyLab _ _ t -> ctyp t | TyLid _ _ -> () | TyMan _ t1 t2 -> do { ctyp t1; ctyp t2 } | TyOlb _ _ t -> ctyp t | <:ctyp< ' $_$ >> -> () | <:ctyp< ($list:tl$) >> -> list ctyp tl | x -> IFDEF OCAML_309 THEN match x with [ TyRec _ ldl -> list label_decl ldl | <:ctyp< [ $list:cdl$ ] >> -> list constr_decl cdl | x -> not_impl "ctyp" x ] ELSE match x with [ <:ctyp< { $list:ldl$ } >> -> list label_decl ldl | <:ctyp< [ $list:cdl$ ] >> -> list constr_decl cdl | x -> not_impl "ctyp" x ] END ] and constr_decl (_, _, tl) = IFDEF CAMLP5_4_09 AND STRICT THEN match tl with [ <:vala< tl >> -> list ctyp tl | _ -> failwith "constr_decl" ] ELSE list ctyp tl END and label_decl (_, _, _, t) = ctyp t and ctyp_module = fun [ TyAcc _ t _ -> ctyp_module t | TyApp _ t1 t2 -> do { ctyp t1; ctyp t2; } | <:ctyp< $uid:m$ >> -> addmodule m | x -> not_impl "ctyp_module" x ] ; value rec patt = fun [ PaAcc _ p _ -> patt_module p | PaAli _ p1 p2 -> do { patt p1; patt p2; } | PaAny _ -> () | PaApp _ p1 p2 -> do { patt p1; patt p2; } | <:patt< [| $list:pl$ |] >> -> list patt pl | PaChr _ _ -> () | <:patt< $int:_$ >> -> () | PaLab _ _ po -> option patt po | PaLid _ _ -> () | PaOrp _ p1 p2 -> do { patt p1; patt p2; } | <:patt< { $list:lpl$ } >> -> list label_patt lpl | PaRng _ p1 p2 -> do { patt p1; patt p2; } | PaStr _ _ -> () | <:patt< ($list:pl$) >> -> list patt pl | PaTyc _ p t -> do { patt p; ctyp t; } | PaUid _ _ -> () | PaVrn _ _ -> () | x -> not_impl "patt" x ] and patt_module = fun [ <:patt< $uid:m$ >> -> addmodule m | PaAcc _ p _ -> patt_module p | x -> not_impl "patt_module" x ] and label_patt (p1, p2) = do { patt p1; patt p2; } and expr = fun [ ExAcc _ e1 e2 -> do { expr_module e1; expr e2; } | ExApp _ e1 e2 -> do { expr e1; expr e2; } | ExAre _ e1 e2 -> do { expr e1; expr e2; } | <:expr< [| $list:el$ |] >> -> list expr el | <:expr< assert False >> -> () | <:expr< assert $e$ >> -> expr e | ExAss _ e1 e2 -> do { expr e1; expr e2; } | ExChr _ _ -> () | ExCoe _ e t1 t2 -> do { expr e; option ctyp t1; ctyp t2 } | <:expr< for $_$ = $e1$ $to:_$ $e2$ do { $list:el$ } >> -> do { expr e1; expr e2; list expr el; } | <:expr< fun [ $list:pwel$ ] >> -> list match_case pwel | ExIfe _ e1 e2 e3 -> do { expr e1; expr e2; expr e3; } | <:expr< $int:_$ >> -> () | ExFlo _ _ -> () | ExLab _ _ eo -> option expr eo | ExLaz _ e -> expr e | <:expr< let $flag:_$ $list:pel$ in $e$ >> -> do { list let_binding pel; expr e; } | ExLid _ _ -> () | ExLmd _ _ me e -> do { module_expr me; expr e; } | <:expr< match $e$ with [ $list:pwel$ ] >> -> do { expr e; list match_case pwel } | ExOlb _ _ eo -> option expr eo | <:expr< { $list:lel$ } >> -> list label_expr lel | <:expr< { ($w$) with $list:lel$ } >> -> do { list label_expr lel; expr w; } | <:expr< do { $list:el$ } >> -> list expr el | ExSnd _ e _ -> expr e | ExSte _ e1 e2 -> do { expr e1; expr e2; } | ExStr _ _ -> () | <:expr< try $e$ with [ $list:pwel$ ] >> -> do { expr e; list match_case pwel } | <:expr< ($list:el$) >> -> list expr el | ExTyc _ e t -> do { expr e; ctyp t; } | ExUid _ _ -> () | ExVrn _ _ -> () | <:expr< while $e$ do { $list:el$ } >> -> do { expr e; list expr el; } | x -> not_impl "expr" x ] and expr_module = fun [ <:expr< $uid:m$ >> -> addmodule m | e -> expr e ] and let_binding (p, e) = do { patt p; expr e } and label_expr (p, e) = do { patt p; expr e } and match_case (p, w, e) = do { patt p; vala (option expr) w; expr e; } and module_type = fun [ <:module_type< $uid:m$ . $_$ >> -> addmodule m | <:module_type< functor ($uid:_$ : $mt1$) -> $mt2$ >> -> do { module_type mt1; module_type mt2 } | <:module_type< sig $list:sil$ end >> -> list sig_item sil | <:module_type< $uid:_$ >> -> () | <:module_type< $mt$ with $list:wc$ >> -> do { module_type mt; list with_constr wc } | x -> not_impl "module_type" x ] and with_constr = fun [ WcTyp _ _ _ _ t -> ctyp t | x -> not_impl "with_constr" x ] and sig_item = fun [ <:sig_item< declare $list:sil$ end >> -> list sig_item sil | <:sig_item< exception $_$ of $list:tl$ >> -> list ctyp tl | SgExt _ _ t _ -> ctyp t | <:sig_item< module $flag:_$ $list:ntl$ >> -> list (fun (_, mt) -> module_type mt) ntl | SgMty _ _ mt -> module_type mt | <:sig_item< open $[s :: _]$ >> -> addmodule s | <:sig_item< type $list:tdl$ >> -> list type_decl tdl | SgVal _ _ t -> ctyp t | x -> not_impl "sig_item" x ] and module_expr = fun [ <:module_expr< $uid:m$ . $_$ >> -> addmodule m | MeApp _ me1 me2 -> do { module_expr me1; module_expr me2; } | MeFun _ _ mt me -> do { module_type mt; module_expr me; } | <:module_expr< struct $list:sil$ end >> -> list str_item sil | MeTyc _ me mt -> do { module_expr me; module_type mt; } | MeUid _ _ -> () | x -> not_impl "module_expr" x ] and str_item = fun [ <:str_item< declare $list:sil$ end >> -> list str_item sil | StDir _ _ _ -> () | <:str_item< exception $uid:_$ of $list:tl$ = $list:_$ >> -> list ctyp tl | <:str_item< $exp:e$ >> -> expr e | <:str_item< external $lid:_$ : $t$ = $list:_$ >> -> ctyp t | <:str_item< module $flag:_$ $list:nel$ >> -> list (fun (_, me) -> module_expr me) nel | <:str_item< module type $uid:_$ = $mt$ >> -> module_type mt | <:str_item< open $[s :: _]$ >> -> addmodule s | <:str_item< type $list:tdl$ >> -> list type_decl tdl | <:str_item< value $flag:_$ $list:pel$ >> -> list let_binding pel | x -> not_impl "str_item" x ] and type_decl td = ctyp td.tdDef; (* Print dependencies *) value load_path = ref [""]; value find_in_path path name = if not (Filename.is_implicit name) then if Sys.file_exists name then name else raise Not_found else let rec try_dir = fun [ [] -> raise Not_found | [dir :: rem] -> let fullname = Filename.concat dir name in if Sys.file_exists fullname then fullname else try_dir rem ] in try_dir path ; value find_depend modname (byt_deps, opt_deps) = let name = String.uncapitalize modname in try let filename = find_in_path load_path.val (name ^ ".mli") in let basename = Filename.chop_suffix filename ".mli" in let byt_dep = basename ^ ".cmi" in let opt_dep = if Sys.file_exists (basename ^ ".ml") then basename ^ ".cmx" else basename ^ ".cmi" in ([byt_dep :: byt_deps], [opt_dep :: opt_deps]) with [ Not_found -> try let filename = find_in_path load_path.val (name ^ ".ml") in let basename = Filename.chop_suffix filename ".ml" in ([basename ^ ".cmo" :: byt_deps], [basename ^ ".cmx" :: opt_deps]) with [ Not_found -> (byt_deps, opt_deps) ] ] ; value (depends_on, escaped_eol) = match Sys.os_type with [ "Unix" | "Win32" | "Cygwin" -> (": ", "\\\n ") | "MacOS" -> ("\196 ", "\182\n ") | _ -> assert False ] ; value print_depend target_file deps = match deps with [ [] -> () | _ -> do { print_string target_file; print_string depends_on; let rec print_items pos = fun [ [] -> print_string "\n" | [dep :: rem] -> if pos + String.length dep <= 76 then do { print_string dep; print_string " "; print_items (pos + String.length dep + 1) rem } else do { print_string escaped_eol; print_string dep; print_string " "; print_items (String.length dep + 5) rem } ] in print_items (String.length target_file + 2) deps } ] ; (* Main *) value depend_sig ast = do { fset.val := StrSet.empty; List.iter (fun (si, _) -> sig_item si) ast; let basename = Filename.chop_suffix Pcaml.input_file.val ".mli" in let fset = StrSet.elements fset.val in let (byt_deps, opt_deps) = List.fold_right find_depend fset ([], []) in print_depend (basename ^ ".cmi") byt_deps; } ; value depend_str ast = do { fset.val := StrSet.empty; List.iter (fun (si, _) -> str_item si) ast; let basename = if Filename.check_suffix Pcaml.input_file.val ".ml" then Filename.chop_suffix Pcaml.input_file.val ".ml" else try let len = String.rindex Pcaml.input_file.val '.' in String.sub Pcaml.input_file.val 0 len with [ Failure _ | Not_found -> Pcaml.input_file.val ] in let init_deps = if Sys.file_exists (basename ^ ".mli") then let cmi_name = basename ^ ".cmi" in ([cmi_name], [cmi_name]) else ([], []) in let fset = StrSet.elements fset.val in let (byt_deps, opt_deps) = List.fold_right find_depend fset init_deps in print_depend (basename ^ ".cmo") byt_deps; print_depend (basename ^ ".cmx") opt_deps; } ; Pcaml.print_interf.val := depend_sig; Pcaml.print_implem.val := depend_str; Pcaml.add_option "-I" (Arg.String (fun dir -> load_path.val := load_path.val @ [dir])) " Add to the list of include directories."; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/notesLinks.mli0000660000175200017530000000206412664543647024046 0ustar guillaumeguillaume(* $Id: notesLinks.mli,v 5.5 2007-03-25 11:30:05 ddr Exp $ *) (* Copyright (c) 2006-2007 INRIA *) type page = [ PgInd of Def.iper | PgFam of Def.ifam | PgNotes | PgMisc of string | PgWizard of string ] ; type key = (string * string * int); type ind_link = { lnTxt : option string; lnPos : int }; type notes_links_db = list (page * (list string * list (key * ind_link))); type wiki_link = [ WLpage of int and (list string * string) and string and string and string | WLperson of int and key and string and option string | WLwizard of int and string and string | WLnone ] ; value char_dir_sep : char; value check_file_name : string -> option (list string * string); value misc_notes_link : string -> int -> wiki_link; value read_db_from_file : string -> notes_links_db; value update_db : string -> page -> (list string * list (key * ind_link)) -> unit; value read_db : string -> notes_links_db; value write_db : string -> notes_links_db -> unit; value add_in_db : notes_links_db -> page -> (list string * list (key * ind_link)) -> notes_links_db; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/templAst.mli0000660000175200017530000000160012664543647023501 0ustar guillaumeguillaume(* camlp5r *) (* $Id: templAst.mli,v 5.4 2007-09-12 09:58:44 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) type ast = [ Atext of loc and string | Avar of loc and string and list string | Atransl of loc and bool and string and string | Aconcat of loc and list ast | Awid_hei of string | Aif of ast and list ast and list ast | Aforeach of (loc * string * list string) and list (list ast) and list ast | Afor of string and ast and ast and list ast | Adefine of string and list string and list ast and list ast | Aapply of loc and string and list (list ast) | Alet of string and list ast and list ast | Aop1 of loc and string and ast | Aop2 of loc and string and ast and ast | Aint of loc and string | Aimport of string and list ast] and loc = (int * int) ; type expr_val 'a = [ VVbool of bool | VVstring of string | VVother of list string -> expr_val 'a ] ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/ansel.ml0000660000175200017530000001301312664543647022642 0ustar guillaumeguillaume(* $Id: ansel.ml,v 5.3 2007-01-19 01:53:16 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) value no_accent = fun [ 'à' | 'á' | 'â' | 'ã' | 'ä' | 'å' -> 'a' | 'ç' -> 'c' | 'è' | 'é' | 'ê' | 'ë' -> 'e' | 'ì' | 'í' | 'î' | 'ï' -> 'i' | 'ñ' -> 'n' | 'ò' | 'ó' | 'ô' | 'õ' | 'ö' | 'ø' -> 'o' | 'ù' | 'ú' | 'û' | 'ü' -> 'u' | 'ý' | 'ÿ' -> 'y' | 'À' | 'Á' | 'Â' | 'Ã' | 'Ä' | 'Å' -> 'A' | 'Ç' -> 'C' | 'È' | 'É' | 'Ê' | 'Ë' -> 'E' | 'Ì' | 'Í' | 'Î' | 'Ï' -> 'I' | 'Ñ' -> 'N' | 'Ò' | 'Ó' | 'Ô' | 'Õ' | 'Ö' | 'Ø' -> 'O' | 'Ù' | 'Ú' | 'Û' | 'Ü' -> 'U' | 'Ý' -> 'Y' | c -> c ] ; value of_iso_8859_1 s = let (len, identical) = loop 0 0 True where rec loop i len identical = if i = String.length s then (len, identical) else match s.[i] with [ 'À'..'Å' | 'Ç'.. 'Ï' | 'Ñ'..'Ö' | 'Ù'..'Ý' | 'à'..'å' | 'ç'.. 'ï' | 'ñ'..'ö' | 'ù'..'ý' | 'ÿ' -> loop (i + 1) (len + 2) False | 'Ø' -> loop (i + 1) (len + 1) False | 'ø' -> loop (i + 1) (len + 1) False | 'ß' -> loop (i + 1) (len + 1) False | _ -> loop (i + 1) (len + 1) identical ] in if identical then s else let s' = Bytes.create len in loop 0 0 where rec loop i i' = if i = String.length s then s' else let i' = match s.[i] with [ 'À' | 'È' | 'Ì' | 'Ò' | 'Ù' | 'à' | 'è' | 'ì' | 'ò' | 'ù' -> do { Bytes.set s' i' (Char.chr 225); Bytes.set s' (i'+1) (no_accent s.[i]); i' + 1 } | 'Á' | 'É' | 'Í' | 'Ó' | 'Ú' | 'Ý' | 'á' | 'é' | 'í' | 'ó' | 'ú' | 'ý' -> do { Bytes.set s' i' (Char.chr 226); Bytes.set s' (i'+1) (no_accent s.[i]); i' + 1 } | 'Â' | 'Ê' | 'Î' | 'Ô' | 'Û' | 'â' | 'ê' | 'î' | 'ô' | 'û' -> do { Bytes.set s' i' (Char.chr 227); Bytes.set s' (i'+1) (no_accent s.[i]); i' + 1 } | 'Ã' | 'Ñ' | 'Õ' | 'ã' | 'ñ' | 'õ' -> do { Bytes.set s' i' (Char.chr 228); Bytes.set s' (i'+1) (no_accent s.[i]); i' + 1 } | 'Ä' | 'Ë' | 'Ï' | 'Ö' | 'Ü' | 'ä' | 'ë' | 'ï' | 'ö' | 'ü' | 'ÿ' -> do { Bytes.set s' i' (Char.chr 232); Bytes.set s' (i'+1) (no_accent s.[i]); i' + 1 } | 'Å' | 'å' -> do { Bytes.set s' i' (Char.chr 234); Bytes.set s' (i'+1) (no_accent s.[i]); i' + 1 } | 'Ç' | 'ç' -> do { Bytes.set s' i' (Char.chr 240); Bytes.set s' (i'+1) (no_accent s.[i]); i' + 1 } | 'Ø' -> do { Bytes.set s' i' (Char.chr 162); i' } | 'ø' -> do { Bytes.set s' i' (Char.chr 178); i' } | 'ß' -> do { Bytes.set s' i' (Char.chr 207); i' } | c -> do { Bytes.set s' i' c; i' } ] in loop (i + 1) (i' + 1) ; value grave = fun [ 'a' -> 'à' | 'e' -> 'è' | 'i' -> 'ì' | 'o' -> 'ò' | 'u' -> 'ù' | 'A' -> 'À' | 'E' -> 'È' | 'I' -> 'Ì' | 'O' -> 'Ò' | 'U' -> 'Ù' | x -> x ] ; value acute = fun [ 'a' -> 'á' | 'e' -> 'é' | 'i' -> 'í' | 'o' -> 'ó' | 'u' -> 'ú' | 'y' -> 'ý' | 'A' -> 'Á' | 'E' -> 'É' | 'I' -> 'Í' | 'O' -> 'Ó' | 'U' -> 'Ú' | 'Y' -> 'Ý' | x -> x ] ; value circum = fun [ 'a' -> 'â' | 'e' -> 'ê' | 'i' -> 'î' | 'o' -> 'ô' | 'u' -> 'û' | 'A' -> 'Â' | 'E' -> 'Ê' | 'I' -> 'Î' | 'O' -> 'Ô' | 'U' -> 'Û' | x -> x ] ; value uml = fun [ 'a' -> 'ä' | 'e' -> 'ë' | 'i' -> 'ï' | 'o' -> 'ö' | 'u' -> 'ü' | 'y' -> 'ÿ' | 'A' -> 'Ä' | 'E' -> 'Ë' | 'I' -> 'Ï' | 'O' -> 'Ö' | 'U' -> 'Ü' | x -> x ] ; value circle = fun [ 'a' -> 'å' | 'A' -> 'Å' | x -> x ] ; value tilde = fun [ 'a' -> 'ã' | 'n' -> 'ñ' | 'o' -> 'õ' | 'A' -> 'Ã' | 'N' -> 'Ñ' | 'O' -> 'Õ' | x -> x ] ; value cedil = fun [ 'c' -> 'ç' | 'C' -> 'Ç' | x -> x ] ; value to_iso_8859_1 s = let (len, identical) = loop 0 0 True where rec loop i len identical = if i = String.length s then (len, identical) else if i = String.length s - 1 then (len + 1, identical) else match Char.code s.[i] with [ 225 | 226 | 227 | 228 | 232 | 234 | 240 -> loop (i + 2) (len + 1) False | 162 -> loop (i + 1) (len + 1) False | 178 -> loop (i + 1) (len + 1) False | 207 -> loop (i + 1) (len + 1) False | _ -> loop (i + 1) (len + 1) identical] in if identical then s else let s' = Bytes.create len in loop 0 0 where rec loop i i' = if i = String.length s then s' else if i = String.length s - 1 then do { Bytes.set s' i' s.[i]; s' } else let i = match Char.code s.[i] with [ 162 -> do { Bytes.set s' i' 'Ø'; i } | 178 -> do { Bytes.set s' i' 'ø'; i } | 207 -> do { Bytes.set s' i' 'ß'; i } | 225 -> do { Bytes.set s' i' (grave s.[i+1]); i + 1 } | 226 -> do { Bytes.set s' i' (acute s.[i+1]); i + 1 } | 227 -> do { Bytes.set s' i' (circum s.[i+1]); i + 1 } | 228 -> do { Bytes.set s' i' (tilde s.[i+1]); i + 1 } | 232 -> do { Bytes.set s' i' (uml s.[i+1]); i + 1 } | 234 -> do { Bytes.set s' i' (circle s.[i+1]); i + 1 } | 240 -> do { Bytes.set s' i' (cedil s.[i+1]); i + 1 } | _ -> do { Bytes.set s' i' s.[i]; i } ] in loop (i + 1) (i' + 1) ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/templDate.ml0000660000175200017530000000462212664543647023465 0ustar guillaumeguillaume(* camlp5r *) (* $Id: templDate.ml,v 5.3 2007-09-12 09:58:44 ddr Exp $ *) (* Copyright (c) 2007 INRIA *) open Config; open Def; open Mutil; open Printf; open TemplAst; open Util; value rec eval_date_var conf jd = fun [ ["french" :: sl] -> eval_dmy_var (Calendar.french_of_sdn Sure jd) sl | ["gregorian" :: sl] -> eval_dmy_var (Calendar.gregorian_of_sdn Sure jd) sl | ["hebrew" :: sl] -> eval_dmy_var (Calendar.hebrew_of_sdn Sure jd) sl | ["julian" :: sl] -> eval_dmy_var (Calendar.julian_of_sdn Sure jd) sl | ["julian_day"] -> VVstring (string_of_int jd) | ["julian_day"; "sep1000"] -> VVstring (Num.to_string_sep (transl conf "(thousand separator)") (Num.of_int jd)) | ["moon_age"] -> try let (mp, md) = Calendar.moon_phase_of_sdn jd in VVstring (string_of_int md) with [ Failure _ -> VVstring "" ] | ["moon_phase" :: sl] -> try let (mp, md) = Calendar.moon_phase_of_sdn jd in eval_moon_phase_var mp sl with [ Failure _ -> VVstring "" ] | ["week_day"] -> let wday = let jd_today = Calendar.sdn_of_gregorian conf.today in let x = conf.today_wd - jd_today + jd in if x < 0 then 6 + (x + 1) mod 7 else x mod 7 in VVstring (string_of_int wday) | sl -> eval_dmy_var (Calendar.gregorian_of_sdn Sure jd) sl ] and eval_moon_phase_var mp = fun [ ["hour"] -> let s = match mp with [ None -> "" | Some (_, hh, _) -> sprintf "%02d" hh ] in VVstring s | ["index"] -> let i = match mp with [ None -> 0 | Some (Calendar.NewMoon, _, _) -> 1 | Some (Calendar.FirstQuarter, _, _) -> 2 | Some (Calendar.FullMoon, _, _) -> 3 | Some (Calendar.LastQuarter, _, _) -> 4 ] in VVstring (string_of_int i) | ["minute"] -> let s = match mp with [ None -> "" | Some (_, _, mm) -> sprintf "%02d" mm ] in VVstring s | _ -> raise Not_found ] and eval_dmy_var dmy = fun [ ["day"] -> VVstring (string_of_int dmy.day) | ["month"] -> VVstring (string_of_int dmy.month) | ["year" :: sl] -> eval_integer dmy.year sl | [] -> VVstring (sprintf "%d-%02d-%02d" dmy.year dmy.month dmy.day) | _ -> raise Not_found ] and eval_integer i = fun [ ["roman"] -> VVstring (roman_of_arabian i) | [] -> VVstring (string_of_int i) | _ -> raise Not_found ] ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/relationLink.mli0000660000175200017530000000160412664543647024347 0ustar guillaumeguillaume(* camlp5r *) (* $Id: relationLink.mli,v 5.4 2007-09-12 09:58:44 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Config; open Def; open Gwdb; type info = { ip : iper; sp : sex; ip1 : iper; ip2 : iper; b1 : list (iper * sex); b2 : list (iper * sex); c1 : int; c2 : int; pb1 : option (list (iper * sex)); pb2 : option (list (iper * sex)); nb1 : option (list (iper * sex)); nb2 : option (list (iper * sex)); sp1 : option person; sp2 : option person; bd : int; td_prop : string } ; value threshold : ref int; value make_dist_tab : config -> base -> iper -> int -> (iper -> int * iper -> int); value find_first_branch : config -> base -> (iper -> int * iper -> int) -> iper -> int -> iper -> sex -> option (list (iper * sex)); value print_relation_path : config -> base -> info -> unit; value print : config -> base -> unit; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/date.ml0000660000175200017530000012657412664543647022476 0ustar guillaumeguillaume(* camlp5r ./pa_html.cmo *) (* $Id: date.ml,v 5.17 2008-01-08 11:58:46 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) UNDEF OLD; open Config; open Def; open Util; open Gutil; open Gwdb; open Mutil; open Printf; open TemplAst; (* ********************************************************************** *) (* [Fonc] get_wday : config -> Def.date -> string *) (** [Description] : Renvoie le jour de la semaine correspondant à la date donnée en paramètre. [Args] : - conf : configuration de la base - d : date [Retour] : string [Rem] : Exporté en clair hors de ce module. *) (* ********************************************************************** *) value get_wday conf d = let jd = match d with [ Dgreg d _ -> match d.prec with [ Sure -> if (d.day <> 0 && d.month <> 0) then Calendar.sdn_of_gregorian d else -1 | _ -> -1 ] | _ -> -1 ] in let wday = let jd_today = Calendar.sdn_of_gregorian conf.today in let x = conf.today_wd - jd_today + jd in if x < 0 then 6 + (x + 1) mod 7 else x mod 7 in if jd <> -1 then " (" ^ (transl_nth conf "(week day)" wday) ^ ")" else "" ; value nbsp = " "; value death_symbol conf = match try Some (List.assoc "death_symbol" conf.base_env) with [ Not_found -> None ] with [ Some x -> x | None -> if utf_8_db.val then "†" else "+" ] ; value birth_symbol conf = match try Some (List.assoc "birth_symbol" conf.base_env) with [ Not_found -> None ] with [ Some x -> x | None -> if utf_8_db.val then "°" else "°" ] ; value before_date d d1 = if d1.year < d.year then True else if d1.year > d.year then False else if d1.month < d.month then True else if d1.month > d.month then False else if d1.prec > d.prec then True else if d1.prec < d.prec then False else if d1.day < d.day then True else if d1.day > d.day then False else True ; value code_date conf encoding d m y = let apply_date_code = fun [ 'd' -> string_of_int d | 'm' -> transl_nth conf "(month)" (m - 1) | 'y' -> string_of_int y | c -> "%" ^ String.make 1 c ] in let rec loop i = if i = String.length encoding then "" else let (s, i) = match encoding.[i] with [ '%' when i + 1 < String.length encoding -> let s = apply_date_code encoding.[i + 1] in (s, i + 1) | '[' when i + 5 < String.length encoding && encoding.[i + 3] = ']' && encoding.[i + 4] = '%' -> let s = apply_date_code encoding.[i + 5] in let s1 = if start_with_vowel s then String.make 1 encoding.[i + 2] else String.make 1 encoding.[i + 1] ^ " " in (s1 ^ s, i + 5) | c -> (String.make 1 c, i) ] in s ^ loop (i + 1) in loop 0 ; value code_dmy conf d = let encoding = let n = if d.day = 1 then 0 else if d.day != 0 then 1 else if d.month != 0 then 2 else 3 in transl_nth conf "(date)" n in code_date conf encoding d.day d.month d.year ; value code_year conf y = code_date conf (transl_nth conf "(date)" 3) 0 0 y ; value default_french_month = let tab = [| "Vendemiaire"; "Brumaire"; "Frimaire"; "Nivose"; "Pluviose"; "Ventose"; "Germinal"; "Floreal"; "Prairial"; "Messidor"; "Thermidor"; "Fructidor"; "Extra" |] in fun m -> tab.(m) ; value default_hebrew_month = let tab = [| "Tishri"; "Heshvan"; "Kislev"; "Tevet"; "Shevat"; "AdarI"; "AdarII"; "Nisan"; "Iyyar"; "Sivan"; "Tammuz"; "Av"; "Elul" |] in fun m -> tab.(m) ; value french_month conf m = let r = transl_nth conf "(french revolution month)" m in if r = "[(french revolution month)]" then "[" ^ default_french_month m ^ "]" else r ; value hebrew_month conf m = let r = transl_nth conf "(hebrew month)" m in if r = "[(hebrew month)]" then "[" ^ default_hebrew_month m ^ "]" else r ; value code_french_year conf y = transl_nth conf "year/month/day" 3 ^ " " ^ (if y >= 1 && y < 4000 then roman_of_arabian y else string_of_int y) ; value code_french_date conf d m y = let s = if d = 0 then "" else string_of_int d ^ (if d = 1 then "er" else "") in let s = if m = 0 then "" else s ^ (if s = "" then "" else " ") ^ french_month conf (m - 1) in s ^ (if s = "" then "" else " ") ^ code_french_year conf y ; value code_hebrew_date conf d m y = let s = if d = 0 then "" else string_of_int d in let s = if m = 0 then "" else s ^ (if s = "" then "" else " ") ^ hebrew_month conf (m - 1) in s ^ (if s = "" then "" else " ") ^ string_of_int y ; value string_of_on_prec_dmy_aux conf code_year sy d = match d.prec with [ Sure -> if d.day = 0 && d.month = 0 then transl conf "in (year)" ^ " " ^ sy else if d.day = 0 then transl_decline conf "in (month year)" sy else transl_decline conf "on (day month year)" sy | About | Before | After -> let s = sy in if d.prec = About then transl_decline conf "about (date)" s else if d.prec = Before then transl_decline conf "before (date)" s else transl_decline conf "after (date)" s | Maybe -> let s = if d.day = 0 && d.month = 0 then transl conf "in (year)" ^ " " ^ sy else if d.day = 0 then transl_decline conf "in (month year)" sy else transl_decline conf "on (day month year)" sy in transl_decline conf "possibly (date)" s | OrYear z -> let s = if d.day = 0 && d.month = 0 then transl conf "in (year)" ^ " " ^ sy else if d.day = 0 then transl_decline conf "in (month year)" sy else transl_decline conf "on (day month year)" sy in s ^ " " ^ transl conf "or" ^ " " ^ nominative (code_year conf z) | YearInt z -> let s = if d.day = 0 && d.month = 0 then sy else if d.day = 0 then sy else transl_decline conf "on (day month year)" sy in transl conf "between (date)" ^ " " ^ s ^ " " ^ transl_nth conf "and" 0 ^ " " ^ nominative (code_year conf z) ] ; value replace_spaces_by_nbsp s = loop 0 0 where rec loop i len = if i = String.length s then Buff.get len else if s.[i] = ' ' then loop (i + 1) (Buff.mstore len " ") else loop (i + 1) (Buff.store len s.[i]) ; value string_of_on_prec_dmy conf code_dmy sy d = let r = string_of_on_prec_dmy_aux conf code_dmy sy d in replace_spaces_by_nbsp r ; value string_of_on_dmy conf d = let sy = code_dmy conf d in string_of_on_prec_dmy conf code_year sy d ; value string_of_on_french_dmy conf d = let sy = code_french_date conf d.day d.month d.year in string_of_on_prec_dmy conf code_french_year sy d ; value string_of_on_hebrew_dmy conf d = let sy = code_hebrew_date conf d.day d.month d.year in string_of_on_prec_dmy conf code_year sy d ; value string_of_prec_dmy conf s d = match d.prec with [ Sure -> nominative s | About -> transl_decline conf "about (date)" s | Before -> transl_decline conf "before (date)" s | After -> transl_decline conf "after (date)" s | Maybe -> transl_decline conf "possibly (date)" s | OrYear z -> s ^ " " ^ transl conf "or" ^ " " ^ nominative (code_date conf (transl_nth conf "(date)" 3) 0 0 z) | YearInt z -> transl conf "between (date)" ^ " " ^ s ^ " " ^ transl_nth conf "and" 0 ^ " " ^ nominative (code_date conf (transl_nth conf "(date)" 3) 0 0 z) ] ; value string_of_dmy conf d = let sy = code_dmy conf d in string_of_prec_dmy conf sy d ; (* ************************************************************************ *) (* [Fonc] translate_dmy : config -> (string * string * string) -> calendar -> bool -> (string * string * string) *) (** [Description] : Traduit en fonction du calendrier, le mois et/ou l'année d'une date et renvoie le triplet conformément au format de la date. [Args] : - conf : configuration de la base - (fst, snd, trd) : la date au bon format - cal : calendar - short : booléen pour savoir si on affiche au format court, e.g. VD/Vendémiaire [Retour] : (string * string * string) : date traduite [Rem] : Non exporté en clair hors de ce module. *) (* ************************************************************************ *) value translate_dmy conf (fst, snd, trd) cal short = let translate_month m = match cal with [ Dfrench when m <> "" -> if short then Util.short_f_month (int_of_string m) else french_month conf (int_of_string m) | Dhebrew when m <> "" -> if short then String.uppercase (String.sub (hebrew_month conf (int_of_string m)) 0 2) else hebrew_month conf (int_of_string m) | _ -> m ] in let translate_year y = match cal with [ Dfrench -> let y1 = int_of_string y in (if y1 >= 1 && y1 < 4000 then roman_of_arabian y1 else y) | _ -> y ] in match transl conf " !dates order" with [ "yymmdd" | "yyyymmdd" -> (translate_year fst, translate_month snd, trd) | "mmddyyyy" -> (translate_month fst, snd, translate_year trd) | _ -> (fst, translate_month snd, translate_year trd) ] ; (* ************************************************************************ *) (* [Fonc] decode_dmy : config -> Def.date -> (string * string * string) *) (** [Description] : En fonction du format de la date (donnée par le fichier lex_utf8), on renvoit le triplet correspondant. Si le format est inconnu, alors on renvoit ddmmyyyy. Le triplet est renvoyé dans l'ordre adéquat d'affichage, i.e. (fst, snd, trd). [Args] : - conf : configuration de la base - d : date [Retour] : string [Rem] : Non exporté en clair hors de ce module. *) (* ************************************************************************ *) value decode_dmy conf d = match transl conf " !dates order" with [ "dmyyyy" -> (string_of_int d.day, string_of_int d.month, string_of_int d.year) | "mmddyyyy" -> (* Si le jour et/ou le mois n'est pas sur 2 caractères, *) (* on rajoute les 0 nécessaires. *) match (d.day, d.month, d.year) with [ (0, 0, year) -> ("", "", string_of_int year) | (0, month, year) -> let m = Printf.sprintf "%02d" month in (m, "", string_of_int year) | (day, month, year) -> let d = Printf.sprintf "%02d" day in let m = Printf.sprintf "%02d" month in (m, d, string_of_int year) ] | "yyyymmdd" | "yymmdd" (* backward compatibility < 6.05 *) -> (* Si le jour et/ou le mois n'est pas sur 2 caractères, *) (* on rajoute les 0 nécessaires. *) match (d.day, d.month, d.year) with [ (0, 0, year) -> (string_of_int year, "", "") | (0, month, year) -> let m = Printf.sprintf "%02d" month in (string_of_int year, m, "") | (day, month, year) -> let d = Printf.sprintf "%02d" day in let m = Printf.sprintf "%02d" month in (string_of_int year, m, d) ] | "ddmmyyyy" | "ddmmyy" (* backward compatibility < 6.05 *) | _ -> (* Si le jour et/ou le mois n'est pas sur 2 caractères, *) (* on rajoute les 0 nécessaires. *) match (d.day, d.month, d.year) with [ (0, 0, year) -> ("", "", string_of_int year) | (0, month, year) -> let m = Printf.sprintf "%02d" month in ("", m, string_of_int year) | (day, month, year) -> let d = Printf.sprintf "%02d" day in let m = Printf.sprintf "%02d" month in (d, m, string_of_int year) ] ] ; value gregorian_precision conf d = if d.delta = 0 then string_of_dmy conf d else let d2 = Calendar.gregorian_of_sdn d.prec (Calendar.sdn_of_gregorian d + d.delta) in transl conf "between (date)" ^ " " ^ string_of_on_dmy conf d ^ " " ^ transl_nth conf "and" 0 ^ " " ^ string_of_on_dmy conf d2 ; value string_of_ondate_aux conf = fun [ Dgreg d Dgregorian -> let s = string_of_on_dmy conf d in if d.day > 0 && not conf.cancel_links then sprintf "%s" (commd conf) d.year d.month d.day s else s | Dgreg d Djulian -> let cal_prec = if d.year < 1582 then "" else " (" ^ gregorian_precision conf d ^ ")" in let d1 = Calendar.julian_of_gregorian d in let year_prec = if d1.month > 0 && d1.month < 3 || d1.month = 3 && d1.day > 0 && d1.day < 25 then sprintf " (%d/%d)" (d1.year - 1) (d1.year mod 10) else "" in let s = string_of_on_dmy conf d1 ^ year_prec ^ " " ^ transl_nth conf "gregorian/julian/french/hebrew" 1 ^ cal_prec in if d1.day > 0 && not conf.cancel_links then sprintf "%s" (commd conf) d1.year d1.month d1.day s else s | Dgreg d Dfrench -> let d1 = Calendar.french_of_gregorian d in let s = string_of_on_french_dmy conf d1 in let s = if d1.day > 0 && not conf.cancel_links then sprintf "%s" (commd conf) d1.year d1.month d1.day s else s in match d.prec with [ Sure -> s ^ " " ^ " (" ^ gregorian_precision conf d ^ ")" | About | Before | After | Maybe | OrYear _ | YearInt _ -> s ] | Dgreg d Dhebrew -> let d1 = Calendar.hebrew_of_gregorian d in let s = string_of_on_hebrew_dmy conf d1 in match d.prec with [ Sure -> s ^ " " ^ " (" ^ gregorian_precision conf d ^ ")" | About | Before | After | Maybe | OrYear _ | YearInt _ -> s ] | Dtext t -> "(" ^ string_with_macros conf [] t ^ ")" ] ; value string_of_ondate conf d = Util.translate_eval (string_of_ondate_aux conf d) ; value string_of_date conf = fun [ Dgreg d _ -> string_of_dmy conf d | Dtext t -> "(" ^ t ^ ")" ] ; (* ********************************************************************** *) (* [Fonc] string_slash_of_date : config -> Def.date -> string *) (** [Description] : Renvoie une date sous la forme jj/mm/aaaa (en fonction du 'date order'). [Args] : - conf : configuration de la base - d : Def.date [Retour] : string [Rem] : Exporté en clair hors de ce module. *) (* ********************************************************************** *) value string_slash_of_date conf date = let slashify_dmy (fst, snd, trd) d = let sy = List.fold_right (fun s accu -> if s <> "" then s ^ "/" ^ accu else accu) [fst; snd] trd in string_of_prec_dmy conf sy d in match date with [ Dgreg d Dgregorian -> slashify_dmy (decode_dmy conf d) d | Dgreg d Djulian -> let d1 = Calendar.julian_of_gregorian d in slashify_dmy (translate_dmy conf (decode_dmy conf d1) Djulian True) d1 ^ " (" ^ (transl_nth conf "gregorian/julian/french/hebrew" 1) ^ ")" | Dgreg d Dfrench -> let d1 = Calendar.french_of_gregorian d in slashify_dmy (translate_dmy conf (decode_dmy conf d1) Dfrench True) d1 ^ " (" ^ (transl_nth conf "gregorian/julian/french/hebrew" 2) ^ ")" | Dgreg d Dhebrew -> let d1 = Calendar.french_of_gregorian d in slashify_dmy (translate_dmy conf (decode_dmy conf d1) Dhebrew True) d1 ^ " (" ^ (transl_nth conf "gregorian/julian/french/hebrew" 3) ^ ")" | Dtext t -> t ] ; value string_of_age conf a = match a with [ {day = 0; month = 0; year = y} -> if y > 1 then string_of_int y ^ " " ^ transl conf "years old" else if y = 1 then transl conf "one year old" else transl conf "birth" | {day = 0; month = m; year = y} -> if y >= 2 then string_of_int y ^ " " ^ transl conf "years old" else if y > 0 || m > 1 then string_of_int (y * 12 + m) ^ " " ^ transl conf "months old" else if m = 1 then transl conf "one month old" else transl conf "less than one month old" | {day = d; month = m; year = y} -> if y >= 2 then string_of_int y ^ " " ^ transl conf "years old" else if y > 0 || m > 1 then string_of_int (y * 12 + m) ^ " " ^ transl conf "months old" else if m = 1 then transl conf "one month old" else if d >= 2 then string_of_int d ^ " " ^ transl conf "days old" else if d = 1 then transl conf "one day old" else "0" ] ; (* ************************************************************************ *) (* [Fonc] prec_text : config -> Def.dmy -> string *) (** [Description] : Renvoie la précision d'une date. [Args] : - conf : configuration de la base - d : Def.dmy [Retour] : string [Rem] : Exporté en clair hors de ce module. *) (* ************************************************************************ *) value prec_text conf d = match d.prec with [ About -> (* On utilise le dictionnaire pour être sur *) (* que ce soit compréhensible de tous. *) match transl conf "about (short date)" with [ "ca" -> "ca " | s -> s ] | Maybe -> "?" | Before -> "<" | After -> ">" | OrYear _ -> "|" | YearInt _ -> ".." | _ -> "" ] ; (* ************************************************************************ *) (* [Fonc] day_text : Def.dmy -> string *) (** [Description] : Renvoie le jour d'une date. [Args] : - d : Def.dmy [Retour] : string [Rem] : Exporté en clair hors de ce module. *) (* ************************************************************************ *) value day_text d = if d.day = 0 then "" else string_of_int d.day ; (* ************************************************************************ *) (* [Fonc] month_text : Def.dmy -> string *) (** [Description] : Renvoie le mois d'une date. [Args] : - d : Def.dmy [Retour] : string [Rem] : Exporté en clair hors de ce module. *) (* ************************************************************************ *) value month_text d = if d.month = 0 then "" else string_of_int d.month ; (* ************************************************************************ *) (* [Fonc] year_text : Def.dmy -> string *) (** [Description] : Renvoie l'année d'une date. [Args] : - d : Def.dmy [Retour] : string [Rem] : Exporté en clair hors de ce module. *) (* ************************************************************************ *) value year_text d = match d.prec with [ OrYear x -> string_of_int d.year ^ "/" ^ string_of_int x | YearInt x -> string_of_int d.year ^ ".." ^ string_of_int x | _ -> string_of_int d.year ] ; (* ************************************************************************ *) (* [Fonc] prec_year_text : config -> Def.dmy -> string *) (** [Description] : Renvoie la précision d'une date et l'année de la date. [Args] : - conf : configuration de la base - d : Def.dmy [Retour] : string [Rem] : Exporté en clair hors de ce module. *) (* ************************************************************************ *) value prec_year_text conf d = let s = match d.prec with [ About -> (* On utilise le dictionnaire pour être sur *) (* que ce soit compréhensible de tous. *) match transl conf "about (short date)" with [ "ca" -> "ca " | s -> s ] | Maybe -> "?" | Before -> "/" | _ -> "" ] in let s = s ^ year_text d in match d.prec with [ After -> s ^ "/" | _ -> s ] ; (* ********************************************************************** *) (* [Fonc] get_birth_death : person -> (Adef.date option * Adef.date option * bool) *) (** [Description] : Renvoie la date de naissance, la date de décès et un booléen pour savoir si la date de naissance et la date décès ont été trouvées. Si on ne trouve pas la date de naissance et la date de décès, alors approx = True. [Args] : - p : person [Retour] : (Adef.date option * Adef.date option * bool) [Rem] : Exporté en clair hors de ce module. *) (* ********************************************************************** *) value get_birth_death_date p = let (birth_date, approx) = match Adef.od_of_codate (get_birth p) with [ None -> (Adef.od_of_codate (get_baptism p), True) | x -> (x, False) ] in let (death_date, approx) = match CheckItem.date_of_death (get_death p) with [ Some d -> (Some d, approx) | _ -> match get_burial p with [ Buried cd -> (Adef.od_of_codate cd, True) | Cremated cd -> (Adef.od_of_codate cd, True) | _ -> (None, approx) ] ] in (birth_date, death_date, approx) ; (* ********************************************************************** *) (* [Fonc] print_partial_short_dates_text : config -> date option -> date option -> person -> string *) (** [Description] : Quand une date de naissance/décès est au format texte, alors on n'affiche que la partie de la date qui est au format Dgreg. Cette fonction complète short_dates_text ci-dessous. [Args] : - conf : configuration de la base - birth_date : date de naissance/baptème - death_date : date de décès/inhumation - p : person [Retour] : string [Rem] : Non exporté en clair hors de ce module. *) (* ********************************************************************** *) value partial_short_dates_text conf birth_date death_date p = match (birth_date, death_date) with [ (Some (Dgreg b _), Some (Dtext _)) -> prec_year_text conf b ^ "-" | (Some (Dgreg b _), None) -> (* La personne peut être décédée mais ne pas avoir de date. *) match get_death p with [ Death _ _ | DeadDontKnowWhen | DeadYoung -> prec_year_text conf b ^ "-" | _ -> prec_year_text conf b ] | (None, Some (Dtext _)) -> match get_death p with [ Death _ _ | DeadDontKnowWhen | DeadYoung -> death_symbol conf | _ -> "" ] | (None, None) -> (* La personne peut être décédée mais ne pas avoir de date. *) match get_death p with [ Death _ _ | DeadDontKnowWhen | DeadYoung -> death_symbol conf | _ -> "" ] | (_, _) -> "" ] ; (* ********************************************************************** *) (* [Fonc] short_dates_text : config -> base -> person -> string *) (** [Description] : Renvoie la concatenation de l'année de naissance et l'année de décès (si trouvée par get_birth_death_date). La précision de la date est ajoutée pour chaque année. L'affichage est le suivant : * 1700-1780 (date naissance - date décès) * 1700- (naissance - décédé) * 1700 (naissance - vivant) * †1780 (pas date naissance - date décès) * † (pas date naissance - décédé) [Args] : - conf : configuration de la base - base : base de donnée - p : person [Retour] : string [Rem] : Exporté en clair hors de ce module. *) (* ********************************************************************** *) value short_dates_text conf base p = if authorized_age conf base p then let (birth_date, death_date, _) = get_birth_death_date p in let s = match (birth_date, death_date) with [ (Some (Dgreg b _), Some (Dgreg d _)) -> prec_year_text conf b ^ "-" ^ prec_year_text conf d | (Some (Dgreg b _), None) -> (* La personne peut être décédée mais ne pas avoir de date. *) match get_death p with [ Death _ _ | DeadDontKnowWhen | DeadYoung -> prec_year_text conf b ^ "-" | _ -> prec_year_text conf b ] | (None, Some (Dgreg d _)) -> match get_death p with [ Death _ _ | DeadDontKnowWhen | DeadYoung -> death_symbol conf ^ prec_year_text conf d | _ -> "" ] | (None, None) -> (* La personne peut être décédée mais ne pas avoir de date. *) match get_death p with [ Death _ _ | DeadDontKnowWhen | DeadYoung -> death_symbol conf | _ -> "" ] (* On ne peut pas traiter les dates au format texte, mais on *) (* affiche tout de même les dates au format Dgreg. *) | (_, _) -> partial_short_dates_text conf birth_date death_date p ] in if s <> "" then (* Pour IE11, il faut specifier le display inline-block. *) " " ^ s ^ "" else s else "" ; (* ********************************************************************** *) (* [Fonc] short_marriage_date_text : config -> base -> person -> person -> string *) (** [Description] : Renvoie l'année de la date de mariage ansi que la précision de la date. [Args] : - conf : configuration de la base - base : base de donnée - p1 : conjoint 1 - p2 : conjoint 2 [Retour] : string [Rem] : Exporté en clair hors de ce module. *) (* ********************************************************************** *) value short_marriage_date_text conf base fam p1 p2 = if authorized_age conf base p1 && authorized_age conf base p2 then match Adef.od_of_codate (get_marriage fam) with [ Some (Dgreg d _) -> "" ^ prec_year_text conf d ^ "" | _ -> "" ] else "" ; value string_of_place conf pl = Util.string_with_macros conf [] pl; value print_dates conf base p = let cap s = ", " ^ s in let is = index_of_sex (get_sex p) in do { let birth_place = sou base (get_birth_place p) in match Adef.od_of_codate (get_birth p)with [ Some d -> do { Wserver.wprint "%s " (cap (transl_nth conf "born" is)); Wserver.wprint "%s" (string_of_ondate conf d); if birth_place <> "" then Wserver.wprint ",\n" else (); } | None -> if birth_place <> "" then Wserver.wprint "%s\n- " (cap (transl_nth conf "born" is)) else () ]; if birth_place <> "" then Wserver.wprint "%s" (string_of_place conf birth_place) else (); let baptism = Adef.od_of_codate (get_baptism p) in let baptism_place = sou base (get_baptism_place p) in match baptism with [ Some d -> do { Wserver.wprint "%s " (cap (transl_nth conf "baptized" is)); Wserver.wprint "%s" (string_of_ondate conf d); if baptism_place <> "" then Wserver.wprint ",\n" else (); } | None -> if baptism_place <> "" then Wserver.wprint "%s\n- " (cap (transl_nth conf "baptized" is)) else () ]; if baptism_place <> "" then Wserver.wprint "%s" (string_of_place conf baptism_place) else (); let death_place = sou base (get_death_place p) in match get_death p with [ Death dr d -> let dr_w = match dr with [ Unspecified -> transl_nth conf "died" is | Murdered -> transl_nth conf "murdered" is | Killed -> transl_nth conf "killed (in action)" is | Executed -> transl_nth conf "executed (legally killed)" is | Disappeared -> transl_nth conf "disappeared" is ] in let d = Adef.date_of_cdate d in do { Wserver.wprint "%s " (cap dr_w); Wserver.wprint "%s" (string_of_ondate conf d); if death_place <> "" then Wserver.wprint ",\n" else (); } | DeadYoung -> do { Wserver.wprint "%s" (cap (transl_nth conf "died young" is)); if death_place <> "" then Wserver.wprint "\n- " else (); } | DeadDontKnowWhen -> match (death_place, get_burial p) with [ ("", Buried _ | Cremated _) -> () | _ -> if death_place <> "" || not (of_course_died conf p) then do { Wserver.wprint "%s" (cap (transl_nth conf "died" is)); if death_place <> "" then Wserver.wprint "\n- " else (); } else () ] | DontKnowIfDead | NotDead | OfCourseDead -> () ]; if death_place <> "" then Wserver.wprint "%s" (string_of_place conf death_place) else (); let burial_date_place cod = let place = sou base (get_burial_place p) in do { match Adef.od_of_codate cod with [ Some d -> do { Wserver.wprint " %s" (string_of_ondate conf d); if place <> "" then Wserver.wprint ",\n" else (); } | None -> if place <> "" then Wserver.wprint " - " else () ]; if place <> "" then Wserver.wprint "%s" (string_of_place conf place) else (); } in match get_burial p with [ Buried cod -> do { Wserver.wprint "%s" (cap (transl_nth conf "buried" is)); burial_date_place cod; } | Cremated cod -> do { Wserver.wprint "%s" (cap (transl_nth conf "cremated" is)); burial_date_place cod; } | UnknownBurial -> () ]; let (birth_date, death_date, approx) = get_birth_death_date p in match (birth_date, death_date) with [ (Some (Dgreg ({prec = Sure | About | Maybe} as d1) _), Some (Dgreg ({prec = Sure | About | Maybe} as d2) _)) when d1 <> d2 -> let a = CheckItem.time_elapsed d1 d2 in if a.year < 0 || a.year = 0 && a.month = 0 then () else do { Wserver.wprint "\n("; Wserver.wprint "%s " (transl conf "age at death:"); if not approx && d1.prec = Sure && d2.prec = Sure then () else Wserver.wprint "%s " (transl_decline conf "possibly (date)" ""); Wserver.wprint "%s)" (string_of_age conf a); } | _ -> () ]; } ; (* ********************************************************************** *) (* [Fonc] compare_date : date -> date -> int *) (** [Description] : Renvoie 0 si les deux dates sont égales, 1 si la première date est plus grande et -1 sinon. On ne tiens pas compte de la précision de la date. [Args] : - d1 : la première date - d2 : la deuxième date [Retour] : int [Rem] : Exporté en clair hors de ce module. *) (* ********************************************************************** *) value compare_date d1 d2 = match (d1, d2) with [ (Dgreg dmy1 _, Dgreg dmy2 _) -> match Pervasives.compare dmy1.year dmy2.year with [ 0 -> match Pervasives.compare dmy1.month dmy2.month with [ 0 -> Pervasives.compare dmy1.day dmy2.day | x -> x ] | x -> x] | (Dgreg dmy1 _, Dtext _) -> 1 | (Dtext _, Dgreg dmy2 _) -> -1 | (Dtext _, Dtext _) -> 0 ] ; (* Calendar request *) value eval_julian_day conf = let getint v = match p_getint conf.env v with [ Some x -> x | _ -> 0 ] in List.fold_left (fun d (var, cal, conv, max_month) -> let yy = match p_getenv conf.env ("y" ^ var) with [ Some v -> try let len = String.length v in if cal = Djulian && len > 2 && v.[len-2] = '/' then int_of_string (String.sub v 0 (len - 2)) + 1 else int_of_string v with [ Failure _ -> 0 ] | None -> 0 ] in let mm = getint ("m" ^ var) in let dd = getint ("d" ^ var) in let dt = {day = dd; month = mm; year = yy; prec = Sure; delta = 0} in match p_getenv conf.env ("t" ^ var) with [ Some _ -> conv dt | None -> match (p_getenv conf.env ("y" ^ var ^ "1"), p_getenv conf.env ("y" ^ var ^ "2"), p_getenv conf.env ("m" ^ var ^ "1"), p_getenv conf.env ("m" ^ var ^ "2"), p_getenv conf.env ("d" ^ var ^ "1"), p_getenv conf.env ("d" ^ var ^ "2")) with [ (Some _, _, _, _, _, _) -> conv {(dt) with year = yy - 1} | (_, Some _, _, _, _, _) -> conv {(dt) with year = yy + 1} | (_, _, Some _, _, _, _) -> let (yy, mm) = if mm = 1 then (yy - 1, max_month) else (yy, mm - 1) in conv {(dt) with year = yy; month = mm} | (_, _, _, Some _, _, _) -> let (yy, mm) = if mm = max_month then (yy + 1, 1) else (yy, mm + 1) in let r = conv {(dt) with year = yy; month = mm} in if r = conv dt then (* turn around problem with Hebrew Adar1/Adar2 *) let (yy, mm) = if mm = max_month then (yy + 1, 1) else (yy, mm + 1) in conv {(dt) with year = yy; month = mm} else r | (_, _, _, _, Some _, _) -> conv {(dt) with day = dd - 1} | (_, _, _, _, _, Some _) -> conv {(dt) with day = dd + 1} | _ -> d ] ]) (Calendar.sdn_of_gregorian conf.today) [("g", Dgregorian, Calendar.sdn_of_gregorian, 12); ("j", Djulian, Calendar.sdn_of_julian, 12); ("f", Dfrench, Calendar.sdn_of_french, 13); ("h", Dhebrew, Calendar.sdn_of_hebrew, 13)] ; IFDEF OLD THEN declare value gregorian_month_name conf n = capitale (nominative (transl_nth conf "(month)" n)) ; value julian_month_name = gregorian_month_name; value french_month_name conf n = capitale (nominative (french_month conf n)); value hebrew_month_name conf n = capitale (nominative (hebrew_month conf n)); value print_year conf date cal var = do { stagn "td" begin xtag "input" "type=\"submit\" name=\"y%s1\" value=\" < \"" var; end; stagn "td" begin xtag "input" "name=\"y%s\" size=\"6\" maxlength=\"6\" value=\"%s\"" var (if cal = Djulian && (date.month > 0 && date.month < 3 || date.month = 3 && date.day > 0 && date.day < 25) then sprintf "%d/%d" (date.year - 1) (date.year mod 10) else sprintf "%d" date.year); end; stagn "td" begin xtag "input" "type=\"submit\" name=\"y%s2\" value=\" > \"" var; end; } ; value print_month conf date month_name n_months var = do { stagn "td" begin xtag "input" "type=\"submit\" name=\"m%s1\" value=\" < \"" var; end; tag "td" "align=\"center\"" begin tag "select" "name=\"m%s\"" var begin for i = 1 to n_months do { stagn "option" "value=\"%d\"%s" i (if date.month = i then " selected=\"selected\"" else "") begin Wserver.wprint "%s" (month_name conf (i - 1)); end }; end; end; stagn "td" begin xtag "input" "type=\"submit\" name=\"m%s2\" value=\" > \"" var; end; } ; value print_day conf date var = do { stagn "td" begin xtag "input" "type=\"submit\" name=\"d%s1\" value=\" < \"" var; end; stagn "td" begin xtag "input" "name=\"d%s\" size=\"2\" maxlength=\"2\" value=\"%d\"" var date.day; end; stagn "td" begin xtag "input" "type=\"submit\" name=\"d%s2\" value=\" > \"" var; end; } ; value print_some_calendar conf order date cal n month_name n_months var = do { Wserver.wprint "\n"; tag "tr" "align=\"%s\"" conf.left begin stag "th" begin Wserver.wprint "%s" (capitale (transl_nth conf "gregorian/julian/french/hebrew" n)); end; Wserver.wprint "\n"; match order with [ "yymmdd" | "yyyymmdd" -> do { print_year conf date cal var; print_month conf date month_name n_months var; print_day conf date var; } | "mmddyyyy" -> do { print_month conf date month_name n_months var; print_day conf date var; print_year conf date cal var; } | _ -> do { print_day conf date var; print_month conf date month_name n_months var; print_year conf date cal var; } ]; stagn "td" begin xtag "input" "type=\"submit\" name=\"t%s\" value=\" = \"" var; end; end; } ; value print_calendar_head conf order = tag "tr" "align=\"%s\"" conf.left begin stag "td" begin Wserver.wprint " "; end; Wserver.wprint "\n"; match order with [ "yymmdd" | "yyyymmdd" -> for i = 0 to 2 do { stag "th" "align=\"center\" colspan=\"3\"" begin Wserver.wprint "%s" (capitale (transl_nth conf "year/month/day" i)); end; Wserver.wprint "\n"; } | "mmddyyyy" -> for i = 0 to 2 do { let nth = abs (-i*i + max i 1) in stag "th" "align=\"center\" colspan=\"3\"" begin Wserver.wprint "%s" (capitale (transl_nth conf "year/month/day" nth)); end; Wserver.wprint "\n"; } | _ -> for i = 2 downto 0 do { stag "th" "align=\"center\" colspan=\"3\"" begin Wserver.wprint "%s" (capitale (transl_nth conf "year/month/day" i)); end; Wserver.wprint "\n"; } ]; stag "td" begin Wserver.wprint " "; end; Wserver.wprint "\n"; end ; value old_print_calendar conf base = let title _ = Wserver.wprint "%s" (capitale (transl_nth conf "calendar/calendars" 1)) in let sdn = eval_julian_day conf in let date = Calendar.gregorian_of_sdn Sure sdn in let wday = let sdn_today = Calendar.sdn_of_gregorian conf.today in let x = conf.today_wd - sdn_today + sdn in if x < 0 then 6 + (x + 1) mod 7 else x mod 7 in do { header conf title; print_link_to_welcome conf True; begin_centered conf; tag "table" "border=\"%d\"" conf.border begin stag "tbody" begin stag "tr" begin tag "td" "align=\"%s\"" conf.left begin Wserver.wprint "- %s -" (capitale (nominative (transl_nth conf "(week day)" wday))); if date = conf.today then let (hh, mm, ss) = conf.time in Wserver.wprint " %02d:%02d:%02d" hh mm ss else (); Wserver.wprint "\n"; end; end; stag "tr" begin stag "td" "align=\"%s\"" conf.left begin Wserver.wprint " "; end; end; stag "tr" begin tag "td" "align=\"center\"" begin tag "form" "method=\"get\" action=\"%s\"" conf.command begin tag "p" begin List.iter (fun (k, v) -> xtag "input" "type=\"hidden\" name=\"%s\" value=\"%s\"" k (quote_escaped (decode_varenv v))) conf.henv; xtag "input" "type=\"hidden\" name=\"m\" value=\"CAL\""; end; let order = transl conf " !dates order" in tag "table" "border=\"1\"" begin print_calendar_head conf order; print_some_calendar conf order date Dgregorian 0 gregorian_month_name 12 "g"; print_some_calendar conf order (Calendar.julian_of_gregorian date) Djulian 1 julian_month_name 12 "j"; print_some_calendar conf order (Calendar.french_of_gregorian date) Dfrench 2 french_month_name 13 "f"; print_some_calendar conf order (Calendar.hebrew_of_gregorian date) Dhebrew 3 hebrew_month_name 13 "h"; end; end; end; end; let moon_txt i = transl_nth conf "moon age/new moon/first quarter/full moon/last quarter" i in let mp = try Some (Calendar.moon_phase_of_sdn sdn) with [ Failure _ -> None ] in stag "tr" begin stag "td" "align=\"center\"" begin match mp with [ Some (mp, md) -> do { match mp with [ None -> () | Some (Calendar.NewMoon, hh, mm) -> Wserver.wprint "%s - %02d:%02d UT" (capitale (moon_txt 1)) hh mm | Some (Calendar.FirstQuarter, hh, mm) -> Wserver.wprint "%s - %02d:%02d UT" (capitale (moon_txt 2)) hh mm | Some (Calendar.FullMoon, hh, mm) -> Wserver.wprint "%s - %02d:%02d UT" (capitale (moon_txt 3)) hh mm | Some (Calendar.LastQuarter, hh, mm) -> Wserver.wprint "%s - %02d:%02d UT" (capitale (moon_txt 4)) hh mm ]; xtag "br"; stag "span" "style=\"font-size:80%%\"" begin Wserver.wprint "(%s = %d)" (moon_txt 0) md; end; } | None -> () ]; xtag "br"; xtag "br"; Wserver.wprint "%s: " (capitale (transl conf "julian day")); if sdn < 0 then Wserver.wprint "%d" sdn else Num.print (fun x -> Wserver.wprint "%s" x) (transl conf "(thousand separator)") (Num.of_int sdn); end; end; end; end; end_centered conf; trailer conf; } ; end END; (* *) type env 'a = [ Vint of int | Vother of 'a | Vnone ] ; value get_env v env = try List.assoc v env with [ Not_found -> Vnone ]; value get_vother = fun [ Vother x -> Some x | _ -> None ]; value set_vother x = Vother x; value eval_var conf env jd loc = fun [ ["integer"] -> match get_env "integer" env with [ Vint i -> VVstring (string_of_int i) | _ -> raise Not_found ] | ["date" :: sl] -> TemplDate.eval_date_var conf jd sl | ["today" :: sl] -> TemplDate.eval_date_var conf (Calendar.sdn_of_gregorian conf.today) sl | _ -> raise Not_found ] ; value print_foreach conf print_ast eval_expr = let eval_int_expr env jd e = let s = eval_expr env jd e in try int_of_string s with [ Failure _ -> raise Not_found ] in let rec print_foreach env jd loc s sl el al = match (s, sl) with [ ("integer_range", []) -> print_integer_range env jd el al | _ -> raise Not_found ] and print_integer_range env jd el al = let (i1, i2) = match el with [ [[e1]; [e2]] -> (eval_int_expr env jd e1, eval_int_expr env jd e2) | _ -> raise Not_found ] in for i = i1 to i2 do { let env = [("integer", Vint i) :: env] in List.iter (print_ast env jd) al; } in print_foreach ; IFDEF OLD THEN declare value print_calendar conf base = if p_getenv conf.env "old" = Some "on" then old_print_calendar conf base else Templ.interp conf base "calendar" (eval_var conf) (fun _ -> Templ.eval_transl conf) (fun _ -> raise Not_found) get_vother set_vother (print_foreach conf) [] (eval_julian_day conf) ; end ELSE declare value print_calendar conf base = Hutil.interp conf base "calendar" {Templ.eval_var = eval_var conf; Templ.eval_transl _ = Templ.eval_transl conf; Templ.eval_predefined_apply _ = raise Not_found; Templ.get_vother = get_vother; Templ.set_vother = set_vother; Templ.print_foreach = print_foreach conf} [] (eval_julian_day conf) ; end END; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/hutil.ml0000660000175200017530000001246612664543647022700 0ustar guillaumeguillaume(* camlp5r ./pa_html.cmo *) (* $Id: hutil.ml,v 5.11 2007-09-12 09:58:44 ddr Exp $ *) (* Copyright (c) 2007 INRIA *) open Config; open Printf; value up_fname conf = "up.png"; value commd_no_params conf = conf.command ^ "?" ^ List.fold_left (fun c (k, v) -> c ^ (if c = "" then "" else ";") ^ k ^ (if v = "" then "" else "=" ^ v)) "" conf.henv ; value link_to_referer conf = let referer = Util.get_referer conf in if referer <> "" then let fname = "left.png" in let wid_hei = match Util.image_size (Util.image_file_name fname) with [ Some (wid, hei) -> " width=\"" ^ string_of_int wid ^ "\" height=\"" ^ string_of_int hei ^ "\"" | None -> "" ] in sprintf "\"<<\"\n" referer (Util.image_prefix conf) fname wid_hei conf.xhs else "" ; value gen_print_link_to_welcome f conf right_aligned = if conf.cancel_links then () else do { let fname = up_fname conf in let wid_hei = match Util.image_size (Util.image_file_name fname) with [ Some (wid, hei) -> " width=\"" ^ string_of_int wid ^ "\" height=\"" ^ string_of_int hei ^ "\"" | None -> "" ] in if right_aligned then Wserver.wprint "
    \n" conf.right else Wserver.wprint "

    \n"; f (); let str = link_to_referer conf in if str = "" then () else Wserver.wprint "%s" str; Wserver.wprint "" (commd_no_params conf); Wserver.wprint "\"^^\"" (Util.image_prefix conf) fname wid_hei conf.xhs; Wserver.wprint "\n"; if right_aligned then Wserver.wprint "

    \n" else Wserver.wprint "

    \n" } ; value print_link_to_welcome = gen_print_link_to_welcome (fun () -> ()); value header_without_http conf title = do { Wserver.wprint "%s\n" (Util.doctype conf); Wserver.wprint "\n"; Wserver.wprint "\n"; Wserver.wprint " "; title True; Wserver.wprint "\n"; Wserver.wprint " \n" conf.xhs; Wserver.wprint " \n" conf.charset conf.xhs; Wserver.wprint " \n" conf.xhs; Wserver.wprint " \n" (Util.image_prefix conf) conf.xhs; match Util.open_templ conf "css" with [ Some ic -> Templ.copy_from_templ conf [] ic | None -> () ]; match Util.open_templ conf "js" with [ Some ic -> Templ.copy_from_templ conf [] ic | None -> () ]; Templ.include_hed_trl conf None "hed"; Wserver.wprint "\n"; let s = try " dir=\"" ^ Hashtbl.find conf.lexicon " !dir" ^ "\"" with [ Not_found -> "" ] in let s = s ^ Util.body_prop conf in Wserver.wprint "" s; Wserver.wprint "\n"; Util.message_to_wizard conf; }; value header_without_page_title conf title = do { Util.html conf; Util.nl (); header_without_http conf title; }; value header_link_welcome conf title = do { header_without_page_title conf title; print_link_to_welcome conf True; Wserver.wprint "

    "; title False; Wserver.wprint "

    \n"; }; value header_no_page_title conf title = do { header_without_page_title conf title; match Util.p_getenv conf.env "title" with [ None | Some "" -> () | Some x -> Wserver.wprint "

    %s

    \n" x ]; }; value header conf title = do { header_without_page_title conf title; Wserver.wprint "

    "; title False; Wserver.wprint "

    \n"; }; value red_color = "red"; value rheader conf title = do { header_without_page_title conf title; Wserver.wprint "

    "; title False; Wserver.wprint "

    \n"; }; value gen_trailer with_logo conf = do { Templ.include_hed_trl conf None "trl"; if with_logo then Templ.print_copyright_with_logo conf else Templ.print_copyright conf; Wserver.wprint "\n\n"; }; value trailer = gen_trailer True; value incorrect_request conf = do { let title _ = Wserver.wprint "%s" (Util.capitale (Util.transl conf "incorrect request")) in header conf title; Wserver.wprint "

    \n"; print_link_to_welcome conf False; Wserver.wprint "

    \n"; trailer conf }; value error_cannot_access conf fname = do { let title _ = Wserver.wprint "Error" in header conf title; tag "ul" begin tag "li" begin Wserver.wprint "Cannot access file \"%s.txt\".\n" fname; end; end; trailer conf; }; value gen_interp header conf base fname ifun env ep = do { let v = Templ.template_file.val in Templ.template_file.val := fname; try match Templ.input_templ conf fname with [ Some astl -> do { if header then do { Util.html conf; Util.nl (); } else (); Templ.interp_ast conf (Some base) ifun env ep astl } | None -> error_cannot_access conf fname ] with e -> do { Templ.template_file.val := v; raise e }; Templ.template_file.val := v; }; value interp_no_header conf base fname ifun env ep = gen_interp False conf base fname ifun env ep; value interp conf base fname ifun env ep = gen_interp True conf base fname ifun env ep; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/some.ml0000660000175200017530000010227612664543647022515 0ustar guillaumeguillaume(* camlp5r ./pa_html.cmo *) (* $Id: some.ml,v 5.44 2007-09-12 09:58:44 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Config; open Def; open Gutil; open Gwdb; open Hutil; open Mutil; open Util; value not_found conf txt x = let title _ = Wserver.wprint "%s: \"%s\"" (capitale txt) x in do { rheader conf title; print_link_to_welcome conf False; trailer conf; } ; value first_name_not_found conf = not_found conf (transl conf "first name not found") ; value surname_not_found conf = not_found conf (transl conf "surname not found") ; (* **********************************************************************) (* [Fonc] print_branch_to_alphabetic : conf -> string -> int -> unit *) (** [Description] : A partir de l'affichage par branches, permet d'afficher les liens pour un affichage par ordre alphabétique. [Args] : - conf : configuration de la base - base : base - x : 'nom/prénom/sosa...' recherché - nb_branch : nombre de branches dans le résultat de la recherche [Retour] : Néant [Rem] : Non exporté en clair hors de ce module. *) (* ******************************************************************** *) value print_branch_to_alphabetic conf x nb_branch = do { tag "table" "class=\"display_search\"" begin stag "tr" begin stag "td" begin stag "b" begin Wserver.wprint "%s" (capitale (transl_nth conf "display by/branch/alphabetic order" 0)); end; end; stag "td" begin xtag "img" "src=\"%s/%s\" align=\"middle\" alt=\"\" title=\"\"" (Util.image_prefix conf) "picto_branch.png"; end; stag "td" begin Wserver.wprint "%s (%d)" (transl_nth conf "display by/branch/alphabetic order" 1) nb_branch; end; stag "td" begin xtag "img" "src=\"%s/%s\" align=\"middle\" alt=\"\" title=\"\"" (Util.image_prefix conf) "picto_alphabetic_order.png"; end; (* Ne pas oublier l'attribut nofollow pour les robots *) stag "td" begin if p_getenv conf.env "t" = Some "A" then stag "a" "href=\"%sm=N;o=i;v=%s\" rel=\"nofollow\"" (commd conf) (code_varenv x ^ ";t=A") begin Wserver.wprint "%s" (transl_nth conf "display by/branch/alphabetic order" 2); end else stag "a" "href=\"%sm=N;o=i;v=%s\" rel=\"nofollow\"" (commd conf) (code_varenv x ^ ";t=N") begin Wserver.wprint "%s" (transl_nth conf "display by/branch/alphabetic order" 2); end; end; end; end; xtag "br" }; (* **********************************************************************) (* [Fonc] print_alphabetic_to_branch : conf -> string -> int -> unit *) (** [Description] : A partir de l'affichage alphabétique, permet d'afficher les liens pour un affichage par branches. [Args] : - conf : configuration de la base - base : base - x : 'nom/prénom/sosa...' recherché [Retour] : Néant [Rem] : Non exporté en clair hors de ce module. *) (* ******************************************************************** *) value print_alphabetic_to_branch conf x = do { stag "table" "class=\"display_search\"" begin stag "tr" begin stag "td" begin stag "b" begin Wserver.wprint "%s" (capitale (transl_nth conf "display by/branch/alphabetic order" 0)); end; end; stag "td" begin xtag "img" "src=\"%s/%s\" align=\"middle\" alt=\"\" title=\"\"" (Util.image_prefix conf) "picto_branch.png"; end; (* Ne pas oublier l'attribut nofollow pour les robots *) stag "td" begin if p_getenv conf.env "t" = Some "A" then stag "a" "href=\"%sm=N;v=%s\" rel=\"nofollow\"" (commd conf) (code_varenv x ^ ";t=A") begin Wserver.wprint "%s" (transl_nth conf "display by/branch/alphabetic order" 1); end else stag "a" "href=\"%sm=NG;sn=%s\" rel=\"nofollow\"" (commd conf) (code_varenv x) begin Wserver.wprint "%s" (transl_nth conf "display by/branch/alphabetic order" 1); end; end; stag "td" begin xtag "img" "src=\"%s/%s\" align=\"middle\" alt=\"\" title=\"\"" (Util.image_prefix conf) "picto_alphabetic_order.png"; end; stag "td" begin Wserver.wprint "%s" (transl_nth conf "display by/branch/alphabetic order" 2); end; end; end; xtag "br" }; value persons_of_fsname conf base base_strings_of_fsname find proj x = (* list of strings index corresponding to the crushed lower first name or surname "x" *) let istrl = base_strings_of_fsname base x in (* selecting the persons who have this first name or surname *) let l = let x = Name.crush_lower x in List.fold_right (fun istr l -> let str = nominative (sou base istr) in if Name.crush_lower str = x || List.mem x (List.map Name.crush_lower (surnames_pieces str)) then let iperl = find istr in (* maybe they are not the good ones because of changes in the database; checking... *) let iperl = List.fold_left (fun iperl iper -> if eq_istr (proj (pget conf base iper)) istr then [iper :: iperl] else iperl) [] iperl in if iperl = [] then l else [(str, istr, iperl) :: l] else l) istrl [] in let (l, name_inj) = let (l1, name_inj) = let x = Name.lower x in (List.fold_right (fun (str, istr, iperl) l -> if x = Name.lower str then [(str, istr, iperl) :: l] else l) l [], Name.lower) in let (l1, name_inj) = if l1 = [] then let x = Name.strip_lower x in (List.fold_right (fun (str, istr, iperl) l -> if x = Name.strip_lower str then [(str, istr, iperl) :: l] else l) l [], Name.strip_lower) else (l1, name_inj) in if l1 = [] then (l, Name.crush_lower) else (l1, name_inj) in (l, name_inj) ; value print_elem conf base is_surname (p, xl) = list_iter_first (fun first x -> do { if not first then Wserver.wprint "
  • \n
  • \n " else (); Perso.print_sosa conf base x True; Wserver.wprint "" (commd conf) (acces conf base x); if is_surname then Wserver.wprint "%s%s" (surname_end base p) (surname_begin base p) else Wserver.wprint "%s" (if p = "" then "?" else p); Wserver.wprint ""; Wserver.wprint "%s" (Date.short_dates_text conf base x); stag "em" begin specify_homonymous conf base x True; end; }) xl ; value first_char s = (* Si la personne n'a pas de prénom/nom, on renvoie '?' *) if s = "" then "?" else if Mutil.utf_8_db.val then let len = Name.nbc s.[0] in if len < String.length s then String.sub s 0 len else s else String.sub s (initial s) 1 ; value name_unaccent s = copy 0 0 where rec copy i len = if i = String.length s then Buff.get len else let (t, j) = Name.unaccent_utf_8 False s i in copy j (Buff.mstore len t) ; value first_name_print_list conf base x1 xl liste = do { let liste = let l = List.sort (fun x1 x2 -> match alphabetic (p_surname base x1) (p_surname base x2) with [ 0 -> match (Adef.od_of_codate (get_birth x1), Adef.od_of_codate (get_birth x2)) with [ (Some d1, Some d2) -> if CheckItem.strictly_after d1 d2 then -1 else 1 | (Some d1, _) -> 1 | _ -> -1 ] | n -> -n ]) liste in List.fold_left (fun l x -> let px = p_surname base x in match l with [ [(p, l1) :: l] when alphabetic px p = 0 -> [(p, [x :: l1]) :: l] | _ -> [(px, [x]) :: l] ]) [] l in let title h = if h || p_getenv conf.env "t" = Some "A" then Wserver.wprint "%s" x1 else Mutil.list_iter_first (fun first x -> Wserver.wprint "%s%s" (if first then "" else ", ") (commd conf) (code_varenv x) x) (StrSet.elements xl) in header conf title; print_link_to_welcome conf True; (* Si on est dans un calcul de parenté, on affiche *) (* l'aide sur la sélection d'un individu. *) Util.print_tips_relationship conf; let list = List.map (fun (sn, ipl) -> let txt = Util.surname_end base sn ^ Util.surname_begin base sn in let ord = name_unaccent txt in (ord, txt, ipl)) liste in let list = List.sort compare list in print_alphab_list conf (fun (ord, txt, _) -> first_char ord) (fun (_, txt, ipl) -> print_elem conf base True (txt, ipl)) list; trailer conf; }; value select_first_name conf base n list = let title _ = Wserver.wprint "%s \"%s\" : %s" (capitale (transl_nth conf "first name/first names" 0)) n (transl conf "specify") in do { header conf title; Wserver.wprint "\n"; trailer conf; } ; value rec merge_insert ((sstr, (strl, iperl)) as x) = fun [ [((sstr1, (strl1, iperl1)) as y) :: l] -> if sstr < sstr1 then [x; y :: l] else if sstr > sstr1 then [y :: merge_insert x l] else [(sstr, (StrSet.union strl strl1, iperl @ iperl1)) :: l] | [] -> [x] ] ; value persons_of_absolute_first_name conf base x = let istrl = base_strings_of_first_name base x in List.fold_right (fun istr l -> let str = sou base istr in if str = x then let iperl = spi_find (persons_of_first_name base) istr in let iperl = List.fold_left (fun iperl iper -> if eq_istr (get_first_name (pget conf base iper)) istr then [iper :: iperl] else iperl) [] iperl in if iperl = [] then l else [(str, istr, iperl) :: l] else l) istrl [] ; value first_name_print conf base x = let (list, _) = if Mutil.utf_8_db.val && p_getenv conf.env "t" = Some "A" then (persons_of_absolute_first_name conf base x, fun []) else if x = "" then ([], fun []) else persons_of_fsname conf base base_strings_of_first_name (spi_find (persons_of_first_name base)) get_first_name x in let list = List.map (fun (str, istr, iperl) -> (Name.lower str, (StrSet.add str StrSet.empty, iperl))) list in let list = List.fold_right merge_insert list [] in (* Construction de la table des sosa de la base *) let () = Perso.build_sosa_ht conf base in match list with [ [] -> first_name_not_found conf x | [(_, (strl, iperl))] -> let iperl = list_uniq (List.sort compare iperl) in let pl = List.map (pget conf base) iperl in let pl = List.fold_right (fun p pl -> if not (is_hide_names conf p) || (fast_auth_age conf p ) then [p :: pl] else pl) pl [] in first_name_print_list conf base x strl pl | _ -> select_first_name conf base x list ] ; value has_children_with_that_name conf base des name = let compare_name n1 n2 = if p_getenv conf.env "t" = Some "A" then n1 = n2 else Name.lower n1 = Name.lower n2 in List.exists (fun ip -> compare_name (p_surname base (pget conf base ip)) name) (Array.to_list (get_children des)) ; (* List selection bullets *) value bullet_sel_txt = "o"; value bullet_unsel_txt = "+"; value bullet_nosel_txt = "o"; value print_selection_bullet conf = fun [ Some (txt, sel) -> do { let req = List.fold_left (fun req (k, v) -> if not sel && k = "u" && v = txt then req else let s = k ^ "=" ^ v in if req = "" then s else req ^ ";" ^ s) "" conf.env in if conf.cancel_links then () else Wserver.wprint "" txt (commd conf) req (if sel then ";u=" ^ txt else "") (if sel || List.mem_assoc "u" conf.env then "#i" ^ txt else ""); Wserver.wprint "%s" (if sel then bullet_sel_txt else bullet_unsel_txt); if conf.cancel_links then () else Wserver.wprint ""; Wserver.wprint "\n"; } | None -> Wserver.wprint "%s\n" bullet_nosel_txt ] ; value unselected_bullets conf = List.fold_left (fun sl (k, v) -> try if k = "u" then [int_of_string v :: sl] else sl with [ Failure _ -> sl ]) [] conf.env ; value alphabetic1 n1 n2 = if utf_8_db.val then Gutil.alphabetic_utf_8 n1 n2 else Gutil.alphabetic n1 n2 ; type branch_head 'a = { bh_ancestor : 'a; bh_well_named_ancestors : list 'a }; value print_branch conf base psn name = let unsel_list = unselected_bullets conf in loop where rec loop is_first_level p = do { let u = pget conf base (get_key_index p) in let family_list = List.map (fun ifam -> let fam = foi base ifam in let c = spouse (get_key_index p) fam in let c = pget conf base c in let down = has_children_with_that_name conf base fam name in let down = if get_sex p = Female && p_surname base c = name then False else down in let i = Adef.int_of_ifam ifam in let sel = not (List.mem i unsel_list) in (fam, c, if down then Some (string_of_int i, sel) else None)) (Array.to_list (get_family u)) in let first_select = match family_list with [ [(_, _, select) :: _] -> select | _ -> None ] in print_selection_bullet conf first_select; Perso.print_sosa conf base p True; stag "strong" begin Wserver.wprint "%s" (Util.reference conf base p (if (is_hide_names conf p) && not (fast_auth_age conf p) then "x" else if not psn && p_surname base p = name then person_text_without_surname conf base p else person_text conf base p)); end; Wserver.wprint "%s" (Date.short_dates_text conf base p); Wserver.wprint "\n"; if Array.length (get_family u) = 0 then () else let _ = List.fold_left (fun first (fam, c, select) -> do { if not first then do { if is_first_level then Wserver.wprint "\n" conf.xhs else Wserver.wprint "\n
    \n"; print_selection_bullet conf select; Perso.print_sosa conf base p False; stag "em" begin Wserver.wprint "%s" (if (is_hide_names conf p) && not (fast_auth_age conf p) then "x" else if not psn && p_surname base p = name then person_text_without_surname conf base p else person_text conf base p); end; Wserver.wprint "%s" (Date.short_dates_text conf base p); Wserver.wprint "\n"; } else (); Wserver.wprint " &"; Wserver.wprint "%s\n" (Date.short_marriage_date_text conf base fam p c); Perso.print_sosa conf base c True; stag "strong" begin Wserver.wprint "%s" (reference conf base c (if (is_hide_names conf c) && not (fast_auth_age conf c) then "x" else person_text conf base c)); end; Wserver.wprint "%s" (Date.short_dates_text conf base c); Wserver.wprint "\n"; let children = get_children fam in match select with [ Some (_, True) -> tag "dl" begin List.iter (fun e -> tag "dd" begin loop False (pget conf base e); end) (Array.to_list children); end | Some (_, False) -> () | None -> if Array.length children <> 0 then stagn "dl" begin stag "dd" begin Wserver.wprint "..."; end; end else () ]; False }) True family_list in (); } ; value print_one_branch conf base bh psn lev = let p = bh.bh_ancestor in match bh.bh_well_named_ancestors with [ [] -> let x = sou base (get_surname p) in print_branch conf base psn x lev p | pl -> do { if is_hidden p then Wserver.wprint "<<" else let href = Util.acces conf base p in wprint_geneweb_link conf href "<<"; Wserver.wprint "\n"; List.iter (fun p -> let x = sou base (get_surname p) in tag "dl" begin tag "dd" begin print_branch conf base psn x False p; end; end) bh.bh_well_named_ancestors; } ] ; value print_one_surname_by_branch conf base x xl (bhl, str) = do { let ancestors = match p_getenv conf.env "order" with [ Some "d" -> let born_before p1 p2 = match (Adef.od_of_codate (get_birth p1), Adef.od_of_codate (get_birth p2)) with [ (Some d1, Some d2) -> if CheckItem.strictly_after d2 d1 then -1 else 1 | (_, None) -> -1 | (None, _) -> 1 ] in List.sort (fun p1 p2 -> born_before p1.bh_ancestor p2.bh_ancestor) bhl | _ -> List.sort (fun p1 p2 -> alphabetic1 (p_first_name base p1.bh_ancestor) (p_first_name base p2.bh_ancestor)) bhl ] in let len = List.length ancestors in let psn = match p_getenv conf.env "alwsurn" with [ Some x -> x = "yes" | None -> try List.assoc "always_surname" conf.base_env = "yes" with [ Not_found -> False ] ] in let title h = if h || p_getenv conf.env "t" = Some "A" then Wserver.wprint "%s" x else Mutil.list_iter_first (fun first x -> Wserver.wprint "%s%s" (if first then "" else ", ") (commd conf) (code_varenv x) x) (StrSet.elements xl) in let br = p_getint conf.env "br" in Wserver.wrap_string.val := Util.xml_pretty_print; header conf title; print_link_to_welcome conf True; (* Si on est dans un calcul de parenté, on affiche *) (* l'aide sur la sélection d'un individu. *) Util.print_tips_relationship conf; (* Menu afficher par branche/ordre alphabetique *) if br = None then print_branch_to_alphabetic conf x len else (); tag "div" "style=\"white-space:nowrap\"" begin if len > 1 && br = None then tag "dl" begin let _ = List.fold_left (fun n bh -> do { stagn "dt" begin if conf.cancel_links then Wserver.wprint "%d." n else stag "a" "href=\"%sm=N;v=%s;br=%d\" rel=\"nofollow\"" (commd conf) (Util.code_varenv str) n begin Wserver.wprint "%d." n; end; end; tag "dd" begin print_one_branch conf base bh psn False; end; n + 1 }) 1 ancestors in (); end else let _ = List.fold_left (fun n bh -> do { if br = None || br = Some n then print_one_branch conf base bh psn True else (); n + 1 }) 1 ancestors in (); end; trailer conf; }; value print_several_possible_surnames x conf base (bhl, homonymes) = do { let fx = x in let x = match homonymes with [ [x :: _] -> x | _ -> x ] in let title h = Wserver.wprint "%s \"%s\" : %s" (capitale (transl_nth conf "surname/surnames" 0)) fx (transl conf "specify") in header conf title; print_link_to_welcome conf True; let list = List.map (fun sn -> let txt = Util.surname_end base sn ^ Util.surname_begin base sn in let ord = name_unaccent txt in (ord, txt, sn)) homonymes in let list = List.sort compare list in let access txt sn = geneweb_link conf ("m=N;v=" ^ code_varenv sn ^ ";t=N") txt in Util.wprint_in_columns conf (fun (ord, _, _) -> ord) (fun (_, txt, sn) -> Wserver.wprint "%s" (access txt sn)) list; tag "p" begin Wserver.wprint "\n"; Wserver.wprint "%s " (capitale (transl conf "click")); Wserver.wprint "%s\n" (commd conf) (if List.length homonymes = 1 then code_varenv x ^ ";t=A" else code_varenv fx) (transl conf "here"); Wserver.wprint "%s" (transl conf "for the first names by alphabetic order"); Wserver.wprint ".\n"; end; trailer conf; }; value print_family_alphabetic x conf base liste = let homonymes = let list = List.fold_left (fun list p -> if List.exists (eq_istr (get_surname p)) list then list else [get_surname p :: list]) [] liste in let set = List.fold_left (fun set istr -> StrSet.add (sou base istr) set) StrSet.empty list in List.sort compare (StrSet.elements set) in let liste = let l = List.sort (fun x1 x2 -> match alphabetic1 (p_first_name base x2) (p_first_name base x1) with [ 0 -> compare (get_occ x1) (get_occ x2) | n -> n ]) liste in List.fold_left (fun l x -> let px = p_first_name base x in match l with [ [(p, l1) :: l] when alphabetic1 px p = 0 -> [(p, [x :: l1]) :: l] | _ -> [(px, [x]) :: l] ]) [] l in match liste with [ [] -> surname_not_found conf x | _ -> let title h = let access x = if h || List.length homonymes = 1 then x else geneweb_link conf ("m=N;o=i;v=" ^ code_varenv x ^ ";t=A") x in list_iter_first (fun first x -> Wserver.wprint "%s%s" (if first then "" else ", ") (access x)) homonymes in do { header conf title; print_link_to_welcome conf True; (* Si on est dans un calcul de parenté, on affiche *) (* l'aide sur la sélection d'un individu. *) Util.print_tips_relationship conf; (* Menu afficher par branche/ordre alphabetique *) print_alphabetic_to_branch conf x; print_alphab_list conf (fun (p, _) -> first_char p) (print_elem conf base False) liste; trailer conf; } ] ; value insert_at_position_in_family children ip ipl = loop (Array.to_list children) ipl where rec loop child_list ipl = match (child_list, ipl) with [ ([ip1 :: ipl1], [ip2 :: ipl2]) -> if ip1 = ip2 then if ip = ip1 then ipl else [ip2 :: loop ipl1 ipl2] else if ip = ip1 then [ip1 :: ipl] else loop ipl1 ipl | ([_ :: _], []) -> [ip] | ([], _) -> assert False ] ; value select_ancestors conf base name_inj ipl = let str_inj s = name_inj (sou base s) in List.fold_left (fun bhl ip -> let p = pget conf base ip in match get_parents p with [ Some ifam -> let fam = foi base ifam in let ifath = get_father fam in let imoth = get_mother fam in let fath = pget conf base ifath in let moth = pget conf base imoth in let s = str_inj (get_surname p) in if str_inj (get_surname fath) <> s && str_inj (get_surname moth) <> s then loop bhl where rec loop = fun [ [bh :: bhl] -> if bh.bh_ancestor = ifath || bh.bh_ancestor = imoth then let bh = {(bh) with bh_well_named_ancestors = insert_at_position_in_family (get_children fam) ip bh.bh_well_named_ancestors} in [bh :: bhl] else [bh :: loop bhl] | [] -> [{bh_ancestor = ifath; bh_well_named_ancestors = [ip]}] ] else bhl | _ -> let bh = {bh_ancestor = ip; bh_well_named_ancestors = []} in [bh :: bhl] ]) [] ipl ; value persons_of_absolute_surname conf base x = let istrl = base_strings_of_surname base x in List.fold_right (fun istr l -> let str = sou base istr in if str = x then let iperl = spi_find (persons_of_surname base) istr in let iperl = List.fold_left (fun iperl iper -> if eq_istr (get_surname (pget conf base iper)) istr then [iper :: iperl] else iperl) [] iperl in if iperl = [] then l else [(str, istr, iperl) :: l] else l) istrl [] ; module PerSet = Set.Make (struct type t = iper; value compare = compare; end); value surname_print conf base not_found_fun x = let (list, name_inj) = if Mutil.utf_8_db.val && p_getenv conf.env "t" = Some "A" then (persons_of_absolute_surname conf base x, fun x -> x) else if x = "" then ([], fun []) else persons_of_fsname conf base base_strings_of_surname (spi_find (persons_of_surname base)) get_surname x in let list = List.map (fun (str, istr, iperl) -> (Name.lower str, (StrSet.add str StrSet.empty, iperl))) list in let list = List.fold_right merge_insert list [] in let (iperl, strl) = List.fold_right (fun (str, (istr, iperl1)) (iperl, strl) -> let len = List.length iperl1 in let strl = try let len1 = List.assoc str strl in [(str, len + len1) :: List.remove_assoc str strl] with [ Not_found -> [(str, len) :: strl] ] in (List.fold_right PerSet.add iperl1 iperl, strl)) list (PerSet.empty, []) in let iperl = PerSet.elements iperl in (* Construction de la table des sosa de la base *) let () = Perso.build_sosa_ht conf base in match p_getenv conf.env "o" with [ Some "i" -> let pl = List.fold_right (fun ip ipl -> [pget conf base ip :: ipl]) iperl [] in let pl = List.fold_right (fun p pl -> if not (is_hide_names conf p) || (fast_auth_age conf p) then [p :: pl] else pl) pl [] in print_family_alphabetic x conf base pl | _ -> let bhl = select_ancestors conf base name_inj iperl in let bhl = List.map (fun bh -> {bh_ancestor = pget conf base bh.bh_ancestor; bh_well_named_ancestors = List.map (pget conf base) bh.bh_well_named_ancestors}) bhl in match (bhl, list) with [ ([], _) -> not_found_fun conf x | (_, [(s, (strl, iperl))]) -> print_one_surname_by_branch conf base x strl (bhl, s) | _ -> let strl = List.map (fun (s, (strl, _)) -> s) list in print_several_possible_surnames x conf base (bhl, strl) ]] ; (**/**) (* TODO: refactoring avec les fonctions ci-dessus !!! *) value search_surname conf base x = let (list, name_inj) = if Mutil.utf_8_db.val && p_getenv conf.env "t" = Some "A" then (persons_of_absolute_surname conf base x, fun x -> x) else if x = "" then ([], fun []) else persons_of_fsname conf base base_strings_of_surname (spi_find (persons_of_surname base)) get_surname x in let list = List.map (fun (str, istr, iperl) -> (Name.lower str, (StrSet.add str StrSet.empty, iperl))) list in let list = List.fold_right merge_insert list [] in let (iperl, strl) = List.fold_right (fun (str, (istr, iperl1)) (iperl, strl) -> let len = List.length iperl1 in let strl = try let len1 = List.assoc str strl in [(str, len + len1) :: List.remove_assoc str strl] with [ Not_found -> [(str, len) :: strl] ] in (List.fold_right PerSet.add iperl1 iperl, strl)) list (PerSet.empty, []) in let iperl = PerSet.elements iperl in let bhl = select_ancestors conf base name_inj iperl in let bhl = List.map (fun bh -> {bh_ancestor = pget conf base bh.bh_ancestor; bh_well_named_ancestors = List.map (pget conf base) bh.bh_well_named_ancestors}) bhl in match (bhl, list) with [ ([], _) -> [] | (_, [(s, (strl, iperl))]) -> iperl | _ -> [] ] ; value search_surname_print conf base not_found_fun x = let (list, name_inj) = if Mutil.utf_8_db.val && p_getenv conf.env "t" = Some "A" then (persons_of_absolute_surname conf base x, fun x -> x) else if x = "" then ([], fun []) else persons_of_fsname conf base base_strings_of_surname (spi_find (persons_of_surname base)) get_surname x in let list = List.map (fun (str, istr, iperl) -> (Name.lower str, (StrSet.add str StrSet.empty, iperl))) list in let list = List.fold_right merge_insert list [] in let (iperl, strl) = List.fold_right (fun (str, (istr, iperl1)) (iperl, strl) -> let len = List.length iperl1 in let strl = try let len1 = List.assoc str strl in [(str, len + len1) :: List.remove_assoc str strl] with [ Not_found -> [(str, len) :: strl] ] in (List.fold_right PerSet.add iperl1 iperl, strl)) list (PerSet.empty, []) in let iperl = PerSet.elements iperl in (* Construction de la table des sosa de la base *) let () = Perso.build_sosa_ht conf base in match p_getenv conf.env "o" with [ Some "i" -> let pl = List.fold_right (fun ip ipl -> [pget conf base ip :: ipl]) iperl [] in let pl = List.fold_right (fun p pl -> if not (is_hide_names conf p) || (fast_auth_age conf p) then [p :: pl] else pl) pl [] in print_family_alphabetic x conf base pl | _ -> let bhl = select_ancestors conf base name_inj iperl in let bhl = List.map (fun bh -> {bh_ancestor = pget conf base bh.bh_ancestor; bh_well_named_ancestors = List.map (pget conf base) bh.bh_well_named_ancestors}) bhl in match (bhl, list) with [ ([], _) -> not_found_fun conf x | (_, [(s, (strl, iperl))]) -> print_one_surname_by_branch conf base x strl (bhl, s) | _ -> let strl = List.map (fun (s, (strl, _)) -> s) list in print_several_possible_surnames x conf base (bhl, strl) ]] ; value search_first_name conf base x = let (list, _) = if Mutil.utf_8_db.val && p_getenv conf.env "t" = Some "A" then (persons_of_absolute_first_name conf base x, fun []) else if x = "" then ([], fun []) else persons_of_fsname conf base base_strings_of_first_name (spi_find (persons_of_first_name base)) get_first_name x in let list = List.map (fun (str, istr, iperl) -> (Name.lower str, (StrSet.add str StrSet.empty, iperl))) list in List.fold_right merge_insert list [] ; value search_first_name_print conf base x = let (list, _) = if Mutil.utf_8_db.val && p_getenv conf.env "t" = Some "A" then (persons_of_absolute_first_name conf base x, fun []) else if x = "" then ([], fun []) else persons_of_fsname conf base base_strings_of_first_name (spi_find (persons_of_first_name base)) get_first_name x in let list = List.map (fun (str, istr, iperl) -> (Name.lower str, (StrSet.add str StrSet.empty, iperl))) list in let list = List.fold_right merge_insert list [] in (* Construction de la table des sosa de la base *) let () = Perso.build_sosa_ht conf base in match list with [ [] -> first_name_not_found conf x | [(_, (strl, iperl))] -> let iperl = list_uniq (List.sort compare iperl) in let pl = List.map (pget conf base) iperl in let pl = List.fold_right (fun p pl -> if not (is_hide_names conf p) || (fast_auth_age conf p ) then [p :: pl] else pl) pl [] in first_name_print_list conf base x strl pl | _ -> select_first_name conf base x list ] ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/updateFam.ml0000660000175200017530000005541712664543647023464 0ustar guillaumeguillaume(* camlp5r ./pa_html.cmo *) (* $Id: updateFam.ml,v 5.24 2008-01-09 03:34:36 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Config; open Def; open Gutil; open Gwdb; open Hutil; open TemplAst; open Util; type create_info = Update.create_info == { ci_birth_date : option date; ci_birth_place : string; ci_death : death; ci_death_date : option date; ci_death_place : string; ci_occupation : string; ci_public : bool } ; value bogus_family_index = Adef.ifam_of_int (-1); value default_source conf = match p_getenv conf.env "dsrc" with [ Some s -> s | None -> "" ] ; value person_key base ip = let p = poi base ip in let first_name = sou base (get_first_name p) in let surname = sou base (get_surname p) in let occ = if first_name = "?" || surname = "?" then Adef.int_of_iper ip else get_occ p in (first_name, surname, occ, Update.Link, "") ; value string_family_of conf base ifam = let fam = foi base ifam in let sfam = Futil.map_family_ps (person_key base) (sou base) (gen_family_of_family fam) in let scpl = Futil.map_couple_p conf.multi_parents (person_key base) (gen_couple_of_couple fam) in let sdes = Futil.map_descend_p (person_key base) (gen_descend_of_descend fam) in (sfam, scpl, sdes) ; (* Interpretation of template file 'updfam.txt' *) type env 'a = [ Vstring of string | Vint of int | Vother of 'a | Vnone ] ; value get_env v env = try List.assoc v env with [ Not_found -> Vnone ]; value get_vother = fun [ Vother x -> Some x | _ -> None ]; value set_vother x = Vother x; value extract_var sini s = let len = String.length sini in if String.length s > len && String.sub s 0 (String.length sini) = sini then String.sub s len (String.length s - len) else "" ; value not_impl func x = let desc = if Obj.is_block (Obj.repr x) then "tag = " ^ string_of_int (Obj.\tag (Obj.repr x)) else "int_val = " ^ string_of_int (Obj.magic x) in Wserver.wprint ">%s

    \n" ("UpdateFam." ^ func ^ ": not impl " ^ desc) ; value obsolete_list = ref []; value obsolete version var new_var r = if List.mem var obsolete_list.val then r else IFDEF UNIX THEN do { Printf.eprintf "*** updfam.txt: \"%s\" obsolete since v%s%s\n" var version (if new_var = "" then "" else "; rather use \"" ^ new_var ^ "\""); flush stderr; obsolete_list.val := [var :: obsolete_list.val]; r } ELSE r END ; value bool_val x = VVbool x; value str_val x = VVstring x; value rec eval_var conf base env (fam, cpl, des) loc sl = try eval_special_var conf base (fam, cpl, des) sl with [ Not_found -> eval_simple_var conf base env (fam, cpl, des) loc sl ] and eval_simple_var conf base env (fam, cpl, des) loc = fun [ ["bvar"; v] -> try VVstring (List.assoc v conf.base_env) with [ Not_found -> VVstring "" ] | ["child" :: sl] -> let k = match get_env "cnt" env with [ Vint i -> let i = i - 1 in if i >= 0 && i < Array.length des.children then des.children.(i) else if i >= 0 && i < 1 && Array.length des.children = 0 then ("", "", 0, Update.Create Neuter None, "") else raise Not_found | _ -> raise Not_found ] in eval_key k sl | ["cnt"] -> eval_int_env "cnt" env | ["comment"] -> str_val (quote_escaped fam.comment) | ["digest"] -> eval_string_env "digest" env | ["divorce"] -> let s = match fam.divorce with [ Divorced _ -> "divorced" | NotDivorced -> "not_divorced" | Separated -> "separated" ] in str_val s | ["divorce"; s] -> let d = match fam.divorce with [ Divorced d -> Adef.od_of_codate d | _ -> None ] in eval_date_var d s | ["father" :: sl] -> eval_key (father cpl) sl | ["fsources"] -> str_val (quote_escaped fam.fsources) | ["marriage"; s] -> eval_date_var (Adef.od_of_codate fam.marriage) s | ["marriage_place"] -> str_val (quote_escaped fam.marriage_place) | ["marriage_src"] -> str_val (quote_escaped fam.marriage_src) | ["mrel"] -> str_val (eval_relation_kind fam.relation) | ["origin_file"] -> str_val (quote_escaped fam.origin_file) | ["parent" :: sl] -> let k = match get_env "cnt" env with [ Vint i -> let arr = parent_array cpl in let i = i - 1 in if i >= 0 && i < Array.length arr then arr.(i) else if i >= 0 && i < 1 && Array.length arr = 0 then ("", "", 0, Update.Create Neuter None, "") else raise Not_found | _ -> raise Not_found ] in eval_parent conf base env k sl | ["witness" :: sl] -> let k = match get_env "cnt" env with [ Vint i -> let i = i - 1 in if i >= 0 && i < Array.length fam.witnesses then fam.witnesses.(i) else if i >= 0 && i < 2 && Array.length fam.witnesses < 2 then ("", "", 0, Update.Create Neuter None, "") else raise Not_found | _ -> raise Not_found ] in eval_key k sl | [s] -> let v = extract_var "evar_" s in if v <> "" then match p_getenv (conf.env @ conf.henv) v with [ Some vv -> str_val (quote_escaped vv) | None -> str_val "" ] else let v = extract_var "bvar_" s in let v = if v = "" then extract_var "cvar_" s (* deprecated since 5.00 *) else v in if v <> "" then str_val (try List.assoc v conf.base_env with [ Not_found -> "" ]) else raise Not_found | _ -> raise Not_found ] and eval_date_var od s = str_val (eval_date_var_aux od s) and eval_date_var_aux od = fun [ "calendar" -> match od with [ Some (Dgreg _ Dgregorian) -> "gregorian" | Some (Dgreg _ Djulian) -> "julian" | Some (Dgreg _ Dfrench) -> "french" | Some (Dgreg _ Dhebrew) -> "hebrew" | _ -> "" ] | "day" -> match eval_date_field od with [ Some d -> if d.day = 0 then "" else string_of_int d.day | None -> "" ] | "month" -> match eval_date_field od with [ Some d -> if d.month = 0 then "" else match od with [ Some (Dgreg _ Dfrench) -> short_f_month d.month | _ -> string_of_int d.month ] | None -> "" ] | "oryear" -> match od with [ Some (Dgreg {prec = OrYear y} _) -> string_of_int y | Some (Dgreg {prec = YearInt y} _) -> string_of_int y | _ -> "" ] | "prec" -> match od with [ Some (Dgreg {prec = Sure} _) -> "sure" | Some (Dgreg {prec = About} _) -> "about" | Some (Dgreg {prec = Maybe} _) -> "maybe" | Some (Dgreg {prec = Before} _) -> "before" | Some (Dgreg {prec = After} _) -> "after" | Some (Dgreg {prec = OrYear _} _) -> "oryear" | Some (Dgreg {prec = YearInt _} _) -> "yearint" | _ -> "" ] | "text" -> match od with [ Some (Dtext s) -> s | _ -> "" ] | "year" -> match eval_date_field od with [ Some d -> string_of_int d.year | None -> "" ] | _ -> raise Not_found ] and eval_date_field = fun [ Some d -> match d with [ Dgreg d Dgregorian -> Some d | Dgreg d Djulian -> Some (Calendar.julian_of_gregorian d) | Dgreg d Dfrench -> Some (Calendar.french_of_gregorian d) | Dgreg d Dhebrew -> Some (Calendar.hebrew_of_gregorian d) | _ -> None ] | None -> None ] and eval_parent conf base env k = fun [ ["himher"] -> let s = match get_env "cnt" env with [ Vint 1 -> capitale (transl_nth conf "him/her" 0) | Vint 2 -> capitale (transl_nth conf "him/her" 1) | Vint n -> transl conf "him/her" | _ -> "???" ] in str_val s | sl -> eval_key k sl ] and eval_key (fn, sn, oc, create, var) = fun [ ["create"] -> str_val (if create <> Update.Link then "create" else "link") | ["create"; s] -> str_val (eval_create create s) | ["first_name"] -> str_val (quote_escaped fn) | ["occ"] -> str_val (if oc = 0 then "" else string_of_int oc) | ["surname"] -> str_val (quote_escaped sn) | x -> match x with [ ["sex"] -> obsolete "5.00" "sex" "create.sex" (str_val (eval_create create "sex")) | _ -> raise Not_found ] ] and eval_create c = fun [ "birth_day" -> match c with [ Update.Create _ (Some {ci_birth_date = Some (Dgreg dmy Dfrench)}) -> let dmy = Calendar.french_of_gregorian dmy in if dmy.day <> 0 then string_of_int dmy.day else "" | Update.Create _ (Some {ci_birth_date = Some (Dgreg {day = d} _)}) when d <> 0 -> string_of_int d | _ -> "" ] | "birth_month" -> match c with [ Update.Create _ (Some {ci_birth_date = Some (Dgreg dmy Dfrench)}) -> let dmy = Calendar.french_of_gregorian dmy in if dmy.month <> 0 then short_f_month dmy.month else "" | Update.Create _ (Some {ci_birth_date = Some (Dgreg {month = m} _)}) when m <> 0 -> string_of_int m | _ -> "" ] | "birth_place" -> match c with [ Update.Create _ (Some {ci_birth_place = pl}) -> quote_escaped pl | _ -> "" ] | "birth_year" -> match c with [ Update.Create _ (Some ci) -> match ci.ci_birth_date with [ Some (Dgreg dmy Dfrench) -> let dmy = Calendar.french_of_gregorian dmy in add_precision (string_of_int dmy.year) dmy.prec | Some (Dgreg {year = y; prec = p} _) -> add_precision (string_of_int y) p | Some _ -> "" | None -> if ci.ci_public then "p" else "" ] | _ -> "" ] | "death_day" -> match c with [ Update.Create _ (Some {ci_death_date = Some (Dgreg dmy Dfrench)}) -> let dmy = Calendar.french_of_gregorian dmy in if dmy.day <> 0 then string_of_int dmy.day else "" | Update.Create _ (Some {ci_death_date = Some (Dgreg {day = d} _)}) when d <> 0 -> string_of_int d | _ -> "" ] | "death_month" -> match c with [ Update.Create _ (Some {ci_death_date = Some (Dgreg dmy Dfrench)}) -> let dmy = Calendar.french_of_gregorian dmy in short_f_month dmy.month | Update.Create _ (Some {ci_death_date = Some (Dgreg {month = m} _)}) when m <> 0 -> string_of_int m | _ -> "" ] | "death_place" -> match c with [ Update.Create _ (Some {ci_death_place = pl}) -> quote_escaped pl | _ -> "" ] | "death_year" -> match c with [ Update.Create _ (Some {ci_death_date = Some (Dgreg dmy Dfrench)}) -> let dmy = Calendar.french_of_gregorian dmy in add_precision (string_of_int dmy.year) dmy.prec | Update.Create _ (Some {ci_death_date = Some (Dgreg {year = y; prec = p} _)}) -> add_precision (string_of_int y) p | Update.Create _ (Some {ci_death = death; ci_death_date = None}) -> match death with [ DeadDontKnowWhen -> "+" | NotDead -> "-" | _ -> "" ] | _ -> "" ] | "occupation" -> match c with [ Update.Create _ (Some {ci_occupation = occupation}) -> quote_escaped occupation | _ -> "" ] | "sex" -> match c with [ Update.Create Male _ -> "male" | Update.Create Female _ -> "female" | Update.Create Neuter _ -> "neuter" | _ -> "" ] | _ -> raise Not_found ] and add_precision s p = match p with [ Maybe -> "?" ^ s | Before -> "<" ^ s | After -> ">" ^ s | About -> "/" ^ s ^ "/" | _ -> s ] and eval_relation_kind = fun [ Married -> "marr" | NotMarried -> "not_marr" | Engaged -> "engaged" | NoSexesCheckNotMarried -> "nsck" | NoSexesCheckMarried -> "nsckm" | NoMention -> "no_ment" ] and eval_special_var conf base p = fun [ ["include_perso_header"] -> match p_getint conf.env "ip" with [ Some i -> let has_base_loop = try do { let _ = Util.create_topological_sort conf base in False } with [ Consang.TopologicalSortError p -> True ] in if has_base_loop then VVstring "" else do { let p = poi base (Adef.iper_of_int i) in Perso.interp_templ_with_menu (fun _ -> ()) "perso_header" conf base p; VVstring "" } | None -> VVstring "" ] | _ -> raise Not_found ] and eval_int_env var env = match get_env var env with [ Vint x -> str_val (string_of_int x) | _ -> raise Not_found ] and eval_string_env var env = match get_env var env with [ Vstring x -> str_val (quote_escaped x) | _ -> str_val "" ] ; (* print *) value print_foreach print_ast eval_expr = let rec print_foreach env ((fam, cpl, des) as fcd) _ s sl _ al = match [s :: sl] with [ ["child"] -> print_foreach_child env fcd al des.children s | ["witness"] -> print_foreach_witness env fcd al fam.witnesses s | ["parent"] -> print_foreach_parent env fcd al (parent_array cpl) s | _ -> raise Not_found ] and print_foreach_child env fcd al arr lab = for i = 0 to max 1 (Array.length arr) - 1 do { let env = [("cnt", Vint (i + 1)) :: env] in List.iter (print_ast env fcd) al } and print_foreach_witness env fcd al arr lab = for i = 0 to max 2 (Array.length arr) - 1 do { let env = [("cnt", Vint (i + 1)) :: env] in List.iter (print_ast env fcd) al } and print_foreach_parent env fcd al arr lab = for i = 0 to Array.length arr - 1 do { let env = [("cnt", Vint (i + 1)) :: env] in List.iter (print_ast env fcd) al } in print_foreach ; value print_update_fam conf base fcd digest = match p_getenv conf.env "m" with [ Some ("ADD_FAM" | "ADD_FAM_OK" | "ADD_PAR" | "MOD_FAM" | "MOD_FAM_OK" | "MRG_DUP_FAM_Y_N" | "MRG_FAM" | "MRG_FAM_OK" | "MRG_MOD_FAM_OK") -> let env = [("digest", Vstring digest)] in Hutil.interp conf base "updfam" {Templ.eval_var = eval_var conf base; Templ.eval_transl _ = Templ.eval_transl conf; Templ.eval_predefined_apply _ = raise Not_found; Templ.get_vother = get_vother; Templ.set_vother = set_vother; Templ.print_foreach = print_foreach} env fcd | _ -> incorrect_request conf ] ; value print_del1 conf base ifam = let title _ = let s = transl_nth conf "family/families" 0 in Wserver.wprint "%s" (capitale (transl_decline conf "delete" s)) in do { let p = match p_getint conf.env "ip" with [ Some ip -> poi base (Adef.iper_of_int ip) | None -> Gwdb.empty_person base (Adef.iper_of_int (-1)) ] in Perso.interp_notempl_with_menu title "perso_header" conf base p; tag "h2" begin title False; end; print_link_to_welcome conf True; Wserver.wprint "\n"; tag "form" "method=\"post\" action=\"%s\"" conf.command begin tag "p" begin Util.hidden_env conf; xtag "input" "type=\"hidden\" name=\"i\" value=\"%d\"" (Adef.int_of_ifam ifam); match p_getenv conf.env "ip" with [ Some ip -> xtag "input" "type=\"hidden\" name=\"ip\" value=\"%s\"" ip | None -> () ]; xtag "input" "type=\"hidden\" name=\"m\" value=\"DEL_FAM_OK\""; end; tag "p" begin xtag "input" "type=\"submit\" value=\"Ok\""; end; end; Wserver.wprint "\n"; trailer conf } ; value print_inv1 conf base p ifam1 ifam2 = let title _ = Wserver.wprint "%s" (capitale (transl_decline conf "invert" "")) in let cpl1 = foi base ifam1 in let cpl2 = foi base ifam2 in do { Perso.interp_notempl_with_menu title "perso_header" conf base p; Wserver.wprint "%s:" (capitale (transl conf "invert the order of the following families")); tag "ul" begin tag "li" begin Update.print_someone conf base (poi base (get_father cpl1)); Wserver.wprint " %s " (transl_nth conf "and" 0); Update.print_someone conf base (poi base (get_mother cpl1)); end; tag "li" begin Update.print_someone conf base (poi base (get_father cpl2)); Wserver.wprint " %s " (transl_nth conf "and" 0); Update.print_someone conf base (poi base (get_mother cpl2)); end; end; Wserver.wprint "\n"; tag "form" "method=\"post\" action=\"%s\"" conf.command begin tag "p" begin Util.hidden_env conf; xtag "input" "type=\"hidden\" name=\"i\" value=\"%d\"" (Adef.int_of_iper (get_key_index p)); xtag "input" "type=\"hidden\" name=\"f\" value=\"%d\"" (Adef.int_of_ifam ifam2); xtag "input" "type=\"hidden\" name=\"m\" value=\"INV_FAM_OK\""; end; tag "p" begin xtag "input" "type=\"submit\" value=\"Ok\""; end; end; Wserver.wprint "\n"; trailer conf } ; value print_add conf base = let (fath, moth, digest) = match p_getint conf.env "ip" with [ Some i -> let p = poi base (Adef.iper_of_int i) in let fath = if get_sex p = Male || get_sex p = Neuter && p_getenv conf.env "sex" = Some "M" then person_key base (get_key_index p) else ("", "", 0, Update.Create Male None, "") in let moth = if get_sex p = Female || get_sex p = Neuter && p_getenv conf.env "sex" = Some "F" then person_key base (get_key_index p) else ("", "", 0, Update.Create Female None, "") in let digest = string_of_int (Array.length (get_family p)) in (fath, moth, digest) | None -> (("", "", 0, Update.Create Male None, ""), ("", "", 0, Update.Create Female None, ""), "") ] in let fam = {marriage = Adef.codate_None; marriage_place = ""; marriage_src = ""; witnesses = [| |]; relation = Married; divorce = NotDivorced; comment = ""; origin_file = ""; fsources = default_source conf; fam_index = bogus_family_index} and cpl = couple conf.multi_parents fath moth and des = {children = [| |]} in print_update_fam conf base (fam, cpl, des) digest ; value print_add_parents conf base = match p_getint conf.env "ip" with [ Some i -> let p = poi base (Adef.iper_of_int i) in let fam = {marriage = Adef.codate_None; marriage_place = ""; marriage_src = ""; witnesses = [| |]; relation = Married; divorce = NotDivorced; comment = ""; origin_file = ""; fsources = default_source conf; fam_index = bogus_family_index} and cpl = couple conf.multi_parents ("", sou base (get_surname p), 0, Update.Create Neuter None, "") ("", "", 0, Update.Create Neuter None, "") and des = {children = [| (sou base (get_first_name p), sou base (get_surname p), get_occ p, Update.Link, "") |]} in print_update_fam conf base (fam, cpl, des) "" | _ -> incorrect_request conf ] ; value print_mod conf base = match p_getint conf.env "i" with [ Some i -> let sfam = string_family_of conf base (Adef.ifam_of_int i) in let digest = Update.digest_family sfam in print_update_fam conf base sfam digest | _ -> incorrect_request conf ] ; value print_del conf base = match p_getint conf.env "i" with [ Some i -> print_del1 conf base (Adef.ifam_of_int i) | _ -> incorrect_request conf ] ; value rec find_families ifam = fun [ [ifam1; ifam2 :: ifaml] -> if ifam2 = ifam then Some (ifam1, ifam2) else find_families ifam [ifam2 :: ifaml] | _ -> None ] ; value print_inv conf base = match (p_getint conf.env "i", p_getint conf.env "f") with [ (Some ip, Some ifam) -> let u = poi base (Adef.iper_of_int ip) in match find_families (Adef.ifam_of_int ifam) (Array.to_list (get_family u)) with [ Some (ifam1, ifam2) -> let p = poi base (Adef.iper_of_int ip) in print_inv1 conf base p ifam1 ifam2 | _ -> incorrect_request conf ] | _ -> incorrect_request conf ] ; value change_order conf base ip u ifam n = let rec loop i = fun [ [] -> if i = n then [ifam] else [] | [fam :: faml] -> if ifam = fam then if i = n then [ifam :: loop (i+1) [fam :: faml]] else loop i faml else if i = n then [ifam :: loop (i+1) [fam :: faml]] else [fam :: loop (i+1) faml] ] in loop 1 (Array.to_list (get_family u)) ; value print_change_order conf base = match (p_getint conf.env "i", p_getint conf.env "f", p_getint conf.env "n") with [ (Some ip, Some ifam, Some n) -> do { let p = poi base (Adef.iper_of_int ip) in let print_list arr diff_arr = Array.iteri (fun i ifam -> let fam = foi base ifam in let sp = spouse (get_key_index p) fam in let sp = poi base sp in tag "li" "%s" (if diff_arr.(i) then "style=\"background:pink\"" else "") begin Wserver.wprint "%s%s" (p_first_name base p) (if get_occ p = 0 then "" else "." ^ string_of_int (get_occ p)); Wserver.wprint " &"; Wserver.wprint "%s\n" (Date.short_marriage_date_text conf base fam p sp); Wserver.wprint "%s%s %s" (p_first_name base sp) (if get_occ sp = 0 then "" else "." ^ string_of_int (get_occ sp)) (p_surname base sp); Wserver.wprint "\n"; end) arr in let after = change_order conf base (get_key_index p) p (Adef.ifam_of_int ifam) n in let (before, after) = (get_family p, Array.of_list after) in let (bef_d, aft_d) = Diff.f before after in let title _ = Wserver.wprint "%s" (capitale (transl_decline conf "invert" "")) in Perso.interp_templ_with_menu title "perso_header" conf base p; Wserver.wprint "%s:" (capitale (transl conf "invert the order of the following families")); tag "table" "style=\"margin:1em\"" begin tag "tr" begin tag "td" begin tag "ul" "style=\"list-style-type:none\"" begin print_list before bef_d; end; end; tag "td" begin tag "ul" "style=\"list-style-type:none\"" begin print_list after aft_d; end; end; end; end; tag "form" "method=\"post\" action=\"%s\"" conf.command begin tag "p" begin Util.hidden_env conf; xtag "input" "type=\"hidden\" name=\"i\" value=\"%d\"" ip; xtag "input" "type=\"hidden\" name=\"f\" value=\"%d\"" ifam; xtag "input" "type=\"hidden\" name=\"n\" value=\"%d\"" n; xtag "input" "type=\"hidden\" name=\"m\" value=\"CHG_FAM_ORD_OK\""; end; tag "p" begin xtag "input" "type=\"submit\" value=\"Ok\""; end; end; Wserver.wprint "\n"; trailer conf } | _ -> incorrect_request conf ] ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/iochan.mli0000660000175200017530000000062312664543647023155 0ustar guillaumeguillaume(* $Id: iochan.mli,v 5.3 2007-01-19 01:53:16 ddr Exp $ *) (* Copyright (c) 2006-2007 INRIA *) type t = 'abstract; value openfile : string -> bool -> t; value input_binary_int : t -> int; value input_value_no_header : t -> 'a; value output_binary_int : t -> int -> unit; value output_value_no_header : t -> 'a -> unit; value seek : t -> int -> unit; value seek_end : t -> int; value close : t -> unit; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/advSearchOk.ml0000660000175200017530000003102312664543647023733 0ustar guillaumeguillaume(* camlp5r ./pa_html.cmo *) (* $Id: advSearchOk.ml,v 5.14 2007-09-12 09:58:44 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Config; open Def; open Gutil; open Gwdb; open Hutil; open Util; value get_number var key env = p_getint env (var ^ "_" ^ key); value reconstitute_date_dmy conf var = match get_number var "yyyy" conf.env with [ Some y -> match get_number var "mm" conf.env with [ Some m -> match get_number var "dd" conf.env with [ Some d -> if d >= 1 && d <= 31 && m >= 1 && m <= 12 then Some {day = d; month = m; year = y; prec = Sure; delta = 0} else None | None -> if m >= 1 && m <= 12 then Some {day = 0; month = m; year = y; prec = Sure; delta = 0} else None ] | None -> Some {day = 0; month = 0; year = y; prec = Sure; delta = 0} ] | None -> None ] ; value reconstitute_date conf var = match reconstitute_date_dmy conf var with [ Some d -> Some (Dgreg d Dgregorian) | None -> None ] ; value name_eq x y = Name.abbrev (Name.lower x) = Name.abbrev (Name.lower y); value rec skip_spaces x i = if i = String.length x then i else if String.unsafe_get x i = ' ' then skip_spaces x (i + 1) else i ; value rec skip_no_spaces x i = if i = String.length x then i else if String.unsafe_get x i != ' ' then skip_no_spaces x (i + 1) else i ; value string_incl x y = loop 0 where rec loop j_ini = if j_ini = String.length y then False else let rec loop1 i j = if i = String.length x then if j = String.length y then True else (String.unsafe_get y j = ' ' || String.unsafe_get y (j-1) = ' ') else if j < String.length y && String.unsafe_get x i = String.unsafe_get y j then loop1 (i + 1) (j + 1) else loop (skip_spaces y (skip_no_spaces y j_ini)) in loop1 0 j_ini ; value name_incl x y = let x = Name.abbrev (Name.lower x) in let y = Name.abbrev (Name.lower y) in string_incl x y ; value advanced_search conf base max_answers = let hs = Hashtbl.create 73 in let hd = Hashtbl.create 73 in let gets x = try Hashtbl.find hs x with [ Not_found -> let v = match p_getenv conf.env x with [ Some v -> v | None -> "" ] in do { Hashtbl.add hs x v; v } ] in let test x cmp = let y = gets x in if y = "" then True else cmp y in let test_auth p x cmp = let y = gets x in if y = "" then True else if fast_auth_age conf p then cmp y else False in let test_date p x df = let (d1, d2) = try Hashtbl.find hd x with [ Not_found -> let v = (reconstitute_date conf (x ^ "1"), reconstitute_date conf (x ^ "2")) in do { Hashtbl.add hd x v; v } ] in match (d1, d2) with [ (Some d1, Some d2) -> match df () with [ Some (Dgreg _ _ as d) when fast_auth_age conf p -> if CheckItem.strictly_before d d1 then False else if CheckItem.strictly_before d2 d then False else True | _ -> False ] | (Some d1, _) -> match df () with [ Some (Dgreg _ _ as d) when fast_auth_age conf p -> if CheckItem.strictly_before d d1 then False else True | _ -> False ] | (_, Some d2) -> match df () with [ Some (Dgreg _ _ as d) when fast_auth_age conf p -> if CheckItem.strictly_after d d2 then False else True | _ -> False ] | _ -> True ] in let test_marriage p x y = let (d1, d2) = try Hashtbl.find hd x with [ Not_found -> let v = (reconstitute_date conf (x ^ "1"), reconstitute_date conf (x ^ "2")) in do { Hashtbl.add hd x v; v } ] in let y = gets y in let test_date_place df = List.exists (fun ifam -> let fam = foi base ifam in let father = poi base (get_father fam) in let mother = poi base (get_mother fam) in if fast_auth_age conf father && fast_auth_age conf mother then if y = "" then df (Adef.od_of_codate (get_marriage fam)) else name_incl y (sou base (get_marriage_place fam)) && df (Adef.od_of_codate (get_marriage fam)) else False) (Array.to_list (get_family p)) in match (d1, d2) with [ (Some d1, Some d2) -> test_date_place (fun [ Some (Dgreg _ _ as d) -> if CheckItem.strictly_before d d1 then False else if CheckItem.strictly_before d2 d then False else True | _ -> False ]) | (Some d1, _) -> test_date_place (fun [ Some (Dgreg _ _ as d) when fast_auth_age conf p -> if CheckItem.strictly_before d d1 then False else True | _ -> False ]) | (_, Some d2) -> test_date_place (fun [ Some (Dgreg _ _ as d) when fast_auth_age conf p -> if CheckItem.strictly_after d d2 then False else True | _ -> False ]) | _ -> if y = "" then True else List.exists (fun ifam -> let fam = foi base ifam in let father = poi base (get_father fam) in let mother = poi base (get_mother fam) in if fast_auth_age conf father && fast_auth_age conf mother then name_incl y (sou base (get_marriage_place fam)) else False ) (Array.to_list (get_family p)) ] in let list = ref [] in let len = ref 0 in let test_person p = if test "sex" (fun [ "M" -> get_sex p = Male | "F" -> get_sex p = Female | _ -> True ]) && test_date p "birth" (fun () -> Adef.od_of_codate (get_birth p)) && test_date p "bapt" (fun () -> Adef.od_of_codate (get_baptism p)) && test_auth p "death" (fun d -> match (d, get_death p) with [ ("Dead", NotDead | DontKnowIfDead) -> False | ("Dead", _) -> True | ("NotDead", NotDead) -> True | ("NotDead", _) -> False | _ -> True ]) && test_date p "death" (fun () -> match get_death p with [ Death _ cd -> Some (Adef.date_of_cdate cd) | _ -> None ]) && test_date p "burial" (fun () -> match get_burial p with [ Buried cod -> Adef.od_of_codate cod | Cremated cod -> Adef.od_of_codate cod | _ -> None ]) && test "first_name" (fun x -> name_eq x (p_first_name base p)) && test "surname" (fun x -> name_eq x (p_surname base p)) && test "married" (fun [ "Y" -> get_family p <> [| |] | "N" -> get_family p = [| |] | _ -> True ]) && test_marriage p "marriage" "marriage_place" && test_auth p "birth_place" (fun x -> name_incl x (sou base (get_birth_place p))) && test_auth p "bapt_place" (fun x -> name_incl x (sou base (get_baptism_place p))) && test_auth p "death_place" (fun x -> name_incl x (sou base (get_death_place p))) && test_auth p "burial_place" (fun x -> name_incl x (sou base (get_burial_place p))) && test_auth p "occu" (fun x -> name_incl x (sou base (get_occupation p))) then do { list.val := [p :: list.val]; incr len; } else () in do { if gets "first_name" <> "" || gets "surname" <> "" then let (slist, _) = if gets "first_name" <> "" then Some.persons_of_fsname conf base base_strings_of_first_name (spi_find (persons_of_first_name base)) get_first_name (gets "first_name") else Some.persons_of_fsname conf base base_strings_of_surname (spi_find (persons_of_surname base)) get_surname (gets "surname") in let slist = List.fold_right (fun (_, _, l) sl -> l @ sl) slist [] in loop slist where rec loop = fun [ [] -> () | [ip :: l] -> if len.val > max_answers then () else do { test_person (pget conf base ip); loop l } ] else for i = 0 to nb_of_persons base - 1 do { if len.val > max_answers then () else test_person (pget conf base (Adef.iper_of_int i)) }; (List.rev list.val, len.val) } ; value print_result conf base max_answers (list, len) = let list = if len > max_answers then Util.reduce_list max_answers list else list in if len = 0 then Wserver.wprint "%s\n" (capitale (transl conf "no match")) else (* Construction de la table des sosa de la base *) let () = Perso.build_sosa_ht conf base in tag "ul" begin List.iter (fun p -> do { html_li conf; Perso.print_sosa conf base p True; Wserver.wprint "\n%s" (referenced_person_text conf base p); Wserver.wprint "%s" (Date.short_dates_text conf base p); stag "em" begin specify_homonymous conf base p False; end; }) list; if len > max_answers then do { html_li conf; Wserver.wprint "...\n"; } else (); end ; value searching_fields conf base = let test_string x = match p_getenv conf.env x with [ Some v -> if v <> "" then True else False | None -> False ] in let test_date x = match (reconstitute_date conf (x ^ "1"), reconstitute_date conf (x ^ "2")) with [ (Some d1, Some d2) -> True | (Some d1, _) -> True | (_, Some d2) -> True | _ -> False ] in let gets x = match p_getenv conf.env x with [ Some v -> v | None -> "" ] in let getd x = (reconstitute_date conf (x ^ "1"), reconstitute_date conf (x ^ "2")) in let sex = match gets "sex" with [ "M" -> 0 | "F" -> 1 | _ -> 2 ] in (* Fonction pour tester un simple champ texte (e.g: first_name). *) let string_field x search = if test_string x then search ^ " " ^ gets x else search in (* Fonction pour tester un "bloc date" (e.g: birth, birth_place). *) let date_field x y z search = let sep = if search <> "" then ", " else "" in let search = if test_string x || test_date y then search ^ sep ^ (transl_nth conf z sex) else search in let search = match getd y with [ (Some d1, Some d2) -> Printf.sprintf "%s %s %s %s %s" search (transl conf "between (date)") (Date.string_of_date conf d1) (transl conf "and") (Date.string_of_date conf d2) | (Some d1, _) -> Printf.sprintf "%s %s %s" search (transl conf "after (date)") (Date.string_of_date conf d1) | (_, Some d2) -> Printf.sprintf "%s %s %s" search (transl conf "before (date)") (Date.string_of_date conf d2) | _ -> search ] in let search = if test_string x then search ^ " " ^ transl conf "in (place)" ^ " " ^ gets x else search in search in let search = "" in let search = string_field "first_name" search in let search = string_field "surname" search in let search = date_field "birth_place" "birth" "born" search in let search = date_field "bapt_place" "bapt" "baptized" search in let search = date_field "marriage_place" "marriage" "married" search in let search = date_field "death_place" "death" "died" search in let search = date_field "burial_place" "burial" "buried" search in (* C'est vraiment pas très heureux ce test... *) let search = if not (test_string "marriage_place" || test_date "marriage") then let sep = if search <> "" then ", " else "" in if gets "married" = "Y" then search ^ sep ^ transl conf "having a family" else if gets "married" = "N" then search ^ sep ^ transl conf "having no family" else search else search in let search = let sep = if search <> "" then "," else "" in string_field "occu" (search ^ sep) in search ; value print conf base = let title _ = Wserver.wprint "%s" (capitale (transl conf "advanced request")) in let max_answers = match p_getint conf.env "max" with [ Some n -> n | None -> 100 ] in do { header conf title; tag "p" begin Wserver.wprint "%s: %s." (capitale (transl conf "searching all")) (searching_fields conf base); end; let list = advanced_search conf base max_answers in print_result conf base max_answers list; trailer conf; } ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/wiznotes.ml0000660000175200017530000005614612664543647023440 0ustar guillaumeguillaume(* camlp5r ./pa_html.cmo *) (* $Id: wiznotes.ml,v 5.54 2007-09-12 09:58:44 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Config; open Def; open Hutil; open Util; value dir conf base = Filename.concat (Util.base_path [] (conf.bname ^ ".gwb")) (Gwdb.base_wiznotes_dir base) ; value wzfile wddir wz = Filename.concat wddir (wz ^ ".txt"); value read_auth_file fname = let data = read_gen_auth_file fname in List.map (fun au -> let wizname = try let k = String.index au.au_info ':' in String.sub au.au_info 0 k with [ Not_found -> au.au_user ] in let (wizname, wizorder, islash) = try let i = String.index wizname '/' in let w1 = String.sub wizname 0 i in let l = String.length wizname in let w2 = String.sub wizname (i + 1) (l - i - 1) in (w1 ^ w2, w2 ^ w1, i) with [ Not_found -> (wizname, wizname, 0) ] in (au.au_user, (wizname, (wizorder, islash)))) data ; value read_wizard_notes fname = match try Some (Secure.open_in fname) with [ Sys_error _ -> None ] with [ Some ic -> let (date, len) = try let line = input_line ic in if line = "WIZNOTES" then let line = input_line ic in (float_of_string line, 0) else let s = Unix.stat fname in (s.Unix.st_mtime, Buff.store (Buff.mstore 0 line) '\n') with [ End_of_file | Failure _ -> (0., 0) ] in let rec loop len = match try Some (input_char ic) with [ End_of_file -> None ] with [ Some c -> loop (Buff.store len c) | None -> do { close_in ic; len } ] in let len = loop len in (Buff.get len, date) | None -> ("", 0.) ] ; value write_wizard_notes fname nn = if nn = "" then try Sys.remove fname with [ Sys_error _ -> () ] else match try Some (Secure.open_out fname) with [ Sys_error _ -> None ] with [ Some oc -> do { Printf.fprintf oc "WIZNOTES\n%.0f\n" (Unix.time ()); output_string oc nn; output_string oc "\n"; close_out oc } | None -> () ] ; value wiznote_date wfile = match try Some (Secure.open_in wfile) with [ Sys_error _ -> None ] with [ Some ic -> let date = try let line = input_line ic in if line = "WIZNOTES" then float_of_string (input_line ic) else raise Exit with [ End_of_file | Failure _ | Exit -> let s = Unix.stat wfile in s.Unix.st_mtime ] in do { close_in ic; (wfile, date) } | None -> ("", 0.) ] ; value print_wizards_by_alphabetic_order conf list = let wprint_elem (wz, (wname, (_, islash)), wfile, stm) = do { let tm = Unix.localtime stm in let with_link = conf.wizard && conf.user = wz || wfile <> "" || conf.manitou in if with_link then Wserver.wprint "" (commd conf) (Util.code_varenv wz) (fun _ -> Printf.sprintf ";d=%d-%02d-%02d,%02d:%02d:%02d" (tm.Unix.tm_year + 1900) (tm.Unix.tm_mon + 1) tm.Unix.tm_mday tm.Unix.tm_hour tm.Unix.tm_min tm.Unix.tm_sec) else (); if islash > 0 then let s1 = let islash = if wname.[islash-1] = ' ' then islash - 1 else islash in String.sub wname 0 islash in let s2 = String.sub wname islash (String.length wname - islash) in Wserver.wprint "%s (%s)" s2 s1 else Wserver.wprint "%s" wname; if with_link then Wserver.wprint "" else () } in let order (_, (_, (ord, _)), _, _) = ord in wprint_in_columns conf order wprint_elem list ; value print_wizards_by_date conf list = do { let sep_period_list = [(fun tm -> tm.Unix.tm_mon, fun tm -> let dmy = {year = tm.Unix.tm_year + 1900; month = tm.Unix.tm_mon + 1; day = 0; prec = Sure; delta = 0} in Wserver.wprint "%s" (capitale (Date.string_of_ondate conf (Dgreg dmy Dgregorian)))); (fun tm -> tm.Unix.tm_year, fun tm -> Wserver.wprint "%d" (tm.Unix.tm_year + 1900))] in let list = List.sort (fun (_, _, _, mtm1) (_, _, _, mtm2) -> compare mtm2 mtm1) list in Wserver.wprint "

    \n
    "; let _ = List.fold_left (fun (spl, prev) (wz, (wname, _), wfile, stm) -> do { let tm = Unix.localtime stm in let (new_item, spl) = match prev with [ Some prev_tm -> let (sep_period, _) = match spl with [ [sp :: _] -> sp | [] -> assert False ] in if sep_period tm <> sep_period prev_tm then do { Wserver.wprint "
    \n
    "; let spl = match spl with [ [_; (next_sp, _) :: _] -> if next_sp tm <> next_sp prev_tm then List.tl spl else spl | _ -> spl ] in (True, spl) } else (False, spl) | None -> (True, spl) ] in if new_item then if stm = 0.0 then Wserver.wprint "....." else match spl with [ [(_, disp_sep_period) :: _] -> disp_sep_period tm | [] -> () ] else (); if new_item then Wserver.wprint "
    \n
    \n" else (); let wname = if wname = "" then wz else wname in Wserver.wprint "%s%t" (if prev = None || new_item then "" else ",\n") (fun _ -> if conf.wizard && conf.user = wz || wfile <> "" then Printf.sprintf "%s" (commd conf) (Util.code_varenv wz) (fun _ -> Printf.sprintf ";d=%d-%02d-%02d,%02d:%02d:%02d" (tm.Unix.tm_year + 1900) (tm.Unix.tm_mon + 1) tm.Unix.tm_mday tm.Unix.tm_hour tm.Unix.tm_min tm.Unix.tm_sec) wname else wname); (spl, Some tm) }) (sep_period_list, None) list in (); Wserver.wprint "
    \n" }; value print_old_wizards conf list = if list = [] then () else do { tag "dl" begin tag "dd" "style=\"list-style-type:circle\"" begin Wserver.wprint "%s..." (transl_nth conf "and" 0); tag "dl" begin tag "dd" begin Mutil.list_iter_first (fun first wz -> do { if not first then Wserver.wprint ",\n" else (); stag "a" "href=\"%sm=WIZNOTES;f=%s\"" (commd conf) (Util.code_varenv wz) begin for i = 0 to String.length wz - 1 do { if wz.[i] = ' ' then Wserver.wprint " " else Wserver.wprint "%c" wz.[i]; }; end }) list; Wserver.wprint "\n"; end; end; end; end; } ; value wizard_list_from_dir conf base = match try Some (Sys.readdir (dir conf base)) with [ Sys_error _ -> None ] with [ Some arr -> List.fold_left (fun list fname -> if Filename.check_suffix fname ".txt" then let n = Filename.chop_extension fname in [n :: list] else list) [] (Array.to_list arr) | None -> [] ] ; value print_search_form conf from_wiz = tag "table" begin tag "tr" begin tag "td" "align=\"%s\"" conf.right begin tag "form" "method=\"get\" action=\"%s\"" conf.command begin tag "p" begin hidden_env conf; xtag "input" "type=\"hidden\" name=\"m\" value=\"WIZNOTES_SEARCH\""; xtag "input" "name=\"s\" size=\"30\" maxlength=\"40\" value=\"%s\"" (match p_getenv conf.env "s" with [ Some s -> quote_escaped s | None -> "" ]); if from_wiz <> "" then xtag "input" "type=\"hidden\" name=\"z\" value=\"%s\"" from_wiz else (); xtag "br"; tag "label" begin xtag "input" "type=\"checkbox\" name=\"c\" value=\"on\"%s" (match p_getenv conf.env "c" with [ Some "on" -> " checked=\"checked\"" | Some _ | None -> "" ]); Wserver.wprint "%s\n" (transl_nth conf "search/case sensitive" 1); end; xtag "input" "type=\"submit\" value=\"%s\"" (capitale (transl_nth conf "search/case sensitive" 0)); end; end; end; end; end ; value print_main conf base auth_file = let wiztxt = Util.translate_eval (transl_nth conf "wizard/wizards/friend/friends/exterior" 1) in let title _ = Wserver.wprint "%s - %s" (capitale wiztxt) (Util.translate_eval (transl_nth conf "note/notes" 1)) in let by_alphab_order = p_getenv conf.env "o" <> Some "H" in let wizdata = let list = read_auth_file auth_file in if by_alphab_order then List.sort (fun (_, (_, (o1, _))) (_, (_, (o2, _))) -> Gutil.alphabetic_order o1 o2) list else list in let wddir = dir conf base in do { Hutil.header_no_page_title conf title; (* mouais... *) print_link_to_welcome conf True; Wserver.wprint "

    "; title False; Wserver.wprint "

    \n"; let list = List.map (fun (wz, wname) -> let (wfile, wnote) = wiznote_date (wzfile wddir wz) in (wz, wname, wfile, wnote)) wizdata in let old_list = let list = wizard_list_from_dir conf base in List.filter (fun n -> not (List.mem_assoc n wizdata)) list in if by_alphab_order then do { tag "p" begin Wserver.wprint "%d %s\n" (List.length wizdata) wiztxt conf.xhs; Wserver.wprint "\n"; Wserver.wprint "%s " (capitale (transl conf "click")); Wserver.wprint "%s\n" (commd conf) (transl conf "here"); Wserver.wprint "%s" (transl conf "for the list ordered by the date of the last modification"); Wserver.wprint ".\n"; end; print_wizards_by_alphabetic_order conf list; } else do { tag "p" begin Wserver.wprint "%d %s\n" (List.length wizdata) wiztxt; end; print_wizards_by_date conf list; }; if by_alphab_order then do { print_old_wizards conf old_list; print_search_form conf ""; } else (); trailer conf } ; value wizard_page_title conf wz wizname h = Wserver.wprint "%s" wizname ; value print_whole_wiznote conf base auth_file wz wfile (s, date) ho = do { let wizname = let wizdata = read_auth_file auth_file in try fst (List.assoc wz wizdata) with [ Not_found -> wz ] in let edit_opt = let can_edit = conf.wizard && conf.user = wz || conf.manitou in Some (can_edit, "WIZNOTES", code_varenv wz) in let title = wizard_page_title conf wz wizname in header_no_page_title conf title; print_link_to_welcome conf True; Wserver.wprint "

    "; title False; Wserver.wprint "

    \n"; match Util.open_etc_file "summary" with [ Some ic -> Templ.copy_from_templ conf [] ic | None -> () ]; tag "table" "border=\"0\" width=\"100%%\"" begin tag "tr" begin tag "td" begin let s = string_with_macros conf [] s in let s = let wi = {Wiki.wi_mode = "NOTES"; Wiki.wi_cancel_links = conf.cancel_links; Wiki.wi_file_path = Notes.file_path conf base; Wiki.wi_person_exists = person_exists conf base; Wiki.wi_always_show_link = conf.wizard || conf.friend} in Wiki.html_with_summary_of_tlsw conf wi edit_opt s in let s = match ho with [ Some (case_sens, h) -> html_highlight case_sens h s | None -> s ] in Wserver.wprint "%s\n" (if conf.pure_xhtml then Util.check_xhtml s else s); end; end; end; if Sys.file_exists wfile then do { let tm = Unix.localtime date in let dmy = {day = tm.Unix.tm_mday; month = tm.Unix.tm_mon + 1; year = 1900 + tm.Unix.tm_year; prec = Sure; delta = 0} in tag "p" begin Wserver.wprint "(%s %02d:%02d)\n" (Date.string_of_ondate conf (Dgreg dmy Dgregorian)) tm.Unix.tm_hour tm.Unix.tm_min; end } else (); match p_getenv conf.env "m" with [ Some "WIZNOTES_SEARCH" -> print_search_form conf wz | Some _ | None -> () ]; trailer conf }; value print_part_wiznote conf base wz s cnt0 = let title = wz in do { Hutil.header_no_page_title conf (fun _ -> Wserver.wprint "%s" title); let s = string_with_macros conf [] s in let lines = Wiki.extract_sub_part s cnt0 in let lines = if cnt0 = 0 then [title; "

    " :: lines] else lines in let file_path = Notes.file_path conf base in let can_edit = conf.wizard && conf.user = wz || conf.manitou in let wi = {Wiki.wi_mode = "NOTES"; Wiki.wi_cancel_links = conf.cancel_links; Wiki.wi_file_path = file_path; Wiki.wi_person_exists = person_exists conf base; Wiki.wi_always_show_link = conf.wizard || conf.friend} in Wiki.print_sub_part conf wi can_edit "WIZNOTES" (code_varenv wz) cnt0 lines; Hutil.trailer conf; } ; value wizard_auth_file_name conf = match (p_getenv conf.base_env "wizard_descr_file", p_getenv conf.base_env "wizard_passwd_file") with [ (Some "" | None, Some "" | None) -> "" | (Some auth_file, _) -> auth_file | (_, Some auth_file) -> auth_file ] ; value print conf base = let auth_file = wizard_auth_file_name conf in if auth_file = "" then incorrect_request conf else let f = (* backward compatibility *) match p_getenv conf.env "f" with [ None -> p_getenv conf.env "v" | x -> x ] in match f with [ Some wz -> let wz = Filename.basename wz in let wfile = wzfile (dir conf base) wz in let (s, date) = read_wizard_notes wfile in match p_getint conf.env "v" with [ Some cnt0 -> print_part_wiznote conf base wz s cnt0 | None -> print_whole_wiznote conf base auth_file wz wfile (s, date) None ] | None -> print_main conf base auth_file ] ; value print_mod conf base = let auth_file = match (p_getenv conf.base_env "wizard_descr_file", p_getenv conf.base_env "wizard_passwd_file") with [ (Some "" | None, Some "" | None) -> "" | (Some auth_file, _) -> auth_file | (_, Some auth_file) -> auth_file ] in if auth_file = "" then incorrect_request conf else match p_getenv conf.env "f" with [ Some wz -> let wz = Filename.basename wz in let can_edit = conf.wizard && conf.user = wz || conf.manitou in if can_edit then let title = wizard_page_title conf wz wz in let wfile = wzfile (dir conf base) wz in let (s, _) = read_wizard_notes wfile in Wiki.print_mod_view_page conf True "WIZNOTES" wz title [] s else incorrect_request conf | None -> incorrect_request conf ] ; value print_view conf base = let auth_file = match (p_getenv conf.base_env "wizard_descr_file", p_getenv conf.base_env "wizard_passwd_file") with [ (Some "" | None, Some "" | None) -> "" | (Some auth_file, _) -> auth_file | (_, Some auth_file) -> auth_file ] in if auth_file = "" then incorrect_request conf else match p_getenv conf.env "f" with [ Some wz -> let wz = Filename.basename wz in let title = wizard_page_title conf wz wz in let wfile = wzfile (dir conf base) wz in let (s, _) = read_wizard_notes wfile in Wiki.print_mod_view_page conf False "WIZNOTES" wz title [] s | None -> incorrect_request conf ] ; value commit_wiznotes conf base wz s = let wddir = dir conf base in let fname = wzfile wddir wz in do { try Unix.mkdir wddir 0o755 with [ Unix.Unix_error _ _ _ -> () ]; write_wizard_notes fname s; let pg = NotesLinks.PgWizard wz in Notes.update_notes_links_db conf pg s; } ; value print_mod_ok conf base = let auth_file = match (p_getenv conf.base_env "wizard_descr_file", p_getenv conf.base_env "wizard_passwd_file") with [ (Some "" | None, Some "" | None) -> "" | (Some auth_file, _) -> auth_file | (_, Some auth_file) -> auth_file ] in if auth_file = "" then incorrect_request conf else let fname = fun [ Some f -> f | None -> "nobody" ] in let edit_mode wz = if conf.wizard && conf.user = wz || conf.manitou then Some "WIZNOTES" else None in let mode = "NOTES" in let read_string wz = ([], fst (read_wizard_notes (wzfile (dir conf base) wz))) in let commit = commit_wiznotes conf base in let string_filter = string_with_macros conf [] in let file_path = Notes.file_path conf base in let wi = {Wiki.wi_mode = mode; Wiki.wi_cancel_links = conf.cancel_links; Wiki.wi_file_path = file_path; Wiki.wi_person_exists = person_exists conf base; Wiki.wi_always_show_link = conf.wizard || conf.friend} in Wiki.print_mod_ok conf wi edit_mode fname read_string commit string_filter False ; value wizard_denying wddir = let fname = Filename.concat wddir "connected.deny" in match try Some (Secure.open_in fname) with [ Sys_error _ -> None ] with [ Some ic -> loop [] where rec loop list = match try Some (input_line ic) with [ End_of_file -> None ] with [ Some wname -> loop [wname :: list] | None -> do { close_in ic; List.rev list } ] | None -> [] ] ; value print_connected_wizard conf first wddir wz tm_user = do { let (wfile, stm) = wiznote_date (wzfile wddir wz) in let tm = Unix.localtime stm in if wfile <> "" then stag "a" "href=\"%sm=WIZNOTES;f=%s%t\"" (commd conf) (Util.code_varenv wz) (fun _ -> Printf.sprintf ";d=%d-%02d-%02d,%02d:%02d:%02d" (tm.Unix.tm_year + 1900) (tm.Unix.tm_mon + 1) tm.Unix.tm_mday tm.Unix.tm_hour tm.Unix.tm_min tm.Unix.tm_sec) begin Wserver.wprint "%s" wz; end else Wserver.wprint "%s" wz; Wserver.wprint " "; stag "a" "href=\"%sm=HIST;k=20;wiz=%s\" style=\"text-decoration:none\"" (commd conf) (Util.code_varenv wz) begin Wserver.wprint "(*)"; end; let d = conf.ctime -. tm_user in if d = 0.0 then () else do { Wserver.wprint " - %.0f s" d; if first then do { Wserver.wprint " "; stag "span" "style=\"font-size:80%%\"" begin Wserver.wprint "(%s)" (transl conf "since the last click"); end; } else (); }; }; value do_connected_wizards conf base (_, _, _, wl) = do { let title _ = Wserver.wprint "%s" (capitale (transl_nth conf "wizard/wizards/friend/friends/exterior" 1)) in header conf title; print_link_to_welcome conf True; let wddir = dir conf base in let denying = wizard_denying wddir in let wl = if not (List.mem_assoc conf.user wl) then [(conf.user, conf.ctime) :: wl] else wl in let wl = List.sort (fun (_, tm1) (_, tm2) -> compare tm1 tm2) wl in let is_visible = not (List.mem conf.user denying) in tag "ul" begin let (not_everybody, _) = List.fold_left (fun (not_everybody, first) (wz, tm_user) -> if wz <> conf.user && List.mem wz denying && not conf.manitou then (True, first) else do { tag "li" "style=\"list-style-type:%s\"" (if wz = conf.user && not is_visible || conf.manitou && List.mem wz denying then "circle" else "disc") begin print_connected_wizard conf first wddir wz tm_user; if wz = conf.user then do { Wserver.wprint " :\n%s;" (transl_nth conf "you are visible/you are not visible" (if is_visible then 0 else 1)); Wserver.wprint " %s %s%s%s %s" (transl conf "click") (Printf.sprintf "" (commd conf) (if is_visible then 0 else 1)) (transl conf "here") "" (transl conf "to change"); Wserver.wprint "."; } else (); Wserver.wprint "\n"; end; (not_everybody, False) }) (False, True) wl in if not_everybody then tag "li" begin Wserver.wprint "..."; end else (); end; trailer conf; }; value connected_wizards conf base = match conf.n_connect with [ Some x -> do_connected_wizards conf base x | None -> incorrect_request conf ] ; value do_change_wizard_visibility conf base x set_vis = do { let wddir = dir conf base in let denying = wizard_denying wddir in let is_visible = not (List.mem conf.user denying) in if not set_vis && not is_visible || set_vis && is_visible then () else do { let tmp_file = Filename.concat wddir "1connected.deny" in let oc = Secure.open_out tmp_file in let found = List.fold_left (fun found wz -> if wz = conf.user && set_vis then True else do { Printf.fprintf oc "%s\n" wz; found }) False denying in if not found && not set_vis then Printf.fprintf oc "%s\n" conf.user else (); close_out oc; let file = Filename.concat wddir "connected.deny" in Mutil.remove_file file; Sys.rename tmp_file file; }; do_connected_wizards conf base x }; value change_wizard_visibility conf base = match (conf.n_connect, p_getint conf.env "v") with [ (Some x, Some vis) -> do_change_wizard_visibility conf base x (vis <> 0) | _ -> incorrect_request conf ] ; (* searching *) value search_text conf base s = let s = if s = "" then " " else s in let case_sens = p_getenv conf.env "c" = Some "on" in let list = let list = wizard_list_from_dir conf base in let list = List.sort compare list in match p_getenv conf.env "z" with [ Some "" | None -> list | Some wz -> loop list where rec loop = fun [ [wz1 :: list] -> if wz = wz1 then list else loop list | [] -> [] ] ] in let wizo = loop list where rec loop = fun [ [] -> None | [wz :: list] -> let wz = Filename.basename wz in let wfile = wzfile (dir conf base) wz in let (nt, dt) = read_wizard_notes wfile in if in_text case_sens s nt then Some (wz, wfile, nt, dt) else loop list ] in match wizo with [ Some (wz, wf, nt, dt) -> let auth_file = wizard_auth_file_name conf in print_whole_wiznote conf base auth_file wz wf (nt, dt) (Some (case_sens, s)) | None -> print conf base ] ; value print_search conf base = match try Some (List.assoc "s" conf.env) with [ Not_found -> None ] with [ Some s -> search_text conf base (Wserver.gen_decode False s) | None -> print conf base ] ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/mostdesc.ml0000660000175200017530000001002412664543647023360 0ustar guillaumeguillaume(* $Id: mostdesc.ml,v 5.9 2007-01-19 01:53:16 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Def; open Gwdb; value print_result base tab = let m_val = ref Num.zero in let m_list = ref [] in loop () where rec loop () = do { m_val.val := Num.zero; m_list.val := []; for i = 0 to Array.length tab - 1 do { if Num.eq tab.(i) Num.zero then () else if Num.gt tab.(i) m_val.val then do { m_val.val := tab.(i); m_list.val := [i]; } else if Num.eq tab.(i) m_val.val then m_list.val := [i :: m_list.val] else () }; if m_list.val <> [] then do { m_list.val := let f i1 i2 = let p1 = poi base (Adef.iper_of_int i1) in let p2 = poi base (Adef.iper_of_int i2) in let s1 = Name.abbrev (Name.lower (p_surname base p1)) in let s2 = Name.abbrev (Name.lower (p_surname base p2)) in if s1 < s2 then -1 else if s1 > s2 then 1 else let f1 = Name.abbrev (Name.lower (p_first_name base p1)) in let f2 = Name.abbrev (Name.lower (p_first_name base p2)) in compare f1 f2 in List.sort f m_list.val; Num.print print_string "." m_val.val; print_newline (); List.iter (fun i -> let p = poi base (Adef.iper_of_int i) in do { Printf.printf "- %s.%d %s\n" (p_first_name base p) (get_occ p) (p_surname base p); flush stdout; }) m_list.val; List.iter (fun i -> tab.(i) := Num.zero) m_list.val; loop () } else () } ; value most_desc base p = let _ = load_ascends_array base in let _ = load_couples_array base in let id = Consang.topological_sort base poi in let module Pq = Pqueue.Make (struct type t = iper; value leq x y = id.(Adef.int_of_iper x) > id.(Adef.int_of_iper y); end) in (* let _ = base.data.persons.array () in *) let _ = load_descends_array base in let _ = load_unions_array base in let tab = Array.make (nb_of_persons base) Num.zero in let entered = Array.make (nb_of_persons base) False in let q = ref Pq.empty in do { q.val := Pq.add (get_key_index p) q.val; tab.(Adef.int_of_iper (get_key_index p)) := Num.one; while not (Pq.is_empty q.val) do { let (ip, nq) = Pq.take q.val in q.val := nq; let u = uoi base ip in let n = tab.(Adef.int_of_iper ip) in for i = 0 to Array.length (get_family u) - 1 do { let des = doi base (get_family u).(i) in for j = 0 to Array.length (get_children des) - 1 do { let ip = (get_children des).(j) in tab.(Adef.int_of_iper ip) := Num.add tab.(Adef.int_of_iper ip) n; if not entered.(Adef.int_of_iper ip) then do { q.val := Pq.add ip q.val; entered.(Adef.int_of_iper ip) := True; } else (); } } }; print_result base tab; } ; value bname = ref ""; value p_fname = ref ""; value p_num = ref 0; value p_sname = ref ""; value usage = "usage: " ^ Sys.argv.(0) ^ " " ; value speclist = []; value main () = let cnt = ref 0 in do { Argl.parse speclist (fun s -> do { match cnt.val with [ 0 -> bname.val := s | 1 -> p_fname.val := s | 2 -> p_num.val := int_of_string s | 3 -> p_sname.val := s | _ -> raise (Arg.Bad "too many parameters") ]; incr cnt; }) usage; if cnt.val <> 4 then do { Printf.eprintf "Missing parameter\n"; Printf.eprintf "Use option -help for usage\n"; flush stderr; exit 2 } else (); Secure.set_base_dir (Filename.dirname bname.val); let base = Gwdb.open_base bname.val in match Gwdb.person_of_key base p_fname.val p_sname.val p_num.val with [ Some ip -> most_desc base (poi base ip) | None -> raise Not_found ] } ; Printexc.catch main (); geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/util.ml0000660000175200017530000034052112664543647022524 0ustar guillaumeguillaume(* camlp5r ./pa_lock.cmo ./pa_html.cmo *) (* $Id: util.ml,v 5.130 2007-09-12 09:58:44 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Config; open Def; open Gutil; open Gwdb; open Mutil; open Printf; value is_hide_names conf p = if conf.hide_names || get_access p = Private then True else False ; value sharelib = List.fold_right Filename.concat [Gwlib.prefix; "share"] "geneweb" ; value add_lang_path = Secure.add_lang_path; value add_doc_path = Secure.add_doc_path; value set_base_dir = Secure.set_base_dir; add_lang_path sharelib; add_lang_path Filename.current_dir_name; value cnt_dir = ref Filename.current_dir_name; value images_url = ref ""; value search_in_path p s = loop (p ()) where rec loop = fun [ [d :: dl] -> let f = Filename.concat d s in if Sys.file_exists f then f else loop dl | [] -> s ] ; value search_in_lang_path = search_in_path Secure.lang_path; value search_in_doc_path = search_in_path Secure.doc_path; (* Internationalization *) value start_with_vowel s = if String.length s > 0 then match Char.lowercase s.[0] with [ 'a' | 'e' | 'i' | 'o' | 'u' -> True | _ -> False ] else False ; value start_with_hi_i s = if String.length s > 0 then match Char.lowercase s.[0] with [ 'i' -> True | 'h' -> String.length s > 1 && s.[1] = 'i' | _ -> False ] else False ; value match_begin s t = loop 0 0 where rec loop i j = if i >= String.length s || j >= String.length t then True else if s.[i] = t.[j] then loop (i + 1) (j + 1) else False ; value amp_capitalize capitale s = if String.length s <= 1 then s else if match_begin s "¡" then "¡" ^ capitale (String.sub s 7 (String.length s - 7)) else if match_begin s "æ" then "Æ" ^ String.sub s 7 (String.length s - 7) else match s.[1] with [ 'a'..'z' -> "&" ^ String.make 1 (Char.chr (Char.code s.[1] - Char.code 'a' + Char.code 'A')) ^ String.sub s 2 (String.length s - 2) | _ -> s ] ; value rec capitale_iso_8859_1 s = if String.length s = 0 then "" else match s.[0] with [ 'a'..'z' | 'à'..'ö' | 'ø'..'ý' -> String.make 1 (Char.chr (Char.code s.[0] - Char.code 'a' + Char.code 'A')) ^ String.sub s 1 (String.length s - 1) | '&' -> amp_capitalize capitale_iso_8859_1 s | _ -> s ] ; value rec capitale_utf_8 s = if String.length s = 0 then "" else let c = s.[0] in if c = '&' then amp_capitalize capitale_utf_8 s else if c = '<' then loop 1 where rec loop i = if i = String.length s then s else if s.[i] = '>' then let s1 = String.sub s (i + 1) (String.length s - i - 1) in String.sub s 0 (i + 1) ^ capitale_utf_8 s1 else loop (i + 1) else if Char.code c < 0b10000000 then String.capitalize s else if String.length s = 1 then s else match Char.code c with [ 0xC3 -> let c1 = Char.uppercase (Char.chr (Char.code s.[1] + 0x40)) in sprintf "%c%c%s" c (Char.chr (Char.code c1 - 0x40)) (String.sub s 2 (String.length s - 2)) | 0xC5 when Char.code s.[1] = 0x93 -> (* oe *) sprintf "%c%c%s" c (Char.chr 0x92) (String.sub s 2 (String.length s - 2)) | 0xD0 when Char.code s.[1] >= 0xB0 -> (* cyrillic lowercase *) let c1 = Char.chr (Char.code s.[1] - 0xB0 + 0x90) in sprintf "%c%c%s" c c1 (String.sub s 2 (String.length s - 2)) | 0xD1 when Char.code s.[1] < 0x90 -> (* cyrillic lowercase again *) let c1 = Char.chr (Char.code s.[1] - 0x80 + 0xA0) in sprintf "%c%c%s" (Char.chr 0xD0) c1 (String.sub s 2 (String.length s - 2)) | _ -> s ] ; value index_of_next_char s i = if Mutil.utf_8_db.val then min (String.length s) (i + max 1 (Name.nbc s.[i])) else i + 1 ; value capitale s = if Mutil.utf_8_db.val then capitale_utf_8 s else capitale_iso_8859_1 s ; type format2 'a 'b = format4 'a unit string 'b; value fcapitale (a : format4 'a 'b 'c 'd) : format4 'a 'b 'c 'd = Scanf.format_from_string (capitale (string_of_format a)) a ; value nth_field_abs w n = let rec start i n = if n = 0 then i else if i < String.length w then match w.[i] with [ '<' -> start (i + 2) n | '/' -> start (i + 1) (n - 1) | _ -> start (i + 1) n ] else i in let rec stop i = if i < String.length w then match w.[i] with [ '<' -> stop (i + 2) | '/' -> i | _ -> stop (i + 1) ] else i in let i1 = start 0 n in let i2 = stop i1 in (i1, i2) ; value nth_field w n = let (i1, i2) = nth_field_abs w n in let (i1, i2) = if i2 = i1 then nth_field_abs w 0 else (i1, i2) in String.sub w i1 (i2 - i1) ; value tnf s = "[" ^ s ^ "]"; value transl conf w = try Hashtbl.find conf.lexicon w with [ Not_found -> tnf w ] ; value transl_nth conf w n = try nth_field (Hashtbl.find conf.lexicon w) n with [ Not_found -> tnf (nth_field w n) ] ; value plus_decl s = match rindex s '+' with [ Some i -> if i > 0 && s.[i - 1] = ' ' then let start = String.sub s 0 (i - 1) in let decl = String.sub s (i - 1) (String.length s - (i - 1)) in Some (start, decl) else None | None -> None ] ; value gen_decline wt s = let s1 = if s = "" then "" else if wt = "" then s else " " ^ s in let len = String.length wt in if rindex wt '/' <> None then match rindex wt '/' with [ Some i -> (* special case for Spanish *) if String.length s > 0 && start_with_hi_i s then nth_field wt 1 ^ Mutil.decline 'n' s else nth_field wt 0 ^ Mutil.decline 'n' s1 | None -> wt ^ Mutil.decline 'n' s1 ] else if len >= 3 && wt.[len - 3] = ':' && wt.[len - 1] = ':' then let start = String.sub wt 0 (len - 3) in start ^ Mutil.decline wt.[len - 2] s else match plus_decl wt with [ Some (start, " +before") -> if s = "" then start else Mutil.decline 'n' s ^ " " ^ start | _ -> wt ^ Mutil.decline 'n' s1 ] ; value transl_decline conf w s = Translate.eval (gen_decline (transl conf w) s) ; value gen_decline2 wt s1 s2 = let string_of = fun [ '1' -> Some s1 | '2' -> Some s2 | _ -> None ] in let len = String.length wt in let rec loop i = if i = len then "" else let (s, i) = match wt.[i] with [ '%' when i + 1 < len -> match string_of wt.[i + 1] with [ Some s -> (s, i + 1) | None -> ("%", i) ] | ':' when i + 4 < len && wt.[i + 2] = ':' && wt.[i + 3] = '%' -> let c = wt.[i + 1] in match string_of wt.[i + 4] with [ Some s -> (decline c s, i + 4) | None -> (":", i) ] | '[' -> try let j = String.index_from wt i ']' in if j + 2 < len && wt.[j + 1] = '%' then match string_of wt.[j + 2] with [ Some s -> let s = if start_with_vowel s then String.make 1 wt.[j - 1] ^ s else String.sub wt (i + 1) (j - i - 2) ^ " " ^ s in (s, j + 2) | None -> raise Not_found ] else raise Not_found with [ Not_found -> ("[", i) ] | c -> (String.make 1 c, i) ] in s ^ loop (i + 1) in (*surtout pas ! Translate.eval*) (loop 0) ; value transl_a_of_b conf x y = gen_decline2 (transl_nth conf "%1 of %2" 0) x y ; value transl_a_of_gr_eq_gen_lev conf x y = gen_decline2 (transl_nth conf "%1 of %2" 1) x y ; value check_format ini_fmt (r : string) = let s = string_of_format ini_fmt in let rec loop i j = if i < String.length s - 1 && j < String.length r - 1 then match (s.[i], s.[i + 1], r.[j], r.[j + 1]) with [ ('%', x, '%', y) -> if x = y then loop (i + 2) (j + 2) else None | ('%', _, _, _) -> loop i (j + 1) | (_, _, '%', _) -> loop (i + 1) j | _ -> loop (i + 1) (j + 1) ] else if i < String.length s - 1 then if s.[i] = '%' then None else loop (i + 1) j else if j < String.length r - 1 then if r.[j] = '%' then None else loop i (j + 1) else Some (Scanf.format_from_string r ini_fmt) in loop 0 0 ; value valid_format ini_fmt r = match check_format ini_fmt r with [ Some fmt -> fmt | None -> Scanf.format_from_string (tnf r) ini_fmt ] ; value cftransl conf fmt = let fmt = transl conf fmt in let rec loop i = fun [ [] -> String.sub fmt i (String.length fmt - i) | [a :: al] as gal -> if i + 4 < String.length fmt && fmt.[i] = ':' && fmt.[i + 2] = ':' && fmt.[i + 3] = '%' && fmt.[i + 4] = 's' then decline fmt.[i + 1] a ^ loop (i + 5) al else if i + 1 < String.length fmt && fmt.[i] = '%' && fmt.[i + 1] = 's' then nominative a ^ loop (i + 2) al else if i < String.length fmt then String.make 1 fmt.[i] ^ loop (i + 1) gal else "" ] in loop 0 ; value ftransl conf s = valid_format s (transl conf (string_of_format s)); value ftransl_nth conf s p = valid_format s (transl_nth conf (string_of_format s) p) ; value fdecline conf w s = valid_format w (gen_decline (string_of_format w) s) ; value translate_eval s = Translate.eval (nominative s); (* *) value escape_amp s = loop 0 0 where rec loop i len = if i = String.length s then Buff.get len else if s.[i] = '&' then loop (i + 1) (Buff.mstore len "&") else loop (i + 1) (Buff.store len s.[i]) ; value get_referer conf = let referer = Wserver.extract_param "referer: " '\n' conf.request in escape_amp referer ; value begin_centered conf = Wserver.wprint "
    \n" conf.border; value end_centered _ = Wserver.wprint "
    \n"; value html_br conf = Wserver.wprint "\n" conf.xhs; value html_p conf = do { Wserver.wprint "

    "; Wserver.wprint "\n"; }; value html_li conf = do { Wserver.wprint "

  • "; Wserver.wprint "\n"; }; value nl () = Wserver.wprint "\013\010"; value week_day_txt = let txt = [| "Sun"; "Mon"; "Tue"; "Wed"; "Thu"; "Fri"; "Sat" |] in fun i -> let i = if i < 0 || i >= Array.length txt then 0 else i in txt.(i) ; value month_txt = let txt = [| "Jan"; "Feb"; "Mar"; "Apr"; "May"; "Jun"; "Jul"; "Aug"; "Sep"; "Oct"; "Nov"; "Dec" |] in fun i -> let i = if i < 0 || i >= Array.length txt then 0 else i in txt.(i) ; value string_of_ctime conf = let lt = Unix.gmtime conf.ctime in sprintf "%s, %d %s %d %02d:%02d:%02d GMT" (week_day_txt lt.Unix.tm_wday) lt.Unix.tm_mday (month_txt lt.Unix.tm_mon) (1900 + lt.Unix.tm_year) lt.Unix.tm_hour lt.Unix.tm_min lt.Unix.tm_sec ; value html conf = let charset = if conf.charset = "" then "utf-8" else conf.charset in do { if not conf.cgi then do { Wserver.http ""; Wserver.wprint "Server: GeneWeb/%s" Version.txt; nl (); } else (); Wserver.wprint "Date: %s" (string_of_ctime conf); nl (); Wserver.wprint "Connection: close"; nl (); Wserver.wprint "Content-type: %s; charset=%s" (if conf.pure_xhtml then "application/xhtml+xml" else "text/html") charset; nl (); } ; value unauthorized conf auth_type = do { if not conf.cgi then do { Wserver.http "401 Unauthorized"; Wserver.wprint "WWW-Authenticate: Basic realm=\"%s\"" auth_type; nl () } else (); Wserver.wprint "Content-type: text/html; charset=%s" conf.charset; nl (); nl (); Wserver.wprint "Access failed\n"; Wserver.wprint "

    Access failed

    \n"; Wserver.wprint "
    • %s
    \n" auth_type; Wserver.wprint "\n"; } ; (* ************************************************************************** *) (* [Fonc] redirect_HTML : config -> string -> string -> unit *) (** [Description] : Effecture une redirection HTML. C'est le navigateur qui fait la redirection en interprétant directement le header envoyé et pas le serveur qui fait la redirection. La redirection est faite sur la page url. [Args] : - conf : configuration de la base - status_code : code de redirection - url : url de redirection [Retour] : string [Rem] : Exporté en clair hors de ce module. *) (* ************************************************************************** *) value redirect_HTML conf status_code url = (* TODO, passer un type pour la redirection et un mecanisme pour éviter les boucles de redirection *) match status_code with [ "303" -> do { Wserver.wprint "HTTP/1.1 303 See Other"; nl (); Wserver.wprint "Location: %s" url; nl (); } | _ -> failwith "Util.redirect_HTML: code redirection not implemented" ] ; value commd conf = let c = conf.command ^ "?" in List.fold_left (fun c (k, v) -> c ^ k ^ "=" ^ v ^ ";") c (conf.henv @ conf.senv) ; value code_varenv = Wserver.encode; value decode_varenv = Wserver.decode; value quote_escaped s = let rec need_code i = if i < String.length s then match s.[i] with [ '"' | '&' | '<' | '>' -> True | x -> need_code (succ i) ] else False in let rec compute_len i i1 = if i < String.length s then let i1 = match s.[i] with [ '"' -> i1 + 6 | '&' -> i1 + 5 | '<' | '>' -> i1 + 4 | _ -> succ i1 ] in compute_len (succ i) i1 else i1 in let rec copy_code_in s1 i i1 = if i < String.length s then let i1 = match s.[i] with [ '"' -> do { String.blit """ 0 s1 i1 6; i1 + 6 } | '&' -> do { String.blit "&" 0 s1 i1 5; i1 + 5 } | '<' -> do { String.blit "<" 0 s1 i1 4; i1 + 4 } | '>' -> do { String.blit ">" 0 s1 i1 4; i1 + 4 } | c -> do { Bytes.set s1 i1 c; succ i1 } ] in copy_code_in s1 (succ i) i1 else s1 in if need_code 0 then let len = compute_len 0 0 in copy_code_in (Bytes.create len) 0 0 else s ; value no_html_tags s = let rec need_code i = if i < String.length s then match s.[i] with [ '<' | '>' -> True | _ -> need_code (i + 1) ] else False in if need_code 0 then let rec loop i len = if i = String.length s then Buff.get len else let (len, next_i) = match s.[i] with [ '<' -> (Buff.mstore len "<", i + 1) | '>' -> (Buff.mstore len ">", i + 1) | c -> (Buff.store len c, i + 1) ] in loop next_i len in loop 0 0 else s ; (* Version 1 => moche *) value clean_html_tags s l = List.fold_left (fun s html_tag -> Str.global_replace (Str.regexp html_tag) " " s) s l ; value hidden_env conf = List.iter (fun (k, v) -> Wserver.wprint "\n" k (quote_escaped (decode_varenv v)) conf.xhs) (conf.henv @ conf.senv) ; value p_getenv env label = try Some (decode_varenv (List.assoc (decode_varenv label) env)) with [ Not_found -> None ] ; value p_getint env label = match p_getenv env label with [ Some s -> try Some (int_of_string (strip_spaces s)) with [ Failure _ -> None ] | None -> None ] ; value nobtit conf base p = Gwdb.nobtit base conf.allowed_titles conf.denied_titles p ; value strictly_after_private_years conf a = if a.year > conf.private_years then True else if a.year < conf.private_years then False else a.month > 0 || a.day > 0 ; value is_old_person conf p = match (Adef.od_of_codate p.birth, Adef.od_of_codate p.baptism, p.death, CheckItem.date_of_death p.death) with [ (_, _, NotDead, _) when conf.private_years > 0 -> False | (Some (Dgreg d _), _, _, _) -> let a = CheckItem.time_elapsed d conf.today in strictly_after_private_years conf a | (_, Some (Dgreg d _), _, _) -> let a = CheckItem.time_elapsed d conf.today in strictly_after_private_years conf a | (_, _, _, Some (Dgreg d _)) -> let a = CheckItem.time_elapsed d conf.today in strictly_after_private_years conf a | (None, None, DontKnowIfDead, None) -> p.access <> Private && conf.public_if_no_date | _ -> False ] ; value fast_auth_age conf p = if conf.friend || conf.wizard || get_access p = Public then True else if conf.public_if_titles && get_access p = IfTitles && get_titles p <> [] then True else is_old_person conf (gen_person_of_person p) ; value is_restricted (conf : config) base ip = let fct p = not (is_quest_string (get_surname p)) && not (is_quest_string (get_first_name p)) && not (fast_auth_age conf p) in if conf.use_restrict then base_visible_get base fct (Adef.int_of_iper ip) else False ; value pget (conf : config) base ip = if is_restricted conf base ip then Gwdb.empty_person base ip else poi base ip ; value string_gen_person base p = Futil.map_person_ps (fun p -> p) (sou base) p ; value string_gen_family base fam = Futil.map_family_ps (fun p -> p) (sou base) fam ; value parent_has_title conf base p = match get_parents p with [ Some ifam -> let cpl = foi base ifam in let fath = pget conf base (get_father cpl) in let moth = pget conf base (get_mother cpl) in get_access fath <> Private && nobtit conf base fath <> [] || get_access moth <> Private && nobtit conf base moth <> [] | _ -> False ] ; (* ********************************************************************** *) (* [Fonc] authorized_age : config -> base -> person -> bool *) (** [Description] : Calcul les droits de visualisation d'une personne en fonction de son age. Renvoie (dans l'ordre des tests) : - Vrai si : magicien ou ami ou la personne est public - Vrai si : la personne est en si_titre, qu'elle ou ses parents ont au moins un titre et que public_if_title = yes dans le fichier gwf - Faux si : la personne n'est pas décédée et private_years > 0 - Vrai si : la personne est plus agée (en fonction de la date de naissance ou de la date de baptème) que privates_years - Faux si : la personne est plus jeune (en fonction de la date de naissance ou de la date de baptème) que privates_years - Vrai si : la personne est décédée depuis plus de privates_years - Faux si : la personne est décédée depuis moins de privates_years - Vrai si : la personne a entre 80 et 120 ans et qu'elle n'est pas privée et public_if_no_date = yes - Vrai si : la personne s'est mariée depuis plus de private_years - Faux dans tous les autres cas [Args] : - conf : configuration de la base - base : base de donnée - p : person [Retour] : Vrai si on a les droits, Faux sinon. [Rem] : Exporté en clair hors de ce module. *) (* ********************************************************************** *) value authorized_age conf base p = if conf.wizard || conf.friend || get_access p = Public then True else if conf.public_if_titles && get_access p = IfTitles && (nobtit conf base p <> [] || parent_has_title conf base p) then True else match (Adef.od_of_codate (get_birth p), Adef.od_of_codate (get_baptism p), get_death p, CheckItem.date_of_death (get_death p)) with [ (_, _, NotDead, _) when conf.private_years > 0 -> False | (Some (Dgreg d _), _, _, _) -> let a = CheckItem.time_elapsed d conf.today in strictly_after_private_years conf a | (_, Some (Dgreg d _), _, _) -> let a = CheckItem.time_elapsed d conf.today in strictly_after_private_years conf a | (_, _, _, Some (Dgreg d _)) -> let a = CheckItem.time_elapsed d conf.today in strictly_after_private_years conf a | (None, None, DontKnowIfDead, None) -> get_access p <> Private && conf.public_if_no_date | _ -> let rec loop i = if i >= Array.length (get_family p) then False else let fam = foi base (get_family p).(i) in match Adef.od_of_codate (get_marriage fam) with [ Some (Dgreg d _) -> let a = CheckItem.time_elapsed d conf.today in strictly_after_private_years conf a | _ -> loop (i + 1) ] in loop 0 ] ; value is_hidden p = is_empty_string (get_surname p); value know base p = sou base (get_first_name p) <> "?" || sou base (get_surname p) <> "?" ; value is_public conf base p = get_access p = Public || conf.public_if_titles && get_access p = IfTitles && nobtit conf base p <> [] || is_old_person conf (gen_person_of_person p) ; (* ********************************************************************** *) (* [Fonc] accessible_by_key : config -> base -> person -> string -> string -> bool *) (** [Description] : Vrai si la personne est accessible par sa clé, Faux sinon. [Args] : - conf : configuration de la base - base : base de donnée - p : person - fn : prénom de la personne - sn : patronyme de la personne [Retour] : - bool : Vrai si la personne est accessible par sa clé, faux sinon. [Rem] : Exporté en clair hors de ce module. *) (* ********************************************************************** *) value accessible_by_key conf base p fn sn = conf.access_by_key && not (fn = "?" || sn = "?") && (not (is_hide_names conf p) || is_public conf base p || conf.friend || conf.wizard) ; (* ********************************************************************** *) (* [Fonc] acces_n : config -> base -> string -> person -> string *) (** [Description] : Renvoie les paramètres URL pour l'accès à la nième personne. [Args] : - conf : configuration de la base - base : base de donnée - n : la nième personne (e.g. : calcul de parenté entre p1 et p2) - p : person [Retour] : string [Rem] : Exporté en clair hors de ce module. *) (* ********************************************************************** *) value acces_n conf base n x = let first_name = p_first_name base x in let surname = p_surname base x in if surname = "" then "" (* pX=fn;nX=sn;ocX=occ *) else if accessible_by_key conf base x first_name surname then "p" ^ n ^ "=" ^ code_varenv (Name.lower first_name) ^ ";n" ^ n ^ "=" ^ code_varenv (Name.lower surname) ^ (if get_occ x > 0 then ";oc" ^ n ^ "=" ^ string_of_int (get_occ x) else "") (* iX=index;ocX=occ *) else "i" ^ n ^ "=" ^ string_of_int (Adef.int_of_iper (get_key_index x)) ^ (if conf.wizard && get_occ x > 0 then ";oc" ^ n ^ "=" ^ string_of_int (get_occ x) else "") ; (* ********************************************************************** *) (* [Fonc] acces : config -> base -> person -> string *) (** [Description] : Renvoie les paramètres URL pour l'accès à la personne. [Args] : - conf : configuration de la base - base : base de donnée - p : person [Retour] : string [Rem] : Exporté en clair hors de ce module. *) (* ********************************************************************** *) value acces conf base x = acces_n conf base "" x; type p_access = (base -> person -> string * base -> person -> string); value std_access = (p_first_name, p_surname); value raw_access = (fun base p -> sou base (get_first_name p), fun base p -> sou base (get_surname p)) ; (**/**) (* Fonctions d'écriture du nom et prénom d'un individu en fonction de : *) (* - son/ses titre de noblesse *) (* - son/ses nom public *) (* - son/ses sobriquets *) value restricted_txt conf = "....."; (* ************************************************************************** *) (* [Fonc] gen_person_text : fun -> fun -> config -> base -> person -> string *) (** [Description] : Renvoie le prénom et nom d'un individu en fonction de son nom public et sobriquet. [Args] : - p_first_name : renvoie le prénom d'un individu (string) - p_surname : renvoie le nom d'un individu (string) - conf : configuration de la base - base : base de donnée - p : person [Retour] : string [Rem] : Exporté en clair hors de ce module. *) (* ************************************************************************** *) value gen_person_text (p_first_name, p_surname) conf base p = if is_hidden p then restricted_txt conf else if (is_hide_names conf p) && not (fast_auth_age conf p) then "x x" else let beg = match (sou base (get_public_name p), get_qualifiers p) with [ ("", [nn :: _]) -> p_first_name base p ^ " " ^ sou base nn ^ "" | ("", []) -> p_first_name base p | (n, [nn :: _]) -> n ^ " " ^ sou base nn ^ "" | (n, []) -> n ] in beg ^ " " ^ p_surname base p ; (* ************************************************************************** *) (* [Fonc] gen_person_text_no_html : fun -> fun -> config -> base -> person -> string *) (** [Description] : Renvoie le prénom et nom d'un individu en fonction de son nom public et sobriquet (sans balise html ). [Args] : - p_first_name : renvoie le prénom d'un individu (string) - p_surname : renvoie le nom d'un individu (string) - conf : configuration de la base - base : base de donnée - p : person [Retour] : string [Rem] : Exporté en clair hors de ce module. *) (* ************************************************************************** *) value gen_person_text_no_html (p_first_name, p_surname) conf base p = if is_hidden p then restricted_txt conf else if (is_hide_names conf p) && not (fast_auth_age conf p) then "x x" else let beg = match (sou base (get_public_name p), get_qualifiers p) with [ ("", [nn :: _]) -> p_first_name base p ^ " " ^ sou base nn | ("", []) -> p_first_name base p | (n, [nn :: _]) -> n ^ " " ^ sou base nn | (n, []) -> n ] in beg ^ " " ^ p_surname base p ; (* ************************************************************************** *) (* [Fonc] gen_person_text_without_surname : fun -> fun -> config -> base -> person -> string *) (** [Description] : Renvoie le prénom d'un individu en fonction de son nom public et sobriquet. [Args] : - p_first_name : renvoie le prénom d'un individu (string) - p_surname : renvoie le nom d'un individu (string) - conf : configuration de la base - base : base de donnée - p : person [Retour] : string [Rem] : Exporté en clair hors de ce module. *) (* ************************************************************************** *) value gen_person_text_without_surname check_acc (p_first_name, p_surname) conf base p = if is_hidden p then restricted_txt conf else if check_acc && (is_hide_names conf p) && not (fast_auth_age conf p) then "x x" else let s = match (sou base (get_public_name p), get_qualifiers p) with [ (n, [nn :: _]) when n <> "" -> n ^ " " ^ sou base nn ^ "" | (n, []) when n <> "" -> n | (_, [nn :: _]) -> p_first_name base p ^ " " ^ sou base nn ^ "" | (_, []) -> p_first_name base p ] in s ; value person_text = gen_person_text std_access; value person_text_no_html = gen_person_text_no_html std_access; value person_text_without_surname = gen_person_text_without_surname True std_access ; value person_text_no_surn_no_acc_chk = gen_person_text_without_surname False std_access ; (* *********************************************************************** *) (* [Fonc] main_title : config -> base -> person -> title option *) (** [Description] : Renvoie le titre principal d'une personne. Si aucun titre principal n'est trouvé mais que la personne a plusieurs titre, alors on renvoie le premier titre. [Args] : - conf : configuration de la base - base : base de donnée - p : person [Retour] : title option [Rem] : Exporté en clair hors de ce module. *) (* *********************************************************************** *) value main_title conf base p = (* Fonction de recherche du titre principal. *) let rec find_main = fun [ [] -> None | [x :: l] -> if x.t_name = Tmain then Some x else find_main l ] in match find_main (nobtit conf base p) with [ None -> (* Aucun titre trouvé, on renvoie le premier (s'il existe). *) match nobtit conf base p with [ [x :: _] -> Some x | _ -> None ] | x -> x ] ; (* *********************************************************************** *) (* [Fonc] titled_person_text : config -> base -> person -> istr gen_title *) (** [Description] : Renvoie la chaîne de caractère de la personne en fonction de son titre. [Args] : - conf : configuration de la base - base : base de donnée - p : person - t : gen_title [Retour] : string [Rem] : Non exporté en clair hors de ce module. *) (* *********************************************************************** *) value titled_person_text conf base p t = if p_getenv conf.base_env "print_advanced_title" = Some "yes" then let estate = sou base t.t_place in let surname = p_surname base p in let elen = String.length estate in let slen = String.length surname in (* Si le nom de l'individu est le même que son domaine, on renvoie : *) (* - le nom du titre *) (* - le nom du titre et le premier sobriquet *) (* - le nom de la personne (donné par son nom de domaine) en *) (* fonction du nom public et sobriquet *) if Name.strip_lower estate = Name.strip_lower surname then match (t.t_name, get_qualifiers p) with [ (Tname n, []) -> sou base n | (Tname n, [nn :: _]) -> sou base n ^ " " ^ sou base nn ^ "" | _ -> person_text_without_surname conf base p ] (* Si le nom de l'individu contient le nom de son domaine, on renvoie : *) (* - le nom du titre *) (* - le nom du titre et le premier sobriquet *) (* - le nom de la personne (nom du domaine épuré du patronyme) en *) (* fonction du nom public et sobriquet *) else if elen < slen && String.sub surname (slen - elen) elen = estate then match (t.t_name, get_qualifiers p) with [ (Tname n, []) -> sou base n | (Tname n, [nn :: _]) -> sou base n ^ " " ^ sou base nn ^ "" | _ -> let trunc_surname _ _ = strip_spaces (String.sub surname 0 (slen - elen)) in let trunc_access = (p_first_name, trunc_surname) in gen_person_text trunc_access conf base p ] (* Sinon, on renvoie : *) (* - le nom du titre *) (* - le nom du titre et le premier sobriquet *) (* - le nom de la personne en fonction du nom public et sobriquet *) else match t.t_name with [ Tname s -> let s = sou base s in match get_qualifiers p with [ [] -> s | [nn :: _] -> s ^ " " ^ sou base nn ^ "" ] | _ -> person_text conf base p ] else person_text conf base p ; (* *********************************************************************** *) (* [Fonc] one_title_text : config -> base -> person -> istr gen_title *) (** [Description] : Renvoie la chaîne de caractère du titre ainsi que le domaine. [Args] : - conf : configuration de la base - base : base de donnée - p : la personne dont on veut le titre - t : le titre de noblesse que l'on veut afficher [Retour] : string [Rem] : Non exporté en clair hors de ce module. *) (* *********************************************************************** *) value one_title_text conf base p t = let place = sou base t.t_place in let s = sou base t.t_ident in let s = if place = "" then s else s ^ " " ^ place in ", " ^ s ^ "" ; value geneweb_link conf href s = if conf.cancel_links then s else "" ^ s ^ "" ; value wprint_geneweb_link conf href s = Wserver.wprint "%s" (geneweb_link conf href s) ; value reference conf base p s = if conf.cancel_links || is_hidden p then s else "" ^ s ^ "" ; (* ************************************************************************* *) (* [Fonc] update_family_loop : config -> base -> person -> string -> string *) (** [Description] : Essaie de déterminer dans quelle famille il peut y avoir une boucle. Si il n'y a pas d'ambiguité, alors on renvoie un lien vers la famille à modifier, sinon, on renvoie un lien vers le menu général de mise à jour. [Args] : - conf : configuration - base : base - p : person - s : la clé de la personne sous forme de string [Retour] : - string : retourne un lien de mise à jour soit vers la famille contenant la boucle, soit vers le menu de mise à jour. [Rem] : Exporté en clair hors de ce module. *) (* ************************************************************************* *) value update_family_loop conf base p s = if conf.cancel_links || is_hidden p then s else let iper = get_key_index p in let list = Array.to_list (get_family p) in let list = List.map (fun ifam -> (ifam, foi base ifam)) list in let list = List.map (fun (ifam, fam) -> (ifam, Array.to_list (get_children fam))) list in (* [Fonc] : 'a list -> (ifam, iper list) list -> ifam list *) let rec loop accu l = match l with [ [] -> accu | [(ifam, children) :: l ] -> if List.exists (fun c -> iper = c) children then loop [ifam :: accu] l else loop accu l ] in let res = loop [] list in if conf.wizard then (* Si il n'y a pas d'ambiguité, i.e. pas 2 boucles dans 2 familles *) (* pour un même individu, alors on renvoit le lien vers la mise à *) (* jour de la famille, sinon, un lien vers le menu de mise à jour. *) if List.length res = 1 then let iper = string_of_int (Adef.int_of_iper iper) in let ifam = string_of_int (Adef.int_of_ifam (List.hd res)) in "" ^ s ^ "" else let iper = string_of_int (Adef.int_of_iper iper) in "" ^ s ^ "" else s ; value no_reference conf base p s = s; value gen_person_title_text reference p_access conf base p = if authorized_age conf base p then match main_title conf base p with [ Some t -> reference conf base p (titled_person_text conf base p t) ^ one_title_text conf base p t | None -> reference conf base p (gen_person_text p_access conf base p) ] else reference conf base p (gen_person_text p_access conf base p) ; value referenced_person_title_text = gen_person_title_text reference std_access ; value person_title_text = gen_person_title_text no_reference std_access; value referenced_person_text conf base p = reference conf base p (person_text conf base p) ; value referenced_person_text_without_surname conf base p = reference conf base p (person_text_without_surname conf base p) ; value gen_person_text_without_title p_access conf base p = match main_title conf base p with [ Some t -> if eq_istr t.t_place (get_surname p) then gen_person_text_without_surname True p_access conf base p else match (t.t_name, get_qualifiers p) with [ (Tname s, [nn :: _]) -> sou base s ^ " " ^ sou base nn ^ "" | (Tname s, _) -> sou base s | _ -> gen_person_text p_access conf base p ] | None -> gen_person_text p_access conf base p ] ; value person_text_without_title = gen_person_text_without_title std_access; value person_title conf base p = if authorized_age conf base p then match main_title conf base p with [ Some t -> one_title_text conf base p t | None -> "" ] else "" ; value old_surname_begin n = let i = initial n in if i = 0 then "" else let i = strip_spaces i where rec strip_spaces i = if i >= 1 && n.[i - 1] = ' ' then strip_spaces (pred i) else i in " (" ^ String.sub n 0 i ^ ")" ; value old_surname_end n = let i = initial n in if i = 0 then n else String.sub n i (String.length n - i) ; value start_with s i p = i + String.length p <= String.length s && String.lowercase (String.sub s i (String.length p)) = p ; value start_with2 s i p = i + String.length p <= String.length s && String.sub s i (String.length p) = p ; value get_particle base s = loop (base_particles base) where rec loop = fun [ [part :: parts] -> if start_with2 s 0 part then part else loop parts | [] -> "" ] ; value surname_begin base s = let part = get_particle base s in let len = String.length part in if len = 0 then "" else if part.[len-1] = ' ' then " (" ^ String.sub part 0 (len - 1) ^ ")" else " (" ^ part ^ ")" ; value surname_end base s = let part_len = String.length (get_particle base s) in String.sub s part_len (String.length s - part_len) ; value rec skip_spaces s i = if i < String.length s && s.[i] = ' ' then skip_spaces s (i + 1) else i ; value create_env s = let rec get_assoc beg i = if i = String.length s then if i = beg then [] else [String.sub s beg (i - beg)] else if s.[i] = ';' || s.[i] = '&' then let next_i = skip_spaces s (succ i) in [String.sub s beg (i - beg) :: get_assoc next_i next_i] else get_assoc beg (succ i) in let rec separate i s = if i = String.length s then (s, "") else if s.[i] = '=' then (String.sub s 0 i, String.sub s (succ i) (String.length s - succ i)) else separate (succ i) s in List.map (separate 0) (get_assoc 0 0) ; value std_color conf s = "" ^ s ^ "" ; value index_of_sex = fun [ Male -> 0 | Female -> 1 | Neuter -> 2 ] ; value input_to_semi ic = loop 0 where rec loop len = let c = input_char ic in if c = ';' then Buff.get len else loop (Buff.store len c) ; value base_path pref bname = let pref = [Secure.base_dir () :: pref] in let bfile = List.fold_right Filename.concat pref bname in IFDEF WIN95 THEN bfile ELSE if Sys.file_exists bfile then bfile else if String.length bname >= 6 then let dirs = pref @ [String.make 1 bname.[0]; String.make 1 bname.[1]] in List.fold_right Filename.concat dirs bname else bfile END ; value base_len n = let n = base_path [] (n ^ ".gwb") in match try Some (Gwdb.open_base n) with [ Sys_error _ -> None ] with [ Some base -> let len = nb_of_persons base in do { close_base base; string_of_int len } | _ -> "?" ] ; value explode s c = let rec loop list i j = if i = 0 then if s.[i] = c then ["" :: list] else let ss = String.sub s 0 j in [ss :: list] else if s.[i] = c then let ss = String.sub s (i + 1) (j - i - 1) in loop [ss :: list] (i - 1) i else loop list (i - 1) j in let len = String.length s in loop [] (len - 1) len ; (* ************************************************************************ *) (* [Fonc] etc_file_name : config -> string -> string *) (** [Description] : Renvoie le chemin vers le fichier de template passé en paramètre. [Args] : - conf : configuration de la base - fname : le fichier de template [Retour] : - string : le chemin vers le fichier de template [Rem] : Exporté en clair hors de ce module. *) (* ************************************************************************ *) value etc_file_name conf fname = (* On recherche si dans le nom du fichier, on a specifié son *) (* répertoire, i.e. si fname est écrit comme ceci : dir/file *) let fname = List.fold_left (Filename.concat) "" (explode fname '/') in (* On cherche le fichier dans cet ordre : - dans la base (bases/etc/base_name/name.txt) - dans la base (bases/etc/templx/name.txt) - dans le répertoire des programmes (gw/etc/templx/name.txt) *) let file_exist dir = let base_name_tpl_dir = Filename.concat (base_path ["etc"] conf.bname) (fname ^ ".txt") in let base_tpl_dir = Filename.concat (base_path ["etc"] (Filename.basename dir)) (fname ^ ".txt") in let etc_tpl_dir = Filename.concat (search_in_lang_path "etc") (Filename.concat dir ((fname ^ ".txt"))) in if Sys.file_exists base_name_tpl_dir then base_name_tpl_dir else if Sys.file_exists base_tpl_dir then base_tpl_dir else if Sys.file_exists etc_tpl_dir then etc_tpl_dir else "" in (* Recherche le template par défaut en fonction de la variable gwf *) (* template = templ1,templ2,* *) let rec default_templ config_templ std_fname = match config_templ with [ [] | ["*"] -> std_fname | [x :: l] -> match file_exist x with [ "" -> default_templ l std_fname | s -> s ] ] in let config_templ = try let s = List.assoc "template" conf.base_env in let rec loop list i len = if i = String.length s then List.rev [Buff.get len :: list] else if s.[i] = ',' then loop [Buff.get len :: list] (i + 1) 0 else loop list (i + 1) (Buff.store len s.[i]) in loop [] 0 0 with [ Not_found -> [conf.bname; "*"] ] in let dir = match p_getenv conf.env "templ" with [ Some x when List.mem "*" config_templ -> x | Some x when List.mem x config_templ -> x | Some _ | None -> match config_templ with [ [] | ["*"] -> "" | [x :: _] -> x ] ] in (* template par défaut *) let std_fname = search_in_lang_path (Filename.concat "etc" (fname ^ ".txt")) in (* On cherche le template dans l'ordre de file_exist. *) (* Si on ne trouve rien, alors on cherche le premier template *) (* par défaut tel que défini par la variable template du gwf *) match file_exist dir with [ "" -> default_templ config_templ std_fname | s -> s ] ; value open_etc_file fname = let fname1 = base_path ["etc"] (Filename.basename fname ^ ".txt") in let fname2 = search_in_lang_path (Filename.concat "etc" (Filename.basename fname ^ ".txt")) in try Some (Secure.open_in fname1) with [ Sys_error _ -> try Some (Secure.open_in fname2) with [ Sys_error _ -> None ] ] ; value open_hed_trl conf fname = try Some (Secure.open_in (etc_file_name conf fname)) with [ Sys_error _ -> None ] ; value open_templ conf fname = try Some (Secure.open_in (etc_file_name conf fname)) with [ Sys_error _ -> if (*dir = conf.bname*)True(**) then (* template par défaut *) let std_fname = search_in_lang_path (Filename.concat "etc" (fname ^ ".txt")) in try Some (Secure.open_in std_fname) with [ Sys_error _ -> None ] else None ] ; value macro_etc env imcom c = try List.assoc c env () with [ Not_found -> match c with [ '%' -> "%" | 'k' -> imcom | 'o' -> if images_url.val <> "" then images_url.val else imcom ^ "m=IM;v=" | 'v' -> Version.txt | '/' -> "" | c -> "%" ^ String.make 1 c ] ] ; (* "copy_from_etc" is old method; rather use "Templ.copy_from_templ" *) value rec copy_from_etc env lang imcom ic = let cnt = ref 0 in try while True do { match input_char ic with [ '%' -> let c = input_char ic in match c with [ '+' -> incr cnt | '#' -> Wserver.wprint "%d" cnt.val | 'n' -> Wserver.wprint "%s" (base_len (input_to_semi ic)) | 'r' -> let name = input_line ic in match open_etc_file name with [ Some ic -> copy_from_etc env lang imcom ic | None -> Wserver.wprint "... file not found: \"%s.txt\"
    " name ] | c -> Wserver.wprint "%s" (macro_etc env imcom c) ] | '[' -> let c = input_char ic in if c = '\n' then let s = loop 0 (input_char ic) where rec loop len c = if c = ']' then Buff.get len else loop (Buff.store len c) (input_char ic) in let (s, alt) = Translate.inline lang '%' (macro_etc env imcom) s in let s = if alt then tnf s else s in Wserver.wprint "%s" s else Wserver.wprint "[%c" c | c -> Wserver.wprint "%c" c ] } with exc -> do { close_in ic; match exc with [ End_of_file -> () | exc -> raise exc ] } ; value image_prefix conf = if images_url.val <> "" then images_url.val else if conf.cgi then conf.command ^ "?m=IM;v=" else "images" ; (* On cherche le fichier dans cet ordre : - dans la base (bases/etc/name.txt) - dans le répertoire des programmes (gw/etc/name.txt) *) value find_misc_file name = let base_tpl_dir = Filename.concat (base_path ["etc"] "") name in let etc_tpl_dir = Filename.concat (search_in_lang_path "etc") name in if Sys.file_exists base_tpl_dir then base_tpl_dir else if Sys.file_exists etc_tpl_dir then etc_tpl_dir else "" ; (* Code mort. Géré par le css value default_background conf = sprintf "background:url('%s/gwback.jpg')" (image_prefix conf) ; value default_body_prop conf = let style = match p_getenv conf.env "size" with [ Some v -> "font-size:" ^ v ^ ";" | None -> "" ] in let style = sprintf "%s%s" style (default_background conf) in " style=\"" ^ style ^ "\"" ; Code mort. Géré par le css *) value body_prop conf = try match List.assoc "body_prop" conf.base_env with [ "" -> "" | s -> " " ^ s ] with [ Not_found -> "" ] ; value get_server_string_aux cgi request = if not cgi then Wserver.extract_param "host: " '\r' request else let server_name = try Sys.getenv "SERVER_NAME" with [ Not_found -> "" ] in let server_port = try Sys.getenv "SERVER_PORT" with [ Not_found | Failure _ -> "80" ] in if server_port = "80" then server_name else server_name ^ ":" ^ server_port ; value get_request_string_aux cgi request = if not cgi then Wserver.extract_param "GET " ' ' request else let script_name = try Sys.getenv "SCRIPT_NAME" with [ Not_found -> "" ] in let query_string = try Sys.getenv "QUERY_STRING" with [ Not_found -> "" ] in script_name ^ "?" ^ query_string ; value get_server_string conf = get_server_string_aux conf.cgi conf.request; value get_request_string conf = get_request_string_aux conf.cgi conf.request; value url_no_index conf base = let scratch s = code_varenv (Name.lower (sou base s)) in let get_a_person v = match try Some (int_of_string v) with [ Failure _ -> None ] with [ Some i -> if i >= 0 && i < nb_of_persons base then let p = pget conf base (Adef.iper_of_int i) in if ((is_hide_names conf p) && not (fast_auth_age conf p)) || is_hidden p then None else let f = scratch (get_first_name p) in let s = scratch (get_surname p) in let oc = string_of_int (get_occ p) in Some (f, s, oc) else None | None -> None ] in let get_a_family v = match try Some (int_of_string v) with [ Failure _ -> None ] with [ Some i -> if i >= 0 && i < nb_of_families base then let fam = foi base (Adef.ifam_of_int i) in if is_deleted_family fam then None else let p = pget conf base (get_father fam) in let f = scratch (get_first_name p) in let s = scratch (get_surname p) in if f = "" || s = "" then None else let oc = string_of_int (get_occ p) in let u = pget conf base (get_father fam) in let n = loop 0 where rec loop k = if (get_family u).(k) = Adef.ifam_of_int i then string_of_int k else loop (k + 1) in Some (f, s, oc, n) else None | None -> None ] in let env = let rec loop = fun [ [] -> [] | [("opt", "no_index") :: l] -> loop l | [("dsrc" | "escache" | "oc" | "templ", _) :: l] -> loop l | [("i", v) :: l] -> new_env "i" v (fun x -> x) l | [("ei", v) :: l] -> new_env "ei" v (fun x -> "e" ^ x) l | [(k, v) :: l] when String.length k = 2 && k.[0] = 'i' -> let c = String.make 1 k.[1] in new_env k v (fun x -> x ^ c) l | [(k, v) :: l] when String.length k > 2 && k.[0] = 'e' && k.[1] = 'f' -> new_fam_env k v (fun x -> x ^ k) l | [kv :: l] -> [kv :: loop l] ] and new_env k v c l = match get_a_person v with [ Some (f, s, oc) -> if oc = "0" then [(c "p", f); (c "n", s) :: loop l] else [(c "p", f); (c "n", s); (c "oc", oc) :: loop l] | None -> [(k, v) :: loop l] ] and new_fam_env k v c l = match get_a_family v with [ Some (f, s, oc, n) -> let l = loop l in let l = if n = "0" then l else [(c "f", n) :: l] in if oc = "0" then [(c "p", f); (c "n", s) :: l] else [(c "p", f); (c "n", s); (c "oc", oc) :: l] | None -> [(k, v) :: loop l] ] in loop conf.env in let addr = let pref = let s = get_request_string conf in match rindex s '?' with [ Some i -> String.sub s 0 i | None -> s ] in get_server_string conf ^ pref in let suff = List.fold_right (fun (x, v) s -> let sep = if s = "" then "" else ";" in x ^ "=" ^ v ^ sep ^ s) [("lang", conf.lang) :: env] "" in let suff = if conf.cgi then "b=" ^ conf.bname ^ ";" ^ suff else suff in addr ^ "?" ^ suff ; value message_to_wizard conf = if conf.wizard || conf.just_friend_wizard then let print_file fname = let fname = base_path ["etc"; conf.bname] (fname ^ ".txt") in match try Some (Secure.open_in fname) with [ Sys_error _ -> None ] with [ Some ic -> try while True do { Wserver.wprint "%c" (input_char ic); } with [ End_of_file -> close_in ic ] | None -> () ] in do { print_file "mess_wizard"; if conf.user <> "" then print_file ("mess_wizard_" ^ conf.user) else (); } else () ; value doctype conf = match p_getenv conf.base_env "doctype" with [ Some "html-5" -> "" | Some "html-4.01-trans" -> "\ " | Some "html-4.01" -> "\ " | Some "xhtml-1.0-trans" -> "\ " | _ -> "\ " ] ; value http_string conf s i = let http = "http://" in let https = "https://" in let (http, start_with_http) = if start_with s i http then (http, True) else (https, start_with s i https) in if start_with_http then let (j, par) = loop (i + String.length http) 0 where rec loop j par = if j < String.length s then match s.[j] with [ 'a'..'z' | 'A'..'Z' | '\128' .. '\255' | '0'..'9' | '!' | '#' | '$' | '%' | '&' | '(' | ')' | '*' | '+' | ',' | '-' | '.' | '/' | ':' | ';' | '=' | '?' | '@' | '\\' | '_' | '~' -> if s.[j] = '(' then loop (j + 1) (par + 1) else if s.[j] = ')' then loop (j + 1) (par - 1) else loop (j + 1) par | '[' | '^' | '{' | '|' -> (j + 1, par) | ']' | '}' -> (j, par) | _ -> (j, par) ] else (j, par) in let j = loop j where rec loop j = match s.[j - 1] with [ ')' | ',' | '.' | ':' | ';' -> if s.[j - 1] = ')' && par = 0 then j else if s.[j - 1] = ')' && par < 0 then j - 1 else loop (j - 1) | _ -> j ] in let s = String.sub s i (j - i) in Some (s, j) else None ; value rec followed_by_ident_semi s i = if i = String.length s then False else match s.[i] with [ 'a'..'z' | 'A'..'Z' -> followed_by_ident_semi s (i + 1) | '#' | '0'..'9' -> followed_by_ident_semi s (i + 1) | ';' -> True | _ -> False ] ; value expand_ampersand buff s = loop 0 where rec loop i = if i = String.length s then () else do { if s.[i] = '&' then Buffer.add_string buff "&" else Buffer.add_char buff s.[i]; loop (i + 1) } ; value email_addr s i = let rec before_at empty i = if i = String.length s then None else match s.[i] with [ 'a'..'z' | 'A'..'Z' | '0'..'9' | '-' | '_' | '.' -> before_at False (i + 1) | '@' -> if empty then None else after_at True (i + 1) | _ -> None ] and after_at empty i = if i = String.length s then None else match s.[i] with [ 'a'..'z' | 'A'..'Z' | '0'..'9' | '-' | '_' -> after_at False (i + 1) | '.' -> if empty then None else after_dot 0 (i + 1) | _ -> None ] and after_dot len i = if i = String.length s then Some (len, i) else match s.[i] with [ 'a'..'z' | 'A'..'Z' | '0'..'9' | '-' | '_' | '.' -> after_dot (len + 1) (i + 1) | _ -> Some (len, i) ] in match before_at True i with [ Some (len, i) -> let (len, i) = if len > 0 && s.[i - 1] = '.' then (len - 1, i - 1) else (len, i) in if len = 0 then None else Some i | None -> None ] ; value tag_id s i = loop i 0 where rec loop i len = if i = String.length s then Buff.get len else match s.[i] with [ 'a'..'z' | 'A'..'Z' | '0'..'9' | '!' | '-' -> loop (i + 1) (Buff.store len (Char.lowercase s.[i])) | _ -> if len = 0 then loop (i + 1) 0 else Buff.get len ] ; value default_good_tag_list = ["a"; "b"; "blockquote"; "br"; "center"; "cite"; "dd"; "dir"; "div"; "dl"; "dt"; "em"; "font"; "hr"; "h1"; "h2"; "h3"; "h4"; "h5"; "h6"; "i"; "img"; "li"; "ol"; "p"; "pre"; "span"; "strong"; "sub"; "sup"; "table"; "tbody"; "td"; "tfoot"; "th"; "thead"; "tr"; "tt"; "u"; "ul"; "!--"; "area"; "map"] ; value allowed_tags_file = ref ""; value good_tag_list_fun () = if allowed_tags_file.val <> "" then match try Some (open_in allowed_tags_file.val) with [ Sys_error _ -> None ] with [ Some ic -> loop [] where rec loop tags = match try Some (input_line ic) with [ End_of_file -> None ] with [ Some tg -> loop [String.lowercase tg :: tags] | None -> do { close_in ic; tags } ] | None -> default_good_tag_list ] else default_good_tag_list ; value good_tags_list = Lazy.from_fun good_tag_list_fun; value good_tag s i = List.mem (tag_id s i) (Lazy.force good_tags_list); module Lbuff = Buff.Make (struct value buff = ref (Bytes.create 80); end); value filter_html_tags s = loop 0 0 where rec loop len i = if i < String.length s then if s.[i] = '<' && not (good_tag s (i + 1)) then loop (Lbuff.mstore len "<") (i + 1) else loop (Lbuff.store len s.[i]) (i + 1) else Lbuff.get len ; value get_variable s i = loop 0 i where rec loop len i = if i = String.length s then (Buff.get len, [], i) else match s.[i] with [ 'a'..'z' | 'A'..'Z' | '0'..'9' | '_' as c -> loop (Buff.store len c) (i + 1) | ':' -> let v = Buff.get len in loop [] 0 (i + 1) where rec loop vl len i = if i = String.length s then (v, List.rev [Buff.get len :: vl], i) else match s.[i] with [ ':' -> loop [Buff.get len :: vl] 0 (i + 1) | ';' -> (v, List.rev [Buff.get len :: vl], i + 1) | c -> loop vl (Buff.store len c) (i + 1) ] | ';' -> (Buff.get len, [], i + 1) | _ -> (Buff.get len, [], i) ] ; type tag_type = [ In_a_href | In_norm | Out ]; value expand_env = let buff = Buffer.create 30 in fun conf s -> match p_getenv conf.base_env "expand_env" with [ Some "yes" -> let _ : unit = Buffer.clear buff in loop 0 where rec loop i = if i = String.length s then Buffer.contents buff else if i + 1 < String.length s && s.[i] = '$' && s.[i+1] = '{' then try let j = String.index_from s (i+1) '}' in let v = Sys.getenv (String.sub s (i + 2) (j - i - 2)) in do { Buffer.add_string buff v; loop (j + 1) } with [ Not_found -> do { Buffer.add_char buff s.[i]; loop (i + 1) } ] else do { Buffer.add_char buff s.[i]; loop (i + 1) } | _ -> s ] ; value string_with_macros conf env s = let buff = Buffer.create 1000 in loop Out 0 where rec loop tt i = if i < String.length s then if i + 1 < String.length s && s.[i] = '%' then let i = try do { Buffer.add_string buff (List.assoc s.[i + 1] env ()); i + 2 } with [ Not_found -> match s.[i + 1] with [ 's' -> do { Buffer.add_string buff (commd conf); i + 2 } | 'v' -> let (k, vl, j) = get_variable s (i + 2) in let (v, i) = let v = try let v = List.assoc ("var_" ^ k) conf.base_env in Some (expand_env conf v) with [ Not_found -> None ] in match v with [ Some s -> let s = loop vl 0 0 where rec loop vl len i = if i = String.length s then Buff.get len else if i + 1 < String.length s && s.[i] = '%' && s.[i+1] = 's' then match vl with [ [v :: vl] -> loop vl (Buff.mstore len v) (i + 2) | [] -> Buff.get len ^ String.sub s i (String.length s - i) ] else loop vl (Buff.store len s.[i]) (i + 1) in (s, j) | None -> ("%", i + 1) ] in do { Buffer.add_string buff v; i } | '%' -> do { Buffer.add_string buff "%"; i + 2 } | _ -> do { Buffer.add_string buff "%"; i + 1 } ] ] in loop tt i else match tt with [ In_a_href -> let tt = if start_with s i "" then Out else In_a_href in do { Buffer.add_char buff s.[i]; loop tt (i + 1) } | In_norm -> let tt = if s.[i] = '>' then Out else In_norm in do { Buffer.add_char buff s.[i]; loop tt (i + 1) } | Out -> match http_string conf s i with [ Some (x, j) -> do { bprintf buff "" x; expand_ampersand buff x; bprintf buff ""; loop Out j } | None -> match email_addr s i with [ Some j -> let x = String.sub s i (j - i) in do { bprintf buff "%s" x x; loop Out j } | None -> let tt = if start_with s i " string -> string *) (** [Description] : Astuce temporaire pour supprimer les crochets dans un lieu-dit. A l'avenir, il faudra revoir comment sont implémentés les lieux. [Args] : - conf : configuration de la base - place : lieu dont on veut supprimer les crochets [Retour] : - string : lieu sans les crochets du lieu-dit. [Rem] : Exporté en clair hors de ce module. *) (* ********************************************************************** *) value string_of_place conf place = List.fold_left (fun s c -> Name.strip_c s c) (string_with_macros conf [] place) [ '[' ; ']' ] ; type xhtml_tag = [ Btag of string and string | Etag of string | Atag of string ] ; value tag_params_ok s = loop 0 where rec loop i = if i = String.length s then True else match s.[i] with [ ' ' | '\n' -> loop (i+1) | 'a'..'z' -> loop_id (i+1) where rec loop_id i = if i = String.length s then False else match s.[i] with [ 'a'..'z' -> loop_id (i+1) | '=' -> let i = i + 1 in if i = String.length s then False else if s.[i] = '"' then loop_str (i+1) where rec loop_str i = if i = String.length s then False else if s.[i] = '"' then loop (i+1) else loop_str (i+1) else False | _ -> False ] | _ -> False ] ; value xhtml_tag s i = if s.[i] = '<' then if i = String.length s - 1 then None else if s.[i+1] = '!' then None else let k = try String.index_from s i '>' with [ Not_found -> String.length s ] in let j = loop i where rec loop i = if i = k then k else match s.[i] with [ ' ' | '\n' -> i | _ -> loop (i + 1) ] in if i + 1 = String.length s then None else let next_i = min (k + 1) (String.length s) in if s.[i+1] = '/' then let t = String.sub s (i + 2) (k - i - 2) in if j = k then Some (Etag t, next_i) else None else if s.[k-1] = '/' then let t = String.sub s (i + 1) (k - i - 2) in Some (Atag t, next_i) else let t = String.sub s (i + 1) (j - i - 1) in let a = String.sub s j (k - j) in if tag_params_ok a then Some (Btag t a, next_i) else None else None ; value check_ampersand s i = if i = String.length s then Some ("&", i) else match s.[i] with [ 'a'..'z' -> loop_id i where rec loop_id j = if j = String.length s then do { let a = sprintf "&%s" (String.sub s i (j - i)) in Some (a, j) } else match s.[j] with [ 'a'..'z' -> loop_id (j + 1) | ';' -> None | _ -> let a = sprintf "&%s" (String.sub s i (j - i)) in Some (a, j) ] | _ -> Some ("&", i) ] ; value bad col s = sprintf "%s" col s; value check_ampersands s = let b = Buffer.create (String.length s) in loop False 0 where rec loop error i = if i = String.length s then if error then Some (Buffer.contents b) else None else match s.[i] with [ '&' -> match check_ampersand s (i + 1) with [ Some (txt, j) -> do { Buffer.add_string b (bad "red" txt); loop True j } | None -> do { Buffer.add_char b '&'; loop error (i + 1) } ] | c -> do { Buffer.add_char b c; loop error (i + 1) } ] ; value check_xhtml s = let b = Buffer.create (String.length s) in loop [] 0 where rec loop tag_stack i = if i = String.length s then do { List.iter (fun (pos, txt, t) -> do { let s = Buffer.contents b in let s_bef = String.sub s 0 pos in let pos_aft = pos + String.length txt + 2 in let s_aft = String.sub s pos_aft (String.length s - pos_aft) in Buffer.clear b; Buffer.add_string b s_bef; Buffer.add_string b (bad "red" (sprintf "<%s>" txt)); Buffer.add_string b s_aft }) tag_stack; Buffer.contents b } else match xhtml_tag s i with [ Some (Btag t a, i) -> if t = "br" && a = "" then do { (* frequent error *) Buffer.add_string b (sprintf "<%s/>" t); loop tag_stack i } else do { match check_ampersands a with [ Some a -> do { Buffer.add_string b (sprintf "<%s%s>" t a); loop tag_stack i; } | None -> do { let pos = Buffer.length b in let txt = sprintf "%s%s" t a in Buffer.add_string b (sprintf "<%s>" txt); loop [(pos, txt, t) :: tag_stack] i } ] } | Some (Etag t, i) -> match tag_stack with [ [(_, _, bt) :: rest] when t = bt -> do { Buffer.add_string b (sprintf "" t); loop rest i } | _ -> do { Buffer.add_string b (bad "red" (sprintf "</%s>" t)); loop tag_stack i } ] | Some (Atag t, i) -> do { Buffer.add_string b (sprintf "<%s/>" t); loop tag_stack i } | None -> if s.[i] = '&' then match check_ampersand s (i + 1) with [ Some (txt, j) -> do { Buffer.add_string b (bad "red" txt); loop tag_stack j } | None -> do { Buffer.add_char b '&'; loop tag_stack (i + 1) } ] else do { if s.[i] = '<' && (i + 1 = String.length s || s.[i+1] <> '!') then Buffer.add_string b (bad "red" "<") else Buffer.add_char b s.[i]; loop tag_stack (i + 1) } ] ; value compilation_time_hook = ref (fun _ -> ""); value compilation_time conf = match p_getenv conf.base_env "display_compilation_time" with [ Some "on" -> compilation_time_hook.val conf | _ -> "" ] ; value menu_threshold = 20; value is_number t = match t.[0] with [ '1'..'9' -> True | _ -> False ] ; value hexa_string s = let s' = Bytes.create (2 * String.length s) in do { for i = 0 to String.length s - 1 do { Bytes.set s' (2*i) "0123456789ABCDEF".[Char.code s.[i] / 16]; Bytes.set s' (2*i+1) "0123456789ABCDEF".[Char.code s.[i] mod 16]; }; s' } ; value print_alphab_list conf crit print_elem liste = do { let len = List.length liste in if len > menu_threshold then tag "p" begin let _ = List.fold_left (fun last e -> let t = crit e in let same_than_last = match last with [ Some t1 -> t = t1 | _ -> False ] in do { if not same_than_last then Wserver.wprint "%s\n" (hexa_string t) t else (); Some t }) None liste in (); end else (); tag "ul" begin let _ = List.fold_left (fun last e -> do { let t = crit e in let same_than_last = match last with [ Some t1 -> t = t1 | _ -> False ] in if len > menu_threshold || is_number t then do { match last with [ Some _ -> if not same_than_last then Wserver.wprint "\n
  • \n" else () | _ -> () ]; if not same_than_last then do { Wserver.wprint "
  • \n"; Wserver.wprint "%s\n" (hexa_string t) t; Wserver.wprint "
      \n"; } else (); } else (); Wserver.wprint "
    • \n "; print_elem e; Wserver.wprint "
    • \n"; Some t }) None liste in (); if len > menu_threshold then Wserver.wprint "
    \n
  • \n" else (); end; }; value relation_txt conf sex fam = let is = index_of_sex sex in match get_relation fam with [ NotMarried | NoSexesCheckNotMarried -> ftransl_nth conf "relationship%t to" is | Married | NoSexesCheckMarried -> ftransl_nth conf "married%t to" is | Engaged -> ftransl_nth conf "engaged%t to" is | NoMention -> let s = "%t " ^ transl conf "with" in valid_format "%t" s ] ; (* ************************************************************************** *) (* [Fonc] child_of_parent : config -> base -> person -> unit *) (** [Description] : Traduction selon l'existence des parents : * fils/fille de Jean (et) Jeanne [Args] : - conf : configuration - base : base de donnée - p : person [Retour] : string [Rem] : Non exporté en clair hors de ce module. *) (* ************************************************************************** *) value child_of_parent conf base p = (* Si le père a un nom de famille différent de la personne *) (* alors on l'affiche, sinon on n'affiche que le prénom. *) let print_father fath = if not (eq_istr (get_surname p) (get_surname fath)) then person_text conf base fath else gen_person_text (p_first_name, (fun _ _ -> "")) conf base fath in let a = pget conf base (get_key_index p) in let ifam = match get_parents a with [ Some ifam -> let cpl = foi base ifam in let fath = let fath = pget conf base (get_father cpl) in if p_first_name base fath = "?" then None else Some fath in let moth = let moth = pget conf base (get_mother cpl) in if p_first_name base moth = "?" then None else Some moth in Some (fath, moth) | None -> None ] in match ifam with [ Some (None, None) | None -> "" | Some (fath, moth) -> let s = match (fath, moth) with [ (Some fath, None) -> print_father fath | (None, Some moth) -> person_text conf base moth | (Some fath, Some moth) -> print_father fath ^ " " ^ transl_nth conf "and" 0 ^ " " ^ person_text conf base moth | _ -> "" ] in let is = index_of_sex (get_sex p) in translate_eval (transl_a_of_gr_eq_gen_lev conf (transl_nth conf "son/daughter/child" is) s) ] ; (* ************************************************************************** *) (* [Fonc] husband_wife : config -> base -> person -> unit *) (** [Description] : Traduction selon l'existence du premier conjoint différent de ?? : * époux/épouse de Jean/Jeanne [Args] : - conf : configuration - base : base de donnée - p : person [Retour] : string [Rem] : Non exporté en clair hors de ce module. *) (* ************************************************************************** *) value husband_wife conf base p = let rec loop i = if i < Array.length (get_family p) then let fam = foi base (get_family p).(i) in let conjoint = spouse (get_key_index p) fam in let conjoint = pget conf base conjoint in if p_first_name base conjoint <> "?" || p_surname base conjoint <> "?" then let relation = Printf.sprintf (relation_txt conf (get_sex p) fam) (fun () -> "") in translate_eval (relation ^ " " ^ (person_text conf base conjoint)) else loop (i + 1) else "" in loop 0 ; (* ************************************************************************** *) (* [Fonc] first_child : config -> base -> person -> unit *) (** [Description] : Traduction selon l'existence du premier enfants : * père/mère de Jean [Args] : - conf : configuration - base : base de donnée - p : person [Retour] : string [Rem] : Non exporté en clair hors de ce module. *) (* ************************************************************************** *) value first_child conf base p = let is = index_of_sex (get_sex p) in let rec loop i = if i < Array.length (get_family p) then let fam = foi base (get_family p).(i) in let ct = get_children fam in if Array.length ct > 0 then let enfant = pget conf base ct.(0) in let child = if (is_hide_names conf enfant) && not (fast_auth_age conf enfant) then "xx" else if not (eq_istr (get_surname p) (get_surname enfant)) then person_text conf base enfant else gen_person_text (p_first_name, (fun _ _ -> "")) conf base enfant in translate_eval (transl_a_of_b conf (transl_nth conf "father/mother" is) child) else loop (i + 1) else "" in loop 0 ; (* ************************************************************************** *) (* [Fonc] specify_homonymous : config -> base -> person -> bool -> string *) (** [Description] : Permet d'afficher des informations supplémentaires sur la personne en cas d'homonymes (par exemple sur la recherche par ordre alphabétique). L'affichage se fait de façon similaire à gen_person_text, i.e. en fonction du nom publique et sobriquet si on valorise le paramètre specify_public_name à True : * Louis VI le gros (nom publique sobriquet) * Louis le gros (prénom sobriquet) * Louis VI (nom publique) * Louis Capétiens, fils de Philippe et Berthe, marié avec Adèlaïde, père de Philippe [Args] : - conf : configuration - base : base de donnée - p : person - specify_public_name : en fonction des affichages, on peut déjà avoir affiché le nom public de la personne, et dans ce cas, on ne veut pas l'afficher de nouveau. [Retour] : string [Rem] : Exporté en clair hors de ce module. *) (* ************************************************************************** *) value specify_homonymous conf base p specify_public_name = match (get_public_name p, get_qualifiers p) with [ (n, [nn :: _]) when sou base n <> "" && specify_public_name -> Wserver.wprint " %s %s" (sou base n) (sou base nn) | (_, [nn :: _]) when specify_public_name -> Wserver.wprint " %s %s" (p_first_name base p) (sou base nn) | (n, []) when sou base n <> "" && specify_public_name -> Wserver.wprint " %s" (sou base n) | (_, _) -> (* Le nom public et le qualificatif ne permettent pas de distinguer *) (* la personne, donc on affiche les informations sur les parents, *) (* le mariage et/ou le premier enfant. *) let cop = child_of_parent conf base p in let hw = husband_wife conf base p in let fc = first_child conf base p in let s = (if cop = "" then "" else ", " ^ cop) ^ (if hw = "" then if fc = "" then "" else ", " ^ fc else ", " ^ hw) in Wserver.wprint "%s" s ] ; (* fix system bug: string_of_float 17.97 = "17.969999999999" *) value my_string_of_float f = sprintf "%.6g" f; value string_of_decimal_num conf f = let s = my_string_of_float f in let b = Buffer.create 20 in let rec loop i = if i = String.length s then Buffer.contents b else do { match s.[i] with [ '.' -> if i = String.length s - 1 then () else Buffer.add_string b (transl conf "(decimal separator)") | x -> Buffer.add_char b x ]; loop (i + 1) } in loop 0 ; value personal_image_file_name bname str = Filename.concat (base_path ["images"] bname) str ; value source_image_file_name bname str = let fname1 = List.fold_right Filename.concat [base_path ["src"] bname; "images"] str in let fname2 = List.fold_right Filename.concat [Secure.base_dir (); "src"; "images"] str in if Sys.file_exists fname1 then fname1 else fname2 ; value image_file_name str = let fname1 = List.fold_right Filename.concat [Secure.base_dir (); "images"] str in if Sys.file_exists fname1 then fname1 else search_in_lang_path (Filename.concat "images" str) ; value png_image_size ic = let magic = let s = Bytes.create 4 in do { really_input ic s 0 4; s } in if magic = "\137PNG" then do { seek_in ic 16; let wid = input_binary_int ic in let hei = input_binary_int ic in Some (wid, hei) } else None ; value gif_image_size ic = let magic = let s = Bytes.create 4 in do { really_input ic s 0 4; s } in if magic = "GIF8" then do { seek_in ic 6; let wid = let x = input_byte ic in input_byte ic * 256 + x in let hei = let x = input_byte ic in input_byte ic * 256 + x in Some (wid, hei) } else None ; value jpeg_image_size ic = let magic = let str = Bytes.create 10 in do { really_input ic str 0 10; str } in if Char.code magic.[0] = 0xff && Char.code magic.[1] = 0xd8 && (let m = String.sub magic 6 4 in m = "JFIF" || m = "Exif") then let exif_type = String.sub magic 6 4 = "Exif" in let rec loop found = do { while Char.code (input_char ic) <> 0xFF do { () }; let ch = loop (input_char ic) where rec loop ch = if Char.code ch = 0xFF then loop (input_char ic) else ch in if Char.code ch = 0xC0 || Char.code ch = 0xC3 then if exif_type && not found then loop True else do { for i = 1 to 3 do { let _ = input_char ic in () }; let a = input_char ic in let b = input_char ic in let c = input_char ic in let d = input_char ic in let wid = Char.code c lsl 8 lor Char.code d in let hei = Char.code a lsl 8 lor Char.code b in Some (wid, hei) } else let a = input_char ic in let b = input_char ic in let len = Char.code a lsl 8 lor Char.code b in let len = if len >= 32768 then 0 else len in do { for i = 1 to len - 2 do { let _ = input_char ic in () }; if Char.code ch <> 0xDA then loop found else None } } in loop False else None ; value image_size fname = match try Some (Secure.open_in_bin fname) with [ Sys_error _ -> None ] with [ Some ic -> let r = try let sz = jpeg_image_size ic in let sz = if sz = None then do { seek_in ic 0; png_image_size ic } else sz in if sz = None then do { seek_in ic 0; gif_image_size ic } else sz with [ End_of_file -> None ] in do { close_in ic; r } | None -> None ] ; value limited_image_size max_wid max_hei fname size = match if fname = "" then size else image_size fname with [ Some (wid, hei) -> let (wid, hei) = if hei > max_hei then let wid = wid * max_hei / hei in let hei = max_hei in (wid, hei) else (wid, hei) in let (wid, hei) = if wid > max_wid then let hei = hei * max_wid / wid in let wid = max_wid in (wid, hei) else (wid, hei) in Some (wid, hei) | None -> None ] ; value find_person_in_env conf base suff = match p_getint conf.env ("i" ^ suff) with [ Some i -> if i >= 0 && i < nb_of_persons base then let p = pget conf base (Adef.iper_of_int i) in if is_hidden p then None else Some p else None | None -> match (p_getenv conf.env ("p" ^ suff), p_getenv conf.env ("n" ^ suff)) with [ (Some p, Some n) -> let occ = match p_getint conf.env ("oc" ^ suff) with [ Some oc -> oc | None -> 0 ] in match person_of_key base p n occ with [ Some ip -> let p = pget conf base ip in if is_hidden p then None else if not (is_hide_names conf p) || authorized_age conf base p then Some p else None | None -> None ] | _ -> None ] ] ; value person_exists conf base (fn, sn, oc) = match p_getenv conf.base_env "red_if_not_exist" with [ Some "off" -> True | Some _ | None -> match person_of_key base fn sn oc with [ Some ip -> authorized_age conf base (pget conf base ip) | None -> False ] ] ; value default_sosa_ref conf base = match p_getenv conf.base_env "default_sosa_ref" with [ Some n -> if n = "" then None else match person_ht_find_all base n with [ [ip] -> let p = pget conf base ip in if is_hidden p then None else Some p | _ -> None ] | None -> None ] ; value find_sosa_ref conf base = match find_person_in_env conf base "z" with [ Some p -> Some p | None -> default_sosa_ref conf base ] ; value write_default_sosa conf base key = do { let gwf = List.remove_assoc "default_sosa_ref" conf.base_env in let gwf = List.rev [("default_sosa_ref", key) :: gwf] in let fname = base_path [] (conf.bname ^ ".gwf") in let tmp_fname = fname ^ "2" in let oc = try Pervasives.open_out tmp_fname with [ Sys_error _ -> failwith "the gwf database is not writable" ] in List.iter (fun (k, v) -> Pervasives.output_string oc (k ^ "=" ^ v ^ "\n")) gwf; close_out oc ; try Sys.remove (fname ^ "~") with [ Sys_error _ -> () ]; try Sys.rename fname (fname ^ "~") with [ Sys_error _ -> () ]; try Sys.rename tmp_fname fname with [ Sys_error _ -> () ] }; value update_gwf_sosa conf base (ip, (fn, sn, occ)) = let sosa_ref_key = match snd conf.default_sosa_ref with [ Some p -> p_first_name base p ^ "." ^ string_of_int (get_occ p) ^ " " ^ p_surname base p | None -> "" ] in let new_key = fn ^ "." ^ string_of_int occ ^ " " ^ sn in if ip = fst conf.default_sosa_ref && new_key != sosa_ref_key then (* On met à jour le fichier gwf, la config *) (* se mettera à jour par treat_request. *) write_default_sosa conf base new_key else () ; value create_topological_sort conf base = match p_getenv conf.env "opt" with [ Some "no_tsfile" -> let () = load_ascends_array base in let () = load_couples_array base in Consang.topological_sort base (pget conf) | Some "no_tstab" -> Array.make (nb_of_persons base) 0 | _ -> let bfile = base_path [] (conf.bname ^ ".gwb") in lock (Mutil.lock_file bfile) with [ Accept -> let tstab_file = if conf.use_restrict && not conf.wizard && not conf.friend then Filename.concat bfile "tstab_visitor" else Filename.concat bfile "tstab" in let r = match try Some (Secure.open_in_bin tstab_file) with [ Sys_error _ -> None ] with [ Some ic -> let r = try Some (Marshal.from_channel ic) with [ End_of_file | Failure _ -> None ] in do { close_in ic; r } | None -> None ] in match r with [ Some tstab -> tstab | None -> let () = load_ascends_array base in let () = load_couples_array base in let tstab = Consang.topological_sort base (pget conf) in do { if conf.use_restrict && not conf.wizard && not conf.friend then base_visible_write base else (); match try Some (Secure.open_out_bin tstab_file) with [ Sys_error _ -> None ] with [ Some oc -> do { Marshal.to_channel oc tstab [Marshal.No_sharing]; close_out oc; } | None -> () ]; tstab } ] | Refuse -> let () = load_ascends_array base in let () = load_couples_array base in Consang.topological_sort base (pget conf) ] ] ; value branch_of_sosa conf base ip n = do { if Num.eq n Num.zero then invalid_arg "branch_of_sosa" else (); let rec expand bl n = if Num.eq n Num.one then bl else expand [Num.even n :: bl] (Num.half n) in let rec loop ipl ip sp = fun [ [] -> Some [(ip, sp) :: ipl] | [goto_fath :: nl] -> match get_parents (pget conf base ip) with [ Some ifam -> let cpl = foi base ifam in if goto_fath then loop [(ip, sp) :: ipl] (get_father cpl) Male nl else loop [(ip, sp) :: ipl] (get_mother cpl) Female nl | _ -> None ] ] in loop [] ip (get_sex (pget conf base ip)) (expand [] n) } ; value sosa_of_branch ipl = do { if ipl = [] then failwith "sosa_of_branch" else (); let ipl = List.tl (List.rev ipl) in List.fold_left (fun b (ip, sp) -> let b = Num.twice b in match sp with [ Male -> b | Female -> Num.inc b 1 | Neuter -> assert False ]) Num.one ipl } ; value space_to_unders = Mutil.tr ' ' '_'; (* ************************************************************************** *) (* [Fonc] default_image_name_of_key : string -> string -> int -> string *) (** [Description] : Renvoie à partir de la clé d'une personne, le nom par défaut de son image (portrait). Par exemple, Jean Claude DUPOND 3 => jean_claude.3.dupond [Args] : - fnam : first name - snam : surname - occ : occ [Retour] : string [Rem] : Exporté en clair hors de ce module. *) (* ************************************************************************** *) value default_image_name_of_key fnam surn occ = let f = space_to_unders (Name.lower fnam) in let s = space_to_unders (Name.lower surn) in f ^ "." ^ string_of_int occ ^ "." ^ s ; (* *********************************************************************** *) (* [Fonc] default_image_name : base -> person -> string *) (** [Description] : Renvoie à partir d'une personne, le nom par défaut de son image (portrait) => voir default_image_name_of_key. [Args] : - base : base de donnée - p : person [Retour] : string [Rem] : Exporté en clair hors de ce module. *) (* *********************************************************************** *) value default_image_name base p = default_image_name_of_key (p_first_name base p) (p_surname base p) (get_occ p) ; value auto_image_file conf base p = let s = default_image_name base p in let f = Filename.concat (base_path ["images"] conf.bname) s in if Sys.file_exists (f ^ ".gif") then Some (f ^ ".gif") else if Sys.file_exists (f ^ ".jpg") then Some (f ^ ".jpg") else if Sys.file_exists (f ^ ".png") then Some (f ^ ".png") else None ; value image_and_size conf base p image_size = if not conf.no_image && authorized_age conf base p then match sou base (get_image p) with [ "" -> match auto_image_file conf base p with [ Some f -> Some (True, f, image_size f None) | None -> None ] | s -> let (s, size) = let l = String.length s - 1 in if s.[l] = ')' then try let pos1 = String.index s '(' in let pos2 = String.index_from s pos1 'x' in let wid = String.sub s (pos1+1) (pos2-pos1-1) in let hei = String.sub s (pos2+1) (l-pos2-1) in let size = Some (int_of_string wid, int_of_string hei) in (String.sub s 0 pos1, image_size "" size) with [ Not_found | Failure _ -> (s, None) ] else (s, None) in let http = "http://" in let https = "https://" in if (String.length s > String.length http && String.sub s 0 (String.length http) = http) || (String.length s > String.length https && String.sub s 0 (String.length https) = https) then Some (False, s, size) else if Filename.is_implicit s then match try Some (List.assoc "images_path" conf.base_env) with [ Not_found -> None ] with [ Some p when p <> "" -> Some (False, p ^ s, size) | _ -> let fname = personal_image_file_name conf.bname s in if Sys.file_exists fname then Some (True, fname, image_size fname None) else None ] else None ] else None ; (* ********************************************************************** *) (* [Fonc] has_image : config -> base -> person -> bool *) (** [Description] : Renvoie Vrai si la personne a une photo et qu'on a les droits pour la voir, Faux sinon. [Args] : - conf : configuration de la base - base : base de donnée - p : person [Retour] : Vrai si la personne a une image, Faux sinon. [Rem] : Exporté en clair hors de ce module. *) (* ********************************************************************** *) value has_image conf base p = if not conf.no_image && authorized_age conf base p then not (is_empty_string (get_image p)) || auto_image_file conf base p <> None else False ; value gen_only_printable or_nl s = let s' = Bytes.create (String.length s) in do { for i = 0 to String.length s - 1 do { Bytes.set s' i (if Mutil.utf_8_db.val && Char.code s.[i] > 127 then s.[i] else match s.[i] with [ ' '..'~' | '\160'..'\255' -> s.[i] | '\n' -> if or_nl then '\n' else ' ' | _ -> ' ' ]) }; strip_spaces s' } ; value only_printable_or_nl = gen_only_printable True; value only_printable = gen_only_printable False; value relation_type_text conf t n = match t with [ Adoption -> transl_nth conf "adoptive father/adoptive mother/adoptive parents" n | Recognition -> transl_nth conf "recognizing father/recognizing mother/recognizing parents" n | CandidateParent -> transl_nth conf "candidate father/candidate mother/candidate parents" n | GodParent -> transl_nth conf "godfather/godmother/godparents" n | FosterParent -> transl_nth conf "foster father/foster mother/foster parents" n ] ; value rchild_type_text conf t n = match t with [ Adoption -> transl_nth conf "adoptive son/adoptive daughter/adoptive child" n | Recognition -> transl_nth conf "recognized son/recognized daughter/recognized child" n | CandidateParent -> transl_nth conf "candidate son/candidate daughter/candidate child" n | GodParent -> transl_nth conf "godson/goddaughter/godchild" n | FosterParent -> transl_nth conf "foster son/foster daughter/foster child" n ] ; value wprint_hidden conf pref name valu = Wserver.wprint "\n" pref name (quote_escaped valu) conf.xhs ; value wprint_hidden_person conf base pref p = let first_name = p_first_name base p in let surname = p_surname base p in if accessible_by_key conf base p first_name surname then do { wprint_hidden conf pref "p" (Name.lower first_name); wprint_hidden conf pref "n" (Name.lower surname); if get_occ p > 0 then wprint_hidden conf pref "oc" (string_of_int (get_occ p)) else (); } else wprint_hidden conf pref "i" (string_of_int (Adef.int_of_iper (get_key_index p))) ; exception Ok; value has_nephews_or_nieces conf base p = try let a = p in match get_parents a with [ Some ifam -> let fam = foi base ifam in do { Array.iter (fun ip -> if ip = get_key_index p then () else Array.iter (fun ifam -> if Array.length (get_children (foi base ifam)) > 0 then raise Ok else ()) (get_family (pget conf base ip))) (get_children fam); False } | _ -> False ] with [ Ok -> True ] ; value h s = Digest.to_hex (Digest.string s); value max_login_time = 60.0; (* short, just for testing *) value is_that_user_and_password auth_scheme user passwd = match auth_scheme with [ NoAuth -> False | TokenAuth ts -> user = ts.ts_user && passwd = ts.ts_pass | HttpAuth (Basic bs) -> user = bs.bs_user && passwd = bs.bs_pass | HttpAuth (Digest ds) -> if user <> ds.ds_username then False else let that_response_would_be = let a1 = sprintf "%s:%s:%s" user ds.ds_realm passwd in let a2 = sprintf "%s:%s" ds.ds_meth ds.ds_uri in if ds.ds_qop = "auth" || ds.ds_qop = "auth-int" then h (h a1 ^ ":" ^ ds.ds_nonce ^ ":" ^ ds.ds_nc ^ ":" ^ ds.ds_cnonce ^ ":" ^ ds.ds_qop ^ ":" ^ h a2) else h (h a1 ^ ":" ^ ds.ds_nonce ^ ":" ^ h a2) in that_response_would_be = ds.ds_response ] ; value browser_doesnt_have_tables conf = let user_agent = Wserver.extract_param "user-agent: " '/' conf.request in String.lowercase user_agent = "lynx" ; (* Printing for browsers without tables *) value pre_text_size txt = let rec normal len i = if i = String.length txt then len else if txt.[i] = '<' then in_tag len (i + 1) else if txt.[i] = '&' then in_char (len + 1) (i + 1) else normal (len + 1) (i + 1) and in_tag len i = if i = String.length txt then len else if txt.[i] = '>' then normal len (i + 1) else in_tag len (i + 1) and in_char len i = if i = String.length txt then len else if txt.[i] = ';' then normal len (i + 1) else in_char len (i + 1) in normal 0 0 ; value print_pre_center sz txt = do { for i = 1 to (sz - pre_text_size txt) / 2 do { Wserver.wprint " " }; Wserver.wprint "%s\n" txt; } ; value print_pre_left sz txt = let tsz = pre_text_size txt in do { if tsz < sz / 2 - 1 then for i = 2 to (sz / 2 - 1 - tsz) / 2 do { Wserver.wprint " " } else (); Wserver.wprint " %s\n" txt; } ; value print_pre_right sz txt = let tsz = pre_text_size txt in do { if tsz < sz / 2 - 1 then do { for i = 1 to sz / 2 do { Wserver.wprint " " }; for i = 1 to (sz / 2 - 1 - tsz) / 2 do { Wserver.wprint " " }; () } else for i = 1 to sz - pre_text_size txt - 1 do { Wserver.wprint " " }; Wserver.wprint " %s\n" txt; } ; value of_course_died conf p = match Adef.od_of_codate (get_birth p) with [ Some (Dgreg d _) -> conf.today.year - d.year > 120 | _ -> False ] ; value escache_value base = let t = Gwdb.date_of_last_change base in let v = int_of_float (mod_float t (float_of_int max_int)) in string_of_int v ; value adm_file f = List.fold_right Filename.concat [cnt_dir.val; "cnt"] f ; value std_date conf = let (hour, min, sec) = conf.time in sprintf "%04d-%02d-%02d %02d:%02d:%02d" conf.today.year conf.today.month conf.today.day hour min sec ; value read_wf_trace fname = match try Some (Secure.open_in fname) with [ Sys_error _ -> None ] with [ Some ic -> let r = ref [] in do { try while True do { r.val := [input_line ic :: r.val] } with [ End_of_file -> close_in ic ]; List.rev r.val } | None -> [] ] ; value write_wf_trace fname wt = let oc = Secure.open_out fname in do { List.iter (fun (dt, u) -> fprintf oc "%s %s\n" dt u) wt; close_out oc; } ; value update_wf_trace conf fname = let dt = std_date conf in let wt = let r = read_wf_trace fname in let dtlen = String.length dt in let rec loop found r = fun [ [x :: l] -> if String.length x > dtlen + 2 then let u = String.sub x (dtlen + 1) (String.length x - dtlen - 1) in if u = conf.user then loop True [(dt, u) :: r] l else loop found [(String.sub x 0 dtlen, u) :: r] l else loop found r l | [] -> if found then r else [(dt, conf.user) :: r] ] in loop False [] r in write_wf_trace fname (List.sort (fun x y -> compare y x) wt) ; value commit_patches conf base = do { Gwdb.commit_patches base; conf.henv := List.map (fun (k, v) -> if k = "escache" then (k, escache_value base) else (k, v)) conf.henv ; if conf.user <> "" then let wpf = try List.assoc "wizard_passwd_file" conf.base_env with [ Not_found -> "" ] in if wpf <> "" then let fname = adm_file (conf.bname ^ "_u.txt") in update_wf_trace conf fname else () else (); } ; value short_f_month m = match m with [ 1 -> "VD" | 2 -> "BR" | 3 -> "FM" | 4 -> "NI" | 5 -> "PL" | 6 -> "VT" | 7 -> "GE" | 8 -> "FL" | 9 -> "PR" | 10 -> "ME" | 11 -> "TH" | 12 -> "FT" | 13 -> "JC" | _ -> "" ] ; (* reading password file *) type auth_user = {au_user : string; au_passwd : string; au_info : string}; value read_gen_auth_file fname = let fname = base_path [] fname in match try Some (Secure.open_in fname) with [ Sys_error _ -> None ] with [ Some ic -> let rec loop data = match try Some (input_line ic) with [ End_of_file -> None ] with [ Some line -> let len = String.length line in let data = match try Some (String.index line ':') with [ Not_found -> None ] with [ Some i -> let user = String.sub line 0 i in let j = try String.index_from line (i + 1) ':' with [ Not_found -> len ] in let passwd = String.sub line (i + 1) (j - i - 1) in let rest = if j = len then "" else String.sub line (j + 1) (len - j - 1) in let au = {au_user = user; au_passwd = passwd; au_info = rest} in [au :: data] | None -> data ] in loop data | None -> do { close_in ic; List.rev data } ] in loop [] | None -> [] ] ; value start_equiv_with case_sens s m i = let rec test i j = if j = String.length s then Some i else if i = String.length m then None else if case_sens then if m.[i] = s.[j] then test (i + 1) (j + 1) else None else match Name.next_chars_if_equiv m i s j with [ Some (i, j) -> test i j | None -> None ] in if case_sens then if m.[i] = s.[0] then test (i + 1) 1 else None else match Name.next_chars_if_equiv m i s 0 with [ Some (i, j) -> test i j | None -> None ] ; value rec in_text case_sens s m = loop False 0 where rec loop in_tag i = if i = String.length m then False else if in_tag then loop (m.[i] <> '>') (i + 1) else if m.[i] = '<' then loop True (i + 1) else if m.[i] = '[' && i + 1 < String.length m && m.[i+1] = '[' then match NotesLinks.misc_notes_link m i with [ NotesLinks.WLpage j _ _ _ text | NotesLinks.WLperson j _ text _ | NotesLinks.WLwizard j _ text -> if in_text case_sens s text then True else loop False j | NotesLinks.WLnone -> loop False (i + 1) ] else match start_equiv_with case_sens s m i with [ Some _ -> True | None -> loop False (i + 1) ] ; value html_highlight case_sens h s = let ht i j = "" ^ String.sub s i (j - i) ^ "" in loop False 0 0 where rec loop in_tag i len = if i = String.length s then Buff.get len else if in_tag then loop (s.[i] <> '>') (i + 1) (Buff.store len s.[i]) else if s.[i] = '<' then loop True (i + 1) (Buff.store len s.[i]) else match start_equiv_with case_sens h s i with [ Some j -> loop False j (Buff.mstore len (ht i j)) | None -> loop False (i + 1) (Buff.store len s.[i]) ] ; (* Wrapper to pretty print the produced XHTML (see Wserver.wrap_string) *) value b = Buffer.create 80; value ind_bol = ref 0; value ind_curr = ref 0; value bol = ref False; value after_less = ref False; value after_slash = ref False; value curr_tag = ref None; value stack_in_error = ref False; value tag_stack = ref []; value check_tag_stack c = if stack_in_error.val then () else match curr_tag.val with [ Some (tag1, topen, tag_found) -> match c with [ ' ' -> curr_tag.val := Some (tag1, topen, True) | '>' -> if topen then do { tag_stack.val := [tag1 :: tag_stack.val]; curr_tag.val := None } else match tag_stack.val with [ [tag2 :: rest] -> if tag1 = tag2 then do { tag_stack.val := rest; curr_tag.val := None } else do { Printf.eprintf "Tag <%s> ended by \n" tag2 tag1; stack_in_error.val := True; } | [] -> do { Printf.eprintf "Ending tag not opened \n" tag1; stack_in_error.val := True; } ] | c -> if tag_found then () else curr_tag.val := Some (tag1 ^ String.make 1 c, topen, False) ] | None -> () ] ; value xml_pretty_print s = loop 0 where rec loop i = if i = String.length s then "" else do { if bol.val then if s.[i] = ' ' || s.[i] = '\n' then loop (i + 1) else do { bol.val := False; loop i; } else match s.[i] with [ '\n' -> do { check_tag_stack ' '; let ind = min ind_bol.val ind_curr.val in let line = Buffer.contents b in bol.val := True; ind_bol.val := ind_curr.val; Buffer.clear b; String.make (max 0 ind) ' ' ^ line ^ "\n" ^ loop (i + 1) } | c -> do { let after_less_v = after_less.val in let after_slash_v = after_slash.val in after_less.val := False; after_slash.val := False; match c with [ '<' -> do { after_less.val := True; curr_tag.val := Some ("", True, False); } | '/' -> if after_less_v then do { ind_curr.val := ind_curr.val - 2; curr_tag.val := Some ("", False, False); } else after_slash.val := True | '!' -> curr_tag.val := None | '>' -> if after_slash_v then do { ind_curr.val := ind_curr.val - 2; curr_tag.val := None } else check_tag_stack c | c -> do { check_tag_stack c; if after_less_v then ind_curr.val := ind_curr.val + 2 else (); } ]; Buffer.add_char b c; loop (i + 1) } ] } ; (* Print list in columns with alphabetic order *) type elem_kind = [ HeadElem | ContElem | Elem ]; value kind_size = fun [ HeadElem | ContElem -> 4 | Elem -> 1 ]; value dispatch_in_columns ncol list order = let rlist = List.fold_left (fun rlist elem -> let ord = order elem in let kind = match rlist with [ [(_, prev_ord, prev_elem) :: _] -> if ord = prev_ord || ord <> "" && prev_ord <> "" && ord.[0] = prev_ord.[0] then Elem else HeadElem | [] -> HeadElem ] in [(ref kind, ord, elem) :: rlist]) [] list in let (ini_list, ini_len) = List.fold_left (fun (list, len) ((kind, _, _) as elem) -> ([elem :: list], len + kind_size kind.val)) ([], 0) rlist in let len_list = loop [] 0 1 0 ini_len ini_list where rec loop rlen_list cnt col accu len list = if col > ncol then List.rev rlen_list else let (list, kind, is_last) = match list with [ [(kind, _, _) :: list] -> (list, kind, False) | [] -> ([], ref Elem, True) ] in let accu = accu + ncol * kind_size kind.val in let cnt = cnt + 1 in if accu > len && not is_last && kind.val = Elem then do { (* put a new size and restart from zero *) kind.val := ContElem; loop [] 0 1 0 (len + kind_size ContElem - 1) ini_list } else let (rlen_list, cnt, col, accu) = if accu > len && cnt > 1 then ([cnt - 1 :: rlen_list], 1, col + 1, accu - len) else (rlen_list, cnt, col, accu) in loop rlen_list cnt col accu len list in (len_list, ini_list) ; value print_in_columns conf ncols len_list list wprint_elem = do { begin_centered conf; tag "table" "width=\"95%%\" border=\"%d\"" conf.border begin tag "tr" "align=\"%s\" valign=\"top\"" conf.left begin let _ = List.fold_left (fun (list, first) len -> loop len list where rec loop n list = if n = 0 then do { Wserver.wprint "\n\n"; (list, False) } else match list with [ [(kind, ord, elem) :: list] -> do { if n = len then Wserver.wprint "\n" (100/ncols) else if kind.val <> Elem then Wserver.wprint "\n" else (); if kind.val <> Elem then do { Wserver.wprint "

    %s%s

    \n" (if ord = "" then "..." else String.make 1 ord.[0]) (if kind.val = HeadElem then "" else " (" ^ transl conf "continued" ^ ")"); Wserver.wprint "
      \n"; } else (); stagn "li" begin wprint_elem elem; end; loop (n - 1) list } | [] -> ([], False) ]) (list, True) len_list in (); end; end; end_centered conf; }; value wprint_in_columns conf order wprint_elem list = let ncols = match p_getint conf.env "ncols" with [ Some n -> max 1 n | None -> let len_list = List.length list in if len_list < 10 then 1 else if len_list < 100 then 2 else if len_list < 200 then 3 else 4 ] in let (len_list, list) = dispatch_in_columns ncols list order in print_in_columns conf ncols len_list list wprint_elem ; (* ********************************************************************** *) (* [Fonc] reduce_list : int -> list 'a -> list 'a *) (** [Description] : Retourne la sous liste de taille size composée des éléments 0 à (size - 1) [Args] : - size : la taille de la nouvelle liste - list : la liste originiale [Retour] : - list : la nouvelle liste de taille size [Rem] : Exporté en clair hors de ce module. *) (* ********************************************************************** *) value reduce_list size list = let rec loop size cnt reduced_list list = if cnt >= size then reduced_list else match list with [ [] -> reduced_list | [x :: l] -> loop size (cnt + 1) [x :: reduced_list] l ] in let sublist = loop size 0 [] list in List.rev sublist ; (* ********************************************************************** *) (* [Fonc] print_reference : config -> string -> int -> string -> unit *) (** [Description] : Affiche la référence d'une personne [Args] : - conf : configuration de la base - fn : first name - occ : occ - sn : surname [Retour] : - unit [Rem] : Exporté en clair hors de ce module. *) (* ********************************************************************** *) value print_reference conf fn occ sn = stag "span" "class=\"reference\"" begin Wserver.wprint " (%s %s.%d %s)" (transl conf "reference key") (Name.lower fn) occ (Name.lower sn); end ; (* ********************************************************************** *) (* [Fonc] gen_print_tips : conf -> string -> unit *) (** [Description] : Affiche un tips. [Args] : - conf : configuration de la base - s : le contenu du tips [Retour] : Néant [Rem] : Non exporté en clair hors de ce module. *) (* ********************************************************************** *) value gen_print_tips conf s = do { tag "div" "class=\"tips\"" begin tag "table" begin tag "tr" begin tag "td" begin Wserver.wprint "%s" s; end; end; end; end; xtag "br" }; (* ********************************************************************** *) (* [Fonc] print_tips_relationship : conf -> unit *) (** [Description] : Lors d'un calcul de parenté, il n'est pas évident de savoir qu'il faut cliquer sur la personne pour lancer le calcul. On affiche donc une petite aide pour l'utilisateur. [Args] : - conf : configuration de la base [Retour] : - unit [Rem] : Exporté en clair hors de ce module. *) (* ********************************************************************** *) value print_tips_relationship conf = if p_getenv conf.env "em" = Some "R" || p_getenv conf.env "m" = Some "C" then let s = (capitale (transl conf "select person to compute relationship")) in gen_print_tips conf s else () ; (* ********************************************************************** *) (* [Fonc] print_image_sex : conf -> person -> int -> unit *) (** [Description] : Affiche l'image du sexe correspondant à la personne. [Args] : - conf : configuration de la base - p : person - size : taille de l'image [Retour] : - unit [Rem] : Exporté en clair hors de ce module. *) (* ********************************************************************** *) value print_image_sex conf p size = let (image, alt) = match get_sex p with [ Male -> ("male.png", "M") | Female -> ("female.png", "F") | Neuter -> ("sexunknown.png", "?") ] in xtag "img" "src=\"%s/%s\" alt=\"%s\" title=\"sex\" width=\"%d\" heigth=\"%d\"" (image_prefix conf) image alt size size ; (* ********************************************************************** *) (* [Fonc] display_options : config -> string *) (** [Description] : Recherche dans l'URL les options d'affichage qui sont données et renvoie la concaténation de ces options. [Args] : - conf : configuration de la base [Retour] : string [Rem] : Exporté en clair hors de ce module. *) (* ********************************************************************** *) value display_options conf = let s = if p_getenv conf.env "image" = Some "on" then ";image=on" else "" in let s = if p_getenv conf.env "marriage" = Some "on" then s ^ ";marriage=on" else s in let s = match p_getenv conf.env "bd" with [ Some i -> s ^ ";bd=" ^ i | None -> s ] in let s = match p_getenv conf.env "color" with [ Some c -> s ^ ";color=" ^ c | None -> s ] in s ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/version.ml0000660000175200017530000000050612664543647023230 0ustar guillaumeguillaume(* $Id: version.ml,v 5.8 2011-01-06 09:59:58 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) value txt = "6.08"; value available_languages = ["af"; "bg"; "br"; "ca"; "cs"; "da"; "de"; "en"; "es"; "eo"; "et"; "fi"; "fr"; "he"; "is"; "it"; "lv"; "nl"; "no"; "pl"; "pt"; "pt-br"; "ro"; "ru"; "sk"; "sl"; "sv"; "zh"] ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/pr_lock.ml0000660000175200017530000000211012664543647023165 0ustar guillaumeguillaume(* camlp5r q_MLast.cmo pa_extfun.cmo *) (* $Id: pr_lock.ml,v 5.3 2007-09-12 09:58:44 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Pcaml; open Spretty; value loc = (0, 0); value expr e dg k = pr_expr.pr_fun "top" e dg k; value patt e dg k = pr_patt.pr_fun "top" e dg k; let lev = find_pr_level "top" pr_expr.pr_levels in lev.pr_rules := extfun lev.pr_rules with [ <:expr< match Lock.control $e1$ $e2$ (fun () -> $e3$) with [ Some x -> x | None -> $e4$ ] >> -> fun curr next _ k -> [: `Vbox [: `HVbox [: :]; `HVbox [: `S LR "lock"; `expr e1 "" [: `S LR "with" :] :]; `HVbox [: `S LR "["; `HVbox [: `HVbox [: `S LR "Accept"; `S LR "->" :]; `expr e3 "" [: :] :] :]; `HVbox [: `S LR "|"; `HVbox [: `HVbox [: `S LR "Refuse"; `S LR "->" :]; `expr e4 "" [: `S LR "]"; k :] :] :] :] :] ]; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/mk_consang.ml0000660000175200017530000004210712664543647023665 0ustar guillaumeguillaume(* camlp5r ./pa_lock.cmo *) (* $Id: mk_consang.ml,v 5.56 2012-01-18 21:03:02 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Printf; value fname = ref ""; value indexes = ref False; value scratch = ref False; value quiet = ref False; value tlim = ref (-1); value errmsg = "usage: " ^ Sys.argv.(0) ^ " [options] "; value speclist = [("-q", Arg.Set quiet, ": quiet mode"); ("-i", Arg.Set indexes, ": build the indexes again"); ("-t", Arg.Int (fun i -> tlim.val := i), " : time limit in seconds"); ("-scratch", Arg.Set scratch, ": from scratch"); ("-mem", Arg.Set Outbase.save_mem, ": Save memory, but slower when rewritting database"); ("-nolock", Arg.Set Lock.no_lock_flag, ": do not lock database.")] ; value anonfun s = if fname.val = "" then fname.val := s else raise (Arg.Bad "Cannot treat several databases") ; value rebuild_field_array db2 len pad bdir compress f = do { if Mutil.verbose.val then do { eprintf "rebuilding %s..." (Filename.basename bdir); flush stderr; } else (); if compress then Db2out.output_value_array_compress bdir "" len pad f else Db2out.output_value_array_no_compress bdir "" len pad f; if Mutil.verbose.val then do { eprintf "\n"; flush stderr } else () }; type field_info 'index 'item = { fi_nb : int; fi_ht : Hashtbl.t 'index 'item; fi_index_of_int : int -> 'index; fi_dir : string } ; value rebuild_any_field_array db2 fi pad compress (f2, get) = do { let f1 = fi.fi_dir in let bdir = List.fold_left Filename.concat db2.Db2disk.bdir2 ["new_d"; f1; f2] in Mutil.mkdir_p bdir; rebuild_field_array db2 fi.fi_nb pad bdir compress (fun oc_acc output_item -> do { (* put pad as 1st elem; not necessary, just for beauty *) if compress then ignore (output_item pad : int) else (); for i = 0 to fi.fi_nb - 1 do { let x = try get (Hashtbl.find fi.fi_ht (fi.fi_index_of_int i)) with [ Not_found -> let pos = Db2disk.get_field_acc db2 i (f1, f2) in Db2disk.get_field_data db2 pos (f1, f2) "data" ] in let pos = output_item x in output_binary_int oc_acc pos; } }) }; value rebuild_option_field_array db2 fi pad (f2, get) = do { let f1 = fi.fi_dir in let bdir = List.fold_left Filename.concat db2.Db2disk.bdir2 ["new_d"; f1; f2] in Mutil.mkdir_p bdir; rebuild_field_array db2 fi.fi_nb pad bdir True (fun oc_acc output_item -> for i = 0 to fi.fi_nb - 1 do { let x = try get (Hashtbl.find fi.fi_ht (fi.fi_index_of_int i)) with [ Not_found -> let pos = Db2disk.get_field_acc db2 i (f1, f2) in if pos = -1 then None else Some (Db2disk.get_field_data db2 pos (f1, f2) "data") ] in match x with [ None -> output_binary_int oc_acc (-1) | Some x -> do { let pos = output_item x in output_binary_int oc_acc pos } ]; }) }; value rebuild_list_field_array db2 fi (f2, get) = do { let f1 = fi.fi_dir in let f oc_acc oc_dat = for i = 0 to fi.fi_nb - 1 do { let x = try get (Hashtbl.find fi.fi_ht (fi.fi_index_of_int i)) with [ Not_found -> let pos = Db2disk.get_field_acc db2 i (f1, f2) in if pos = -1 then [] else Db2disk.get_field_data db2 pos (f1, f2) "data" ] in if x = [] then output_binary_int oc_acc (-1) else do { let pos = pos_out oc_dat in Iovalue.output oc_dat x; output_binary_int oc_acc pos } } in let bdir = List.fold_left Filename.concat db2.Db2disk.bdir2 ["new_d"; f1; f2] in Mutil.mkdir_p bdir; if Mutil.verbose.val then do { eprintf "rebuilding %s..." (Filename.basename bdir); flush stderr; } else (); let oc_dat = open_out_bin (Filename.concat bdir "data") in let oc_acc = open_out_bin (Filename.concat bdir "access") in f oc_acc oc_dat; close_out oc_acc; close_out oc_dat; if Mutil.verbose.val then do { eprintf "\n"; flush stderr } else () }; value rebuild_list2_field_array db2 fi (f2, get) = do { let f1 = fi.fi_dir in let f oc_acc oc_dat = for i = 0 to fi.fi_nb - 1 do { let rxl = try get (Hashtbl.find fi.fi_ht (fi.fi_index_of_int i)) with [ Not_found -> let pos = Db2disk.get_field_acc db2 i (f1, f2) in loop [] pos where rec loop list pos = if pos = -1 then list else let (x, pos) = Db2disk.get_field_2_data db2 pos (f1, f2) "data" in loop [x :: list] pos ] in let pos = loop (-1) rxl where rec loop pos = fun [ [] -> pos | [x :: xl] -> do { let new_pos = pos_out oc_dat in Iovalue.output oc_dat x; Iovalue.output oc_dat pos; loop new_pos xl } ] in output_binary_int oc_acc pos; } in let bdir = List.fold_left Filename.concat db2.Db2disk.bdir2 ["new_d"; f1; f2] in Mutil.mkdir_p bdir; if Mutil.verbose.val then do { eprintf "rebuilding %s..." (Filename.basename bdir); flush stderr; } else (); let oc_dat = open_out_bin (Filename.concat bdir "data") in let oc_acc = open_out_bin (Filename.concat bdir "access") in f oc_acc oc_dat; close_out oc_acc; close_out oc_dat; if Mutil.verbose.val then do { eprintf "\n"; flush stderr } else () }; value rebuild_string_field db2 fi (f2, get) = do { let f1 = fi.fi_dir in let bdir = List.fold_left Filename.concat db2.Db2disk.bdir2 ["new_d"; f1; f2] in Mutil.mkdir_p bdir; rebuild_field_array db2 fi.fi_nb "" bdir True (fun oc_acc output_item -> do { for i = 0 to fi.fi_nb - 1 do { let s = try get (Hashtbl.find fi.fi_ht (fi.fi_index_of_int i)) with [ Not_found -> let pos = Db2disk.get_field_acc db2 i (f1, f2) in Db2disk.string_of_istr2 db2 (f1, f2) pos ] in let pos = output_item s in output_binary_int oc_acc pos; }; }) }; value rebuild_list_with_string_field_array g h db2 fi (f2, get) = do { let f1 = fi.fi_dir in let bdir = List.fold_left Filename.concat db2.Db2disk.bdir2 ["new_d"; f1; f2] in Mutil.mkdir_p bdir; let oc_ext = open_out_bin (Filename.concat bdir "data2.ext") in rebuild_field_array db2 fi.fi_nb "" bdir True (fun oc_acc output_item -> do { for i = 0 to fi.fi_nb - 1 do { let sl = try get (Hashtbl.find fi.fi_ht (fi.fi_index_of_int i)) with [ Not_found -> let list : list 'a = let pos = Db2disk.get_field_acc db2 i (f1, f2) in if pos = -1 then [] else Db2disk.get_field_data db2 pos (f1, f2) "data2.ext" in List.map (g (Db2disk.string_of_istr2 db2 (f1, f2))) list ] in let pl = List.map (h output_item) sl in if pl = [] then output_binary_int oc_acc (-1) else do { output_binary_int oc_acc (pos_out oc_ext); let (s32, s64) = (Iovalue.size_32.val, Iovalue.size_64.val) in Iovalue.output oc_ext (pl : list 'a); Iovalue.size_32.val := s32; Iovalue.size_64.val := s64; } } }); close_out oc_ext; }; value unique_key_string (ht, scnt) s = let s = Name.lower (Mutil.nominative s) in try Hashtbl.find ht s with [ Not_found -> do { let istr = Adef.istr_of_int scnt.val in Hashtbl.add ht s istr; incr scnt; istr } ] ; value make_key_index db2 nb_per bdir = do { if Mutil.verbose.val then do { eprintf "key index..."; flush stderr; } else (); let person_of_key_d = Filename.concat bdir "person_of_key" in try Mutil.mkdir_p person_of_key_d with _ -> (); let ht_index_of_key = Hashtbl.create 1 in let ht_strings = (Hashtbl.create 1, ref 0) in let f1f2_fn = (Filename.concat "new_d" "person", "first_name") in let f1f2_sn = (Filename.concat "new_d" "person", "surname") in let f1f2_oc = (Filename.concat "new_d" "person", "occ") in for i = 0 to nb_per - 1 do { let fn = let pos = Db2disk.get_field_acc db2 i f1f2_fn in Db2disk.string_of_istr2 db2 f1f2_fn pos in assert (Obj.tag (Obj.repr fn) = Obj.string_tag); let sn = let pos = Db2disk.get_field_acc db2 i f1f2_sn in Db2disk.string_of_istr2 db2 f1f2_sn pos in assert (Obj.tag (Obj.repr sn) = Obj.string_tag); if fn = "?" || sn = "?" then () else let fn = unique_key_string ht_strings fn in let sn = unique_key_string ht_strings sn in let oc = Db2disk.get_field db2 i f1f2_oc in Hashtbl.add ht_index_of_key (Db2.key2_of_key (fn, sn, oc)) (Adef.iper_of_int i); }; Db2out.output_hashtbl person_of_key_d "iper_of_key.ht" (ht_index_of_key : Hashtbl.t Db2.key2 Def.iper); Hashtbl.clear ht_index_of_key; Db2out.output_hashtbl person_of_key_d "istr_of_string.ht" (fst ht_strings : Hashtbl.t string Adef.istr); Hashtbl.clear (fst ht_strings); if Mutil.verbose.val then do { eprintf "\n"; flush stderr } else (); }; value rebuild_fields2 db2 = do { let fi_per = {fi_nb = db2.Db2disk.patches.Db2disk.nb_per; fi_ht = db2.Db2disk.patches.Db2disk.h_person; fi_index_of_int = Adef.iper_of_int; fi_dir = "person"} in let fi_asc = {fi_nb = db2.Db2disk.patches.Db2disk.nb_per; fi_ht = db2.Db2disk.patches.Db2disk.h_ascend; fi_index_of_int = Adef.iper_of_int; fi_dir = "person"} in let fi_uni = {fi_nb = db2.Db2disk.patches.Db2disk.nb_per; fi_ht = db2.Db2disk.patches.Db2disk.h_union; fi_index_of_int = Adef.iper_of_int; fi_dir = "person"} in List.iter (rebuild_string_field db2 fi_per) [("first_name", fun p -> p.Def.first_name); ("surname", fun p -> p.Def.surname); ("image", fun p -> p.Def.image); ("public_name", fun p -> p.Def.public_name); ("occupation", fun p -> p.Def.occupation); ("birth_place", fun p -> p.Def.birth_place); ("birth_src", fun p -> p.Def.birth_src); ("baptism_place", fun p -> p.Def.baptism_place); ("baptism_src", fun p -> p.Def.baptism_src); ("death_place", fun p -> p.Def.death_place); ("death_src", fun p -> p.Def.death_src); ("burial_place", fun p -> p.Def.burial_place); ("burial_src", fun p -> p.Def.burial_src); ("notes", fun p -> p.Def.notes); ("psources", fun p -> p.Def.psources)]; rebuild_any_field_array db2 fi_per 0 True ("occ", fun p -> p.Def.occ); List.iter (rebuild_list_with_string_field_array (fun f -> f) (fun f -> f) db2 fi_per) [("qualifiers", fun p -> p.Def.qualifiers); ("aliases", fun p -> p.Def.aliases); ("first_names_aliases", fun p -> p.Def.first_names_aliases); ("surnames_aliases", fun p -> p.Def.surnames_aliases)]; rebuild_list_with_string_field_array Futil.map_title_strings Futil.map_title_strings db2 fi_per ("titles", fun p -> p.Def.titles); rebuild_list_field_array db2 fi_per ("rparents", fun p -> p.Def.rparents); rebuild_list2_field_array db2 fi_per ("related", fun p -> p.Def.related); rebuild_any_field_array db2 fi_per Def.Neuter True ("sex", fun p -> p.Def.sex); rebuild_any_field_array db2 fi_per Def.IfTitles True ("access", fun p -> p.Def.access); List.iter (rebuild_any_field_array db2 fi_per Adef.codate_None True) [("birth", fun p -> p.Def.birth); ("baptism", fun p -> p.Def.baptism)]; rebuild_any_field_array db2 fi_per Def.NotDead True ("death", fun p -> p.Def.death); rebuild_any_field_array db2 fi_per Def.UnknownBurial True ("burial", fun p -> p.Def.burial); rebuild_option_field_array db2 fi_asc (Adef.ifam_of_int (-1)) ("parents", fun p -> p.Def.parents); rebuild_any_field_array db2 fi_asc Adef.no_consang False ("consang", fun p -> p.Def.consang); rebuild_any_field_array db2 fi_uni [| |] False ("family", fun p -> p.Def.family); let fi_fam = {fi_nb = db2.Db2disk.patches.Db2disk.nb_fam; fi_ht = db2.Db2disk.patches.Db2disk.h_family; fi_index_of_int = Adef.ifam_of_int; fi_dir = "family"} in let fi_cpl = {fi_nb = db2.Db2disk.patches.Db2disk.nb_fam; fi_ht = db2.Db2disk.patches.Db2disk.h_couple; fi_index_of_int = Adef.ifam_of_int; fi_dir = "family"} in let fi_des = {fi_nb = db2.Db2disk.patches.Db2disk.nb_fam; fi_ht = db2.Db2disk.patches.Db2disk.h_descend; fi_index_of_int = Adef.ifam_of_int; fi_dir = "family"} in rebuild_any_field_array db2 fi_fam Adef.codate_None True ("marriage", fun f -> f.Def.marriage); List.iter (rebuild_string_field db2 fi_fam) [("marriage_place", fun f -> f.Def.marriage_place); ("marriage_src", fun f -> f.Def.marriage_src); ("comment", fun f -> f.Def.comment); ("origin_file", fun f -> f.Def.origin_file); ("fsources", fun f -> f.Def.fsources)]; rebuild_any_field_array db2 fi_fam [| |] True ("witnesses", fun f -> f.Def.witnesses); rebuild_any_field_array db2 fi_fam Def.Married True ("relation", fun f -> f.Def.relation); rebuild_any_field_array db2 fi_fam Def.NotDivorced True ("divorce", fun f -> f.Def.divorce); List.iter (rebuild_any_field_array db2 fi_cpl (Adef.iper_of_int (-1)) True) [("father", fun f -> Adef.father f); ("mother", fun f -> Adef.mother f)]; rebuild_any_field_array db2 fi_des [| |] False ("children", fun f -> f.Def.children); let nb_per = fi_per.fi_nb in let new_d = Filename.concat db2.Db2disk.bdir2 "new_d" in make_key_index db2 nb_per new_d; Gc.compact (); let particles = Mutil.input_particles (Filename.concat db2.Db2disk.bdir2 "particles.txt") in Db2out.make_indexes new_d nb_per particles; let old_d = Filename.concat db2.Db2disk.bdir2 "old_d" in Mutil.remove_dir old_d; Mutil.mkdir_p old_d; List.iter (fun f -> Sys.rename (Filename.concat db2.Db2disk.bdir2 f) (Filename.concat old_d f)) ["family"; "person"; "person_of_key"; "person_of_name"; "patches"]; List.iter (fun f -> Sys.rename (Filename.concat new_d f) (Filename.concat db2.Db2disk.bdir2 f)) ["family"; "person"; "person_of_key"; "person_of_name"]; }; value simple_output bname base carray = match carray with [ Some tab -> Gwdb.apply_base2 base (fun db2 -> do { let bdir = db2.Db2disk.bdir2 in let dir = List.fold_left Filename.concat bdir ["person"; "consang"] in Mutil.mkdir_p dir; let oc = open_out_bin (Filename.concat dir "data") in output_value oc tab; close_out oc; let oc = open_out_bin (Filename.concat dir "access") in let _ : int = Iovalue.output_array_access oc (Array.get tab) (Array.length tab) 0 in close_out oc; let has_patches = Sys.file_exists (Filename.concat bdir "patches") in if has_patches then do { let list = Hashtbl.fold (fun ip a list -> let a = {(a) with Def.consang = tab.(Adef.int_of_iper ip)} in [(ip, a) :: list]) db2.Db2disk.patches.Db2disk.h_ascend [] in List.iter (fun (ip, a) -> Hashtbl.replace db2.Db2disk.patches.Db2disk.h_ascend ip a) list; Db2disk.commit_patches2 db2; rebuild_fields2 db2; } else (); }) | None -> Gwdb.apply_base1 base (fun base -> let bname = base.Dbdisk.data.Dbdisk.bdir in let no_patches = not (Sys.file_exists (Filename.concat bname "patches")) in Outbase.gen_output (no_patches && not indexes.val) bname base) ] ; value designation base p = let first_name = Gwdb.p_first_name base p in let nom = Gwdb.p_surname base p in Mutil.iso_8859_1_of_utf_8 (first_name ^ "." ^ string_of_int (Gwdb.get_occ p) ^ " " ^ nom) ; value main () = do { Argl.parse speclist anonfun errmsg; if fname.val = "" then do { eprintf "Missing file name\n"; eprintf "Use option -help for usage\n"; flush stderr; exit 2; } else (); Secure.set_base_dir (Filename.dirname fname.val); let f () = let base = Gwdb.open_base fname.val in try do { Sys.catch_break True; let carray = ConsangAll.compute base tlim.val scratch.val quiet.val in simple_output fname.val base carray; } with [ Consang.TopologicalSortError p -> do { printf "\nError: loop in database, %s is his/her own ancestor.\n" (designation base p); flush stdout; exit 2 } ] in lock (Mutil.lock_file fname.val) with [ Accept -> f () | Refuse -> do { eprintf "Base is locked. Waiting... "; flush stderr; lock_wait (Mutil.lock_file fname.val) with [ Accept -> do { eprintf "Ok\n"; flush stderr; f () } | Refuse -> do { printf "\nSorry. Impossible to lock base.\n"; flush stdout; exit 2 } ] } ]; }; Printexc.catch main (); geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/iovalue.mli0000660000175200017530000000225112664543647023357 0ustar guillaumeguillaume(* $Id: iovalue.mli,v 5.5 2012-01-27 08:53:53 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) value input : in_channel -> 'a; value output : out_channel -> 'a -> unit; value size : 'a -> int; value digest : 'a -> Digest.t; value sizeof_long : int; value sign_extend : int -> int; (* making a header for input_value like output_value does *) type header_pos = 'abstract; value create_output_value_header : out_channel -> header_pos; value patch_output_value_header : out_channel -> header_pos -> int; (* generic functions *) type in_funs 'a = { input_byte : 'a -> int; input_binary_int : 'a -> int; input : 'a -> string -> int -> int -> unit } ; value gen_input : in_funs 'a -> 'a -> 'b; value in_channel_funs : in_funs in_channel; type out_funs 'a = { output_byte : 'a -> int -> unit; output_binary_int : 'a -> int -> unit; output : 'a -> string -> int -> int -> unit } ; value gen_output : out_funs 'a -> 'a -> 'b -> unit; value out_channel_funs : out_funs out_channel; value output_block_header : out_channel -> int -> int -> unit; value size_32 : ref int; value size_64 : ref int; value output_array_access : out_channel -> (int -> 'a) -> int -> int -> int; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/history.mli0000660000175200017530000000057212664543647023420 0ustar guillaumeguillaume(* $Id: history.mli,v 5.4 2007-01-19 01:53:16 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Config; open Def; open Gwdb; value file_name : config -> string; value record : config -> base -> base_changed iper string -> string -> unit; value notify : config -> base -> string -> unit; value print : config -> base -> unit; value print_search : config -> base -> unit; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/consang.ml0000660000175200017530000002403112664543647023172 0ustar guillaumeguillaume(* $Id: consang.ml,v 5.13 2007-02-21 18:14:01 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) (* Algorithm relationship and links from Didier Remy *) open Def; open Gwdb; type anc_stat = [ MaybeAnc | IsAnc ]; (* relationship: - elim_ancestor to prune displayed relationships - anc_stat1, anc_stat2 optimization to answer faster when ancestors list is exhausted - lens1, lens2: the third parameter (list iper) of the list has been added to be able to reconstitute the branch in case of the sex of the persons in the branch is important to display the relationship text *) type relationship = { weight1 : mutable float; weight2 : mutable float; relationship : mutable float; lens1 : mutable list (int * int * list iper); lens2 : mutable list (int * int * list iper); inserted : mutable int; elim_ancestors : mutable bool; anc_stat1 : mutable anc_stat; anc_stat2 : mutable anc_stat } ; type relationship_info = { tstab : array int; reltab : array relationship; queue : mutable array (list int) } ; value half x = x *. 0.5; value mark = ref 0; value new_mark () = do { incr mark; mark.val }; type visit = [ NotVisited | BeingVisited | Visited ]; value check_noloop base error = let tab = Array.make (nb_of_persons base) NotVisited in let rec noloop i = match tab.(i) with [ NotVisited -> do { match get_parents (poi base (Adef.iper_of_int i)) with [ Some ifam -> do { let fam = foi base ifam in let fath = get_father fam in let moth = get_mother fam in tab.(i) := BeingVisited; noloop (Adef.int_of_iper fath); noloop (Adef.int_of_iper moth); } | None -> () ]; tab.(i) := Visited; } | BeingVisited -> error (OwnAncestor (poi base (Adef.iper_of_int i))) | Visited -> () ] in for i = 0 to nb_of_persons base - 1 do { match tab.(i) with [ NotVisited -> noloop i | BeingVisited -> failwith "check_noloop algorithm error" | Visited -> () ] } ; exception TopologicalSortError of person; (* Return tab such as: i is an ancestor of j => tab.(i) > tab.(j) *) (* This complicated topological sort has the important following properties: - only "ascends" has to be loaded; no need to load "union" and "descend" which use much memory space. - the value of tab is minimum; it is important for the optimization of relationship computation (stopping the computation when the ancestor list of one of the person is exhausted). *) value topological_sort base poi = let tab = Array.make (nb_of_persons base) 0 in let todo = ref [] in let cnt = ref 0 in do { for i = 0 to nb_of_persons base - 1 do { let a = poi base (Adef.iper_of_int i) in match get_parents a with [ Some ifam -> let cpl = foi base ifam in let ifath = Adef.int_of_iper (get_father cpl) in let imoth = Adef.int_of_iper (get_mother cpl) in do { tab.(ifath) := tab.(ifath) + 1; tab.(imoth) := tab.(imoth) + 1 } | _ -> () ] }; for i = 0 to nb_of_persons base - 1 do { if tab.(i) = 0 then todo.val := [i :: todo.val] else () }; let rec loop tval list = if list = [] then () else let new_list = List.fold_left (fun new_list i -> let a = poi base (Adef.iper_of_int i) in do { tab.(i) := tval; incr cnt; match get_parents a with [ Some ifam -> let cpl = foi base ifam in let ifath = Adef.int_of_iper (get_father cpl) in let imoth = Adef.int_of_iper (get_mother cpl) in do { tab.(ifath) := tab.(ifath) - 1; tab.(imoth) := tab.(imoth) - 1; let new_list = if tab.(ifath) = 0 then [ifath :: new_list] else new_list in let new_list = if tab.(imoth) = 0 then [imoth :: new_list] else new_list in new_list } | _ -> new_list ] }) [] list in loop (tval + 1) new_list in loop 0 todo.val; if cnt.val <> nb_of_persons base then check_noloop base (fun [ OwnAncestor p -> raise (TopologicalSortError p) | _ -> assert False ]) else (); tab } ; value check_noloop_for_person_list base error ipl = let tab = Array.make (nb_of_persons base) NotVisited in let rec noloop ip = let i = Adef.int_of_iper ip in match tab.(i) with [ NotVisited -> do { match get_parents (poi base ip) with [ Some ifam -> let cpl = foi base ifam in do { tab.(i) := BeingVisited; Array.iter noloop (get_parent_array cpl); } | None -> () ]; tab.(i) := Visited; } | BeingVisited -> error (OwnAncestor (poi base ip)) | Visited -> () ] in List.iter noloop ipl ; value phony_rel = {weight1 = 0.0; weight2 = 0.0; relationship = 0.0; lens1 = []; lens2 = []; inserted = 0; elim_ancestors = False; anc_stat1 = MaybeAnc; anc_stat2 = MaybeAnc} ; value make_relationship_info base tstab = let tab = Array.make (nb_of_persons base) phony_rel in {tstab = tstab; reltab = tab; queue = [| |]} ; value rec insert_branch_len_rec ((len, n, ip) as x) = fun [ [] -> [(len, n, [ip])] | [((len1, n1, ipl1) as y) :: lens] -> if len = len1 then let n2 = n + n1 in let n2 = if n < 0 || n1 < 0 || n2 < 0 then -1 else n2 in [(len1, n2, [ip :: ipl1]) :: lens] else [y :: insert_branch_len_rec x lens] ] ; value insert_branch_len ip lens (len, n, ipl) = insert_branch_len_rec (succ len, n, ip) lens ; value consang_of p = if get_consang p = Adef.no_consang then 0.0 else Adef.float_of_fix (get_consang p) ; value relationship_and_links base ri b ip1 ip2 = let i1 = Adef.int_of_iper ip1 in let i2 = Adef.int_of_iper ip2 in if i1 = i2 then (1.0, []) else do { let reltab = ri.reltab in let tstab = ri.tstab in let yes_inserted = new_mark () in let reset u = let tu = reltab.(u) in if tu == phony_rel then reltab.(u) := {weight1 = 0.0; weight2 = 0.0; relationship = 0.0; lens1 = []; lens2 = []; inserted = yes_inserted; elim_ancestors = False; anc_stat1 = MaybeAnc; anc_stat2 = MaybeAnc} else do { tu.weight1 := 0.0; tu.weight2 := 0.0; tu.relationship := 0.0; tu.lens1 := []; tu.lens2 := []; tu.inserted := yes_inserted; tu.elim_ancestors := False; tu.anc_stat1 := MaybeAnc; tu.anc_stat2 := MaybeAnc } in let qi = ref (min tstab.(i1) tstab.(i2)) in let qmax = ref (-1) in let insert u = let v = tstab.(u) in do { reset u; if v >= Array.length ri.queue then let len = Array.length ri.queue in ri.queue := Array.append ri.queue (Array.make (v + 1 - len) []) else (); if qmax.val < 0 then do { for i = qi.val to v - 1 do { ri.queue.(i) := [] }; qmax.val := v; ri.queue.(v) := [u] } else do { if v > qmax.val then do { for i = qmax.val + 1 to v do { ri.queue.(i) := [] }; qmax.val := v } else (); ri.queue.(v) := [u :: ri.queue.(v)] } } in let relationship = ref 0.0 in let nb_anc1 = ref 1 in let nb_anc2 = ref 1 in let tops = ref [] in let treat_parent ip_from u y = do { if reltab.(y).inserted <> yes_inserted then insert y else (); let ty = reltab.(y) in let p1 = half u.weight1 in let p2 = half u.weight2 in if u.anc_stat1 = IsAnc && ty.anc_stat1 <> IsAnc then do { ty.anc_stat1 := IsAnc; incr nb_anc1 } else (); if u.anc_stat2 = IsAnc && ty.anc_stat2 <> IsAnc then do { ty.anc_stat2 := IsAnc; incr nb_anc2 } else (); ty.weight1 := ty.weight1 +. p1; ty.weight2 := ty.weight2 +. p2; ty.relationship := ty.relationship +. p1 *. p2; if u.elim_ancestors then ty.elim_ancestors := True else (); if b && not ty.elim_ancestors then do { ty.lens1 := List.fold_left (insert_branch_len ip_from) ty.lens1 u.lens1; ty.lens2 := List.fold_left (insert_branch_len ip_from) ty.lens2 u.lens2 } else () } in let treat_ancestor u = let tu = reltab.(u) in let a = poi base (Adef.iper_of_int u) in let contribution = tu.weight1 *. tu.weight2 -. tu.relationship *. (1.0 +. consang_of a) in do { if tu.anc_stat1 = IsAnc then decr nb_anc1 else (); if tu.anc_stat2 = IsAnc then decr nb_anc2 else (); relationship.val := relationship.val +. contribution; if b && contribution <> 0.0 && not tu.elim_ancestors then do { tops.val := [u :: tops.val]; tu.elim_ancestors := True } else (); match get_parents a with [ Some ifam -> let cpl = foi base ifam in do { treat_parent (Adef.iper_of_int u) tu (Adef.int_of_iper (get_father cpl)); treat_parent (Adef.iper_of_int u) tu (Adef.int_of_iper (get_mother cpl)) } | _ -> () ] } in insert i1; insert i2; reltab.(i1).weight1 := 1.0; reltab.(i2).weight2 := 1.0; reltab.(i1).lens1 := [(0, 1, [])]; reltab.(i2).lens2 := [(0, 1, [])]; reltab.(i1).anc_stat1 := IsAnc; reltab.(i2).anc_stat2 := IsAnc; while qi.val <= qmax.val && nb_anc1.val > 0 && nb_anc2.val > 0 do { List.iter treat_ancestor ri.queue.(qi.val); incr qi }; (half relationship.val, tops.val) } ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/pr_transl.ml0000660000175200017530000000743312664543647023555 0ustar guillaumeguillaume(* camlp5r q_MLast.cmo *) (* $Id: pr_transl.ml,v 5.5 2007-09-12 09:58:44 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open MLast; value not_impl name x = let desc = if Obj.is_block (Obj.repr x) then "tag = " ^ string_of_int (Obj.tag (Obj.repr x)) else "int_val = " ^ string_of_int (Obj.magic x) in failwith ("Pr_transl." ^ name ^ ": not impl " ^ desc) ; value trace = ["cftransl"; "transl"; "transl_nth"; "transl_decline"; "transl_decline2"; "ftransl"; "ftransl_nth"] ; value loc = Token.dummy_loc; value token_eval_string loc s = Token.eval_string loc s; value rec expr e = match e with [ <:expr< $lid:f$ $_$ $str:s$ >> when List.mem f trace -> Printf.printf "%s\n" (token_eval_string loc s) | <:expr< Util.$lid:f$ $_$ $str:s$ >> when List.mem f trace -> Printf.printf "%s\n" (token_eval_string loc s) | <:expr< $lid:f$ $_$ ($lid:g$ $_$ $str:s$ $_$) >> when List.mem f trace && List.mem g trace -> Printf.printf "%s\n" (token_eval_string loc s) | <:expr< $lid:x$ >> when List.mem x trace -> let loc = MLast.loc_of_expr e in let (fn, ln, bp, ep) = Stdpp.line_of_loc Pcaml.input_file.val loc in let fn = if fn = "" then Pcaml.input_file.val else fn in Printf.printf "File \"%s\", line %d, characters %d-%d: bad source\n" fn ln bp ep | <:expr< let $opt:_$ $list:pel$ in $e$ >> -> do { binding_list pel; expr e; () } | <:expr< fun [ $list:pel$ ] >> -> List.iter fun_binding pel | <:expr< match $e$ with [ $list:pel$ ] >> -> do { expr e; List.iter fun_binding pel; () } | <:expr< try $e$ with [ $list:pel$ ] >> -> do { expr e; List.iter fun_binding pel; () } | <:expr< do { $list:el$ } >> -> List.iter expr el | <:expr< if $e1$ then $e2$ else $e3$ >> -> do { expr e1; expr e2; expr e3; () } | <:expr< for $_$ = $_$ $to:_$ $_$ do { $list:el$ } >> -> List.iter expr el | <:expr< while $_$ do { $list:el$ } >> -> List.iter expr el | <:expr< let module $m$ = $me$ in $e$ >> -> expr e | <:expr< ($list:el$) >> -> List.iter expr el | <:expr< ($e$:$_$) >> -> expr e | <:expr< [| $list:el$ |] >> -> List.iter expr el | <:expr< $x$ $y$ >> -> do { expr x; expr y; () } | <:expr< { $list:fel$ } >> -> List.iter (fun (_, e) -> expr e) fel | <:expr< { ($e$) with $list:fel$ } >> -> do { expr e; List.iter (fun (_, e) -> expr e) fel; () } | <:expr< $_$ := $e$ >> -> expr e | <:expr< $_$.($_$) >> -> () | <:expr< $_$.[$_$] >> -> () | <:expr< $lid:_$ >> -> () | <:expr< $uid:_$ >> -> () | <:expr< $str:_$ >> -> () | <:expr< $int:_$ >> -> () | <:expr< $flo:_$ >> -> () | <:expr< $chr:_$ >> -> () | <:expr< $x$.$y$ >> -> () | <:expr< assert False >> -> () | x -> not_impl "expr" x ] and binding_list pel = List.iter binding pel and binding (p, e) = match p with [ <:patt< $lid:s$ >> when List.mem s trace -> () | _ -> expr e ] and fun_binding (p, _, e) = expr e; value rec module_expr = fun [ <:module_expr< $_$ . $_$ >> -> () | <:module_expr< $me1$ $me2$ >> -> do { module_expr me1; module_expr me2; () } | <:module_expr< struct $list:sil$ end >> -> List.iter str_item sil | <:module_expr< $uid:_$ >> -> () | <:module_expr< ($me$ : $_$) >> -> module_expr me | x -> not_impl "module_expr" x ] and str_item = fun [ <:str_item< declare $list:sil$ end >> -> List.iter str_item sil | <:str_item< open $_$ >> -> () | <:str_item< value $opt:_$ $list:pel$ >> -> binding_list pel | <:str_item< type $list:_$ >> -> () | <:str_item< exception $_$ of $list:_$ >> -> () | <:str_item< module $_$ = $me$ >> -> module_expr me | <:str_item< module type $_$ = $_$ >> -> () | <:str_item< $exp:e$ >> -> expr e | <:str_item< # $_$ $_$ >> -> () | x -> not_impl "str_item" x ] ; value f (ast, loc) = do { str_item ast; flush stdout; () }; Pcaml.print_implem.val := List.iter f; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/gwc.ml0000660000175200017530000001423312664543647022325 0ustar guillaumeguillaume(* camlp5r ./pa_lock.cmo *) (* $Id: gwc.ml,v 5.66 2008-01-14 16:47:00 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Gwcomp; open Printf; value check_magic = let b = Bytes.create (String.length magic_gwo) in fun fname ic -> do { really_input ic b 0 (String.length b); if b <> magic_gwo then if String.sub magic_gwo 0 4 = String.sub b 0 4 then failwith ("\"" ^ fname ^ "\" is a GeneWeb object file, but not compatible") else failwith ("\"" ^ fname ^ "\" is not a GeneWeb object file, or it is a very old version") else () } ; value next_family_fun_templ gwo_list fi = do { let ngwo = List.length gwo_list in let run = if ngwo < 10 || not Mutil.verbose.val then fun () -> () else if ngwo < 60 then fun () -> do { Printf.eprintf "."; flush stderr; } else do { let bar_cnt = ref 0 in let run () = do { ProgrBar.run bar_cnt.val ngwo; incr bar_cnt } in ProgrBar.empty.val := 'o'; ProgrBar.full.val := '*'; ProgrBar.start (); run } in let ic_opt = ref None in let gwo_list = ref gwo_list in fun () -> loop () where rec loop () = let r = match ic_opt.val with [ Some ic -> match try Some (input_value ic : gw_syntax) with [ End_of_file -> None ] with [ Some fam -> Some fam | None -> do { close_in ic; ic_opt.val := None; None } ] | None -> None ] in match r with [ Some fam -> Some fam | None -> match gwo_list.val with [ [(x, separate, shift) :: rest] -> do { run (); gwo_list.val := rest; let ic = open_in_bin x in check_magic x ic; fi.Db1link.f_curr_src_file := input_value ic; fi.Db1link.f_curr_gwo_file := x; fi.Db1link.f_separate := separate; fi.Db1link.f_shift := shift; Hashtbl.clear fi.Db1link.f_local_names; ic_opt.val := Some ic; loop (); } | [] -> do { if ngwo < 10 || not Mutil.verbose.val then () else if ngwo < 60 then do { Printf.eprintf "\n"; flush stderr } else ProgrBar.finish (); None } ] ] }; value just_comp = ref False; value out_file = ref (Filename.concat Filename.current_dir_name "a"); value force = ref False; value separate = ref False; value shift = ref 0; value files = ref []; value speclist = [("-c", Arg.Set just_comp, "Only compiling"); ("-o", Arg.String (fun s -> out_file.val := s), " Output database (default: a.gwb)"); ("-f", Arg.Set force, " Remove database if already existing"); ("-stats", Arg.Set Db1link.pr_stats, "Print statistics"); ("-nc", Arg.Clear Db1link.do_check, "No consistency check"); ("-cg", Arg.Set Db1link.do_consang, "Compute consanguinity"); ("-sep", Arg.Set separate, " Separate all persons in next file"); ("-sh", Arg.Int (fun x -> shift.val := x), " Shift all persons numbers in next files"); ("-ds", Arg.String (fun s -> Db1link.default_source.val := s), "\ Set the source field for persons and families without source data"); ("-part", Arg.String (fun s -> Db1link.particules_file.val := s), "\ Particles file (default = predefined particles)"); ("-mem", Arg.Set Outbase.save_mem, " Save memory, but slower"); ("-nolock", Arg.Set Lock.no_lock_flag, " do not lock database."); ("-nofail", Arg.Set Gwcomp.no_fail, " no failure in case of error."); ("-nopicture", Arg.Set Gwcomp.no_picture, " do not create associative pictures"); ("-q", Arg.Clear Mutil.verbose, " no verbose"); ("-v", Arg.Set Mutil.verbose, " verbose")] ; value anonfun x = let sep = separate.val in do { if Filename.check_suffix x ".gw" then () else if Filename.check_suffix x ".gwo" then () else raise (Arg.Bad ("Don't know what to do with \"" ^ x ^ "\"")); separate.val := False; files.val := [(x, sep, shift.val) :: files.val] } ; value errmsg = "\ Usage: gwc [options] [files] where [files] are a list of files: source files end with .gw object files end with .gwo and [options] are:" ; value main () = do { Mutil.verbose.val := False; Argl.parse speclist anonfun errmsg; Secure.set_base_dir (Filename.dirname out_file.val); let gwo = ref [] in List.iter (fun (x, separate, shift) -> if Filename.check_suffix x ".gw" then do { try Gwcomp.comp_families x with e -> do { printf "File \"%s\", line %d:\n" x line_cnt.val; raise e }; gwo.val := [(x ^ "o", separate, shift) :: gwo.val]; } else if Filename.check_suffix x ".gwo" then gwo.val := [(x, separate, shift) :: gwo.val] else raise (Arg.Bad ("Don't know what to do with \"" ^ x ^ "\""))) (List.rev files.val); if not just_comp.val then do { let bdir = if Filename.check_suffix out_file.val ".gwb" then out_file.val else out_file.val ^ ".gwb" in if not force.val && Sys.file_exists bdir then do { printf "\ The database \"%s\" already exists. Use option -f to overwrite it. " out_file.val; flush stdout; exit 2 } else (); lock (Mutil.lock_file out_file.val) with [ Accept -> let bdir = if Filename.check_suffix out_file.val ".gwb" then out_file.val else out_file.val ^ ".gwb" in let next_family_fun = next_family_fun_templ (List.rev gwo.val) in if Db1link.link next_family_fun bdir then () else do { eprintf "*** database not created\n"; flush stderr; exit 2; } | Refuse -> do { printf "Base is locked: cannot write it\n"; flush stdout; exit 2 } ]; } else (); } ; value print_exc = fun [ Failure txt -> do { printf "Failed: %s\n" txt; flush stdout; exit 2 } | exc -> Printexc.catch raise exc ] ; try main () with exc -> print_exc exc; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/phonygwd.ml0000660000175200017530000000402312664543647023400 0ustar guillaumeguillaume(* $Id: phonygwd.ml,v 5.2 2007-01-19 01:53:16 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) value port_selected = ref 2317; value fname = ref ""; value log addr request s = let referer = Wserver.extract_param "referer: " '\n' request in let user_agent = Wserver.extract_param "user-agent: " '\n' request in do { let tm = Unix.localtime (Unix.time ()) in Printf.eprintf "%02d/%02d/%02d %02d:%02d" tm.Unix.tm_mday (succ tm.Unix.tm_mon) tm.Unix.tm_year tm.Unix.tm_hour tm.Unix.tm_min; Printf.eprintf " %s\n" s; match addr with [ Unix.ADDR_UNIX x -> () | Unix.ADDR_INET iaddr port -> Printf.eprintf " From: %s\n" (try (Unix.gethostbyaddr iaddr).Unix.h_name with _ -> Unix.string_of_inet_addr iaddr) ]; Printf.eprintf " Agent: %s\n" user_agent; if referer <> "" then Printf.eprintf " Referer: %s\n" referer else (); flush stderr; } ; value print_text fname = let ic = Secure.open_in fname in do { try while True do { print_char (input_char ic) } with [ End_of_file -> () ]; close_in ic; Wserver.wflush (); } ; value connection (addr, request) script_name contents = let str = script_name ^ "?" ^ contents in do { log addr request str; Wserver.html ""; print_text fname.val; Wserver.wflush (); } ; value main () = let usage = "Usage: " ^ Sys.argv.(0) ^ " [-p #] " in let speclist = [("-p", Arg.Int (fun x -> port_selected.val := x), "#: port number")] in do { Argl.parse speclist (fun s -> fname.val := s) usage; if fname.val = "" then do { Printf.eprintf "Missing file\n"; Printf.eprintf "Use option -help for usage\n"; flush stderr; exit 1 } else (); close_in (Secure.open_in fname.val); Wserver.f None port_selected.val 0 (Some 4) connection; } ; try main () with [ Unix.Unix_error err fun_name arg -> do { Printf.eprintf "Error: \"%s\", %s\n" fun_name (Unix.error_message err); flush stderr; exit 1 } | exc -> Printexc.catch raise exc ]; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/merge.mli0000660000175200017530000000044012664543647023010 0ustar guillaumeguillaume(* $Id: merge.mli,v 5.5 2007-01-19 01:53:16 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Gwdb; open Config; value print_someone : config -> base -> person -> unit; value print : config -> base -> person -> unit; value print_possible_continue_merging : config -> base -> unit; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/consangAll.ml0000660000175200017530000001106712664543647023630 0ustar guillaumeguillaume(* $Id: consangAll.ml,v 5.35 2007/02/21 18:14:01 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Def; open Gwdb; value designation base p = let first_name = p_first_name base p in let nom = p_surname base p in Mutil.iso_8859_1_of_utf_8 (first_name ^ "." ^ string_of_int (get_occ p) ^ " " ^ nom) ; value rec clear_descend_consang base cset mark ifam = let des = foi base ifam in Array.iter (fun ip -> if not mark.(Adef.int_of_iper ip) then do { cset (Adef.int_of_iper ip) Adef.no_consang; mark.(Adef.int_of_iper ip) := True; let u = poi base ip in Array.iter (clear_descend_consang base cset mark) (get_family u) } else ()) (get_children des) ; value relationship base tab ip1 ip2 = fst (Consang.relationship_and_links base tab False ip1 ip2) ; value trace quiet cnt max_cnt = do { if quiet then ProgrBar.run (max_cnt - cnt) max_cnt else do { Printf.eprintf "%7d\008\008\008\008\008\008\008" cnt; flush stderr; } } ; value compute base tlim from_scratch quiet = do { let () = load_ascends_array base in let () = load_couples_array base in let (fget, cget, cset, carray) = ascends_array base in try do { let tab = let ts = Consang.topological_sort base poi in Consang.make_relationship_info base ts in let consang_tab = Array.make (nb_of_families base) Adef.no_consang in let cnt = ref 0 in if not from_scratch then let mark = Array.make (nb_of_persons base) False in match patched_ascends base with [ [] -> () | list -> List.iter (fun ip -> let u = poi base ip in Array.iter (clear_descend_consang base cset mark) (get_family u)) list ] else (); for i = 0 to nb_of_persons base - 1 do { if from_scratch then do { cset i Adef.no_consang; incr cnt; } else do { let cg = cget i in match fget i with [ Some ifam -> consang_tab.(Adef.int_of_ifam ifam) := cg | None -> () ]; if cg = Adef.no_consang then incr cnt else () }; }; let max_cnt = cnt.val in let most = ref None in Printf.eprintf "To do: %d persons\n" max_cnt; if max_cnt = 0 then () else if quiet then ProgrBar.start () else Printf.eprintf "Computing consanguinity..."; flush stderr; let running = ref True in let end_time = Unix.time () +. float tlim in while running.val && (tlim < 0 || Unix.time () < end_time) do { running.val := False; for i = 0 to nb_of_persons base - 1 do { if cget i = Adef.no_consang then match fget i with [ Some ifam -> let pconsang = consang_tab.(Adef.int_of_ifam ifam) in if pconsang = Adef.no_consang then let cpl = foi base ifam in let ifath = get_father cpl in let imoth = get_mother cpl in if cget (Adef.int_of_iper ifath) != Adef.no_consang && cget (Adef.int_of_iper imoth) != Adef.no_consang then do { let consang = relationship base tab ifath imoth in trace quiet cnt.val max_cnt; decr cnt; let cg = Adef.fix_of_float consang in cset i cg; consang_tab.(Adef.int_of_ifam ifam) := cg; if not quiet then let better = match most.val with [ Some m -> cg > cget m | None -> True ] in if better then do { Printf.eprintf "\nMax consanguinity %g for %s... " consang (designation base (poi base (Adef.iper_of_int i))); flush stderr; most.val := Some i } else () else () } else running.val := True else do { trace quiet cnt.val max_cnt; decr cnt; cset i pconsang; } | None -> do { trace quiet cnt.val max_cnt; decr cnt; cset i (Adef.fix_of_float 0.0); } ] else () } }; if max_cnt = 0 then () else if quiet then ProgrBar.finish () else Printf.eprintf " done \n"; flush stderr; } with [ Sys.Break -> do { Printf.eprintf "\n"; flush stderr; () } ]; carray }; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/title.ml0000660000175200017530000004475512664543647022702 0ustar guillaumeguillaume(* camlp5r ./pa_html.cmo *) (* $Id: title.ml,v 5.30 2007-09-12 09:58:44 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Config; open Def; open Gutil; open Gwdb; open Hutil; open Mutil; open Util; type date_search = [ JustSelf | AddSpouse | AddChildren ]; value infinity = 10000; value date_interval conf base t x = let d1 = ref {day = 0; month = 0; year = infinity; prec = Sure; delta = 0} in let d2 = ref {day = 0; month = 0; year = 0; prec = Sure; delta = 0} in let found = ref False in do { let rec loop t x = let set d = do { if CheckItem.strictly_before_dmy d d1.val then d1.val := d else (); if CheckItem.strictly_after_dmy d d2.val then d2.val := d else (); found.val := True; } in do { match Adef.od_of_codate (get_birth x) with [ Some (Dgreg d _) -> set d | _ -> () ]; match Adef.od_of_codate (get_baptism x) with [ Some (Dgreg d _) -> set d | _ -> () ]; match CheckItem.date_of_death (get_death x) with [ Some (Dgreg d _) -> set d | _ -> if get_death x = NotDead then set conf.today else () ]; List.iter (fun t -> do { match Adef.od_of_codate t.t_date_start with [ Some (Dgreg d _) -> set d | _ -> () ]; match Adef.od_of_codate t.t_date_end with [ Some (Dgreg d _) -> set d | _ -> () ]; }) (Util.nobtit conf base x); match t with [ JustSelf -> () | _ -> let u = pget conf base (get_key_index x) in Array.iter (fun ifam -> let fam = foi base ifam in let md = get_marriage fam in let conj = spouse (get_key_index x) fam in do { match Adef.od_of_codate md with [ Some (Dgreg d _) -> set d | _ -> () ]; loop JustSelf (pget conf base conj); match t with [ AddChildren -> Array.iter (fun e -> loop JustSelf (pget conf base e)) (get_children fam) | _ -> () ]; }) (get_family u) ]; } in loop t x; if found.val then Some (d1.val, d2.val) else None } ; value compare_title_dates conf base (x1, t1) (x2, t2) = match ((get_birth x1, Adef.od_of_codate t1.t_date_start, Adef.od_of_codate t1.t_date_end, get_death x1), (get_birth x2, Adef.od_of_codate t2.t_date_start, Adef.od_of_codate t2.t_date_end, get_death x2)) with [ ((_, Some (Dgreg d1 _), _, _), (_, Some (Dgreg d2 _), _, _)) -> if CheckItem.strictly_before_dmy d1 d2 then -1 else if d1.year = d2.year then match (Adef.od_of_codate t1.t_date_end, Adef.od_of_codate t2.t_date_end) with [ (Some d1, Some d2) -> if not (CheckItem.strictly_after d1 d2) then -1 else 1 | _ -> -1 ] else 1 | ((_, _, Some (Dgreg _ _ as d1), _), (_, _, Some (Dgreg _ _ as d2), _)) -> if not (CheckItem.strictly_before d2 d1) then -1 else 1 | ((_, _, _, Death _ d1), (_, Some d2, _, _)) when not (CheckItem.strictly_before d2 (Adef.date_of_cdate d1)) -> -1 | ((_, Some (Dgreg _ _ as d1), _, _), (_, _, _, Death _ d2)) when not (CheckItem.strictly_before d1 (Adef.date_of_cdate d2)) -> 1 | _ -> match (date_interval conf base JustSelf x1, date_interval conf base JustSelf x2) with [ (Some (d11, d12), Some (d21, d22)) -> if not (CheckItem.strictly_before_dmy d21 d12) then -1 else if not (CheckItem.strictly_before_dmy d11 d22) then 1 else if CheckItem.strictly_after_dmy d21 d11 then -1 (* else if CheckItem.strictly_after_dmy d22 d12 then -1 *) else 1 | _ -> match (date_interval conf base AddSpouse x1, date_interval conf base AddSpouse x2) with [ (Some (d11, d12), Some (d21, d22)) -> if not (CheckItem.strictly_before_dmy d21 d12) then -1 else if not (CheckItem.strictly_before_dmy d11 d22) then 1 else if not (CheckItem.strictly_before_dmy d22 d12) then -1 else 1 | _ -> match (date_interval conf base AddChildren x1, date_interval conf base AddChildren x2) with [ (Some (d11, d12), Some (d21, d22)) -> if not (CheckItem.strictly_before_dmy d21 d12) then -1 else if not (CheckItem.strictly_before_dmy d11 d22) then 1 else if not (CheckItem.strictly_before_dmy d22 d12) then -1 else 1 | (Some _, None) -> -1 | (None, Some _) -> 1 | (None, None) -> -1 ] ] ] ] ; value compare_title_order conf base (x1, t1) (x2, t2) = if t1.t_nth = 0 || t2.t_nth = 0 || t1.t_nth = t2.t_nth then compare_title_dates conf base (x1, t1) (x2, t2) else compare t1.t_nth t2.t_nth ; value my_alphabetic n1 n2 = (* compare (Name.abbrev (Name.lower n1)) (Name.abbrev (Name.lower n2)) *) compare (Name.lower n1) (Name.lower n2) (**) ; value string_list_uniq l = let l = List.fold_left (fun l e -> match l with [ [] -> [e] | [x :: _] -> if my_alphabetic e x = 0 then l else [e :: l] ]) [] l in List.rev l ; value string_cnt_list_uniq l = let l = List.fold_left (fun l (e, c) -> match l with [ [] -> [(e, c)] | [(x, d) :: l1] -> if my_alphabetic e x = 0 then [(x, c + d) :: l1] else [(e, c) :: l] ]) [] l in List.rev l ; value compare_places p1 p2 = compare (Name.lower p1) (Name.lower p2); value compare_titles t1 t2 = my_alphabetic t1 t2; value compare_titles2 (t1, _) (t2, _) = my_alphabetic t1 t2; (* value strip_abbrev_lower s = Name.strip (Name.abbrev (Name.lower s)); *) value strip_abbrev_lower s = Name.lower s; (**) value select_title_place conf base title place = do { let list = ref [] in let clean_title = ref title in let clean_place = ref place in let all_names = ref [] in let title1 = strip_abbrev_lower title in let place1 = strip_abbrev_lower place in let absolute = p_getenv conf.env "a" = Some "A" in let select x t = if absolute && sou base t.t_ident = title && sou base t.t_place = place || not absolute && strip_abbrev_lower (sou base t.t_ident) = title1 && strip_abbrev_lower (sou base t.t_place) = place1 then do { let tn = sou base t.t_ident in clean_title.val := tn; clean_place.val := sou base t.t_place; list.val := [(x, t) :: list.val]; if not (List.mem tn all_names.val) then all_names.val := [tn :: all_names.val] else (); } else () in for i = 0 to nb_of_persons base - 1 do { let x = pget conf base (Adef.iper_of_int i) in List.iter (select x) (nobtit conf base x) }; (list.val, clean_title.val, clean_place.val, all_names.val) }; value select_all_with_place conf base place = let list = ref [] in let clean_place = ref place in let place = strip_abbrev_lower place in let select x t = if strip_abbrev_lower (sou base t.t_place) = place then do { clean_place.val := sou base t.t_place; list.val := [(x, t) :: list.val] } else () in do { for i = 0 to nb_of_persons base - 1 do { let x = pget conf base (Adef.iper_of_int i) in List.iter (select x) (nobtit conf base x) }; (list.val, clean_place.val) } ; value select_title conf base title = let set = ref StrSet.empty in let clean_name = ref title in let all_names = ref [] in let absolute = p_getenv conf.env "a" = Some "A" in let title2 = strip_abbrev_lower title in let add_place t = let tn = sou base t.t_ident in if absolute && tn = title || not absolute && strip_abbrev_lower tn = title2 then do { let pn = sou base t.t_place in if not (StrSet.mem pn set.val) then do { clean_name.val := tn; set.val := StrSet.add pn set.val; } else (); if not (List.mem tn all_names.val) then all_names.val := [tn :: all_names.val] else (); } else () in do { for i = 0 to nb_of_persons base - 1 do { let x = pget conf base (Adef.iper_of_int i) in List.iter add_place (nobtit conf base x) }; (StrSet.elements set.val, clean_name.val, all_names.val) } ; value select_place conf base place = let list = ref [] in let clean_name = ref place in let place2 = strip_abbrev_lower place in let add_title t = let pn = sou base t.t_place in if strip_abbrev_lower pn = place2 then let tn = sou base t.t_ident in if not (List.mem tn list.val) then do { clean_name.val := pn; list.val := [tn :: list.val] } else () else () in do { for i = 0 to nb_of_persons base - 1 do { let x = pget conf base (Adef.iper_of_int i) in List.iter add_title (nobtit conf base x) }; (list.val, clean_name.val) } ; value select_all proj conf base = let s = loop 0 StrSet.empty where rec loop i s = if i = nb_of_persons base then s else let x = pget conf base (Adef.iper_of_int i) in let s = List.fold_left (fun s t -> StrSet.add (sou base (proj t)) s) s (nobtit conf base x) in loop (i + 1) s in StrSet.elements s ; value select_all2 proj conf base = do { let ht = Hashtbl.create 1 in for i = 0 to nb_of_persons base - 1 do { let x = pget conf base (Adef.iper_of_int i) in List.iter (fun t -> let s = sou base (proj t) in let cnt = try Hashtbl.find ht s with [ Not_found -> do { let cnt = ref 0 in Hashtbl.add ht s cnt; cnt } ] in incr cnt) (nobtit conf base x); }; Hashtbl.fold (fun s cnt list -> [(s, cnt.val) :: list]) ht [] }; value select_all_titles = select_all2 (fun t -> t.t_ident); value select_all_places = select_all (fun t -> t.t_place); value give_access_someone conf base (x, t) list = let t_date_start = Adef.od_of_codate t.t_date_start in let t_date_end = Adef.od_of_codate t.t_date_end in let has_dates = match (t_date_start, t_date_end) with [ (Some (Dgreg _ _), _) | (_, Some (Dgreg _ _)) -> True | _ -> False ] in do { if has_dates then Wserver.wprint "" else (); match t_date_start with [ Some (Dgreg d _) -> Wserver.wprint "%d" d.year | _ -> () ]; match t_date_end with [ Some (Dgreg d _) -> Wserver.wprint "-%d" d.year | _ -> () ]; if has_dates then Wserver.wprint ": " else (); if List.mem x list then Wserver.wprint "" else Wserver.wprint "" (commd conf) (acces conf base x); match (t.t_name, get_public_name x, get_qualifiers x) with [ (Tmain, pn, [nn :: _]) when sou base pn <> "" -> Wserver.wprint "%s %s %s" (sou base pn) (sou base nn) (p_surname base x) | (Tmain, pn, []) when sou base pn <> "" -> Wserver.wprint "%s %s" (sou base pn) (p_surname base x) | (Tname n, _, [nn :: _]) -> Wserver.wprint "%s %s %s" (sou base n) (sou base nn) (p_surname base x) | (Tname n, _, []) -> Wserver.wprint "%s %s" (sou base n) (p_surname base x) | _ -> Wserver.wprint "%s" (person_text conf base x) ]; Wserver.wprint "\n"; Wserver.wprint "%s" (Date.short_dates_text conf base x); if t.t_nth <> 0 then Wserver.wprint " (%s)" (if t.t_nth >= 100 then string_of_int t.t_nth else transl_nth conf "nth" t.t_nth) else (); if List.mem x list then Wserver.wprint "" else Wserver.wprint ""; } ; value give_access_title conf t p = do { Wserver.wprint "" (commd conf) (code_varenv t) (code_varenv p); Wserver.wprint "%s" (capitale t); Wserver.wprint "\n"; } ; value give_access_all_titles conf t absolute = stag "a" "href=\"%sm=TT;sm=S;t=%s%s\"" (commd conf) (code_varenv t) (if absolute then ";a=A" else "") begin Wserver.wprint "%s" (if absolute then t else capitale t); end ; value give_access_all_places conf t = do { Wserver.wprint "" (commd conf) (code_varenv t); Wserver.wprint "... %s" t; Wserver.wprint "\n"; } ; value print_title_place_list conf base t p t_equiv list = let absolute = p_getenv conf.env "a" = Some "A" in let title h = if h || absolute then do { Wserver.wprint "%s" t; if p <> "" then Wserver.wprint " %s" p else () } else list_iter_first (fun first t -> do { if not first then Wserver.wprint ",\n" else (); Wserver.wprint "" (commd conf) (code_varenv t); Wserver.wprint "%s" t; if p <> "" then do { Wserver.wprint "\n" (commd conf) (code_varenv p); Wserver.wprint "%s" p; } else () }) t_equiv in do { header conf title; tag "ul" begin let _ = List.fold_left (fun list x -> do { stagn "li" begin give_access_someone conf base x list; end; [fst x :: list] }) [] list in (); end; let (list, _) = List.fold_left (fun (list, n) (p, _) -> let list = if List.mem_assq p list then list else [(p, n) :: list] in (list, n + 1)) ([], 1) list in match List.rev list with [ [_; _ :: _] as list -> tag "p" begin Wserver.wprint " do { Wserver.wprint ";i%d=%d;t%d=%d" i (Adef.int_of_iper (get_key_index p)) i n; i + 1 }) 1 list in Wserver.wprint ";lim=6\">%s\n" (capitale (transl conf "tree")); end | _ -> () ]; trailer conf; } ; value print_all_with_place_list conf base p list = let title _ = Wserver.wprint "... %s\n" p in do { header conf title; Wserver.wprint "
        \n"; let _ = List.fold_left (fun list ((p, t) as x) -> do { html_li conf; give_access_someone conf base x []; Wserver.wprint ", %s\n" (sou base t.t_ident); Wserver.wprint "\n"; [fst x :: list] }) [] list in Wserver.wprint "
      \n"; trailer conf; } ; value print_title_place conf base t p = let (l, t, p, t_equiv) = select_title_place conf base t p in let list = List.sort (compare_title_order conf base) l in print_title_place_list conf base t p t_equiv list ; value print_all_with_place conf base p = let (l, p) = select_all_with_place conf base p in let list = List.sort (compare_title_dates conf base) l in print_all_with_place_list conf base p list ; value print_places_list conf base t t_equiv list = do { let title h = if h || List.length t_equiv = 1 then Wserver.wprint "%s" t else list_iter_first (fun first t -> do { Wserver.wprint "%s" (if first then "" else ", "); give_access_all_titles conf t True; }) t_equiv in let order s = capitale (Name.lower (surname_end base s)) in let list = List.sort (fun s1 s2 -> compare (order s1) (order s2)) list in let absolute = p_getenv conf.env "a" = Some "A" in let wprint_elem p = stag "a" "href=\"%sm=TT;sm=S;t=%s;p=%s%s\"" (commd conf) (code_varenv t) (code_varenv p) (if absolute then ";a=A" else "") begin if p = "" then Wserver.wprint "..." else Wserver.wprint "%s%s" (surname_end base p) (surname_begin base p); end in header conf title; wprint_in_columns conf order wprint_elem list; trailer conf; }; value print_places conf base t = let (l, t, t_equiv) = select_title conf base t in let list = string_list_uniq (List.sort compare_places l) in match list with [ [p] -> print_title_place conf base t p | _ -> print_places_list conf base t t_equiv list ] ; value print_titles conf base p = let (l, p) = select_place conf base p in let list = string_list_uniq (List.sort compare_titles l) in let title _ = Wserver.wprint "... %s" p in do { header conf title; tag "ul" begin List.iter (fun t -> stagn "li" begin give_access_title conf t p; end) list; end; if List.length list > 1 then stagn "a" "href=\"%sm=TT;sm=A;p=%s\"" (commd conf) (code_varenv p) begin Wserver.wprint "%s" (capitale (transl conf "the whole list")); end else (); trailer conf; } ; value print_all_titles conf base = do { let title _ = Wserver.wprint "%s" (capitale (transl conf "all the titles")) in let list = let l = select_all_titles conf base in string_cnt_list_uniq (List.sort compare_titles2 l) in let order (s, _) = capitale (Name.lower s) in let wprint_elem (t, cnt) = do { give_access_all_titles conf t False; Wserver.wprint " (%d)" cnt; } in header conf title; wprint_in_columns conf order wprint_elem list; trailer conf; }; value print_all_places conf base = do { let title _ = Wserver.wprint "%s" (capitale (transl conf "all the estates")) in let list = let l = select_all_places conf base in string_list_uniq (List.sort compare_places l) in header conf title; tag "ul" begin List.iter (fun t -> do { stagn "li" begin give_access_all_places conf t; end; }) list; end; trailer conf; }; value print conf base = do { Wserver.wrap_string.val := Util.xml_pretty_print; match (p_getenv conf.env "sm", p_getenv conf.env "t", p_getenv conf.env "p") with [ (Some "S", Some t, Some p) -> print_title_place conf base t p | (Some "S", Some t, None) -> print_places conf base t | (Some "S", None, Some p) -> print_titles conf base p | (Some "A", None, Some p) -> print_all_with_place conf base p | (_, Some "" | None, Some "" | None) -> print_all_titles conf base | (_, Some "" | None, Some "*") -> print_all_places conf base | (_, Some "" | None, Some p) -> print_titles conf base p | (_, Some t, Some "" | None) -> print_places conf base t | (_, Some t, Some p) -> print_title_place conf base t p ] }; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/mergeInd.ml0000660000175200017530000006400512664543647023301 0ustar guillaumeguillaume(* camlp5r ./pa_html.cmo ./pa_lock.cmo *) (* $Id: mergeInd.ml,v 5.55 2008-01-21 14:02:36 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Config; open Def; open Gutil; open Gwdb; open Hutil; open Util; value print_differences conf base branches p1 p2 = let gen_string_field chk1 chk2 str_orig title name proj = let x1 = proj p1 in let x2 = proj p2 in if x1 <> "" && x1 <> "?" && x2 <> "" && x2 <> "?" && x1 <> x2 then do { Wserver.wprint "

      %s

      \n" (capitale title); tag "ul" begin tag "li" begin xtag "input" "type=\"radio\" name=\"%s\" value=\"1\"%s" name chk1; Wserver.wprint "%s\n" x1; end; tag "li" begin xtag "input" "type=\"radio\" name=\"%s\" value=\"2\"%s" name chk2; Wserver.wprint "%s\n" x2; end; end; } else () in let string_field = gen_string_field " checked" "" in tag "form" "method=\"post\" action=\"%s\"" conf.command begin tag "p" begin Util.hidden_env conf; xtag "input" "type=\"hidden\" name=\"m\" value=\"MRG_IND_OK\""; xtag "input" "type=\"hidden\" name=\"i1\" value=\"%d\"" (Adef.int_of_iper (get_key_index p1)); xtag "input" "type=\"hidden\" name=\"i2\" value=\"%d\"" (Adef.int_of_iper (get_key_index p2)); loop branches where rec loop = fun [ [(ip1, ip2)] -> do { xtag "input" "type=\"hidden\" name=\"ini1\" value=\"%d\"" (Adef.int_of_iper ip1); xtag "input" "type=\"hidden\" name=\"ini2\" value=\"%d\"" (Adef.int_of_iper ip2); } | [_ :: branches] -> loop branches | _ -> () ]; match (p_getenv conf.env "m", p_getint conf.env "ip") with [ (Some "MRG_DUP_IND_Y_N", Some ip) -> do { xtag "input" "type=\"hidden\" name=\"ip\" value=\"%d\"" ip; List.iter (fun excl_name -> match p_getenv conf.env excl_name with [ Some "" | None -> () | Some s -> xtag "input" "type=\"hidden\" name=\"%s\" value=\"%s\"" excl_name s ]) ["iexcl"; "fexcl"] } | _ -> () ]; end; html_p conf; string_field True (transl_nth conf "first name/first names" 0) "first_name" (fun p -> p_first_name base p); string_field True (transl_nth conf "surname/surnames" 0) "surname" (fun p -> p_surname base p); let select_smallest_num = p_first_name base p1 = p_first_name base p2 in gen_string_field (if get_occ p1 < get_occ p2 || not select_smallest_num then " checked" else "") (if get_occ p1 > get_occ p2 && select_smallest_num then " checked" else "") False (transl conf "number") "number" (fun p -> string_of_int (get_occ p)); string_field True (transl_nth conf "image/images" 0) "image" (fun p -> let v = image_and_size conf base p (limited_image_size 75 100) in match v with [ Some (False, link, _) -> "" | _ -> sou base (get_image p) ]); string_field True (transl conf "public name") "public_name" (fun p -> sou base (get_public_name p)); string_field True (transl_nth conf "occupation/occupations" 0) "occupation" (fun p -> sou base (get_occupation p)); string_field False (transl conf "sex") "sex" (fun p -> match get_sex p with [ Male -> "M" | Female -> "F" | Neuter -> "" ]); (* string_field False (transl conf "access") "access" (fun p -> match p.access with [ IfTitles -> transl conf "if titles" | Private -> "private" | Public -> "public" ]); *) string_field False (transl conf "birth") "birth" (fun p -> match Adef.od_of_codate (get_birth p) with [ None -> "" | Some d -> Date.string_of_ondate conf d ]); string_field True (transl conf "birth" ^ " / " ^ transl conf "place") "birth_place" (fun p -> sou base (get_birth_place p)); string_field False (transl conf "baptism") "baptism" (fun p -> match Adef.od_of_codate (get_baptism p) with [ None -> "" | Some d -> Date.string_of_ondate conf d ]); string_field True (transl conf "baptism" ^ " / " ^ transl conf "place") "baptism_place" (fun p -> sou base (get_baptism_place p)); string_field False (transl conf "death") "death" (fun p -> let is = 2 in match get_death p with [ NotDead -> transl_nth conf "alive" is | Death dr cd -> let s = match dr with [ Killed -> transl_nth conf "killed (in action)" is | Murdered -> transl_nth conf "murdered" is | Executed -> transl_nth conf "executed (legally killed)" is | Disappeared -> transl_nth conf "disappeared" is | Unspecified -> transl_nth conf "died" is ] in s ^ " " ^ Date.string_of_ondate conf (Adef.date_of_cdate cd) | DeadYoung -> transl_nth conf "died young" is | DeadDontKnowWhen -> transl_nth conf "died" is | DontKnowIfDead | OfCourseDead -> "" ]); string_field True (transl conf "death" ^ " / " ^ transl conf "place") "death_place" (fun p -> sou base (get_death_place p)); string_field False (transl conf "burial") "burial" (fun p -> let is = 2 in match get_burial p with [ UnknownBurial -> "" | Buried cod -> transl_nth conf "buried" is ^ (match Adef.od_of_codate cod with [ None -> "" | Some d -> " " ^ Date.string_of_ondate conf d ]) | Cremated cod -> transl_nth conf "cremated" is ^ (match Adef.od_of_codate cod with [ None -> "" | Some d -> " " ^ Date.string_of_ondate conf d ]) ]); string_field True (transl conf "burial" ^ " / " ^ transl conf "place") "burial_place" (fun p -> sou base (get_burial_place p)); html_p conf; Wserver.wprint "\n"; end ; value compatible_codates cd1 cd2 = cd1 = cd2 || cd2 = Adef.codate_None || cd1 = Adef.codate_None; value compatible_cdates cd1 cd2 = cd1 = cd2; value compatible_death_reasons dr1 dr2 = dr1 = dr2 || dr2 = Unspecified; value compatible_deaths d1 d2 = if d1 = d2 then True else match (d1, d2) with [ (Death dr1 cd1, Death dr2 cd2) -> compatible_death_reasons dr1 dr2 && compatible_cdates cd1 cd2 | (Death _ _, NotDead) -> False | (Death _ _, _) -> True | (_, DontKnowIfDead) -> True | (DontKnowIfDead, _) -> True | _ -> False ] ; value compatible_burials b1 b2 = if b1 = b2 then True else match (b1, b2) with [ (_, UnknownBurial) -> True | (UnknownBurial, _) -> True | (Buried cd1, Buried cd2) -> compatible_codates cd1 cd2 | (Cremated cd1, Cremated cd2) -> compatible_codates cd1 cd2 | _ -> False ] ; value compatible_strings s1 s2 = eq_istr s1 s2 || is_empty_string s2 || is_empty_string s1; value compatible_divorces d1 d2 = d1 = d2; value compatible_relation_kinds rk1 rk2 = rk1 = rk2; value compatible_accesses a1 a2 = (*a1 = a2*)True; value compatible_titles t1 t2 = Futil.eq_lists (Futil.eq_titles eq_istr) t1 t2 || t2 = []; value compatible_strings_lists sl1 sl2 = sl2 = [] || Futil.eq_lists eq_istr sl1 sl2; value compatible_notes base s1 s2 = compatible_strings s1 s2 || sou base s1 = sou base s2; value compatible_ind base p1 p2 = eq_istr (get_first_name p1) (get_first_name p2) && eq_istr (get_surname p1) (get_surname p2) && compatible_strings (get_image p1) (get_image p2) && compatible_strings (get_public_name p1) (get_public_name p2) && compatible_strings_lists (get_qualifiers p1) (get_qualifiers p2) && compatible_strings_lists (get_aliases p1) (get_aliases p2) && compatible_strings_lists (get_first_names_aliases p1) (get_first_names_aliases p2) && compatible_strings_lists (get_surnames_aliases p1) (get_surnames_aliases p2) && compatible_titles (get_titles p1) (get_titles p2) && get_rparents p2 = [] && get_related p2 = [] && compatible_strings (get_occupation p1) (get_occupation p2) && compatible_accesses (get_access p1) (get_access p2) && compatible_codates (get_birth p1) (get_birth p2) && compatible_strings (get_birth_place p1) (get_birth_place p2) && compatible_codates (get_baptism p1) (get_baptism p2) && compatible_strings (get_baptism_place p1) (get_baptism_place p2) && compatible_deaths (get_death p1) (get_death p2) && compatible_strings (get_death_place p1) (get_death_place p2) && compatible_burials (get_burial p1) (get_burial p2) && compatible_strings (get_burial_place p1) (get_burial_place p2) && compatible_notes base (get_notes p1) (get_notes p2) ; value compatible_fam base fam1 fam2 = compatible_codates (get_marriage fam1) (get_marriage fam2) && compatible_strings (get_marriage_place fam1) (get_marriage_place fam2) && Array.length (get_witnesses fam2) = 0 && compatible_relation_kinds (get_relation fam1) (get_relation fam2) && compatible_divorces (get_divorce fam1) (get_divorce fam2) && compatible_strings (get_fsources fam1) (get_fsources fam2) ; value propose_merge_ind conf base branches p1 p2 = let title h = let s = transl_nth conf "person/persons" 1 in Wserver.wprint "%s" (capitale (transl_decline conf "merge" s)) in do { header conf title; if branches <> [] then do { Wserver.wprint "%s:\n" (capitale (transl conf "you must first merge")); tag "ul" begin html_li conf; stag "a" "href=\"%s%s\"" (commd conf) (acces conf base p1) begin Merge.print_someone conf base p1; end; Wserver.wprint "\n%s\n" (transl_nth conf "and" 0); stag "a" "href=\"%s%s\"" (commd conf) (acces conf base p2) begin Merge.print_someone conf base p2; end; Wserver.wprint "\n"; end; html_p conf; } else (); print_differences conf base branches p1 p2; if branches <> [] then do { html_p conf; xtag "hr"; html_p conf; Wserver.wprint "%s:\n" (capitale (transl_nth conf "branch/branches" 1)); html_p conf; tag "table" begin List.iter (fun (ip1, ip2) -> let p1 = poi base ip1 in let p2 = poi base ip2 in do { tag "tr" "align=\"%s\"" conf.left begin tag "td" begin Wserver.wprint "\n%s" (referenced_person_text conf base p1); Wserver.wprint "%s" (Date.short_dates_text conf base p1); end; tag "td" begin Wserver.wprint "\n%s" (referenced_person_text conf base p2); Wserver.wprint "%s" (Date.short_dates_text conf base p2); end; end; }) [(get_key_index p1, get_key_index p2) :: branches]; end; } else (); trailer conf; } ; value reparent_ind base warning ip1 ip2 = let a1 = poi base ip1 in let a2 = poi base ip2 in match (get_parents a1, get_parents a2) with [ (None, Some ifam) -> do { let des = gen_descend_of_descend (foi base ifam) in let rec replace i = if des.children.(i) = ip2 then des.children.(i) := ip1 else replace (i + 1) in replace 0; let a1 = {parents = Some ifam; consang = Adef.fix (-1)} in patch_ascend base ip1 a1; patch_descend base ifam des; } | (Some ifam, None) -> do { let fam = foi base ifam in let children = get_children fam in match CheckItem.sort_children base children with [ Some (b, a) -> do { let des = gen_descend_of_descend fam in patch_descend base ifam des; warning (ChangedOrderOfChildren ifam fam b a); } | None -> () ] } | _ -> () ] ; value effective_merge_ind conf base warning p1 p2 = do { let u2 = poi base (get_key_index p2) in if Array.length (get_family u2) <> 0 then do { for i = 0 to Array.length (get_family u2) - 1 do { let ifam = (get_family u2).(i) in let cpl = foi base ifam in let cpl = if get_key_index p2 = get_father cpl then couple False (get_key_index p1) (get_mother cpl) else if get_key_index p2 = get_mother cpl then couple False (get_father cpl) (get_key_index p1) else assert False in patch_couple base ifam cpl; }; let u1 = {family = Array.append (get_family p1) (get_family u2)} in patch_union base (get_key_index p1) u1; let u2 = {family = [| |]} in patch_union base (get_key_index p2) u2; } else (); let p1 = {(gen_person_of_person p1) with sex = if get_sex p2 <> Neuter then get_sex p2 else get_sex p1; birth = if get_birth p1 = Adef.codate_None then get_birth p2 else get_birth p1; birth_place = if is_empty_string (get_birth_place p1) then get_birth_place p2 else get_birth_place p1; birth_src = if is_empty_string (get_birth_src p1) then get_birth_src p2 else get_birth_src p1; baptism = if get_baptism p1 = Adef.codate_None then get_baptism p2 else get_baptism p1; baptism_place = if is_empty_string (get_baptism_place p1) then get_baptism_place p2 else get_baptism_place p1; baptism_src = if is_empty_string (get_baptism_src p1) then get_baptism_src p2 else get_baptism_src p1; death = if get_death p1 = DontKnowIfDead then get_death p2 else get_death p1; death_place = if is_empty_string (get_death_place p1) then get_death_place p2 else get_death_place p1; death_src = if is_empty_string (get_death_src p1) then get_death_src p2 else get_death_src p1; burial = if get_burial p1 = UnknownBurial then get_burial p2 else get_burial p1; burial_place = if is_empty_string (get_burial_place p1) then get_burial_place p2 else get_burial_place p1; burial_src = if is_empty_string (get_burial_src p1) then get_burial_src p2 else get_burial_src p1; occupation = if is_empty_string (get_occupation p1) then get_occupation p2 else get_occupation p1; notes = if is_empty_string (get_notes p1) then get_notes p2 else get_notes p1} in patch_person base p1.key_index p1; reparent_ind base warning p1.key_index (get_key_index p2); delete_key base (sou base (get_first_name p2)) (sou base (get_surname p2)) (get_occ p2); let p2 = UpdateIndOk.effective_del conf base warning p2 in patch_person base p2.key_index p2; let s = let sl = [p1.notes; p1.occupation; p1.birth_src; p1.baptism_src; p1.death_src; p1.burial_src; p1.psources] in String.concat " " (List.map (sou base) sl) in Notes.update_notes_links_db conf (NotesLinks.PgInd p1.key_index) s; } ; value is_ancestor base ip1 ip2 = let visited = Array.make (nb_of_persons base) False in let rec loop ip = if visited.(Adef.int_of_iper ip) then False else if ip = ip1 then True else do { visited.(Adef.int_of_iper ip) := True; match get_parents (poi base ip) with [ Some ifam -> let cpl = foi base ifam in loop (get_father cpl) || loop (get_mother cpl) | None -> False ] } in loop ip2 ; value error_loop conf base p = let title _ = Wserver.wprint "%s" (capitale (transl conf "error")) in do { rheader conf title; print_link_to_welcome conf True; Wserver.wprint "%s%s %s" (p_first_name base p) (if get_occ p = 0 then "" else "." ^ string_of_int (get_occ p)) (p_surname base p); Wserver.wprint "\n%s\n" (transl conf "would be his/her own ancestor"); Wserver.wprint "\n"; trailer conf; } ; value merge_ind conf base warning branches ip1 ip2 changes_done = let p1 = poi base ip1 in let p2 = poi base ip2 in if is_ancestor base ip1 ip2 then do { error_loop conf base p2; (False, False) } else if is_ancestor base ip2 ip1 then do { error_loop conf base p1; (False, False) } else if compatible_ind base p1 p2 then do { effective_merge_ind conf base warning p1 p2; (True, True) } else do { propose_merge_ind conf base branches p1 p2; (False, changes_done) } ; value propose_merge_fam conf base branches fam1 fam2 p1 p2 = let title h = let s = transl_nth conf "family/families" 1 in Wserver.wprint "%s" (capitale (transl_decline conf "merge" s)) in do { header conf title; Wserver.wprint "%s:\n" (capitale (transl conf "you must first merge the 2 families")); tag "ul" begin html_li conf; stag "a" "href=\"%s%s\"" (commd conf) (acces conf base p1) begin Merge.print_someone conf base p1; end; Wserver.wprint "\n%s\n" (transl conf "with"); stag "a" "href=\"%s%s\"" (commd conf) (acces conf base p2) begin Merge.print_someone conf base p2; end; Wserver.wprint "\n"; end; html_p conf; MergeFam.print_differences conf base branches fam1 fam2; trailer conf; } ; value effective_merge_fam conf base (ifam1, fam1) (ifam2, fam2) p1 p2 = do { let des1 = fam1 in let des2 = fam2 in let fam1 = {(gen_family_of_family fam1) with marriage = if get_marriage fam1 = Adef.codate_None then get_marriage fam2 else get_marriage fam1; marriage_place = if is_empty_string (get_marriage_place fam1) then get_marriage_place fam2 else get_marriage_place fam1; marriage_src = if is_empty_string (get_marriage_src fam1) then get_marriage_src fam2 else get_marriage_src fam1; fsources = if is_empty_string (get_fsources fam1) then get_fsources fam2 else get_fsources fam1} in let des1 = let children = Array.append (get_children des1) (get_children des2) in let _ : option _ = CheckItem.sort_children base children in {children = children} in UpdateFamOk.effective_del conf base (ifam2, fam2); for i = 0 to Array.length (get_children des2) - 1 do { let ip = (get_children des2).(i) in let a = {parents = Some ifam1; consang = Adef.fix (-1)} in patch_ascend base ip a; }; patch_family base ifam1 fam1; patch_descend base ifam1 des1; }; value merge_fam conf base branches ifam1 ifam2 ip1 ip2 changes_done = let p1 = poi base ip1 in let p2 = poi base ip2 in let fam1 = foi base ifam1 in let fam2 = foi base ifam2 in if compatible_fam base fam1 fam2 then do { effective_merge_fam conf base (ifam1, fam1) (ifam2, fam2) p1 p2; (True, True) } else do { propose_merge_fam conf base branches (ifam1, fam1) (ifam2, fam2) p1 p2; (False, changes_done) } ; value not_found_or_incorrect conf = let title _ = Wserver.wprint "%s" (capitale (transl conf "error")) in do { rheader conf title; Wserver.wprint "%s %s %s %s %s\n" (capitale (transl conf "not found")) (transl conf "or") (transl conf "several answers") (transl conf "or") (transl conf "incorrect request"); trailer conf; } ; value same_person conf = let title _ = Wserver.wprint "%s" (capitale (transl conf "error")) in do { rheader conf title; Wserver.wprint "%s\n" (capitale (transl conf "it is the same person!")); trailer conf; } ; value different_sexes conf = let title _ = Wserver.wprint "%s" (capitale (transl conf "error")) in do { rheader conf title; Wserver.wprint "%s.\n" (capitale (transl conf "incompatible sexes")); trailer conf; } ; value rec try_merge conf base warning branches ip1 ip2 changes_done = let a1 = poi base ip1 in let a2 = poi base ip2 in let ok_so_far = True in let (ok_so_far, changes_done) = match (get_parents a1, get_parents a2) with [ (Some ifam1, Some ifam2) when ifam1 <> ifam2 -> let branches = [(ip1, ip2) :: branches] in let cpl1 = foi base ifam1 in let cpl2 = foi base ifam2 in let (ok_so_far, changes_done) = if ok_so_far then if get_father cpl1 = get_father cpl2 then (True, changes_done) else let warning _ = () in try_merge conf base warning branches (get_father cpl1) (get_father cpl2) changes_done else (False, changes_done) in let (ok_so_far, changes_done) = if ok_so_far then if get_mother cpl1 = get_mother cpl2 then (True, changes_done) else let warning _ = () in try_merge conf base warning branches (get_mother cpl1) (get_mother cpl2) changes_done else (False, changes_done) in let (ok_so_far, changes_done) = if ok_so_far then merge_fam conf base branches ifam1 ifam2 (get_father cpl1) (get_mother cpl1) changes_done else (False, changes_done) in (ok_so_far, changes_done) | _ -> (ok_so_far, changes_done) ] in if ok_so_far then merge_ind conf base warning branches ip1 ip2 changes_done else (False, changes_done) ; value print_merged conf base wl p = do { let title _ = Wserver.wprint "%s" (capitale (transl conf "merge done")) in Wserver.wrap_string.val := Util.xml_pretty_print; header conf title; print_link_to_welcome conf True; tag "ul" begin tag "li" begin Wserver.wprint "%s\n" (referenced_person_text conf base p); end; end; match (p_getenv conf.env "m", p_getint conf.env "ip") with [ (Some "MRG_DUP_IND_Y_N", Some ip) -> let s1 = match p_getenv conf.env "iexcl" with [ Some "" | None -> "" | Some s -> ";iexcl=" ^ s ] in let s2 = match p_getenv conf.env "fexcl" with [ Some "" | None -> "" | Some s -> ";fexcl=" ^ s ] in tag "p" begin stag "a" "href=%sm=MRG_DUP;ip=%d%s%s" (commd conf) ip s1 s2 begin Wserver.wprint "%s" (capitale (transl conf "continue merging")); end; Wserver.wprint "\n(%s)\n" (Util.transl_a_of_b conf (transl conf "possible duplications") (referenced_person_text conf base (poi base (Adef.iper_of_int ip)))); end | _ -> () ]; Update.print_warnings conf base wl; trailer conf; }; value print conf base = let p1 = match p_getint conf.env "i" with [ Some i1 -> Some (poi base (Adef.iper_of_int i1)) | None -> None ] in let p2 = match p_getint conf.env "i2" with [ Some i2 -> Some (poi base (Adef.iper_of_int i2)) | None -> match (p_getenv conf.env "select", p_getenv conf.env "n") with [ (Some "input" | None, Some n) -> let ipl = Gutil.person_ht_find_all base n in match ipl with [ [ip2] -> Some (poi base ip2) | _ -> None ] | (Some x, Some "" | None) -> Some (poi base (Adef.iper_of_int (int_of_string x))) | _ -> None ] ] in match (p1, p2) with [ (Some p1, Some p2) -> if get_key_index p1 = get_key_index p2 then same_person conf else if get_sex p1 <> get_sex p2 && get_sex p1 <> Neuter && get_sex p2 <> Neuter then different_sexes conf else if is_ancestor base (get_key_index p1) (get_key_index p2) then error_loop conf base p2 else if is_ancestor base (get_key_index p2) (get_key_index p1) then error_loop conf base p1 else let rev_wl = ref [] in let warning w = rev_wl.val := [w :: rev_wl.val] in let (ok, changes_done) = try_merge conf base warning [] (get_key_index p1) (get_key_index p2) False in do { if changes_done then Util.commit_patches conf base else (); if ok then do { let changed = let p1 = Util.string_gen_person base (gen_person_of_person p1) in let p2 = Util.string_gen_person base (gen_person_of_person p2) in U_Merge_person p2 p1 p1 in History.record conf base changed "fp"; Update.delete_topological_sort conf base; print_merged conf base (List.rev rev_wl.val) p1; } else (); } | _ -> not_found_or_incorrect conf ] ; (* Undocumented feature... Kill someone's ancestors *) value rec kill_ancestors conf base included_self p nb_ind nb_fam = do { match get_parents p with [ Some ifam -> let cpl = foi base ifam in do { kill_ancestors conf base True (poi base (get_father cpl)) nb_ind nb_fam; kill_ancestors conf base True (poi base (get_mother cpl)) nb_ind nb_fam; UpdateFamOk.effective_del conf base (ifam, foi base ifam); incr nb_fam; } | None -> () ]; if included_self then do { let ip = get_key_index p in let warning _ = () in let p = UpdateIndOk.effective_del conf base warning p in patch_person base ip p; incr nb_ind; } else (); } ; value print_killed conf base p nb_ind nb_fam = let title _ = Wserver.wprint "Ancestors killed" in do { Hutil.header conf title; Wserver.wprint "%s's ancestors killed.
      \n" (referenced_person_title_text conf base p); Wserver.wprint "%d persons and %d families deleted

      \n" nb_ind nb_fam; Hutil.trailer conf; } ; value print_kill_ancestors conf base = match p_getenv conf.base_env "can_kill_ancestors" with [ Some "yes" -> match find_person_in_env conf base "" with [ Some p -> let nb_ind = ref 0 in let nb_fam = ref 0 in do { kill_ancestors conf base False p nb_ind nb_fam; Util.commit_patches conf base; let changed = U_Kill_ancestors (Util.string_gen_person base (gen_person_of_person p)) in History.record conf base changed "ka"; print_killed conf base p nb_ind.val nb_fam.val; } | None -> incorrect_request conf ] | _ -> incorrect_request conf ] ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/dag.mli0000660000175200017530000000161412664543647022450 0ustar guillaumeguillaume(* $Id: dag.mli,v 5.1 2006-09-15 11:45:37 ddr Exp $ *) open Config; open Dag2html; open Def; open Gwdb; module Pset : sig type elt = iper and t = 'a; value empty : t; value add : elt -> t -> t; end ; type item = [ Item of person and string ]; (**) type sum 'a 'b = [ Left of 'a | Right of 'b ]; (**) value image_txt : config -> base -> person -> string; (**) value make_tree_hts : config -> base -> (person -> item) -> (iper -> string) -> bool -> Pset.t -> list (iper * (iper * option ifam)) -> dag (sum iper 'a) -> html_table string string; (**) value print_slices_menu_or_dag_page : config -> base -> string -> html_table string string -> string -> unit; value make_and_print_dag : config -> base -> (person -> item) -> (iper -> string) -> bool -> Pset.t -> list (iper * (iper * option ifam)) -> string -> string -> unit; value print : config -> base -> unit; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/name.mli0000660000175200017530000000337412664543647022642 0ustar guillaumeguillaume(* $Id: name.mli,v 5.2 2007-01-19 01:53:16 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) value lower : string -> string; (* Name.lower: - uppercase -> lowercase - no accents - chars no letters and no numbers (except '.') => spaces (stripped) Key comparison (first name, surname, number) applies "lower" equality on first names and surnames *) value abbrev : string -> string; (* Name.abbrev: suppress lowercase particles, shorten "saint" into "st" *) value strip : string -> string; (* Name.strip = name without spaces *) value strip_c : string -> char -> string; (* Name.strip_c = name without the charater c given as parameter *) value crush : string -> string; (* Name.crush: - no spaces - roman numbers are keeped - vowels are suppressed, except in words starting with a vowel, where this vowel is converted into "e" - "k" and "q" replaced by "c" - "y" replaced by "i" - "z" replaced by "s" - "ph" replaced by "f" - others "h" deleted - s at end of words are deleted - no double lowercase consons *) value strip_lower : string -> string; (* strip_lower = strip o lower, as first comparison of names. First names and Surnames comparison is strip_lower equality. *) value purge : string -> string ; (* String without any forbidden caracters defined in forbidden_char *) value crush_lower : string -> string; (* crush_lower = crush o abbrev o lower, as second comparison of names. In index by names, the "names" are crush_lowers *) value next_chars_if_equiv : string -> int -> string -> int -> option (int * int) ; value unaccent_utf_8 : bool -> string -> int -> (string * int); value nbc : char -> int; value utf_8_db : ref bool; value forbidden_char : list char ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/pqueue.mli0000660000175200017530000000212712664543647023221 0ustar guillaumeguillaume(* $Id: pqueue.mli,v 5.2 2007-01-19 01:53:16 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) (* Module [Pqueue]: priority queues. *) (* This module implements priority queues, given a total ordering function over the elements inserted. All operations are purely applicative (no side effects). The implementation uses binomial queues from Chris Okasak. "add", "take" and "union" are in o(log n) in the worst case. *) module type OrderedType = sig type t = 'a; value leq : t -> t -> bool; end; (* The input signature of the functor [Pqueue.Make]. [t] is the type of the inserted elements. [leq] is a total ordering function over the elements. This is a two-argument function [f] returning [True] if the first argument is less or equal to the second one. *) module type S = sig type elt = 'a; type t = 'a; value empty : t; value is_empty : t -> bool; value add : elt -> t -> t; value take : t -> (elt * t); value union : t -> t -> t; end ; module Make (Ord : OrderedType) : S with type elt = Ord.t ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/hutil.mli0000660000175200017530000000162412664543647023043 0ustar guillaumeguillaume(* $Id: hutil.mli,v 5.4 2007-01-17 15:07:26 ddr Exp $ *) (* Copyright (c) 2007 INRIA *) open Config; open Gwdb; value header : config -> (bool -> unit) -> unit; value print_link_to_welcome : config -> bool -> unit; value trailer : config -> unit; value header_without_page_title : config -> (bool -> unit) -> unit; value header_without_http : config -> (bool -> unit) -> unit; value header_no_page_title : config -> (bool -> unit) -> unit; value rheader : config -> (bool -> unit) -> unit; value link_to_referer : config -> string; value gen_print_link_to_welcome : (unit -> unit) -> config -> bool -> unit; value gen_trailer : bool -> config -> unit; value incorrect_request : config -> unit; value interp : config -> base -> string -> Templ.interp_fun 'a 'b -> Templ.env 'a -> 'b -> unit; value interp_no_header : config -> base -> string -> Templ.interp_fun 'a 'b -> Templ.env 'a -> 'b -> unit; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/history.ml0000660000175200017530000006065312664543647023255 0ustar guillaumeguillaume(* camlp5r *) (* $Id: history.ml,v 5.14 2007-09-12 09:58:44 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Config; open Def; open Gutil; open Gwdb; open TemplAst; open Util; value file_name conf = let bname = if Filename.check_suffix conf.bname ".gwb" then conf.bname else conf.bname ^ ".gwb" in Filename.concat (Util.base_path [] bname) "history" ; (* Record history when committing updates *) value ext_flags = [Open_wronly; Open_append; Open_creat; Open_text; Open_nonblock] ; (* ********************************************************************** *) (* [Fonc] slash_name_of_key : string -> string -> int -> string *) (** [Description] : Renvoie la clé nom/prénom/occ. [Args] : - fn : string - sn : string - occ : int [Retour] : string [Rem] : Non exporté en clair hors de ce module. *) (* ********************************************************************** *) value slash_name_of_key fn sn occ = let space_to_unders = Mutil.tr ' ' '_' in let fn = space_to_unders (Name.lower fn) in let sn = space_to_unders (Name.lower sn) in sn ^ "/" ^ fn ^ "/" ^ string_of_int occ ; (* ********************************************************************** *) (* [Fonc] diff_visibility : config -> base -> gen_person -> gen_person -> string array *) (** [Description] : Si la visibilité de la personne a changé (entre l'ancienne et la nouvelle), alors on revoie un tableau avec la nouvelle visibilité. [Args] : - conf : configuration de la base - base : base de donnée - op : la person avant les modifications - np : la person après les modifications [Retour] : string array [Rem] : Non exporté en clair hors de ce module. *) (* ********************************************************************** *) value diff_visibility conf base op np = let k = slash_name_of_key np.first_name np.surname np.occ in let empty_union = {family = [| |]} in let empty_ascend = {parents = None; consang = Adef.fix (-1)} in let op = Futil.map_person_ps (fun p -> p) (Gwdb.insert_string base) op in let np = Futil.map_person_ps (fun p -> p) (Gwdb.insert_string base) np in let o_p = Gwdb.person_of_gen_person base (op, empty_ascend, empty_union) in let n_p = Gwdb.person_of_gen_person base (np, empty_ascend, empty_union) in let tmp_conf = {(conf) with wizard = False; friend = False} in let old_visibility = Util.authorized_age tmp_conf base o_p in let new_visibility = Util.authorized_age tmp_conf base n_p in if old_visibility <> new_visibility then [| "VISIBLE"; k; string_of_bool new_visibility |] else [| |] ; type kind_diff = [ Diff_person of gen_person iper string and gen_person iper string | Diff_string of (string * string * int) and (string * string * int) ] ; (* ********************************************************************** *) (* [Fonc] diff_key : gen_person -> gen_person -> string array *) (** [Description] : Si la clé de la personne a changé, alors on renvoie un tableau avec l'ancienne clé et la nouvelle clé. [Args] : - op : la person avant les modifications - np : la person après les modifications [Retour] : string array [Rem] : Non exporté en clair hors de ce module. *) (* ********************************************************************** *) value diff_key d = match d with [ Diff_person op np -> let o_key = slash_name_of_key op.first_name op.surname op.occ in let n_key = slash_name_of_key np.first_name np.surname np.occ in if o_key <> n_key then [| "KEY"; o_key; n_key |] else [| |] | Diff_string (ofn, osn, oocc) (fn, sn, occ) -> let o_key = slash_name_of_key ofn osn oocc in let n_key = slash_name_of_key fn sn occ in if o_key <> n_key then [| "KEY"; o_key; n_key |] else [| |] ] ; (* ********************************************************************** *) (* [Fonc] diff_person : config -> base -> gen_person -> gen_person -> string array *) (** [Description] : Fonction qui ajouté des paramètres passés dans la ligne de commande de notify_change. Elle permet de savoir quelle genre de modifications ont été faites. [Args] : - conf : configuration de la base - base : base de donnée - op : la person avant les modifications - np : la person après les modifications [Retour] : string array [Rem] : Non exporté en clair hors de ce module. *) (* ********************************************************************** *) value diff_person conf base changed = match changed with [ U_Add_person p | U_Delete_person p -> [| |] | U_Modify_person o n -> Array.append (diff_key (Diff_person o n)) (diff_visibility conf base o n) | U_Merge_person p1 p2 p -> let args_p1 = Array.append (diff_key (Diff_person p1 p)) (diff_visibility conf base p1 p) in let args_p2 = Array.append (diff_key (Diff_person p2 p)) (diff_visibility conf base p2 p) in Array.append args_p1 args_p2 | U_Send_image _ | U_Delete_image _ | U_Add_family _ _ | U_Modify_family _ _ _ | U_Delete_family _ _ | U_Invert_family _ _ | U_Merge_family _ _ _ _ | U_Add_parent _ _ -> [| |] | U_Change_children_name _ l -> List.fold_left (fun accu ((ofn, osn, oocc, _), (fn, sn, occ, _)) -> Array.append accu (diff_key (Diff_string (ofn, osn, oocc) (fn, sn, occ)))) [| |] l | U_Multi _ | U_Notes _ _ | U_Kill_ancestors _ -> [| |] ] ; (* ************************************************************************ *) (* [Fonc] notify_change : config -> base -> base_changed -> string -> unit *) (** [Description] : Appel le script défini par la variable notify_change du fichier gwf. [Args] : - conf : configuration de la base - base : base de donnée - changed : le type de modification (voir def.mli) - action : le code du type de modification [Retour] : Néant [Rem] : Non exporté en clair hors de ce module. *) (* ************************************************************************ *) value notify_change conf base changed action = IFDEF UNIX THEN match p_getenv conf.base_env "notify_change" with [ Some comm -> let base_args = match changed with [ U_Add_person p | U_Modify_person _ p | U_Delete_person p | U_Merge_person _ _ p | U_Send_image p | U_Delete_image p | U_Add_family p _ | U_Modify_family p _ _ | U_Delete_family p _ | U_Invert_family p _ | U_Merge_family p _ _ _ | U_Add_parent p _ | U_Kill_ancestors p | U_Change_children_name p _ | U_Multi p -> let key = slash_name_of_key p.first_name p.surname p.occ in [| key; string_of_int (Adef.int_of_iper (p.key_index)) |] | U_Notes (Some num) file -> [| file; string_of_int num |] | U_Notes None file -> [| file |] ] in let optional_args = diff_person conf base changed in let args = Array.append base_args optional_args in let args = Array.append [| comm; conf.bname; conf.user; action |] args in match Unix.fork () with [ 0 -> if Unix.fork () <> 0 then exit 0 else do { try Unix.execvp comm args with _ -> (); exit 0 } | id -> ignore (Unix.waitpid [] id) ] | None -> () ] ELSE () END ; (* ************************************************************************ *) (* [Fonc] gen_record : config -> base -> base_changed -> string -> unit *) (** [Description] : Enregistre dans le fichier historique si la variable "hitory" du fichier gwf est valorisée à "yes". Le fait qu'on ait des gen_person, nous permet de pouvoir faire un diff entre avant et après la modification d'une personne. [Args] : - conf : configuration de la base - base : base de donnée - changed : le type de modification (voir def.mli) - action : le code du type de modification [Retour] : Néant [Rem] : Non exporté en clair hors de ce module. *) (* ************************************************************************ *) value gen_record conf base changed action = do { match p_getenv conf.base_env "history" with [ Some "yes" when not conf.manitou -> let item = match changed with [ U_Add_person p | U_Modify_person _ p | U_Delete_person p | U_Merge_person _ _ p | U_Send_image p | U_Delete_image p | U_Add_family p _ | U_Modify_family p _ _ | U_Delete_family p _ | U_Invert_family p _ | U_Merge_family p _ _ _ | U_Add_parent p _ | U_Kill_ancestors p | U_Change_children_name p _ | U_Multi p -> p.first_name ^ "." ^ string_of_int p.occ ^ " " ^ p.surname | U_Notes (Some num) file -> let s = string_of_int num in if file = "" then s else file ^ "/" ^ s | U_Notes None file -> file ] in let fname = file_name conf in match try Some (Secure.open_out_gen ext_flags 0o644 fname) with [ Sys_error _ -> None ] with [ Some oc -> let (hh, mm, ss) = conf.time in do { Printf.fprintf oc "%04d-%02d-%02d %02d:%02d:%02d [%s] %s %s\n" conf.today.year conf.today.month conf.today.day hh mm ss conf.user action item; close_out oc; } | None -> () ] | _ -> () ]; History_diff.record_diff conf base changed; (* Effet de bord des modifications en masse : on peut facilement *) (* créer 5000 nouveaux processus à chaque mise à jour. *) (* Pour éviter cela, on n'appelle jamais notify_change lors de la *) (* mise à jour de l'historique. *) match changed with [ U_Multi _ -> () | _ -> notify_change conf base changed action ] } ; (* ************************************************************************ *) (* [Fonc] record : config -> base -> base_changed -> string -> unit *) (** [Description] : Suite à la mise à jour de la base, on réalise les traitements suivant : - mise à jour (si nécessaire) du fichier gwf pour le sosa_ref - mise à jour du fichier historique - appel du script notify_change [Args] : - conf : configuration de la base - base : base de donnée - changed : le type de modification (voir def.mli) - action : le code du type de modification [Retour] : Néant [Rem] : Non exporté en clair hors de ce module. *) (* ************************************************************************ *) value record conf base changed action = do { (* Mise à jour du fichier gwf si le sosa_ref a changé. *) match changed with [ U_Modify_person _ p -> let (fn, sn, occ, ip) = (p.first_name, p.surname, p.occ, p.key_index) in update_gwf_sosa conf base (ip, (fn, sn, occ)) | U_Merge_person p1 _ p -> do { let (fn, sn, occ, ip) = (p1.first_name, p1.surname, p1.occ, p1.key_index) in update_gwf_sosa conf base (ip, (fn, sn, occ)); (* On n'a pas besoin de faire un update sur "p2" *) (* parce qu'on le fait sur p dans tous les cas. *) let (fn, sn, occ, ip) = (p.first_name, p.surname, p.occ, p.key_index) in update_gwf_sosa conf base (ip, (fn, sn, occ)); } | U_Change_children_name _ l -> List.iter (fun (_, (fn, sn, occ, ip)) -> update_gwf_sosa conf base (ip, (fn, sn, occ))) l | _ -> () ]; (* Mise à jour du fichier historique et appel de notify_change. *) gen_record conf base changed action } ; (* ************************************************************************ *) (* [Fonc] notify : config -> base -> string -> unit *) (** [Description] : Appel explicite de notify_change suite à une modification de masse de la base (typiquement, le dico des lieux). On évite comme ça la création de 5000 processus. [Args] : - conf : configuration de la base - base : base de donnée - action : le code du type de modification [Retour] : Néant [Rem] : Non exporté en clair hors de ce module. *) (* ************************************************************************ *) value notify conf base action = let empty_person = Gwdb.empty_person base (Adef.iper_of_int (-1)) in let empty_person = Util.string_gen_person base (gen_person_of_person empty_person) in notify_change conf base (U_Multi empty_person) action ; (* Request for history printing *) exception Begin_of_file; value buff_get_rev len = let s = Bytes.create len in do { for i = 0 to len - 1 do { Bytes.set s i Buff.buff.val.[len - 1 - i] }; s } ; value rev_input_char ic (rbuff, rpos) pos = do { if rpos.val = 0 then do { if String.length rbuff.val < 65536 then let len = if rbuff.val = "" then 1024 else 2 * String.length rbuff.val in rbuff.val := Bytes.create len else (); let ppos = max (pos - String.length rbuff.val) 0 in seek_in ic ppos; really_input ic rbuff.val 0 (pos - ppos); rpos.val := pos - ppos; } else (); decr rpos; rbuff.val.[rpos.val] } ; value rev_input_line ic pos (rbuff, rpos) = if pos <= 0 then raise Begin_of_file else let rec loop len pos = if pos <= 0 then (buff_get_rev len, pos) else match rev_input_char ic (rbuff, rpos) pos with [ '\n' -> (buff_get_rev len, pos) | c -> loop (Buff.store len c) (pos - 1) ] in loop 0 (pos - 1) ; value line_tpl = "0000-00-00 00:00:00 xx ."; value line_fields line = if String.length line > String.length line_tpl then let time = String.sub line 0 19 in let (user, i) = match (line.[20], Mutil.lindex line ']') with [ ('[', Some i) -> let user = String.sub line 21 (i - 21) in (user, i + 2) | _ -> ("", 20) ] in let action = String.sub line i 2 in let key = let i = i + 3 in if i >= String.length line then None else Some (String.sub line i (String.length line - i)) in Some (time, user, action, key) else None ; type hist_item = [ HI_notes of string and option int | HI_ind of person | HI_none ] ; type env 'a = [ Vcnt of ref int | Vinfo of string and string and string and hist_item and string | Vpos of ref int | Vsearch of option (bool * string * int) | Vother of 'a | Vnone ] ; value get_env v env = try List.assoc v env with [ Not_found -> Vnone ]; value get_vother = fun [ Vother x -> Some x | _ -> None ]; value set_vother x = Vother x; value possibly_highlight env s = match get_env "search" env with [ Vsearch (Some (case_sens, h, _)) -> if in_text case_sens h s then html_highlight case_sens h s else s | _ -> s ] ; value rec eval_var conf base env xx loc = fun [ ["count"] -> match get_env "count" env with [ Vcnt c -> VVstring (string_of_int c.val) | _ -> VVstring "" ] | ["first_name"] -> match get_env "info" env with [ Vinfo _ _ _ (HI_ind p) _ -> VVstring (p_first_name base p) | _ -> VVstring "" ] | ["found"] -> match get_env "search" env with [ Vsearch (Some _) -> VVbool True | _ -> VVbool False ] | ["incr_count"] -> match get_env "count" env with [ Vcnt c -> do { incr c; VVstring "" } | _ -> VVstring "" ] | ["is_note"] -> match get_env "info" env with [ Vinfo _ _ _ (HI_notes _ _) _ -> VVbool True | _ -> VVbool False ] | ["key"] -> match get_env "info" env with [ Vinfo _ _ _ _ s -> VVstring (possibly_highlight env s) | _ -> raise Not_found ] | ["note"; "page" :: sl] -> match get_env "info" env with [ Vinfo _ _ _ (HI_notes s _) _ -> let s = match sl with [ ["v"] -> s | [] -> possibly_highlight env s | _ -> raise Not_found ] in VVstring s | _ -> raise Not_found ] | ["note"; "part"] -> match get_env "info" env with [ Vinfo _ _ _ (HI_notes _ (Some x)) _ -> VVstring (string_of_int x) | Vinfo _ _ _ (HI_notes _ None) _ -> VVstring "" | _ -> raise Not_found ] | ["occ"] -> match get_env "info" env with [ Vinfo _ _ _ (HI_ind p) _ -> VVstring (string_of_int (get_occ p)) | _ -> VVstring "" ] | ["person" :: sl] -> match get_env "info" env with [ Vinfo _ _ _ (HI_ind p) _ -> eval_person_field_var conf base env p sl | _ -> raise Not_found ] | ["pos"] -> match get_env "pos" env with [ Vpos r -> VVstring (string_of_int r.val) | _ -> raise Not_found ] | ["reset_count"] -> match get_env "count" env with [ Vcnt c -> do { c.val := 0; VVstring "" } | _ -> VVstring "" ] | ["surname"] -> match get_env "info" env with [ Vinfo _ _ _ (HI_ind p) _ -> VVstring (p_surname base p) | _ -> VVstring "" ] | ["time"] -> match get_env "info" env with [ Vinfo s _ _ _ _ -> VVstring (possibly_highlight env s) | _ -> raise Not_found ] | ["update" :: sl] -> match get_env "info" env with [ Vinfo _ u _ _ _ -> eval_string u sl | _ -> raise Not_found ] | ["user" :: sl] -> match get_env "info" env with [ Vinfo _ _ s _ _ -> let s = match sl with [ ["v"] -> s | [] -> possibly_highlight env s | _ -> raise Not_found ] in VVstring s | _ -> raise Not_found ] | _ -> raise Not_found ] and eval_string s = fun [ ["var"] -> VVother (eval_string s) | [] -> VVstring s | _ -> raise Not_found ] and eval_person_field_var conf base env p = fun [ ["access"] -> VVstring (Util.acces conf base p) | ["dates"] -> VVstring (Date.short_dates_text conf base p) | ["has_history"] -> let fn = sou base (get_first_name p) in let sn = sou base (get_surname p) in let occ = get_occ p in let person_file = History_diff.history_file fn sn occ in VVbool (Sys.file_exists (History_diff.history_path conf person_file)) | ["history_file"] -> let fn = sou base (get_first_name p) in let sn = sou base (get_surname p) in let occ = get_occ p in VVstring (History_diff.history_file fn sn occ) | ["is_invisible"] -> let conf = {(conf) with wizard = False; friend = False} in VVbool (not (Util.authorized_age conf base p)) | ["title"] -> VVstring (person_title conf base p) | [] -> VVstring (possibly_highlight env (simple_person_text conf base p)) | _ -> VVstring "person..." ] and simple_person_text conf base p = match main_title conf base p with [ Some t -> titled_person_text conf base p t | None -> person_text conf base p ] ; value print_foreach conf base print_ast eval_expr = let eval_int_expr env ep e = let s = eval_expr env ep e in try int_of_string s with [ Failure _ -> raise Not_found ] in let rec print_foreach env xx loc s sl el al = match (s, sl) with [ ("history_line", []) -> print_foreach_history_line env xx el al | (s, _) -> raise Not_found ] and print_foreach_history_line env xx el al = match try Some (Secure.open_in_bin (file_name conf)) with [ Sys_error _ -> None ] with [ Some ic -> try let (k, pos, wiz) = match el with [ [[e1]; [e2]; [e3]] -> let k = eval_int_expr env xx e1 in let pos = match get_env "search" env with [ Vsearch (Some (_, _, pos)) -> pos | Vsearch None -> in_channel_length ic | _ -> try eval_int_expr env xx e2 with [ Not_found -> in_channel_length ic ] ] in let wiz = eval_expr env xx e3 in (k, pos, wiz) | [] -> (3, in_channel_length ic, "") | _ -> raise Not_found ] in let (pos, n) = let vv = (ref "", ref 0) in let rec loop pos i = if i >= k then (pos, i) else match try Some (rev_input_line ic pos vv) with [ Begin_of_file -> None ] with [ Some (line, pos) -> let i = print_history_line2 env xx line wiz i al in loop pos i | None -> (pos, i) ] in loop pos 0 in do { match get_env "pos" env with [ Vpos r -> r.val := pos | _ -> () ]; close_in ic; } with e -> do { close_in ic; raise e } | None -> () ] and print_history_line2 env xx line wiz i al = match line_fields line with [ Some (time, user, action, keyo) -> if wiz = "" || user = wiz then do { let hist_item = match keyo with [ Some key -> match action with [ "mn" -> let (i, j) = try let i = String.rindex key '/' in (i, i + 1) with [ Not_found -> (0, 0) ] in let pg = String.sub key 0 i in let s = String.sub key j (String.length key - j) in try HI_notes pg (Some (int_of_string s)) with [ Failure _ -> HI_notes key None ] | _ -> match person_ht_find_all base key with [ [ip] -> HI_ind (pget conf base ip) | _ -> HI_none ] ] | None -> HI_none ] in let not_displayed = match hist_item with [ HI_ind p -> is_hidden p || ((is_hide_names conf p) && not (fast_auth_age conf p)) | _ -> False ] in if not_displayed then i else do { let key = match keyo with [ Some s -> s | None -> "" ] in let env = [("info", Vinfo time action user hist_item key) :: env] in List.iter (print_ast env xx) al; i + 1 } } else i | None -> i ] in print_foreach ; value gen_print conf base hoo = let env = let env = [("pos", Vpos (ref 0)); ("count", Vcnt (ref 0))] in match hoo with [ Some ho -> [("search", Vsearch ho) :: env] | None -> env ] in Hutil.interp conf base "updhist" {Templ.eval_var = eval_var conf base; Templ.eval_transl _ = Templ.eval_transl conf; Templ.eval_predefined_apply _ = raise Not_found; Templ.get_vother = get_vother; Templ.set_vother = set_vother; Templ.print_foreach = print_foreach conf base} env () ; value print conf base = gen_print conf base None; (* searching *) value search_text conf base s = let s = if s = "" then " " else s in let case_sens = p_getenv conf.env "c" = Some "on" in let found = match try Some (Secure.open_in_bin (file_name conf)) with [ Sys_error _ -> None ] with [ Some ic -> let pos = match p_getint conf.env "pos" with [ Some pos -> pos | None -> in_channel_length ic ] in let vv = (ref "", ref 0) in loop pos where rec loop pos = match try Some (rev_input_line ic pos vv) with [ Begin_of_file -> None ] with [ Some (line, pos2) -> match line_fields line with [ Some (time, user, action, keyo) -> let key = match keyo with [ Some key -> key | None -> "" ] in if in_text case_sens s time || in_text case_sens s user || in_text case_sens s key then Some pos else loop pos2 | None -> None ] | None -> None ] | None -> None ] in let h = match found with [ Some pos -> Some (case_sens, s, pos) | None -> None ] in gen_print conf base (Some h) ; value print_search conf base = if conf.wizard || conf.friend then match try Some (List.assoc "s" conf.env) with [ Not_found -> None ] with [ Some s -> search_text conf base (Wserver.gen_decode False s) | None -> print conf base ] else print conf base ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/dag.ml0000660000175200017530000012501512664543647022301 0ustar guillaumeguillaume(* camlp5r ./pa_html.cmo *) (* $Id: dag.ml,v 5.20 2007-09-12 09:58:44 ddr Exp $ *) DEFINE OLD; open Config; open Dag2html; open Def; open Gutil; open Gwdb; open Mutil; open Printf; open TemplAst; open Util; module Pset = struct type t = list iper; type elt = iper; value add e s = if List.mem e s then s else [e :: s]; value empty = []; value elements s = List.rev s; value mem = List.mem; end ; (* testing *) IFDEF TESTING THEN declare value map_dag f d = let a = Array.map (fun d -> {pare = d.pare; valu = f d.valu; chil = d.chil}) d.dag in {dag = a} ; value tag_dag d = let c = ref 'A' in map_dag (fun v -> let v = c.val in do { c.val := if c.val = 'Z' then 'a' else if c.val = 'z' then '1' else Char.chr (Char.code c.val + 1); v }) d ; end END; (* input dag *) value get_dag_elems conf base = loop None Pset.empty 1 where rec loop prev_po set i = let s = string_of_int i in let po = Util.find_person_in_env conf base s in let po = match po with [ None -> prev_po | x -> x ] in let so = Util.p_getenv conf.env ("s" ^ s) in match (po, so) with [ (Some p, Some s) -> let set = match Util.branch_of_sosa conf base (get_key_index p) (Num.of_string s) with [ Some ipsl -> List.fold_left (fun set (ip, _) -> Pset.add ip set) set ipsl | None -> set ] in loop po set (i + 1) | _ -> set ] ; type sum 'a 'b = [ Left of 'a | Right of 'b ] ; value make_dag conf base set = let list = Pset.elements set in let module O = struct type t = iper; value compare = compare; end in let module M = Map.Make O in let nodes = Array.of_list list in let map = loop M.empty 0 where rec loop map i = if i = Array.length nodes then map else loop (M.add nodes.(i) (idag_of_int i) map) (i + 1) in let nodes = Array.map (fun ip -> let pare = match get_parents (pget conf base ip) with [ Some ifam -> let c = foi base ifam in let l = try [M.find (get_mother c) map] with [ Not_found -> [] ] in try [M.find (get_father c) map :: l] with [ Not_found -> l ] | None -> [] ] in let chil = let u = pget conf base ip in Array.fold_left (fun chil ifam -> let des = foi base ifam in Array.fold_left (fun chil ip -> try [M.find ip map :: chil] with [ Not_found -> chil ]) chil (get_children des)) [] (get_family u) in let chil = List.rev chil in {pare = pare; valu = Left ip; chil = chil}) nodes in let nodes = loop nodes (Array.length nodes) 0 where rec loop nodes n i = if i = Array.length nodes then nodes else match nodes.(i) with [ {valu = Left ip; chil = chil} -> let ifaml = Array.to_list (get_family (pget conf base ip)) in let (nodes, n) = loop nodes ifaml where rec loop nodes = fun [ [ifam :: ifaml] -> let cpl = foi base ifam in let isp = spouse ip cpl in let jdo = try Some (M.find isp map) with [ Not_found -> None ] in match jdo with [ Some jd -> let j = int_of_idag jd in if chil = [] && nodes.(j).chil = [] then (* married but no child in the dag *) let pare = [idag_of_int i; jd] in let d = {pare = pare; valu = Right n; chil = []} in let nodes = Array.append nodes [| d |] in let nd = idag_of_int n in do { nodes.(i).chil := [nd]; nodes.(j).chil := [nd]; (nodes, n + 1) } else if chil <> nodes.(j).chil then (* married; group their children even step ones *) do { List.iter (fun nd -> if List.mem nd nodes.(j).chil then () else do { let n = int_of_idag nd in nodes.(j).chil := [nd :: nodes.(j).chil]; nodes.(n).pare := [jd :: nodes.(n).pare]; }) chil; List.iter (fun nd -> if List.mem nd chil then () else do { let id = idag_of_int i in let n = int_of_idag nd in nodes.(i).chil := [nd :: chil]; nodes.(n).pare := [id :: nodes.(n).pare]; }) nodes.(j).chil; loop nodes ifaml } else loop nodes ifaml | None -> loop nodes ifaml ] | [] -> (nodes, n) ] in loop nodes n (i + 1) | _ -> loop nodes n (i + 1) ] in {dag = nodes} ; value image_normal_txt conf base p fname width height = let image_txt = capitale (transl_nth conf "image/images" 0) in let s = Unix.stat fname in let b = acces conf base p in let k = default_image_name base p in let r = sprintf "\ \"%s\"" (commd conf) (int_of_float (mod_float s.Unix.st_mtime (float_of_int max_int))) b k (if width = 0 then "" else " width=\"" ^ string_of_int width ^ "\"") (if height = 0 then "" else " height=\"" ^ string_of_int height ^ "\"") image_txt image_txt (if width = 0 then "" else " max-width:" ^ string_of_int width ^ "px;") (if height = 0 then "" else " max-height:" ^ string_of_int height ^ "px;") in if conf.cancel_links then r else sprintf "" (commd conf) b k ^ r ^ "" ; value image_url_txt conf base url_p url height = let image_txt = capitale (transl_nth conf "image/images" 0) in sprintf "" url_p ^ sprintf "\"%s\"" url height image_txt image_txt (if height = 0 then "" else " max-height:" ^ string_of_int height ^ "px;") ^ "\n" ; value image_url_txt_with_size conf base url_p url width height = let image_txt = capitale (transl_nth conf "image/images" 0) in sprintf "" url_p ^ sprintf "\"%s\"" url width height image_txt image_txt (if width = 0 then "" else " max-width:" ^ string_of_int width ^ "px;") (if height = 0 then "" else " max-height:" ^ string_of_int height ^ "px;") ^ "\n" ; value image_txt conf base p = match p_getenv conf.env "image" with [ Some "on" -> match image_and_size conf base p (limited_image_size 100 75) with [ Some (True, f, Some (wid, hei)) -> "\n

      \n" ^ image_normal_txt conf base p f wid hei ^ "
      \n" | Some (True, f, None) -> "\n
      \n" ^ image_normal_txt conf base p f 0 75 ^ "
      \n" | Some (False, url, Some (wid, hei)) -> let url_p = (commd conf) ^ (acces conf base p) in "\n
      \n" ^ image_url_txt_with_size conf base url_p url wid hei ^ "
      \n" | Some (False, url, None) -> let url_p = (commd conf) ^ (acces conf base p) in "\n
      \n" ^ image_url_txt conf base url_p url 75 ^ "
      \n" | _ -> "" ] | _ -> "" ] ; (* *) type item = [ Item of person and string ]; value string_of_item conf base = fun [ Item p s -> Util.referenced_person_title_text conf base p ^ Date.short_dates_text conf base p ^ (if s = "" then "" else " " ^ s) ] ; (* Print with HTML table tags: . *) if p_getenv conf.env "marr" = Some "on" then tag "td" "%s" (if nb_families > 1 then "style=\"border-bottom:none\"" else "") begin let u = p in if nb_families > 0 then do { let cpl = foi base (get_family u).(0) in let spouse = pget conf base (Gutil.spouse (get_key_index p) cpl) in Util.print_image_sex conf spouse 11; Wserver.wprint " %s  " (referenced_person_text conf base spouse); } else Wserver.wprint " "; end else (); (* On affiche que la première famille (get_family u).(0). *) (* Les autres familles seront affichées après qu'on ait *) (* fini de remplir le . *) if p_getenv conf.env "marr_date" = Some "on" then tag "td" "%s" (if nb_families > 1 then "style=\"border-bottom:none\"" else "") begin let u = p in if nb_families > 0 then let cpl = foi base (get_family u).(0) in let spouse = pget conf base (Gutil.spouse (get_key_index p) cpl) in let mdate = if authorized_age conf base p && authorized_age conf base spouse then let fam = foi base (get_family u).(0) in match Adef.od_of_codate (get_marriage fam) with [ Some d -> Date.string_slash_of_date conf d | _ -> " " ] else " " in Wserver.wprint "%s" mdate else Wserver.wprint " "; end else (); (* On affiche que la première famille (get_family u).(0). *) (* Les autres familles seront affichées après qu'on ait *) (* fini de remplir le . *) if p_getenv conf.env "marr_place" = Some "on" then tag "td" "%s" (if nb_families > 1 then "style=\"border-bottom:none\"" else "") begin let u = p in if nb_families > 0 then let cpl = foi base (get_family u).(0) in let spouse = pget conf base (Gutil.spouse (get_key_index p) cpl) in let mplace = if authorized_age conf base p && authorized_age conf base spouse then Util.string_of_place conf (sou base (get_marriage_place cpl)) else "" in Wserver.wprint "%s  " mplace else Wserver.wprint " "; end else (); (* On affiche que la première famille (get_family u).(0). *) (* Les autres familles seront affichées après qu'on ait *) (* fini de remplir le . *) if p_getenv conf.env "child" = Some "on" then if p_getenv conf.env "marr" = Some "on" || p_getenv conf.env "marr_place" = Some "on" || p_getenv conf.env "marr_date" = Some "on" then tag "td" "align=\"center\" %s" (if nb_families > 1 then "style=\"border-bottom:none\"" else "") begin let u = p in if nb_families > 0 then let fam = foi base (get_family u).(0) in Wserver.wprint "%d  " (Array.length (get_children fam)) else Wserver.wprint " "; end else let n = List.fold_left (fun n ifam -> n + Array.length (get_children (foi base ifam))) 0 (Array.to_list (get_family p)) in tag "td" begin Wserver.wprint "%d  " n; end else (); if p_getenv conf.env "death" = Some "on" then tag "td" "%s" rowspan begin let d = if not p_auth then " " else match get_death p with [ Death _ d -> let d = Adef.date_of_cdate d in Date.string_slash_of_date conf d | _ -> match get_burial p with [ Cremated cod | Buried cod -> match Adef.od_of_codate cod with [ Some d -> Date.string_slash_of_date conf d | _ -> " " ] | _ -> " " ] ] in Wserver.wprint "%s" d; end else (); if p_getenv conf.env "death_place" = Some "on" then tag "td" "%s" rowspan begin let d = if not p_auth then "" else match get_death p with [ Death _ d -> Util.string_of_place conf (sou base (get_death_place p)) | _ -> match get_burial p with [ Cremated cod | Buried cod -> match Adef.od_of_codate cod with [ Some d -> Util.string_of_place conf (sou base (get_burial_place p)) | _ -> "" ] | _ -> "" ] ] in Wserver.wprint "%s  " d; end else (); if p_getenv conf.env "death_age" = Some "on" then tag "td" "%s" rowspan begin let d = if not p_auth then "" else match Date.get_birth_death_date p with [ (Some (Dgreg ({prec = Sure | About | Maybe} as d1) _), Some (Dgreg ({prec = Sure | About | Maybe} as d2) _), approx) when d1 <> d2 -> let a = CheckItem.time_elapsed d1 d2 in let s = if not approx && d1.prec = Sure && d2.prec = Sure then "" else transl_decline conf "possibly (date)" "" ^ " " in s ^ Date.string_of_age conf a | _ -> "" ] in Wserver.wprint "%s  " d; end else (); if p_getenv conf.env "occu" = Some "on" then tag "td" "%s" rowspan begin Wserver.wprint "%s  " (if p_auth then sou base (get_occupation p) else ""); end else (); end; (* Maintenant qu'on a fini d'afficher le complet, si il y a *) (* plusieurs familles, il faut alors afficher chacune d'elle dans *) (* un afin d'avoir une mise en page utilisant des rowspan. *) if nb_families > 1 then if p_getenv conf.env "marr" = Some "on" || p_getenv conf.env "marr_date" = Some "on" || p_getenv conf.env "marr_place" = Some "on" then let u = p in for i = 1 to nb_families - 1 do { let cpl = foi base (get_family u).(i) in let spouse = pget conf base (Gutil.spouse (get_key_index p) cpl) in let fam = foi base (get_family u).(i) in tag "tr" begin if p_getenv conf.env "marr" = Some "on" then tag "td" "style=\"border-top:none; %s\"" (if (nb_families - 1) <> i then "border-bottom:none;" else "") begin Util.print_image_sex conf spouse 11; Wserver.wprint " %s  " (referenced_person_text conf base spouse); end else (); if p_getenv conf.env "marr_date" = Some "on" then tag "td" "style=\"border-top:none; %s\"" (if (nb_families - 1) <> i then "border-bottom:none;" else "") begin let mdate = if authorized_age conf base p && authorized_age conf base spouse then let fam = foi base (get_family u).(i) in match Adef.od_of_codate (get_marriage fam) with [ Some d -> Date.string_slash_of_date conf d | _ -> " " ] else " " in Wserver.wprint "%s" mdate; end else (); if p_getenv conf.env "marr_place" = Some "on" then tag "td" "style=\"border-top:none; %s\"" (if (nb_families - 1) <> i then "border-bottom:none;" else "") begin let mplace = if authorized_age conf base p && authorized_age conf base spouse then Util.string_of_place conf (sou base (get_marriage_place cpl)) else "" in Wserver.wprint "%s  " mplace; end else (); if p_getenv conf.env "child" = Some "on" then tag "td" "align=\"center\" style=\"border-top:none; %s\"" (if (nb_families - 1) <> i then "border-bottom:none;" else "") begin Wserver.wprint "%d  " (Array.length (get_children fam)); end else (); end } else () else () }; (* ********************************************************************** *) (* [Fonc] build_desc : config -> base -> person list -> person list *) (** [Description] : Construit la liste des descendants de la liste des personnes (passée en paramètre). Correspond à un parcours en largeur. [Args] : - conf : configuration de la base - base : base de donnée - l : person list [Retour] : person list [Rem] : Non exporté en clair hors de ce module. *) (* ********************************************************************** *) value build_desc conf base l = let rec loop l accu = match l with [ [] -> (* Comme on a fait un fold_left pour avoir le bon ordre *) (* des enfants, on renverse l'accumulateur pour l'avoir *) (* lui aussi dans le bon ordre. *) List.rev accu | [(p, lab) :: l] -> let cnt = ref 0 in let nx_accu = (* On fait des fold_left pour garder l'ordre des enfants. *) (* lab correspond au numéro d'Aboville de p. *) List.fold_left (fun accu ifam -> let fam = foi base ifam in List.fold_left (fun accu ip -> let _ = incr cnt in [(pget conf base ip, lab ^ string_of_int cnt.val ^ ".") :: accu]) accu (Array.to_list (get_children fam))) accu (Array.to_list (get_family p)) in loop l nx_accu ] in loop l [] ; (* ********************************************************************** *) (* [Fonc] display_descendant_with_table : config -> base -> int -> person -> unit *) (** [Description] : Affiche sous la forme d'un tableau la descendance d'une personne. [Args] : - conf : configuration de la base - base : base de donnée - max_lev : le nombre de générations à afficher - p : person [Retour] : Néant [Rem] : Non exporté en clair hors de ce module. *) (* ********************************************************************** *) value display_descendant_with_table conf base max_lev p = let max_lev = min (Perso.limit_desc conf) max_lev in let nb_pers = ref 0 in (* Affiche la liste des personnes, génération par génération. *) (* On affiche toutes les personnes de l, et quand la liste est *) (* vide, on construit la list des descendants de l (mais comme l *) (* est vide, on les calcul par rapport à refl) *) let rec loop lev nb_col first refl l = match l with [ [] -> if lev < max_lev then let nl = build_desc conf base refl in loop (lev + 1) nb_col True nl nl else () | [(p, lab) :: q] -> do { if first && lev > 0 && p_getenv conf.env "gen" = Some "on" then tag "tr" begin tag "th" "align=\"left\" colspan=\"%d\"" nb_col begin Wserver.wprint "%s %d" (capitale (transl_nth conf "generation/generations" 0)) lev; end; end else (); print_person_table conf base p lab; incr nb_pers; loop lev nb_col False refl q } ] in do { header conf (descendants_title conf base p); tag "p" begin Wserver.wprint "%s." (capitale (text_to conf max_lev)); end; tag "table" "class=descends_table" begin (* On affiche l'entête et on en profite pour récupèrer *) (* le nombre de colonnes à afficher pour les colspans. *) let nb_col = print_desc_table_header conf base in loop 0 nb_col True [(p, "")] [(p, "")]; end; tag "p" begin Wserver.wprint "%s: %d %s" (capitale (transl conf "total")) nb_pers.val (transl_nth conf "person/persons" 1); end; trailer conf } ; value make_tree_hts conf base gv p = let bd = match Util.p_getint conf.env "bd" with [ Some x -> x | None -> 0 ] in let td_prop = match Util.p_getenv conf.env "td" with [ Some x -> " " ^ x | _ -> match Util.p_getenv conf.env "color" with [ None | Some "" -> "" | Some x -> " class=\"" ^ x ^ "\"" ] ] in let rec nb_column n v u = if v = 0 then n + (max 1 (Array.length (get_family u))) else if Array.length (get_family u) = 0 then n + 1 else List.fold_left (fun n ifam -> fam_nb_column n v (foi base ifam)) n (Array.to_list (get_family u)) and fam_nb_column n v des = if Array.length (get_children des) = 0 then n + 1 else List.fold_left (fun n iper -> nb_column n (v - 1) (pget conf base iper)) n (Array.to_list (get_children des)) in let vertical_bar_txt v tdl po = let tdl = if tdl = [] then [] else [(1, LeftA, TDnothing) :: tdl] in let td = match po with [ Some (p, _) -> (* Récupère les options d'affichage. *) let options = Util.display_options conf in let ncol = nb_column 0 (v - 1) p in let vbar_txt = Printf.sprintf "%sm=D;t=T;v=%d;%s;%s" (commd conf) gv options (acces conf base p) in (2 * ncol - 1, CenterA, TDbar (Some vbar_txt)) | None -> (1, LeftA, TDnothing) ] in [td :: tdl] in let children_vertical_bars v gen = let tdl = List.fold_left (vertical_bar_txt v) [] gen in Array.of_list (List.rev tdl) in let spouses_vertical_bar_txt v tdl po = let tdl = if tdl = [] then [] else [(1, LeftA, TDnothing) :: tdl] in match po with [ Some (p, _) when Array.length (get_family p) > 0 -> fst (List.fold_left (fun (tdl, first) ifam -> let tdl = if first then tdl else [(1, LeftA, TDnothing) :: tdl] in let des = foi base ifam in let td = if Array.length (get_children des) = 0 then (1, LeftA, TDnothing) else let ncol = fam_nb_column 0 (v - 1) des in (2 * ncol - 1, CenterA, TDbar None) in ([td :: tdl], False)) (tdl, True) (Array.to_list (get_family p))) | _ -> [(1, LeftA, TDnothing) :: tdl] ] in let spouses_vertical_bar v gen = let tdl = List.fold_left (spouses_vertical_bar_txt v) [] gen in Array.of_list (List.rev tdl) in let horizontal_bar_txt v tdl po = let tdl = if tdl = [] then [] else [(1, LeftA, TDnothing) :: tdl] in match po with [ Some (p, _) when Array.length (get_family p) > 0 -> fst (List.fold_left (fun (tdl, first) ifam -> let tdl = if first then tdl else [(1, LeftA, TDnothing) :: tdl] in let des = foi base ifam in let tdl = if Array.length (get_children des) = 0 then [(1, LeftA, TDnothing) :: tdl] else if Array.length (get_children des) = 1 then let u = pget conf base (get_children des).(0) in let ncol = nb_column 0 (v - 1) u in [(2 * ncol - 1, CenterA, TDbar None) :: tdl] else let rec loop tdl i = if i = Array.length (get_children des) then tdl else let iper = (get_children des).(i) in let u = pget conf base iper in let tdl = if i > 0 then let align = CenterA in [(1, align, TDhr align) :: tdl] else tdl in let ncol = nb_column 0 (v - 1) u in let align = if i = 0 then RightA else if i = Array.length (get_children des) - 1 then LeftA else CenterA in let td = (2 * ncol - 1, align, TDhr align) in loop [td :: tdl] (i + 1) in loop tdl 0 in (tdl, False)) (tdl, True) (Array.to_list (get_family p))) | _ -> [(1, LeftA, TDnothing) :: tdl] ] in let horizontal_bars v gen = let tdl = List.fold_left (horizontal_bar_txt v) [] gen in Array.of_list (List.rev tdl) in let person_txt v tdl po = let tdl = if tdl = [] then [] else [(1, LeftA, TDnothing) :: tdl] in let td = match po with [ Some (p, auth) -> let ncol = if v > 1 then nb_column 0 (v - 1) p else Array.length (get_family p) in let txt = person_title_text conf base p in let txt = reference conf base p txt in let txt = if auth then txt ^ Date.short_dates_text conf base p else txt in let txt = txt ^ Dag.image_txt conf base p in let txt = if bd > 0 || td_prop <> "" then Printf.sprintf "
      *) IFDEF OLD THEN declare value print_table conf hts = do { begin_centered conf; Wserver.wprint "\n"; for i = 0 to Array.length hts - 1 do { tag "tr" "align=\"left\"" begin for j = 0 to Array.length hts.(i) - 1 do { let (colspan, align, td) = hts.(i).(j) in Wserver.wprint " Wserver.wprint " align=\"%s\"" conf.left | (LeftA, _) -> () | (CenterA, _) -> Wserver.wprint " align=\"center\"" | (RightA, _) -> Wserver.wprint " align=\"%s\"" conf.right ]; Wserver.wprint ">"; match td with [ TDitem s -> Wserver.wprint "%s" s | TDtext s -> Wserver.wprint "%s" s | TDnothing -> Wserver.wprint " " | TDbar None -> Wserver.wprint "|" | TDbar (Some s) -> Wserver.wprint "|" s | TDhr align -> match align with [ LeftA -> xtag "hr" "class=\"%s\"" conf.left | RightA -> xtag "hr" "class=\"%s\"" conf.right | _ -> xtag "hr" "class=\"full\"" ] ]; Wserver.wprint "\n" }; end; }; Wserver.wprint "
      \n"; end_centered conf; } ; end END; (* * Print without HTML table tags: using
       *)
      
      (* Machinery opering to 'displayed texts', i.e. strings where not all
         characters correspond to a displayed character (due to html tags or
         encoded characters) *)
      
      (* Return next 'displayed character' location: can be on several 'string
         characters', like " " *)
      
      value displayed_next_char s i =
        loop i where rec loop i =
          if i >= String.length s then None
          else
            match s.[i] with
            [ '<' ->
                let rec loop1 i =
                  if i = String.length s then None
                  else if s.[i] = '>' then loop (i + 1)
                  else loop1 (i + 1)
                in
                loop1 (i + 1)
            | '&' ->
                let rec loop1 j =
                  if j = String.length s then Some (i, j)
                  else
                    match s.[j] with
                    [ 'a'..'z' | 'A'..'Z' -> loop1 (j + 1)
                    | ';' -> Some (i, j + 1)
                    | _ -> Some (i, j) ]
                in
                loop1 (i + 1)
            | c ->
                if utf_8_db.val then Some (i, i + max 1 (Name.nbc c))
                else Some (i, i + 1) ]
      ;
      
      value buff_store_int s blen i j =
        loop blen i where rec loop blen i =
          if i = j then blen else loop (Buff.store blen s.[i]) (i + 1)
      ;
      
      (* Remove empty tags, i.e.  enclosing empty text, from s *)
      
      value strip_empty_tags s =
        loop 0 None 0 where rec loop blen opened_tag i =
          if i >= String.length s then Buff.get blen
          else
            match s.[i] with
            [ '<' ->
                let j = i + 1 in
                let (tag_close, j) =
                  match s.[j] with
                  [ '/' -> (True, j + 1)
                  | _ -> (False, j) ]
                in
                let (tag_name, j) =
                  loop j where rec loop k =
                    match s.[k] with
                    [ 'a'..'z' | 'A'..'Z' -> loop (k + 1)
                    | _ -> (String.sub s j (k - j), k) ]
                in
                let j =
                  loop j where rec loop j =
                    if s.[j] = '>' then j + 1 else loop (j + 1)
                in
                match opened_tag with
                [ Some (opened_tag_name, k) ->
                    if tag_close then
                      if tag_name = opened_tag_name then loop blen None j
                      else loop (buff_store_int s blen k j) None j
                    else loop (buff_store_int s blen k i) (Some (tag_name, i)) j
                | None ->
                    if tag_close then loop (buff_store_int s blen i j) None j
                    else loop blen (Some (tag_name, i)) j ]
            | c ->
                let blen =
                  match opened_tag with
                  [ Some (_, k) -> buff_store_int s blen k i
                  | None -> blen ]
                in
                loop (Buff.store blen c) None (i + 1) ]
      ;
      
      value displayed_length s =
        loop 0 0 where rec loop len i =
          match displayed_next_char s i with
          [ Some (i, j) -> loop (len + 1) j
          | None -> len ]
      ;
      
      value displayed_sub s ibeg ilen =
        loop 0 0 0 0 where rec loop blen di dlen i =
          match displayed_next_char s i with
          [ Some (j, k) ->
              let blen = buff_store_int s blen i j in
              let (blen, dlen) =
                if di >= ibeg && dlen < ilen then
                  (buff_store_int s blen j k, dlen + 1)
                else (blen, dlen)
              in
              loop blen (di + 1) dlen k
          | None ->
              let s = Buff.get (buff_store_int s blen i (String.length s)) in
              strip_empty_tags s ]
      ;
      
      value longuest_word_length s =
        loop 0 0 0 where rec loop maxlen len i =
          match displayed_next_char s i with
          [ Some (j, k) ->
              if s.[j] = ' ' then loop (max maxlen len) 0 k
              else loop maxlen (len + 1) k
          | None -> max maxlen len ]
      ;
      
      value displayed_end_word s di i =
        loop di i where rec loop di i =
          match displayed_next_char s i with
          [ Some (j, k) -> if s.[j] = ' ' then (di, Some j) else loop (di + 1) k
          | None -> (di, None) ]
      ;
      
      (* Strip 'displayed text' s by subtexts of limited size sz *)
      
      value displayed_strip s sz =
        loop [] 0 0 0 where rec loop strl dibeg di i =
          let i =
            loop i where rec loop i =
              if i < String.length s && s.[i] = ' ' then loop (i + 1) else i
          in
          let (dj, j) = displayed_end_word s di i in
          match j with
          [ Some j ->
              if dj - dibeg > sz then
                loop [displayed_sub s dibeg (di - dibeg - 1) :: strl] di (dj + 1)
                  (j + 1)
              else loop strl dibeg (dj + 1) (j + 1)
          | None ->
              let strl =
                if dj - dibeg > sz then
                  let str2 = displayed_sub s dibeg (di - dibeg - 1) in
                  let str1 = displayed_sub s di (dj - di) in
                  [str1; str2 :: strl]
                else
                  let str = displayed_sub s dibeg (dj - dibeg) in
                  [str :: strl]
              in
              List.rev strl ]
      ;
      
      (* Determine columns sizes; scan all table by increasing colspans *)
      
      value gen_compute_columns_sizes size_fun hts ncol =
        let colsz = Array.make ncol 0 in
        let rec loop curr_colspan =
          let next_colspan = ref (ncol + 1) in
          do {
            for i = 0 to Array.length hts - 1 do {
              if i = Array.length hts then ()
              else
                let rec loop col j =
                  if j = Array.length hts.(i) then ()
                  else do {
                    let (colspan, _, td) = hts.(i).(j) in
                    match td with
                    [ TDitem _ | TDtext _ | TDnothing ->
                        if colspan = curr_colspan then
                          let len =
                            match td with
                            [ TDitem s -> size_fun s
                            | TDtext s -> size_fun s
                            | _ -> 1 ]
                          in
                          let currsz =
                            loop 0 col colspan where rec loop currsz col cnt =
                              if cnt = 0 then currsz
                              else
                                let currsz = currsz + colsz.(col) in
                                loop currsz (col + 1) (cnt - 1)
                          in
                          if currsz >= len then ()
                          else
                            let rec loop n col cnt =
                              if cnt = 0 then ()
                              else do {
                                let inc_sz =
                                  n * (len - currsz) / colspan -
                                    (n - 1) * (len - currsz) / colspan
                                in
                                colsz.(col) := colsz.(col) + inc_sz;
                                loop (n + 1) (col + 1) (cnt - 1)
                              }
                            in
                            loop 1 col colspan
                        else if colspan > curr_colspan then
                          next_colspan.val := min colspan next_colspan.val
                        else ()
                    | TDbar _ -> ()
                    | TDhr _ -> () ];
                    loop (col + colspan) (j + 1)
                  }
                in
                loop 0 0
            };
            if next_colspan.val > ncol then () else loop next_colspan.val
          }
        in
        do { loop 1; colsz }
      ;
      
      value compute_columns_sizes = gen_compute_columns_sizes displayed_length;
      value compute_columns_minimum_sizes =
        gen_compute_columns_sizes longuest_word_length
      ;
      
      (* Gadget to add a | to fill upper/lower part of a table data when
         preceded/followed by a |; not obligatory but nicer *)
      
      value try_add_vbar stra_row stra_row_max hts i col =
        if stra_row < 0 then
          if i = 0 then ""
          else
            let rec loop pcol pj =
              if pj >= Array.length hts.(i - 1) then ""
              else
                let (colspan, _, td) = hts.(i - 1).(pj) in
                if pcol = col then
                  match td with
                  [ TDbar _ -> "|"
                  | _ -> "" ]
                else loop (pcol + colspan) (pj + 1)
            in
            loop 0 0
        else if stra_row >= stra_row_max then
          if i = Array.length hts - 1 then ""
          else
            let rec loop ncol nj =
              if nj >= Array.length hts.(i + 1) then ""
              else
                let (colspan, _, td) = hts.(i + 1).(nj) in
                if ncol = col then
                  match td with
                  [ TDbar _ -> "|"
                  | _ -> "" ]
                else loop (ncol + colspan) (nj + 1)
            in
            loop 0 0
        else ""
      ;
      
      value strip_troublemakers s =
        loop False 0 0 where rec loop last_space len i =
          if i = String.length s then Buff.get len
          else
            match s.[i] with
            [ '<' ->
                let j = i + 1 in
                let j =
                  match s.[j] with
                  [ '/' -> j + 1
                  | _ -> j ]
                in
                let (tag_name, j) =
                  loop j where rec loop k =
                    match s.[k] with
                    [ 'a'..'z' | 'A'..'Z' -> loop (k + 1)
                    | _ -> (String.lowercase (String.sub s j (k - j)), k) ]
                in
                let j =
                  loop j where rec loop j =
                    if s.[j] = '>' then j + 1 else loop (j + 1)
                in
                let len =
                  match tag_name with
                  [ "bdo" | "br" | "font" | "img" | "span" | "table" | "td" | "tr"
                  | "center" -> len
                  | _ -> buff_store_int s len i j ]
                in
                loop last_space len j
            | '\n' | '\r' | ' ' ->
                let len = if last_space then len else Buff.store len ' ' in
                loop True len (i + 1)
            | c -> loop False (Buff.store len c) (i + 1) ]
      ;
      
      value table_strip_troublemakers hts =
        for i = 0 to Array.length hts - 1 do {
          for j = 0 to Array.length hts.(i) - 1 do {
            match hts.(i).(j) with
            [ (colspan, align, TDitem s) ->
                hts.(i).(j) := (colspan, align, TDitem (strip_troublemakers s))
            | _ -> () ]
          }
        }
      ;
      
      value table_pre_dim conf hts =
        do {
          table_strip_troublemakers hts;
          let ncol =
            let hts0 = hts.(0) in
            let rec loop ncol j =
              if j = Array.length hts0 then ncol
              else
                let (colspan, _, _) = hts0.(j) in
                loop (ncol + colspan) (j + 1)
            in
            loop 0 0
          in
          let min_widths_tab = compute_columns_minimum_sizes hts ncol in
          let max_widths_tab = compute_columns_sizes hts ncol in
          let min_wid = Array.fold_left  \+ 0 min_widths_tab in
          let max_wid = Array.fold_left  \+ 0 max_widths_tab in
          (min_wid, max_wid, min_widths_tab, max_widths_tab, ncol)
        }
      ;
      
      IFDEF OLD THEN declare
      value print_next_pos conf pos1 pos2 tcol =
        let doit = p_getenv conf.env "notab" = Some "on" in
        if doit then do {
          let dpos =
            match p_getint conf.env "dpos" with
            [ Some dpos -> dpos
            | None -> 78 ]
          in
          let pos1 =
            match pos1 with
            [ Some pos1 -> pos1
            | None -> 0 ]
          in
          let pos2 =
            match pos2 with
            [ Some pos2 -> pos2
            | None -> dpos ]
          in
          let overlap =
            let overlap =
              match p_getint conf.env "overlap" with
              [ Some x -> x
              | None -> 10 ]
            in
            min overlap dpos
          in
          let env =
            List.fold_right
              (fun (k, v) env ->
                 match k with
                 [ "pos1" | "pos2" -> env
                 | _ -> [(k, v) :: env] ])
              conf.env []
          in
          Wserver.wprint "\n"
        }
        else ()
      ;
      
      (* Main print table algorithm with 
       *)
      
      value print_table_pre conf hts =
        let (tmincol, tcol, colminsz, colsz, ncol) = table_pre_dim conf hts in
        let dcol =
          let dcol =
            match p_getint conf.env "width" with
            [ Some i -> i
            | None -> 79 ]
          in
          max tmincol (min dcol tcol)
        in
        do {
          if tcol > tmincol then
            for i = 0 to ncol - 1 do {
              colsz.(i) :=
                colminsz.(i) +
                  (colsz.(i) - colminsz.(i)) * (dcol - tmincol) / (tcol - tmincol)
            }
          else ();
          let pos1 = p_getint conf.env "pos1" in
          let pos2 =
            match p_getint conf.env "pos2" with
            [ None -> p_getint conf.env "dpos"
            | x -> x ]
          in
          print_next_pos conf pos1 pos2 (Array.fold_left \+ 0 colsz);
          Wserver.wprint "
      \n";
          for i = 0 to Array.length hts - 1 do {
            let (stra, max_row) =
              let (stral, max_row) =
                loop [] 1 0 0 where rec loop stral max_row col j =
                  if j = Array.length hts.(i) then (stral, max_row)
                  else
                    let (colspan, _, td) = hts.(i).(j) in
                    let stra =
                      match td with
                      [ TDitem s | TDtext s ->
                          let sz =
                            loop 0 colspan where rec loop sz k =
                              if k = 0 then sz
                              else loop (sz + colsz.(col + k - 1)) (k - 1)
                          in
                          Array.of_list (displayed_strip s sz)
                      | _ -> [| |] ]
                    in
                    loop [stra :: stral] (max max_row (Array.length stra))
                      (col + colspan) (j + 1)
              in
              (Array.of_list (List.rev stral), max_row)
            in
            for row = 0 to max_row - 1 do {
              let rec loop pos col j =
                if j = Array.length hts.(i) then Wserver.wprint "\n"
                else do {
                  let (colspan, align, td) = hts.(i).(j) in
                  let sz =
                    loop 0 colspan where rec loop sz k =
                      if k = 0 then sz else loop (sz + colsz.(col + k - 1)) (k - 1)
                  in
                  let outs =
                    match td with
                    [ TDitem s | TDtext s ->
                        let s =
                          let k =
                            let dk = (max_row - Array.length stra.(j)) / 2 in
                            row - dk
                          in
                          if k >= 0 && k < Array.length stra.(j) then
                            let s = stra.(j).(k) in
                            if s = " " then " " else s
                          else try_add_vbar k (Array.length stra.(j)) hts i col
                        in
                        let len = displayed_length s in
                        String.make ((sz - len) / 2) ' ' ^ s ^
                          String.make (sz - (sz + len) / 2) ' '
                    | TDnothing ->
                        String.make ((sz - 1) / 2) ' ' ^ " " ^
                          String.make (sz - (sz + 1) / 2) ' '
                    | TDbar s ->
                        let s =
                          match s with
                          [ None | Some "" -> "|"
                          | Some s ->
                              sprintf
                                "|"
                                s ]
                        in
                        let len = displayed_length s in
                        String.make ((sz - len) / 2) ' ' ^ s ^
                          String.make (sz - (sz + len) / 2) ' '
                    | TDhr LeftA ->
                        let len = (sz + 1) / 2 in
                        String.make len '-' ^ String.make (sz - len) ' '
                    | TDhr RightA ->
                        let len = sz / 2 in
                        String.make (sz - len - 1) ' ' ^ String.make (len + 1) '-'
                    | TDhr CenterA -> String.make sz '-' ]
                  in
                  let clipped_outs =
                    if pos1 = None && pos2 = None then outs
                    else
                      let pos1 =
                        match pos1 with
                        [ Some pos1 -> pos1
                        | None -> pos ]
                      in
                      let pos2 =
                        match pos2 with
                        [ Some pos2 -> pos2
                        | None -> pos + sz ]
                      in
                      if pos + sz <= pos1 then ""
                      else if pos > pos2 then ""
                      else if pos2 >= pos + sz then
                        displayed_sub outs (pos1 - pos) (pos + sz - pos1)
                      else if pos1 < pos then displayed_sub outs 0 (pos2 - pos)
                      else displayed_sub outs (pos1 - pos) (pos2 - pos1)
                  in
                  Wserver.wprint "%s" clipped_outs;
                  loop (pos + sz) (col + colspan) (j + 1)
                }
              in
              loop 0 0 0
            }
          };
          Wserver.wprint "
      \n" } ; (* main *) value print_html_table conf hts = do { if Util.p_getenv conf.env "notab" <> Some "on" then tag "p" begin Wserver.wprint "\n"; end else (); if Util.p_getenv conf.env "notab" = Some "on" || Util.p_getenv conf.env "pos2" <> None || browser_doesnt_have_tables conf then print_table_pre conf hts else print_table conf hts } ; end END; value make_tree_hts conf base elem_txt vbar_txt invert set spl d = let no_group = p_getenv conf.env "nogroup" = Some "on" in let spouse_on = match Util.p_getenv conf.env "spouse" with [ Some "on" -> True | _ -> False ] in let bd = match Util.p_getint conf.env "bd" with [ Some x -> x | None -> 0 ] in let td_prop = match Util.p_getenv conf.env "td" with [ Some x -> " " ^ x | _ -> match Util.p_getenv conf.env "color" with [ None | Some "" -> "" | Some x -> " class=\"" ^ x ^ "\"" ] ] in let indi_txt n = match n.valu with [ Left ip -> let p = pget conf base ip in let txt = string_of_item conf base (elem_txt p) ^ image_txt conf base p in let txt = let spouses = if (spouse_on && n.chil <> [] || n.pare = []) && not invert then List.fold_left (fun list id -> match d.dag.(int_of_idag id).valu with [ Left cip -> match get_parents (pget conf base cip) with [ Some ifam -> let cpl = foi base ifam in if ip = get_father cpl then if List.mem_assoc (get_mother cpl) list then list else [(get_mother cpl, Some ifam) :: list] else if ip = get_mother cpl then if List.mem_assoc (get_father cpl) list then list else [(get_father cpl, Some ifam) :: list] else list | None -> list ] | Right _ -> list ]) [] n.chil else if n.chil = [] then try [List.assq ip spl] with [ Not_found -> [] ] else [] in List.fold_left (fun txt (ips, ifamo) -> if Pset.mem ips set then txt else let ps = pget conf base ips in let d = match ifamo with [ Some ifam -> Date.short_marriage_date_text conf base (foi base ifam) p ps | None -> "" ] in txt ^ "\n&" ^ d ^ " " ^ string_of_item conf base (elem_txt ps) ^ image_txt conf base ps) txt spouses in txt | Right _ -> " " ] in let indi_txt n = let (bd, td) = match n.valu with [ Left ip -> (bd, td_prop) | _ -> (0, "") ] in if bd > 0 || td <> "" then sprintf "\
      %s
      " bd td (indi_txt n) else indi_txt n in let vbar_txt n = match n.valu with [ Left ip -> vbar_txt ip | _ -> "" ] in let phony n = match n.valu with [ Left _ -> False | Right _ -> True ] in let t = Dag2html.table_of_dag phony False invert no_group d in if Array.length t.table = 0 then [| |] else Dag2html.html_table_struct indi_txt vbar_txt phony d t ; IFDEF OLD THEN declare value print_slices_menu conf hts = let txt n = Util.capitale (transl_nth conf "display by slices/slice width/overlap/total width" n) in let title _ = Wserver.wprint "%s" (txt 0) in do { Hutil.header conf title; Hutil.print_link_to_welcome conf True; tag "form" "method=\"get\" action=\"%s\"" conf.command begin html_p conf; hidden_env conf; List.iter (fun (k, v) -> if k = "slices" then () else Wserver.wprint "\n" (decode_varenv k) (decode_varenv v)) conf.env; tag "table" begin tag "tr" "align=\"left\"" begin tag "td" "align=\"right\"" begin Wserver.wprint "%s\n" (Util.capitale (transl conf "don't group the common branches together")); Wserver.wprint "\n"; end; end; tag "tr" "align=\"left\"" begin tag "td" "align=\"right\"" begin Wserver.wprint "%s\n" (txt 1); Wserver.wprint "\n"; end; end; tag "tr" "align=\"left\"" begin tag "td" "align=\"right\"" begin Wserver.wprint "%s\n" (txt 2); Wserver.wprint "\n"; end; end; tag "tr" "align=\"left\"" begin tag "td" "align=\"right\"" begin Wserver.wprint "%s\n" (txt 3); let wid = let (min_wid, max_wid, _, _, _) = table_pre_dim conf hts in do { Wserver.wprint "(%d-%d)\n" min_wid max_wid; max min_wid (min max_wid 78) } in Wserver.wprint "\n" wid; end; end; end; html_p conf; Wserver.wprint "\n"; end; Hutil.trailer conf } ; value print_dag_page conf base page_title hts next_txt = let conf = let doctype = (* changing doctype to transitional because use of
      *) match p_getenv conf.base_env "doctype" with [ Some ("html-4.01" | "html-4.01-trans") -> "html-4.01-trans" | _ -> "xhtml-1.0-trans" ] in {(conf) with base_env = [("doctype", doctype) :: conf.base_env]} in let title _ = Wserver.wprint "%s" page_title in do { Hutil.header_no_page_title conf title; print_html_table conf hts; if next_txt <> "" then tag "p" begin Wserver.wprint ">>\n" (commd conf) next_txt; end else (); Hutil.trailer conf } ; end END; (* *) type dag_item = string; type dag_bar = string; type env 'a = [ Vdag of (int * int * array int * array int * int) | Vdcell of (int * Dag2html.align * Dag2html.table_data dag_item dag_bar) | Vdcellp of string | Vdline of int | Vdlinep of (int * array (array string) * int * option int * option int) | Vlazy of Lazy.t (env 'a) | Vother of 'a | Vnone ] ; value get_env v env = try match List.assoc v env with [ Vlazy l -> Lazy.force l | x -> x ] with [ Not_found -> Vnone ] ; value get_vother = fun [ Vother x -> Some x | _ -> None ]; value set_vother x = Vother x; value rec eval_var conf page_title next_txt env xx loc = fun [ ["dag" :: sl] -> match get_env "dag" env with [ Vdag d -> eval_dag_var conf d sl | _ -> raise Not_found ] | ["dag_cell" :: sl] -> match get_env "dag_cell" env with [ Vdcell dcell -> eval_dag_cell_var conf dcell sl | _ -> raise Not_found ] | ["dag_cell_pre"] -> match get_env "dag_cell_pre" env with [ Vdcellp s -> VVstring s | _ -> raise Not_found ] | ["head_title"] -> VVstring page_title | ["link_next"] -> VVstring next_txt | _ -> raise Not_found ] and eval_dag_var conf (tmincol, tcol, colminsz, colsz, ncol) = fun [ ["max_wid"] -> VVstring (string_of_int tcol) | ["min_wid"] -> VVstring (string_of_int tmincol) | ["ncol"] -> VVstring (string_of_int (Array.fold_left \+ 0 colsz)) | _ -> raise Not_found ] and eval_dag_cell_var conf (colspan, align, td) = fun [ ["align"] -> match align with [ LeftA -> VVstring conf.left | CenterA -> VVstring "center" | RightA -> VVstring conf.right ] | ["bar_link"] -> VVstring (match td with [ TDbar (Some s) -> s | _ -> "" ]) | ["colspan"] -> VVstring (string_of_int colspan) | ["is_bar"] -> VVbool (match td with [ TDbar _ -> True | _ -> False ]) | ["is_hr_left"] -> match td with [ TDhr LeftA -> VVbool True | _ -> VVbool False ] | ["is_hr_right"] -> match td with [ TDhr RightA -> VVbool True | _ -> VVbool False ] | ["is_nothing"] -> VVbool (td = TDnothing) | ["item"] -> match td with [ TDitem s -> VVstring s | _ -> VVstring "" ] | ["text"] -> match td with [ TDtext s -> VVstring s | _ -> VVstring "" ] | _ -> raise Not_found ] ; value rec print_foreach conf hts print_ast eval_expr env () loc s sl el al = match [s :: sl] with [ ["dag_cell"] -> print_foreach_dag_cell conf hts print_ast env al | ["dag_cell_pre"] -> print_foreach_dag_cell_pre conf hts print_ast env al | ["dag_line"] -> print_foreach_dag_line conf print_ast env hts al | ["dag_line_pre"] -> print_foreach_dag_line_pre conf hts print_ast env al | _ -> raise Not_found ] and print_foreach_dag_cell_pre conf hts print_ast env al = let i = match get_env "dag_line" env with [ Vdline i -> i | _ -> raise Not_found ] in let (_, _, _, colsz, _) = match get_env "dag" env with [ Vdag d -> d | _ -> raise Not_found ] in let (max_row, stra, row, pos1, pos2) = match get_env "dag_line_pre" env with [ Vdlinep x -> x | _ -> raise Not_found ] in let rec loop pos col j = if j = Array.length hts.(i) then () else do { let (colspan, align, td) = hts.(i).(j) in let sz = loop 0 colspan where rec loop sz k = if k = 0 then sz else loop (sz + colsz.(col + k - 1)) (k - 1) in let outs = match td with [ TDitem s | TDtext s -> let s = let k = let dk = (max_row - Array.length stra.(j)) / 2 in row - dk in if k >= 0 && k < Array.length stra.(j) then let s = stra.(j).(k) in if s = " " then " " else s else try_add_vbar k (Array.length stra.(j)) hts i col in let len = displayed_length s in String.make ((sz - len) / 2) ' ' ^ s ^ String.make (sz - (sz + len) / 2) ' ' | TDnothing -> String.make sz ' ' | TDbar s -> let s = match s with [ None | Some "" -> "|" | Some s -> if conf.cancel_links then "|" else sprintf "|" s ] in let len = displayed_length s in String.make ((sz - len) / 2) ' ' ^ s ^ String.make (sz - (sz + len) / 2) ' ' | TDhr LeftA -> let len = (sz + 1) / 2 in String.make len '-' ^ String.make (sz - len) ' ' | TDhr RightA -> let len = sz / 2 in String.make (sz - len - 1) ' ' ^ String.make (len + 1) '-' | TDhr CenterA -> String.make sz '-' ] in let clipped_outs = if pos1 = None && pos2 = None then outs else let pos1 = match pos1 with [ Some pos1 -> pos1 | None -> pos ] in let pos2 = match pos2 with [ Some pos2 -> pos2 | None -> pos + sz ] in if pos + sz <= pos1 then "" else if pos > pos2 then "" else if pos2 >= pos + sz then displayed_sub outs (pos1 - pos) (pos + sz - pos1) else if pos1 < pos then displayed_sub outs 0 (pos2 - pos) else displayed_sub outs (pos1 - pos) (pos2 - pos1) in if clipped_outs <> "" then do { let v = Vdcellp clipped_outs in let print_ast = print_ast [("dag_cell_pre", v) :: env] () in List.iter print_ast al; } else (); loop (pos + sz) (col + colspan) (j + 1) } in loop 0 0 0 and print_foreach_dag_cell conf hts print_ast env al = let i = match get_env "dag_line" env with [ Vdline i -> i | _ -> raise Not_found ] in for j = 0 to Array.length hts.(i) - 1 do { let print_ast = print_ast [("dag_cell", Vdcell hts.(i).(j)) :: env] () in List.iter print_ast al; } and print_foreach_dag_line conf print_ast env hts al = for i = 0 to Array.length hts - 1 do { let print_ast = print_ast [("dag_line", Vdline i) :: env] () in List.iter print_ast al; } and print_foreach_dag_line_pre conf hts print_ast env al = let i = match get_env "dag_line" env with [ Vdline i -> i | _ -> raise Not_found ] in let (tmincol, tcol, colminsz, colsz, ncol) = match get_env "dag" env with [ Vdag d -> d | _ -> raise Not_found ] in let (stra, max_row) = let (stral, max_row) = loop [] 1 0 0 where rec loop stral max_row col j = if j = Array.length hts.(i) then (stral, max_row) else let (colspan, _, td) = hts.(i).(j) in let stra = match td with [ TDitem s | TDtext s -> let sz = loop 0 colspan where rec loop sz k = if k = 0 then sz else loop (sz + colsz.(col + k - 1)) (k - 1) in Array.of_list (displayed_strip s sz) | _ -> [| |] ] in loop [stra :: stral] (max max_row (Array.length stra)) (col + colspan) (j + 1) in (Array.of_list (List.rev stral), max_row) in let pos1 = p_getint conf.env "pos1" in let pos2 = match p_getint conf.env "pos2" with [ None -> p_getint conf.env "dpos" | x -> x ] in for row = 0 to max_row - 1 do { let v = Vdlinep (max_row, stra, row, pos1, pos2) in let print_ast = print_ast [("dag_line_pre", v) :: env] () in List.iter print_ast al; } ; IFDEF OLD THEN declare value old_print_slices_menu_or_dag_page conf base page_title hts next_txt = if p_getenv conf.env "slices" = Some "on" then print_slices_menu conf hts else print_dag_page conf base page_title hts next_txt ; end ELSE declare value old_print_slices_menu_or_dag_page conf base page_title hts next_txt = incorrect_request conf ; end END; value print_slices_menu_or_dag_page conf base page_title hts next_txt = (**) if p_getenv conf.env "old" = Some "on" then old_print_slices_menu_or_dag_page conf base page_title hts next_txt else (**) let env = let table_pre_dim () = let (tmincol, tcol, colminsz, colsz, ncol) = table_pre_dim conf hts in let dcol = let dcol = match p_getint conf.env "width" with [ Some i -> i | None -> 79 ] in max tmincol (min dcol tcol) in do { if tcol > tmincol then for i = 0 to ncol - 1 do { colsz.(i) := colminsz.(i) + (colsz.(i) - colminsz.(i)) * (dcol - tmincol) / (tcol - tmincol) } else (); Vdag (tmincol, tcol, colminsz, colsz, ncol) } in [("dag", Vlazy (Lazy.from_fun table_pre_dim))] in Hutil.interp conf base "dag" {Templ.eval_var = eval_var conf page_title next_txt; Templ.eval_transl _ = Templ.eval_transl conf; Templ.eval_predefined_apply _ = raise Not_found; Templ.get_vother = get_vother; Templ.set_vother = set_vother; Templ.print_foreach = print_foreach conf hts} env () ; value make_and_print_dag conf base elem_txt vbar_txt invert set spl page_title next_txt = let d = make_dag conf base set in let hts = make_tree_hts conf base elem_txt vbar_txt invert set spl d in print_slices_menu_or_dag_page conf base page_title hts next_txt ; value print conf base = let set = get_dag_elems conf base in let elem_txt p = Item p "" in let vbar_txt ip = "" in let invert = match Util.p_getenv conf.env "invert" with [ Some "on" -> True | _ -> False ] in let page_title = Util.capitale (Util.transl conf "tree") in make_and_print_dag conf base elem_txt vbar_txt invert set [] page_title "" ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/db1link.ml0000660000175200017530000007601512664543647023077 0ustar guillaumeguillaume(* $Id: db1link.ml,v 5.3 2010-09-23 16:56:51 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Gwcomp; open Printf; open Dbdisk; open Def; open Mutil; value default_source = ref ""; value do_check = ref True; value do_consang = ref False; value pr_stats = ref False; type person = dsk_person; type ascend = dsk_ascend; type union = dsk_union; type family = dsk_family; type couple = dsk_couple; type descend = dsk_descend; type gen_min_person 'person 'string = { m_first_name : mutable 'string; m_surname : mutable 'string; m_occ : mutable int; m_rparents : mutable list (gen_relation 'person 'string); m_related : mutable list iper; m_sex : mutable sex; m_notes : mutable 'string } ; type min_person = gen_min_person iper dsk_istr; type cbase = { c_persons : mutable array min_person; c_ascends : mutable array ascend; c_unions : mutable array union; c_couples : mutable array couple; c_descends : mutable array descend; c_strings : mutable array string; c_bnotes : mutable notes } ; type file_info = { f_curr_src_file : mutable string; f_curr_gwo_file : mutable string; f_separate : mutable bool; f_shift : mutable int; f_local_names : mutable Hashtbl.t (int * int) iper } ; type gen = { g_strings : mutable Hashtbl.t string dsk_istr; g_names : mutable Hashtbl.t int iper; g_pcnt : mutable int; g_fcnt : mutable int; g_scnt : mutable int; g_file_info : file_info; g_base : cbase; g_wiznotes : mutable list (string * string); g_patch_p : Hashtbl.t int person; g_def : mutable array bool; g_first_av_occ : Hashtbl.t (string * string) int; g_errored : mutable bool; g_per_index : out_channel; g_per : out_channel; g_fam_index : out_channel; g_fam : out_channel } ; value check_error gen = gen.g_errored := True; value set_error base gen x = do { printf "\nError: "; Check.print_base_error stdout base x; check_error gen; } ; value set_warning base = fun [ UndefinedSex _ -> () | x -> do { printf "\nWarning: "; Check.print_base_warning stdout base x; } ] ; value poi base i = base.c_persons.(Adef.int_of_iper i); value aoi base i = base.c_ascends.(Adef.int_of_iper i); value uoi base i = base.c_unions.(Adef.int_of_iper i); value coi base i = base.c_couples.(Adef.int_of_ifam i); value sou base i = base.c_strings.(Adef.int_of_istr i); value p_first_name base p = nominative (sou base p.m_first_name); value p_surname base p = nominative (sou base p.m_surname); value designation base p = let prenom = p_first_name base p in let nom = p_surname base p in prenom ^ "." ^ string_of_int p.m_occ ^ " " ^ nom ; (* value output_item_value oc v = Marshal.to_channel oc v [Marshal.No_sharing] ; value input_item_value ic = input_value ic ; *) value output_item_value = Iovalue.output; value input_item_value = Iovalue.input; (**) value no_string gen = ""; value unique_string gen x = try Hashtbl.find gen.g_strings x with [ Not_found -> do { if gen.g_scnt = Array.length gen.g_base.c_strings then do { let arr = gen.g_base.c_strings in let new_size = 2 * Array.length arr + 1 in let new_arr = Array.make new_size (no_string gen) in Array.blit arr 0 new_arr 0 (Array.length arr); gen.g_base.c_strings := new_arr; } else (); let u = Adef.istr_of_int gen.g_scnt in gen.g_base.c_strings.(gen.g_scnt) := x; gen.g_scnt := gen.g_scnt + 1; Hashtbl.add gen.g_strings x u; u } ] ; value no_family gen = let _ = unique_string gen "" in let cpl = Adef.couple (Adef.iper_of_int 0) (Adef.iper_of_int 0) and des = {children = [| |]} in (cpl, des) ; value make_person gen p n occ = let empty_string = unique_string gen "" in let p = {m_first_name = unique_string gen p; m_surname = unique_string gen n; m_occ = occ; m_rparents = []; m_related = []; m_sex = Neuter; m_notes = empty_string} and a = {parents = None; consang = Adef.fix (-1)} and u = {family = [| |]} in (p, a, u) ; value no_person gen = make_person gen "" "" 0; value new_iper gen = if gen.g_pcnt = Array.length gen.g_base.c_persons then do { let per_arr = gen.g_base.c_persons in let asc_arr = gen.g_base.c_ascends in let uni_arr = gen.g_base.c_unions in let new_size = 2 * Array.length per_arr + 1 in let (phony_per, phony_asc, phony_uni) = no_person gen in let new_per_arr = Array.make new_size phony_per in let new_asc_arr = Array.make new_size phony_asc in let new_uni_arr = Array.make new_size phony_uni in let new_def = Array.make new_size False in Array.blit per_arr 0 new_per_arr 0 (Array.length per_arr); gen.g_base.c_persons := new_per_arr; Array.blit asc_arr 0 new_asc_arr 0 (Array.length asc_arr); gen.g_base.c_ascends := new_asc_arr; Array.blit uni_arr 0 new_uni_arr 0 (Array.length uni_arr); gen.g_base.c_unions := new_uni_arr; Array.blit gen.g_def 0 new_def 0 (Array.length gen.g_def); gen.g_def := new_def; } else () ; value new_ifam gen = if gen.g_fcnt = Array.length gen.g_base.c_couples then do { let cpl_arr = gen.g_base.c_couples in let des_arr = gen.g_base.c_descends in let new_size = 2 * Array.length cpl_arr + 1 in let (phony_cpl, phony_des) = no_family gen in let new_cpl_arr = Array.make new_size phony_cpl in let new_des_arr = Array.make new_size phony_des in Array.blit cpl_arr 0 new_cpl_arr 0 (Array.length cpl_arr); gen.g_base.c_couples := new_cpl_arr; Array.blit des_arr 0 new_des_arr 0 (Array.length des_arr); gen.g_base.c_descends := new_des_arr; } else () ; value title_name_unique_string gen = fun [ Tmain -> Tmain | Tname n -> Tname (unique_string gen n) | Tnone -> Tnone ] ; value title_unique_string gen t = {t_name = title_name_unique_string gen t.t_name; t_ident = unique_string gen t.t_ident; t_place = unique_string gen t.t_place; t_date_start = t.t_date_start; t_date_end = t.t_date_end; t_nth = t.t_nth} ; value person_hash first_name surname = let first_name = nominative first_name in let surname = nominative surname in let s = Name.crush_lower (first_name ^ " " ^ surname) in Hashtbl.hash s ; value find_person_by_global_name gen first_name surname occ = let first_name = nominative first_name in let surname = nominative surname in let s = Name.crush_lower (first_name ^ " " ^ surname) in let key = Hashtbl.hash s in let ipl = Hashtbl.find_all gen.g_names key in let first_name = Name.lower first_name in let surname = Name.lower surname in let rec loop = fun [ [] -> raise Not_found | [ip :: ipl] -> let p = poi gen.g_base ip in if p.m_occ = occ && Name.lower (p_first_name gen.g_base p) = first_name && Name.lower (p_surname gen.g_base p) = surname then ip else loop ipl ] in loop ipl ; value find_person_by_local_name gen first_name surname occ = let first_name = nominative first_name in let surname = nominative surname in let s = Name.crush_lower (first_name ^ " " ^ surname) in let key = Hashtbl.hash s in let ipl = Hashtbl.find_all gen.g_file_info.f_local_names (key, occ) in let first_name = Name.lower first_name in let surname = Name.lower surname in let rec loop = fun [ [] -> raise Not_found | [ip :: ipl] -> let p = poi gen.g_base ip in if Name.lower (p_first_name gen.g_base p) = first_name && Name.lower (p_surname gen.g_base p) = surname then ip else loop ipl ] in loop ipl ; value find_person_by_name gen first_name surname occ = if gen.g_file_info.f_separate then find_person_by_local_name gen first_name surname occ else find_person_by_global_name gen first_name surname occ ; value add_person_by_name gen first_name surname occ iper = let s = Name.crush_lower (nominative (first_name ^ " " ^ surname)) in let key = Hashtbl.hash s in Hashtbl.add gen.g_names key iper ; value find_first_available_occ gen fn sn occ = let occ = try max occ (Hashtbl.find gen.g_first_av_occ (fn, sn)) with [ Not_found -> occ ] in loop occ where rec loop occ = match try Some (find_person_by_global_name gen fn sn occ) with [ Not_found -> None ] with [ Some _ -> loop (occ + 1) | None -> do { Hashtbl.add gen.g_first_av_occ (fn, sn) occ; occ } ] ; value insert_undefined gen key = let occ = key.pk_occ + gen.g_file_info.f_shift in let (x, ip) = try if key.pk_first_name = "?" || key.pk_surname = "?" then raise Not_found else let ip = find_person_by_name gen key.pk_first_name key.pk_surname occ in (poi gen.g_base ip, ip) with [ Not_found -> let new_occ = if gen.g_file_info.f_separate && key.pk_first_name <> "?" && key.pk_surname <> "?" then find_first_available_occ gen key.pk_first_name key.pk_surname occ else occ in let i = gen.g_pcnt in let (x, a, u) = make_person gen key.pk_first_name key.pk_surname new_occ in do { if key.pk_first_name <> "?" && key.pk_surname <> "?" then add_person_by_name gen key.pk_first_name key.pk_surname new_occ (Adef.iper_of_int i) else (); new_iper gen; gen.g_base.c_persons.(i) := x; gen.g_base.c_ascends.(i) := a; gen.g_base.c_unions.(i) := u; gen.g_pcnt := gen.g_pcnt + 1; if key.pk_first_name <> "?" && key.pk_surname <> "?" then let h = person_hash key.pk_first_name key.pk_surname in Hashtbl.add gen.g_file_info.f_local_names (h, occ) (Adef.iper_of_int i) else (); seek_out gen.g_per_index (Iovalue.sizeof_long * i); output_binary_int gen.g_per_index (pos_out gen.g_per); output_char gen.g_per 'U'; (x, Adef.iper_of_int i) } ] in do { if not gen.g_errored then if sou gen.g_base x.m_first_name <> key.pk_first_name || sou gen.g_base x.m_surname <> key.pk_surname then do { printf "\nPerson defined with two spellings:\n"; printf " \"%s%s %s\"\n" key.pk_first_name (match x.m_occ with [ 0 -> "" | n -> "." ^ string_of_int n ]) key.pk_surname; printf " \"%s%s %s\"\n" (p_first_name gen.g_base x) (match occ with [ 0 -> "" | n -> "." ^ string_of_int n ]) (p_surname gen.g_base x); gen.g_def.(Adef.int_of_iper ip) := True; check_error gen } else () else (); (x, ip) } ; value insert_person gen so = let occ = so.occ + gen.g_file_info.f_shift in let (x, ip) = try if so.first_name = "?" || so.surname = "?" then raise Not_found else let ip = find_person_by_name gen so.first_name so.surname occ in (poi gen.g_base ip, ip) with [ Not_found -> let new_occ = if gen.g_file_info.f_separate && so.first_name <> "?" && so.surname <> "?" then find_first_available_occ gen so.first_name so.surname occ else occ in let i = gen.g_pcnt in let (x, a, u) = make_person gen so.first_name so.surname new_occ in do { if so.first_name <> "?" && so.surname <> "?" then add_person_by_name gen so.first_name so.surname new_occ (Adef.iper_of_int i) else (); new_iper gen; gen.g_base.c_persons.(i) := x; gen.g_base.c_ascends.(i) := a; gen.g_base.c_unions.(i) := u; gen.g_pcnt := gen.g_pcnt + 1; if so.first_name <> "?" && so.surname <> "?" then let h = person_hash so.first_name so.surname in Hashtbl.add gen.g_file_info.f_local_names (h, occ) (Adef.iper_of_int i) else (); (x, Adef.iper_of_int i) } ] in do { if gen.g_def.(Adef.int_of_iper ip) then do { printf "\nPerson already defined: \"%s%s %s\"\n" so.first_name (match x.m_occ with [ 0 -> "" | n -> "." ^ string_of_int n ]) so.surname; if p_first_name gen.g_base x <> so.first_name || p_surname gen.g_base x <> so.surname then printf "as name: \"%s%s %s\"\n" (p_first_name gen.g_base x) (match occ with [ 0 -> "" | n -> "." ^ string_of_int n ]) (p_surname gen.g_base x) else (); flush stdout; check_error gen } else gen.g_def.(Adef.int_of_iper ip) := True; if not gen.g_errored then if sou gen.g_base x.m_first_name <> so.first_name || sou gen.g_base x.m_surname <> so.surname then do { printf "\nPerson defined with two spellings:\n"; printf " \"%s%s %s\"\n" so.first_name (match x.m_occ with [ 0 -> "" | n -> "." ^ string_of_int n ]) so.surname; printf " \"%s%s %s\"\n" (p_first_name gen.g_base x) (match occ with [ 0 -> "" | n -> "." ^ string_of_int n ]) (p_surname gen.g_base x); gen.g_def.(Adef.int_of_iper ip) := True; check_error gen } else () else (); if not gen.g_errored then do { let empty_string = unique_string gen "" in let x = {first_name = empty_string; surname = empty_string; occ = 0; image = unique_string gen so.image; first_names_aliases = List.map (unique_string gen) so.first_names_aliases; surnames_aliases = List.map (unique_string gen) so.surnames_aliases; public_name = unique_string gen so.public_name; qualifiers = List.map (unique_string gen) so.qualifiers; aliases = List.map (unique_string gen) so.aliases; titles = List.map (title_unique_string gen) so.titles; rparents = []; related = []; occupation = unique_string gen so.occupation; sex = Neuter; access = so.access; birth = so.birth; birth_place = unique_string gen so.birth_place; birth_src = unique_string gen so.birth_src; baptism = so.baptism; baptism_place = unique_string gen so.baptism_place; baptism_src = unique_string gen so.baptism_src; death = so.death; death_place = unique_string gen so.death_place; death_src = unique_string gen so.death_src; burial = so.burial; burial_place = unique_string gen so.burial_place; burial_src = unique_string gen so.burial_src; notes = empty_string; psources = unique_string gen (if so.psources = "" then default_source.val else so.psources); key_index = ip} in seek_out gen.g_per_index (Iovalue.sizeof_long * Adef.int_of_iper ip); output_binary_int gen.g_per_index (pos_out gen.g_per); output_char gen.g_per 'D'; output_item_value gen.g_per (x : person); } else (); (x, ip) } ; value insert_somebody gen = fun [ Undefined key -> insert_undefined gen key | Defined so -> insert_person gen so ] ; value check_parents_not_already_defined gen ix fath moth = let x = poi gen.g_base ix in match (aoi gen.g_base ix).parents with [ Some ifam -> let cpl = coi gen.g_base ifam in let p = Adef.father cpl in let m = Adef.mother cpl in do { printf " I cannot add \"%s\", child of - \"%s\" - \"%s\", because this persons still exists as child of - \"%s\" - \"%s\". " (designation gen.g_base x) (designation gen.g_base fath) (designation gen.g_base moth) (designation gen.g_base (poi gen.g_base p)) (designation gen.g_base (poi gen.g_base m)); flush stdout; (* x.birth := Adef.codate_None; x.death := DontKnowIfDead; *) check_error gen } | _ -> () ] ; value notice_sex gen p s = if p.m_sex = Neuter then p.m_sex := s else if p.m_sex = s || s = Neuter then () else do { printf "\nInconcistency about the sex of\n %s %s\n" (p_first_name gen.g_base p) (p_surname gen.g_base p); check_error gen } ; value insert_family gen co fath_sex moth_sex witl fo deo = let (fath, ifath) = insert_somebody gen (Adef.father co) in let (moth, imoth) = insert_somebody gen (Adef.mother co) in let witl = List.map (fun (wit, sex) -> do { let (p, ip) = insert_somebody gen wit in notice_sex gen p sex; p.m_related := [ifath :: p.m_related]; ip }) witl in let children = Array.map (fun key -> let (e, ie) = insert_person gen key in do { notice_sex gen e key.sex; ie }) deo.children in let comment = unique_string gen fo.comment in let fsources = unique_string gen (if fo.fsources = "" then default_source.val else fo.fsources) in do { new_ifam gen; let i = gen.g_fcnt in let fam = {marriage = fo.marriage; marriage_place = unique_string gen fo.marriage_place; marriage_src = unique_string gen fo.marriage_src; witnesses = Array.of_list witl; relation = fo.relation; divorce = fo.divorce; comment = comment; origin_file = unique_string gen fo.origin_file; fsources = fsources; fam_index = Adef.ifam_of_int i} and cpl = Adef.couple ifath imoth and des = {children = children} in let fath_uni = uoi gen.g_base ifath in let moth_uni = uoi gen.g_base imoth in seek_out gen.g_fam_index (Iovalue.sizeof_long * i); output_binary_int gen.g_fam_index (pos_out gen.g_fam); output_item_value gen.g_fam (fam : family); gen.g_base.c_couples.(gen.g_fcnt) := cpl; gen.g_base.c_descends.(gen.g_fcnt) := des; gen.g_fcnt := gen.g_fcnt + 1; let fath_uni = {family = Array.append fath_uni.family [| Adef.ifam_of_int i |]} in gen.g_base.c_unions.(Adef.int_of_iper ifath) := fath_uni; let moth_uni = {family = Array.append moth_uni.family [| Adef.ifam_of_int i |]} in gen.g_base.c_unions.(Adef.int_of_iper imoth) := moth_uni; notice_sex gen fath fath_sex; notice_sex gen moth moth_sex; Array.iter (fun ix -> let a = gen.g_base.c_ascends.(Adef.int_of_iper ix) in do { check_parents_not_already_defined gen ix fath moth; let a = {(a) with parents = Some (Adef.ifam_of_int i)} in gen.g_base.c_ascends.(Adef.int_of_iper ix) := a }) children; } ; value insert_notes fname gen key str = let occ = key.pk_occ + gen.g_file_info.f_shift in match try Some (find_person_by_name gen key.pk_first_name key.pk_surname occ) with [ Not_found -> None ] with [ Some ip -> let p = poi gen.g_base ip in if sou gen.g_base p.m_notes <> "" then do { printf "\nFile \"%s\"\n" fname; printf "Notes already defined for \"%s%s %s\"\n" key.pk_first_name (if occ = 0 then "" else "." ^ string_of_int occ) key.pk_surname; check_error gen } else p.m_notes := unique_string gen str | None -> do { printf "File \"%s\"\n" fname; printf "*** warning: undefined person: \"%s%s %s\"\n" key.pk_first_name (if occ = 0 then "" else "." ^ string_of_int occ) key.pk_surname; flush stdout; } ] ; value insert_bnotes fname gen nfname str = do { let old_nread = gen.g_base.c_bnotes.nread in let nfname = if nfname = "" then "" else match NotesLinks.check_file_name nfname with [ Some (dl, f) -> List.fold_right Filename.concat dl f | None -> "bad" ] in let bnotes = {nread f n = if f = nfname then str else old_nread f n; norigin_file = fname; efiles = if nfname <> "" then let efiles = gen.g_base.c_bnotes.efiles () in fun () -> [nfname :: efiles] else gen.g_base.c_bnotes.efiles} in gen.g_base.c_bnotes := bnotes; }; value insert_wiznote fname gen wizid str = gen.g_wiznotes := [(wizid, str) :: gen.g_wiznotes] ; value map_option f = fun [ Some x -> Some (f x) | None -> None ] ; value insert_relation_parent gen ip s k = do { let (par, ipar) = insert_somebody gen k in par.m_related := [ip :: par.m_related]; if par.m_sex = Neuter then par.m_sex := s else (); ipar }; value insert_relation gen ip r = {r_type = r.r_type; r_fath = map_option (insert_relation_parent gen ip Male) r.r_fath; r_moth = map_option (insert_relation_parent gen ip Female) r.r_moth; r_sources = unique_string gen r.r_sources} ; value insert_relations fname gen sb sex rl = let (p, ip) = insert_somebody gen sb in if p.m_rparents <> [] then do { printf "\nFile \"%s\"\n" fname; printf "Relations already defined for \"%s%s %s\"\n" (sou gen.g_base p.m_first_name) (if p.m_occ = 0 then "" else "." ^ string_of_int p.m_occ) (sou gen.g_base p.m_surname); check_error gen } else do { notice_sex gen p sex; let rl = List.map (insert_relation gen ip) rl in p.m_rparents := rl } ; value insert_syntax fname gen = fun [ Family cpl fs ms witl fam des -> insert_family gen cpl fs ms witl fam des | Notes key str -> insert_notes fname gen key str | Relations sb sex rl -> insert_relations fname gen sb sex rl | Bnotes nfname str -> insert_bnotes fname gen nfname str | Wnotes wizid str -> insert_wiznote fname gen wizid str ] ; value record_access_of tab = {load_array () = (); get i = tab.(i); set i v = tab.(i) := v; output_array oc = output_value_no_sharing oc (tab : array _); len = Array.length tab; clear_array () = ()} ; value no_istr_iper_index = {find = fun []; cursor = fun []; next = fun []}; value persons_record_access gen per_index_ic per_ic persons = let read_person_in_temp_file i = let mp = persons.(i) in let p = let c = try do { seek_in per_index_ic (Iovalue.sizeof_long * i); let pos = input_binary_int per_index_ic in seek_in per_ic pos; input_char per_ic } with [ End_of_file -> 'U' ] in match c with [ 'D' -> (input_item_value per_ic : person) | 'U' -> let empty_string = Adef.istr_of_int 0 in {first_name = empty_string; surname = empty_string; occ = 0; image = empty_string; first_names_aliases = []; surnames_aliases = []; public_name = empty_string; qualifiers = []; aliases = []; titles = []; rparents = []; related = []; occupation = empty_string; sex = Neuter; access = IfTitles; birth = Adef.codate_None; birth_place = empty_string; birth_src = empty_string; baptism = Adef.codate_None; baptism_place = empty_string; baptism_src = empty_string; death = DontKnowIfDead; death_place = empty_string; death_src = empty_string; burial = UnknownBurial; burial_place = empty_string; burial_src = empty_string; notes = empty_string; psources = empty_string; key_index = Adef.iper_of_int 0} | _ -> assert False ] in {(p) with first_name = mp.m_first_name; surname = mp.m_surname; occ = mp.m_occ; rparents = mp.m_rparents; related = mp.m_related; sex = mp.m_sex; notes = mp.m_notes; key_index = Adef.iper_of_int i} in let get_fun i = try Hashtbl.find gen.g_patch_p i with [ Not_found -> read_person_in_temp_file i ] in let len = Array.length persons in {load_array () = (); get = get_fun; set i v = failwith "bug: setting persons array"; output_array oc = Mutil.output_array_no_sharing oc get_fun len; len = len; clear_array () = ()} ; value particules_file = ref ""; value families_record_access fam_index_ic fam_ic len = let get_fun i = do { seek_in fam_index_ic (Iovalue.sizeof_long * i); let pos = input_binary_int fam_index_ic in seek_in fam_ic pos; let fam : family = input_item_value fam_ic in fam } in {load_array () = (); get = get_fun; set i v = failwith "bug: setting family array"; output_array oc = output_array_no_sharing oc get_fun len; len = len; clear_array () = ()} ; value input_particles part_file = if part_file = "" then ["af "; "d'"; "d’"; "dal "; "de "; "di "; "du "; "of "; "van "; "von und zu "; "von "; "zu "; "zur "; "AF "; "D'"; "D’"; "DAL "; "DE "; "DI "; "DU "; "OF "; "VAN "; "VON UND ZU "; "VON "; "ZU "; "ZUR "] else Mutil.input_particles part_file ; value empty_base : cbase = {c_persons = [| |]; c_ascends = [| |]; c_unions = [| |]; c_couples = [| |]; c_descends = [| |]; c_strings = [| |]; c_bnotes = {nread = fun _ _ -> ""; norigin_file = ""; efiles _ = []}} ; value linked_base gen per_index_ic per_ic fam_index_ic fam_ic bdir = (**) let _ = do { Printf.eprintf "pcnt %d persons %d\n" gen.g_pcnt (Array.length gen.g_base.c_persons); flush stderr; } in (**) let persons = let a = Array.sub gen.g_base.c_persons 0 gen.g_pcnt in do { gen.g_base.c_persons := [| |]; a } in let ascends = let a = Array.sub gen.g_base.c_ascends 0 gen.g_pcnt in do { gen.g_base.c_ascends := [| |]; a } in let unions = let a = Array.sub gen.g_base.c_unions 0 gen.g_pcnt in do { gen.g_base.c_unions := [| |]; a } in (**) let _ = do { Printf.eprintf "fcnt %d families %d\n" gen.g_fcnt (Array.length gen.g_base.c_couples); flush stderr; } in (**) let couples = let a = Array.sub gen.g_base.c_couples 0 gen.g_fcnt in do { gen.g_base.c_couples := [| |]; a } in let descends = let a = Array.sub gen.g_base.c_descends 0 gen.g_fcnt in do { gen.g_base.c_descends := [| |]; a } in (**) let _ = do { Printf.eprintf "scnt %d strings %d\n" gen.g_scnt (Array.length gen.g_base.c_strings); flush stderr; } in (**) let strings = let a = Array.sub gen.g_base.c_strings 0 gen.g_scnt in do { gen.g_base.c_strings := [| |]; a } in let particles = input_particles particules_file.val in let bnotes = gen.g_base.c_bnotes in let base_data = {persons = persons_record_access gen per_index_ic per_ic persons; ascends = record_access_of ascends; unions = record_access_of unions; families = families_record_access fam_index_ic fam_ic gen.g_fcnt; visible = { v_write = fun []; v_get = fun [] }; couples = record_access_of couples; descends = record_access_of descends; strings = record_access_of strings; particles = particles; bnotes = bnotes; bdir = bdir} in let base_func = {person_of_key = fun []; persons_of_name = fun []; strings_of_fsname = fun []; persons_of_surname = no_istr_iper_index; persons_of_first_name = no_istr_iper_index; patch_person = fun []; patch_ascend = fun []; patch_union = fun []; patch_family = fun []; patch_couple = fun []; patch_descend = fun []; insert_string = fun []; patch_name = fun []; commit_patches = fun []; commit_notes = fun []; patched_ascends = fun []; is_patched_person _ = False; cleanup = fun () -> ()} in {data = base_data; func = base_func} ; value fold_option fsome vnone = fun [ Some v -> fsome v | None -> vnone ] ; value write_file_contents fname text = let oc = open_out fname in do { output_string oc text; close_out oc; } ; value output_wizard_notes bdir wiznotes = do { let wizdir = Filename.concat bdir "wiznotes" in Mutil.remove_dir wizdir; if wiznotes = [] then () else do { try Unix.mkdir wizdir 0o755 with _ -> (); List.iter (fun (wizid, text) -> let fname = Filename.concat wizdir wizid ^ ".txt" in write_file_contents fname text) wiznotes; } }; value output_particles_file bdir particles = do { let oc = open_out (Filename.concat bdir "particles.txt") in List.iter (fun s -> fprintf oc "%s\n" (Mutil.tr ' ' '_' s)) particles; close_out oc; }; value output_command_line bdir = do { let oc = open_out (Filename.concat bdir "command.txt") in fprintf oc "%s" Sys.argv.(0); for i = 1 to Array.length Sys.argv - 1 do { fprintf oc " %s" Sys.argv.(i) }; fprintf oc "\n"; close_out oc; }; value link next_family_fun bdir = do { let tmp_dir = Filename.concat "gw_tmp" bdir in try Mutil.mkdir_p tmp_dir with _ -> (); let tmp_per_index = Filename.concat tmp_dir "gwc_per_index" in let tmp_per = Filename.concat tmp_dir "gwc_per" in let tmp_fam_index = Filename.concat tmp_dir "gwc_fam_index" in let tmp_fam = Filename.concat tmp_dir "gwc_fam" in let fi = {f_local_names = Hashtbl.create 20011; f_curr_src_file = ""; f_curr_gwo_file = ""; f_separate = False; f_shift = 0} in let gen = {g_strings = Hashtbl.create 20011; g_names = Hashtbl.create 20011; g_pcnt = 0; g_fcnt = 0; g_scnt = 0; g_file_info = fi; g_base = empty_base; g_patch_p = Hashtbl.create 20011; g_wiznotes = []; g_def = [| |]; g_first_av_occ = Hashtbl.create 1; g_errored = False; g_per_index = open_out_bin tmp_per_index; g_per = open_out_bin tmp_per; g_fam_index = open_out_bin tmp_fam_index; g_fam = open_out_bin tmp_fam } in let per_index_ic = open_in_bin tmp_per_index in let per_ic = open_in_bin tmp_per in let fam_index_ic = open_in_bin tmp_fam_index in let fam_ic = open_in_bin tmp_fam in let istr_empty = unique_string gen "" in let istr_quest = unique_string gen "?" in assert (istr_empty = Adef.istr_of_int 0); assert (istr_quest = Adef.istr_of_int 1); IFDEF UNIX THEN Sys.remove tmp_per_index ELSE () END; IFDEF UNIX THEN Sys.remove tmp_per ELSE () END; IFDEF UNIX THEN Sys.remove tmp_fam_index ELSE () END; IFDEF UNIX THEN Sys.remove tmp_fam ELSE () END; let next_family = next_family_fun fi in loop () where rec loop () = match next_family () with [ Some fam -> do { insert_syntax fi.f_curr_src_file gen fam; loop () } | None -> () ]; close_out gen.g_per_index; close_out gen.g_per; close_out gen.g_fam_index; close_out gen.g_fam; Hashtbl.clear gen.g_strings; Hashtbl.clear gen.g_names; Hashtbl.clear fi.f_local_names; Gc.compact (); let dsk_base = linked_base gen per_index_ic per_ic fam_index_ic fam_ic bdir in Hashtbl.clear gen.g_patch_p; let base = Gwdb.base_of_base1 dsk_base in if do_check.val && gen.g_pcnt > 0 then do { let changed_p (ip, p, o_sex, o_rpar) = let p = Gwdb.dsk_person_of_person p in let p = {(p) with sex = fold_option (fun s -> s) p.sex o_sex; rparents = fold_option (List.map (Futil.map_relation_ps (fun p -> p) (fun s -> Adef.istr_of_int 0))) p.rparents o_rpar} in let i = Adef.int_of_iper ip in Hashtbl.replace gen.g_patch_p i p in Check.check_base base (set_error base gen) (set_warning base) (fun i -> gen.g_def.(i)) changed_p pr_stats.val; flush stdout; } else (); if not gen.g_errored then do { if do_consang.val then let _ : option _ = ConsangAll.compute base (-1) True False in () else (); Gc.compact (); Outbase.output bdir dsk_base; output_wizard_notes bdir gen.g_wiznotes; output_particles_file bdir dsk_base.data.particles; try Mutil.remove_dir tmp_dir with _ -> (); try Unix.rmdir "gw_tmp" with _ -> (); output_command_line bdir; True } else False }; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/updateIndOk.ml0000660000175200017530000007226212664543647023762 0ustar guillaumeguillaume(* camlp5r ./pa_html.cmo *) (* $Id: updateIndOk.ml,v 5.75 2008-01-21 13:28:12 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Config; open Def; open Futil; open Gutil; open Gwdb; open Hutil; open Mutil; open Util; (* Liste des string dont on a supprimé un caractère. *) (* Utilisé pour le message d'erreur lors de la validation. *) value removed_string = ref [] ; value raw_get conf key = match p_getenv conf.env key with [ Some v -> v | None -> failwith (key ^ " unbound") ] ; value get conf key = match p_getenv conf.env key with [ Some v -> v | None -> failwith (key ^ " unbound") ] ; value get_nth conf key cnt = p_getenv conf.env (key ^ string_of_int cnt); value getn conf var key = match p_getenv conf.env (var ^ "_" ^ key) with [ Some v -> v | None -> failwith (var ^ "_" ^ key ^ " unbound") ] ; value rec reconstitute_string_list conf var ext cnt = match get_nth conf var cnt with [ Some s -> let s = no_html_tags (only_printable s) in let (sl, ext) = reconstitute_string_list conf var ext (cnt + 1) in match get_nth conf ("add_" ^ var) cnt with [ Some "on" -> ([s; "" :: sl], True) | _ -> ([s :: sl], ext) ] | _ -> ([], ext) ] ; value reconstitute_insert_title conf ext cnt tl = let var = "ins_title" ^ string_of_int cnt in let n = match (p_getenv conf.env var, p_getint conf.env (var ^ "_n")) with [ (_, Some n) when n > 1 -> n | (Some "on", _) -> 1 | _ -> 0 ] in if n > 0 then let tl = loop tl n where rec loop tl n = if n > 0 then let t1 = {t_name = Tnone; t_ident = ""; t_place = ""; t_date_start = Adef.codate_None; t_date_end = Adef.codate_None; t_nth = 0} in loop [t1 :: tl] (n - 1) else tl in (tl, True) else (tl, ext) ; value rec reconstitute_titles conf ext cnt = match (get_nth conf "t_ident" cnt, get_nth conf "t_place" cnt, get_nth conf "t_name" cnt) with [ (Some t_ident, Some t_place, Some t_name) -> let t_name = match (get_nth conf "t_main_title" cnt, t_name) with [ (Some "on", _) -> Tmain | (_, "") -> Tnone | (_, _) -> Tname (no_html_tags (only_printable t_name)) ] in let t_date_start = Update.reconstitute_date conf ("t_date_start" ^ string_of_int cnt) in let t_date_end = Update.reconstitute_date conf ("t_date_end" ^ string_of_int cnt) in let t_nth = match get_nth conf "t_nth" cnt with [ Some s -> try int_of_string s with [ Failure _ -> 0 ] | _ -> 0 ] in let t = {t_name = t_name; t_ident = no_html_tags (only_printable t_ident); t_place = no_html_tags (only_printable t_place); t_date_start = Adef.codate_of_od t_date_start; t_date_end = Adef.codate_of_od t_date_end; t_nth = t_nth} in let (tl, ext) = reconstitute_titles conf ext (cnt + 1) in let (tl, ext) = reconstitute_insert_title conf ext cnt tl in ([t :: tl], ext) | _ -> ([], ext) ] ; value reconstitute_add_relation conf ext cnt rl = match get_nth conf "add_relation" cnt with [ Some "on" -> let r = {r_type = GodParent; r_fath = None; r_moth = None; r_sources = ""} in ([r :: rl], True) | _ -> (rl, ext) ] ; value deleted_relation = ref []; value reconstitute_relation_parent conf var key sex = match (getn conf var (key ^ "_fn"), getn conf var (key ^ "_sn")) with [ ("", _) | (_, "") | ("?", _) | (_, "?") as n -> (* On enregistre les personnes dont on supprime le lien, pour *) (* prévenir l'utilisateur lors de la validation du formulaire. *) do { let p = only_printable (fst n) ^ only_printable (snd n) in if p = "" || p = "??" then () else deleted_relation.val := [p :: deleted_relation.val]; None } | (fn, sn) -> let fn = only_printable fn in let sn = only_printable sn in (* S'il y a des caractères interdits, on les supprime *) let (fn, sn) = let contain_fn = String.contains fn in let contain_sn = String.contains sn in if (List.exists contain_fn Name.forbidden_char) || (List.exists contain_sn Name.forbidden_char) then do { removed_string.val := [(Name.purge fn ^ " " ^ Name.purge sn) :: removed_string.val]; (Name.purge fn, Name.purge sn) } else (fn, sn) in let occ = try int_of_string (getn conf var (key ^ "_occ")) with [ Failure _ -> 0 ] in let create = match getn conf var (key ^ "_p") with [ "create" -> Update.Create sex None | _ -> Update.Link ] in Some (fn, sn, occ, create, var ^ "_" ^ key) ] ; value reconstitute_relation conf var = try let r_fath = reconstitute_relation_parent conf var "fath" Male in let r_moth = reconstitute_relation_parent conf var "moth" Female in let r_type = match getn conf var "type" with [ "Adoption" -> Adoption | "Recognition" -> Recognition | "CandidateParent" -> CandidateParent | "GodParent" -> GodParent | "FosterParent" -> FosterParent | _ -> GodParent ] in Some {r_type = r_type; r_fath = r_fath; r_moth = r_moth; r_sources = ""} with [ Failure _ -> None ] ; value rec reconstitute_relations conf ext cnt = match reconstitute_relation conf ("r" ^ string_of_int cnt) with [ Some r -> let (rl, ext) = reconstitute_relations conf ext (cnt + 1) in let (rl, ext) = reconstitute_add_relation conf ext cnt rl in ([r :: rl], ext) | _ -> ([], ext) ] ; value reconstitute_death conf birth baptism death_place burial burial_place = let d = Update.reconstitute_date conf "death" in let dr = match p_getenv conf.env "death_reason" with [ Some "Killed" -> Killed | Some "Murdered" -> Murdered | Some "Executed" -> Executed | Some "Disappeared" -> Disappeared | Some "Unspecified" | None -> Unspecified | Some x -> failwith ("bad death reason type " ^ x) ] in match get conf "death" with [ "Auto" when d = None -> if death_place <> "" || burial <> UnknownBurial || burial_place <> "" || dr <> Unspecified then DeadDontKnowWhen else Update.infer_death conf birth baptism | "DeadYoung" when d = None -> DeadYoung | "DontKnowIfDead" when d = None -> DontKnowIfDead | "NotDead" -> NotDead | "OfCourseDead" when d = None -> OfCourseDead | _ -> match d with [ Some d -> Death dr (Adef.cdate_of_date d) | _ -> DeadDontKnowWhen ] ] ; value reconstitute_burial conf burial_place = let d = Update.reconstitute_date conf "burial" in match p_getenv conf.env "burial" with [ Some "UnknownBurial" | None -> match (d, burial_place) with [ (None, "") -> UnknownBurial | _ -> Buried (Adef.codate_of_od d) ] | Some "Buried" -> Buried (Adef.codate_of_od d) | Some "Cremated" -> Cremated (Adef.codate_of_od d) | Some x -> failwith ("bad burial type " ^ x) ] ; value reconstitute_person conf = let ext = False in let key_index = match p_getenv conf.env "i" with [ Some s -> try int_of_string (strip_spaces s) with [ Failure _ -> -1 ] | _ -> -1 ] in let first_name = no_html_tags (only_printable (get conf "first_name")) in let surname = no_html_tags (only_printable (get conf "surname")) in (* S'il y a des caractères interdits, on les supprime *) let (first_name, surname) = let contain_fn = String.contains first_name in let contain_sn = String.contains surname in if (List.exists contain_fn Name.forbidden_char) || (List.exists contain_sn Name.forbidden_char) then do { removed_string.val := [(Name.purge first_name ^ " " ^ Name.purge surname) :: removed_string.val]; (Name.purge first_name, Name.purge surname) } else (first_name, surname) in let occ = try int_of_string (strip_spaces (get conf "occ")) with [ Failure _ -> 0 ] in let image = only_printable (get conf "image") in let (first_names_aliases, ext) = reconstitute_string_list conf "first_name_alias" ext 0 in let (surnames_aliases, ext) = reconstitute_string_list conf "surname_alias" ext 0 in let public_name = no_html_tags (only_printable (get conf "public_name")) in let (qualifiers, ext) = reconstitute_string_list conf "qualifier" ext 0 in let (aliases, ext) = reconstitute_string_list conf "alias" ext 0 in let (titles, ext) = reconstitute_titles conf ext 1 in let (titles, ext) = reconstitute_insert_title conf ext 0 titles in let (rparents, ext) = reconstitute_relations conf ext 1 in let (rparents, ext) = reconstitute_add_relation conf ext 0 rparents in let access = match p_getenv conf.env "access" with [ Some "Public" -> Public | Some "Private" -> Private | _ -> IfTitles ] in let occupation = only_printable (get conf "occu") in let sex = match p_getenv conf.env "sex" with [ Some "M" -> Male | Some "F" -> Female | _ -> Neuter ] in let birth = Update.reconstitute_date conf "birth" in let birth_place = no_html_tags (only_printable (get conf "birth_place")) in let bapt = Update.reconstitute_date conf "bapt" in let bapt_place = no_html_tags (only_printable (get conf "bapt_place")) in let burial_place = no_html_tags (only_printable (get conf "burial_place")) in let burial = reconstitute_burial conf burial_place in let death_place = no_html_tags (only_printable (get conf "death_place")) in let death = reconstitute_death conf birth bapt death_place burial burial_place in let death_place = match death with [ Death _ _ | DeadYoung | DeadDontKnowWhen -> death_place | _ -> "" ] in let death = match (death, burial) with [ (NotDead | DontKnowIfDead, Buried _ | Cremated _) -> DeadDontKnowWhen | _ -> death ] in let notes = if first_name = "?" || surname = "?" then "" else only_printable_or_nl (strip_all_trailing_spaces (get conf "notes")) in let psources = only_printable (get conf "src") in let p = {first_name = first_name; surname = surname; occ = occ; image = image; first_names_aliases = first_names_aliases; surnames_aliases = surnames_aliases; public_name = public_name; qualifiers = qualifiers; aliases = aliases; titles = titles; rparents = rparents; occupation = occupation; related = []; sex = sex; access = access; birth = Adef.codate_of_od birth; birth_place = birth_place; birth_src = only_printable (get conf "birth_src"); baptism = Adef.codate_of_od bapt; baptism_place = bapt_place; baptism_src = only_printable (get conf "bapt_src"); death = death; death_place = death_place; death_src = only_printable (get conf "death_src"); burial = burial; burial_place = burial_place; burial_src = only_printable (get conf "burial_src"); notes = notes; psources = psources; key_index = Adef.iper_of_int key_index} in (p, ext) ; value check_person conf base p = if p.first_name = "" || p.first_name = "?" then Some (transl conf "first name missing") else if p.surname = "" || p.surname = "?" then Some (transl conf "surname missing") else None ; value error_person conf base p err = let title _ = Wserver.wprint "%s" (capitale (transl conf "error")) in do { rheader conf title; Wserver.wprint "%s\n" (capitale err); Update.print_return conf; trailer conf; raise Update.ModErr } ; value strip_list = List.filter (fun s -> s <> ""); value strip_person p = {(p) with first_names_aliases = strip_list p.first_names_aliases; surnames_aliases = strip_list p.surnames_aliases; qualifiers = strip_list p.qualifiers; aliases = strip_list p.aliases; titles = List.filter (fun t -> t.t_ident <> "") p.titles; rparents = List.filter (fun r -> r.r_fath <> None || r.r_moth <> None) p.rparents} ; value print_conflict conf base p = let title _ = Wserver.wprint "%s" (capitale (transl conf "error")) in do { rheader conf title; Update.print_error conf base (AlreadyDefined p); let free_n = Gutil.find_free_occ base (p_first_name base p) (p_surname base p) 0 in tag "ul" begin stag "li" begin Wserver.wprint "%s: %d.\n" (capitale (transl conf "first free number")) free_n; Wserver.wprint (fcapitale (ftransl conf "click on \"%s\"")) (transl conf "create"); Wserver.wprint "%s.\n" (transl conf " to try again with this number"); end; stag "li" begin Wserver.wprint "%s " (capitale (transl conf "or")); Wserver.wprint (ftransl conf "click on \"%s\"") (transl conf "back"); Wserver.wprint " %s %s." (transl_nth conf "and" 0) (transl conf "change it (the number) yourself"); end; end; tag "form" "method=\"post\" action=\"%s\"" conf.command begin List.iter (fun (x, v) -> xtag "input" "type=\"hidden\" name=\"%s\" value=\"%s\"" x (quote_escaped (decode_varenv v))) (conf.henv @ conf.env); xtag "input" "type=\"hidden\" name=\"free_occ\" value=\"%d\"" free_n; xtag "input" "type=\"submit\" name=\"create\" value=\"%s\"" (capitale (transl conf "create")); xtag "input" "type=\"submit\" name=\"return\" value=\"%s\"" (capitale (transl conf "back")); end; Update.print_same_name conf base p; trailer conf; raise Update.ModErr } ; value print_cannot_change_sex conf base p = let title _ = Wserver.wprint "%s" (capitale (transl conf "error")) in do { rheader conf title; Update.print_error conf base (BadSexOfMarriedPerson p); tag "ul" begin html_li conf; Wserver.wprint "\n%s" (referenced_person_text conf base p); Wserver.wprint "\n"; end; Update.print_return conf; trailer conf; raise Update.ModErr } ; value check_conflict conf base sp ipl = let name = Name.lower (sp.first_name ^ " " ^ sp.surname) in List.iter (fun ip -> let p1 = poi base ip in if get_key_index p1 <> sp.key_index && Name.lower (p_first_name base p1 ^ " " ^ p_surname base p1) = name && get_occ p1 = sp.occ then print_conflict conf base p1 else ()) ipl ; value check_sex_married conf base sp op = if sp.sex <> get_sex op then let no_check = List.for_all (fun ifam -> let r = get_relation (foi base ifam) in r = NoSexesCheckNotMarried || r = NoSexesCheckMarried) (Array.to_list (get_family op)) in if no_check then () else print_cannot_change_sex conf base op else () ; value rename_image_file conf base op sp = match auto_image_file conf base op with [ Some old_f -> let s = default_image_name_of_key sp.first_name sp.surname sp.occ in let f = Filename.concat (Util.base_path ["images"] conf.bname) s in let new_f = if Filename.check_suffix old_f ".gif" then f ^ ".gif" else f ^ ".jpg" in try Sys.rename old_f new_f with [ Sys_error _ -> () ] | _ -> () ] ; value rparents_of rparents = List.fold_left (fun ipl r -> match (r.r_fath, r.r_moth) with [ (Some ip1, Some ip2) -> [ip1; ip2 :: ipl] | (Some ip, _) -> [ip :: ipl] | (_, Some ip) -> [ip :: ipl] | _ -> ipl ]) [] rparents ; value is_witness_at_marriage base ip p = let u = poi base ip in List.exists (fun ifam -> let fam = foi base ifam in array_mem ip (get_witnesses fam)) (Array.to_list (get_family u)) ; value effective_mod conf base sp = do { let pi = sp.key_index in let op = poi base pi in let key = sp.first_name ^ " " ^ sp.surname in let ofn = p_first_name base op in let osn = p_surname base op in let oocc = get_occ op in if ofn = sp.first_name && osn = sp.surname && oocc = sp.occ then () else do { let ipl = person_ht_find_all base key in check_conflict conf base sp ipl; rename_image_file conf base op sp; }; let same_fn_sn = Name.lower (nominative sp.first_name) = Name.lower ofn && Name.lower (nominative sp.surname) = Name.lower osn in if sp.first_name <> "?" && sp.surname <> "?" && (not same_fn_sn || oocc <> sp.occ) then do { delete_key base ofn osn oocc; patch_key base pi sp.first_name sp.surname sp.occ; if not same_fn_sn then patch_name base key pi else (); } else (); check_sex_married conf base sp op; let created_p = ref [] in let np = map_person_ps (Update.insert_person conf base sp.psources created_p) (Gwdb.insert_string base) sp in let op_misc_names = person_misc_names base op get_titles in let np = {(np) with related = get_related op} in let np_misc_names = gen_person_misc_names base np (fun p -> p.titles) in List.iter (fun key -> if List.mem key op_misc_names then () else person_ht_add base key pi) np_misc_names; let ol = rparents_of (get_rparents op) in let nl = rparents_of np.rparents in let pi = np.key_index in Update.update_related_pointers base pi ol nl; np }; value effective_add conf base sp = do { let pi = Adef.iper_of_int (nb_of_persons base) in let fn = Util.translate_eval sp.first_name in let sn = Util.translate_eval sp.surname in let key = fn ^ " " ^ sn in let ipl = person_ht_find_all base key in check_conflict conf base sp ipl; patch_key base pi fn sn sp.occ; person_ht_add base key pi; let created_p = ref [] in let np = map_person_ps (Update.insert_person conf base sp.psources created_p) (Gwdb.insert_string base) {(sp) with key_index = pi} in patch_person base pi np; let na = {parents = None; consang = Adef.fix (-1)} in patch_ascend base pi na; let nu = {family = [| |]} in patch_union base pi nu; let np_misc_names = gen_person_misc_names base np (fun p -> p.titles) in List.iter (fun key -> person_ht_add base key pi) np_misc_names; (np, na) }; value array_except v a = loop 0 where rec loop i = if i = Array.length a then a else if a.(i) = v then Array.append (Array.sub a 0 i) (Array.sub a (i + 1) (Array.length a - i - 1)) else loop (i + 1) ; value update_relations_of_related base ip old_related = List.iter (fun ip1 -> do { let p1 = poi base ip1 in let (rparents, rparents_are_different) = List.fold_right (fun rel (list, rad) -> let (rfath, rad) = match rel.r_fath with [ Some ip2 -> if ip2 = ip then (None, True) else (Some ip2, rad) | None -> (None, rad) ] in let (rmoth, rad) = match rel.r_moth with [ Some ip2 -> if ip2 = ip then (None, True) else (Some ip2, rad) | None -> (None, rad) ] in if rfath = None && rmoth = None then (list, True) else let rel = {(rel) with r_fath = rfath; r_moth = rmoth} in ([rel :: list], rad)) (get_rparents p1) ([], False) in if rparents_are_different then let p = gen_person_of_person p1 in patch_person base ip1 {(p) with rparents = rparents} else (); let families = get_family p1 in for i = 0 to Array.length families - 1 do { let ifam = families.(i) in let fam = foi base ifam in let old_witnesses = Array.to_list (get_witnesses fam) in let new_witnesses = List.filter (\<> ip) old_witnesses in if new_witnesses <> old_witnesses then let fam = gen_family_of_family fam in patch_family base ifam {(fam) with witnesses = Array.of_list new_witnesses} else (); }; }) old_related ; value effective_del conf base warning p = do { let none = Gwdb.insert_string base "?" in let empty = Gwdb.insert_string base "" in let ip = get_key_index p in match get_parents p with [ Some ifam -> do { let des = foi base ifam in let des = do { let children = array_except ip (get_children des) in match CheckItem.sort_children base children with [ Some (b, a) -> warning (ChangedOrderOfChildren ifam des b a) | None -> () ]; {children = children} } in patch_descend base ifam des; let asc = {parents = None; consang = Adef.fix (-1)} in patch_ascend base ip asc; } | None -> () ]; let old_rparents = rparents_of (get_rparents p) in Update.update_related_pointers base ip old_rparents []; {first_name = none; surname = none; occ = 0; image = empty; public_name = empty; qualifiers = []; aliases = []; sex = get_sex p; first_names_aliases = []; surnames_aliases = []; titles = []; rparents = []; related = []; occupation = empty; access = IfTitles; birth = Adef.codate_None; birth_place = empty; birth_src = empty; baptism = Adef.codate_None; baptism_place = empty; baptism_src = empty; death = DontKnowIfDead; death_place = empty; death_src = empty; burial = UnknownBurial; burial_place = empty; burial_src = empty; notes = empty; psources = empty; key_index = ip} }; value print_mod_ok conf base wl p = let title _ = Wserver.wprint "%s" (capitale (transl conf "person modified")) in do { header conf title; print_link_to_welcome conf True; (* Si on a supprimé des caractères interdits *) if List.length removed_string.val > 0 then do { Wserver.wprint "

      " ; Wserver.wprint (fcapitale (ftransl conf "%s forbidden char")) (List.fold_left (fun acc c -> acc ^ "'" ^ Char.escaped c ^ "' ") " " Name.forbidden_char); Wserver.wprint "

      \n" ; List.iter (Wserver.wprint "

      %s

      ") removed_string.val } else (); (* Si on a supprimé des relations, on les mentionne *) match deleted_relation.val with [ [] -> () | _ -> do { tag "p" begin Wserver.wprint "%s, %s %s %s :" (capitale (transl_nth conf "relation/relations" 0)) (transl conf "first name missing") (transl conf "or") (transl conf "surname missing") ; tag "ul" begin List.iter (fun s -> do {stag "li" begin Wserver.wprint "%s" s; end;}) deleted_relation.val; end; end; } ] ; Wserver.wprint "\n

      %s

      " (referenced_person_text conf base (poi base p.key_index)); Wserver.wprint "\n"; Update.print_warnings conf base wl; trailer conf; } ; (* value print_mod_ok conf base wl p = if wl = [] then Perso.print conf base p else print_mod_ok_aux conf base wl p ; *) value relation_sex_is_coherent base warning p = List.iter (fun r -> do { match r.r_fath with [ Some ip -> let p = poi base ip in if get_sex p <> Male then warning (IncoherentSex p 0 0) else () | None -> () ]; match r.r_moth with [ Some ip -> let p = poi base ip in if get_sex p <> Female then warning (IncoherentSex p 0 0) else () | None -> () ]; }) p.rparents ; value all_checks_person conf base p a u = do { let wl = ref [] in let error = Update.error conf base in let warning w = wl.val := [w :: wl.val] in let _ : option _ = let p = person_of_gen_person base (p, a, u) in CheckItem.person base warning p in relation_sex_is_coherent base warning p; match a.parents with [ Some ifam -> CheckItem.reduce_family base error warning ifam (foi base ifam) | _ -> () ]; Array.iter (fun ifam -> CheckItem.reduce_family base error warning ifam (foi base ifam)) u.family; List.iter (fun [ ChangedOrderOfChildren ifam des _ after -> patch_descend base ifam {children = after} | _ -> () ]) wl.val; List.rev wl.val }; value print_add_ok conf base wl p = let title _ = Wserver.wprint "%s" (capitale (transl conf "person added")) in do { header conf title; print_link_to_welcome conf True; (* Si on a supprimé des caractères interdits *) if List.length removed_string.val > 0 then do { Wserver.wprint "

      %s

      \n" (capitale (transl conf "forbidden char")); List.iter (Wserver.wprint "

      %s

      ") removed_string.val } else (); (* Si on a supprimé des relations, on les mentionne *) List.iter (fun s -> Wserver.wprint "%s -> %s\n" s (transl conf "forbidden char")) deleted_relation.val; Wserver.wprint "\n%s" (referenced_person_text conf base (poi base p.key_index)); Wserver.wprint "\n"; Update.print_warnings conf base wl; trailer conf; } ; (* value print_add_ok conf base wl p = if wl = [] then Perso.print conf base p else print_add_ok_aux conf base wl p ; *) value print_del_ok conf base wl = let title _ = Wserver.wprint "%s" (capitale (transl conf "person deleted")) in do { header conf title; print_link_to_welcome conf False; Update.print_warnings conf base wl; trailer conf; } ; value print_add o_conf base = (* Attention ! On pense à remettre les compteurs à *) (* zéro pour la détection des caractères interdits *) let () = removed_string.val := [] in let conf = Update.update_conf o_conf in try let (sp, ext) = reconstitute_person conf in let redisp = match p_getenv conf.env "return" with [ Some _ -> True | _ -> False ] in if ext || redisp then UpdateInd.print_update_ind conf base sp "" else do { let sp = strip_person sp in match check_person conf base sp with [ Some err -> error_person conf base sp err | None -> let (p, a) = effective_add conf base sp in let u = {family = get_family (poi base p.key_index)} in let wl = all_checks_person conf base p a u in do { Util.commit_patches conf base; let changed = U_Add_person (Util.string_gen_person base p) in History.record conf base changed "ap"; print_add_ok conf base wl p; } ] } with [ Update.ModErr -> () ] ; value print_del conf base = match p_getint conf.env "i" with [ Some i -> do { let ip = Adef.iper_of_int i in let p = poi base ip in let fn = sou base (get_first_name p) in let sn = sou base (get_surname p) in let occ = get_occ p in let old_related = get_related p in let op = Util.string_gen_person base (gen_person_of_person p) in update_relations_of_related base ip old_related; let warning _ = () in let p = effective_del conf base warning p in patch_person base ip p; delete_key base fn sn occ; Notes.update_notes_links_db conf (NotesLinks.PgInd p.key_index) ""; Util.commit_patches conf base; let changed = U_Delete_person op in History.record conf base changed "dp"; print_del_ok conf base []; } | _ -> incorrect_request conf ] ; value print_mod_aux conf base callback = try let (p, ext) = reconstitute_person conf in let redisp = match p_getenv conf.env "return" with [ Some _ -> True | _ -> False ] in let ini_ps = UpdateInd.string_person_of base (poi base p.key_index) in let digest = Update.digest_person ini_ps in if digest = raw_get conf "digest" then if ext || redisp then UpdateInd.print_update_ind conf base p digest else do { let p = strip_person p in match check_person conf base p with [ Some err -> error_person conf base p err | None -> callback p ] } else Update.error_digest conf with [ Update.ModErr -> () ] ; value print_mod o_conf base = (* Attention ! On pense à remettre les compteurs à *) (* zéro pour la détection des caractères interdits *) let () = removed_string.val := [] in let o_p = match p_getint o_conf.env "i" with [ Some ip -> Util.string_gen_person base (gen_person_of_person (poi base (Adef.iper_of_int ip))) | None -> Util.string_gen_person base (gen_person_of_person (poi base (Adef.iper_of_int (-1)))) ] in let conf = Update.update_conf o_conf in let callback sp = do { let p = effective_mod conf base sp in let op = poi base p.key_index in let u = {family = get_family op} in patch_person base p.key_index p; let s = let sl = [p.notes; p.occupation; p.birth_src; p.baptism_src; p.death_src; p.burial_src; p.psources] in String.concat " " (List.map (sou base) sl) in Notes.update_notes_links_db conf (NotesLinks.PgInd p.key_index) s; if not (eq_istr (get_surname op) p.surname) || not (eq_lists eq_istr (get_surnames_aliases op) p.surnames_aliases) || not (eq_lists (eq_titles eq_istr) (get_titles op) p.titles) then Update.update_misc_names_of_family base p.sex u else (); let wl = let a = poi base p.key_index in let a = {parents = get_parents a; consang = get_consang a} in all_checks_person conf base p a u in Util.commit_patches conf base; let changed = U_Modify_person o_p (Util.string_gen_person base p) in History.record conf base changed "mp"; if not (is_quest_string p.surname) && not (is_quest_string p.first_name) && not (is_old_person conf p) then Update.delete_topological_sort_v conf base else (); print_mod_ok conf base wl p; } in print_mod_aux conf base callback ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/translate.ml0000660000175200017530000002233112664543647023540 0ustar guillaumeguillaume(* camlp5r *) (* $Id: translate.ml,v 5.9 2007-09-12 09:58:44 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) module Buff = Buff.Make (struct value buff = ref (Bytes.create 80); end); value skip_lang s = loop where rec loop i = if i = String.length s then None else match s.[i] with [ 'a'..'z' | '-' -> loop (i + 1) | _ -> Some i ] ; value inline lang macro_char macro s = let lang = lang ^ ":" in let derived_lang = try let i = String.index lang '-' in String.sub lang 0 i ^ ":" with [ Not_found -> "" ] in let rec loop alt_version bol i = if i = String.length s then match alt_version with [ Some s -> (s, True) | None -> ("..........", False) ] else if bol then match skip_lang s i with [ Some j when s.[j] = ':' -> let curr_lang = String.sub s i (j + 1 - i) in if curr_lang = lang || curr_lang = derived_lang || curr_lang = "en:" then let (s, i) = let j = if s.[j + 1] = ' ' then j + 1 else j in let rec loop len j = if j = String.length s then (Buff.get len, j) else if s.[j] = '\n' then if j + 1 < String.length s && s.[j + 1] = ' ' then let j = loop (j + 1) where rec loop j = if j < String.length s && s.[j] = ' ' then loop (j + 1) else j in loop (Buff.store len '\n') j else (Buff.get len, j) else if s.[j] = macro_char then loop (Buff.mstore len (macro s.[j + 1])) (j + 2) else loop (Buff.store len s.[j]) (j + 1) in loop 0 (j + 1) in if curr_lang = lang then (s, False) else let alt_version = if curr_lang = derived_lang then Some s else if alt_version = None then Some s else alt_version in loop alt_version True i else loop alt_version (s.[i] = '\n') (i + 1) | _ -> loop alt_version (s.[i] = '\n') (i + 1) ] else loop alt_version (s.[i] = '\n') (i + 1) in loop None True 0 ; value language_name lang lang_def = let str = lang_def in let len = String.length lang in let rec loop beg i = if i = String.length str && i = beg then lang else if i = String.length str || str.[i] = '/' then if i > beg + len + 1 && str.[beg + len] = '=' && String.sub str beg len = lang then String.sub str (beg + len + 1) (i - beg - len - 1) else if i = String.length str then lang else loop (i + 1) (i + 1) else loop beg (i + 1) in loop 0 0 ; (* eval *) value erase str i j = String.sub str 0 i ^ String.sub str j (String.length str - j) ; (* * eval_set scans strings of the form @(x) where x is a list of characters * meaning a predicate to set for each character. Fills [set], the set of * predicates. Treats also the special case for @(&) = delete the next * character if any. *) value eval_set str = loop [] str 0 where rec loop set str i = if i + 3 < String.length str then if str.[i] = '@' && str.[i + 1] = '(' && str.[i + 3] <> '?' && str.[i + 3] <> '-' then if str.[i + 2] = '&' && str.[i + 3] = ')' && i + 4 < String.length str then loop set (erase str i (i + 5)) i else let (set, j) = loop set (i + 2) where rec loop set i = if i < String.length str then if str.[i] <> ')' then loop [str.[i] :: set] (i + 1) else (set, i + 1) else (set, i) in loop set (erase str i j) i else loop set str (i + 1) else (set, str) ; value rec apply_expr set str i = if i + 1 < String.length str && str.[i + 1] = '?' then if List.mem str.[i] set then let str = erase str i (i + 2) in let (str, i) = apply_expr set str i in if i < String.length str && str.[i] = ':' then let (str, j) = apply_expr set str (i + 1) in (erase str i j, i) else (str, i) else let (str, j) = apply_expr set str (i + 2) in let str = erase str i j in if i < String.length str && str.[i] = ':' then let str = erase str i (i + 1) in apply_expr set str i else (str, i) else if i < String.length str && (str.[i] = ':' || str.[i] = ')') then (str, i) else apply_expr set str (i + 1) ; (* * eval_app scans strings matching expressions between @( and ). * an expression is: * - a [character] followed by "?", an [expression] and possibly ":" and * [another expression] * - any [string] not holding ":" * The [character] is a predicate. If defined, the first expression is * evaluated, else it is the second one. The evaluation of a string is * itself. * * ex: p?e:m?A?en:er:w?e:n?es * In this example, if m and A are only defined predicates: * p not being defined, it is m?A?en:er:w?e:n?es * m being defined, it is A?en:er * A being defined, it is en * This example shows how to display adjectives in German, where * m is for masculine, w for feminine and n for neuter *) value eval_app set str = loop str 0 where rec loop str i = if i + 3 < String.length str then if str.[i] = '@' && str.[i + 1] = '(' && str.[i + 3] <> '-' then let str = erase str i (i + 2) in let (str, i) = apply_expr set str i in if i < String.length str then if str.[i] = ')' then loop (erase str i (i + 1)) i else loop str i else str else loop str (i + 1) else str ; (* * eval_shift scans strings matching: * @(#-) shifting # words of the left after the next word. * @(#--) shifting # words of the left to the end. * ex: * before: "Une avec un diamant@(3-) bague" * after: "Une bague avec un diamant" * before: "Sie haben geworfen@(1--) einen kurzen Bogen" * after: "Sie haben einen kurzen Bogen geworfen" *) value rec eval_shift s = let t = String.make (String.length s) '#' in let rec loop changed i j = if i + 4 < String.length s && s.[i] = '@' && s.[i + 1] = '(' && s.[i + 3] = '-' then let nleft = Char.code s.[i + 2] - Char.code '0' in let to_the_end = s.[i + 4] = '-' in let k = if to_the_end then i + 5 else i + 4 in if k < String.length s && s.[k] = ')' then let l = loop nleft (i - 1) where rec loop nleft l = if l > 0 then if s.[l] = ' ' then if nleft <= 1 then l + 1 else loop (nleft - 1) (l - 1) else loop nleft (l - 1) else 0 in let len = i - l in let j = j - len in let k = k + 1 in let i = if k < String.length s && s.[k] = ' ' then k + 1 else k in let (i, j) = if to_the_end then let rec loop i j = if i < String.length s then do { Bytes.set t j s.[i]; loop (i + 1) (j + 1) } else do { let j = if j > 0 && t.[j - 1] <> ' ' then do { Bytes.set t j ' '; j + 1 } else j in String.blit s l t j len; (i, j + len) } in loop i j else let rec loop i j = if i < String.length s then if s.[i] = ' ' then do { Bytes.set t j ' '; String.blit s l t (j + 1) len; (i, j + 1 + len) } else do { Bytes.set t j s.[i]; loop (i + 1) (j + 1) } else if k < String.length s && s.[k] = ' ' then do { Bytes.set t j ' '; String.blit s l t (j + 1) len; (i, j + 1 + len) } else do { String.blit s l t j len; (i, j + len) } in loop i j in loop True i j else do { Bytes.set t j s.[i]; loop changed (i + 1) (j + 1) } else if i < String.length s then do { Bytes.set t j s.[i]; loop changed (i + 1) (j + 1) } else if changed then eval_shift (String.sub t 0 j) else String.sub t 0 j in loop False 0 0 ; value rec eval str = if not (String.contains str '@') then (* optimisation *) str else let str = eval_rec str in let (set, str) = eval_set str in let str = eval_app set str in eval_shift str and eval_rec str = loop str 0 where rec loop str i = if i = String.length str then str else if i + 3 < String.length str && str.[i] = '@' && str.[i+1] = '(' && str.[i+2] = '@' then let j = loop (i + 2) where rec loop j = if j < String.length str then if str.[j] = '(' then let j = loop (j + 1) in loop (j + 1) else if str.[j] = ')' then j else loop (j + 1) else j in if j = String.length str then str else let sstr = eval (String.sub str (i + 2) (j - i - 2)) in let k = i + String.length sstr in let str = String.sub str 0 i ^ sstr ^ String.sub str (j + 1) (String.length str - j - 1) in loop str k else loop str (i + 1) ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/db2out.ml0000660000175200017530000004331512664543647022747 0ustar guillaumeguillaume(* camlp5r *) (* $Id: db2out.ml,v 5.28 2012-01-27 17:14:03 ddr Exp $ *) (* Copyright (c) 2007 INRIA *) value phony_min_size = 8; value check_input_value func fname len = do { () (* Printf.eprintf "*** check input_value (%s) %s\n" func fname; flush stderr; let ic = open_in_bin fname in let tab = input_value ic in if not (Obj.is_block (Obj.repr tab)) then failwith "not a block" else (); Printf.eprintf "tab len %d cnt %d\n" (Array.length tab) len; flush stderr; if Array.length tab <> len then failwith "error" else (); close_in ic; Printf.eprintf "check ok\n"; flush stderr; *) }; value output_item_no_compress_return_pos oc_dat item_cnt s = do { incr item_cnt; let pos = pos_out oc_dat in Iovalue.output oc_dat s; pos }; value output_value_array_no_compress bdir e len pad f = do { let oc_acc = open_out_bin (Filename.concat bdir ("access" ^ e)) in let oc_dat = open_out_bin (Filename.concat bdir ("data" ^ e)) in let header_pos = Iovalue.create_output_value_header oc_dat in Iovalue.output_block_header oc_dat 0 (max len phony_min_size); assert (pos_out oc_dat = Db2.first_item_pos len); let nb_items = ref 0 in f oc_acc (output_item_no_compress_return_pos oc_dat nb_items); (* padding to at least 8 items to allow correct read by input_value *) for i = nb_items.val + 1 to 8 do { incr nb_items; Iovalue.output oc_dat (pad : 'a); }; assert (Db2.first_item_pos nb_items.val = Db2.first_item_pos len); let _ : int = Iovalue.patch_output_value_header oc_dat header_pos in close_out oc_dat; close_out oc_acc; (* test *) check_input_value "Db2out.output_value_array_no_compress" (Filename.concat bdir ("data" ^ e)) (max len phony_min_size); }; value output_item_compress_return_pos oc_dat ht item_cnt s = try Hashtbl.find ht s with [ Not_found -> do { incr item_cnt; let pos = pos_out oc_dat in Iovalue.output oc_dat s; Hashtbl.add ht s pos; pos } ] ; value output_value_array_compress bdir e _ pad f = do { let oc_acc = open_out_bin (Filename.concat bdir ("access" ^ e)) in let oc_dat = open_out_bin (Filename.concat bdir ("data" ^ e)) in let ht : Hashtbl.t 'a _ = Hashtbl.create 1 in let header_pos = Iovalue.create_output_value_header oc_dat in let len = phony_min_size in Iovalue.output_block_header oc_dat 0 len; assert (pos_out oc_dat = Db2.first_item_pos len); let nb_items = ref 0 in f oc_acc (output_item_compress_return_pos oc_dat ht nb_items); (* padding to at least 8 items to allow correct read by input_value *) for i = nb_items.val + 1 to 8 do { incr nb_items; Iovalue.output oc_dat (pad : 'a); }; if Db2.first_item_pos nb_items.val = Db2.first_item_pos len then do { Iovalue.size_32.val := Iovalue.size_32.val - len + nb_items.val; Iovalue.size_64.val := Iovalue.size_64.val - len + nb_items.val; let _ : int = Iovalue.patch_output_value_header oc_dat header_pos in Iovalue.output_block_header oc_dat 0 nb_items.val; assert (pos_out oc_dat = Db2.first_item_pos nb_items.val); close_out oc_dat; close_out oc_acc; (* test *) let fname = Filename.concat bdir ("data" ^ e) in check_input_value "Db2out.output_value_array_compress" fname nb_items.val; } else if Db2.first_item_pos nb_items.val > Db2.first_item_pos len then do { (* may happen one day and to be debugged then *) Printf.eprintf "nb_items %d\n" nb_items.val; Printf.eprintf "first_item_pos nb_items %d\n" (Db2.first_item_pos nb_items.val); flush stderr; Printf.eprintf "rebuilding it..."; flush stderr; close_out oc_dat; close_out oc_acc; let fname = Filename.concat bdir ("data" ^ e) in let ic = open_in_bin fname in let oc = open_out_bin (fname ^ "2") in let header_pos = Iovalue.create_output_value_header oc in Iovalue.output_block_header oc 0 nb_items.val; seek_in ic (Db2.first_item_pos len); try while True do { output_byte oc (input_byte ic) } with [ End_of_file -> () ]; let _ : int = Iovalue.patch_output_value_header oc header_pos in close_out oc; close_in ic; Mutil.remove_file fname; Sys.rename (fname ^ "2") fname; Printf.eprintf " ok"; flush stderr; (* test *) check_input_value "Db2out.output_value_array_compress 1" fname nb_items.val; } else assert False; }; type hashtbl_t 'a 'b = { size: mutable int; data: mutable array (bucketlist 'a 'b); seed: mutable int; initial_size: int } and bucketlist 'a 'b = [ Empty | Cons of 'a and 'b and bucketlist 'a 'b ] ; value output_hashtbl dir file ht = do { let oc_ht = open_out_bin (Filename.concat dir file) in let oc_hta = open_out_bin (Filename.concat dir (file ^ "a")) in let ht : hashtbl_t 'a 'b = Obj.magic (ht : Hashtbl.t 'a 'b) in (* check compatibility with version of Hashtbl of OCaml *) assert (Obj.is_block (Obj.repr ht)); assert (Obj.tag (Obj.repr ht) = 0); assert (Obj.size (Obj.repr ht) >= 2 && Obj.size (Obj.repr (ht)) <= 4); assert (Obj.is_int (Obj.repr ht.size)); assert (Obj.is_block (Obj.repr ht.data)); if Obj.size (Obj.repr ht) >= 3 then assert (Obj.is_int (Obj.repr ht.seed)) else (); if Obj.size (Obj.repr ht) >= 4 then assert (Obj.is_int (Obj.repr ht.initial_size)) else (); output_binary_int oc_hta (Array.length ht.data); let pos_start = Iovalue.create_output_value_header oc_ht in Iovalue.output_block_header oc_ht 0 (Obj.size (Obj.repr ht)); Iovalue.output oc_ht ht.size; Iovalue.output_block_header oc_ht 0 (Array.length ht.data); for i = 0 to Array.length ht.data - 1 do { assert (Obj.is_int (Obj.repr ht.data.(i)) && Obj.magic ht.data.(i) = 0 || Obj.is_block (Obj.repr ht.data.(i)) && Obj.tag (Obj.repr ht.data.(i)) = 0 && Obj.size (Obj.repr ht.data.(i)) = 3); output_binary_int oc_hta (pos_out oc_ht); Iovalue.output oc_ht ht.data.(i); }; if Obj.size (Obj.repr ht) >= 3 then Iovalue.output oc_ht ht.seed else (); if Obj.size (Obj.repr ht) >= 4 then Iovalue.output oc_ht ht.initial_size else (); let _ : int = Iovalue.patch_output_value_header oc_ht pos_start in close_out oc_hta; close_out oc_ht; (* test *) (* let fname = Filename.concat dir file in Printf.eprintf "*** check input_value of hashtb %s\n" fname; flush stderr; let ic = open_in_bin fname in let htr : hashtbl_t _ _ = input_value ic in if not (Obj.is_block (Obj.repr htr)) then failwith "not a block" else (); if not (Obj.tag (Obj.repr htr) = 0) then failwith "tag <> 0" else (); if not (Obj.size (Obj.repr htr) = 3) then failwith "size <> 3" else (); assert (Obj.is_int (Obj.repr htr.size)); assert (Obj.is_int (Obj.repr htr.seed)); assert (Obj.is_block (Obj.repr htr.data)); assert (Obj.tag (Obj.repr htr.data) = 0); Printf.eprintf "htr.len %d ht.len %d\n" (Array.length htr.data) (Array.length ht.data); flush stderr; if Array.length htr.data <> Array.length ht.data then failwith "error" else (); close_in ic; Printf.eprintf "check ok\n"; flush stderr; *) }; value add_name ht s pos = let k = Name.crush_lower s in let posl = Hashtbl.find_all ht k in if List.mem pos posl then () else Hashtbl.add ht k pos ; value make_string_of_crush_index bpdir = List.iter (fun (field, is_surname) -> do { let field_d = Filename.concat bpdir field in let pos_1st = do { let ic_acc = open_in_bin (Filename.concat field_d "access") in let pos = try input_binary_int ic_acc with [ End_of_file -> -1 ] in close_in ic_acc; pos } in if Mutil.verbose.val then do { Printf.eprintf "string_of_crush %s..." field; flush stderr; } else (); let ht = Hashtbl.create 1 in if pos_1st >= 0 then do { let ic_dat = open_in_bin (Filename.concat field_d "data") in seek_in ic_dat pos_1st; loop pos_1st where rec loop pos = match try Some (Iovalue.input ic_dat) with [ End_of_file -> None ] with [ Some s -> do { assert (Obj.tag (Obj.repr s) = Obj.string_tag); if s <> "?" then do { add_name ht s pos; if is_surname then List.iter (fun s -> add_name ht s pos) (Mutil.surnames_pieces s) else (); } else (); loop (pos_in ic_dat) } | None -> () ]; close_in ic_dat; } else (); output_hashtbl field_d "string_of_crush.ht" ht; if Mutil.verbose.val then do { Printf.eprintf "\n"; flush stderr; } else (); }) [("first_name", False); ("surname", True)] ; value make_person_of_string_index bpdir = List.iter (fun field -> do { let field_d = Filename.concat bpdir field in let ic_acc = open_in_bin (Filename.concat field_d "access") in if Mutil.verbose.val then do { Printf.eprintf "person_of_string %s..." field; flush stderr; } else (); let ht = Hashtbl.create 1 in loop 0 where rec loop i = match try Some (input_binary_int ic_acc) with [ End_of_file -> None ] with [ Some pos -> do { Hashtbl.add ht pos i; loop (i + 1) } | None -> () ]; close_in ic_acc; output_hashtbl field_d "person_of_string.ht" ht; if Mutil.verbose.val then do { Printf.eprintf "\n"; flush stderr; } else (); }) ["first_name"; "surname"] ; value read_field (ic_acc, ic_dat) i = do { seek_in ic_acc (4 * i); let pos = input_binary_int ic_acc in seek_in ic_dat pos; Iovalue.input ic_dat }; value read_string_field : _ -> _ -> string = read_field; value read_array_int_field : _ -> _ -> array int = read_field; value read_int_field : _ -> _ -> int = read_field; value read_string_list_field (ic_acc, ic_dat, ic_str) i = do { seek_in ic_acc (4 * i); let pos = input_binary_int ic_acc in if pos = -1 then [] else do { seek_in ic_dat pos; let posl : list int = Iovalue.input ic_dat in List.map (fun pos -> do { seek_in ic_str pos; (Iovalue.input ic_str : string) }) posl } }; value read_title_list_field (ic_acc, ic_dat, ic_str) i = do { seek_in ic_acc (4 * i); let pos = input_binary_int ic_acc in if pos = -1 then [] else do { seek_in ic_dat pos; let tl : list (Def.gen_title int) = Iovalue.input ic_dat in List.map (Futil.map_title_strings (fun pos -> do { seek_in ic_str pos; (Iovalue.input ic_str : string) })) tl } }; value make_name_index base_d nbper = do { if Mutil.verbose.val then do { Printf.eprintf "name index...\n"; flush stderr; } else (); let ic2_list = List.map (fun (d, f) -> let d = List.fold_left Filename.concat base_d [d; f] in let fn_acc = Filename.concat d "access" in let fn_dat = Filename.concat d "data" in let ic_acc = open_in_bin fn_acc in let ic_dat = open_in_bin fn_dat in (f, (ic_acc, ic_dat))) [("person", "first_name"); ("person", "surname"); ("person", "public_name"); ("person", "sex"); ("person", "family"); ("family", "father"); ("person", "parents")] in let ic3_list = List.map (fun f -> let d = List.fold_left Filename.concat base_d ["person"; f] in let fn_acc = Filename.concat d "access" in let ic_acc = open_in_bin fn_acc in let fn_dat = Filename.concat d "data2.ext" in let ic_dat = open_in_bin fn_dat in let fn_str = Filename.concat d "data" in let ic_str = open_in_bin fn_str in (f, (ic_acc, ic_dat, ic_str))) ["qualifiers"; "aliases"; "first_names_aliases"; "surnames_aliases"; "titles"] in let get_first_name = read_string_field (List.assoc "first_name" ic2_list) in let get_surname = read_string_field (List.assoc "surname" ic2_list) in let get_public_name = read_string_field (List.assoc "public_name" ic2_list) in let get_qualifiers = read_string_list_field (List.assoc "qualifiers" ic3_list) in let get_aliases = read_string_list_field (List.assoc "aliases" ic3_list) in let get_first_names_aliases = read_string_list_field (List.assoc "first_names_aliases" ic3_list) in let get_surnames_aliases = read_string_list_field (List.assoc "surnames_aliases" ic3_list) in let get_titles = read_title_list_field (List.assoc "titles" ic3_list) in let get_family = read_array_int_field (List.assoc "family" ic2_list) in let get_father = read_int_field (List.assoc "father" ic2_list) in let get_husbands = let (ic_acc, ic_dat) = List.assoc "sex" ic2_list in fun i -> do { seek_in ic_acc (4 * i); let pos = input_binary_int ic_acc in seek_in ic_dat pos; let sex : Def.sex = Iovalue.input ic_dat in if sex = Def.Female then List.map (fun ifam -> let husb = get_father ifam in let husb_surname = get_surname husb in let husb_surn_ali = get_surnames_aliases husb in (husb_surname, husb_surn_ali)) (Array.to_list (get_family i)) else [] } in let get_parents = let (ic_acc, ic_dat) = List.assoc "parents" ic2_list in fun i -> do { seek_in ic_acc (4 * i); let pos = input_binary_int ic_acc in if pos = -1 then None else do { seek_in ic_dat pos; Some (Iovalue.input ic_dat) } } in let get_father_titles_places i = do { match get_parents i with [ Some ifam -> let ifath = get_father ifam in List.map (fun t -> t.Def.t_place) (get_titles ifath) | None -> [] ] } in let ht = Hashtbl.create 1 in if nbper > 0 && Mutil.verbose.val then ProgrBar.start () else (); for i = 0 to nbper - 1 do { if Mutil.verbose.val then ProgrBar.run i nbper else (); let first_name = get_first_name i in let surname = get_surname i in let names = let names = Futil.gen_person_misc_names first_name surname (get_public_name i) (get_qualifiers i) (get_aliases i) (get_first_names_aliases i) (get_surnames_aliases i) (get_titles i) (get_husbands i) (get_father_titles_places i) in [Name.lower (first_name ^ " " ^ surname) :: names] in List.iter (fun s -> Hashtbl.add ht (Name.crush_lower s) i) names; }; if nbper > 0 && Mutil.verbose.val then ProgrBar.finish () else (); List.iter (fun (_, (ic_acc, ic_dat)) -> do { close_in ic_acc; close_in ic_dat }) ic2_list; List.iter (fun (_, (ic_acc, ic_dat, ic_str)) -> do { close_in ic_acc; close_in ic_dat; close_in ic_str }) ic3_list; let dir = Filename.concat base_d "person_of_name" in Mutil.mkdir_p dir; output_hashtbl dir "person_of_name.ht" ht; }; value start_with s p = String.length p < String.length s && String.sub s 0 (String.length p) = p ; value make_index bdir particles f2 = do { let f1 = "person" in let fdir = List.fold_left Filename.concat bdir [f1; f2] in let index_dat_fname = Filename.concat fdir "index.dat" in let index_ini_fname = Filename.concat fdir "index.ini" in let pos_1st = do { let ic_acc = open_in_bin (Filename.concat fdir "access") in let pos = try input_binary_int ic_acc with [ End_of_file -> -1 ] in close_in ic_acc; pos } in let (list, len) = if pos_1st >= 0 then do { let data_fname = Filename.concat fdir "data" in let ic = open_in_bin data_fname in seek_in ic pos_1st; loop [] 0 pos_1st where rec loop list len pos = match try Some (Iovalue.input ic : string) with [ End_of_file -> None ] with [ Some s -> do { assert (Obj.tag (Obj.repr s) = Obj.string_tag); let s = try let part = List.find (start_with s) particles in let plen = String.length part in String.sub s plen (String.length s - plen) ^ " (" ^ part ^ ")" with [ Not_found -> s ] in let list = [(s, pos) :: list] in loop list (len + 1) (pos_in ic) } | None -> let _ = close_in ic in (list, len) ] } else ([], 0) in let list = List.sort compare list in let a = Array.make len ("", 0) in let iofc = loop [] 0 list where rec loop rev_iofc i = fun [ [] -> List.rev rev_iofc | [((s, _) as s_pos) :: list] -> do { a.(i) := s_pos; let rev_iofc = match rev_iofc with [ [(prev_s, _) :: _] -> if s = "" && i <> 0 then (* pad *) rev_iofc else if prev_s = "" then [(s, i) :: rev_iofc] else let prev_nbc = Name.nbc prev_s.[0] in let nbc = Name.nbc s.[0] in if prev_nbc = nbc && nbc > 0 && nbc <= String.length prev_s && nbc <= String.length s && String.sub prev_s 0 nbc = String.sub s 0 nbc then rev_iofc else [(s, i) :: rev_iofc] | [] -> [(s, i)] ] in loop rev_iofc (i + 1) list } ] in let oc = open_out_bin index_dat_fname in output_value oc (a : array (string * int)); close_out oc; let oc = open_out_bin (Filename.concat fdir "index.acc") in let _ : int = Iovalue.output_array_access oc (Array.get a) (Array.length a) 0 in close_out oc; let oc = open_out_bin index_ini_fname in output_value oc (iofc : list (string * int)); close_out oc; }; value make_indexes bbdir nb_per particles = do { let bpdir = Filename.concat bbdir "person" in make_string_of_crush_index bpdir; make_person_of_string_index bpdir; make_name_index bbdir nb_per; make_index bbdir particles "first_name"; make_index bbdir particles "surname"; }; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/futil.ml0000660000175200017530000001333112664543647022666 0ustar guillaumeguillaume(* $Id: futil.ml,v 5.5 2007-03-05 05:18:23 ddr Exp $ *) (* Copyright (c) 2006-2007 INRIA *) open Adef; open Def; value map_title_strings f t = let t_name = match t.t_name with [ Tmain -> Tmain | Tname s -> Tname (f s) | Tnone -> Tnone ] in let t_ident = f t.t_ident in let t_place = f t.t_place in {t_name = t_name; t_ident = t_ident; t_place = t_place; t_date_start = t.t_date_start; t_date_end = t.t_date_end; t_nth = t.t_nth} ; value map_relation_ps fp fs r = {r_type = r.r_type; r_fath = match r.r_fath with [ Some x -> Some (fp x) | None -> None ]; r_moth = match r.r_moth with [ Some x -> Some (fp x) | None -> None ]; r_sources = fs r.r_sources} ; value map_person_ps fp fs p = {first_name = fs p.first_name; surname = fs p.surname; occ = p.occ; image = fs p.image; first_names_aliases = List.map fs p.first_names_aliases; surnames_aliases = List.map fs p.surnames_aliases; public_name = fs p.public_name; qualifiers = List.map fs p.qualifiers; titles = List.map (map_title_strings fs) p.titles; rparents = List.map (map_relation_ps fp fs) p.rparents; related = p.related; aliases = List.map fs p.aliases; occupation = fs p.occupation; sex = p.sex; access = p.access; birth = p.birth; birth_place = fs p.birth_place; birth_src = fs p.birth_src; baptism = p.baptism; baptism_place = fs p.baptism_place; baptism_src = fs p.baptism_src; death = p.death; death_place = fs p.death_place; death_src = fs p.death_src; burial = p.burial; burial_place = fs p.burial_place; burial_src = fs p.burial_src; notes = fs p.notes; psources = fs p.psources; key_index = p.key_index} ; value map_union_f ff u = {family = Array.map ff u.family}; value map_family_ps fp fs fam = {marriage = fam.marriage; marriage_place = fs fam.marriage_place; marriage_src = fs fam.marriage_src; witnesses = Array.map fp fam.witnesses; relation = fam.relation; divorce = fam.divorce; comment = fs fam.comment; origin_file = fs fam.origin_file; fsources = fs fam.fsources; fam_index = fam.fam_index} ; value parent multi parent = if not multi then Adef.parent parent else Adef.multi_parent parent ; value map_couple_p multi_parents fp cpl = parent multi_parents (Array.map fp (parent_array cpl)) ; value map_descend_p fp des = {children = Array.map fp des.children}; value gen_person_misc_names first_name surname public_name qualifiers aliases first_names_aliases surnames_aliases titles husbands father_titles_places = let first_name = Mutil.nominative first_name in let surname = Mutil.nominative surname in if first_name = "?" || surname = "?" then [] else let public_names = let titles_names = let tnl = ref [] in do { List.iter (fun t -> match t.t_name with [ Tmain | Tnone -> () | Tname x -> tnl.val := [x :: tnl.val] ]) titles; tnl.val } in if public_name = "" || titles = [] then titles_names else [public_name :: titles_names] in let first_names = let pn = if public_name <> "" && titles = [] then [public_name :: public_names] else public_names in [first_name :: first_names_aliases @ pn] in let surnames = [surname :: Mutil.surnames_pieces surname @ surnames_aliases @ qualifiers] in let surnames = List.fold_left (fun list (husband_surname, husband_surnames_aliases) -> let husband_surname = Mutil.nominative husband_surname in if husband_surname = "?" then husband_surnames_aliases @ list else [husband_surname :: Mutil.surnames_pieces husband_surname @ husband_surnames_aliases @ list]) surnames husbands in let list = public_names in let list = List.fold_left (fun list f -> List.fold_left (fun list s -> [f ^ " " ^ s :: list]) list surnames) list first_names in let list = let first_names = [first_name :: first_names_aliases] in List.fold_left (fun list t -> let s = t.t_place in if s = "" then list else let first_names = match t.t_name with [ Tname f -> [f :: first_names] | Tmain | Tnone -> let f = public_name in if f = "" then first_names else [f :: first_names] ] in List.fold_left (fun list f -> [f ^ " " ^ s :: list]) list first_names) list titles in let list = if father_titles_places = [] then list else let first_names = [first_name :: first_names_aliases] in List.fold_left (fun list s -> if s = "" then list else List.fold_left (fun list f -> [f ^ " " ^ s :: list]) list first_names) list father_titles_places in let list = List.rev_append aliases list in let fn = Name.lower (first_name ^ " " ^ surname) in List.fold_left (fun list s -> let s = Name.lower s in if s = fn || List.mem s list then list else [s :: list]) [] list ; value rec eq_lists eq l1 l2 = match (l1, l2) with [ ([x1 :: l1], [x2 :: l2]) -> eq x1 x2 && eq_lists eq l1 l2 | ([], []) -> True | _ -> False ] ; value eq_title_names eq tn1 tn2 = match (tn1, tn2) with [ (Tname i1, Tname i2) -> eq i1 i2 | (Tmain, Tmain) | (Tnone, Tnone) -> True | _ -> False ] ; value eq_titles eq t1 t2 = eq_title_names eq t1.t_name t2.t_name && eq t1.t_ident t2.t_ident && eq t1.t_place t2.t_place && t1.t_date_start = t2.t_date_start && t1.t_date_end = t2.t_date_end && t1.t_nth = t2.t_nth ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/checkItem.mli0000660000175200017530000000226412664543647023613 0ustar guillaumeguillaume(* $Id: checkItem.mli,v 1.12 2007-09-05 13:19:25 ddr Exp $ *) (* Copyright (c) 2006-2007 INRIA *) open Gwdb; type base_error = Def.error person; type base_warning = Def.warning person family title; type base_misc = Def.misc person family title; value leap_year : int -> bool; value nb_days_in_month : int -> int -> int; value time_elapsed : Def.dmy -> Def.dmy -> Def.dmy; value strictly_before_dmy : Def.dmy -> Def.dmy -> bool; value strictly_before : Def.date -> Def.date -> bool; value strictly_after_dmy : Def.dmy -> Def.dmy -> bool; value strictly_after : Def.date -> Def.date -> bool; value date_of_death : Def.death -> option Adef.date; value person : base -> (base_warning -> unit) -> person -> option (list (Adef.iper * person * option Def.sex * option (list relation))); value family : base -> (base_error -> unit) -> (base_warning -> unit) -> Def.ifam -> family -> unit; value reduce_family : base -> (base_error -> unit) -> (base_warning -> unit) -> Def.ifam -> family -> unit; value sort_children : base -> array Adef.iper -> option (array Adef.iper * array Adef.iper); value check_other_fields : base -> (base_misc -> unit) -> Def.ifam -> family -> unit; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/q_codes.ml0000660000175200017530000000127112664543647023160 0ustar guillaumeguillaume(* $Id: q_codes.ml,v 5.4 2012-01-16 22:11:29 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) value f _ = fun [ "PREFIX_SMALL_BLOCK" -> "0x80" | "PREFIX_SMALL_INT" -> "0x40" | "PREFIX_SMALL_STRING" -> "0x20" | "CODE_INT8" -> "0x0" | "CODE_INT16" -> "0x1" | "CODE_INT32" -> "0x2" | "CODE_BLOCK32" -> "0x8" | "CODE_BLOCK64" -> "0x13" | "CODE_STRING8" -> "0x9" | "CODE_STRING32" -> "0xA" (* | "CODE_NZEROS8" -> "0x4" | "CODE_NZEROS32" -> "0x5" *) | "CODE_DOUBLE_NATIVE" -> "11" | x -> Stdpp.raise_with_loc (Token.make_loc (0, String.length x)) (Failure ("bad code " ^ x)) ] ; Quotation.add "codes" (Quotation.ExStr f); Quotation.default.val := "codes"; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/gwcomp.ml0000660000175200017530000006754212664543647023054 0ustar guillaumeguillaume(* $Id: gwcomp.ml,v 5.12 2008-11-04 13:03:13 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Def; value magic_gwo = "GnWo000o"; type key = { pk_first_name : string; pk_surname : string; pk_occ : int }; type somebody = [ Undefined of key | Defined of gen_person iper string ]; type gw_syntax = [ Family of gen_couple somebody and sex and sex and list (somebody * sex) and gen_family (gen_person iper string) string and gen_descend (gen_person iper string) | Notes of key and string | Relations of somebody and sex and list (gen_relation somebody string) | Bnotes of string and string | Wnotes of string and string ] ; type encoding = [ E_utf_8 | E_iso_8859_1 ]; value copy_decode s i1 i2 = let len = loop 0 i1 where rec loop len i = if i >= i2 then len else if i = i2 - 1 then len + 1 else if s.[i] = '\\' then loop (len + 1) (i + 2) else loop (len + 1) (i + 1) in let rec loop_copy t i j = if i >= i2 then t else if i = i2 - 1 && s.[i] <> '_' then do { Bytes.set t j s.[i]; t } else do { let (c, i) = match s.[i] with [ '_' -> (' ', i) | '\\' -> (s.[i + 1], i + 1) | x -> (x, i) ] in Bytes.set t j c; loop_copy t (succ i) (succ j) } in loop_copy (Bytes.create len) i1 0 ; value fields str = loop 0 0 where rec loop beg i = if i < String.length str then match str.[i] with [ ' ' | '\t' -> if beg = i then loop (succ beg) (succ i) else [copy_decode str beg i :: loop (succ i) (succ i)] | _ -> loop beg (succ i) ] else if beg = i then [] else [copy_decode str beg i] ; value date_of_string s i = let champ i = let (neg, i) = if i < String.length s && s.[i] = '-' then (True, i + 1) else (False, i) in let rec loop i n = if i = String.length s then (if neg then - n else n, i) else match s.[i] with [ '0'..'9' as c -> loop (succ i) (10 * n + Char.code c - Char.code '0') | _ -> (if neg then - n else n, i) ] in loop i 0 in let skip_slash i = if i < String.length s && s.[i] = '/' then Some (succ i) else None in let (precision, i) = match s.[i] with [ '~' -> (About, succ i) | '?' -> (Maybe, succ i) | '>' -> (After, succ i) | '<' -> (Before, succ i) | _ -> (Sure, i) ] in let (undefined, year, i) = let (year, j) = champ i in if j = i + 1 && s.[i] = '0' then (True, year, j) else (False, year, j) in let error n = failwith (Printf.sprintf "date_of_string%d %s" n s) in let date = match skip_slash i with [ Some i -> let month = year in let (year, i) = champ i in match skip_slash i with [ Some i -> let day = month in let month = year in let (year, i) = champ i in (* if year = 0 then if i = String.length s then None else error 1 else *) if month < 1 || month > 13 then error 2 else if day < 1 || day > 31 then error 3 else let d = {day = day; month = month; year = year; prec = precision; delta = 0} in Some (Dgreg d Dgregorian, i) | None -> if year = 0 then None else if month < 1 || month > 13 then error 4 else let d = {day = 0; month = month; year = year; prec = precision; delta = 0} in Some (Dgreg d Dgregorian, i) ] | None -> if undefined then if i = String.length s then None else if s.[i] = '(' && s.[String.length s - 1] = ')' then let txt = String.sub s (i + 1) (String.length s - i - 2) in Some (Dtext txt, String.length s) else failwith ("date_of_string " ^ s) else let d = {day = 0; month = 0; year = year; prec = precision; delta = 0} in Some (Dgreg d Dgregorian, i) ] in let date = match date with [ Some ((Dgreg d cal as dt), i) -> if i = String.length s then Some (dt, i) else if s.[i] = '|' then let (y2, i) = champ (succ i) in Some (Dgreg {(d) with prec = OrYear y2} cal, i) else if i + 1 < String.length s && s.[i] = '.' && s.[i + 1] = '.' then let (y2, i) = champ (i + 2) in Some (Dgreg {(d) with prec = YearInt y2} cal, i) else Some (dt, i) | Some ((Dtext _ as dt), i) -> Some (dt, i) | None -> None ] in let date = match date with [ Some (Dgreg d _, i) -> if i = String.length s then Some (Dgreg d Dgregorian, i) else match s.[i] with [ 'G' -> Some (Dgreg d Dgregorian, i + 1) | 'J' -> let d = Calendar.gregorian_of_julian d in Some (Dgreg d Djulian, i + 1) | 'F' -> let d = Calendar.gregorian_of_french d in Some (Dgreg d Dfrench, i + 1) | 'H' -> let d = Calendar.gregorian_of_hebrew d in Some (Dgreg d Dhebrew, i + 1) | _ -> Some (Dgreg d Dgregorian, i) ] | d -> d ] in match date with [ Some (dt, i) -> if i = String.length s then Some dt else error 5 | None -> None ] ; value rindex s c = pos (String.length s - 1) where rec pos i = if i < 0 then None else if s.[i] = c then Some i else pos (i - 1) ; value line_cnt = ref 0; value no_fail = ref False; value no_picture = ref False; value input_line0 ic = let line = input_line ic in do { incr line_cnt; if String.length line > 0 && line.[String.length line - 1] = '\r' then String.sub line 0 (String.length line - 1) else line } ; value input_a_line (ic, encoding) = let line = input_line0 ic in match encoding with [ E_utf_8 -> line | E_iso_8859_1 -> Mutil.utf_8_of_iso_8859_1 line ] ; value rec input_real_line ic = let x = input_a_line ic in if x = "" || x.[0] = '#' then input_real_line ic else x ; value get_optional_birthdate l = match l with [ [x :: l'] -> let i = 0 in if x.[i] = '!' then (None, l) else match x.[i] with [ '~' | '?' | '<' | '>' | '-' | '0'..'9' -> let d = date_of_string x i in (Some d, l') | _ -> (None, l) ] | _ -> (None, l) ] ; value get_optional_baptdate l = match l with [ [x :: l'] -> let i = 0 in if x.[i] = '!' then let i = succ i in match x.[i] with [ '~' | '?' | '<' | '>' | '-' | '0'..'9' -> let d = date_of_string x i in (Some d, l') | _ -> (None, l) ] else (None, l) | _ -> (None, l) ] ; value get_optional_deathdate l = match l with [ ["?" :: l'] -> (Some DontKnowIfDead, l') | ["mj" :: l'] -> (Some DeadYoung, l') | ["od" :: l'] -> (Some OfCourseDead, l') | [x :: l'] -> let i = 0 in let (dr, i) = match x.[i] with [ 'k' -> (Killed, i + 1) | 'm' -> (Murdered, i + 1) | 'e' -> (Executed, i + 1) | 's' -> (Disappeared, i + 1) | _ -> (Unspecified, i) ] in if i < String.length x then match x.[i] with [ '~' | '?' | '>' | '<' | '-' | '0'..'9' -> let d = match date_of_string x i with [ None -> DeadDontKnowWhen | Some d -> Death dr (Adef.cdate_of_date d) ] in (Some d, l') | _ -> (None, l) ] else (None, l) | _ -> (None, l) ] ; value get_burial l = match l with [ ["#buri" :: l] -> match l with [ [x :: l'] -> let i = 0 in let (od, l) = match x.[i] with [ '~' | '?' | '>' | '<' | '-' | '0'..'9' -> (date_of_string x i, l') | _ -> (None, l) ] in (Buried (Adef.codate_of_od od), l) | [] -> (Buried Adef.codate_None, l) ] | ["#crem" :: l] -> match l with [ [x :: l'] -> let i = 0 in let (od, l) = match x.[i] with [ '~' | '?' | '>' | '<' | '-' | '0'..'9' -> (date_of_string x i, l') | _ -> (None, l) ] in (Cremated (Adef.codate_of_od od), l) | [] -> (Cremated Adef.codate_None, l) ] | _ -> (UnknownBurial, l) ] ; value cut_space x = let len = String.length x in if len = 0 then x else if x = " " then "" else let start = if x.[0] = ' ' then 1 else 0 in let stop = if x.[len - 1] = ' ' then len - 1 else len in if start = 0 && stop = len then x else String.sub x start (stop - start) ; value get_field lab l = match l with [ [lab1; x :: l'] when lab1 = lab -> (cut_space x, l') | _ -> ("", l) ] ; value get_optional_sexe = fun [ ["h" :: l] -> (Male, l) | ["f" :: l] -> (Female, l) | l -> (Neuter, l) ] ; value make_int str x = loop False 0 where rec loop found n i = if i = String.length x then if found then n else raise Not_found else match x.[i] with [ '0'..'9' as c -> loop True (10 * n + Char.code c - Char.code '0') (succ i) | _ -> raise Not_found ] ; value get_fst_name str l = match l with [ [x :: l'] -> match x.[0] with [ 'a'..'z' | 'A'..'Z' | 'à'..'ý' | 'À'..'Ý' | '[' | '0'..'9' | '?' | ' ' -> let x = cut_space x in let (x, occ) = match rindex x '.' with [ Some i -> try (String.sub x 0 i, make_int str x (succ i)) with [ Not_found -> (x, 0) ] | None -> (x, 0) ] in (x, occ, l') | _ -> failwith str ] | _ -> failwith str ] ; value rec get_fst_names_aliases str l = match l with [ [x :: l'] -> if x.[0] = '{' && x.[String.length x - 1] = '}' then let n = String.sub x 1 (String.length x - 2) in let (nl, l) = get_fst_names_aliases str l' in ([cut_space n :: nl], l) else ([], l) | [] -> ([], l) ] ; value rec get_surnames_aliases str l = match l with [ ["#salias"; x :: l'] -> let (nl, l) = get_surnames_aliases str l' in ([cut_space x :: nl], l) | _ -> ([], l) ] ; value rec get_qualifiers str l = match l with [ ["#nick"; x :: l'] -> let (nl, l) = get_qualifiers str l' in ([cut_space x :: nl], l) | _ -> ([], l) ] ; value rec get_aliases str l = match l with [ ["#alias"; x :: l'] -> let (nl, l) = get_aliases str l' in ([cut_space x :: nl], l) | _ -> ([], l) ] ; value get_name str l = match l with [ ["#nick" :: _] | ["#alias" :: _] -> ("", l) | [x :: l'] -> match x.[0] with [ '{' -> ("", l) | 'a'..'z' | 'A'..'Z' | 'à'..'ý' | 'À'..'Ý' | '0'..'9' | '?' | ' ' -> (cut_space x, l') | _ -> ("", l) ] | _ -> ("", l) ] ; value get_pub_name str l = match l with [ [x :: l'] -> if x.[0] = '(' && x.[String.length x - 1] = ')' then let a = String.sub x 1 (String.length x - 2) in (cut_space a, l') else ("", l) | _ -> ("", l) ] ; value get_image str l = match l with [ ["#image" | "#photo"; x :: l'] -> if no_picture.val then ("", l') else (cut_space x, l') | _ -> ("", l) ] ; value get_occu str l = match l with [ ["#occu"; x :: l'] -> (cut_space x, l') | _ -> ("", l) ] ; value get_sources str l = match l with [ ["#src"; x :: l'] -> (cut_space x, l') | _ -> ("", l) ] ; value rec get_access str l = match l with [ ["#apubl" :: l'] -> (Public, l') | ["#apriv" :: l'] -> (Private, l') | _ -> (IfTitles, l) ] ; value scan_title t = let next_field i = loop "" i where rec loop s i = if i < String.length t then match t.[i] with [ ':' -> (s, i + 1) | '\\' -> loop (s ^ String.make 1 t.[i + 1]) (i + 2) | c -> loop (s ^ String.make 1 c) (i + 1) ] else (s, i) in let i = 0 in let (name, i) = let (s, i) = next_field i in if i = String.length t then failwith t else (s, i) in let name = match name with [ "" -> Tnone | "*" -> Tmain | _ -> Tname name ] in let (title, i) = let (s, i) = next_field i in if t.[i - 1] <> ':' then failwith t else (s, i) in let (place, i) = next_field i in let (date_start, i) = let (d, i) = next_field i in (if d = "" then None else date_of_string d 0, i) in let (date_end, i) = let (d, i) = next_field i in (if d = "" then None else date_of_string d 0, i) in let (nth, i) = let (d, i) = next_field i in (if d = "" then 0 else int_of_string d, i) in if i <> String.length t then failwith t else {t_name = name; t_ident = title; t_place = place; t_date_start = Adef.codate_of_od date_start; t_date_end = Adef.codate_of_od date_end; t_nth = nth} ; value rec get_titles str l = match l with [ [x :: l'] -> if x.[0] = '[' && x.[String.length x - 1] = ']' then let t = String.sub x 1 (String.length x - 2) in let t = scan_title t in let (al, l') = get_titles str l' in (if t.t_ident = "" then al else [t :: al], l') else ([], l) | _ -> ([], l) ] ; value get_mar_date str = fun [ [x :: l] -> let (mar, l) = match x.[0] with [ '+' -> (if String.length x > 1 then Adef.codate_of_od (date_of_string x 1) else Adef.codate_None, l) | _ -> failwith str ] in let (relation, l) = match l with [ ["#nm" :: l] -> ((NotMarried, Male, Female), l) | ["#eng" :: l] -> ((Engaged, Male, Female), l) | ["#nsck"; c :: l] when String.length c = 2 -> let decode_sex i = match c.[i] with [ 'm' -> Male | 'f' -> Female | _ -> Neuter ] in ((NoSexesCheckNotMarried, decode_sex 0, decode_sex 1), l) | ["#nsckm"; c :: l] when String.length c = 2 -> let decode_sex i = match c.[i] with [ 'm' -> Male | 'f' -> Female | _ -> Neuter ] in ((NoSexesCheckMarried, decode_sex 0, decode_sex 1), l) | ["#noment" :: l] -> ((NoMention, Male, Female), l) | _ -> ((Married, Male, Female), l) ] in let (place, l) = get_field "#mp" l in let (src, l) = get_field "#ms" l in let (divorce, l) = match l with [ [x :: l] when x.[0] = '-' -> if String.length x > 1 then (Divorced (Adef.codate_of_od (date_of_string x 1)), l) else (Divorced Adef.codate_None, l) | ["#sep" :: l] -> (Separated, l) | _ -> (NotDivorced, l) ] in (relation, mar, place, src, divorce, l) | [] -> failwith str ] ; value read_line ic = try let str = input_real_line ic in Some (str, fields str) with [ End_of_file -> None ] ; value create_person () = {first_name = ""; surname = ""; occ = 0; image = ""; public_name = ""; qualifiers = []; aliases = []; first_names_aliases = []; surnames_aliases = []; titles = []; rparents = []; related = []; occupation = ""; sex = Neuter; access = IfTitles; birth = Adef.codate_None; birth_place = ""; birth_src = ""; baptism = Adef.codate_None; baptism_place = ""; baptism_src = ""; death = DontKnowIfDead; death_place = ""; death_src = ""; burial = UnknownBurial; burial_place = ""; burial_src = ""; notes = ""; psources = ""; key_index = Adef.iper_of_int (-1)} ; value bogus_def p n o = p = "?" || n = "?"; value set_infos fn sn occ sex comm_psources comm_birth_place str u l = let (first_names_aliases, l) = get_fst_names_aliases str l in let (surnames_aliases, l) = get_surnames_aliases str l in let (public_name, l) = get_pub_name str l in let (image, l) = get_image str l in let (qualifiers, l) = get_qualifiers str l in let (aliases, l) = get_aliases str l in let (titles, l) = get_titles str l in let (access, l) = get_access str l in let (occupation, l) = get_occu str l in let (psources, l) = get_sources str l in let (naissance, l) = get_optional_birthdate l in let (birth_place, l) = get_field "#bp" l in let (birth_src, l) = get_field "#bs" l in let (baptism, l) = get_optional_baptdate l in let (baptism_place, l) = let (pp, l) = get_field "#pp" l in if pp = "" then get_field "#bp" l else (pp, l) in let (bapt_src, l) = get_field "#ps" l in let (mort, l) = get_optional_deathdate l in let (death_place, l) = get_field "#dp" l in let (death_src, l) = get_field "#ds" l in let mort = match (naissance, mort) with [ (None, _) | (_, Some _) | (Some None, _) -> match mort with [ Some m -> m | None -> DontKnowIfDead ] | (Some _, None) -> NotDead ] in let naissance = match naissance with [ None -> Adef.codate_None | Some x -> Adef.codate_of_od x ] in let baptism = match baptism with [ None -> Adef.codate_None | Some x -> Adef.codate_of_od x ] in let (burial, l) = get_burial l in let (burial_place, l) = get_field "#rp" l in let (burial_src, l) = get_field "#rs" l in let u = {first_name = fn; surname = sn; occ = occ; rparents = u.rparents; related = u.related; sex = sex; notes = u.notes; key_index = u.key_index; first_names_aliases = first_names_aliases; surnames_aliases = surnames_aliases; public_name = public_name; image = image; qualifiers = qualifiers; aliases = aliases; titles = titles; access = access; occupation = occupation; psources = if psources <> "" then psources else comm_psources; birth = naissance; birth_place = if birth_place <> "" then birth_place else comm_birth_place; birth_src = birth_src; baptism = baptism; baptism_place = baptism_place; baptism_src = bapt_src; death = mort; death_place = death_place; death_src = death_src; burial = burial; burial_place = burial_place; burial_src = burial_src} in (u, l) ; value parse_parent str l = let (np, l) = get_name str l in let (pp, op, l) = get_fst_name str l in let defined = if bogus_def pp np op then True else match l with [ [] -> False | [s :: _] when s.[0] = '+' -> False | _ -> True ] in if not defined then let key = {pk_first_name = pp; pk_surname = np; pk_occ = op} in (Undefined key, np, l) else do { let u = create_person () in let (u, l) = set_infos pp np op u.sex "" "" str u l in (Defined u, np, l) } ; value parse_child str surname sex csrc cbp l = let u = create_person () in let (prenom, occ, l) = get_fst_name str l in do { let (nom, l) = match l with [ ["?" :: _] -> get_name str l | [x :: l'] -> match x.[0] with [ '<' | '>' | '!' | '~' | '?' | '-' | '0'..'9' | '{' | '#' -> (surname, l) | '(' | '[' -> (if prenom = "" then "" else surname, l) | _ -> get_name str l ] | _ -> (surname, []) ] in set_infos prenom nom occ sex csrc cbp str u l } ; value get_relation str = fun [ ["-"; x :: l] -> let rtyp = match x with [ "adop" | "adop:" -> Adoption | "reco" | "reco:" -> Recognition | "cand" | "cand:" -> CandidateParent | "godp" | "godp:" -> GodParent | "fost" | "fost:" -> FosterParent | _ -> failwith str ] in if String.length x = 5 && x.[4] = ':' then do { let (fk, _, l) = parse_parent str l in let l = match l with [ ["+" :: l] -> l | _ -> failwith str ] in let (mk, _, l) = parse_parent str l in if l <> [] then failwith str else (); {r_type = rtyp; r_fath = Some fk; r_moth = Some mk; r_sources = ""} } else match l with [ ["fath:" :: l] -> let (fk, _, l) = parse_parent str l in do { if l <> [] then failwith str else (); {r_type = rtyp; r_fath = Some fk; r_moth = None; r_sources = ""} } | ["moth:" :: l] -> let (mk, _, l) = parse_parent str l in do { if l <> [] then failwith str else (); {r_type = rtyp; r_fath = None; r_moth = Some mk; r_sources = ""} } | _ -> failwith str ] | _ -> failwith str ] ; value read_notes ic = let notes = try let rec loop = fun [ "end notes" -> "" | l -> l ^ "\n" ^ loop (input_a_line ic) ] in loop (input_a_line ic) with [ End_of_file -> failwith "end of file" ] in Mutil.strip_all_trailing_spaces notes ; (* from version 5.00 *) value read_notes_db ic end_txt = let notes = try let rec loop s = if s = end_txt then "" else let len = String.length s in let s = if len > 2 && s.[0] = ' ' && s.[1] = ' ' then String.sub s 2 (len - 2) else s in s ^ "\n" ^ loop (input_a_line ic) in loop (input_a_line ic) with [ End_of_file -> failwith "end of file" ] in Mutil.strip_all_trailing_spaces notes ; type read_family 'a = [ F_some of 'a | F_enc_utf_8 | F_none | F_fail of string ] ; value read_family ic fname = fun [ Some (_, ["encoding:"; "utf-8"]) -> F_enc_utf_8 | Some (str, ["fam" :: l]) -> let (fath_key, surname, l) = parse_parent str l in let (relation_ss, marriage, marr_place, marr_src, divorce, l) = get_mar_date str l in let (relation, fath_sex, moth_sex) = relation_ss in let (moth_key, _, l) = parse_parent str l in do { if l <> [] then failwith str else (); let line = read_line ic in let (witn, line) = loop line where rec loop = fun [ Some (str, ["wit" | "wit:" :: l]) -> let (sex, l) = match l with [ ["m:" :: l] -> (Male, l) | ["f:" :: l] -> (Female, l) | l -> (Neuter, l) ] in let (wk, _, l) = parse_parent str l in do { if l <> [] then failwith str else (); let (witn, line) = loop (read_line ic) in ([(wk, sex) :: witn], line) } | line -> ([], line) ] in let (fsrc, line) = match line with [ Some (str, ["src"; x]) -> (cut_space x, read_line ic) | Some (str, ["src" :: _]) -> failwith str | _ -> ("", line) ] in let (csrc, line) = match line with [ Some (str, ["csrc"; x]) -> (cut_space x, read_line ic) | Some (str, ["csrc" :: _]) -> failwith str | _ -> ("", line) ] in let (cbp, line) = match line with [ Some (str, ["cbp"; x]) -> (cut_space x, read_line ic) | Some (str, ["cbp" :: _]) -> failwith str | _ -> ("", line) ] in let co = Adef.couple fath_key moth_key in let (comm, line) = match line with [ Some (str, ["comm" :: _]) -> let comm = String.sub str 5 (String.length str - 5) in (comm, read_line ic) | _ -> ("", line) ] in match line with [ Some (_, ["beg"]) -> let cles_enfants = let rec loop children = match read_line ic with [ Some (str, ["-" :: l]) -> let (sex, l) = get_optional_sexe l in let (child, l) = parse_child str surname sex csrc cbp l in do { if l <> [] then failwith str else loop [child :: children] } | Some (str, ["end"]) -> children | Some (str, _) -> failwith str | _ -> failwith "eof" ] in List.rev (loop []) in let fo = {marriage = marriage; marriage_place = marr_place; marriage_src = marr_src; witnesses = [| |]; relation = relation; divorce = divorce; comment = comm; origin_file = fname; fsources = fsrc; fam_index = Adef.ifam_of_int (-1)} in let deo = {children = Array.of_list cles_enfants} in F_some (Family co fath_sex moth_sex witn fo deo, read_line ic) | line -> let fo = {marriage = marriage; marriage_place = marr_place; marriage_src = marr_src; witnesses = [| |]; relation = relation; divorce = divorce; comment = comm; origin_file = fname; fsources = fsrc; fam_index = Adef.ifam_of_int (-1)} in let deo = {children = [| |]} in F_some (Family co fath_sex moth_sex witn fo deo, line) ] } | Some (str, ["notes-db"]) -> let notes = read_notes_db ic "end notes-db" in F_some (Bnotes "" notes, read_line ic) | Some (str, ["page-ext"; _]) -> let p = let len = String.length "page-ext" + 1 in String.sub str len (String.length str - len) in let notes = read_notes_db ic "end page-ext" in F_some (Bnotes p notes, read_line ic) | Some (str, ["notes"]) -> (* used before version 5.00 *) let notes = read_notes ic in F_some (Bnotes "" notes, read_line ic) | Some (str, ["notes" :: l]) -> let (surname, l) = get_name str l in let (first_name, occ, l) = get_fst_name str l in if l <> [] then failwith "str" else match read_line ic with [ Some (_, ["beg"]) -> let notes = read_notes ic in let key = {pk_first_name = first_name; pk_surname = surname; pk_occ = occ} in F_some (Notes key notes, read_line ic) | Some (str, _) -> failwith str | None -> failwith "end of file" ] | Some (str, ["wizard-note" :: _]) -> let wizid = let len = String.length "wizard-note " in String.sub str len (String.length str - len) in let notes = read_notes_db ic "end wizard-note" in F_some (Wnotes wizid notes, read_line ic) | Some (str, ["rel" :: l]) -> let (sb, _, l) = parse_parent str l in let (sex, l) = match l with [ ["#h" :: l] -> (Male, l) | ["#f" :: l] -> (Female, l) | l -> (Neuter, l) ] in if l <> [] then failwith "str" else match read_line ic with [ Some (_, ["beg"]) -> let rl = try let rec loop = fun [ "end" -> [] | x -> [get_relation x (fields x) :: loop (input_a_line ic)] ] in loop (input_a_line ic) with [ End_of_file -> failwith "missing end rel" ] in F_some (Relations sb sex rl, read_line ic) | Some (str, _) -> failwith str | None -> failwith "end of file" ] | Some (str, l) -> failwith str | None -> F_none ] ; value read_family_1 ic fname line = if no_fail.val then try read_family ic fname line with [ Failure str -> F_fail str ] else read_family ic fname line ; value comp_families x = let out_file = Filename.chop_suffix x ".gw" ^ ".gwo" in do { line_cnt.val := 0; let oc = open_out_bin out_file in try let ic = open_in x in do { output_string oc magic_gwo; output_value oc (x : string); let rec loop line encoding = match read_family_1 (ic, encoding) x line with [ F_some (family, line) -> do { output_value oc (family : gw_syntax); loop line encoding } | F_enc_utf_8 -> loop (read_line (ic, E_utf_8)) E_utf_8 | F_none -> () | F_fail str -> do { Printf.printf "File \"%s\", line %d:\n" x line_cnt.val; Printf.printf "Error: %s\n" str; flush stdout; loop (read_line (ic, encoding)) encoding } ] in loop (read_line (ic, E_iso_8859_1)) E_iso_8859_1; close_in ic; } with e -> do { close_out oc; try Sys.remove out_file with [ Sys_error _ -> () ]; raise e }; close_out oc; } ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/pa_lock.ml0000660000175200017530000000140512664543647023152 0ustar guillaumeguillaume(* camlp5r pa_extend.cmo q_MLast.cmo *) (* $Id: pa_lock.ml,v 5.3 2007-09-12 09:58:44 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) EXTEND Pcaml.expr: LEVEL "top" [ [ "lock"; fn = Pcaml.expr; "with"; "["; UIDENT "Accept"; "->"; ea = Pcaml.expr; "|"; UIDENT "Refuse"; "->"; er = Pcaml.expr; "]" -> <:expr< match Lock.control $fn$ False (fun () -> $ea$) with [ Some x -> x | None -> $er$ ] >> | "lock_wait"; fn = Pcaml.expr; "with"; "["; UIDENT "Accept"; "->"; ea = Pcaml.expr; "|"; UIDENT "Refuse"; "->"; er = Pcaml.expr; "]" -> <:expr< match Lock.control $fn$ True (fun () -> $ea$) with [ Some x -> x | None -> $er$ ] >> ] ] ; END; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/update.mli0000660000175200017530000000356212664543647023203 0ustar guillaumeguillaume(* $Id: update.mli,v 5.12 2008-01-08 02:08:00 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Config; open Def; open Gwdb; exception ModErr; type create_info = { ci_birth_date : option date; ci_birth_place : string; ci_death : death; ci_death_date : option date; ci_death_place : string; ci_occupation : string; ci_public : bool } ; type create = [ Create of sex and option create_info | Link ]; type key = (string * string * int * create * string); value infer_death : config -> option date -> option date -> death; value print_same_name : config -> base -> person -> unit; value insert_person : config -> base -> string -> ref (list (gen_person iper istr)) -> key -> Adef.iper ; value add_misc_names_for_new_persons : base -> list (gen_person iper istr) -> unit ; value update_misc_names_of_family : base -> sex -> gen_union ifam -> unit; value delete_topological_sort_v : config -> base -> unit; value delete_topological_sort : config -> base -> unit; value update_related_pointers : base -> iper -> list iper -> list iper -> unit; value print_return : config -> unit; value print_error : config -> base -> CheckItem.base_error -> unit; value print_warnings : config -> base -> list CheckItem.base_warning -> unit; value print_miscs : config -> base -> list CheckItem.base_misc -> unit; value print_warnings_and_miscs : config -> base -> (list CheckItem.base_warning * list CheckItem.base_misc) -> unit; value error : config -> base -> CheckItem.base_error -> 'a; value error_locked : config -> unit; value error_digest : config -> unit; value digest_person : gen_person key string -> Digest.t; value digest_family : (gen_family key string * gen_couple key * gen_descend key) -> Digest.t; value reconstitute_date : config -> string -> option date; value print_someone : config -> base -> person -> unit; value update_conf : config -> config; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/util.mli0000660000175200017530000002362612664543647022701 0ustar guillaumeguillaume(* $Id: util.mli,v 5.36 2007-07-26 01:57:42 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Config; open Def; open Gwdb; value add_lang_path : string -> unit; value add_doc_path : string -> unit; value set_base_dir : string -> unit; value cnt_dir : ref string; value images_url : ref string; value image_prefix : config -> string; value base_path : list string -> string -> string; value find_misc_file : string -> string; value search_in_lang_path : string -> string; value search_in_doc_path : string -> string; value etc_file_name : config -> string -> string; value escache_value : base -> string; value commit_patches : config -> base -> unit; value update_wf_trace : config -> string -> unit; value get_referer : config -> string; value no_html_tags : string -> string; value clean_html_tags : string -> list string -> string; value nl : unit -> unit; value html : config -> unit; value html_br : config -> unit; value html_p : config -> unit; value html_li : config -> unit; value unauthorized : config -> string -> unit; value string_of_ctime : config -> string; value redirect_HTML : config -> string -> string -> unit; value commd : config -> string; value code_varenv : string -> string; value decode_varenv : string -> string; value hidden_env : config -> unit; value nobtit : config -> base -> person -> list title; value strictly_after_private_years : config -> dmy -> bool; value authorized_age : config -> base -> person -> bool; value is_old_person : config -> gen_person iper istr -> bool; value fast_auth_age : config -> person -> bool; value start_with_vowel : string -> bool; value know : base -> person -> bool; value acces_n : config -> base -> string -> person -> string; value acces : config -> base -> person -> string; value wprint_hidden_person : config -> base -> string -> person -> unit; value accessible_by_key : config -> base -> person -> string -> string -> bool; value geneweb_link : config -> string -> string -> string; value wprint_geneweb_link : config -> string -> string -> unit; value is_restricted : config -> base -> iper -> bool; value is_hidden : person -> bool; value pget : config -> base -> iper -> person; value string_gen_person : base -> gen_person iper istr -> gen_person iper string ; value string_gen_family : base -> gen_family iper istr -> gen_family iper string ; type p_access = (base -> person -> string * base -> person -> string); value std_access : p_access; value raw_access : p_access; (* Fonctions d'écriture du nom et prénom d'un individu en fonction de : *) (* - son/ses titre de noblesse *) (* - son/ses nom public *) (* - son/ses sobriquets ... *) value gen_person_text : p_access -> config -> base -> person -> string; value gen_person_text_no_html : p_access -> config -> base -> person -> string; value gen_person_text_without_title : p_access -> config -> base -> person -> string ; value gen_person_title_text : (config -> base -> person -> string -> string) -> p_access -> config -> base -> person -> string ; value person_text : config -> base -> person -> string; value person_text_no_html : config -> base -> person -> string; value person_text_without_surname : config -> base -> person -> string; value person_text_no_surn_no_acc_chk : config -> base -> person -> string; value person_text_without_title : config -> base -> person -> string; value main_title : config -> base -> person -> option title; value titled_person_text : config -> base -> person -> title -> string; value one_title_text : config -> base -> person -> title -> string; value person_title_text : config -> base -> person -> string; value person_title : config -> base -> person -> string; value reference : config -> base -> person -> string -> string; value no_reference : config -> base -> person -> string -> string; value referenced_person_title_text : config -> base -> person -> string; value referenced_person_text : config -> base -> person -> string; value referenced_person_text_without_surname : config -> base -> person -> string; value update_family_loop : config -> base -> person -> string -> string; value p_getenv : list (string * string) -> string -> option string; value p_getint : list (string * string) -> string -> option int; value create_env : string -> list (string * string); value capitale : string -> string; value index_of_next_char : string -> int -> int; value open_etc_file : string -> option in_channel; value open_hed_trl : config -> string -> option in_channel; value open_templ : config -> string -> option in_channel; value copy_from_etc : list (char * unit -> string) -> string -> string -> in_channel -> unit; value string_with_macros : config -> list (char * unit -> string) -> string -> string; value string_of_place : config -> string -> string; value filter_html_tags : string -> string; value allowed_tags_file : ref string; value body_prop : config -> string; value url_no_index : config -> base -> string; value message_to_wizard : config -> unit; value check_xhtml : string -> string; value print_alphab_list : config -> ('a -> string) -> ('a -> unit) -> list 'a -> unit; value of_course_died : config -> person -> bool; value hexa_string : string -> string; value surname_begin : base -> string -> string; value surname_end : base -> string -> string; value get_particle : base -> string -> string; value old_surname_begin : string -> string; value old_surname_end : string -> string; value specify_homonymous : config -> base -> person -> bool -> unit; type format2 'a 'b = format4 'a unit string 'b; value check_format : format2 'a 'b -> string -> option (format2 'a 'b); value valid_format : format2 'a 'b -> string -> format2 'a 'b; value transl : config -> string -> string; value transl_nth : config -> string -> int -> string; value transl_decline : config -> string -> string -> string; value transl_a_of_b : config -> string -> string -> string; value transl_a_of_gr_eq_gen_lev : config -> string -> string -> string; value ftransl : config -> format2 'a 'b -> format2 'a 'b; value ftransl_nth : config -> format2 'a 'b -> int -> format2 'a 'b; value fdecline : config -> format2 'a 'b -> string -> format2 'a 'b; value fcapitale : format2 'a 'b -> format2 'a 'b; value nth_field : string -> int -> string; value cftransl : config -> string -> list string -> string; value translate_eval : string -> string; value std_color : config -> string -> string; value index_of_sex : sex -> int; value relation_txt : config -> sex -> family -> format (('a -> 'b) -> 'b) 'a 'b; value string_of_decimal_num : config -> float -> string; value person_exists : config -> base -> (string * string * int) -> bool; value find_person_in_env : config -> base -> string -> option person; (* Recherche le sosa uniquement dans le fichier gwf *) value default_sosa_ref : config -> base -> option person; value find_sosa_ref : config -> base -> option person; value update_gwf_sosa : config -> base -> (iper * (string * string * int)) -> unit; value quote_escaped : string -> string; value get_server_string : config -> string; value get_request_string : config -> string; value get_server_string_aux : bool -> list string -> string; value get_request_string_aux : bool -> list string -> string; value create_topological_sort : config -> base -> array int; value branch_of_sosa : config -> base -> iper -> Num.t -> option (list (iper * sex)); value sosa_of_branch : list (iper * sex) -> Num.t; value has_image : config -> base -> person -> bool; value image_file_name : string -> string; value source_image_file_name : string -> string -> string; value image_size : string -> option (int * int); value limited_image_size : int -> int -> string -> option (int * int) -> option (int * int); value image_and_size : config -> base -> person -> (string -> option (int * int) -> option (int * int)) -> option (bool * string * option (int * int)); value default_image_name_of_key : string -> string -> int -> string; value default_image_name : base -> person -> string; value auto_image_file : config -> base -> person -> option string; value only_printable : string -> string; value only_printable_or_nl : string -> string; value relation_type_text : config -> relation_type -> int -> string; value rchild_type_text : config -> relation_type -> int -> string; value has_nephews_or_nieces : config -> base -> person -> bool; value browser_doesnt_have_tables : config -> bool; value start_with : string -> int -> string -> bool; value doctype : config -> string; value begin_centered : config -> unit; value end_centered : config -> unit; (* Printing for browsers without tables *) value pre_text_size : string -> int; value print_pre_center : int -> string -> unit; value print_pre_left : int -> string -> unit; value print_pre_right : int -> string -> unit; value short_f_month : int -> string; value compilation_time_hook : ref (config -> string); value compilation_time : config -> string; (* Reading password file *) type auth_user = {au_user : string; au_passwd : string; au_info : string}; value read_gen_auth_file : string -> list auth_user; value is_that_user_and_password : auth_scheme_kind -> string -> string -> bool; (* Searching *) value in_text : bool -> string -> string -> bool; value html_highlight : bool -> string -> string -> string; (* Pretty print XHTML wrapper for Wserver.wrap_string *) value xml_pretty_print : string -> string; (* Print list in columns with alphabetic order *) value wprint_in_columns : config -> ('a -> string) -> ('a -> unit) -> list 'a -> unit; (* Variable that use also private flag of person *) value is_hide_names : config -> person -> bool; value reduce_list : int -> list 'a -> list 'a; value print_reference : config -> string -> int -> string -> unit; value gen_print_tips : config -> string -> unit; value print_tips_relationship : config -> unit; value print_image_sex : config -> person -> int -> unit; value display_options : config -> string; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/db2link.mli0000660000175200017530000000103612664543647023240 0ustar guillaumeguillaume(* camlp5r *) (* $Id: db2link.mli,v 5.2 2008-01-15 11:06:04 ddr Exp $ *) (* Copyright (c) 2007-2008 INRIA *) type file_info = { f_curr_src_file : mutable string; f_curr_gwo_file : mutable string; f_separate : mutable bool; f_has_separates : mutable bool; f_sep_file_inx : mutable int } ; value particules_file : ref string; value do_check : ref bool; value do_consang : ref bool; value default_source : ref string; value pr_stats : ref bool; value link : (file_info -> unit -> option Gwcomp.gw_syntax) -> string -> bool; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/gwd.ml0000660000175200017530000021073312664543647022331 0ustar guillaumeguillaume(* camlp5r pa_extend.cmo ./pa_html.cmo ./pa_lock.cmo *) (* $Id: gwd.ml,v 5.61 2009-03-11 10:56:09 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Config; open Def; open Gutil; open Mutil; open Printf; open Util; value green_color = "#2f6400"; value selected_addr = ref None; value selected_port = ref 2317; value redirected_addr = ref None; value wizard_passwd = ref ""; value friend_passwd = ref ""; value wizard_just_friend = ref False; value only_addresses = ref []; value cgi = ref False; value default_lang = ref "fr"; value setup_link = ref False; value choose_browser_lang = ref False; value images_dir = ref ""; value log_file = ref ""; value log_flags = [Open_wronly; Open_append; Open_creat; Open_text; Open_nonblock] ; IFDEF UNIX THEN value max_clients = ref None END; value robot_xcl = ref None; value auth_file = ref ""; value daemon = ref False; value login_timeout = ref 1800; value conn_timeout = ref 120; value trace_failed_passwd = ref False; value use_auth_digest_scheme = ref False; value no_host_address = ref False; value lexicon_list = ref []; value log_oc () = if log_file.val <> "" then match try Some (open_out_gen log_flags 0o644 log_file.val) with [ Sys_error _ -> None ] with [ Some oc -> do { Unix.dup2 (Unix.descr_of_out_channel oc) Unix.stderr; oc } | None -> do { log_file.val := ""; stderr } ] else stderr ; value flush_log oc = if log_file.val <> "" then close_out oc else flush oc; value is_multipart_form = let s = "multipart/form-data" in fun content_type -> let rec loop i = if i >= String.length content_type then False else if i >= String.length s then True else if content_type.[i] = Char.lowercase s.[i] then loop (i + 1) else False in loop 0 ; value extract_boundary content_type = let e = Util.create_env content_type in List.assoc "boundary" e ; value fprintf_date oc tm = fprintf oc "%4d-%02d-%02d %02d:%02d:%02d" (1900 + tm.Unix.tm_year) (succ tm.Unix.tm_mon) tm.Unix.tm_mday tm.Unix.tm_hour tm.Unix.tm_min tm.Unix.tm_sec ; value print_and_cut_if_too_big oc str = loop 0 where rec loop i = if i < String.length str then do { output_char oc str.[i]; let i = if i > 700 && String.length str - i > 750 then do { fprintf oc " ... "; String.length str - 700 } else i + 1 in loop i } else () ; value log oc tm conf from gauth request script_name contents = let referer = Wserver.extract_param "referer: " '\n' request in let user_agent = Wserver.extract_param "user-agent: " '\n' request in do { let tm = Unix.localtime tm in fprintf_date oc tm; fprintf oc " (%d)" (Unix.getpid ()); fprintf oc " %s?" script_name; print_and_cut_if_too_big oc contents; output_char oc '\n'; fprintf oc " From: %s\n" from; if gauth <> "" then fprintf oc " User: %s\n" gauth else (); if conf.wizard && not conf.friend then fprintf oc " User: %s%s(wizard)\n" conf.user (if conf.user = "" then "" else " ") else if conf.friend && not conf.wizard then fprintf oc " User: %s%s(friend)\n" conf.user (if conf.user = "" then "" else " ") else (); if user_agent <> "" then fprintf oc " Agent: %s\n" user_agent else (); if referer <> "" then do { fprintf oc " Referer: "; print_and_cut_if_too_big oc referer; fprintf oc "\n" } else (); } ; type auth_report = { ar_ok : bool; ar_command : string; ar_passwd : string; ar_scheme : auth_scheme_kind; ar_user : string; ar_name : string; ar_wizard : bool; ar_friend : bool; ar_uauth : string; ar_can_stale : bool } ; value log_passwd_failed ar oc tm from request base_file = do { let referer = Wserver.extract_param "referer: " '\n' request in let user_agent = Wserver.extract_param "user-agent: " '\n' request in let tm = Unix.localtime tm in fprintf_date oc tm; fprintf oc " (%d)" (Unix.getpid ()); fprintf oc " %s_%s" base_file ar.ar_passwd; fprintf oc " => failed (%s)" ar.ar_user; if trace_failed_passwd.val then fprintf oc " (%s)" (String.escaped ar.ar_uauth) else (); fprintf oc "\n"; fprintf oc " From: %s\n" from; fprintf oc " Agent: %s\n" user_agent; if referer <> "" then fprintf oc " Referer: %s\n" referer else (); }; value copy_file fname = match Util.open_etc_file fname with [ Some ic -> do { try while True do { let c = input_char ic in Wserver.wprint "%c" c } with _ -> (); close_in ic; True } | None -> False ] ; value http answer = do { Wserver.http answer; Wserver.wprint "Content-type: text/html; charset=iso-8859-1"; } ; value robots_txt () = let oc = log_oc () in do { Printf.fprintf oc "Robot request\n"; flush_log oc; Wserver.http ""; Wserver.wprint "Content-type: text/plain"; Util.nl (); Util.nl (); if copy_file "robots" then () else do { Wserver.wprint "User-Agent: *"; nl (); Wserver.wprint "Disallow: /"; nl (); } } ; value refuse_log from cgi = let oc = Secure.open_out_gen log_flags 0o644 "refuse_log" in do { let tm = Unix.localtime (Unix.time ()) in fprintf_date oc tm; fprintf oc " excluded: %s\n" from; close_out oc; if not cgi then http "403 Forbidden" else (); Wserver.wprint "Content-type: text/html"; Util.nl (); Util.nl (); Wserver.wprint "Your access has been disconnected by administrator.\n"; let _ : bool = copy_file "refuse" in (); } ; value only_log from cgi = let oc = log_oc () in do { let tm = Unix.localtime (Unix.time ()) in fprintf_date oc tm; fprintf oc " Connection refused from %s " from; fprintf oc "(only "; list_iter_first (fun first s -> fprintf oc "%s%s" (if not first then "," else "") s) only_addresses.val; fprintf oc ")\n"; flush_log oc; if not cgi then http "" else (); Wserver.wprint "Content-type: text/html; charset=iso-8859-1"; Util.nl (); Util.nl (); Wserver.wprint "Invalid access\n"; Wserver.wprint "

      Invalid access

      \n"; } ; value refuse_auth conf from auth auth_type = let oc = log_oc () in do { let tm = Unix.localtime (Unix.time ()) in fprintf_date oc tm; fprintf oc " Access failed\n"; fprintf oc " From: %s\n" from; fprintf oc " Basic realm: %s\n" auth_type; fprintf oc " Response: %s\n" auth; flush_log oc; Util.unauthorized conf auth_type; } ; value index_from c s = loop where rec loop i = if i = String.length s then i else if s.[i] = c then i else loop (i + 1) ; value index c s = index_from c s 0; value rec extract_assoc key = fun [ [] -> ("", []) | [((k, v) as kv) :: kvl] -> if k = key then (v, kvl) else let (v, kvl) = extract_assoc key kvl in (v, [kv :: kvl]) ] ; value input_lexicon lang = let ht = Hashtbl.create 501 in let fname = Filename.concat "lang" "lex_utf8.txt" in do { Mutil.input_lexicon lang ht (fun () -> Secure.open_in (Util.search_in_lang_path fname)); ht } ; value add_lexicon fname lang ht = let fname = Filename.concat "lang" fname in Mutil.input_lexicon lang ht (fun () -> Secure.open_in (Util.search_in_lang_path fname)) ; value alias_lang lang = if String.length lang < 2 then lang else let fname = Util.search_in_lang_path (Filename.concat "lang" "alias_lg.txt") in match try Some (Secure.open_in fname) with [ Sys_error _ -> None ] with [ Some ic -> let lang = try let rec loop line = match Mutil.lindex line '=' with [ Some i -> if lang = String.sub line 0 i then String.sub line (i + 1) (String.length line - i - 1) else loop (input_line ic) | None -> loop (input_line ic) ] in loop (input_line ic) with [ End_of_file -> lang ] in do { close_in ic; lang } | None -> lang ] ; value rec cut_at_equal i s = if i = String.length s then (s, "") else if s.[i] = '=' then (String.sub s 0 i, String.sub s (succ i) (String.length s - succ i)) else cut_at_equal (succ i) s ; value strip_trailing_spaces s = let len = loop (String.length s) where rec loop len = if len = 0 then 0 else match s.[len - 1] with [ ' ' | '\n' | '\r' | '\t' -> loop (len - 1) | _ -> len ] in String.sub s 0 len ; value read_base_env cgi bname = let fname = Util.base_path [] (bname ^ ".gwf") in match try Some (Secure.open_in fname) with [ Sys_error _ -> None ] with [ Some ic -> let env = loop [] where rec loop env = match try Some (input_line ic) with [ End_of_file -> None ] with [ Some s -> let s = strip_trailing_spaces s in if s = "" || s.[0] = '#' then loop env else loop [cut_at_equal 0 s :: env] | None -> env ] in do { close_in ic; env } | None -> [] ] ; value print_renamed conf new_n = let link = let req = Util.get_request_string conf in let new_req = let len = String.length conf.bname in let rec loop i = if i > String.length req then "" else if i >= len && String.sub req (i - len) len = conf.bname then String.sub req 0 (i - len) ^ new_n ^ String.sub req i (String.length req - i) else loop (i + 1) in loop 0 in "http://" ^ Util.get_server_string conf ^ new_req in let env = [("old", conf.bname) ; ("new", new_n) ; ("link", link)] in match Util.open_etc_file "renamed" with [ Some ic -> do { Util.html conf; Util.nl (); Templ.copy_from_templ conf env ic; } | None -> let title _ = Wserver.wprint "%s -> %s" conf.bname new_n in do { Hutil.header conf title; tag "ul" begin Util.html_li conf; tag "a" "href=\"%s\"" link begin Wserver.wprint "%s" link; end; end; Hutil.trailer conf; } ] ; value log_redirect conf from request req = let referer = Wserver.extract_param "referer: " '\n' request in lock_wait Srcfile.adm_file "gwd.lck" with [ Accept -> let oc = log_oc () in do { let tm = Unix.localtime (Unix.time ()) in fprintf_date oc tm; fprintf oc " %s\n" req; fprintf oc " From: %s\n" from; fprintf oc " Referer: %s\n" referer; flush_log oc; } | Refuse -> () ] ; value print_redirected conf from request new_addr = let req = Util.get_request_string conf in let link = "http://" ^ new_addr ^ req in let env = [("link", link)] in do { log_redirect conf from request req; match Util.open_etc_file "redirect" with [ Some ic -> do { Util.html conf; Util.nl (); Templ.copy_from_templ conf env ic; } | None -> let title _ = Wserver.wprint "Address changed" in do { Hutil.header conf title; Wserver.wprint "Use the following address:\n

      \n"; tag "ul" begin Util.html_li conf; stag "a" "href=\"%s\"" link begin Wserver.wprint "%s" link; end; Wserver.wprint "\n"; end; Hutil.trailer conf; } ] } ; value propose_base conf = let title _ = Wserver.wprint "Base" in do { Hutil.header conf title; tag "ul" begin Util.html_li conf; Wserver.wprint "

      \n" conf.indep_command; Wserver.wprint " =>\n"; Wserver.wprint "\n"; end; Hutil.trailer conf; } ; value general_welcome conf = match Util.open_etc_file "index" with [ Some ic -> do { Util.html conf; Util.nl (); Templ.copy_from_templ conf [] ic; } | None -> propose_base conf ] ; value nonce_private_key = Lazy.from_fun (fun () -> let cnt_dir = Filename.concat Util.cnt_dir.val "cnt" in let fname = Filename.concat cnt_dir "gwd_private.txt" in let k = match try Some (open_in fname) with [ Sys_error _ -> None ] with [ Some ic -> do { let s = try loop (input_line ic) where rec loop s = if s = "" || s.[0] = '#' then loop (input_line ic) else s with [ End_of_file -> "" ] in close_in ic; s } | None -> "" ] in if k = "" then do { Random.self_init (); let k = Random.bits () in let oc = open_out fname in fprintf oc "\ # Gwd key for better password protection in communication.\n\ # Changing it makes all users receive their login window again.\n\ # Generated by program but can be modified by hand to any value.\n"; fprintf oc "\n%d\n" k; close_out oc; string_of_int k } else k) ; value digest_nonce tm = Lazy.force nonce_private_key; value trace_auth base_env f = do { if List.mem_assoc "trace_auth" base_env then do { let oc = open_out_gen [Open_wronly; Open_append; Open_creat] 0o777 "trace_auth.txt" in f oc; close_out oc } else (); }; value unauth_server conf ar = do { let typ = if ar.ar_passwd = "w" then "Wizard" else "Friend" in Wserver.wprint "HTTP/1.0 401 Unauthorized"; Util.nl (); if use_auth_digest_scheme.val then let nonce = digest_nonce conf.ctime in let _ = let tm = Unix.localtime (Unix.time ()) in trace_auth conf.base_env (fun oc -> fprintf oc "\n401 unauthorized\n- date: %a\n- request:\n%t- passwd: %s\n- nonce: \"%s\"\n- can_stale: %b\n" fprintf_date tm (fun oc -> List.iter (fun s -> fprintf oc " * %s\n" s) conf.request) ar.ar_passwd nonce ar.ar_can_stale) in Wserver.wprint "WWW-Authenticate: Digest realm=\"%s %s\"%s%s,qop=\"auth\"" typ conf.bname (if nonce = "" then "" else sprintf ",nonce=\"%s\"" nonce) (if ar.ar_can_stale then ",stale=true" else "") else Wserver.wprint "WWW-Authenticate: Basic realm=\"%s %s\"" typ conf.bname; Util.nl (); Util.nl (); let url = conf.bname ^ "?" ^ List.fold_left (fun s (k, v) -> if s = "" then k ^ "=" ^ v else s ^ ";" ^ k ^ "=" ^ v) "" (conf.henv @ conf.senv @ conf.env) in let txt i = transl_nth conf "wizard/wizards/friend/friends/exterior" i in let typ = txt (if ar.ar_passwd = "w" then 0 else 2) in let title h = Wserver.wprint (fcapitale (ftransl conf "%s access cancelled for that page")) (if not h then "" ^ typ ^ "" else typ) in Hutil.header_without_http conf title; tag "h1" begin title False; end; tag "dl" begin let (alt_bind, alt_access) = if ar.ar_passwd = "w" then (";w=f", txt 2) else (";w=w", txt 0) in tag "dd" begin tag "ul" begin tag "li" begin Wserver.wprint "%s : %s" (transl conf "access") url alt_bind alt_access; end; tag "li" begin Wserver.wprint "%s : %s" (transl conf "access") url (txt 4); end; end; end; end; Hutil.trailer conf; }; value gen_match_auth_file test_user_and_password auth_file = if auth_file = "" then None else let aul = read_gen_auth_file auth_file in loop aul where rec loop = fun [ [au :: aul] -> if test_user_and_password au then let s = try let i = String.index au.au_info ':' in String.sub au.au_info 0 i with [ Not_found -> "" ] in let username = try let i = String.index s '/' in let len = String.length s in String.sub s 0 i ^ String.sub s (i + 1) (len - i - 1) with [ Not_found -> s ] in Some username else loop aul | [] -> None ] ; value basic_match_auth_file uauth = gen_match_auth_file (fun au -> au.au_user ^ ":" ^ au.au_passwd = uauth) ; value digest_match_auth_file asch = gen_match_auth_file (fun au -> is_that_user_and_password asch au.au_user au.au_passwd) ; value match_simple_passwd sauth uauth = match lindex sauth ':' with [ Some _ -> sauth = uauth | None -> match lindex uauth ':' with [ Some i -> sauth = String.sub uauth (i + 1) (String.length uauth - i - 1) | None -> sauth = uauth ] ] ; value basic_match_auth passwd auth_file uauth = if passwd <> "" && match_simple_passwd passwd uauth then Some "" else basic_match_auth_file uauth auth_file ; type access_type = [ ATwizard of string | ATfriend of string | ATnormal | ATnone | ATset ] ; value compatible_tokens check_from (addr1, base1_pw1) (addr2, base2_pw2) = (not check_from || addr1 = addr2) && base1_pw1 = base2_pw2 ; value get_actlog check_from utm from_addr base_password = let fname = Srcfile.adm_file "actlog" in match try Some (Secure.open_in fname) with [ Sys_error _ -> None ] with [ Some ic -> let tmout = float_of_int login_timeout.val in let rec loop changed r list = match try Some (input_line ic) with [ End_of_file -> None ] with [ Some line -> let i = index ' ' line in let tm = float_of_string (String.sub line 0 i) in let islash = index_from '/' line (i + 1) in let ispace = index_from ' ' line (islash + 1) in let addr = String.sub line (i + 1) (islash - i - 1) in let db_pwd = String.sub line (islash + 1) (ispace - islash - 1) in let c = line.[ispace + 1] in let user = let k = ispace + 3 in if k >= String.length line then "" else String.sub line k (String.length line - k) in let (list, r, changed) = if utm -. tm >= tmout then (list, r, True) else if compatible_tokens check_from (addr, db_pwd) (from_addr, base_password) then let r = if c = 'w' then ATwizard user else ATfriend user in ([((from_addr, db_pwd), (utm, c, user)) :: list], r, True) else ([((addr, db_pwd), (tm, c, user)) :: list], r, changed) in loop changed r list | None -> do { close_in ic; let list = List.sort (fun (_, (t1, _, _)) (_, (t2, _, _)) -> compare t2 t1) list in (list, r, changed) } ] in loop False ATnormal [] | None -> ([], ATnormal, False) ] ; value set_actlog list = let fname = Srcfile.adm_file "actlog" in match try Some (Secure.open_out fname) with [ Sys_error _ -> None ] with [ Some oc -> do { List.iter (fun ((from, base_pw), (a, c, d)) -> fprintf oc "%.0f %s/%s %c%s\n" a from base_pw c (if d = "" then "" else " " ^ d)) list; close_out oc; } | None -> () ] ; value get_token check_from utm from_addr base_password = lock_wait Srcfile.adm_file "gwd.lck" with [ Accept -> let (list, r, changed) = get_actlog check_from utm from_addr base_password in do { if changed then set_actlog list else (); r } | Refuse -> ATnormal ] ; value mkpasswd () = loop 0 where rec loop len = if len = 9 then Buff.get len else let v = Char.code 'a' + Random.int 26 in loop (Buff.store len (Char.chr v)) ; value random_self_init () = let seed = int_of_float (mod_float (Unix.time ()) (float max_int)) in Random.init seed ; value set_token utm from_addr base_file acc user = lock_wait Srcfile.adm_file "gwd.lck" with [ Accept -> do { random_self_init (); let (list, _, _) = get_actlog False utm "" "" in let (x, xx) = let base = base_file ^ "_" in let rec loop ntimes = if ntimes = 0 then failwith "set_token" else let x = mkpasswd () in let xx = base ^ x in if List.exists (fun (tok, _) -> compatible_tokens False tok (from_addr, xx)) list then loop (ntimes - 1) else (x, xx) in loop 50 in let list = [((from_addr, xx), (utm, acc, user)) :: list] in set_actlog list; x } | Refuse -> "" ] ; value index_not_name s = loop 0 where rec loop i = if i = String.length s then i else match s.[i] with [ 'a'..'z' | 'A'..'Z' | '0'..'9' | '-' -> loop (i + 1) | _ -> i ] ; value print_request_failure cgi msg = do { if not cgi then http "" else (); Wserver.wprint "Content-type: text/html"; Util.nl (); Util.nl (); Wserver.wprint "Request failure\n"; Wserver.wprint "\

      Request failure

      The request could not be completed.

      \n"; Wserver.wprint "

      Internal message: %s

      \n" msg; Wserver.wprint "\n"; } ; value refresh_url cgi request s i = let url = let serv = "http://" ^ Util.get_server_string_aux cgi request in let req = let bname = String.sub s 0 i in let str = Util.get_request_string_aux cgi request in if cgi then let cginame = String.sub str 0 (String.index str '?') in cginame ^ "?b=" ^ bname else "/" ^ bname ^ "?" in serv ^ req in do { if not cgi then http "" else (); Wserver.wprint "Content-type: text/html"; Util.nl (); Util.nl (); Wserver.wprint "\ %s " url url url; raise Exit } ; value http_preferred_language request = let v = Wserver.extract_param "accept-language: " '\n' request in if v = "" then "" else let s = String.lowercase v in let list = loop [] 0 0 where rec loop list i len = if i = String.length s then List.rev [Buff.get len :: list] else if s.[i] = ',' then loop [Buff.get len :: list] (i + 1) 0 else loop list (i + 1) (Buff.store len s.[i]) in let list = List.map strip_spaces list in let rec loop = fun [ [lang :: list] -> if List.mem lang Version.available_languages then lang else if String.length lang = 5 then let blang = String.sub lang 0 2 in if List.mem blang Version.available_languages then blang else loop list else loop list | [] -> "" ] in loop list ; value allowed_denied_titles key extra_line env base_env () = if p_getenv env "all_titles" = Some "on" then [] else try let fname = List.assoc key base_env in if fname = "" then [] else let ic = Secure.open_in (Filename.concat (Secure.base_dir ()) fname) in loop StrSet.empty where rec loop set = let (line, eof) = try (input_line ic, False) with [ End_of_file -> ("", True) ] in let set = let line = if eof then extra_line else line in if line = "" || line.[0] = ' ' || line.[0] = '#' then set else let line = match try Some (String.index line '/') with [ Not_found -> None ] with [ Some i -> let len = String.length line in let tit = String.sub line 0 i in let pla = String.sub line (i + 1) (len - i - 1) in (if tit = "*" then tit else Name.lower tit) ^ "/" ^ (if pla = "*" then pla else Name.lower pla) | None -> Name.lower line ] in StrSet.add line set in if eof then do { close_in ic; StrSet.elements set } else loop set with [ Not_found | Sys_error _ -> [] ] ; value allowed_titles env = let extra_line = try List.assoc "extra_title" env with [ Not_found -> "" ] in allowed_denied_titles "allowed_titles_file" extra_line env ; value denied_titles = allowed_denied_titles "denied_titles_file" ""; value start_with s i p = i + String.length p <= String.length s && String.sub s i (String.length p) = p ; value parse_digest s = let rec parse_main = parser [ [: s = ident; _ = spaces; kvl = key_eq_val_list :] -> if s = "Digest" then kvl else [] | [: :] -> [] ] and ident = parser [ [: `('A'..'Z' | 'a'..'z' as c); len = ident_kont (Buff.store 0 c) :] -> Buff.get len ] and ident_kont len = parser [ [: `('A'..'Z' | 'a'..'z' as c); s :] -> ident_kont (Buff.store len c) s | [: :] -> len ] and spaces = parser [ [: `' '; a = spaces :] -> a | [: :] -> () ] and key_eq_val_list = parser [ [: kv = key_eq_val; kvl = key_eq_val_list_kont :] -> [kv :: kvl] | [: :] -> [] ] and key_eq_val_list_kont = parser [ [: `','; _ = spaces; kv = key_eq_val; kvl = key_eq_val_list_kont :] -> [kv :: kvl] | [: :] -> [] ] and key_eq_val = parser [ [: k = ident; `'='; v = val_or_str :] -> (k, v) ] and val_or_str = parser [ [: `'"'; v = string 0; _ = spaces :] -> v | [: v = any_val 0; _ = spaces :] -> v ] and string len = parser [ [: `'"' :] -> Buff.get len | [: `c; s :] -> string (Buff.store len c) s ] and any_val len = parser [ [: `('a'..'z' | 'A'..'Z' | '0'..'9' | '-' as c); s :] -> any_val (Buff.store len c) s | [: :] -> Buff.get len ] in parse_main (Stream.of_string s) ; value basic_authorization cgi from_addr request base_env passwd access_type utm base_file command = let wizard_passwd = try List.assoc "wizard_passwd" base_env with [ Not_found -> wizard_passwd.val ] in let wizard_passwd_file = try List.assoc "wizard_passwd_file" base_env with [ Not_found -> "" ] in let friend_passwd = try List.assoc "friend_passwd" base_env with [ Not_found -> friend_passwd.val ] in let friend_passwd_file = try List.assoc "friend_passwd_file" base_env with [ Not_found -> "" ] in let passwd1 = let auth = Wserver.extract_param "authorization: " '\r' request in if auth = "" then "" else let s = "Basic " in if start_with auth 0 s then let i = String.length s in Base64.decode (String.sub auth i (String.length auth - i)) else "" in let uauth = if passwd = "w" || passwd = "f" then passwd1 else passwd in let (ok, wizard, friend, username) = if not cgi && (passwd = "w" || passwd = "f") then if passwd = "w" then if wizard_passwd = "" && wizard_passwd_file = "" then (True, True, friend_passwd = "", "") else match basic_match_auth wizard_passwd wizard_passwd_file uauth with [ Some username -> (True, True, False, username) | None -> (False, False, False, "") ] else if passwd = "f" then if friend_passwd = "" && friend_passwd_file = "" then (True, False, True, "") else match basic_match_auth friend_passwd friend_passwd_file uauth with [ Some username -> (True, False, True, username) | None -> (False, False, False, "") ] else assert False else if wizard_passwd = "" && wizard_passwd_file = "" then (True, True, friend_passwd = "", "") else match basic_match_auth wizard_passwd wizard_passwd_file uauth with [ Some username -> (True, True, False, username) | _ -> if friend_passwd = "" && friend_passwd_file = "" then (True, False, True, "") else match basic_match_auth friend_passwd friend_passwd_file uauth with [ Some username -> (True, False, True, username) | None -> (True, False, False, "") ] ] in let user = match lindex uauth ':' with [ Some i -> let s = String.sub uauth 0 i in if s = wizard_passwd || s = friend_passwd then "" else s | None -> "" ] in let (command, passwd) = if access_type = ATset then if wizard then let pwd_id = set_token utm from_addr base_file 'w' user in if cgi then (command, pwd_id) else (base_file ^ "_" ^ pwd_id, "") else if friend then let pwd_id = set_token utm from_addr base_file 'f' user in if cgi then (command, pwd_id) else (base_file ^ "_" ^ pwd_id, "") else if cgi then (command, "") else (base_file, "") else if cgi then (command, passwd) else if passwd = "" then (base_file, "") else (base_file ^ "_" ^ passwd, passwd) in let auth_scheme = if not wizard && not friend then NoAuth else let realm = if wizard then "Wizard " ^ base_file else "Friend " ^ base_file in let (u, p) = match lindex passwd1 ':' with [ Some i -> let u = String.sub passwd1 0 i in let p = String.sub passwd1 (i + 1) (String.length passwd1 - i - 1) in (u, p) | None -> ("", passwd) ] in HttpAuth (Basic {bs_realm = realm; bs_user = u; bs_pass = p}) in {ar_ok = ok; ar_command = command; ar_passwd = passwd; ar_scheme = auth_scheme; ar_user = user; ar_name = username; ar_wizard = wizard; ar_friend = friend; ar_uauth = uauth; ar_can_stale = False} ; value bad_nonce_report command passwd_char = {ar_ok = False; ar_command = command; ar_passwd = passwd_char; ar_scheme = NoAuth; ar_user = ""; ar_name = ""; ar_wizard = False; ar_friend = False; ar_uauth = ""; ar_can_stale = True} ; value test_passwd ds nonce command wf_passwd wf_passwd_file passwd_char wiz = let asch = HttpAuth (Digest ds) in if wf_passwd <> "" && is_that_user_and_password asch ds.ds_username wf_passwd then if ds.ds_nonce <> nonce then bad_nonce_report command passwd_char else {ar_ok = True; ar_command = command ^ "_" ^ passwd_char; ar_passwd = passwd_char; ar_scheme = asch; ar_user = ds.ds_username; ar_name = ""; ar_wizard = wiz; ar_friend = not wiz; ar_uauth = ""; ar_can_stale = False} else match digest_match_auth_file asch wf_passwd_file with [ Some username -> if ds.ds_nonce <> nonce then bad_nonce_report command passwd_char else {ar_ok = True; ar_command = command ^ "_" ^ passwd_char; ar_passwd = passwd_char; ar_scheme = asch; ar_user = ds.ds_username; ar_name = username; ar_wizard = wiz; ar_friend = not wiz; ar_uauth = ""; ar_can_stale = False} | None -> {ar_ok = False; ar_command = command; ar_passwd = passwd_char; ar_scheme = asch; ar_user = ds.ds_username; ar_name = ""; ar_wizard = False; ar_friend = False; ar_uauth = ""; ar_can_stale = False} ] ; value digest_authorization cgi request base_env passwd utm base_file command = let wizard_passwd = try List.assoc "wizard_passwd" base_env with [ Not_found -> wizard_passwd.val ] in let wizard_passwd_file = try List.assoc "wizard_passwd_file" base_env with [ Not_found -> "" ] in let friend_passwd = try List.assoc "friend_passwd" base_env with [ Not_found -> friend_passwd.val ] in let friend_passwd_file = try List.assoc "friend_passwd_file" base_env with [ Not_found -> "" ] in let command = if cgi then command else base_file in if wizard_passwd = "" && wizard_passwd_file = "" then {ar_ok = True; ar_command = command; ar_passwd = ""; ar_scheme = NoAuth; ar_user = ""; ar_name = ""; ar_wizard = True; ar_friend = friend_passwd = ""; ar_uauth = ""; ar_can_stale = False} else if passwd = "w" || passwd = "f" then let auth = Wserver.extract_param "authorization: " '\r' request in if start_with auth 0 "Digest " then (* W3C - RFC 2617 - Jun 1999 *) let meth = match Wserver.extract_param "GET " ' ' request with [ "" -> "POST" | s -> "GET" ] in let _ = trace_auth base_env (fun oc -> fprintf oc "\nauth = \"%s\"\n" auth) in let digenv = parse_digest auth in let get_digenv s = try List.assoc s digenv with [ Not_found -> "" ] in let ds = {ds_username = get_digenv "username"; ds_realm = get_digenv "realm"; ds_nonce = get_digenv "nonce"; ds_meth = meth; ds_uri = get_digenv "uri"; ds_qop = get_digenv "qop"; ds_nc = get_digenv "nc"; ds_cnonce = get_digenv "cnonce"; ds_response = get_digenv "response"} in let nonce = digest_nonce utm in let _ = trace_auth base_env (fun oc -> fprintf oc "\nanswer\n- date: %a\n- request:\n%t- passwd: %s\n- nonce: \"%s\"\n- meth: \"%s\"\n- uri: \"%s\"\n" fprintf_date (Unix.localtime utm) (fun oc -> List.iter (fun s -> fprintf oc " * %s\n" s) request) passwd nonce ds.ds_meth ds.ds_uri) in if passwd = "w" then test_passwd ds nonce command wizard_passwd wizard_passwd_file "w" True else if passwd = "f" then test_passwd ds nonce command friend_passwd friend_passwd_file "f" False else failwith (sprintf "not impl (2) %s %s" auth meth) else {ar_ok = False; ar_command = command; ar_passwd = passwd; ar_scheme = NoAuth; ar_user = ""; ar_name = ""; ar_wizard = False; ar_friend = False; ar_uauth = ""; ar_can_stale = False} else let friend = friend_passwd = "" && friend_passwd_file = "" in {ar_ok = True; ar_command = command; ar_passwd = ""; ar_scheme = NoAuth; ar_user = ""; ar_name = ""; ar_wizard = False; ar_friend = friend; ar_uauth = ""; ar_can_stale = False} ; value authorization cgi from_addr request base_env passwd access_type utm base_file command = match access_type with [ ATwizard user -> let (command, passwd) = if cgi then (command, passwd) else if passwd = "" then (base_file, "") else (base_file ^ "_" ^ passwd, passwd) in let auth_scheme = TokenAuth {ts_user = user; ts_pass = passwd} in {ar_ok = True; ar_command = command; ar_passwd = passwd; ar_scheme = auth_scheme; ar_user = user; ar_name = ""; ar_wizard = True; ar_friend = False; ar_uauth = ""; ar_can_stale = False} | ATfriend user -> let (command, passwd) = if cgi then (command, passwd) else if passwd = "" then (base_file, "") else (base_file ^ "_" ^ passwd, passwd) in let auth_scheme = TokenAuth {ts_user = user; ts_pass = passwd} in {ar_ok = True; ar_command = command; ar_passwd = passwd; ar_scheme = auth_scheme; ar_user = user; ar_name = ""; ar_wizard = False; ar_friend = True; ar_uauth = ""; ar_can_stale = False} | ATnormal -> let (command, passwd) = if cgi then (command, "") else (base_file, "") in {ar_ok = True; ar_command = command; ar_passwd = passwd; ar_scheme = NoAuth; ar_user = ""; ar_name = ""; ar_wizard = False; ar_friend = False; ar_uauth = ""; ar_can_stale = False} | ATnone | ATset -> if use_auth_digest_scheme.val then digest_authorization cgi request base_env passwd utm base_file command else basic_authorization cgi from_addr request base_env passwd access_type utm base_file command ] ; value make_conf cgi from_addr (addr, request) script_name contents env = do { let utm = Unix.time () in let tm = Unix.localtime utm in let (command, base_file, passwd, env, access_type) = let (base_passwd, env) = let (x, env) = extract_assoc "b" env in if x <> "" || cgi then (x, env) else (script_name, env) in let ip = index '_' base_passwd in let base_file = let s = String.sub base_passwd 0 ip in let s = if Filename.check_suffix s ".gwb" then Filename.chop_suffix s ".gwb" else s in let i = index_not_name s in if i = String.length s then s else refresh_url cgi request s i in let (passwd, env, access_type) = let has_passwd = List.mem_assoc "w" env in let (x, env) = extract_assoc "w" env in if has_passwd then (x, env, if x = "w" || x = "f" || x = "" then ATnone else ATset) else let passwd = if ip = String.length base_passwd then "" else String.sub base_passwd (ip + 1) (String.length base_passwd - ip - 1) in let access_type = match passwd with [ "" | "w" | "f" -> ATnone | _ -> get_token True utm from_addr base_passwd ] in (passwd, env, access_type) in let passwd = Util.decode_varenv passwd in let command = script_name in (command, base_file, passwd, env, access_type) in let (lang, env) = extract_assoc "lang" env in let lang = if lang = "" && choose_browser_lang.val then http_preferred_language request else lang in let lang = alias_lang lang in let (from, env) = match extract_assoc "opt" env with [ ("from", env) -> ("from", env) | ("", env) -> ("", env) | (x, env) -> ("", [("opt", x) :: env]) ] in let (threshold_test, env) = extract_assoc "threshold" env in if threshold_test <> "" then RelationLink.threshold.val := int_of_string threshold_test else (); let (sleep, env) = let (x, env) = extract_assoc "sleep" env in (if x = "" then 0 else int_of_string x, env) in let base_env = read_base_env cgi base_file in let default_lang = try let x = List.assoc "default_lang" base_env in if x = "" then default_lang.val else x with [ Not_found -> default_lang.val ] in let lexicon = input_lexicon (if lang = "" then default_lang else lang) in List.iter (fun fname -> add_lexicon fname (if lang = "" then default_lang else lang) lexicon) lexicon_list.val; (* A l'initialisation de la config, il n'y a pas de sosa_ref. *) (* Il sera mis à jour par effet de bord dans request.ml *) let default_sosa_ref = (Adef.iper_of_int (-1), None) in let ar = authorization cgi from_addr request base_env passwd access_type utm base_file command in let wizard_just_friend = if wizard_just_friend.val then True else try List.assoc "wizard_just_friend" base_env = "yes" with [ Not_found -> False ] in let is_rtl = try Hashtbl.find lexicon " !dir" = "rtl" with [ Not_found -> False ] in let manitou = try ar.ar_wizard && ar.ar_user <> "" && p_getenv env "manitou" <> Some "off" && List.assoc "manitou" base_env = ar.ar_user with [ Not_found -> False ] in let supervisor = try ar.ar_wizard && ar.ar_user <> "" && List.assoc "supervisor" base_env = ar.ar_user with [ Not_found -> False ] in let wizard_just_friend = if manitou then False else wizard_just_friend in let conf = {from = from_addr; manitou = manitou; supervisor = supervisor; wizard = ar.ar_wizard && not wizard_just_friend; friend = ar.ar_friend || wizard_just_friend && ar.ar_wizard; just_friend_wizard = ar.ar_wizard && wizard_just_friend; user = ar.ar_user; username = ar.ar_name; auth_scheme = ar.ar_scheme; cgi = cgi; command = ar.ar_command; indep_command = (if cgi then ar.ar_command else "geneweb") ^ "?"; pure_xhtml = try List.assoc "pure_xhtml" env = "on" with [ Not_found -> False ]; highlight = try List.assoc "highlight_color" base_env with [ Not_found -> green_color ]; lang = if lang = "" then default_lang else lang; default_lang = default_lang; default_sosa_ref = default_sosa_ref; multi_parents = try List.assoc "multi_parents" base_env = "yes" with [ Not_found -> False ]; can_send_image = try List.assoc "can_send_image" base_env <> "no" with [ Not_found -> True ]; authorized_wizards_notes = try List.assoc "authorized_wizards_notes" base_env = "yes" with [ Not_found -> False ]; public_if_titles = try List.assoc "public_if_titles" base_env = "yes" with [ Not_found -> False ]; public_if_no_date = try List.assoc "public_if_no_date" base_env = "yes" with [ Not_found -> False ]; cancel_links = match Util.p_getenv env "cgl" with [ Some "on" -> True | _ -> False ]; setup_link = setup_link.val; access_by_key = try List.assoc "access_by_key" base_env = "yes" with [ Not_found -> ar.ar_wizard && ar.ar_friend ]; private_years = try int_of_string (List.assoc "private_years" base_env) with [ Not_found | Failure _ -> 150 ]; hide_names = if ar.ar_wizard || ar.ar_friend then False else try List.assoc "hide_private_names" base_env = "yes" with [ Not_found -> False ]; use_restrict = if ar.ar_wizard || ar.ar_friend then False else try List.assoc "use_restrict" base_env = "yes" with [ Not_found -> False ]; no_image = if ar.ar_wizard || ar.ar_friend then False else try List.assoc "no_image_for_visitor" base_env = "yes" with [ Not_found -> False ]; no_note = if ar.ar_wizard || ar.ar_friend then False else try List.assoc "no_note_for_visitor" base_env = "yes" with [ Not_found -> False ]; bname = base_file; env = env; senv = []; henv = (if not cgi then [] else if ar.ar_passwd = "" then [("b", base_file)] else [("b", base_file ^ "_" ^ ar.ar_passwd)]) @ (if lang = "" then [] else [("lang", lang)]) @ (if from = "" then [] else [("opt", from)]); base_env = base_env; allowed_titles = Lazy.from_fun (allowed_titles env base_env); denied_titles = Lazy.from_fun (denied_titles env base_env); request = request; lexicon = lexicon; xhs = match p_getenv base_env "doctype" with [ Some "html-4.01" -> "" | _ -> " /" ]; charset = "utf-8"; is_rtl = is_rtl; left = if is_rtl then "right" else "left"; right = if is_rtl then "left" else "right"; auth_file = try let x = List.assoc "auth_file" base_env in if x = "" then auth_file.val else Util.base_path [] x with [ Not_found -> auth_file.val ]; border = match Util.p_getint env "border" with [ Some i -> i | None -> 0 ]; n_connect = None; today = {day = tm.Unix.tm_mday; month = succ tm.Unix.tm_mon; year = tm.Unix.tm_year + 1900; prec = Sure; delta = 0}; today_wd = tm.Unix.tm_wday; time = (tm.Unix.tm_hour, tm.Unix.tm_min, tm.Unix.tm_sec); ctime = utm} in (conf, sleep, ar) }; value log_and_robot_check conf auth from request script_name contents = if conf.cgi && log_file.val = "" && robot_xcl.val = None then () else let tm = Unix.time () in lock_wait Srcfile.adm_file "gwd.lck" with [ Accept -> let oc = log_oc () in do { try do { match robot_xcl.val with [ Some (cnt, sec) -> let s = "suicide" in let suicide = Util.p_getenv conf.env s <> None in conf.n_connect := Some (Robot.check oc tm from cnt sec conf suicide) | _ -> () ]; if conf.cgi && log_file.val = "" then () else log oc tm conf from auth request script_name contents; } with e -> do { flush_log oc; raise e }; flush_log oc; } | Refuse -> () ] ; value is_robot from = lock_wait Srcfile.adm_file "gwd.lck" with [ Accept -> let (robxcl, _) = Robot.robot_excl () in try let _ = List.assoc from robxcl.Robot.excl in True with [ Not_found -> False ] | Refuse -> False ] ; value auth_err request auth_file = if auth_file = "" then (False, "") else let auth = Wserver.extract_param "authorization: " '\r' request in if auth <> "" then match try Some (Secure.open_in auth_file) with [ Sys_error _ -> None ] with [ Some ic -> let auth = let i = String.length "Basic " in Base64.decode (String.sub auth i (String.length auth - i)) in try let rec loop () = if auth = input_line ic then do { close_in ic; let s = try let i = String.rindex auth ':' in String.sub auth 0 i with [ Not_found -> "..." ] in (False, s) } else loop () in loop () with [ End_of_file -> do { close_in ic; (True, auth) } ] | _ -> (True, "(auth file '" ^ auth_file ^ "' not found)") ] else (True, "(authorization not provided)") ; value no_access conf = let title _ = Wserver.wprint "Error" in do { Hutil.rheader conf title; Wserver.wprint "No access to this database in CGI mode\n"; Hutil.trailer conf; } ; value conf_and_connection cgi from (addr, request) script_name contents env = let (conf, sleep, passwd_err) = make_conf cgi from (addr, request) script_name contents env in match redirected_addr.val with [ Some addr -> print_redirected conf from request addr | None -> let (auth_err, auth) = if conf.auth_file = "" then (False, "") else if cgi then (True, "") else auth_err request conf.auth_file in let mode = Util.p_getenv conf.env "m" in do { if mode <> Some "IM" then let contents = if List.mem_assoc "log_pwd" env then "..." else contents in log_and_robot_check conf auth from request script_name contents else (); match (cgi, auth_err, passwd_err) with [ (True, True, _) -> if is_robot from then Robot.robot_error conf from 0 0 else no_access conf | (_, True, _) -> if is_robot from then Robot.robot_error conf from 0 0 else let auth_type = let x = try List.assoc "auth_file" conf.base_env with [ Not_found -> "" ] in if x = "" then "GeneWeb service" else "database " ^ conf.bname in refuse_auth conf from auth auth_type | (_, _, ({ar_ok = False} as ar)) -> if is_robot from then Robot.robot_error conf from 0 0 else do { let tm = Unix.time () in lock_wait Srcfile.adm_file "gwd.lck" with [ Accept -> do { let oc = log_oc () in log_passwd_failed ar oc tm from request conf.bname; flush_log oc; } | Refuse -> () ]; unauth_server conf ar; } | _ -> match mode with [ Some "DOC" -> Doc.print conf | _ -> if conf.bname = "" then general_welcome conf else match try Some (List.assoc "renamed" conf.base_env) with [ Not_found -> None ] with [ Some n when n <> "" -> print_renamed conf n | _ -> do { Request.treat_request_on_base conf (log_file.val, log_oc, flush_log); if conf.manitou && sleep > 0 then Unix.sleep sleep else (); } ] ] ] } ] ; value chop_extension name = loop (String.length name - 1) where rec loop i = if i < 0 then name else if name.[i] = '.' then String.sub name 0 i else if name.[i] = '/' then name else if name.[i] = '\\' then name else loop (i - 1) ; value match_strings regexp s = loop 0 0 where rec loop i j = if i = String.length regexp && j = String.length s then True else if i = String.length regexp then False else if j = String.length s then False else if regexp.[i] = s.[j] then loop (i + 1) (j + 1) else if regexp.[i] = '*' then if i + 1 = String.length regexp then True else if regexp.[i + 1] = s.[j] then loop (i + 2) (j + 1) else loop i (j + 1) else False ; value excluded from = let efname = chop_extension Sys.argv.(0) ^ ".xcl" in match try Some (open_in efname) with [ Sys_error _ -> None ] with [ Some ic -> let rec loop () = match try Some (input_line ic) with [ End_of_file -> None ] with [ Some line -> if match_strings line from then do { close_in ic; True } else loop () | None -> do { close_in ic; False } ] in loop () | None -> False ] ; value image_request cgi script_name env = match (Util.p_getenv env "m", Util.p_getenv env "v") with [ (Some "IM", Some fname) -> let fname = if fname.[0] = '/' then String.sub fname 1 (String.length fname - 1) else fname in let fname = Filename.basename fname in let fname = Util.image_file_name fname in let _ = Image.print_image_file cgi fname in True | _ -> let s = script_name in if Util.start_with s 0 "images/" then let i = String.length "images/" in let fname = String.sub s i (String.length s - i) in (* Je ne sais pas pourquoi on fait un basename, mais ça empeche *) (* empeche d'avoir des images qui se trouvent dans le dossier *) (* image. Si on ne fait pas de basename, alors ça marche. *) (* let fname = Filename.basename fname in *) let fname = Util.image_file_name fname in let _ = Image.print_image_file cgi fname in True else False ] ; (* Une version un peu à cheval entre avant et maintenant afin de *) (* pouvoir inclure une css, un fichier javascript (etc) facilement *) (* et que le cache du navigateur puisse prendre le relais. *) type misc_fname = [ Css of string | Js of string | Other of string ] ; value content_misc cgi len misc_fname = do { if not cgi then Wserver.http "" else (); let (fname, t) = match misc_fname with [ Css fname -> (fname, "text/css") | Js fname -> (fname, "text/javascript") | Other fname -> (fname, "text/plain") ] in Wserver.wprint "Content-type: %s" t; Util.nl (); Wserver.wprint "Content-length: %d" len; Util.nl (); Wserver.wprint "Content-disposition: inline; filename=%s" (Filename.basename fname); Util.nl (); Util.nl (); Wserver.wflush (); }; value print_misc_file cgi misc_fname = match misc_fname with [ Css fname | Js fname -> match try Some (Secure.open_in_bin fname) with [ Sys_error _ -> None ] with [ Some ic -> let buf = Bytes.create 1024 in let len = in_channel_length ic in do { content_misc cgi len misc_fname; let rec loop len = if len = 0 then () else do { let olen = min (String.length buf) len in really_input ic buf 0 olen; Wserver.wprint "%s" (String.sub buf 0 olen); loop (len - olen) } in loop len; close_in ic; True } | None -> False ] | Other _ -> False ] ; value misc_request cgi fname = let fname = Util.find_misc_file fname in if fname <> "" then let misc_fname = if Filename.check_suffix fname ".css" then Css fname else if Filename.check_suffix fname ".js" then Js fname else Other fname in print_misc_file cgi misc_fname else False ; value strip_quotes s = let i0 = if String.length s > 0 && s.[0] = '"' then 1 else 0 in let i1 = if String.length s > 0 && s.[String.length s - 1] = '"' then String.length s - 1 else String.length s in String.sub s i0 (i1 - i0) ; value extract_multipart boundary str = let rec skip_nl i = if i < String.length str && str.[i] = '\r' then skip_nl (i + 1) else if i < String.length str && str.[i] = '\n' then i + 1 else i in let next_line i = let i = skip_nl i in let rec loop s i = if i = String.length str || str.[i] = '\n' || str.[i] = '\r' then (s, i) else loop (s ^ String.make 1 str.[i]) (i + 1) in loop "" i in let boundary = "--" ^ boundary in let rec loop i = if i = String.length str then [] else let (s, i) = next_line i in if s = boundary then let (s, i) = next_line i in let s = String.lowercase s in let env = Util.create_env s in match (Util.p_getenv env "name", Util.p_getenv env "filename") with [ (Some var, Some filename) -> let var = strip_quotes var in let filename = strip_quotes filename in let i = skip_nl i in let i1 = loop i where rec loop i = if i < String.length str then if i > String.length boundary && String.sub str (i - String.length boundary) (String.length boundary) = boundary then i - String.length boundary else loop (i + 1) else i in let v = String.sub str i (i1 - i) in [(var ^ "_name", filename); (var, v) :: loop i1] | (Some var, None) -> let var = strip_quotes var in let (s, i) = next_line i in if s = "" then let (s, i) = next_line i in [(var, s) :: loop i] else loop i | _ -> loop i ] else if s = boundary ^ "--" then [] else loop i in let env = loop 0 in let (str, _) = List.fold_left (fun (str, sep) (v, x) -> if v = "file" then (str, sep) else (str ^ sep ^ v ^ "=" ^ x, ";")) ("", "") env in (str, env) ; value build_env request contents = let content_type = Wserver.extract_param "content-type: " '\n' request in if is_multipart_form content_type then let boundary = extract_boundary content_type in let (str, env) = extract_multipart boundary contents in (str, env) else (contents, Util.create_env contents) ; value connection cgi (addr, request) script_name contents = let from = match addr with [ Unix.ADDR_UNIX x -> x | Unix.ADDR_INET iaddr port -> if no_host_address.val then Unix.string_of_inet_addr iaddr else try (Unix.gethostbyaddr iaddr).Unix.h_name with _ -> Unix.string_of_inet_addr iaddr ] in do { if not cgi && script_name = "robots.txt" then robots_txt () else if excluded from then refuse_log from cgi else let accept = if only_addresses.val = [] then True else List.mem from only_addresses.val in if not accept then only_log from cgi else try let (contents, env) = build_env request contents in if image_request cgi script_name env then () else if misc_request cgi script_name then () else conf_and_connection cgi from (addr, request) script_name contents env with [ Adef.Request_failure msg -> print_request_failure cgi msg | Exit -> () ]; Wserver.wflush (); } ; value null_reopen flags fd = IFDEF UNIX THEN do { let fd2 = Unix.openfile "/dev/null" flags 0 in Unix.dup2 fd2 fd; Unix.close fd2; } ELSE () END ; IFDEF SYS_COMMAND THEN value wserver_auto_call = ref False END; value geneweb_server () = let auto_call = IFDEF SYS_COMMAND THEN wserver_auto_call.val ELSE try let _ = Sys.getenv "WSERVER" in True with [ Not_found -> False ] END in do { if not auto_call then do { let hostn = match selected_addr.val with [ Some addr -> addr | None -> try Unix.gethostname () with _ -> "computer" ] in eprintf "GeneWeb %s - " Version.txt; if not daemon.val then do { eprintf "Possible addresses:"; eprintf " http://localhost:%d/base http://127.0.0.1:%d/base http://%s:%d/base" selected_port.val selected_port.val hostn selected_port.val; eprintf " where \"base\" is the name of the database Type %s to stop the service " "control C"; } else (); flush stderr; if daemon.val then if Unix.fork () = 0 then do { Unix.close Unix.stdin; null_reopen [Unix.O_WRONLY] Unix.stdout; null_reopen [Unix.O_WRONLY] Unix.stderr; } else exit 0 else (); try Unix.mkdir (Filename.concat Util.cnt_dir.val "cnt") 0o777 with [ Unix.Unix_error _ _ _ -> () ]; } else (); Wserver.f selected_addr.val selected_port.val conn_timeout.val (IFDEF UNIX THEN max_clients.val ELSE None END) (connection False) } ; IFDEF UNIX THEN value cgi_timeout tmout _ = let nl () = Wserver.wprint "\013\010" in do { Wserver.wprint "Content-type: text/html; charset=iso-8859-1"; nl (); nl (); Wserver.wprint "Time out\n"; Wserver.wprint "

      Time out

      \n"; Wserver.wprint "Computation time > %d second(s)\n" tmout; Wserver.wprint "\n"; Wserver.wflush (); exit 0; } END; IFDEF UNIX THEN value manage_cgi_timeout tmout = if tmout > 0 then let _ = Sys.signal Sys.sigalrm (Sys.Signal_handle (cgi_timeout tmout)) in let _ = Unix.alarm tmout in () else () END; value geneweb_cgi addr script_name contents = do { IFDEF UNIX THEN manage_cgi_timeout conn_timeout.val ELSE () END; try Unix.mkdir (Filename.concat Util.cnt_dir.val "cnt") 0o755 with [ Unix.Unix_error _ _ _ -> () ]; let add k x request = try let v = Sys.getenv x in if v = "" then raise Not_found else [k ^ ": " ^ v :: request] with [ Not_found -> request ] in let request = [] in let request = add "cookie" "HTTP_COOKIE" request in let request = add "content-type" "CONTENT_TYPE" request in let request = add "accept-language" "HTTP_ACCEPT_LANGUAGE" request in let request = add "referer" "HTTP_REFERER" request in let request = add "user-agent" "HTTP_USER_AGENT" request in connection True (Unix.ADDR_UNIX addr, request) script_name contents } ; value read_input len = if len >= 0 then do { let buff = Bytes.create len in really_input stdin buff 0 len; buff } else do { let buff = ref "" in try while True do { let l = input_line stdin in buff.val := buff.val ^ l } with [ End_of_file -> () ]; buff.val } ; value arg_parse_in_file fname speclist anonfun errmsg = match try Some (open_in fname) with [ Sys_error _ -> None ] with [ Some ic -> let list = let list = ref [] in do { try while True do { let line = input_line ic in if line <> "" then list.val := [line :: list.val] else () } with [ End_of_file -> () ]; close_in ic; List.rev list.val } in let list = match list with [ [x] -> arg_list_of_string x | _ -> list ] in Argl.parse_list speclist anonfun errmsg list | _ -> () ] ; module G = Grammar.GMake (struct type te = (string * string); value lexer = Plexer.gmake (); end) ; value robot_xcl_arg = G.Entry.create "robot_xcl arg"; GEXTEND G robot_xcl_arg: [ [ cnt = INT; ","; sec = INT; EOI -> (int_of_string cnt, int_of_string sec) ] ] ; END; value robot_exclude_arg s = try robot_xcl.val := Some (G.Entry.parse robot_xcl_arg (G.parsable (Stream.of_string s))) with [ Ploc.Exc _ (Stream.Error _ | Token.Error _) -> do { eprintf "Bad use of option -robot_xcl\n"; eprintf "Use option -help for usage.\n"; flush Pervasives.stderr; exit 2 } ] ; value slashify s = let s1 = Bytes.copy s in do { for i = 0 to String.length s - 1 do { Bytes.set s1 i (match s.[i] with [ '\\' -> '/' | x -> x ]) }; s1 } ; value make_cnt_dir x = do { mkdir_p x; IFDEF WIN95 THEN do { Wserver.sock_in.val := Filename.concat x "gwd.sin"; Wserver.sock_out.val := Filename.concat x "gwd.sou"; } ELSE () END; Util.cnt_dir.val := x; } ; value main () = do { IFDEF WIN95 THEN do { Wserver.sock_in.val := "gwd.sin"; Wserver.sock_out.val := "gwd.sou"; } ELSE () END; let usage = "Usage: " ^ Filename.basename Sys.argv.(0) ^ " [options] where options are:" in let speclist = [("-hd", Arg.String Util.add_lang_path, "\n Directory where the directory lang is installed."); ("-dd", Arg.String Util.add_doc_path, "\n Directory where the documentation is installed."); ("-bd", Arg.String Util.set_base_dir, "\n Directory where the databases are installed."); ("-wd", Arg.String make_cnt_dir, "\ Directory for socket communication (Windows) and access count."); ("-cgi", Arg.Set cgi, "\n Force cgi mode."); ("-images_url", Arg.String (fun x -> Util.images_url.val := x), "\n URL for GeneWeb images (default: gwd send them)"); ("-images_dir", Arg.String (fun x -> images_dir.val := x), "\ Same than previous but directory name relative to current"); ("-a", Arg.String (fun x -> selected_addr.val := Some x), "\
      Select a specific address (default = any address of this computer)"); ("-p", Arg.Int (fun x -> selected_port.val := x), "\n Select a port number (default = " ^ string_of_int selected_port.val ^ "); > 1024 for normal users."); ("-setup_link", Arg.Set setup_link, "\n Display a link to local gwsetup in bottom of pages."); ("-allowed_tags", Arg.String (fun x -> Util.allowed_tags_file.val := x), "\ HTML tags which are allowed to be displayed. One tag per line in file."); ("-wizard", Arg.String (fun x -> wizard_passwd.val := x), "\ Set a wizard password: access to all dates and updating."); ("-friend", Arg.String (fun x -> friend_passwd.val := x), "\n Set a friend password: access to all dates."); ("-wjf", Arg.Set wizard_just_friend, "\n Wizard just friend (permanently)"); ("-lang", Arg.String (fun x -> default_lang.val := x), "\n Set a default language (default: fr)."); ("-blang", Arg.Set choose_browser_lang, "\n Select the user browser language if any."); ("-only", Arg.String (fun x -> only_addresses.val := [x :: only_addresses.val]), "
      \n Only inet address accepted."); ("-auth", Arg.String (fun x -> auth_file.val := x), "\ Authorization file to restrict access. The file must hold lines of the form \"user:password\"."); ("-no_host_address", Arg.Set no_host_address,"\n \ Force no reverse host by address"); ("-digest", Arg.Set use_auth_digest_scheme, "\n \ Use Digest authorization scheme (more secure on passwords)"); ("-add_lexicon", Arg.String (fun x -> lexicon_list.val := [x :: lexicon_list.val]), "\n Add file as lexicon."); ("-log", Arg.String (fun x -> log_file.val := x), "\n Redirect log trace to this file."); ("-robot_xcl", Arg.String robot_exclude_arg, "\ , Exclude connections when more than requests in seconds."); ("-min_disp_req", Arg.Int (fun x -> Robot.min_disp_req.val := x), "\n Minimum number of requests in robot trace (default: " ^ string_of_int Robot.min_disp_req.val ^ ")"); ("-login_tmout", Arg.Int (fun x -> login_timeout.val := x), "\ Login timeout for entries with passwords in CGI mode (default " ^ string_of_int login_timeout.val ^ "\ s)"); ("-redirect", Arg.String (fun x -> redirected_addr.val := Some x), "\ Send a message to say that this service has been redirected to "); ("-trace_failed_passwd", Arg.Set trace_failed_passwd, "\n \ Print the failed passwords in log (except if option -digest is set) "); ("-nolock", Arg.Set Lock.no_lock_flag, "\n Do not lock files before writing.") :: IFDEF UNIX THEN [("-max_clients", Arg.Int (fun x -> max_clients.val := Some x), "\ Max number of clients treated at the same time (default: no limit) (not cgi)."); ("-conn_tmout", Arg.Int (fun x -> conn_timeout.val := x), "\n Connection timeout (default " ^ string_of_int conn_timeout.val ^ "s; 0 means no limit)"); ("-daemon", Arg.Set daemon, "\n Unix daemon mode."); ("-chwd", Arg.String (fun s -> Doc.notify_change_wdoc.val := s), "\n Call command when wdoc changed")] ELSE [("-noproc", Arg.Set Wserver.noproc, "\n Do not launch a process at each request.") :: IFDEF SYS_COMMAND THEN [("-wserver", Arg.String (fun _ -> wserver_auto_call.val := True), "\n (internal feature)")] ELSE [] END] END] in let anonfun s = raise (Arg.Bad ("don't know what to do with " ^ s)) in IFDEF UNIX THEN default_lang.val := let s = try Sys.getenv "LANG" with [ Not_found -> "" ] in if List.mem s Version.available_languages then s else let s = try Sys.getenv "LC_CTYPE" with [ Not_found -> "" ] in if String.length s >= 2 then let s = String.sub s 0 2 in if List.mem s Version.available_languages then s else "en" else "en" ELSE () END; arg_parse_in_file (chop_extension Sys.argv.(0) ^ ".arg") speclist anonfun usage; Argl.parse speclist anonfun usage; if images_dir.val <> "" then let abs_dir = let f = Util.search_in_lang_path (Filename.concat images_dir.val "gwback.jpg") in let d = Filename.dirname f in if Filename.is_relative d then Filename.concat (Sys.getcwd ()) d else d in Util.images_url.val := "file://" ^ slashify abs_dir else (); if Secure.doc_path () = [] then List.iter (fun d -> Util.add_doc_path (Filename.concat d "doc")) (List.rev (Secure.lang_path ())) else (); if Util.cnt_dir.val = Filename.current_dir_name then Util.cnt_dir.val := Secure.base_dir () else (); Wserver.stop_server.val := List.fold_left Filename.concat Util.cnt_dir.val ["cnt"; "STOP_SERVER"] ; let (query, cgi) = try (Sys.getenv "QUERY_STRING", True) with [ Not_found -> ("", cgi.val) ] in if cgi then let is_post = try Sys.getenv "REQUEST_METHOD" = "POST" with [ Not_found -> False ] in let query = if is_post then do { let len = try int_of_string (Sys.getenv "CONTENT_LENGTH") with [ Not_found -> -1 ] in set_binary_mode_in stdin True; read_input len } else query in let addr = try Sys.getenv "REMOTE_HOST" with [ Not_found -> try Sys.getenv "REMOTE_ADDR" with [ Not_found -> "" ] ] in let script = try Sys.getenv "SCRIPT_NAME" with [ Not_found -> Sys.argv.(0) ] in geneweb_cgi addr (Filename.basename script) query else geneweb_server () } ; value test_eacces_bind err fun_name = IFDEF UNIX THEN if err = Unix.EACCES && fun_name = "bind" then try do { eprintf " Error: invalid access to the port %d: users port number less than 1024 are reserved to the system. Solution: do it as root or choose another port number greater than 1024. " selected_port.val; flush stderr; True } with [ Not_found -> False ] else False ELSE False END ; value print_exc exc = match exc with [ Unix.Unix_error Unix.EADDRINUSE "bind" _ -> do { eprintf "\nError: "; eprintf "the port %d" selected_port.val; eprintf " \ is already used by another GeneWeb daemon or by another program. Solution: kill the other program or launch GeneWeb with another port number (option -p) "; flush stderr; } | Unix.Unix_error err fun_name arg -> if test_eacces_bind err fun_name then () else do { prerr_string "\""; prerr_string fun_name; prerr_string "\" failed"; if String.length arg > 0 then do { prerr_string " on \""; prerr_string arg; prerr_string "\""; () } else (); prerr_string ": "; prerr_endline (Unix.error_message err); flush stderr; } | _ -> do { eprintf "%s\n" (Printexc.to_string exc); flush stderr } ] ; try main () with exc -> print_exc exc; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/select.ml0000660000175200017530000003556112664543647023033 0ustar guillaumeguillaume(* $Id: select.ml,v 5.16 2007-01-19 01:53:17 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Def; open Gutil; open Gwdb; value is_censored_person threshold p = match Adef.od_of_codate (get_birth p) with [ Some date -> match date with [ Dgreg dmy _ -> dmy.year >= threshold && get_access p != Public | _ -> False ] | None -> False ] ; value is_censored_couple base threshold cpl = let fath = poi base (get_father cpl) in let moth = poi base (get_mother cpl) in is_censored_person threshold fath || is_censored_person threshold moth ; value censor_person base per_tab fam_tab flag threshold p no_check = let ps = poi base (Adef.iper_of_int p) in if no_check || is_censored_person threshold ps then per_tab.(p) := per_tab.(p) lor flag else () ; value rec censor_family base per_tab fam_tab flag threshold i no_check = let censor_unions p = let uni = poi base (Adef.iper_of_int p) in Array.iter (fun ifam -> let f = Adef.int_of_ifam ifam in do { censor_family base per_tab fam_tab flag threshold f True; censor_person base per_tab fam_tab flag threshold p True }) (get_family uni) in let censor_descendants f = let des = foi base (Adef.ifam_of_int f) in Array.iter (fun iper -> let ip = Adef.int_of_iper iper in if per_tab.(ip) <> 0 then () else censor_unions ip) (get_children des) in let all_families_censored p = let uni = poi base (Adef.iper_of_int p) in Array.fold_left (fun check ifam -> fam_tab.(Adef.int_of_ifam ifam) = 0 && check) True (get_family uni) in let censor_spouse iper = let p = Adef.int_of_iper iper in if all_families_censored p then per_tab.(p) := per_tab.(p) lor flag else () in if fam_tab.(i) <> 0 then () else let fam = foi base (Adef.ifam_of_int i) in if is_deleted_family fam then () else if no_check || is_censored_couple base threshold fam then do { fam_tab.(i) := fam_tab.(i) lor flag; censor_spouse (get_father fam); censor_spouse (get_mother fam); censor_descendants i } else () ; value censor_base base per_tab fam_tab flag threshold = do { for i = 0 to nb_of_families base - 1 do { censor_family base per_tab fam_tab flag threshold i False }; for i = 0 to nb_of_persons base - 1 do { censor_person base per_tab fam_tab flag threshold i False } } ; value restrict_base base per_tab fam_tab flag = do { for i = 0 to nb_of_persons base - 1 do { let fct p = False in if base_visible_get base fct i then let _ = per_tab.(i) := per_tab.(i) lor flag in () else () }; for i = 0 to nb_of_families base - 1 do { let fam = foi base (Adef.ifam_of_int i) in let des_visible = Array.fold_left (fun check iper -> check || per_tab.(Adef.int_of_iper iper) = 0) False (get_children fam) in let cpl_not_visible = per_tab.(Adef.int_of_iper (get_father fam)) <> 0 || per_tab.(Adef.int_of_iper (get_mother fam)) <> 0 in if not des_visible && cpl_not_visible then fam_tab.(i) := fam_tab.(i) lor flag else (); } } ; value flag_family base per_tab fam_tab flag ifam = let i = Adef.int_of_ifam ifam in let cpl = foi base ifam in do { fam_tab.(i) := fam_tab.(i) lor flag; let i = Adef.int_of_iper (get_father cpl) in per_tab.(i) := per_tab.(i) lor flag; let i = Adef.int_of_iper (get_mother cpl) in per_tab.(i) := per_tab.(i) lor flag } ; value select_ancestors base per_tab fam_tab with_siblings flag iper = let rec add_ancestors iper = let i = Adef.int_of_iper iper in if per_tab.(i) land flag <> 0 then () else do { per_tab.(i) := per_tab.(i) lor flag; match get_parents (poi base iper) with [ Some ifam -> let i = Adef.int_of_ifam ifam in if fam_tab.(i) land flag <> 0 then () else do { fam_tab.(i) := fam_tab.(i) lor flag; let cpl = foi base ifam in add_ancestors (get_father cpl); add_ancestors (get_mother cpl) } | None -> () ] } in do { add_ancestors iper; if with_siblings then do { let add_sibling_spouse_parents ip = match get_parents (poi base ip) with [ Some ifam -> flag_family base per_tab fam_tab flag ifam | None -> () ] in let add_siblings_marriages ifam = let des = foi base ifam in Array.iter (fun ip -> let i = Adef.int_of_iper ip in do { per_tab.(i) := per_tab.(i) lor flag; Array.iter (fun ifam -> let i = Adef.int_of_ifam ifam in let cpl = foi base ifam in do { fam_tab.(i) := fam_tab.(i) lor flag; List.iter (fun ip -> let i = Adef.int_of_iper ip in do { per_tab.(i) := per_tab.(i) lor flag; add_sibling_spouse_parents ip; }) [get_father cpl; get_mother cpl] }) (get_family (poi base ip)) }) (get_children des) in let add_siblings iparent = Array.iter (fun ifam -> do { flag_family base per_tab fam_tab flag ifam; add_siblings_marriages ifam }) (get_family (poi base iparent)) in let anc_flag = 4 in let rec ancestors_loop iper = let i = Adef.int_of_iper iper in if per_tab.(i) land anc_flag <> 0 then () else do { per_tab.(i) := per_tab.(i) lor anc_flag; match get_parents (poi base iper) with [ Some ifam -> let i = Adef.int_of_ifam ifam in if fam_tab.(i) land anc_flag <> 0 then () else do { fam_tab.(i) := fam_tab.(i) lor anc_flag; let cpl = foi base ifam in add_siblings (get_father cpl); add_siblings (get_mother cpl); ancestors_loop (get_father cpl); ancestors_loop (get_mother cpl) } | None -> () ] } in let rec remove_anc_flag iper = let i = Adef.int_of_iper iper in if per_tab.(i) land anc_flag <> 0 then do { per_tab.(i) := per_tab.(i) land lnot anc_flag; match get_parents (poi base iper) with [ Some ifam -> let i = Adef.int_of_ifam ifam in if fam_tab.(i) land anc_flag <> 0 then do { fam_tab.(i) := fam_tab.(i) land lnot anc_flag; let cpl = foi base ifam in remove_anc_flag (get_father cpl); remove_anc_flag (get_mother cpl) } else () | None -> () ] } else () in ancestors_loop iper; remove_anc_flag iper } else () } ; value select_descendants base per_tab fam_tab no_spouses_parents flag iper maxlev = let mark = Array.make (nb_of_families base) False in let select_family ifam cpl = let i = Adef.int_of_ifam ifam in do { fam_tab.(i) := fam_tab.(i) lor flag; let i = Adef.int_of_iper (get_father cpl) in per_tab.(i) := per_tab.(i) lor flag; let i = Adef.int_of_iper (get_mother cpl) in per_tab.(i) := per_tab.(i) lor flag } in let rec loop lev iper = if maxlev >= 0 && lev > maxlev then () else let i = Adef.int_of_iper iper in do { per_tab.(i) := per_tab.(i) lor flag; Array.iter (fun ifam -> let i = Adef.int_of_ifam ifam in if mark.(i) then () else do { let fam = foi base ifam in mark.(i) := True; select_family ifam fam; if not no_spouses_parents then let sp = spouse iper fam in match get_parents (poi base sp) with [ Some ifam -> select_family ifam (foi base ifam) | None -> () ] else (); Array.iter (loop (succ lev)) (get_children fam); }) (get_family (poi base iper)) } in loop 0 iper ; value select_descendants_ancestors base per_tab fam_tab no_spouses_parents ip = let new_mark = let r = ref 0 in fun () -> do { incr r; r.val } in let tab = Array.make (nb_of_persons base) (new_mark ()) in let anc_mark = new_mark () in let anclist = loop [] ip where rec loop list ip = if tab.(Adef.int_of_iper ip) = anc_mark then list else do { tab.(Adef.int_of_iper ip) := anc_mark; match get_parents (poi base ip) with [ Some ifam -> let cpl = foi base ifam in let list = loop list (get_father cpl) in loop list (get_mother cpl) | None -> [ip :: list] ] } in let des_mark = new_mark () in List.iter (fun ip -> loop ip where rec loop ip = if tab.(Adef.int_of_iper ip) = des_mark then () else do { let u = poi base ip in for i = 0 to Array.length (get_family u) - 1 do { let ifam = (get_family u).(i) in fam_tab.(Adef.int_of_ifam ifam) := fam_tab.(Adef.int_of_ifam ifam) lor 1; let des = foi base ifam in for i = 0 to Array.length (get_children des) - 1 do { loop (get_children des).(i); }; }; tab.(Adef.int_of_iper ip) := des_mark; per_tab.(Adef.int_of_iper ip) := per_tab.(Adef.int_of_iper ip) lor 1; }) anclist ; value select_surname base per_tab fam_tab no_spouses_parents surname = let surname = Name.strip_lower surname in for i = 0 to nb_of_families base - 1 do { let fam = foi base (Adef.ifam_of_int i) in if is_deleted_family fam then () else let fath = poi base (get_father fam) in let moth = poi base (get_mother fam) in if Name.strip_lower (sou base (get_surname fath)) = surname || Name.strip_lower (sou base (get_surname moth)) = surname then do { fam_tab.(i) := True; per_tab.(Adef.int_of_iper (get_father fam)) := True; per_tab.(Adef.int_of_iper (get_mother fam)) := True; Array.iter (fun ic -> let p = poi base ic in if not per_tab.(Adef.int_of_iper ic) && Name.strip_lower (sou base (get_surname p)) = surname then per_tab.(Adef.int_of_iper ic) := True else ()) (get_children fam); if no_spouses_parents then () else List.iter (fun x -> match get_parents (poi base x) with [ Some ifam when not fam_tab.(Adef.int_of_ifam ifam) -> let cpl = foi base ifam in do { fam_tab.(Adef.int_of_ifam ifam) := True; per_tab.(Adef.int_of_iper (get_father cpl)) := True; per_tab.(Adef.int_of_iper (get_mother cpl)) := True } | _ -> () ]) [get_father fam; get_mother fam] } else () } ; value select_ancestors_descendants base anc desc ancdesc no_spouses_parents censor with_siblings maxlev = let tm = Unix.localtime (Unix.time ()) in let threshold = 1900 + tm.Unix.tm_year - censor in match (anc, desc, ancdesc) with [ (None, None, None) -> if censor <> 0 || censor = -1 then let per_tab = Array.make (nb_of_persons base) 0 in let fam_tab = Array.make (nb_of_families base) 0 in let _ = if censor = -1 then restrict_base base per_tab fam_tab 1 else censor_base base per_tab fam_tab 1 threshold in (fun i -> per_tab.(Adef.int_of_iper i) = 0, fun i -> fam_tab.(Adef.int_of_ifam i) = 0) else (fun _ -> True, fun _ -> True) | (None, None, Some iadper) -> let per_tab = Array.make (nb_of_persons base) 0 in let fam_tab = Array.make (nb_of_families base) 0 in let _ = if censor = -1 then restrict_base base per_tab fam_tab 4 else if censor <> 0 then censor_base base per_tab fam_tab 4 threshold else () in do { select_descendants_ancestors base per_tab fam_tab no_spouses_parents iadper; (fun i -> let fl = per_tab.(Adef.int_of_iper i) in fl < 4 && fl > 0, fun i -> let fl = fam_tab.(Adef.int_of_ifam i) in fl < 4 && fl > 0) } | _ -> let per_tab = Array.make (nb_of_persons base) 0 in let fam_tab = Array.make (nb_of_families base) 0 in let _ = if censor = -1 then restrict_base base per_tab fam_tab 4 else if censor <> 0 then censor_base base per_tab fam_tab 4 threshold else () in match (anc, desc) with [ (Some iaper, None) -> do { select_ancestors base per_tab fam_tab with_siblings 1 iaper; (fun i -> per_tab.(Adef.int_of_iper i) = 1, fun i -> fam_tab.(Adef.int_of_ifam i) = 1) } | (None, Some idper) -> do { select_descendants base per_tab fam_tab no_spouses_parents 1 idper maxlev; (fun i -> per_tab.(Adef.int_of_iper i) = 1, fun i -> fam_tab.(Adef.int_of_ifam i) = 1) } | (Some iaper, Some idper) -> do { select_ancestors base per_tab fam_tab False 1 iaper; select_descendants base per_tab fam_tab no_spouses_parents 2 idper maxlev; (fun i -> per_tab.(Adef.int_of_iper i) = 3, fun i -> fam_tab.(Adef.int_of_ifam i) = 3) } | _ -> assert False ] ] ; value select_surnames base surnames no_spouses_parents = let per_tab = Array.make (nb_of_persons base) False in let fam_tab = Array.make (nb_of_families base) False in do { List.iter (select_surname base per_tab fam_tab no_spouses_parents) surnames; (fun i -> per_tab.(Adef.int_of_iper i), fun i -> fam_tab.(Adef.int_of_ifam i)) } ; value functions base anc desc surnames ancdesc no_spouses_parents censor with_siblings maxlev = let (per_sel1, fam_sel1) = select_ancestors_descendants base anc desc ancdesc no_spouses_parents censor with_siblings maxlev in let (per_sel2, fam_sel2) = select_surnames base surnames no_spouses_parents in match (censor, anc, desc, ancdesc, surnames) with [ (0, None, None, None, [_ :: _]) -> (per_sel2, fam_sel2) | (_, _, _, _, []) -> (per_sel1, fam_sel1) | (0, _, _, _, _) -> (fun i -> per_sel1 i || per_sel2 i, fun i -> fam_sel1 i || fam_sel2 i) | _ -> (fun i -> per_sel1 i && per_sel2 i, fun i -> fam_sel1 i && fam_sel2 i) ] ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/sendImage.ml0000660000175200017530000002700212664543647023437 0ustar guillaumeguillaume(* camlp5r ./pa_html.cmo *) (* $Id: sendImage.ml,v 5.7 2007-09-12 09:58:44 ddr Exp $ *) open Config; open Def; open Gutil; open Gwdb; open Hutil; open Util; value incorrect conf = do { incorrect_request conf; raise Update.ModErr }; value incorrect_content_type conf base p s = let title _ = Wserver.wprint "%s" (capitale (transl conf "error")) in do { rheader conf title; print_link_to_welcome conf True; tag "p" begin Wserver.wprint ""; Wserver.wprint "Error: incorrect image content type: %s" s; Wserver.wprint "\n"; end; tag "ul" begin tag "li" begin Wserver.wprint "%s" (referenced_person_title_text conf base p); end; end; trailer conf; raise Update.ModErr } ; value error_too_big_image conf base p len max_len = let title _ = Wserver.wprint "%s" (capitale (transl conf "error")) in do { rheader conf title; print_link_to_welcome conf True; Wserver.wprint "

      "; Wserver.wprint "Error: this image is too big: %d bytes\n" len conf.xhs; Wserver.wprint "Maximum authorized in this database: %d bytes\n" max_len conf.xhs; Wserver.wprint "

      \n"; tag "ul" begin tag "li" begin Wserver.wprint "%s" (referenced_person_title_text conf base p); end; end; trailer conf; raise Update.ModErr } ; value raw_get conf key = try List.assoc key conf.env with [ Not_found -> incorrect conf ] ; (* print delete image link *) value print_link_delete_image conf base p = if Util.has_image conf base p then do { tag "p" begin stag "a" "href=\"%sm=DEL_IMAGE;i=%d\"" (commd conf) (Adef.int_of_iper (get_key_index p)) begin Wserver.wprint "%s %s" (capitale (transl conf "delete")) (transl_nth conf "image/images" 0); end; end; } else () ; (* Send image form *) value print_send_image conf base p = let title h = do { if Util.has_image conf base p then Wserver.wprint "%s" (capitale (transl_decline conf "modify" (transl_nth conf "image/images" 0))) else Wserver.wprint "%s" (capitale (transl_decline conf "add" (transl_nth conf "image/images" 0))); if h then () else do { let fn = p_first_name base p in let sn = p_surname base p in Wserver.wprint ": "; Wserver.wprint "%s %s" fn sn; Util.print_reference conf fn (get_occ p) sn } } in let digest = Update.digest_person (UpdateInd.string_person_of base p) in do { Perso.interp_notempl_with_menu title "perso_header" conf base p; tag "h2" begin title False; end; tag "form" "method=\"post\" action=\"%s\" enctype=\"multipart/form-data\"" conf.command begin tag "p" begin Util.hidden_env conf; xtag "input" "type=\"hidden\" name=\"m\" value=\"SND_IMAGE_OK\""; xtag "input" "type=\"hidden\" name=\"i\" value=\"%d\"" (Adef.int_of_iper (get_key_index p)); xtag "input" "type=\"hidden\" name=\"digest\" value=\"%s\"" digest; Wserver.wprint "%s:\n" (capitale (transl conf "file")); xtag "input" "\ type=\"file\" name=\"file\" size=\"50\" maxlength=\"250\" accept=\"image/*\""; end; match p_getint conf.base_env "max_images_size" with [ Some len -> tag "p" begin Wserver.wprint "(maximum authorized size = %d bytes)\n" len; end | None -> () ]; tag "p" begin xtag "input" "type=\"submit\" value=\"Ok\""; end; end; print_link_delete_image conf base p; trailer conf } ; value print conf base = match p_getint conf.env "i" with [ Some ip -> let p = poi base (Adef.iper_of_int ip) in let fn = p_first_name base p in let sn = p_surname base p in if sou base (get_image p) <> "" || fn = "?" || sn = "?" then incorrect_request conf else print_send_image conf base p | _ -> incorrect_request conf ] ; (* Delete image form *) value print_delete_image conf base p = let title h = do { Wserver.wprint "%s" (capitale (transl_decline conf "delete" (transl_nth conf "image/images" 0))); if h then () else do { let fn = p_first_name base p in let sn = p_surname base p in let occ = if fn = "?" || sn = "?" then Adef.int_of_iper (get_key_index p) else get_occ p in Wserver.wprint ": "; Wserver.wprint "%s.%d %s" fn occ sn } } in do { header conf title; Wserver.wprint "\n"; tag "form" "method=\"post\" action=\"%s\"" conf.command begin html_p conf; Util.hidden_env conf; Wserver.wprint "\n"; Wserver.wprint "\n\n" (Adef.int_of_iper (get_key_index p)); Wserver.wprint "\n"; html_p conf; Wserver.wprint "\n"; end; Wserver.wprint "\n"; trailer conf } ; value print_del conf base = match p_getint conf.env "i" with [ Some ip -> let p = poi base (Adef.iper_of_int ip) in if sou base (get_image p) <> "" then incorrect_request conf else match auto_image_file conf base p with [ Some _ -> print_delete_image conf base p | _ -> incorrect_request conf ] | _ -> incorrect_request conf ] ; (* Send image form validated *) value print_sent conf base p = let title _ = Wserver.wprint "%s" (capitale (transl conf "image received")) in do { header conf title; tag "ul" begin stag "li" begin Wserver.wprint "%s" (referenced_person_text conf base p); end; end; trailer conf } ; value write_file fname content = let oc = Secure.open_out_bin fname in do { output_string oc content; flush oc; close_out oc } ; value move_file_to_old conf typ fname bfname = let old_dir = Filename.concat (Util.base_path ["images"] conf.bname) "old" in if Sys.file_exists (Filename.concat old_dir bfname ^ ".gif") || Sys.file_exists (Filename.concat old_dir bfname ^ ".jpg") || Sys.file_exists (Filename.concat old_dir bfname ^ ".png") then try Sys.remove (fname ^ typ) with [ Sys_error _ -> () ] else do { try Unix.mkdir old_dir 0o777 with [ Unix.Unix_error _ _ _ -> () ]; try Unix.rename (fname ^ typ) (Filename.concat old_dir bfname ^ typ) with [ Unix.Unix_error _ _ _ -> () ] } ; value normal_image_type s = if String.length s > 10 && Char.code s.[0] = 0xff && Char.code s.[1] = 0xd8 && (let m = String.sub s 6 4 in m = "JFIF" || m = "Exif") then ".jpg" else if String.length s > 4 && String.sub s 0 4 = "\137PNG" then ".png" else if String.length s > 4 && String.sub s 0 4 = "GIF8" then ".gif" else "" ; value string_search s v = loop 0 0 where rec loop i j = if j = String.length v then Some (i - String.length v) else if i = String.length s then None else if s.[i] = v.[j] then loop (i + 1) (j + 1) else loop (i + 1) 0 ; (* get the image type, possibly removing spurious header *) value image_type s = let r = normal_image_type s in if r <> "" then (r, s) else match string_search s "JFIF" with [ Some i when i > 6 -> let s = String.sub s (i - 6) (String.length s - i + 6) in (normal_image_type s, s) | _ -> match string_search s "\137PNG" with [ Some i -> let s = String.sub s i (String.length s - i) in (normal_image_type s, s) | _ -> match string_search s "GIF8" with [ Some i -> let s = String.sub s i (String.length s - i) in (normal_image_type s, s) | None -> ("", s) ] ] ] ; value dump_bad_image conf s = match p_getenv conf.base_env "dump_bad_images" with [ Some "yes" -> try let oc = Secure.open_out_bin "bad-image" in do { output_string oc s; flush oc; close_out oc } with [ Sys_error _ -> () ] | _ -> () ] ; value effective_send_ok conf base p file = let strm = Stream.of_string file in let (request, content) = Wserver.get_request_and_content strm in let content = let s = loop 0 strm where rec loop len = parser [ [: `x :] -> loop (Buff.store len x) strm | [: :] -> Buff.get len ] in content ^ s in let (typ, content) = let (x, c) = image_type content in if x = "" then do { let ct = Wserver.extract_param "content-type: " '\n' request in dump_bad_image conf content; incorrect_content_type conf base p ct } else match p_getint conf.base_env "max_images_size" with [ Some len when String.length content > len -> error_too_big_image conf base p (String.length content) len | _ -> (x, c) ] in let bfname = default_image_name base p in let bfdir = let bfdir = Util.base_path ["images"] conf.bname in if Sys.file_exists bfdir then bfdir else do { let d = Filename.concat (Secure.base_dir ()) "images" in let d1 = Filename.concat d conf.bname in try Unix.mkdir d 0o777 with [ Unix.Unix_error _ _ _ -> () ]; try Unix.mkdir d1 0o777 with [ Unix.Unix_error _ _ _ -> () ]; d1 } in let fname = Filename.concat bfdir bfname in do { if Sys.file_exists (fname ^ ".gif") then move_file_to_old conf ".gif" fname bfname else if Sys.file_exists (fname ^ ".jpg") then move_file_to_old conf ".jpg" fname bfname else if Sys.file_exists (fname ^ ".png") then move_file_to_old conf ".png" fname bfname else (); write_file (fname ^ typ) content; let changed = U_Send_image (Util.string_gen_person base (gen_person_of_person p)) in History.record conf base changed "si"; print_sent conf base p } ; value print_send_ok conf base = try let ip = let s = raw_get conf "i" in try int_of_string s with [ Failure _ -> incorrect conf ] in let p = poi base (Adef.iper_of_int ip) in let digest = Update.digest_person (UpdateInd.string_person_of base p) in if digest = raw_get conf "digest" then let file = raw_get conf "file" in effective_send_ok conf base p file else Update.error_digest conf with [ Update.ModErr -> () ] ; (* Delete image form validated *) value print_deleted conf base p = let title _ = Wserver.wprint "%s" (capitale (transl conf "image deleted")) in do { header conf title; tag "ul" begin html_li conf; Wserver.wprint "\n%s" (referenced_person_text conf base p); Wserver.wprint "\n"; end; trailer conf } ; value effective_delete_ok conf base p = let bfname = default_image_name base p in let fname = Filename.concat (Util.base_path ["images"] conf.bname) bfname in do { if Sys.file_exists (fname ^ ".gif") then move_file_to_old conf ".gif" fname bfname else if Sys.file_exists (fname ^ ".jpg") then move_file_to_old conf ".jpg" fname bfname else if Sys.file_exists (fname ^ ".png") then move_file_to_old conf ".png" fname bfname else incorrect conf; let changed = U_Delete_image (Util.string_gen_person base (gen_person_of_person p)) in History.record conf base changed "di"; print_deleted conf base p } ; value print_del_ok conf base = try match p_getint conf.env "i" with [ Some ip -> let p = poi base (Adef.iper_of_int ip) in effective_delete_ok conf base p | None -> incorrect conf ] with [ Update.ModErr -> () ] ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/mergeIndOk.ml0000660000175200017530000002470112664543647023572 0ustar guillaumeguillaume(* camlp5r ./pa_html.cmo *) (* $Id: mergeIndOk.ml,v 5.44 2008-01-21 14:02:36 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Config; open Def; open Futil; open Gutil; open Gwdb; open Hutil; open Mutil; open Util; value rec merge_lists l1 = fun [ [x2 :: l2] -> if List.mem x2 l1 then merge_lists l1 l2 else merge_lists (l1 @ [x2]) l2 | [] -> l1 ] ; value cat_strings base is1 sep is2 = let n1 = sou base is1 in let n2 = sou base is2 in if n1 = "" then n2 else if n2 = "" then n1 else n1 ^ sep ^ n2 ; value merge_strings base is1 sep is2 = let n1 = sou base is1 in let n2 = sou base is2 in if n1 = n2 then n1 else if n1 = "" then n2 else if n2 = "" then n1 else n1 ^ sep ^ n2 ; value sorp base ip = let p = poi base ip in (sou base (get_first_name p), sou base (get_surname p), get_occ p, Update.Link, "") ; value reconstitute conf base p1 p2 = let field name proj null = let x1 = proj p1 in let x2 = proj p2 in match p_getenv conf.env name with [ Some "1" -> x1 | Some "2" -> x2 | _ -> if null x1 then x2 else x1 ] in let list conv proj = let l1 = List.map conv (proj p1) in let l2 = List.map conv (proj p2) in merge_lists l1 l2 in {first_name = field "first_name" (fun p -> p_first_name base p) (fun x -> x = "" || x = "?"); surname = field "surname" (fun p -> p_surname base p) (fun x -> x = "" || x = "?"); occ = field "number" get_occ ( \= 0); image = field "image" (fun p -> sou base (get_image p)) ( \= ""); public_name = field "public_name" (fun p -> sou base (get_public_name p)) ( \= ""); qualifiers = list (sou base) get_qualifiers; aliases = list (sou base) get_aliases; first_names_aliases = list (sou base) get_first_names_aliases; surnames_aliases = list (sou base) get_surnames_aliases; titles = list (map_title_strings (sou base)) get_titles; rparents = list (map_relation_ps (sorp base) (sou base)) get_rparents; related = []; occupation = field "occupation" (fun p -> sou base (get_occupation p)) ( \= ""); sex = field "sex" get_sex ( \= Neuter); access = field "access" get_access ( \= IfTitles); birth = field "birth" get_birth ( \= Adef.codate_None); birth_place = field "birth_place" (fun p -> sou base (get_birth_place p)) ( \= ""); birth_src = merge_strings base (get_birth_src p1) ", " (get_birth_src p2); baptism = field "baptism" get_baptism ( \= Adef.codate_None); baptism_place = field "baptism_place" (fun p -> sou base (get_baptism_place p)) ( \= ""); baptism_src = merge_strings base (get_baptism_src p1) ", " (get_baptism_src p2); death = field "death" get_death (fun x -> match x with [ DontKnowIfDead | OfCourseDead -> True | _ -> False]); death_place = field "death_place" (fun p -> sou base (get_death_place p)) ( \= ""); death_src = merge_strings base (get_death_src p1) ", " (get_death_src p2); burial = field "burial" get_burial ( \= UnknownBurial); burial_place = field "burial_place" (fun p -> sou base (get_burial_place p)) ( \= ""); burial_src = merge_strings base (get_burial_src p1) ", " (get_burial_src p2); notes = merge_strings base (get_notes p1) "
      \n" (get_notes p2); psources = merge_strings base (get_psources p1) ", " (get_psources p2); key_index = get_key_index p1} ; value print_merge conf base = match (p_getint conf.env "i1", p_getint conf.env "i2") with [ (Some i1, Some i2) -> let p1 = poi base (Adef.iper_of_int i1) in let p2 = poi base (Adef.iper_of_int i2) in let p = reconstitute conf base p1 p2 in let sp = UpdateInd.string_person_of base p1 in let digest = Update.digest_person sp in UpdateInd.print_update_ind conf base p digest | _ -> incorrect_request conf ] ; value print_mod_merge_ok conf base wl p = do { let title _ = Wserver.wprint "%s" (capitale (transl conf "merge done")) in header conf title; print_link_to_welcome conf True; Wserver.wprint "\n%s\n" (referenced_person_text conf base (poi base p.key_index)); Update.print_warnings conf base wl; Merge.print_possible_continue_merging conf base; trailer conf; }; value redirect_relations_of_added_related base p ip2 rel_chil = let (p_related, mod_p) = List.fold_right (fun ipc (p_related, mod_p) -> do { let pc = poi base ipc in let (pc_rparents, mod_pc, p_related, mod_p) = List.fold_right (fun r (pc_rparents, mod_pc, p_related, mod_p) -> let (r, mod_pc, p_related, mod_p) = match r.r_fath with [ Some ip when ip = ip2 -> let (p_related, mod_p) = if List.mem ipc p_related then (p_related, mod_p) else ([ipc :: p_related], True) in let r = {(r) with r_fath = Some p.key_index} in (r, True, p_related, mod_p) | _ -> (r, mod_pc, p_related, mod_p) ] in let (r, mod_pc, p_related, mod_p) = match r.r_moth with [ Some ip when ip = ip2 -> let (p_related, mod_p) = if List.mem ipc p_related then (p_related, mod_p) else ([ipc :: p_related], True) in let r = {(r) with r_moth = Some p.key_index} in (r, True, p_related, mod_p) | _ -> (r, mod_pc, p_related, mod_p) ] in ([r :: pc_rparents], mod_pc, p_related, mod_p)) (get_rparents pc) ([], False, p_related, mod_p) in if mod_pc then let pc = gen_person_of_person pc in let pc = {(pc) with rparents = pc_rparents} in patch_person base ipc pc else (); let (p_related, mod_p) = loop (p_related, mod_p) 0 where rec loop (p_related, mod_p) i = if i = Array.length (get_family pc) then (p_related, mod_p) else let ifam = (get_family pc).(i) in let fam = gen_family_of_family (foi base ifam) in let (p_related, mod_p) = if array_mem ip2 fam.witnesses then do { let (p_related, mod_p) = loop (p_related, mod_p) 0 where rec loop (p_related, mod_p) j = if j = Array.length fam.witnesses then (p_related, mod_p) else let (p_related, mod_p) = if fam.witnesses.(j) = ip2 then do { fam.witnesses.(j) := p.key_index; if List.mem ipc p_related then (p_related, mod_p) else ([ipc :: p_related], True) } else (p_related, mod_p) in loop (p_related, mod_p) (j + 1) in patch_family base ifam fam; (p_related, mod_p) } else (p_related, mod_p) in loop (p_related, mod_p) (i + 1) in (p_related, mod_p) }) rel_chil (p.related, False) in if mod_p then {(p) with related = p_related} else p ; value redirect_added_families base p ip2 p2_family = for i = 0 to Array.length p2_family - 1 do { let ifam = p2_family.(i) in let fam = foi base ifam in let cpl = if ip2 = get_father fam then do { Array.iter (fun ip -> let w = poi base ip in if not (List.mem p.key_index (get_related w)) then let w = gen_person_of_person w in let w = {(w) with related = [p.key_index :: w.related]} in patch_person base ip w else ()) (get_witnesses fam); couple False p.key_index (get_mother fam) } else if ip2 = get_mother fam then couple False (get_father fam) p.key_index else assert False in patch_couple base ifam cpl; } ; value effective_mod_merge conf base o_p1 o_p2 sp = match p_getint conf.env "i2" with [ Some i2 -> do { let ip2 = Adef.iper_of_int i2 in let p2 = poi base ip2 in let rel_chil = get_related p2 in let p_family = get_family (poi base sp.key_index) in let p2_family = get_family p2 in let warning _ = () in MergeInd.reparent_ind base warning sp.key_index ip2; delete_key base (sou base (get_first_name p2)) (sou base (get_surname p2)) (get_occ p2); let warning _ = () in let p2 = UpdateIndOk.effective_del conf base warning p2 in patch_person base p2.key_index p2; let u2 = {family = [| |]} in patch_union base p2.key_index u2; let p = UpdateIndOk.effective_mod conf base sp in let p = redirect_relations_of_added_related base p ip2 rel_chil in redirect_added_families base p ip2 p2_family; Update.update_misc_names_of_family base p.sex {family = p_family}; patch_person base p.key_index p; let u = {family = Array.append p_family p2_family} in if p2_family <> [| |] then patch_union base p.key_index u else (); Consang.check_noloop_for_person_list base (Update.error conf base) [p.key_index]; let wl = let a = poi base p.key_index in let a = {parents = get_parents a; consang = get_consang a} in UpdateIndOk.all_checks_person conf base p a u in Util.commit_patches conf base; let changed = U_Merge_person o_p1 o_p2 (Util.string_gen_person base p) in History.record conf base changed "fp"; Update.delete_topological_sort conf base; print_mod_merge_ok conf base wl p; } | _ -> incorrect_request conf ] ; value print_mod_merge o_conf base = let get_gen_person i = match p_getint o_conf.env i with [ Some i -> Util.string_gen_person base (gen_person_of_person (poi base (Adef.iper_of_int i))) | None -> Util.string_gen_person base (gen_person_of_person (poi base (Adef.iper_of_int (-1)))) ] in let o_p1 = get_gen_person "i" in let o_p2 = get_gen_person "i2" in let conf = Update.update_conf o_conf in UpdateIndOk.print_mod_aux conf base (effective_mod_merge conf base o_p1 o_p2) ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/image.ml0000660000175200017530000001442312664543647022630 0ustar guillaumeguillaume(* camlp5r *) (* $Id: image.ml,v 5.8 2009-03-11 09:22:39 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Config; (* ************************************************************************** *) (* [Fonc] content : bool -> string -> int -> string -> unit *) (** [Description] : Envoie les en-têtes de contenu et de cache pour une image sur le flux HTTP sortant de Wserver. [Args] : - cgi : True en mode CGI, False en serveur autonome - t : le type MIME de l'image, par exemple "png", "jpeg" ou "gif" - len : la taille en octet de l'image - fname : le nom du fichier image [Retour] : aucun [Rem] : Ne pas utiliser en dehors de ce module. *) (* ************************************************************************** *) value content cgi t len fname = do { if not cgi then Wserver.http "" else (); Wserver.wprint "Content-type: image/%s" t; Util.nl (); Wserver.wprint "Content-length: %d" len; Util.nl (); Wserver.wprint "Content-disposition: inline; filename=%s" (Filename.basename fname); Util.nl (); (* TODO: Utiliser un cache public pour les images non personelles. *) Wserver.wprint "Cache-control: private, max-age=%d" (60 * 60 * 24 * 30); Util.nl (); Util.nl (); Wserver.wflush (); } ; (* ************************************************************************** *) (* [Fonc] print_image_type : bool -> string -> string -> bool *) (** [Description] : Affiche une image (avec ses en-têtes) en réponse HTTP en utilisant Wserver. [Args] : - cgi : True en mode CGI, False en serveur autonome - fname : le chemin vers le fichier image - itype : le type MIME de l'image, par exemple "png", "jpeg" ou "gif" [Retour] : True si le fichier image existe et qu'il a été servi en réponse HTTP. [Rem] : Ne pas utiliser en dehors de ce module. *) (* ************************************************************************** *) value print_image_type cgi fname itype = match try Some (Secure.open_in_bin fname) with [ Sys_error _ -> None ] with [ Some ic -> let buf = Bytes.create 1024 in let len = in_channel_length ic in do { content cgi itype len fname; let rec loop len = if len = 0 then () else do { let olen = min (String.length buf) len in really_input ic buf 0 olen; Wserver.wprint "%s" (String.sub buf 0 olen); loop (len - olen) } in loop len; close_in ic; True } | None -> False ] ; (* ************************************************************************** *) (* [Fonc] print_image_file : bool -> string -> bool *) (* ************************************************************************** *) value print_image_file cgi fname = List.exists (fun (suff, itype) -> if Filename.check_suffix fname suff || Filename.check_suffix fname (String.uppercase suff) then print_image_type cgi fname itype else False) [(".png", "png"); (".jpg", "jpeg"); (".jpeg", "jpeg"); (".gif", "gif")] ; (* ************************************************************************** *) (* [Fonc] print_personal_image : Config.config -> Gwdb.base -> Gwdb.person -> unit *) (** [Description] : Affiche l'image d'une personne en réponse HTTP. [Args] : - conf : configuration de la requête - base : base de donnée sélectionnée - p : personne dans la base dont il faut afficher l'image [Retour] : aucun [Rem] : Ne pas utiliser en dehors de ce module. *) (* ************************************************************************** *) value print_personal_image conf base p = match Util.image_and_size conf base p (fun x y -> Some (1, 1)) with [ Some (True, f, _) -> if print_image_file conf.cgi f then () else Hutil.incorrect_request conf | _ -> Hutil.incorrect_request conf ] ; (* ************************************************************************** *) (* [Fonc] print_source_image : Config.config -> string -> unit *) (** [Description] : Affiche une image à partir de son basename uniquement en la cherchant dans les dossiers d'images. [Args] : - config : configuration de la requête - f : basename de l'image [Retour] : aucun [Rem] : Ne pas utiliser en dehors de ce module. *) (* ************************************************************************** *) value print_source_image conf f = let fname = if f.[0] = '/' then String.sub f 1 (String.length f - 1) else f in if fname = Filename.basename fname then let fname = Util.source_image_file_name conf.bname fname in if print_image_file conf.cgi fname then () else Hutil.incorrect_request conf else Hutil.incorrect_request conf ; (* ************************************************************************** *) (* [Fonc] print : Config.config -> Gwdb.base -> unit *) (* ************************************************************************** *) value print conf base = match Util.p_getenv conf.env "s" with [ Some f -> print_source_image conf f | None -> match Util.find_person_in_env conf base "" with [ Some p -> print_personal_image conf base p | _ -> Hutil.incorrect_request conf ] ] ; (* ************************************************************************** *) (* [Fonc] print_html : config -> 'a -> unit *) (* ************************************************************************** *) value print_html conf base = do { Util.html conf; Util.nl (); Wserver.wprint "\n"; Wserver.wprint "\n"; Wserver.wprint " %s\n" (Util.transl_nth conf "image/images" 0); Wserver.wprint "\n\n"; Wserver.wprint " let v = if k = "m" then "IM" else v in Wserver.wprint "%s%s=%s" (if first then "" else ";") k v) conf.env; Wserver.wprint "\"%s>\n\n" conf.xhs; } ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/db2out.mli0000660000175200017530000000123312664543647023111 0ustar guillaumeguillaume(* camlp5r *) (* $Id: db2out.mli,v 5.12 2012-01-21 10:30:52 ddr Exp $ *) (* Copyright (c) 2007 INRIA *) value phony_min_size : int; value output_item_compress_return_pos : out_channel -> Hashtbl.t 'a int -> ref int -> 'a -> int; value output_value_array_no_compress : string -> string -> int -> 'a -> (out_channel -> ('a -> int) -> unit) -> unit; value output_value_array_compress : string -> string -> int -> 'a -> (out_channel -> ('a -> int) -> unit) -> unit; value output_hashtbl : string -> string -> Hashtbl.t _ _ -> unit; value make_indexes : string -> int -> list string -> unit; value check_input_value : string -> string -> int -> unit; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/gwdb.mli0000660000175200017530000001432312664543647022641 0ustar guillaumeguillaume(* $Id: gwdb.mli,v 5.102 2007-03-02 11:44:13 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Adef; type istr = 'abstract; type person = 'abstract; type family = 'abstract; type relation = Def.gen_relation iper istr; type title = Def.gen_title istr; type string_person_index = 'abstract; type base = 'abstract; value open_base : string -> base; value close_base : base -> unit; value eq_istr : istr -> istr -> bool; value is_empty_string : istr -> bool; value is_quest_string : istr -> bool; value empty_person : base -> iper -> person; value get_access : person -> Def.access; value get_aliases : person -> list istr; value get_baptism : person -> codate; value get_baptism_place : person -> istr; value get_baptism_src : person -> istr; value get_birth : person -> codate; value get_birth_place : person -> istr; value get_birth_src : person -> istr; value get_burial : person -> Def.burial; value get_burial_place : person -> istr; value get_burial_src : person -> istr; value get_death : person -> Def.death; value get_death_place : person -> istr; value get_death_src : person -> istr; value get_first_name : person -> istr; value get_first_names_aliases : person -> list istr; value get_image : person -> istr; value get_key_index : person -> iper; value get_notes : person -> istr; value get_occ : person -> int; value get_occupation : person -> istr; value get_psources : person -> istr; value get_public_name : person -> istr; value get_qualifiers : person -> list istr; value get_related : person -> list iper; value get_rparents : person -> list relation; value get_sex : person -> Def.sex; value get_surname : person -> istr; value get_surnames_aliases : person -> list istr; value get_titles : person -> list title; value get_parents : person -> option ifam; value get_consang : person -> Adef.fix; value get_family : person -> array ifam; value gen_person_of_person : person -> Def.gen_person iper istr; value get_comment : family -> istr; value get_divorce : family -> Def.divorce; value get_fsources : family -> istr; value get_marriage : family -> codate; value get_marriage_place : family -> istr; value get_marriage_src : family -> istr; value get_origin_file : family -> istr; value get_relation : family -> Def.relation_kind; value get_witnesses : family -> array iper; value get_father : family -> iper; value get_mother : family -> iper; value get_parent_array : family -> array iper; value get_children : family -> array iper; value gen_family_of_family : family -> Def.gen_family iper istr; value gen_couple_of_couple : family -> Def.gen_couple iper; value gen_descend_of_descend : family -> Def.gen_descend iper; value person_of_gen_person : base -> (Def.gen_person iper istr * Def.gen_ascend ifam * Def.gen_union ifam) -> person; value family_of_gen_family : base -> (Def.gen_family iper istr * Def.gen_couple iper * Def.gen_descend iper) -> family; value poi : base -> iper -> person; value foi : base -> ifam -> family; value sou : base -> istr -> string; value nb_of_persons : base -> int; value nb_of_families : base -> int; value patch_person : base -> iper -> Def.gen_person iper istr -> unit; value patch_ascend : base -> iper -> Def.gen_ascend ifam -> unit; value patch_union : base -> iper -> Def.gen_union ifam -> unit; value patch_family : base -> ifam -> Def.gen_family iper istr -> unit; value patch_descend : base -> ifam -> Def.gen_descend iper -> unit; value patch_couple : base -> ifam -> Def.gen_couple iper -> unit; value patch_name : base -> string -> iper -> unit; value patch_key : base -> iper -> string -> string -> int -> unit; value delete_key : base -> string -> string -> int -> unit; value insert_string : base -> string -> istr; value commit_patches : base -> unit; value commit_notes : base -> string -> string -> unit; value is_patched_person : base -> iper -> bool; value patched_ascends : base -> list iper; value delete_family : base -> ifam -> unit; value is_deleted_family : family -> bool; value person_of_key : base -> string -> string -> int -> option iper; value persons_of_name : base -> string -> list iper; value persons_of_first_name : base -> string_person_index; value persons_of_surname : base -> string_person_index; value spi_first : string_person_index -> string -> istr; (* first [first/sur]name starting with that string *) value spi_next : string_person_index -> istr -> bool -> (istr * int); (* next [first/sur]name by alphabetical order *) value spi_find : string_person_index -> istr -> list iper; (* all persons having that [first/sur]name *) value base_visible_get : base -> (person -> bool) -> int -> bool; value base_visible_write : base -> unit; value base_particles : base -> list string; value base_strings_of_first_name : base -> string -> list istr; value base_strings_of_surname : base -> string -> list istr; value load_ascends_array : base -> unit; value load_unions_array : base -> unit; value load_couples_array : base -> unit; value load_descends_array : base -> unit; value load_strings_array : base -> unit; value persons_array : base -> (int -> Def.gen_person iper istr * int -> Def.gen_person iper istr -> unit); value ascends_array : base -> (int -> option ifam * int -> Adef.fix * int -> Adef.fix -> unit * option (array Adef.fix)); value base_notes_read : base -> string -> string; value base_notes_read_first_line : base -> string -> string; value base_notes_are_empty : base -> string -> bool; value base_notes_origin_file : base -> string; value base_notes_dir : base -> string; value base_wiznotes_dir : base -> string; value gen_person_misc_names : base -> Def.gen_person iper istr -> (Def.gen_person iper istr -> list (Def.gen_title istr)) -> list string; value person_misc_names : base -> person -> (person -> list title) -> list string; value nobtit : base -> Lazy.t (list string) -> Lazy.t (list string) -> person -> list title; value p_first_name : base -> person -> string; value p_surname : base -> person -> string; value date_of_last_change : base -> float; (**/**) (** For database builders *) value base_of_base1 : Dbdisk.dsk_base -> base; value dsk_person_of_person : person -> Dbdisk.dsk_person; value apply_base1 : base -> (Dbdisk.dsk_base -> unit) -> unit; value apply_base2 : base -> (Db2disk.db2 -> unit) -> unit; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/updateInd.mli0000660000175200017530000000065512664543647023636 0ustar guillaumeguillaume(* $Id: updateInd.mli,v 5.4 2007-01-19 01:53:17 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Config; open Def; open Gwdb; value string_person_of : base -> person -> gen_person Update.key string; value print_update_ind : config -> base -> gen_person Update.key string -> string -> unit ; value print_add : config -> base -> unit; value print_del : config -> base -> unit; value print_mod : config -> base -> unit; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/relation.ml0000660000175200017530000015437112664543647023372 0ustar guillaumeguillaume(* camlp5r ./pa_html.cmo *) (* $Id: relation.ml,v 5.22 2008-01-12 01:49:50 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) DEFINE OLD; open Config; open Def; open Gutil; open Gwdb; open Hutil; open Util; value round_2_dec x = floor (x *. 100.0 +. 0.5) /. 100.0; (* find shortest path : * parents, siblings, mates and children are at distance 1. *) type famlink = [ Self | Parent | Sibling | HalfSibling | Mate | Child ] ; IFDEF OLD THEN declare open Dag2html; type dag_ind 'a = { di_val : 'a; di_famc : mutable dag_fam 'a; di_fams : mutable dag_fam 'a } and dag_fam 'a = { df_pare : mutable list (dag_ind 'a); df_chil : list (dag_ind 'a) } ; value dag_ind_list_of_path path = let (indl, _) = let merge l1 l2 = if l1 == l2 then l1 else l1 @ l2 in List.fold_left (fun (indl, prev_ind) (ip, fl) -> let (ind, indl) = try (List.find (fun di -> di.di_val = Some ip) indl, indl) with [ Not_found -> let rec ind = {di_val = Some ip; di_famc = famc; di_fams = fams} and famc = {df_pare = []; df_chil = [ind]} and fams = {df_pare = [ind]; df_chil = []} in (ind, [ind :: indl]) ] in let fam = match prev_ind with [ None -> {df_pare = []; df_chil = []} | Some p_ind -> match fl with [ Parent -> {df_pare = merge p_ind.di_famc.df_pare ind.di_fams.df_pare; df_chil = merge p_ind.di_famc.df_chil ind.di_fams.df_chil} | Child -> {df_pare = merge p_ind.di_fams.df_pare ind.di_famc.df_pare; df_chil = merge p_ind.di_fams.df_chil ind.di_famc.df_chil} | Sibling | HalfSibling -> {df_pare = merge p_ind.di_famc.df_pare ind.di_famc.df_pare; df_chil = merge p_ind.di_famc.df_chil ind.di_famc.df_chil} | Mate -> {df_pare = merge p_ind.di_fams.df_pare ind.di_fams.df_pare; df_chil = merge p_ind.di_fams.df_chil ind.di_fams.df_chil} | Self -> {df_pare = []; df_chil = []} ] ] in do { List.iter (fun ind -> ind.di_famc := fam) fam.df_chil; List.iter (fun ind -> ind.di_fams := fam) fam.df_pare; (indl, Some ind) }) ([], None) (List.rev path) in indl ; value add_missing_parents_of_siblings conf base indl = List.fold_right (fun ind indl -> let indl = match ind.di_famc with [ {df_pare = []; df_chil = [_]} -> indl | {df_pare = []; df_chil = children} -> let ipl = List.fold_right (fun ind ipl -> match ind.di_val with [ Some ip -> let ip = match get_parents (pget conf base ip) with [ Some ifam -> get_father (foi base ifam) | None -> assert False ] in if List.mem ip ipl then ipl else [ip :: ipl] | _ -> assert False ]) children [] in let fams = {df_pare = []; df_chil = children} in let indl1 = List.fold_left (fun indl ip -> let rec indp = {di_val = Some ip; di_famc = famc; di_fams = fams} and famc = {df_pare = []; df_chil = [indp]} in do { fams.df_pare := [indp :: fams.df_pare]; [indp :: indl] }) [] ipl in do { List.iter (fun ind -> ind.di_famc := fams) children; indl1 @ indl } | _ -> indl ] in [ind :: indl]) indl [] ; value dag_fam_list_of_ind_list indl = List.fold_left (fun faml ind -> let faml = if List.mem ind.di_famc faml then faml else [ind.di_famc :: faml] in if List.mem ind.di_fams faml then faml else [ind.di_fams :: faml]) [] indl ; value add_phony_children indl faml = List.fold_right (fun fam (indl, faml) -> match fam with [ {df_pare = [_]; df_chil = []} -> (indl, [fam :: faml]) | {df_pare = pare; df_chil = []} -> let rec ind = {di_val = None; di_famc = famc; di_fams = fams} and famc = {df_pare = pare; df_chil = [ind]} and fams = {df_pare = [ind]; df_chil = []} in do { List.iter (fun ind -> ind.di_fams := famc) pare; ([ind :: indl], [famc; fams :: faml]) } | _ -> (indl, [fam :: faml]) ]) faml (indl, []) ; value dag_of_ind_dag_list indl = let (indl, _) = List.fold_right (fun ind (indl, cnt) -> ([(ind, cnt) :: indl], cnt + 1)) indl ([], 0) in let idag_of_di_ind ind = idag_of_int (List.assq ind indl) in List.map (fun (ind, cnt) -> {pare = List.map idag_of_di_ind ind.di_famc.df_pare; valu = match ind.di_val with [ Some ic -> Dag.Left ic | None -> Dag.Right cnt ]; chil = List.map idag_of_di_ind ind.di_fams.df_chil}) indl ; value dag_of_relation_path conf base path = let indl = dag_ind_list_of_path path in let indl = add_missing_parents_of_siblings conf base indl in let faml = dag_fam_list_of_ind_list indl in let (indl, faml) = add_phony_children indl faml in let nl = dag_of_ind_dag_list indl in let d = {dag = Array.of_list (List.rev nl)} in let set = List.fold_left (fun set n -> match n.valu with [ Dag.Left ip -> Dag.Pset.add ip set | Dag.Right _ -> set ]) Dag.Pset.empty nl in (set, d) ; value old_print_relationship_dag conf base elem_txt vbar_txt path next_txt = let invert = match Util.p_getenv conf.env "invert" with [ Some "on" -> True | _ -> False ] in let (set, d) = dag_of_relation_path conf base path in let page_title = capitale (transl conf "relationship") in let hts = Dag.make_tree_hts conf base elem_txt vbar_txt invert set [] d in Dag.print_slices_menu_or_dag_page conf base page_title hts next_txt ; end ELSE declare value old_print_relationship_dag conf base elem_txt vbar_txt path next_txt = incorrect_request conf ; end END; value add_common_parent base ip1 ip2 set = let a1 = poi base ip1 in let a2 = poi base ip2 in match (get_parents a1, get_parents a2) with [ (Some ifam1, Some ifam2) -> let cpl1 = foi base ifam1 in let cpl2 = foi base ifam2 in if get_father cpl1 = get_father cpl2 then Dag.Pset.add (get_father cpl1) set else if get_mother cpl1 = get_mother cpl2 then Dag.Pset.add (get_mother cpl1) set else set | _ -> set ] ; value ind_set_of_relation_path conf base path = let (set, _) = List.fold_left (fun (set, prev_ip) (ip, fl) -> let set = match fl with [ Parent | Child | Self | Mate -> set | Sibling | HalfSibling -> match prev_ip with [ Some prev_ip -> add_common_parent base prev_ip ip set | None -> set ] ] in (Dag.Pset.add ip set, Some ip)) (Dag.Pset.empty, None) (List.rev path) in set ; value print_relationship_dag conf base elem_txt vbar_txt path next_txt = if p_getenv conf.env "new" <> Some "on" then old_print_relationship_dag conf base elem_txt vbar_txt path next_txt else (* This new version is bugged: when displaying e.g. a relationship between a couple passing through other people, the couple family link is added in the dag. Result: the two persons may be displayed in the middle of the dag instead of its ends. Solution to be found. In the mean time, the "old" version is displayed by default (roglo 17 Sep 2005) *) let invert = match Util.p_getenv conf.env "invert" with [ Some "on" -> True | _ -> False ] in let set = ind_set_of_relation_path conf base path in let page_title = capitale (transl conf "relationship") in Dag.make_and_print_dag conf base elem_txt vbar_txt invert set [] page_title next_txt ; value next_relation_link_txt conf ip1 ip2 excl_faml = let bd = match p_getenv conf.env "bd" with [ None | Some ("0" | "") -> "" | Some x -> ";bd=" ^ x ] in let color = match p_getenv conf.env "color" with [ None -> "" | Some x -> ";color=" ^ code_varenv x ] in let (sl, _) = List.fold_left (fun (sl, i) ifam -> ([";ef"; string_of_int i; "="; string_of_int (Adef.int_of_ifam ifam) :: sl], i - 1)) ([], List.length excl_faml - 1) excl_faml in let sl = [commd conf; "em=R;ei="; string_of_int (Adef.int_of_iper ip1); ";i="; string_of_int (Adef.int_of_iper ip2); if p_getenv conf.env "spouse" = Some "on" then ";spouse=on" else ""; if conf.cancel_links then ";cgl=on" else ""; bd; color; ";et=S" :: sl] in String.concat "" sl ; value print_relation_path conf base ip1 ip2 path ifam excl_faml = if path = [] then do { let title _ = Wserver.wprint "%s" (capitale (transl conf "relationship")) in header_no_page_title conf title; trailer conf } else let next_txt = next_relation_link_txt conf ip1 ip2 [ifam :: excl_faml] in let elem_txt p = Dag.Item p "" in let vbar_txt ip = let u = pget conf base ip in let excl_faml = Array.to_list (get_family u) @ excl_faml in next_relation_link_txt conf ip1 ip2 excl_faml in print_relationship_dag conf base elem_txt vbar_txt path next_txt ; type node = [ NotVisited | Visited of (bool * iper * famlink) ] ; value get_shortest_path_relation conf base ip1 ip2 excl_faml = let mark_per = Array.make (nb_of_persons base) NotVisited in let mark_fam = Array.make (nb_of_families base) False in do { List.iter (fun i -> let i = Adef.int_of_ifam i in if i < Array.length mark_fam then mark_fam.(i) := True else ()) excl_faml; let parse_fam ifam = if mark_fam.(Adef.int_of_ifam ifam) then [] else do { let fam = foi base ifam in mark_fam.(Adef.int_of_ifam ifam) := True; let result = [(get_father fam, Parent, ifam); (get_mother fam, Parent, ifam)] in let result = result @ List.fold_right (fun child children -> [(child, Sibling, ifam) :: children]) (Array.to_list (get_children (foi base ifam))) [] in let result = result @ List.fold_right (fun fam children -> if ifam = fam then children else if mark_fam.(Adef.int_of_ifam fam) then children else List.fold_right (fun child children -> [(child, HalfSibling, fam) :: children]) (Array.to_list (get_children (foi base fam))) children) (Array.to_list (get_family (pget conf base (get_father fam)))) [] in let result = result @ List.fold_right (fun fam children -> if ifam = fam then children else if mark_fam.(Adef.int_of_ifam fam) then children else List.fold_right (fun child children -> [(child, HalfSibling, fam) :: children]) (Array.to_list (get_children (foi base fam))) children) (Array.to_list (get_family (pget conf base (get_mother fam)))) [] in result } in let neighbours iper = let result = List.fold_right (fun ifam nb -> if mark_fam.(Adef.int_of_ifam ifam) then nb else do { let fam = foi base ifam in mark_fam.(Adef.int_of_ifam ifam) := True; List.fold_right (fun child children -> [(child, Child, ifam) :: children]) (Array.to_list (get_children fam)) [(get_father fam, Mate, ifam); (get_mother fam, Mate, ifam)] @ nb }) (Array.to_list (get_family (pget conf base iper))) [] in let result = result @ (match get_parents (pget conf base iper) with [ Some ifam -> parse_fam ifam | _ -> [] ]) in result in let rec make_path path vertex = match List.hd path with [ (iper, Self) -> path | (iper, _) -> match mark_per.(Adef.int_of_iper vertex) with [ NotVisited -> assert False | Visited (s, v, f) -> make_path [(vertex, f) :: path] v ] ] in let merge_path p1 p2 = let swap_order el = match el with [ (iper, Parent) -> (iper, Child) | (iper, Child) -> (iper, Parent) | _ -> el ] in List.map2 (fun (ip1, fl1) (ip2, fl2) -> swap_order (ip1, fl2)) (List.rev (List.tl (List.rev p1))) (List.tl p1) @ List.rev p2 in let one_step_further source queue = loop1 [] queue where rec loop1 newvertexlist = fun [ [vertex :: vertexlist] -> let rec loop2 result = fun [ [(iper, fl, ifam) :: neighbourslist] -> match mark_per.(Adef.int_of_iper iper) with [ NotVisited -> do { mark_per.(Adef.int_of_iper iper) := Visited (source, vertex, fl); loop2 [iper :: result] neighbourslist } | Visited (s, v, f) -> if s = source then loop2 result neighbourslist else let p1 = make_path [(iper, fl)] vertex in let p2 = make_path [(iper, f)] v in let path = if source then merge_path p2 p1 else merge_path p1 p2 in Left (path, ifam) ] | [] -> loop1 result vertexlist ] in loop2 newvertexlist (neighbours vertex) | [] -> Right newvertexlist ] in let rec width_search queue1 visited1 queue2 visited2 = if queue1 = [] || queue2 = [] then None else if visited1 > visited2 then let visited2 = visited2 + List.length queue2 in match one_step_further False queue2 with [ Left (path, ifam) -> Some (path, ifam) | Right queue2 -> width_search queue1 visited1 queue2 visited2 ] else let visited1 = visited1 + List.length queue1 in match one_step_further True queue1 with [ Left (path, ifam) -> Some (path, ifam) | Right queue1 -> width_search queue1 visited1 queue2 visited2 ] in mark_per.(Adef.int_of_iper ip1) := Visited (True, ip1, Self); mark_per.(Adef.int_of_iper ip2) := Visited (False, ip2, Self); width_search [ip1] 0 [ip2] 0 } ; value print_shortest_path conf base p1 p2 = let ip1 = get_key_index p1 in let ip2 = get_key_index p2 in if ip1 = ip2 then do { let title _ = Wserver.wprint "%s" (capitale (transl conf "relationship")) in header conf title; Wserver.wprint "%s\n" (capitale (transl conf "it is the same person!")); trailer conf } else (* optimization to be used 1/ if database not too big or 2/ running on machines with much memory *) (* let _ = base.data.ascends.array () in let _ = base.data.unions.array () in let _ = base.data.couples.array () in let _ = base.data.descends.array () in *) (**) let excl_faml = loop [] 0 where rec loop list i = match p_getint conf.env ("ef" ^ string_of_int i) with [ Some k -> loop [Adef.ifam_of_int k :: list] (i + 1) | None -> match find_person_in_env conf base ("ef" ^ string_of_int i) with [ Some p -> let n = match p_getint conf.env ("fef" ^ string_of_int i) with [ Some n -> n | None -> 0 ] in let u = p in let list = if n < Array.length (get_family u) then [(get_family u).(n) :: list] else list in loop list (i + 1) | None -> list ] ] in let title _ = Wserver.wprint "%s" (capitale (transl conf "relationship")) in match get_shortest_path_relation conf base ip1 ip2 excl_faml with [ Some (path, ifam) -> print_relation_path conf base ip1 ip2 path ifam excl_faml | None -> let s1 = gen_person_title_text reference raw_access conf base p1 in let s2 = gen_person_title_text reference raw_access conf base p2 in do { header_no_page_title conf title; if excl_faml = [] then do { Wserver.wprint "

      "; title False; Wserver.wprint "

      \n"; Hutil.print_link_to_welcome conf True; Wserver.wprint "%s.\n" (capitale (cftransl conf "no known relationship link between %s and %s" [s1; s2])); xtag "br"; tag "p" begin stag "span" begin stag "a" "href=\"%s;m=R;%s\"" (commd conf) (acces conf base p1) begin Wserver.wprint "%s" (capitale (transl_nth conf "try another/relationship computing" 0)); end; Wserver.wprint " %s.\n" (transl_nth conf "try another/relationship computing" 1); end; end; } else do { Wserver.wprint "
        \n"; Wserver.wprint "
      • %s
      • \n" s1; Wserver.wprint "
      • %s
      • \n" s2; Wserver.wprint "
      \n" }; trailer conf } ] ; value nb_fields s = loop 1 0 where rec loop cnt i = if i = String.length s then cnt else if s.[i] = '/' then loop (cnt + 1) (i + 1) else loop cnt (i + 1) ; value rec belongs_to_branch ip dist = fun [ [(n, _, ipl) :: lens] -> if n = dist && List.mem ip ipl then True else belongs_to_branch ip dist lens | [] -> False ] ; value get_piece_of_branch conf base (((reltab, list), x), proj) (len1, len2) = let (anc, _) = List.hd list in let rec loop ip dist = if dist <= len1 then [] else let lens = proj reltab.(Adef.int_of_iper ip) in let rec loop1 = fun [ [ifam :: ifaml] -> let rec loop2 = fun [ [ipc :: ipl] -> if belongs_to_branch ipc dist lens then let dist = dist - 1 in if dist <= len2 then [ipc :: loop ipc dist] else loop ipc dist else loop2 ipl | [] -> loop1 ifaml ] in loop2 (Array.to_list (get_children (foi base ifam))) | [] -> [] ] in loop1 (Array.to_list (get_family (pget conf base ip))) in loop (get_key_index anc) x ; value parents_label conf base info = fun [ 1 -> transl conf "the parents" | 2 -> let txt = transl conf "grand-parents" in let is = if nb_fields txt = 2 then match get_piece_of_branch conf base info (1, 1) with [ [ip1] -> if get_sex (pget conf base ip1) = Male then 0 else 1 | _ -> (* must be a bug *) 0 ] else 0 in nth_field txt is | 3 -> let txt = transl conf "great-grand-parents" in let is = if nb_fields txt = 2 then match get_piece_of_branch conf base info (1, 1) with [ [ip1] -> if get_sex (pget conf base ip1) = Male then 0 else 1 | _ -> (* must be a bug *) 0 ] else 0 in nth_field txt is | n -> transl conf "ancestors (some)" ^ " " ^ Printf.sprintf (ftransl conf "of the %s generation") (transl_nth conf "nth (generation)" n) ] ; value parent_in_law_label conf child_sex parent_sex = let txt = transl conf "the father-in-law/the mother-in-law" in let is = index_of_sex parent_sex in if nb_fields txt = 2 then nth_field txt is else nth_field txt (2 * index_of_sex child_sex + is) ; value ancestor_label conf base info x sex = let is = index_of_sex sex in match x with [ 1 -> transl_nth conf "the father/the mother/a parent" is | 2 -> let txt = transl conf "a grandfather/a grandmother/a grandparent" in let is = if nb_fields txt = 6 then match get_piece_of_branch conf base info (1, 1) with [ [ip1] -> if get_sex (pget conf base ip1) = Male then is else is + 3 | _ -> (* must be a bug *) is ] else is in nth_field txt is | 3 -> let txt = transl conf "a great-grandfather/a great-grandmother/a great-grandparent" in let is = if nb_fields txt = 6 then match get_piece_of_branch conf base info (1, 1) with [ [ip1] -> if get_sex (pget conf base ip1) = Male then is else is + 3 | _ -> (* must be a bug *) is ] else is in nth_field txt is | n -> transl_nth conf "an ancestor" is ^ " " ^ Printf.sprintf (ftransl conf "of the %s generation") (transl_nth conf "nth (generation)" n) ] ; value child_in_law_label conf sex_child sex_parent = let txt = transl conf "a son-in-law/a daughter-in-law" in let is = index_of_sex sex_child in if nb_fields txt = 2 then nth_field txt is else nth_field txt (2 * index_of_sex sex_parent + is) ; value descendant_label conf base info x p = let is = index_of_sex (get_sex p) in match x with [ 1 -> transl_nth conf "a son/a daughter/a child" is | 2 -> let txt = transl conf "a grandson/a granddaughter/a grandchild" in let is = if nb_fields txt = 6 then let info = (info, fun r -> r.Consang.lens2) in match get_piece_of_branch conf base info (1, 1) with [ [ip1] -> if get_sex (pget conf base ip1) = Male then is else is + 3 | _ -> (* must be a bug *) is ] else is in nth_field txt is | 3 -> let txt = transl conf "a great-grandson/a great-granddaughter/a great-grandchild" in let is = if nb_fields txt = 12 then let info = (info, fun r -> r.Consang.lens2) in match get_piece_of_branch conf base info (1, 2) with [ [ip1; ip2] -> let is = if get_sex (pget conf base ip1) = Male then is else is + 6 in if get_sex (pget conf base ip2) = Male then is else is + 3 | _ -> (* must be a bug *) is ] else is in nth_field txt is | n -> transl_nth conf "a descendant" is ^ " " ^ Printf.sprintf (ftransl conf "of the %s generation") (transl_nth conf "nth (generation)" n) ] ; value brother_label conf x sex = let is = index_of_sex sex in match x with [ 1 -> transl_nth conf "a brother/a sister/a sibling" is | 2 -> transl_nth conf "a cousin" is | 3 -> transl_nth conf "a 2nd cousin" is | 4 -> transl_nth conf "a 3rd cousin" is | n -> Printf.sprintf (ftransl_nth conf "a %s cousin" is) (transl_nth conf "nth (cousin)" (n - 1)) ] ; value half_brother_label conf sex = let is = index_of_sex sex in transl_nth conf "a half-brother/a half-sister/a half-sibling" is ; value brother_in_law_label conf brother_sex self_sex = let txt = transl conf "a brother-in-law/a sister-in-law" in let is = index_of_sex brother_sex in if nb_fields txt = 2 then nth_field txt is else nth_field txt (2 * index_of_sex self_sex + is) ; value uncle_label conf base info x p = let is = index_of_sex (get_sex p) in match x with [ 1 -> let txt = transl conf "an uncle/an aunt" in let is = if nb_fields txt = 4 then let info = (info, fun r -> r.Consang.lens1) in match get_piece_of_branch conf base info (1, 1) with [ [ip1] -> if get_sex (pget conf base ip1) = Male then is else is + 2 | _ -> (* must be a bug *) is ] else is in nth_field txt is | 2 -> let txt = transl conf "a great-uncle/a great-aunt" in let is = if nb_fields txt = 4 then let info = (info, fun r -> r.Consang.lens1) in match get_piece_of_branch conf base info (1, 1) with [ [ip1] -> if get_sex (pget conf base ip1) = Male then is else is + 2 | _ -> (* must be a bug *) is ] else is in nth_field txt is | n -> transl_nth conf "an uncle/an aunt" is ^ " " ^ Printf.sprintf (ftransl conf "of the %s generation") (transl_nth conf "nth (generation)" n) ] ; value nephew_label conf x p = let is = index_of_sex (get_sex p) in match x with [ 1 -> transl_nth conf "a nephew/a niece" is | 2 -> transl_nth conf "a great-nephew/a great-niece" is | n -> transl_nth conf "a nephew/a niece" is ^ " " ^ Printf.sprintf (ftransl conf "of the %s generation") (transl_nth conf "nth (generation)" n) ] ; value same_parents conf base p1 p2 = get_parents (pget conf base (get_key_index p1)) = get_parents (pget conf base (get_key_index p2)) ; value print_link_name conf base n p1 p2 sol = let (pp1, pp2, (x1, x2, list), reltab) = sol in let info = (reltab, list) in do { Wserver.wprint "%s" (if (is_hide_names conf p2) && not (fast_auth_age conf p2) then "x x" else person_title_text conf base p2); Wserver.wprint " %s" (transl conf "is"); if n > 1 then Wserver.wprint " %s" (transl conf "also") else (); Wserver.wprint "\n"; let (s, sp1, sp2) = let ini_p1 = p1 and ini_p2 = p2 in let p1 = match pp1 with [ Some p1 -> p1 | _ -> p1 ] in let p2 = match pp2 with [ Some p2 -> p2 | _ -> p2 ] in let sp1 = pp1 <> None in let sp2 = pp2 <> None in if x2 = 0 then if sp1 && x1 = 1 then (parent_in_law_label conf (get_sex ini_p1) (get_sex ini_p2), False, sp2) else let info = ((info, x1), fun r -> r.Consang.lens1) in (ancestor_label conf base info x1 (get_sex p2), sp1, sp2) else if x1 = 0 then if sp2 && x2 = 1 then (child_in_law_label conf (get_sex ini_p2) (get_sex ini_p1), sp1, False) else (descendant_label conf base (info, x2) x2 p2, sp1, sp2) else if x2 = x1 then if x2 = 1 && not (same_parents conf base p2 p1) then (half_brother_label conf (get_sex p2), sp1, sp2) else if x2 = 1 && (sp2 || sp1) && get_sex p2 <> Neuter then (brother_in_law_label conf (get_sex ini_p2) (get_sex ini_p1), False, False) else (brother_label conf x1 (get_sex p2), sp1, sp2) else if x2 = 1 then (uncle_label conf base (info, x1) (x1 - x2) p2, sp1, sp2) else if x1 = 1 then (nephew_label conf (x2 - x1) p2, sp1, sp2) else if x2 < x1 then let s = let info = ((info, x1), fun r -> r.Consang.lens1) in transl_a_of_gr_eq_gen_lev conf (brother_label conf x2 (get_sex p2)) (ancestor_label conf base info (x1 - x2) Neuter) in (s, sp1, sp2) else let s = let sm = brother_label conf x1 Male in let sf = brother_label conf x1 Female in let d = descendant_label conf base (info, x2) (x2 - x1) p2 in let s = if sm = sf then sm else let info = ((info, x2), fun r -> r.Consang.lens2) in match get_piece_of_branch conf base info (x2 - x1, x2 - x1) with [ [ip2] -> if get_sex (pget conf base ip2) = Male then sm else sf | _ -> sm ] in transl_a_of_gr_eq_gen_lev conf d s in (s, sp1, sp2) in let s = if sp2 then transl_a_of_gr_eq_gen_lev conf (transl_nth conf "the spouse" (index_of_sex (get_sex p2))) s else s in let s = if sp1 then match pp1 with [ Some pp1 -> transl_a_of_gr_eq_gen_lev conf s (transl_nth conf "the spouse" (index_of_sex (get_sex pp1))) | None -> s ] else s in let s1 = "" ^ std_color conf s ^ "" in let s2 = if (is_hide_names conf p1) && not (fast_auth_age conf p1) then "x x" else gen_person_title_text no_reference raw_access conf base p1 in let s = if x2 < x1 then transl_a_of_b conf s1 s2 else transl_a_of_gr_eq_gen_lev conf s1 s2 in Wserver.wprint "%s.\n" (Util.translate_eval s) } ; value wprint_num conf n = Num.print (fun x -> Wserver.wprint "%s" x) (transl conf "(thousand separator)") n ; value string_of_big_int conf i = let sep = transl conf "(thousand separator)" in let rec glop i = if i = 0 then "" else let s = glop (i / 1000) in if s = "" then string_of_int (i mod 1000) else s ^ sep ^ Printf.sprintf "%03d" (i mod 1000) in glop i ; value print_solution_ancestor conf base long p1 p2 pp1 pp2 x1 x2 list = let image_opt = match p_getenv conf.env "image" with [ Some "on" -> ";image=on" | _ -> "" ] in tag "ul" begin List.iter (fun (a, n) -> stag "li" begin Wserver.wprint "%s %s" (if n < 0 then "***" else string_of_big_int conf n) (transl_nth conf "branch/branches" (if n = 1 then 0 else 1)); Wserver.wprint "\n"; if not long then do { let propose_dag = n > 1 && n <= 10 in Wserver.wprint ":\n "; let dp1 = match pp1 with [ Some p -> p | _ -> p1 ] in let dp2 = match pp2 with [ Some p -> p | _ -> p2 ] in xtag "img" "src=\"%s/%s\" alt=\"\"" (Util.image_prefix conf) "picto_rel_small.png"; stag "a" "href=\"%sm=RL;%s;l1=%d;%s;l2=%d;%s%s%s%s%s\"" (commd conf) (acces conf base a) x1 (acces_n conf base "1" dp1) x2 (acces_n conf base "2" dp2) (if pp1 = None then "" else ";" ^ acces_n conf base "3" p1) (if pp2 = None then "" else ";" ^ acces_n conf base "4" p2) (if propose_dag then ";dag=on" else "") image_opt begin Wserver.wprint "%s" (capitale (transl conf "see")); if n > 1 && not propose_dag then Wserver.wprint "%s" (transl conf " the first branch") else (); end; } else (); end) list; end ; value print_solution_not_ancestor conf base long p1 p2 sol = let (pp1, pp2, (x1, x2, list), reltab) = sol in let image_opt = match p_getenv conf.env "image" with [ Some "on" -> ";image=on" | _ -> "" ] in tag "ul" "class=li_relationship" begin tag "li" begin Wserver.wprint "%s\n" (capitale (transl conf "indeed,")); tag "ul" begin List.iter (fun (a, n) -> tag "li" begin Wserver.wprint "%s" (person_title_text conf base a); Wserver.wprint "\n("; Wserver.wprint "%d %s" n (transl_nth conf "relationship link/relationship links" (if n = 1 then 0 else 1)); Wserver.wprint ")\n "; if not long then do { let propose_dag = n > 1 && n <= 10 in let dp1 = match pp1 with [ Some p -> p | _ -> p1 ] in let dp2 = match pp2 with [ Some p -> p | _ -> p2 ] in xtag "img" "src=\"%s/%s\" alt=\"\"" (Util.image_prefix conf) "picto_rel_small.png"; stag "a" "href=\"%sm=RL;%s;l1=%d;%s;l2=%d;%s%s%s%s%s\"" (commd conf) (acces conf base a) x1 (acces_n conf base "1" dp1) x2 (acces_n conf base "2" dp2) (if pp1 = None then "" else ";" ^ acces_n conf base "3" p1) (if pp2 = None then "" else ";" ^ acces_n conf base "4" p2) (if propose_dag then ";dag=on" else "") image_opt begin Wserver.wprint "%s" (capitale (transl conf "see")); end; } else (); end) list; end; let is_are = match list with [ [_] -> transl conf "is" | _ -> transl conf "are" ] in Wserver.wprint "%s %s\n" is_are (transl conf "at the same time"); let lab proj x = let info = (((reltab, list), x), proj) in match list with [ [(a, _)] -> ancestor_label conf base info x (get_sex a) | _ -> parents_label conf base info x ] in let print pp p alab = let s = gen_person_title_text no_reference raw_access conf base p in let s = match pp with [ None -> transl_a_of_b conf alab s | Some pp -> transl_a_of_gr_eq_gen_lev conf (transl_a_of_b conf alab (transl_nth conf "the spouse" (index_of_sex (get_sex pp)))) s ] in Wserver.wprint "%s\n" (Util.translate_eval s) in tag "ul" begin tag "li" begin print pp1 p1 (lab (fun r -> r.Consang.lens1) x1); end; tag "li" begin print pp2 p2 (lab (fun r -> r.Consang.lens2) x2); end; end; end; end ; value print_solution conf base long n p1 p2 sol = let (pp1, pp2, (x1, x2, list), reltab) = sol in do { tag "p" begin xtag "img" "src=\"%s/%s\" alt=\"\"" (Util.image_prefix conf) "picto_fleche_bleu.png"; print_link_name conf base n p1 p2 sol; end; if x1 = 0 || x2 = 0 then print_solution_ancestor conf base long p1 p2 pp1 pp2 x1 x2 list else print_solution_not_ancestor conf base long p1 p2 sol; Wserver.wprint "\n" } ; open RelationLink; value max_br = 33; value print_dag_links conf base p1 p2 rl = let module O = struct type t = iper; value compare = compare; end in let module M = Map.Make O in let anc_map = List.fold_left (fun anc_map (pp1, pp2, (x1, x2, list), _) -> List.fold_left (fun anc_map (p, n) -> let (pp1, pp2, nn, nt, maxlev) = try M.find (get_key_index p) anc_map with [ Not_found -> (pp1, pp2, 0, 0, 0) ] in if nn >= max_br then anc_map else let v = (pp1, pp2, nn + n, nt + 1, max maxlev (max x1 x2)) in M.add (get_key_index p) v anc_map) anc_map list) M.empty rl in let is_anc = match rl with [ [(_, _, (x1, x2, _), _) :: _] -> x1 = 0 || x2 = 0 | _ -> False ] in let something = M.fold (fun ip (_, _, nn, nt, maxlev) something -> something || nt > 1 && nn > 1 && nn < max_br) anc_map False in if something then do { let rest = ref False in if is_anc then xtag "img" "src=\"%s/%s\" alt=\"\"" (Util.image_prefix conf) "picto_fleche_bleu.png" else Wserver.wprint "\n" } else () ; value print_propose_upto conf base p1 p2 rl = match rl with [ [(None, None, (x1, x2, _), _) :: _] when x1 = 0 || x2 = 0 -> let maxlen = List.fold_right (fun (_, _, (x1, x2, _), _) maxlen -> max maxlen (max x1 x2)) rl 0 in let (p, a) = if x1 = 0 then (p2, p1) else (p1, p2) in tag "p" begin xtag "img" "src=\"%s/%s\" alt=\"\"" (Util.image_prefix conf) "picto_fleche_bleu.png"; Wserver.wprint ""; Wserver.wprint "%s" (capitale (translate_eval (transl_a_of_b conf (transl conf "ancestors") (person_title_text conf base p)))); Wserver.wprint " %s" (transl_decline conf "up to" (person_title_text conf base a)); Wserver.wprint "\n "; xtag "img" "src=\"%s/%s\" alt=\"\"" (Util.image_prefix conf) "picto_rel_asc.png"; stag "a" "href=\"%sm=A;t=D;%s;%s;l=%d\"" (commd conf) (acces conf base p) (acces_n conf base "1" a) maxlen begin Wserver.wprint "%s" (capitale (transl conf "see")); end; Wserver.wprint "\n"; end | _ -> () ] ; value compute_simple_relationship conf base tstab ip1 ip2 = let tab = Consang.make_relationship_info base tstab in let (relationship, ancestors) = Consang.relationship_and_links base tab True ip1 ip2 in if ancestors = [] then None else let total = try List.fold_left (fun n i -> let u = tab.Consang.reltab.(i) in List.fold_left (fun n (_, n1, _) -> let n1 = if n1 < 0 then raise Exit else Num.of_int n1 in List.fold_left (fun n (_, n2, _) -> Num.add n (Num.mul n1 n2)) n u.Consang.lens1) n u.Consang.lens2) Num.zero ancestors with [ Exit -> Num.zero ] in let rl = List.fold_left (fun rl i -> let u = tab.Consang.reltab.(i) in let p = pget conf base (Adef.iper_of_int i) in List.fold_left (fun rl (len1, n1, _) -> List.fold_left (fun rl (len2, n2, _) -> let n = n1 * n2 in let n = if n1 < 0 || n2 < 0 || n < 0 then -1 else n in [(len1, len2, (p, n)) :: rl]) rl u.Consang.lens2) rl u.Consang.lens1) [] ancestors in let rl = List.sort (fun (len11, len12, _) (len21, len22, _) -> if len11 + len12 > len21 + len22 then -1 else if len11 + len12 < len21 + len22 then 1 else compare len21 len11) rl in let rl = List.fold_left (fun l (len1, len2, sol) -> match l with [ [(l1, l2, sols) :: l] when len1 = l1 && len2 = l2 -> [(l1, l2, [sol :: sols]) :: l] | _ -> [(len1, len2, [sol]) :: l] ]) [] rl in Some (rl, total, relationship, tab.Consang.reltab) ; value known_spouses_list conf base p excl_p = let u = p in List.fold_left (fun spl ifam -> let sp = pget conf base (spouse (get_key_index p) (foi base ifam)) in if sou base (get_first_name sp) <> "?" && sou base (get_surname sp) <> "?" && get_key_index sp <> get_key_index excl_p then [sp :: spl] else spl) [] (Array.to_list (get_family u)) ; value merge_relations rl1 rl2 = List.merge (fun (po11, po12, (l11, l12, _), _) (po21, po22, (l21, l22, _), _) -> if l11 + l12 < l21 + l22 then -1 else if l11 + l12 > l21 + l22 then 1 else if l11 < l21 then -1 else if l11 > l21 then 1 else if po11 = None && po12 = None then -1 else if po21 = None && po22 = None then 1 else if po11 = None || po21 = None then -1 else if po21 = None || po22 = None then 1 else -1) rl1 rl2 ; value combine_relationship conf base tstab pl1 pl2 f_sp1 f_sp2 sl = List.fold_right (fun p1 sl -> List.fold_right (fun p2 sl -> let sol = compute_simple_relationship conf base tstab (get_key_index p1) (get_key_index p2) in match sol with [ Some (rl, total, _, reltab) -> let s = List.map (fun r -> (f_sp1 p1, f_sp2 p2, r)) rl in [(s, total, reltab) :: sl] | None -> sl ]) pl2 sl) pl1 sl ; value sp p = Some p; value no_sp p = None; value compute_relationship conf base by_marr p1 p2 = let ip1 = get_key_index p1 in let ip2 = get_key_index p2 in if ip1 = ip2 then None else (* optimization to be used 1/ if database not too big or 2/ running on machines with much memory *) (* let _ = base.data.ascends.array () in let _ = base.data.couples.array () in *) (**) let tstab = Util.create_topological_sort conf base in let sol = compute_simple_relationship conf base tstab ip1 ip2 in let sol_by_marr = if by_marr then let spl1 = known_spouses_list conf base p1 p2 in let spl2 = known_spouses_list conf base p2 p1 in let sl = [] in let sl = match sol with [ Some ([(_, 0, _) :: _], _, _, _) -> sl | _ -> combine_relationship conf base tstab [p1] spl2 no_sp sp sl ] in let sl = match sol with [ Some ([(0, _, _) :: _], _, _, _) -> sl | _ -> combine_relationship conf base tstab spl1 [p2] sp no_sp sl ] in match (sol, sl) with [ (Some ([(x1, x2, _) :: _], _, _, _), _) when x1 = 0 || x2 = 0 -> sl | (_, [([(_, _, (x1, x2, _)) :: _], _, _) :: _]) when x1 = 0 || x2 = 0 -> sl | _ -> combine_relationship conf base tstab spl1 spl2 sp sp sl ] else [] in let (all_sol, rel) = match sol with [ Some (rl, total, rel, reltab) -> let s = List.map (fun r -> (None, None, r)) rl in ([(s, total, reltab) :: sol_by_marr], rel) | None -> (sol_by_marr, 0.0) ] in let (sl, total) = List.fold_right (fun (rl1, total1, reltab) (rl, total) -> let rl1 = List.map (fun (po1, po2, list) -> (po1, po2, list, reltab)) rl1 in (merge_relations rl1 rl, Num.add total1 total)) all_sol ([], Num.zero) in if sl = [] then None else Some (sl, total, rel) ; value print_one_path conf base found a p1 p2 pp1 pp2 l1 l2 = let ip = get_key_index a in let sp1 = match pp1 with [ Some _ -> Some p1 | _ -> None ] in let sp2 = match pp2 with [ Some _ -> Some p2 | _ -> None ] in let p1 = match pp1 with [ Some p1 -> p1 | _ -> p1 ] in let p2 = match pp2 with [ Some p2 -> p2 | _ -> p2 ] in let ip1 = get_key_index p1 in let ip2 = get_key_index p2 in let dist = RelationLink.make_dist_tab conf base ip (max l1 l2 + 1) in let b1 = RelationLink.find_first_branch conf base dist ip l1 ip1 Neuter in let b2 = RelationLink.find_first_branch conf base dist ip l2 ip2 Neuter in match (b1, b2) with [ (Some b1, Some b2) -> let bd = match p_getint conf.env "bd" with [ Some x -> x | None -> 0 ] in let td_prop = match Util.p_getenv conf.env "td" with [ Some x -> " " ^ x | _ -> match Util.p_getenv conf.env "color" with [ None | Some "" -> "" | Some x -> " class=\"" ^ x ^ "\"" ] ] in let info = {ip = ip; sp = get_sex a; ip1 = ip1; ip2 = ip2; b1 = b1; b2 = b2; c1 = 1; c2 = 1; pb1 = None; pb2 = None; nb1 = None; nb2 = None; sp1 = sp1; sp2 = sp2; bd = bd; td_prop = td_prop} in if List.mem (b1, b2) found.val then () else do { Wserver.wprint "
      \n"; tag "table" begin tag "tr" begin tag "td" begin RelationLink.print_relation_path conf base info; end; end; end; Wserver.wprint "
      \n"; found.val := [(b1, b2) :: found.val] } | _ -> () ] ; value print_path conf base i p1 p2 (pp1, pp2, (l1, l2, list), _) = let found = ref [] in do { List.iter (fun (a, n) -> print_one_path conf base found a p1 p2 pp1 pp2 l1 l2) list; Wserver.wprint "\n" } ; value print_main_relationship conf base long p1 p2 rel = let total = match rel with [ None -> Num.zero | Some (_, total, _) -> total ] in let title _ = do { Wserver.wprint "%s" (capitale (transl conf "relationship")); if Num.eq total Num.zero then () else do { Wserver.wprint " ("; wprint_num conf total; Wserver.wprint " %s)" (transl_nth conf "relationship link/relationship links" (if Num.eq total Num.one then 0 else 1)) } } in do { let conf = if long then (* changing doctype to transitional because use of
      *) let doctype = match p_getenv conf.base_env "doctype" with [ Some ("html-4.01" | "html-4.01-trans") -> "html-4.01-trans" | _ -> "xhtml-1.0-trans" ] in {(conf) with base_env = [("doctype", doctype) :: conf.base_env]} else conf in header conf title; print_link_to_welcome conf True; match p_getenv conf.env "spouse" with [ Some "on" -> conf.senv := conf.senv @ [("spouse", "on")] | _ -> () ]; match p_getenv conf.env "cgl" with [ Some "on" -> conf.senv := conf.senv @ [("cgl", "on")] | _ -> () ]; match p_getenv conf.env "bd" with [ None | Some ("0" | "") -> () | Some x -> conf.senv := conf.senv @ [("bd", x)] ]; match p_getenv conf.env "color" with [ None | Some "" -> () | Some x -> conf.senv := conf.senv @ [("color", code_varenv x)] ]; match rel with [ None -> if get_key_index p1 = get_key_index p2 then Wserver.wprint "%s\n" (capitale (transl conf "it is the same person!")) else do { Wserver.wprint "%s.\n" (capitale (cftransl conf "no known relationship link between %s and %s" [gen_person_title_text reference raw_access conf base p1; gen_person_title_text reference raw_access conf base p2])); xtag "br"; tag "p" begin stag "span" begin stag "a" "href=\"%s;m=R;%s\"" (commd conf) (acces conf base p1) begin Wserver.wprint "%s" (capitale (transl_nth conf "try another/relationship computing" 0)); end; Wserver.wprint " %s.\n" (transl_nth conf "try another/relationship computing" 1); end; end; } | Some (rl, total, relationship) -> let a1 = p1 in let a2 = p2 in let all_by_marr = List.for_all (fun [ (Some _, _, _, _) | (_, Some _, _, _) -> True | _ -> False ]) rl in let _ = List.fold_left (fun i sol -> do { print_solution conf base long i p1 p2 sol; if long then print_path conf base i p1 p2 sol else (); succ i }) 1 rl in do { Wserver.wprint "\n"; if long then () else print_dag_links conf base p1 p2 rl; if not all_by_marr && authorized_age conf base p1 && authorized_age conf base p2 && get_consang a1 != Adef.fix (-1) && get_consang a2 != Adef.fix (-1) then tag "p" begin Wserver.wprint "%s: %s%%" (capitale (transl conf "relationship")) (string_of_decimal_num conf (round_2_dec (Adef.float_of_fix (Adef.fix_of_float relationship) *. 100.0))); end else (); print_propose_upto conf base p1 p2 rl } ]; trailer conf } ; value multi_relation_next_txt conf pl2 lim assoc_txt = match pl2 with [ [] -> "" | _ -> let sl = if lim > 0 then [";lim="; string_of_int lim] else [] in let (sl, _) = List.fold_left (fun (sl, n) p -> let sl = try let t = Hashtbl.find assoc_txt (get_key_index p) in [";t"; string_of_int n; "="; t :: sl] with [ Not_found -> sl ] in let sl = [";i"; string_of_int n; "="; string_of_int (Adef.int_of_iper (get_key_index p)) :: sl] in (sl, n - 1)) (sl, List.length pl2) (List.rev pl2) in let sl = [commd conf; "m=RLM" :: sl] in String.concat "" sl ] ; value print_no_relationship conf base pl = let title _ = Wserver.wprint "%s" (capitale (transl conf "tree")) in do { header conf title; tag "ul" begin List.iter (fun p -> Wserver.wprint "
    • %s\n" (referenced_person_title_text conf base p)) pl; end; trailer conf } ; value print_multi_relation conf base pl lim assoc_txt = let (pl1, pl2) = if lim <= 0 then (pl, []) else let rec loop n rev_pl1 pl2 = match (n, pl2) with [ (_, []) | (_, [_]) -> (pl, []) | (0, _) -> match rev_pl1 with [ [p :: _] -> (List.rev rev_pl1, [p :: pl2]) | _ -> (pl, []) ] | (n, [p :: pl]) -> loop (n - 1) [p :: rev_pl1] pl ] in loop lim [] pl in let path = loop [] pl1 where rec loop path = fun [ [p1 :: ([p2 :: _] as pl)] -> let ip1 = get_key_index p1 in let ip2 = get_key_index p2 in match get_shortest_path_relation conf base ip1 ip2 [] with [ Some (path1, _) -> let path = match path with [ [] -> path1 | _ -> match List.rev path1 with [ [_ :: path1] -> List.rev path1 @ path | [] -> path ] ] in loop path pl | None -> loop path pl ] | [_] | [] -> path ] in if path = [] then print_no_relationship conf base pl else let elem_txt p = Dag.Item p (try let t = Hashtbl.find assoc_txt (get_key_index p) in "(" ^ t ^ ")" with [ Not_found -> "" ]) in let vbar_txt ip = "" in let next_txt = multi_relation_next_txt conf pl2 lim assoc_txt in print_relationship_dag conf base elem_txt vbar_txt path next_txt ; value print_base_loop conf base p = let title _ = Wserver.wprint "%s" (capitale (transl conf "error")) in do { rheader conf title; Wserver.wprint (fcapitale (ftransl conf "loop in database: %s is his/her own ancestor")) (Util.update_family_loop conf base p (designation base p)); Wserver.wprint ".\n"; trailer conf } ; value relmenu_print = Perso.interp_templ "relmenu"; value print conf base p = fun [ Some p1 -> match p_getenv conf.env "et" with [ Some "S" -> print_shortest_path conf base p1 p | x -> let by_marr = x = Some "M" in let long = match p_getenv conf.env "long" with [ Some "on" -> True | _ -> False ] in match try Left (compute_relationship conf base by_marr p1 p) with [ Consang.TopologicalSortError p -> Right p ] with [ Left rel -> print_main_relationship conf base long p1 p rel | Right p -> print_base_loop conf base p ] ] | None -> relmenu_print conf base p ] ; value print_multi conf base = let assoc_txt = Hashtbl.create 53 in let pl = loop [] 1 where rec loop pl i = let k = string_of_int i in match find_person_in_env conf base k with [ Some p -> do { match p_getenv conf.env ("t" ^ k) with [ Some x -> Hashtbl.add assoc_txt (get_key_index p) x | None -> () ]; loop [p :: pl] (i + 1) } | None -> List.rev pl ] in let lim = match p_getint conf.env "lim" with [ Some x -> x | None -> 0 ] in print_multi_relation conf base pl lim assoc_txt ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/gwu.ml0000660000175200017530000013506212664543647022353 0ustar guillaumeguillaume(* $Id: gwu.ml,v 5.45 2012-01-19 06:28:42 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Def; open Gutil; open Gwdb; open Printf; type mfam = { m_ifam : ifam; m_fam : family; m_fath : person; m_moth : person; m_chil : array person } ; value soy y = if y = 0 then "-0" else string_of_int y; value print_date_dmy oc d = do { match d.prec with [ About -> fprintf oc "~" | Maybe -> fprintf oc "?" | Before -> fprintf oc "<" | After -> fprintf oc ">" | _ -> () ]; if (*d.day = 0 &&*) d.month = 0 then fprintf oc "%s" (soy d.year) else if d.day = 0 then fprintf oc "%d/%s" d.month (soy d.year) else fprintf oc "%d/%d/%s" d.day d.month (soy d.year); match d.prec with [ OrYear y -> fprintf oc "|%s" (soy y) | YearInt y -> fprintf oc "..%s" (soy y) | _ -> () ] } ; value is_printable = fun [ '\000'..'\031' -> False | _ -> True ] ; value spaces_to_underscore s = do { for i = 0 to String.length s - 1 do { if s.[i] = ' ' then Bytes.set s i '_' else () }; s } ; value starting_char no_num s = match s.[0] with [ 'a'..'z' | 'A'..'Z' | 'à'..'ý' | 'À'..'Ý' -> True | '0'..'9' -> not no_num | '?' -> if s = "?" then True else False | _ -> False ] ; value no_newlines s = let s' = Bytes.create (String.length s) in do { for i = 0 to String.length s - 1 do { Bytes.set s' i (match s.[i] with [ '\n' | '\r' -> ' ' | _ -> s.[i] ]) }; s' } ; value raw_output = ref False; value no_picture = ref False; value gen_correct_string no_num no_colon s = let s = strip_spaces s in let s = if Mutil.utf_8_db.val || raw_output.val then s else Mutil.utf_8_of_iso_8859_1 s in loop 0 0 where rec loop i len = if i = String.length s then Buff.get len else if len = 0 && not (starting_char no_num s) then loop i (Buff.store len '_') else match s.[i] with [ ' ' | '\n' | '\t' -> if i = String.length s - 1 then Buff.get len else loop (i + 1) (Buff.store len '_') | '_' | '\\' -> loop (i + 1) (Buff.store (Buff.store len '\\') s.[i]) | ':' when no_colon -> let len = Buff.store len '\\' in loop (i + 1) (Buff.store (Buff.store len '\\') s.[i]) | c -> let c = if is_printable c then c else '_' in loop (i + 1) (Buff.store len c) ] ; value s_correct_string s = let s = gen_correct_string False False s in if s = "" then "_" else s ; value s_correct_string_nonum s = let s = gen_correct_string True False s in if s = "" then "_" else s ; value correct_string base is = s_correct_string (sou base is); value correct_string_no_colon base is = gen_correct_string False True (sou base is) ; value gen_print_date no_colon oc = fun [ Dgreg d Dgregorian -> print_date_dmy oc d | Dgreg d Djulian -> do { print_date_dmy oc (Calendar.julian_of_gregorian d); fprintf oc "J" } | Dgreg d Dfrench -> do { print_date_dmy oc (Calendar.french_of_gregorian d); fprintf oc "F" } | Dgreg d Dhebrew -> do { print_date_dmy oc (Calendar.hebrew_of_gregorian d); fprintf oc "H" } | Dtext t -> (* Dans le cas d'une date texte pour un titre, on échappe les ':' *) let t = gen_correct_string False no_colon (spaces_to_underscore t) in fprintf oc "0(%s)" t ] ; value gen_print_date_option no_colon oc = fun [ Some d -> gen_print_date no_colon oc d | None -> () ] ; value print_date oc = gen_print_date False oc; value print_date_option oc = gen_print_date_option False oc; value print_title_date_option oc = gen_print_date_option True oc; value has_infos_not_dates base p = get_first_names_aliases p <> [] || get_surnames_aliases p <> [] || sou base (get_public_name p) <> "" || get_qualifiers p <> [] || get_aliases p <> [] || get_titles p <> [] || sou base (get_occupation p) <> "" || sou base (get_birth_place p) <> "" || sou base (get_baptism_place p) <> "" || sou base (get_death_place p) <> "" || sou base (get_psources p) <> "" ; value has_infos base p = has_infos_not_dates base p || get_birth p <> Adef.codate_None || get_baptism p <> Adef.codate_None || get_death p <> NotDead ; value print_if_not_equal_to x oc base lab is = if sou base is = x then () else fprintf oc " %s %s" lab (correct_string base is) ; value print_if_no_empty = print_if_not_equal_to ""; value print_first_name_alias oc base is = fprintf oc " {%s}" (correct_string base is) ; value print_surname_alias oc base is = fprintf oc " #salias %s" (correct_string base is) ; value print_qualifier oc base is = fprintf oc " #nick %s" (correct_string base is) ; value print_alias oc base is = fprintf oc " #alias %s" (correct_string base is) ; value print_burial oc base b = match b with [ Buried cod -> do { fprintf oc " #buri"; match Adef.od_of_codate cod with [ Some d -> do { fprintf oc " "; print_date oc d; () } | _ -> () ] } | Cremated cod -> do { fprintf oc " #crem"; match Adef.od_of_codate cod with [ Some d -> do { fprintf oc " "; print_date oc d; () } | _ -> () ] } | UnknownBurial -> () ] ; value print_title oc base t = let t_date_start = Adef.od_of_codate t.t_date_start in let t_date_end = Adef.od_of_codate t.t_date_end in do { fprintf oc " ["; match t.t_name with [ Tmain -> fprintf oc "*" | Tname s -> fprintf oc "%s" (correct_string_no_colon base s) | Tnone -> () ]; fprintf oc ":"; fprintf oc "%s" (correct_string_no_colon base t.t_ident); fprintf oc ":"; fprintf oc "%s" (correct_string_no_colon base t.t_place); if t.t_nth <> 0 then fprintf oc ":" else match (t_date_start, t_date_end) with [ (Some _, _) | (_, Some _) -> fprintf oc ":" | _ -> () ]; print_title_date_option oc t_date_start; if t.t_nth <> 0 then fprintf oc ":" else match t_date_end with [ Some _ -> fprintf oc ":" | _ -> () ]; print_title_date_option oc t_date_end; if t.t_nth <> 0 then fprintf oc ":%d" t.t_nth else (); fprintf oc "]" } ; value print_infos oc base is_child csrc cbp p = do { List.iter (print_first_name_alias oc base) (get_first_names_aliases p); List.iter (print_surname_alias oc base) (get_surnames_aliases p); match get_public_name p with [ s when sou base s <> "" -> fprintf oc " (%s)" (correct_string base s) | _ -> () ]; if not no_picture.val then print_if_no_empty oc base "#image" (get_image p) else (); List.iter (print_qualifier oc base) (get_qualifiers p); List.iter (print_alias oc base) (get_aliases p); List.iter (print_title oc base) (get_titles p); match get_access p with [ IfTitles -> () | Public -> fprintf oc " #apubl" | Private -> fprintf oc " #apriv" ]; print_if_no_empty oc base "#occu" (get_occupation p); print_if_not_equal_to csrc oc base "#src" (get_psources p); match Adef.od_of_codate (get_birth p) with [ Some d -> do { fprintf oc " "; print_date oc d } | _ -> if get_baptism p <> Adef.codate_None then () else match get_death p with [ Death _ _ | DeadYoung | DeadDontKnowWhen | OfCourseDead -> fprintf oc " 0" | DontKnowIfDead when not is_child && not (has_infos_not_dates base p) && p_first_name base p <> "?" && p_surname base p <> "?" -> fprintf oc " 0" | _ -> () ] ]; print_if_not_equal_to cbp oc base "#bp" (get_birth_place p); print_if_no_empty oc base "#bs" (get_birth_src p); match Adef.od_of_codate (get_baptism p) with [ Some d -> do { fprintf oc " !"; print_date oc d } | _ -> () ]; print_if_no_empty oc base "#pp" (get_baptism_place p); print_if_no_empty oc base "#ps" (get_baptism_src p); match get_death p with [ Death dr d -> do { fprintf oc " "; match dr with [ Killed -> fprintf oc "k" | Murdered -> fprintf oc "m" | Executed -> fprintf oc "e" | Disappeared -> fprintf oc "s" | _ -> () ]; print_date oc (Adef.date_of_cdate d) } | DeadYoung -> fprintf oc " mj" | DeadDontKnowWhen -> fprintf oc " 0" | DontKnowIfDead -> match (Adef.od_of_codate (get_birth p), Adef.od_of_codate (get_baptism p)) with [ (Some _, _) | (_, Some _) -> fprintf oc " ?" | _ -> () ] | OfCourseDead -> fprintf oc " od" | NotDead -> () ]; print_if_no_empty oc base "#dp" (get_death_place p); print_if_no_empty oc base "#ds" (get_death_src p); print_burial oc base (get_burial p); print_if_no_empty oc base "#rp" (get_burial_place p); print_if_no_empty oc base "#rs" (get_burial_src p) } ; type gen = { mark : array bool; per_sel : iper -> bool; fam_sel : ifam -> bool; fam_done : array bool; notes_pl_p : mutable list person; ext_files : mutable list (string * ref (list string)); notes_alias : mutable list (string * string) } ; value map_notes aliases f = try List.assoc f aliases with [ Not_found -> f ] ; value add_linked_files gen from s some_linked_files = let slen = String.length s in loop some_linked_files 0 where rec loop new_linked_files i = if i = slen then new_linked_files else if i < slen - 2 && s.[i] = '[' && s.[i+1] = '[' && s.[i+2] = '[' then let j = loop (i + 3) where rec loop j = if j = slen then j else if j < slen - 2 && s.[j] = ']' && s.[j+1] = ']' && s.[j+2] = ']' then j + 3 else loop (j + 1) in if j > i + 6 then let b = String.sub s (i + 3) (j - i - 6) in let fname = try let k = String.index b '/' in String.sub b 0 k with [ Not_found -> b ] in let fname = map_notes gen.notes_alias fname in let f = from () in let new_linked_files = try let r = List.assoc fname gen.ext_files in do { if List.mem f r.val then () else r.val := [f :: r.val]; new_linked_files } with [ Not_found -> let lf = (fname, ref [f]) in do { gen.ext_files := [lf :: gen.ext_files]; [lf :: new_linked_files]; } ] in loop new_linked_files j else loop new_linked_files (i + 1) else loop new_linked_files (i + 1) ; value print_parent oc base gen fam p = let has_printed_parents = match get_parents p with [ Some ifam -> gen.fam_sel ifam | None -> False ] in let first_parent_definition = if gen.mark.(Adef.int_of_iper (get_key_index p)) then False else do { gen.mark.(Adef.int_of_iper (get_key_index p)) := True; True } in let pr = not has_printed_parents && first_parent_definition in let has_infos = if pr then has_infos base p else False in let first_name = sou base (get_first_name p) in let surname = sou base (get_surname p) in do { fprintf oc "%s %s%s" (s_correct_string surname) (s_correct_string first_name) (if get_occ p = 0 || first_name = "?" || surname = "?" then "" else "." ^ string_of_int (get_occ p)); if pr then if has_infos then print_infos oc base False "" "" p else if first_name <> "?" && surname <> "?" then fprintf oc " 0" else () else () } ; value print_child oc base fam_surname csrc cbp p = do { fprintf oc "-"; match get_sex p with [ Male -> fprintf oc " h" | Female -> fprintf oc " f" | _ -> () ]; fprintf oc " %s" (s_correct_string (sou base (get_first_name p))); if get_occ p = 0 || p_first_name base p = "?" || p_surname base p = "?" then () else fprintf oc ".%d" (get_occ p); if not (eq_istr (get_surname p) fam_surname) then fprintf oc " %s" (s_correct_string_nonum (sou base (get_surname p))) else (); print_infos oc base True csrc cbp p; fprintf oc "\n" } ; value bogus_person base p = p_first_name base p = "?" && p_surname base p = "?" ; value common_children proj base children = if Array.length children <= 1 then None else let list = List.map (fun p -> sou base (proj p)) (Array.to_list children) in if List.mem "" list then None else let list = List.sort compare list in let (src_max, n_max, _, _) = List.fold_left (fun (src_max, n_max, prev_src, n) src -> if src = prev_src then let n = n + 1 in if n > n_max then (src, n, src, n) else (src_max, n_max, src, n) else (src_max, n_max, src, 1)) ("", 0, "", 0) list in if n_max > 1 then Some src_max else None ; value common_children_sources = common_children get_psources; value common_children_birth_place = common_children get_birth_place; value array_forall f a = loop 0 where rec loop i = if i = Array.length a then True else if f a.(i) then loop (i + 1) else False ; value empty_family base m = bogus_person base m.m_fath && bogus_person base m.m_moth && array_forall (bogus_person base) m.m_chil ; value print_witness oc base gen p = do { fprintf oc "%s %s%s" (correct_string base (get_surname p)) (correct_string base (get_first_name p)) (if get_occ p = 0 then "" else "." ^ string_of_int (get_occ p)); if Array.length (get_family p) = 0 && get_parents p = None && not gen.mark.(Adef.int_of_iper (get_key_index p)) then do { gen.mark.(Adef.int_of_iper (get_key_index p)) := True; if has_infos base p then print_infos oc base False "" "" p else fprintf oc " 0"; match sou base (get_notes p) with [ "" -> () | _ -> gen.notes_pl_p := [p :: gen.notes_pl_p] ] } else () } ; value print_family oc base gen m = let fam = m.m_fam in do { fprintf oc "fam "; print_parent oc base gen fam m.m_fath; fprintf oc " +"; print_date_option oc (Adef.od_of_codate (get_marriage fam)); match get_relation fam with [ NotMarried -> fprintf oc " #nm" | Married -> () | Engaged -> fprintf oc " #eng" | NoSexesCheckNotMarried -> let c x = match get_sex x with [ Male -> 'm' | Female -> 'f' | Neuter -> '?' ] in fprintf oc " #nsck %c%c" (c m.m_fath) (c m.m_moth) | NoSexesCheckMarried -> let c x = match get_sex x with [ Male -> 'm' | Female -> 'f' | Neuter -> '?' ] in fprintf oc " #nsckm %c%c" (c m.m_fath) (c m.m_moth) | NoMention -> fprintf oc " #noment" ]; print_if_no_empty oc base "#mp" (get_marriage_place fam); print_if_no_empty oc base "#ms" (get_marriage_src fam); match get_divorce fam with [ NotDivorced -> () | Separated -> fprintf oc " #sep" | Divorced d -> let d = Adef.od_of_codate d in do { fprintf oc " -"; print_date_option oc d } ]; fprintf oc " "; print_parent oc base gen fam m.m_moth; fprintf oc "\n"; Array.iter (fun ip -> if gen.per_sel ip then do { let p = poi base ip in fprintf oc "wit"; match get_sex p with [ Male -> fprintf oc " m" | Female -> fprintf oc " f" | _ -> () ]; fprintf oc ": "; print_witness oc base gen p; fprintf oc "\n" } else ()) (get_witnesses fam); let fsources = sou base (get_fsources fam) in match fsources with [ "" -> () | s -> fprintf oc "src %s\n" (correct_string base (get_fsources fam)) ]; let csrc = match common_children_sources base m.m_chil with [ Some s -> do { fprintf oc "csrc %s\n" (s_correct_string s); s } | _ -> "" ] in let cbp = match common_children_birth_place base m.m_chil with [ Some s -> do { fprintf oc "cbp %s\n" (s_correct_string s); s } | _ -> "" ] in match get_comment fam with [ txt when sou base txt <> "" -> fprintf oc "comm %s\n" (no_newlines (sou base txt)) | _ -> () ]; match Array.length m.m_chil with [ 0 -> () | _ -> let fam_surname = get_surname m.m_fath in do { fprintf oc "beg\n"; Array.iter (fun p -> if gen.per_sel (get_key_index p) then print_child oc base fam_surname csrc cbp p else ()) m.m_chil; fprintf oc "end\n" } ]; gen.fam_done.(Adef.int_of_ifam m.m_ifam) := True; let f _ = sprintf "family \"%s.%d %s\" & \"%s.%d %s\"" (p_first_name base m.m_fath) (get_occ m.m_fath) (p_surname base m.m_fath) (p_first_name base m.m_moth) (get_occ m.m_moth) (p_surname base m.m_moth) in ignore (add_linked_files gen f fsources [] : list _); } ; value get_persons_with_notes base m list = let fath = m.m_fath in let moth = m.m_moth in let list = match (sou base (get_notes fath), get_parents fath) with [ ("", _) | (_, Some _) -> list | _ -> [fath :: list] ] in let list = match (sou base (get_notes moth), get_parents moth) with [ ("", _) | (_, Some _) -> list | _ -> [moth :: list] ] in List.fold_right (fun p list -> match sou base (get_notes p) with [ "" -> list | _ -> [p :: list] ]) (Array.to_list m.m_chil) list ; value notes_aliases bdir = let fname = Filename.concat bdir "notes.alias" in match try Some (Secure.open_in fname) with [ Sys_error _ -> None ] with [ Some ic -> loop [] where rec loop list = match try Some (input_line ic) with [ End_of_file -> None ] with [ Some s -> let list = try let i = String.index s ' ' in [(String.sub s 0 i, String.sub s (i + 1) (String.length s - i - 1)) :: list] with [ Not_found -> list ] in loop list | None -> do { close_in ic; list } ] | None -> [] ] ; value print_notes_for_person oc base gen p = do { let notes = sou base (get_notes p) in let surn = s_correct_string (p_surname base p) in let fnam = s_correct_string (p_first_name base p) in if notes <> "" && surn <> "?" && fnam <> "?" then do { fprintf oc "\n"; fprintf oc "notes %s %s%s\n" surn fnam (if get_occ p = 0 then "" else "." ^ string_of_int (get_occ p)); fprintf oc "beg\n"; fprintf oc "%s\n" notes; fprintf oc "end notes\n"; } else (); let f _ = sprintf "person \"%s.%d %s\"" (p_first_name base p) (get_occ p) (p_surname base p) in ignore (add_linked_files gen f notes [] : list _); let s = let sl = [get_notes; get_birth_src; get_baptism_src; get_death_src; get_burial_src; get_psources] in String.concat " " (List.map (fun f -> sou base (f p)) sl) in ignore (add_linked_files gen f s [] : list _); }; value rec list_memf f x = fun [ [] -> False | [a :: l] -> f x a || list_memf f x l ] ; value eq_key p1 p2 = get_key_index p1 = get_key_index p2; value eq_key_fst (p1, _) (p2, _) = get_key_index p1 = get_key_index p2; value print_notes oc base gen ml = let pl = List.fold_right (get_persons_with_notes base) ml gen.notes_pl_p in let pl = List.fold_right (fun p pl -> if list_memf eq_key p pl then pl else [p :: pl]) pl [] in List.iter (fun p -> if gen.per_sel (get_key_index p) then print_notes_for_person oc base gen p else ()) pl ; value is_isolated base p = match get_parents p with [ Some _ -> False | None -> Array.length (get_family p) = 0 ] ; value is_definition_for_parent base p = match get_parents p with [ Some _ -> False | None -> True ] ; value get_isolated_related base m list = let concat_isolated p_relation ip list = let p = poi base ip in if List.mem_assq p list then list else if is_isolated base p then match get_rparents p with [ [{r_fath = Some x} :: _] when x = get_key_index p_relation -> list @ [(p, True)] | [{r_fath = None; r_moth = Some x} :: _] when x = get_key_index p_relation -> list @ [(p, True)] | _ -> list ] else list in let list = if is_definition_for_parent base m.m_fath then List.fold_right (concat_isolated m.m_fath) (get_related m.m_fath) list else list in let list = if is_definition_for_parent base m.m_moth then List.fold_right (concat_isolated m.m_moth) (get_related m.m_moth) list else list in let list = List.fold_right (fun p list -> List.fold_right (concat_isolated p) (get_related p) list) (Array.to_list m.m_chil) list in list ; value get_persons_with_relations base m list = let fath = m.m_fath in let moth = m.m_moth in let list = match (get_rparents fath, get_parents fath) with [ ([], _) | (_, Some _) -> list | _ -> [(fath, False) :: list] ] in let list = match (get_rparents moth, get_parents moth) with [ ([], _) | (_, Some _) -> list | _ -> [(moth, False) :: list] ] in let list = List.fold_right (fun ip list -> let p = poi base ip in match (get_rparents p, get_parents p) with [ ([], _) | (_, Some _) -> list | ([{r_fath = Some x} :: _], _) when x <> get_key_index m.m_fath -> list | _ -> [(p, False) :: list] ]) (Array.to_list (get_witnesses m.m_fam)) list in List.fold_right (fun p list -> match get_rparents p with [ [] -> list | _ -> [(p, False) :: list] ]) (Array.to_list m.m_chil) list ; value print_relation_parent oc base mark defined_p p = do { fprintf oc "%s %s%s" (correct_string base (get_surname p)) (correct_string base (get_first_name p)) (if get_occ p = 0 then "" else "." ^ string_of_int (get_occ p)); if Array.length (get_family p) = 0 && get_parents p = None && not mark.(Adef.int_of_iper (get_key_index p)) then do { mark.(Adef.int_of_iper (get_key_index p)) := True; if has_infos base p then print_infos oc base False "" "" p else fprintf oc " 0"; defined_p.val := [p :: defined_p.val] } else () } ; value print_relation_for_person oc base gen def_p p r = let fath = match r.r_fath with [ Some ip -> if gen.per_sel ip then let p = poi base ip in if sou base (get_first_name p) = "?" || sou base (get_surname p) = "?" then None else Some p else None | None -> None ] in let moth = match r.r_moth with [ Some ip -> if gen.per_sel ip then let p = poi base ip in if sou base (get_first_name p) = "?" || sou base (get_surname p) = "?" then None else Some p else None | None -> None ] in match (fath, moth) with [ (None, None) -> () | _ -> do { fprintf oc "- "; match r.r_type with [ Adoption -> fprintf oc "adop" | Recognition -> fprintf oc "reco" | CandidateParent -> fprintf oc "cand" | GodParent -> fprintf oc "godp" | FosterParent -> fprintf oc "fost" ]; match (fath, moth) with [ (Some _, None) -> fprintf oc " fath" | (None, Some _) -> fprintf oc " moth" | _ -> () ]; fprintf oc ": "; match (fath, moth) with [ (Some fath, None) -> print_relation_parent oc base gen.mark def_p fath | (None, Some moth) -> print_relation_parent oc base gen.mark def_p moth | (Some fath, Some moth) -> do { print_relation_parent oc base gen.mark def_p fath; fprintf oc " + "; print_relation_parent oc base gen.mark def_p moth } | _ -> () ]; fprintf oc "\n" } ] ; value print_relations_for_person oc base gen def_p is_definition p = let surn = correct_string base (get_surname p) in let fnam = correct_string base (get_first_name p) in let exist_relation = List.exists (fun r -> match (r.r_fath, r.r_moth) with [ (Some ip1, Some ip2) -> gen.per_sel ip1 && gen.per_sel ip2 | (Some ip1, _) -> gen.per_sel ip1 | (_, Some ip2) -> gen.per_sel ip2 | _ -> False ]) (get_rparents p) in if surn <> "?" && fnam <> "?" && exist_relation then do { fprintf oc "\n"; fprintf oc "rel %s %s%s" surn fnam (if get_occ p = 0 then "" else "." ^ string_of_int (get_occ p)); if is_definition then do { if has_infos base p then print_infos oc base False "" "" p else fprintf oc " 0"; match get_sex p with [ Male -> fprintf oc " #h" | Female -> fprintf oc " #f" | Neuter -> () ] } else (); fprintf oc "\n"; fprintf oc "beg\n"; List.iter (print_relation_for_person oc base gen def_p p) (get_rparents p); fprintf oc "end\n" } else () ; value print_relations oc base gen ml = let pl = List.fold_right (get_persons_with_relations base) ml [] in let pl = List.fold_right (get_isolated_related base) ml pl in let pl = List.fold_right (fun p pl -> if list_memf eq_key_fst p pl then pl else [p :: pl]) pl [] in let rec loop = fun [ [] -> () | [(p, if_def) :: pl] -> let def_p = ref [] in do { if get_rparents p <> [] && gen.per_sel (get_key_index p) then do { print_relations_for_person oc base gen def_p if_def p; List.iter (print_notes_for_person oc base gen) def_p.val } else (); loop (pl @ List.map (fun p -> (p, False)) def_p.val) } ] in loop pl ; value rec merge_families ifaml1f ifaml2f = match (ifaml1f, ifaml2f) with [ ([ifam1 :: ifaml1], [ifam2 :: ifaml2]) -> let m1 = List.mem ifam1 ifaml2 in let m2 = List.mem ifam2 ifaml1 in if m1 && m2 then merge_families ifaml1 ifaml2 else if m1 then [ifam2 :: merge_families ifaml1f ifaml2] else if m2 then [ifam1 :: merge_families ifaml1 ifaml2f] else if ifam2 < ifam1 then [ifam2; ifam1 :: merge_families ifaml1 ifaml2] else if ifam1 < ifam2 then [ifam1; ifam2 :: merge_families ifaml1 ifaml2] else [ifam1 :: merge_families ifaml1 ifaml2] | (ifaml1, []) -> ifaml1 | ([], ifaml2) -> ifaml2 ] ; value rec filter f = fun [ [x :: l] -> if f x then [x :: filter f l] else filter f l | [] -> [] ] ; value connected_families base fam_sel ifam cpl = loop [ifam] [] [get_father cpl] where rec loop ifaml ipl_scanned = fun [ [ip :: ipl] -> if List.mem ip ipl_scanned then loop ifaml ipl_scanned ipl else let u = poi base ip in let ifaml1 = Array.to_list (get_family u) in let ifaml1 = filter fam_sel ifaml1 in let ifaml = merge_families ifaml ifaml1 in let ipl = List.fold_right (fun ifam ipl -> let cpl = foi base ifam in [get_father cpl; get_mother cpl :: ipl]) ifaml1 ipl in loop ifaml [ip :: ipl_scanned] ipl | [] -> ifaml ] ; value find_person base p1 po p2 = match person_of_key base p1 p2 po with [ Some ip -> ip | None -> do { printf "Not found: %s%s %s\n" p1 (if po = 0 then "" else " " ^ string_of_int po) p2; flush stdout; exit 2 } ] ; value read_file_contents fname = match try Some (open_in fname) with [ Sys_error _ -> None ] with [ Some ic -> let len = ref 0 in try loop () where rec loop () = do { len.val := Buff.store len.val (input_char ic); loop () } with [ End_of_file -> Buff.get len.val ] | None -> "" ] ; (* Separate option *) type separate = [ ToSeparate | NotScanned | BeingScanned | Scanned ] ; value rec find_ancestors base surn p list = match get_parents p with [ Some ifam -> let cpl = foi base ifam in let fath = poi base (get_father cpl) in let moth = poi base (get_mother cpl) in if not (eq_istr (get_surname fath) surn) && not (eq_istr (get_surname moth) surn) then [p :: list] else let list = if eq_istr (get_surname fath) surn then find_ancestors base surn fath list else list in let list = if eq_istr (get_surname moth) surn then find_ancestors base surn moth list else list in list | None -> [p :: list] ] ; value mark_branch base mark surn p = loop True p where rec loop top p = for i = 0 to Array.length (get_family p) - 1 do { let ifam = (get_family p).(i) in match mark.(Adef.int_of_ifam ifam) with [ NotScanned -> let ifaml = connected_families base (fun _ -> True) ifam (foi base ifam) in let children = List.fold_left (fun list ifam -> let desc = foi base ifam in Array.fold_left (fun list ip -> [poi base ip :: list]) list (get_children desc)) [] ifaml in if top || List.exists (fun p -> eq_istr (get_surname p) surn) children then do { List.iter (fun ifam -> mark.(Adef.int_of_ifam ifam) := ToSeparate) ifaml; List.iter (loop False) children } else () | _ -> () ] } ; value mark_someone base mark s = match Gutil.person_ht_find_all base s with [ [ip] -> let p = poi base ip in let plist = find_ancestors base (get_surname p) p [] in List.iter (mark_branch base mark (get_surname p)) plist | [] -> do { eprintf "Error: \"%s\" is not found\n" s; flush stderr; exit 2 } | _ -> do { eprintf "Error: several answers for \"%s\"\n" s; flush stderr; exit 2 } ] ; value sep_limit = ref 21; value only_file = ref ""; value separate_list = ref []; value scan_connex_component base test_action len ifam = loop len ifam where rec loop len ifam = let fam = foi base ifam in let fath = poi base (get_father fam) in let moth = poi base (get_mother fam) in let len = Array.fold_left (fun len ifam1 -> if ifam1 = ifam then len else test_action loop len ifam1) len (get_family fath) in let len = Array.fold_left (fun len ifam1 -> if ifam1 = ifam then len else test_action loop len ifam1) len (get_family moth) in let len = match get_parents fath with [ Some ifam -> test_action loop len ifam | _ -> len ] in let len = match get_parents moth with [ Some ifam -> test_action loop len ifam | _ -> len ] in let children = get_children fam in let len = Array.fold_left (fun len ip -> Array.fold_left (test_action loop) len (get_family (poi base ip))) len children in len ; value mark_one_connex_component base mark ifam = let origin_file = sou base (get_origin_file (foi base ifam)) in let test_action loop len ifam = if mark.(Adef.int_of_ifam ifam) = NotScanned && sou base (get_origin_file (foi base ifam)) = origin_file then do { mark.(Adef.int_of_ifam ifam) := BeingScanned; loop (len + 1) ifam } else len in let _ = test_action (fun _ _ -> 1) 0 ifam in let len = 1 + scan_connex_component base test_action 0 ifam in let set_mark x = let test_action loop () ifam = if mark.(Adef.int_of_ifam ifam) = BeingScanned then do { mark.(Adef.int_of_ifam ifam) := x; loop () ifam } else () in do { test_action (fun _ _ -> ()) () ifam; scan_connex_component base test_action () ifam } in if len <= sep_limit.val && (only_file.val = "" || only_file.val = origin_file) then set_mark ToSeparate else do { eprintf "%s: group of size %d not included\n" origin_file len; let cpl = foi base ifam in eprintf " %s + %s\n" (designation base (poi base (get_father cpl))) (designation base (poi base (get_mother cpl))); flush stderr; set_mark Scanned } ; value mark_connex_components base mark ifam = let test_action loop len ifam = if mark.(Adef.int_of_ifam ifam) = NotScanned then mark_one_connex_component base mark ifam else () in scan_connex_component base test_action () ifam ; value add_small_connex_components base mark = for i = 0 to nb_of_families base - 1 do { if mark.(i) = ToSeparate then mark_connex_components base mark (Adef.ifam_of_int i) else () } ; value separate base = match List.rev separate_list.val with [ [] -> fun _ -> False | list -> let mark = Array.make (nb_of_families base) NotScanned in do { List.iter (mark_someone base mark) list; add_small_connex_components base mark; let len = loop 0 0 where rec loop len i = if i = nb_of_families base then len else if mark.(i) = ToSeparate then loop (len + 1) (i + 1) else loop len (i + 1) in eprintf "*** extracted %d families\n" len; flush stderr; fun ifam -> mark.(Adef.int_of_ifam ifam) = ToSeparate } ] ; value rs_printf oc s = loop True 0 where rec loop bol i = if i = String.length s then () else if s.[i] = '\n' then do { fprintf oc "\n"; loop True (i + 1) } else do { if bol then fprintf oc " " else (); fprintf oc "%c" s.[i]; loop False (i + 1) } ; (* Main *) value surnames = ref []; value no_spouses_parents = ref False; value no_notes = ref False; value censor = ref 0; value with_siblings = ref False; value maxlev = ref (-1); value gwu base in_dir out_dir out_oc src_oc_ht anc desc ancdesc = let to_separate = separate base in let anc = match anc with [ Some (p1, po, p2) -> Some (find_person base p1 po p2) | None -> None ] in let desc = match desc with [ Some (p1, po, p2) -> Some (find_person base p1 po p2) | None -> None ] in let ancdesc = match ancdesc with [ Some (p1, po, p2) -> Some (find_person base p1 po p2) | None -> None ] in let out_oc_first = ref True in let origin_file fname = if out_dir = "" then (out_oc, out_oc_first) else if fname = "" then (out_oc, out_oc_first) else try Hashtbl.find src_oc_ht fname with [ Not_found -> let oc = open_out (Filename.concat out_dir fname) in let x = (oc, ref True) in do { if raw_output.val then () else fprintf oc "encoding: utf-8\n\n"; Hashtbl.add src_oc_ht fname x; x } ] in let gen = let mark = Array.make (nb_of_persons base) False in let (per_sel, fam_sel) = Select.functions base anc desc surnames.val ancdesc no_spouses_parents.val censor.val with_siblings.val maxlev.val in let fam_done = Array.make (nb_of_families base) False in {mark = mark; per_sel = per_sel; fam_sel = fam_sel; fam_done = fam_done; notes_pl_p = []; ext_files = []; notes_alias = notes_aliases in_dir} in let nb_fam = nb_of_families base in do { if Mutil.verbose.val then ProgrBar.start () else (); for i = 0 to nb_fam - 1 do { if Mutil.verbose.val then ProgrBar.run i nb_fam else (); let ifam = Adef.ifam_of_int i in let fam = foi base ifam in if is_deleted_family fam then () else if gen.fam_done.(i) then () else if gen.fam_sel ifam then let ifaml = connected_families base gen.fam_sel ifam fam in let (oc, first) = if to_separate ifam then (out_oc, out_oc_first) else origin_file (sou base (get_origin_file fam)) in let ml = List.fold_right (fun ifam ml -> let fam = foi base ifam in let m = {m_ifam = ifam; m_fam = fam; m_fath = poi base (get_father fam); m_moth = poi base (get_mother fam); m_chil = Array.map (fun ip -> poi base ip) (get_children fam)} in if empty_family base m then do { gen.fam_done.(Adef.int_of_ifam m.m_ifam) := True; ml } else [m :: ml]) ifaml [] in if ml <> [] then do { gen.notes_pl_p := []; if not first.val then fprintf oc "\n" else (); first.val := False; List.iter (print_family oc base gen) ml; print_notes oc base gen ml; print_relations oc base gen ml } else () else () }; if Mutil.verbose.val then ProgrBar.finish () else (); if not no_notes.val then do { let s = base_notes_read base "" in let (oc, first) = origin_file (base_notes_origin_file base) in if s <> "" then do { if not first.val then fprintf oc "\n" else (); first.val := False; fprintf oc "notes-db\n"; rs_printf oc s; fprintf oc "\nend notes-db\n"; ignore (add_linked_files gen (fun _ -> "database notes") s [] : list _); } else (); try let files = Sys.readdir (Filename.concat in_dir (base_wiznotes_dir base)) in do { Array.sort compare files; for i = 0 to Array.length files - 1 do { let file = files.(i) in if Filename.check_suffix file ".txt" then do { let wfile = List.fold_left Filename.concat in_dir [base_wiznotes_dir base; file] in let s = read_file_contents wfile in ignore (add_linked_files gen (fun _ -> "wizard \"" ^ file ^ "\"") s [] : list _); } else () }; } with [ Sys_error _ -> () ]; let rec loop = fun [ [] -> () | [(f, _) :: files] -> let fn = match NotesLinks.check_file_name f with [ Some (dl, f) -> List.fold_right Filename.concat dl f | None -> "bad" ] in let s = base_notes_read base fn in let files = add_linked_files gen (fun _ -> sprintf "extended page \"%s\"" f) s files in loop files ] in loop gen.ext_files; List.iter (fun (f, r) -> let fn = match NotesLinks.check_file_name f with [ Some (dl, f) -> List.fold_right Filename.concat dl f | None -> "bad" ] in let s = strip_spaces (base_notes_read base fn) in if s <> "" then do { if not first.val then fprintf oc "\n" else (); first.val := False; fprintf oc "# extended page \"%s\" used by:\n" f; List.iter (fun f -> fprintf oc "# - %s\n" f) (List.sort compare r.val); fprintf oc "page-ext %s\n" f; rs_printf oc s; fprintf oc "\nend page-ext\n"; } else ()) (List.sort compare gen.ext_files); try let files = Sys.readdir (Filename.concat in_dir (base_wiznotes_dir base)) in do { Array.sort compare files; for i = 0 to Array.length files - 1 do { let file = files.(i) in if Filename.check_suffix file ".txt" then do { let wizid = Filename.chop_suffix file ".txt" in let wfile = List.fold_left Filename.concat in_dir [base_wiznotes_dir base; file] in let s = strip_spaces (read_file_contents wfile) in fprintf oc "\nwizard-note %s\n" wizid; rs_printf oc s; fprintf oc "\nend wizard-note\n"; } else () }; } with [ Sys_error _ -> () ]; } else (); } ; value in_file = ref ""; value out_file = ref ""; value out_dir = ref ""; value anc_1st = ref ""; value anc_occ = ref 0; value anc_2nd = ref ""; value desc_1st = ref ""; value desc_occ = ref 0; value desc_2nd = ref ""; value ancdesc_1st = ref ""; value ancdesc_occ = ref 0; value ancdesc_2nd = ref ""; type arg_state = [ ASnone | ASwaitAncOcc | ASwaitAncSurn | ASwaitDescOcc | ASwaitDescSurn | ASwaitAncdescOcc | ASwaitAncdescSurn ] ; value arg_state = ref ASnone; value mem = ref False; value speclist = [("-o", Arg.String (fun s -> out_file.val := s), " output file name (else stdout)"); ("-odir", Arg.String (fun s -> out_dir.val := s), " create files from original name in directory (else on -o file)"); ("-mem", Arg.Set mem, " save memory space, but slower"); ("-a", Arg.String (fun s -> do { anc_1st.val := s; arg_state.val := ASwaitAncOcc }), "\"<1st_name>\" [num] \"\" : select ancestors of..."); ("-d", Arg.String (fun s -> do { desc_1st.val := s; arg_state.val := ASwaitDescOcc }), "\"<1st_name>\" [num] \"\" : select descendants of..."); ("-ad", Arg.String (fun s -> do { ancdesc_1st.val := s; arg_state.val := ASwaitAncdescOcc }), "\ \"<1st_name>\" [num] \"\" : select ancestors of... and all their descendants (has no effect if -a and/or -d used, option -nsp is forced)."); ("-aws", Arg.String (fun s -> do { anc_1st.val := s; arg_state.val := ASwaitAncOcc; with_siblings.val := True; () }), "\"<1st_name>\" [num] \"\" : select ancestors with siblings"); ("-s", Arg.String (fun x -> surnames.val := [x :: surnames.val]), "\"\" : select this surname (option usable several times)"); ("-maxlev", Arg.Int (fun i -> maxlev.val := i), "\"\" : maximum level of generations of descendants"); ("-nsp", Arg.Set no_spouses_parents, ": no spouses' parents (for options -s and -d)"); ("-nn", Arg.Set no_notes, ": no (database) notes"); ("-nopicture", Arg.Set no_picture, ": Don't extract individual picture."); ("-c", Arg.Int (fun i -> censor.val := i), "\ : When a person is born less than years ago, it is not exported unless it is Public. All the spouses and descendants are also censored."); ("-raw", Arg.Set raw_output, "raw output (without possible utf-8 conversion)"); ("-v", Arg.Set Mutil.verbose, "verbose"); ("-sep", Arg.String (fun s -> separate_list.val := [s :: separate_list.val]), "\ \"1st_name.num surname\" : To use together with the option \"-odir\": separate this person and all his ancestors and descendants sharing the same surname. All the concerned families are displayed on standard output instead of their associated files. This option can be used several times."); ("-sep_only_file", Arg.String (fun s -> only_file.val := s), "\ : With option \"-sep\", tells to separate only groups of that file."); ("-sep_limit", Arg.Int (fun i -> sep_limit.val := i), "\ : When using the option \"-sep\", groups of families can become isolated in the files. Gwu reconnects them to the separated families (i.e. displays them to standard output) if the size of these groups is less than " ^ string_of_int sep_limit.val ^ "\ . The present option changes this limit.")] ; value anonfun s = match arg_state.val with [ ASnone -> if in_file.val = "" then in_file.val := s else raise (Arg.Bad "Cannot treat several databases") | ASwaitAncOcc -> try do { anc_occ.val := int_of_string s; arg_state.val := ASwaitAncSurn } with [ Failure _ -> do { anc_occ.val := 0; anc_2nd.val := s; arg_state.val := ASnone } ] | ASwaitAncSurn -> do { anc_2nd.val := s; arg_state.val := ASnone } | ASwaitDescOcc -> try do { desc_occ.val := int_of_string s; arg_state.val := ASwaitDescSurn } with [ Failure _ -> do { desc_occ.val := 0; desc_2nd.val := s; arg_state.val := ASnone } ] | ASwaitDescSurn -> do { desc_2nd.val := s; arg_state.val := ASnone } | ASwaitAncdescOcc -> try do { ancdesc_occ.val := int_of_string s; arg_state.val := ASwaitAncdescSurn } with [ Failure _ -> do { ancdesc_occ.val := 0; ancdesc_2nd.val := s; arg_state.val := ASnone } ] | ASwaitAncdescSurn -> do { ancdesc_2nd.val := s; arg_state.val := ASnone } ] ; value errmsg = "Usage: " ^ Sys.argv.(0) ^ " \ [options] If both options -a and -d are used, intersection is assumed. If several options -s are used, union is assumed. Options are:" ; value main () = do { Mutil.verbose.val := False; Argl.parse speclist anonfun errmsg; if in_file.val = "" then do { printf "Missing base\n"; printf "Use option -help for usage\n"; flush stdout; exit 2 } else (); Secure.set_base_dir (Filename.dirname in_file.val); let anc = if anc_1st.val <> "" then if anc_2nd.val = "" then do { printf "Misused option -a\n"; printf "Use option -help for usage\n"; flush stdout; exit 2 } else Some (anc_1st.val, anc_occ.val, anc_2nd.val) else None in let desc = if desc_1st.val <> "" then if desc_2nd.val = "" then do { printf "Misused option -d\n"; printf "Use option -help for usage\n"; flush stdout; exit 2 } else Some (desc_1st.val, desc_occ.val, desc_2nd.val) else None in let ancdesc = if ancdesc_1st.val <> "" then if anc_1st.val <> "" || desc_1st.val <> "" then do { printf "Option -ad skipped since -a and/or -d used\n"; None } else if ancdesc_2nd.val = "" then do { printf "Misused option -ad\n"; printf "Use option -help for usage\n"; flush stdout; exit 2 } else do { no_spouses_parents.val := True; Some (ancdesc_1st.val, ancdesc_occ.val, ancdesc_2nd.val) } else None in let base = Gwdb.open_base in_file.val in let in_dir = if Filename.check_suffix in_file.val ".gwb" then in_file.val else in_file.val ^ ".gwb" in let src_oc_ht = Hashtbl.create 1009 in let () = load_ascends_array base in let () = load_strings_array base in if not mem.val then let () = load_couples_array base in let () = load_unions_array base in let () = load_descends_array base in () else (); let out_oc = if out_file.val = "" then stdout else open_out out_file.val in if raw_output.val then () else fprintf out_oc "encoding: utf-8\n\n"; gwu base in_dir out_dir.val out_oc src_oc_ht anc desc ancdesc; Hashtbl.iter (fun _ (oc, _) -> do { flush oc; close_out oc }) src_oc_ht; flush out_oc; if out_file.val = "" then () else close_out out_oc } ; Printexc.catch main (); geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/notes.mli0000660000175200017530000000124312664543647023043 0ustar guillaumeguillaume(* camlp5r *) (* $Id: notes.mli,v 5.6 2007-09-12 09:58:44 ddr Exp $ *) open Config; open Gwdb; open NotesLinks; value file_path : config -> base -> string -> string; value read_notes : base -> string -> (list (string * string) * string); value print : config -> base -> unit; value print_mod : config -> base -> unit; value update_notes_links_db : config -> page -> string -> unit; value print_mod_ok : config -> base -> unit; value print_misc_notes : config -> base -> unit; value print_misc_notes_search : config -> base -> unit; value print_linked_list : config -> base -> list page -> unit; value merge_possible_aliases : config -> notes_links_db -> notes_links_db; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/def_syn.ml0000660000175200017530000000104512664543647023171 0ustar guillaumeguillaume(* camlp5r pa_extend.cmo q_MLast.cmo *) (* $Id: def_syn.ml,v 5.1 2008-11-03 15:40:10 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Pcaml; EXTEND expr: BEFORE "<" [ [ x = expr; "strictly_before"; y = expr -> <:expr< strictly_before $x$ $y$ >> | x = expr; "strictly_after"; y = expr -> <:expr< strictly_after $x$ $y$ >> | x = expr; "avant"; y = expr -> <:expr< not (strictly_after $x$ $y$) >> | x = expr; "apres"; y = expr -> <:expr< not (strictly_before $x$ $y$) >> ] ]; END; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/database.ml0000660000175200017530000010661412664543647023316 0ustar guillaumeguillaume(* $Id: database.ml,v 5.19 2007-06-06 15:22:35 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Dbdisk; open Def; open Dutil; open Mutil; type person = dsk_person; type ascend = dsk_ascend; type union = dsk_union; type family = dsk_family; type couple = dsk_couple; type descend = dsk_descend; (* Files in base (directory .gwb) base - the base itself magic number (magic_gwb) : string of length 8 number of persons : binary_int number of families : binary_int number of strings : binary_int persons array offset in file : binary_int ascends array offset in file : binary_int unions array offset in file : binary_int families array offset in file : binary_int couples array offset in file : binary_int descends array offset in file : binary_int strings array offset in file : binary_int notes origin file : value persons array : value ascends array : value unions array : value families array : value couples array : value descends array : value strings array : value base.acc - direct accesses to arrays inside base persons offsets : array of binary_ints ascends offsets : array of binary_ints unions offsets : array of binary_ints families offsets : array of binary_ints couples offsets : array of binary_ints descends offsets : array of binary_ints strings offsets : array of binary_ints names.inx - index for names, strings of first names and surnames offset to 2nd index : binary_int 1st index (names) : value array, length = "table_size", associating: - a hash value of a "crushed" (module "Name") name (modulo length) - to the array of indexes of the corresponding persons 2nd index (first names and surnames strings) : value array, length = "table_size", associating: - a hash value of the "crushed" (module "Name") first name or surname (modulo length) - to the array of the corresponding string indexes names.acc - direct accesses to arrays inside names.inx strings.inx - index for strings, surnames, first names length of the strings offset array : binary_int offset of surnames index : binary_int offset of first names index : binary_int strings hash table index : 2 arrays of binary_ints strings offset array (length = prime after 10 * strings array length) - associating a hash value of the string modulo length - to its index in the string array strings list array (length = string array length) - associating a string index - to the index of the next index holding the same hash value -- the following table has been obsolete since version 4.10 -- it has been replaced by snames.inx/sname.dat which use -- much less memory surnames index : value binary tree - associating the string index of a surname - to the corresponding list of persons holding this surname -- the following table has been obsolete since version 4.10 -- it has been replaced by fnames.inx/fname.dat which use -- much less memory first_names index : value binary tree - associating the string index of a first name - to the corresponding list of persons holding this first name snames.inx - index for surnames binary tree - associating the string index of a surname - to a pointer (int) to snames.dat snames.dat - data associated with snames.inx table of list of persons holding a surname fnames.inx - index for first names binary tree - associating the string index of a first name - to a pointer (int) to fnames.dat fnames.dat - data associated with fnames.inx table of list of persons holding a first name the corresponding list of persons holding this surname patches - patches When updated, none of the previous files are modified. Only this one is written and rewritten. It holds a record of type "patches", composed of association lists "index" - "new value". *) (* Search index of a given string in file strings.inx *) value string_piece s = let s = String.escaped s in if String.length s > 20 then String.sub s 0 10 ^ " ... " ^ String.sub s (String.length s - 10) 10 else s ; exception Found of int; value hashtbl_right_assoc s ht = try do { Hashtbl.iter (fun i1 s1 -> if s = s1 then raise (Found i1) else ()) ht; raise Not_found; } with [ Found x -> x ] ; value index_of_string strings ic start_pos hash_len string_patches s = try Adef.istr_of_int (hashtbl_right_assoc s string_patches) with [ Not_found -> match (ic, hash_len) with [ (Some ic, Some hash_len) -> let ia = Hashtbl.hash s mod hash_len in do { seek_in ic (start_pos + ia * int_size); let i1 = input_binary_int ic in let rec loop i = if i = -1 then raise Not_found else if strings.get i = s then Adef.istr_of_int i else do { seek_in ic (start_pos + (hash_len + i) * int_size); loop (input_binary_int ic) } in loop i1 } | _ -> do { Printf.eprintf "Sorry. I really need string.inx\n"; flush stderr; failwith "database access" } ] ] ; value initial s = loop 0 where rec loop i = if i = String.length s then 0 else match s.[i] with [ 'A'..'Z' | 'À'..'Ý' -> i | _ -> loop (succ i) ] ; value rec list_remove_elemq x = fun [ [y :: l] -> if x = y then l else [y :: list_remove_elemq x l] | [] -> [] ] ; (* compatibility with databases created with versions <= 4.09 *) (* should be removed after some time (when all databases will have been rebuilt with version >= 4.10 *) value old_persons_of_first_name_or_surname base_data strings params = let (ic2, start_pos, proj, person_patches, _, _, _) = params in let module IstrTree = Btree.Make (struct type t = dsk_istr; value compare = compare_istr_fun base_data; end) in let bt = let btr = ref None in let completed = ref False in let update_bt gistro bt = do { let bt = ref bt in Hashtbl.iter (fun i p -> let istr = proj p in if gistro <> None && gistro <> Some istr then () else let ipera = try IstrTree.find istr bt.val with [ Not_found -> [] ] in if List.mem (Adef.iper_of_int i) ipera then () else bt.val := IstrTree.add istr [Adef.iper_of_int i :: ipera] bt.val) person_patches; if gistro = None then completed.val := True else (); bt.val } in fun gistro -> match btr.val with [ Some bt -> if completed.val then bt else let bt = update_bt gistro bt in do { btr.val := Some bt; bt } | None -> match (ic2, start_pos) with [ (Some ic2, Some start_pos) -> do { seek_in ic2 start_pos; (* let ab1 = Gc.allocated_bytes () in *) let bt : IstrTree.t (list iper) = input_value ic2 in (* let ab2 = Gc.allocated_bytes () in *) let bt = update_bt gistro bt in btr.val := Some bt; (* Printf.eprintf "*** old database created by version <= 4.09\n"; flush stderr; Printf.eprintf "*** using index allocating here %.0f bytes\n" (ab2 -. ab1); flush stderr; *) bt } | _ -> do { Printf.eprintf "Sorry, I really need strings.inx.\n"; flush stderr; failwith "database access" } ] ] in let compare = compare_istr_fun base_data in let check_patches istr ipl = let ipl = ref ipl in do { Hashtbl.iter (fun i p -> if List.mem (Adef.iper_of_int i) ipl.val then if compare istr p.first_name = 0 || compare istr p.surname = 0 then () else ipl.val := list_remove_elemq (Adef.iper_of_int i) ipl.val else ()) person_patches; ipl.val } in let find istr = try check_patches istr (IstrTree.find istr (bt (Some istr))) with [ Not_found -> [] ] in let cursor str = IstrTree.key_after (fun key -> compare_names base_data str (strings.get (Adef.int_of_istr key))) (bt None) in let next key = IstrTree.next key (bt None) in {find = find; cursor = cursor; next = next} ; value new_persons_of_first_name_or_surname base_data strings params = let (_, _, proj, person_patches, names_inx, names_dat, bname) = params in let module IstrTree = Btree.Make (struct type t = dsk_istr; value compare = compare_istr_fun base_data; end) in let fname_dat = Filename.concat bname names_dat in let bt = let btr = ref None in fun () -> match btr.val with [ Some bt -> bt | None -> do { let fname_inx = Filename.concat bname names_inx in let ic_inx = Secure.open_in_bin fname_inx in (* let ab1 = Gc.allocated_bytes () in *) let bt : IstrTree.t int = input_value ic_inx in (* let ab2 = Gc.allocated_bytes () in Printf.eprintf "*** new database created by version >= 4.10\n"; Printf.eprintf "*** using index '%s' allocating here only %.0f bytes\n" names_inx (ab2 -. ab1); flush stderr; *) close_in ic_inx; btr.val := Some bt; bt } ] in let find istr = let ipera = try let pos = IstrTree.find istr (bt ()) in let ic_dat = Secure.open_in_bin fname_dat in do { seek_in ic_dat pos; let len = input_binary_int ic_dat in let rec read_loop ipera len = if len = 0 then ipera else let iper = Adef.iper_of_int (input_binary_int ic_dat) in read_loop [iper :: ipera] (len - 1) in let ipera = read_loop [] len in close_in ic_dat; ipera } with [ Not_found -> [] ] in let ipera = ref ipera in do { Hashtbl.iter (fun i p -> let istr1 = proj p in if istr1 <> istr then () else if List.mem (Adef.iper_of_int i) ipera.val then () else ipera.val := [Adef.iper_of_int i :: ipera.val]) person_patches; ipera.val } in let bt_patched = let btr = ref None in fun () -> match btr.val with [ Some bt -> bt | None -> let bt = ref (bt ()) in do { Hashtbl.iter (fun i p -> let istr1 = proj p in try let _ = IstrTree.find istr1 bt.val in () with [ Not_found -> bt.val := IstrTree.add istr1 0 bt.val ]) person_patches; btr.val := Some bt.val; bt.val } ] in let cursor str = IstrTree.key_after (fun key -> compare_names base_data str (strings.get (Adef.int_of_istr key))) (bt_patched ()) in let next key = IstrTree.next key (bt_patched ()) in {find = find; cursor = cursor; next = next} ; value persons_of_first_name_or_surname base_data strings params = let (_, _, _, _, names_inx, _, bname) = params in if Sys.file_exists (Filename.concat bname names_inx) then new_persons_of_first_name_or_surname base_data strings params else old_persons_of_first_name_or_surname base_data strings params ; (* Search index for a given name in file names.inx *) value persons_of_name bname patches = let t = ref None in fun s -> let s = Name.crush_lower s in let i = Hashtbl.hash s in let ai = let ic_inx = Secure.open_in_bin (Filename.concat bname "names.inx") in let ai = let i = i mod table_size in let fname_inx_acc = Filename.concat bname "names.acc" in if Sys.file_exists fname_inx_acc then let ic_inx_acc = Secure.open_in_bin fname_inx_acc in do { seek_in ic_inx_acc (Iovalue.sizeof_long * i); let pos = input_binary_int ic_inx_acc in close_in ic_inx_acc; seek_in ic_inx pos; (Iovalue.input ic_inx : array iper) } else (* compatibility *) let a = match t.val with [ Some a -> a | None -> do { seek_in ic_inx int_size; let a : name_index_data = input_value ic_inx in t.val := Some a; a } ] in a.(i) in do { close_in ic_inx; ai } in try let l = Hashtbl.find patches i in l @ Array.to_list ai with [ Not_found -> Array.to_list ai ] ; value strings_of_fsname bname strings (_, person_patches) = let t = ref None in fun s -> let s = Name.crush_lower s in let i = Hashtbl.hash s in let r = let ic_inx = Secure.open_in_bin (Filename.concat bname "names.inx") in let ai = let i = i mod table_size in let fname_inx_acc = Filename.concat bname "names.acc" in if Sys.file_exists fname_inx_acc then let ic_inx_acc = Secure.open_in_bin fname_inx_acc in do { seek_in ic_inx_acc (Iovalue.sizeof_long * (table_size + i)); let pos = input_binary_int ic_inx_acc in close_in ic_inx_acc; seek_in ic_inx pos; (Iovalue.input ic_inx : array dsk_istr) } else (* compatibility *) let a = match t.val with [ Some a -> a | None -> let pos = input_binary_int ic_inx in do { seek_in ic_inx pos; let a : strings_of_fsname = input_value ic_inx in t.val := Some a; a } ] in a.(i) in do { close_in ic_inx; ai } in let l = ref (Array.to_list r) in do { Hashtbl.iter (fun _ p -> do { if not (List.mem p.first_name l.val) then let s1 = strings.get (Adef.int_of_istr p.first_name) in let s1 = nominative s1 in if s = Name.crush_lower s1 then l.val := [p.first_name :: l.val] else () else (); if not (List.mem p.surname l.val) then let s1 = strings.get (Adef.int_of_istr p.surname) in let s1 = nominative s1 in if s = Name.crush_lower s1 then l.val := [p.surname :: l.val] else () else (); }) person_patches; l.val } ; (**) value lock_file bname = let bname = if Filename.check_suffix bname ".gwb" then Filename.chop_suffix bname ".gwb" else bname in bname ^ ".lck" ; (* Restrict file *) type visible_state = [ VsNone | VsTrue | VsFalse ]; value make_visible_record_access bname persons = let visible_ref = ref None in let fname = Filename.concat bname "restrict" in let read_or_create_visible () = let visible = match try Some (Secure.open_in fname) with [ Sys_error _ -> None ] with [ Some ic -> do { IFDEF UNIX THEN if verbose.val then do { Printf.eprintf "*** read restrict file\n"; flush stderr; } else () ELSE () END; let visible = input_value ic in close_in ic; visible } | None -> Array.make persons.len VsNone ] in do { visible_ref.val := Some visible; visible } in let v_write () = match visible_ref.val with [ Some visible -> try do { let oc = Secure.open_out fname in IFDEF UNIX THEN if verbose.val then do { Printf.eprintf "*** write restrict file\n"; flush stderr; } else () ELSE () END; output_value oc visible; close_out oc } with [ Sys_error _ -> () ] | None -> () ] in let v_get fct i = let visible = match visible_ref.val with [ Some visible -> visible | None -> read_or_create_visible () ] in if i < Array.length visible then match visible.(i) with [ VsNone -> let status = fct (persons.get i) in do { visible.(i) := if status then VsTrue else VsFalse; visible_ref.val := Some visible; status } | VsTrue -> True | VsFalse -> False ] else fct (persons.get i) in { v_write = v_write; v_get = v_get } ; (* Input *) value apply_patches tab f patches plen = if plen = 0 then tab else do { let new_tab = if plen > Array.length tab then do { let new_tab = Array.make plen (Obj.magic 0) in Array.blit tab 0 new_tab 0 (Array.length tab); new_tab } else tab in Hashtbl.iter (fun i v -> new_tab.(i) := f v) patches; new_tab } ; type patches_ht = { h_person : (ref int * Hashtbl.t int person); h_ascend : (ref int * Hashtbl.t int ascend); h_union : (ref int * Hashtbl.t int union); h_family : (ref int * Hashtbl.t int family); h_couple : (ref int * Hashtbl.t int couple); h_descend : (ref int * Hashtbl.t int descend); h_string : (ref int * Hashtbl.t int string); h_name : Hashtbl.t int (list iper) } ; (* Old structure of file "patches", kept for backward compatibility. After conversion, a new change will be saved with a magic number (magic_patch) and a record "patch_ht" above. *) module Old = struct type patches = { p_person : ref (list (int * person)); p_ascend : ref (list (int * ascend)); p_union : ref (list (int * union)); p_family : ref (list (int * family)); p_couple : ref (list (int * couple)); p_descend : ref (list (int * descend)); p_string : ref (list (int * string)); p_name : ref (list (int * list iper)) } ; end ; value phony_person = {first_name = 0; surname = 0; occ = 0; image = 0; first_names_aliases = []; surnames_aliases = []; public_name = 0; qualifiers = []; aliases = []; titles = []; rparents = []; related = []; occupation = 0; sex = Neuter; access = IfTitles; birth = Adef.codate_None; birth_place = 0; birth_src = 0; baptism = Adef.codate_None; baptism_place = 0; baptism_src = 0; death = DontKnowIfDead; death_place = 0; death_src = 0; burial = UnknownBurial; burial_place = 0; burial_src = 0; notes = 0; psources = 0; key_index = Adef.iper_of_int 0} ; value phony_family = {marriage = Adef.codate_None; marriage_place = 0; marriage_src = 0; witnesses = [| |]; relation = Married; divorce = NotDivorced; comment = 0; origin_file = 0; fsources = 0; fam_index = Adef.ifam_of_int 0} ; value ext phony v = let rlen = Array.length (Obj.magic v) in let alen = Array.length (Obj.magic phony) in if rlen = alen then v else if rlen < alen then do { let x = Array.copy (Obj.magic phony) in Array.blit (Obj.magic v) 0 x 0 rlen; Obj.magic x } else failwith "this is a GeneWeb base, but not compatible; please upgrade" ; value array_ext phony fa = let a = Obj.magic fa in if Array.length a = 0 then fa else let rlen = Array.length a.(0) in let alen = Array.length (Obj.magic phony) in if rlen = alen then fa else if rlen < alen then do { IFDEF UNIX THEN if verbose.val then do { Printf.eprintf "*** extending records from size %d to size %d\n" rlen alen; flush stderr; } else () ELSE () END; for i = 0 to Array.length a - 1 do { let x = Array.copy (Obj.magic phony) in Array.blit a.(i) 0 x 0 rlen; a.(i) := x; }; fa } else failwith "this is a GeneWeb base, but not compatible; please upgrade" ; value make_record_access ic ic_acc shift array_pos (plenr, patches) len name input_array input_item = let v_ext v = if name = "persons" then ext phony_person v else if name = "families" then ext phony_family v else v in let v_arr_ext v = if name = "persons" then array_ext phony_person v else if name = "families" then array_ext phony_family v else v in let tab = ref None in let cleared = ref False in let gen_get i = match tab.val with [ Some x -> x.(i) | None -> try let v = Hashtbl.find patches i in v_ext v with [ Not_found -> if i < 0 || i >= len then failwith ("access " ^ name ^ " out of bounds; i = " ^ string_of_int i) else match ic_acc with [ Some ic_acc -> do { seek_in ic_acc (shift + Iovalue.sizeof_long * i); let pos = input_binary_int ic_acc in seek_in ic pos; let v = input_item ic in v_ext v } | None -> do { Printf.eprintf "Sorry; I really need base.acc\n"; flush stderr; failwith "cannot access database" } ] ] ] in let rec array () = match tab.val with [ Some x -> x | None -> do { IFDEF UNIX THEN if verbose.val then do { Printf.eprintf "*** read %s%s\n" name (if cleared.val then " (again)" else ""); flush stderr; } else () ELSE () END; seek_in ic array_pos; let v = input_array ic in let v = v_arr_ext v in let t = apply_patches v v_ext patches r.len in tab.val := Some t; t } ] and r = {load_array () = let _ = array () in (); get = gen_get; set i v = (array ()).(i) := v; len = max len plenr.val; output_array oc = output_value_no_sharing oc (array () : array _); clear_array () = do { cleared.val := True; tab.val := None }} in r ; value magic_patch = "GnPa0001"; value check_patch_magic = let b = Bytes.create (String.length magic_patch) in fun ic -> do { really_input ic b 0 (String.length b); b = magic_patch } ; value input_patches bname = match try Some (Secure.open_in_bin (Filename.concat bname "patches")) with _ -> None with [ Some ic -> do { let r = if check_patch_magic ic then (input_value ic : patches_ht) else do { (* old implementation of patches *) seek_in ic 0; let patches : Old.patches = input_value ic in let ht = {h_person = (ref 0, Hashtbl.create 1); h_ascend = (ref 0, Hashtbl.create 1); h_union = (ref 0, Hashtbl.create 1); h_family = (ref 0, Hashtbl.create 1); h_couple = (ref 0, Hashtbl.create 1); h_descend = (ref 0, Hashtbl.create 1); h_string = (ref 0, Hashtbl.create 1); h_name = Hashtbl.create 1} in let add (ir, ht) (k, v) = do { if k >= ir.val then ir.val := k + 1 else (); Hashtbl.add ht k v; } in List.iter (add ht.h_person) patches.Old.p_person.val; List.iter (add ht.h_ascend) patches.Old.p_ascend.val; List.iter (add ht.h_union) patches.Old.p_union.val; List.iter (add ht.h_family) patches.Old.p_family.val; List.iter (add ht.h_couple) patches.Old.p_couple.val; List.iter (add ht.h_descend) patches.Old.p_descend.val; List.iter (add ht.h_string) patches.Old.p_string.val; List.iter (add (ref 0, ht.h_name)) patches.Old.p_name.val; ht } in close_in ic; r } | None -> {h_person = (ref 0, Hashtbl.create 1); h_ascend = (ref 0, Hashtbl.create 1); h_union = (ref 0, Hashtbl.create 1); h_family = (ref 0, Hashtbl.create 1); h_couple = (ref 0, Hashtbl.create 1); h_descend = (ref 0, Hashtbl.create 1); h_string = (ref 0, Hashtbl.create 1); h_name = Hashtbl.create 1} ] ; value person_of_key persons strings persons_of_name first_name surname occ = if first_name = "?" || surname = "?" then None else let first_name = nominative first_name in let surname = nominative surname in let ipl = persons_of_name (first_name ^ " " ^ surname) in let first_name = Name.lower first_name in let surname = Name.lower surname in let rec find = fun [ [ip :: ipl] -> let p = persons.get (Adef.int_of_iper ip) in if occ = p.occ && first_name = Name.lower (strings.get (Adef.int_of_istr p.first_name)) && surname = Name.lower (strings.get (Adef.int_of_istr p.surname)) then Some ip else find ipl | _ -> None ] in find ipl ; value opendb bname = let bname = if Filename.check_suffix bname ".gwb" then bname else bname ^ ".gwb" in let patches = input_patches bname in let particles = Mutil.input_particles (Filename.concat bname "particles.txt") in let ic = let ic = Secure.open_in_bin (Filename.concat bname "base") in do { check_magic ic; ic } in let persons_len = input_binary_int ic in let families_len = input_binary_int ic in let strings_len = input_binary_int ic in let persons_array_pos = input_binary_int ic in let ascends_array_pos = input_binary_int ic in let unions_array_pos = input_binary_int ic in let families_array_pos = input_binary_int ic in let couples_array_pos = input_binary_int ic in let descends_array_pos = input_binary_int ic in let strings_array_pos = input_binary_int ic in let norigin_file = input_value ic in let ic_acc = try Some (Secure.open_in_bin (Filename.concat bname "base.acc")) with [ Sys_error _ -> do { Printf.eprintf "File base.acc not found; trying to continue...\n"; flush stderr; None } ] in let ic2 = try Some (Secure.open_in_bin (Filename.concat bname "strings.inx")) with [ Sys_error _ -> do { Printf.eprintf "File strings.inx not found; trying to continue...\n"; flush stderr; None } ] in let ic2_string_start_pos = 3 * int_size in let ic2_string_hash_len = match ic2 with [ Some ic2 -> Some (input_binary_int ic2) | None -> None ] in let ic2_surname_start_pos = match ic2 with [ Some ic2 -> Some (input_binary_int ic2) | None -> None ] in let ic2_first_name_start_pos = match ic2 with [ Some ic2 -> Some (input_binary_int ic2) | None -> None ] in let shift = 0 in let persons = make_record_access ic ic_acc shift persons_array_pos patches.h_person persons_len "persons" (input_value : _ -> array person) (Iovalue.input : _ -> person) in let shift = shift + persons_len * Iovalue.sizeof_long in let ascends = make_record_access ic ic_acc shift ascends_array_pos patches.h_ascend persons_len "ascends" (input_value : _ -> array ascend) (Iovalue.input : _ -> ascend) in let shift = shift + persons_len * Iovalue.sizeof_long in let unions = make_record_access ic ic_acc shift unions_array_pos patches.h_union persons_len "unions" (input_value : _ -> array union) (Iovalue.input : _ -> union) in let shift = shift + persons_len * Iovalue.sizeof_long in let families = make_record_access ic ic_acc shift families_array_pos patches.h_family families_len "families" (input_value : _ -> array family) (Iovalue.input : _ -> family) in let shift = shift + families_len * Iovalue.sizeof_long in let couples = make_record_access ic ic_acc shift couples_array_pos patches.h_couple families_len "couples" (input_value : _ -> array couple) (Iovalue.input : _ -> couple) in let shift = shift + families_len * Iovalue.sizeof_long in let descends = make_record_access ic ic_acc shift descends_array_pos patches.h_descend families_len "descends" (input_value : _ -> array descend) (Iovalue.input : _ -> descend) in let shift = shift + families_len * Iovalue.sizeof_long in let strings = make_record_access ic ic_acc shift strings_array_pos patches.h_string strings_len "strings" (input_value : _ -> array string) (Iovalue.input : _ -> string) in let cleanup_ref = ref (fun () -> do { close_in ic; match ic_acc with [ Some ic_acc -> close_in ic_acc | None -> () ]; match ic2 with [ Some ic2 -> close_in ic2 | None -> () ]; }) in let cleanup () = cleanup_ref.val () in let commit_patches () = do { let tmp_fname = Filename.concat bname "1patches" in let fname = Filename.concat bname "patches" in let oc9 = try Secure.open_out_bin tmp_fname with [ Sys_error _ -> raise (Adef.Request_failure "the database is not writable") ] in output_string oc9 magic_patch; output_value_no_sharing oc9 (patches : patches_ht); close_out oc9; remove_file (fname ^ "~"); try Sys.rename fname (fname ^ "~") with [ Sys_error _ -> () ]; try Sys.rename tmp_fname fname with [ Sys_error _ -> () ]; } in let patched_ascends () = let r = ref [] in do { Hashtbl.iter (fun i _ -> r.val := [Adef.iper_of_int i :: r.val]) (snd patches.h_ascend); r.val } in let is_patched_person ip = Hashtbl.mem (snd patches.h_person) (Adef.int_of_iper ip) in let patch_person i p = let i = Adef.int_of_iper i in do { persons.len := max persons.len (i + 1); (fst patches.h_person).val := persons.len; Hashtbl.replace (snd patches.h_person) i p; } in let patch_ascend i a = let i = Adef.int_of_iper i in do { ascends.len := max ascends.len (i + 1); (fst patches.h_ascend).val := ascends.len; Hashtbl.replace (snd patches.h_ascend) i a; } in let patch_union i a = let i = Adef.int_of_iper i in do { unions.len := max unions.len (i + 1); (fst patches.h_union).val := ascends.len; Hashtbl.replace (snd patches.h_union) i a; } in let patch_family i f = let i = Adef.int_of_ifam i in do { families.len := max families.len (i + 1); (fst patches.h_family).val := families.len; Hashtbl.replace (snd patches.h_family) i f; } in let patch_couple i c = let i = Adef.int_of_ifam i in do { couples.len := max couples.len (i + 1); (fst patches.h_couple).val := couples.len; Hashtbl.replace (snd patches.h_couple) i c; } in let patch_descend i c = let i = Adef.int_of_ifam i in do { descends.len := max descends.len (i + 1); (fst patches.h_descend).val := descends.len; Hashtbl.replace (snd patches.h_descend) i c; } in let index_of_string = index_of_string strings ic2 ic2_string_start_pos ic2_string_hash_len (snd patches.h_string) in let insert_string s = try index_of_string s with [ Not_found -> do { let i = strings.len in strings.len := max strings.len (i + 1); (fst patches.h_string).val := strings.len; Hashtbl.replace (snd patches.h_string) i s; Adef.istr_of_int i } ] in let patch_name s ip = let s = Name.crush_lower s in let i = Hashtbl.hash s in try let ipl = Hashtbl.find patches.h_name i in if List.mem ip ipl then () else Hashtbl.replace patches.h_name i [ip :: ipl] with [ Not_found -> Hashtbl.add patches.h_name i [ip] ] in let read_notes fnotes rn_mode = let fname = if fnotes = "" then "notes" else Filename.concat "notes_d" (fnotes ^ ".txt") in match try Some (Secure.open_in (Filename.concat bname fname)) with [ Sys_error _ -> None ] with [ Some ic -> do { let str = match rn_mode with [ RnDeg -> if in_channel_length ic = 0 then "" else " " | Rn1Ln -> try input_line ic with [ End_of_file -> "" ] | RnAll -> loop 0 where rec loop len = match try Some (input_char ic) with [ End_of_file -> None ] with [ Some c -> loop (Buff.store len c) | _ -> Buff.get len ] ] in close_in ic; str } | None -> "" ] in let commit_notes fnotes s = let fname = if fnotes = "" then "notes" else do { try Unix.mkdir (Filename.concat bname "notes_d") 0o755 with _ -> (); Filename.concat "notes_d" (fnotes ^ ".txt") } in let fname = Filename.concat bname fname in do { try Sys.remove (fname ^ "~") with [ Sys_error _ -> () ]; try Sys.rename fname (fname ^ "~") with _ -> (); if s = "" then () else do { let oc = Secure.open_out fname in output_string oc s; close_out oc; () } } in let ext_files () = let top = Filename.concat bname "notes_d" in loop [] (Filename.current_dir_name) where rec loop list subdir = let dir = Filename.concat top subdir in match try Some (Sys.readdir dir) with [ Sys_error _ -> None ] with [ Some files -> List.fold_left (fun files file -> let f = Filename.concat subdir file in if Filename.check_suffix f ".txt" then [Filename.chop_suffix f ".txt" :: files] else loop files f) list (Array.to_list files) | None -> list ] in let bnotes = {nread = read_notes; norigin_file = norigin_file; efiles = ext_files} in let base_data = {persons = persons; ascends = ascends; unions = unions; visible = make_visible_record_access bname persons; families = families; couples = couples; descends = descends; strings = strings; particles = particles; bnotes = bnotes; bdir = bname} in let persons_of_name = persons_of_name bname patches.h_name in let base_func = {person_of_key = person_of_key persons strings persons_of_name; persons_of_name = persons_of_name; strings_of_fsname = strings_of_fsname bname strings patches.h_person; persons_of_surname = persons_of_first_name_or_surname base_data strings (ic2, ic2_surname_start_pos, fun p -> p.surname, snd patches.h_person, "snames.inx", "snames.dat", bname); persons_of_first_name = persons_of_first_name_or_surname base_data strings (ic2, ic2_first_name_start_pos, fun p -> p.first_name, snd patches.h_person, "fnames.inx", "fnames.dat", bname); patch_person = patch_person; patch_ascend = patch_ascend; patch_union = patch_union; patch_family = patch_family; patch_couple = patch_couple; patch_descend = patch_descend; patch_name = patch_name; insert_string = insert_string; commit_patches = commit_patches; patched_ascends = patched_ascends; is_patched_person = is_patched_person; commit_notes = commit_notes; cleanup = cleanup} in {data = base_data; func = base_func} ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/updateInd.ml0000660000175200017530000004054112664543647023463 0ustar guillaumeguillaume(* camlp5r ./pa_html.cmo *) (* $Id: updateInd.ml,v 5.15 2008-01-08 11:58:46 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Config; open Def; open Gwdb; open Hutil; open TemplAst; open Util; value bogus_person_index = Adef.iper_of_int (-1); value string_person_of base p = let fp ip = let p = poi base ip in (sou base (get_first_name p), sou base (get_surname p), get_occ p, Update.Link, "") in Futil.map_person_ps fp (sou base) (gen_person_of_person p) ; (* Interpretation of template file 'updind.txt' *) type env 'a = [ Vstring of string | Vint of int | Vother of 'a | Vnone ] ; value get_env v env = try List.assoc v env with [ Not_found -> Vnone ]; value get_vother = fun [ Vother x -> Some x | _ -> None ]; value set_vother x = Vother x; value extract_var sini s = let len = String.length sini in if String.length s > len && String.sub s 0 (String.length sini) = sini then String.sub s len (String.length s - len) else "" ; value obsolete_list = ref []; value obsolete version var new_var r = if List.mem var obsolete_list.val then r else IFDEF UNIX THEN do { Printf.eprintf "*** updind.txt: \"%s\" obsolete since v%s%s\n" var version (if new_var = "" then "" else "; rather use \"" ^ new_var ^ "\""); flush stderr; obsolete_list.val := [var :: obsolete_list.val]; r } ELSE r END ; value bool_val x = VVbool x; value str_val x = VVstring x; value rec eval_var conf base env p loc sl = try eval_special_var conf base p sl with [ Not_found -> eval_simple_var conf base env p loc sl ] and eval_simple_var conf base env p loc = fun [ ["alias"] -> eval_string_env "alias" env | ["acc_if_titles"] -> bool_val (p.access = IfTitles) | ["acc_private"] -> bool_val (p.access = Private) | ["acc_public"] -> bool_val (p.access = Public) | ["bapt_place"] -> str_val (quote_escaped p.baptism_place) | ["bapt_src"] -> str_val (quote_escaped p.baptism_src) | ["birth"; s] -> eval_date_var (Adef.od_of_codate p.birth) s | ["birth_place"] -> str_val (quote_escaped p.birth_place) | ["birth_src"] -> str_val (quote_escaped p.birth_src) | ["bapt"; s] -> eval_date_var (Adef.od_of_codate p.baptism) s | ["bt_buried"] -> bool_val (match p.burial with [ Buried _ -> True | _ -> False ]) | ["bt_cremated"] -> bool_val (match p.burial with [ Cremated _ -> True | _ -> False ]) | ["bt_unknown_burial"] -> bool_val (p.burial = UnknownBurial) | ["burial"; s] -> let od = match p.burial with [ Buried cod -> Adef.od_of_codate cod | Cremated cod -> Adef.od_of_codate cod | _ -> None ] in eval_date_var od s | ["burial_place"] -> str_val (quote_escaped p.burial_place) | ["burial_src"] -> str_val (quote_escaped p.burial_src) | ["cnt"] -> eval_int_env "cnt" env | ["dead_dont_know_when"] -> bool_val (p.death = DeadDontKnowWhen) | ["death"; s] -> let od = match p.death with [ Death _ cd -> Some (Adef.date_of_cdate cd) | _ -> None ] in eval_date_var od s | ["death_place"] -> str_val (quote_escaped p.death_place) | ["death_src"] -> str_val (quote_escaped p.death_src) | ["died_young"] -> bool_val (p.death = DeadYoung) | ["digest"] -> eval_string_env "digest" env | ["dont_know_if_dead"] -> bool_val (p.death = DontKnowIfDead) | ["dr_disappeared"] -> eval_is_death_reason Disappeared p.death | ["dr_executed"] -> eval_is_death_reason Executed p.death | ["dr_killed"] -> eval_is_death_reason Killed p.death | ["dr_murdered"] -> eval_is_death_reason Murdered p.death | ["dr_unspecified"] -> eval_is_death_reason Unspecified p.death | ["first_name"] -> str_val (quote_escaped p.first_name) | ["first_name_alias"] -> eval_string_env "first_name_alias" env | ["has_aliases"] -> bool_val (p.aliases <> []) | ["has_birth_date"] -> bool_val (Adef.od_of_codate p.birth <> None) | ["has_first_names_aliases"] -> bool_val (p.first_names_aliases <> []) | ["has_qualifiers"] -> bool_val (p.qualifiers <> []) | ["has_relations"] -> bool_val (p.rparents <> []) | ["has_surnames_aliases"] -> bool_val (p.surnames_aliases <> []) | ["has_titles"] -> bool_val (p.titles <> []) | ["image"] -> str_val (quote_escaped p.image) | ["index"] -> str_val (string_of_int (Adef.int_of_iper p.key_index)) | ["is_female"] -> bool_val (p.sex = Female) | ["is_male"] -> bool_val (p.sex = Male) | ["not_dead"] -> bool_val (p.death = NotDead) | ["notes"] -> str_val (quote_escaped p.notes) | ["occ"] -> str_val (if p.occ <> 0 then string_of_int p.occ else "") | ["occupation"] -> str_val (quote_escaped p.occupation) | ["of_course_dead"] -> bool_val (p.death = OfCourseDead) | ["public_name"] -> str_val (quote_escaped p.public_name) | ["qualifier"] -> eval_string_env "qualifier" env | ["relation" :: sl] -> let r = match get_env "cnt" env with [ Vint i -> try Some (List.nth p.rparents (i - 1)) with [ Failure _ -> None ] | _ -> None ] in eval_relation_var conf base env r sl | ["sources"] -> str_val (quote_escaped p.psources) | ["surname"] -> str_val (quote_escaped p.surname) | ["surname_alias"] -> eval_string_env "surname_alias" env | ["title" :: sl] -> let t = match get_env "cnt" env with [ Vint i -> try Some (List.nth p.titles (i - 1)) with [ Failure _ -> None ] | _ -> None ] in eval_title_var conf base env t sl | ["title_date_start"; s] -> let od = match get_env "cnt" env with [ Vint i -> try let t = List.nth p.titles (i - 1) in Adef.od_of_codate t.t_date_start with [ Failure _ -> None ] | _ -> None ] in eval_date_var od s | ["title_date_end"; s] -> let od = match get_env "cnt" env with [ Vint i -> try let t = List.nth p.titles (i - 1) in Adef.od_of_codate t.t_date_end with [ Failure _ -> None ] | _ -> None ] in eval_date_var od s | [s] -> let v = extract_var "evar_" s in if v <> "" then match p_getenv (conf.env @ conf.henv) v with [ Some vv -> str_val (quote_escaped vv) | None -> str_val "" ] else let v = extract_var "bvar_" s in let v = if v = "" then extract_var "cvar_" s (* deprecated since 5.00 *) else v in if v <> "" then str_val (try List.assoc v conf.base_env with [ Not_found -> "" ]) else raise Not_found | _ -> raise Not_found ] and eval_date_var od s = str_val (eval_date_var_aux od s) and eval_date_var_aux od = fun [ "calendar" -> match od with [ Some (Dgreg _ Dgregorian) -> "gregorian" | Some (Dgreg _ Djulian) -> "julian" | Some (Dgreg _ Dfrench) -> "french" | Some (Dgreg _ Dhebrew) -> "hebrew" | _ -> "" ] | "day" -> match eval_date_field od with [ Some d -> if d.day = 0 then "" else string_of_int d.day | None -> "" ] | "month" -> match eval_date_field od with [ Some d -> if d.month = 0 then "" else match od with [ Some (Dgreg _ Dfrench) -> short_f_month d.month | _ -> string_of_int d.month ] | None -> "" ] | "oryear" -> match od with [ Some (Dgreg {prec = OrYear y} _) -> string_of_int y | Some (Dgreg {prec = YearInt y} _) -> string_of_int y | _ -> "" ] | "prec" -> match od with [ Some (Dgreg {prec = Sure} _) -> "sure" | Some (Dgreg {prec = About} _) -> "about" | Some (Dgreg {prec = Maybe} _) -> "maybe" | Some (Dgreg {prec = Before} _) -> "before" | Some (Dgreg {prec = After} _) -> "after" | Some (Dgreg {prec = OrYear _} _) -> "oryear" | Some (Dgreg {prec = YearInt _} _) -> "yearint" | _ -> "" ] | "text" -> match od with [ Some (Dtext s) -> s | _ -> "" ] | "year" -> match eval_date_field od with [ Some d -> string_of_int d.year | None -> "" ] | x -> let r = match x with [ "cal_french" -> eval_is_cal Dfrench od | "cal_gregorian" -> eval_is_cal Dgregorian od | "cal_hebrew" -> eval_is_cal Dhebrew od | "cal_julian" -> eval_is_cal Djulian od | "prec_no" -> if od = None then "1" else "" | "prec_sure" -> eval_is_prec (fun [ Sure -> True | _ -> False ]) od | "prec_about" -> eval_is_prec (fun [ About -> True | _ -> False ]) od | "prec_maybe" -> eval_is_prec (fun [ Maybe -> True | _ -> False ]) od | "prec_before" -> eval_is_prec (fun [ Before -> True | _ -> False ]) od | "prec_after" -> eval_is_prec (fun [ After -> True | _ -> False ]) od | "prec_oryear" -> eval_is_prec (fun [ OrYear _ -> True | _ -> False ]) od | "prec_yearint" -> eval_is_prec (fun [ YearInt _ -> True | _ -> False ]) od | _ -> raise Not_found ] in obsolete "5.00" x (if x.[0] = 'c' then "calendar" else "prec") r ] and eval_date_field = fun [ Some d -> match d with [ Dgreg d Dgregorian -> Some d | Dgreg d Djulian -> Some (Calendar.julian_of_gregorian d) | Dgreg d Dfrench -> Some (Calendar.french_of_gregorian d) | Dgreg d Dhebrew -> Some (Calendar.hebrew_of_gregorian d) | _ -> None ] | None -> None ] and eval_title_var conf base env t = fun [ ["t_estate"] -> match t with [ Some {t_place = x} -> str_val (quote_escaped x) | _ -> str_val "" ] | ["t_ident"] -> match t with [ Some {t_ident = x} -> str_val (quote_escaped x) | _ -> str_val "" ] | ["t_main"] -> match t with [ Some {t_name = Tmain} -> bool_val True | _ -> bool_val False ] | ["t_name"] -> match t with [ Some {t_name = Tname x} -> str_val (quote_escaped x) | _ -> str_val "" ] | ["t_nth"] -> match t with [ Some {t_nth = x} -> str_val (if x = 0 then "" else string_of_int x) | _ -> str_val "" ] | _ -> raise Not_found ] and eval_relation_var conf base env r = fun [ ["r_father" :: sl] -> let x = match r with [ Some {r_fath = Some x} -> x | _ -> ("", "", 0, Update.Create Neuter None, "") ] in eval_person_var conf base env x sl | ["r_mother" :: sl] -> let x = match r with [ Some {r_moth = Some x} -> x | _ -> ("", "", 0, Update.Create Neuter None, "") ] in eval_person_var conf base env x sl | ["rt_adoption"] -> eval_is_relation_type Adoption r | ["rt_candidate_parent"] -> eval_is_relation_type CandidateParent r | ["rt_empty"] -> match r with [ Some {r_fath = None; r_moth = None} | None -> bool_val True | _ -> bool_val False ] | ["rt_foster_parent"] -> eval_is_relation_type FosterParent r | ["rt_godparent"] -> eval_is_relation_type GodParent r | ["rt_recognition"] -> eval_is_relation_type Recognition r | _ -> raise Not_found ] and eval_person_var conf base env (fn, sn, oc, create, var) = fun [ ["create"] -> match create with [ Update.Create _ _ -> bool_val True | _ -> bool_val False ] | ["first_name"] -> str_val (quote_escaped fn) | ["link"] -> bool_val (create = Update.Link) | ["occ"] -> str_val (if oc = 0 then "" else string_of_int oc) | ["surname"] -> str_val (quote_escaped sn) | _ -> raise Not_found ] and eval_is_cal cal = fun [ Some (Dgreg _ x) -> if x = cal then "1" else "" | _ -> "" ] and eval_is_prec cond = fun [ Some (Dgreg {prec = x} _) -> if cond x then "1" else "" | _ -> "" ] and eval_is_death_reason dr = fun [ Death dr1 _ -> bool_val (dr = dr1) | _ -> bool_val False ] and eval_is_relation_type rt = fun [ Some {r_fath = None; r_moth = None} -> bool_val False | Some {r_type = x} -> bool_val (x = rt) | _ -> bool_val False ] and eval_special_var conf base p = fun [ ["include_perso_header"] -> match p_getint conf.env "i" with [ Some i -> let has_base_loop = try do { let _ = Util.create_topological_sort conf base in False } with [ Consang.TopologicalSortError p -> True ] in if has_base_loop then VVstring "" else do { let p = poi base (Adef.iper_of_int i) in Perso.interp_templ_with_menu (fun _ -> ()) "perso_header" conf base p; VVstring "" } | None -> VVstring "" ] | _ -> raise Not_found ] and eval_int_env var env = match get_env var env with [ Vint x -> str_val (string_of_int x) | _ -> raise Not_found ] and eval_string_env var env = match get_env var env with [ Vstring x -> str_val (quote_escaped x) | _ -> str_val "" ] ; (* print *) value print_foreach print_ast eval_expr = let rec print_foreach env p loc s sl _ al = match [s :: sl] with [ ["alias"] -> print_foreach_string env p al p.aliases s | ["first_name_alias"] -> print_foreach_string env p al p.first_names_aliases s | ["qualifier"] -> print_foreach_string env p al p.qualifiers s | ["surname_alias"] -> print_foreach_string env p al p.surnames_aliases s | ["relation"] -> print_foreach_relation env p al p.rparents | ["title"] -> print_foreach_title env p al p.titles | _ -> raise Not_found ] and print_foreach_string env p al list lab = let _ = List.fold_left (fun cnt nn -> let env = [(lab, Vstring nn) :: env] in let env = [("cnt", Vint cnt) :: env] in do { List.iter (print_ast env p) al; cnt + 1 }) 0 list in () and print_foreach_relation env p al list = let _ = List.fold_left (fun cnt nn -> let env = [("cnt", Vint cnt) :: env] in do { List.iter (print_ast env p) al; cnt + 1 }) 1 list in () and print_foreach_title env p al list = let _ = List.fold_left (fun cnt nn -> let env = [("cnt", Vint cnt) :: env] in do { List.iter (print_ast env p) al; cnt + 1 }) 1 list in () in print_foreach ; value print_update_ind conf base p digest = match p_getenv conf.env "m" with [ Some ("MRG_IND_OK" | "MRG_MOD_IND_OK") | Some ("MOD_IND" | "MOD_IND_OK") | Some ("ADD_IND" | "ADD_IND_OK") -> let env = [("digest", Vstring digest)] in Hutil.interp conf base "updind" {Templ.eval_var = eval_var conf base; Templ.eval_transl _ = Templ.eval_transl conf; Templ.eval_predefined_apply _ = raise Not_found; Templ.get_vother = get_vother; Templ.set_vother = set_vother; Templ.print_foreach = print_foreach} env p | _ -> incorrect_request conf ] ; value print_del1 conf base p = let title _ = let s = transl_nth conf "person/persons" 0 in Wserver.wprint "%s" (capitale (transl_decline conf "delete" s)) in do { Perso.interp_notempl_with_menu title "perso_header" conf base p; tag "h2" begin title False; end; tag "form" "method=\"post\" action=\"%s\"" conf.command begin tag "p" begin Util.hidden_env conf; xtag "input" "type=\"hidden\" name=\"m\" value=\"DEL_IND_OK\""; xtag "input" "type=\"hidden\" name=\"i\" value=\"%d\"" (Adef.int_of_iper (get_key_index p)); xtag "input" "type=\"submit\" value=\"Ok\""; end; end; trailer conf; } ; value print_add conf base = let p = {first_name = ""; surname = ""; occ = 0; image = ""; first_names_aliases = []; surnames_aliases = []; public_name = ""; qualifiers = []; aliases = []; titles = []; rparents = []; related = []; occupation = ""; sex = Neuter; access = IfTitles; birth = Adef.codate_None; birth_place = ""; birth_src = ""; baptism = Adef.codate_None; baptism_place = ""; baptism_src = ""; death = DontKnowIfDead; death_place = ""; death_src = ""; burial = UnknownBurial; burial_place = ""; burial_src = ""; notes = ""; psources = ""; key_index = bogus_person_index} in print_update_ind conf base p "" ; value print_mod conf base = match p_getint conf.env "i" with [ Some i -> let p = poi base (Adef.iper_of_int i) in let sp = string_person_of base p in let digest = Update.digest_person sp in print_update_ind conf base sp digest | _ -> incorrect_request conf ] ; value print_del conf base = match p_getint conf.env "i" with [ Some i -> let p = poi base (Adef.iper_of_int i) in print_del1 conf base p | _ -> incorrect_request conf ] ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/birthDeath.ml0000660000175200017530000006041712664543647023630 0ustar guillaumeguillaume(* camlp5r ./def_syn.cmo ./pa_html.cmo *) (* $Id: birthDeath.ml,v 5.40 2008-11-03 15:40:10 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Config; open Def; open Gwdb; open Hutil; open Util; value get_k conf = match p_getint conf.env "k" with [ Some x -> x | _ -> try int_of_string (List.assoc "latest_event" conf.base_env) with [ Not_found | Failure _ -> 20 ] ] ; value select conf base get_date find_oldest = let module Q = Pqueue.Make (struct type t = (Gwdb.person * Def.dmy * Def.calendar); value leq (_, x, _) (_, y, _) = if find_oldest then Date.before_date x y else Date.before_date y x ; end) in let n = min (max 0 (get_k conf)) (nb_of_persons base) in let ref_date = match p_getint conf.env "by" with [ Some by -> let bm = match p_getint conf.env "bm" with [ Some x -> x | None -> -1 ] in let bd = match p_getint conf.env "bd" with [ Some x -> x | None -> -1 ] in Some {day = bd; month = bm; year = by; prec = Sure; delta = 0} | None -> None ] in let rec loop q len i = if i = nb_of_persons base then let rec loop list q = if Q.is_empty q then (list, len) else let (e, q) = Q.take q in loop [e :: list] q in loop [] q else let p = pget conf base (Adef.iper_of_int i) in match get_date p with [ Some (Dgreg d cal) -> let aft = match ref_date with [ Some ref_date -> Date.before_date d ref_date | None -> False ] in if aft then loop q len (i + 1) else let e = (p, d, cal) in if len < n then loop (Q.add e q) (len + 1) (i + 1) else loop (snd (Q.take (Q.add e q))) len (i + 1) | _ -> loop q len (i + 1) ] in loop Q.empty 0 0 ; value select_family conf base get_date find_oldest = let module QF = Pqueue.Make (struct type t = (Adef.ifam * Gwdb.family * Def.dmy * Def.calendar); value leq (_, _, x, _) (_, _, y, _) = if find_oldest then Date.before_date x y else Date.before_date y x; end) in let n = min (max 0 (get_k conf)) (nb_of_families base) in let ref_date = match p_getint conf.env "by" with [ Some by -> let bm = match p_getint conf.env "bm" with [ Some x -> x | None -> -1 ] in let bd = match p_getint conf.env "bd" with [ Some x -> x | None -> -1 ] in Some {day = bd; month = bm; year = by; prec = Sure; delta = 0} | None -> None ] in let rec loop q len i = if i = nb_of_families base then let rec loop list q = if QF.is_empty q then (list, len) else let (e, q) = QF.take q in loop [e :: list] q in loop [] q else let fam = foi base (Adef.ifam_of_int i) in if is_deleted_family fam then loop q len (i + 1) else match get_date (Adef.ifam_of_int i) fam with [ Some (Dgreg d cal) -> let aft = match ref_date with [ Some ref_date -> Date.before_date d ref_date | None -> False ] in if aft then loop q len (i + 1) else let e = (Adef.ifam_of_int i, fam, d, cal) in if len < n then loop (QF.add e q) (len + 1) (i + 1) else loop (snd (QF.take (QF.add e q))) len (i + 1) | _ -> loop q len (i + 1) ] in loop QF.empty 0 0 ; value print_birth conf base = let (list, len) = select conf base (fun p -> Adef.od_of_codate (get_birth p)) False in let title _ = Wserver.wprint (fcapitale (ftransl conf "the latest %d births")) len in do { header conf title; print_link_to_welcome conf True; Wserver.wprint "
        \n"; let _ = List.fold_left (fun (last_month_txt, was_future) (p, d, cal) -> let month_txt = let d = {(d) with day = 0} in capitale (Date.string_of_date conf (Dgreg d cal)) in let future = CheckItem.strictly_after_dmy d conf.today in do { if not future && was_future then do { Wserver.wprint "\n
      \n
    • \n\n

      \n

        \n"; Wserver.wprint "
      • %s\n" month_txt; Wserver.wprint "
          \n"; } else if month_txt <> last_month_txt then do { if last_month_txt = "" then () else Wserver.wprint "
        \n
      • \n"; Wserver.wprint "
      • %s\n" month_txt; Wserver.wprint "
          \n"; } else (); stagn "li" begin stag "b" begin Wserver.wprint "%s" (referenced_person_text conf base p); end; Wserver.wprint ",\n"; if future then Wserver.wprint "%s.\n" (Date.string_of_date conf (Dgreg d cal)) else Wserver.wprint "%s %s.\n" (transl_nth conf "born" (index_of_sex (get_sex p))) (Date.string_of_ondate conf (Dgreg d cal)); end; (month_txt, future) }) ("", False) list in Wserver.wprint "
        \n
      • \n
      \n"; trailer conf; } ; value death_date p = match get_death p with [ Death _ cd -> Some (Adef.date_of_cdate cd) | _ -> None ] ; value print_death conf base = let (list, len) = select conf base death_date False in let title _ = Wserver.wprint (fcapitale (ftransl conf "the latest %t deaths")) (fun _ -> string_of_int len) in do { header conf title; print_link_to_welcome conf True; if list <> [] then do { Wserver.wprint "
        \n"; let (_, ages_sum, ages_nb) = List.fold_left (fun (last_month_txt, ages_sum, ages_nb) (p, d, cal) -> let month_txt = let d = {(d) with day = 0} in capitale (Date.string_of_date conf (Dgreg d cal)) in do { if month_txt <> last_month_txt then do { if last_month_txt = "" then () else Wserver.wprint "
      \n\n"; Wserver.wprint "
    • %s\n" month_txt; Wserver.wprint "
        \n"; } else (); let (age, ages_sum, ages_nb) = let sure d = d.prec = Sure in match Adef.od_of_codate (get_birth p) with [ Some (Dgreg d1 _) -> if sure d1 && sure d && d1 <> d then let a = CheckItem.time_elapsed d1 d in let ages_sum = match get_sex p with [ Male -> (fst ages_sum + a.year, snd ages_sum) | Female -> (fst ages_sum, snd ages_sum + a.year) | Neuter -> ages_sum ] in let ages_nb = match get_sex p with [ Male -> (fst ages_nb + 1, snd ages_nb) | Female -> (fst ages_nb, snd ages_nb + 1) | Neuter -> ages_nb ] in (Some a, ages_sum, ages_nb) else (None, ages_sum, ages_nb) | _ -> (None, ages_sum, ages_nb) ] in stagn "li" begin Wserver.wprint ""; Wserver.wprint "%s" (referenced_person_text conf base p); Wserver.wprint ""; Wserver.wprint ", %s %s" (transl_nth conf "died" (index_of_sex (get_sex p))) (Date.string_of_ondate conf (Dgreg d cal)); match age with [ Some a -> Wserver.wprint " (%s)" (Date.string_of_age conf a) | None -> () ]; end; (month_txt, ages_sum, ages_nb) }) ("", (0, 0), (0, 0)) list in Wserver.wprint "
      \n
    • \n\n"; if fst ages_nb >= 3 then Wserver.wprint "%s (%s) : %s\n" (capitale (transl conf "average age at death")) (transl_nth conf "M/F" 0) (Date.string_of_age conf {day = 0; month = 0; year = fst ages_sum / fst ages_nb; delta = 0; prec = Sure}) conf.xhs else (); if snd ages_nb >= 3 then Wserver.wprint "%s (%s) : %s\n" (capitale (transl conf "average age at death")) (transl_nth conf "M/F" 1) (Date.string_of_age conf {day = 0; month = 0; year = snd ages_sum / snd ages_nb; delta = 0; prec = Sure}) conf.xhs else (); xtag "br"; tag "div" "align=\"center\"" begin xtag "hr" "width=\"50%%\""; end; xtag "br"; let by = match p_getenv conf.env "by" with [ Some s -> s | None -> string_of_int conf.today.year ] in let bm = match p_getenv conf.env "bm" with [ Some s -> s | None -> string_of_int conf.today.month ] in let bd = match p_getenv conf.env "bd" with [ Some s -> s | None -> string_of_int conf.today.day ] in tag "form" "method=\"get\" action=\"%s\"" conf.command begin tag "p" begin Util.hidden_env conf; xtag "input" "type=\"hidden\" name=\"m\" value=\"LD\""; let ds = Printf.sprintf "" len conf.xhs in Wserver.wprint (fcapitale (ftransl conf "the latest %t deaths")) (fun _ -> ds); Wserver.wprint "\n... (%s...\n" (transl conf "before"); xtag "input" "name=\"by\" value=\"%s\" size=\"4\" maxlength=\"4\"" by; xtag "input" "name=\"bm\" value=\"%s\" size=\"2\" maxlength=\"2\"" bm; xtag "input" "name=\"bd\" value=\"%s\" size=\"2\" maxlength=\"2\"" bd; Wserver.wprint ")\n"; xtag "input" "type=\"submit\" value=\"Ok\""; end; end; } else (); trailer conf; } ; value print_oldest_alive conf base = let limit = match p_getint conf.env "lim" with [ Some x -> x | _ -> 0 ] in let get_oldest_alive p = match get_death p with [ NotDead -> Adef.od_of_codate (get_birth p) | DontKnowIfDead when limit > 0 -> match Adef.od_of_codate (get_birth p) with [ Some (Dgreg d _) as x when conf.today.year - d.year <= limit -> x | _ -> None ] | _ -> None ] in let (list, len) = select conf base get_oldest_alive True in let title _ = Wserver.wprint (fcapitale (ftransl conf "the %d oldest perhaps still alive")) len in do { header conf title; print_link_to_welcome conf True; tag "ul" begin List.iter (fun (p, d, cal) -> tag "li" begin Wserver.wprint "%s,\n" (referenced_person_text conf base p); Wserver.wprint "%s %s" (transl_nth conf "born" (index_of_sex (get_sex p))) (Date.string_of_ondate conf (Dgreg d cal)); if get_death p = NotDead && d.prec = Sure then do { let a = CheckItem.time_elapsed d conf.today in Wserver.wprint " (%s)" (Date.string_of_age conf a); } else (); Wserver.wprint "."; end) list; end; trailer conf; } ; value print_longest_lived conf base = let get_longest p = if Util.fast_auth_age conf p then match (Adef.od_of_codate (get_birth p), get_death p) with [ (Some (Dgreg bd _), Death _ cd) -> match Adef.date_of_cdate cd with [ Dgreg dd _ -> Some (Dgreg (CheckItem.time_elapsed bd dd) Dgregorian) | _ -> None ] | _ -> None ] else None in let (list, len) = select conf base get_longest False in let title _ = Wserver.wprint (fcapitale (ftransl conf "the %d who lived the longest")) len in do { header conf title; print_link_to_welcome conf True; Wserver.wprint "
        \n"; List.iter (fun (p, d, cal) -> tag "li" begin Wserver.wprint "\n"; Wserver.wprint "%s" (referenced_person_text conf base p); Wserver.wprint "%s" (Date.short_dates_text conf base p); Wserver.wprint "\n(%d %s)" d.year (transl conf "years old"); Wserver.wprint "."; end) list; Wserver.wprint "
      \n\n"; trailer conf; } ; value print_marr_or_eng conf base title list len = do { header conf title; print_link_to_welcome conf True; Wserver.wprint "
        \n"; let _ = List.fold_left (fun (last_month_txt, was_future) (ifam, fam, d, cal) -> let month_txt = let d = {(d) with day = 0} in capitale (Date.string_of_date conf (Dgreg d cal)) in let cpl = foi base ifam in let future = CheckItem.strictly_after_dmy d conf.today in do { if not future && was_future then do { Wserver.wprint "
      \n\n\n
        \n"; Wserver.wprint "
      • %s\n" month_txt; Wserver.wprint "
          \n"; } else if month_txt <> last_month_txt then do { if last_month_txt = "" then () else Wserver.wprint "
        \n
      • \n"; Wserver.wprint "
      • %s\n" month_txt; Wserver.wprint "
          \n"; } else (); stagn "li" begin stagn "b" begin Wserver.wprint "%s" (referenced_person_text conf base (pget conf base (get_father cpl))); end; Wserver.wprint "%s\n" (transl_nth conf "and" 0); stag "b" begin Wserver.wprint "%s" (referenced_person_text conf base (pget conf base (get_mother cpl))); end; Wserver.wprint ",\n"; if future then Wserver.wprint "%s." (Date.string_of_date conf (Dgreg d cal)) else Wserver.wprint "%s %s." (match get_relation fam with [ NotMarried | NoSexesCheckNotMarried -> transl_nth conf "relation/relations" 0 | Married | NoSexesCheckMarried -> transl conf "married" | Engaged -> transl conf "engaged" | NoMention -> "" ]) (Date.string_of_ondate conf (Dgreg d cal)); end; (month_txt, future) }) ("", False) list in Wserver.wprint "
        \n
      • \n
      \n"; trailer conf; } ; value print_marriage conf base = let (list, len) = select_family conf base (fun ifam fam -> if get_relation fam = Married then Adef.od_of_codate (get_marriage fam) else None) False in let title _ = Wserver.wprint (fcapitale (ftransl conf "the latest %d marriages")) len in print_marr_or_eng conf base title list len ; value print_oldest_engagements conf base = let (list, len) = select_family conf base (fun ifam fam -> if get_relation fam = Engaged then let husb = pget conf base (get_father fam) in let wife = pget conf base (get_mother fam) in match (get_death husb, get_death wife) with [ (NotDead | DontKnowIfDead, NotDead | DontKnowIfDead) -> Adef.od_of_codate (get_marriage fam) | _ -> None ] else None) True in let title _ = Wserver.wprint (fcapitale (ftransl conf "the %d oldest couples perhaps still alive and engaged")) len in print_marr_or_eng conf base title list len ; value old_print_statistics conf base = let title _ = Wserver.wprint "%s" (capitale (transl conf "statistics")) in let n = try int_of_string (List.assoc "latest_event" conf.base_env) with [ Not_found | Failure _ -> 20 ] in do { header conf title; print_link_to_welcome conf True; tag "ul" begin if conf.wizard || conf.friend then do { stagn "li" begin Wserver.wprint "" (commd conf) n; Wserver.wprint (ftransl conf "the latest %d births") n; Wserver.wprint ""; end; stagn "li" begin Wserver.wprint "" (commd conf) n; Wserver.wprint (ftransl conf "the latest %t deaths") (fun _ -> string_of_int n); Wserver.wprint ""; end; stagn "li" begin Wserver.wprint "" (commd conf) n; Wserver.wprint (ftransl conf "the latest %d marriages") n; Wserver.wprint ""; end; stagn "li" begin Wserver.wprint "" (commd conf) n; Wserver.wprint (ftransl conf "the %d oldest couples perhaps still alive and engaged") n; Wserver.wprint ""; end; stagn "li" begin Wserver.wprint "" (commd conf) n; Wserver.wprint (ftransl conf "the %d oldest perhaps still alive") n; Wserver.wprint ""; end } else (); stagn "li" begin Wserver.wprint "" (commd conf) n; Wserver.wprint (ftransl conf "the %d who lived the longest") n; Wserver.wprint ""; end; end; trailer conf; } ; (* *) type env 'a = [ Vother of 'a | Vnone ] ; value get_vother = fun [ Vother x -> Some x | _ -> None ]; value set_vother x = Vother x; value print_statistics conf base = if p_getenv conf.env "old" = Some "on" then old_print_statistics conf base else Hutil.interp conf base "stats" {Templ.eval_var _ = raise Not_found; Templ.eval_transl _ = Templ.eval_transl conf; Templ.eval_predefined_apply _ = raise Not_found; Templ.get_vother = get_vother; Templ.set_vother = set_vother; Templ.print_foreach _ = raise Not_found} [] () ; value print_population_pyramid conf base = do { let interval = match p_getint conf.env "int" with [ Some i -> max 1 i | None -> 5 ] in let limit = match p_getint conf.env "lim" with [ Some x -> x | _ -> 0 ] in let at_date = match p_getint conf.env "y" with [ Some i -> {year = i; month = 31; day = 12; prec = Sure; delta = 0} | None -> conf.today ] in let at_year = at_date.year in let nb_intervals = 150 / interval in let men = Array.make (nb_intervals + 1) 0 in let wom = Array.make (nb_intervals + 1) 0 in for i = 0 to nb_of_persons base - 1 do { let p = pget conf base (Adef.iper_of_int i) in let sex = get_sex p in let dea = get_death p in if sex <> Neuter then do { match Adef.od_of_codate (get_birth p) with [ Some (Dgreg dmy _) -> if not (Date.before_date dmy at_date) then let a = CheckItem.time_elapsed dmy at_date in let j = min nb_intervals (a.year / interval) in let ok = if dea = NotDead || dea = DontKnowIfDead && a.year < limit then True else match dea with [ Death _ cd -> match Adef.date_of_cdate cd with [ Dgreg d _ -> Date.before_date d at_date | _ -> False ] | _ -> False ] in if ok then if sex = Male then men.(j) := men.(j) + 1 else wom.(j) := wom.(j) + 1 else () else () | Some (Dtext _) | None -> () ]; } else () }; let string_of_nb n = Num.to_string_sep (transl conf "(thousand separator)") (Num.of_int n) in let title _ = Wserver.wprint "%s (%d)" (capitale (transl conf "population pyramid")) at_year in let print_image doit sex iname = stagn "td" begin if doit then xtag "img" "src=\"%s/%s\" alt=\"%s\" title=\"%s\"" (Util.image_prefix conf) iname (transl_nth conf "M/F" sex) (transl_nth conf "M/F" sex) else Wserver.wprint " "; end in Wserver.wrap_string.val := Util.xml_pretty_print; Hutil.header conf title; print_link_to_welcome conf True; let max_hum = let max_men = Array.fold_left max 0 men in let max_wom = Array.fold_left max 0 wom in max 1 (max max_men max_wom) in let max_size = 70 in let band_size n = (2 * max_size * n + max_hum) / (2 * max_hum) in let first_interv = loop nb_intervals where rec loop i = if i <= 0 then 0 else if men.(i) > 0 || wom.(i) > 0 then i else loop (i - 1) in tag "div" begin let c = " cellspacing=\"0\" cellpadding=\"0\"" in tag "table id=\"table_pop_pyr\"" "border=\"%d\"%s style=\"margin: auto\"" conf.border c begin for i = first_interv downto 0 do { let nb_men = men.(i) in let nb_wom = wom.(i) in tag "tr" begin stagn "td" "class=\"pyramid_year\"" begin Wserver.wprint "%d" (at_year - i * interval); end; stagn "td" begin Wserver.wprint " "; end; print_image (i = 0) 0 "male.png"; stagn "td" begin Wserver.wprint " "; end; tag "td" "align=\"right\"" begin tag "table" "%s" c begin tag "tr" begin stagn "td" "class=\"pyramid_nb\"" begin if nb_men <> 0 then Wserver.wprint "%d" nb_men else (); Wserver.wprint " "; end; stagn "td" begin if nb_men = 0 then () else let n = max 1 (band_size nb_men) in (* On multiplie par 3 parce que c'est *) (* la largeur de l'image : 3 x 14 *) Wserver.wprint ("") (n * 3) 14; end; end; end; end; stagn "td" "align=\"center\"" begin if i = nb_intervals then Wserver.wprint " " else Wserver.wprint "%d" ((i + 1) * interval); end; tag "td" "align=\"left\"" begin tag "table" "%s" c begin tag "tr" begin stagn "td" begin if nb_wom = 0 then () else let n = max 1 (band_size nb_wom) in (* On multiplie par 3 parce que c'est *) (* la largeur de l'image : 3 x 14 *) Wserver.wprint ("") (n * 3) 14; end; stagn "td" "class=\"pyramid_nb\"" begin Wserver.wprint " "; if nb_wom <> 0 then Wserver.wprint "%d" nb_wom else (); end; end; end; end; stagn "td" begin Wserver.wprint " "; end; print_image (i = 0) 1 "female.png"; stagn "td" begin Wserver.wprint " "; end; stagn "td" "class=\"pyramid_year\"" begin Wserver.wprint "%d" (at_year - i * interval); end; end; }; end; end; let sum_men = Array.fold_left \+ 0 men in let sum_wom = Array.fold_left \+ 0 wom in tag "p" begin Wserver.wprint "%s %s" (capitale (transl conf "number of living persons:")) (string_of_nb (sum_men + sum_wom)); end; tag "p" begin tag "form" "method=\"get\" action=\"%s\"" (commd conf) begin hidden_env conf; xtag "input" "type=\"hidden\" name=\"m\" value=\"POP_PYR\""; xtag "input" "type=\"hidden\" name=\"int\" value=\"%d\"" interval; xtag "input" "type=\"hidden\" name=\"lim\" value=\"%d\"" limit; Wserver.wprint "%s\n" (transl_nth conf "year/month/day" 0); xtag "input" "name=\"y\" value=\"%d\" size=\"5\"" at_year; end; end; Hutil.trailer conf; }; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/config.mli0000660000175200017530000000405112664543647023160 0ustar guillaumeguillaume(* $Id: config.mli,v 5.19 2007-07-25 14:19:55 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Def; type auth_scheme_kind = [ NoAuth | TokenAuth of token_auth_scheme | HttpAuth of http_auth_scheme ] and token_auth_scheme = { ts_user : string; ts_pass : string } and http_auth_scheme = [ Basic of basic_auth_scheme | Digest of digest_auth_scheme ] and basic_auth_scheme = { bs_realm : string; bs_user : string; bs_pass : string } and digest_auth_scheme = { ds_username : string; ds_realm : string; ds_nonce : string; ds_meth : string; ds_uri : string; ds_qop : string; ds_nc : string; ds_cnonce : string; ds_response : string } ; type config = { from : string; manitou : bool; supervisor : bool; wizard : bool; friend : bool; just_friend_wizard : bool; user : string; username : string; auth_scheme : auth_scheme_kind; cgi : bool; pure_xhtml : bool; command : string; indep_command : string; highlight : string; lang : string; default_lang : string; default_sosa_ref : (iper * option Gwdb.person); multi_parents : bool; can_send_image : bool; authorized_wizards_notes : bool; public_if_titles : bool; public_if_no_date : bool; cancel_links : mutable bool; setup_link : mutable bool; access_by_key : bool; private_years : int; hide_names : bool; use_restrict : bool; no_image : bool; no_note : bool; bname : string; env : list (string * string); senv : mutable list (string * string); henv : mutable list (string * string); base_env : list (string * string); allowed_titles : Lazy.t (list string); denied_titles : Lazy.t (list string); xhs : string; request : list string; lexicon : Hashtbl.t string string; charset : mutable string; is_rtl : bool; left : string; right : string; auth_file : string; border : int; n_connect : mutable option (int * int * int * list (string * float)); today : dmy; today_wd : int; time : (int * int * int); ctime : float } ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/iovalue.ml0000660000175200017530000002317412664543647023215 0ustar guillaumeguillaume(* camlp5r ./q_codes.cmo *) (* $Id: iovalue.ml,v 5.15 2012-01-27 16:27:46 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) value string_tag = Obj.tag (Obj.repr "a"); value float_tag = Obj.tag (Obj.repr 3.5); value fun_tag = Obj.tag (Obj.repr (fun x -> x)); (* Input: read inside a value output by output_value (no headers) must match OCaml's input_value system (intern.c) *) value sizeof_long = 4; value sign_extend_shift = (Sys.word_size / 8 - 1) * 8 - 1; value sign_extend x = (x lsl sign_extend_shift) asr sign_extend_shift; type in_funs 'a = { input_byte : 'a -> int; input_binary_int : 'a -> int; input : 'a -> string -> int -> int -> unit } ; value input_binary_int64 ifuns ic = loop 8 0 where rec loop cnt n = if cnt = 0 then n else loop (cnt - 1) (n lsl 8 + ifuns.input_byte ic) ; value rec input_loop ifuns ic = let code = ifuns.input_byte ic in if code >= <> then if code >= <> then input_block ifuns ic (code land 0xf) ((code lsr 4) land 0x7) else Obj.magic (code land 0x3f) else if code >= <> then let len = code land 0x1F in let s = Bytes.create len in do { ifuns.input ic s 0 len; Obj.magic s } else match code with [ <> -> Obj.magic (sign_extend (ifuns.input_byte ic)) | <> -> let h = ifuns.input_byte ic in Obj.magic ((sign_extend h) lsl 8 + ifuns.input_byte ic) | <> -> let x1 = ifuns.input_byte ic in let x2 = ifuns.input_byte ic in let x3 = ifuns.input_byte ic in let x4 = ifuns.input_byte ic in Obj.magic ((sign_extend x1) lsl 24 + x2 lsl 16 + x3 lsl 8 + x4) | <> -> let header = ifuns.input_binary_int ic in Obj.magic (input_block ifuns ic (header land 0xff) (header lsr 10)) | <> -> if Sys.word_size = 64 then let header = input_binary_int64 ifuns ic in Obj.magic (input_block ifuns ic (header land 0xff) (header lsr 10)) else failwith "input bad code block 64" | <> -> let len = ifuns.input_byte ic in let s = Bytes.create len in do { ifuns.input ic s 0 len; Obj.magic s } | <> -> let len = ifuns.input_binary_int ic in let s = Bytes.create len in do { ifuns.input ic s 0 len; Obj.magic s } | code -> failwith (Printf.sprintf "input bad code 0x%x" code) ] and input_block ifuns ic tag size = let v = if tag = 0 then Obj.magic (Array.make size (Obj.magic 0)) else Obj.new_block tag size in do { for i = 0 to size - 1 do { let x = input_loop ifuns ic in Obj.set_field v i (Obj.magic x); }; v } ; value in_channel_funs = {input_byte = input_byte; input_binary_int = input_binary_int; input = really_input} ; value input ic = Obj.magic (input_loop in_channel_funs ic); value gen_input ifuns i = Obj.magic (input_loop ifuns i); (* Output *) type out_funs 'a = { output_byte : 'a -> int -> unit; output_binary_int : 'a -> int -> unit; output : 'a -> string -> int -> int -> unit } ; value size_32 = ref 0; value size_64 = ref 0; value gen_output_block_header ofuns oc tag size = do { let hd = size lsl 10 + tag in if tag < 16 && size < 8 then ofuns.output_byte oc (<> + tag + size lsl 4) else if Sys.word_size = 64 && hd >= 1 lsl 32 then do { ofuns.output_byte oc <>; for i = 1 to 8 do { ofuns.output_byte oc (hd lsr (64 - 8 * i) land 0xFF); }; } else do { ofuns.output_byte oc <>; (* hd = size << 10 + tag *) ofuns.output_byte oc (size lsr 14 land 0xFF); ofuns.output_byte oc (size lsr 6 land 0xFF); ofuns.output_byte oc (size lsl 2 land 0xFF); ofuns.output_byte oc (size lsl 10 land 0xFF + tag); }; if size = 0 then () else do { size_32.val := size_32.val + 1 + size; size_64.val := size_64.val + 1 + size; } } ; value rec output_loop ofuns oc x = if not (Obj.is_block x) then if Obj.magic x >= 0 && Obj.magic x < 0x40 then ofuns.output_byte oc (<> + Obj.magic x) else if Obj.magic x >= -128 && Obj.magic x < 128 then do { ofuns.output_byte oc <>; ofuns.output_byte oc (Obj.magic x); } else if Obj.magic x >= -32768 && Obj.magic x < 32768 then do { ofuns.output_byte oc <>; ofuns.output_byte oc (Obj.magic x lsr 8); ofuns.output_byte oc (Obj.magic x); } else do { ofuns.output_byte oc <>; ofuns.output_binary_int oc (Obj.magic x); } else if Obj.tag x = fun_tag then failwith "Iovalue.output " else if Obj.tag x = string_tag then do { let len = String.length (Obj.magic x) in if len < 0x20 then ofuns.output_byte oc (<> + len) else if len < 0x100 then do { ofuns.output_byte oc <>; ofuns.output_byte oc len; } else do { ofuns.output_byte oc <>; ofuns.output_binary_int oc len; }; ofuns.output oc (Obj.magic x) 0 len; size_32.val := size_32.val + 1 + (len + 4) / 4; size_64.val := size_64.val + 1 + (len + 8) / 8; } else if Obj.tag x = float_tag then failwith "Iovalue.output: floats not implemented" else do { gen_output_block_header ofuns oc (Obj.tag x) (Obj.size x); (* last case of "for" separated, to make more tail recursive cases when last field is itself, to prevent some stacks overflows *) if Obj.size x > 0 then do { for i = 0 to Obj.size x - 2 do { output_loop ofuns oc (Obj.field x i); }; output_loop ofuns oc (Obj.field x (Obj.size x - 1)) } else (); } ; value out_channel_funs = {output_byte = output_byte; output_binary_int = output_binary_int; output = output} ; value output oc x = output_loop out_channel_funs oc (Obj.repr x); value gen_output ofuns i x = output_loop ofuns i (Obj.repr x); value output_block_header = gen_output_block_header out_channel_funs; (* Size *) value size_funs = {output_byte = fun r _ -> incr r; output_binary_int = fun r _ -> r.val := r.val + 4; output = fun r _ beg len -> r.val := r.val + len - beg} ; value size = ref 0; value size v = do { size.val := 0; gen_output size_funs size v; size.val } ; (* Digest *) value dbuf = ref (Bytes.create 256); value dlen = ref 0; value dput_char c = do { if dlen.val = String.length dbuf.val then do { let nlen = 2 * dlen.val in let ndbuf = Bytes.create nlen in String.blit dbuf.val 0 ndbuf 0 dlen.val; dbuf.val := ndbuf; } else (); Bytes.set dbuf.val dlen.val c; incr dlen; } ; value rec dput_int i = if i = 0 then () else do { dput_char (Char.chr (Char.code '0' + i mod 10)); dput_int (i / 10); } ; value dput_string s = for i = 0 to String.length s - 1 do { dput_char s.[i]; } ; value hexchar i = if i <= 9 then Char.chr (Char.code '0' + i) else Char.chr (Char.code 'A' + i - 10) ; value string_code s = let r = Bytes.create (String.length s * 2) in do { for i = 0 to String.length s - 1 do { Bytes.set r (2*i) (hexchar (Char.code s.[i] / 16)); Bytes.set r (2*i+1) (hexchar (Char.code s.[i] mod 16)); }; r } ; value rec digest_loop v = if not (Obj.is_block v) then let n = (Obj.magic v : int) in do { dput_char 'I'; dput_int n } else if Obj.tag v = Obj.closure_tag then invalid_arg "Iovalue.digest: closure" else if Obj.size v = 0 then do { dput_char 'T'; dput_int (Obj.tag v) } else if Obj.tag v = string_tag then do { let s = (Obj.magic v : string) in dput_char 'S'; dput_int (String.length s); dput_char '/'; dput_string s; } else do { dput_char 'O'; dput_int (Obj.tag v); dput_char '/'; dput_int (Obj.size v); digest_fields v 0; } and digest_fields v i = if i = Obj.size v then () else do { digest_loop (Obj.field v i); digest_fields v (i + 1) } ; value digest v = do { dlen.val := 0; digest_loop (Obj.repr v); string_code (Digest.substring dbuf.val 0 dlen.val) } ; value output_value_header_size = 20; value array_header_size arr_len = if arr_len < 8 then 1 else if Sys.word_size = 64 && arr_len lsl 10 >= 1 lsl 32 then 9 else 5 ; value output_array_access oc arr_get arr_len pos = loop (pos + output_value_header_size + array_header_size arr_len) 0 where rec loop pos i = if i = arr_len then pos else do { output_binary_int oc pos; loop (pos + size (arr_get i)) (i + 1) } ; (* *) type header_pos = (int * int); value intext_magic_number = [| 0x84; 0x95; 0xA6; 0xBE |]; value create_output_value_header oc = do { (* magic number *) for i = 0 to 3 do { output_byte oc intext_magic_number.(i); }; let pos_header = pos_out oc in (* room for block length *) output_binary_int oc 0; (* room for obj counter *) output_binary_int oc 0; (* room for size_32 *) output_binary_int oc 0; (* room for size_64 *) output_binary_int oc 0; size_32.val := 0; size_64.val := 0; (pos_header, pos_out oc) }; value patch_output_value_header oc (pos_header, pos_start) = do { let pos_end = pos_out oc in if Sys.word_size = 64 && (pos_end >= 1 lsl 32 || size_32.val >= 1 lsl 32 || size_64.val >= 1 lsl 32) then failwith "Iovalue.output: object too big" else (); (* block_length *) seek_out oc pos_header; output_binary_int oc (pos_end - pos_start); (* obj counter is zero because no_sharing *) output_binary_int oc 0; (* size_32 *) output_binary_int oc size_32.val; (* size_64 *) output_binary_int oc size_64.val; pos_end; }; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/place.ml0000660000175200017530000002312212664543647022626 0ustar guillaumeguillaume(* camlp5r ./pa_html.cmo *) (* $Id: place.ml,v 5.21 2007-09-18 19:12:08 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Config; open Def; open Gwdb; open Hutil; open Util; value fold_place inverted s = (* petit hack (pour GeneaNet) en attendant une vraie gestion des lieux *) (* transforme "[foo-bar] - boobar (baz)" en "foo-bar, boobar (baz)" *) let s = Str.global_replace (Str.regexp "^\[\([^]]+\)\] *- *\(.*\)") "\1, \2" s in let rec loop iend list i ibeg = if i = iend then if i > ibeg then [String.sub s ibeg (i - ibeg) :: list] else list else let (list, ibeg) = match s.[i] with [ ',' -> let list = if i > ibeg then [String.sub s ibeg (i - ibeg) :: list] else list in (list, i + 1) | ' ' -> if i = ibeg then (list, i + 1) else (list, ibeg) | _ -> (list, ibeg) ] in loop iend list (i + 1) ibeg in let (iend, rest) = if String.length s > 0 && s.[String.length s - 1] = ')' then match Mutil.rindex s '(' with [ Some i when i < String.length s - 2 -> let j = loop (i - 1) where rec loop i = if i >= 0 && s.[i] = ' ' then loop (i - 1) else i + 1 in (j, [String.sub s (i + 1) (String.length s - i - 2)]) | _ -> (String.length s, []) ] else (String.length s, []) in let list = rest @ loop iend [] 0 0 in if inverted then List.rev list else list ; value get_all conf base = let add_birth = p_getenv conf.env "bi" = Some "on" in let add_baptism = p_getenv conf.env "bp" = Some "on" in let add_death = p_getenv conf.env "de" = Some "on" in let add_burial = p_getenv conf.env "bu" = Some "on" in let add_marriage = p_getenv conf.env "ma" = Some "on" in let inverted = try List.assoc "places_inverted" conf.base_env = "yes" with [ Not_found -> False ] in let ini = match p_getenv conf.env "k" with [ Some s -> s | None -> "" ] in let ht = Hashtbl.create 5003 in let ht_add istr p = let (cnt, _) = try Hashtbl.find ht (istr, get_surname p) with [ Not_found -> let cnt = (ref 0, get_key_index p) in do { Hashtbl.add ht (istr, get_surname p) cnt; cnt } ] in incr cnt in do { if add_birth || add_death || add_baptism || add_burial then let rec loop i = if i = nb_of_persons base then () else do { let p = pget conf base (Adef.iper_of_int i) in let pl_bi = get_birth_place p in let pl_bp = get_baptism_place p in let pl_de = get_death_place p in let pl_bu = get_burial_place p in if (not add_birth || is_empty_string pl_bi) && (not add_baptism || is_empty_string pl_bp) && (not add_death || is_empty_string pl_de) && (not add_burial || is_empty_string pl_bu) then () else do { if (fast_auth_age conf p) then do { if add_birth && not (is_empty_string pl_bi) then ht_add pl_bi p else (); if add_baptism && not (is_empty_string pl_bp) then ht_add pl_bp p else (); if add_death && not (is_empty_string pl_de) then ht_add pl_de p else (); if add_burial && not (is_empty_string pl_bu) then ht_add pl_bu p else () } else (); }; loop (i + 1) } in loop 0 else (); if add_marriage then let rec loop i = if i = nb_of_families base then () else do { let fam = foi base (Adef.ifam_of_int i) in if is_deleted_family fam then () else let pl_ma = get_marriage_place fam in if not (is_empty_string pl_ma) then let fath = pget conf base (get_father fam) in let moth = pget conf base (get_mother fam) in if fast_auth_age conf fath && fast_auth_age conf moth then do { ht_add pl_ma fath; ht_add pl_ma moth } else () else (); loop (i + 1) } in loop 0 else (); let list = ref [] in let len = ref 0 in Hashtbl.iter (fun (istr_pl, _) (cnt, ip) -> let s = Util.string_with_macros conf [] (sou base istr_pl) in let s = fold_place inverted s in if s <> [] && (ini = "" || List.hd s = ini) then do { list.val := [(s, cnt.val, ip) :: list.val]; incr len } else ()) ht; let list = List.sort (fun (s1, _, _) (s2, _, _) -> compare s1 s2) list.val in (list, len.val) } ; value max_len = ref 2000; value print_html_places_surnames conf base list = let link_to_ind = match p_getenv conf.base_env "place_surname_link_to_ind" with [ Some "yes" -> True | _ -> False ] in let print_sn len p sn sep = do { Wserver.wprint "%s%s (%d)" sn len } in let print_sn_list snl = let snl = List.map (fun (len, ip) -> let p = pget conf base ip in let sn = p_surname base p in (len, p, sn)) snl in let snl = List.sort (fun (_, _, sn1) (_, _, sn2) -> Gutil.alphabetic_order sn1 sn2) snl in let snl = List.fold_right (fun (len, p, sn) -> fun [ [(len1, p1, sn1) :: snl] -> if sn = sn1 then [(len + len1, p, sn) :: snl] else [(len, p, sn); (len1, p1, sn1) :: snl] | [] -> [(len, p, sn)] ]) snl [] in let (len, p, sn, snl) = match snl with [ [(len, p, sn) :: snl] -> (len, p, sn, snl) | _ -> assert False ] in tag "li" begin print_sn len p sn ""; List.iter (fun (len, p, sn) -> print_sn len p sn ",\n") snl; Wserver.wprint "\n"; end in let rec loop prev = fun [ [(pl, snl) :: list] -> let rec loop1 prev pl = match (prev, pl) with [ ([], l2) -> List.iter (fun x -> Wserver.wprint "
    • %s
        \n" x) l2 | ([x1 :: l1], [x2 :: l2]) -> if x1 = x2 then loop1 l1 l2 else do { List.iter (fun _ -> Wserver.wprint "
    • \n") [x1 :: l1]; loop1 [] [x2 :: l2] } | _ -> assert False ] in do { loop1 prev pl; print_sn_list snl; loop pl list } | [] -> do { List.iter (fun _ -> Wserver.wprint "\n") prev } ] in tag "ul" begin loop [] list; end ; value print_all_places_surnames_short conf list = let title _ = Wserver.wprint "%s" (capitale (transl conf "place")) in let list = List.map (fun (s, len, ip) -> let s = List.hd s in (s, len, ip) ) list in let list = List.sort (fun (s1, _, _) (s2, _, _) -> Gutil.alphabetic_order s1 s2) list in let list = List.fold_left (fun list (p, len, ip) -> match list with [ [(p1, len1, ip1) :: list1] when p1 = p -> [(p1, len1 + len, ip1) :: list1] | _ -> [(p, len, ip) :: list] ]) [] (List.rev list) in let add_birth = p_getenv conf.env "bi" = Some "on" in let add_baptism = p_getenv conf.env "bp" = Some "on" in let add_death = p_getenv conf.env "de" = Some "on" in let add_burial = p_getenv conf.env "bu" = Some "on" in let add_marriage = p_getenv conf.env "ma" = Some "on" in let opt = (if add_birth then ";bi=on" else "") ^ (if add_baptism then ";bp=on" else "") ^ (if add_death then ";de=on" else "") ^ (if add_burial then ";bu=on" else "") ^ (if add_marriage then ";ma=on" else "") in do { Hutil.header conf title; print_link_to_welcome conf True; tag "p" begin stag "a" "href=\"%sm=PS%s;k=\"" (commd conf) opt begin Wserver.wprint "%s" (transl conf "long display"); end; end; tag "p" begin List.iter (fun (s, len, ip) -> do { stag "a" "href=\"%sm=PS%s;k=%s\"" (commd conf) opt (Util.code_varenv s) begin Wserver.wprint "%s" s; end; Wserver.wprint " (%d),\n" len; } ) list; end; Hutil.trailer conf } ; value print_all_places_surnames_long conf base list = let list = List.fold_left (fun list (pl, len, ip) -> match list with [ [(pl1, lpl1) :: list1] when pl = pl1 -> [(pl1, [(len, ip) :: lpl1]) :: list1] | _ -> [(pl, [(len, ip)]) :: list] ]) [] list in let rec sort_place_utf8 pl1 pl2 = match (pl1, pl2) with [ (_, []) -> 1 | ([], _) -> -1 | ([s1 :: pl11], [s2 :: pl22]) -> if Gutil.alphabetic_order s1 s2 = 0 then sort_place_utf8 pl11 pl22 else Gutil.alphabetic_order s1 s2 ] in let list = List.sort (fun (pl1, _) (pl2, _) -> sort_place_utf8 pl1 pl2) list in let title _ = Wserver.wprint "%s / %s" (capitale (transl conf "place")) (capitale (transl_nth conf "surname/surnames" 0)) in do { Hutil.header conf title; print_link_to_welcome conf True; if list = [] then () else print_html_places_surnames conf base list; Hutil.trailer conf } ; value print_all_places_surnames conf base = let ini = p_getenv conf.env "k" in let (list, len) = get_all conf base in if ini = None && len > max_len.val then print_all_places_surnames_short conf list else print_all_places_surnames_long conf base list ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/templDate.mli0000660000175200017530000000031312664543647023627 0ustar guillaumeguillaume(* camlp5r *) (* $Id: templDate.mli,v 5.2 2007-09-12 09:58:44 ddr Exp $ *) (* Copyright (c) 2007 INRIA *) open Config; open TemplAst; value eval_date_var : config -> int -> list string -> expr_val 'a; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/perso.mli0000660000175200017530000000267412664543647023054 0ustar guillaumeguillaume(* $Id: perso.mli,v 5.7 2007-03-30 18:57:19 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Gwdb; open Config; value string_of_titles : config -> base -> bool -> string -> person -> string; value string_of_marriage_text : config -> base -> family -> string; value interp_templ : string -> config -> base -> person -> unit; value interp_templ_with_menu : (bool -> unit) -> string -> config -> base -> person -> unit; value interp_notempl_with_menu : (bool -> unit) -> string -> config -> base -> person -> unit; value print : config -> base -> person -> unit; value print_ascend : config -> base -> person -> unit; value print_what_links : config -> base -> person -> unit; value build_sosa_ht : config -> base -> unit; value get_sosa_person : config -> base -> person -> Num.t; value get_single_sosa : config -> base -> person -> Num.t; value print_sosa : config -> base -> person -> bool -> unit; value string_of_num : string -> Num.t -> string; (**) value infinite : int; value limit_desc : config -> int; value make_desc_level_table : config -> base -> int -> person -> (array int * array int); value default_max_cousin_lev : int; type dup = [ DupFam of Adef.ifam and Adef.ifam | DupInd of Adef.iper and Adef.iper | NoDup ] ; type excl_dup = (list (Adef.iper * Adef.iper) * list (Adef.ifam * Adef.ifam)); value excluded_possible_duplications : config -> excl_dup; value first_possible_duplication : base -> Adef.iper -> excl_dup -> dup; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/num.ml0000660000175200017530000001231512664543647022343 0ustar guillaumeguillaume(* $Id: num.ml,v 5.3 2007-01-19 01:53:16 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) type t = array int; value base = 0x1000000; value max_mul_base = max_int / base; value zero = [| |]; value one = [| 1 |]; value eq x y = x = y; value gt x y = if Array.length x > Array.length y then True else if Array.length x < Array.length y then False else loop (Array.length x - 1) where rec loop i = if i < 0 then False else if x.(i) > y.(i) then True else if x.(i) < y.(i) then False else loop (i - 1) ; value twice x = let l = loop 0 0 where rec loop i r = if i = Array.length x then if r = 0 then [] else [r] else let v = x.(i) lsl 1 + r in [v land (base - 1) :: loop (i + 1) (if v >= base then 1 else 0)] in Array.of_list l ; value half x = let l = loop (Array.length x - 1) 0 [] where rec loop i r v = if i < 0 then v else let rd = if x.(i) land 1 = 0 then 0 else base / 2 in let v = let d = r + x.(i) / 2 in if d = 0 && v = [] then v else [d :: v] in loop (i - 1) rd v in Array.of_list l ; value even x = if Array.length x = 0 then True else x.(0) land 1 = 0 ; value inc x n = let l = loop 0 n where rec loop i r = if i = Array.length x then if r = 0 then [] else [r] else let d = x.(i) + r in [d mod base :: loop (i + 1) (d / base)] in Array.of_list l ; value add x y = let l = loop 0 0 where rec loop i r = if i >= Array.length x && i >= Array.length y then if r = 0 then [] else [r] else let (d, r) = let xi = if i >= Array.length x then 0 else x.(i) in let yi = if i >= Array.length y then 0 else y.(i) in let s = xi + yi + r in (s mod base, s / base) in [d :: loop (i + 1) r] in Array.of_list l ; value normalize = loop where rec loop = fun [ [] -> [] | [x :: l] -> let r = loop l in if x = 0 && r = [] then r else [x :: r] ] ; value sub x y = let l = loop 0 0 where rec loop i r = if i >= Array.length x && i >= Array.length y then if r = 0 then [] else invalid_arg "Num.sub" else let (d, r) = let xi = if i >= Array.length x then 0 else x.(i) in let yi = if i >= Array.length y then 0 else y.(i) in if yi + r <= xi then (xi - (yi + r), 0) else (base + xi - (yi + r), 1) in [d :: loop (i + 1) r] in Array.of_list (normalize l) ; value mul0 x n = if n > max_mul_base then invalid_arg "Num.mul" else let l = loop 0 0 where rec loop i r = if i = Array.length x then if r = 0 then [] else [r] else let d = x.(i) * n + r in [d mod base :: loop (i + 1) (d / base)] in Array.of_list l ; value mul x n = if n < max_mul_base then mul0 x n else loop zero x n where rec loop r x n = if n < max_mul_base then add r (mul0 x n) else loop (add r (mul0 x (n mod max_mul_base))) (mul0 x max_mul_base) (n / max_mul_base) ; value div x n = if n > max_mul_base then invalid_arg "Num.div" else let l = loop (Array.length x - 1) [] 0 where rec loop i l r = if i < 0 then l else let r = r mod n * base + x.(i) in let d = r / n in loop (i - 1) [d :: l] r in Array.of_list (normalize l) ; value modl x n = let r = sub x (mul0 (div x n) n) in if Array.length r = 0 then 0 else r.(0) ; value of_int i = if i < 0 then invalid_arg "Num.of_int" else if i = 0 then zero else if i < base then [| i |] else [| i mod base; i / base |] ; value print f sep x = if eq x zero then f "0" else let digits = loop [] x where rec loop d x = if eq x zero then d else loop [modl x 10 :: d] (div x 10) in let _ = List.fold_left (fun n d -> do { f (string_of_int d); if n > 0 && n mod 3 = 0 then f sep else (); n - 1; }) (List.length digits - 1) digits in () ; value code_of_digit d = if d < 10 then Char.code '0' + d else Char.code 'A' + (d - 10) ; value to_string_sep_base sep base x = let digits = loop [] x where rec loop d x = if eq x zero then d else loop [modl x base :: d] (div x base) in let digits = if digits = [] then [0] else digits in let len = List.length digits in let slen = String.length sep in let s = Bytes.create (len + (len - 1) / 3 * slen) in let _ = List.fold_left (fun (i, j) d -> do { Bytes.set s j (Char.chr (code_of_digit d)); if i < len - 1 && (len - 1 - i) mod 3 = 0 then do { String.blit sep 0 s (j + 1) slen; (i + 1, j + 1 + slen) } else (i + 1, j + 1) }) (0, 0) digits in s ; value to_string_sep sep = to_string_sep_base sep 10; value to_string = to_string_sep_base "" 10; value of_string s = loop zero 0 where rec loop n i = if i = String.length s then n else match s.[i] with [ '0'..'9' -> loop (inc (mul0 n 10) (Char.code s.[i] - Char.code '0')) (i + 1) | _ -> failwith "Num.of_string" ] ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/consangAll.mli0000660000175200017530000000026712664543647024001 0ustar guillaumeguillaume(* $Id: consangAll.mli,v 5.5 2007/02/16 10:38:36 ddr Exp $ *) (* Copyright (c) 2006-2007 INRIA *) open Gwdb; value compute : base -> int -> bool -> bool -> option (array Adef.fix); geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/templ.ml0000660000175200017530000014451112664543647022671 0ustar guillaumeguillaume(* camlp5r ./pa_html.cmo *) (* $Id: templ.ml,v 5.36 2007-09-12 09:58:44 ddr Exp $ *) open Config; open Printf; open TemplAst; (* Parsing *) type token = [ BANGEQUAL | COMMA | DOT | DIV | EQUAL | GREATER | GREATEREQUAL | LESS | LESSEQUAL | LPAREN | MINUS | PERCENT | PLUS | RPAREN | STAR | IDENT of string | STRING of string | INT of string | LEXICON of bool and string and string ] ; type loc_token = [ Tok of loc and token ]; exception Exc_located of loc and exn; value raise_with_loc loc exc = match exc with [ Exc_located _ _ -> raise exc | _ -> raise (Exc_located loc exc) ] ; value rec get_ident len = parser [ [: `('a'..'z' | 'A'..'Z' | '0'..'9' | '_' as c); s :] -> get_ident (Buff.store len c) s | [: :] -> Buff.get len ] ; value rec get_value len = parser [ [: `(' ' | '>' | ';' | '\n' | '\r' | '\t') :] -> Buff.get len | [: `c; s :] -> get_value (Buff.store len c) s ] ; value rec get_string len = parser [ [: `'"' :] -> Buff.get len | [: `c; s :] -> get_string (Buff.store len c) s ] ; value rec get_int len = parser [ [: `('0'..'9' as c); s :] -> get_int (Buff.store len c) s | [: :] -> Buff.get len ] ; value get_compound_var = let rec var_kont = parser [ [: `'.'; s = get_ident 0; sl = var_kont :] -> [s :: sl] | [: :] -> [] ] in parser bp [ [: v = get_ident 0; vl = var_kont :] ep -> ((bp, ep), v, vl) ] ; value get_variable = let rec var_kont = parser [ [: `'.'; s = get_ident 0; sl = var_kont :] -> [s :: sl] | [: `';' :] -> [] | [: :] -> [] ] in parser bp [ [: `'%' :] ep -> ((bp, ep), "%", []) | [: `'/' :] ep -> ((bp, ep), "/", []) | [: `'[' :] ep -> ((bp, ep), "[", []) | [: `']' :] ep -> ((bp, ep), "]", []) | [: `'(' :] ep -> ((bp, ep), "(", []) | [: `')' :] ep -> ((bp, ep), ")", []) | [: v = get_ident 0; vl = var_kont :] ep -> ((bp, ep), v, vl) ] ; value rec transl_num_index = parser [ [: `('0'..'9' as c); s :] -> String.make 1 c ^ transl_num_index s | [: :] -> "" ] ; value transl_index = parser [ [: `('0'..'9' as c); s :] -> String.make 1 c ^ transl_num_index s | [: `('a'..'z' as c) :] -> String.make 1 c | [: :] -> "" ] ; value lexicon_word = let upper = parser [ [: `'*' :] -> True | [: :] -> False ] in let rec text lev len = parser [ [: `'['; s :] -> text (lev + 1) (Buff.store len '[') s | [: `']'; s :] -> if lev = 0 then Buff.get len else text (lev - 1) (Buff.store len ']') s | [: `c; s :] -> text lev (Buff.store len c) s ] in parser [: upp = upper; s = text 0 0; n = transl_index :] -> (upp, s, n) ; value rec parse_comment = parser [ [: `'%'; s :] -> parse_comment_after_percent s | [: `_; s :] -> parse_comment s ] and parse_comment_after_percent = parser [ [: `')'; s :] -> parse_spaces_after_comment s | [: `'('; s :] -> do { parse_comment s; parse_comment s } | [: `_; s :] -> parse_comment s ] and parse_spaces_after_comment = parser [ [: `(' ' | '\n' | '\t' | '\r'); s :] -> parse_spaces_after_comment s | [: :] -> () ] ; value rec get_token = parser bp [ [: `' ' | '\t' | '\n' | '\r'; s :] -> get_token s | [: `'(' :] ep -> Tok (bp, ep) LPAREN | [: `')' :] ep -> Tok (bp, ep) RPAREN | [: `',' :] ep -> Tok (bp, ep) COMMA | [: `'.' :] ep -> Tok (bp, ep) DOT | [: `'=' :] ep -> Tok (bp, ep) EQUAL | [: `'+' :] ep -> Tok (bp, ep) PLUS | [: `'-' :] ep -> Tok (bp, ep) MINUS | [: `'*' :] ep -> Tok (bp, ep) STAR | [: `'/' :] ep -> Tok (bp, ep) DIV | [: `'%'; a = parser [ [: `'('; _ = parse_comment; s :] -> get_token s | [: :] ep -> Tok (bp, ep) PERCENT ] :] -> a | [: `'!'; `'='?"'=' expected" :] ep -> Tok (bp, ep) BANGEQUAL | [: `'>'; tok = parser [ [: `'=' :] -> GREATEREQUAL | [: :] -> GREATER ] :] ep -> Tok (bp, ep) tok | [: `'<'; tok = parser [ [: `'=' :] -> LESSEQUAL | [: :] -> LESS ] :] ep -> Tok (bp, ep) tok | [: `'"'; s = get_string 0 :] ep -> Tok (bp, ep) (STRING s) | [: `('0'..'9' as c); s = get_int (Buff.store 0 c) :] ep -> Tok (bp, ep) (INT s) | [: `'['; (upp, s, n) = lexicon_word :] ep -> Tok (bp, ep) (LEXICON upp s n) | [: s = get_ident 0 :] ep -> Tok (bp, ep) (IDENT s) ] ; module Buff2 = Buff.Make (struct value buff = ref (Bytes.create 80); end); value rec parse_var = parser [: `Tok loc (IDENT id); (loc, idl) = ident_list loc :] -> (loc, id, idl) and ident_list ((bp, _) as loc) = parser [ [: `Tok _ DOT; (loc, id) = parser [ [: `Tok (_, ep) (IDENT id) :] -> ((bp, ep), id) | [: `Tok (_, ep) (INT id) :] -> ((bp, ep), id) | [: `Tok loc _ :] -> (loc, "parse_error1") ]; (loc, idl) = ident_list loc :] -> (loc, [id :: idl]) | [: :] -> (loc, []) ] ; value rec parse_expr strm = parse_expr_if strm and parse_expr_if = parser [ [: `Tok _ (IDENT "if"); e1 = parse_expr_or; `Tok _ (IDENT "then"); e2 = parse_expr_or; `Tok _ (IDENT "else"); e3 = parse_expr_or :] -> Aif e1 [e2] [e3] | [: e = parse_expr_or :] -> e ] and parse_expr_or = parser [: e = parse_expr_and; a = parser [ [: `Tok loc (IDENT "or"); s :] -> Aop2 loc "or" e (parse_expr_or s) | [: :] -> e ] :] -> a and parse_expr_and = parser [: e = parse_expr_3; a = parser [ [: `Tok loc (IDENT "and"); s :] -> Aop2 loc "and" e (parse_expr_and s) | [: :] -> e ] :] -> a and parse_expr_3 = parser [: e = parse_expr_4; a = parser [ [: `Tok loc EQUAL; e2 = parse_expr_4 :] -> Aop2 loc "=" e e2 | [: `Tok loc BANGEQUAL; e2 = parse_expr_4 :] -> Aop2 loc "!=" e e2 | [: `Tok loc GREATER; e2 = parse_expr_4 :] -> Aop2 loc ">" e e2 | [: `Tok loc GREATEREQUAL; e2 = parse_expr_4 :] -> Aop2 loc ">=" e e2 | [: `Tok loc LESS; e2 = parse_expr_4 :] -> Aop2 loc "<" e e2 | [: `Tok loc LESSEQUAL; e2 = parse_expr_4 :] -> Aop2 loc "<=" e e2 | [: :] -> e ] :] -> a and parse_expr_4 = parser [: e = parse_expr_5; a = parse_expr_4_kont e :] -> a and parse_expr_4_kont e = parser [ [: `Tok loc PLUS; e2 = parse_expr_5; a = parse_expr_4_kont (Aop2 loc "+" e e2) :] -> a | [: `Tok loc MINUS; e2 = parse_expr_5; a = parse_expr_4_kont (Aop2 loc "-" e e2) :] -> a | [: :] -> e ] and parse_expr_5 = parser [: e = parse_simple_expr; a = parse_expr_5_kont e :] -> a and parse_expr_5_kont e = parser [ [: `Tok loc STAR; e2 = parse_simple_expr; a = parse_expr_5_kont (Aop2 loc "*" e e2) :] -> a | [: `Tok loc DIV; e2 = parse_simple_expr; a = parse_expr_5_kont (Aop2 loc "/" e e2) :] -> a | [: `Tok loc PERCENT; e2 = parse_simple_expr; a = parse_expr_5_kont (Aop2 loc "%" e e2) :] -> a | [: :] -> e ] and parse_simple_expr = parser [ [: `Tok _ LPAREN; e = parse_expr; a = parser [ [: `Tok _ RPAREN :] -> e | [: `Tok loc _ :] -> Avar loc "parse_error2" [] ] :] -> a | [: `Tok loc (IDENT "not"); e = parse_simple_expr :] -> Aop1 loc "not" e | [: `Tok loc (STRING s) :] -> Atext loc s | [: `Tok loc (INT s) :] -> Aint loc s | [: `Tok loc (LEXICON upp s n) :] -> Atransl loc upp s n | [: (loc, id, idl) = parse_var; a = parser [ [: t = parse_tuple :] -> Aapply loc id t | [: :] -> Avar loc id idl ] :] -> a ] and parse_tuple strm = let rec parse_expr_list = parser [: x = parse_expr; xl = parser [ [: `Tok _ COMMA; a = parse_expr_list :] -> a | [: :] -> [] ] :] -> [[x] :: xl] in let parse_tuple = parser [: `Tok _ LPAREN; xl = parser [ [: a = parse_expr_list :] -> a | [: :] -> [] ]; a = parser [ [: `Tok _ RPAREN :] -> xl | [: `Tok loc _ :] -> [[Atext loc "parse_error4"]] ] :] -> a in parse_tuple strm ; value parse_char_stream p strm = let f _ = try Some (get_token strm) with [ Stream.Failure -> None ] in p (Stream.from f) ; value parse_char_stream_semi p strm = let opt_semi = Stream.peek strm <> Some '(' in let f _ = try Some (get_token strm) with [ Stream.Failure -> None ] in let r = p (Stream.from f) in do { if opt_semi then match strm with parser [ [: `';' :] -> () | [: :] -> () ] else (); r } ; value parse_formal_params strm = let rec parse_ident_list = parser [: `Tok _ (IDENT x); xl = parser [ [: `Tok _ COMMA; a = parse_ident_list :] -> a | [: :] -> [] ] :] -> [x :: xl] in let parse_tuple = parser [: `Tok _ LPAREN; xl = parser [ [: a = parse_ident_list :] -> a | [: :] -> [] ]; a = parser [ [: `Tok _ RPAREN :] -> xl | [: :] -> ["parse_error5"] ] :] -> a in let f _ = try Some (get_token strm) with [ Stream.Failure -> None ] in parse_tuple (Stream.from f) ; value strip_newlines_after_variables = loop where rec loop = fun [ [Atext loc s :: astl] -> let s = loop 0 where rec loop i = if i = String.length s then s else if s.[i] = ' ' || s.[i] = '\t' || s.[i] = '\r' then loop (i + 1) else if s.[i] = '\n' then String.sub s (i + 1) (String.length s - i - 1) else s in [Atext loc s :: loop astl] | [Aif s alt ale :: astl] -> [Aif s (loop alt) (loop ale) :: loop astl] | [Aforeach v pl al :: astl] -> [Aforeach v pl (loop al) :: loop astl] | [Adefine f x al alk :: astl] -> [Adefine f x (loop al) (loop alk) :: loop astl] | [Aapply loc f all :: astl] -> [Aapply loc f (List.map loop all) :: loop astl] | [Alet k v al :: astl] -> [Alet k (loop v) (loop al) :: loop astl] | [Afor i min max al :: astl] -> [Afor i min max (loop al) :: loop astl] | [(Atransl _ _ _ _ | Awid_hei _ as ast1); (Atext _ _ as ast2) :: astl] -> [ast1; ast2 :: loop astl] | [Aimport file al :: astl] -> [Aimport file (loop al) :: loop astl] | [ast :: astl] -> [ast :: loop astl] | [] -> [] ] ; value imported_files = ref []; value parse_templ conf strm = let rec parse_astl astl bol len end_list strm = match strm with parser bp [ [: `'%' :] -> let astl = if len = 0 then astl else [Atext (bp - len, bp) (Buff2.get len) :: astl] in match get_variable strm with [ (_, ("%" | "[" | "]" as c), []) -> parse_astl [Atext (bp - 1, bp) c :: astl] False 0 end_list strm | (_, "(", []) -> do { parse_comment strm; parse_astl astl False 0 end_list strm } | (_, v, []) when List.mem v end_list -> (List.rev astl, v) | (_, "define", []) -> parse_define astl end_list strm | (_, "let", []) -> parse_let astl end_list strm | (_, "import", []) -> parse_import astl end_list strm | x -> let ast = match x with [ (_, "if", []) -> parse_if strm | (_, "foreach", []) -> parse_foreach strm | (_, "apply", []) -> parse_apply bp strm | (_, "expr", []) -> parse_expr_stmt strm | (_, "for", []) -> parse_for strm | (_, "wid_hei", []) -> Awid_hei (get_value 0 strm) | ((_, ep), v, vl) -> Avar (bp, ep) v vl ] in parse_astl [ast :: astl] False 0 end_list strm ] | [: `'[' :] -> let astl = if len = 0 then astl else [Atext (bp - len, bp) (Buff2.get len) :: astl] in let a = let (upp, s, n) = lexicon_word strm in if String.length s > 1 && (s.[0] = '[' || s.[0] = '@') then let (astl, _) = parse_astl [] False 0 [] (Stream.of_string s) in Aconcat (bp, Stream.count strm) astl else Atransl (bp, Stream.count strm) upp s n in parse_astl [a :: astl] False 0 end_list strm | [: `c :] -> let empty_c = c = ' ' || c = '\t' in let len = if empty_c && bol then len else Buff2.store len c in let bol = empty_c && bol || c = '\n' in parse_astl astl bol len end_list strm | [: :] -> let astl = if len = 0 then astl else [Atext (bp - len, bp) (Buff2.get len) :: astl] in (List.rev astl, "") ] and parse_define astl end_list strm = let fxlal = try let f = get_ident 0 strm in let xl = parse_formal_params strm in let (al, _) = parse_astl [] False 0 ["end"] strm in do { loop () where rec loop () = match strm with parser [ [: `('\n' | '\r') :] -> loop () | [: :] -> () ]; Some (f, xl, al) } with [ Stream.Failure | Stream.Error _ -> None ] in let (alk, v) = parse_astl [] False 0 end_list strm in let astl = match fxlal with [ Some (f, xl, al) -> [Adefine f xl al alk :: astl] | None -> let bp = Stream.count strm - 1 in [Atext (bp, bp + 1) "define error" :: alk @ astl] ] in (List.rev astl, v) and parse_let astl end_list strm = let (ast, tok) = try let k = get_ident 0 strm in match strm with parser [ [: `';' :] -> let (v, _) = parse_astl [] False 0 ["in"] strm in let (al, tok) = parse_astl [] False 0 end_list strm in (Alet k v al, tok) ] with [ Stream.Failure | Stream.Error _ -> let bp = Stream.count strm - 1 in (Atext (bp, bp + 1) "let syntax error", "") ] in (List.rev [ast :: astl], tok) and parse_import astl end_list strm = let ast = try let file = get_value 0 strm in (* Protection pour ne pas inclure plusieurs fois un même template ? *) if not (List.mem file imported_files.val) then let al = match Util.open_templ conf file with [ Some ic -> let () = imported_files.val := [ file :: imported_files.val] in let strm2 = (Stream.of_channel ic) in let (al, _) = parse_astl [] False 0 [] strm2 in do { close_in ic; Some (Aimport file al) } | None -> None ] in al else None with [ Stream.Failure | Stream.Error _ -> None ] in let (alk, tok) = parse_astl [] False 0 end_list strm in match ast with [ Some ast -> (List.rev [ast :: astl] @ alk, tok) | None -> (astl @ alk, tok) ] and parse_apply bp strm = try let f = get_ident 0 strm in match strm with parser [ [: `'%' :] -> match get_variable strm with [ (_, "with", []) -> let all = loop () where rec loop () = let (al, tok) = parse_astl [] False 0 ["and"; "end"] strm in match tok with [ "and" -> [al :: loop ()] | _ -> [al] ] in Aapply (bp, Stream.count strm) f all | _ -> raise (Stream.Error "'with' expected") ] | [: :] -> let el = parse_char_stream parse_tuple strm in Aapply (bp, Stream.count strm) f el ] with [ Stream.Failure | Stream.Error _ -> let bp = Stream.count strm - 1 in Atext (bp, bp + 1) "apply syntax error" ] and parse_expr_stmt strm = parse_char_stream_semi parse_simple_expr strm and parse_if strm = let e = parse_char_stream_semi parse_simple_expr strm in let (al1, al2) = loop () where rec loop () = let (al1, tok) = parse_astl [] False 0 ["elseif"; "else"; "end"] strm in match tok with [ "elseif" -> let e2 = parse_char_stream_semi parse_simple_expr strm in let (al2, al3) = loop () in (al1, [Aif e2 al2 al3]) | "else" -> let (al2, _) = parse_astl [] False 0 ["end"] strm in (al1, al2) | _ -> (al1, []) ] in Aif e al1 al2 and parse_for strm = try let iterator = get_ident 0 strm in match strm with parser [ [: `';' :] -> let min = parse_char_stream_semi parse_simple_expr strm in let max = parse_char_stream_semi parse_simple_expr strm in let (al, _) = parse_astl [] False 0 ["end"] strm in Afor iterator min max al ] with [ Stream.Failure | Stream.Error _ -> let bp = Stream.count strm - 1 in Atext (bp, bp + 1) "for syntax error" ] and parse_foreach strm = let (loc, v, vl) = get_compound_var strm in let params = if Stream.peek strm = Some '(' then parse_char_stream parse_tuple strm else do { match strm with parser [ [: `';' :] -> () | [: :] -> () ]; [] } in let (astl, _) = parse_astl [] False 0 ["end"] strm in Aforeach (loc, v, vl) params astl in let astl = fst (parse_astl [] True 0 [] strm) in strip_newlines_after_variables astl ; value input_templ conf fname = match Util.open_templ conf fname with [ Some ic -> let astl = parse_templ conf (Stream.of_channel ic) in do { close_in ic; Some astl } | None -> None ] ; (* Common evaluation functions *) value subst_text x v s = if String.length x = 0 then s else let rec loop len i i_ok = if i = String.length s then if i_ok > 0 then loop (Buff.store len s.[i - i_ok]) (i - i_ok + 1) 0 else Buff.get len else if s.[i] = x.[i_ok] then if i_ok = String.length x - 1 then loop (Buff.mstore len v) (i + 1) 0 else loop len (i + 1) (i_ok + 1) else if i_ok > 0 then loop (Buff.store len s.[i - i_ok]) (i - i_ok + 1) 0 else loop (Buff.store len s.[i]) (i + 1) 0 in loop 0 0 0 ; value rec subst sf = fun [ Atext loc s -> Atext loc (sf s) | Avar loc s sl -> let s1 = sf s in let sl1 = List.map sf sl in if sl = [] && try let _ = int_of_string s1 in True with [ Failure _ -> False ] then Aint loc s1 else let strm = Stream.of_string s1 in let (_, s2, sl2) = get_compound_var strm in if Stream.peek strm <> None then Avar loc s1 sl1 else Avar loc s2 (sl2 @ sl1) | Atransl loc b s c -> Atransl loc b (sf s) c | Aconcat loc al -> Aconcat loc (List.map (subst sf) al) | Awid_hei s -> Awid_hei (sf s) | Aif e alt ale -> Aif (subst sf e) (substl sf alt) (substl sf ale) | Aforeach (loc, s, sl) pl al -> (* Dans le cas d'une "compound variable", il faut la décomposer. *) (* Ex: "ancestor.father".family => ancestor.father.family *) let s1 = sf s in let strm = Stream.of_string s1 in let (_, s2, sl2) = get_compound_var strm in let (s, sl) = if Stream.peek strm <> None then (s, sl) else (s2, sl2 @ sl) in Aforeach (loc, sf s, List.map sf sl) (List.map (substl sf) pl) (substl sf al) | Afor i min max al -> Afor (sf i) (subst sf min) (subst sf max) (substl sf al) | Adefine f xl al alk -> Adefine (sf f) (List.map sf xl) (substl sf al) (substl sf alk) | Aapply loc f all -> Aapply loc (sf f) (List.map (substl sf) all) | Alet k v al -> Alet (sf k) (substl sf v) (substl sf al) | Aimport file al -> Aimport (sf file) (substl sf al) | Aint loc s -> Aint loc s | Aop1 loc op e -> Aop1 loc op (subst sf e) | Aop2 loc op e1 e2 -> Aop2 loc (sf op) (subst sf e1) (subst sf e2) ] and substl sf al = List.map (subst sf) al ; value split_at_coloncolon s = loop 0 where rec loop i = if i >= String.length s - 1 then None else match (s.[i], s.[i + 1]) with [ (':', ':') -> let s1 = String.sub s 0 i in let s2 = String.sub s (i + 2) (String.length s - i - 2) in Some (s1, s2) | _ -> loop (i + 1) ] ; value rec skip_spaces_and_newlines s i = if i = String.length s then i else match s.[i] with [ ' ' | '\n' | '\r' -> skip_spaces_and_newlines s (i + 1) | _ -> i ] ; value not_impl func x = let desc = if Obj.is_block (Obj.repr x) then "tag = " ^ string_of_int (Obj.\tag (Obj.repr x)) else "int_val = " ^ string_of_int (Obj.magic x) in "Templ." ^ func ^ ": not impl " ^ desc ; value setup_link conf = let s = Wserver.extract_param "host: " '\r' conf.request in try let i = String.rindex s ':' in let s = "http://" ^ String.sub s 0 i ^ ":2316/" in "gwsetup" with [ Not_found -> "" ] ; value rec eval_variable conf = fun [ ["bvar"; v] -> try List.assoc v conf.base_env with [ Not_found -> "" ] | ["evar"; v; "ns"] -> try let vv = List.assoc v (conf.env @ conf.henv) in Util.quote_escaped (Wserver.gen_decode False vv) with [ Not_found -> "" ] | ["evar"; v] -> match Util.p_getenv (conf.env @ conf.henv) v with [ Some vv -> Util.quote_escaped vv | None -> "" ] | ["time" :: sl] -> eval_time_var conf sl | ["user"; "ident"] -> conf.user | ["user"; "name"] -> conf.username | [s] -> eval_simple_variable conf s | _ -> raise Not_found ] and eval_time_var conf = fun [ ["hours"] -> let (hh, mm, ss) = conf.time in sprintf "%02d" hh | ["minutes"] -> let (hh, mm, ss) = conf.time in sprintf "%02d" mm | ["seconds"] -> let (hh, mm, ss) = conf.time in sprintf "%02d" ss | [] -> let (hh, mm, ss) = conf.time in sprintf "%02d:%02d:%02d" hh mm ss | _ -> raise Not_found ] and eval_simple_variable conf = fun [ "action" -> conf.command | "border" -> string_of_int conf.border | "charset" -> conf.charset | "compilation_time" -> Util.compilation_time conf | "connections" -> match conf.n_connect with [ Some (c, cw, cf, _) -> if c > 0 then " - " ^ sprintf "%s %d" (Util.transl conf "connections") c ^ (if cw > 0 then sprintf ", %s %s" (Util.transl_nth conf "wizard/wizards/friend/friends/exterior" 1) (if conf.wizard then sprintf "%d" (Util.commd conf) cw else string_of_int cw) else "") ^ (if cf > 0 then sprintf ", %s %d" (Util.transl_nth conf "wizard/wizards/friend/friends/exterior" 3) cf else "") else "" | None -> "" ] | "doctype" -> Util.doctype conf ^ "\n" | "doctype_transitional" -> let doctype = match Util.p_getenv conf.base_env "doctype" with [ Some ("html-4.01" | "html-4.01-trans") -> "html-4.01-trans" | _ -> "xhtml-1.0-trans" ] in let conf = {(conf) with base_env = [("doctype", doctype) :: conf.base_env]} in Util.doctype conf ^ "\n" | "highlight" -> conf.highlight | "image_prefix" -> Util.image_prefix conf | "left" -> conf.left | "nl" -> "\n" | "nn" -> "" | "prefix" -> Util.commd conf | "prefix_base" -> conf.command ^ "?" ^ (if conf.cgi then "b=" ^ conf.bname ^ ";" else "") | "prefix_no_iz" -> let henv = List.fold_left (fun accu k -> List.remove_assoc k accu) conf.henv ["iz"; "nz"; "pz"; "ocz"] in Util.commd {(conf) with henv = henv} | "prefix_no_templ" -> let henv = List.fold_right (fun (k, v) henv -> if k = "templ" then henv else [(k, v) :: henv]) conf.henv [] in let c = conf.command ^ "?" in List.fold_left (fun c (k, v) -> c ^ k ^ "=" ^ v ^ ";") c (henv @ conf.senv) | "referer" -> Util.get_referer conf | "right" -> conf.right | "setup_link" -> if conf.setup_link then " - " ^ setup_link conf else "" | "sp" -> " " | "suffix" -> (* On supprime de env toutes les paires qui sont dans (henv @ senv) *) let l = List.fold_left (fun accu (k, v) -> List.remove_assoc k accu) conf.env (conf.henv @ conf.senv) in List.fold_left (fun c (k, v) -> c ^ k ^ "=" ^ v ^ ";") "" l | "url" -> let c = Util.commd conf in (* On supprime de env toutes les paires qui sont dans (henv @ senv) *) let l = List.fold_left (fun accu (k, v) -> List.remove_assoc k accu) conf.env (conf.henv @ conf.senv) in List.fold_left (fun c (k, v) -> c ^ k ^ "=" ^ v ^ ";") c l | "version" -> Version.txt | "/" -> conf.xhs | s -> raise Not_found ] ; value rec string_of_expr_val = fun [ VVstring s -> s | VVbool True -> "1" | VVbool False -> "0" | VVother f -> string_of_expr_val (f []) ] ; value eval_string_var conf eval_var sl = try eval_var sl with [ Not_found -> try VVstring (eval_variable conf sl) with [ Not_found -> VVstring (" %" ^ String.concat "." sl ^ "?") ] ] ; value eval_var_handled conf sl = try eval_variable conf sl with [ Not_found -> sprintf " %%%s?" (String.concat "." sl) ] ; value apply_format conf nth s1 s2 = let transl_nth_format s = match nth with [ Some n -> Util.ftransl_nth conf s n | None -> Util.ftransl conf s ] in match Util.check_format "%t" s1 with [ Some s3 -> sprintf (transl_nth_format s3) (fun _ -> s2) | None -> match Util.check_format "%s" s1 with [ Some s3 -> sprintf (transl_nth_format s3) s2 | None -> match Util.check_format "%d" s1 with [ Some s3 -> sprintf (transl_nth_format s3) (int_of_string s2) | None -> match Util.check_format "%s%s" s1 with [ Some s3 -> let (s21, s22) = let i = String.index s2 ':' in (String.sub s2 0 i, String.sub s2 (i + 1) (String.length s2 - i - 1)) in sprintf (transl_nth_format s3) s21 s22 | None -> raise Not_found ] ] ] ] ; value rec eval_ast conf = fun [ Atext _ s -> s | Avar _ s sl -> eval_var_handled conf [s :: sl] | Atransl _ upp s c -> eval_transl conf upp s c | ast -> not_impl "eval_ast" ast ] and eval_transl conf upp s c = if c = "" && String.length s > 0 && s.[0] = '\n' then eval_transl_inline conf s else eval_transl_lexicon conf upp s c and eval_transl_inline conf s = let (s, alt) = Translate.inline conf.lang '%' (fun c -> "%" ^ String.make 1 c) s in s and eval_transl_lexicon conf upp s c = let r = let nth = try Some (int_of_string c) with [ Failure _ -> None ] in match split_at_coloncolon s with [ None -> let s2 = match nth with [ Some n -> Util.transl_nth conf s n | None -> Util.transl conf s ] in if c = "n" then s2 else Mutil.nominative s2 | Some (s1, s2) -> try if String.length s2 > 0 && s2.[0] = '|' then let i = 1 in let j = String.rindex s2 '|' in let k = skip_spaces_and_newlines s2 (j + 1) in let s3 = let s = String.sub s2 i (j - i) in let astl = parse_templ conf (Stream.of_string s) in List.fold_left (fun s a -> s ^ eval_ast conf a) "" astl in let s4 = String.sub s2 k (String.length s2 - k) in let s5 = match nth with [ Some n -> Util.transl_nth conf s4 n | None -> Util.transl conf s4 ] in let s2 = s3 ^ s5 in Util.transl_decline conf s1 s2 else if String.length s2 > 0 && s2.[0] = ':' then let s2 = String.sub s2 1 (String.length s2 - 1) in try apply_format conf nth s1 s2 with [ Failure _ -> raise Not_found ] else raise Not_found with [ Not_found -> let s3 = match nth with [ Some n -> Util.transl_nth conf s2 n | None -> if s2 = "" then "" else Util.transl conf s2 ] in Util.transl_decline conf s1 s3 ] ] in let r = Util.translate_eval r in if upp then Util.capitale r else r ; value nb_errors = ref 0; value loc_of_expr = fun [ Atext loc _ -> loc | Avar loc _ _ -> loc | Atransl loc _ _ _ -> loc | Aapply loc _ _ -> loc | Aop1 loc _ _ -> loc | Aop2 loc _ _ _ -> loc | Aint loc _ -> loc | _ -> (-1, -1) ] ; value templ_eval_var conf = fun [ ["cancel_links"] -> VVbool conf.cancel_links | ["cgi"] -> VVbool conf.cgi | ["false"] -> VVbool False | ["has_referer"] -> (* deprecated since version 5.00 *) VVbool (Wserver.extract_param "referer: " '\n' conf.request <> "") | ["just_friend_wizard"] -> VVbool conf.just_friend_wizard | ["friend"] -> VVbool conf.friend | ["manitou"] -> VVbool conf.manitou | ["supervisor"] -> VVbool conf.supervisor | ["true"] -> VVbool True | ["wizard"] -> VVbool conf.wizard | _ -> raise Not_found ] ; value bool_of e = fun [ VVbool b -> b | VVstring _ | VVother _ -> raise_with_loc (loc_of_expr e) (Failure "bool value expected") ] ; value string_of e = fun [ VVstring s -> s | VVbool _ | VVother _ -> raise_with_loc (loc_of_expr e) (Failure "string value expected") ] ; value int_of e = fun [ VVstring s -> try int_of_string s with [ Failure _ -> raise_with_loc (loc_of_expr e) (Failure ("int value expected\nFound = " ^ s)) ] | VVbool _ | VVother _ -> raise_with_loc (loc_of_expr e) (Failure "int value expected") ] ; value num_of e = fun [ VVstring s -> try Num.of_string s with [ Failure _ -> raise_with_loc (loc_of_expr e) (Failure ("num value expected\nFound = " ^ s)) ] | VVbool _ | VVother _ -> raise_with_loc (loc_of_expr e) (Failure "num value expected") ] ; value rec eval_expr ((conf, eval_var, eval_apply) as ceva) = fun [ Atext _ s -> VVstring s | Avar loc s sl -> try eval_var loc [s :: sl] with [ Not_found -> try templ_eval_var conf [s :: sl] with [ Not_found -> raise_with_loc loc (Failure ("unbound var \"" ^ String.concat "." [s :: sl] ^ "\"")) ] ] | Atransl _ upp s c -> VVstring (eval_transl conf upp s c) | Aconcat _ al -> let vl = List.map (eval_expr ceva) al in let sl = List.map string_of_expr_val vl in VVstring (String.concat "" sl) | Aapply loc s ell -> let vl = List.map (fun el -> match List.map (eval_expr ceva) el with [ [e] -> e | el -> let sl = List.map string_of_expr_val el in VVstring (String.concat "" sl) ]) ell in VVstring (eval_apply loc s vl) | Aop1 loc op e -> let v = eval_expr ceva e in match op with [ "not" -> VVbool (not (bool_of e v)) | _ -> raise_with_loc loc (Failure ("op \"" ^ op ^ "\"")) ] | Aop2 loc op e1 e2 -> let int e = int_of e (eval_expr ceva e) in let num e = num_of e (eval_expr ceva e) in let bool e = bool_of e (eval_expr ceva e) in match op with [ "and" -> VVbool (if bool e1 then bool e2 else False) | "or" -> VVbool (if bool e1 then True else bool e2) | "=" -> VVbool (eval_expr ceva e1 = eval_expr ceva e2) | "<" -> VVbool (int e1 < int e2) | ">" -> VVbool (int e1 > int e2) | "!=" -> VVbool (eval_expr ceva e1 <> eval_expr ceva e2) | "<=" -> VVbool (int e1 <= int e2) | ">=" -> VVbool (int e1 >= int e2) | "+" -> VVstring (Num.to_string (Num.add (num e1) (num e2))) | "-" -> VVstring (Num.to_string (Num.sub (num e1) (num e2))) | "*" -> VVstring (Num.to_string (Num.mul (num e1) (int e2))) | "/" -> VVstring (Num.to_string (Num.div (num e1) (int e2))) | "%" -> VVstring (string_of_int (Num.modl (num e1) (int e2))) | _ -> raise_with_loc loc (Failure ("op \"" ^ op ^ "\"")) ] | Aint loc s -> VVstring s | e -> raise_with_loc (loc_of_expr e) (Failure (not_impl "eval_expr" e)) ] ; value line_of_loc conf fname (bp, ep) = match Util.open_templ conf fname with [ Some ic -> let strm = Stream.of_channel ic in let rec loop lin = let rec scan_line col = parser cnt [: `c; s :] -> if cnt < bp then if c = '\n' then loop (lin + 1) else scan_line (col + 1) s else let col = col - (cnt - bp) in (lin, col, col + ep - bp) in scan_line 0 strm in let r = try Some (loop 1) with [ Stream.Failure -> None ] in do { close_in ic; r } | None -> None ] ; value template_file = ref ""; value print_error conf (bp, ep) exc = do { incr nb_errors; IFDEF UNIX THEN do { if nb_errors.val <= 10 then do { if template_file.val = "" then eprintf "*** template file" else eprintf "File \"%s.txt\"" template_file.val; let line = if template_file.val = "" then None else line_of_loc conf template_file.val (bp, ep) in eprintf ", "; match line with [ Some (lin, col1, col2) -> eprintf "line %d, characters %d-%d:\n" lin col1 col2 | None -> eprintf "characters %d-%d:\n" bp ep ]; match exc with [ Failure s -> eprintf "Failed - %s" s | _ -> eprintf "%s" (Printexc.to_string exc) ]; eprintf "\n\n"; flush stderr; } else (); } ELSE () END; } ; value eval_bool_expr conf (eval_var, eval_apply) e = try match eval_expr (conf, eval_var, eval_apply) e with [ VVbool b -> b | VVstring _ | VVother _ -> raise_with_loc (loc_of_expr e) (Failure "bool value expected") ] with [ Exc_located loc exc -> do { print_error conf loc exc; False } ] ; value eval_string_expr conf (eval_var, eval_apply) e = try match eval_expr (conf, eval_var, eval_apply) e with [ VVstring s -> Util.translate_eval s | VVbool _ | VVother _ -> raise_with_loc (loc_of_expr e) (Failure "string value expected") ] with [ Exc_located loc exc -> do { print_error conf loc exc; "" } ] ; value print_body_prop conf = let s = try " dir=\"" ^ Hashtbl.find conf.lexicon " !dir" ^ "\"" with [ Not_found -> "" ] in Wserver.wprint "%s" (s ^ Util.body_prop conf) ; type vother 'a = [ Vdef of list string and list ast | Vval of expr_val 'a | Vbind of string and string ] ; type env 'a = list (string * 'a); type interp_fun 'a 'b = { eval_var : env 'a -> 'b -> loc -> list string -> expr_val 'b; eval_transl : env 'a -> bool -> string -> string -> string; eval_predefined_apply : env 'a -> string -> list (expr_val 'b) -> string; get_vother : 'a -> option (vother 'b); set_vother : vother 'b -> 'a; print_foreach : (env 'a -> 'b -> ast -> unit) -> (env 'a -> 'b -> ast -> string) -> env 'a -> 'b -> loc -> string -> list string -> list (list ast) -> list ast -> unit } ; value get_def get_vother k env = let k = "#" ^ k in try match get_vother (List.assoc k env) with [ Some (Vdef al el) -> Some (al, el) | _ -> None ] with [ Not_found -> None ] ; value get_val get_vother k env = let k = "#" ^ k in try match get_vother (List.assoc k env) with [ Some (Vval x) -> Some x | _ -> None ] with [ Not_found -> None ] ; value set_def set_vother k al el env = let k = "#" ^ k in [(k, set_vother (Vdef al el)) :: env] ; value set_val set_vother k v env = let k = "#" ^ k in [(k, set_vother (Vval v)) :: env] ; value eval_subst loc f set_vother env xl vl a = loop env a xl vl where rec loop env a xl vl = match (xl, vl) with [ ([x :: xl], [VVstring v :: vl]) -> loop env (subst (subst_text x v) a) xl vl | ([x :: xl], [v :: vl]) -> let env = set_val set_vother x v env in loop env a xl vl | ([], []) -> (env, a) | _ -> (env, Atext loc (f ^ ": bad # of params")) ] ; value squeeze_spaces s = loop 0 where rec loop i = if i = String.length s then "" else match s.[i] with [ ' ' | '\n' | '\r' | '\t' -> loop (i + 1) | _ -> String.sub s i (String.length s - i) ] ; value print_apply loc f set_vother print_ast env ep gxl al gvl = let local_print_ast a = let (env, a) = loop env a gxl gvl where rec loop env a xl vl = match (xl, vl) with [ ([x :: xl], [VVstring v :: vl]) -> loop env (subst (subst_text x v) a) xl vl | ([x :: xl], [v :: vl]) -> loop (set_val set_vother x v env) a xl vl | ([], []) -> (env, a) | _ -> (env, Atext loc (sprintf "%s: bad # of params (%d instead of %d)" f (List.length gvl) (List.length gxl))) ] in print_ast env ep a in loop al where rec loop = fun [ [] -> () | [Avar _ "sq" []; Atext loc s :: al] -> let s = squeeze_spaces s in loop [Atext loc s :: al] | [a :: al] -> do { local_print_ast a; loop al } ] ; value templ_eval_expr = eval_string_expr; value templ_print_apply = print_apply; value rec templ_print_foreach conf print_ast set_vother env ep loc s sl el al = match [s :: sl] with [ ["env_binding"] -> print_foreach_env_binding conf print_ast set_vother env ep al | _ -> raise Not_found ] and print_foreach_env_binding conf print_ast set_vother env ep al = List.iter (fun (k, v) -> let print_ast = print_ast [("binding", set_vother (Vbind k v)) :: env] ep in List.iter print_ast al) conf.env ; value float_rgb_of_hsv h s v = let h = if h > 1. then 1. else if h < 0. then 0. else h in let s = if s > 1. then 1. else if s < 0. then 0. else s in let v = if v > 1. then 1. else if v < 0. then 0. else v in let h = if h = 1.0 then 0. else h in let h = h *. 6. in let i = truncate h in let f = h -. float i in let p = v *. (1. -. s) in let q = v *. (1. -. s *. f) in let t = v *. (1. -. s *. (1. -. f)) in match i with [ 0 -> (v, t, p) | 1 -> (q, v, p) | 2 -> (p, v, t) | 3 -> (p, q, v) | 4 -> (t, p, v) | 5 -> (v, p, q) | _ -> assert False ] ; value rgb_of_hsv h s v = let (r, g, b) = float_rgb_of_hsv (float h /. 256.) (float s /. 256.) (float v /. 256.) in (truncate (r *. 256.), truncate (g *. 256.), truncate (b *. 256.)) ; value rgb_of_str_hsv h s v = let ios s = int_of_string s in rgb_of_hsv (ios h) (ios s) (ios v) ; value eval_var conf ifun env ep loc sl = try match sl with [ ["env"; "key"] -> match ifun.get_vother (List.assoc "binding" env) with [ Some (Vbind k v) -> VVstring k | _ -> raise Not_found ] | ["env"; "val"] -> match ifun.get_vother (List.assoc "binding" env) with [ Some (Vbind k v) -> VVstring v | _ -> raise Not_found ] | ["env"; "val"; "decoded"] -> match ifun.get_vother (List.assoc "binding" env) with [ Some (Vbind k v) -> VVstring (Util.decode_varenv v) | _ -> raise Not_found ] | ["today" :: sl] -> TemplDate.eval_date_var conf (Calendar.sdn_of_gregorian conf.today) sl | [s :: sl] -> match (get_val ifun.get_vother s env, sl) with [ (Some (VVother f), sl) -> f sl | (Some v, []) -> v | (_, sl) -> ifun.eval_var env ep loc [s :: sl] ] | _ -> ifun.eval_var env ep loc sl ] with [ Not_found -> VVstring (eval_variable conf sl) ] ; value print_foreach conf ifun print_ast eval_expr env ep loc s sl el al = try ifun.print_foreach print_ast eval_expr env ep loc s sl el al with [ Not_found -> templ_print_foreach conf print_ast ifun.set_vother env ep loc s sl el al ] ; value print_wid_hei env fname = match Util.image_size (Util.image_file_name fname) with [ Some (wid, hei) -> Wserver.wprint " width=\"%d\" height=\"%d\"" wid hei | None -> () ] ; value copy_from_templ_fwd = ref (fun []); value copy_from_templ conf env ic = copy_from_templ_fwd.val conf env ic; value print_copyright conf = match Util.open_etc_file "copyr" with [ Some ic -> copy_from_templ conf [] ic | None -> do { xtag "hr" "style=\"margin:0\""; tag "div" "style=\"font-size: 80%%\"" begin stag "em" begin Wserver.wprint "Copyright (c) 1998-2007 INRIA - GeneWeb %s" Version.txt; end; end; xtag "br"; } ] ; value print_copyright_with_logo conf = let conf = {(conf) with env = [("with_logo", "yes") :: conf.env]} in print_copyright conf ; value old_include_hed_trl conf base_opt suff = let hed_fname = let fname = Util.base_path ["lang"; conf.lang] (conf.bname ^ suff) in if Sys.file_exists fname then fname else Util.base_path ["lang"] (conf.bname ^ suff) in match try Some (Secure.open_in hed_fname) with [ Sys_error _ -> None ] with [ Some ic -> let url () = match base_opt with [ Some base -> Util.url_no_index conf base | None -> Util.get_server_string conf ^ Util.get_request_string conf ] in let pref () = let s = url () in match Mutil.rindex s '?' with [ Some i -> String.sub s 0 (i + 1) | None -> s ] in let suff () = let s = url () in match Mutil.rindex s '?' with [ Some i -> String.sub s (i + 1) (String.length s - i - 1) | None -> "" ] in Util.copy_from_etc [('p', pref); ('s', suff); ('t', fun _ -> Util.commd conf); ('/', fun _ -> conf.xhs)] conf.lang conf.indep_command ic | None -> () ] ; value include_hed_trl conf base_opt name = match Util.open_hed_trl conf name with [ Some ic -> copy_from_templ conf [] ic | None -> old_include_hed_trl conf base_opt ("." ^ name) ] ; value rec interp_ast conf base ifun env = let m_env = ref env in let rec eval_ast env ep a = string_of_expr_val (eval_ast_expr env ep a) and eval_ast_list env ep = fun [ [] -> [] | [Avar _ "sq" []; Atext loc s :: al] -> let s = squeeze_spaces s in eval_ast_list env ep [Atext loc s :: al] | [a :: al] -> [eval_ast env ep a :: eval_ast_list env ep al] ] and eval_ast_expr env ep = fun [ Atext _ s -> VVstring s | Avar loc s sl -> eval_string_var conf (eval_var conf ifun env ep loc) [s :: sl] | Atransl _ upp s n -> VVstring (ifun.eval_transl env upp s n) | Aif e alt ale -> VVstring (eval_if env ep e alt ale) | Aapply loc f all -> let vl = List.map (eval_ast_expr_list env ep) all in VVstring (eval_apply env ep loc f vl) | Afor i min max al -> VVstring (eval_for env ep i min max al) | x -> VVstring (eval_expr env ep x) ] and eval_ast_expr_list env ep v = let rec loop = fun [ [] -> [] | [Avar _ "sq" []; Atext loc s :: al] -> let s = squeeze_spaces s in loop [Atext loc s :: al] | [a :: al] -> [eval_ast_expr env ep a :: loop al] ] in match loop v with [ [e] -> e | el -> let sl = List.map string_of_expr_val el in VVstring (String.concat "" sl) ] and eval_expr env ep e = let eval_apply = eval_apply env ep in let eval_var = eval_var conf ifun env ep in templ_eval_expr conf (eval_var, eval_apply) e and eval_apply env ep loc f vl = match get_def ifun.get_vother f env with [ Some (xl, al) -> let (env, al) = List.fold_right (fun a (env, al) -> let (env, a) = eval_subst loc f ifun.set_vother env xl vl a in (env, [a :: al])) al (env, []) in let sl = List.map (eval_ast env ep) al in String.concat "" sl | None -> match (f, vl) with [ ("capitalize", [VVstring s]) -> Util.capitale s | ("interp", [VVstring s]) -> let astl = parse_templ conf (Stream.of_string s) in String.concat "" (eval_ast_list env ep astl) | ("language_name", [VVstring s]) -> Translate.language_name s (Util.transl conf " !languages") | ("nth", [VVstring s1; VVstring s2]) -> let n = try int_of_string s2 with [ Failure _ -> 0 ] in Util.translate_eval (Util.nth_field s1 n) | ("red_of_hsv", [VVstring h; VVstring s; VVstring v]) -> try let (r, g, b) = rgb_of_str_hsv h s v in string_of_int r with [ Failure _ -> "red_of_hsv bad params" ] | ("green_of_hsv", [VVstring h; VVstring s; VVstring v]) -> try let (r, g, b) = rgb_of_str_hsv h s v in string_of_int g with [ Failure _ -> "green_of_hsv bad params" ] | ("blue_of_hsv", [VVstring h; VVstring s; VVstring v]) -> try let (r, g, b) = rgb_of_str_hsv h s v in string_of_int b with [ Failure _ -> "blue_of_hsv bad params" ] | _ -> try ifun.eval_predefined_apply env f vl with [ Not_found -> sprintf "%%apply;%s?" f ] ] ] and eval_if env ep e alt ale = let eval_var = eval_var conf ifun env ep in let eval_ast = eval_ast env ep in let eval_apply = eval_apply env ep in let al = if eval_bool_expr conf (eval_var, eval_apply) e then alt else ale in String.concat "" (List.map eval_ast al) and eval_for env ep iterator min max al = let rec loop env min max accu = let new_env = env in let v = eval_ast_expr_list new_env ep [min] in let new_env = set_val ifun.set_vother iterator v new_env in let eval_var = eval_var conf ifun new_env ep in let eval_apply = eval_apply new_env ep in let eval_ast = eval_ast new_env ep in let int_min = int_of_string (eval_string_expr conf (eval_var, eval_apply) min) in let int_max = int_of_string (eval_string_expr conf (eval_var, eval_apply) max) in if int_min < int_max then let instr = (String.concat "" (List.map eval_ast al)) in let accu = accu ^ instr in loop new_env (Aop2 (0, 0) "+" min (Aint (0, 0) "1")) max accu else accu in loop env min max "" in let rec print_ast env ep = fun [ Avar loc s sl -> print_var print_ast_list conf base ifun env ep loc [s :: sl] | Awid_hei s -> print_wid_hei env s | Aif e alt ale -> print_if env ep e alt ale | Aforeach (loc, s, sl) el al -> try print_foreach conf ifun print_ast eval_expr env ep loc s sl el al with [ Not_found -> Wserver.wprint " %%foreach;%s?" (String.concat "." [s :: sl]) ] | Adefine f xl al alk -> print_define env ep f xl al alk | Aapply loc f ell -> print_apply env ep loc f ell | Alet k v al -> print_let env ep k v al | Afor i min max al -> print_for env ep i min max al | x -> Wserver.wprint "%s" (eval_ast env ep x) ] and print_ast_list env ep = fun [ [] -> m_env.val := env | [Avar _ "sq" []; Atext loc s :: al] -> let s = squeeze_spaces s in print_ast_list env ep [Atext loc s :: al] | [Aimport templ astl :: al] -> do { print_ast_list env ep astl; print_ast_list m_env.val ep al; } | [a] -> print_ast env ep a | [a :: al] -> do { print_ast env ep a; print_ast_list env ep al } ] and print_define env ep f xl al alk = let env = set_def ifun.set_vother f xl al env in print_ast_list env ep alk and print_apply env ep loc f ell = let vl = List.map (eval_ast_expr_list env ep) ell in match get_def ifun.get_vother f env with [ Some (xl, al) -> templ_print_apply loc f ifun.set_vother print_ast env ep xl al vl | None -> Wserver.wprint "%s" (eval_apply env ep loc f vl) ] and print_let env ep k v al = let v = eval_ast_expr_list env ep v in let env = set_val ifun.set_vother k v env in print_ast_list env ep al and print_if env ep e alt ale = let eval_var = eval_var conf ifun env ep in let eval_apply = eval_apply env ep in let al = if eval_bool_expr conf (eval_var, eval_apply) e then alt else ale in print_ast_list env ep al and print_for env ep i min max al = let rec loop env min max = let new_env = env in let v = eval_ast_expr_list new_env ep [min] in let new_env = set_val ifun.set_vother i v new_env in let eval_var = eval_var conf ifun new_env ep in let eval_apply = eval_apply new_env ep in let int_min = int_of_string (eval_string_expr conf (eval_var, eval_apply) min) in let int_max = int_of_string (eval_string_expr conf (eval_var, eval_apply) max) in if int_min < int_max then let _ = print_ast_list new_env ep al in loop new_env (Aop2 (0, 0) "+" min (Aint (0, 0) "1")) max else () in loop env min max in print_ast_list env and print_var print_ast_list conf base ifun env ep loc sl = let rec print_var1 eval_var sl = try match eval_var sl with [ VVstring s -> Wserver.wprint "%s" s | VVbool True -> Wserver.wprint "1" | VVbool False -> Wserver.wprint "0" | VVother f -> print_var1 f [] ] with [ Not_found -> match sl with [ ["include"; templ] -> match input_templ conf templ with [ Some astl -> print_ast_list env ep astl | None -> Wserver.wprint " %%%s?" (String.concat "." sl) ] | sl -> print_variable conf base sl ] ] in let eval_var = eval_var conf ifun env ep loc in print_var1 eval_var sl and print_simple_variable conf base_opt = fun [ "base_header" -> include_hed_trl conf base_opt "hed" | "base_trailer" -> include_hed_trl conf base_opt "trl" | "body_prop" -> print_body_prop conf | "copyright" -> print_copyright_with_logo conf | "copyright_nologo" -> print_copyright conf | "hidden" -> Util.hidden_env conf | "message_to_wizard" -> Util.message_to_wizard conf | _ -> raise Not_found ] and print_variable conf base_opt sl = try Wserver.wprint "%s" (eval_variable conf sl) with [ Not_found -> try match sl with [ [s] -> print_simple_variable conf base_opt s | _ -> raise Not_found ] with [ Not_found -> Wserver.wprint " %%%s?" (String.concat "." sl) ] ] ; value copy_from_templ conf env ic = do { let astl = parse_templ conf (Stream.of_channel ic) in close_in ic; let ifun = {eval_var env accu loc = fun [ [s] -> VVstring (List.assoc s env) | _ -> raise Not_found ]; eval_transl env = eval_transl conf; eval_predefined_apply _ = raise Not_found; get_vother _ = None; set_vother _ = ""; print_foreach _ = raise Not_found} in let v = template_file.val in template_file.val := ""; try interp_ast conf None ifun env () astl with e -> do { template_file.val := v; raise e }; template_file.val := v; }; copy_from_templ_fwd.val := copy_from_templ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/futil.mli0000660000175200017530000000223212664543647023035 0ustar guillaumeguillaume(* $Id: futil.mli,v 5.5 2007-03-05 05:18:23 ddr Exp $ *) (* Copyright (c) 2006-2007 INRIA *) open Def; value map_title_strings : ('a -> 'b) -> gen_title 'a -> gen_title 'b; value map_relation_ps : ('a -> 'c) -> ('b -> 'd) -> gen_relation 'a 'b -> gen_relation 'c 'd ; value map_person_ps : ('a -> 'c) -> ('b -> 'd) -> gen_person 'a 'b -> gen_person 'c 'd ; value map_union_f : ('a -> 'b) -> gen_union 'a -> gen_union 'b; value map_family_ps : ('a -> 'c) -> ('b -> 'd) -> gen_family 'a 'b -> gen_family 'c 'd ; value map_couple_p : bool -> ('a -> 'b) -> gen_couple 'a -> gen_couple 'b; value map_descend_p : ('a -> 'b) -> gen_descend 'a -> gen_descend 'b; value eq_lists : ('a -> 'b -> bool) -> list 'a -> list 'b -> bool; value eq_titles : ('a -> 'b -> bool) -> gen_title 'a -> gen_title 'b -> bool; value eq_title_names : ('a -> 'b -> bool) -> gen_title_name 'a -> gen_title_name 'b -> bool; value parent : bool -> array 'a -> gen_couple 'a; value gen_person_misc_names : string -> string -> string -> list string -> list string -> list string -> list string -> list (Def.gen_title string) -> list (string * list string) -> list string -> list string; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/diff.mli0000660000175200017530000000142712664543647022627 0ustar guillaumeguillaume(* $Id: diff.mli,v 5.1 2006-11-03 10:31:18 ddr Exp $ *) (** Differences between two arrays. *) value f : array 'a -> array 'a -> (array bool * array bool); (** [Diff.f a1 a2] returns a couple of two arrays of booleans [(d1, d2)]. [d1] has the same size as [a1]. [d2] has the same size as [a2]. [d1.(i)] is [True] if [a1.(i)] has no corresponding value in [a2]. [d2.(i)] is [True] if [a2.(i)] has no corresponding value in [a1]. [d1] and [s2] have the same number of values equal to [False]. Can be used to write the [diff] program (comparison of two files), the input arrays being the array of lines of each file. Can be used also to compare two strings (they must have been exploded into arrays of chars), or two DNA strings, and so on. *) geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/i18n0000660000175200017530000002365512664543647021725 0ustar guillaumeguillaume !dates order !dir !languages the first branch to see the first branch to see the first relationship link to try again with this number %1 of %2 %d %s starting with %s %d years ago %s access cancelled for that page %s cousins %s forbidden char %s, it is %s of %s, it will be %s of %t already has parents %t died before his/her birth %t has incorrect title dates: %t %t is born after the death of his/her mother %t %t is born more than 2 years after the death of his/her father %t %t's sex is not coherent with his/her relations %t was witness after his/her death %t was witness before his/her birth (date) (decimal separator) (french revolution month) (hebrew month) (month) (thousand separator) (week day) 2nd cousins 3rd cousins Sosa number relative to %t a 2nd cousin a 3rd cousin about (date) about (short date) a brother/a sister/a sibling a brother-in-law/a sister-in-law access a cousin add add base notes add picture a descendant adoptive father/adoptive mother/adoptive parents adoptive son/adoptive daughter/adoptive child advanced request after after (date) age age at death age at death: age at %s birth date a grandfather/a grandmother/a grandparent a grandson/a granddaughter/a grandchild a great-grandfather/a great-grandmother/a great-grandparent a great-grandson/a great-granddaughter/a great-grandchild a great-nephew/a great-niece a great-uncle/a great-aunt a half-brother/a half-sister/a half-sibling alias alive all the estates all the titles alphabetic order also an ancestor ancestors ancestors (some) and a nephew/a niece anniversaries anniversaries of birth anniversaries of dead people anniversaries of marriage an uncle/an aunt any individual in the base are ascendants tree at a %s cousin a son/a daughter/a child a son-in-law/a daughter-in-law at the same time average age at death back baptism baptism place baptism src baptized base index notes base notes base wizard notes before before (date) begin between (date) bibliography birth birth place birth src birthdays birth date and birth place book of %s border born branch/branches burial burial place burial src buried calendar/calendars cancel GeneWeb links candidate father/candidate mother/candidate parents candidate son/candidate daughter/candidate child cannot access base cannot change sex of a married person celebrities change children's names changed order of children changed order of marriages change it (the number) yourself child/children children's names changed click click on "%s" close family color comment compare compare selected revisions compute all marriages compute approximatives dates connections consanguinity continue correcting continue merging continued cousins cousins (general term) create cremated database forum date/dates date begin date end date of birth date of death date of marriage days old death death place death src death date and death place delete descendants descendants at the generation died died at an advanced age died young difference between the two revisions direct ancestor of %s disappeared disconnect display Aboville number display by/branch/alphabetic order display by slices/slice width/overlap/total width display border tree display empty picture display generation display marriage date display notes/sources inline display picture display smallest sosa number relative to ancestor display spouse divorce divorced don't group the common branches together don't know end engaged engaged%t to error estate exact executed (legally killed) families with encoding family added family birthday family deleted family source family/families family history family modified father/mother file first free number first name alias first name/first names first name missing first name not found for the first names by alphabetic order for the list ordered by the date of the last modification foster father/foster mother/foster parents foster son/foster daughter/foster child full siblings generation/generations godfather/godmother/godparents godson/goddaughter/godchild grand-parents great-grand-parents gregorian/julian/french/hebrew groom/bride half siblings half-siblings happy birthday to them! happy birthday to you! having a family having no family having as children help modify data help surname branch here him/her history history of updates horizontally husband/wife ident/email/subject iftitles/public/private if titles image deleted image/images image received include missing spouses include spouses incompatible sexes incorrect date incorrect request indeed, index of the descendants index of the spouses (non descendants) individual notes in (month year) insert insufficient revision history for %s inversion done invert invert the order of the following families in (year) is is a very old parent is a very young parent is born after his/her child it is the same person! julian day killed (in action) less than one month old link link between linked pages link to use list/list (ancestors) list eclair living after %s living before %s living between %s and %s living from/to long display looking for loop in database: %s is his/her own ancestor M/F main title male/female/neuter male line/female line marriage had occured after the death of %t marriage had occured before the birth of %t marriage date marriage place marriage src marriage/marriages marriage notes marriage of %t after his/her death marriage of %t before his/her birth marriage with married married at age %t married%t to maternal grand-parents maximum merge merge done message added message deleted message/previous message/previous messages/next message M/F miscellaneous notes miscellaneous informations missing ancestors missing events missing parents missing sosa missing spouse missing sources modification/modifications modification successful modify modify picture modify %s months old moon age/new moon/first quarter/full moon/last quarter more than %d answers msg error disconnected murdered n° d'Aboville n° Sosa n° Sosa relative to name name %s already used by %tthis person%t navigation navigation with %t as Sosa reference NB: you should try another relationship computing mode nephews and nieces new modification next relationship path next sibling no anniversary no birthday no descendants no known relationship link between %s and %s no match no mention no modification no sexes check not divorced note/notes notes modified notes summary not found not married nth nth (cousin) nth (generation) number nb branches nb children nb individuals nb events number of branches number of children number of individuals number of events number of living persons: occupation/occupations of course dead of the %s generation on (day month year) one day old one month old one year old only the generation selected on %s's side on (weekday day month year) optional or other action parents paternal grand-parents person added person deleted person modified person source person/persons persons having the same name place %s modified places population pyramid possible duplications possibly (date) precision preview family tree previous sibling private public public name qualifier recognized son/recognized daughter/recognized child recognizing father/recognizing mother/recognizing parents reference key relation/relations relationship relationship by ancestors relationship by marriage relationship computing relationship computing mode relationship display options relationship link/relationship links relationship link between relationship shortcut relationship%t to revision history revision of same ancestor as n° Sosa searching all search/case sensitive see see above see also see ascendants notes/sources see ascendants pictures see descendants notes/sources see descendants pictures see further select select a letter select a month to see all the anniversaries select person to compute relationship select the two revisions you want to compare send separated several answers sex short display shortcut: direct ancestor relationship with shortest path should be female should be male siblings since the last click son/daughter/child sort by/branch/alphabetic order sort by/date begin/alphabetic order/nb individuals/nb events sort by/generation/alphabetic order Sosa Sosa reference: %t source/sources specify spouse/spouses spouses not included starting with statistics statistics and anniversaries surname alias surname missing surname not found surnames branch surnames list surname/surnames table text the anniversary the anniversary of marriage the base has changed; do "back", "reload", and refill the form the birthday the children the day after tomorrow the difference of age between %t and %t is quite important the %d first names the %d oldest couples perhaps still alive and engaged the %d oldest perhaps still alive the %d surnames the %d who lived the longest the father-in-law/the mother-in-law the father/the mother/a parent the file is temporarily locked: please try again the following children of %t and %t are born very close the following children of %t and %t are not in order the grandchildren the grandparents the great-grandchildren the great-grandparents the latest %d births the latest %d celebrated marriages the latest %d marriages the latest %d registered marriages the latest %t deaths the modification impacted %d persons the parents the %s generation the spouse the whole list this forum is moderated title/titles to add a child to a family, use "%s" to change to come today tomorrow tools total to the children to the grandchildren to the grandparents to the great-grandchildren to the great-grandparents to the parents to the %s generation tree try again uncles and aunts undefined sex for %t unknown person unspecified update up to use "link" instead of "create" user/password/cancel validate/delete version view source visualize/show/hide/summary warnings where born where dead where married with witness at marriage of %s and %s witness/witnesses wizard/wizards/friend/friends/exterior would be his/her own ancestor year/month/day years old Y/N you are visible/you are not visible you must first merge you must first merge the 2 families your message is waiting for validation geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/birthday.ml0000660000175200017530000005274112664543647023361 0ustar guillaumeguillaume(* camlp5r ./pa_html.cmo *) (* $Id: birthday.ml,v 5.17 2007-09-12 09:58:44 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Config; open Def; open Gwdb; open Hutil; open Util; type date_event = [ DeBirth | DeDeath of death_reason ]; value print_anniversary_day conf base dead_people liste = tag "ul" begin List.iter (fun (p, a, date_event, txt_of) -> let is = index_of_sex (get_sex p) in tag "li" begin Wserver.wprint "%s\n" (txt_of conf base p); if not dead_people then Wserver.wprint " %d\n" a else let txt = match date_event with [ DeBirth -> transl_nth conf "born" is | DeDeath Unspecified -> transl_nth conf "died" is | DeDeath Killed -> transl_nth conf "killed (in action)" is | DeDeath Murdered -> transl_nth conf "murdered" is | DeDeath Executed -> transl_nth conf "executed (legally killed)" is | DeDeath Disappeared -> transl_nth conf "disappeared" is ] in Wserver.wprint ", %s %s %d\n" txt (transl conf "in (year)") a; end) liste; end ; value gen_print conf base mois f_scan dead_people = let tab = Array.make 31 [] in let title _ = let lab = if dead_people then transl conf "anniversaries" else transl conf "birthdays" in Wserver.wprint "%s %s" (capitale lab) (Util.translate_eval (transl_nth conf "(month)" (mois - 1))) in do { try while True do { let (p, txt_of) = f_scan () in if not dead_people then match (Adef.od_of_codate (get_birth p), get_death p) with [ (Some (Dgreg d _), NotDead | DontKnowIfDead) -> if d.prec = Sure && d.day <> 0 && d.month <> 0 && d.month = mois && d.delta = 0 then if authorized_age conf base p then let j = d.day in tab.(pred j) := [(p, d.year, DeBirth, txt_of) :: tab.(pred j)] else () else () | _ -> () ] else match get_death p with [ NotDead | DontKnowIfDead -> () | _ -> do { match Adef.od_of_codate (get_birth p) with [ Some (Dgreg dt _) -> if dt.prec = Sure && dt.day <> 0 && dt.month <> 0 && dt.month = mois && dt.delta = 0 then if authorized_age conf base p then let j = dt.day in tab.(pred j) := [(p, dt.year, DeBirth, txt_of) :: tab.(pred j)] else () else () | _ -> () ]; match get_death p with [ Death dr d -> match Adef.date_of_cdate d with [ Dgreg dt _ -> if dt.prec = Sure && dt.day <> 0 && dt.month <> 0 && dt.month = mois && dt.delta = 0 then if authorized_age conf base p then let j = dt.day in let a = dt.year in tab.(pred j) := [(p, a, DeDeath dr, txt_of) :: tab.(pred j)] else () else () | _ -> () ] | _ -> () ]; } ] } with [ Not_found -> () ]; header conf title; print_link_to_welcome conf True; if List.for_all (fun l -> List.length l = 0) (Array.to_list tab) then tag "p" begin Wserver.wprint "%s.\n" (capitale (transl conf "no anniversary")); end else (); Wserver.wprint "
        \n"; for j = 1 to 31 do { if tab.(pred j) <> [] then do { tag "li" begin Wserver.wprint "%d\n" j; let liste = List.sort (fun (p1, a1, _, _) (p2, a2, _, _) -> compare a1 a2) tab.(pred j) in print_anniversary_day conf base dead_people liste; end } else () }; Wserver.wprint "
      \n"; trailer conf; } ; value print_anniversary_list conf base dead_people dt liste = let a_ref = dt.year in tag "ul" begin List.iter (fun (p, a, date_event, txt_of) -> stagn "li" begin if dead_people then do { Wserver.wprint ""; match date_event with [ DeBirth -> Wserver.wprint "%s" (transl conf "birth") | DeDeath _ -> Wserver.wprint "%s" (transl conf "death") ]; Wserver.wprint "\n"; Wserver.wprint "-> "; Wserver.wprint "%s" (txt_of conf base p); Wserver.wprint "\n%s %d" (transl conf "in (year)") a; Wserver.wprint " ("; Wserver.wprint (ftransl conf "%d years ago") (conf.today.year - a); Wserver.wprint ")"; } else do { Wserver.wprint "%s" (txt_of conf base p); match get_death p with [ NotDead -> do { Wserver.wprint " "; match a_ref - a with [ 0 -> Wserver.wprint "%s" (transl conf "birth") | 1 -> Wserver.wprint "%s" (transl conf "one year old") | n -> Wserver.wprint "%d %s" n (transl conf "years old") ]; Wserver.wprint ""; } | _ -> () ]; }; end) liste; end ; value f_scan conf base = let i = ref (-1) in fun () -> do { incr i; if i.val < nb_of_persons base then (pget conf base (Adef.iper_of_int i.val), referenced_person_title_text) else raise Not_found } ; value print_birth conf base mois = gen_print conf base mois (f_scan conf base) False ; value print_dead conf base mois = gen_print conf base mois (f_scan conf base) True ; value print_birth_day conf base day_name fphrase wd dt list = match list with [ [] -> tag "p" begin Wserver.wprint "%s %s.\n" (capitale (transl conf "no birthday")) day_name; end | _ -> do { tag "p" begin let txt = transl_decline conf "on (weekday day month year)" (transl_nth conf "(week day)" wd ^ " " ^ Date.code_dmy conf dt) in Wserver.wprint fphrase (capitale day_name ^ ",\n" ^ std_color conf ("" ^ txt ^ "")) (transl conf "the birthday"); Wserver.wprint "...\n"; end; print_anniversary_list conf base False dt list; } ] ; value propose_months conf mode = do { begin_centered conf; stag "span" begin Wserver.wprint "%s" (capitale (transl conf "select a month to see all the anniversaries")); end; tag "table" "border=\"%d\"" conf.border begin tag "tr" begin tag "td" begin tag "form" "method=\"get\" action=\"%s\"" conf.command begin tag "p" begin Util.hidden_env conf; mode (); tag "select" "name=\"v\"" begin for i = 1 to 12 do { stagn "option" "value=\"%d\"%s" i (if i = conf.today.month then " selected=\"selected\"" else "") begin Wserver.wprint "%s" (capitale (Util.translate_eval (transl_nth conf "(month)" (i - 1)))); end }; end; xtag "input" "type=\"submit\" value=\"Ok\""; end; end; end; end; end; end_centered conf; } ; value day_after d = let (day, r) = if d.day >= CheckItem.nb_days_in_month d.month d.year then (1, 1) else (succ d.day, 0) in let (month, r) = if d.month + r > 12 then (1, 1) else (d.month + r, 0) in let year = d.year + r in {day = day; month = month; year = year; prec = Sure; delta = 0} ; value print_anniv conf base day_name fphrase wd dt list = match list with [ [] -> tag "p" begin Wserver.wprint "%s %s.\n" (capitale (transl conf "no anniversary")) day_name; end | _ -> do { tag "p" begin let txt = transl_decline conf "on (weekday day month year)" (transl_nth conf "(week day)" wd ^ " " ^ Date.code_dmy conf dt) in Wserver.wprint fphrase (capitale day_name ^ ",\n" ^ std_color conf ("" ^ txt ^ "")) (transl conf "the anniversary"); Wserver.wprint "...\n"; end; print_anniversary_list conf base True dt list; } ] ; value print_marriage conf base month = let title _ = let lab = transl conf "anniversaries of marriage" in Wserver.wprint "%s %s" (capitale lab) (transl_decline conf "in (month year)" (transl_nth conf "(month)" (month - 1))) in let tab = Array.make 31 [] in do { header conf title; print_link_to_welcome conf True; for i = 0 to nb_of_families base - 1 do { let fam = foi base (Adef.ifam_of_int i) in if is_deleted_family fam then () else match Adef.od_of_codate (get_marriage fam) with [ Some (Dgreg {day = d; month = m; year = y; prec = Sure} _) when d <> 0 && m <> 0 -> let father = pget conf base (get_father fam) in let mother = pget conf base (get_mother fam) in if m = month && authorized_age conf base father && not (is_hidden father) && authorized_age conf base mother && not (is_hidden mother) then tab.(pred d) := [(fam, y) :: tab.(pred d)] else () | _ -> () ] }; Wserver.wprint "
        "; for i = 1 to 31 do { match tab.(i - 1) with [ [] -> () | l -> let l = List.sort (fun (fam1, y1) (fam2, y2) -> compare y1 y2) l in do { Wserver.wprint "\n"; html_li conf; Wserver.wprint "%d\n
          " i; List.iter (fun (fam, year) -> do { html_li conf; Wserver.wprint "%s" (referenced_person_title_text conf base (pget conf base (get_father fam))); Wserver.wprint "\n%s\n" (transl_nth conf "and" 0); Wserver.wprint "%s" (referenced_person_title_text conf base (pget conf base (get_mother fam))); Wserver.wprint ", %s %d\n" (transl conf "in (year)") year; }) l; Wserver.wprint "
        \n"; } ] }; Wserver.wprint "
      \n"; trailer conf; } ; value print_anniversaries_of_marriage conf base y list = tag "ul" begin List.iter (fun (fam, year) -> stagn "li" begin Wserver.wprint "%s\n" (referenced_person_title_text conf base (pget conf base (get_father fam))); Wserver.wprint "%s\n" (transl_nth conf "and" 0); Wserver.wprint "%s" (referenced_person_title_text conf base (pget conf base (get_mother fam))); Wserver.wprint ", %s %d\n(" (transl conf "in (year)") year; Wserver.wprint (ftransl conf "%d years ago") (conf.today.year - year); Wserver.wprint ")"; end) list; end ; value print_marriage_day conf base day_name fphrase wd dt list = match list with [ [] -> tag "p" begin Wserver.wprint "%s %s.\n" (capitale (transl conf "no anniversary")) day_name; end | _ -> do { tag "p" begin Wserver.wprint fphrase (capitale day_name ^ ",\n" ^ std_color conf ("" ^ transl_decline conf "on (weekday day month year)" (transl_nth conf "(week day)" wd ^ " " ^ Date.code_dmy conf dt) ^ "")) (transl conf "the anniversary of marriage"); Wserver.wprint "...\n"; end; print_anniversaries_of_marriage conf base dt.year list; } ] ; value match_dates conf base p d1 d2 = if d1.day = d2.day && d1.month = d2.month then authorized_age conf base p else if d1.day = 29 && d1.month = 2 && d2.day = 1 && d2.month = 3 && not (CheckItem.leap_year d2.year) then authorized_age conf base p else False ; value gen_print_menu_birth conf base f_scan mode = let title _ = Wserver.wprint "%s" (capitale (transl conf "birthdays")) in let tom = day_after conf.today in let aft = day_after tom in let list_tod = ref [] in let list_tom = ref [] in let list_aft = ref [] in do { match Util.find_person_in_env conf base "" with [ Some p -> do { Perso.interp_notempl_with_menu title "perso_header" conf base p; tag "h2" begin title False; end; } | None -> header conf title ]; print_link_to_welcome conf True; try while True do { let (p, txt_of) = f_scan () in match (Adef.od_of_codate (get_birth p), get_death p) with [ (Some (Dgreg d _), NotDead | DontKnowIfDead) -> if d.prec = Sure && d.day <> 0 && d.month <> 0 then if match_dates conf base p d conf.today then list_tod.val := [(p, d.year, DeBirth, txt_of) :: list_tod.val] else if match_dates conf base p d tom then list_tom.val := [(p, d.year, DeBirth, txt_of) :: list_tom.val] else if match_dates conf base p d aft then list_aft.val := [(p, d.year, DeBirth, txt_of) :: list_aft.val] else () else () | _ -> () ] } with [ Not_found -> () ]; List.iter (fun xx -> xx.val := List.sort (fun (p1, a1, _, _) (p2, a2, _, _) -> compare a1 a2) xx.val) [list_tod; list_tom; list_aft]; print_birth_day conf base (transl conf "today") (ftransl conf "%s, it is %s of") conf.today_wd conf.today list_tod.val; print_birth_day conf base (transl conf "tomorrow") (ftransl conf "%s, it will be %s of") ((conf.today_wd + 1) mod 7) tom list_tom.val; print_birth_day conf base (transl conf "the day after tomorrow") (ftransl conf "%s, it will be %s of") ((conf.today_wd + 2) mod 7) aft list_aft.val; Wserver.wprint "\n"; propose_months conf mode; Wserver.wprint "\n"; trailer conf; } ; value print_menu_birth conf base = let i = ref (-1) in let nb_per = nb_of_persons base in let f_scan () = do { incr i; if i.val < nb_per then (pget conf base (Adef.iper_of_int i.val), referenced_person_title_text) else raise Not_found } in let mode () = xtag "input" "type=\"hidden\" name=\"m\" value=\"AN\"" in gen_print_menu_birth conf base f_scan mode ; value gen_print_menu_dead conf base f_scan mode = let title _ = Wserver.wprint "%s" (capitale (transl conf "anniversaries of dead people")) in let tom = day_after conf.today in let aft = day_after tom in let list_tod = ref [] in let list_tom = ref [] in let list_aft = ref [] in do { header conf title; print_link_to_welcome conf True; try while True do { let (p, txt_of) = f_scan () in match get_death p with [ NotDead | DontKnowIfDead -> () | _ -> do { match Adef.od_of_codate (get_birth p) with [ Some (Dgreg d _) -> if d.prec = Sure && d.day <> 0 && d.month <> 0 then if match_dates conf base p d conf.today then list_tod.val := [(p, d.year, DeBirth, txt_of) :: list_tod.val] else if match_dates conf base p d tom then list_tom.val := [(p, d.year, DeBirth, txt_of) :: list_tom.val] else if match_dates conf base p d aft then list_aft.val := [(p, d.year, DeBirth, txt_of) :: list_aft.val] else () else () | _ -> () ]; match get_death p with [ Death dr d -> match Adef.date_of_cdate d with [ Dgreg d _ -> if d.prec = Sure && d.day <> 0 && d.month <> 0 then if match_dates conf base p d conf.today then list_tod.val := [(p, d.year, DeDeath dr, txt_of) :: list_tod.val] else if match_dates conf base p d tom then list_tom.val := [(p, d.year, DeDeath dr, txt_of) :: list_tom.val] else if match_dates conf base p d aft then list_aft.val := [(p, d.year, DeDeath dr, txt_of) :: list_aft.val] else () else () | _ -> () ] | _ -> () ]; } ] } with [ Not_found -> () ]; List.iter (fun xx -> xx.val := List.sort (fun (p1, a1, _, _) (p2, a2, _, _) -> compare a1 a2) xx.val) [list_tod; list_tom; list_aft]; print_anniv conf base (transl conf "today") (ftransl conf "%s, it is %s of") conf.today_wd conf.today list_tod.val; print_anniv conf base (transl conf "tomorrow") (ftransl conf "%s, it will be %s of") ((conf.today_wd + 1) mod 7) tom list_tom.val; print_anniv conf base (transl conf "the day after tomorrow") (ftransl conf "%s, it will be %s of") ((conf.today_wd + 2) mod 7) aft list_aft.val; Wserver.wprint "\n"; propose_months conf mode; Wserver.wprint "\n"; trailer conf; } ; value print_menu_dead conf base = let i = ref (-1) in let f_scan () = do { incr i; if i.val < nb_of_persons base then (pget conf base (Adef.iper_of_int i.val), referenced_person_title_text) else raise Not_found } in let mode () = xtag "input" "type=\"hidden\" name=\"m\" value=\"AD\"" in gen_print_menu_dead conf base f_scan mode ; value match_mar_dates conf base cpl d1 d2 = if d1.day = d2.day && d1.month = d2.month then authorized_age conf base (pget conf base (get_father cpl)) && authorized_age conf base (pget conf base (get_mother cpl)) else if d1.day = 29 && d1.month = 2 && d2.day = 1 && d2.month = 3 && not (CheckItem.leap_year d2.year) then authorized_age conf base (pget conf base (get_father cpl)) && authorized_age conf base (pget conf base (get_mother cpl)) else False ; value print_menu_marriage conf base = let title _ = Wserver.wprint "%s" (capitale (transl conf "anniversaries of marriage")) in let tom = day_after conf.today in let aft = day_after tom in let list_tod = ref [] in let list_tom = ref [] in let list_aft = ref [] in do { header conf title; print_link_to_welcome conf True; for i = 0 to nb_of_families base - 1 do { let fam = foi base (Adef.ifam_of_int i) in if is_deleted_family fam then () else match (Adef.od_of_codate (get_marriage fam), get_divorce fam) with [ (Some (Dgreg d _), NotDivorced) when d.day <> 0 && d.month <> 0 && d.prec = Sure -> let update_list cpl = if match_mar_dates conf base cpl d conf.today then list_tod.val := [(cpl, d.year) :: list_tod.val] else if match_mar_dates conf base cpl d tom then list_tom.val := [(cpl, d.year) :: list_tom.val] else if match_mar_dates conf base cpl d aft then list_aft.val := [(cpl, d.year) :: list_aft.val] else () in if conf.use_restrict then let father = pget conf base (get_father fam) in let mother = pget conf base (get_mother fam) in if not (is_hidden father) && not (is_hidden mother) then update_list fam else () else update_list fam | _ -> () ] }; List.iter (fun xx -> xx.val := List.sort (fun (_, y1) (_, y2) -> compare y1 y2) xx.val) [list_tod; list_tom; list_aft]; print_marriage_day conf base (transl conf "today") (ftransl conf "%s, it is %s of") conf.today_wd conf.today list_tod.val; print_marriage_day conf base (transl conf "tomorrow") (ftransl conf "%s, it will be %s of") ((conf.today_wd + 1) mod 7) tom list_tom.val; print_marriage_day conf base (transl conf "the day after tomorrow") (ftransl conf "%s, it will be %s of") ((conf.today_wd + 2) mod 7) aft list_aft.val; Wserver.wprint "\n"; let mode () = xtag "input" "type=\"hidden\" name=\"m\" value=\"AM\"" in propose_months conf mode; Wserver.wprint "\n"; trailer conf; } ; (* template *) type env 'a = [ Vother of 'a | Vnone ] ; value get_vother = fun [ Vother x -> Some x | _ -> None ]; value set_vother x = Vother x; value print_anniversaries conf base = if p_getenv conf.env "old" = Some "on" then () else Hutil.interp conf base "annivmenu" {Templ.eval_var _ = raise Not_found; Templ.eval_transl _ = Templ.eval_transl conf; Templ.eval_predefined_apply _ = raise Not_found; Templ.get_vother = get_vother; Templ.set_vother = set_vother; Templ.print_foreach _ = raise Not_found} [] () ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/history_diff.ml0000660000175200017530000012443212664543647024241 0ustar guillaumeguillaume(* camlp5r ./pa_html.cmo *) (* $Id: history_diff.ml,v 0.01 2012-12-20 14:34:44 flh Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Config; open Def; open Gutil; open Gwdb; open TemplAst; open Util; type gen_record = { date : string; wizard : string; gen_p : gen_person iper string; gen_f : list (gen_family iper string); gen_c : list (array iper) } ; (* Le nom du fichier historique (à partir de la clé personne). *) value history_file fn sn occ = let space_to_unders = Mutil.tr ' ' '_' in let f = space_to_unders (Name.lower fn) in let s = space_to_unders (Name.lower sn) in f ^ "." ^ string_of_int occ ^ "." ^ s ; (* Le chemin du dossier history_d. *) value history_d conf = let path = match p_getenv conf.base_env "history_path" with [ Some path -> path | None -> "" ] in let bname = if Filename.check_suffix conf.bname ".gwb" then conf.bname else conf.bname ^ ".gwb" in List.fold_left Filename.concat path [Util.base_path [] bname; "history_d"] ; (* Le chemin du fichier historique dans le dossier history_d. *) value history_path conf fname = if String.length fname >= 6 then let dirs = [history_d conf; String.make 1 fname.[0]; String.make 1 fname.[1]] in List.fold_right Filename.concat dirs fname else Filename.concat (history_d conf) fname ; (* Créé tous les dossiers intermédiaires. *) value create_history_dirs conf fname = if String.length fname >= 6 then let dirs = [history_d conf; String.make 1 fname.[0]; String.make 1 fname.[1]] in Mutil.mkdir_p (List.fold_left Filename.concat "" dirs) else () ; (* ************************************************************************ *) (* [Fonc] write_history_file : config -> string -> gen_record -> unit *) (** [Description] : Enregistre la personne dans son fichier historique. [Args] : - fname : le chemin du fichier - gr : le contenu de la personne [Retour] : Néant [Rem] : Non exporté en clair hors de ce module. *) (* ************************************************************************ *) value write_history_file conf person_file fname gr = (* On créé toujours les dossiers nécessaires (changement de clé ...). *) let () = create_history_dirs conf person_file in let ext_flags = [Open_wronly; Open_append; Open_creat; Open_binary; Open_nonblock] in match try Some (Secure.open_out_gen ext_flags 0o644 fname) with [ Sys_error _ -> None ] with [ Some oc -> do { output_value oc (gr : gen_record); close_out oc } | None -> () ] ; (* ************************************************************************ *) (* [Fonc] make_gen_record : config -> base -> bool -> gen_person -> gen_record *) (** [Description] : Crée un gen_record à partir d'une personne. [Args] : - conf : configuratino de la base - base : base de donnée - first : booléen pour savoir si c'est la première entrée de l'historique. Si c'est le cas, on ne connait pas la date de modification, donc on met "environ" une seconde avant. - gen_p : gen_person [Retour] : - gen_record [Rem] : Non exporté en clair hors de ce module. *) (* ************************************************************************ *) value make_gen_record conf base first gen_p = let (hh, mm, ss) = conf.time in let (hh, mm, ss) = (* On évite les calculs savant pour la date (ss - 1 avec une date *) (* autour de minuit ...). C'est simplement une indication. *) if first then (hh, mm, min 0 ss) else (hh, mm, ss) in let date = Printf.sprintf "%04d-%02d-%02d %02d:%02d:%02d" conf.today.year conf.today.month conf.today.day hh mm ss in let p = poi base gen_p.key_index in let fam = get_family p in (* On fait en sorte qu'il y a une 'bijection' *) (* entre les familles et les enfants. *) let (gen_f, gen_c) = List.fold_right (fun ifam (accu_fam, accu_child) -> let fam = foi base ifam in let children = get_children fam in let gen_f = gen_family_of_family fam in ([Util.string_gen_family base gen_f :: accu_fam], [children :: accu_child])) (Array.to_list fam) ([], []) in { date = date; wizard = conf.user; gen_p = gen_p; gen_f = gen_f; gen_c = gen_c } ; (* ************************************************************************ *) (* [Fonc] record_diff : config -> base -> base_changed -> unit *) (** [Description] : Met à jour le fichier historique d'une personne. [Args] : - conf : configuration de la base - base : base de donnée - changed : le type de modification (voir def.mli) [Retour] : Néant [Rem] : Exporté en clair hors de ce module. *) (* ************************************************************************ *) value record_diff conf base changed = match p_getenv conf.base_env "history_diff" with [ Some "yes" when not conf.manitou -> match changed with [ U_Add_person p -> let person_file = history_file p.first_name p.surname p.occ in let fname = history_path conf person_file in let gr = make_gen_record conf base False p in write_history_file conf person_file fname gr | U_Modify_person o p -> let o_person_file = history_file o.first_name o.surname o.occ in let person_file = history_file p.first_name p.surname p.occ in let ofname = history_path conf o_person_file in let fname = history_path conf person_file in do { (* La clé a changé, on reprend l'ancien historique. *) if o_person_file <> person_file && Sys.file_exists ofname then try Sys.rename ofname fname with [ Sys_error _ -> () ] else (); let gr = make_gen_record conf base False p in if Sys.file_exists fname then write_history_file conf person_file fname gr else do { let o_gr = make_gen_record conf base True o in write_history_file conf person_file fname o_gr; write_history_file conf person_file fname gr; } } | U_Delete_person _ -> () (* Faut-il supprimer l'historique ? *) | U_Merge_person _ o p -> let o_person_file = history_file o.first_name o.surname o.occ in let person_file = history_file p.first_name p.surname p.occ in let fname = history_path conf person_file in let gr = make_gen_record conf base False p in (* La clé a changé avec la fusion, on reprend l'ancien historique. *) if o_person_file <> person_file then do { let ofname = history_path conf o_person_file in try Sys.rename ofname fname with [ Sys_error _ -> () ]; write_history_file conf person_file fname gr } else write_history_file conf person_file fname gr | U_Delete_family p f -> () | U_Add_family p f | U_Modify_family p _ f | U_Merge_family p _ _ f | U_Add_parent p f -> let p_file = history_file p.first_name p.surname p.occ in let p_fname = history_path conf p_file in let cpl = foi base f.fam_index in let isp = Gutil.spouse p.key_index cpl in let sp = poi base isp in let sp_file = history_file (sou base (get_first_name sp)) (sou base (get_surname sp)) (get_occ sp) in let sp_fname = history_path conf sp_file in let gen_sp = gen_person_of_person sp in let gen_sp = Util.string_gen_person base gen_sp in do { let gr = make_gen_record conf base False p in write_history_file conf p_file p_fname gr; let gr = make_gen_record conf base False gen_sp in write_history_file conf sp_file sp_fname gr; (* Création des fichiers pour les enfants ajoutés. *) List.iter (fun ip -> let p = poi base ip in let person_file = history_file (sou base (get_first_name p)) (sou base (get_surname p)) (get_occ p) in let fname = history_path conf person_file in if Sys.file_exists fname then () else let gen_p = gen_person_of_person p in let gen_p = Util.string_gen_person base gen_p in let gr = make_gen_record conf base False gen_p in write_history_file conf person_file fname gr) (Array.to_list (get_children cpl)) } | U_Change_children_name _ list -> List.iter (fun ((ofn, osn, oocc, oip), (fn, sn, occ, ip)) -> let o_person_file = history_file ofn osn oocc in let person_file = history_file fn sn occ in if o_person_file <> person_file then do { let ofname = history_path conf o_person_file in let fname = history_path conf person_file in try Sys.rename ofname fname with [ Sys_error _ -> () ]; let p = poi base ip in let p = Futil.map_person_ps (fun p -> p) (sou base) (gen_person_of_person p) in let gr = make_gen_record conf base False p in write_history_file conf person_file fname gr } else ()) list | U_Multi p -> let person_file = history_file p.first_name p.surname p.occ in let fname = history_path conf person_file in let gr = make_gen_record conf base False p in write_history_file conf person_file fname gr | _ -> () ] | _ -> () ] ; (* avec zip ? *) (* let history = ref [] in let fname = history_path conf fname in if extract_zfile fname then do { read_history_file fname Sys.remove fname } else (); history.val *) (* ************************************************************************ *) (* [Fonc] load_person_history : config -> string -> gen_record list *) (** [Description] : Charge la liste des modifications pour une personne. L'avantage est que les versions les plus récentes se trouvent en tête de liste. [Args] : - conf : configuration de la base - fname : le nom du fichier historique [Retour] : - gen_record list [Rem] : Non exporté en clair hors de ce module. *) (* ************************************************************************ *) value load_person_history conf fname = do { let history = ref [] in let fname = history_path conf fname in match try Some (Secure.open_in_bin fname) with [ Sys_error _ -> None ] with [ Some ic -> do { try while True do { let v : gen_record = input_value ic in history.val := [v :: history.val] } with [ End_of_file -> () ]; close_in ic } | None -> () ]; history.val }; (* ************************************************************************ *) (* [Fonc] print_clean : config -> base -> unit *) (** [Description] : [Args] : - conf : configuration de la base - base : base de donnée [Retour] : Néant [Rem] : Exporté en clair hors de ce module. *) (* ************************************************************************ *) value print_clean conf base = match p_getenv conf.env "f" with [ Some f when f <> "" -> do { let title _ = Wserver.wprint "%s" (capitale (transl conf "clean history")) in Hutil.header conf title; Hutil.print_link_to_welcome conf True; Util.gen_print_tips conf (capitale (transl conf "select the input you want to erase from the history")); let history = load_person_history conf f in tag "form" "method=\"post\" action=\"%s\"" conf.command begin xtag "input" "type=\"hidden\" name=\"m\" value=\"HIST_CLEAN_OK\"" ; xtag "input" "type=\"hidden\" name=\"f\" value=\"%s\"" f; tag "ul" begin loop 0 history where rec loop i = fun [ [] -> () | [gr :: l] -> do { tag "li" begin tag "label" begin xtag "input" "type=\"checkbox\" name=\"i%d\" value=\"on\"" i; Wserver.wprint "%s %s" gr.date gr.wizard; end; end; loop (i + 1) l } ]; end; xtag "input" "type=\"submit\" value=\"Ok\""; end; Hutil.trailer conf } | _ -> Hutil.incorrect_request conf ] ; (* avec zip ? *) (* let history = clean_history in let fname = history_path conf fname in if compress_zfile fname then do { write_history_file fname history; Sys.remove fname } else (); *) (* ************************************************************************ *) (* [Fonc] print_clean_ok : config -> base -> unit *) (** [Description] : Ré-écrit le fichier historique lié à une personne en ayant supprimé les entrées non désirées. [Args] : - conf : configuration de la base - base : base de donnée [Retour] : Néant [Rem] : Exporté en clair hors de ce module. *) (* ************************************************************************ *) value print_clean_ok conf base = let rec clean_history i history new_history = match history with [ [] -> new_history | [gr :: l] -> let lab = "i" ^ string_of_int i in if p_getenv conf.env lab = Some "on" then clean_history (i + 1) l new_history else clean_history (i + 1) l [gr :: new_history] ] in match p_getenv conf.env "f" with [ Some f when f <> "" -> do { let title _ = Wserver.wprint "%s" (capitale (transl conf "history cleaned")) in Hutil.header conf title; Hutil.print_link_to_welcome conf True; let history = load_person_history conf f in let new_history = clean_history 0 history [] in let fname = history_path conf f in if new_history = [] then try Sys.remove fname with [ Sys_error _ -> () ] else let ext_flags = [Open_wronly; Open_trunc; Open_creat; Open_binary; Open_nonblock] in match try Some (Secure.open_out_gen ext_flags 0o644 fname) with [ Sys_error _ -> None ] with [ Some oc -> do { List.iter (fun v -> output_value oc (v : gen_record)) new_history; close_out oc } | None -> () ]; Hutil.trailer conf } | _ -> Hutil.incorrect_request conf ] ; (**/**) (* Template *) value person_of_gen_p_key base gen_p = match person_of_key base gen_p.first_name gen_p.surname gen_p.occ with [ Some ip -> poi base ip | None -> Gwdb.empty_person base (Adef.iper_of_int (-1)) ] ; (* N'est pas forcément très précis. En effet, on enregistre que *) (* les ipers. Or lors d'un nettoyage de la base, il se peut que *) (* ces ipers changent. On peut donc pointer vers une autre persone. *) value person_of_iper conf base ip = try let p = pget conf base ip in if authorized_age conf base p then Util.person_text conf base p else "" with _ -> "" ; value person_of_iper_list conf base ipl = let list = List.fold_right (fun ip accu -> let p = person_of_iper conf base ip in if p = "" then accu else [p :: accu]) ipl [] in String.concat ", " list ; value string_of_codate conf cod = match Adef.od_of_codate cod with [ Some d -> Date.string_slash_of_date conf d | None -> "" ] ; value string_of_death conf death = match death with [ Death _ cd -> Date.string_slash_of_date conf (Adef.date_of_cdate cd) | _ -> "" ] ; value string_of_burial conf burial = match burial with [ Buried cod | Cremated cod -> string_of_codate conf cod | _ -> "" ] ; value string_of_title conf titles = let string_of_t_name t = match t.t_name with [ Tname s -> s | _ -> "" ] in let one_title t = let name = t.t_ident ^ " " ^ t.t_place in let name = if name = " " then "" else name in let dates = string_of_codate conf t.t_date_start ^ "-" ^ string_of_codate conf t.t_date_end in let dates = if dates = "-" then "" else "(" ^ dates ^ ")" in let nth = if t.t_nth = 0 then "" else string_of_int t.t_nth in let nth = if string_of_t_name t = "" then nth else string_of_t_name t ^ " " ^ string_of_int t.t_nth in let nth = if nth = "" || nth = " " then "" else "[" ^ nth ^ "]" in name ^ (if name = "" then "" else " ") ^ nth ^ (if nth = "" then "" else " ") ^ dates in List.fold_left (fun accu t -> if accu = "" then one_title t else accu ^ ", " ^ one_title t) "" titles ; value string_of_related conf base ip related = let related = List.fold_right (fun ic accu -> let p = person_of_iper conf base ip in if p = "" then accu else (* Si l'enfant n'existe plus. *) let c = try pget conf base ic with _ -> Gwdb.empty_person base ic in let rel = loop (get_rparents c) where rec loop rp = match rp with [ [r :: l] -> match r.r_fath with [ Some ifath when ifath = ip -> Util.rchild_type_text conf r.r_type 2 | _ -> loop l ] | [] -> "" ] in [capitale rel ^ ": " ^ p :: accu]) related [] in String.concat ", " related ; value string_of_rparents conf base rparents = let rparents = List.fold_right (fun rp accu -> match (rp.r_fath, rp.r_moth) with [ (Some ip1, Some ip2) -> let rel = capitale (Util.relation_type_text conf rp.r_type 2) in let fath = person_of_iper conf base ip1 in let moth = person_of_iper conf base ip2 in match (fath, moth) with [ ("", "") -> accu | (p, "") -> [rel ^ ": " ^ p :: accu] | ("", p) -> [rel ^ ": " ^ p :: accu] | (p1, p2) -> [rel ^ ": " ^ p1 ^ ", " ^ p2 :: accu] ] | (Some ip, None) -> let p = person_of_iper conf base ip in if p = "" then accu else let rel = capitale (Util.relation_type_text conf rp.r_type 2) in [rel ^ ": " ^ p :: accu] | (None, Some ip) -> let p = person_of_iper conf base ip in if p = "" then accu else let rel = capitale (Util.relation_type_text conf rp.r_type 2) in [rel ^ ": " ^ p :: accu] | (None, None) -> accu ]) rparents [] in String.concat ", " rparents ; value string_of_marriage conf marriage = match marriage with [ NotMarried | NoSexesCheckNotMarried -> transl conf "with" | Married | NoSexesCheckMarried -> transl conf "married" | Engaged -> transl conf "engaged" | NoMention -> transl conf "with" ] ; value string_of_divorce conf divorce = match divorce with [ NotDivorced -> "" | Divorced cod -> transl conf "divorced" ^ " " ^ string_of_codate conf cod | Separated -> transl conf "separated" ] ; (* ************************************************************************ *) (* [Fonc] array_of_string : string -> char array *) (** [Description] : Converti une string en tableau de char afin de pouvoir faire un diff. [Args] : - s : string à convertir [Retour] : - char array [Rem] : Non exporté en clair hors de ce module. *) (* ************************************************************************ *) value array_of_string s = let len = String.length s in let a = Array.make len ' ' in loop 0 where rec loop i = if i = len then a else do { a.(i) := s.[i]; loop (i + 1) } ; (* ************************************************************************ *) (* [Fonc] highlight_diff : char array -> bool array -> string *) (** [Description] : Converti un tableau de char en string, avec les parties modifiées encadrées par des balises . [Args] : - arr : tableau à convertir - diff_arr : tableau des différences [Retour] : - string [Rem] : Non exporté en clair hors de ce module. *) (* ************************************************************************ *) value highlight_diff arr diff_arr = loop 0 "" where rec loop i s = if i >= Array.length arr then s else if diff_arr.(i) then do { let j = ref i in let accu = ref s in accu.val := accu.val ^ ""; while j.val < Array.length diff_arr && diff_arr.(j.val) do { accu.val := accu.val ^ Printf.sprintf "%c" arr.(j.val); incr j }; accu.val := accu.val ^ ""; loop j.val accu.val } else loop (i + 1) (s ^ Printf.sprintf "%c" arr.(i)) ; (* ************************************************************************ *) (* [Fonc] diff_string : string -> string -> (string * string) *) (** [Description] : Renvoie les deux string avec mise en évidence des différences entre les deux. [Args] : - before : string avant modification - after : string après modification [Retour] : - string * string [Rem] : Non exporté en clair hors de ce module. *) (* ************************************************************************ *) value diff_string before after = if before = after then (before, after) else if before = "" then (before, "" ^ after ^ "") else if after = "" then ("" ^ before ^ "", after) else let aa = array_of_string after in let bb = array_of_string before in let (bef_d, aft_d) = Diff.f bb aa in let bef_s = highlight_diff bb bef_d in let aft_s = highlight_diff aa aft_d in (bef_s, aft_s) ; type env 'a = [ Vgen_record of gen_record | Vfam of option (gen_family iper string) and option (gen_family iper string) and bool | Vchild of option (array iper) and option (array iper) | Vbool of bool | Vint of int | Vstring of string | Vother of 'a | Vnone ] ; value get_env v env = try List.assoc v env with [ Not_found -> Vnone ]; value get_vother = fun [ Vother x -> Some x | _ -> None ]; value set_vother x = Vother x; value str_val x = VVstring x; value bool_val x = VVbool x; value rec eval_var conf base env (bef, aft, p_auth) loc sl = try eval_simple_var conf base env (bef, aft, p_auth) sl with [ Not_found -> eval_compound_var conf base env (bef, aft, p_auth) sl ] and eval_simple_var conf base env (bef, aft, p_auth) = fun [ [s] -> str_val (eval_simple_str_var conf base env (bef, aft, p_auth) s) | _ -> raise Not_found ] and eval_compound_var conf base env (bef, aft, p_auth) sl = let rec loop = fun [ [s] -> eval_simple_str_var conf base env (bef, aft, p_auth) s | ["evar"; s] -> match p_getenv conf.env s with [ Some s -> s | None -> "" ] | ["before" :: sl] -> fst (eval_gen_record conf base env (bef, aft, p_auth) sl) | ["after" :: sl] -> snd (eval_gen_record conf base env (bef, aft, p_auth) sl) | _ -> raise Not_found ] in str_val (loop sl) and eval_gen_record conf base env (bef, aft, p_auth) = fun [ ["date"] -> (bef.date, aft.date) | ["wizard"] -> (bef.wizard, aft.wizard) | [s] -> eval_str_gen_record conf base env (bef, aft, p_auth) s | _ -> raise Not_found ] and eval_str_gen_record conf base env (bef, aft, p_auth) = fun [ "first_name" -> if p_auth then let b = bef.gen_p.first_name in let a = aft.gen_p.first_name in diff_string b a else ("", "") | "surname" -> if p_auth then let b = bef.gen_p.surname in let a = aft.gen_p.surname in diff_string b a else ("", "") | "occ" -> if p_auth then let b = string_of_int bef.gen_p.occ in let a = string_of_int aft.gen_p.occ in diff_string b a else ("", "") | "image" -> if p_auth && not conf.no_image then let b = bef.gen_p.image in let a = aft.gen_p.image in diff_string b a else ("", "") | "public_name" -> if p_auth then let b = bef.gen_p.public_name in let a = aft.gen_p.public_name in diff_string b a else ("", "") | "qualifiers" -> if p_auth then let b = String.concat ", " bef.gen_p.qualifiers in let a = String.concat ", " aft.gen_p.qualifiers in diff_string b a else ("", "") | "aliases" -> if p_auth then let b = String.concat ", " bef.gen_p.aliases in let a = String.concat ", " aft.gen_p.aliases in diff_string b a else ("", "") | "first_names_aliases" -> if p_auth then let b = String.concat ", " bef.gen_p.first_names_aliases in let a = String.concat ", " aft.gen_p.first_names_aliases in diff_string b a else ("", "") | "surnames_aliases" -> if p_auth then let b = String.concat ", " bef.gen_p.surnames_aliases in let a = String.concat ", " aft.gen_p.surnames_aliases in diff_string b a else ("", "") | "titles" -> if p_auth then let b = string_of_title conf bef.gen_p.titles in let a = string_of_title conf aft.gen_p.titles in diff_string b a else ("", "") | "relations" -> if p_auth then let br = string_of_related conf base bef.gen_p.key_index bef.gen_p.related in let ar = string_of_related conf base aft.gen_p.key_index aft.gen_p.related in let brp = string_of_rparents conf base bef.gen_p.rparents in let arp = string_of_rparents conf base aft.gen_p.rparents in let b = if br = "" then brp else (br ^ ". " ^ brp) in let a = if ar = "" then arp else (ar ^ ". " ^ brp) in diff_string b a else ("", "") | "occupation" -> if p_auth then let b = bef.gen_p.occupation in let a = aft.gen_p.occupation in diff_string b a else ("", "") | "sex" -> if p_auth then let b = transl_nth conf "male/female/neuter" (Util.index_of_sex bef.gen_p.sex) in let a = transl_nth conf "male/female/neuter" (Util.index_of_sex aft.gen_p.sex) in diff_string b a else ("", "") | "access" -> if p_auth then let b = match bef.gen_p.access with [ IfTitles -> transl_nth conf "iftitles/public/private" 0 | Public -> transl_nth conf "iftitles/public/private" 1 | Private -> transl_nth conf "iftitles/public/private" 2 ] in let a = match aft.gen_p.access with [ IfTitles -> transl_nth conf "iftitles/public/private" 0 | Public -> transl_nth conf "iftitles/public/private" 1 | Private -> transl_nth conf "iftitles/public/private" 2 ] in diff_string b a else ("", "") | "birth" -> if p_auth then let b = string_of_codate conf bef.gen_p.birth in let a = string_of_codate conf aft.gen_p.birth in diff_string b a else ("", "") | "birth_place" -> if p_auth then let b = bef.gen_p.birth_place in let a = aft.gen_p.birth_place in diff_string b a else ("", "") | "birth_src" -> if p_auth then let b = bef.gen_p.birth_src in let a = aft.gen_p.birth_src in diff_string b a else ("", "") | "baptism" -> if p_auth then let b = string_of_codate conf bef.gen_p.baptism in let a = string_of_codate conf aft.gen_p.baptism in diff_string b a else ("", "") | "baptism_place" -> if p_auth then let b = bef.gen_p.baptism_place in let a = aft.gen_p.baptism_place in diff_string b a else ("", "") | "baptism_src" -> if p_auth then let b = bef.gen_p.baptism_src in let a = aft.gen_p.baptism_src in diff_string b a else ("", "") | "death" -> if p_auth then let b = string_of_death conf bef.gen_p.death in let a = string_of_death conf aft.gen_p.death in diff_string b a else ("", "") | "death_place" -> if p_auth then let b = bef.gen_p.death_place in let a = aft.gen_p.death_place in diff_string b a else ("", "") | "death_src" -> if p_auth then let b = bef.gen_p.death_src in let a = aft.gen_p.death_src in diff_string b a else ("", "") | "burial" -> if p_auth then let b = string_of_burial conf bef.gen_p.burial in let a = string_of_burial conf aft.gen_p.burial in diff_string b a else ("", "") | "burial_place" -> if p_auth then let b = bef.gen_p.burial_place in let a = aft.gen_p.burial_place in diff_string b a else ("", "") | "burial_src" -> if p_auth then let b = bef.gen_p.burial_src in let a = aft.gen_p.burial_src in diff_string b a else ("", "") | "notes" -> if p_auth && not conf.no_note then let b = bef.gen_p.notes in let a = aft.gen_p.notes in diff_string b a else ("", "") | "psources" -> if p_auth then let b = bef.gen_p.psources in let a = aft.gen_p.psources in diff_string b a else ("", "") | "spouse" -> match get_env "fam" env with [ Vfam f_bef f_aft m_auth -> if m_auth then (eval_string_env "spouse_bef" env, eval_string_env "spouse_aft" env) else ("", "") | _ -> raise Not_found ] | "marriage" -> match get_env "fam" env with [ Vfam bef aft m_auth -> if m_auth then match (bef, aft) with [ (Some b, Some a) -> let b = string_of_codate conf b.marriage in let a = string_of_codate conf a.marriage in diff_string b a | (None, Some a) -> ("", string_of_codate conf a.marriage) | (Some b, None) -> (string_of_codate conf b.marriage, "") | (None, None) -> ("", "") ] else ("", "") | _ -> raise Not_found ] | "marriage_place" -> match get_env "fam" env with [ Vfam bef aft m_auth -> if m_auth then match (bef, aft) with [ (Some b, Some a) -> let b = b.marriage_place in let a = a.marriage_place in diff_string b a | (None, Some a) -> ("", a.marriage_place) | (Some b, None) -> (b.marriage_place, "") | (None, None) -> ("", "") ] else ("", "") | _ -> raise Not_found ] | "marriage_src" -> match get_env "fam" env with [ Vfam bef aft m_auth -> if m_auth then match (bef, aft) with [ (Some b, Some a) -> let b = b.marriage_src in let a = a.marriage_src in diff_string b a | (None, Some a) -> ("", a.marriage_src) | (Some b, None) -> (b.marriage_src, "") | (None, None) -> ("", "") ] else ("", "") | _ -> raise Not_found ] | "witnesses" -> match get_env "fam" env with [ Vfam bef aft m_auth -> if m_auth then match (bef, aft) with [ (Some b, Some a) -> let b = person_of_iper_list conf base (Array.to_list b.witnesses) in let a = person_of_iper_list conf base (Array.to_list a.witnesses) in diff_string b a | (None, Some a) -> ("", person_of_iper_list conf base (Array.to_list a.witnesses)) | (Some b, None) -> (person_of_iper_list conf base (Array.to_list b.witnesses), "") | (None, None) -> ("", "") ] else ("", "") | _ -> raise Not_found ] | "marriage_type" -> match get_env "fam" env with [ Vfam bef aft m_auth -> if m_auth then match (bef, aft) with [ (Some b, Some a) -> let b = string_of_marriage conf b.relation in let a = string_of_marriage conf a.relation in diff_string b a | (None, Some a) -> ("", string_of_marriage conf a.relation) | (Some b, None) -> (string_of_marriage conf b.relation, "") | (None, None) -> ("", "") ] else ("", "") | _ -> raise Not_found ] | "divorce" -> match get_env "fam" env with [ Vfam bef aft m_auth -> if m_auth then match (bef, aft) with [ (Some b, Some a) -> let b = string_of_divorce conf b.divorce in let a = string_of_divorce conf a.divorce in diff_string b a | (None, Some a) -> ("", string_of_divorce conf a.divorce) | (Some b, None) -> (string_of_divorce conf b.divorce, "") | (None, None) -> ("", "") ] else ("", "") | _ -> raise Not_found ] | "comment" -> match get_env "fam" env with [ Vfam bef aft m_auth -> if m_auth && not conf.no_note then match (bef, aft) with [ (Some b, Some a) -> let b = b.comment in let a = a.comment in diff_string b a | (None, Some a) -> ("", a.comment) | (Some b, None) -> (b.comment, "") | (None, None) -> ("", "") ] else ("", "") | _ -> raise Not_found ] | "origin_file" -> match get_env "fam" env with [ Vfam bef aft m_auth -> if m_auth then match (bef, aft) with [ (Some b, Some a) -> let b = b.origin_file in let a = a.origin_file in diff_string b a | (None, Some a) -> ("", a.origin_file) | (Some b, None) -> (b.origin_file, "") | (None, None) -> ("", "") ] else ("", "") | _ -> raise Not_found ] | "fsources" -> match get_env "fam" env with [ Vfam bef aft m_auth -> if m_auth then match (bef, aft) with [ (Some b, Some a) -> let b = b.fsources in let a = a.fsources in diff_string b a | (None, Some a) -> ("", a.fsources) | (Some b, None) -> (b.fsources, "") | (None, None) -> ("", "") ] else ("", "") | _ -> raise Not_found ] | "children" -> match get_env "fam" env with [ Vfam _ _ m_auth -> if m_auth then match get_env "child" env with [ Vchild bef aft -> match (bef, aft) with [ (Some b, Some a) -> let b = person_of_iper_list conf base (Array.to_list b) in let a = person_of_iper_list conf base (Array.to_list a) in diff_string b a | (None, Some a) -> ("", person_of_iper_list conf base (Array.to_list a)) | (Some b, None) -> (person_of_iper_list conf base (Array.to_list b), "") | (None, None) -> ("", "") ] | _ -> raise Not_found ] else ("", "") | _ -> raise Not_found ] | _ -> raise Not_found ] and eval_simple_str_var conf base env (bef, aft, p_auth) = fun [ "acces" -> let p = person_of_gen_p_key base aft.gen_p in acces conf base p | "date" -> eval_string_env "date" env | "history_len" -> eval_int_env "history_len" env | "line" -> eval_int_env "line" env | "nb_families" -> let nb_fam = max (List.length bef.gen_f) (List.length aft.gen_f) in string_of_int nb_fam | "person" -> if p_auth then let p = person_of_gen_p_key base aft.gen_p in Util.person_text conf base p else eval_string_env "history_file" env | "wizard" -> eval_string_env "wizard" env | _ -> raise Not_found ] and eval_string_env s env = match get_env s env with [ Vstring s -> s | _ -> raise Not_found ] and eval_int_env s env = match get_env s env with [ Vint i -> string_of_int i | _ -> raise Not_found ] ; value print_foreach conf base print_ast eval_expr = let rec print_foreach env xx loc s sl el al = match [s :: sl] with [ ["family"] -> print_foreach_family env xx el al | ["history_line"] -> print_foreach_history_line env xx el al | _ -> raise Not_found ] and print_foreach_family env xx el al = let (bef, aft, p_auth) = xx in let rec loop bef_f bef_c aft_f aft_c = match (bef_f, aft_f) with [ ([], []) -> () | ([], [gen_f :: l]) -> do { let fam = foi base gen_f.fam_index in let isp = Gutil.spouse aft.gen_p.key_index fam in let sp = person_of_iper conf base isp in let m_auth = authorized_age conf base (poi base isp) && p_auth in let vfam = Vfam None (Some gen_f) m_auth in let (vchild, c) = match (bef_c, aft_c) with [ ([], [gen_c :: l]) -> (Vchild None (Some gen_c), l) | _ -> (* pas normal*) (Vchild None None, []) ] in let env = [("fam", vfam); ("spouse_bef", Vstring ""); ("spouse_aft", Vstring sp); ("child", vchild) :: env] in List.iter (print_ast env xx) al; loop [] bef_c l c } | ([gen_f :: l], []) -> do { let fam = foi base gen_f.fam_index in let isp = Gutil.spouse aft.gen_p.key_index fam in let sp = person_of_iper conf base isp in let m_auth = authorized_age conf base (poi base isp) && p_auth in let vfam = Vfam (Some gen_f) None m_auth in let (vchild, c) = match (bef_c, aft_c) with [ ([gen_c :: l], []) -> (Vchild (Some gen_c) None, l) | _ -> (* pas normal*) (Vchild None None, []) ] in let env = [("fam", vfam); ("spouse_bef", Vstring sp); ("spouse_aft", Vstring ""); ("child", vchild) :: env] in List.iter (print_ast env xx) al; loop l c [] aft_c } | ([gen_f1 :: l1], [gen_f2 :: l2]) -> do { let fam = foi base gen_f2.fam_index in let isp1 = Gutil.spouse bef.gen_p.key_index fam in let isp2 = Gutil.spouse aft.gen_p.key_index fam in let sp1 = person_of_iper conf base isp1 in let sp2 = person_of_iper conf base isp2 in let m_auth = authorized_age conf base (poi base isp2) && p_auth in let vfam = Vfam (Some gen_f1) (Some gen_f2) m_auth in let (vchild, c1, c2) = match (bef_c, aft_c) with [ ([gen_c1 :: l1], [gen_c2 :: l2]) -> (Vchild (Some gen_c1) (Some gen_c2), l1, l2) | _ -> (* pas normal*) (Vchild None None, [], []) ] in let env = [("fam", vfam); ("spouse_bef", Vstring sp1); ("spouse_aft", Vstring sp2); ("child", vchild) :: env] in List.iter (print_ast env xx) al; loop l1 c1 l2 c2 } ] in loop bef.gen_f bef.gen_c aft.gen_f aft.gen_c and print_foreach_history_line env xx el al = match get_env "history_file" env with [ Vstring fname -> let history = load_person_history conf fname in loop 0 history where rec loop i list = match list with [ [] -> () | [gr :: l] -> let env = [("line", Vint i); ("date", Vstring gr.date); ("wizard", Vstring gr.wizard) :: env] in do { List.iter (print_ast env xx) al; loop (i + 1) l } ] | _ -> () ] in print_foreach ; value eval_predefined_apply conf env f vl = let vl = List.map (fun [ VVstring s -> s | _ -> raise Not_found ]) vl in match (f, vl) with [ ("transl_date", [date_txt]) -> (* date_tpl = "0000-00-00 00:00:00" *) try let year = int_of_string (String.sub date_txt 0 4) in let month = int_of_string (String.sub date_txt 5 2) in let day = int_of_string (String.sub date_txt 8 2) in let date = Dgreg {day = day; month = month; year = year; prec = Sure; delta = 0} Dgregorian in let time = String.sub date_txt 11 8 in Date.string_of_date conf date ^ ", " ^ time with [ Failure "int_of_string" -> date_txt ] | _ -> raise Not_found ] ; value print conf base = match p_getenv conf.env "t" with [ Some ("SUM" | "DIFF") -> match p_getenv conf.env "f" with [ Some file when file <> "" -> let history = load_person_history conf file in let len = List.length history in let (before, after) = match (p_getint conf.env "old", p_getint conf.env "new") with [ (Some o, Some n) -> let o = if o < 0 then 0 else if o > len - 1 then len - 1 else o in let n = if n < 0 then 0 else if n > len - 1 then len - 1 else n in (o, n) | _ -> (0, 0) ] in let before = List.nth history before in let after = List.nth history after in let p = person_of_gen_p_key base after.gen_p in let p_auth = authorized_age conf base p in let env = [("history_file", Vstring file); ("history_len", Vint len)] in Hutil.interp conf base "updhist_diff" {Templ.eval_var = eval_var conf base; Templ.eval_transl _ = Templ.eval_transl conf; Templ.eval_predefined_apply = eval_predefined_apply conf; Templ.get_vother = get_vother; Templ.set_vother = set_vother; Templ.print_foreach = print_foreach conf base} env (before, after, p_auth) | _ -> Hutil.incorrect_request conf ] | _ -> Hutil.incorrect_request conf ] ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/db2.mli0000660000175200017530000000032212664543647022357 0ustar guillaumeguillaume(* $Id: db2.mli,v 5.4 2012-01-20 19:02:51 ddr Exp $ *) (* Copyright (c) 2006-2007 INRIA *) value first_item_pos : int -> int; type key2 = 'abstract; value key2_of_key : (Adef.istr * Adef.istr * int) -> key2; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/db2.ml0000660000175200017530000000061312664543647022211 0ustar guillaumeguillaume(* $Id: db2.ml,v 5.7 2012-01-20 19:02:51 ddr Exp $ *) (* Copyright (c) 2006-2007 INRIA *) value first_item_pos len = 20 + if Sys.word_size = 64 && len >= 1 lsl (32 - 10) then 9 else 5 ; type key2 = [ Key of Adef.istr and Adef.istr and int | Key0 of Adef.istr and Adef.istr (* to save memory space *) ] ; value key2_of_key (fn, sn, oc) = if oc = 0 then Key0 fn sn else Key fn sn oc; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/progrBar.mli0000660000175200017530000000041112664543647023465 0ustar guillaumeguillaume(* $Id: progrBar.mli,v 5.3 2007-02-01 10:28:55 ddr Exp $ *) value start : unit -> unit; value run : int -> int -> unit; value finish : unit -> unit; value suspend : unit -> unit; value restart : int -> int -> unit; value empty : ref char; value full : ref char; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/searchName.ml0000660000175200017530000002653012664543647023616 0ustar guillaumeguillaume(* camlp5r ./pa_html.cmo *) (* $Id: searchName.ml,v 1.00 2014-07-08 11:26:10 flh Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Config; open Def; open Gutil; open Gwdb; open Hutil; open Mutil; open Util; (* tools *) (* value gen_person_is_std_key misc conf base p k = let k = Name.strip_lower k in if k = Name.strip_lower (p_first_name base p ^ " " ^ p_surname base p) then True else if misc && List.exists (fun n -> Name.strip n = k) (person_misc_names base p (nobtit conf base)) then True else False ; value person_is_std_key_approx = gen_person_is_std_key True; value person_is_std_key_exact = gen_person_is_std_key False; value select_std_eq conf base pl k = List.fold_right (fun p pl -> if person_is_std_key_exact conf base p k then [p :: pl] else pl) pl [] ; value select_std_approx conf base pl k = List.fold_right (fun p pl -> if person_is_std_key_approx conf base p k then [p :: pl] else pl) pl [] ; *) value empty_surname_or_firsntame base p = is_empty_string (get_surname p) || is_quest_string (get_surname p) || is_empty_string (get_first_name p) || is_quest_string (get_first_name p) || Name.lower (sou base (get_surname p)) = "" || Name.lower (sou base (get_first_name p)) = "" ; value person_is_misc_name conf base p k = let k = Name.strip_lower k in if List.exists (fun n -> Name.strip n = k) (person_misc_names base p (nobtit conf base)) then True else False ; value select_misc_name conf base pl k = List.fold_right (fun p pl -> if person_is_misc_name conf base p k then [p :: pl] else pl) pl [] ; value person_is_approx_key conf base p k = let k = Name.strip_lower k in let fn = Name.strip_lower (p_first_name base p) in let sn = Name.strip_lower (p_surname base p) in if k = fn ^ sn && fn <> "" && sn <> "" then True else False ; value select_approx_key conf base pl k = List.fold_right (fun p pl -> if person_is_approx_key conf base p k then [p :: pl] else if person_is_misc_name conf base p k then [p :: pl] else pl) pl [] ; value cut_words str = loop 0 0 where rec loop beg i = if i < String.length str then match str.[i] with [ ' ' -> if beg = i then loop (succ beg) (succ i) else [String.sub str beg (i - beg) :: loop (succ i) (succ i)] | _ -> loop beg (succ i) ] else if beg = i then [] else [String.sub str beg (i - beg)] ; value try_find_with_one_first_name conf base n = let n1 = Name.abbrev (Name.lower n) in match Mutil.lindex n1 ' ' with [ Some i -> let fn = String.sub n1 0 i in let sn = String.sub n1 (i + 1) (String.length n1 - i - 1) in let (list, _) = Some.persons_of_fsname conf base base_strings_of_surname (spi_find (persons_of_surname base)) get_surname sn in let pl = List.fold_left (fun pl (_, _, ipl) -> List.fold_left (fun pl ip -> let p = pget conf base ip in let fn1 = Name.abbrev (Name.lower (sou base (get_first_name p))) in if List.mem fn (cut_words fn1) then [p :: pl] else pl) pl ipl) [] list in pl | None -> [] ] ; value compact_list conf base xl = let pl = sort_person_list base xl in let pl = List.fold_right (fun p pl -> match pl with [ [p1 :: _] when get_key_index p = get_key_index p1 -> pl | _ -> [p :: pl] ]) pl [] in pl ; value name_with_roman_number str = loop False 0 0 where rec loop found len i = if i = String.length str then if found then Some (Buff.get len) else None else match str.[i] with [ '0'..'9' as c -> let (n, i) = loop (Char.code c - Char.code '0') (i + 1) where rec loop n i = if i = String.length str then (n, i) else match str.[i] with [ '0'..'9' as c -> loop (10 * n + Char.code c - Char.code '0') (i + 1) | _ -> (n, i) ] in loop True (Buff.mstore len (Mutil.roman_of_arabian n)) i | c -> loop found (Buff.store len c) (i + 1) ] ; (* search functions *) value search_by_sosa conf base an = let sosa_ref = Util.find_sosa_ref conf base in let sosa_nb = try Some (Num.of_string an) with [ Failure _ -> None ] in match (sosa_ref, sosa_nb) with [ (Some p, Some n) -> if n <> Num.zero then match Util.branch_of_sosa conf base (get_key_index p) n with [ Some [(ip, _) :: _] -> [pget conf base ip] | _ -> [] ] else [] | _ -> [] ] ; (* value gen_search_approx_key std_key conf base an = let ipl = person_not_a_key_find_all base an in let (an, ipl) = if ipl = [] then match name_with_roman_number an with [ Some an1 -> let ipl = person_ht_find_all base an1 in if ipl = [] then (an, []) else (an1, ipl) | None -> (an, ipl) ] else (an, ipl) in let pl = List.fold_left (fun l ip -> let p = pget conf base ip in if is_hidden p then l else [p :: l]) [] ipl in let spl = if std_key then select_std_approx conf base pl an else select_std_eq conf base pl an in let pl = if std_key then if spl = [] then if pl = [] then try_find_with_one_first_name conf base an else pl else spl else spl in let pl = if not conf.wizard && not conf.friend then List.fold_right (fun p pl -> if not (is_hide_names conf p) || Util.fast_auth_age conf p then [p :: pl] else pl) pl [] else pl in compact_list conf base pl ; *) value search_partial_key conf base an = let ipl = person_not_a_key_find_all base an in let (an, ipl) = if ipl = [] then match name_with_roman_number an with [ Some an1 -> let ipl = person_ht_find_all base an1 in if ipl = [] then (an, []) else (an1, ipl) | None -> (an, ipl) ] else (an, ipl) in let pl = List.fold_left (fun l ip -> let p = pget conf base ip in if is_hidden p then l else [p :: l]) [] ipl in let pl = if pl = [] then try_find_with_one_first_name conf base an else pl in let pl = if not conf.wizard && not conf.friend then List.fold_right (fun p pl -> if not (is_hide_names conf p) || Util.fast_auth_age conf p then [p :: pl] else pl) pl [] else pl in compact_list conf base pl ; value search_approx_key conf base an = let ipl = person_not_a_key_find_all base an in let (an, ipl) = if ipl = [] then match name_with_roman_number an with [ Some an1 -> let ipl = person_ht_find_all base an1 in if ipl = [] then (an, []) else (an1, ipl) | None -> (an, ipl) ] else (an, ipl) in let pl = List.fold_left (fun l ip -> let p = pget conf base ip in if is_hidden p then l else [p :: l]) [] ipl in let pl = select_approx_key conf base pl an in let pl = if not conf.wizard && not conf.friend then List.fold_right (fun p pl -> if not (is_hide_names conf p) || Util.fast_auth_age conf p then [p :: pl] else pl) pl [] else pl in let pl = List.fold_right (fun p pl -> if empty_surname_or_firsntame base p then pl else [p :: pl]) pl [] in compact_list conf base pl ; (* recherche par clé, i.e. prenom.occ nom *) value search_by_key conf base an = match person_of_string_key base an with [ Some ip -> let pl = let p = pget conf base ip in if is_hidden p then [] else [p] in if not conf.wizard && not conf.friend then List.fold_right (fun p pl -> if not (is_hide_names conf p) || Util.fast_auth_age conf p then [p :: pl] else pl) pl [] else pl | None -> [] ] ; value search_approx_surname conf base an = [] ; value search_approx_first_name conf base an = [] ; (* main *) type search_type = [ Sosa | Key | Surname | FirstName | ApproxKey | ApproxSurname | ApproxFirstName | PartialKey | DefaultSurname ] ; value search conf base an search_order specify unknown = loop search_order where rec loop l = match l with [ [] -> unknown conf an | [Sosa :: l] -> let pl = search_by_sosa conf base an in match pl with [ [p] -> Perso.print conf base p | _ -> loop l ] | [Key :: l] -> let pl = search_by_key conf base an in match pl with [ [] -> loop l | [p] -> Perso.print conf base p | pl -> specify conf base an pl ] | [Surname :: l] -> let pl = Some.search_surname conf base an in match pl with [ [] -> loop l | pl -> do { conf.cancel_links := False; Some.search_surname_print conf base unknown an }] | [FirstName :: l] -> let pl = Some.search_first_name conf base an in match pl with [ [] -> loop l | pl -> do { conf.cancel_links := False; Some.search_first_name_print conf base an }] | [ApproxKey :: l] -> let pl = search_approx_key conf base an in match pl with [ [] -> loop l | [p] -> Perso.print conf base p | pl -> specify conf base an pl ] | [ApproxSurname :: l] -> let pl = search_approx_surname conf base an in match pl with [ [] -> loop l | pl -> specify conf base an pl ] | [ApproxFirstName :: l] -> let pl = search_approx_first_name conf base an in match pl with [ [] -> loop l | pl -> specify conf base an pl ] | [PartialKey :: l] -> let pl = search_partial_key conf base an in match pl with [ [] -> loop l | [p] -> Perso.print conf base p | pl -> specify conf base an pl ] | [DefaultSurname :: l] -> do { conf.cancel_links := False; Some.search_surname_print conf base unknown an }] ; (* ************************************************************************ *) (* [Fonc] print : conf -> string -> unit *) (** [Description] : Recherche qui n'utilise que 2 inputs. On essai donc de trouver la meilleure combinaison de résultat pour afficher la réponse la plus probable. [Args] : - conf : configuration de la base - base : base [Retour] : Néant [Rem] : Exporté en clair hors de ce module. *) (* ************************************************************************ *) value print conf base specify unknown = let real_input label = match p_getenv conf.env label with [ Some s -> if s = "" then None else Some s | None -> None ] in match (real_input "p", real_input "n") with [ (Some fn, Some sn) -> let order = [ Key; ApproxKey; PartialKey ] in search conf base (fn ^ " " ^ sn) order specify unknown | (Some fn, None) -> let order = [ FirstName ] in search conf base fn order specify unknown | (None, Some sn) -> let order = [ Sosa; Key; Surname; ApproxKey; PartialKey; DefaultSurname ] in search conf base sn order specify unknown | (None, None) -> incorrect_request conf ] ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/mk_missing_i18n.sh0000660000175200017530000001017612664543647024550 0ustar guillaumeguillaume#!/bin/sh #cd (* exec ocaml -I +camlp5 camlp5r.cma $0 *) "."; (* $Id: mk_missing_i18n.sh,v 5.4 2007-07-28 10:13:42 ddr Exp $ *) open Printf; value languages = ["af"; "bg"; "br"; "ca"; "cs"; "da"; "de"; "en"; "eo"; "es"; "et"; "fi"; "fr"; "he"; "is"; "it"; "lv"; "nl"; "no"; "pl"; "pt"; "pt-br"; "ro"; "ru"; "sl"; "sv"; "zh"] ; value linenum = ref 0; value input_line_cnt ic = do { incr linenum; input_line ic }; value rec skip_to_same_line ic line_ref = let line = input_line_cnt ic in if line = line_ref then () else skip_to_same_line ic line_ref ; value rec get_all_versions first ic = let line = try input_line_cnt ic with [ End_of_file -> "" ] in if line = "" then [] else if first && String.length line < 3 then do { eprintf "small line %d: \"%s\"\n" linenum.val (String.escaped line); flush stderr; [] } else try let i = String.index line ':' in let lang = String.sub line 0 i in do { if first && String.length line > i + 1 && line.[i + 1] <> ' ' then do { eprintf "space missing after colon in line %d:\n%s\n" linenum.val line; flush stderr } else (); let transl = String.sub line (i + 1) (String.length line - i - 1) in [(lang, transl) :: get_all_versions first ic] } with [ Not_found -> [] ] ; value compare_assoc (l1, _) (l2, _) = l1 <= l2; value check first lang = let derived_lang = try String.sub lang 0 (String.index lang '-') with [ Not_found -> "" ] in do { linenum.val := 0; let ic_lex = open_in "hd/lang/lex_utf8.txt" in let ic_i18n = open_in "src/i18n" in printf "

      %s

      \n" lang lang; printf "
      \n";
          let has_missing = ref False in
          try
            while True do {
              let line = input_line ic_i18n in
              if line <> " !dir" then
                do {
                  skip_to_same_line ic_lex ("    " ^ line);
                  let list = get_all_versions first ic_lex in
                  if first && Sort.list compare_assoc list <> list then do {
                    eprintf "Misordered for:\n   \"%s\"\n" line; flush stderr
                  }
                  else ();
                  if not (List.mem_assoc lang list || List.mem_assoc derived_lang list)
                  then do {
                    let list =
                      Sort.list compare_assoc
                        [(lang, ""); ("en", List.assoc "en" list);
                         ("fr", List.assoc "fr" list)]
                    in
                    printf "    %s\n" line;
                    List.iter
                      (fun (lang, transl) ->
                         printf "%s:%s\n" lang
                           (if transl = "" then " ..." else transl))
                      list;
                    printf "\n";
                    has_missing.val := True
                  }
                  else if
                    List.length (List.find_all (fun (l, _) -> l = lang) list) >= 2
                  then do {
                    eprintf "Several translations in %s for:\n   \"%s\"\n" lang line;
                    flush stderr
                  }
                  else ()
                } 
              else ()
            }
          with
          [ End_of_file -> () ];
          if not has_missing.val then printf "     - no missing phrases -\n"
          else ();
          printf "
      \n"; close_in ic_lex; close_in ic_i18n; False } ; value header lang = printf "
      %s\n" lang lang; do { printf "\ Missing phrases

      Missing phrases

      Address of this page: http://www.geneweb.org/missing.utf8.html

      Here are the list of all languages with the missing phrases in the lexicon of the current version of GeneWeb. The missing entries are displayed together with their English and French translations.

      If you want to collaborate, you can send me the translations in the given language if you know it. Thanks.

      "; List.iter header languages; printf "\n"; let _ = List.fold_left check True languages in (); printf "\n"; flush stdout }; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/secure.ml0000660000175200017530000000516612664543647023040 0ustar guillaumeguillaume(* $Id: secure.ml,v 5.2 2007-01-19 01:53:17 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) (* secure open; forbids to access anywhere in the machine; this is an extra security: the program should check for correct open instead of hoping Secure do it for it *) value ok_path = ref []; value lang_path_r = ref []; value doc_path_r = ref []; value base_dir_r = ref Filename.current_dir_name; value decompose = loop [] where rec loop r s = let b = Filename.basename s in if b = "" || b = Filename.current_dir_name then let d = Filename.dirname s in if d = "" || d = Filename.current_dir_name then r else if d = s then [d :: r] else loop r d else if b = s then [b :: r] else loop [b :: r] (Filename.dirname s) ; value add_path path s = do { path.val := [s :: path.val]; ok_path.val := [decompose s :: ok_path.val] } ; value add_lang_path = add_path lang_path_r; value add_doc_path = add_path doc_path_r; value set_base_dir s = do { base_dir_r.val := s; ok_path.val := [decompose s :: ok_path.val] } ; value lang_path () = lang_path_r.val; value doc_path () = doc_path_r.val; value base_dir () = base_dir_r.val; value suffix d df = loop (d, df) where rec loop = fun [ ([x :: xl], [y :: yl]) -> if x = y then loop (xl, yl) else None | ([], df) -> Some df | (d, []) -> None ] ; value check_open fname = try do { if String.contains fname '\000' then raise Exit else (); let df = decompose fname in loop ok_path.val where rec loop = fun [ [d :: dl] -> match suffix d df with [ Some bf -> if List.mem Filename.parent_dir_name bf then raise Exit else () | None -> loop dl ] | [] -> if Filename.is_relative fname then if List.mem Filename.parent_dir_name df then raise Exit else () else raise Exit ] } with [ Exit -> do { IFDEF UNIX THEN do { Printf.eprintf "*** secure rejects open %s\n" (String.escaped fname); flush stderr; } ELSE () END; raise (Sys_error "invalid access") } ] ; value open_in fname = do { check_open fname; Pervasives.open_in fname } ; value open_in_bin fname = do { check_open fname; Pervasives.open_in_bin fname } ; value open_out fname = do { check_open fname; Pervasives.open_out fname } ; value open_out_bin fname = do { check_open fname; Pervasives.open_out_bin fname } ; value open_out_gen mode perm fname = do { check_open fname; Pervasives.open_out_gen mode perm fname } ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/wiznotes.mli0000660000175200017530000000074212664543647023600 0ustar guillaumeguillaume(* $Id: wiznotes.mli,v 5.3 2007-01-19 01:53:17 ddr Exp $ *) (* Copyright (c) 2006-2007 INRIA *) open Config; open Gwdb; value dir : config -> base -> string; value print : config -> base -> unit; value print_mod : config -> base -> unit; value print_mod_ok : config -> base -> unit; value print_view : config -> base -> unit; value print_search : config -> base -> unit; value connected_wizards : config -> base -> unit; value change_wizard_visibility : config -> base -> unit; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/merge.ml0000660000175200017530000001212212664543647022637 0ustar guillaumeguillaume(* camlp5r ./pa_html.cmo *) (* $Id: merge.ml,v 5.13 2007-09-12 09:58:44 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Config; open Def; open Gutil; open Gwdb; open Hutil; open Util; value print_someone conf base p = Wserver.wprint "%s%s %s" (p_first_name base p) (if get_occ p = 0 then "" else "." ^ string_of_int (get_occ p)) (p_surname base p) ; value print conf base p = let title h = do { Wserver.wprint "%s" (capitale (transl_decline conf "merge" "")); if h then () else do { Wserver.wprint ": "; print_someone conf base p; }; } in let list = Gutil.find_same_name base p in let list = List.fold_right (fun p1 pl -> if get_key_index p1 = get_key_index p then pl else [p1 :: pl]) list [] in do { Perso.interp_notempl_with_menu title "perso_header" conf base p; tag "h2" begin title False; end; Wserver.wprint "\n"; tag "form" "method=\"get\" action=\"%s\"" conf.command begin tag "p" begin Util.hidden_env conf; xtag "input" "type=\"hidden\" name=\"m\" value=\"MRG_IND\""; xtag "input" "type=\"hidden\" name=\"i\" value=\"%d\"" (Adef.int_of_iper (get_key_index p)); Wserver.wprint "%s " (capitale (transl_decline conf "with" "")); if list <> [] then do { Wserver.wprint ":"; xtag "br"; xtag "input" "\ type=\"radio\" name=\"select\" value=\"input\" checked=\"checked\""; } else (); Wserver.wprint "(%s . %s %s):\n" (transl_nth conf "first name/first names" 0) (transl conf "number") (transl_nth conf "surname/surnames" 0); xtag "input" "name=\"n\" size=\"30\" maxlength=\"200\""; xtag "br"; end; if list <> [] then Wserver.wprint "\n" else (); List.iter (fun p -> tag "tr" "align=\"%s\"" conf.left begin tag "td" "valign=\"top\"" begin xtag "input" "type=\"radio\" name=\"select\" value=\"%d\"" (Adef.int_of_iper (get_key_index p)); end; tag "td" begin stag "a" "href=\"%s%s\"" (commd conf) (acces conf base p) begin Wserver.wprint "%s.%d %s" (sou base (get_first_name p)) (get_occ p) (sou base (get_surname p)); end; Wserver.wprint "%s" (Date.short_dates_text conf base p); match main_title conf base p with [ Some t -> Wserver.wprint "%s" (one_title_text conf base p t) | None -> () ]; match get_parents p with [ Some ifam -> let cpl = foi base ifam in Wserver.wprint ",\n%s" (Util.translate_eval (transl_a_of_b conf (transl_nth conf "son/daughter/child" (index_of_sex (get_sex p))) (person_title_text conf base (poi base (get_father cpl)) ^ " " ^ transl_nth conf "and" 0 ^ " " ^ person_title_text conf base (poi base (get_mother cpl))))) | None -> () ]; xtag "br"; end; end) list; if list <> [] then Wserver.wprint "
      \n" else (); tag "p" begin xtag "input" "type=\"submit\" value=\"Ok\""; end; end; trailer conf; } ; value print_possible_continue_merging conf base = match (p_getint conf.env "ini1", p_getint conf.env "ini2") with [ (Some ini1, Some ini2) -> do { let p1 = poi base (Adef.iper_of_int ini1) in let p2 = poi base (Adef.iper_of_int ini2) in Wserver.wprint "\n"; html_p conf; stag "a" "href=%sm=MRG_IND;i=%d;i2=%d" (commd conf) ini1 ini2 begin Wserver.wprint "%s" (capitale (transl conf "continue merging")); end; Wserver.wprint "\n"; print_someone conf base p1; Wserver.wprint "\n%s\n" (transl_nth conf "and" 0); print_someone conf base p2; Wserver.wprint "\n"; } | _ -> match p_getint conf.env "ip" with [ Some ip -> let s1 = match p_getenv conf.env "iexcl" with [ Some "" | None -> "" | Some s -> ";iexcl=" ^ s ] in let s2 = match p_getenv conf.env "fexcl" with [ Some "" | None -> "" | Some s -> ";fexcl=" ^ s ] in if s1 <> "" || s2 <> "" then tag "p" begin stag "a" "href=%sm=MRG_DUP;ip=%d%s%s" (commd conf) ip s1 s2 begin Wserver.wprint "%s" (capitale (transl conf "continue merging")); end; Wserver.wprint "\n(%s)\n" (transl_a_of_b conf (transl conf "possible duplications") (referenced_person_text conf base (poi base (Adef.iper_of_int ip)))); end else () | None -> () ] ] ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/image.mli0000660000175200017530000000170212664543647022775 0ustar guillaumeguillaume(** [Description] : Affiche une image (avec ses en-têtes) en réponse HTTP en utilisant Wserver. Le type MIME de l'image est deviné à partir de l'extension contenu dans le nom du fichier. [Args] : - cgi : True en mode CGI, False en serveur autonome - fname : le nom du fichier image [Retour] : True si l'image a pu être affichée *) value print_image_file : bool -> string -> bool; (** [Description] : Traite une requête image. [Args] : - config : configuration de la requête - base : base de donnée sélectionnée *) value print : Config.config -> Gwdb.base -> unit; (** [Description] : Affiche une image seule dans une page HTML. [Args] : - conf : configuration de la requête - base : argument non utilisé *) value print_html : Config.config -> 'a -> unit; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/changeChildren.ml0000660000175200017530000002546412664543647024453 0ustar guillaumeguillaume(* camlp5r ./pa_html.cmo *) (* $Id: changeChildren.ml,v 5.22 2007-09-12 09:58:44 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Config; open Def; open Gutil; open Gwdb; open Hutil; open Util; value print_child_person conf base p = let var = "c" ^ string_of_int (Adef.int_of_iper (get_key_index p)) in let first_name = match p_getenv conf.env (var ^ "_first_name") with [ Some v -> v | None -> p_first_name base p ] in let surname = match p_getenv conf.env (var ^ "_surname") with [ Some v -> v | None -> p_surname base p ] in let occ = match p_getint conf.env (var ^ "_occ") with [ Some i -> i | None -> get_occ p ] in tag "table" "border=\"1\"" begin tag "tr" "align=\"%s\"" conf.left begin tag "td" begin Wserver.wprint "%s" (capitale (transl_nth conf "first name/first names" 0)); end; tag "td" "colspan=\"3\"" begin xtag "input" "name=\"%s_first_name\" size=\"23\" maxlength=\"200\" value=\"%s\"" var (quote_escaped first_name); end; tag "td" "align=\"%s\"" conf.right begin let s = capitale (transl conf "number") in Wserver.wprint "%s" s; end; tag "td" begin xtag "input" "name=\"%s_occ\" size=\"5\" maxlength=\"8\"%s" var (if occ = 0 then "" else " value=\"" ^ string_of_int occ ^ "\""); end; end; tag "tr" "align=\"%s\"" conf.left begin tag "td" begin Wserver.wprint "%s" (capitale (transl_nth conf "surname/surnames" 0)); end; tag "td" "colspan=\"5\"" begin xtag "input" "name=\"%s_surname\" size=\"40\" maxlength=\"200\" value=\"%s\"" var surname; end; end; end ; value select_children_of base u = List.fold_right (fun ifam ipl -> let des = foi base ifam in List.fold_right (fun ip ipl -> [ip :: ipl]) (Array.to_list (get_children des)) ipl) (Array.to_list (get_family u)) [] ; value digest_children base ipl = let l = List.map (fun ip -> let p = poi base ip in (sou base (get_first_name p), sou base (get_surname p), get_occ p)) ipl in Iovalue.digest l ; value check_digest conf base digest = match p_getenv conf.env "digest" with [ Some ini_digest -> if digest <> ini_digest then Update.error_digest conf else () | None -> () ] ; value print_children conf base ipl = do { stagn "h4" begin Wserver.wprint "%s" (capitale (transl_nth conf "child/children" 1)); end; tag "ul" begin List.iter (fun ip -> let p = poi base ip in tag "li" begin Wserver.wprint "%s" (reference conf base p (person_text conf base p)); Wserver.wprint "%s\n" (Date.short_dates_text conf base p); print_child_person conf base p; end) ipl; end; } ; value print_change conf base p = let title _ = let s = transl conf "change children's names" in Wserver.wprint "%s" (capitale s) in let children = select_children_of base p in let digest = digest_children base children in do { Perso.interp_notempl_with_menu title "perso_header" conf base p; tag "h2" begin title False; end; tag "p" begin Wserver.wprint "%s" (reference conf base p (person_text conf base p)); Wserver.wprint "%s\n" (Date.short_dates_text conf base p); end; tag "form" "method=\"post\" action=\"%s\"" conf.command begin tag "p" begin Util.hidden_env conf; xtag "input" "type=\"hidden\" name=\"ip\" value=\"%d\"" (Adef.int_of_iper (get_key_index p)); xtag "input" "type=\"hidden\" name=\"digest\" value=\"%s\"" digest; xtag "input" "type=\"hidden\" name=\"m\" value=\"CHG_CHN_OK\""; end; print_children conf base children; Wserver.wprint "\n"; tag "p" begin xtag "input" "type=\"submit\" value=\"Ok\""; end; end; Wserver.wprint "\n"; trailer conf; } ; value print conf base = match p_getint conf.env "ip" with [ Some i -> let p = poi base (Adef.iper_of_int i) in print_change conf base p | _ -> incorrect_request conf ] ; value print_children_list conf base u = do { stag "h4" begin Wserver.wprint "%s" (capitale (transl_nth conf "child/children" 1)); end; Wserver.wprint "\n

      \n"; tag "ul" begin Array.iter (fun ifam -> let des = foi base ifam in Array.iter (fun ip -> let p = poi base ip in do { html_li conf; Wserver.wprint "\n%s" (reference conf base p (person_text conf base p)); Wserver.wprint "%s\n" (Date.short_dates_text conf base p); }) (get_children des)) (get_family u); end; } ; value print_change_done conf base p = let title _ = let s = transl conf "children's names changed" in Wserver.wprint "%s" (capitale s) in do { header conf title; Wserver.wprint "\n%s" (reference conf base p (person_text conf base p)); Wserver.wprint "%s\n" (Date.short_dates_text conf base p); print_children_list conf base p; trailer conf; } ; value print_conflict conf base ip_var p = let title _ = Wserver.wprint "%s" (capitale (transl conf "error")) in do { rheader conf title; Update.print_error conf base (AlreadyDefined p); let free_n = Gutil.find_free_occ base (p_first_name base p) (p_surname base p) 0 in tag "ul" begin stag "li" begin Wserver.wprint "%s: %d.\n" (capitale (transl conf "first free number")) free_n; Wserver.wprint (fcapitale (ftransl conf "click on \"%s\"")) (transl conf "create"); Wserver.wprint "%s.\n" (transl conf " to try again with this number"); end; stag "li" begin Wserver.wprint "%s " (capitale (transl conf "or")); Wserver.wprint (ftransl conf "click on \"%s\"") (transl conf "back"); Wserver.wprint " %s %s." (transl_nth conf "and" 0) (transl conf "change it (the number) yourself"); end; end; tag "form" "method=\"post\" action=\"%s\"" conf.command begin List.iter (fun (x, v) -> xtag "input" "type=\"hidden\" name=\"%s\" value=\"%s\"" x (quote_escaped (decode_varenv v))) (conf.henv @ conf.env); let var = "c" ^ string_of_int (Adef.int_of_iper ip_var) in xtag "input" "type=\"hidden\" name=\"field\" value=\"%s\"" var; xtag "input" "type=\"hidden\" name=\"free_occ\" value=\"%d\"" free_n; xtag "input" "type=\"submit\" name=\"create\" value=\"%s\"" (capitale (transl conf "create")); xtag "input" "type=\"submit\" name=\"return\" value=\"%s\"" (capitale (transl conf "back")); end; Update.print_same_name conf base p; trailer conf; } ; value check_conflict conf base p key new_occ ipl = let name = Name.lower key in List.iter (fun ip -> let p1 = poi base ip in if get_key_index p1 <> get_key_index p && Name.lower (p_first_name base p1 ^ " " ^ p_surname base p1) = name && get_occ p1 = new_occ then do { print_conflict conf base (get_key_index p) p1; raise Update.ModErr } else ()) ipl ; value error_person conf base p err = let title _ = Wserver.wprint "%s" (capitale (transl conf "error")) in do { rheader conf title; Wserver.wprint "%s\n" (capitale err); trailer conf; raise Update.ModErr } ; value rename_image_file conf base p (nfn, nsn, noc) = match auto_image_file conf base p with [ Some old_f -> let s = default_image_name_of_key nfn nsn noc in let f = Filename.concat (base_path ["images"] conf.bname) s in let new_f = if Filename.check_suffix old_f ".gif" then f ^ ".gif" else f ^ ".jpg" in try Sys.rename old_f new_f with [ Sys_error _ -> () ] | _ -> () ] ; value change_child conf base parent_surname changed ip = let p = poi base ip in let var = "c" ^ string_of_int (Adef.int_of_iper (get_key_index p)) in let new_first_name = match p_getenv conf.env (var ^ "_first_name") with [ Some x -> only_printable x | _ -> p_first_name base p ] in let new_surname = match p_getenv conf.env (var ^ "_surname") with [ Some x -> let x = only_printable x in if x = "" then parent_surname else x | _ -> p_surname base p ] in let new_occ = match p_getint conf.env (var ^ "_occ") with [ Some x -> x | _ -> 0 ] in if new_first_name = "" then error_person conf base p (transl conf "first name missing") else if new_first_name <> p_first_name base p || new_surname <> p_surname base p || new_occ <> get_occ p then do { let key = new_first_name ^ " " ^ new_surname in let ipl = person_ht_find_all base key in check_conflict conf base p key new_occ ipl; rename_image_file conf base p (new_first_name, new_surname, new_occ); (* On ajoute les enfants dans le type Change_children_name *) (* pour la future mise à jour de l'historique et du fichier gwf. *) changed.val := [((p_first_name base p, p_surname base p, get_occ p, ip), (new_first_name, new_surname, new_occ, ip)) :: changed.val]; let p = {(gen_person_of_person p) with first_name = Gwdb.insert_string base new_first_name; surname = Gwdb.insert_string base new_surname; occ = new_occ} in patch_person base ip p; patch_key base ip new_first_name new_surname new_occ; person_ht_add base key ip; let np_misc_names = gen_person_misc_names base p (fun p -> p.titles) in List.iter (fun key -> person_ht_add base key p.key_index) np_misc_names; } else () ; value print_update_child conf base p digest = match p_getenv conf.env "m" with [ Some "CHG_CHN_OK" -> print conf base | _ -> incorrect_request conf ] ; value print_change_ok conf base p = try let ipl = select_children_of base p in let parent_surname = p_surname base p in let changed = ref [] in let redisp = match p_getenv conf.env "return" with [ Some _ -> True | _ -> False ] in if redisp then print_update_child conf base p "" else do { check_digest conf base (digest_children base ipl); List.iter (change_child conf base parent_surname changed) ipl; Util.commit_patches conf base; let changed = U_Change_children_name (Util.string_gen_person base (gen_person_of_person p)) changed.val in History.record conf base changed "cn"; print_change_done conf base p; } with [ Update.ModErr -> () ] ; value print_ok o_conf base = let conf = Update.update_conf o_conf in match p_getint conf.env "ip" with [ Some i -> let p = poi base (Adef.iper_of_int i) in print_change_ok conf base p | _ -> incorrect_request conf ] ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/adef.ml0000660000175200017530000000710712664543647022446 0ustar guillaumeguillaume(* $Id: adef.ml,v 5.6 2007-02-21 18:14:01 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) type iper = int; type ifam = int; type istr = int; type fix = int; value float_of_fix x = float x /. 1000000.0; value fix_of_float x = truncate (x *. 1000000.0 +. 0.5); external fix : int -> fix = "%identity"; external fix_repr : fix -> int = "%identity"; value no_consang = fix (-1); external int_of_iper : iper -> int = "%identity"; external iper_of_int : int -> iper = "%identity"; external int_of_ifam : ifam -> int = "%identity"; external ifam_of_int : int -> ifam = "%identity"; external int_of_istr : istr -> int = "%identity"; external istr_of_int : int -> istr = "%identity"; type date = [ Dgreg of dmy and calendar | Dtext of string ] and calendar = [ Dgregorian | Djulian | Dfrench | Dhebrew ] and dmy = { day : int; month : int; year : int; prec : precision; delta : int } and precision = [ Sure | About | Maybe | Before | After | OrYear of int | YearInt of int ] ; type cdate = [ Cgregorian of int | Cjulian of int | Cfrench of int | Chebrew of int | Ctext of string | Cdate of date | Cnone ] ; type codate = cdate; value compress d = let simple = match d.prec with [ Sure | About | Maybe | Before | After -> d.day >= 0 && d.month >= 0 && d.year > 0 && d.year < 2500 && d.delta = 0 | OrYear _ | YearInt _ -> False ] in if simple then let p = match d.prec with [ About -> 1 | Maybe -> 2 | Before -> 3 | After -> 4 | Sure | OrYear _ | YearInt _ -> 0 ] in Some (((p * 32 + d.day) * 13 + d.month) * 2500 + d.year) else None ; value cdate_of_date d = match d with [ Dgreg g cal -> match compress g with [ Some i -> match cal with [ Dgregorian -> Cgregorian i | Djulian -> Cjulian i | Dfrench -> Cfrench i | Dhebrew -> Chebrew i ] | None -> Cdate d ] | Dtext t -> Ctext t ] ; value uncompress x = let (year, x) = (x mod 2500, x / 2500) in let (month, x) = (x mod 13, x / 13) in let (day, x) = (x mod 32, x / 32) in let prec = match x with [ 1 -> About | 2 -> Maybe | 3 -> Before | 4 -> After | _ -> Sure ] in {day = day; month = month; year = year; prec = prec; delta = 0} ; value date_of_cdate = fun [ Cgregorian i -> Dgreg (uncompress i) Dgregorian | Cjulian i -> Dgreg (uncompress i) Djulian | Cfrench i -> Dgreg (uncompress i) Dfrench | Chebrew i -> Dgreg (uncompress i) Dhebrew | Cdate d -> d | Ctext t -> Dtext t | Cnone -> failwith "date_of_cdate" ] ; value codate_of_od = fun [ Some d -> cdate_of_date d | None -> Cnone ] ; value od_of_codate od = match od with [ Cnone -> None | _ -> Some (date_of_cdate od) ] ; value codate_None = codate_of_od None; exception Request_failure of string; type gen_couple 'person = { father : 'person; mother : 'person } and gen_parents 'person = { parent : array 'person } ; value father cpl = if Obj.size (Obj.repr cpl) = 2 then cpl.father else (Obj.magic cpl).parent.(0) ; value mother cpl = if Obj.size (Obj.repr cpl) = 2 then cpl.mother else (Obj.magic cpl).parent.(1) ; value couple father mother = {father = father; mother = mother}; value parent parent = {father = parent.(0); mother = parent.(1)}; value parent_array cpl = if Obj.size (Obj.repr cpl) = 2 then [| cpl.father; cpl.mother |] else (Obj.magic cpl).parent ; value multi_couple father mother : gen_couple 'person = Obj.magic {parent = [| father; mother |]} ; value multi_parent parent : gen_couple 'person = Obj.magic {parent = parent} ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/check_base.ml0000660000175200017530000000411312664543647023610 0ustar guillaumeguillaume(* $Id: check_base.ml,v 5.5 2007-03-19 10:59:31 ddr Exp $ *) open Printf; value print_error base x = do { printf "\nError: "; Check.print_base_error stdout base x; }; value print_warning base = fun [ Def.UndefinedSex _ -> () (* | Def. IncoherentAncestorDate anc p -> fprintf stdout "# %s.%d %s & %s.%d %s\n" (Name.lower (Gwdb.p_first_name base p)) (Name.lower (Gwdb.p_surname base p)) (Gwdb.get_occ p) (Name.lower (Gwdb.p_first_name base anc)) (Name.lower (Gwdb.p_surname base anc)) (Gwdb.get_occ anc) (Name.lower (Gwdb.p_first_name base p)) (Gwdb.get_occ p) (Name.lower (Gwdb.p_surname base p)) (Name.lower (Gwdb.p_first_name base anc)) (Gwdb.get_occ anc) (Name.lower (Gwdb.p_surname base anc)) *) | x -> do { printf "\nWarning: "; Check.print_base_warning stdout base x; } ] ; value set_list l v = l.val := [v :: l.val]; value check_base bname = do { Secure.set_base_dir (Filename.dirname bname); let base = Gwdb.open_base bname in let changed_p (ip, p, o_sex, o_rpar) = do { let fn = Gwdb.p_first_name base p in let sn = Gwdb.p_surname base p in printf "%s.%d %s not changed" fn (Gwdb.get_occ p) sn; } in let errors = ref [] in let warnings = ref [] in Check.check_base base (set_list errors) (set_list warnings) (fun _ -> True) changed_p False; List.iter (print_error base) (List.rev errors.val); (* On rend la liste unique, parce qu'il se peut qu'un warning soit *) (* levé par plusieurs fonctions différents selon le context. *) let wl = let ht = Hashtbl.create 1 in loop warnings.val [] where rec loop wl accu = match wl with [ [] -> accu | [x :: wl] -> if Hashtbl.mem ht (Hashtbl.hash x) then loop wl accu else do { Hashtbl.add ht (Hashtbl.hash x) True; loop wl [x :: accu] } ] in List.iter (print_warning base) wl; flush stdout; }; value main () = check_base Sys.argv.(1); main (); geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/pqueue.ml0000660000175200017530000000317412664543647023053 0ustar guillaumeguillaume(* $Id: pqueue.ml,v 5.2 2007-01-19 01:53:16 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) module type OrderedType = sig type t = 'a; value leq : t -> t -> bool; end; module type S = sig type elt = 'a; type t = 'a; value empty : t; value is_empty : t -> bool; value add : elt -> t -> t; value take : t -> (elt * t); value union : t -> t -> t; end ; module Make (Ord : OrderedType) = struct type elt = Ord.t; type t = list tree and tree = { node : elt; rank : int; list : t }; value link t1 t2 = if Ord.leq t1.node t2.node then {node = t1.node; rank = t1.rank + 1; list = [t2 :: t1.list]} else {node = t2.node; rank = t2.rank + 1; list = [t1 :: t2.list]} ; value rec ins t = fun [ [] -> [t] | [t' :: ts] -> if t.rank < t'.rank then [t; t' :: ts] else ins (link t t') ts ] ; value rec union fts1 fts2 = match (fts1, fts2) with [ ([], ts) -> ts | (ts, []) -> ts | ([t1 :: ts1], [t2 :: ts2]) -> if t1.rank < t2.rank then [t1 :: union ts1 fts2] else if t2.rank < t1.rank then [t2 :: union fts1 ts2] else ins (link t1 t2) (union ts1 ts2) ] ; value empty : t = []; value is_empty (q : t) = q = []; value add x q = ins {node = x; rank = 0; list = []} q; value rec getMin = fun [ [] -> raise Not_found | [t] -> (t, []) | [t :: ts] -> let (t', ts') = getMin ts in if Ord.leq t.node t'.node then (t, ts) else (t', [t :: ts']) ] ; value take ts = let (t, ts) = getMin ts in (t.node, union (List.rev t.list) ts) ; end ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/i18n_check.ml0000660000175200017530000000153412664543647023461 0ustar guillaumeguillaume(* $Id: i18n_check.ml,v 5.2 2007-01-19 01:53:16 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) value usage () = do { Printf.eprintf "Usage: i18n_check lang lexicon\n"; flush stderr; exit 2; } ; value main () = if Array.length Sys.argv <> 3 then usage () else let lang = Sys.argv.(1) in let file = Sys.argv.(2) in let ic = open_in_bin file in try while True do { let line_ref = input_line ic in let rec loop line = if line = "" then () else do { if String.sub line 0 3 = lang ^ ":" then Printf.printf "%s\n" (String.sub line_ref 4 (String.length line_ref - 4)) else (); loop (input_line ic) } in loop (input_line ic) } with [ End_of_file -> () ] ; Printexc.catch main (); geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/updateIndOk.mli0000660000175200017530000000123312664543647024121 0ustar guillaumeguillaume(* $Id: updateIndOk.mli,v 5.6 2008-01-21 13:28:12 ddr Exp $ *) open Config; open Def; open Gwdb; value effective_del : config -> base -> (CheckItem.base_warning -> unit) -> person -> gen_person iper istr; value effective_mod : config -> base -> gen_person Update.key string -> gen_person iper istr; value all_checks_person : config -> base -> gen_person iper istr -> gen_ascend ifam -> gen_union ifam -> list CheckItem.base_warning; value print_mod_aux : config -> base -> (gen_person Update.key string -> unit) -> unit; value print_add : config -> base -> unit; value print_del : config -> base -> unit; value print_mod : config -> base -> unit; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/base64.ml0000660000175200017530000000511112664543647022624 0ustar guillaumeguillaume(* $Id: base64.ml,v 5.2 2007-01-19 01:53:16 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) (* For basic credentials only *) (* Encoding is [A-Z][a-z][0-9]+/= *) (* 3 chars = 24 bits = 4 * 6-bit groups -> 4 chars *) value index64 = Array.make 128 0; (* Init the index *) do { for i = 0 to 25 do { index64.(i + Char.code 'A') := i }; for i = 0 to 25 do { index64.(i + Char.code 'a') := i + 26 }; for i = 0 to 9 do { index64.(i + Char.code '0') := i + 52 }; index64.(Char.code '+') := 62; index64.(Char.code '/') := 63 }; value decode s = let rpos = ref 0 and wpos = ref 0 and len = String.length s in let res = Bytes.create (len / 4 * 3) in do { while rpos.val < len do { let v1 = index64.(Char.code s.[rpos.val]) in let v2 = index64.(Char.code s.[rpos.val + 1]) in let v3 = index64.(Char.code s.[rpos.val + 2]) in let v4 = index64.(Char.code s.[rpos.val + 3]) in let i = v1 lsl 18 lor v2 lsl 12 lor v3 lsl 6 lor v4 in Bytes.set res wpos.val (Char.chr (i lsr 16)); Bytes.set res (wpos.val + 1) (Char.chr (i lsr 8 land 0xFF)); Bytes.set res (wpos.val + 2) (Char.chr (i land 0xFF)); rpos.val := rpos.val + 4; wpos.val := wpos.val + 3 }; let cut = if s.[len - 1] = '=' then if s.[len - 2] = '=' then 2 else 1 else 0 in String.sub res 0 (String.length res - cut) } ; value char64 = Array.make 64 'a'; do { for i = 0 to 25 do { char64.(i) := Char.chr (Char.code 'A' + i) }; for i = 0 to 25 do { char64.(i + 26) := Char.chr (Char.code 'a' + i) }; for i = 0 to 9 do { char64.(i + 52) := Char.chr (Char.code '0' + i) }; char64.(62) := '+'; char64.(63) := '/' }; (* Encoding *) value encode s = let rpos = ref 0 and wpos = ref 0 in let origlen = String.length s in let (s, len) = match origlen mod 3 with [ 0 -> (s, origlen) | 1 -> (s ^ "\000\000", origlen + 2) | 2 -> (s ^ "\000", origlen + 1) | _ -> match () with [] ] in let res = Bytes.create (len / 3 * 4) in do { while rpos.val < len do { let i1 = Char.code s.[rpos.val] in let i2 = Char.code s.[rpos.val + 1] in let i3 = Char.code s.[rpos.val + 2] in let i = i1 lsl 16 lor i2 lsl 8 lor i3 in Bytes.set res wpos.val char64.(i lsr 18 land 0x3f); Bytes.set res (wpos.val + 1) char64.(i lsr 12 land 0x3f); Bytes.set res (wpos.val + 2) char64.(i lsr 6 land 0x3f); Bytes.set res (wpos.val + 3) char64.(i land 0x3f); rpos.val := rpos.val + 3; wpos.val := wpos.val + 4 }; for i = 1 to len - origlen do { Bytes.set res (String.length res - i) '=' }; res } ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/perso.ml0000660000175200017530000041355112664543647022703 0ustar guillaumeguillaume(* camlp5r ./pa_html.cmo *) (* $Id: perso.ml,v 5.82 2007-09-12 09:58:44 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Config; open Def; open Gutil; open Gwdb; open Mutil; open TemplAst; open Util; value max_im_wid = 240; value max_im_hei = 240; value round_2_dec x = floor (x *. 100.0 +. 0.5) /. 100.0; value has_children base u = List.exists (fun ifam -> let des = foi base ifam in Array.length (get_children des) > 0) (Array.to_list (get_family u)) ; value string_of_marriage_text conf base fam = let marriage = Adef.od_of_codate (get_marriage fam) in let marriage_place = sou base (get_marriage_place fam) in let s = match marriage with [ Some d -> " " ^ Date.string_of_ondate conf d | _ -> "" ] in match marriage_place with [ "" -> s | _ -> s ^ ", " ^ string_with_macros conf [] marriage_place ^ "," ] ; value string_of_title conf base and_txt p (nth, name, title, places, dates) = let href = "m=TT;sm=S;t=" ^ code_varenv (sou base title) ^ ";p=" ^ code_varenv (sou base (List.hd places)) in let (tit, est) = (sou base title, sou base (List.hd places)) in let s = tit ^ " " ^ est in let b = Buffer.create 50 in do { Buffer.add_string b (geneweb_link conf href s); let rec loop places = do { match places with [ [] -> () | [_] -> Printf.bprintf b "\n%s " and_txt | _ -> Buffer.add_string b ",\n" ]; match places with [ [place :: places] -> let href = "m=TT;sm=S;t=" ^ code_varenv (sou base title) ^ ";p=" ^ code_varenv (sou base place) in let est = sou base place in do { Buffer.add_string b (geneweb_link conf href est); loop places } | _ -> () ] } in loop (List.tl places); let paren = match (nth, dates, name) with [ (n, _, _) when n > 0 -> True | (_, _, Tname _) -> True | (_, [(Some _, _) :: _], _) -> authorized_age conf base p | _ -> False ] in if paren then Buffer.add_string b "\n(" else (); let first = if nth > 0 then do { Buffer.add_string b (if nth >= 100 then string_of_int nth else transl_nth conf "nth" nth); False } else True in let first = match name with [ Tname n -> do { if not first then Buffer.add_string b " ," else (); Buffer.add_string b (sou base n); False } | _ -> first ] in if authorized_age conf base p && dates <> [(None, None)] then let _ = List.fold_left (fun first (date_start, date_end) -> do { if not first then Buffer.add_string b ",\n" else (); match date_start with [ Some d -> Buffer.add_string b (Date.string_of_date conf d) | None -> () ]; match date_end with [ Some (Dgreg d _) -> if d.month <> 0 then Buffer.add_string b " - " else Buffer.add_string b "-" | _ -> () ]; match date_end with [ Some d -> Buffer.add_string b (Date.string_of_date conf d) | None -> () ]; False }) first dates in () else (); if paren then Buffer.add_string b ")" else (); Buffer.contents b } ; value name_equiv n1 n2 = Futil.eq_title_names eq_istr n1 n2 || n1 = Tmain && n2 = Tnone || n1 = Tnone && n2 = Tmain ; value nobility_titles_list conf base p = let titles = List.fold_right (fun t l -> let t_date_start = Adef.od_of_codate t.t_date_start in let t_date_end = Adef.od_of_codate t.t_date_end in match l with [ [(nth, name, title, place, dates) :: rl] when not conf.is_rtl && nth = t.t_nth && name_equiv name t.t_name && eq_istr title t.t_ident && eq_istr place t.t_place -> [(nth, name, title, place, [(t_date_start, t_date_end) :: dates]) :: rl] | _ -> [(t.t_nth, t.t_name, t.t_ident, t.t_place, [(t_date_start, t_date_end)]) :: l] ]) (Util.nobtit conf base p) [] in List.fold_right (fun (t_nth, t_name, t_ident, t_place, t_dates) l -> match l with [ [(nth, name, title, places, dates) :: rl] when not conf.is_rtl && nth = t_nth && name_equiv name t_name && eq_istr title t_ident && dates = t_dates -> [(nth, name, title, [t_place :: places], dates) :: rl] | _ -> [(t_nth, t_name, t_ident, [t_place], t_dates) :: l] ]) titles [] ; (* obsolete; should be removed one day *) value string_of_titles conf base cap and_txt p = let titles = nobility_titles_list conf base p in List.fold_left (fun s t -> s ^ (if s = "" then "" else ",") ^ "\n" ^ string_of_title conf base and_txt p t) "" titles ; value string_of_num sep num = let len = ref 0 in do { Num.print (fun x -> len.val := Buff.mstore len.val x) sep num; Buff.get len.val } ; value print_base_loop conf base p = do { Wserver.wprint (fcapitale (ftransl conf "loop in database: %s is his/her own ancestor")) (Util.update_family_loop conf base p (designation base p)); Wserver.wprint ".\n"; Hutil.trailer conf; exit 2 } ; (* This is the old version, the new one has few optimisations *) (* Version matching the Sosa number of the "ancestor" pages *) (* value find_sosa_aux conf base a p = let tstab = try Util.create_topological_sort conf base with [ Consang.TopologicalSortError p -> print_base_loop conf base p ] in let mark = Array.make (nb_of_persons base) False in let rec gene_find = fun [ [] -> Left [] | [(z, ip) :: zil] -> if ip = get_key_index a then Right z else if mark.(Adef.int_of_iper ip) then gene_find zil else do { mark.(Adef.int_of_iper ip) := True; if tstab.(Adef.int_of_iper (get_key_index a)) <= tstab.(Adef.int_of_iper ip) then gene_find zil else let asc = pget conf base ip in match get_parents asc with [ Some ifam -> let cpl = foi base ifam in let z = Num.twice z in match gene_find zil with [ Left zil -> Left [(z, get_father cpl); (Num.inc z 1, (get_mother cpl)) :: zil] | Right z -> Right z ] | None -> gene_find zil ] } ] in let rec find zil = match gene_find zil with [ Left [] -> None | Left zil -> find zil | Right z -> Some (z, p) ] in find [(Num.one, get_key_index p)] ; (* Male version value find_sosa_aux conf base a p = let mark = Array.make base.data.persons.len False in let rec find z ip = if ip = a.key_index then Some z else if mark.(Adef.int_of_iper ip) then None else do { mark.(Adef.int_of_iper ip) := True; let asc = aget conf base ip in match asc.parents with [ Some ifam -> let cpl = coi base ifam in let z = Num.twice z in match find z (father cpl) with [ Some z -> Some z | None -> find (Num.inc z 1) (mother cpl) ] | None -> None ] } in find Num.one (get_key_index p) ; *) value find_sosa conf base a sosa_ref_l = match Lazy.force sosa_ref_l with [ Some p -> if get_key_index a = get_key_index p then Some (Num.one, p) else let u = pget conf base (get_key_index a) in if has_children base u then find_sosa_aux conf base a p else None | None -> None ] ; *) (* Optimisation de find_sosa_aux : *) (* - ajout d'un cache pour conserver les descendants du sosa que l'on calcul *) (* - on sauvegarde la dernière génération où l'on a arrêté le calcul pour *) (* ne pas reprendre le calcul depuis la racine *) (* Type pour ne pas créer à chaque fois un tableau tstab et mark *) type sosa_t = { tstab : array int; mark : array bool; last_zil : mutable list (Def.iper * Num.t); sosa_ht : Hashtbl.t Def.iper (option (Num.t * Gwdb.person)) } ; value init_sosa_t conf base sosa_ref = let tstab = try Util.create_topological_sort conf base with [ Consang.TopologicalSortError p -> (* Avec la nouvelle implementation du calcul de sosa, si à *) (* l'init il y a une boucle, alors on a pas encore interprété *) (* le template, donc on n'a pas de header. *) (* Il faut trouver aussi un algo de suppression de boucle parce *) (* que si la boucle n'est pas à une génération d'écart, alors on *) (* boucle sur l'interprétation du template. *) do { let title _ = Wserver.wprint "%s" (capitale (transl conf "error")) in Hutil.rheader conf title; print_base_loop conf base p } ] in let mark = Array.make (nb_of_persons base) False in let last_zil = [(get_key_index sosa_ref, Num.one)] in let sosa_ht = Hashtbl.create 5003 in let () = Hashtbl.add sosa_ht (get_key_index sosa_ref) (Some (Num.one, sosa_ref)) in let t_sosa = { tstab = tstab; mark = mark; last_zil = last_zil; sosa_ht = sosa_ht } in t_sosa ; value find_sosa_aux conf base a p t_sosa = let cache = ref [] in let has_ignore = ref False in let ht_add ht k v new_sosa = match try Hashtbl.find ht k with [ Not_found -> v ] with [ Some (z, _) -> if not (Num.gt new_sosa z) then Hashtbl.replace ht k v else () | _ -> () ] in let rec gene_find = fun [ [] -> Left [] | [(ip, z) :: zil] -> let _ = cache.val := [(ip, z) :: cache.val] in if ip = get_key_index a then Right z else if t_sosa.mark.(Adef.int_of_iper ip) then gene_find zil else do { t_sosa.mark.(Adef.int_of_iper ip) := True; if t_sosa.tstab.(Adef.int_of_iper (get_key_index a)) <= t_sosa.tstab.(Adef.int_of_iper ip) then let _ = has_ignore.val := True in gene_find zil else let asc = pget conf base ip in match get_parents asc with [ Some ifam -> let cpl = foi base ifam in let z = Num.twice z in match gene_find zil with [ Left zil -> Left [(get_father cpl, z); (get_mother cpl, Num.inc z 1) :: zil] | Right z -> Right z ] | None -> gene_find zil ] } ] in let rec find zil = match (* Dans le cas ou le fichier tstab n'est plus à jour, on supprime *) (* le fichier pour qu'il se régénère la prochaine fois. *) try gene_find zil with [ Invalid_argument "index out of bounds" -> do { Update.delete_topological_sort conf base; Left [] } ] with [ Left [] -> let _ = List.iter (fun (ip, _) -> Array.set t_sosa.mark (Adef.int_of_iper ip) False) cache.val in None | Left zil -> let _ = if has_ignore.val then () else do { List.iter (fun (ip, z) -> ht_add t_sosa.sosa_ht ip (Some (z, p)) z) zil; t_sosa.last_zil := zil } in find zil | Right z -> let _ = List.iter (fun (ip, _) -> Array.set t_sosa.mark (Adef.int_of_iper ip) False) cache.val in Some (z, p) ] in find t_sosa.last_zil ; value find_sosa conf base a sosa_ref_l t_sosa = match Lazy.force sosa_ref_l with [ Some p -> if get_key_index a = get_key_index p then Some (Num.one, p) else let u = pget conf base (get_key_index a) in if has_children base u then try Hashtbl.find t_sosa.sosa_ht (get_key_index a) with [ Not_found -> find_sosa_aux conf base a p t_sosa ] else None | None -> None ] ; (* [Type]: (Def.iper, Num.t) Hashtbl.t *) value sosa_ht = Hashtbl.create 5003; (* ************************************************************************ *) (* [Fonc] build_sosa_ht : config -> base -> unit *) (** [Description] : Construit à partir du sosa de référence de la base, la liste de tous ces ancêtres directs et la stocke dans une hashtbl. La clé de la table est l'iper de la personne et on lui associe son numéro de sosa. Les sosa multiples ne sont représentés qu'une seule fois par leur plus petit numéro sosa. [Args] : - conf : configuration de la base - base : base de donnée [Retour] : - unit [Rem] : Exporté en clair hors de ce module. *) (* ************************************************************************ *) value build_sosa_ht conf base = let () = load_ascends_array base in let () = load_couples_array base in match Util.find_sosa_ref conf base with [ Some sosa_ref -> let nb_persons = nb_of_persons base in let mark = Array.make nb_persons False in (* Tableau qui va socker au fur et à mesure les ancêtres du sosa_ref. *) (* Attention, on créé un tableau de la longueur de la base + 1 car on *) (* commence à l'indice 1 ! *) let sosa_accu = Array.make (nb_persons + 1) (Num.zero, Adef.iper_of_int 0) in let () = Array.set sosa_accu 1 (Num.one, get_key_index sosa_ref) in let rec loop i len = if i > nb_persons then () else let (sosa_num, ip) = Array.get sosa_accu i in (* Si la personne courante n'a pas de numéro de sosa, alors il n'y *) (* a plus d'ancêtres car ils ont été ajoutés par ordre croissant. *) if Num.eq sosa_num Num.zero then () else do { Hashtbl.add sosa_ht ip sosa_num; let asc = pget conf base ip in (* Ajoute les nouveaux ascendants au tableau des ancêtres. *) match get_parents asc with [ Some ifam -> let cpl = foi base ifam in let z = Num.twice sosa_num in let len = if not mark.(Adef.int_of_iper (get_father cpl)) then do { Array.set sosa_accu (len + 1) (z, get_father cpl) ; mark.(Adef.int_of_iper (get_father cpl)) := True ; len + 1 } else len in let len = if not mark.(Adef.int_of_iper (get_mother cpl)) then do { Array.set sosa_accu (len + 1) (Num.inc z 1, get_mother cpl); mark.(Adef.int_of_iper (get_mother cpl)) := True ; len + 1 } else len in loop (i + 1) len | None -> loop (i + 1) len ] } in loop 1 1 | None -> () ] ; (* ******************************************************************** *) (* [Fonc] get_sosa_person : config -> base -> person -> Num.t *) (** [Description] : Recherche si la personne passée en argument a un numéro de sosa. [Args] : - conf : configuration de la base - base : base de donnée - p : personne dont on cherche si elle a un numéro sosa [Retour] : - Num.t : retourne Num.zero si la personne n'a pas de numéro de sosa, ou retourne son numéro de sosa sinon [Rem] : Exporté en clair hors de ce module. *) (* ******************************************************************** *) value get_sosa_person conf base p = try Hashtbl.find sosa_ht (get_key_index p) with [ Not_found -> Num.zero ] ; (* ******************************************************************** *) (* [Fonc] get_single_sosa : config -> base -> person -> Num.t *) (** [Description] : Recherche si la personne passée en argument a un numéro de sosa. [Args] : - conf : configuration de la base - base : base de donnée - p : personne dont on cherche si elle a un numéro sosa [Retour] : - Num.t : retourne Num.zero si la personne n'a pas de numéro de sosa, ou retourne son numéro de sosa sinon [Rem] : Exporté en clair hors de ce module. *) (* ******************************************************************** *) value get_single_sosa conf base p = let sosa_ref = Util.find_sosa_ref conf base in match sosa_ref with [ Some p_sosa -> let sosa_ref_l = let sosa_ref () = sosa_ref in Lazy.from_fun sosa_ref in let t_sosa = init_sosa_t conf base p_sosa in match find_sosa conf base p sosa_ref_l t_sosa with [ Some (z, p) -> z | None -> Num.zero ] | None -> Num.zero ] ; (* ************************************************************************ *) (* [Fonc] print_sosa : config -> base -> person -> bool -> unit *) (** [Description] : Affiche le picto sosa ainsi que le lien de calcul de relation entre la personne et le sosa 1 (si l'option cancel_link n'est pas activée). [Args] : - conf : configuration de la base - base : base de donnée - p : la personne que l'on veut afficher - link : ce booléen permet d'afficher ou non le lien sur le picto sosa. Il n'est pas nécessaire de mettre le lien si on a déjà affiché cette personne. [Retour] : - unit [Rem] : Exporté en clair hors de ce module. *) (* ************************************************************************ *) value print_sosa conf base p link = let sosa_num = get_sosa_person conf base p in if Num.gt sosa_num Num.zero then match Util.find_sosa_ref conf base with [ Some ref -> do { if conf.cancel_links || not link then () else let sosa_link = let i1 = string_of_int (Adef.int_of_iper (get_key_index p)) in let i2 = string_of_int (Adef.int_of_iper (get_key_index ref)) in let b2 = Num.to_string sosa_num in "m=RL;i1=" ^ i1 ^ ";i2=" ^ i2 ^ ";b1=1;b2=" ^ b2 in Wserver.wprint "" (commd conf) sosa_link; let title = if (is_hide_names conf ref) && not (fast_auth_age conf ref) then "" else let direct_ancestor = Name.strip_c (p_first_name base ref) '"' ^ " " ^ Name.strip_c (p_surname base ref) '"' in Printf.sprintf (fcapitale (ftransl conf "direct ancestor of %s")) direct_ancestor ^ Printf.sprintf ", Sosa: %s" (string_of_num (transl conf "(thousand separator)") sosa_num) in Wserver.wprint "\"sosa\"" (image_prefix conf) title; if conf.cancel_links || not link then () else Wserver.wprint " "; } | None -> () ] else () ; value max_ancestor_level conf base ip max_lev = let x = ref 0 in let mark = Array.make (nb_of_persons base) False in let rec loop level ip = if mark.(Adef.int_of_iper ip) then () else do { mark.(Adef.int_of_iper ip) := True; x.val := max x.val level; if x.val = max_lev then () else match get_parents (pget conf base ip) with [ Some ifam -> let cpl = foi base ifam in do { loop (succ level) (get_father cpl); loop (succ level) (get_mother cpl) } | _ -> () ] } in do { loop 0 ip; x.val } ; value default_max_cousin_lev = 5; value max_cousin_level conf base p = let max_lev = try int_of_string (List.assoc "max_cousins_level" conf.base_env) with [ Not_found | Failure _ -> default_max_cousin_lev ] in max_ancestor_level conf base (get_key_index p) max_lev + 1 ; value limit_anc_by_tree conf = match p_getint conf.base_env "max_anc_tree" with [ Some x -> max 1 x | None -> 7 ] ; value limit_desc conf = match p_getint conf.base_env "max_desc_level" with [ Some x -> max 1 x | None -> 12 ] ; value infinite = 10000; value make_desc_level_table conf base max_level p = do { let line = match p_getenv conf.env "t" with [ Some "M" -> Male | Some "F" -> Female | Some _ | None -> Neuter ] in (* the table 'levt' may be not necessary, since I added 'flevt'; kept because '%max_desc_level;' is still used... *) let levt = Array.make (nb_of_persons base) infinite in let flevt = Array.make (nb_of_families base) infinite in let get = pget conf base in let ini_ip = get_key_index p in let rec fill lev = fun [ [] -> () | ipl -> let new_ipl = List.fold_left (fun ipl ip -> if levt.(Adef.int_of_iper ip) <= lev then ipl else if lev <= max_level then do { levt.(Adef.int_of_iper ip) := lev; let down = if ip = ini_ip then True else match line with [ Male -> get_sex (pget conf base ip) <> Female | Female -> get_sex (pget conf base ip) <> Male | Neuter -> True ] in if down then Array.fold_left (fun ipl ifam -> do { if flevt.(Adef.int_of_ifam ifam) <= lev then () else flevt.(Adef.int_of_ifam ifam) := lev; let ipa = get_children (foi base ifam) in Array.fold_left (fun ipl ip -> [ip :: ipl]) ipl ipa }) ipl (get_family (get ip)) else ipl } else ipl) [] ipl in fill (succ lev) new_ipl ] in fill 0 [ini_ip]; (levt, flevt) }; value desc_level_max conf base desc_level_table_l = let (levt, _) = Lazy.force desc_level_table_l in let x = ref 0 in do { for i = 0 to Array.length levt - 1 do { let lev = levt.(i) in if lev != infinite && x.val < lev then x.val := lev else () }; x.val } ; value max_descendant_level conf base desc_level_table_l = (* min (limit_desc conf) *) (desc_level_max conf base desc_level_table_l) ; (* ancestors by list *) type generation_person = [ GP_person of Num.t and iper and option ifam | GP_same of Num.t and Num.t and iper | GP_interv of option (Num.t * Num.t * option (Num.t * Num.t)) | GP_missing of Num.t and iper ] ; value next_generation conf base mark gpl = let gpl = List.fold_right (fun gp gpl -> match gp with [ GP_person n ip _ -> let n_fath = Num.twice n in let n_moth = Num.inc n_fath 1 in let a = pget conf base ip in match get_parents a with [ Some ifam -> let cpl = foi base ifam in [GP_person n_fath (get_father cpl) (Some ifam); GP_person n_moth (get_mother cpl) (Some ifam) :: gpl] | None -> [GP_missing n ip :: gpl] ] | GP_interv None -> [gp :: gpl] | GP_interv (Some (n1, n2, x)) -> let x = match x with [ Some (m1, m2) -> Some (Num.twice m1, Num.twice m2) | None -> None ] in let gp = GP_interv (Some (Num.twice n1, Num.twice n2, x)) in [gp :: gpl] | _ -> gpl ]) gpl [] in let gpl = List.fold_left (fun gpl gp -> match gp with [ GP_person n ip _ -> let i = Adef.int_of_iper ip in let m = mark.(i) in if Num.eq m Num.zero then do { mark.(i) := n; [gp :: gpl] } else [GP_same n m ip :: gpl] | _ -> [gp :: gpl] ]) [] gpl in List.rev gpl ; value next_generation2 conf base mark gpl = let gpl = List.map (fun gp -> match gp with [ GP_same n m ip -> GP_interv (Some (n, Num.inc n 1, Some (m, Num.inc m 1))) | _ -> gp ]) gpl in let gpl = next_generation conf base mark gpl in List.fold_right (fun gp gpl -> match (gp, gpl) with [ (GP_interv (Some (n1, n2, x)), [GP_interv (Some (n3, n4, y)) :: gpl1]) -> if Num.eq n2 n3 then let z = match (x, y) with [ (Some (m1, m2), Some (m3, m4)) -> if Num.eq m2 m3 then Some (m1, m4) else None | _ -> None ] in [GP_interv (Some (n1, n4, z)) :: gpl1] else [GP_interv None :: gpl1] | (GP_interv _, [GP_interv _ :: gpl]) -> [GP_interv None :: gpl] | (GP_missing _ _, gpl) -> gpl | _ -> [gp :: gpl] ]) gpl [] ; value sosa_is_present all_gp n1 = loop all_gp where rec loop = fun [ [GP_person n _ _ :: gpl] | [GP_same n _ _ :: gpl] -> if Num.eq n n1 then True else loop gpl | [gp :: gpl] -> loop gpl | [] -> False ] ; value get_link all_gp ip = loop all_gp where rec loop = fun [ [(GP_person n ip0 _ as gp) :: gpl] -> if ip = ip0 then Some gp else loop gpl | [gp :: gpl] -> loop gpl | [] -> None ] ; value parent_sosa conf base ip all_gp n parent = if sosa_is_present all_gp n then Num.to_string n else match get_parents (pget conf base ip) with [ Some ifam -> match get_link all_gp (parent (foi base ifam)) with [ Some (GP_person n _ _) -> Num.to_string n | _ -> "" ] | None -> "" ] ; value will_print = fun [ GP_person _ _ _ -> True | GP_same _ _ _ -> True | _ -> False ] ; value get_all_generations conf base p = let max_level = match p_getint conf.env "v" with [ Some v -> v (* + 1 *) | None -> 0 ] in let mark = Array.make (nb_of_persons base) Num.zero in let rec get_generations level gpll gpl = let gpll = [gpl :: gpll] in if level < max_level then let next_gpl = next_generation conf base mark gpl in if List.exists will_print next_gpl then get_generations (level + 1) gpll next_gpl else gpll else gpll in let gpll = get_generations 1 [] [GP_person Num.one (get_key_index p) None] in let gpll = List.rev gpll in List.flatten gpll ; (* Ancestors by tree: 8 ? ? ? ? ? ? ? 4 5 ? 7 2 3 1 1) Build list of levels (t1 = True for parents flag, size 1) => [ [8At1 E E] [4Lt1 5Rt1 7At1] [2Lt1 3Rt1] [1Ct1] ] 2) Enrich list of levels (parents flag, sizing) => [ [8At1 E E] [4Lt1 5Rf1 7Af1] [2Lt3 3Rt1] [1Ct5] ] 3) Display it For each cell: Top vertical bar if parents flag (not on top line) Person Person tree link (vertical bar) ) not on bottom line Horizontal line ) *) type pos = [ Left | Right | Center | Alone ]; type cell = [ Cell of person and option ifam and pos and bool and int | Empty ] ; value rec enrich lst1 lst2 = match (lst1, lst2) with [ (_, []) -> [] | ([], lst) -> lst | ([Cell _ _ Right _ s1 :: l1], [Cell p f d u s2 :: l2]) -> [Cell p f d u (s1 + s2 + 1) :: enrich l1 l2] | ([Cell _ _ Left _ s :: l1], [Cell p f d u _ :: l2]) -> enrich l1 [Cell p f d u s :: l2] | ([Cell _ _ _ _ s :: l1], [Cell p f d u _ :: l2]) -> [Cell p f d u s :: enrich l1 l2] | ([Empty :: l1], [Cell p f d _ s :: l2]) -> [Cell p f d False s :: enrich l1 l2] | ([_ :: l1], [Empty :: l2]) -> [Empty :: enrich l1 l2] ] ; value is_empty = List.for_all (\= Empty); value rec enrich_tree lst = match lst with [ [] -> [] | [head :: tail] -> if is_empty head then enrich_tree tail else match tail with [ [] -> [head] | [thead :: ttail] -> [head :: enrich_tree [enrich head thead :: ttail]] ] ] ; (* tree_generation_list conf: configuration parameters base: base name gv: number of generations p: person *) value tree_generation_list conf base gv p = let next_gen pol = List.fold_right (fun po list -> match po with [ Empty -> [Empty :: list] | Cell p _ _ _ _ -> match get_parents p with [ Some ifam -> let cpl = foi base ifam in let fath = let p = pget conf base (get_father cpl) in if know base p then Some p else None in let moth = let p = pget conf base (get_mother cpl) in if know base p then Some p else None in let fo = Some ifam in match (fath, moth) with [ (Some f, Some m) -> [Cell f fo Left True 1; Cell m fo Right True 1 :: list] | (Some f, None) -> [Cell f fo Alone True 1 :: list] | (None, Some m) -> [Cell m fo Alone True 1 :: list] | (None, None) -> [Empty :: list] ] | _ -> [Empty :: list] ] ]) pol [] in let gen = loop (gv - 1) [Cell p None Center True 1] [] where rec loop i gen list = if i = 0 then [gen :: list] else loop (i - 1) (next_gen gen) [gen :: list] in enrich_tree gen ; (* Ancestors surnames list *) value get_date_place conf base auth_for_all_anc p = if auth_for_all_anc || authorized_age conf base p then let d1 = match Adef.od_of_codate (get_birth p) with [ None -> Adef.od_of_codate (get_baptism p) | x -> x ] in let d1 = if d1 <> None then d1 else List.fold_left (fun d ifam -> if d <> None then d else Adef.od_of_codate (get_marriage (foi base ifam))) d1 (Array.to_list (get_family p)) in let d2 = match get_death p with [ Death _ cd -> Some (Adef.date_of_cdate cd) | _ -> match get_burial p with [ Buried cod -> Adef.od_of_codate cod | Cremated cod -> Adef.od_of_codate cod | _ -> None ] ] in let auth_for_all_anc = if auth_for_all_anc then True else match d2 with [ Some (Dgreg d _) -> let a = CheckItem.time_elapsed d conf.today in Util.strictly_after_private_years conf a | _ -> False ] in let pl = let pl = "" in let pl = if pl <> "" then pl else sou base (get_birth_place p) in let pl = if pl <> "" then pl else sou base (get_baptism_place p) in let pl = if pl <> "" then pl else sou base (get_death_place p) in let pl = if pl <> "" then pl else sou base (get_burial_place p) in let pl = if pl <> "" then pl else List.fold_left (fun pl ifam -> if pl <> "" then pl else sou base (get_marriage_place (foi base ifam))) pl (Array.to_list (get_family p)) in pl in ((d1, d2, pl), auth_for_all_anc) else ((None, None, ""), False) ; (* duplications proposed for merging *) type dup = [ DupFam of ifam and ifam | DupInd of iper and iper | NoDup ]; type excl_dup = (list (Adef.iper * Adef.iper) * list (Adef.ifam * Adef.ifam)); value gen_excluded_possible_duplications conf s i_of_int = match p_getenv conf.env s with [ Some s -> loop [] 0 where rec loop ipl i = if i >= String.length s then ipl else let j = try String.index_from s i ',' with [ Not_found -> String.length s ] in if j = String.length s then ipl else let k = try String.index_from s (j + 1) ',' with [ Not_found -> String.length s ] in let s1 = String.sub s i (j - i) in let s2 = String.sub s (j + 1) (k - j - 1) in let ipl = match try Some (int_of_string s1, int_of_string s2) with [ Failure _ -> None ] with [ Some (i1, i2) -> [(i_of_int i1, i_of_int i2) :: ipl] | None -> ipl ] in loop ipl (k + 1) | None -> [] ] ; value excluded_possible_duplications conf = (gen_excluded_possible_duplications conf "iexcl" Adef.iper_of_int, gen_excluded_possible_duplications conf "fexcl" Adef.ifam_of_int) ; value first_possible_duplication base ip (iexcl, fexcl) = let ifaml = Array.to_list (get_family (poi base ip)) in let cand_spouse = loop_spouse ifaml where rec loop_spouse = fun [ [ifam1 :: ifaml1] -> let isp1 = Gutil.spouse ip (foi base ifam1) in let sp1 = poi base isp1 in let fn1 = get_first_name sp1 in let sn1 = get_surname sp1 in loop_same ifaml1 where rec loop_same = fun [ [ifam2 :: ifaml2] -> let isp2 = Gutil.spouse ip (foi base ifam2) in if isp2 = isp1 then if not (List.mem (ifam1, ifam2) fexcl) then DupFam ifam1 ifam2 else loop_same ifaml2 else let sp2 = poi base isp2 in if List.mem (isp1, isp2) iexcl then loop_same ifaml2 else if eq_istr (get_first_name sp2) fn1 && eq_istr (get_surname sp2) sn1 then DupInd isp1 isp2 else loop_same ifaml2 | [] -> loop_spouse ifaml1 ] | [] -> NoDup ] in if cand_spouse <> NoDup then cand_spouse else let ipl = loop ifaml where rec loop = fun [ [ifam :: ifaml] -> let ipl = Array.to_list (get_children (foi base ifam)) in ipl @ loop ifaml | [] -> [] ] in loop_chil ipl where rec loop_chil = fun [ [ip1 :: ipl1] -> let p1 = poi base ip1 in let fn1 = get_first_name p1 in loop_same ipl1 where rec loop_same = fun [ [ip2 :: ipl2] -> let p2 = poi base ip2 in if List.mem (ip1, ip2) iexcl then loop_same ipl2 else if eq_istr (get_first_name p2) fn1 then DupInd ip1 ip2 else loop_same ipl2 | [] -> loop_chil ipl1 ] | [] -> NoDup ] ; value has_possible_duplications conf base p = let ip = get_key_index p in let excl = excluded_possible_duplications conf in first_possible_duplication base ip excl <> NoDup ; value merge_date_place conf base surn ((d1, d2, pl), auth) p = let ((pd1, pd2, ppl), auth) = get_date_place conf base auth p in let nd1 = if pd1 <> None then pd1 else if eq_istr (get_surname p) surn then if pd2 <> None then pd2 else d1 else None in let nd2 = if eq_istr (get_surname p) surn then if d2 <> None then d2 else if d1 <> None then d1 else if pd1 <> None then pd2 else pd1 else if pd2 <> None then pd2 else if pd1 <> None then pd1 else d1 in let pl = if ppl <> "" then ppl else if eq_istr (get_surname p) surn then pl else "" in ((nd1, nd2, pl), auth) ; value build_surnames_list conf base v p = let ht = Hashtbl.create 701 in let mark = Array.make (nb_of_persons base) 5 in let auth = conf.wizard || conf.friend in let add_surname sosa p surn dp = let r = try Hashtbl.find ht surn with [ Not_found -> let r = ref ((fst dp, p), []) in do { Hashtbl.add ht surn r; r } ] in r.val := (fst r.val, [sosa :: snd r.val]) in let rec loop lev sosa p surn dp = if mark.(Adef.int_of_iper (get_key_index p)) = 0 then () else if lev = v then if (is_hide_names conf p) && not (fast_auth_age conf p) then () else add_surname sosa p surn dp else do { mark.(Adef.int_of_iper (get_key_index p)) := mark.(Adef.int_of_iper (get_key_index p)) - 1; match get_parents p with [ Some ifam -> let cpl = foi base ifam in let fath = pget conf base (get_father cpl) in let moth = pget conf base (get_mother cpl) in do { if not (eq_istr surn (get_surname fath)) && not (eq_istr surn (get_surname moth)) then add_surname sosa p surn dp else (); let sosa = Num.twice sosa in if not (is_hidden fath) then let dp1 = merge_date_place conf base surn dp fath in loop (lev + 1) sosa fath (get_surname fath) dp1 else (); let sosa = Num.inc sosa 1 in if not (is_hidden moth) then let dp2 = merge_date_place conf base surn dp moth in loop (lev + 1) sosa moth (get_surname moth) dp2 else (); } | None -> add_surname sosa p surn dp ] } in do { loop 1 Num.one p (get_surname p) (get_date_place conf base auth p); let list = ref [] in Hashtbl.iter (fun i dp -> let surn = sou base i in if surn <> "?" then list.val := [(surn, dp.val) :: list.val] else ()) ht; List.sort (fun (s1, _) (s2, _) -> match Gutil.alphabetic_order (surname_end base s1) (surname_end base s2) with [ 0 -> Gutil.alphabetic_order (surname_begin base s1) (surname_begin base s2) | x -> x ]) list.val } ; (* ************************************************************************* *) (* [Fonc] build_list_eclair : config -> base -> int -> person -> list (string * string * option date * option date * person * list iper) *) (** [Description] : Construit la liste éclair des ascendants de p jusqu'à la génération v. [Args] : - conf : configuration de la base - base : base de donnée - v : le nombre de génération - p : person [Retour] : (surname * place * date begin * date end * person * list iper) [Rem] : Exporté en clair hors de ce module. *) (* ************************************************************************* *) value build_list_eclair conf base v p = let ht = Hashtbl.create 701 in let mark = Array.make (nb_of_persons base) False in (* Fonction d'ajout dans la Hashtbl. A la clé (surname, place) on associe *) (* la personne (pour l'interprétation dans le template), la possible date *) (* de début, la possible date de fin, la liste des personnes/évènements. *) (* Astuce: le nombre d'élément de la liste correspond au nombre *) (* d'évènements et le nombre d'iper unique correspond au nombre d'individu. *) let add_surname p surn pl d = if not (is_empty_string pl) then (* On utilise la string du lieu, parce qu'en gwc2, les adresses des *) (* lieux sont différentes selon l'évènement. *) (* On fait un string_of_place à cause des éventuels crochets, pour *) (* avoir l'unicité du lieu et le trie alphabétique. *) let pl = Util.string_of_place conf (sou base pl) in let r = try Hashtbl.find ht (surn, pl) with [ Not_found -> let r = ref (p, None, None, []) in do { Hashtbl.add ht (surn, pl) r; r } ] in (* Met la jour le binding : dates et liste des iper. *) r.val := (fun p (pp, db, de, l) -> let db = match db with [ Some dd -> match d with [ Some d -> if Date.compare_date d dd < 0 then Some d else db | None -> db ] | None -> d ] in let de = match de with [ Some dd -> match d with [ Some d -> if Date.compare_date d dd > 0 then Some d else de | None -> de ] | None -> d ] in (pp, db, de, [(get_key_index p) :: l])) p r.val else () in (* Fonction d'ajout de tous les évènements d'une personne (birth, bapt...). *) let add_person p surn = if mark.(Adef.int_of_iper (get_key_index p)) then () else do { mark.(Adef.int_of_iper (get_key_index p)) := True; add_surname p surn (get_birth_place p) (Adef.od_of_codate (get_birth p)); add_surname p surn (get_baptism_place p) (Adef.od_of_codate (get_baptism p)); let death = match get_death p with [ Death _ cd -> Some (Adef.date_of_cdate cd) | _ -> None ] in add_surname p surn (get_death_place p) death; let burial = match get_burial p with [ Buried cod | Cremated cod -> Adef.od_of_codate cod | _ -> None ] in add_surname p surn (get_burial_place p) burial; List.iter (fun ifam -> let fam = foi base ifam in add_surname p surn (get_marriage_place fam) (Adef.od_of_codate (get_marriage fam))) (Array.to_list (get_family p)) } in (* Parcours les ascendants de p et les ajoute dans la Hashtbl. *) let rec loop lev p surn = if lev = v then if (is_hide_names conf p) && not (fast_auth_age conf p) then () else add_person p surn else do { add_person p surn; match get_parents p with [ Some ifam -> let cpl = foi base ifam in let fath = pget conf base (get_father cpl) in let moth = pget conf base (get_mother cpl) in do { if not (is_hidden fath) then loop (lev + 1) fath (get_surname fath) else (); if not (is_hidden moth) then loop (lev + 1) moth (get_surname moth) else (); } | None -> () ] } in do { (* Construction de la Hashtbl. *) loop 1 p (get_surname p); (* On parcours la Hashtbl, et on élimine les noms vide (=?) *) let list = ref [] in Hashtbl.iter (fun (istr, place) ht_val -> let surn = sou base istr in if surn <> "?" then let (p, db, de, pl) = (fun x -> x) ht_val.val in list.val := [(surn, place, db, de, p, pl) :: list.val] else ()) ht; (* On trie la liste par nom, puis lieu. *) List.sort (fun (s1, pl1, _, _, _, _) (s2, pl2, _, _, _, _) -> match Gutil.alphabetic_order (surname_end base s1) (surname_end base s2) with [ 0 -> match Gutil.alphabetic_order (surname_begin base s1) (surname_begin base s2) with [ 0 -> Gutil.alphabetic_order pl1 pl2 | x -> x ] | x -> x ]) list.val } ; value linked_page_text conf base p s key str (pg, (_, il)) = match pg with [ NotesLinks.PgMisc pg -> let list = List.map snd (List.filter (fun (k, _) -> k = key) il) in List.fold_right (fun text str -> try let (nenv, _) = Notes.read_notes base pg in let v = let v = List.assoc s nenv in if v = "" then raise Not_found else Util.nth_field v (Util.index_of_sex (get_sex p)) in match text.NotesLinks.lnTxt with [ Some "" -> str | _ -> let str1 = let v = let text = text.NotesLinks.lnTxt in match text with [ Some text -> loop 0 0 where rec loop i len = if i = String.length text then Buff.get len else if text.[i] = '*' then loop (i + 1) (Buff.mstore len v) else loop (i + 1) (Buff.store len text.[i]) | None -> v ] in let (a, b, c) = try let i = String.index v '{' in let j = String.index v '}' in let a = String.sub v 0 i in let b = String.sub v (i + 1) (j - i - 1) in let c = String.sub v (j + 1) (String.length v - j - 1) in (a, b, c) with [ Not_found -> ("", v, "") ] in Printf.sprintf "%s%s%s" a (commd conf) pg text.NotesLinks.lnPos b c in if str = "" then str1 else str ^ ", " ^ str1 ] with [ Not_found -> str ]) list str | _ -> str ] ; value links_to_ind conf base db key = let list = List.fold_left (fun pgl (pg, (_, il)) -> let record_it = match pg with [ NotesLinks.PgInd ip -> authorized_age conf base (pget conf base ip) | NotesLinks.PgFam ifam -> let fam = foi base ifam in if is_deleted_family fam then False else authorized_age conf base (pget conf base (get_father fam)) | NotesLinks.PgNotes | NotesLinks.PgMisc _ | NotesLinks.PgWizard _ -> True ] in if record_it then List.fold_left (fun pgl (k, _) -> if k = key then [pg :: pgl] else pgl) pgl il else pgl) [] db in list_uniq (List.sort compare list) ; (* Interpretation of template file *) value rec compare_ls sl1 sl2 = match (sl1, sl2) with [ ([s1 :: sl1], [s2 :: sl2]) -> (* Je ne sais pas s'il y a des effets de bords, mais on *) (* essaie de convertir s1 s2 en int pour éviter que "10" *) (* soit plus petit que "2". J'espère qu'on ne casse pas *) (* les performances à cause du try..with. *) let c = try Pervasives.compare (int_of_string s1) (int_of_string s2) with [ Failure "int_of_string" -> Gutil.alphabetic_order s1 s2 ] in if c = 0 then compare_ls sl1 sl2 else c | ([_ :: _], []) -> 1 | ([], [_ :: _]) -> -1 | ([], []) -> 0 ] ; module SortedList = Set.Make (struct type t = list string; value compare = compare_ls; end) ; module IperSet = Set.Make (struct type t = iper; value compare i1 i2 = Pervasives.compare (Adef.int_of_iper i1) (Adef.int_of_iper i2); end) ; (* Type pour représenté soit : - la liste des branches patronymique (surname * date begin * date end * place * person * list sosa * loc) - la liste éclair (surname * place * date begin * date end * person * list iper * loc) *) type ancestor_surname_info = [ Branch of (string * option date * option date * string * person * list Num.t * loc) | Eclair of (string * string * option date * option date * person * list iper * loc) ] ; type env 'a = [ Vallgp of list generation_person | Vanc of generation_person | Vanc_surn of ancestor_surname_info | Vcell of cell | Vcelll of list cell | Vcnt of ref int | Vdesclevtab of Lazy.t (array int * array int) | Vdmark of ref (array bool) | Vslist of ref SortedList.t | Vslistlm of list (list string) | Vind of person | Vfam of ifam and family and (iper * iper * iper) and bool | Vrel of relation and option person | Vbool of bool | Vint of int | Vgpl of list generation_person | Vnldb of NotesLinks.notes_links_db | Vstring of string | Vsosa_ref of Lazy.t (option person) | Vsosa of ref (list (iper * option (Num.t * person))) | Vt_sosa of sosa_t | Vtitle of person and title_item | Vlazyp of ref (option string) | Vlazy of Lazy.t (env 'a) | Vother of 'a | Vnone ] and title_item = (int * gen_title_name istr * istr * list istr * list (option date * option date)) ; value get_env v env = try match List.assoc v env with [ Vlazy l -> Lazy.force l | x -> x ] with [ Not_found -> Vnone ] ; value get_vother = fun [ Vother x -> Some x | _ -> None ]; value set_vother x = Vother x; value not_impl func x = let desc = if Obj.is_block (Obj.repr x) then "tag = " ^ string_of_int (Obj.\tag (Obj.repr x)) else "int_val = " ^ string_of_int (Obj.magic x) in ">Perso." ^ func ^ ": not impl " ^ desc ^ "

      \n" ; value extract_var sini s = let len = String.length sini in if String.length s > len && String.sub s 0 (String.length sini) = sini then String.sub s len (String.length s - len) else "" ; value template_file = ref "perso.txt"; value warning_use_has_parents_before_parent (bp, ep) var r = IFDEF UNIX THEN do { Printf.eprintf "*** %s" template_file.val; Printf.eprintf ", chars %d-%d" bp ep; Printf.eprintf "\ : since v5.00, must test \"has_parents\" before using \"%s\"\n" var; flush stderr; r } ELSE r END ; value obsolete_list = ref []; value obsolete (bp, ep) version var new_var r = if List.mem var obsolete_list.val then r else IFDEF UNIX THEN do { Printf.eprintf "*** %s, chars %d-%d:" template_file.val bp ep; Printf.eprintf " \"%s\" obsolete since v%s%s\n" var version (if new_var = "" then "" else "; rather use \"" ^ new_var ^ "\""); flush stderr; obsolete_list.val := [var :: obsolete_list.val]; r } ELSE r END ; value bool_val x = VVbool x; value str_val x = VVstring x; value gen_string_of_img_sz max_wid max_hei conf base env (p, p_auth) = if p_auth then let v = image_and_size conf base p (limited_image_size max_wid max_hei) in match v with [ Some (_, _, Some (width, height)) -> Format.sprintf " width=\"%d\" height=\"%d\"" width height | Some (_, _, None) -> Format.sprintf " height=\"%d\"" max_hei | None -> "" ] else "" ; value string_of_image_size = gen_string_of_img_sz max_im_wid max_im_wid; value string_of_image_medium_size = gen_string_of_img_sz 160 120; value string_of_image_small_size = gen_string_of_img_sz 100 75; value get_sosa conf base env r p = try List.assoc (get_key_index p) r.val with [ Not_found -> do { let s = match get_env "sosa_ref" env with [ Vsosa_ref v -> match get_env "t_sosa" env with [ Vt_sosa t_sosa -> find_sosa conf base p v t_sosa | _ -> None ] | _ -> None ] in r.val := [(get_key_index p, s) :: r.val]; s } ] ; value make_ep conf base ip = let p = pget conf base ip in let p_auth = authorized_age conf base p in (p, p_auth) ; value make_efam conf base ip ifam = let fam = foi base ifam in let ifath = get_father fam in let imoth = get_mother fam in let ispouse = if ip = ifath then imoth else ifath in let cpl = (ifath, imoth, ispouse) in let m_auth = authorized_age conf base (pget conf base ifath) && authorized_age conf base (pget conf base imoth) in (fam, cpl, m_auth) ; value rec eval_var conf base env ep loc sl = try eval_simple_var conf base env ep sl with [ Not_found -> eval_compound_var conf base env ep loc sl ] and eval_simple_var conf base env ep = fun [ [s] -> try bool_val (eval_simple_bool_var conf base env ep s) with [ Not_found -> str_val (eval_simple_str_var conf base env ep s) ] | _ -> raise Not_found ] and eval_simple_bool_var conf base env (_, p_auth) = fun [ "are_divorced" -> match get_env "fam" env with [ Vfam _ fam _ _ -> match get_divorce fam with [ Divorced _ -> True | _ -> False ] | _ -> raise Not_found ] | "are_engaged" -> match get_env "fam" env with [ Vfam _ fam _ _ -> get_relation fam = Engaged | _ -> raise Not_found ] | "are_married" -> match get_env "fam" env with [ Vfam _ fam _ _ -> get_relation fam = Married || get_relation fam = NoSexesCheckMarried | _ -> raise Not_found ] | "are_not_married" -> match get_env "fam" env with [ Vfam _ fam _ _ -> get_relation fam = NotMarried || get_relation fam = NoSexesCheckNotMarried | _ -> raise Not_found ] | "are_separated" -> match get_env "fam" env with [ Vfam _ fam _ _ -> match get_divorce fam with [ Separated -> True | _ -> False ] | _ -> raise Not_found ] | "browsing_with_sosa_ref" -> match get_env "sosa_ref" env with [ Vsosa_ref v -> Lazy.force v <> None | _ -> raise Not_found ] | "has_comment" -> match get_env "fam" env with [ Vfam _ fam _ m_auth -> m_auth && not conf.no_note && sou base (get_comment fam) <> "" | _ -> raise Not_found ] | "has_relation_her" -> match get_env "rel" env with [ Vrel {r_moth = Some _} None -> True | _ -> False ] | "has_relation_him" -> match get_env "rel" env with [ Vrel {r_fath = Some _} None -> True | _ -> False ] | "has_witnesses" -> match get_env "fam" env with [ Vfam _ fam _ m_auth -> m_auth && Array.length (get_witnesses fam) > 0 | _ -> raise Not_found ] | "is_first" -> match get_env "first" env with [ Vbool x -> x | _ -> raise Not_found ] | "is_last" -> match get_env "last" env with [ Vbool x -> x | _ -> raise Not_found ] | "is_no_mention" -> match get_env "fam" env with [ Vfam _ fam _ _ -> get_relation fam = NoMention | _ -> raise Not_found ] | "is_no_sexes_check" -> match get_env "fam" env with [ Vfam _ fam _ _ -> get_relation fam = NoSexesCheckNotMarried || get_relation fam = NoSexesCheckMarried | _ -> raise Not_found ] | "is_self" -> get_env "pos" env = Vstring "self" | "is_sibling_after" -> get_env "pos" env = Vstring "next" | "is_sibling_before" -> get_env "pos" env = Vstring "prev" | "lazy_printed" -> match get_env "lazy_print" env with [ Vlazyp r -> r.val = None | _ -> raise Not_found ] | s -> let v = extract_var "file_exists_" s in if v <> "" then let v = code_varenv v in let s = Srcfile.source_file_name conf v in Sys.file_exists s else raise Not_found ] and eval_simple_str_var conf base env (_, p_auth) = fun [ "alias" -> match get_env "alias" env with [ Vstring s -> s | _ -> raise Not_found ] | "child_cnt" -> string_of_int_env "child_cnt" env | "comment" -> match get_env "fam" env with [ Vfam _ fam _ m_auth -> if m_auth && not conf.no_note then let s = sou base (get_comment fam) in let s = string_with_macros conf [] s in let lines = Wiki.html_of_tlsw conf s in let wi = {Wiki.wi_mode = "NOTES"; Wiki.wi_cancel_links = conf.cancel_links; Wiki.wi_file_path = Notes.file_path conf base; Wiki.wi_person_exists = person_exists conf base; Wiki.wi_always_show_link = conf.wizard || conf.friend} in let s = Wiki.syntax_links conf wi (String.concat "\n" lines) in if conf.pure_xhtml then Util.check_xhtml s else s else "" | _ -> raise Not_found ] | "count" -> match get_env "count" env with [ Vcnt c -> string_of_int c.val | _ -> "" ] | "divorce_date" -> match get_env "fam" env with [ Vfam _ fam (_, _, isp) m_auth -> match get_divorce fam with [ Divorced d -> let d = Adef.od_of_codate d in match d with [ Some d when m_auth -> match p_getenv conf.base_env "long_date" with [ Some "yes" -> " " ^ (Date.string_of_ondate conf d) ^ (Date.get_wday conf d) ^ "" | _ -> " " ^ Date.string_of_ondate conf d ^ "" ] | _ -> "" ] | _ -> raise Not_found ] | _ -> raise Not_found ] | "slash_divorce_date" -> match get_env "fam" env with [ Vfam _ fam (_, _, isp) m_auth -> match get_divorce fam with [ Divorced d -> let d = Adef.od_of_codate d in match d with [ Some d when m_auth -> Date.string_slash_of_date conf d | _ -> "" ] | _ -> raise Not_found ] | _ -> raise Not_found ] | "empty_sorted_list" -> match get_env "list" env with [ Vslist l -> do { l.val := SortedList.empty; "" } | _ -> raise Not_found ] | "family_cnt" -> string_of_int_env "family_cnt" env | "first_name_alias" -> match get_env "first_name_alias" env with [ Vstring s -> s | _ -> "" ] | "incr_count" -> match get_env "count" env with [ Vcnt c -> do { incr c; "" } | _ -> "" ] | "lazy_force" -> match get_env "lazy_print" env with [ Vlazyp r -> match r.val with [ Some s -> do { r.val := None; s } | None -> "" ] | _ -> raise Not_found ] | "level" -> match get_env "level" env with [ Vint i -> string_of_int i | _ -> "" ] | "marriage_place" -> match get_env "fam" env with [ Vfam _ fam _ m_auth -> if m_auth then Util.string_of_place conf (sou base (get_marriage_place fam)) else "" | _ -> raise Not_found ] | "max_anc_level" -> match get_env "max_anc_level" env with [ Vint i -> string_of_int i | _ -> "" ] | "max_cous_level" -> match get_env "max_cous_level" env with [ Vint i -> string_of_int i | _ -> "" ] | "max_desc_level" -> match get_env "max_desc_level" env with [ Vint i -> string_of_int i | _ -> "" ] | "nobility_title" -> match get_env "nobility_title" env with [ Vtitle p t -> if p_auth then string_of_title conf base (transl_nth conf "and" 0) p t else "" | _ -> raise Not_found ] | "number_of_subitems" -> match get_env "item" env with [ Vslistlm [[s :: _] :: sll] -> let n = loop 1 sll where rec loop n = fun [ [[s1 :: _] :: sll] -> if s = s1 then loop (n + 1) sll else n | _ -> n ] in string_of_int n | _ -> raise Not_found ] | "on_marriage_date" -> match get_env "fam" env with [ Vfam _ fam _ m_auth -> match (m_auth, Adef.od_of_codate (get_marriage fam)) with [ (True, Some s) -> match p_getenv conf.base_env "long_date" with [ Some "yes" -> (Date.string_of_ondate conf s) ^ (Date.get_wday conf s) | _ -> Date.string_of_ondate conf s ] | _ -> "" ] | _ -> raise Not_found ] | "slash_marriage_date" -> match get_env "fam" env with [ Vfam _ fam _ m_auth -> match (m_auth, Adef.od_of_codate (get_marriage fam)) with [ (True, Some s) -> Date.string_slash_of_date conf s | _ -> "" ] | _ -> raise Not_found ] | "origin_file" -> if conf.wizard then match get_env "fam" env with [ Vfam _ fam _ _ -> sou base (get_origin_file fam) | _ -> "" ] else raise Not_found | "qualifier" -> match get_env "qualifier" env with [ Vstring nn -> nn | _ -> raise Not_found ] | "related_type" -> match get_env "rel" env with [ Vrel r (Some c) -> rchild_type_text conf r.r_type (index_of_sex (get_sex c)) | _ -> raise Not_found ] | "relation_type" -> match get_env "rel" env with [ Vrel r None -> match (r.r_fath, r.r_moth) with [ (Some ip, None) -> relation_type_text conf r.r_type 0 | (None, Some ip) -> relation_type_text conf r.r_type 1 | (Some ip1, Some ip2) -> relation_type_text conf r.r_type 2 | _ -> raise Not_found ] | _ -> raise Not_found ] | "reset_count" -> match get_env "count" env with [ Vcnt c -> do { c.val := 0; "" } | _ -> "" ] | "reset_desc_level" -> let flevt_save = match get_env "desc_level_table_save" env with [ Vdesclevtab levt -> let (_, flevt) = Lazy.force levt in flevt | _ -> raise Not_found ] in match get_env "desc_level_table" env with [ Vdesclevtab levt -> do { let (_, flevt) = Lazy.force levt in for i = 0 to Array.length flevt - 1 do { flevt.(i) := flevt_save.(i); }; "" } | _ -> raise Not_found ] | "source_type" -> match get_env "src_typ" env with [ Vstring s -> s | _ -> raise Not_found ] | "surname_alias" -> match get_env "surname_alias" env with [ Vstring s -> s | _ -> raise Not_found ] | s -> loop [("evar_", fun v -> match p_getenv (conf.env @ conf.henv) v with [ Some vv -> quote_escaped vv | None -> "" ]); (* warning: "cvar_" deprecated since 5.00; use "bvar." *) ("cvar_", fun v -> try List.assoc v conf.base_env with [ Not_found -> "" ])] where rec loop = fun [ [(pfx, f) :: pfx_list] -> let v = extract_var pfx s in if v <> "" then f v else loop pfx_list | [] -> raise Not_found ] ] and eval_compound_var conf base env ((a, _) as ep) loc = fun [ ["ancestor" :: sl] -> match get_env "ancestor" env with [ Vanc gp -> eval_ancestor_field_var conf base env gp loc sl | Vanc_surn info -> eval_anc_by_surnl_field_var conf base env ep info sl | _ -> raise Not_found ] | ["base"; "name"] -> VVstring conf.bname | ["base"; "nb_persons"] -> VVstring (string_of_num (Util.transl conf "(thousand separator)") (Num.of_int (nb_of_persons base))) | ["cell" :: sl] -> match get_env "cell" env with [ Vcell cell -> eval_cell_field_var conf base env ep cell loc sl | _ -> raise Not_found ] | ["child" :: sl] -> match get_env "child" env with [ Vind p -> let auth = authorized_age conf base p in let ep = (p, auth) in eval_person_field_var conf base env ep loc sl | _ -> raise Not_found ] | ["enclosing" :: sl] -> let rec loop = fun [ [("#loop", _) :: env] -> eval_person_field_var conf base env ep loc sl | [_ :: env] -> loop env | [] -> raise Not_found ] in loop env | ["family" :: sl] -> match get_env "fam" env with [ Vfam i f c m -> eval_family_field_var conf base env (i, f, c, m) loc sl | _ -> raise Not_found ] | ["father" :: sl] -> match get_parents a with [ Some ifam -> let cpl = foi base ifam in let ep = make_ep conf base (get_father cpl) in eval_person_field_var conf base env ep loc sl | None -> warning_use_has_parents_before_parent loc "father" (str_val "") ] | ["item" :: sl] -> match get_env "item" env with [ Vslistlm ell -> eval_item_field_var env ell sl | _ -> raise Not_found ] | ["mother" :: sl] -> match get_parents a with [ Some ifam -> let cpl = foi base ifam in let ep = make_ep conf base (get_mother cpl) in eval_person_field_var conf base env ep loc sl | None -> warning_use_has_parents_before_parent loc "mother" (str_val "") ] | ["next_item" :: sl] -> match get_env "item" env with [ Vslistlm [_ :: ell] -> eval_item_field_var env ell sl | _ -> raise Not_found ] | ["number_of_ancestors" :: sl] -> match get_env "n" env with [ Vint n -> VVstring (eval_num conf (Num.of_int (n - 1)) sl) | _ -> raise Not_found ] | ["number_of_descendants" :: sl] -> match get_env "level" env with [ Vint i -> match get_env "desc_level_table" env with [ Vdesclevtab t -> let cnt = Array.fold_left (fun cnt v -> if v <= i then cnt + 1 else cnt) 0 (fst (Lazy.force t)) in VVstring (eval_num conf (Num.of_int (cnt - 1)) sl) | _ -> raise Not_found ] | _ -> raise Not_found ] | ["parent" :: sl] -> match get_env "parent" env with [ Vind p -> let ep = (p, authorized_age conf base p) in eval_person_field_var conf base env ep loc sl | _ -> raise Not_found ] | ["prev_item" :: sl] -> match get_env "prev_item" env with [ Vslistlm ell -> eval_item_field_var env ell sl | _ -> raise Not_found ] | ["prev_family" :: sl] -> match get_env "prev_fam" env with [ Vfam i f c m -> eval_family_field_var conf base env (i, f, c, m) loc sl | _ -> raise Not_found ] | ["pvar"; v :: sl] -> match find_person_in_env conf base v with [ Some p -> let ep = make_ep conf base (get_key_index p) in eval_person_field_var conf base env ep loc sl | None -> raise Not_found ] | ["related" :: sl] -> match get_env "rel" env with [ Vrel {r_type = rt} (Some p) -> eval_relation_field_var conf base env (index_of_sex (get_sex p), rt, get_key_index p, False) loc sl | _ -> raise Not_found ] | ["relation_her" :: sl] -> match get_env "rel" env with [ Vrel {r_moth = Some ip; r_type = rt} None -> eval_relation_field_var conf base env (1, rt, ip, True) loc sl | _ -> raise Not_found ] | ["relation_him" :: sl] -> match get_env "rel" env with [ Vrel {r_fath = Some ip; r_type = rt} None -> eval_relation_field_var conf base env (0, rt, ip, True) loc sl | _ -> raise Not_found ] | ["self" :: sl] -> eval_person_field_var conf base env ep loc sl | ["sosa_ref" :: sl] -> match get_env "sosa_ref" env with [ Vsosa_ref v -> match Lazy.force v with [ Some p -> let ep = make_ep conf base (get_key_index p) in eval_person_field_var conf base env ep loc sl | None -> raise Not_found ] | _ -> raise Not_found ] | ["spouse" :: sl] -> match get_env "fam" env with [ Vfam _ _ (_, _, ip) _ -> let ep = make_ep conf base ip in eval_person_field_var conf base env ep loc sl | _ -> raise Not_found ] | ["witness" :: sl] -> match get_env "witness" env with [ Vind p -> let ep = (p, authorized_age conf base p) in eval_person_field_var conf base env ep loc sl | _ -> raise Not_found ] | ["witness_relation" :: sl] -> match get_env "fam" env with [ Vfam i f c m -> eval_witness_relation_var conf base env (i, f, c, m) loc sl | _ -> raise Not_found ] | sl -> eval_person_field_var conf base env ep loc sl ] and eval_item_field_var env ell = fun [ [s] -> try match ell with [ [el :: _] -> let v = int_of_string s in let r = try List.nth el (v - 1) with [ Failure _ -> "" ] in VVstring r | [] -> VVstring "" ] with [ Failure _ -> raise Not_found ] | _ -> raise Not_found ] and eval_relation_field_var conf base env (i, rt, ip, is_relation) loc = fun [ ["type"] -> if is_relation then VVstring (relation_type_text conf rt i) else VVstring (rchild_type_text conf rt i) | sl -> let ep = make_ep conf base ip in eval_person_field_var conf base env ep loc sl ] and eval_cell_field_var conf base env ep cell loc = fun [ ["colspan"] -> match cell with [ Empty -> VVstring "1" | Cell _ _ _ _ s -> VVstring (string_of_int s) ] | ["family" :: sl] -> match cell with [ Cell p (Some ifam) _ _ _ -> let (f, c, a) = make_efam conf base (get_key_index p) ifam in eval_family_field_var conf base env (ifam, f, c, a) loc sl | _ -> VVstring "" ] | ["is_center"] -> match cell with [ Cell _ _ Center _ _ -> VVbool True | _ -> VVbool False ] | ["is_empty"] -> match cell with [ Empty -> VVbool True | _ -> VVbool False ] | ["is_left"] -> match cell with [ Cell _ _ Left _ _ -> VVbool True | _ -> VVbool False ] | ["is_right"] -> match cell with [ Cell _ _ Right _ _ -> VVbool True | _ -> VVbool False ] | ["is_top"] -> match cell with [ Cell _ _ _ False _ -> VVbool True | _ -> VVbool False ] | ["person" :: sl] -> match cell with [ Cell p _ _ _ _ -> let ep = make_ep conf base (get_key_index p) in eval_person_field_var conf base env ep loc sl | _ -> raise Not_found ] | _ -> raise Not_found ] and eval_ancestor_field_var conf base env gp loc = fun [ ["family" :: sl] -> match gp with [ GP_person _ ip (Some ifam) -> let f = foi base ifam in let ifath = get_father f in let imoth = get_mother f in let ispouse = if ip = ifath then imoth else ifath in let c = (ifath, imoth, ispouse) in let m_auth = authorized_age conf base (pget conf base ifath) && authorized_age conf base (pget conf base imoth) in eval_family_field_var conf base env (ifam, f, c, m_auth) loc sl | _ -> raise Not_found ] | ["father" :: sl] -> match gp with [ GP_person _ ip _ -> match (get_parents (pget conf base ip), get_env "all_gp" env) with [ (Some ifam, Vallgp all_gp) -> let cpl = foi base ifam in match get_link all_gp (get_father cpl) with [ Some gp -> eval_ancestor_field_var conf base env gp loc sl | None -> let ep = make_ep conf base (get_father cpl) in eval_person_field_var conf base env ep loc sl ] | (_, _) -> raise Not_found ] | GP_same _ _ ip -> match get_parents (pget conf base ip) with [ Some ifam -> let cpl = foi base ifam in let ep = make_ep conf base (get_father cpl) in eval_person_field_var conf base env ep loc sl | _ -> raise Not_found ] | _ -> raise Not_found ] | ["father_sosa"] -> match (gp, get_env "all_gp" env) with [ (GP_person n ip _ | GP_same n _ ip, Vallgp all_gp) -> let n = Num.twice n in VVstring (parent_sosa conf base ip all_gp n get_father) | _ -> VVstring "" ] | ["interval"] -> match gp with [ GP_interv (Some (n1, n2, Some (n3, n4))) -> let n2 = Num.sub n2 Num.one in let n4 = Num.sub n4 Num.one in let sep = transl conf "(thousand separator)" in let r = Num.to_string_sep sep n1 ^ "-" ^ Num.to_string_sep sep n2 ^ " = " ^ Num.to_string_sep sep n3 ^ "-" ^ Num.to_string_sep sep n4 in VVstring r | GP_interv (Some (n1, n2, None)) -> let n2 = Num.sub n2 Num.one in let sep = transl conf "(thousand separator)" in let r = Num.to_string_sep sep n1 ^ "-" ^ Num.to_string_sep sep n2 ^ " = ..." in VVstring r | GP_interv None -> VVstring "..." | _ -> VVstring "" ] | ["mother_sosa"] -> match (gp, get_env "all_gp" env) with [ (GP_person n ip _ | GP_same n _ ip, Vallgp all_gp) -> let n = Num.inc (Num.twice n) 1 in VVstring (parent_sosa conf base ip all_gp n get_mother) | _ -> VVstring "" ] | ["same" :: sl] -> match gp with [ GP_same _ n _ -> VVstring (eval_num conf n sl) | _ -> VVstring "" ] | ["anc_sosa" :: sl] -> match gp with [ GP_person n _ _ | GP_same n _ _ -> VVstring (eval_num conf n sl) | _ -> VVstring "" ] | ["spouse" :: sl] -> match gp with [ GP_person _ ip (Some ifam) -> let ip = Gutil.spouse ip (foi base ifam) in let ep = make_ep conf base ip in eval_person_field_var conf base env ep loc sl | _ -> raise Not_found ] | sl -> match gp with [ GP_person _ ip _ | GP_same _ _ ip -> let ep = make_ep conf base ip in eval_person_field_var conf base env ep loc sl | _ -> raise Not_found ] ] and eval_anc_by_surnl_field_var conf base env ep info = match info with [ Branch (s, db, de, place, p, sosa_list, loc) -> fun [ ["date_begin" :: sl] -> match db with [ Some d -> eval_date_field_var conf d sl | None -> VVstring "" ] | ["date_end" :: sl] -> match de with [ Some d -> eval_date_field_var conf d sl | None -> VVstring "" ] | ["nb_times"] -> VVstring (string_of_int (List.length sosa_list)) | ["place"] -> VVstring (Util.string_of_place conf place) | ["sosa_access"] -> let (str, _) = List.fold_right (fun sosa (str, n) -> let str = str ^ ";s" ^ string_of_int n ^ "=" ^ Num.to_string sosa in (str, n + 1)) sosa_list ("", 1) in let (p, _) = ep in VVstring (acces_n conf base "1" p ^ str) | sl -> let ep = make_ep conf base (get_key_index p) in eval_person_field_var conf base env ep loc sl ] | Eclair (s, place, db, de, p, persl, loc) -> fun [ ["date_begin" :: sl] -> match db with [ Some d -> eval_date_field_var conf d sl | None -> VVstring "" ] | ["date_end" :: sl] -> match de with [ Some d -> eval_date_field_var conf d sl | None -> VVstring "" ] | ["nb_events"] -> VVstring (string_of_int (List.length persl)) | ["nb_ind"] -> let list = IperSet.elements (List.fold_right IperSet.add persl IperSet.empty) in VVstring (string_of_int (List.length list)) | ["place"] -> VVstring place | sl -> let ep = make_ep conf base (get_key_index p) in eval_person_field_var conf base env ep loc sl ] ] and eval_num conf n = fun [ ["hexa"] -> "0x" ^ Num.to_string_sep_base "" 16 n | ["octal"] -> "0o" ^ Num.to_string_sep_base "" 8 n | ["v"] -> Num.to_string n | [] -> Num.to_string_sep (transl conf "(thousand separator)") n | _ -> raise Not_found ] and eval_person_field_var conf base env ((p, p_auth) as ep) loc = fun [ ["baptism_date" :: sl] -> match Adef.od_of_codate (get_baptism p) with [ Some d when p_auth -> eval_date_field_var conf d sl | _ -> VVstring "" ] | ["birth_date" :: sl] -> match Adef.od_of_codate (get_birth p) with [ Some d when p_auth -> eval_date_field_var conf d sl | _ -> VVstring "" ] | ["burial_date" :: sl] -> match get_burial p with [ Buried cod when p_auth -> match Adef.od_of_codate cod with [ Some d -> eval_date_field_var conf d sl | None -> VVstring "" ] | _ -> VVstring "" ] | ["cremated_date" :: sl] -> match get_burial p with [ Cremated cod when p_auth -> match Adef.od_of_codate cod with [ Some d -> eval_date_field_var conf d sl | None -> VVstring "" ] | _ -> VVstring "" ] | ["death_date" :: sl] -> match get_death p with [ Death _ cd when p_auth -> eval_date_field_var conf (Adef.date_of_cdate cd) sl | _ -> VVstring "" ] | ["father" :: sl] -> match get_parents p with [ Some ifam -> let cpl = foi base ifam in let ep = make_ep conf base (get_father cpl) in eval_person_field_var conf base env ep loc sl | None -> warning_use_has_parents_before_parent loc "father" (str_val "") ] | ["has_linked_page"; s] -> match get_env "nldb" env with [ Vnldb db -> let key = let fn = Name.lower (sou base (get_first_name p)) in let sn = Name.lower (sou base (get_surname p)) in (fn, sn, get_occ p) in let r = List.exists (fun (pg, (_, il)) -> match pg with [ NotesLinks.PgMisc pg -> if List.mem_assoc key il then let (nenv, _) = Notes.read_notes base pg in List.mem_assoc s nenv else False | _ -> False ]) db in VVbool r | _ -> raise Not_found ] | ["has_linked_pages"] -> match get_env "nldb" env with [ Vnldb db -> let r = if p_auth then let key = let fn = Name.lower (sou base (get_first_name p)) in let sn = Name.lower (sou base (get_surname p)) in (fn, sn, get_occ p) in links_to_ind conf base db key <> [] else False in VVbool r | _ -> raise Not_found ] | ["has_sosa"] -> match get_env "sosa" env with [ Vsosa r -> VVbool (get_sosa conf base env r p <> None) | _ -> VVbool False ] | ["linked_page"; s] -> match get_env "nldb" env with [ Vnldb db -> let key = let fn = Name.lower (sou base (get_first_name p)) in let sn = Name.lower (sou base (get_surname p)) in (fn, sn, get_occ p) in let s = List.fold_left (linked_page_text conf base p s key) "" db in VVstring s | _ -> raise Not_found ] | ["marriage_date" :: sl] -> match get_env "fam" env with [ Vfam _ fam _ True -> match Adef.od_of_codate (get_marriage fam) with [ Some d -> eval_date_field_var conf d sl | None -> VVstring "" ] | _ -> raise Not_found ] | ["mother" :: sl] -> match get_parents p with [ Some ifam -> let cpl = foi base ifam in let ep = make_ep conf base (get_mother cpl) in eval_person_field_var conf base env ep loc sl | None -> warning_use_has_parents_before_parent loc "mother" (str_val "") ] | ["nobility_title" :: sl] -> match Util.main_title conf base p with [ Some t when p_auth -> let id = sou base t.t_ident in let pl = sou base t.t_place in eval_nobility_title_field_var (id, pl) sl | _ -> VVstring "" ] | ["self" :: sl] -> eval_person_field_var conf base env ep loc sl | ["sosa" :: sl] -> match get_env "sosa" env with [ Vsosa x -> match get_sosa conf base env x p with [ Some (n, p) -> VVstring (eval_num conf n sl) | None -> VVstring "" ] | _ -> raise Not_found ] | ["spouse" :: sl] -> match get_env "fam" env with [ Vfam ifam fam _ _ -> let cpl = foi base ifam in let ip = Gutil.spouse (get_key_index p) cpl in let ep = make_ep conf base ip in eval_person_field_var conf base env ep loc sl | _ -> raise Not_found ] | ["var"] -> VVother (eval_person_field_var conf base env ep loc) | [s] -> try bool_val (eval_bool_person_field conf base env ep s) with [ Not_found -> try str_val (eval_str_person_field conf base env ep s) with [ Not_found -> obsolete_eval conf base env ep loc s ] ] | [] -> str_val (simple_person_text conf base p p_auth) | _ -> raise Not_found ] and eval_date_field_var conf d = fun [ ["prec"] -> match d with [ Dgreg dmy _ -> VVstring (quote_escaped (Date.prec_text conf dmy)) | _ -> VVstring "" ] | ["day"] -> match d with [ Dgreg dmy _ -> VVstring (Date.day_text dmy) | _ -> VVstring "" ] | ["month"] -> match d with [ Dgreg dmy _ -> VVstring (Date.month_text dmy) | _ -> VVstring "" ] | ["year"] -> match d with [ Dgreg dmy _ -> VVstring (Date.year_text dmy) | _ -> VVstring "" ] | _ -> raise Not_found ] and eval_nobility_title_field_var (id, pl) = fun [ ["ident_key"] -> VVstring (code_varenv id) | ["place_key"] -> VVstring (code_varenv pl) | [] -> VVstring (if pl = "" then id else id ^ " " ^ pl) | _ -> raise Not_found ] and eval_bool_person_field conf base env (p, p_auth) = fun [ "access_by_key" -> Util.accessible_by_key conf base p (p_first_name base p) (p_surname base p) | "birthday" -> match (p_auth, Adef.od_of_codate (get_birth p)) with [ (True, Some (Dgreg d _)) -> if d.prec = Sure && get_death p = NotDead then d.day = conf.today.day && d.month = conf.today.month && d.year < conf.today.year || not (CheckItem.leap_year conf.today.year) && d.day = 29 && d.month = 2 && conf.today.day = 1 && conf.today.month = 3 else False | _ -> False ] | "wedding_birthday" -> match get_env "fam" env with [ Vfam _ fam _ m_auth -> match (get_relation fam, get_divorce fam) with [ (Married | NoSexesCheckMarried, NotDivorced) -> match (m_auth, Adef.od_of_codate (get_marriage fam)) with [ (True, Some (Dgreg d _)) -> let father = pget conf base (get_father fam) in let mother = pget conf base (get_mother fam) in if d.prec = Sure && authorized_age conf base father && get_death father = NotDead && authorized_age conf base mother && get_death mother = NotDead then (d.day = conf.today.day && d.month = conf.today.month && d.year < conf.today.year) || (not (CheckItem.leap_year conf.today.year) && d.day = 29 && d.month = 2 && conf.today.day = 1 && conf.today.month = 3) else False | _ -> False ] | _ -> False ] | _ -> False ] | "computable_age" -> if p_auth then match (Adef.od_of_codate (get_birth p), get_death p) with [ (Some (Dgreg d _), NotDead) -> not (d.day = 0 && d.month = 0 && d.prec <> Sure) | _ -> False ] else False | "computable_death_age" -> if p_auth then match Date.get_birth_death_date p with [ (Some (Dgreg ({prec = Sure | About | Maybe} as d1) _), Some (Dgreg ({prec = Sure | About | Maybe} as d2) _), approx) when d1 <> d2 -> let a = CheckItem.time_elapsed d1 d2 in a.year > 0 || a.year = 0 && (a.month > 0 || a.month = 0 && a.day > 0) | _ -> False ] else False | "computable_marriage_age" -> match get_env "fam" env with [ Vfam _ fam _ m_auth -> if m_auth then match (Adef.od_of_codate (get_birth p), Adef.od_of_codate (get_marriage fam)) with [ (Some (Dgreg ({prec = Sure | About | Maybe} as d1) _), Some (Dgreg ({prec = Sure | About | Maybe} as d2) _)) -> let a = CheckItem.time_elapsed d1 d2 in (a.year > 0 || a.year = 0 && (a.month > 0 || a.month = 0 && a.day > 0)) | _ -> False ] else False | _ -> raise Not_found ] | "has_aliases" -> if not p_auth && (is_hide_names conf p) then False else get_aliases p <> [] | "has_baptism_date" -> p_auth && get_baptism p <> Adef.codate_None | "has_baptism_place" -> p_auth && sou base (get_baptism_place p) <> "" | "has_birth_date" -> p_auth && get_birth p <> Adef.codate_None | "has_birth_place" -> p_auth && sou base (get_birth_place p) <> "" | "has_burial_date" -> if p_auth then match get_burial p with [ Buried cod -> Adef.od_of_codate cod <> None | _ -> False ] else False | "has_burial_place" -> p_auth && sou base (get_burial_place p) <> "" | "has_children" -> match get_env "fam" env with [ Vfam _ fam _ _ -> Array.length (get_children fam) > 0 | _ -> List.exists (fun ifam -> let des = foi base ifam in Array.length (get_children des) > 0) (Array.to_list (get_family p)) ] | "has_consanguinity" -> p_auth && get_consang p != Adef.fix (-1) && get_consang p >= Adef.fix_of_float 0.0001 | "has_cremation_date" -> if p_auth then match get_burial p with [ Cremated cod -> Adef.od_of_codate cod <> None | _ -> False ] else False | "has_cremation_place" -> p_auth && sou base (get_burial_place p) <> "" | "has_death_date" -> match get_death p with [ Death _ _ -> p_auth | _ -> False ] | "has_death_place" -> p_auth && sou base (get_death_place p) <> "" | "has_families" -> Array.length (get_family p) > 0 | "has_first_names_aliases" -> if not p_auth && (is_hide_names conf p) then False else get_first_names_aliases p <> [] | "has_history" -> let fn = sou base (get_first_name p) in let sn = sou base (get_surname p) in let occ = get_occ p in let person_file = History_diff.history_file fn sn occ in p_auth && (Sys.file_exists (History_diff.history_path conf person_file)) | "has_image" -> Util.has_image conf base p | "has_nephews_or_nieces" -> has_nephews_or_nieces conf base p | "has_nobility_titles" -> p_auth && nobtit conf base p <> [] | "has_notes" -> p_auth && not conf.no_note && sou base (get_notes p) <> "" | "has_occupation" -> p_auth && sou base (get_occupation p) <> "" | "has_parents" -> get_parents p <> None | "has_possible_duplications" -> has_possible_duplications conf base p | "has_public_name" -> if not p_auth && (is_hide_names conf p) then False else sou base (get_public_name p) <> "" | "has_qualifiers" -> if not p_auth && (is_hide_names conf p) then False else get_qualifiers p <> [] | "has_relations" -> if p_auth && conf.use_restrict then let related = List.fold_left (fun l ip -> let rp = pget conf base ip in if is_hidden rp then l else [ip :: l]) [] (get_related p) in get_rparents p <> [] || related <> [] else p_auth && (get_rparents p <> [] || get_related p <> []) | "has_siblings" -> match get_parents p with [ Some ifam -> Array.length (get_children (foi base ifam)) > 1 | None -> False ] | "has_sources" -> p_auth && (sou base (get_psources p) <> "" || sou base (get_birth_src p) <> "" || sou base (get_baptism_src p) <> "" || sou base (get_death_src p) <> "" || sou base (get_burial_src p) <> "" || List.exists (fun ifam -> let fam = foi base ifam in let isp = Gutil.spouse (get_key_index p) fam in let sp = poi base isp in (* On sait que p_auth vaut vrai. *) let m_auth = authorized_age conf base sp in m_auth && (sou base (get_marriage_src fam) <> "" || sou base (get_fsources fam) <> "")) (Array.to_list (get_family p))) | "has_surnames_aliases" -> if not p_auth && (is_hide_names conf p) then False else get_surnames_aliases p <> [] | "is_buried" -> match get_burial p with [ Buried _ -> p_auth | _ -> False ] | "is_cremated" -> match get_burial p with [ Cremated _ -> p_auth | _ -> False ] | "is_dead" -> match get_death p with [ Death _ _ | DeadYoung | DeadDontKnowWhen -> p_auth | _ -> False ] | "is_descendant" -> match get_env "desc_mark" env with [ Vdmark r -> r.val.(Adef.int_of_iper (get_key_index p)) | _ -> raise Not_found ] | "is_female" -> get_sex p = Female | "is_invisible" -> let conf = {(conf) with wizard = False; friend = False} in not (authorized_age conf base p) | "is_male" -> get_sex p = Male | "is_private" -> get_access p = Private | "is_public" -> get_access p = Public | "is_restricted" -> is_hidden p | _ -> raise Not_found ] and eval_str_person_field conf base env ((p, p_auth) as ep) = fun [ "access" -> acces conf base p | "age" -> match (p_auth, Adef.od_of_codate (get_birth p), get_death p) with [ (True, Some (Dgreg d _), NotDead) -> let a = CheckItem.time_elapsed d conf.today in Date.string_of_age conf a | _ -> "" ] | "alias" -> match get_aliases p with [ [nn :: _] -> if not p_auth && (is_hide_names conf p) then "" else sou base nn | _ -> "" ] | "auto_image_file_name" -> match auto_image_file conf base p with [ Some s when p_auth -> s | _ -> "" ] | "birth_place" -> if p_auth then Util.string_of_place conf (sou base (get_birth_place p)) else "" | "baptism_place" -> if p_auth then Util.string_of_place conf (sou base (get_baptism_place p)) else "" | "burial_place" -> if p_auth then Util.string_of_place conf (sou base(get_burial_place p)) else "" | "child_name" -> let force_surname = match get_parents p with [ None -> False | Some ifam -> p_surname base (pget conf base (get_father (foi base ifam))) <> p_surname base p ] in if not p_auth && (is_hide_names conf p) then "x x" else if force_surname then person_text conf base p else person_text_no_surn_no_acc_chk conf base p | "consanguinity" -> if p_auth then string_of_decimal_num conf (round_2_dec (Adef.float_of_fix (get_consang p) *. 100.0)) ^ "%" else "" | "cremation_place" -> if p_auth then Util.string_of_place conf (sou base (get_burial_place p)) else "" | "dates" -> if p_auth then Date.short_dates_text conf base p else "" | "death_age" -> if p_auth then match Date.get_birth_death_date p with [ (Some (Dgreg ({prec = Sure | About | Maybe} as d1) _), Some (Dgreg ({prec = Sure | About | Maybe} as d2) _), approx) when d1 <> d2 -> let a = CheckItem.time_elapsed d1 d2 in let s = if not approx && d1.prec = Sure && d2.prec = Sure then "" else transl_decline conf "possibly (date)" "" ^ " " in s ^ Date.string_of_age conf a | _ -> "" ] else "" | "death_place" -> if p_auth then Util.string_of_place conf (sou base (get_death_place p)) else "" | "died" -> string_of_died conf base env p p_auth | "fam_access" -> (* deprecated since 5.00: rather use "i=%family.index;;ip=%index;" *) match get_env "fam" env with [ Vfam ifam _ _ _ -> Printf.sprintf "i=%d;ip=%d" (Adef.int_of_ifam ifam) (Adef.int_of_iper (get_key_index p)) | _ -> raise Not_found ] | "father_age_at_birth" -> string_of_parent_age conf base ep get_father | "first_name" -> if not p_auth && (is_hide_names conf p) then "x" else p_first_name base p | "first_name_key" -> if (is_hide_names conf p) && not p_auth then "" else code_varenv (Name.lower (p_first_name base p)) | "first_name_key_val" -> if (is_hide_names conf p) && not p_auth then "" else Name.lower (p_first_name base p) | "first_name_key_strip" -> if (is_hide_names conf p) && not p_auth then "" else Name.strip_c (p_first_name base p) '"' | "history_file" -> if not p_auth then "" else let fn = sou base (get_first_name p) in let sn = sou base (get_surname p) in let occ = get_occ p in History_diff.history_file fn sn occ | "image" -> if not p_auth then "" else sou base (get_image p) | "image_html_url" -> string_of_image_url conf base env ep True | "image_size" -> string_of_image_size conf base env ep | "image_medium_size" -> string_of_image_medium_size conf base env ep | "image_small_size" -> string_of_image_small_size conf base env ep | "image_url" -> string_of_image_url conf base env ep False | "ind_access" -> (* deprecated since 5.00: rather use "i=%index;" *) "i=" ^ string_of_int (Adef.int_of_iper (get_key_index p)) | "index" -> string_of_int (Adef.int_of_iper (get_key_index p)) | "mark_descendants" -> match get_env "desc_mark" env with [ Vdmark r -> let tab = Array.make (nb_of_persons base) False in let rec mark_descendants len p = let i = Adef.int_of_iper (get_key_index p) in if tab.(i) then () else do { tab.(i) := True; let u = p in for i = 0 to Array.length (get_family u) - 1 do { let des = foi base (get_family u).(i) in for i = 0 to Array.length (get_children des) - 1 do { mark_descendants (len + 1) (pget conf base (get_children des).(i)) } } } in do { mark_descendants 0 p; r.val := tab; ""; } | _ -> raise Not_found ] | "marriage_age" -> match get_env "fam" env with [ Vfam _ fam _ m_auth -> if m_auth then match (Adef.od_of_codate (get_birth p), Adef.od_of_codate (get_marriage fam)) with [ (Some (Dgreg ({prec = Sure | About | Maybe} as d1) _), Some (Dgreg ({prec = Sure | About | Maybe} as d2) _)) -> let a = CheckItem.time_elapsed d1 d2 in Date.string_of_age conf a | _ -> "" ] else "" | _ -> raise Not_found ] | "mother_age_at_birth" -> string_of_parent_age conf base ep get_mother | "misc_names" -> if p_auth then let list = Gwdb.person_misc_names base p (Util.nobtit conf base) in let list = let first_name = p_first_name base p in let surname = p_surname base p in if first_name <> "?" && surname <> "?" then [Name.lower (first_name ^ " " ^ surname) :: list] else list in if list <> [] then "

        \n" ^ List.fold_left (fun s n -> s ^ "
      • " ^ n ^ "
      • \n") "" list ^ "
      \n" else "" else "" | "nb_children" -> match get_env "fam" env with [ Vfam _ fam _ _ -> string_of_int (Array.length (get_children fam)) | _ -> let n = List.fold_left (fun n ifam -> n + Array.length (get_children (foi base ifam))) 0 (Array.to_list (get_family p)) in string_of_int n ] | "nb_families" -> string_of_int (Array.length (get_family p)) | "notes" -> if p_auth && not conf.no_note then let env = [('i', fun () -> Util.default_image_name base p)] in let s = sou base (get_notes p) in let s = string_with_macros conf env s in let lines = Wiki.html_of_tlsw conf s in let wi = {Wiki.wi_mode = "NOTES"; Wiki.wi_cancel_links = conf.cancel_links; Wiki.wi_file_path = Notes.file_path conf base; Wiki.wi_person_exists = person_exists conf base; Wiki.wi_always_show_link = conf.wizard || conf.friend} in let s = Wiki.syntax_links conf wi (String.concat "\n" lines) in if conf.pure_xhtml then Util.check_xhtml s else s else "" | "occ" -> if (is_hide_names conf p) && not p_auth then "" else string_of_int (get_occ p) | "occupation" -> if p_auth then let s = sou base (get_occupation p) in let s = let wi = {Wiki.wi_mode = "NOTES"; Wiki.wi_cancel_links = conf.cancel_links; Wiki.wi_file_path = Notes.file_path conf base; Wiki.wi_person_exists = person_exists conf base; Wiki.wi_always_show_link = conf.wizard || conf.friend} in Wiki.syntax_links conf wi s in string_with_macros conf [] s else "" | "on_baptism_date" -> match (p_auth, Adef.od_of_codate (get_baptism p)) with [ (True, Some d) -> match p_getenv conf.base_env "long_date" with [ Some "yes" -> (Date.string_of_ondate conf d) ^ (Date.get_wday conf d) | _ -> Date.string_of_ondate conf d ] | _ -> "" ] | "slash_baptism_date" -> match (p_auth, Adef.od_of_codate (get_baptism p)) with [ (True, Some d) -> Date.string_slash_of_date conf d | _ -> "" ] | "on_birth_date" -> match (p_auth, Adef.od_of_codate (get_birth p)) with [ (True, Some d) -> match p_getenv conf.base_env "long_date" with [ Some "yes" -> (Date.string_of_ondate conf d) ^ (Date.get_wday conf d) | _ -> Date.string_of_ondate conf d ] | _ -> "" ] | "slash_birth_date" -> match (p_auth, Adef.od_of_codate (get_birth p)) with [ (True, Some d) -> Date.string_slash_of_date conf d | _ -> "" ] | "on_burial_date" -> match get_burial p with [ Buried cod -> match (p_auth, Adef.od_of_codate cod) with [ (True, Some d) -> match p_getenv conf.base_env "long_date" with [ Some "yes" -> (Date.string_of_ondate conf d) ^ (Date.get_wday conf d) | _ -> Date.string_of_ondate conf d ] | _ -> "" ] | _ -> raise Not_found ] | "slash_burial_date" -> match get_burial p with [ Buried cod -> match (p_auth, Adef.od_of_codate cod) with [ (True, Some d) -> Date.string_slash_of_date conf d | _ -> "" ] | _ -> raise Not_found ] | "on_cremation_date" -> match get_burial p with [ Cremated cod -> match (p_auth, Adef.od_of_codate cod) with [ (True, Some d) -> match p_getenv conf.base_env "long_date" with [ Some "yes" -> (Date.string_of_ondate conf d) ^ (Date.get_wday conf d) | _ -> Date.string_of_ondate conf d ] | _ -> "" ] | _ -> raise Not_found ] | "slash_cremation_date" -> match get_burial p with [ Cremated cod -> match (p_auth, Adef.od_of_codate cod) with [ (True, Some d) -> Date.string_slash_of_date conf d | _ -> "" ] | _ -> raise Not_found ] | "on_death_date" -> match (p_auth, get_death p) with [ (True, Death _ d) -> let d = Adef.date_of_cdate d in match p_getenv conf.base_env "long_date" with [ Some "yes" -> (Date.string_of_ondate conf d) ^ (Date.get_wday conf d) | _ -> Date.string_of_ondate conf d ] | _ -> "" ] | "slash_death_date" -> match (p_auth, get_death p) with [ (True, Death _ d) -> let d = Adef.date_of_cdate d in Date.string_slash_of_date conf d | _ -> "" ] | "prev_fam_father" -> match get_env "prev_fam" env with [ Vfam _ fam (ifath, _, _) _ -> string_of_int (Adef.int_of_iper ifath) | _ -> raise Not_found ] | "prev_fam_index" -> match get_env "prev_fam" env with [ Vfam ifam _ _ _ -> string_of_int (Adef.int_of_ifam ifam) | _ -> raise Not_found ] | "prev_fam_mother" -> match get_env "prev_fam" env with [ Vfam _ fam (_, imoth, _) _ -> string_of_int (Adef.int_of_iper imoth) | _ -> raise Not_found ] | "public_name" -> if not p_auth && (is_hide_names conf p) then "" else sou base (get_public_name p) | "qualifier" -> match get_qualifiers p with [ [nn :: _] -> if not p_auth && (is_hide_names conf p) then "" else sou base nn | _ -> "" ] | "sex" -> (* Pour éviter les traductions bizarre, on ne teste pas p_auth. *) string_of_int (index_of_sex (get_sex p)) | "sosa_in_list" -> match get_env "all_gp" env with [ Vallgp all_gp -> match get_link all_gp (get_key_index p) with [ Some (GP_person s _ _) -> Num.to_string s | _ -> "" ] | _ -> raise Not_found ] | "sosa_link" -> match get_env "sosa" env with [ Vsosa x -> match get_sosa conf base env x p with [ Some (n, q) -> Printf.sprintf "m=RL;i1=%d;i2=%d;b1=1;b2=%s" (Adef.int_of_iper (get_key_index p)) (Adef.int_of_iper (get_key_index q)) (Num.to_string n) | None -> "" ] | _ -> raise Not_found ] | "source" -> match get_env "src" env with [ Vstring s -> let env = [('i', fun () -> Util.default_image_name base p)] in let s = let wi = {Wiki.wi_mode = "NOTES"; Wiki.wi_cancel_links = conf.cancel_links; Wiki.wi_file_path = Notes.file_path conf base; Wiki.wi_person_exists = person_exists conf base; Wiki.wi_always_show_link = conf.wizard || conf.friend} in Wiki.syntax_links conf wi s in string_with_macros conf env s | _ -> raise Not_found ] | "surname" -> if not p_auth && (is_hide_names conf p) then "x" else p_surname base p | "surname_begin" -> if not p_auth && (is_hide_names conf p) then "" else surname_begin base (p_surname base p) | "surname_end" -> if not p_auth && (is_hide_names conf p) then "x" else surname_end base (p_surname base p) | "surname_key" -> if (is_hide_names conf p) && not p_auth then "" else code_varenv (Name.lower (p_surname base p)) | "surname_key_val" -> if (is_hide_names conf p) && not p_auth then "" else Name.lower (p_surname base p) | "surname_key_strip" -> if (is_hide_names conf p) && not p_auth then "" else Name.strip_c (p_surname base p) '"' | "title" -> person_title conf base p | _ -> raise Not_found ] and eval_witness_relation_var conf base env ((_, fam, (ip1, ip2, _), m_auth) as fcd) loc = fun [ [] -> if not m_auth then VVstring "" else let s = Printf.sprintf (ftransl conf "witness at marriage of %s and %s") (referenced_person_title_text conf base (pget conf base ip1)) (referenced_person_title_text conf base (pget conf base ip2)) in VVstring s | sl -> eval_family_field_var conf base env fcd loc sl ] and eval_family_field_var conf base env ((ifam, fam, (ifath, imoth, _), m_auth) as fcd) loc = fun [ ["father" :: sl] -> let ep = make_ep conf base ifath in eval_person_field_var conf base env ep loc sl | ["marriage_date" :: sl] -> match Adef.od_of_codate (get_marriage fam) with [ Some d when m_auth -> eval_date_field_var conf d sl | _ -> VVstring "" ] | ["mother" :: sl] -> let ep = make_ep conf base imoth in eval_person_field_var conf base env ep loc sl | [s] -> str_val (eval_str_family_field conf base env fcd loc s) | _ -> raise Not_found ] and eval_str_family_field conf base env (ifam, _, _, _) loc = fun [ "desc_level" -> match get_env "desc_level_table" env with [ Vdesclevtab levt -> let (_, flevt) = Lazy.force levt in string_of_int (flevt.(Adef.int_of_ifam ifam)) | _ -> raise Not_found ] | "index" -> string_of_int (Adef.int_of_ifam ifam) | "set_infinite_desc_level" -> match get_env "desc_level_table" env with [ Vdesclevtab levt -> do { let (_, flevt) = Lazy.force levt in flevt.(Adef.int_of_ifam ifam) := infinite; "" } | _ -> raise Not_found ] | _ -> raise Not_found ] and simple_person_text conf base p p_auth = if p_auth then match main_title conf base p with [ Some t -> titled_person_text conf base p t | None -> person_text conf base p ] else if (is_hide_names conf p) then "x x" else person_text conf base p and string_of_died conf base env p p_auth = if p_auth then let is = index_of_sex (get_sex p) in match get_death p with [ Death dr _ -> match dr with [ Unspecified -> transl_nth conf "died" is | Murdered -> transl_nth conf "murdered" is | Killed -> transl_nth conf "killed (in action)" is | Executed -> transl_nth conf "executed (legally killed)" is | Disappeared -> transl_nth conf "disappeared" is ] | DeadYoung -> transl_nth conf "died young" is | DeadDontKnowWhen -> transl_nth conf "died" is | _ -> "" ] else "" and string_of_image_url conf base env (p, p_auth) html = if p_auth then let v = image_and_size conf base p (limited_image_size max_im_wid max_im_wid) in match v with [ Some (True, fname, _) -> let s = Unix.stat fname in let b = acces conf base p in let k = default_image_name base p in Format.sprintf "%sm=IM%s;d=%d;%s;k=/%s" (commd conf) (if html then "H" else "") (int_of_float (mod_float s.Unix.st_mtime (float_of_int max_int))) b k | Some (False, link, _) -> link | None -> "" ] else "" and string_of_parent_age conf base (p, p_auth) parent = match get_parents p with [ Some ifam -> let cpl = foi base ifam in let pp = pget conf base (parent cpl) in if p_auth && authorized_age conf base pp then match (Adef.od_of_codate (get_birth pp), Adef.od_of_codate (get_birth p)) with [ (Some (Dgreg d1 _), Some (Dgreg d2 _)) -> Date.string_of_age conf (CheckItem.time_elapsed d1 d2) | _ -> "" ] else "" | None -> raise Not_found ] and string_of_int_env var env = match get_env var env with [ Vint x -> string_of_int x | _ -> raise Not_found ] and obsolete_eval conf base env (p, p_auth) loc = fun [ "married_to" -> let s = match get_env "fam" env with [ Vfam _ fam (_, _, ispouse) m_auth -> let format = relation_txt conf (get_sex p) fam in Printf.sprintf (fcapitale format) (fun _ -> if m_auth then string_of_marriage_text conf base fam else "") | _ -> raise Not_found ] in obsolete loc "4.08" "married_to" "" (str_val s) | _ -> raise Not_found ] ; value eval_transl conf env upp s c = match c with [ "n" | "s" | "w" -> let n = match c with [ "n" -> (* replaced by %apply;nth([...],sex) *) match get_env "p" env with [ Vind p -> 1 - index_of_sex (get_sex p) | _ -> 2 ] | "s" -> match get_env "child" env with [ Vind p -> index_of_sex (get_sex p) | _ -> match get_env "p" env with [ Vind p -> index_of_sex (get_sex p) | _ -> 2 ] ] | "w" -> match get_env "fam" env with [ Vfam _ fam _ _ -> if Array.length (get_witnesses fam) = 1 then 0 else 1 | _ -> 0 ] | _ -> assert False ] in let r = Util.translate_eval (Util.transl_nth conf s n) in if upp then capitale r else r | _ -> Templ.eval_transl conf upp s c ] ; value print_foreach conf base print_ast eval_expr = let eval_int_expr env ep e = let s = eval_expr env ep e in try int_of_string s with [ Failure _ -> raise Not_found ] in let rec print_foreach env ini_ep loc s sl ell al = let rec loop ((a, _) as ep) efam = fun [ [s] -> print_simple_foreach env ell al ini_ep ep efam loc s | ["ancestor" :: sl] -> let ip_ifamo = match get_env "ancestor" env with [ Vanc (GP_person _ ip ifamo) -> Some (ip, ifamo) | Vanc (GP_same _ _ ip) -> Some (ip, None) | _ -> None ] in match ip_ifamo with [ Some (ip, ifamo) -> let ep = make_ep conf base ip in let efam = match ifamo with [ Some ifam -> let (f, c, a) = make_efam conf base ip ifam in Vfam ifam f c a | None -> efam ] in loop ep efam sl | _ -> raise Not_found ] | ["child" :: sl] -> match get_env "child" env with [ Vind p -> let auth = authorized_age conf base p in let ep = (p, auth) in loop ep efam sl | _ -> raise Not_found ] | ["father" :: sl] -> match get_parents a with [ Some ifam -> let cpl = foi base ifam in let ((_, p_auth) as ep) = make_ep conf base (get_father cpl) in let ifath = get_father cpl in let cpl = (ifath, get_mother cpl, ifath) in let m_auth = p_auth && authorized_age conf base (pget conf base ifath) in let efam = Vfam ifam (foi base ifam) cpl m_auth in loop ep efam sl | None -> warning_use_has_parents_before_parent loc "father" () ] | ["mother" :: sl] -> match get_parents a with [ Some ifam -> let cpl = foi base ifam in let ((_, p_auth) as ep) = make_ep conf base (get_mother cpl) in let ifath = get_father cpl in let cpl = (ifath, get_mother cpl, ifath) in let m_auth = p_auth && authorized_age conf base (pget conf base ifath) in let efam = Vfam ifam (foi base ifam) cpl m_auth in loop ep efam sl | None -> warning_use_has_parents_before_parent loc "mother" () ] | ["self" :: sl] -> loop ep efam sl | ["spouse" :: sl] -> match efam with [ Vfam _ _ (_, _, ip) _ -> let ep = make_ep conf base ip in loop ep efam sl | _ -> raise Not_found ] | _ -> raise Not_found ] in let efam = get_env "fam" env in loop ini_ep efam [s :: sl] and print_simple_foreach env el al ini_ep ep efam loc = fun [ "alias" -> print_foreach_alias env al ep | "ancestor" -> print_foreach_ancestor env al ep | "ancestor_level" -> print_foreach_ancestor_level env el al ep | "ancestor_level2" -> print_foreach_ancestor_level2 env al ep | "ancestor_surname" -> print_foreach_anc_surn env el al loc ep | "ancestor_tree_line" -> print_foreach_ancestor_tree env el al ep | "cell" -> print_foreach_cell env el al ep | "child" -> print_foreach_child env al ep efam | "cousin_level" -> print_foreach_level "max_cous_level" env al ep | "descendant_level" -> print_foreach_descendant_level env al ep | "family" -> print_foreach_family env al ini_ep ep | "first_name_alias" -> print_foreach_first_name_alias env al ep | "nobility_title" -> print_foreach_nobility_title env al ep | "parent" -> print_foreach_parent env al ep | "qualifier" -> print_foreach_qualifier env al ep | "related" -> print_foreach_related env al ep | "relation" -> print_foreach_relation env al ep | "sorted_list_item" -> print_foreach_sorted_list_item env al ep | "source" -> print_foreach_source env al ep | "surname_alias" -> print_foreach_surname_alias env al ep | "witness" -> print_foreach_witness env al ep efam | "witness_relation" -> print_foreach_witness_relation env al ep | _ -> raise Not_found ] and print_foreach_alias env al ((p, p_auth) as ep) = if not p_auth && (is_hide_names conf p) then () else list_iter_first (fun first a -> let env = [("alias", Vstring (sou base a)) :: env] in let env = [("first", Vbool first) :: env] in List.iter (print_ast env ep) al) (get_aliases p) and print_foreach_ancestor env al ((p, p_auth) as ep) = match get_env "gpl" env with [ Vgpl gpl -> let rec loop first gpl = match gpl with [ [] -> () | [gp :: gl] -> do { match gp with [ GP_missing _ _ -> () | _ -> let env = [("ancestor", Vanc gp); ("first", Vbool first); ("last", Vbool (gl = [])) :: env] in List.iter (print_ast env ep) al ]; loop False gl } ] in loop True gpl | _ -> () ] and print_foreach_ancestor_level env el al ((p, _) as ep) = let max_level = match el with [ [[e]] -> eval_int_expr env ep e | [] -> match get_env "max_anc_level" env with [ Vint n -> n | _ -> 0 ] | _ -> raise Not_found ] in let mark = Array.make (nb_of_persons base) Num.zero in loop [GP_person Num.one (get_key_index p) None] 1 0 where rec loop gpl i n = if i > max_level then () else let n = List.fold_left (fun n gp -> match gp with [ GP_person _ _ _ -> n + 1 | _ -> n ]) n gpl in let env = [("gpl", Vgpl gpl); ("level", Vint i); ("n", Vint n) :: env] in do { List.iter (print_ast env ep) al; let gpl = next_generation conf base mark gpl in loop gpl (succ i) n } and print_foreach_ancestor_level2 env al ((p, _) as ep) = let max_lev = "max_anc_level" in let max_level = match get_env max_lev env with [ Vint n -> n | _ -> 0 ] in let mark = Array.make (nb_of_persons base) Num.zero in loop [GP_person Num.one (get_key_index p) None] 1 where rec loop gpl i = if i > max_level then () else let env = [("gpl", Vgpl gpl); ("level", Vint i) :: env] in do { List.iter (print_ast env ep) al; for i = 0 to nb_of_persons base - 1 do { mark.(i) := Num.zero }; let gpl = next_generation2 conf base mark gpl in loop gpl (succ i) } and print_foreach_anc_surn env el al loc ((p, _) as ep) = let max_level = match el with [ [[e]] -> eval_int_expr env ep e | [] -> match get_env "max_anc_level" env with [ Vint n -> n | _ -> 0 ] | _ -> raise Not_found ] in (* En fonction du type de sortie demandé, on construit *) (* soit la liste des branches soit la liste éclair. *) match p_getenv conf.env "t" with [ Some "E" -> let list = build_list_eclair conf base max_level p in List.iter (fun (a, b, c, d, e, f) -> let env = [("ancestor", Vanc_surn (Eclair (a, b, c, d, e, f, loc))) :: env] in List.iter (print_ast env ep) al) list | Some "F" -> let list = build_surnames_list conf base max_level p in List.iter (fun (a, (((b, c, d), e), f)) -> let env = [("ancestor", Vanc_surn (Branch (a, b, c, d, e, f, loc))) :: env] in List.iter (print_ast env ep) al) list | _ -> () ] and print_foreach_ancestor_tree env el al ((p, _) as ep) = let (p, max_level) = match el with [ [[e1]; [e2]] -> let ip = eval_int_expr env ep e1 in let max_level = eval_int_expr env ep e2 in (pget conf base (Adef.iper_of_int ip), max_level) | [[e]] -> (p, eval_int_expr env ep e) | [] -> match get_env "max_anc_level" env with [ Vint n -> (p, n) | _ -> (p, 0) ] | _ -> raise Not_found ] in let gen = tree_generation_list conf base max_level p in loop True gen where rec loop first = fun [ [g :: gl] -> let env = [("celll", Vcelll g); ("first", Vbool first); ("last", Vbool (gl = [])) :: env] in do { List.iter (print_ast env ep) al; loop False gl } | [] -> () ] and print_foreach_cell env el al ((p, _) as ep) = let celll = match get_env "celll" env with [ Vcelll celll -> celll | _ -> raise Not_found ] in list_iter_first (fun first cell -> let env = [("cell", Vcell cell); ("first", Vbool first) :: env] in List.iter (print_ast env ep) al) celll and print_foreach_child env al ep = fun [ Vfam _ fam _ _ -> let auth = List.for_all (fun ip -> authorized_age conf base (pget conf base ip)) (Array.to_list (get_children fam)) in let env = [("auth", Vbool auth) :: env] in let n = let p = match get_env "p" env with [ Vind p -> p | _ -> assert False ] in let rec loop i = if i = Array.length (get_children fam) then -2 else if (get_children fam).(i) = get_key_index p then i else loop (i + 1) in loop 0 in Array.iteri (fun i ip -> let p = pget conf base ip in let env = [("#loop", Vint 0) :: env] in let env = [("child", Vind p) :: env] in let env = [("child_cnt", Vint (i + 1)) :: env] in let env = if i = n - 1 && not (is_hidden p) then [("pos", Vstring "prev") :: env] else if i = n then [("pos", Vstring "self") :: env] else if i = n + 1 && not (is_hidden p) then [("pos", Vstring "next") :: env] else env in let ep = (p, authorized_age conf base p) in List.iter (print_ast env ep) al) (get_children fam) | _ -> () ] and print_foreach_descendant_level env al ep = let max_level = match get_env "max_desc_level" env with [ Vint n -> n | _ -> 0 ] in loop 0 where rec loop i = if i > max_level then () else let env = [("level", Vint i) :: env] in do { List.iter (print_ast env ep) al; loop (succ i) } and print_foreach_family env al ini_ep (p, _) = loop None 0 where rec loop prev i = if i = Array.length (get_family p) then () else let ifam = (get_family p).(i) in let fam = foi base ifam in let ifath = get_father fam in let imoth = get_mother fam in let ispouse = spouse (get_key_index p) fam in let cpl = (ifath, imoth, ispouse) in let m_auth = authorized_age conf base (pget conf base ifath) && authorized_age conf base (pget conf base imoth) in let vfam = Vfam ifam fam cpl m_auth in let env = [("#loop", Vint 0) :: env] in let env = [("fam", vfam) :: env] in let env = [("family_cnt", Vint (i + 1)) :: env] in let env = match prev with [ Some vfam -> [("prev_fam", vfam) :: env] | None -> env ] in do { List.iter (print_ast env ini_ep) al; loop (Some vfam) (i + 1); } and print_foreach_first_name_alias env al ((p, p_auth) as ep) = if not p_auth && (is_hide_names conf p) then () else List.iter (fun s -> let env = [("first_name_alias", Vstring (sou base s)) :: env] in List.iter (print_ast env ep) al) (get_first_names_aliases p) and print_foreach_level max_lev env al ((p, _) as ep) = let max_level = match get_env max_lev env with [ Vint n -> n | _ -> 0 ] in loop 1 where rec loop i = if i > max_level then () else let env = [("level", Vint i) :: env] in do { List.iter (print_ast env ep) al; loop (succ i) } and print_foreach_nobility_title env al ((p, p_auth) as ep) = if p_auth then let titles = nobility_titles_list conf base p in list_iter_first (fun first x -> let env = [("nobility_title", Vtitle p x) :: env] in let env = [("first", Vbool first) :: env] in List.iter (print_ast env ep) al) titles else () and print_foreach_parent env al ((a, _) as ep) = match get_parents a with [ Some ifam -> let cpl = foi base ifam in Array.iter (fun iper -> let p = pget conf base iper in let env = [("parent", Vind p) :: env] in List.iter (print_ast env ep) al) (get_parent_array cpl) | None -> () ] and print_foreach_qualifier env al ((p, p_auth) as ep) = if not p_auth && (is_hide_names conf p) then () else list_iter_first (fun first nn -> let env = [("qualifier", Vstring (sou base nn)) :: env] in let env = [("first", Vbool first) :: env] in List.iter (print_ast env ep) al) (get_qualifiers p) and print_foreach_relation env al ((p, p_auth) as ep) = if p_auth then list_iter_first (fun first r -> let env = [("rel", Vrel r None) :: env] in let env = [("first", Vbool first) :: env] in List.iter (print_ast env ep) al) (get_rparents p) else () and print_foreach_related env al ((p, p_auth) as ep) = if p_auth then let list = let list = list_uniq (List.sort compare (get_related p)) in List.fold_left (fun list ic -> let c = pget conf base ic in loop list (get_rparents c) where rec loop list = fun [ [r :: rl] -> match r.r_fath with [ Some ip when ip = get_key_index p -> loop [(c, r) :: list] rl | _ -> match r.r_moth with [ Some ip when ip = get_key_index p -> loop [(c, r) :: list] rl | _ -> loop list rl ] ] | [] -> list ]) [] list in let list = List.sort (fun (c1, _) (c2, _) -> let d1 = match Adef.od_of_codate (get_baptism c1) with [ None -> Adef.od_of_codate (get_birth c1) | x -> x ] in let d2 = match Adef.od_of_codate (get_baptism c2) with [ None -> Adef.od_of_codate (get_birth c2) | x -> x ] in match (d1, d2) with [ (Some d1, Some d2) -> if CheckItem.strictly_before d1 d2 then -1 else 1 | _ -> -1 ]) (List.rev list) in List.iter (fun (c, r) -> let env = [("rel", Vrel r (Some c)) :: env] in List.iter (print_ast env ep) al) list else () and print_foreach_sorted_list_item env al ep = let list = match get_env "list" env with [ Vslist l -> SortedList.elements l.val | _ -> [] ] in loop (Vslistlm []) list where rec loop prev_item = fun [ [_ :: sll] as gsll -> let item = Vslistlm gsll in let env = [("item", item); ("prev_item", prev_item) :: env] in do { List.iter (print_ast env ep) al; loop item sll } | [] -> () ] and print_foreach_source env al ((p, p_auth) as ep) = let rec insert_loop typ src = fun [ [(typ1, src1) :: srcl] -> if src = src1 then [(typ1 ^ ", " ^ typ, src1) :: srcl] else [(typ1, src1) :: insert_loop typ src srcl] | [] -> [(typ, src)] ] in let insert typ src srcl = if src = "" then srcl else insert_loop (Util.translate_eval typ) src srcl in let srcl = if p_auth then (* On ajoute les source dans cet ordre : *) (* psource, naissance, baptême, mariage, fsource, décès, inhumation. *) let srcl = [] in let srcl = insert (transl_nth conf "person/persons" 0) (sou base (get_psources p)) srcl in let srcl = insert (transl_nth conf "birth" 0) (sou base (get_birth_src p)) srcl in let srcl = insert (transl_nth conf "baptism" 0) (sou base (get_baptism_src p)) srcl in let (srcl, _) = Array.fold_left (fun (srcl, i) ifam -> let fam = foi base ifam in let isp = Gutil.spouse (get_key_index p) fam in let sp = poi base isp in (* On sait que p_auth vaut vrai. *) let m_auth = authorized_age conf base sp in if m_auth then let lab = if Array.length (get_family p) = 1 then "" else " " ^ string_of_int i in let srcl = let src_typ = transl_nth conf "marriage/marriages" 0 in insert (src_typ ^ lab) (sou base (get_marriage_src fam)) srcl in let src_typ = transl_nth conf "family/families" 0 in (insert (src_typ ^ lab) (sou base (get_fsources fam)) srcl, i + 1) else (srcl, i + 1)) (srcl, 1) (get_family p) in let srcl = insert (transl_nth conf "death" 0) (sou base (get_death_src p)) srcl in let srcl = insert (transl_nth conf "burial" 0) (sou base (get_burial_src p)) srcl in srcl else [] in (* Affiche les sources et met à jour les variables "first" et "last". *) let rec loop first = fun [ [(src_typ, src) :: srcl] -> let env = [("first", Vbool first); ("last", Vbool (srcl = [])); ("src_typ", Vstring src_typ); ("src", Vstring src) :: env] in do { List.iter (print_ast env ep) al; loop False srcl } | [] -> () ] in loop True srcl and print_foreach_surname_alias env al ((p, p_auth) as ep) = if not p_auth && (is_hide_names conf p) then () else List.iter (fun s -> let env = [("surname_alias", Vstring (sou base s)) :: env] in List.iter (print_ast env ep) al) (get_surnames_aliases p) and print_foreach_witness env al ep = fun [ Vfam _ fam _ True -> list_iter_first (fun first ip -> let p = pget conf base ip in let env = [("witness", Vind p) :: env] in let env = [("first", Vbool first) :: env] in List.iter (print_ast env ep) al) (Array.to_list (get_witnesses fam)) | _ -> () ] and print_foreach_witness_relation env al ((p, _) as ep) = let list = do { let list = ref [] in let related = list_uniq (List.sort compare (get_related p)) in make_list related where rec make_list = fun [ [ic :: icl] -> do { let c = pget conf base ic in if get_sex c = Male then Array.iter (fun ifam -> let fam = foi base ifam in if array_mem (get_key_index p) (get_witnesses fam) then list.val := [(ifam, fam) :: list.val] else ()) (get_family (pget conf base ic)) else (); make_list icl } | [] -> () ]; list.val } in let list = List.sort (fun (_, fam1) (_, fam2) -> match (Adef.od_of_codate (get_marriage fam1), Adef.od_of_codate (get_marriage fam2)) with [ (Some d1, Some d2) -> if CheckItem.strictly_before d1 d2 then -1 else if CheckItem.strictly_before d2 d1 then 1 else 0 | _ -> 0 ]) list in List.iter (fun (ifam, fam) -> let ifath = get_father fam in let imoth = get_mother fam in let cpl = (ifath, imoth, imoth) in let m_auth = authorized_age conf base (pget conf base ifath) && authorized_age conf base (pget conf base imoth) in if m_auth then let env = [("fam", Vfam ifam fam cpl True) :: env] in List.iter (print_ast env ep) al else ()) list in print_foreach ; value eval_predefined_apply conf env f vl = let vl = List.map (fun [ VVstring s -> s | _ -> raise Not_found ]) vl in match (f, vl) with [ ("a_of_b", [s1; s2]) -> Util.translate_eval (transl_a_of_b conf s1 s2) | ("a_of_b_gr_eq_lev", [s1; s2]) -> Util.translate_eval (transl_a_of_gr_eq_gen_lev conf s1 s2) | ("add_in_sorted_list", sl) -> match get_env "list" env with [ Vslist l -> do { l.val := SortedList.add sl l.val; "" } | _ -> raise Not_found ] | ("hexa", [s]) -> Util.hexa_string s | ("initial", [s]) -> if String.length s = 0 then "" else String.sub s 0 (Util.index_of_next_char s 0) | ("lazy_print", [v]) -> match get_env "lazy_print" env with [ Vlazyp r -> do { r.val := Some v; "" } | _ -> raise Not_found ] | ("min", [s :: sl]) -> try let m = List.fold_right (fun s -> min (int_of_string s)) sl (int_of_string s) in string_of_int m with [ Failure _ -> raise Not_found ] | ("clean_html_tags", [s]) -> (* On supprime surtout les balises qui peuvent casser la mise en page. *) Util.clean_html_tags s ["
      "; ""; ""; ""; ""] | _ -> raise Not_found ] ; value gen_interp_templ menu title templ_fname conf base p = do { template_file.val := templ_fname ^ ".txt"; let ep = (p, authorized_age conf base p) in let emal = match p_getint conf.env "v" with [ Some i -> i | None -> 120 ] in let env = let sosa_ref = Util.find_sosa_ref conf base in let sosa_ref_l = let sosa_ref () = sosa_ref in Lazy.from_fun sosa_ref in let t_sosa = match sosa_ref with [ Some p -> init_sosa_t conf base p | _ -> { tstab = [| |]; mark = [| |]; last_zil = []; sosa_ht = Hashtbl.create 1} ] in let desc_level_table_l = let dlt () = make_desc_level_table conf base emal p in Lazy.from_fun dlt in let desc_level_table_l_save = let dlt () = make_desc_level_table conf base emal p in Lazy.from_fun dlt in let mal () = Vint (max_ancestor_level conf base (get_key_index p) emal + 1) in let mcl () = Vint (max_cousin_level conf base p) in let mdl () = Vint (max_descendant_level conf base desc_level_table_l) in let nldb () = let bdir = Util.base_path [] (conf.bname ^ ".gwb") in let fname = Filename.concat bdir "notes_links" in let db = NotesLinks.read_db_from_file fname in let db = Notes.merge_possible_aliases conf db in Vnldb db in let all_gp () = Vallgp (get_all_generations conf base p) in [("p", Vind p); ("p_auth", Vbool (authorized_age conf base p)); ("count", Vcnt (ref 0)); ("list", Vslist (ref SortedList.empty)); ("desc_mark", Vdmark (ref [| |])); ("lazy_print", Vlazyp (ref None)); ("sosa", Vsosa (ref [])); ("sosa_ref", Vsosa_ref sosa_ref_l); ("t_sosa", Vt_sosa t_sosa); ("max_anc_level", Vlazy (Lazy.from_fun mal)); ("max_cous_level", Vlazy (Lazy.from_fun mcl)); ("max_desc_level", Vlazy (Lazy.from_fun mdl)); ("desc_level_table", Vdesclevtab desc_level_table_l); ("desc_level_table_save", Vdesclevtab desc_level_table_l_save); ("nldb", Vlazy (Lazy.from_fun nldb)); ("all_gp", Vlazy (Lazy.from_fun all_gp))] in if menu then (* Petit calcul pour voir si le fichier est vide => on *) (* ne veut pas utiliser le header avec la barre de menu. *) let size = match Util.open_templ conf templ_fname with [ Some ic -> do { let fd = Unix.descr_of_in_channel ic in let stats = Unix.fstat fd in close_in ic; stats.Unix.st_size } | None -> 0 ] in if size = 0 then Hutil.header conf title else Hutil.interp_no_header conf base templ_fname {Templ.eval_var = eval_var conf base; Templ.eval_transl = eval_transl conf; Templ.eval_predefined_apply = eval_predefined_apply conf; Templ.get_vother = get_vother; Templ.set_vother = set_vother; Templ.print_foreach = print_foreach conf base} env ep else Hutil.interp conf base templ_fname {Templ.eval_var = eval_var conf base; Templ.eval_transl = eval_transl conf; Templ.eval_predefined_apply = eval_predefined_apply conf; Templ.get_vother = get_vother; Templ.set_vother = set_vother; Templ.print_foreach = print_foreach conf base} env ep }; value interp_templ = gen_interp_templ False (fun _ -> ()); value interp_templ_with_menu = gen_interp_templ True; value interp_notempl_with_menu title templ_fname conf base p = do { (* On envoie le header car on n'est pas dans un template (exple: merge). *) Hutil.header_without_page_title conf title; gen_interp_templ True title templ_fname conf base p; }; (* Main *) value print conf base p = let passwd = if conf.wizard || conf.friend then None else let src = match get_parents p with [ Some ifam -> sou base (get_origin_file (foi base ifam)) | None -> "" ] in try Some (src, List.assoc ("passwd_" ^ src) conf.base_env) with [ Not_found -> None ] in match passwd with [ Some (src, passwd) when is_that_user_and_password conf.auth_scheme "" passwd = False -> Util.unauthorized conf src | _ -> interp_templ "perso" conf base p ] ; value limit_by_tree conf = match p_getint conf.base_env "max_anc_tree" with [ Some x -> max 1 x | None -> 7 ] ; value print_ancestors_dag conf base v p = let v = min (limit_by_tree conf) v in let set = loop Dag.Pset.empty v (get_key_index p) where rec loop set lev ip = let set = Dag.Pset.add ip set in if lev <= 1 then set else match get_parents (pget conf base ip) with [ Some ifam -> let cpl = foi base ifam in let set = loop set (lev - 1) (get_mother cpl) in loop set (lev - 1) (get_father cpl) | None -> set ] in let elem_txt p = Dag.Item p "" in (* Récupère les options d'affichage. *) let options = Util.display_options conf in let vbar_txt ip = let p = pget conf base ip in Printf.sprintf "%sm=A;t=T;v=%d;%s;dag=on;%s" (commd conf) v options (acces conf base p) in let page_title = Util.capitale (Util.transl conf "tree") in Dag.make_and_print_dag conf base elem_txt vbar_txt True set [] page_title "" ; value print_ascend conf base p = match (p_getenv conf.env "t", p_getenv conf.env "dag", p_getint conf.env "v") with [ (Some "T", Some "on", Some v) -> print_ancestors_dag conf base v p | _ -> let templ = match p_getenv conf.env "t" with [ Some ("E" | "F" | "H" | "L") -> "anclist" | Some ("D" | "G" | "M" | "N" | "P" | "Z") -> "ancsosa" | Some ("A" | "C" | "T") -> "anctree" | _ -> "ancmenu" ] in interp_templ templ conf base p ] ; value print_what_links conf base p = if authorized_age conf base p then do { let key = let fn = Name.lower (sou base (get_first_name p)) in let sn = Name.lower (sou base (get_surname p)) in (fn, sn, get_occ p) in let bdir = Util.base_path [] (conf.bname ^ ".gwb") in let fname = Filename.concat bdir "notes_links" in let db = NotesLinks.read_db_from_file fname in let db = Notes.merge_possible_aliases conf db in let pgl = links_to_ind conf base db key in let title h = do { Wserver.wprint "%s: " (capitale (transl conf "linked pages")); if h then Wserver.wprint "%s" (simple_person_text conf base p True) else Wserver.wprint "%s" (commd conf) (acces conf base p) (simple_person_text conf base p True) } in Hutil.header conf title; Hutil.print_link_to_welcome conf True; Notes.print_linked_list conf base pgl; Hutil.trailer conf; } else Hutil.incorrect_request conf ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/notes.ml0000660000175200017530000004542612664543647022705 0ustar guillaumeguillaume(* camlp5r ./pa_html.cmo *) (* $Id: notes.ml,v 5.33 2007-09-12 09:58:44 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Config; open Gutil; open Gwdb; open Hutil; open Mutil; open Util; value file_path conf base fname = Util.base_path [] (List.fold_left Filename.concat (conf.bname ^ ".gwb") [base_notes_dir base; fname ^ ".txt"]) ; value path_of_fnotes fnotes = match NotesLinks.check_file_name fnotes with [ Some (dl, f) -> List.fold_right Filename.concat dl f | None -> "" ] ; value read_notes base fnotes = let fnotes = path_of_fnotes fnotes in let s = base_notes_read base fnotes in Wiki.split_title_and_text s ; value print_search_form conf from_note = tag "table" begin tag "tr" begin tag "td" "align=\"%s\"" conf.right begin tag "form" "method=\"get\" action=\"%s\"" conf.command begin tag "p" begin hidden_env conf; xtag "input" "type=\"hidden\" name=\"m\" value=\"MISC_NOTES_SEARCH\""; xtag "input" "name=\"s\" size=\"30\" maxlength=\"40\" value=\"%s\"" (match p_getenv conf.env "s" with [ Some s -> quote_escaped s | None -> "" ]); match from_note with [ Some n -> xtag "input" "type=\"hidden\" name=\"z\" value=\"%s\"" n | None -> () ]; xtag "br"; tag "label" begin xtag "input" "type=\"checkbox\" name=\"c\" value=\"on\"%s" (match p_getenv conf.env "c" with [ Some "on" -> " checked=\"checked\"" | Some _ | None -> "" ]); Wserver.wprint "%s\n" (transl_nth conf "search/case sensitive" 1); end; xtag "input" "type=\"submit\" value=\"%s\"" (capitale (transl_nth conf "search/case sensitive" 0)); end; end; end; end; end ; value print_whole_notes conf base fnotes title s ho = do { header_no_page_title conf (fun _ -> Wserver.wprint "%s" (if title = "" then fnotes else title)); let what_links_page () = if fnotes <> "" then stagn "a" "href=\"%sm=NOTES;f=%s;ref=on\"" (commd conf) fnotes begin Wserver.wprint "(%s)" (transl conf "linked pages"); end else () in gen_print_link_to_welcome what_links_page conf True; tag "p" begin xtag "br"; xtag "br"; end; if title <> "" then let title = match ho with [ Some (case_sens, h) -> html_highlight case_sens h title | None -> title ] in Wserver.wprint "

      %s

      \n" title else (); match Util.open_etc_file "summary" with [ Some ic -> Templ.copy_from_templ conf [] ic | None -> () ]; let file_path = file_path conf base in let s = string_with_macros conf [] s in let edit_opt = Some (conf.wizard, "NOTES", fnotes) in let s = let wi = {Wiki.wi_mode = "NOTES"; Wiki.wi_file_path = file_path; Wiki.wi_cancel_links = conf.cancel_links; Wiki.wi_person_exists = person_exists conf base; Wiki.wi_always_show_link = conf.wizard || conf.friend} in Wiki.html_with_summary_of_tlsw conf wi edit_opt s in let s = match ho with [ Some (case_sens, h) -> html_highlight case_sens h s | None -> s ] in Wserver.wprint "%s\n" s; match ho with [ Some _ -> print_search_form conf (Some fnotes) | None -> () ]; trailer conf; }; value print_notes_part conf base fnotes title s cnt0 = do { header_no_page_title conf (fun _ -> Wserver.wprint "%s" (if title = "" then fnotes else title)); print_link_to_welcome conf True; match Util.open_etc_file "summary" with [ Some ic -> Templ.copy_from_templ conf [] ic | None -> () ]; if cnt0 = 0 && title <> "" then do { xtag "br"; xtag "br"; Wserver.wprint "

      %s

      \n" title } else (); let s = string_with_macros conf [] s in let lines = Wiki.extract_sub_part s cnt0 in let mode = "NOTES" in let wi = {Wiki.wi_mode = mode; Wiki.wi_cancel_links = conf.cancel_links; Wiki.wi_file_path = file_path conf base; Wiki.wi_person_exists = person_exists conf base; Wiki.wi_always_show_link = conf.wizard || conf.friend} in Wiki.print_sub_part conf wi conf.wizard mode fnotes cnt0 lines; trailer conf; } ; value merge_possible_aliases conf db = let aliases = Wiki.notes_aliases conf in let db = List.map (fun (pg, (sl, il)) -> let pg = match pg with [ NotesLinks.PgMisc f -> NotesLinks.PgMisc (Wiki.map_notes aliases f) | x -> x ] in let sl = List.map (Wiki.map_notes aliases) sl in (pg, (sl, il))) db in let db = List.sort (fun (pg1, _) (pg2, _) -> compare pg1 pg2) db in List.fold_left (fun list (pg, (sl, il)) -> let (sl, il1, list) = let (list1, list2) = match list with [ [((pg1, _) as x) :: l] -> if pg = pg1 then ([x], l) else ([], list) | [] -> ([], list) ] in match list1 with [ [(_, (sl1, il1))] -> let sl = List.fold_left (fun sl s -> if List.mem s sl then sl else [s :: sl]) sl sl1 in let il = List.fold_left (fun il i -> if List.mem i il then il else [i :: il]) il il1 in (sl, il, list2) | _ -> (sl, il, list) ] in [(pg, (sl, il)) :: list]) [] db ; value notes_links_db conf base eliminate_unlinked = do { let bdir = Util.base_path [] (conf.bname ^ ".gwb") in let fname = Filename.concat bdir "notes_links" in let db = NotesLinks.read_db_from_file fname in let db = merge_possible_aliases conf db in let db2 = List.fold_left (fun db2 (pg, (sl, il)) -> let record_it = match pg with [ NotesLinks.PgInd ip -> authorized_age conf base (pget conf base ip) | NotesLinks.PgFam ifam -> let fam = foi base ifam in if is_deleted_family fam then False else authorized_age conf base (pget conf base (get_father fam)) | NotesLinks.PgNotes | NotesLinks.PgMisc _ | NotesLinks.PgWizard _ -> True ] in if record_it then List.fold_left (fun db2 s -> try let list = List.assoc s db2 in [(s, [pg :: list]) :: List.remove_assoc s db2] with [ Not_found -> [(s, [pg]) :: db2] ]) db2 sl else db2) [] db in (* some kind of basic gc... *) let misc = Hashtbl.create 1 in let set = List.fold_left (fun set (pg, (sl, il)) -> match pg with [ NotesLinks.PgInd _ | NotesLinks.PgFam _ | NotesLinks.PgNotes | NotesLinks.PgWizard _ -> List.fold_left (fun set s -> StrSet.add s set) set sl | NotesLinks.PgMisc s -> do { Hashtbl.add misc s sl; set } ]) StrSet.empty db in let mark = Hashtbl.create 1 in loop (StrSet.elements set) where rec loop = fun [ [s :: sl] -> if Hashtbl.mem mark s then loop sl else do { Hashtbl.add mark s (); let sl1 = try Hashtbl.find misc s with [ Not_found -> [] ] in loop (List.rev_append sl1 sl) } | [] -> () ]; let is_referenced s = Hashtbl.mem mark s in let db2 = if eliminate_unlinked then List.fold_right (fun (s, list) db2 -> if is_referenced s then [(s, list) :: db2] else db2) db2 [] else db2 in List.sort (fun (s1, _) (s2, _) -> alphabetic_order (Name.lower s1) (Name.lower s2)) db2 }; value print_linked_list conf base pgl = tag "ul" begin List.iter (fun pg -> stagn "li" begin match pg with [ NotesLinks.PgInd ip -> let p = pget conf base ip in Wserver.wprint "%s%s" (Util.referenced_person_title_text conf base p) (Date.short_dates_text conf base p) | NotesLinks.PgFam ifam -> let fam = foi base ifam in let fath = pget conf base (get_father fam) in let moth = pget conf base (get_mother fam) in Wserver.wprint "%s%s & %s %s" (Util.referenced_person_title_text conf base fath) (Date.short_dates_text conf base fath) (Util.referenced_person_title_text conf base moth) (Date.short_dates_text conf base moth) | NotesLinks.PgNotes -> stagn "a" "href=\"%sm=NOTES\"" (commd conf) begin Wserver.wprint "%s" (transl_nth conf "note/notes" 1); end | NotesLinks.PgMisc fnotes -> stagn "tt" begin Wserver.wprint "["; stag "a" "href=\"%sm=NOTES;f=%s\"" (commd conf) fnotes begin Wserver.wprint "%s" fnotes; end; Wserver.wprint "]"; end | NotesLinks.PgWizard wizname -> stagn "tt" begin stag "i" begin Wserver.wprint "%s" (transl_nth conf "wizard/wizards/friend/friends/exterior" 0); end; Wserver.wprint " "; stag "a" "href=\"%sm=WIZNOTES;v=%s\"" (commd conf) (code_varenv wizname) begin Wserver.wprint "%s" wizname; end; end ]; end) pgl; end ; value print_what_links conf base fnotes = do { let title h = do { Wserver.wprint "%s " (capitale (transl conf "linked pages")); if h then Wserver.wprint "[%s]" fnotes else stag "tt" begin Wserver.wprint "["; stag "a" "href=\"%sm=NOTES;f=%s\"" (commd conf) fnotes begin Wserver.wprint "%s" fnotes; end; Wserver.wprint "]"; end } in let db = notes_links_db conf base False in Hutil.header conf title; Hutil.print_link_to_welcome conf True; match try Some (List.assoc fnotes db) with [ Not_found -> None ] with [ Some pgl -> print_linked_list conf base pgl | None -> () ]; Hutil.trailer conf; }; value print conf base = let fnotes = match p_getenv conf.env "f" with [ Some f -> if NotesLinks.check_file_name f <> None then f else "" | None -> "" ] in match p_getenv conf.env "ref" with [ Some "on" -> print_what_links conf base fnotes | _ -> let (nenv, s) = read_notes base fnotes in let title = try List.assoc "TITLE" nenv with [ Not_found -> "" ] in match p_getint conf.env "v" with [ Some cnt0 -> print_notes_part conf base fnotes title s cnt0 | None -> print_whole_notes conf base fnotes title s None ] ] ; value print_mod conf base = let fnotes = match p_getenv conf.env "f" with [ Some f -> if NotesLinks.check_file_name f <> None then f else "" | None -> "" ] in let title _ = Wserver.wprint "%s - %s%s" (capitale (transl conf "base notes")) conf.bname (if fnotes = "" then "" else " (" ^ fnotes ^ ")") in let (env, s) = read_notes base fnotes in Wiki.print_mod_view_page conf True "NOTES" fnotes title env s ; value update_notes_links_db conf fnotes s = let slen = String.length s in let (list_nt, list_ind) = loop [] [] 1 0 where rec loop list_nt list_ind pos i = if i = slen then (list_nt, list_ind) else if i + 1 < slen && s.[i] = '%' then loop list_nt list_ind pos (i + 2) else match NotesLinks.misc_notes_link s i with [ NotesLinks.WLpage j _ lfname _ _ -> let list_nt = if List.mem lfname list_nt then list_nt else [lfname :: list_nt] in loop list_nt list_ind pos j | NotesLinks.WLperson j key _ txt -> let list_ind = let link = {NotesLinks.lnTxt = txt; NotesLinks.lnPos = pos} in [(key, link) :: list_ind] in loop list_nt list_ind (pos + 1) j | NotesLinks.WLwizard j _ _ -> loop list_nt list_ind pos j | NotesLinks.WLnone -> loop list_nt list_ind pos (i + 1) ] in let bdir = Util.base_path [] (conf.bname ^ ".gwb") in NotesLinks.update_db bdir fnotes (list_nt, list_ind) ; value commit_notes conf base fnotes s = do { let pg = if fnotes = "" then NotesLinks.PgNotes else NotesLinks.PgMisc fnotes in let fname = path_of_fnotes fnotes in let fpath = List.fold_left Filename.concat (Util.base_path [] (conf.bname ^ ".gwb")) [base_notes_dir base; fname] in Mutil.mkdir_p (Filename.dirname fpath); try Gwdb.commit_notes base fname s with [ Sys_error _ -> do { incorrect_request conf; raise Update.ModErr } ]; History.record conf base (Def.U_Notes (p_getint conf.env "v") fnotes) "mn"; update_notes_links_db conf pg s; }; value print_mod_ok conf base = let fname = fun [ Some f -> if NotesLinks.check_file_name f <> None then f else "" | None -> "" ] in let edit_mode _ = if conf.wizard then Some "NOTES" else None in let mode = "NOTES" in let read_string = read_notes base in let commit = commit_notes conf base in let string_filter = string_with_macros conf [] in let file_path = file_path conf base in let wi = {Wiki.wi_mode = mode; Wiki.wi_cancel_links = conf.cancel_links; Wiki.wi_file_path = file_path; Wiki.wi_person_exists = person_exists conf base; Wiki.wi_always_show_link = conf.wizard || conf.friend} in Wiki.print_mod_ok conf wi edit_mode fname read_string commit string_filter True ; value begin_text_without_html_tags lim s = loop 0 0 0 where rec loop i size len = if i >= String.length s then Buff.get len else if size > lim && String.length s > i + 3 then Buff.get len ^ "..." else if s.[i] = '<' then let i = loop (i + 1) where rec loop i = if i = String.length s then i else if s.[i] = '>' then i + 1 else loop (i + 1) in loop i size len else if s.[i] = '=' then loop (i + 1) size len else let nbc = if utf_8_db.val then Name.nbc s.[i] else i + 1 in loop (i + nbc) (size + 1) (Buff.mstore len (String.sub s i nbc)) ; value print_misc_notes conf base = let d = match p_getenv conf.env "d" with [ Some d -> d | None -> "" ] in let title h = Wserver.wprint "%s" (if d = "" then capitale (Util.translate_eval (transl conf "miscellaneous notes")) else if h then "- " ^ d ^ " -" else "- " ^ d ^ " -") in let db = notes_links_db conf base True in let db = List.fold_right (fun (f, _) list -> if String.length f >= String.length d then if String.sub f 0 (String.length d) = d then let r = String.sub f (String.length d) (String.length f - String.length d) in if d = "" || r <> "" && r.[0] = NotesLinks.char_dir_sep then let r = if d = "" then r else String.sub r 1 (String.length r - 1) in try let i = String.index r NotesLinks.char_dir_sep in let r = String.sub r 0 i in match list with [ [(r', None) :: _] when r = r' -> list | _ -> [(r, None) :: list] ] with [ Not_found -> [(r, Some f) :: list] ] else list else list else list) db [] in do { header conf title; print_link_to_welcome conf True; if db <> [] then tag "ul" begin if d <> "" then tag "li" "class=\"parent\"" begin stag "a" "href=\"%sm=MISC_NOTES%s\"" (commd conf) (try let i = String.rindex d NotesLinks.char_dir_sep in let d = String.sub d 0 i in ";d=" ^ d with [ Not_found -> "" ]) begin Wserver.wprint "<--"; end; end else (); List.iter (fun (r, f) -> match f with [ Some f -> let txt = let (n, s) = read_notes base f in let t = try List.assoc "TITLE" n with [ Not_found -> "" ] in if t <> "" then t else if s = "" then "" else "" ^ begin_text_without_html_tags 50 s ^ "" in let c = let f = file_path conf base (path_of_fnotes f) in if Sys.file_exists f then "" else " style=\"color:red\"" in tag "li" "class=\"file\"" begin Wserver.wprint "["; stag "a" "href=\"%sm=NOTES;f=%s\"%s" (commd conf) f c begin Wserver.wprint "%s" r; end; Wserver.wprint "]%s\n" (if txt = "" then "" else " : " ^ txt); end | None -> tag "li" "class=\"folder\"" begin stag "tt" begin stag "a" "href=\"%sm=MISC_NOTES;d=%s\"" (commd conf) (if d = "" then r else d ^ String.make 1 NotesLinks.char_dir_sep ^ r) begin Wserver.wprint "%s " r; Wserver.wprint "-->"; end; end; end ]) db; end else (); if d = "" then print_search_form conf None else (); trailer conf; } ; (* searching *) value search_text conf base s = let s = if s = "" then " " else s in let case_sens = p_getenv conf.env "c" = Some "on" in let db = let db = notes_links_db conf base True in let db = ["" :: List.map fst db] in match p_getenv conf.env "z" with [ None -> db | Some f -> loop db where rec loop = fun [ [fnotes :: list] -> if f = fnotes then list else loop list | [] -> [] ] ] in let noteo = loop db where rec loop = fun [ [fnotes :: list] -> let (nenv, nt) = read_notes base fnotes in let tit = try List.assoc "TITLE" nenv with [ Not_found -> "" ] in if in_text case_sens s tit || in_text case_sens s nt then Some (fnotes, tit, nt) else loop list | [] -> None ] in match noteo with [ Some (fnotes, tit, nt) -> print_whole_notes conf base fnotes tit nt (Some (case_sens, s)) | None -> print_misc_notes conf base ] ; value print_misc_notes_search conf base = match try Some (List.assoc "s" conf.env) with [ Not_found -> None ] with [ Some s -> search_text conf base (Wserver.gen_decode False s) | None -> print_misc_notes conf base ] ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/calendar.ml0000660000175200017530000005753712664543647023334 0ustar guillaumeguillaume(* $Id: calendar.ml,v 5.1 2006-10-15 15:39:39 ddr Exp $ *) (* Borrowed from Scott E. Lee http://genealogy.org/~scottlee/; converted his C program into this OCaml program. SDN 1 is November 25, 4714 BC Gregorian calendar *) (* Changed gregorian and julian to work always with negative years (Scott's version worked only for years > -4800 *) open Def; value mydiv x y = if x >= 0 then x / y else (x - y + 1) / y; value mymod x y = if x >= 0 then x mod y else (x + 1) mod y + y - 1; (* gregorian *) value sdn_offset = 1721119; value days_per_5_months = 153; value days_per_4_years = 1461; value days_per_400_years = 146097; value sdn_of_gregorian d = let year = if d.year < 0 then d.year + 1 else d.year in let (month, year) = if d.month > 2 then (d.month - 3, year) else (d.month + 9, year - 1) in mydiv (mydiv year 100 * days_per_400_years) 4 + mydiv (mymod year 100 * days_per_4_years) 4 + (month * days_per_5_months + 2) / 5 + d.day + sdn_offset ; value gregorian_of_sdn prec sdn = let temp = (sdn - sdn_offset) * 4 - 1 in let century = mydiv temp days_per_400_years in let temp = (mydiv (mymod temp days_per_400_years) 4) * 4 + 3 in let year = (century * 100) + (mydiv temp days_per_4_years) in let dayOfYear = mydiv (mymod temp days_per_4_years) 4 + 1 in let temp = dayOfYear * 5 - 3 in let month = mydiv temp days_per_5_months in let day = mydiv (mymod temp days_per_5_months) 5 + 1 in let (month, year) = if month < 10 then (month + 3, year) else (month - 9, year + 1) in let year = if year <= 0 then year - 1 else year in {day = day; month = month; year = year; prec = prec; delta = 0} ; (* julian *) value sdn_offset = 1721117; value days_per_5_months = 153; value days_per_4_years = 1461; value sdn_of_julian d = let year = if d.year < 0 then d.year + 1 else d.year in let (month, year) = if d.month > 2 then (d.month - 3, year) else (d.month + 9, year - 1) in mydiv (year * days_per_4_years) 4 + (month * days_per_5_months + 2) / 5 + d.day + sdn_offset ; value julian_of_sdn prec sdn = let temp = (sdn - sdn_offset) * 4 - 1 in let year = mydiv temp days_per_4_years in let dayOfYear = mydiv (mymod temp days_per_4_years) 4 + 1 in let temp = dayOfYear * 5 - 3 in let month = mydiv temp days_per_5_months in let day = mydiv (mymod temp days_per_5_months) 5 + 1 in let (month, year) = if month < 10 then (month + 3, year) else (month - 9, year + 1) in let year = if year <= 0 then year - 1 else year in {day = day; month = month; year = year; prec = prec; delta = 0} ; (* french revolution *) (* this code comes from Remy Pialat; thanks to him *) value modulo pAngle pVal = let x = truncate (pAngle /. pVal) in let y = float x *. pVal in pAngle -. y ; value degVersRad pAngle = let a = modulo pAngle 360.0 in a *. 3.141592653589793 /. 180.0 ; value sinDeg pAngle = sin (degVersRad pAngle); value modulo360 pAngle = let angle = modulo pAngle 360.0 in if angle < 0.0 then angle +. 360.0 else angle ; value equinoxeAutomne pAnnee = let f = 12.0 in let q = 30.0 in let i = 0 in let k = 6.0 in let jd = (float pAnnee +. k /. f) *. 365.2422 +. 1721141.3 in loop i jd (-1.0) where rec loop i jd jdn = if abs_float (jd -. jdn) > 1.0E-12 && i + 1 < 20 then let i = i + 1 in let jdn = jd in let t = (jd -. 2415020.0) /. 36525.0 in let t2 = t *. t in let t3 = t2 *. t in let l = 279.69688 +. 36000.76892 *. t +. 3.025E-4 *. t2 in let m = 358.47583 +. 35999.04975 *. t -. 1.5E-4 *. t2 -. 3.3E-6 *. t3 in let ll = l +. (1.91946 -. 0.004789 *. t -. 1.4E-5 *. t2) *. sinDeg m +. (0.020094 -. 1.0E-4 *. t) *. sinDeg (2.0 *. m) +. 0.00293 *. sinDeg (3.0 *. m) in let ll = ll -. 0.00569 -. 0.00479 *. sinDeg (259.18 -. 1934.142 *. t) in let ll = modulo360 ll in let ll = if ll > 350.0 then ll -. 360.0 else ll in let jd = jd +. 1.014 *. (k *. q -. ll) in loop i jd jdn else let d = jd -. floor jd in let j = truncate jd in if d >= 0.5 then j + 1 else j ; value french_of_sdn prec sdn = let greg_date = gregorian_of_sdn prec sdn in let fst_vend_sdn = equinoxeAutomne greg_date.year in let (year, fst_vend_sdn) = if sdn < fst_vend_sdn then let fst_vend_sdn = equinoxeAutomne (greg_date.year - 1) in let year = greg_date.year - 1792 in (year, fst_vend_sdn) else let year = greg_date.year - 1791 in (year, fst_vend_sdn) in let ndays = sdn - fst_vend_sdn in let month = ndays / 30 + 1 in let day = ndays mod 30 + 1 in {day = day; month = month; year = year; prec = prec; delta = 0} ; value sdn_of_french d = let greg_year = d.year + 1791 in equinoxeAutomne greg_year + (d.month - 1) * 30 + d.day - 1 ; (* hebrew *) value halakim_per_hour = 1080; value halakim_per_day = 25920; value halakim_per_lunar_cycle = (29 * halakim_per_day) + 13753; value halakim_per_metonic_cycle = halakim_per_lunar_cycle * (12 * 19 + 7); value sdn_offset = 347997; value new_moon_of_creation = 31524; value sunday = 0; value monday = 1; value tuesday = 2; value wednesday = 3; value thursday = 4; value friday = 5; value saturday = 6; value noon = 18 * halakim_per_hour; value am3_11_20 = 9 * halakim_per_hour + 204; value am9_32_43 = 15 * halakim_per_hour + 589; value monthsPerYear = [| 12; 12; 13; 12; 12; 13; 12; 13; 12; 12; 13; 12; 12; 13; 12; 12; 13; 12; 13 |]; value yearOffset = [| 0; 12; 24; 37; 49; 61; 74; 86; 99; 111; 123; 136; 148; 160; 173; 185; 197; 210; 222 |]; value fTishri1 metonicYear moladDay moladHalakim = let tishri1 = moladDay in let dow = tishri1 mod 7 in let leapYear = match metonicYear with [ 2 | 5 | 7 | 10 | 13 | 16 | 18 -> True | _ -> False ] in let lastWasLeapYear = match metonicYear with [ 3 | 6 | 8 | 11 | 14 | 17 | 0 -> True | _ -> False ] in let (tishri1, dow) = if moladHalakim >= noon || not leapYear && dow = tuesday && moladHalakim >= am3_11_20 || lastWasLeapYear && dow = monday && moladHalakim >= am9_32_43 then let tishri1 = tishri1 + 1 in let dow = dow + 1 in let dow = if dow = 7 then 0 else dow in (tishri1, dow) else (tishri1, dow) in let tishri1 = if dow = wednesday || dow = friday || dow = sunday then tishri1 + 1 else tishri1 in tishri1 ; value moladOfMetonicCycle metonicCycle = let r1 = new_moon_of_creation in let r1 = r1 + metonicCycle * (halakim_per_metonic_cycle land 0xFFFF) in let r2 = r1 lsr 16 in let r2 = r2 + metonicCycle * ((halakim_per_metonic_cycle lsr 16) land 0xFFFF) in let d2 = r2 / halakim_per_day in let r2 = r2 - d2 * halakim_per_day in let r1 = 4. *. float (r2 lsl 14) +. float (r1 land 0xFFFF) in let d1 = truncate (r1 /. (float halakim_per_day) +. 0.5) in let r1 = truncate (r1 -. float d1 *. float halakim_per_day +. 0.5) in let pMoladDay = (d2 lsl 16) lor d1 in let pMoladHalakim = r1 in (pMoladDay, pMoladHalakim) ; value findStartOfYear year = let pMetonicCycle = (year - 1) / 19 in (* On prend la valeur absolue parce que (0 - 1) mod 19 = -1 *) (* et après, on fait un 'index out of bounds' dans yearOffset. *) let pMetonicYear = abs ((year - 1) mod 19) in let (pMoladDay, pMoladHalakim) = moladOfMetonicCycle pMetonicCycle in let pMoladHalakim = pMoladHalakim + halakim_per_lunar_cycle * yearOffset.(pMetonicYear) in let pMoladDay = pMoladDay + pMoladHalakim / halakim_per_day in let pMoladHalakim = pMoladHalakim mod halakim_per_day in let pTishri1 = fTishri1 pMetonicYear pMoladDay pMoladHalakim in (pMetonicCycle, pMetonicYear, pMoladDay, pMoladHalakim, pTishri1) ; value sdn_of_hebrew d = (* correction possible ? *) (* let d = { (d) with year = if d.year <= 0 then 1 else d.year } in *) let sdn = match d.month with [ 1 | 2 -> let (metonicCycle, metonicYear, moladDay, moladHalakim, tishri1) = findStartOfYear d.year in if d.month = 1 then tishri1 + d.day - 1 else tishri1 + d.day + 29 | 3 -> let (metonicCycle, metonicYear, moladDay, moladHalakim, tishri1) = findStartOfYear d.year in let moladHalakim = moladHalakim + halakim_per_lunar_cycle * monthsPerYear.(metonicYear) in let moladDay = moladDay + moladHalakim / halakim_per_day in let moladHalakim = moladHalakim mod halakim_per_day in let tishri1After = fTishri1 ((metonicYear + 1) mod 19) moladDay moladHalakim in let yearLength = tishri1After - tishri1 in if yearLength = 355 || yearLength = 385 then tishri1 + d.day + 59 else tishri1 + d.day + 58 | 4 | 5 | 6 -> let (metonicCycle, metonicYear, moladDay, moladHalakim, tishri1After) = findStartOfYear (d.year + 1) in (* On prend la valeur absolue parce que (0 - 1) mod 19 = -1 *) (* et après, on fait un 'index out of bounds' dans yearOffset. *) let lengthOfAdarIAndII = if monthsPerYear.(abs((d.year - 1) mod 19)) = 12 then 29 else 59 in if d.month = 4 then tishri1After + d.day - lengthOfAdarIAndII - 237 else if d.month = 5 then tishri1After + d.day - lengthOfAdarIAndII - 208 else tishri1After + d.day - lengthOfAdarIAndII - 178 | _ -> let (metonicCycle, metonicYear, moladDay, moladHalakim, tishri1After) = findStartOfYear (d.year + 1) in match d.month with [ 7 -> tishri1After + d.day - 207 | 8 -> tishri1After + d.day - 178 | 9 -> tishri1After + d.day - 148 | 10 -> tishri1After + d.day - 119 | 11 -> tishri1After + d.day - 89 | 12 -> tishri1After + d.day - 60 | 13 -> tishri1After + d.day - 30 | _ -> invalid_arg "sdn_of_hebrew" ] ] in sdn + sdn_offset ; value findTishriMolad inputDay = let metonicCycle = (inputDay + 310) / 6940 in let (moladDay, moladHalakim) = moladOfMetonicCycle metonicCycle in let (moladDay, moladHalakim, metonicCycle) = loop moladDay moladHalakim metonicCycle where rec loop moladDay moladHalakim metonicCycle = if moladDay < inputDay - 6940 + 310 then let metonicCycle = metonicCycle + 1 in let moladHalakim = moladHalakim + halakim_per_metonic_cycle in let moladDay = moladDay + moladHalakim / halakim_per_day in let moladHalakim = moladHalakim mod halakim_per_day in loop moladDay moladHalakim metonicCycle else (moladDay, moladHalakim, metonicCycle) in let (metonicYear, moladDay, moladHalakim) = loop 0 moladDay moladHalakim where rec loop metonicYear moladDay moladHalakim = if metonicYear < 18 then if moladDay > inputDay - 74 then (metonicYear, moladDay, moladHalakim) else let moladHalakim = moladHalakim + halakim_per_lunar_cycle * monthsPerYear.(metonicYear) in let moladDay = moladDay + moladHalakim / halakim_per_day in let moladHalakim = moladHalakim mod halakim_per_day in loop (metonicYear + 1) moladDay moladHalakim else (metonicYear, moladDay, moladHalakim) in (metonicCycle, metonicYear, moladDay, moladHalakim) ; value glop inputDay tishri1 tishri1After = let yearLength = tishri1After - tishri1 in let day = inputDay - tishri1 - 29 in if yearLength = 355 || yearLength = 385 then if day <= 30 then (2, day) else (3, day - 30) else if day <= 29 then (2, day) else (3, day - 29) ; value hebrew_of_sdn prec sdn = let inputDay = sdn - sdn_offset in let (year, month, day) = if inputDay <= 0 then (0, 0, 0) else let (metonicCycle, metonicYear, day, halakim) = findTishriMolad inputDay in let init_day = day in let tishri1 = fTishri1 metonicYear day halakim in if inputDay >= tishri1 then let year = metonicCycle * 19 + metonicYear + 1 in if inputDay < tishri1 + 59 then if inputDay < tishri1 + 30 then (year, 1, inputDay - tishri1 + 1) else (year, 2, inputDay - tishri1 - 29) else let halakim = halakim + halakim_per_lunar_cycle * monthsPerYear.(metonicYear) in let day = day + halakim / halakim_per_day in let halakim = halakim mod halakim_per_day in let tishri1After = fTishri1 ((metonicYear + 1) mod 19) day halakim in let (month, day) = glop inputDay tishri1 tishri1After in (year, month, day) else let year = metonicCycle * 19 + metonicYear in if inputDay >= tishri1 - 177 then let (month, day) = if inputDay > tishri1 - 30 then (13, inputDay - tishri1 + 30) else if inputDay > tishri1 - 60 then (12, inputDay - tishri1 + 60) else if inputDay > tishri1 - 89 then (11, inputDay - tishri1 + 89) else if inputDay > tishri1 - 119 then (10, inputDay - tishri1 + 119) else if inputDay > tishri1 - 148 then (9, inputDay - tishri1 + 148) else (8, inputDay - tishri1 + 178) in (year, month, day) else if monthsPerYear.((year - 1) mod 19) = 13 then let month = 7 in let day = inputDay - tishri1 + 207 in if day > 0 then (year, month, day) else let month = month - 1 in let day = day + 30 in if day > 0 then (year, month, day) else let month = month - 1 in let day = day + 30 in if day > 0 then (year, month, day) else let month = month - 1 in let day = day + 29 in if day > 0 then (year, month, day) else let tishri1After = tishri1 in let (metonicCycle, metonicYear, day, halakim) = findTishriMolad (init_day - 365) in let tishri1 = fTishri1 metonicYear day halakim in let (month, day) = glop inputDay tishri1 tishri1After in (year, month, day) else let month = 6 in let day = inputDay - tishri1 + 207 in if day > 0 then (year, month, day) else let month = month - 1 in let day = day + 30 in if day > 0 then (year, month, day) else let month = month - 1 in let day = day + 29 in if day > 0 then (year, month, day) else let tishri1After = tishri1 in let (metonicCycle, metonicYear, day, halakim) = findTishriMolad (init_day - 365) in let tishri1 = fTishri1 metonicYear day halakim in let (month, day) = glop inputDay tishri1 tishri1After in (year, month, day) in {day = day; month = month; year = year; prec = prec; delta = 0} ; (* from and to gregorian *) value conv f f_max_month g g_max_month d = let sdn = if d.day = 0 then if d.month = 0 then g {(d) with day = 1; month = 1} else g {(d) with day = 1} else g d in let sdn_max = if d.day = 0 then if d.month = 0 || d.month = g_max_month then g {day = 1; month = 1; year = d.year + 1; prec = d.prec; delta = 0} else g {day = 1; month = d.month + 1; year = d.year; prec = d.prec; delta = 0} else sdn + 1 in let d1 = f d.prec sdn in let d2 = f d.prec (sdn_max + d.delta) in if d1.day = 1 && d2.day = 1 then if d1.month = 1 && d2.month = 1 then if d1.year + 1 = d2.year then {day = 0; month = 0; year = d1.year; prec = d.prec; delta = 0} else {(d1) with delta = sdn_max + d.delta - sdn - 1} else if d1.month + 1 = d2.month || d1.month = f_max_month && d1.year + 1 = d2.year then {(d1) with day = 0} else {(d1) with delta = sdn_max + d.delta - sdn - 1} else {(d1) with delta = sdn_max + d.delta - sdn - 1} ; value gregorian_of_julian = conv gregorian_of_sdn 12 sdn_of_julian 12; value julian_of_gregorian = conv julian_of_sdn 12 sdn_of_gregorian 12; value gregorian_of_french = conv gregorian_of_sdn 12 sdn_of_french 13; value french_of_gregorian = conv french_of_sdn 13 sdn_of_gregorian 12; value gregorian_of_hebrew = conv gregorian_of_sdn 12 sdn_of_hebrew 13; value hebrew_of_gregorian = conv hebrew_of_sdn 13 sdn_of_gregorian 12; (* Moon phases *) (* Borrowed from G.Satre of CNRS's program found at: http://portail.imcce.fr/fr/ephemerides/astronomie/Promenade/pages4/441.html Program written in JavaScript; converted into OCaml with code cleaning and transforming for interface sdn -> moon-day: but I did not understand everything and the code could perhaps be improved *) type found 'a 'b = [ Found of 'a | NotYetFound of 'b ]; type moon_phase = [ NewMoon | FirstQuarter | FullMoon | LastQuarter ] ; value jjdate date_JJD = let z1 = date_JJD +. 0.5 in let z = truncate z1 in let a = if z < 2299161 then float z else let alpha = truncate ((float z -. 1867216.25) /. 36524.25) in float z +. 1. +. float alpha -. float (truncate (float alpha /. 4.0)) in let b = a +. 1524.0 in let c = float (truncate ((b -. 122.1) /. 365.25)) in let d = float (truncate (365.25 *. c)) in let e = float (truncate ((b -. d) /. 30.6001)) in let day = truncate (b -. d -. float (truncate (30.6001 *. e))) in let month = if e < 13.5 then truncate (e -. 1.0) else truncate (e -. 13.0) in let year = if month >= 3 then truncate (c -. 4716.0) else truncate (c -. 4715.0) in (day, month, year) ; value is_leap_year year = if year mod 4 = 0 then if year mod 100 = 0 && year mod 400 != 0 then False else True else False ; value init_moon_age month day leap_year = let nbdays = if month = 2 then if not leap_year then 28 else 29 else if month < 8 then if month land 1 != 0 then 31 else 30 else if month land 1 !=0 then 30 else 31 in nbdays - day + 2 ; value testmon i date first_moon_age_found date_JJD month_day moon_age = let d = float date.year /. 100.0 in let tetus = 32.23 *. (d -. 18.30) *. (d -. 18.30) -. 15.0 in let tetuj = tetus /. 86400.0 in let date_JJD = date_JJD +. 0.0003472222 -. tetuj in let (day, month, year) = jjdate date_JJD in let leap_year = is_leap_year year in let inside_month = month = date.month in let (month_day, moon_age) = if i = 0 && (date.month > month || month = 12 && date.month = 1) && not first_moon_age_found then (1, init_moon_age month day leap_year) else (month_day, moon_age) in (inside_month, date_JJD, leap_year, month_day, moon_age) ; value affmoph i date_JJD leap_year first_moon_age_found month_day moon_age date = let tabjm = [| 31; 28; 31; 30; 31; 30; 31; 31; 30; 31; 30; 31 |] in let (day, month, year) = jjdate date_JJD in let fracj = mod_float (date_JJD +. 0.5) 1.0 in let hh = fracj *. 24.0 in let hh = int_of_float (floor hh +. 0.1) in let fracj = fracj -. float hh /. 24.0 in let mm = fracj *. 1440.0 in let mm = int_of_float (floor mm +. 0.1) in let (jour, hh) = if hh = 24 then let jfin = tabjm.(month - 1) in let _ = assert (leap_year = is_leap_year year) in let jfin = if month = 2 && leap_year then 29 else jfin in if day < jfin then (day + 1, 0) else (day, hh) else (day, hh) in loop month_day moon_age where rec loop month_day moon_age = if month_day < day then if month_day = date.day then Found (None, moon_age) else loop (month_day + 1) (moon_age + 1) else if month_day = date.day then let r = match i with [ 0 -> (Some (NewMoon, hh, mm), 1) | 1 -> (Some (FirstQuarter, hh, mm), moon_age) | 2 -> (Some (FullMoon, hh, mm), moon_age) | _ -> (Some (LastQuarter, hh, mm), moon_age) ] in Found r else let (moon_age, first_moon_age_found) = if i = 0 then (2, True) else (moon_age + 1, first_moon_age_found) in NotYetFound (first_moon_age_found, month_day + 1, moon_age) ; value moon_phase_of_gregorian date = let pi314 = 3.141592653589793 in let tabm = [| 0.041; 0.126; 0.203; 0.288; 0.370; 0.455; 0.537; 0.622; 0.707; 0.789; 0.874; 0.956 |] in let (year, date_month) = if date.month = 1 then (date.year - 1, 12) else (date.year, date.month - 1) in let year = float year +. tabm.(date_month - 1) in let ini_k = let k = (year -. 1900.0) *. 12.3685 in let k = float (truncate k) -. 0.25 in if k < 0.0 then k -. 1. else k in let rad = pi314 /. 180.0 in loop 0 ini_k False False 0 0 where rec loop ii prev_k leap_year first_moon_age_found month_day moon_age = if ii >= 12 then let nbdays = if date.month = 2 then if not leap_year then 28 else 29 else if date.month < 8 then if date.month land 1 != 0 then 31 else 30 else if date.month land 1 !=0 then 30 else 31 in loop month_day moon_age where rec loop month_day moon_age = if month_day <= nbdays then if month_day = date.day then (None, moon_age) else loop (month_day + 1) (moon_age + 1) else failwith "moon_phase" else let k = prev_k +. 0.25 in let t = k /. 1236.85 in let t2 = t *. t in let t3 = t *. t2 in let j = 2415020.75933 +. 29.5305888531 *. k +. 0.0001337 *. t2 -. 0.000000150 *. t3 +. 0.00033 *. sin (rad *. (166.56 +. 132.87 *. t -. 0.009 *. t2)) in let m = rad *. (359.2242 +. 29.10535608 *. k -. 0.0000333 *. t2 -. 0.00000347 *. t3) in let m = mod_float m (2.0 *. pi314) in let mp = rad *. (306.0253 +. 385.81691806 *. k +. 0.0107306 *. t2 +. 0.00001236 *. t3) in let mp = mod_float mp (2. *. pi314) in let f = rad *. (21.2964 +. 390.67050646 *. k -. 0.0016528 *. t2 -. 0.00000239 *. t3) in let f = mod_float f (2. *. pi314) in let i = ii mod 4 in let date_JJD = if i = 0 || i = 2 then j +. (0.1734 -. 0.000393 *. t) *. sin m +. 0.0021 *. sin (2.0 *. m) -. 0.4068 *. sin mp +. 0.0161 *. sin (2.0 *. mp) -. 0.0004 *. sin (3.0 *. mp) +. 0.0104 *. sin (2.0 *. f) -. 0.0051 *. sin (m +. mp) -. 0.0074 *. sin (m -. mp) +. 0.0004 *. sin (2.0 *. f +. m) -. 0.0004 *. sin (2.0 *. f -. m) -. 0.0006 *. sin (2.0 *. f +. mp) +. 0.001 *. sin (2.0 *. f -. mp) +. 0.0005 *. sin (m +. 2.0 *. mp) else let j = j +. (0.1721 -. 0.0004 *. t) *. sin m +. 0.0021 *. sin (2.0 *. m) -. 0.6280 *. sin mp +. 0.0089 *. sin (2.0 *. mp) -. 0.0004 *. sin (3.0 *. mp) +. 0.0079 *. sin (2.0 *. f) -. 0.0119 *. sin (m +. mp) -. 0.0047 *. sin (m -. mp) +. 0.0003 *. sin (2.0 *. f +. m) -. 0.0004 *. sin (2.0 *. f -. m) -. 0.0006 *. sin (2.0 *. f +. mp) +. 0.0021 *. sin (2.0 *. f -. mp) +. 0.0003 *. sin (m +. 2.0 *. mp) +. 0.0004 *. sin (m -. 2.0 *. mp) -. 0.0003 *. sin (2.0 *. m +. mp) in if i = 1 then j +. 0.0028 -. 0.0004 *. cos m +. 0.0003 *. cos mp else j -. 0.0028 +. 0.0004 *. cos m -. 0.0003 *. cos mp in let (inside_month, date_JJD, leap_year, month_day, moon_age) = testmon i date first_moon_age_found date_JJD month_day moon_age in if inside_month then match affmoph i date_JJD leap_year first_moon_age_found month_day moon_age date with [ NotYetFound (first_moon_age_found, month_day, moon_age) -> loop (ii + 1) k leap_year first_moon_age_found month_day moon_age | Found x -> x ] else loop (ii + 1) k leap_year first_moon_age_found month_day moon_age ; value moon_phase_of_sdn jd = let date = gregorian_of_sdn Sure jd in if date.year < -4000 || date.year > 2500 then failwith "moon_phase_of_sdn" else moon_phase_of_gregorian date ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/lock.mli0000660000175200017530000000022512664543647022642 0ustar guillaumeguillaume(* $Id: lock.mli,v 5.0 2005-12-13 11:51:27 ddr Exp $ *) value no_lock_flag : ref bool; value control : string -> bool -> (unit -> 'a) -> option 'a; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/templ.mli0000660000175200017530000000226012664543647023034 0ustar guillaumeguillaume(* camlp5r *) (* $Id: templ.mli,v 5.8 2007-09-12 09:58:44 ddr Exp $ *) open Config; open Gwdb; open TemplAst; type vother 'a = 'abstract; type env 'a = list (string * 'a); value eval_transl : config -> bool -> string -> string -> string; value copy_from_templ : config -> list (string * string) -> in_channel -> unit; type interp_fun 'a 'b = { eval_var : env 'a -> 'b -> loc -> list string -> expr_val 'b; eval_transl : env 'a -> bool -> string -> string -> string; eval_predefined_apply : env 'a -> string -> list (expr_val 'b) -> string; get_vother : 'a -> option (vother 'b); set_vother : vother 'b -> 'a; print_foreach : (env 'a -> 'b -> ast -> unit) -> (env 'a -> 'b -> ast -> string) -> env 'a -> 'b -> loc -> string -> list string -> list (list ast) -> list ast -> unit } ; value interp_ast : config -> option base -> interp_fun 'a 'b -> env 'a -> 'b -> list ast -> unit; (**) value template_file : ref string; value input_templ : config -> string -> option (list ast); value print_copyright : config -> unit; value print_copyright_with_logo : config -> unit; value include_hed_trl : config -> option base -> string -> unit; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/btree.ml0000660000175200017530000000671112664543647022650 0ustar guillaumeguillaume(* $Id: btree.ml,v 5.2 2007-01-19 01:53:16 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) module type OrderedType = sig type t = 'a; value compare : t -> t -> int; end; module Make (Ord : OrderedType) = struct type key = Ord.t; type t 'a = [ Empty | Node of t 'a and key and 'a and t 'a and int ]; value empty = Empty; value height = fun [ Empty -> 0 | Node _ _ _ _ h -> h ] ; value create l x d r = let hl = height l and hr = height r in Node l x d r (if hl >= hr then hl + 1 else hr + 1) ; value bal l x d r = let hl = match l with [ Empty -> 0 | Node _ _ _ _ h -> h ] in let hr = match r with [ Empty -> 0 | Node _ _ _ _ h -> h ] in if hl > hr + 2 then match l with [ Empty -> invalid_arg "Map.bal" | Node ll lv ld lr _ -> if height ll >= height lr then create ll lv ld (create lr x d r) else match lr with [ Empty -> invalid_arg "Map.bal" | Node lrl lrv lrd lrr _ -> create (create ll lv ld lrl) lrv lrd (create lrr x d r) ] ] else if hr > hl + 2 then match r with [ Empty -> invalid_arg "Map.bal" | Node rl rv rd rr _ -> if height rr >= height rl then create (create l x d rl) rv rd rr else match rl with [ Empty -> invalid_arg "Map.bal" | Node rll rlv rld rlr _ -> create (create l x d rll) rlv rld (create rlr rv rd rr) ] ] else Node l x d r (if hl >= hr then hl + 1 else hr + 1) ; value rec add x data = fun [ Empty -> Node Empty x data Empty 1 | Node l v d r h -> let c = Ord.compare x v in if c = 0 then Node l x data r h else if c < 0 then bal (add x data l) v d r else bal l v d (add x data r) ] ; value rec find x = fun [ Empty -> raise Not_found | Node l v d r _ -> let c = Ord.compare x v in if c = 0 then d else find x (if c < 0 then l else r) ] ; value rec key_after f_compare = fun [ Empty -> raise Not_found | Node l v d r _ -> let c = f_compare v in if c < 0 then try key_after f_compare l with [ Not_found -> v ] else if c > 0 then key_after f_compare r else v ] ; value rec next x = fun [ Empty -> raise Not_found | Node l v d r _ -> let c = Ord.compare x v in if c < 0 then try next x l with [ Not_found -> v ] else next x r ] ; value rec merge t1 t2 = match (t1, t2) with [ (Empty, t) -> t | (t, Empty) -> t | (Node l1 v1 d1 r1 h1, Node l2 v2 d2 r2 h2) -> bal l1 v1 d1 (bal (merge r1 l2) v2 d2 r2) ] ; value rec remove x = fun [ Empty -> Empty | Node l v d r h -> let c = Ord.compare x v in if c = 0 then merge l r else if c < 0 then bal (remove x l) v d r else bal l v d (remove x r) ] ; value rec iter f = fun [ Empty -> () | Node l v d r _ -> do { iter f l; f v d; iter f r } ] ; value rec map f = fun [ Empty -> Empty | Node l v d r h -> Node (map f l) v (f d) (map f r) h ] ; value rec fold f m accu = match m with [ Empty -> accu | Node l v d r _ -> fold f l (f v d (fold f r accu)) ] ; end ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/.depend0000660000175200017530000006253012664543647022456 0ustar guillaumeguillaumeadef.cmo: adef.cmi adef.cmx: adef.cmi advSearchOk.cmo: adef.cmi checkItem.cmi config.cmi date.cmi def.cmi \ gutil.cmi gwdb.cmi hutil.cmi name.cmi some.cmo util.cmi \ num.cmi perso.cmi ../wserver/wserver.cmi advSearchOk.cmx: adef.cmx checkItem.cmx config.cmi date.cmx def.cmi \ gutil.cmx gwdb.cmx hutil.cmx name.cmx some.cmx util.cmx \ num.cmx perso.cmx ../wserver/wserver.cmx alln.cmo: buff.cmo config.cmi def.cmi gutil.cmi gwdb.cmi hutil.cmi mutil.cmi \ name.cmi util.cmi ../wserver/wserver.cmi alln.cmx: buff.cmx config.cmi def.cmi gutil.cmx gwdb.cmx hutil.cmx mutil.cmx \ name.cmx util.cmx ../wserver/wserver.cmx birthDeath.cmo: adef.cmi checkItem.cmi config.cmi date.cmi def.cmi gwdb.cmi \ hutil.cmi num.cmi pqueue.cmi templ.cmi util.cmi ../wserver/wserver.cmi birthDeath.cmx: adef.cmx checkItem.cmx config.cmi date.cmx def.cmi gwdb.cmx \ hutil.cmx num.cmx pqueue.cmx templ.cmx util.cmx ../wserver/wserver.cmx birthday.cmo: adef.cmi checkItem.cmi config.cmi date.cmi def.cmi gwdb.cmi \ hutil.cmi util.cmi perso.cmi ../wserver/wserver.cmi birthday.cmx: adef.cmx checkItem.cmx config.cmi date.cmx def.cmi gwdb.cmx \ hutil.cmx util.cmx perso.cmx ../wserver/wserver.cmx calendar.cmo: def.cmi calendar.cmi calendar.cmx: def.cmi calendar.cmi calendar.cmi: def.cmi changeChildren.cmo: adef.cmi config.cmi date.cmi def.cmi gutil.cmi gwdb.cmi \ history.cmi hutil.cmi iovalue.cmi name.cmi update.cmi util.cmi perso.cmi \ ../wserver/wserver.cmi changeChildren.cmx: adef.cmx config.cmi date.cmx def.cmi gutil.cmx gwdb.cmx \ history.cmx hutil.cmx iovalue.cmx name.cmx update.cmx util.cmx perso.cmx \ ../wserver/wserver.cmx check.cmo: adef.cmi checkItem.cmi consang.cmi def.cmi gwdb.cmi mutil.cmi \ progrBar.cmi check.cmi check.cmx: adef.cmx checkItem.cmx consang.cmx def.cmi gwdb.cmx mutil.cmx \ progrBar.cmx check.cmi check.cmi: checkItem.cmi def.cmi gwdb.cmi checkItem.cmo: adef.cmi def.cmi gwdb.cmi checkItem.cmi checkItem.cmx: adef.cmx def.cmi gwdb.cmx checkItem.cmi checkItem.cmi: adef.cmi def.cmi gwdb.cmi check_base.cmo: check.cmi def.cmi gwdb.cmi secure.cmi check_base.cmx: check.cmx def.cmi gwdb.cmx secure.cmx compilation.cmo: def.cmi util.cmi compilation.cmx: def.cmi util.cmx config.cmi: def.cmi consang.cmo: adef.cmi def.cmi gwdb.cmi consang.cmi consang.cmx: adef.cmx def.cmi gwdb.cmx consang.cmi consang.cmi: def.cmi gwdb.cmi consangAll.cmo: adef.cmi consang.cmi def.cmi gwdb.cmi mutil.cmi progrBar.cmi \ consangAll.cmi consangAll.cmx: adef.cmx consang.cmx def.cmi gwdb.cmx mutil.cmx progrBar.cmx \ consangAll.cmi consangAll.cmi: adef.cmi gwdb.cmi cousins.cmo: adef.cmi birthday.cmo config.cmi date.cmi def.cmi gutil.cmi \ gwdb.cmi hutil.cmi num.cmi perso.cmi pqueue.cmi util.cmi \ ../wserver/wserver.cmi cousins.cmx: adef.cmx birthday.cmx config.cmi date.cmx def.cmi gutil.cmx \ gwdb.cmx hutil.cmx num.cmx perso.cmx pqueue.cmx util.cmx \ ../wserver/wserver.cmx dag.cmo: buff.cmo config.cmi ../dag2html/dag2html.cmi date.cmi def.cmi \ gutil.cmi gwdb.cmi hutil.cmi mutil.cmi name.cmi num.cmi templ.cmi \ templAst.cmi util.cmi ../wserver/wserver.cmi dag.cmi dag.cmx: buff.cmx config.cmi ../dag2html/dag2html.cmx date.cmx def.cmi \ gutil.cmx gwdb.cmx hutil.cmx mutil.cmx name.cmx num.cmx templ.cmx \ templAst.cmi util.cmx ../wserver/wserver.cmx dag.cmi dag.cmi: config.cmi ../dag2html/dag2html.cmi def.cmi gwdb.cmi database.cmo: adef.cmi btree.cmo buff.cmo dbdisk.cmi def.cmi dutil.cmi \ iovalue.cmi mutil.cmi name.cmi secure.cmi database.cmi database.cmx: adef.cmx btree.cmx buff.cmx dbdisk.cmi def.cmi dutil.cmx \ iovalue.cmx mutil.cmx name.cmx secure.cmx database.cmi database.cmi: dbdisk.cmi date.cmo: adef.cmi buff.cmo calendar.cmi checkItem.cmi config.cmi def.cmi \ gutil.cmi gwdb.cmi hutil.cmi mutil.cmi templ.cmi templAst.cmi \ templDate.cmi util.cmi ../wserver/wserver.cmi date.cmi date.cmx: adef.cmx buff.cmx calendar.cmx checkItem.cmx config.cmi def.cmi \ gutil.cmx gwdb.cmx hutil.cmx mutil.cmx templ.cmx templAst.cmi \ templDate.cmx util.cmx ../wserver/wserver.cmx date.cmi date.cmi: config.cmi def.cmi gwdb.cmi db1link.cmo: adef.cmi check.cmi consangAll.cmi dbdisk.cmi def.cmi futil.cmi \ gwcomp.cmi gwdb.cmi iovalue.cmi mutil.cmi name.cmi notesLinks.cmi \ outbase.cmi db1link.cmi db1link.cmx: adef.cmx check.cmx consangAll.cmx dbdisk.cmi def.cmi futil.cmx \ gwcomp.cmx gwdb.cmx iovalue.cmx mutil.cmx name.cmx notesLinks.cmx \ outbase.cmx db1link.cmi db1link.cmi: def.cmi gwcomp.cmi db2.cmo: adef.cmi db2.cmi db2.cmx: adef.cmx db2.cmi db2.cmi: adef.cmi db2disk.cmo: adef.cmi buff.cmo db2.cmi def.cmi iovalue.cmi mutil.cmi \ name.cmi secure.cmi db2disk.cmi db2disk.cmx: adef.cmx buff.cmx db2.cmx def.cmi iovalue.cmx mutil.cmx \ name.cmx secure.cmx db2disk.cmi db2disk.cmi: adef.cmi def.cmi db2link.cmo: adef.cmi check.cmi consangAll.cmi db2.cmi db2out.cmi def.cmi \ futil.cmi gwcomp.cmi gwdb.cmi iochan.cmi iovalue.cmi mutil.cmi name.cmi \ notesLinks.cmi db2link.cmi db2link.cmx: adef.cmx check.cmx consangAll.cmx db2.cmx db2out.cmx def.cmi \ futil.cmx gwcomp.cmx gwdb.cmx iochan.cmx iovalue.cmx mutil.cmx name.cmx \ notesLinks.cmx db2link.cmi db2link.cmi: gwcomp.cmi db2out.cmo: db2.cmi def.cmi futil.cmi iovalue.cmi mutil.cmi name.cmi \ progrBar.cmi db2out.cmi db2out.cmx: db2.cmx def.cmi futil.cmx iovalue.cmx mutil.cmx name.cmx \ progrBar.cmx db2out.cmi dbdisk.cmi: adef.cmi def.cmi def.cmi: adef.cmi descend.cmo: adef.cmi config.cmi dag.cmi ../dag2html/dag2html.cmi date.cmi \ def.cmi gutil.cmi gwdb.cmi hutil.cmi mutil.cmi perso.cmi util.cmi \ ../wserver/wserver.cmi descend.cmx: adef.cmx config.cmi dag.cmx ../dag2html/dag2html.cmx date.cmx \ def.cmi gutil.cmx gwdb.cmx hutil.cmx mutil.cmx perso.cmx util.cmx \ ../wserver/wserver.cmx diff.cmo: diff.cmi diff.cmx: diff.cmi doc.cmo: buff.cmo config.cmi hutil.cmi notesLinks.cmi secure.cmi templ.cmi \ templAst.cmi util.cmi wiki.cmi ../wserver/wserver.cmi doc.cmx: buff.cmx config.cmi hutil.cmx notesLinks.cmx secure.cmx templ.cmx \ templAst.cmi util.cmx wiki.cmx ../wserver/wserver.cmx dutil.cmo: adef.cmi dbdisk.cmi def.cmi futil.cmi mutil.cmi dutil.cmi dutil.cmx: adef.cmx dbdisk.cmi def.cmi futil.cmx mutil.cmx dutil.cmi dutil.cmi: dbdisk.cmi def.cmi forum.cmo: buff.cmo config.cmi date.cmi def.cmi gutil.cmi hutil.cmi \ mutil.cmi notes.cmi secure.cmi templ.cmi templAst.cmi update.cmi \ util.cmi wiki.cmi ../wserver/wserver.cmi forum.cmx: buff.cmx config.cmi date.cmx def.cmi gutil.cmx hutil.cmx \ mutil.cmx notes.cmx secure.cmx templ.cmx templAst.cmi update.cmx \ util.cmx wiki.cmx ../wserver/wserver.cmx fpla.cmo: adef.cmi argl.cmo gwdb.cmi secure.cmi fpla.cmx: adef.cmx argl.cmx gwdb.cmx secure.cmx futil.cmo: adef.cmi def.cmi mutil.cmi name.cmi futil.cmi futil.cmx: adef.cmx def.cmi mutil.cmx name.cmx futil.cmi futil.cmi: def.cmi gutil.cmo: adef.cmi buff.cmo checkItem.cmi def.cmi gwdb.cmi mutil.cmi \ name.cmi gutil.cmi gutil.cmx: adef.cmx buff.cmx checkItem.cmx def.cmi gwdb.cmx mutil.cmx \ name.cmx gutil.cmi gutil.cmi: def.cmi gwdb.cmi gwc.cmo: argl.cmo db1link.cmi gwcomp.cmi lock.cmi mutil.cmi outbase.cmi \ progrBar.cmi secure.cmi gwc.cmx: argl.cmx db1link.cmx gwcomp.cmx lock.cmx mutil.cmx outbase.cmx \ progrBar.cmx secure.cmx gwc2.cmo: argl.cmo db2link.cmi gwcomp.cmi lock.cmi mutil.cmi progrBar.cmi \ secure.cmi gwc2.cmx: argl.cmx db2link.cmx gwcomp.cmx lock.cmx mutil.cmx progrBar.cmx \ secure.cmx gwcomp.cmo: adef.cmi calendar.cmi def.cmi mutil.cmi gwcomp.cmi gwcomp.cmx: adef.cmx calendar.cmx def.cmi mutil.cmx gwcomp.cmi gwcomp.cmi: def.cmi gwd.cmo: adef.cmi argl.cmo base64.cmo buff.cmo config.cmi def.cmi doc.cmo \ gutil.cmi hutil.cmi image.cmo lock.cmi mutil.cmi name.cmi \ relationLink.cmi request.cmi robot.cmo secure.cmi srcfile.cmi util.cmi \ templ.cmi version.cmo ../wserver/wserver.cmi gwd.cmx: adef.cmx argl.cmx base64.cmx buff.cmx config.cmi def.cmi doc.cmx \ gutil.cmx hutil.cmx image.cmx lock.cmx mutil.cmx name.cmx \ relationLink.cmx request.cmx robot.cmx secure.cmx srcfile.cmx util.cmx \ templ.cmx version.cmx ../wserver/wserver.cmx gwdb.cmo: adef.cmi database.cmi db2.cmi db2disk.cmi dbdisk.cmi def.cmi \ futil.cmi mutil.cmi name.cmi secure.cmi gwdb.cmi gwdb.cmx: adef.cmx database.cmx db2.cmx db2disk.cmx dbdisk.cmi def.cmi \ futil.cmx mutil.cmx name.cmx secure.cmx gwdb.cmi gwdb.cmi: adef.cmi db2disk.cmi dbdisk.cmi def.cmi gwu.cmo: adef.cmi argl.cmo buff.cmo calendar.cmi def.cmi gutil.cmi gwdb.cmi \ mutil.cmi notesLinks.cmi progrBar.cmi secure.cmi select.cmo gwu.cmx: adef.cmx argl.cmx buff.cmx calendar.cmx def.cmi gutil.cmx gwdb.cmx \ mutil.cmx notesLinks.cmx progrBar.cmx secure.cmx select.cmx history.cmo: adef.cmi buff.cmo config.cmi date.cmi def.cmi gutil.cmi \ gwdb.cmi hutil.cmi mutil.cmi secure.cmi templ.cmi templAst.cmi util.cmi \ history_diff.cmi ../wserver/wserver.cmi history.cmi history.cmx: adef.cmx buff.cmx config.cmi date.cmx def.cmi gutil.cmx \ gwdb.cmx hutil.cmx mutil.cmx secure.cmx templ.cmx templAst.cmi util.cmx \ history_diff.cmx ../wserver/wserver.cmx history.cmi history_diff.cmo: adef.cmi buff.cmo config.cmi date.cmi def.cmi gutil.cmi \ gwdb.cmi hutil.cmi mutil.cmi secure.cmi templ.cmi templAst.cmi util.cmi \ ../wserver/wserver.cmi history_diff.cmx: adef.cmx buff.cmx config.cmi date.cmx def.cmi gutil.cmx \ gwdb.cmx hutil.cmx mutil.cmx secure.cmx templ.cmx templAst.cmi util.cmx \ ../wserver/wserver.cmx history.cmi: config.cmi def.cmi gwdb.cmi hutil.cmo: config.cmi templ.cmi util.cmi ../wserver/wserver.cmi hutil.cmi hutil.cmx: config.cmi templ.cmx util.cmx ../wserver/wserver.cmx hutil.cmi hutil.cmi: config.cmi gwdb.cmi templ.cmi image.cmo: config.cmi hutil.cmi mutil.cmi secure.cmi util.cmi \ ../wserver/wserver.cmi image.cmi image.cmx: config.cmi hutil.cmx mutil.cmx secure.cmx util.cmx \ ../wserver/wserver.cmx image.cmi image.cmi: config.cmi gwdb.cmi iochan.cmo: iovalue.cmi iochan.cmi iochan.cmx: iovalue.cmx iochan.cmi iovalue.cmo: iovalue.cmi iovalue.cmx: iovalue.cmi lock.cmo: lock.cmi lock.cmx: lock.cmi merge.cmo: adef.cmi config.cmi date.cmi def.cmi gutil.cmi gwdb.cmi hutil.cmi \ util.cmi perso.cmi ../wserver/wserver.cmi merge.cmi merge.cmx: adef.cmx config.cmi date.cmx def.cmi gutil.cmx gwdb.cmx hutil.cmx \ util.cmx perso.cmx ../wserver/wserver.cmx merge.cmi merge.cmi: config.cmi gwdb.cmi mergeDup.cmo: adef.cmi config.cmi date.cmi gwdb.cmi hutil.cmi mergeFam.cmo \ mergeInd.cmo perso.cmi util.cmi ../wserver/wserver.cmi mergeDup.cmx: adef.cmx config.cmi date.cmx gwdb.cmx hutil.cmx mergeFam.cmx \ mergeInd.cmx perso.cmx util.cmx ../wserver/wserver.cmx mergeFam.cmo: adef.cmi config.cmi date.cmi def.cmi gwdb.cmi hutil.cmi \ mergeFamOk.cmo util.cmi ../wserver/wserver.cmi mergeFam.cmx: adef.cmx config.cmi date.cmx def.cmi gwdb.cmx hutil.cmx \ mergeFamOk.cmx util.cmx ../wserver/wserver.cmx mergeFamOk.cmo: adef.cmi config.cmi def.cmi futil.cmi gutil.cmi gwdb.cmi \ history.cmi hutil.cmi merge.cmi update.cmi updateFam.cmi updateFamOk.cmo \ util.cmi ../wserver/wserver.cmi mergeFamOk.cmx: adef.cmx config.cmi def.cmi futil.cmx gutil.cmx gwdb.cmx \ history.cmx hutil.cmx merge.cmx update.cmx updateFam.cmx updateFamOk.cmx \ util.cmx ../wserver/wserver.cmx mergeInd.cmo: adef.cmi checkItem.cmi config.cmi date.cmi def.cmi futil.cmi \ gutil.cmi gwdb.cmi history.cmi hutil.cmi merge.cmi mergeFam.cmo \ notes.cmi notesLinks.cmi update.cmi updateFamOk.cmo updateIndOk.cmi \ util.cmi ../wserver/wserver.cmi mergeInd.cmx: adef.cmx checkItem.cmx config.cmi date.cmx def.cmi futil.cmx \ gutil.cmx gwdb.cmx history.cmx hutil.cmx merge.cmx mergeFam.cmx \ notes.cmx notesLinks.cmx update.cmx updateFamOk.cmx updateIndOk.cmx \ util.cmx ../wserver/wserver.cmx mergeIndOk.cmo: adef.cmi config.cmi consang.cmi def.cmi futil.cmi gutil.cmi \ gwdb.cmi history.cmi hutil.cmi merge.cmi mergeInd.cmo mutil.cmi \ update.cmi updateInd.cmi updateIndOk.cmi util.cmi ../wserver/wserver.cmi mergeIndOk.cmx: adef.cmx config.cmi consang.cmx def.cmi futil.cmx gutil.cmx \ gwdb.cmx history.cmx hutil.cmx merge.cmx mergeInd.cmx mutil.cmx \ update.cmx updateInd.cmx updateIndOk.cmx util.cmx ../wserver/wserver.cmx mk_consang.cmo: adef.cmi argl.cmo consang.cmi consangAll.cmi db2.cmi \ db2disk.cmi db2out.cmi def.cmi futil.cmi gwdb.cmi iovalue.cmi lock.cmi \ mutil.cmi name.cmi outbase.cmi secure.cmi mk_consang.cmx: adef.cmx argl.cmx consang.cmx consangAll.cmx db2.cmx \ db2disk.cmx db2out.cmx def.cmi futil.cmx gwdb.cmx iovalue.cmx lock.cmx \ mutil.cmx name.cmx outbase.cmx secure.cmx mostdesc.cmo: adef.cmi argl.cmo consang.cmi def.cmi gwdb.cmi name.cmi \ num.cmi pqueue.cmi secure.cmi mostdesc.cmx: adef.cmx argl.cmx consang.cmx def.cmi gwdb.cmx name.cmx \ num.cmx pqueue.cmx secure.cmx mutil.cmo: buff.cmo iovalue.cmi name.cmi mutil.cmi mutil.cmx: buff.cmx iovalue.cmx name.cmx mutil.cmi name.cmo: buff.cmo name.cmi name.cmx: buff.cmx name.cmi notes.cmo: buff.cmo config.cmi date.cmi gutil.cmi gwdb.cmi history.cmi \ hutil.cmi mutil.cmi name.cmi notesLinks.cmi templ.cmi update.cmi \ util.cmi wiki.cmi ../wserver/wserver.cmi notes.cmi notes.cmx: buff.cmx config.cmi date.cmx gutil.cmx gwdb.cmx history.cmx \ hutil.cmx mutil.cmx name.cmx notesLinks.cmx templ.cmx update.cmx \ util.cmx wiki.cmx ../wserver/wserver.cmx notes.cmi notes.cmi: config.cmi gwdb.cmi notesLinks.cmi notesLinks.cmo: def.cmi mutil.cmi name.cmi notesLinks.cmi notesLinks.cmx: def.cmi mutil.cmx name.cmx notesLinks.cmi notesLinks.cmi: def.cmi num.cmo: num.cmi num.cmx: num.cmi outbase.cmo: adef.cmi btree.cmo dbdisk.cmi def.cmi dutil.cmi iovalue.cmi \ mutil.cmi name.cmi secure.cmi outbase.cmi outbase.cmx: adef.cmx btree.cmx dbdisk.cmi def.cmi dutil.cmx iovalue.cmx \ mutil.cmx name.cmx secure.cmx outbase.cmi outbase.cmi: dbdisk.cmi perso.cmo: adef.cmi buff.cmo checkItem.cmi config.cmi dag.cmi date.cmi \ def.cmi futil.cmi gutil.cmi gwdb.cmi hutil.cmi mutil.cmi name.cmi \ notes.cmi notesLinks.cmi num.cmi srcfile.cmi templ.cmi templAst.cmi \ util.cmi wiki.cmi ../wserver/wserver.cmi perso.cmi perso.cmx: adef.cmx buff.cmx checkItem.cmx config.cmi dag.cmx date.cmx \ def.cmi futil.cmx gutil.cmx gwdb.cmx hutil.cmx mutil.cmx name.cmx \ notes.cmx notesLinks.cmx num.cmx srcfile.cmx templ.cmx templAst.cmi \ util.cmx wiki.cmx ../wserver/wserver.cmx perso.cmi perso.cmi: adef.cmi config.cmi gwdb.cmi phonygwd.cmo: argl.cmo secure.cmi ../wserver/wserver.cmi phonygwd.cmx: argl.cmx secure.cmx ../wserver/wserver.cmx place.cmo: adef.cmi config.cmi def.cmi gwdb.cmi hutil.cmi mutil.cmi util.cmi \ history.cmi ../wserver/wserver.cmi place.cmx: adef.cmx config.cmi def.cmi gwdb.cmx hutil.cmx mutil.cmx util.cmx \ history.cmx ../wserver/wserver.cmx pqueue.cmo: pqueue.cmi pqueue.cmx: pqueue.cmi progrBar.cmo: progrBar.cmi progrBar.cmx: progrBar.cmi relation.cmo: adef.cmi config.cmi consang.cmi dag.cmi \ ../dag2html/dag2html.cmi def.cmi gutil.cmi gwdb.cmi hutil.cmi num.cmi \ perso.cmi relationLink.cmi util.cmi ../wserver/wserver.cmi relation.cmx: adef.cmx config.cmi consang.cmx dag.cmx \ ../dag2html/dag2html.cmx def.cmi gutil.cmx gwdb.cmx hutil.cmx num.cmx \ perso.cmx relationLink.cmx util.cmx ../wserver/wserver.cmx relationLink.cmo: adef.cmi config.cmi dag.cmi date.cmi def.cmi gwdb.cmi \ hutil.cmi num.cmi pqueue.cmi util.cmi ../wserver/wserver.cmi \ relationLink.cmi relationLink.cmx: adef.cmx config.cmi dag.cmx date.cmx def.cmi gwdb.cmx \ hutil.cmx num.cmx pqueue.cmx util.cmx ../wserver/wserver.cmx \ relationLink.cmi relationLink.cmi: config.cmi def.cmi gwdb.cmi request.cmo: adef.cmi advSearchOk.cmo alln.cmo birthDeath.cmo birthday.cmo \ buff.cmo changeChildren.cmo config.cmi cousins.cmo dag.cmi date.cmi \ def.cmi descend.cmo doc.cmo forum.cmo gutil.cmi gwdb.cmi history.cmi \ hutil.cmi image.cmo lock.cmi merge.cmi mergeDup.cmo mergeFam.cmo \ mergeFamOk.cmo mergeInd.cmo mergeIndOk.cmo mutil.cmi name.cmi notes.cmi \ num.cmi perso.cmi place.cmo relation.cmo relationLink.cmi secure.cmi \ sendImage.cmo some.cmo searchName.cmo srcfile.cmi title.cmo update.cmi \ updateFam.cmi updateFamOk.cmo updateInd.cmi updateIndOk.cmi util.cmi \ wiznotes.cmi updateData.cmo ../wserver/wserver.cmi request.cmi request.cmx: adef.cmx advSearchOk.cmx alln.cmx birthDeath.cmx birthday.cmx \ buff.cmx changeChildren.cmx config.cmi cousins.cmx dag.cmx date.cmx \ def.cmi descend.cmx doc.cmx forum.cmx gutil.cmx gwdb.cmx history.cmx \ hutil.cmx image.cmx lock.cmx merge.cmx mergeDup.cmx mergeFam.cmx \ mergeFamOk.cmx mergeInd.cmx mergeIndOk.cmx mutil.cmx name.cmx notes.cmx \ num.cmx perso.cmx place.cmx relation.cmx relationLink.cmx secure.cmx \ sendImage.cmx some.cmx searchName.cmx srcfile.cmx title.cmx update.cmx \ updateFam.cmx updateFamOk.cmx updateInd.cmx updateIndOk.cmx util.cmx \ wiznotes.cmx updateData.cmx ../wserver/wserver.cmx request.cmi request.cmi: config.cmi robot.cmo: config.cmi secure.cmi srcfile.cmi util.cmi templ.cmi \ ../wserver/wserver.cmi robot.cmx: config.cmi secure.cmx srcfile.cmx util.cmx templ.cmx \ ../wserver/wserver.cmx searchName.cmo: adef.cmi buff.cmo checkItem.cmi config.cmi date.cmi def.cmi \ gutil.cmi gwdb.cmi hutil.cmi mutil.cmi name.cmi util.cmi \ num.cmi perso.cmi ../wserver/wserver.cmi searchName.cmx: adef.cmx buff.cmx checkItem.cmx config.cmi date.cmx def.cmi \ gutil.cmx gwdb.cmx hutil.cmx mutil.cmx name.cmx util.cmx \ num.cmx perso.cmx ../wserver/wserver.cmx secure.cmo: secure.cmi secure.cmx: secure.cmi select.cmo: adef.cmi def.cmi gutil.cmi gwdb.cmi name.cmi select.cmx: adef.cmx def.cmi gutil.cmx gwdb.cmx name.cmx sendImage.cmo: adef.cmi buff.cmo config.cmi def.cmi gutil.cmi gwdb.cmi \ history.cmi hutil.cmi secure.cmi update.cmi updateInd.cmi util.cmi \ perso.cmi ../wserver/wserver.cmi sendImage.cmx: adef.cmx buff.cmx config.cmi def.cmi gutil.cmx gwdb.cmx \ history.cmx hutil.cmx secure.cmx update.cmx updateInd.cmx util.cmx \ perso.cmx ../wserver/wserver.cmx some.cmo: adef.cmi buff.cmo checkItem.cmi config.cmi date.cmi def.cmi \ gutil.cmi gwdb.cmi hutil.cmi mutil.cmi name.cmi util.cmi \ num.cmi perso.cmi ../wserver/wserver.cmi some.cmx: adef.cmx buff.cmx checkItem.cmx config.cmi date.cmx def.cmi \ gutil.cmx gwdb.cmx hutil.cmx mutil.cmx name.cmx util.cmx \ num.cmx perso.cmx ../wserver/wserver.cmx updateData.cmo: adef.cmi config.cmi def.cmi gwdb.cmi hutil.cmi mutil.cmi util.cmi \ history.cmi ../wserver/wserver.cmi updateData.cmx: adef.cmx config.cmi def.cmi gwdb.cmx hutil.cmx mutil.cmx util.cmx \ history.cmx ../wserver/wserver.cmx srcfile.cmo: buff.cmo config.cmi date.cmi def.cmi gwdb.cmi history.cmi \ hutil.cmi lock.cmi mutil.cmi notesLinks.cmi num.cmi secure.cmi templ.cmi \ templAst.cmi translate.cmi util.cmi version.cmo wiznotes.cmi \ ../wserver/wserver.cmi srcfile.cmi srcfile.cmx: buff.cmx config.cmi date.cmx def.cmi gwdb.cmx history.cmx \ hutil.cmx lock.cmx mutil.cmx notesLinks.cmx num.cmx secure.cmx templ.cmx \ templAst.cmi translate.cmx util.cmx version.cmx wiznotes.cmx \ ../wserver/wserver.cmx srcfile.cmi srcfile.cmi: config.cmi gwdb.cmi templ.cmo: buff.cmo calendar.cmi config.cmi mutil.cmi num.cmi secure.cmi \ templAst.cmi templDate.cmi translate.cmi util.cmi version.cmo \ ../wserver/wserver.cmi templ.cmi templ.cmx: buff.cmx calendar.cmx config.cmi mutil.cmx num.cmx secure.cmx \ templAst.cmi templDate.cmx translate.cmx util.cmx version.cmx \ ../wserver/wserver.cmx templ.cmi templ.cmi: config.cmi gwdb.cmi templAst.cmi templDate.cmo: calendar.cmi config.cmi def.cmi mutil.cmi num.cmi \ templAst.cmi util.cmi templDate.cmi templDate.cmx: calendar.cmx config.cmi def.cmi mutil.cmx num.cmx \ templAst.cmi util.cmx templDate.cmi templDate.cmi: config.cmi templAst.cmi title.cmo: adef.cmi checkItem.cmi config.cmi date.cmi def.cmi gutil.cmi \ gwdb.cmi hutil.cmi mutil.cmi name.cmi util.cmi ../wserver/wserver.cmi title.cmx: adef.cmx checkItem.cmx config.cmi date.cmx def.cmi gutil.cmx \ gwdb.cmx hutil.cmx mutil.cmx name.cmx util.cmx ../wserver/wserver.cmx translate.cmo: buff.cmo translate.cmi translate.cmx: buff.cmx translate.cmi update.cmo: adef.cmi calendar.cmi checkItem.cmi config.cmi date.cmi def.cmi \ diff.cmi gutil.cmi gwdb.cmi hutil.cmi iovalue.cmi util.cmi \ ../wserver/wserver.cmi update.cmi update.cmx: adef.cmx calendar.cmx checkItem.cmx config.cmi date.cmx def.cmi \ diff.cmx gutil.cmx gwdb.cmx hutil.cmx iovalue.cmx util.cmx \ ../wserver/wserver.cmx update.cmi update.cmi: adef.cmi checkItem.cmi config.cmi def.cmi gwdb.cmi updateFam.cmo: adef.cmi calendar.cmi config.cmi def.cmi futil.cmi gutil.cmi \ gwdb.cmi hutil.cmi templ.cmi templAst.cmi update.cmi util.cmi perso.cmi \ ../wserver/wserver.cmi updateFam.cmi updateFam.cmx: adef.cmx calendar.cmx config.cmi def.cmi futil.cmx gutil.cmx \ gwdb.cmx hutil.cmx templ.cmx templAst.cmi update.cmx util.cmx perso.cmx \ ../wserver/wserver.cmx updateFam.cmi updateFam.cmi: config.cmi def.cmi gwdb.cmi update.cmi updateFamOk.cmo: adef.cmi checkItem.cmi config.cmi consang.cmi def.cmi \ futil.cmi gutil.cmi gwdb.cmi history.cmi hutil.cmi mutil.cmi notes.cmi \ notesLinks.cmi update.cmi updateFam.cmi util.cmi name.cmi \ ../wserver/wserver.cmi updateFamOk.cmx: adef.cmx checkItem.cmx config.cmi consang.cmx def.cmi \ futil.cmx gutil.cmx gwdb.cmx history.cmx hutil.cmx mutil.cmx notes.cmx \ notesLinks.cmx update.cmx updateFam.cmx util.cmx name.cmx \ ../wserver/wserver.cmx updateInd.cmo: adef.cmi calendar.cmi config.cmi def.cmi futil.cmi gwdb.cmi \ hutil.cmi templ.cmi templAst.cmi update.cmi util.cmi perso.cmi \ ../wserver/wserver.cmi updateInd.cmi updateInd.cmx: adef.cmx calendar.cmx config.cmi def.cmi futil.cmx gwdb.cmx \ hutil.cmx templ.cmx templAst.cmi update.cmx util.cmx perso.cmx \ ../wserver/wserver.cmx updateInd.cmi updateInd.cmi: config.cmi def.cmi gwdb.cmi update.cmi updateIndOk.cmo: adef.cmi checkItem.cmi config.cmi def.cmi futil.cmi \ gutil.cmi gwdb.cmi history.cmi hutil.cmi mutil.cmi name.cmi notes.cmi \ notesLinks.cmi update.cmi updateInd.cmi util.cmi ../wserver/wserver.cmi \ updateIndOk.cmi updateIndOk.cmx: adef.cmx checkItem.cmx config.cmi def.cmi futil.cmx \ gutil.cmx gwdb.cmx history.cmx hutil.cmx mutil.cmx name.cmx notes.cmx \ notesLinks.cmx update.cmx updateInd.cmx util.cmx ../wserver/wserver.cmx \ updateIndOk.cmi updateIndOk.cmi: checkItem.cmi config.cmi def.cmi gwdb.cmi update.cmi update_nldb.cmo: adef.cmi argl.cmo buff.cmo def.cmi gwdb.cmi notesLinks.cmi \ progrBar.cmi secure.cmi update_nldb.cmx: adef.cmx argl.cmx buff.cmx def.cmi gwdb.cmx notesLinks.cmx \ progrBar.cmx secure.cmx util.cmo: adef.cmi buff.cmo checkItem.cmi config.cmi consang.cmi def.cmi \ gutil.cmi gwdb.cmi gwlib.cmo lock.cmi mutil.cmi name.cmi notesLinks.cmi \ num.cmi secure.cmi translate.cmi version.cmo ../wserver/wserver.cmi \ util.cmi util.cmx: adef.cmx buff.cmx checkItem.cmx config.cmi consang.cmx def.cmi \ gutil.cmx gwdb.cmx gwlib.cmx lock.cmx mutil.cmx name.cmx notesLinks.cmx \ num.cmx secure.cmx translate.cmx version.cmx ../wserver/wserver.cmx \ util.cmi util.cmi: config.cmi def.cmi gwdb.cmi num.cmi wiki.cmo: buff.cmo config.cmi gutil.cmi hutil.cmi iovalue.cmi mutil.cmi \ notesLinks.cmi secure.cmi templ.cmi update.cmi util.cmi \ ../wserver/wserver.cmi wiki.cmi wiki.cmx: buff.cmx config.cmi gutil.cmx hutil.cmx iovalue.cmx mutil.cmx \ notesLinks.cmx secure.cmx templ.cmx update.cmx util.cmx \ ../wserver/wserver.cmx wiki.cmi wiki.cmi: config.cmi wiznotes.cmo: buff.cmo config.cmi date.cmi def.cmi gutil.cmi gwdb.cmi \ hutil.cmi mutil.cmi notes.cmi notesLinks.cmi secure.cmi templ.cmi \ util.cmi wiki.cmi ../wserver/wserver.cmi wiznotes.cmi wiznotes.cmx: buff.cmx config.cmi date.cmx def.cmi gutil.cmx gwdb.cmx \ hutil.cmx mutil.cmx notes.cmx notesLinks.cmx secure.cmx templ.cmx \ util.cmx wiki.cmx ../wserver/wserver.cmx wiznotes.cmi wiznotes.cmi: config.cmi gwdb.cmi advSearchOk.cmo advSearchOk.cmx: pa_html.cmo alln.cmo alln.cmx: pa_html.cmo birthDeath.cmo birthDeath.cmx: def_syn.cmo pa_html.cmo birthday.cmo birthday.cmx: pa_html.cmo changeChildren.cmo changeChildren.cmx: pa_html.cmo cousins.cmo cousins.cmx: pa_html.cmo dag.cmo dag.cmx: pa_html.cmo date.cmo date.cmx: pa_html.cmo descend.cmo descend.cmx: pa_html.cmo doc.cmo doc.cmx: pa_html.cmo gwc.cmo gwc.cmx: pa_lock.cmo gwc2.cmo gwc2.cmx: pa_lock.cmo gwd.cmo gwd.cmx: pa_html.cmo pa_lock.cmo hutil.cmo hutil.cmx: pa_html.cmo iovalue.cmo iovalue.cmx: q_codes.cmo merge.cmo merge.cmx: pa_html.cmo mergeDup.cmo mergeDup.cmx: pa_html.cmo mergeFam.cmo mergeFam.cmx: pa_html.cmo mergeFamOk.cmo mergeFamOk.cmx: pa_html.cmo mergeInd.cmo mergeInd.cmx: pa_html.cmo pa_lock.cmo mergeIndOk.cmo mergeIndOk.cmx: pa_html.cmo mk_consang.cmo mk_consang.cmx: pa_lock.cmo notes.cmo notes.cmx: pa_html.cmo perso.cmo perso.cmx: pa_html.cmo place.cmo place.cmx: pa_html.cmo relation.cmo relation.cmx: pa_html.cmo relationLink.cmo relationLink.cmx: pa_html.cmo request.cmo request.cmx: def_syn.cmo pa_lock.cmo pa_html.cmo sendImage.cmo sendImage.cmx: pa_html.cmo some.cmo some.cmx: pa_html.cmo updateData.cmo updateData.cmx: pa_html.cmo srcfile.cmo srcfile.cmx: pa_lock.cmo pa_html.cmo templ.cmo templ.cmx: pa_html.cmo title.cmo title.cmx: pa_html.cmo update.cmo update.cmx: pa_html.cmo updateFam.cmo updateFam.cmx: pa_html.cmo updateFamOk.cmo updateFamOk.cmx: pa_html.cmo updateInd.cmo updateInd.cmx: pa_html.cmo updateIndOk.cmo updateIndOk.cmx: pa_html.cmo util.cmo util.cmx: pa_lock.cmo pa_html.cmo wiki.cmo wiki.cmx: pa_html.cmo wiznotes.cmo wiznotes.cmx: pa_html.cmo geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/date.mli0000660000175200017530000000220512664543647022627 0ustar guillaumeguillaume(* $Id: date.mli,v 5.4 2007-03-14 00:39:57 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Config; open Def; open Gwdb; value code_dmy : config -> dmy -> string; value string_of_ondate : config -> date -> string; value string_of_date : config -> date -> string; value string_slash_of_date : config -> date -> string; value string_of_age : config -> dmy -> string; value prec_year_text : config -> dmy -> string; value prec_text : config -> dmy -> string; value day_text : dmy -> string; value month_text : dmy -> string; value year_text : dmy -> string; value short_dates_text : config -> base -> person -> string; value short_marriage_date_text : config -> base -> family -> person -> person -> string; value print_dates : config -> base -> person -> unit; value print_calendar : config -> base -> unit; value get_birth_death_date : person -> (option date * option date * bool); value before_date : dmy -> dmy -> bool; (* [before_date d1 d2] = True if d2 before d1; I know, it is not logical *) (* return the day of the week given the date as parameter *) value get_wday : config -> date -> string; value compare_date : date -> date -> int; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/progrBar.ml0000660000175200017530000000237112664543647023323 0ustar guillaumeguillaume(* $Id: progrBar.ml,v 5.4 2007-02-01 10:28:55 ddr Exp $ *) value size = 60; value draw_rep = 5; value draw = "|/-\\"; value empty = ref '.'; value full = ref '#'; value draw_len = String.length draw; value pb_cnt = size * draw_rep * draw_len; value start () = do { for i = 1 to size do { Printf.eprintf "%c" empty.val }; Printf.eprintf "\013" } ; value run cnt max_cnt = let (pb_cnt, draw_rep) = if max_cnt < pb_cnt then (size * draw_len, 1) else (pb_cnt, draw_rep) in do { let already_disp = cnt * size / max_cnt in let to_disp = (cnt + 1) * size / max_cnt in for i = already_disp + 1 to to_disp do { Printf.eprintf "%c" full.val }; let already_disp = cnt * pb_cnt / max_cnt in let to_disp = (cnt + 1) * pb_cnt / max_cnt in if cnt = max_cnt - 1 then Printf.eprintf " \008" else if to_disp > already_disp then let k = to_disp mod draw_len in let k = if k < 0 then draw_len + k else k in Printf.eprintf "%c\008" draw.[k] else (); flush stderr; } ; value suspend () = do { Printf.eprintf "%c\n" full.val; flush stderr; }; value restart cnt max_cnt = do { start (); for i = 0 to cnt do { run i max_cnt }; }; value finish () = do { Printf.eprintf "\n"; flush stderr; }; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/buff.ml0000660000175200017530000000175012664543647022467 0ustar guillaumeguillaume(* $Id: buff.ml,v 5.1 2006-10-15 15:39:39 ddr Exp $ *) module Make (B : sig value buff : ref string; end) = struct value buff = B.buff; value store len x = do { if len >= String.length buff.val then buff.val := buff.val ^ Bytes.create (String.length buff.val) else (); Bytes.set buff.val len x; succ len } ; value mstore len s = add_rec len 0 where rec add_rec len i = if i = String.length s then len else add_rec (store len s.[i]) (succ i) ; value gstore len s si slen = let iend = si + slen in add_rec len si where rec add_rec len i = if i = iend || i = String.length s then len else add_rec (store len s.[i]) (succ i) ; value get len = String.sub buff.val 0 len; end ; module BB = Make (struct value buff = ref (Bytes.create 80); end); value get = BB.get; value store = BB.store; value gstore = BB.gstore; value mstore = BB.mstore; value buff = BB.buff; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/num.mli0000660000175200017530000000122712664543647022514 0ustar guillaumeguillaume(* $Id: num.mli,v 5.2 2007-01-19 01:53:16 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) type t = 'a; value zero : t; value one : t; value eq : t -> t -> bool; value gt : t -> t -> bool; value add : t -> t -> t; value sub : t -> t -> t; value twice : t -> t; value half : t -> t; value even : t -> bool; value inc : t -> int -> t; value mul : t -> int -> t; value div : t -> int -> t; value modl : t -> int -> int; value print : (string -> unit) -> string -> t -> unit; value of_int : int -> t; value of_string : string -> t; value to_string : t -> string; value to_string_sep : string -> t -> string; value to_string_sep_base : string -> int -> t -> string; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/updateFam.mli0000660000175200017530000000156112664543647023624 0ustar guillaumeguillaume(* $Id: updateFam.mli,v 5.4 2007-01-19 01:53:17 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Config; open Def; open Gwdb; value person_key : base -> iper -> Update.key; value print_update_fam : config -> base -> (gen_family Update.key string * gen_couple Update.key * gen_descend Update.key) -> string -> unit; value print_add : config -> base -> unit; value print_mod : config -> base -> unit; value print_del : config -> base -> unit; value print_inv : config -> base -> unit; value print_add_parents : config -> base -> unit; value change_order : config -> base -> iper -> person -> ifam -> int -> list ifam; value print_change_order : config -> base -> unit; value person_key : base -> iper -> Update.key; value string_family_of : config -> base -> ifam -> (gen_family Update.key string * gen_couple Update.key * gen_descend Update.key); geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/doc.ml0000660000175200017530000002602212664543647022311 0ustar guillaumeguillaume(* camlp5r ./pa_html.cmo *) (* $Id: doc.ml,v 5.9 2007-09-12 09:58:44 ddr Exp $ *) open Config; value notify_change_wdoc = ref ""; value start_with s i p = i + String.length p < String.length s && String.lowercase (String.sub s i (String.length p)) = p ; value last_is s i p = loop i (String.length p - 1) where rec loop i k = if i <= 0 then False else if k < 0 then True else let c = Char.lowercase s.[i] in let c = if c = '\n' || c = '\r' then ' ' else c in if c = ' ' && p.[k] = ' ' then let rec loop1 i = if i <= 0 then False else match s.[i] with [ '\n' | '\r' | ' ' -> loop1 (i - 1) | _ -> loop i (k - 1) ] in loop1 (i - 1) else if c = p.[k] then loop (i - 1) (k - 1) else False ; value http = "http://"; value url_basename name = try let p = String.rindex name '/' + 1 in String.sub name p (String.length name - p) with [ Not_found -> name ] ; value url_dirname name = try match String.rindex name '/' with [ 0 -> "/" | n -> String.sub name 0 n ] with [ Not_found -> "." ] ; value string_contains s ss = let sslen = String.length ss in let mlen = String.length s - sslen in loop 0 where rec loop i = if i >= mlen then False else if String.sub s i sslen = ss then True else loop (i + 1) ; value url_is_relative n = String.length n < 1 || n.[0] <> '/'; value url_is_implicit n = url_is_relative n && not (string_contains n "./") && not (string_contains n "../") && not (string_contains n ".\\") && not (string_contains n "..\\") && not (string_contains n ":") && not (string_contains n "::") ; value copy conf pref_doc pref_img s = loop 0 where rec loop i = if i = String.length s then () else if last_is s i "" then do { Wserver.wprint "%s>" (Util.body_prop conf); loop (i + 1) } else do { Wserver.wprint "%c" s.[i]; loop (i + 1) } ; value mac_name_of_url_name s = loop 0 0 where rec loop i len = if i = String.length s then Buff.get len else if s.[i] = '/' then loop (Buff.store len ':') (i + 1) else loop (Buff.store len s.[i]) (i + 1) ; value print conf = let v = match Util.p_getenv conf.env "v" with [ Some f -> f | None -> "" ] in let v = if v = "" then "index.htm" else v in if url_is_implicit v then let fname = if Sys.os_type = "MacOS" then mac_name_of_url_name v else v in let fname = if Filename.check_suffix fname ".htm" then fname else fname ^ ".htm" in let fname = Util.search_in_doc_path fname in match try Some (Secure.open_in fname) with [ Sys_error _ -> None ] with [ Some ic -> do { Util.html conf; Util.nl (); let s = let len = ref 0 in do { try let rec loop () = do { len.val := Buff.store len.val (input_char ic); loop () } in loop () with [ End_of_file -> close_in ic ]; Buff.get len.val } in let pref_doc = let dir = url_dirname v ^ "/" in let dir = if dir = "./" then "" else dir in conf.indep_command ^ "m=DOC;v=" ^ dir in let pref_img = if Util.images_url.val <> "" then Util.images_url.val ^ "/" else conf.indep_command ^ "m=IM;v=/" in copy conf pref_doc pref_img s } | None -> Hutil.incorrect_request conf ] else Hutil.incorrect_request conf ; (* Writable (ou Wiki) Doc *) open TemplAst; value wdoc_file_path lang fname = let dir = Util.search_in_doc_path "wdoc" in if lang = "" then Filename.concat dir (fname ^ ".txt") else List.fold_right Filename.concat [dir; lang] (fname ^ ".txt") ; value read_wdoc lang fname = let fname = wdoc_file_path lang fname in match try Some (Secure.open_in fname) with [ Sys_error _ -> None ] with [ Some ic -> let s = let len = ref 0 in do { try let rec loop () = do { len.val := Buff.store len.val (input_char ic); loop () } in loop () with [ End_of_file -> close_in ic ]; Buff.get len.val } in Wiki.split_title_and_text s | None -> ([], "") ] ; value print_whole_wdoc conf fdoc title s = let s = Util.filter_html_tags s in let s = "

      \n" ^ s in let s = let edit_opt = Some (conf.wizard, "WDOC", fdoc) in let wi = {Wiki.wi_mode = "WDOC"; Wiki.wi_cancel_links = conf.cancel_links; Wiki.wi_file_path = wdoc_file_path conf.lang; Wiki.wi_person_exists _ = True; Wiki.wi_always_show_link = conf.wizard || conf.friend} in Wiki.html_with_summary_of_tlsw conf wi edit_opt s in let fname = let f = Filename.concat "wdoc" "wdoc.txt" in Util.search_in_doc_path f in match try Some (Secure.open_in fname) with [ Sys_error _ -> None ] with [ Some ic -> do { Util.html conf; Util.nl (); let env = [("title", title); ("doc", s); ("page", fdoc)] in Templ.copy_from_templ conf env ic; } | None -> let title _ = Wserver.wprint "Error" in do { Hutil.header conf title; Wserver.wprint "
        \n
      • \n"; Wserver.wprint "Cannot access file \"wdoc.txt\".\n"; Wserver.wprint "
      • \n
      \n"; Hutil.trailer conf; raise Exit } ] ; value print_part_wdoc conf fdoc title s cnt0 = do { Hutil.header_no_page_title conf (fun _ -> Wserver.wprint "%s" title); let s = Util.filter_html_tags s in let lines = Wiki.extract_sub_part s cnt0 in let lines = if cnt0 = 0 then [title; "

      " :: lines] else lines in let mode = "WDOC" in let file_path = wdoc_file_path conf.lang in let wi = {Wiki.wi_mode = mode; Wiki.wi_cancel_links = conf.cancel_links; Wiki.wi_file_path = file_path; Wiki.wi_person_exists _ = True; Wiki.wi_always_show_link = conf.wizard || conf.friend} in Wiki.print_sub_part conf wi conf.wizard mode fdoc cnt0 lines; Hutil.trailer conf; } ; value print_wdoc_dir conf files = let () = Array.sort compare files in let s = loop 0 0 where rec loop len i = if i = Array.length files then Buff.get len else let f = files.(i) in if Filename.check_suffix f ".txt" then let f = Filename.chop_suffix f ".txt" in let s = Printf.sprintf "
    • %s
    • \n" (Util.commd conf) f f in loop (Buff.mstore len s) (i + 1) else loop len (i + 1) in let s = if s = "" then s else "
        \n" ^ s ^ "
      " in print_whole_wdoc conf "" conf.lang s ; value print_wdoc_not_this_lang conf = print_whole_wdoc conf "" (Printf.sprintf "(%s)" conf.lang) "" ; value print_wdoc_main conf = let dname = let dir = Util.search_in_doc_path "wdoc" in Filename.concat dir conf.lang in try print_wdoc_dir conf (Sys.readdir dname) with [ Sys_error _ -> print_wdoc_not_this_lang conf ] ; value print_wdoc conf = let conf = {(conf) with cancel_links = True} in let fdocp = match Util.p_getenv conf.env "f" with [ Some f -> f | None -> "" ] in let fdoc = if fdocp = "" then "index" else fdocp in let (env, s) = read_wdoc conf.lang fdoc in let title = try List.assoc "TITLE" env with [ Not_found -> "" ] in if s = "" && fdocp = "" then print_wdoc_main conf else match Util.p_getint conf.env "v" with [ Some cnt0 -> print_part_wdoc conf fdoc title s cnt0 | None -> print_whole_wdoc conf fdocp title s ] ; value print_mod_wdoc conf = let conf = {(conf) with cancel_links = True} in let fname = match Util.p_getenv conf.env "f" with [ Some f -> if NotesLinks.check_file_name f <> None then f else "" | None -> "" ] in let fname = if fname = "" then "index" else fname in let cnt = match Util.p_getenv conf.env "v" with [ Some cnt -> cnt | None -> "" ] in let title _ = Wserver.wprint "%s - (%s)" (Util.capitale (Util.transl_decline conf "modify" "")) (fname ^ (if cnt = "" then "" else " #" ^ cnt)) in let (env, s) = read_wdoc conf.lang fname in Wiki.print_mod_view_page conf True "WDOC" fname title env s ; value commit_wdoc conf file_path fdoc s = let fname = wdoc_file_path conf.lang fdoc in do { try Sys.remove (fname ^ "~") with [ Sys_error _ -> () ]; try Sys.rename fname (fname ^ "~") with [ Sys_error _ -> () ]; if s = "" then () else do { let dir = Util.search_in_doc_path "wdoc" in try Unix.mkdir (Filename.concat dir conf.lang) 0o755 with _ -> (); let oc = Secure.open_out fname in output_string oc s; output_char oc '\n'; close_out oc; IFDEF UNIX THEN if notify_change_wdoc.val <> "" then let comm = notify_change_wdoc.val in let args = [| comm; fname; conf.lang; fdoc |] in match Unix.fork () with [ 0 -> if Unix.fork () <> 0 then exit 0 else do { try Unix.execvp comm args with _ -> (); exit 0 } | id -> ignore (Unix.waitpid [] id) ] else () ELSE () END; } } ; value print_mod_wdoc_ok conf base = let fname = fun [ Some f -> if NotesLinks.check_file_name f <> None then f else "index" | None -> "index" ] in let edit_mode _ = if conf.wizard then Some "WDOC" else None in let mode = "WDOC" in let read_string = read_wdoc conf.lang in let commit = commit_wdoc conf base in let string_filter = Util.filter_html_tags in let file_path = wdoc_file_path conf.lang in let wi = {Wiki.wi_mode = mode; Wiki.wi_cancel_links = conf.cancel_links; Wiki.wi_file_path = file_path; Wiki.wi_person_exists _ = True; Wiki.wi_always_show_link = conf.wizard || conf.friend} in Wiki.print_mod_ok conf wi edit_mode fname read_string commit string_filter True ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/check.ml0000660000175200017530000002513612664543647022626 0ustar guillaumeguillaume(* $Id: check.ml,v 5.28 2008-11-03 15:40:10 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Def; open Gwdb; open Printf; (* Printing check errors *) value designation base p = let first_name = p_first_name base p in let surname = p_surname base p in let s = Mutil.iso_8859_1_of_utf_8 (first_name ^ "." ^ string_of_int (get_occ p) ^ " " ^ surname) in if first_name = "?" || surname = "?" then s ^ " (i=" ^ string_of_int (Adef.int_of_iper (get_key_index p)) ^ ")" else s ; value print_base_error oc base = fun [ AlreadyDefined p -> fprintf oc "%s\nis defined several times\n" (designation base p) | OwnAncestor p -> fprintf oc "%s\nis his/her own ancestor\n" (designation base p) | BadSexOfMarriedPerson p -> fprintf oc "%s\n bad sex for a married person\n" (designation base p) ] ; value print_base_warning oc base = fun [ BigAgeBetweenSpouses fath moth a -> fprintf oc "The difference of age between %s and %s is quite important: %d\n" (designation base fath) (designation base moth) a.year | BirthAfterDeath p -> fprintf oc "%s\n born after his/her death\n" (designation base p) | ChangedOrderOfChildren ifam des _ _ -> let cpl = foi base ifam in fprintf oc "Changed order of children of %s and %s\n" (designation base (poi base (get_father cpl))) (designation base (poi base (get_mother cpl))) | ChildrenNotInOrder ifam des elder x -> do { let cpl = foi base ifam in fprintf oc "The following children of\n %s\nand\n %s\nare not in order:\n" (designation base (poi base (get_father cpl))) (designation base (poi base (get_mother cpl))); fprintf oc "- %s\n" (designation base elder); fprintf oc "- %s\n" (designation base x) } | ChangedOrderOfMarriages p _ _ -> fprintf oc "Changed order of marriages of %s\n" (designation base p) | CloseChildren ifam des elder x -> do { let cpl = foi base ifam in fprintf oc "The following children of\n %s\nand\n %s\nare born very close:\n" (designation base (poi base (get_father cpl))) (designation base (poi base (get_mother cpl))); fprintf oc "- %s\n" (designation base elder); fprintf oc "- %s\n" (designation base x) } | DeadOld p a -> fprintf oc "%s died at the advanced age of %d years old\n" (designation base p) a.year | DeadTooEarlyToBeFather father child -> do { fprintf oc "%s\n" (designation base child); fprintf oc " is born more than 2 years after the death of his/her father\n"; fprintf oc "%s\n" (designation base father) } | IncoherentSex p fixed not_fixed -> do { fprintf oc "%s\n sex not coherent with relations" (designation base p); if fixed > 0 then if not_fixed > 0 then fprintf oc " (fixed in %d of the %d cases)" fixed (fixed + not_fixed) else fprintf oc " (fixed)" else (); fprintf oc "\n"; } | IncoherentAncestorDate anc p -> do { fprintf oc "%s\n" (designation base p); fprintf oc " has a younger ancestor:\n"; fprintf oc "%s\n" (designation base anc); } | MarriageDateAfterDeath p -> do { fprintf oc "%s\n" (designation base p); fprintf oc "marriage after his/her death\n" } | MarriageDateBeforeBirth p -> do { fprintf oc "%s\n" (designation base p); fprintf oc "marriage before his/her birth\n" } | MotherDeadAfterChildBirth mother child -> fprintf oc "%s\n is born after the death of his/her mother\n%s\n" (designation base child) (designation base mother) | ParentBornAfterChild parent child -> fprintf oc "%s born after his/her child %s\n" (designation base parent) (designation base child) | ParentTooOld p a -> fprintf oc "%s was parent at age of %d\n" (designation base p) a.year | ParentTooYoung p a -> fprintf oc "%s was parent at age of %d\n" (designation base p) a.year | TitleDatesError p t -> do { fprintf oc "%s\n" (designation base p); fprintf oc "has incorrect title dates as:\n"; fprintf oc " %s %s\n" (sou base t.t_ident) (sou base t.t_place) } | UndefinedSex _ -> () | WitnessDateAfterDeath p -> do { fprintf oc "%s\n" (designation base p); fprintf oc "was witness after his/her death\n" } | WitnessDateBeforeBirth p -> do { fprintf oc "%s\n" (designation base p); fprintf oc "was witness before his/her birth\n" } | YoungForMarriage p a -> fprintf oc "%s married at age %d\n" (designation base p) a.year ] ; type stats = { men : mutable int; women : mutable int; neutre : mutable int; noname : mutable int; oldest_father : mutable (int * person); oldest_mother : mutable (int * person); youngest_father : mutable (int * person); youngest_mother : mutable (int * person); oldest_dead : mutable (int * person); oldest_still_alive : mutable (int * person) } ; value birth_year p = match Adef.od_of_codate (get_birth p) with [ Some d -> match d with [ Dgreg {year = y; prec = Sure} _ -> Some y | _ -> None ] | _ -> None ] ; value death_year current_year p = match get_death p with [ Death _ d -> match Adef.date_of_cdate d with [ Dgreg {year = y; prec = Sure} _ -> Some y | _ -> None ] | NotDead -> Some current_year | _ -> None ] ; value update_stats base current_year s p = do { match get_sex p with [ Male -> s.men := s.men + 1 | Female -> s.women := s.women + 1 | Neuter -> s.neutre := s.neutre + 1 ]; if p_first_name base p = "?" && p_surname base p = "?" then s.noname := s.noname + 1 else (); match (birth_year p, death_year current_year p) with [ (Some y1, Some y2) -> do { let age = y2 - y1 in if age > fst s.oldest_dead && get_death p <> NotDead then s.oldest_dead := (age, p) else (); if age > fst s.oldest_still_alive && get_death p = NotDead then s.oldest_still_alive := (age, p) else (); } | _ -> () ]; match (birth_year p, get_parents p) with [ (Some y2, Some ifam) -> do { let cpl = foi base ifam in match birth_year (poi base (get_father cpl)) with [ Some y1 -> do { let age = y2 - y1 in if age > fst s.oldest_father then s.oldest_father := (age, poi base (get_father cpl)) else (); if age < fst s.youngest_father then s.youngest_father := (age, poi base (get_father cpl)) else (); } | _ -> () ]; match birth_year (poi base (get_mother cpl)) with [ Some y1 -> do { let age = y2 - y1 in if age > fst s.oldest_mother then s.oldest_mother := (age, poi base (get_mother cpl)) else (); if age < fst s.youngest_mother then s.youngest_mother := (age, poi base (get_mother cpl)) else (); } | _ -> () ]; } | _ -> () ]; }; value min_year_of base p = match Adef.od_of_codate (get_birth p) with [ Some (Dgreg d _) -> Some d.year | Some (Dtext _) | None -> None ] ; value rec check_ancestors base warning year year_tab ip ini_p = if fst year_tab.(Adef.int_of_iper ip) = max_int then do { let p = poi base ip in let new_year_o = min_year_of base p in let (new_year, new_ini_p, own_year) = match new_year_o with [ Some y -> (y, p, True) | None -> (year - 1, ini_p, False) ] in year_tab.(Adef.int_of_iper ip) := (new_year, own_year); if new_year >= year then warning (IncoherentAncestorDate p ini_p) else (); match get_parents p with [ Some ifam -> let fam = foi base ifam in List.iter (fun get -> let ip = get fam in let year = year_tab.(Adef.int_of_iper ip) in if fst year = max_int then check_ancestors base warning new_year year_tab ip new_ini_p else if snd year && fst year >= new_year then warning (IncoherentAncestorDate (poi base ip) new_ini_p) else ()) [get_father; get_mother] | None -> () ]; } else () ; value check_base_aux base error warning changed_p = do { eprintf "check persons\n"; let nb_ind = nb_of_persons base in let year_tab = Array.make nb_ind (max_int, False) in ProgrBar.start (); for i = 0 to nb_ind - 1 do { ProgrBar.run i nb_ind; let p = poi base (Adef.iper_of_int i) in if fst year_tab.(i) = max_int then check_ancestors base warning max_int year_tab (Adef.iper_of_int i) p else (); match CheckItem.person base warning p with [ Some ippl -> List.iter changed_p ippl | None -> () ] }; ProgrBar.finish (); eprintf "check families\n"; let nb_fam = nb_of_families base in ProgrBar.start (); for i = 0 to nb_fam - 1 do { ProgrBar.run i nb_fam; let ifam = Adef.ifam_of_int i in let fam = foi base ifam in if is_deleted_family fam then () else CheckItem.family base error warning ifam fam }; ProgrBar.finish (); Consang.check_noloop base error; }; value check_base base error warning def changed_p pr_stats = do { let s = let y = (1000, poi base (Adef.iper_of_int 0)) in let o = (0, poi base (Adef.iper_of_int 0)) in {men = 0; women = 0; neutre = 0; noname = 0; oldest_father = o; oldest_mother = o; youngest_father = y; youngest_mother = y; oldest_dead = o; oldest_still_alive = o} in let current_year = (Unix.localtime (Unix.time ())).Unix.tm_year + 1900 in check_base_aux base error warning changed_p; for i = 0 to nb_of_persons base - 1 do { let p = poi base (Adef.iper_of_int i) in if not (def i) then printf "Undefined: %s\n" (designation base p) else (); if pr_stats then update_stats base current_year s p else (); flush stdout; }; if pr_stats then do { printf "\n"; printf "%d men\n" s.men; printf "%d women\n" s.women; printf "%d unknown sex\n" s.neutre; printf "%d unnamed\n" s.noname; printf "Oldest: %s, %d\n" (designation base (snd s.oldest_dead)) (fst s.oldest_dead); printf "Oldest still alive: %s, %d\n" (designation base (snd s.oldest_still_alive)) (fst s.oldest_still_alive); printf "Youngest father: %s, %d\n" (designation base (snd s.youngest_father)) (fst s.youngest_father); printf "Youngest mother: %s, %d\n" (designation base (snd s.youngest_mother)) (fst s.youngest_mother); printf "Oldest father: %s, %d\n" (designation base (snd s.oldest_father)) (fst s.oldest_father); printf "Oldest mother: %s, %d\n" (designation base (snd s.oldest_mother)) (fst s.oldest_mother); printf "\n"; flush stdout; } else (); }; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/name.ml0000660000175200017530000003645612664543647022500 0ustar guillaumeguillaume(* $Id: name.ml,v 5.12 2007-03-20 10:34:14 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) value utf_8_db = ref True; (* La liste des caractères interdits *) value forbidden_char = [':'; '@'; '#'; '='; '$'] ; (* Name.lower *) value unaccent_iso_8859_1 = fun [ 'à' | 'á' | 'â' | 'ã' | 'ä' | 'å' | 'æ' -> 'a' | 'ç' -> 'c' | 'è' | 'é' | 'ê' | 'ë' -> 'e' | 'ì' | 'í' | 'î' | 'ï' -> 'i' | 'ð' -> 'd' | 'ñ' -> 'n' | 'ò' | 'ó' | 'ô' | 'õ' | 'ö' | 'ø' -> 'o' | 'ù' | 'ú' | 'û' | 'ü' -> 'u' | 'ý' | 'ÿ' -> 'y' | 'þ' -> 'p' | 'ß' -> 's' | c -> c ] ; value nbc c = if Char.code c < 0b10000000 then 1 else if Char.code c < 0b11000000 then -1 else if Char.code c < 0b11100000 then 2 else if Char.code c < 0b11110000 then 3 else if Char.code c < 0b11111000 then 4 else if Char.code c < 0b11111100 then 5 else if Char.code c < 0b11111110 then 6 else -1 ; value unaccent_utf_8 lower s i = let f s = if lower then String.lowercase s else s in let nbc = nbc s.[i] in if nbc = 1 || nbc < 0 || i + nbc > String.length s then (f (String.make 1 s.[i]), i + 1) else let c = Char.code s.[i] in let s = match c with (* il ne faut pas garder le cas 0xC2 parce qu'il casse le code UTF8 *) [ 0xC2 -> f (String.make 1 s.[i+1]) | 0xC3 -> match Char.code s.[i+1] with [ 0x80 | 0x81 | 0x82 | 0x83 | 0x84 | 0x85 -> f "A" | 0x86 -> f "AE" | 0x87 -> f "C" | 0x88 | 0x89 | 0x8A | 0x8B -> f "E" | 0x8C | 0x8D | 0x8E | 0x8F -> f "I" | 0x90 -> f "D" | 0x91 -> f "N" | 0x92 | 0x93 | 0x94 | 0x95 | 0x96 | 0x98 -> f "O" | 0x99 | 0x9A | 0x9B | 0x9C -> f "U" | 0x9D -> f "Y" | 0x9E -> f "TH" | 0x9F -> "sz" | 0xA0 | 0xA1 | 0xA2 | 0xA3 | 0xA4 | 0xA5 -> "a" | 0xA6 -> "ae" | 0xA7 -> "c" | 0xA8 | 0xA9 | 0xAA | 0xAB -> "e" | 0xAC | 0xAD | 0xAE | 0xAF -> "i" | 0xB0 -> "d" | 0xB1 -> "n" | 0xB2 | 0xB3 | 0xB4 | 0xB5 | 0xB6 | 0xB8 -> "o" | 0xB9 | 0xBA | 0xBB | 0xBC -> "u" | 0xBD | 0xBF -> "y" | 0xBE -> "th" | _ -> (* Si le caractère est en dehors de la table ASCII, alors on ignore le caratère. Cela peut se produire si l'entrée est mauvaise, ex: JérÃöme /FOO/ *) try let c = Char.lowercase (Char.chr (Char.code s.[i+1] + 0x40)) in String.make 1 c with Invalid_argument "Char.chr" -> "" ] | 0xC4 -> match Char.code s.[i+1] with [ 0x80 | 0x82 | 0x84 -> f "A" | 0x81 | 0x83 | 0x85 -> "a" | 0x86 | 0x88 | 0x8A | 0x8C -> f "C" | 0x87 | 0x89 | 0x8B | 0x8D -> "c" | 0x8E | 0x90 -> f "D" | 0x8F | 0x91 -> "d" | 0x92 | 0x94 | 0x96 | 0x98 | 0x9A -> f "E" | 0x93 | 0x95 | 0x97 | 0x99 | 0x9B -> "e" | 0x9C | 0x9E | 0xA0 | 0xA2 -> f "G" | 0x9D | 0x9F | 0xA1 | 0xA3 -> "g" | 0xA4 | 0xA6 -> f "H" | 0xA5 | 0xA7 -> "h" | 0xA8 | 0xAA | 0xAC | 0xAE | 0xB0 -> f "I" | 0xA9 | 0xAB | 0xAD | 0xAF | 0xB1 -> "i" | 0xB2 -> f "IJ" | 0xB3 -> "ij" | 0xB4 -> f "J" | 0xB5 -> "j" | 0xB6 -> f "K" | 0xB7 | 0xB8 -> "k" | 0xB9 | 0xBB | 0xBD | 0xBF -> f "L" | 0xBA | 0xBC | 0xBE -> "l" | _ -> String.sub s i nbc ] | 0xC5 -> match Char.code s.[i+1] with [ 0x80 | 0x82 -> "l" | 0x81 -> f "L" | 0x83 | 0x85 | 0x87 | 0x8A -> f "N" | 0x84 | 0x86 | 0x88 | 0x89 | 0x8B -> "n" | 0x8C | 0x8E | 0x90 -> f "O" | 0x8D | 0x8F | 0x91 -> "o" | 0x92 -> f "OE" | 0x93 -> "oe" | 0x94 | 0x96 | 0x98 -> f "R" | 0x95 | 0x97 | 0x99 -> "r" | 0x9A | 0x9C | 0x9E | 0xA0 -> f "S" | 0x9B | 0x9D | 0x9F | 0xA1 -> "s" | 0xA2 | 0xA4 | 0xA6 -> f "T" | 0xA3 | 0xA5 | 0xA7 -> "t" | 0xA8 | 0xAA | 0xAC | 0xAE | 0xB0 | 0xB2 -> f "U" | 0xA9 | 0xAB | 0xAD | 0xAF | 0xB1 | 0xB3 -> "u" | 0xB4 -> f "W" | 0xB5 -> "w" | 0xB6 | 0xB8 -> f "Y" | 0xB7 -> "y" | 0xB9 | 0xBB | 0xBD -> f "Z" | 0xBA | 0xBC | 0xBE -> "z" | _ -> String.sub s i nbc ] | 0xCE -> (* Greek *) match Char.code s.[i+1] with [ 0x91 -> f "A" | 0x92 -> f "B" | 0x93 -> f "G" | 0x94 -> f "D" | 0x95 -> f "E" | 0x96 -> f "DZ" | 0x97 -> f "E" | 0x98 -> f "TH" | 0x99 -> f "I" | 0x9A -> f "K" | 0x9B -> f "L" | 0x9C -> f "M" | 0x9D -> f "N" | 0x9E -> f "X" | 0x9F -> f "O" | 0xA0 -> f "P" | 0xA1 -> f "R" | 0xA2 | 0xA3 -> f "S" | 0xA4 -> f "T" | 0xA5 -> f "U" | 0xA6 -> f "PH" | 0xA7 -> f "KH" | 0xA8 -> f "PS" | 0xA9 -> f "O" | 0xB1 -> "a" | 0xB2 -> "b" | 0xB3 -> "g" | 0xB4 -> "d" | 0xB5 -> "e" | 0xB6 -> "dz" | 0xB7 -> "e" | 0xB8 -> "th" | 0xB9 -> "i" | 0xBA -> "k" | 0xBB -> "l" | 0xBC -> "m" | 0xBD -> "n" | 0xBE -> "x" | 0xBF -> "o" | _ -> String.sub s i nbc ] | 0xCF -> match Char.code s.[i+1] with [ 0x80 -> "p" | 0x81 -> "r" | 0x82 | 0x83 -> "s" | 0x84 -> "t" | 0x85 -> "u" | 0x86 -> "ph" | 0x87 -> "kh" | 0x88 -> "ps" | 0x89 -> "o" | _ -> String.sub s i nbc ] | 0xD0 -> (* Cyrillic *) match Char.code s.[i+1] with [ 0x81 -> f "E" | 0x90 -> f "A" | 0x91 -> f "B" | 0x92 -> f "V" | 0x93 -> f "G" | 0x94 -> f "D" | 0x95 -> f "E" | 0x96 -> f "J" | 0x97 -> f "Z" | 0x98 | 0x99 -> f "I" | 0x9A -> f "K" | 0x9B -> f "L" | 0x9C -> f "M" | 0x9D -> f "N" | 0x9E -> f "O" | 0x9F -> f "P" | 0xA0 -> f "R" | 0xA1 -> f "S" | 0xA2 -> f "T" | 0xA3 -> f "OU" | 0xA4 -> f "F" | 0xA5 -> f "KH" | 0xA6 -> f "TS" | 0xA7 -> f "TCH" | 0xA8 -> f "CH" | 0xA9 -> f "CHT" | 0xAB -> f "Y" | 0xAC -> f "" | 0xAD -> f "E" | 0xAE -> f "YOU" | 0xAF -> f "YA" | 0xB0 -> "a" | 0xB1 -> "b" | 0xB2 -> "v" | 0xB3 -> "g" | 0xB4 -> "d" | 0xB5 -> "e" | 0xB6 -> "j" | 0xB7 -> "z" | 0xB8 | 0xB9 -> "i" | 0xBA -> "k" | 0xBB -> "l" | 0xBC -> "m" | 0xBD -> "n" | 0xBE -> "o" | 0xBF -> "p" | _ -> String.sub s i nbc ] | 0xD1 -> match Char.code s.[i+1] with [ 0x80 -> "r" | 0x81 -> "s" | 0x82 -> "t" | 0x83 -> "ou" | 0x84 -> "f" | 0x85 -> "kh" | 0x86 -> "ts" | 0x87 -> "tch" | 0x88 -> "ch" | 0x89 -> "cht" | 0x8B -> "y" | 0x8C -> "" | 0x8D -> "e" | 0x8E -> "you" | 0x8F -> "ya" | 0x91 -> "e" | _ -> String.sub s i nbc ] | 0xD4 -> (* Armenian *) match Char.code s.[i+1] with [ 0xB1 -> f "A" | 0xB2 -> f "B" | 0xB3 -> f "G" | 0xB4 -> f "D" | 0xB5 -> f "E" | 0xB6 -> f "Z" | 0xB7 -> f "E" | 0xB8 -> f "E" | 0xB9 -> f "T" | 0xBA -> f "Z" | 0xBB -> f "I" | 0xBC -> f "L" | 0xBD -> f "X" | 0xBE -> f "C" | 0xBF -> f "K" | _ -> String.sub s i nbc ] | 0xD5 -> match Char.code s.[i+1] with [ 0x80 -> f "H" | 0x81 -> f "J" | 0x82 -> f "L" | 0x83 -> f "C" | 0x84 -> f "M" | 0x85 -> f "Y" | 0x86 -> f "N" | 0x87 -> f "S" | 0x88 -> f "O" | 0x89 -> f "C" | 0x8A -> f "P" | 0x8B -> f "J" | 0x8C -> f "R" | 0x8D -> f "S" | 0x8E -> f "V" | 0x8F -> f "T" | 0x90 -> f "R" | 0x91 -> f "C" | 0x92 -> f "W" | 0x93 -> f "P" | 0x94 -> f "K" | 0x95 -> f "O" | 0x96 -> f "F" | 0xA1 -> "a" | 0xA2 -> "b" | 0xA3 -> "g" | 0xA4 -> "d" | 0xA5 -> "e" | 0xA6 -> "z" | 0xA7 -> "e" | 0xA8 -> "e" | 0xA9 -> "t" | 0xAA -> "z" | 0xAB -> "i" | 0xAC -> "l" | 0xAD -> "x" | 0xAE -> "c" | 0xAF -> "k" | 0xB0 -> "h" | 0xB1 -> "j" | 0xB2 -> "l" | 0xB3 -> "c" | 0xB4 -> "m" | 0xB5 -> "y" | 0xB6 -> "n" | 0xB7 -> "s" | 0xB8 -> "o" | 0xB9 -> "c" | 0xBA -> "p" | 0xBB -> "j" | 0xBC -> "r" | 0xBD -> "s" | 0xBE -> "v" | 0xBF -> "t" | _ -> String.sub s i nbc ] | 0xD6 -> match Char.code s.[i+1] with [ 0x80 -> "r" | 0x81 -> "c" | 0x82 -> "w" | 0x83 -> "p" | 0x84 -> "k" | 0x85 -> "o" | 0x86 -> "f" | _ -> String.sub s i nbc ] (* Code pour supprimer l'apostrophe typographique *) (* | 0xE2 -> match Char.code s.[i+1] with [ 0x80 -> match Char.code s.[i+2] with [ 0x99 -> " " | _ -> String.sub s i nbc ] | _ -> String.sub s i nbc] *) | c -> String.sub s i nbc ] in (s, i + nbc) ; value next_chars_if_equiv s i t j = if i >= String.length s || j >= String.length t then None else if utf_8_db.val then let (s1, i1) = unaccent_utf_8 True s i in let (t1, j1) = unaccent_utf_8 True t j in if s1 = t1 then Some (i1, j1) else None else if s.[i] = t.[j] then Some (i + 1, j + 1) else if unaccent_iso_8859_1 (Char.lowercase s.[i]) = unaccent_iso_8859_1 (Char.lowercase t.[j]) then Some (i + 1, j + 1) else None ; value lower s = copy False 0 0 where rec copy special i len = if i = String.length s then Buff.get len else if not utf_8_db.val || Char.code s.[i] < 0x80 then match s.[i] with [ 'a'..'z' | 'A'..'Z' | 'à'..'ÿ' | 'À'..'Ý' | '0'..'9' | '.' as c -> let len = if special then Buff.store len ' ' else len in let c = unaccent_iso_8859_1 (Char.lowercase c) in copy False (i + 1) (Buff.store len c) | c -> copy (len <> 0) (i + 1) len ] else (* start of utf-8 multi-byte char *) let len = if special then Buff.store len ' ' else len in let (t, j) = unaccent_utf_8 True s i in copy False j (Buff.mstore len t) ; (* Name.abbrev *) value abbrev_list = [("a", None); ("af", None); ("d", None); ("de", None); ("di", None); ("ier", Some "i"); ("of", None); ("saint", Some "st"); ("sainte", Some "ste"); ("van", None); ("von", None); ("zu", None); ("zur", None)] ; value rec is_word s i p ip = if ip = String.length p then if i = String.length s then True else if s.[i] = ' ' then True else False else if i = String.length s then False else if s.[i] = p.[ip] then is_word s (i+1) p (ip+1) else False ; value rec search_abbrev s i = fun [ [(w, a) :: pl] -> if is_word s i w 0 then Some (String.length w, a) else search_abbrev s i pl | [] -> None ] ; value abbrev s = copy True 0 0 where rec copy can_start_abbrev i len = if i >= String.length s then Buff.get len else match s.[i] with [ ' ' -> copy True (i + 1) (Buff.store len ' ') | c -> if can_start_abbrev then match search_abbrev s i abbrev_list with [ None -> copy False (i + 1) (Buff.store len c) | Some (n, Some a) -> copy False (i + n) (Buff.mstore len a) | Some (n, None) -> copy True (i + n + 1) len ] else copy False (i + 1) (Buff.store len c) ] ; (* Name.strip *) value strip_c s c = copy 0 0 where rec copy i len = if i = String.length s then Buff.get len else if s.[i] = c then copy (i + 1) len else copy (i + 1) (Buff.store len s.[i]) ; value strip s = strip_c s ' ' ; (* ******************************************************************** *) (* [Fonc] purge : string -> string *) (** [Description] : Supprime tous les caractères interdits (défini par forbidden_char) présents dans la chaine passée en argument. [Args] : - s : string que l'on veut purger [Retour] : - string : retourne la chaîne délestée des caractères interdits [Rem] : Exporté en clair hors de ce module. *) (* ******************************************************************** *) value purge s = List.fold_left (fun s c -> strip_c s c) s forbidden_char ; (* Name.crush *) value roman_number s i = let rec loop i = if i = String.length s then Some i else if s.[i] = ' ' then Some i else match s.[i] with [ 'i' | 'v' | 'x' | 'l' -> loop (i + 1) | _ -> None ] in if i = 0 || s.[i-1] = ' ' then loop i else None ; value crush s = copy 0 0 True where rec copy i len first_vowel = if i = String.length s then Buff.get len else if s.[i] = ' ' then copy (i + 1) len True else match roman_number s i with [ Some j -> loop i len where rec loop i len = if i = j then copy j len True else loop (i + 1) (Buff.store len s.[i]) | _ -> match s.[i] with [ 'a' | 'e' | 'i' | 'o' | 'u' | 'y' -> let len = if first_vowel then Buff.store len 'e' else len in copy (i + 1) len False | 'h' -> let len = if i > 0 && s.[i-1] = 'p' then Buff.store (len - 1) 'f' else len in copy (i + 1) len first_vowel | 's' | 'z' when utf_8_db.val && (i = String.length s - 1 || s.[i + 1] = ' ') -> let len = loop (i - 1) (len - 1) where rec loop i len = if i > 0 && len > 0 && s.[i] = Buff.buff.val.[len] && (s.[i] = 's' || s.[i] = 'z') then loop (i - 1) (len - 1) else len + 1 in copy (i + 1) len False | 's' when i = String.length s - 1 || s.[i + 1] = ' ' -> copy (i + 1) len False | c -> if i > 0 && s.[i-1] = c then copy (i + 1) len False else let c = match c with [ 'k' | 'q' -> 'c' | 'z' -> 's' | c -> c ] in copy (i + 1) (Buff.store len c) False ] ] ; (* strip_lower *) value strip_lower s = strip (lower s); (* crush_lower *) value crush_lower s = crush (abbrev (lower s)); geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/request.mli0000660000175200017530000000032612664543647023404 0ustar guillaumeguillaume(* $Id: request.mli,v 5.2 2007-01-19 01:53:17 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Config; value treat_request_on_base : config -> (string * unit -> out_channel * out_channel -> unit) -> unit; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/mutil.mli0000660000175200017530000000265012664543647023050 0ustar guillaumeguillaume(* $Id: mutil.mli,v 5.16 2007-02-24 16:16:57 ddr Exp $ *) (* Copyright (c) 2006-2007 INRIA *) value int_size : int; value verbose : ref bool; value utf_8_db : ref bool; value lindex : string -> char -> option int; value rindex : string -> char -> option int; value array_mem : 'a -> array 'a -> bool; value list_iter_first : (bool -> 'a -> unit) -> list 'a -> unit; value list_uniq : list 'a -> list 'a; value tr : char -> char -> string -> string; value strip_all_trailing_spaces : string -> string; value decline : char -> string -> string; value nominative : string -> string; value remove_file : string -> unit; value mkdir_p : string -> unit; value remove_dir : string -> unit; value lock_file : string -> string; value output_value_no_sharing : out_channel -> _ -> unit; value output_array_no_sharing : out_channel -> (int -> _) -> int -> unit; value name_key : string -> string; value initial : string -> int; value input_particles : string -> list string; value surnames_pieces : string -> list string; value utf_8_of_iso_8859_1 : string -> string; value iso_8859_1_of_utf_8 : string -> string; value roman_of_arabian : int -> string; value arabian_of_roman : string -> int; value start_with : string -> string -> bool; value compare_after_particle : list string -> string -> string -> int; value input_lexicon : string -> Hashtbl.t string string -> (unit -> in_channel) -> unit; module StrSet : Set.S with type elt = string; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/updateFamOk.ml0000660000175200017530000011112012664543647023736 0ustar guillaumeguillaume(* camlp5r ./pa_html.cmo *) (* $Id: updateFamOk.ml,v 5.53 2008-01-08 02:08:00 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Config; open Def; open Futil; open Gutil; open Gwdb; open Hutil; open Mutil; open Util; (* Liste des string dont on a supprimé un caractère. *) (* Utilisé pour le message d'erreur lors de la validation. *) value removed_string = ref [] ; type create_info = Update.create_info == { ci_birth_date : option date; ci_birth_place : string; ci_death : death; ci_death_date : option date; ci_death_place : string; ci_occupation : string; ci_public : bool } ; value raw_get conf key = match p_getenv conf.env key with [ Some v -> v | None -> failwith (key ^ " unbound") ] ; value get conf key = match p_getenv conf.env key with [ Some v -> v | None -> failwith (key ^ " unbound") ] ; value getn conf var key = match p_getenv conf.env (var ^ "_" ^ key) with [ Some v -> v | None -> failwith (var ^ "_" ^ key ^ " unbound") ] ; value reconstitute_somebody conf var = let first_name = no_html_tags (only_printable (getn conf var "fn")) in let surname = no_html_tags (only_printable (getn conf var "sn")) in (* S'il y a des caractères interdits, on les supprime *) let (first_name, surname) = let contain_fn = String.contains first_name in let contain_sn = String.contains surname in if (List.exists contain_fn Name.forbidden_char) || (List.exists contain_sn Name.forbidden_char) then do { removed_string.val := [(Name.purge first_name ^ " " ^ Name.purge surname) :: removed_string.val]; (Name.purge first_name, Name.purge surname) } else (first_name, surname) in let occ = try int_of_string (getn conf var "occ") with [ Failure _ -> 0 ] in let sex = match p_getenv conf.env (var ^ "_sex") with [ Some "M" -> Male | Some "F" -> Female | _ -> Neuter ] in let create = match getn conf var "p" with [ "create" -> Update.Create sex None | _ -> Update.Link ] in (first_name, surname, occ, create, var) ; value reconstitute_parent_or_child conf var default_surname = let first_name = no_html_tags (only_printable (getn conf var "fn")) in let surname = let surname = no_html_tags (only_printable (getn conf var "sn")) in if surname = "" then default_surname else surname in (* S'il y a des caractères interdits, on les supprime *) let (first_name, surname) = let contain_fn = String.contains first_name in let contain_sn = String.contains surname in if (List.exists contain_fn Name.forbidden_char) || (List.exists contain_sn Name.forbidden_char) then do { removed_string.val := [(Name.purge first_name ^ " " ^ Name.purge surname) :: removed_string.val]; (Name.purge first_name, Name.purge surname) } else (first_name, surname) in let occ = try int_of_string (getn conf var "occ") with [ Failure _ -> 0 ] in let create_info = let b = Update.reconstitute_date conf (var ^ "b") in let bpl = getn conf (var ^ "b") "pl" in let death = match p_getenv conf.env (var ^ "d_yyyy") with [ Some "+" -> DeadDontKnowWhen | Some ("-" | "=") -> NotDead | _ -> DontKnowIfDead ] in let d = Update.reconstitute_date conf (var ^ "d") in let dpl = getn conf (var ^ "d") "pl" in let occupation = only_printable (getn conf var "occupation") in let public = getn conf (var ^ "b") "yyyy" = "p" in {ci_birth_date = b; ci_birth_place = bpl; ci_death = death; ci_death_date = d; ci_death_place = dpl; ci_occupation = occupation; ci_public = public} in let sex = match p_getenv conf.env (var ^ "_sex") with [ Some "M" -> Male | Some "F" -> Female | _ -> Neuter ] in let create = match getn conf var "p" with [ "create" -> Update.Create sex (Some create_info) | _ -> Update.Link ] in (first_name, surname, occ, create, var) ; value invert_children conf (c, children, ext) i = let var = "inv_ch" ^ string_of_int (i + 1) in match (p_getenv conf.env var, children) with [ (Some "on", [c1 :: children]) -> (c1, [c :: children], True) | _ -> (c, children, ext) ] ; value insert_child conf (children, ext) i = let var = "ins_ch" ^ string_of_int i in match (p_getenv conf.env var, p_getint conf.env (var ^ "_n")) with [ (_, Some n) when n > 1 -> let children = loop children n where rec loop children n = if n > 0 then let new_child = ("", "", 0, Update.Create Neuter None, "") in loop [new_child :: children] (n - 1) else children in (children, True) | (Some "on", _) -> let new_child = ("", "", 0, Update.Create Neuter None, "") in ([new_child :: children], True) | _ -> (children, ext) ] ; value insert_parent conf (parents, ext) i = let var = "ins_pa" ^ string_of_int i in match (p_getenv conf.env var, p_getint conf.env (var ^ "_n")) with [ (_, Some n) when n > 1 -> let parents = loop parents n where rec loop parents n = if n > 0 then let new_parent = ("", "", 0, Update.Create Neuter None, "") in loop [new_parent :: parents] (n - 1) else parents in (parents, True) | (Some "on", _) -> let new_parent = ("", "", 0, Update.Create Neuter None, "") in ([new_parent :: parents], True) | _ -> (parents, ext) ] ; value reconstitute_family conf = let ext = False in let relation = match (p_getenv conf.env "mrel", p_getenv conf.env "nsck") with [ (Some "marr", Some "on") -> NoSexesCheckMarried | (Some "marr", Some _ | None) -> Married | (Some "not_marr", Some "on") -> NoSexesCheckNotMarried | (Some "not_marr", Some _ | None) -> NotMarried | (Some "engaged", _) -> Engaged | (Some "nsck", _) -> NoSexesCheckNotMarried | (Some "nsckm", _) -> NoSexesCheckMarried | (Some "no_ment", _) -> NoMention | _ -> Married ] in let marriage = Update.reconstitute_date conf "marr" in let marriage_place = no_html_tags (only_printable (get conf "marr_place")) in let (witnesses, ext) = loop 1 ext where rec loop i ext = match try Some (reconstitute_somebody conf ("witn" ^ string_of_int i)) with [ Failure _ -> None ] with [ Some c -> let (witnesses, ext) = loop (i + 1) ext in match p_getenv conf.env ("ins_witn" ^ string_of_int i) with [ Some "on" -> let new_witn = ("", "", 0, Update.Create Neuter None, "") in ([c; new_witn :: witnesses], True) | _ -> ([c :: witnesses], ext) ] | None -> ([], ext) ] in let (witnesses, ext) = match p_getenv conf.env "ins_witn0" with [ Some "on" -> let new_witn = ("", "", 0, Update.Create Neuter None, "") in ([new_witn :: witnesses], True) | _ -> (witnesses, ext) ] in let divorce = match p_getenv conf.env "div" with [ Some "not_divorced" -> NotDivorced | Some "separated" -> Separated | _ -> Divorced (Adef.codate_of_od (Update.reconstitute_date conf "div")) ] in let surname = getn conf "pa1" "sn" in let (children, ext) = loop 1 ext where rec loop i ext = match try Some (reconstitute_parent_or_child conf ("ch" ^ string_of_int i) surname) with [ Failure _ -> None ] with [ Some c -> let (children, ext) = loop (i + 1) ext in let (c, children, ext) = invert_children conf (c, children, ext) i in let (children, ext) = insert_child conf (children, ext) i in ([c :: children], ext) | None -> ([], ext) ] in let (children, ext) = insert_child conf (children, ext) 0 in let (parents, ext) = loop 1 ext where rec loop i ext = match try Some (reconstitute_parent_or_child conf ("pa" ^ string_of_int i) "") with [ Failure _ -> None ] with [ Some c -> let (parents, ext) = loop (i + 1) ext in let (parents, ext) = insert_parent conf (parents, ext) i in ([c :: parents], ext) | None -> ([], ext) ] in let comment = only_printable_or_nl (strip_all_trailing_spaces (get conf "comment")) in let fsources = only_printable (get conf "src") in let origin_file = match p_getenv conf.env "origin_file" with [ Some x -> x | None -> "" ] in let fam_index = match p_getint conf.env "i" with [ Some i -> i | None -> 0 ] in let fam = {marriage = Adef.codate_of_od marriage; marriage_place = marriage_place; marriage_src = strip_spaces (get conf "marr_src"); witnesses = Array.of_list witnesses; relation = relation; divorce = divorce; comment = comment; origin_file = origin_file; fsources = fsources; fam_index = Adef.ifam_of_int fam_index} and cpl = parent conf.multi_parents (Array.of_list parents) and des = {children = Array.of_list children} in (fam, cpl, des, ext) ; value strip_array_persons pl = let pl = List.fold_right (fun ((f, s, o, c, _) as p) pl -> if f = "" then pl else [p :: pl]) (Array.to_list pl) [] in Array.of_list pl ; value error_family conf base err = let title _ = Wserver.wprint "%s" (capitale (transl conf "error")) in do { rheader conf title; Wserver.wprint "%s\n" (capitale err); Update.print_return conf; trailer conf; raise Update.ModErr } ; value check_witnesses conf base fam = let wl = Array.to_list fam.witnesses in let rec loop wl = match wl with [ [] -> None | [(fn, sn, _, _, _) :: l] -> if fn = "" && sn = "" then (* Champs non renseigné, il faut passer au suivant *) loop l else if fn = "" || fn = "?" then Some ((transl_nth conf "witness/witnesses" 0) ^ (" : ") ^ (transl conf "first name missing")) else if sn = "" || sn = "?" then Some ((transl_nth conf "witness/witnesses" 0) ^ (" : ") ^ (transl conf "surname missing")) else loop l ] in loop wl ; value check_parents conf base cpl = let (fa_fn, fa_sn, _, _, _) = father cpl in let (mo_fn, mo_sn, _, _, _) = mother cpl in match ((fa_fn = "", fa_sn = ""), (mo_fn = "", mo_sn = "")) with [ ((True, True), (True, True)) | ((True, True), (False, False)) | ((False, False), (True, True)) | ((False, False), (False, False)) -> None | ((False, True), _) -> Some ((transl_nth conf "father/mother" 0) ^ (" : ") ^ (transl conf "surname missing")) | ((True, False), _) -> Some ((transl_nth conf "father/mother" 0) ^ (" : ") ^ (transl conf "first name missing")) | (_, (False, True)) -> Some ((transl_nth conf "father/mother" 1) ^ (" : ") ^ (transl conf "surname missing")) | (_, (True, False)) -> Some ((transl_nth conf "father/mother" 1) ^ (" : ") ^ (transl conf "first name missing")) ] ; value check_family conf base fam cpl = let err_witness = check_witnesses conf base fam in let err_parents = check_parents conf base cpl in (err_witness, err_parents) ; value strip_family fam des = let fam = {(fam) with witnesses = strip_array_persons fam.witnesses} in let des = {children = strip_array_persons des.children} in (fam, des) ; value print_err_parents conf base p = let title _ = Wserver.wprint "%s" (capitale (transl conf "error")) in do { rheader conf title; Wserver.wprint "\n"; Wserver.wprint (fcapitale (ftransl conf "%t already has parents")) (fun _ -> Printf.sprintf "\n%s" (referenced_person_text conf base p)); Wserver.wprint "\n"; html_p conf; tag "ul" begin html_li conf; Wserver.wprint "%s: %d" (capitale (transl conf "first free number")) (Gutil.find_free_occ base (p_first_name base p) (p_surname base p) 0); end; Update.print_return conf; trailer conf; raise Update.ModErr } ; value print_err_father_sex conf base p = let title _ = Wserver.wprint "%s" (capitale (transl conf "error")) in do { rheader conf title; Wserver.wprint "\n%s" (referenced_person_text conf base p); Wserver.wprint "\n%s\n" (transl conf "should be male"); Update.print_return conf; trailer conf; raise Update.ModErr } ; value print_err_mother_sex conf base p = let title _ = Wserver.wprint "%s" (capitale (transl conf "error")) in do { rheader conf title; Wserver.wprint "\n%s" (referenced_person_text conf base p); Wserver.wprint "\n%s\n" (transl conf "should be female"); Update.print_return conf; trailer conf; raise Update.ModErr } ; value print_err conf base = let title _ = Wserver.wprint "%s" (capitale (transl conf "error")) in do { rheader conf title; Update.print_return conf; trailer conf; raise Update.ModErr } ; value print_error_disconnected conf = let title _ = Wserver.wprint "%s" (capitale (transl conf "error")) in do { rheader conf title; Hutil.print_link_to_welcome conf True; Wserver.wprint "%s" (capitale (transl conf "msg error disconnected")); trailer conf; raise Update.ModErr } ; value family_exclude pfams efam = let pfaml = List.fold_right (fun fam faml -> if fam = efam then faml else [fam :: faml]) (Array.to_list pfams) [] in Array.of_list pfaml ; value infer_origin_file_from_other_marriages conf base ifam ip = let u = poi base ip in let ufams = get_family u in let rec loop i = if i = Array.length ufams then None else if ufams.(i) = ifam then loop (i + 1) else let r = get_origin_file (foi base ufams.(i)) in if sou base r <> "" then Some r else loop (i + 1) in loop 0 ; value infer_origin_file conf base ifam ncpl ndes = let r = infer_origin_file_from_other_marriages conf base ifam (Adef.father ncpl) in let r = if r = None then infer_origin_file_from_other_marriages conf base ifam (Adef.mother ncpl) else r in let r = match r with [ Some r -> r | None -> let afath = poi base (Adef.father ncpl) in let amoth = poi base (Adef.mother ncpl) in match (get_parents afath, get_parents amoth) with [ (Some if1, _) when sou base (get_origin_file (foi base if1)) <> "" -> (get_origin_file (foi base if1)) | (_, Some if2) when sou base (get_origin_file (foi base if2)) <> "" -> (get_origin_file (foi base if2)) | _ -> let rec loop i = if i = Array.length ndes.children then Gwdb.insert_string base "" else let cifams = get_family (poi base ndes.children.(i)) in if Array.length cifams = 0 then loop (i + 1) else if sou base (get_origin_file (foi base cifams.(0))) <> "" then get_origin_file (foi base cifams.(0)) else loop (i + 1) in loop 0 ] ] in let no_dec = try List.assoc "propose_add_family" conf.base_env = "no" with [ Not_found -> False ] in if no_dec && sou base r = "" then print_error_disconnected conf else r ; value effective_mod conf base sfam scpl sdes = do { let fi = sfam.fam_index in let (oorigin, owitnesses) = let ofam = foi base fi in (get_origin_file ofam, get_witnesses ofam) in let (oarr, ofather, omother) = let ocpl = foi base fi in (get_parent_array ocpl, get_father ocpl, get_mother ocpl) in let ochildren = get_children (foi base fi) in let created_p = ref [] in let psrc = match p_getenv conf.env "psrc" with [ Some s -> strip_spaces s | None -> "" ] in let ncpl = map_couple_p conf.multi_parents (Update.insert_person conf base psrc created_p) scpl in let nfam = map_family_ps (Update.insert_person conf base psrc created_p) (Gwdb.insert_string base) sfam in let ndes = map_descend_p (Update.insert_person conf base psrc created_p) sdes in let nfath = poi base (Adef.father ncpl) in let nmoth = poi base (Adef.mother ncpl) in if sfam.relation <> NoSexesCheckNotMarried && sfam.relation <> NoSexesCheckMarried then do { match get_sex nfath with [ Female -> print_err_father_sex conf base nfath | Male -> () | Neuter -> let nfath = {(gen_person_of_person nfath) with sex = Male} in patch_person base nfath.key_index nfath ]; match get_sex nmoth with [ Male -> print_err_mother_sex conf base nmoth | Female -> () | Neuter -> let nmoth = {(gen_person_of_person nmoth) with sex = Female} in patch_person base nmoth.key_index nmoth ]; } else (); if Adef.father ncpl = Adef.mother ncpl then print_err conf base else (); let nfam = let origin_file = if sfam.origin_file = "" then if sou base oorigin <> "" then oorigin else infer_origin_file conf base fi ncpl ndes else nfam.origin_file in {(nfam) with origin_file = origin_file; fam_index = fi} in patch_family base fi nfam; patch_couple base fi ncpl; patch_descend base fi ndes; let narr = Adef.parent_array ncpl in for i = 0 to Array.length oarr - 1 do { if not (array_mem oarr.(i) narr) then do { let ou = poi base oarr.(i) in let ou = {family = family_exclude (get_family ou) fi} in patch_union base oarr.(i) ou } else () }; for i = 0 to Array.length narr - 1 do { if not (array_mem narr.(i) oarr) then do { let nu = poi base narr.(i) in let nu = {family = Array.append (get_family nu) [| fi |]} in patch_union base narr.(i) nu; } else () }; let cache = Hashtbl.create 101 in let find_asc = fun ip -> try Hashtbl.find cache ip with [ Not_found -> do { let a = poi base ip in let a = {parents = get_parents a; consang = get_consang a} in Hashtbl.add cache ip a; a } ] in let same_parents = Adef.father ncpl = ofather && Adef.mother ncpl = omother in Array.iter (fun ip -> let a = find_asc ip in let a = {parents = None; consang = if not (array_mem ip ndes.children) then Adef.fix (-1) else a.consang} in Hashtbl.replace cache ip a) ochildren; Array.iter (fun ip -> let a = find_asc ip in match a.parents with [ Some _ -> print_err_parents conf base (poi base ip) | None -> let a = {parents = Some fi; consang = if not (array_mem ip ochildren) || not same_parents then Adef.fix (-1) else a.consang} in Hashtbl.replace cache ip a ]) ndes.children; Array.iter (fun ip -> if not (array_mem ip ndes.children) then patch_ascend base ip (find_asc ip) else ()) ochildren; Array.iter (fun ip -> if not (array_mem ip ochildren) || not same_parents then patch_ascend base ip (find_asc ip) else ()) ndes.children; Update.add_misc_names_for_new_persons base created_p.val; Update.update_misc_names_of_family base Male {family = get_family nfath}; Update.update_related_pointers base (Adef.father ncpl) (Array.to_list owitnesses) (Array.to_list nfam.witnesses); (fi, nfam, ncpl, ndes) }; value effective_add conf base sfam scpl sdes = let fi = Adef.ifam_of_int (nb_of_families base) in let created_p = ref [] in let psrc = match p_getenv conf.env "psrc" with [ Some s -> strip_spaces s | None -> "" ] in let ncpl = map_couple_p conf.multi_parents (Update.insert_person conf base psrc created_p) scpl in let nfam = map_family_ps (Update.insert_person conf base psrc created_p) (Gwdb.insert_string base) sfam in let ndes = map_descend_p (Update.insert_person conf base psrc created_p) sdes in let origin_file = infer_origin_file conf base fi ncpl ndes in let nfath_p = poi base (Adef.father ncpl) in let nmoth_p = poi base (Adef.mother ncpl) in do { if sfam.relation <> NoSexesCheckNotMarried && sfam.relation <> NoSexesCheckMarried then do { match get_sex nfath_p with [ Female -> print_err_father_sex conf base nfath_p | Male -> () | _ -> let nfath_p = {(gen_person_of_person nfath_p) with sex = Male} in patch_person base nfath_p.key_index nfath_p ]; match get_sex nmoth_p with [ Male -> print_err_mother_sex conf base nmoth_p | Female -> () | _ -> let nmoth_p = {(gen_person_of_person nmoth_p) with sex = Female} in patch_person base nmoth_p.key_index nmoth_p ]; } else if Adef.father ncpl = Adef.mother ncpl then print_err conf base else (); let nfam = {(nfam) with origin_file = origin_file; fam_index = fi} in patch_family base fi nfam; patch_couple base fi ncpl; patch_descend base fi ndes; let nfath_u = {family = Array.append (get_family nfath_p) [| fi |]} in let nmoth_u = {family = Array.append (get_family nmoth_p) [| fi |]} in patch_union base (Adef.father ncpl) nfath_u; patch_union base (Adef.mother ncpl) nmoth_u; Array.iter (fun ip -> let p = poi base ip in match get_parents p with [ Some _ -> print_err_parents conf base p | None -> let a = {parents = Some fi; consang = Adef.fix (-1)} in patch_ascend base (get_key_index p) a ]) ndes.children; Update.add_misc_names_for_new_persons base created_p.val; Update.update_misc_names_of_family base Male nfath_u; Update.update_related_pointers base (Adef.father ncpl) [] (Array.to_list nfam.witnesses); (fi, nfam, ncpl, ndes) } ; value effective_inv conf base ip u ifam = let rec loop = fun [ [ifam1; ifam2 :: ifaml] -> if ifam2 = ifam then [ifam2; ifam1 :: ifaml] else [ifam1 :: loop [ifam2 :: ifaml]] | _ -> do { incorrect_request conf; raise Update.ModErr } ] in let u = {family = Array.of_list (loop (Array.to_list (get_family u)))} in patch_union base ip u ; (* ************************************************************************ *) (* [Fonc] effective_chg_order : config -> base -> iper -> person -> ifam -> int -> unit *) (** [Description] : Modifie l'ordre de la famille en positionnant la famille ifam à la position n. Exemple : [f1 f2 f3 f4] f1 3 => [f2 f3 f1 f4]. [Args] : - conf : configuration de la base - base : base de donnée - ip : iper - u : person - ifam : famille à changer de place - n : nouvelle position de la famille [Retour] : Néant [Rem] : Non exporté en clair hors de ce module. *) (* ************************************************************************ *) value effective_chg_order conf base ip u ifam n = let fam = UpdateFam.change_order conf base ip u ifam n in let u = {family = Array.of_list fam} in patch_union base ip u ; value kill_family base ifam1 ip = let u = poi base ip in let l = List.fold_right (fun ifam ifaml -> if ifam = ifam1 then ifaml else [ifam :: ifaml]) (Array.to_list (get_family u)) [] in let u = {family = Array.of_list l} in patch_union base ip u ; value kill_parents base ip = let a = {parents = None; consang = Adef.fix (-1)} in patch_ascend base ip a ; value effective_del conf base (ifam, fam) = do { kill_family base ifam (get_father fam); kill_family base ifam (get_mother fam); Array.iter (kill_parents base) (get_children fam); delete_family base ifam; }; value array_forall2 f a1 a2 = if Array.length a1 <> Array.length a2 then invalid_arg "array_forall2" else loop 0 where rec loop i = if i = Array.length a1 then True else if f a1.(i) a2.(i) then loop (i + 1) else False ; value array_exists f a = loop 0 where rec loop i = if i = Array.length a then False else if f a.(i) then True else loop (i + 1) ; value is_a_link = fun [ (_, _, _, Update.Link, _) -> True | _ -> False ] ; value is_created_or_already_there ochil_arr nchil schil = not (is_a_link schil) || array_mem nchil ochil_arr ; (* need_check_noloop: optimization The no-loop check being a big work on large databases, this optimization tests if this is really necessary or not. It is not necessary if: 1/ either all parents are created, 2/ or all children are created, 3/ or the new family have the same parents than the old one *and* all linked (not created) new children were already children. *) (* Replaced && by || to do more checks. *) (* Improvement : check the name on the parents/children if they linked *) value need_check_noloop (scpl, sdes, onfs) = if array_exists is_a_link (parent_array scpl) || array_exists is_a_link sdes.children then match onfs with [ Some ((opar, ochil), (npar, nchil)) -> not (array_forall2 (is_created_or_already_there opar) npar (parent_array scpl)) || not (array_forall2 (is_created_or_already_there ochil) nchil sdes.children) | None -> True ] else False ; value all_checks_family conf base ifam fam cpl des scdo = do { let wl = ref [] in let ml = ref [] in let error = Update.error conf base in let warning w = wl.val := [w :: wl.val] in let misc m = ml.val := [m :: ml.val] in if need_check_noloop scdo then Consang.check_noloop_for_person_list base error (Array.to_list (Adef.parent_array cpl)) else (); let fam = family_of_gen_family base (fam, cpl, des) in CheckItem.family base error warning ifam fam; CheckItem.check_other_fields base misc ifam fam; List.iter (fun [ ChangedOrderOfMarriages p _ after -> patch_union base (get_key_index p) {family = after} | _ -> () ]) wl.val; (List.rev wl.val, List.rev ml.val) }; value print_family conf base (wl, ml) cpl des = do { let rdsrc = match p_getenv conf.env "rdsrc" with [ Some "on" -> p_getenv conf.env "src" | _ -> p_getenv conf.env "dsrc" ] in match rdsrc with [ Some x -> do { conf.henv := List.remove_assoc "dsrc" conf.henv; if x <> "" then conf.henv := [("dsrc", code_varenv x) :: conf.henv] else () } | None -> () ]; tag "ul" begin stag "li" begin Wserver.wprint "%s" (referenced_person_text conf base (poi base (Adef.father cpl))); end; Wserver.wprint "\n"; stag "li" begin Wserver.wprint "%s" (referenced_person_text conf base (poi base (Adef.mother cpl))); end; end; if des.children <> [| |] then do { tag "ul" begin Array.iter (fun ip -> stag "li" begin Wserver.wprint "%s" (referenced_person_text conf base (poi base ip)); end ) des.children; end; } else (); Update.print_warnings_and_miscs conf base (wl, ml) }; value print_mod_ok conf base (wl, ml) cpl des = let title _ = Wserver.wprint "%s" (capitale (transl conf "family modified")) in do { header conf title; print_link_to_welcome conf True; (* Si on a supprimé des caractères interdits *) if List.length removed_string.val > 0 then do { Wserver.wprint "

      " ; Wserver.wprint (fcapitale (ftransl conf "%s forbidden char")) (List.fold_left (fun acc c -> acc ^ "'" ^ Char.escaped c ^ "' ") " " Name.forbidden_char); Wserver.wprint "

      \n" ; List.iter (Wserver.wprint "

      %s

      ") removed_string.val } else (); print_family conf base (wl, ml) cpl des; trailer conf } ; value print_add_ok conf base (wl, ml) cpl des = let title _ = Wserver.wprint "%s" (capitale (transl conf "family added")) in do { header conf title; print_link_to_welcome conf True; (* Si on a supprimé des caractères interdits *) if List.length removed_string.val > 0 then do { Wserver.wprint "

      %s

      \n" (capitale (transl conf "forbidden char")); List.iter (Wserver.wprint "

      %s

      ") removed_string.val } else (); print_family conf base (wl, ml) cpl des; trailer conf } ; value print_del_ok conf base wl = let title _ = Wserver.wprint "%s" (capitale (transl conf "family deleted")) in do { header conf title; print_link_to_welcome conf True; match p_getint conf.env "ip" with [ Some i -> let p = poi base (Adef.iper_of_int i) in tag "ul" begin Wserver.wprint "
    • \n"; Wserver.wprint "%s\n" (reference conf base p (person_text conf base p)); end | _ -> () ]; Update.print_warnings conf base wl; trailer conf } ; value print_inv_ok conf base p = let title _ = Wserver.wprint "%s" (capitale (transl conf "inversion done")) in do { header conf title; print_link_to_welcome conf True; Wserver.wprint "\n%s" (referenced_person_text conf base p); Wserver.wprint "\n"; trailer conf } ; value get_create (_, _, _, create, _) = create; value forbidden_disconnected conf sfam scpl sdes = let no_dec = try List.assoc "propose_add_family" conf.base_env = "no" with [ Not_found -> False ] in if no_dec then if get_create (father scpl) = Update.Link || get_create (mother scpl) = Update.Link then False else List.for_all (fun p -> get_create p <> Update.Link) (Array.to_list sdes.children) else False ; value print_add o_conf base = (* Attention ! On pense à remettre les compteurs à *) (* zéro pour la détection des caractères interdits *) let () = removed_string.val := [] in let conf = Update.update_conf o_conf in try let (sfam, scpl, sdes, ext) = reconstitute_family conf in let redisp = match p_getenv conf.env "return" with [ Some _ -> True | _ -> False ] in let digest = match p_getint conf.env "ip" with [ Some ip -> string_of_int (Array.length (get_family (poi base (Adef.iper_of_int ip)))) | None -> "" ] in let sdigest = raw_get conf "digest" in if digest <> "" && sdigest <> "" && digest <> sdigest then Update.error_digest conf else if ext || redisp then UpdateFam.print_update_fam conf base (sfam, scpl, sdes) "" else if forbidden_disconnected conf sfam scpl sdes then print_error_disconnected conf else match check_family conf base sfam scpl with [ (Some err, _) | (_, Some err) -> error_family conf base err | (None, None) -> do { let (sfam, sdes) = strip_family sfam sdes in let (ifam, fam, cpl, des) = effective_add conf base sfam scpl sdes in let (wl, ml) = all_checks_family conf base ifam fam cpl des (scpl, sdes, None) in let (changed, act) = let fam = Util.string_gen_family base fam in let (ip, act) = match p_getint conf.env "ip" with [ Some i -> if Adef.int_of_iper (Adef.mother cpl) = i then (Adef.mother cpl, "af") else let a = poi base (Adef.iper_of_int i) in match get_parents a with [ Some x when x = ifam -> (Adef.iper_of_int i, "aa") | _ -> (Adef.father cpl, "af") ] | None -> (Adef.father cpl, "af") ] in match act with [ "af" -> let gen_p = Util.string_gen_person base (gen_person_of_person (poi base ip)) in (U_Add_family gen_p fam, "af") | _ -> let gen_p = Util.string_gen_person base (gen_person_of_person (poi base ip)) in (U_Add_parent gen_p fam, "aa") ] in Util.commit_patches conf base; History.record conf base changed act; Update.delete_topological_sort conf base; print_add_ok conf base (wl, ml) cpl des } ] with [ Update.ModErr -> () ] ; value print_del conf base = match p_getint conf.env "i" with [ Some i -> let ifam = Adef.ifam_of_int i in let fam = foi base ifam in do { if not (is_deleted_family fam) then do { effective_del conf base (ifam, fam); Util.commit_patches conf base; let changed = let gen_p = let p = match p_getint conf.env "ip" with [ Some i when Adef.int_of_iper (get_mother fam) = i -> poi base (get_mother fam) | _ -> poi base (get_father fam) ] in Util.string_gen_person base (gen_person_of_person p) in let gen_fam = Util.string_gen_family base (gen_family_of_family fam) in U_Delete_family gen_p gen_fam in History.record conf base changed "df"; Update.delete_topological_sort conf base } else (); print_del_ok conf base [] } | _ -> incorrect_request conf ] ; value print_mod_aux conf base callback = try let (sfam, scpl, sdes, ext) = reconstitute_family conf in let redisp = match p_getenv conf.env "return" with [ Some _ -> True | _ -> False ] in let digest = let ini_sfam = UpdateFam.string_family_of conf base sfam.fam_index in Update.digest_family ini_sfam in if digest = raw_get conf "digest" then if ext || redisp then UpdateFam.print_update_fam conf base (sfam, scpl, sdes) digest else match check_family conf base sfam scpl with [ (Some err, _) | (_, Some err) -> error_family conf base err | (None, None) -> let (sfam, sdes) = strip_family sfam sdes in callback sfam scpl sdes ] else Update.error_digest conf with [ Update.ModErr -> () ] ; value family_structure conf base ifam = let fam = foi base ifam in (get_parent_array fam, get_children fam) ; value print_mod o_conf base = (* Attention ! On pense à remettre les compteurs à *) (* zéro pour la détection des caractères interdits *) let () = removed_string.val := [] in let o_f = let ifam = match p_getint o_conf.env "i" with [ Some i -> Adef.ifam_of_int i | None -> Adef.ifam_of_int (-1) ] in Util.string_gen_family base (gen_family_of_family (foi base ifam)) in let conf = Update.update_conf o_conf in let callback sfam scpl sdes = do { let ofs = family_structure conf base sfam.fam_index in let (ifam, fam, cpl, des) = effective_mod conf base sfam scpl sdes in let s = let sl = [fam.comment; fam.fsources] in String.concat " " (List.map (sou base) sl) in Notes.update_notes_links_db conf (NotesLinks.PgFam ifam) s; let nfs = (Adef.parent_array cpl, des.children) in let onfs = Some (ofs, nfs) in let (wl, ml) = all_checks_family conf base ifam fam cpl des (scpl, sdes, onfs) in Util.commit_patches conf base; let changed = let ip = match p_getint o_conf.env "ip" with [ Some i -> Adef.iper_of_int i | None -> Adef.iper_of_int (-1) ] in let p = Util.string_gen_person base (gen_person_of_person (poi base ip)) in let n_f = Util.string_gen_family base fam in U_Modify_family p o_f n_f in History.record conf base changed "mf"; Update.delete_topological_sort conf base; print_mod_ok conf base (wl, ml) cpl des } in print_mod_aux conf base callback ; value print_inv conf base = match (p_getint conf.env "i", p_getint conf.env "f") with [ (Some ip, Some ifam) -> let p = poi base (Adef.iper_of_int ip) in try do { effective_inv conf base (get_key_index p) p (Adef.ifam_of_int ifam); Util.commit_patches conf base; let changed = let gen_p = Util.string_gen_person base (gen_person_of_person p) in U_Invert_family gen_p (Adef.ifam_of_int ifam) in History.record conf base changed "if"; print_inv_ok conf base p } with [ Update.ModErr -> () ] | _ -> incorrect_request conf ] ; value print_change_order_ok conf base = match (p_getint conf.env "i", p_getint conf.env "f", p_getint conf.env "n") with [ (Some ip, Some ifam, Some n) -> let p = poi base (Adef.iper_of_int ip) in try do { effective_chg_order conf base (get_key_index p) p (Adef.ifam_of_int ifam) n; Util.commit_patches conf base; let changed = let gen_p = Util.string_gen_person base (gen_person_of_person p) in U_Invert_family gen_p (Adef.ifam_of_int ifam) in History.record conf base changed "if"; print_inv_ok conf base p } with [ Update.ModErr -> () ] | _ -> incorrect_request conf ] ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/mergeFam.ml0000660000175200017530000001223112664543647023264 0ustar guillaumeguillaume(* camlp5r ./pa_html.cmo *) (* $Id: mergeFam.ml,v 5.13 2007-09-12 09:58:44 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Config; open Def; open Gwdb; open Hutil; open Util; value need_differences_selection conf base fam1 fam2 = let need_selection proj = let x1 = proj fam1 in let x2 = proj fam2 in x1 <> "" && x2 <> "" && x1 <> x2 in need_selection (fun fam -> match get_relation fam with [ Married -> "married" | NotMarried -> "not married" | Engaged -> "engaged" | NoSexesCheckNotMarried -> "no sexes check" | NoSexesCheckMarried -> "no sexes check married" | NoMention -> "no mention" ]) || need_selection (fun fam -> match Adef.od_of_codate (get_marriage fam) with [ None -> "" | Some d -> Date.string_of_ondate conf d ]) || need_selection (fun fam -> sou base (get_marriage_place fam)) || need_selection (fun fam -> match get_divorce fam with [ NotDivorced -> "not divorced" | Separated -> "separated" | Divorced cod -> match Adef.od_of_codate cod with [ Some d -> Date.string_of_ondate conf d | None -> "divorced" ] ]) ; value print_differences conf base branches (ifam1, fam1) (ifam2, fam2) = let string_field title name proj = let x1 = proj fam1 in let x2 = proj fam2 in if x1 <> "" && x2 <> "" && x1 <> x2 then do { Wserver.wprint "

      %s

      \n" (capitale title); tag "ul" begin html_li conf; Wserver.wprint "\n" name; Wserver.wprint "%s\n" x1; html_li conf; Wserver.wprint "\n" name; Wserver.wprint "%s\n" x2; end; } else () in tag "form" "method=\"post\" action=\"%s\"" conf.command begin Util.hidden_env conf; Wserver.wprint "\n"; Wserver.wprint "\n" (Adef.int_of_ifam ifam1); Wserver.wprint "\n" (Adef.int_of_ifam ifam2); match p_getenv conf.env "ip" with [ Some ip -> Wserver.wprint "\n" ip | None -> () ]; let rec loop = fun [ [(ip1, ip2)] -> do { Wserver.wprint "\n" (Adef.int_of_iper ip1); Wserver.wprint "\n" (Adef.int_of_iper ip2); } | [_ :: branches] -> loop branches | _ -> () ] in loop branches; html_p conf; string_field (transl_nth conf "relation/relations" 0) "relation" (fun fam -> match get_relation fam with [ Married -> transl conf "married" | NotMarried -> transl conf "not married" | Engaged -> transl conf "engaged" | NoSexesCheckNotMarried -> transl conf "no sexes check" | NoSexesCheckMarried -> transl conf "married" | NoMention -> transl conf "no mention" ]); string_field (Util.translate_eval (transl_nth conf "marriage/marriages" 0)) "marriage" (fun fam -> match Adef.od_of_codate (get_marriage fam) with [ None -> "" | Some d -> Date.string_of_ondate conf d ]); string_field (Util.translate_eval (transl_nth conf "marriage/marriages" 0) ^ " / " ^ transl conf "place") "marriage_place" (fun fam -> sou base (get_marriage_place fam)); string_field (transl conf "divorce") "divorce" (fun fam -> match get_divorce fam with [ NotDivorced -> transl conf "not divorced" | Separated -> transl conf "separated" | Divorced cod -> let ds = match Adef.od_of_codate cod with [ Some d -> " " ^ Date.string_of_ondate conf d | None -> "" ] in transl conf "divorced" ^ ds ]); html_p conf; Wserver.wprint "\n"; end ; value merge_fam1 conf base fam1 fam2 = let title h = let s = transl_nth conf "family/families" 1 in Wserver.wprint "%s" (capitale (transl_decline conf "merge" s)) in do { header conf title; print_differences conf base [] fam1 fam2; trailer conf; } ; value merge_fam conf base (ifam1, fam1) (ifam2, fam2) = let cpl1 = foi base ifam1 in let cpl2 = foi base ifam2 in if get_father cpl1 = get_father cpl2 && get_mother cpl1 = get_mother cpl2 then if need_differences_selection conf base fam1 fam2 then merge_fam1 conf base (ifam1, fam1) (ifam2, fam2) else MergeFamOk.print_merge conf base else incorrect_request conf ; value print conf base = match (p_getint conf.env "i", p_getint conf.env "i2") with [ (Some f1, Some f2) -> let ifam1 = Adef.ifam_of_int f1 in let ifam2 = Adef.ifam_of_int f2 in let fam1 = foi base ifam1 in let fam2 = foi base ifam2 in merge_fam conf base (ifam1, fam1) (ifam2, fam2) | _ -> incorrect_request conf ] ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/wiki.mli0000660000175200017530000000236712664543647022666 0ustar guillaumeguillaume(* camlp5r *) (* $Id: wiki.mli,v 5.8 2007-09-12 09:58:44 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Config; type wiki_info = { wi_mode : string; wi_file_path : string -> string; wi_cancel_links : bool; wi_person_exists : (string * string * int) -> bool; wi_always_show_link : bool } ; value syntax_links : config -> wiki_info -> string -> string; value html_of_tlsw : config -> string -> list string; value html_with_summary_of_tlsw : config -> wiki_info -> option (bool * string * string) -> string -> string; value extract_sub_part : string -> int -> list string; value split_title_and_text : string -> (list (string * string) * string); value print_sub_part : config -> wiki_info -> bool -> string -> string -> int -> list string -> unit; value print_mod_view_page : config -> bool -> string -> string -> (bool -> unit) -> list (string * string) -> string -> unit; value print_mod_ok : config -> wiki_info -> (string -> option string) -> (option string -> string) -> (string -> (list (string * string) * string)) -> (string -> string -> unit) -> (string -> string) -> bool -> unit; value notes_aliases : config -> list (string * string); value map_notes : list (string * string) -> string -> string; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/db2disk.ml0000660000175200017530000004322112664543647023066 0ustar guillaumeguillaume(* $Id: db2disk.ml,v 5.27 2012-01-27 16:57:07 ddr Exp $ *) (* Copyright (c) 2006-2007 INRIA *) open Def; open Mutil; open Printf; value magic_patch = "GwPt0002"; type patches = { nb_per : mutable int; nb_fam : mutable int; nb_per_ini : int; nb_fam_ini : int; h_person : Hashtbl.t iper (gen_person iper string); h_ascend : Hashtbl.t iper (gen_ascend ifam); h_union : Hashtbl.t iper (gen_union ifam); h_family : Hashtbl.t ifam (gen_family iper string); h_couple : Hashtbl.t ifam (gen_couple iper); h_descend : Hashtbl.t ifam (gen_descend iper); h_key : Hashtbl.t (string * string * int) (option iper); h_name : Hashtbl.t string (list iper) } ; type db2 = { phony : unit -> unit; (* to prevent usage of "=" in the program *) bdir2 : string; cache_chan : Hashtbl.t (string * string * string) in_channel; patches : patches; parents_array : mutable option (array (option ifam)); consang_array : mutable option (array Adef.fix); family_array : mutable option (array (array ifam)); father_array : mutable option (array iper); mother_array : mutable option (array iper); children_array : mutable option (array (array iper)) } ; (* reading in files style database 2 *) value fast_open_in_bin_and_seek db2 f1 f2 f pos = do { let ic = try Hashtbl.find db2.cache_chan (f1, f2, f) with [ Not_found -> do { let ic = open_in_bin (List.fold_left Filename.concat db2.bdir2 [f1; f2; f]) in Hashtbl.add db2.cache_chan (f1, f2, f) ic; ic } ] in seek_in ic pos; ic }; value field_exists db2 (f1, f2) = let fname = List.fold_left Filename.concat db2.bdir2 [f1; f2; "access"] in Sys.file_exists fname ; value get_field_acc db2 i (f1, f2) = try do { let ic = fast_open_in_bin_and_seek db2 f1 f2 "access" (4 * i) in let r = input_binary_int ic in assert (r >= -1); assert (r <= 0x3fffffff); r } with e -> do { eprintf "Error get_field_acc \"%s/%s/access\" i = %d\n" f1 f2 i; flush stderr; raise e; } ; value get_field_data db2 pos (f1, f2) data = let ic = fast_open_in_bin_and_seek db2 f1 f2 data pos in Iovalue.input ic ; value get_field_2_data db2 pos (f1, f2) data = let ic = fast_open_in_bin_and_seek db2 f1 f2 data pos in let r = Iovalue.input ic in let s = Iovalue.input ic in (r, s) ; value get_field db2 i path = let pos = get_field_acc db2 i path in get_field_data db2 pos path "data" ; value string_of_istr2 db2 f pos = if pos = -1 then "" else get_field_data db2 pos f "data" ; (* hash tables in disk *) type bucketlist 'a 'b = [ Empty | Cons of 'a and 'b and bucketlist 'a 'b ] ; value rec hashtbl_find_rec key = fun [ Empty -> raise Not_found | Cons k d rest -> if compare key k = 0 then d else hashtbl_find_rec key rest ] ; value hashtbl_find dir file key = do { let ic_ht = open_in_bin (Filename.concat dir file) in let ic_hta = open_in_bin (Filename.concat dir (file ^ "a")) in let alen = input_binary_int ic_hta in let pos = int_size + (Hashtbl.hash key) mod alen * int_size in seek_in ic_hta pos; let pos = input_binary_int ic_hta in close_in ic_hta; seek_in ic_ht pos; let bl : bucketlist _ _ = Iovalue.input ic_ht in close_in ic_ht; hashtbl_find_rec key bl }; value hashtbl_find_all dir file key = do { let rec find_in_bucket = fun [ Empty -> [] | Cons k d rest -> if compare k key = 0 then [d :: find_in_bucket rest] else find_in_bucket rest ] in match try Some (open_in_bin (Filename.concat dir file)) with [ Sys_error _ -> None ] with [ Some ic_ht -> do { let ic_hta = open_in_bin (Filename.concat dir (file ^ "a")) in let alen = input_binary_int ic_hta in let pos = int_size + (Hashtbl.hash key) mod alen * int_size in seek_in ic_hta pos; let pos = input_binary_int ic_hta in close_in ic_hta; seek_in ic_ht pos; let bl : bucketlist _ _ = Iovalue.input ic_ht in close_in ic_ht; find_in_bucket bl } | None -> [] ] }; value key_hashtbl_find dir file k = hashtbl_find dir file (Db2.key2_of_key k); (* string person index version 2 *) type string_person_index2 = { is_first_name : bool; index_of_first_char : list (string * int); ini : mutable string; curr_i : mutable int; curr_s : mutable string } ; value start_with s p = String.length p <= String.length s && String.sub s 0 (String.length p) = p ; type string_person = [ Sp of int | SpNew of string ] ; value sorted_patched_person_strings db2 is_first_name = let particles = Mutil.input_particles (Filename.concat db2.bdir2 "particles.txt") in let sl = Hashtbl.fold (fun ip p sl -> let s = if is_first_name then p.first_name else p.surname in [s :: sl]) db2.patches.h_person [] in let sl = list_uniq (List.sort compare sl) in let sl = List.map (fun s -> let s_ord = try let part = List.find (start_with s) particles in let plen = String.length part in String.sub s plen (String.length s - plen) ^ " (" ^ part ^ ")" with [ Not_found -> s ] in (s_ord, s)) sl in List.sort compare sl ; value spi2_first db2 spi (f1, f2) s = do { spi.ini := s; let i_opt = (* to be faster, go directly to the first string starting with the same char *) if s = "" then Some 0 else let nbc = Name.nbc s.[0] in loop spi.index_of_first_char where rec loop = fun [ [(s1, i1) :: list] -> if s1 = "" then loop list else let nbc1 = Name.nbc s1.[0] in if nbc = nbc1 && nbc > 0 && nbc <= String.length s && nbc <= String.length s1 && String.sub s 0 nbc = String.sub s1 0 nbc then Some i1 else loop list | [] -> None ] in let first_in_disk = match i_opt with [ Some i -> let ic = fast_open_in_bin_and_seek db2 f1 f2 "index.acc" (4 * i) in let pos = input_binary_int ic in let ic = fast_open_in_bin_and_seek db2 f1 f2 "index.dat" pos in try loop i where rec loop i = let (s1, pos) : (string * int) = Iovalue.input ic in if start_with s1 s then Some (s1, pos, i) else loop (i + 1) with [ End_of_file -> None ] | None -> None ] in let first_patched = let patched_sl = sorted_patched_person_strings db2 spi.is_first_name in loop patched_sl where rec loop = fun [ [(s2_ord, s2) :: sl] -> if s2_ord < s then loop sl else if start_with s2_ord s then Some (s2_ord, s2) else loop sl | [] -> None ] in match (first_in_disk, first_patched) with [ (Some (s1, _, _), Some (s2_ord, s2)) when s2_ord < s1 -> do { spi.curr_s := s2_ord; SpNew s2 } | (Some (s1, pos, i), _) -> do { spi.curr_i := i; spi.curr_s := s1; Sp pos; } | (None, Some (s2_ord, s2)) -> do { spi.curr_s := s2_ord; SpNew s2 } | (None, None) -> raise Not_found ] }; value spi2_next db2 spi (f1, f2) need_whole_list = let i_opt = if spi.ini = "" && not need_whole_list then loop spi.index_of_first_char where rec loop = fun [ [(_, i1) :: ([(_, i2) :: _] as list)] -> if spi.curr_i = i1 then Some i2 else loop list | [] | [_] -> None ] else Some (spi.curr_i + 1) in let next_in_disk = match i_opt with [ Some i -> try let ic = let ic = fast_open_in_bin_and_seek db2 f1 f2 "index.acc" (i * 4) in let pos = input_binary_int ic in fast_open_in_bin_and_seek db2 f1 f2 "index.dat" pos in let (s, pos) : (string * int) = Iovalue.input ic in let dlen = i - spi.curr_i in Some (i, s, pos, dlen) with [ End_of_file -> None ] | None -> None ] in let next_patched = let patched_sl = sorted_patched_person_strings db2 spi.is_first_name in loop patched_sl where rec loop = fun [ [(s2_ord, s2) :: sl] -> if s2_ord <= spi.curr_s then loop sl else Some (s2_ord, s2) | [] -> None ] in match (next_in_disk, next_patched) with [ (Some (_, s1, _, _), Some (s2_ord, s2)) when s2_ord < s1 -> do { spi.curr_s := s2_ord; (SpNew s2, 1) } | (Some (i, s1, pos, dlen), _) -> do { spi.curr_i := i; spi.curr_s := s1; (Sp pos, dlen) } | (None, Some (s2_ord, s2)) -> do { spi.curr_s := s2_ord; (SpNew s2, 1) } | (None, None) -> raise Not_found ] ; value spi2gen_add pl db2 spi s = let proj = if spi.is_first_name then fun p -> p.first_name else fun p -> p.surname in Hashtbl.fold (fun _ p iperl -> if proj p = s then [p.key_index :: iperl] else iperl) db2.patches.h_person pl ; value spi2_find db2 spi (f1, f2) pos = let dir = List.fold_left Filename.concat db2.bdir2 [f1; f2] in let pl = hashtbl_find_all dir "person_of_string.ht" pos in let s = string_of_istr2 db2 (f1, f2) pos in spi2gen_add pl db2 spi s ; value spi2gen_find = spi2gen_add []; (* *) value disk_person2_of_key db2 fn sn oc = let person_of_key_d = Filename.concat db2.bdir2 "person_of_key" in try do { let ifn = hashtbl_find person_of_key_d "istr_of_string.ht" fn in let isn = hashtbl_find person_of_key_d "istr_of_string.ht" sn in let key = (ifn, isn, oc) in Some (key_hashtbl_find person_of_key_d "iper_of_key.ht" key : iper) } with [ Not_found -> None ] ; value person2_of_key db2 fn sn oc = let fn = Name.lower (nominative fn) in let sn = Name.lower (nominative sn) in try Hashtbl.find db2.patches.h_key (fn, sn, oc) with [ Not_found -> disk_person2_of_key db2 fn sn oc ] ; value strings2_of_fsname db2 f s = let k = Name.crush_lower s in let dir = List.fold_left Filename.concat db2.bdir2 ["person"; f] in hashtbl_find_all dir "string_of_crush.ht" k ; value persons2_of_name db2 s = let s = Name.crush_lower s in let dir = Filename.concat db2.bdir2 "person_of_name" in List.rev_append (try Hashtbl.find db2.patches.h_name s with [ Not_found -> [] ]) (hashtbl_find_all dir "person_of_name.ht" s) ; value persons_of_first_name_or_surname2 db2 is_first_name = do { let f1 = "person" in let f2 = if is_first_name then "first_name" else "surname" in let fdir = List.fold_left Filename.concat db2.bdir2 [f1; f2] in let index_ini_fname = Filename.concat fdir "index.ini" in let ic = open_in_bin index_ini_fname in let iofc : list (string * int) = input_value ic in close_in ic; {is_first_name = is_first_name; index_of_first_char = iofc; ini = ""; curr_i = 0; curr_s = ""} }; value load_array2 bdir nb_ini nb def f1 f2 get = if nb = 0 then [| |] else try do { let ic_acc = open_in_bin (List.fold_left Filename.concat bdir [f1; f2; "access"]) in let ic_dat = open_in_bin (List.fold_left Filename.concat bdir [f1; f2; "data"]) in let tab = Array.make nb def in for i = 0 to nb_ini - 1 do { tab.(i) := get ic_dat (input_binary_int ic_acc); }; close_in ic_dat; close_in ic_acc; tab } with e -> do { eprintf "Error load_array2 %s/%s nb_ini %d nb %d\n" f1 f2 nb_ini nb; flush stderr; raise e; } ; value load_couples_array2 db2 = do { eprintf "*** loading couples array\n"; flush stderr; let nb = db2.patches.nb_fam in match db2.father_array with [ Some _ -> () | None -> let tab = load_array2 db2.bdir2 db2.patches.nb_fam_ini nb (Adef.iper_of_int 0) "family" "father" (fun ic_dat pos -> do { seek_in ic_dat pos; Iovalue.input ic_dat }) in do { Hashtbl.iter (fun i c -> tab.(Adef.int_of_ifam i) := Adef.father c) db2.patches.h_couple; db2.father_array := Some tab } ]; match db2.mother_array with [ Some _ -> () | None -> let tab = load_array2 db2.bdir2 db2.patches.nb_fam_ini nb (Adef.iper_of_int 0) "family" "mother" (fun ic_dat pos -> do { seek_in ic_dat pos; Iovalue.input ic_dat }) in do { Hashtbl.iter (fun i c -> tab.(Adef.int_of_ifam i) := Adef.mother c) db2.patches.h_couple; db2.mother_array := Some tab } ] }; value parents_array2 db2 nb_ini nb = do { let arr = if nb_ini = 0 then Array.make nb None else load_array2 db2.bdir2 nb_ini nb None "person" "parents" (fun ic_dat pos -> if pos = -1 then None else do { seek_in ic_dat pos; Some (Iovalue.input ic_dat : ifam) }) in Hashtbl.iter (fun i a -> arr.(Adef.int_of_iper i) := a.parents) db2.patches.h_ascend; arr }; value consang_array2 db2 nb = do { let arr = let cg_fname = List.fold_left Filename.concat db2.bdir2 ["person"; "consang"; "data"] in match try Some (open_in_bin cg_fname) with [ Sys_error _ -> None ] with [ Some ic -> do { let tab = input_value ic in close_in ic; if Array.length tab < db2.patches.nb_per_ini then failwith (sprintf "consang_array2 array length = %d < %d" (Array.length tab) db2.patches.nb_per_ini) else (); if nb > Array.length tab then Array.append tab (Array.make (nb - Array.length tab) Adef.no_consang) else tab } | None -> Array.make nb Adef.no_consang ] in Hashtbl.iter (fun i a -> arr.(Adef.int_of_iper i) := a.consang) db2.patches.h_ascend; arr }; value family_array2 db2 = do { let fname = List.fold_left Filename.concat db2.bdir2 ["person"; "family"; "data"] in let ic = open_in_bin fname in let tab = input_value ic in close_in ic; if Array.length tab < db2.patches.nb_per_ini then failwith (sprintf "family_array2 array length = %d < %d" (Array.length tab) db2.patches.nb_per_ini) else (); tab }; value children_array2 db2 = do { let fname = List.fold_left Filename.concat db2.bdir2 ["family"; "children"; "data"] in let ic = open_in_bin fname in let tab = input_value ic in close_in ic; if Array.length tab < db2.patches.nb_fam_ini then failwith (sprintf "children_array2 array length = %d < %d" (Array.length tab) db2.patches.nb_fam_ini) else (); tab }; value read_notes db2 fnotes rn_mode = let bdir = db2.bdir2 in let fname = if fnotes = "" then "notes.txt" else Filename.concat "notes_d" (fnotes ^ ".txt") in match try Some (Secure.open_in (Filename.concat bdir fname)) with [ Sys_error _ -> None ] with [ Some ic -> do { let str = match rn_mode with [ RnDeg -> if in_channel_length ic = 0 then "" else " " | Rn1Ln -> try input_line ic with [ End_of_file -> "" ] | RnAll -> loop 0 where rec loop len = match try Some (input_char ic) with [ End_of_file -> None ] with [ Some c -> loop (Buff.store len c) | _ -> Buff.get len ] ] in close_in ic; str } | None -> "" ] ; value check_magic ic magic id = do { let b = Bytes.create (String.length magic) in really_input ic b 0 (String.length b); if b <> magic then failwith (sprintf "bad %s magic number" id) else (); }; value commit_patches2 db2 = do { let fname = Filename.concat db2.bdir2 "patches" in let oc = open_out_bin (fname ^ "1") in output_string oc magic_patch; output_value_no_sharing oc db2.patches; close_out oc; remove_file (fname ^ "~"); try Sys.rename fname (fname ^ "~") with [ Sys_error _ -> () ]; Sys.rename (fname ^ "1") fname }; value commit_notes2 db2 fnotes s = do { let bdir = db2.bdir2 in if fnotes <> "" then try Unix.mkdir (Filename.concat bdir "notes_d") 0o755 with _ -> () else (); let fname = if fnotes = "" then "notes.txt" else Filename.concat "notes_d" (fnotes ^ ".txt") in let fname = Filename.concat bdir fname in try Sys.remove (fname ^ "~") with [ Sys_error _ -> () ]; try Sys.rename fname (fname ^ "~") with _ -> (); if s = "" then () else do { let oc = Secure.open_out fname in output_string oc s; close_out oc; } }; value base_of_base2 bname = let bname = if Filename.check_suffix bname ".gwb" then bname else bname ^ ".gwb" in let bdir = Filename.concat bname "base_d" in let patches = let patch_fname = Filename.concat bdir "patches" in match try Some (open_in_bin patch_fname) with [ Sys_error _ -> None ] with [ Some ic -> do { check_magic ic magic_patch "patch"; let p = input_value ic in close_in ic; flush stderr; p } | None -> let nb_per = let fname = List.fold_left Filename.concat bdir ["person"; "sex"; "access"] in let st = Unix.lstat fname in st.Unix.st_size / 4 in let nb_fam = let fname = List.fold_left Filename.concat bdir ["family"; "marriage"; "access"] in let st = Unix.lstat fname in st.Unix.st_size / 4 in let empty_ht () = Hashtbl.create 1 in {nb_per = nb_per; nb_fam = nb_fam; nb_per_ini = nb_per; nb_fam_ini = nb_fam; h_person = empty_ht (); h_ascend = empty_ht (); h_union = empty_ht (); h_family = empty_ht (); h_couple = empty_ht (); h_descend = empty_ht (); h_key = empty_ht (); h_name = empty_ht ()} ] in {bdir2 = bdir; cache_chan = Hashtbl.create 1; patches = patches; parents_array = None; consang_array = None; family_array = None; father_array = None; mother_array = None; children_array = None; phony () = ()} ; value iter_patched_keys db2 f = Hashtbl.iter f db2.patches.h_key; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/mergeFamOk.ml0000660000175200017530000001144712664543647023566 0ustar guillaumeguillaume(* camlp5r ./pa_html.cmo *) (* $Id: mergeFamOk.ml,v 5.19 2007-09-12 09:58:44 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Config; open Def; open Gutil; open Gwdb; open Hutil; open Util; value cat_strings base is1 sep is2 = let n1 = sou base is1 in let n2 = sou base is2 in if n1 = "" then n2 else if n2 = "" then n1 else n1 ^ sep ^ n2 ; value merge_strings base is1 sep is2 = if eq_istr is1 is2 then sou base is1 else cat_strings base is1 sep is2 ; value sorp base ip = let p = poi base ip in (sou base (get_first_name p), sou base (get_surname p), get_occ p, Update.Link, "") ; value merge_witnesses base wit1 wit2 = let list = List.fold_right (fun wit list -> if List.mem wit list then list else [wit :: list]) (List.map (sorp base) (Array.to_list wit1)) (List.map (sorp base) (Array.to_list wit2)) in Array.of_list list ; value reconstitute conf base ifam1 fam1 fam2 = let field name proj null = let x1 = proj fam1 in let x2 = proj fam2 in match p_getenv conf.env name with [ Some "1" -> x1 | Some "2" -> x2 | _ -> if null x1 then x2 else x1 ] in let fam = {marriage = field "marriage" get_marriage ( \= Adef.codate_None); marriage_place = field "marriage_place" (fun f -> sou base (get_marriage_place f)) ( \= ""); marriage_src = merge_strings base (get_marriage_src fam1) ", " (get_marriage_src fam2); witnesses = merge_witnesses base (get_witnesses fam1) (get_witnesses fam2); relation = field "relation" get_relation ( \= Married); divorce = field "divorce" get_divorce ( \= NotDivorced); comment = merge_strings base (get_comment fam1) ", " (get_comment fam2); origin_file = sou base (get_origin_file fam1); fsources = merge_strings base (get_fsources fam1) ", " (get_fsources fam2); fam_index = ifam1} in let des = {children = Array.map (UpdateFam.person_key base) (Array.append (get_children fam1) (get_children fam2))} in (fam, des) ; value print_merge conf base = match (p_getint conf.env "i", p_getint conf.env "i2") with [ (Some f1, Some f2) -> let ifam1 = Adef.ifam_of_int f1 in let fam1 = foi base ifam1 in let fam2 = foi base (Adef.ifam_of_int f2) in let (sfam, sdes) = reconstitute conf base ifam1 fam1 fam2 in let digest = let ini_sfam = UpdateFam.string_family_of conf base ifam1 in Update.digest_family ini_sfam in let scpl = Futil.map_couple_p conf.multi_parents (UpdateFam.person_key base) (gen_couple_of_couple (foi base sfam.fam_index)) in UpdateFam.print_update_fam conf base (sfam, scpl, sdes) digest | _ -> incorrect_request conf ] ; value print_mod_merge_ok conf base wl cpl des = do { let title _ = Wserver.wprint "%s" (capitale (transl conf "merge done")) in header conf title; print_link_to_welcome conf True; UpdateFamOk.print_family conf base wl cpl des; Merge.print_possible_continue_merging conf base; trailer conf; }; value effective_mod_merge conf base o_f1 o_f2 sfam scpl sdes = match p_getint conf.env "i2" with [ Some i2 -> let ifam2 = Adef.ifam_of_int i2 in let fam2 = foi base ifam2 in do { UpdateFamOk.effective_del conf base (ifam2, fam2); let (ifam, fam, cpl, des) = UpdateFamOk.effective_mod conf base sfam scpl sdes in let wl = UpdateFamOk.all_checks_family conf base ifam fam cpl des (scpl, sdes, None (* should be Some *)) in Util.commit_patches conf base; let changed = let gen_p = let p = match p_getint conf.env "ip" with [ Some i -> let ip = Adef.iper_of_int i in if Adef.mother cpl = ip then poi base (Adef.mother cpl) else poi base (Adef.father cpl) | None -> poi base (Adef.father cpl) ] in Util.string_gen_person base (gen_person_of_person p) in let n_f = Util.string_gen_family base fam in U_Merge_family gen_p o_f1 o_f2 n_f in History.record conf base changed "ff"; print_mod_merge_ok conf base wl cpl des; } | None -> incorrect_request conf ] ; value print_mod_merge o_conf base = let get_gen_family i = match p_getint o_conf.env i with [ Some i -> let fam = foi base (Adef.ifam_of_int i) in Util.string_gen_family base (gen_family_of_family fam) | None -> let fam = foi base (Adef.ifam_of_int (-1)) in Util.string_gen_family base (gen_family_of_family fam) ] in let o_f1 = get_gen_family "i" in let o_f2 = get_gen_family "i2" in let conf = Update.update_conf o_conf in UpdateFamOk.print_mod_aux conf base (effective_mod_merge conf base o_f1 o_f2) ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/srcfile.mli0000660000175200017530000000103412664543647023340 0ustar guillaumeguillaume(* $Id: srcfile.mli,v 5.5 2007-01-19 01:53:17 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Gwdb; open Config; value print : config -> base -> string -> unit; value print_source : config -> base -> string -> unit; value print_start : config -> base -> unit; value incr_welcome_counter : config -> option (int * int * string); value incr_request_counter : config -> option (int * int * string); value print_lexicon : config -> base -> unit; value adm_file : string -> string; value source_file_name : config -> string -> string; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/iochan.ml0000660000175200017530000000475012664543647023011 0ustar guillaumeguillaume(* $Id: iochan.ml,v 5.5 2012-01-27 08:53:53 ddr Exp $ *) (* Copyright (c) 2006-2007 INRIA *) type t = {iofd : Unix.file_descr; iopos : mutable int}; value openfile fname trunc = let fd = let trunc = if trunc then [Unix.O_TRUNC] else [] in Unix.openfile fname [Unix.O_RDWR; Unix.O_CREAT :: trunc] 0o644 in {iofd = fd; iopos = 0} ; value ib = String.make 4 ' '; value input_byte ioc = let ret = Unix.read ioc.iofd ib 0 1 in if ret <> 1 then failwith "Iochan.input_byte" else do { ioc.iopos := ioc.iopos + 1; Char.code ib.[0] } ; value input_binary_int ioc = do { let ret = Unix.read ioc.iofd ib 0 4 in if ret <> 4 then failwith "Iochan.input_binary_int" else (); ioc.iopos := ioc.iopos + 4; let r = Iovalue.sign_extend (Char.code ib.[0]) lsl 24 + Char.code ib.[1] lsl 16 + Char.code ib.[2] lsl 8 + Char.code ib.[3] in assert (r >= -0x40000000); assert (r <= 0x3fffffff); r }; value input ioc buff start len = let ret = Unix.read ioc.iofd buff start len in if ret <> len then failwith "Iochan.input" else ioc.iopos := ioc.iopos + len ; value iochan_in_funs = {Iovalue.input_byte = input_byte; input_binary_int = input_binary_int; input = input} ; value input_value_no_header = Iovalue.gen_input iochan_in_funs; value output_byte ioc w = do { Bytes.set ib 0 (Char.chr (w land 0xFF)); let len = Unix.write ioc.iofd ib 0 1 in if len <> 1 then failwith "iochan_output_byte" else (); ioc.iopos := ioc.iopos + 1; }; value output_binary_int ioc w = do { Bytes.set ib 0 (Char.chr (w lsr 24 land 0xFF)); Bytes.set ib 1 (Char.chr (w lsr 16 land 0xFF)); Bytes.set ib 2 (Char.chr (w lsr 8 land 0xFF)); Bytes.set ib 3 (Char.chr (w land 0xFF)); let len = Unix.write ioc.iofd ib 0 4 in if len <> 4 then failwith "iochan_output_binary_int" else (); ioc.iopos := ioc.iopos + 4; }; value output ioc buff start len = let ret = Unix.write ioc.iofd buff start len in if ret <> len then failwith "Iochan.output" else ioc.iopos := ioc.iopos + len ; value iochan_out_funs = {Iovalue.output_byte = output_byte; output_binary_int = output_binary_int; output = output} ; value output_value_no_header ioc v = Iovalue.gen_output iochan_out_funs ioc v; value seek ioc pos = if ioc.iopos = pos then () else do { let _ : int = Unix.lseek ioc.iofd pos Unix.SEEK_SET in ioc.iopos := pos; } ; value seek_end ioc = do { let pos = Unix.lseek ioc.iofd 0 Unix.SEEK_END in ioc.iopos := pos; pos }; value close ioc = Unix.close ioc.iofd; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/mutil.ml0000660000175200017530000003224112664543647022676 0ustar guillaumeguillaume(* $Id: mutil.ml,v 5.19 2007-08-04 07:22:30 ddr Exp $ *) (* Copyright (c) 2006-2007 INRIA *) value int_size = 4; value verbose = ref True; value utf_8_db = Name.utf_8_db; value lindex s c = pos 0 where rec pos i = if i = String.length s then None else if s.[i] = c then Some i else pos (i + 1) ; value rindex s c = pos (String.length s - 1) where rec pos i = if i < 0 then None else if s.[i] = c then Some i else pos (i - 1) ; value array_mem x a = loop 0 where rec loop i = if i = Array.length a then False else if x = a.(i) then True else loop (i + 1) ; value list_iter_first f al = let _ = List.fold_left (fun first a -> let () = f first a in False) True al in () ; value list_uniq = fun [ [_] | [] as l -> l | [x :: l] -> loop [] x l where rec loop rl x = fun [ [y :: l] -> if y = x then loop rl x l else loop [x :: rl] y l | [] -> List.rev [x :: rl] ] ] ; IFDEF OLD THEN declare value decline_word case s ibeg iend = let i = loop ibeg where rec loop i = if i + 3 > iend then ibeg else if s.[i] = ':' && s.[i + 1] = case && s.[i + 2] = ':' then i + 3 else loop (i + 1) in let j = loop i where rec loop i = if i + 3 > iend then iend else if s.[i] = ':' && s.[i + 2] = ':' then i else loop (i + 1) in if i = ibeg then String.sub s ibeg (j - ibeg) else if s.[i] = '+' then let k = loop ibeg where rec loop i = if i = iend then i else if s.[i] = ':' then i else loop (i + 1) in let i = i + 1 in string_sub s ibeg (k - ibeg) ^ string_sub s i (j - i) else if s.[i] = '-' then let k = loop ibeg where rec loop i = if i = iend then i else if s.[i] = ':' then i else loop (i + 1) in let (i, cnt) = loop i 0 where rec loop i cnt = if i < iend && s.[i] = '-' then let cnt = loop (cnt + 1) where rec loop cnt = if k - cnt = ibeg then cnt else if utf_8_intern_byte s.[k - cnt] then loop (cnt + 1) else cnt in loop (i + 1) cnt else (i, cnt) in string_sub s ibeg (k - cnt - ibeg) ^ string_sub s i (j - i) else string_sub s i (j - i) ; value decline case s = loop 0 0 where rec loop ibeg i = if i = String.length s then if i = ibeg then "" else decline_word case s ibeg i else match s.[i] with [ ' ' | '<' | '/' as sep -> decline_word case s ibeg i ^ String.make 1 sep ^ loop (i + 1) (i + 1) | '>' -> String.sub s ibeg (i + 1 - ibeg) ^ loop (i + 1) (i + 1) | _ -> loop ibeg (i + 1) ] ; end ELSE declare (* [decline] has been deprecated since version 5.00 compatibility code: *) value colon_to_at_word s ibeg iend = let iendroot = loop ibeg where rec loop i = if i + 3 >= iend then iend else if s.[i] = ':' && s.[i+2] = ':' then i else loop (i + 1) in if iendroot = iend then String.sub s ibeg (iend - ibeg) else let (listdecl, maxd) = loop [] 0 iendroot where rec loop list maxd i = if i >= iend then (list, maxd) else let inext = loop (i + 3) where rec loop i = if i + 3 >= iend then iend else if s.[i] = ':' && s.[i+2] = ':' then i else loop (i + 1) in let (e, d) = let i = i + 3 in let j = inext in if i < j && s.[i] = '+' then (String.sub s (i + 1) (j - i - 1), 0) else if i < j && s.[i] = '-' then loop 1 (i + 1) where rec loop n i = if i < j && s.[i] = '-' then loop (n + 1) (i + 1) else (String.sub s i (j - i), n) else (String.sub s i (j - i), iendroot - ibeg) in loop [(s.[i+1], e, d) :: list] (max d maxd) inext in let len = max 0 (iendroot - ibeg - maxd) in let root = String.sub s ibeg len in let s = List.fold_left (fun t (c, e, d) -> Printf.sprintf "%c?%s%s" c e (if t = "" then "" else ":" ^ t)) (String.sub s (ibeg + len) (iendroot - ibeg - len)) listdecl in root ^ "@(" ^ s ^ ")" ; value colon_to_at s = loop 0 0 where rec loop ibeg i = if i = String.length s then if i = ibeg then "" else colon_to_at_word s ibeg i else match s.[i] with [ ' ' | '<' | '/' as sep -> colon_to_at_word s ibeg i ^ String.make 1 sep ^ loop (i + 1) (i + 1) | '>' -> String.sub s ibeg (i + 1 - ibeg) ^ loop (i + 1) (i + 1) | _ -> loop ibeg (i + 1) ] ; value decline case s = Printf.sprintf "@(@(%c)%s)" case (if not (String.contains s ':') then s else colon_to_at s) ; (* end compatibility code *) end END; value nominative s = match rindex s ':' with [ Some _ -> decline 'n' s | _ -> s ] ; value remove_file f = try Sys.remove f with [ Sys_error _ -> () ]; value mkdir_p x = loop x where rec loop x = do { let y = Filename.dirname x in if y <> x && String.length y < String.length x then loop y else (); try Unix.mkdir x 0o755 with [ Unix.Unix_error _ _ _ -> () ]; } ; value rec remove_dir d = do { try let files = Sys.readdir d in for i = 0 to Array.length files - 1 do { remove_dir (Filename.concat d files.(i)); remove_file (Filename.concat d files.(i)); } with [ Sys_error _ -> () ]; try Unix.rmdir d with [ Unix.Unix_error _ _ _ -> () ]; } ; value lock_file bname = let bname = if Filename.check_suffix bname ".gwb" then Filename.chop_suffix bname ".gwb" else bname in bname ^ ".lck" ; value output_value_no_sharing oc v = Marshal.to_channel oc v [Marshal.No_sharing] ; value initial n = loop 0 where rec loop i = if i = String.length n then 0 else match n.[i] with [ 'A'..'Z' | 'À'..'Ý' -> i | _ -> loop (succ i) ] ; value name_key s = let i = initial s in let s = if i = 0 then s else String.sub s i (String.length s - i) ^ " " ^ String.sub s 0 i in Name.lower s ; value input_particles fname = match try Some (open_in fname) with [ Sys_error _ -> None ] with [ Some ic -> loop [] 0 where rec loop list len = match try Some (input_char ic) with [ End_of_file -> None ] with [ Some '_' -> loop list (Buff.store len ' ') | Some '\n' -> loop (if len = 0 then list else [Buff.get len :: list]) 0 | Some '\r' -> loop list len | Some c -> loop list (Buff.store len c) | None -> do { close_in ic; List.rev (if len = 0 then list else [Buff.get len :: list]) } ] | None -> [] ] ; value saints = ["saint"; "sainte"]; value surnames_pieces surname = let surname = Name.lower surname in let flush i0 i1 = if i1 > i0 then [String.sub surname i0 (i1 - i0)] else [] in let rec loop i0 iw i = if i = String.length surname then if i0 = 0 then [] else if i > i0 + 3 then flush i0 i else [] else if surname.[i] = ' ' then if i > iw + 3 then let w = String.sub surname iw (i - iw) in if List.mem w saints then loop i0 (i + 1) (i + 1) else flush i0 i @ loop (i + 1) (i + 1) (i + 1) else loop i0 (i + 1) (i + 1) else loop i0 iw (i + 1) in loop 0 0 0 ; value tr c1 c2 s = match rindex s c1 with [ Some _ -> let s' = Bytes.create (String.length s) in do { for i = 0 to String.length s - 1 do { Bytes.set s' i (if s.[i] = c1 then c2 else s.[i]) }; s' } | None -> s ] ; value utf_8_of_iso_8859_1 str = loop 0 0 where rec loop i len = if i = String.length str then Buff.get len else let c = str.[i] in if Char.code c < 0x80 then loop (i + 1) (Buff.store len c) else if Char.code c < 0xC0 then let len = Buff.store len (Char.chr 0xC2) in loop (i + 1) (Buff.store len c) else let len = Buff.store len (Char.chr 0xC3) in loop (i + 1) (Buff.store len (Char.chr (Char.code c - 0x40))) ; value iso_8859_1_of_utf_8 s = loop 0 0 where rec loop i len = if i = String.length s then Buff.get len else let c = s.[i] in match Char.code c with [ 0xC2 when i + 1 < String.length s -> loop (i + 2) (Buff.store len s.[i+1]) | 0xC3 when i + 1 < String.length s -> loop (i + 2) (Buff.store len (Char.chr (Char.code s.[i+1] + 0x40))) | _ -> loop (i + 1) (Buff.store len c) ] ; value strip_all_trailing_spaces s = let b = Buffer.create (String.length s) in let len = loop (String.length s - 1) where rec loop i = if i < 0 then 0 else match s.[i] with [ ' ' | '\t' | '\r' | '\n' -> loop (i - 1) | _ -> i + 1 ] in loop 0 where rec loop i = if i = len then Buffer.contents b else match s.[i] with [ '\r' -> loop (i + 1) | ' ' | '\t' -> loop0 (i + 1) where rec loop0 j = if j = len then Buffer.contents b else match s.[j] with [ ' ' | '\t' | '\r' -> loop0 (j + 1) | '\n' -> loop j | _ -> do { Buffer.add_char b s.[i]; loop (i + 1) } ] | c -> do { Buffer.add_char b c; loop (i + 1) } ] ; value output_array_no_sharing oc arr_get arr_len = do { let header_pos = Iovalue.create_output_value_header oc in Iovalue.output_block_header oc 0 arr_len; for i = 0 to arr_len - 1 do { Iovalue.output oc (arr_get i); }; let pos_end = Iovalue.patch_output_value_header oc header_pos in seek_out oc pos_end; }; value roman_of_arabian n = let build one five ten = fun [ 0 -> "" | 1 -> one | 2 -> one ^ one | 3 -> one ^ one ^ one | 4 -> one ^ five | 5 -> five | 6 -> five ^ one | 7 -> five ^ one ^ one | 8 -> five ^ one ^ one ^ one | _ -> one ^ ten ] in build "M" "M" "M" (n / 1000 mod 10) ^ build "C" "D" "M" (n / 100 mod 10) ^ build "X" "L" "C" (n / 10 mod 10) ^ build "I" "V" "X" (n mod 10) ; value arabian_of_roman s = let decode_digit one five ten r = loop 0 where rec loop cnt i = if i >= String.length s then (10 * r + cnt, i) else if s.[i] = one then loop (cnt + 1) (i + 1) else if s.[i] = five then if cnt = 0 then loop 5 (i + 1) else (10 * r + 5 - cnt, i + 1) else if s.[i] = ten then (10 * r + 10 - cnt, i + 1) else (10 * r + cnt, i) in let (r, i) = decode_digit 'M' 'M' 'M' 0 0 in let (r, i) = decode_digit 'C' 'D' 'M' r i in let (r, i) = decode_digit 'X' 'L' 'C' r i in let (r, i) = decode_digit 'I' 'V' 'X' r i in if i = String.length s then r else raise Not_found ; module StrSet = Set.Make (struct type t = string; value compare = compare; end) ; value start_with ini s = loop 0 0 where rec loop i j = if i = String.length ini then True else if j = String.length s then False else if String.unsafe_get ini i = String.unsafe_get s j then loop (i + 1) (j + 1) else False ; value get_particle s = loop where rec loop = fun [ [part :: parts] -> if start_with part s then part else loop parts | [] -> "" ] ; value compare_after_particle particles s1 s2 = let p1 = get_particle s1 particles in let p2 = get_particle s2 particles in loop (String.length p1) (String.length p2) where rec loop i1 i2 = if i1 = String.length s1 && i2 = String.length s2 then compare p1 p2 else if i1 = String.length s1 then -1 else if i2 = String.length s2 then 1 else let c1 = String.unsafe_get s1 i1 in let c2 = String.unsafe_get s2 i2 in if c1 < c2 then -1 else if c1 > c2 then 1 else loop (i1 + 1) (i2 + 1) ; value input_lexicon lang ht open_fname = try let ic = open_fname () in let lang = match lindex lang '.' with [ Some i -> String.sub lang 0 i | None -> lang ] in let derived_lang = match lindex lang '-' with [ Some i -> String.sub lang 0 i | None -> match lindex lang '_' with [ Some i -> String.sub lang 0 i | None -> "" ] ] in try do { try while True do { let k = find_key (input_line ic) where rec find_key line = if String.length line < 4 then find_key (input_line ic) else if String.sub line 0 4 <> " " then find_key (input_line ic) else line in let k = String.sub k 4 (String.length k - 4) in let rec loop line = match lindex line ':' with [ Some i -> let line_lang = String.sub line 0 i in do { if line_lang = lang || line_lang = derived_lang && not (Hashtbl.mem ht k) then let v = if i + 1 = String.length line then "" else String.sub line (i + 2) (String.length line - i - 2) in Hashtbl.add ht k v else (); loop (input_line ic) } | None -> () ] in loop (input_line ic) } with [ End_of_file -> () ]; close_in ic; } with e -> do { close_in ic; raise e } with [ Sys_error _ -> () ] ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/ppdef.ml0000660000175200017530000002114712664543647022645 0ustar guillaumeguillaume(* camlp5r *) (* $Id: ppdef.ml,v 5.8 2007-09-12 09:58:44 ddr Exp $ *) #load "pa_extend.cmo"; #load "q_MLast.cmo"; open Pcaml; Stdpp.loc_name.val := "loc"; type item_or_def 'a = [ SdStr of 'a | SdDef of string and option (list string * MLast.expr) | SdUnd of string | SdNop ] ; value rec list_remove x = fun [ [(y, _) :: l] when y = x -> l | [d :: l] -> [d :: list_remove x l] | [] -> [] ] ; value defined = ref (IFDEF CAMLP5 THEN [("CAMLP5", None)] ELSE [] END); value is_defined i = List.mem_assoc i defined.val; value loc = Grammar.loc_of_token_interval 0 0; value _loc = loc; value subst mloc env = loop where rec loop = fun [ <:expr< let $opt:rf$ $list:pel$ in $e$ >> -> let pel = List.map (fun (p, e) -> (p, loop e)) pel in <:expr< let $opt:rf$ $list:pel$ in $loop e$ >> | <:expr< if $e1$ then $e2$ else $e3$ >> -> <:expr< if $loop e1$ then $loop e2$ else $loop e3$ >> | <:expr< $e1$ $e2$ >> -> <:expr< $loop e1$ $loop e2$ >> | <:expr< $lid:x$ >> | <:expr< $uid:x$ >> as e -> try <:expr< $anti:List.assoc x env$ >> with [ Not_found -> e ] | <:expr< ( $list:x$ ) >> -> <:expr< ( $list:List.map loop x$ ) >> | <:expr< { $list:pel$ } >> -> let pel = List.map (fun (p, e) -> (p, loop e)) pel in <:expr< { $list:pel$ } >> | e -> e ] ; value substp mloc env = loop where rec loop = fun [ <:expr< $e1$ $e2$ >> -> <:patt< $loop e1$ $loop e2$ >> | <:expr< $chr:c$ >> -> <:patt< $chr:c$ >> | <:expr< $lid:x$ >> -> try <:patt< $anti:List.assoc x env$ >> with [ Not_found -> <:patt< $lid:x$ >> ] | <:expr< $uid:x$ >> -> try <:patt< $anti:List.assoc x env$ >> with [ Not_found -> <:patt< $uid:x$ >> ] | <:expr< $int:x$ >> -> <:patt< $int:x$ >> | <:expr< ( $list:x$ ) >> -> <:patt< ( $list:List.map loop x$ ) >> | <:expr< { $list:pel$ } >> -> let ppl = List.map (fun (p, e) -> (p, loop e)) pel in <:patt< { $list:ppl$ } >> | x -> Stdpp.raise_with_loc mloc (Failure "this macro cannot be used in a pattern (see its definition)") ] ; value cannot_eval e = let loc = MLast.loc_of_expr e in Stdpp.raise_with_loc loc (Stream.Error "can't eval") ; value rec eval = fun [ <:expr< Char.chr $e$ >> -> match eval e with [ <:expr< $int:i$ >> -> let c = Char.escaped (Char.chr (int_of_string i)) in <:expr< $chr:c$ >> | e -> cannot_eval e ] | <:expr< Char.code $e$ >> -> match eval e with [ <:expr< $chr:c$ >> -> let i = string_of_int (Char.code (Token.eval_char c)) in <:expr< $int:i$ >> | e -> cannot_eval e ] | <:expr< $op$ $x$ $y$ >> -> let f = eval op in let x = eval x in let y = eval y in match (x, y) with [ (<:expr< $int:x$ >>, <:expr< $int:y$ >>) -> let x = int_of_string x in let y = int_of_string y in match f with [ <:expr< $lid:"+"$ >> -> <:expr< $int:string_of_int (x + y)$ >> | <:expr< $lid:"-"$ >> -> <:expr< $int:string_of_int (x - y)$ >> | <:expr< $lid:"lor"$ >> -> let s = Printf.sprintf "0o%o" (x lor y) in <:expr< $int:s$ >> | _ -> cannot_eval op ] | _ -> cannot_eval op ] | <:expr< $uid:x$ >> as e -> try match List.assoc x defined.val with [ _ -> e ] with [ Not_found -> e ] | <:expr< $lid:_$ >> | <:expr< $chr:_$ >> | <:expr< $int:_$ >> as e -> e | e -> cannot_eval e ] ; value may_eval = fun [ <:expr< EVAL $e$ >> -> eval e | e -> e ] ; value incorrect_number loc l1 l2 = Stdpp.raise_with_loc loc (Failure (Printf.sprintf "expected %d parameters; found %d" (List.length l2) (List.length l1))) ; value first_pos = IFDEF CAMLP5 THEN Stdpp.first_pos ELSE fst END; value define eo x = do { let gloc = loc in match eo with [ Some ([], e) -> EXTEND expr: LEVEL "simple" [ [ UIDENT $x$ -> may_eval (Pcaml.expr_reloc (fun _ -> loc) (first_pos gloc) e) ] ] ; patt: LEVEL "simple" [ [ UIDENT $x$ -> let p = substp loc [] e in Pcaml.patt_reloc (fun _ -> loc) (first_pos gloc) p ] ] ; END | Some (sl, e) -> EXTEND expr: LEVEL "apply" [ [ UIDENT $x$; param = SELF -> let el = match param with [ <:expr< ($list:el$) >> -> el | e -> [e] ] in if List.length el = List.length sl then let env = List.combine sl el in let e = subst loc env e in may_eval (Pcaml.expr_reloc (fun _ -> loc) (first_pos gloc) e) else incorrect_number loc el sl ] ] ; patt: LEVEL "simple" [ [ UIDENT $x$; param = SELF -> let pl = match param with [ <:patt< ($list:pl$) >> -> pl | p -> [p] ] in if List.length pl = List.length sl then let env = List.combine sl pl in let p = substp loc env e in Pcaml.patt_reloc (fun _ -> loc) (first_pos gloc) p else incorrect_number loc pl sl ] ] ; END | None -> () ]; defined.val := [(x, eo) :: defined.val]; } ; value undef x = try do { let eo = List.assoc x defined.val in match eo with [ Some ([], _) -> do { DELETE_RULE expr: UIDENT $x$ END; DELETE_RULE patt: UIDENT $x$ END; } | Some (_, _) -> do { DELETE_RULE expr: UIDENT $x$; SELF END; DELETE_RULE patt: UIDENT $x$; SELF END; } | None -> () ]; defined.val := list_remove x defined.val; } with [ Not_found -> () ] ; EXTEND GLOBAL: expr patt str_item sig_item; str_item: FIRST [ [ x = macro_def -> match x with [ SdStr [si] -> si | SdStr sil -> <:str_item< declare $list:sil$ end >> | SdDef x eo -> do { define eo x; <:str_item< declare end >> } | SdUnd x -> do { undef x; <:str_item< declare end >> } | SdNop -> <:str_item< declare end >> ] ] ] ; macro_def: [ [ "DEFINE"; i = uident; def = opt_macro_value -> SdDef i def | "UNDEF"; i = uident -> SdUnd i | "IFDEF"; i = uident; "THEN"; d = str_item_or_macro; "END" -> if is_defined i then d else SdNop | "IFDEF"; i = uident; "THEN"; d1 = str_item_or_macro; "ELSE"; d2 = str_item_or_macro; "END" -> if is_defined i then d1 else d2 | "IFNDEF"; i = uident; "THEN"; d = str_item_or_macro; "END" -> if is_defined i then SdNop else d | "IFNDEF"; i = uident; "THEN"; d1 = str_item_or_macro; "ELSE"; d2 = str_item_or_macro; "END" -> if is_defined i then d2 else d1 ] ] ; str_item_or_macro: [ [ d = macro_def -> d | si = LIST1 str_item -> SdStr si ] ] ; opt_macro_value: [ [ "("; pl = LIST1 LIDENT SEP ","; ")"; "="; e = expr -> Some (pl, e) | "="; e = expr -> Some ([], e) | -> None ] ] ; expr: LEVEL "top" [ [ "IFDEF"; idl = LIST1 id_then_expr SEP "ELSIFDEF"; "ELSE"; e2 = expr; "END" -> loop idl where rec loop = fun [ [(i, e) :: idl] -> if is_defined i then e else loop idl | [] -> e2 ] | "IFNDEF"; i = uident; "THEN"; e1 = expr; "ELSE"; e2 = expr; "END" -> if is_defined i then e2 else e1 ] ] ; id_then_expr: [ [ i = uident; "THEN"; e = expr -> (i, e) ] ] ; expr: LEVEL "simple" [ [ LIDENT "__FILE__" -> <:expr< $str:Pcaml.input_file.val$ >> ] ] ; patt: [ [ "IFDEF"; i = uident; "THEN"; p1 = patt; "ELSE"; p2 = patt; "END" -> if is_defined i then p1 else p2 | "IFNDEF"; i = uident; "THEN"; p1 = patt; "ELSE"; p2 = patt; "END" -> if is_defined i then p2 else p1 ] ] ; uident: [ [ i = UIDENT -> i ] ] ; END; Pcaml.add_option "-D" (Arg.String (define None)) " Define for IFDEF instruction." ; Pcaml.add_option "-U" (Arg.String undef) " Undefine for IFDEF instruction." ; if Sys.ocaml_version >= "3.07" then defined.val := [("OCAML_307", None) :: defined.val] else (); if Sys.ocaml_version >= "3.08" then defined.val := [("OCAML_308", None) :: defined.val] else (); if Sys.ocaml_version >= "3.09" then defined.val := [("OCAML_309", None) :: defined.val] else (); geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/dutil.mli0000660000175200017530000000141412664543647023034 0ustar guillaumeguillaume(* $Id: dutil.mli,v 5.8 2007-01-19 01:53:16 ddr Exp $ *) (* Copyright (c) 2006-2007 INRIA *) open Dbdisk; type name_index_data = array (array Def.iper); type strings_of_fsname = array (array dsk_istr); value magic_gwb : string; value magic_gwb_iso_8859_1 : string; value table_size : int; value check_magic : in_channel -> unit; value compare_istr_fun : Dbdisk.base_data -> dsk_istr -> dsk_istr -> int; value compare_names : Dbdisk.base_data -> string -> string -> int; value dsk_person_misc_names : dsk_base -> dsk_person -> (dsk_person -> list dsk_title) -> list string; value poi : dsk_base -> Def.iper -> dsk_person; value sou : dsk_base -> dsk_istr -> string; value p_first_name : dsk_base -> dsk_person -> string; value p_surname : dsk_base -> dsk_person -> string; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/calendar.mli0000660000175200017530000000144012664543647023463 0ustar guillaumeguillaume(* $Id: calendar.mli,v 5.0 2005-12-13 11:51:27 ddr Exp $ *) open Def; value gregorian_of_sdn : precision -> int -> dmy; value julian_of_sdn : precision -> int -> dmy; value french_of_sdn : precision -> int -> dmy; value hebrew_of_sdn : precision -> int -> dmy; value sdn_of_gregorian : dmy -> int; value sdn_of_julian : dmy -> int; value sdn_of_french : dmy -> int; value sdn_of_hebrew : dmy -> int; value gregorian_of_julian : dmy -> dmy; value julian_of_gregorian : dmy -> dmy; value gregorian_of_french : dmy -> dmy; value french_of_gregorian : dmy -> dmy; value gregorian_of_hebrew : dmy -> dmy; value hebrew_of_gregorian : dmy -> dmy; type moon_phase = [ NewMoon | FirstQuarter | FullMoon | LastQuarter ] ; value moon_phase_of_sdn : int -> (option (moon_phase * int * int) * int); geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/lock.ml0000660000175200017530000000262112664543647022473 0ustar guillaumeguillaume(* $Id: lock.ml,v 5.2 2007-01-19 01:53:16 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) type choice 'a 'b = [ Left of 'a | Right of 'b ]; value no_lock_flag = ref False; value control lname wait f = if no_lock_flag.val then Some (f ()) else IFDEF UNIX THEN match try Some (Unix.openfile lname [Unix.O_RDWR; Unix.O_CREAT] 0o666) with [ Unix.Unix_error _ _ _ -> None ] with [ Some fd -> do { try Unix.chmod lname 0o666 with _ -> (); let r = try do { if wait then Unix.lockf fd Unix.F_LOCK 0 else Unix.lockf fd Unix.F_TLOCK 0; Left fd } with e -> Right e in match r with [ Left fd -> let r = try f () with e -> do { Unix.close fd; raise e } in do { Unix.close fd; Some r } | Right (Unix.Unix_error _ _ _) -> do { Unix.close fd; None } | Right exc -> do { Unix.close fd; raise exc } ] } | None -> None ] ELSE let r = try Left (Unix.openfile lname [Unix.O_RDWR; Unix.O_CREAT] 0o666) with e -> Right e in match r with [ Left fd -> let r = try f () with e -> do { Unix.close fd; raise e } in do { Unix.close fd; Some r } | Right (Unix.Unix_error _ _ _) -> None | Right exc -> raise exc ] END ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/lex_sort.sh0000660000175200017530000000416212664543647023406 0ustar guillaumeguillaume#!/bin/sh #cd (* exec ocaml $0 *) ".";; (* $Id: lex_sort.sh,v 5.0 2005-12-13 11:51:27 ddr Exp $ *) open Printf let linenum = ref 0 let input_line_cnt ic = incr linenum; input_line ic let rec skip_to_same_line ic line_ref = let line = input_line_cnt ic in if line = line_ref then printf "%s\n" line else skip_to_same_line ic line_ref let rec get_all_versions ic = let line = try input_line_cnt ic with End_of_file -> "" in if line = "" then [] else if String.length line < 3 then begin eprintf "small line %d: \"%s\"\n" !linenum (String.escaped line); flush stderr; [] end else try let i = String.index line ':' in let lang = String.sub line 0 i in let transl = String.sub line (i + 1) (String.length line - i - 1) in (lang, transl) :: get_all_versions ic with Not_found -> [] let print_languages (lang, str) = let str = String.sub str 1 (String.length str - 1) in let list = let rec loop ibeg i = if i = String.length str then [String.sub str ibeg (i - ibeg)] else if str.[i] = '/' then String.sub str ibeg (i - ibeg) :: loop (i + 1) (i + 1) else loop ibeg (i + 1) in let compare x y = let i = String.index x '=' in let j = String.index y '=' in compare (String.sub x 0 i) (String.sub y 0 j) in List.sort compare (loop 0 0) in printf "%s: " lang; let _ = List.fold_left (fun sep s -> printf "%s%s" sep s; "/") "" list in (); printf "\n" let lex_sort () = let ic_lex = open_in "../hd/lang/lex_utf8.txt" in let ic_i18n = open_in "i18n" in let rec loop line = linenum := 0; seek_in ic_lex 0; skip_to_same_line ic_lex (" " ^ line); let list = get_all_versions ic_lex in let list = List.sort (fun (l1, _) (l2, _) -> compare l1 l2) list in if line = " !languages" then List.iter print_languages list else List.iter (fun (lang, str) -> printf "%s:%s\n" lang str) list; match try Some (input_line ic_i18n) with End_of_file -> None with Some line -> printf "\n"; loop line | None -> () in loop (input_line ic_i18n) let _ = lex_sort (); flush stdout geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/db2disk.mli0000660000175200017530000000567312664543647023250 0ustar guillaumeguillaume(* $Id: db2disk.mli,v 5.10 2007-03-03 05:27:21 ddr Exp $ *) (* Copyright (c) 2006-2007 INRIA *) open Def; type patches = { nb_per : mutable int; nb_fam : mutable int; nb_per_ini : int; nb_fam_ini : int; h_person : Hashtbl.t iper (gen_person iper string); h_ascend : Hashtbl.t iper (gen_ascend ifam); h_union : Hashtbl.t iper (gen_union ifam); h_family : Hashtbl.t ifam (gen_family iper string); h_couple : Hashtbl.t ifam (gen_couple iper); h_descend : Hashtbl.t ifam (gen_descend iper); h_key : Hashtbl.t (string * string * int) (option iper); h_name : Hashtbl.t string (list iper) } ; type db2 = { phony : unit -> unit; bdir2 : string; cache_chan : Hashtbl.t (string * string * string) in_channel; patches : patches; parents_array : mutable option (array (option ifam)); consang_array : mutable option (array Adef.fix); family_array : mutable option (array (array ifam)); father_array : mutable option (array iper); mother_array : mutable option (array iper); children_array : mutable option (array (array iper)) } ; type string_person = [ Sp of int | SpNew of string ] ; type string_person_index2 = { is_first_name : bool; index_of_first_char : list (string * int); ini : mutable string; curr_i : mutable int; curr_s : mutable string } ; value field_exists : db2 -> (string * string) -> bool; value get_field_acc : db2 -> int -> (string * string) -> int; value get_field_data : db2 -> int -> (string * string) -> string -> 'a; value get_field_2_data : db2 -> int -> (string * string) -> string -> ('a * 'b); value get_field : db2 -> int -> (string * string) -> 'a; value string_of_istr2 : db2 -> (string * string) -> int -> string; value spi2_first : db2 -> string_person_index2 -> (string * string) -> string -> string_person; value spi2_next : db2 -> string_person_index2 -> (string * string) -> bool -> (string_person * int); value spi2_find : db2 -> string_person_index2 -> (string * string) -> int -> list iper; value spi2gen_find : db2 -> string_person_index2 -> string -> list iper; value disk_person2_of_key : db2 -> string -> string -> int -> option iper; value person2_of_key : db2 -> string -> string -> int -> option iper; value strings2_of_fsname : db2 -> string -> string -> list int; value persons2_of_name : db2 -> string -> list iper; value persons_of_first_name_or_surname2 : db2 -> bool -> string_person_index2; value load_couples_array2 : db2 -> unit; value parents_array2 : db2 -> int -> int -> array (option ifam); value consang_array2 : db2 -> int -> array Adef.fix; value family_array2 : db2 -> array (array ifam); value children_array2 : db2 -> array (array iper); value read_notes : db2 -> string -> rn_mode -> string; value commit_patches2 : db2 -> unit; value commit_notes2 : db2 -> string -> string -> unit; value base_of_base2 : string -> db2; value iter_patched_keys : db2 -> ((string * string * int) -> option iper -> unit) -> unit; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/secure.mli0000660000175200017530000000104712664543647023203 0ustar guillaumeguillaume(* $Id: secure.mli,v 5.2 2007-01-19 01:53:17 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) value lang_path : unit -> list string; value doc_path : unit -> list string; value base_dir : unit -> string; value add_lang_path : string -> unit; value add_doc_path : string -> unit; value set_base_dir : string -> unit; value open_in : string -> in_channel; value open_in_bin : string -> in_channel; value open_out : string -> out_channel; value open_out_bin : string -> out_channel; value open_out_gen : list open_flag -> int -> string -> out_channel; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/outbase.mli0000660000175200017530000000035312664543647023356 0ustar guillaumeguillaume(* $Id: outbase.mli,v 5.3 2007-01-19 01:53:16 ddr Exp $ *) (* Copyright (c) 2006-2007 INRIA *) open Dbdisk; value output : string -> dsk_base -> unit; value gen_output : bool -> string -> dsk_base -> unit; value save_mem : ref bool; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/gwdb.ml0000660000175200017530000014315712664543647022500 0ustar guillaumeguillaume(* $Id: gwdb.ml,v 5.244 2012-01-18 20:49:57 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Dbdisk; open Db2disk; open Def; open Futil; open Mutil; open Printf; type gen_string_person_index 'istr = Dbdisk.string_person_index 'istr == { find : 'istr -> list iper; cursor : string -> 'istr; next : 'istr -> 'istr } ; value milazy_force f a (get, set) p = match get p with [ Some v -> v | None -> do { let v = f a in set p (Some v); v } ] ; value ht_find ht i = try Some (Hashtbl.find ht i) with [ Not_found -> None ]; value no_person empty_string ip = {first_name = empty_string; surname = empty_string; occ = 0; image = empty_string; first_names_aliases = []; surnames_aliases = []; public_name = empty_string; qualifiers = []; titles = []; rparents = []; related = []; aliases = []; occupation = empty_string; sex = Neuter; access = Private; birth = Adef.codate_None; birth_place = empty_string; birth_src = empty_string; baptism = Adef.codate_None; baptism_place = empty_string; baptism_src = empty_string; death = DontKnowIfDead; death_place = empty_string; death_src = empty_string; burial = UnknownBurial; burial_place = empty_string; burial_src = empty_string; notes = empty_string; psources = empty_string; key_index = ip} ; value no_ascend = {parents = None; consang = Adef.no_consang}; value no_union = {family = [| |]}; (* Strings - common definitions *) type istr = [ Istr of dsk_istr | Istr2 of db2 and (string * string) and int | Istr2New of db2 and string ] ; type istr_fun 'a = { is_empty_string : 'a -> bool; is_quest_string : 'a -> bool; un_istr : 'a -> Adef.istr; un_istr2 : 'a -> string } ; type relation = Def.gen_relation iper istr; type title = Def.gen_title istr; value eq_istr i1 i2 = match (i1, i2) with [ (Istr i1, Istr i2) -> Adef.int_of_istr i1 = Adef.int_of_istr i2 | (Istr2 _ (f11, f12) i1, Istr2 _ (f21, f22) i2) -> i1 = i2 && f11 = f21 && f12 = f22 | (Istr2New _ s1, Istr2New _ s2) -> s1 = s2 | (Istr2 db2 f pos, Istr2New _ s2) -> string_of_istr2 db2 f pos = s2 | (Istr2New _ s1, Istr2 db2 f pos) -> s1 = string_of_istr2 db2 f pos | _ -> failwith "eq_istr" ] ; (* Strings - implementation database 1 *) value istr1_fun = {is_empty_string istr = Adef.int_of_istr istr = 0; is_quest_string istr = Adef.int_of_istr istr = 1; un_istr i = i; un_istr2 i = failwith "un_istr2 1"} ; (* Strings - implementation database 2 *) value istr2_fun = {is_empty_string (db2, path, pos) = string_of_istr2 db2 path pos = ""; is_quest_string (db2, path, pos) = string_of_istr2 db2 path pos = "?"; un_istr _ = failwith "un_istr"; un_istr2 (db2, path, pos) = string_of_istr2 db2 path pos} ; value istr2new_fun = {is_empty_string (db2, s) = s = ""; is_quest_string (db2, s) = s = "?"; un_istr (db2, s) = failwith "un_istr"; un_istr2 (db2, s) = s} ; (* Strings - user functions *) value wrap_istr f g h = fun [ Istr istr -> f istr1_fun istr | Istr2 db2 path pos -> g istr2_fun (db2, path, pos) | Istr2New db2 s -> h istr2new_fun (db2, s) ] ; value is_empty_string i = let f pf = pf.is_empty_string in wrap_istr f f f i ; value is_quest_string i = let f pf = pf.is_quest_string in wrap_istr f f f i ; value un_istr i = let f pf = pf.un_istr in wrap_istr f f f i ; value un_istr2 i = let f pf = pf.un_istr2 in wrap_istr f f f i ; (* String person index - common definitions *) type string_person_index = [ Spi of gen_string_person_index dsk_istr | Spi2 of db2 and string_person_index2 ] ; type spi 'a = { spi_first : 'a -> string -> istr; spi_next : 'a -> istr -> bool -> (istr * int); spi_find : 'a -> istr -> list iper } ; (* String person index - implementation database 1 *) value spi1_fun = {spi_first spi s = Istr (spi.cursor s); spi_next spi istr need_whole_list = match istr with [ Istr s -> (Istr (spi.next s), 1) | _ -> failwith "not impl spi_next" ]; spi_find spi s = match s with [ Istr s -> spi.find s | _ -> failwith "not impl spi_find" ]} ; (* String person index - implementation database 2 *) value spi2_fun = {spi_first (db2, spi) s = let f1 = "person" in let f2 = if spi.is_first_name then "first_name" else "surname" in match spi2_first db2 spi (f1, f2) s with [ Sp pos -> Istr2 db2 (f1, f2) pos | SpNew s2 -> Istr2New db2 s2 ] ; spi_next (db2, spi) istr need_whole_list = let f1 = "person" in let f2 = if spi.is_first_name then "first_name" else "surname" in let (sp, dlen) = spi2_next db2 spi (f1, f2) need_whole_list in let r = match sp with [ Sp pos -> Istr2 db2 (f1, f2) pos | SpNew s2 -> Istr2New db2 s2 ] in (r, dlen); spi_find (db2, spi) s = match s with [ Istr2 db2 (f1, f2) pos -> spi2_find db2 spi (f1, f2) pos | Istr2New db2 s -> spi2gen_find db2 spi s | _ -> failwith "not impl spi_find" ]} ; (* String person index - user functions *) value wrap_spi f g = fun [ Spi spi -> f spi1_fun spi | Spi2 db2 spi2 -> g spi2_fun (db2, spi2) ] ; value spi_find = let f pf = pf.spi_find in wrap_spi f f ; value spi_first = let f pf = pf.spi_first in wrap_spi f f ; value spi_next = let f pf = pf.spi_next in wrap_spi f f ; (* Persons - common definitions *) type person = [ Person of dsk_base and int and person1_dat | Person2 of db2 and int and person2_dat ] and person1_dat = { per1 : mutable option dsk_person; asc1 : mutable option dsk_ascend; uni1 : mutable option dsk_union } and person2_dat = { per2 : mutable option (option (gen_person iper string)); asc2 : mutable option (option (gen_ascend ifam)); uni2 : mutable option (option (gen_union ifam)) } ; type person_fun 'p 'a 'u = { get_access : 'p -> access; get_aliases : 'p -> list istr; get_baptism : 'p -> codate; get_baptism_place : 'p -> istr; get_baptism_src : 'p -> istr; get_birth : 'p -> codate; get_birth_place : 'p -> istr; get_birth_src : 'p -> istr; get_burial : 'p -> Def.burial; get_burial_place : 'p -> istr; get_burial_src : 'p -> istr; get_death : 'p -> Def.death; get_death_place : 'p -> istr; get_death_src : 'p -> istr; get_first_name : 'p -> istr; get_first_names_aliases : 'p -> list istr; get_image : 'p -> istr; get_key_index : 'p -> iper; get_notes : 'p -> istr; get_occ : 'p -> int; get_occupation : 'p -> istr; get_psources : 'p -> istr; get_public_name : 'p -> istr; get_qualifiers : 'p -> list istr; get_related : 'p -> list iper; get_rparents : 'p -> list relation; get_sex : 'p -> Def.sex; get_surname : 'p -> istr; get_surnames_aliases : 'p -> list istr; get_titles : 'p -> list title; gen_person_of_person : 'p -> Def.gen_person iper istr; dsk_person_of_person : 'p -> Dbdisk.dsk_person; get_consang : 'a -> Adef.fix; get_parents : 'a -> option ifam; get_family : 'u -> array ifam } ; (* Persons - implementation database 1 *) value person1_fun = {get_access p = p.Def.access; get_aliases p = List.map (fun i -> Istr i) p.Def.aliases; get_baptism p = p.Def.baptism; get_baptism_place p = Istr p.Def.baptism_place; get_baptism_src p = Istr p.Def.baptism_src; get_birth p = p.Def.birth; get_birth_place p = Istr p.Def.birth_place; get_birth_src p = Istr p.Def.birth_src; get_burial p = p.Def.burial; get_burial_place p = Istr p.Def.burial_place; get_burial_src p = Istr p.Def.burial_src; get_death p = p.Def.death; get_death_place p = Istr p.Def.death_place; get_death_src p = Istr p.Def.death_src; get_first_name p = Istr p.Def.first_name; get_first_names_aliases p = List.map (fun i -> Istr i) p.Def.first_names_aliases; get_image p = Istr p.Def.image; get_key_index p = p.Def.key_index; get_notes p = Istr p.Def.notes; get_occ p = p.Def.occ; get_occupation p = Istr p.Def.occupation; get_psources p = Istr p.Def.psources; get_public_name p = Istr p.Def.public_name; get_qualifiers p = List.map (fun i -> Istr i) p.Def.qualifiers; get_related p = p.Def.related; get_rparents p = List.map (map_relation_ps (fun x -> x) (fun i -> Istr i)) p.Def.rparents; get_sex p = p.Def.sex; get_surname p = Istr p.Def.surname; get_surnames_aliases p = List.map (fun i -> Istr i) p.Def.surnames_aliases; get_titles p = List.map (fun t -> map_title_strings (fun i -> Istr i) t) p.Def.titles; gen_person_of_person p = map_person_ps (fun p -> p) (fun s -> Istr s) p; dsk_person_of_person p = p; get_consang a = a.Def.consang; get_parents a = a.Def.parents; get_family u = u.Def.family} ; (* Persons - implementation database 2 *) value make_istr2 db2 path i = Istr2 db2 path (get_field_acc db2 i path); value get_list_field db2 i f1f2 = let pos = get_field_acc db2 i f1f2 in if pos = -1 then [] else get_field_data db2 pos f1f2 "data2.ext" ; value sou2 i = match i with [ Istr2 db2 f pos -> string_of_istr2 db2 f pos | Istr2New db2 s -> s | _ -> assert False ] ; value person2_fun = self where rec self = {get_access (db2, i) = get_field db2 i ("person", "access"); get_aliases (db2, i) = let list = get_list_field db2 i ("person", "aliases") in List.map (fun pos -> Istr2 db2 ("person", "aliases") pos) list; get_baptism (db2, i) = get_field db2 i ("person", "baptism"); get_baptism_place (db2, i) = make_istr2 db2 ("person", "baptism_place") i; get_baptism_src (db2, i) = make_istr2 db2 ("person", "baptism_src") i; get_birth (db2, i) = get_field db2 i ("person", "birth"); get_birth_place (db2, i) = make_istr2 db2 ("person", "birth_place") i; get_birth_src (db2, i) = make_istr2 db2 ("person", "birth_src") i; get_burial (db2, i) = get_field db2 i ("person", "burial"); get_burial_place (db2, i) = make_istr2 db2 ("person", "burial_place") i; get_burial_src (db2, i) = make_istr2 db2 ("person", "burial_src") i; get_death (db2, i) = get_field db2 i ("person", "death"); get_death_place (db2, i) = make_istr2 db2 ("person", "death_place") i; get_death_src (db2, i) = make_istr2 db2 ("person", "death_src") i; get_first_name (db2, i) = make_istr2 db2 ("person", "first_name") i; get_first_names_aliases (db2, i) = let list = get_list_field db2 i ("person", "first_names_aliases") in List.map (fun pos -> Istr2 db2 ("person", "first_names_aliases") pos) list; get_image (db2, i) = make_istr2 db2 ("person", "image") i; get_key_index (db2, i) = Adef.iper_of_int i; get_notes (db2, i) = make_istr2 db2 ("person", "notes") i; get_occ (db2, i) = get_field db2 i ("person", "occ"); get_occupation (db2, i) = make_istr2 db2 ("person", "occupation") i; get_psources (db2, i) = make_istr2 db2 ("person", "psources") i; get_public_name (db2, i) = make_istr2 db2 ("person", "public_name") i; get_qualifiers (db2, i) = let list = get_list_field db2 i ("person", "qualifiers") in List.map (fun pos -> Istr2 db2 ("person", "qualifiers") pos) list; get_related (db2, i) = let pos = get_field_acc db2 i ("person", "related") in let rec loop list pos = if pos = -1 then List.rev list else let (ip, pos) = get_field_2_data db2 pos ("person", "related") "data" in loop [ip :: list] pos in loop [] pos; get_rparents (db2, i) = let pos = get_field_acc db2 i ("person", "rparents") in if pos = -1 then [] else let rl = get_field_data db2 pos ("person", "rparents") "data" in List.map (map_relation_ps (fun x -> x) (fun _ -> Istr2 db2 ("", "") (-1))) rl; get_sex (db2, i) = get_field db2 i ("person", "sex"); get_surname (db2, i) = make_istr2 db2 ("person", "surname") i; get_surnames_aliases (db2, i) = let list = get_list_field db2 i ("person", "surnames_aliases") in List.map (fun pos -> Istr2 db2 ("person", "surnames_aliases") pos) list; get_titles (db2, i) = let list = get_list_field db2 i ("person", "titles") in List.map (map_title_strings (fun pos -> Istr2 db2 ("person", "titles") pos)) list; gen_person_of_person pp = {first_name = self.get_first_name pp; surname = self.get_surname pp; occ = self.get_occ pp; image = self.get_image pp; public_name = self.get_public_name pp; qualifiers = self.get_qualifiers pp; aliases = self.get_aliases pp; first_names_aliases = self.get_first_names_aliases pp; surnames_aliases = self.get_surnames_aliases pp; titles = self.get_titles pp; rparents = self.get_rparents pp; related = self.get_related pp; occupation = self.get_occupation pp; sex = self.get_sex pp; access = self.get_access pp; birth = self.get_birth pp; birth_place = self.get_birth_place pp; birth_src = self.get_birth_src pp; baptism = self.get_baptism pp; baptism_place = self.get_baptism_place pp; baptism_src = self.get_baptism_src pp; death = self.get_death pp; death_place = self.get_death_place pp; death_src = self.get_death_src pp; burial = self.get_burial pp; burial_place = self.get_burial_place pp; burial_src = self.get_burial_src pp; notes = self.get_notes pp; psources = self.get_psources pp; key_index = self.get_key_index pp}; dsk_person_of_person p = failwith "not impl dsk_person_of_person"; get_consang (db2, i) = match db2.consang_array with [ Some tab -> tab.(i) | None -> let f = ("person", "consang") in if field_exists db2 f then get_field db2 i f else Adef.no_consang ]; get_parents (db2, i) = match db2.parents_array with [ Some tab -> tab.(i) | None -> let pos = get_field_acc db2 i ("person", "parents") in if pos = -1 then None else Some (get_field_data db2 pos ("person", "parents") "data") ]; get_family (db2, i) = match db2.family_array with [ Some tab -> tab.(i) | None -> get_field db2 i ("person", "family") ]} ; value person2gen_fun = {get_access (db2, i, p) = p.Def.access; get_aliases (db2, i, p) = List.map (fun s -> Istr2New db2 s) p.Def.aliases; get_baptism (db2, i, p) = p.Def.baptism; get_baptism_place (db2, i, p) = Istr2New db2 p.Def.baptism_place; get_baptism_src (db2, i, p) = Istr2New db2 p.Def.baptism_src; get_birth (db2, i, p) = p.Def.birth; get_birth_place (db2, i, p) = Istr2New db2 p.Def.birth_place; get_birth_src (db2, i, p) = Istr2New db2 p.Def.birth_src; get_burial (db2, i, p) = p.Def.burial; get_burial_place (db2, i, p) = Istr2New db2 p.Def.burial_place; get_burial_src (db2, i, p) = Istr2New db2 p.Def.burial_src; get_death (db2, i, p) = p.Def.death; get_death_place (db2, i, p) = Istr2New db2 p.Def.death_place; get_death_src (db2, i, p) = Istr2New db2 p.Def.death_src; get_first_name (db2, i, p) = Istr2New db2 p.Def.first_name; get_first_names_aliases (db2, i, p) = List.map (fun s -> Istr2New db2 s) p.Def.first_names_aliases; get_image (db2, i, p) = Istr2New db2 p.Def.image; get_key_index (db2, i, p) = p.Def.key_index; get_notes (db2, i, p) = Istr2New db2 p.Def.notes; get_occ (db2, i, p) = p.Def.occ; get_occupation (db2, i, p) = Istr2New db2 p.Def.occupation; get_psources (db2, i, p) = Istr2New db2 p.Def.psources; get_public_name (db2, i, p) = Istr2New db2 p.Def.public_name; get_qualifiers (db2, i, p) = List.map (fun s -> Istr2New db2 s) p.Def.qualifiers; get_related (db2, i, p) = p.Def.related; get_rparents (db2, i, p) = List.map (map_relation_ps (fun x -> x) (fun s -> Istr2New db2 s)) p.Def.rparents; get_sex (db2, i, p) = p.Def.sex; get_surname (db2, i, p) = Istr2New db2 p.Def.surname; get_surnames_aliases (db2, i, p) = List.map (fun s -> Istr2New db2 s) p.Def.surnames_aliases; get_titles (db2, i, p) = List.map (fun t -> map_title_strings (fun s -> Istr2New db2 s) t) p.Def.titles; gen_person_of_person (db2, i, p) = map_person_ps (fun p -> p) (fun s -> Istr2New db2 s) p; dsk_person_of_person (db2, i, p) = failwith "not impl dsk_person_of_person (gen)"; get_consang (db2, i, a) = a.Def.consang; get_parents (db2, i, a) = a.Def.parents; get_family (db2, i, u) = u.Def.family} ; (* Persons - user functions *) value get_set_per1 = (fun p -> p.per1, fun p v -> p.per1 := v); value get_set_asc1 = (fun p -> p.asc1, fun p v -> p.asc1 := v); value get_set_uni1 = (fun p -> p.uni1, fun p v -> p.uni1 := v); value get_set_per2 = (fun p -> p.per2, fun p v -> p.per2 := v); value get_set_asc2 = (fun p -> p.asc2, fun p v -> p.asc2 := v); value get_set_uni2 = (fun p -> p.uni2, fun p v -> p.uni2 := v); value wrap_per f g h = fun [ Person base i p -> let per = milazy_force base.data.persons.get i get_set_per1 p in f person1_fun per | Person2 db2 i p -> let per = milazy_force (ht_find db2.patches.h_person) (Adef.iper_of_int i) get_set_per2 p in match per with [ Some p -> h person2gen_fun (db2, i, p) | None -> g person2_fun (db2, i) ] ] ; value wrap_asc f g h = fun [ Person base i p -> let asc = milazy_force base.data.ascends.get i get_set_asc1 p in f person1_fun asc | Person2 db2 i p -> let asc = milazy_force (ht_find db2.patches.h_ascend) (Adef.iper_of_int i) get_set_asc2 p in match asc with [ Some a -> h person2gen_fun (db2, i, a) | None -> g person2_fun (db2, i) ] ] ; value wrap_uni f g h = fun [ Person base i p -> let uni = milazy_force base.data.unions.get i get_set_uni1 p in f person1_fun uni | Person2 db2 i p -> let uni = milazy_force (ht_find db2.patches.h_union) (Adef.iper_of_int i) get_set_uni2 p in match uni with [ Some u -> h person2gen_fun (db2, i, u) | None -> g person2_fun (db2, i) ] ] ; value get_access p = let f pf = pf.get_access in wrap_per f f f p ; value get_aliases p = let f pf = pf.get_aliases in wrap_per f f f p ; value get_baptism p = let f pf = pf.get_baptism in wrap_per f f f p ; value get_baptism_place p = let f pf = pf.get_baptism_place in wrap_per f f f p ; value get_baptism_src p = let f pf = pf.get_baptism_src in wrap_per f f f p ; value get_birth p = let f pf = pf.get_birth in wrap_per f f f p ; value get_birth_place p = let f pf = pf.get_birth_place in wrap_per f f f p ; value get_birth_src p = let f pf = pf.get_birth_src in wrap_per f f f p ; value get_burial p = let f pf = pf.get_burial in wrap_per f f f p ; value get_burial_place p = let f pf = pf.get_burial_place in wrap_per f f f p ; value get_burial_src p = let f pf = pf.get_burial_src in wrap_per f f f p ; value get_death p = let f pf = pf.get_death in wrap_per f f f p ; value get_death_place p = let f pf = pf.get_death_place in wrap_per f f f p ; value get_death_src p = let f pf = pf.get_death_src in wrap_per f f f p ; value get_first_name p = let f pf = pf.get_first_name in wrap_per f f f p ; value get_first_names_aliases p = let f pf = pf.get_first_names_aliases in wrap_per f f f p ; value get_image p = let f pf = pf.get_image in wrap_per f f f p ; value get_key_index p = let f pf = pf.get_key_index in wrap_per f f f p ; value get_notes p = let f pf = pf.get_notes in wrap_per f f f p ; value get_occ p = let f pf = pf.get_occ in wrap_per f f f p ; value get_occupation p = let f pf = pf.get_occupation in wrap_per f f f p ; value get_psources p = let f pf = pf.get_psources in wrap_per f f f p ; value get_public_name p = let f pf = pf.get_public_name in wrap_per f f f p ; value get_qualifiers p = let f pf = pf.get_qualifiers in wrap_per f f f p ; value get_related p = let f pf = pf.get_related in wrap_per f f f p ; value get_rparents p = let f pf = pf.get_rparents in wrap_per f f f p ; value get_sex p = let f pf = pf.get_sex in wrap_per f f f p ; value get_surname p = let f pf = pf.get_surname in wrap_per f f f p ; value get_surnames_aliases p = let f pf = pf.get_surnames_aliases in wrap_per f f f p ; value get_titles p = let f pf = pf.get_titles in wrap_per f f f p ; value gen_person_of_person p = let f pf = pf.gen_person_of_person in wrap_per f f f p ; value dsk_person_of_person p = let f pf = pf.dsk_person_of_person in wrap_per f f f p ; value get_consang a = let f pf = pf.get_consang in match a with [ Person2 db2 i _ -> match db2.consang_array with [ Some tab -> tab.(i) | None -> wrap_asc f f f a ] | _ -> wrap_asc f f f a ] ; value get_parents a = let f pf = pf.get_parents in match a with [ Person2 db2 i _ -> match db2.parents_array with [ Some tab -> tab.(i) | None -> wrap_asc f f f a ] | _ -> wrap_asc f f f a ] ; value get_family u = let f pf = pf.get_family in wrap_uni f f f u ; (* Families - common definitions *) type family = [ Family of dsk_base and int and family1_dat | Family2 of db2 and int and family2_dat ] and family1_dat = { fam1 : mutable option dsk_family; cpl1 : mutable option dsk_couple; des1 : mutable option dsk_descend } and family2_dat = { fam2 : mutable option (option (gen_family iper string)); cpl2 : mutable option (option (gen_couple iper)); des2 : mutable option (option (gen_descend iper)) } ; type family_fun 'f 'c 'd = { get_comment : 'f -> istr; get_divorce : 'f -> Def.divorce; get_fsources : 'f -> istr; get_marriage : 'f -> codate; get_marriage_place : 'f -> istr; get_marriage_src : 'f -> istr; get_origin_file : 'f -> istr; get_relation : 'f -> Def.relation_kind; get_witnesses : 'f -> array iper; gen_family_of_family : 'f -> Def.gen_family iper istr; is_deleted_family : 'f -> bool; get_father : 'c -> iper; get_mother : 'c -> iper; get_parent_array : 'c -> array iper; gen_couple_of_couple : 'c -> Def.gen_couple iper; get_children : 'd -> array iper; gen_descend_of_descend : 'd -> Def.gen_descend iper } ; (* Families - implementation database 1 *) value family1_fun = {get_comment f = Istr f.Def.comment; get_divorce f = f.Def.divorce; get_fsources f = Istr f.Def.fsources; get_marriage f = f.Def.marriage; get_marriage_place f = Istr f.Def.marriage_place; get_marriage_src f = Istr f.Def.marriage_src; get_origin_file f = Istr f.Def.origin_file; get_relation f = f.Def.relation; get_witnesses f = f.Def.witnesses; gen_family_of_family f = map_family_ps (fun p -> p) (fun s -> Istr s) f; is_deleted_family f = f.Def.fam_index = Adef.ifam_of_int (-1); get_father c = Adef.father c; get_mother c = Adef.mother c; get_parent_array c = Adef.parent_array c; gen_couple_of_couple c = c; get_children d = d.Def.children; gen_descend_of_descend d = d} ; (* Families - implementation database 2 *) value family2_fun = self where rec self = {get_comment (db2, i) = make_istr2 db2 ("family", "comment") i; get_divorce (db2, i) = get_field db2 i ("family", "divorce"); get_fsources (db2, i) = make_istr2 db2 ("family", "fsources") i; get_marriage (db2, i) = get_field db2 i ("family", "marriage"); get_marriage_place (db2, i) = make_istr2 db2 ("family", "marriage_place") i; get_marriage_src (db2, i) = make_istr2 db2 ("family", "marriage_src") i; get_origin_file (db2, i) = make_istr2 db2 ("family", "origin_file") i; get_relation (db2, i) = get_field db2 i ("family", "relation"); get_witnesses (db2, i) = get_field db2 i ("family", "witnesses"); gen_family_of_family ((db2, i) as f) = {marriage = self.get_marriage f; marriage_place = self.get_marriage_place f; marriage_src = self.get_marriage_src f; witnesses = self.get_witnesses f; relation = self.get_relation f; divorce = self.get_divorce f; comment = self.get_comment f; origin_file = self.get_origin_file f; fsources = self.get_fsources f; fam_index = Adef.ifam_of_int i}; is_deleted_family (db2, i) = let fath = match db2.father_array with [ Some tab -> tab.(i) | None -> get_field db2 i ("family", "father") ] in Adef.int_of_iper fath < 0; get_father (db2, i) = match db2.father_array with [ Some tab -> tab.(i) | None -> get_field db2 i ("family", "father") ]; get_mother (db2, i) = match db2.mother_array with [ Some tab -> tab.(i) | None -> get_field db2 i ("family", "mother") ]; get_parent_array (db2, i) = let p1 = get_field db2 i ("family", "father") in let p2 = get_field db2 i ("family", "mother") in [| p1; p2 |]; gen_couple_of_couple c = Adef.couple (self.get_father c) (self.get_mother c); get_children (db2, i) = match db2.children_array with [ Some tab -> tab.(i) | None -> get_field db2 i ("family", "children") ]; gen_descend_of_descend d = {children = self.get_children d}} ; value family2gen_fun = {get_comment (db2, f) = Istr2New db2 f.Def.comment; get_divorce (db2, f) = f.Def.divorce; get_fsources (db2, f) = Istr2New db2 f.Def.fsources; get_marriage (db2, f) = f.Def.marriage; get_marriage_place (db2, f) = Istr2New db2 f.Def.marriage_place; get_marriage_src (db2, f) = Istr2New db2 f.Def.marriage_src; get_origin_file (db2, f) = Istr2New db2 f.Def.origin_file; get_relation (db2, f) = f.Def.relation; get_witnesses (db2, f) = f.Def.witnesses; gen_family_of_family (db2, f) = map_family_ps (fun p -> p) (fun s -> Istr2New db2 s) f; is_deleted_family (db2, f) = f.Def.fam_index = Adef.ifam_of_int (-1); get_father (db2, c) = Adef.father c; get_mother (db2, c) = Adef.mother c; get_parent_array (db2, c) = Adef.parent_array c; gen_couple_of_couple (db2, c) = c; get_children (db2, d) = d.Def.children; gen_descend_of_descend (db2, d) = d} ; (* Families - user functions *) value get_set_fam1 = (fun p -> p.fam1, fun p v -> p.fam1 := v); value get_set_cpl1 = (fun p -> p.cpl1, fun p v -> p.cpl1 := v); value get_set_des1 = (fun p -> p.des1, fun p v -> p.des1 := v); value get_set_fam2 = (fun p -> p.fam2, fun p v -> p.fam2 := v); value get_set_cpl2 = (fun p -> p.cpl2, fun p v -> p.cpl2 := v); value get_set_des2 = (fun p -> p.des2, fun p v -> p.des2 := v); value wrap_fam f g h = fun [ Family base i d -> let fam = milazy_force base.data.families.get i get_set_fam1 d in f family1_fun fam | Family2 db2 i d -> let fam = milazy_force (ht_find db2.patches.h_family) (Adef.ifam_of_int i) get_set_fam2 d in match fam with [ Some fam -> h family2gen_fun (db2, fam) | None -> g family2_fun (db2, i) ] ] ; value wrap_cpl f g h = fun [ Family base i d -> let cpl = milazy_force base.data.couples.get i get_set_cpl1 d in f family1_fun cpl | Family2 db2 i d -> let cpl = milazy_force (ht_find db2.patches.h_couple) (Adef.ifam_of_int i) get_set_cpl2 d in match cpl with [ Some cpl -> h family2gen_fun (db2, cpl) | None -> g family2_fun (db2, i) ] ] ; value wrap_des f g h = fun [ Family base i d -> let des = milazy_force base.data.descends.get i get_set_des1 d in f family1_fun des | Family2 db2 i d -> let des = milazy_force (ht_find db2.patches.h_descend) (Adef.ifam_of_int i) get_set_des2 d in match des with [ Some des -> h family2gen_fun (db2, des) | None -> g family2_fun (db2, i) ] ] ; value get_comment fam = let f pf = pf.get_comment in wrap_fam f f f fam ; value get_divorce fam = let f pf = pf.get_divorce in wrap_fam f f f fam ; value get_fsources fam = let f pf = pf.get_fsources in wrap_fam f f f fam ; value get_marriage fam = let f pf = pf.get_marriage in wrap_fam f f f fam ; value get_marriage_place fam = let f pf = pf.get_marriage_place in wrap_fam f f f fam ; value get_marriage_src fam = let f pf = pf.get_marriage_src in wrap_fam f f f fam ; value get_origin_file fam = let f pf = pf.get_origin_file in wrap_fam f f f fam ; value get_relation fam = let f pf = pf.get_relation in wrap_fam f f f fam ; value get_witnesses fam = let f pf = pf.get_witnesses in wrap_fam f f f fam ; value gen_family_of_family fam = let f pf = pf.gen_family_of_family in wrap_fam f f f fam ; value is_deleted_family fam = let f pf = pf.is_deleted_family in wrap_fam f f f fam ; value get_father cpl = let f pf = pf.get_father in match cpl with [ Family2 db2 i _ -> match db2.father_array with [ Some tab -> tab.(i) | None -> wrap_cpl f f f cpl ] | _ -> wrap_cpl f f f cpl ] ; value get_mother cpl = let f pf = pf.get_mother in match cpl with [ Family2 db2 i _ -> match db2.mother_array with [ Some tab -> tab.(i) | None -> wrap_cpl f f f cpl ] | _ -> wrap_cpl f f f cpl ] ; value get_parent_array cpl = let f pf = pf.get_parent_array in wrap_cpl f f f cpl ; value gen_couple_of_couple cpl = let f pf = pf.gen_couple_of_couple in wrap_cpl f f f cpl ; value get_children des = let f pf = pf.get_children in wrap_des f f f des ; value gen_descend_of_descend des = let f pf = pf.gen_descend_of_descend in wrap_des f f f des ; (* Databases - common definitions *) type base = { close_base : unit -> unit; empty_person : iper -> person; person_of_gen_person : (gen_person iper istr * gen_ascend ifam * gen_union ifam) -> person; family_of_gen_family : (gen_family iper istr * gen_couple iper * gen_descend iper) -> family; poi : iper -> person; foi : ifam -> family; sou : istr -> string; nb_of_persons : unit -> int; nb_of_families : unit -> int; patch_person : iper -> Def.gen_person iper istr -> unit; patch_ascend : iper -> Def.gen_ascend ifam -> unit; patch_union : iper -> Def.gen_union ifam -> unit; patch_family : ifam -> Def.gen_family iper istr -> unit; patch_descend : ifam -> Def.gen_descend iper -> unit; patch_couple : ifam -> Def.gen_couple iper -> unit; patch_name : string -> iper -> unit; patch_key : iper -> string -> string -> int -> unit; delete_key : string -> string -> int -> unit; insert_string : string -> istr; commit_patches : unit -> unit; commit_notes : string -> string -> unit; is_patched_person : iper -> bool; patched_ascends : unit -> list iper; delete_family : ifam -> unit; person_of_key : string -> string -> int -> option iper; persons_of_name : string -> list iper; persons_of_first_name : unit -> string_person_index; persons_of_surname : unit -> string_person_index; base_visible_get : (person -> bool) -> int -> bool; base_visible_write : unit -> unit; base_particles : unit -> list string; base_strings_of_first_name : string -> list istr; base_strings_of_surname : string -> list istr; load_ascends_array : unit -> unit; load_unions_array : unit -> unit; load_couples_array : unit -> unit; load_descends_array : unit -> unit; load_strings_array : unit -> unit; persons_array : unit -> (int -> gen_person iper istr * int -> gen_person iper istr -> unit); ascends_array : unit -> (int -> option ifam * int -> Adef.fix * int -> Adef.fix -> unit * option (array Adef.fix)); base_notes_read : string -> string; base_notes_read_first_line : string -> string; base_notes_are_empty : string -> bool; base_notes_origin_file : unit -> string; base_notes_dir : unit -> string; base_wiznotes_dir : unit -> string; nobtit : Lazy.t (list string) -> Lazy.t (list string) -> person -> list title; p_first_name : person -> string; p_surname : person -> string; date_of_last_change : unit -> float; apply_base1 : (Dbdisk.dsk_base -> unit) -> unit; apply_base2 : (Db2disk.db2 -> unit) -> unit } ; module C_base : sig value delete_family : base -> ifam -> unit; value nobtit : base -> Lazy.t (list string) -> Lazy.t (list string) -> person -> list title; value p_first_name : base -> person -> string; value p_surname : base -> person -> string; end = struct value delete_family self ifam = do { let cpl = Adef.couple (Adef.iper_of_int (-1)) (Adef.iper_of_int (-1)) in let fam = let empty = self.insert_string "" in {marriage = Adef.codate_None; marriage_place = empty; marriage_src = empty; relation = Married; divorce = NotDivorced; witnesses = [| |]; comment = empty; origin_file = empty; fsources = empty; fam_index = Adef.ifam_of_int (-1)} in let des = {children = [| |]} in self.patch_family ifam fam; self.patch_couple ifam cpl; self.patch_descend ifam des }; value nobtit self allowed_titles denied_titles p = let list = get_titles p in match Lazy.force allowed_titles with [ [] -> list | allowed_titles -> let list = List.fold_right (fun t l -> let id = Name.lower (self.sou t.t_ident) in let pl = Name.lower (self.sou t.t_place) in if pl = "" then if List.mem id allowed_titles then [t :: l] else l else if List.mem (id ^ "/" ^ pl) allowed_titles || List.mem (id ^ "/*") allowed_titles then [t :: l] else l) list [] in match Lazy.force denied_titles with [ [] -> list | denied_titles -> List.filter (fun t -> let id = Name.lower (self.sou t.t_ident) in let pl = Name.lower (self.sou t.t_place) in if List.mem (id ^ "/" ^ pl) denied_titles || List.mem ("*/" ^ pl) denied_titles then False else True) list ] ] ; value p_first_name self p = nominative (self.sou (get_first_name p)); value p_surname self p = nominative (self.sou (get_surname p)); end ; (* Database - implementation 1 *) value base1 base = let base_strings_of_first_name_or_surname s = List.map (fun s -> Istr s) (base.func.strings_of_fsname s) in self where rec self = {close_base = base.func.cleanup; empty_person ip = Person base (Adef.int_of_iper ip) {per1 = Some (no_person (Adef.istr_of_int 0) ip); asc1 = Some no_ascend; uni1 = Some no_union}; person_of_gen_person (p, a, u) = Person base 0 {per1 = Some (map_person_ps (fun p -> p) un_istr p); asc1 = Some a; uni1 = Some u}; family_of_gen_family (f, c, d) = Family base 0 {fam1 = Some (map_family_ps (fun p -> p) un_istr f); cpl1 = Some c; des1 = Some d}; poi i = Person base (Adef.int_of_iper i) {per1 = None; asc1 = None; uni1 = None}; foi i = Family base (Adef.int_of_ifam i) {fam1 = None; cpl1 = None; des1 = None}; sou i = match i with [ Istr i -> base.data.strings.get (Adef.int_of_istr i) | _ -> assert False ]; nb_of_persons () = base.data.persons.len; nb_of_families () = base.data.families.len; patch_person ip p = let p = map_person_ps (fun p -> p) un_istr p in base.func.Dbdisk.patch_person ip p; patch_ascend ip a = base.func.Dbdisk.patch_ascend ip a; patch_union ip u = base.func.Dbdisk.patch_union ip u; patch_family ifam f = let f = map_family_ps (fun p -> p) un_istr f in base.func.Dbdisk.patch_family ifam f; patch_descend ifam d = base.func.Dbdisk.patch_descend ifam d; patch_couple ifam c = base.func.Dbdisk.patch_couple ifam c; patch_name s ip = base.func.Dbdisk.patch_name s ip; patch_key ip fn sn occ = (); delete_key fn sn occ = (); insert_string s = Istr (base.func.Dbdisk.insert_string s); commit_patches = base.func.Dbdisk.commit_patches; commit_notes = base.func.Dbdisk.commit_notes; is_patched_person ip = base.func.Dbdisk.is_patched_person ip; patched_ascends = base.func.Dbdisk.patched_ascends; delete_family ifam = C_base.delete_family self ifam; person_of_key = base.func.Dbdisk.person_of_key; persons_of_name = base.func.Dbdisk.persons_of_name; persons_of_first_name () = Spi base.func.Dbdisk.persons_of_first_name; persons_of_surname () = Spi base.func.Dbdisk.persons_of_surname; base_visible_get f = base.data.visible.v_get (fun p -> f (Person base 0 {per1 = Some p; asc1 = None; uni1 = None})); base_visible_write = base.data.visible.v_write; base_particles () = base.data.particles; base_strings_of_first_name = base_strings_of_first_name_or_surname; base_strings_of_surname = base_strings_of_first_name_or_surname; load_ascends_array = base.data.ascends.load_array; load_unions_array = base.data.unions.load_array; load_couples_array = base.data.couples.load_array; load_descends_array = base.data.descends.load_array; load_strings_array = base.data.strings.load_array; persons_array () = let get i = let p = base.data.persons.get i in map_person_ps (fun p -> p) (fun i -> Istr i) p in let set i p = let p = map_person_ps (fun p -> p) un_istr p in base.data.persons.set i p in (get, set); ascends_array () = let fget i = (base.data.ascends.get i).parents in let cget i = (base.data.ascends.get i).consang in let cset i v = base.data.ascends.set i {(base.data.ascends.get i) with consang = v} in (fget, cget, cset, None); base_notes_read fnotes = base.data.bnotes.nread fnotes RnAll; base_notes_read_first_line fnotes = base.data.bnotes.nread fnotes Rn1Ln; base_notes_are_empty fnotes = base.data.bnotes.nread fnotes RnDeg = ""; base_notes_origin_file () = base.data.bnotes.norigin_file; base_notes_dir () = "notes_d"; base_wiznotes_dir () = "wiznotes"; nobtit conf p = C_base.nobtit self conf p; p_first_name p = C_base.p_first_name self p; p_surname p = C_base.p_surname self p; date_of_last_change () = let s = let bdir = base.data.bdir in try Unix.stat (Filename.concat bdir "patches") with [ Unix.Unix_error _ _ _ -> Unix.stat (Filename.concat bdir "base") ] in s.Unix.st_mtime; apply_base1 f = f base; apply_base2 f = invalid_arg "apply_base2"} ; (* Database - implementation 2 *) value base2 db2 = let base_strings_of_first_name_or_surname field proj s = let posl = strings2_of_fsname db2 field s in let istrl = List.map (fun pos -> Istr2 db2 ("person", field) pos) posl in let s = Name.crush_lower s in let sl = Hashtbl.fold (fun _ p sl -> if Name.crush_lower (proj p) = s then [proj p :: sl] else sl) db2.patches.h_person [] in let sl = list_uniq (List.sort compare sl) in List.fold_left (fun istrl s -> [Istr2New db2 s :: istrl]) istrl sl in self where rec self = {close_base () = Hashtbl.iter (fun (f1, f2, f) ic -> close_in ic) db2.cache_chan; empty_person ip = Person2 db2 (Adef.int_of_iper ip) {per2 = Some (Some (no_person "" ip)); asc2 = Some (Some no_ascend); uni2 = Some (Some no_union)}; person_of_gen_person (p, a, u) = Person2 db2 (Adef.int_of_iper p.key_index) {per2 = Some (Some (map_person_ps (fun p -> p) un_istr2 p)); asc2 = Some (Some a); uni2 = Some (Some u)}; family_of_gen_family (f, c, d) = Family2 db2 (Adef.int_of_ifam f.fam_index) {fam2 = Some (Some (map_family_ps (fun p -> p) un_istr2 f)); cpl2 = Some (Some c); des2 = Some (Some d)}; poi i = Person2 db2 (Adef.int_of_iper i) {per2 = None; asc2 = None; uni2 = None}; foi i = Family2 db2 (Adef.int_of_ifam i) {fam2 = None; cpl2 = None; des2 = None}; sou i = match i with [ Istr2 db2 f pos -> string_of_istr2 db2 f pos | Istr2New db2 s -> s | _ -> assert False ]; nb_of_persons () = db2.patches.nb_per; nb_of_families () = db2.patches.nb_fam; patch_person ip p = do { let p = map_person_ps (fun p -> p) un_istr2 p in Hashtbl.replace db2.patches.h_person ip p; db2.patches.nb_per := max (Adef.int_of_iper ip + 1) db2.patches.nb_per; }; patch_ascend ip a = do { Hashtbl.replace db2.patches.h_ascend ip a; db2.patches.nb_per := max (Adef.int_of_iper ip + 1) db2.patches.nb_per; }; patch_union ip u = do { Hashtbl.replace db2.patches.h_union ip u; db2.patches.nb_per := max (Adef.int_of_iper ip + 1) db2.patches.nb_per; }; patch_family ifam f = do { let f = map_family_ps (fun p -> p) un_istr2 f in Hashtbl.replace db2.patches.h_family ifam f; db2.patches.nb_fam := max (Adef.int_of_ifam ifam + 1) db2.patches.nb_fam }; patch_descend ifam d = do { Hashtbl.replace db2.patches.h_descend ifam d; db2.patches.nb_fam := max (Adef.int_of_ifam ifam + 1) db2.patches.nb_fam }; patch_couple ifam c = do { Hashtbl.replace db2.patches.h_couple ifam c; db2.patches.nb_fam := max (Adef.int_of_ifam ifam + 1) db2.patches.nb_fam }; patch_name s ip = let s = Name.crush_lower s in let ht = db2.patches.h_name in try let ipl = Hashtbl.find ht s in if List.mem ip ipl then () else Hashtbl.replace ht s [ip :: ipl] with [ Not_found -> Hashtbl.add ht s [ip] ]; patch_key ip fn sn occ = let fn = Name.lower (nominative fn) in let sn = Name.lower (nominative sn) in Hashtbl.replace db2.patches.h_key (fn, sn, occ) (Some ip); delete_key fn sn occ = let fn = Name.lower (nominative fn) in let sn = Name.lower (nominative sn) in match disk_person2_of_key db2 fn sn occ with [ Some _ -> Hashtbl.replace db2.patches.h_key (fn, sn, occ) None | None -> Hashtbl.remove db2.patches.h_key (fn, sn, occ) ]; insert_string s = Istr2New db2 s; commit_patches () = commit_patches2 db2; commit_notes fnotes s = commit_notes2 db2 fnotes s; is_patched_person ip = Hashtbl.mem db2.patches.h_person ip; patched_ascends () = do { let r = ref [] in Hashtbl.iter (fun ip _ -> r.val := [ip :: r.val]) db2.patches.h_ascend; r.val }; delete_family ifam = C_base.delete_family self ifam; person_of_key fn sn oc = person2_of_key db2 fn sn oc; persons_of_name s = persons2_of_name db2 s; persons_of_first_name () = Spi2 db2 (persons_of_first_name_or_surname2 db2 True); persons_of_surname () = Spi2 db2 (persons_of_first_name_or_surname2 db2 False); base_visible_get f = failwith "not impl visible_get"; base_visible_write () = failwith "not impl visible_write"; base_particles () = Mutil.input_particles (Filename.concat db2.bdir2 "particles.txt"); base_strings_of_first_name s = base_strings_of_first_name_or_surname "first_name" (fun p -> p.first_name) s; base_strings_of_surname s = base_strings_of_first_name_or_surname "surname" (fun p -> p.surname) s; load_ascends_array () = do { eprintf "*** loading ascends array\n"; flush stderr; let nb = db2.patches.nb_per in let nb_ini = db2.patches.nb_per_ini in match db2.parents_array with [ Some _ -> () | None -> db2.parents_array := Some (parents_array2 db2 nb_ini nb) ]; match db2.consang_array with [ Some _ -> () | None -> db2.consang_array := Some (consang_array2 db2 nb) ]; }; load_unions_array () = match db2.family_array with [ Some _ -> () | None -> do { eprintf "*** loading unions array\n"; flush stderr; db2.family_array := Some (family_array2 db2) } ]; load_couples_array () = load_couples_array2 db2; load_descends_array () = match db2.children_array with [ Some _ -> () | None -> do { eprintf "*** loading descends array\n"; flush stderr; db2.children_array := Some (children_array2 db2) } ]; load_strings_array () = (); persons_array () = failwith "not impl persons_array"; ascends_array () = let nb = db2.patches.nb_per in let nb_ini = db2.patches.nb_per_ini in let ptab = match db2.parents_array with [ Some tab -> tab | None -> parents_array2 db2 nb_ini nb ] in let cg_tab = match db2.consang_array with [ Some tab -> tab | None -> consang_array2 db2 nb ] in let fget i = ptab.(i) in let cget i = cg_tab.(i) in let cset i v = cg_tab.(i) := v in (fget, cget, cset, Some cg_tab); base_notes_read fnotes = read_notes db2 fnotes RnAll; base_notes_read_first_line fnotes = read_notes db2 fnotes Rn1Ln; base_notes_are_empty fnotes = read_notes db2 fnotes RnDeg = ""; base_notes_origin_file () = let fname = Filename.concat db2.bdir2 "notes_of.txt" in match try Some (Secure.open_in fname) with [ Sys_error _ -> None ] with [ Some ic -> let r = input_line ic in do { close_in ic; r } | None -> "" ]; base_notes_dir () = Filename.concat "base_d" "notes_d"; base_wiznotes_dir () = Filename.concat "base_d" "wiznotes_d"; nobtit conf p = C_base.nobtit self conf p; p_first_name p = C_base.p_first_name self p; p_surname p = C_base.p_surname self p; date_of_last_change () = let s = let bdir = db2.bdir2 in try Unix.stat (Filename.concat bdir "patches") with [ Unix.Unix_error _ _ _ -> Unix.stat bdir ] in s.Unix.st_mtime; apply_base1 f = invalid_arg "apply_base1"; apply_base2 f = f db2} ; (* Database - user functions *) value open_base bname = let bname = if Filename.check_suffix bname ".gwb" then bname else bname ^ ".gwb" in if Sys.file_exists (Filename.concat bname "base_d") then base2 (base_of_base2 bname) else base1 (Database.opendb bname) ; value close_base b = b.close_base (); value empty_person b = b.empty_person; value person_of_gen_person b = b.person_of_gen_person; value family_of_gen_family b = b.family_of_gen_family; value poi b = b.poi; value foi b = b.foi; value sou b = b.sou; value nb_of_persons b = b.nb_of_persons (); value nb_of_families b = b.nb_of_families (); value patch_person b = b.patch_person; value patch_ascend b = b.patch_ascend; value patch_union b = b.patch_union; value patch_family b = b.patch_family; value patch_descend b = b.patch_descend; value patch_couple b = b.patch_couple; value patch_name b = b.patch_name; value patch_key b = b.patch_key; value delete_key b = b.delete_key; value insert_string b = b.insert_string; value commit_patches b = b.commit_patches (); value commit_notes b = b.commit_notes; value is_patched_person b = b.is_patched_person; value patched_ascends b = b.patched_ascends (); value delete_family b = b.delete_family; value person_of_key b = b.person_of_key; value persons_of_name b = b.persons_of_name; value persons_of_first_name b = b.persons_of_first_name (); value persons_of_surname b = b.persons_of_surname (); value base_visible_get b = b.base_visible_get; value base_visible_write b = b.base_visible_write (); value base_particles b = b.base_particles (); value base_strings_of_first_name b = b.base_strings_of_first_name; value base_strings_of_surname b = b.base_strings_of_surname; value load_ascends_array b = b.load_ascends_array (); value load_unions_array b = b.load_unions_array (); value load_couples_array b = b.load_couples_array (); value load_descends_array b = b.load_descends_array (); value load_strings_array b = b.load_strings_array (); value persons_array b = b.persons_array (); value ascends_array b = b.ascends_array (); value base_notes_read b = b.base_notes_read; value base_notes_read_first_line b = b.base_notes_read_first_line; value base_notes_are_empty b = b.base_notes_are_empty; value base_notes_origin_file b = b.base_notes_origin_file (); value base_notes_dir b = b.base_notes_dir (); value base_wiznotes_dir b = b.base_wiznotes_dir (); value nobtit b = b.nobtit; value p_first_name b = b.p_first_name; value p_surname b = b.p_surname; value date_of_last_change b = b.date_of_last_change (); value base_of_base1 = base1; value apply_base1 b = b.apply_base1; value apply_base2 b = b.apply_base2; value husbands base gp = let p = poi base gp.key_index in List.map (fun ifam -> let fam = foi base ifam in let husband = poi base (get_father fam) in let husband_surname = p_surname base husband in let husband_surnames_aliases = List.map (sou base) (get_surnames_aliases husband) in (husband_surname, husband_surnames_aliases)) (Array.to_list (get_family p)) ; value father_titles_places base p nobtit = match get_parents (poi base p.key_index) with [ Some ifam -> let fam = foi base ifam in let fath = poi base (get_father fam) in List.map (fun t -> sou base t.t_place) (nobtit fath) | None -> [] ] ; value gen_gen_person_misc_names base p nobtit nobtit_fun = let sou = sou base in Futil.gen_person_misc_names (sou p.first_name) (sou p.surname) (sou p.public_name) (List.map sou p.qualifiers) (List.map sou p.aliases) (List.map sou p.first_names_aliases) (List.map sou p.surnames_aliases) (List.map (Futil.map_title_strings sou) nobtit) (if p.sex = Female then husbands base p else []) (father_titles_places base p nobtit_fun) ; value gen_person_misc_names base p nobtit = gen_gen_person_misc_names base p (nobtit p) (fun p -> nobtit (gen_person_of_person p)) ; value person_misc_names base p nobtit = gen_gen_person_misc_names base (gen_person_of_person p) (nobtit p) nobtit ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/dutil.ml0000660000175200017530000000735412664543647022674 0ustar guillaumeguillaume(* $Id: dutil.ml,v 5.12 2007-01-19 01:53:16 ddr Exp $ *) (* Copyright (c) 2006-2007 INRIA *) open Dbdisk; open Def; open Mutil; type name_index_data = array (array iper); type strings_of_fsname = array (array dsk_istr); value magic_gwb = "GnWb0020"; value magic_gwb_iso_8859_1 = "GnWb001y"; value table_size = 0x3fff; value poi base i = base.data.persons.get (Adef.int_of_iper i); value aoi base i = base.data.ascends.get (Adef.int_of_iper i); value uoi base i = base.data.unions.get (Adef.int_of_iper i); value coi base i = base.data.couples.get (Adef.int_of_ifam i); value sou base i = base.data.strings.get (Adef.int_of_istr i); value p_first_name base p = nominative (sou base p.first_name); value p_surname base p = nominative (sou base p.surname); value husbands base p = let u = uoi base p.key_index in List.map (fun ifam -> let cpl = coi base ifam in let husband = poi base (Adef.father cpl) in let husband_surname = p_surname base husband in let husband_surnames_aliases = List.map (sou base) husband.surnames_aliases in (husband_surname, husband_surnames_aliases)) (Array.to_list u.family) ; value father_titles_places base p nobtit = match (aoi base p.key_index).parents with [ Some ifam -> let cpl = coi base ifam in let fath = poi base (Adef.father cpl) in List.map (fun t -> sou base t.t_place) (nobtit fath) | None -> [] ] ; value dsk_person_misc_names base p nobtit = let sou = sou base in Futil.gen_person_misc_names (sou p.first_name) (sou p.surname) (sou p.public_name) (List.map sou p.qualifiers) (List.map sou p.aliases) (List.map sou p.first_names_aliases) (List.map sou p.surnames_aliases) (List.map (Futil.map_title_strings sou) (nobtit p)) (if p.sex = Female then husbands base p else []) (father_titles_places base p nobtit) ; value check_magic = let b = Bytes.create (String.length magic_gwb) in fun ic -> do { really_input ic b 0 (String.length b); Mutil.utf_8_db.val := True; if b <> magic_gwb then if b = magic_gwb_iso_8859_1 then Mutil.utf_8_db.val := False else if String.sub magic_gwb 0 4 = String.sub b 0 4 then failwith "this is a GeneWeb base, but not compatible" else failwith "this is not a GeneWeb base, or it is a very old version" else () } ; value unaccent = fun [ 'à' | 'á' | 'â' | 'ã' | 'ä' | 'å' | 'æ' -> 'a' | 'ç' -> 'c' | 'è' | 'é' | 'ê' | 'ë' -> 'e' | 'ì' | 'í' | 'î' | 'ï' -> 'i' | 'ð' -> 'd' | 'ñ' -> 'n' | 'ò' | 'ó' | 'ô' | 'õ' | 'ö' | 'ø' -> 'o' | 'ù' | 'ú' | 'û' | 'ü' -> 'u' | 'ý' | 'ÿ' -> 'y' | 'þ' -> 'p' | c -> c ] ; value compare_names_1 s1 s2 = let compare_aux e1 e2 = loop where rec loop i1 i2 = if i1 = e1 && i2 = e2 then 0 else if i1 = e1 then -1 else if i2 = e2 then 1 else let c1 = unaccent (Char.lowercase s1.[i1]) in let c2 = unaccent (Char.lowercase s2.[i2]) in match (c1, c2) with [ ('a'..'z', 'a'..'z') -> if c1 < c2 then -1 else if c1 > c2 then 1 else loop (i1 + 1) (i2 + 1) | ('a'..'z', _) -> 1 | (_, 'a'..'z') -> -1 | _ -> loop (i1 + 1) (i2 + 1) ] in if s1 = s2 then 0 else let i1 = initial s1 in let i2 = initial s2 in match compare_aux (String.length s1) (String.length s2) i1 i2 with [ 0 -> compare_aux i1 i2 0 0 | x -> x ] ; value compare_names base_data s1 s2 = if utf_8_db.val then compare_after_particle base_data.particles s1 s2 else compare_names_1 s1 s2 ; value compare_istr_fun base_data is1 is2 = if is1 = is2 then 0 else compare_names base_data (base_data.strings.get (Adef.int_of_istr is1)) (base_data.strings.get (Adef.int_of_istr is2)) ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/database.mli0000660000175200017530000000021312664543647023453 0ustar guillaumeguillaume(* $Id: database.mli,v 5.2 2007-01-19 01:53:16 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) value opendb : string -> Dbdisk.dsk_base; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/pr_html.ml0000660000175200017530000000651112664543647023212 0ustar guillaumeguillaume(* camlp5r q_MLast.cmo pa_extfun.cmo *) (* $Id: pr_html.ml,v 5.3 2007-09-12 09:58:44 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Pcaml; open Spretty; value loc = (0, 0); value expr e dg k = pr_expr.pr_fun "top" e dg k; value expr_dot e dg k = pr_expr.pr_fun "dot" e dg k; value patt e dg k = pr_patt.pr_fun "top" e dg k; value end_with s pat = loop (String.length s - 1) (String.length pat - 1) where rec loop i j = if j < 0 then True else if i < 0 then False else if s.[i] = pat.[j] then loop (i - 1) (j - 1) else False ; value start_with s pat = loop 0 0 where rec loop i j = if j = String.length pat then True else if i = String.length s then False else if s.[i] = pat.[j] then loop (i + 1) (j + 1) else False ; value get_tag = fun [ [e :: el] -> match List.rev el with [ [<:expr< Wserver.wprint $str:t$ >> :: el] when start_with t "\n" || end_with t ">") -> let stag = end_with t ">" in let elen = if stag then 1 else 2 in let tg = String.sub t 2 (String.length t - elen - 2) in let pl = loop e where rec loop = fun [ <:expr< Wserver.wprint $str:s$ >> -> if start_with s "<" && (stag && end_with s ">" || end_with s ">\n") then let ptg = String.sub s 1 (String.length s - elen - 1) in if ptg = tg then [] else if start_with ptg (tg ^ " ") then let i = 1 + String.length tg + 1 in let s = String.sub s i (String.length s - elen - i) in [<:expr< $str:s$ >>] else raise Not_found else raise Not_found | <:expr< $a$ $b$ >> -> [b :: loop a] | _ -> raise Not_found ] in (stag, tg, List.rev pl, List.rev el) | _ -> raise Not_found ] | _ -> raise Not_found ] ; value is_tag el = try let _ = get_tag el in True with [ Not_found -> False ] ; value rec sequence_loop = fun [ [e :: el] -> [: `expr e "" [: `S RO ";" :]; sequence_loop el :] | [] -> [: :] ] ; value rec list elem el dg k = match el with [ [] -> k | [x] -> [: `elem x dg k :] | [x :: l] -> [: `elem x "" [: :]; list elem l dg k :] ] ; value tag_box stag t pl el k = BEbox [: `HOVbox [: `HVbox [: :]; `HOVbox [: `S LR (if stag then "stag" else "tag"); `S LR ("\"" ^ t ^ "\""); list expr_dot pl "" [: :] :]; `S LR "begin" :]; `HVbox [: `HVbox [: :]; sequence_loop el :]; `HVbox [: `S LR "end"; k :] :] ; let lev = find_pr_level "top" pr_expr.pr_levels in lev.pr_rules := extfun lev.pr_rules with [ <:expr< do { $list:el$ } >> when is_tag el -> fun curr next _ k -> let (stag, t, pl, el) = get_tag el in [: `tag_box stag t pl el k :] | <:expr< if $e1$ then do { $list:el$ } else $e3$ >> when is_tag el -> fun curr next _ k -> let (stag, t, pl, el) = get_tag el in [: `HVbox [: `HVbox [: :]; `HVbox [: `HVbox [: `S LR "if"; `expr e1 "" [: `S LR "then" :] :]; `tag_box stag t pl el [: :] :]; `HVbox [: `S LR "else"; `expr e3 "" k :] :] :] ]; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/pa_html.ml0000660000175200017530000000443612664543647023175 0ustar guillaumeguillaume(* camlp5r pa_extend.cmo q_MLast.cmo *) (* $Id: pa_html.ml,v 5.5 2007-09-12 09:58:44 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Pcaml; value rec unfold_apply list = fun [ <:expr< $x1$ $x2$ >> -> unfold_apply [x2 :: list] x1 | e -> (e, list) ] ; value tag_encloser loc tag newl enewl a el = let s = if newl then "\\n" else "" in let se = if newl || enewl then "\\n" else "" in let e = let (frm, al) = match a with [ Some e -> let (e, al) = unfold_apply [] e in let frm = match e with [ <:expr< $str:frm$ >> -> frm | _ -> Stdpp.raise_with_loc (MLast.loc_of_expr e) (Stream.Error "string or 'do' expected") ] in (" " ^ frm, al) | None -> ("", []) ] in List.fold_left (fun f e -> <:expr< $f$ $e$ >>) <:expr< Wserver.wprint $str:"<" ^ tag ^ frm ^ ">" ^ s$ >> al in [e :: el @ [<:expr< Wserver.wprint $str:"" ^ se$ >>]] ; value tag_alone loc tag a = let s = "\\n" in let e = let (frm, al) = match a with [ Some e -> let (e, al) = unfold_apply [] e in let frm = match e with [ <:expr< $str:frm$ >> -> frm | _ -> Stdpp.raise_with_loc (MLast.loc_of_expr e) (Stream.Error "string or 'do' expected") ] in (" " ^ frm, al) | None -> ("", []) ] in List.fold_left (fun f e -> <:expr< $f$ $e$ >>) <:expr< Wserver.wprint $str:"<" ^ tag ^ frm ^ "%s>" ^ s$ >> al in <:expr< $e$ conf.xhs >> ; EXTEND GLOBAL: expr; expr: LEVEL "top" [ [ "tag"; (tn, al, el) = tag_body -> let el = tag_encloser loc tn True True al el in <:expr< do { $list:el$ } >> | "stag"; (tn, al, el) = tag_body -> let el = tag_encloser loc tn False False al el in <:expr< do { $list:el$ } >> | "stagn"; (tn, al, el) = tag_body -> let el = tag_encloser loc tn False True al el in <:expr< do { $list:el$ } >> | "xtag"; tn = STRING; a = OPT expr -> tag_alone loc tn a ] ] ; tag_body: [ [ tn = STRING; a = OPT expr; "begin"; el = LIST0 expr_semi; "end" -> (tn, a, el) ] ] ; expr_semi: [ [ e = expr; ";" -> e ] ] ; END; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/updateData.ml0000660000175200017530000013562212664543647023627 0ustar guillaumeguillaume(* camlp5r ./pa_html.cmo *) (* $Id: source.ml,v 0.01 2012-07-12 10:19:08 flh Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Config; open Def; open Gwdb; open Hutil; open TemplAst; open Util; module DataSet = Set.Make (struct type t = (Gwdb.istr * string * int) ; value compare (_, s1, i1) (_, s2, i2) = let comp_s = Pervasives.compare s1 s2 in if comp_s = 0 then Pervasives.compare i1 i2 else comp_s ; end) ; module PersMap = Map.Make (struct type t = int; value compare = compare; end) ; module PersSet = Set.Make (struct type t = person; value compare p1 p2 = let i1 = Adef.int_of_iper (get_key_index p1) in let i2 = Adef.int_of_iper (get_key_index p2) in Pervasives.compare i1 i2; end) ; module StringSet = Set.Make (struct type t = string; value compare = compare; end) ; type fun_data_p_f = [ Person of person -> istr | Family of family -> istr ] ; (* ******************************************************************** *) (* [Fonc] get_data : config -> (string * fun x -> istr) list * bool *) (** [Description] : Renvoie la liste des labels et fonctions pour récupérer les données que l'on veut modifier. [Args] : - conf : configuration [Retour] : - (string * fun x -> istr) list * bool : La liste des données que l'on souhaite modifier ainsi qu'un boolean pour savoir s'il faut tester la famille. [Rem] : Non exporté en clair hors de ce module. *) (* ******************************************************************** *) value get_data conf = match p_getenv conf.env "data" with [ Some "occu" -> ([ ("occu", Person get_occupation) ], False) | Some "place" -> ([ ("bi", Person get_birth_place); ("bp", Person get_baptism_place); ("de", Person get_death_place); ("bu", Person get_burial_place); ("ma", Family get_marriage_place) ], True) | Some "src" -> ([ ("bi", Person get_birth_src); ("bp", Person get_baptism_src); ("de", Person get_death_src); ("bu", Person get_burial_src); ("p", Person get_psources); ("ma", Family get_marriage_src); ("f", Family get_fsources) ], True) | _ -> ([], False) ] ; (* ******************************************************************** *) (* [Fonc] get_all_data : config -> base -> DataSet.elt list *) (** [Description] : Construit la liste de toutes les données de la base que l'on veut modifier et leur associe une clé unique. [Args] : - conf : configuration - base : base [Retour] : - (Gwdb.istr * int) list : La liste sans doublon de toutes les sources de la base avec leur clé. [Rem] : Non exporté en clair hors de ce module. *) (* ******************************************************************** *) value get_all_data conf base = do { let data_set = ref DataSet.empty in let (data, test_family) = get_data conf in (* Ajoute toutes les "data" liés à un individu *) let rec loop i = if i = nb_of_persons base then () else do { let p = pget conf base (Adef.iper_of_int i) in List.iter (fun (label, fun_data) -> match fun_data with [ Person fun_data -> let istr = fun_data p in if not (is_empty_string istr) then data_set.val := DataSet.add (istr, label, Hashtbl.hash istr) data_set.val else () | _ -> () ] ) data; loop (i+1) } in loop 0; (* Ajoute toutes les "data" liés à une famille *) if test_family then let rec loop i = if i = nb_of_families base then () else do { let fam = foi base (Adef.ifam_of_int i) in if is_deleted_family fam then () else List.iter (fun (label, fun_data) -> match fun_data with [ Family fun_data -> let istr = fun_data fam in if not (is_empty_string istr) then data_set.val := DataSet.add (istr, label, Hashtbl.hash istr) data_set.val else () | _ -> () ] ) data; loop (i+1) } in loop 0 else (); DataSet.elements data_set.val } ; (* ************************************************************************** *) (* [Fonc] get_person_from_data : config -> base -> (Gwdb.istr * PersSet.elt list) list *) (** [Description] : Construit a partir de la clé d'une donnée, l'ensemble des personnes en relation avec cette donnée. [Args] : - conf : configuration - base : base [Retour] : - (Gwdb.istr * person list) : retourne la liste des adresses des données ainsi que la liste des personnes en relation avec cette donnée. [Rem] : Non exporté en clair hors de ce module. *) (* ************************************************************************** *) value get_person_from_data conf base = do { let (data, test_family) = get_data conf in let env_keys = let list = List.map fst data in List.map (fun key -> match p_getint conf.env key with [ Some hash -> (key, hash) | None -> (key, (-1)) ] ) list in let pers_map = ref PersMap.empty in (* Fonction d'ajout dans la map des personnes (PersMap). *) (* k = key, istr = data, p = person. *) (* A la clé k est associé le binding (istr, ensemble d'individu) *) let map_add k istr p = try let (istr, set) = PersMap.find k pers_map.val in let set = PersSet.add p set in pers_map.val := PersMap.add k (istr, set) pers_map.val with [ Not_found -> let set = PersSet.add p PersSet.empty in pers_map.val := PersMap.add k (istr, set) pers_map.val ] in (* Parcours tous les individus et ajoute dans la map les *) (* individus en relation avec la "data" donné par la clé k. *) let rec loop i = if i = nb_of_persons base then () else do { let p = pget conf base (Adef.iper_of_int i) in List.iter (fun (label, fun_data) -> match fun_data with [ Person fun_data -> let istr = fun_data p in let hash_istr = Hashtbl.hash istr in let key = List.assoc label env_keys in if not (is_empty_string istr) && (hash_istr = key) then map_add key istr p else () | _ -> () ] ) data; loop (i+1) } in loop 0; (* Parcours toutes les familles et ajoute dans la map les *) (* individus en relation avec la "data" donnée par la clé k. *) if test_family then let rec loop i = if i = nb_of_families base then () else do { let fam = foi base (Adef.ifam_of_int i) in if is_deleted_family fam then () else do { List.iter (fun (label, fun_data) -> match fun_data with [ Family fun_data -> let istr = fun_data fam in let hash_istr = Hashtbl.hash istr in let key = List.assoc label env_keys in if not (is_empty_string istr) && (hash_istr = key) then do { let p = pget conf base (get_father fam) in map_add key istr p; let p = pget conf base (get_mother fam) in map_add key istr p } else () | _ -> () ] ) data; }; loop (i+1) } in loop 0 else (); (* On retourne la liste des couples ("data", persons list) *) let list = ref [] in PersMap.iter (fun hash (istr, pset) -> list.val := [ (istr, PersSet.elements pset) :: list.val ] ) pers_map.val ; list.val } ; (* ************************************************************************** *) (* [Fonc] combine_by_ini : string -> (string * 'a * 'b) list -> (string * ('a * 'b) list) list *) (** [Description] : Retourne une liste en recombinant toutes les chaines en fonction de leur début de chaîne. [Args] : - ini : les premières lettres de la chaîne - list : la liste composée des premières lettres de la chaîne, 'a, 'b [Retour] : - (string * ('a * 'b) list) list [Rem] : Non exporté en clair hors de ce module. *) (* ************************************************************************** *) value combine_by_ini ini list = let list = loop [] list where rec loop new_list = fun [ [] -> new_list | [(k, s, cnt) :: list] -> do { let ini_k = if String.length k > String.length ini then String.sub k 0 (index_of_next_char k (String.length ini)) else k ^ String.make (String.length ini + 1 - String.length k) '_' in for i = 0 to String.length ini_k - 1 do { if ini_k.[i] = ' ' then Bytes.set ini_k i '_' else () }; let new_list = if ini_k = "_" then new_list else match new_list with [ [] -> [(ini_k, [(s, cnt)])] | [(ini_k1, l) :: ll] -> if ini_k1 = ini_k then [(ini_k1, [(s, cnt) :: l]) :: ll] else [(ini_k, [(s, cnt)]); (ini_k1, l) :: ll] ] in loop new_list list } ] in List.fold_left (fun new_l (ini_k, l) -> [(ini_k, l) :: new_l]) [] list ; (* ************************************************************************** *) (* [Fonc] combine : ('a * 'b * 'c) list -> ('a * ('b * 'c) list) list *) (** [Description] : [Args] : - list : la liste de triplets [Retour] : - ('a * ('b * 'c) list) list [Rem] : Non exporté en clair hors de ce module. *) (* ************************************************************************** *) value combine list = let list = loop [] list where rec loop new_list = fun [ [] -> new_list | [(k, s, cnt) :: list] -> do { let new_list = match new_list with [ [] -> [(k, [(s, cnt)])] | [(ini_k1, l) :: ll] -> if ini_k1 = k then [(ini_k1, [(s, cnt) :: l]) :: ll] else [(k, [(s, cnt)]); (ini_k1, l) :: ll] ] in loop new_list list } ] in List.fold_left (fun new_l (ini_k, l) -> [(ini_k, l) :: new_l]) [] list ; (* ************************************************************************** *) (* [Fonc] translate_title : config -> string * string *) (** [Description] : Affiche le titre du dictionnaire [Args] : - conf : configuration [Retour] : - string : le nom du dictionnaire [Rem] : Non exporté en clair hors de ce module. *) (* ************************************************************************** *) value translate_title conf = let title = match p_getenv conf.env "data" with [ Some "occu" -> transl_nth conf "occupation/occupations" 1 | Some "place" -> transl conf "places" | Some "src" -> transl_nth conf "source/sources" 1 | _ -> "" ] in (Printf.sprintf (ftransl conf "book of %s") title, title) ; (* ************************************************************************** *) (* [Fonc] print_title : config -> base -> string -> int -> unit *) (** [Description] : Affiche le titre du dictionnaire en fonction de data et de la longueur de la liste [Args] : - conf : configuration - base : base - ini : les premières lettres de la source - len : le nombre de sources commençant par ini [Retour] : Néant [Rem] : Non exporté en clair hors de ce module. *) (* ************************************************************************** *) value print_title conf base ini len = do { let (book_of, title) = translate_title conf in Wserver.wprint "%s" (capitale book_of); if ini = "" then Wserver.wprint " (%d %s)" len title else do { Wserver.wprint " - "; Wserver.wprint (fcapitale (ftransl conf "%d %s starting with %s")) len title ini } }; (* ************************************************************************** *) (* [Fonc] print_long : config -> base -> (string * (string * int) list) list -> int -> unit *) (** [Description] : Affiche le tableau des "data" en leur associant une clé unique afin de pouvoir mettre un champs de modification. [Args] : - conf : configuration - base : base - list : liste de couple (data, (type (= bi, occu ...) * clé) list) - len : la longueur de la liste [Retour] : Néant [Rem] : Non exporté en clair hors de ce module. *) (* ************************************************************************** *) value print_long conf base list len = let env_keys = let list = ref [] in let keys = List.map fst (fst (get_data conf)) in let _ = List.map (fun key -> match p_getint conf.env key with [ Some hash -> list.val := [ (key, hash) :: list.val ] | None -> () ] ) keys in List.sort (fun (s1, _) (s2, _) -> compare s1 s2) list.val in let data = match p_getenv conf.env "data" with [ Some s -> s | None -> "" ] in let ini = match p_getenv conf.env "s" with [ Some s -> s | None -> "" ] in (* Construit à partir de la liste de (src * hash) la liste dont *) (* le premier composant est les premières lettres de la sources. *) (* Attention, il ne faut pas faire String.length ini + 1 parce qu'en *) (* utf8, il se peut que le caractère soit codé sur plusieurs octets. *) let list = List.map (fun (s, k) -> let ini = if String.length s > String.length ini then String.sub s 0 (index_of_next_char s (String.length ini)) else ini in (ini, s, k)) list in (* Re-combine la liste en fonction des premières *) (* lettres afin de pouvoir poser des ancres. *) let list = combine_by_ini ini list in (* Astuce pour gérer les espaces. *) let list = List.map (fun (ini, l) -> (Mutil.tr ' ' '_' ini, l)) list in let list = List.sort (fun (ini1, _) (ini2,_) -> Gutil.alphabetic_order ini1 ini2) list in do { let title _ = print_title conf base (Mutil.tr '_' ' ' ini) len in Hutil.header conf title; print_link_to_welcome conf True; tag "div" "class=\"tips\"" begin tag "table" begin tag "tr" begin tag "td" begin Wserver.wprint "%s" (capitale (transl conf "help modify data")) ; end; end; end; end; xtag "br"; (* Ancre en haut de page afin de naviguer plus facilement. *) tag "table" "class=\"display_search\"" begin stag "tr" begin List.iter (fun (ini, _) -> stag "td" begin stagn "a" "href=\"#%s\"" ini begin Wserver.wprint "%s" (no_html_tags ini); end; end) list; end; end; xtag "br"; tag "form" "method=\"post\" action=\"%s\"" conf.command begin tag "ul" begin List.iter (fun (ini_k, list) -> do { tag "li" begin stagn "a" "id=\"%s\"" ini_k begin Wserver.wprint "%s" (no_html_tags ini_k); end; tag "ul" "class=\"mod_data_ul\"" begin let list = List.sort (fun (s1, _) (s2, _) -> Gutil.alphabetic_order s1 s2) list in List.iter (fun (s, k) -> do { let k = List.sort (fun (s1, _) (s2, _) -> compare s1 s2) k in tag "li" begin if k <> env_keys then let k = List.fold_left (fun accu (k, i) -> accu ^ k ^ "=" ^ (string_of_int i) ^ ";") "" k in stag "a" "href=\"%sm=MOD_DATA;data=%s;%s;s=%s#mod\"" (commd conf) data k (code_varenv ini) begin Wserver.wprint "%s" (quote_escaped s); end else tag "table" "class=\"mod_data_table\"" begin tag "tr" begin tag "td" begin Wserver.wprint " "; (* envoie les données de façon masquée *) Util.hidden_env conf; List.iter (fun (s,i) -> xtag "input" "type=\"hidden\" name=\"%s\" value=\"%d\"" s i ) env_keys ; xtag "input" "type=\"hidden\" name=\"m\" value=\"MOD_DATA_OK\"" ; xtag "input" "type=\"hidden\" name=\"data\" value=\"%s\"" data; xtag "input" "type=\"hidden\" name=\"s\" value=\"%s\"" ini; xtag "input" "type=\"text\" name=\"nx_input\" size=\"80\" maxlength=\"%d\" value=\"%s\" id=\"nx_input\"" (if data = "src" then 300 else 200) (quote_escaped (only_printable s)) ; end; tag "td" begin xtag "input" "type=\"submit\" value=\"Ok\"" ; end; end; end; end; } ) list; end; end; } ) list; end; end; Hutil.trailer conf ; } ; (* ************************************************************************* *) (* [Fonc] print_short : config -> base -> (string * 'a) list -> int -> unit *) (** [Description] : Si le nombre de "data" est trop grand, on affiche les premières lettres de chaque "data". [Args] : - conf : configuration - base : base - list : la liste des "data" - len : la longueur de la liste [Retour] : Néant [Rem] : Non exporté en clair hors de ce module. *) (* ************************************************************************* *) value print_short conf base list len = let data = match p_getenv conf.env "data" with [ Some s -> s | None -> "" ] in let ini = match p_getenv conf.env "s" with [ Some s -> s | None -> "" ] in (* Construit la liste des string commençant par ini. *) (* Pour certaines données comme les sources, on peut *) (* avoir beaucoup de sources qui commencent par les *) (* mêmes lettres. On calcul alors à partir de quelle *) (* lettre de ini, les sources sont différentes. *) (* ex: eta -> etat -> etat_ -> ... -> etat_civil *) let rec build_ini l len = (* Attention, il ne faut pas faire String.length *) (* ini + 1 parce qu'en utf8, il se peut que le *) (* caractère soit codé sur plusieurs octets. *) let ini_list = List.rev_map (fun (s, _) -> if String.length s > len then String.sub s 0 (index_of_next_char s len) else s ^ String.make (len + 1 - String.length s) '_') l in (* Fonction pour supprimer les doublons. *) let remove_dup list = StringSet.elements (List.fold_left (fun accu ini -> StringSet.add ini accu) StringSet.empty list) in (* Astuce pour gérer les espaces. *) let ini_list = List.rev_map (fun p -> Mutil.tr ' ' '_' p) ini_list in let ini_list = remove_dup ini_list in (* Si la liste des ini n'a qu'un élément, on calcul on 'rang' d'après *) if List.length ini_list = 1 then build_ini list (len + 1) else List.sort Gutil.alphabetic_order ini_list in let ini_list = build_ini list (String.length ini) in do { let title _ = print_title conf base (Mutil.tr '_' ' ' ini) len in Hutil.header conf title; print_link_to_welcome conf True; Wserver.wprint "%s :" (capitale (transl conf "select a letter")); tag "p" "class=\"list_ini\"" begin List.iter (fun s -> stagn "a" "href=\"%sm=MOD_DATA;data=%s;s=%s\"" (commd conf) data (code_varenv s) begin Wserver.wprint "%s" (no_html_tags s); end) ini_list; end; Hutil.trailer conf } ; value max_results = 1000 ; (* ********************************************************************* *) (* [Fonc] print_mod : config -> base -> unit *) (** [Description] : Récupère la liste de toutes les "données" de la base et en fonction du nombre de résultats, fait un affichage court ou un afficahge long. [Args] : - conf : configuration - base : base [Retour] : Néant [Rem] : Non exporté en clair hors de ce module. *) (* ********************************************************************* *) value print_mod_old conf base = (* Paramètre pour savoir par quoi commence la chaine. *) let ini = match p_getenv conf.env "s" with [ Some s -> s | None -> "" ] in (* Astuce pour gérer les espaces. *) let ini = Mutil.tr '_' ' ' ini in let list = get_all_data conf base in (* On fait un rev_map (tail-rec) parce que si le nombre de *) (* données est trop important, on casser la pile d'appels. *) let list = List.rev_map (fun (istr, s, k) -> (sou base istr, s, k)) list in (* On tri la liste avant de la combiner *) (* sinon on n'élimine pas les doublons. *) let list = List.sort (fun (s1, _, _) (s2, _, _) -> compare s1 s2) list in (* On combine la liste parce qu'en gwc2, les données peuvent être à *) (* des adresses différentes. NB: on pourrait rassembler les lieux et *) (* les sources dans un seul index pour de meilleures performances. *) let list = combine list in (* Fonction qui à une liste de données retourne la *) (* liste de toutes les données commençant par ini. *) let reduce l = List.fold_left (fun acc (data, k) -> let data_tmp = Mutil.tr '_' ' ' data in if Mutil.start_with ini data_tmp || (data_tmp ^ " " = ini) then [ (data, k) :: acc ] else acc ) [] l in let list = if ini <> "" then reduce list else list in let len = List.length list in if len > max_results then print_short conf base list len else print_long conf base list len ; (* ************************************************************************** *) (* [Fonc] reduce_cpl_list : int -> ('a, 'b list) list -> ('a, 'b list) list *) (** [Description] : Retourne la sous liste telle que la somme des longueurs des ('b list) soit égale à size. [Args] : - size : la taille de la liste retournée - list : la liste originale [Retour] : - list : la nouvelle liste dont la somme des ('b list) est égale à size [Rem] : Non exporté en clair hors de ce module. *) (* ************************************************************************** *) value reduce_cpl_list size list = let rec loop size cnt reduced_list list = if cnt >= size then reduced_list else match list with [ [] -> reduced_list | [(a, sl) :: l] -> if List.length sl >= (size - cnt) then [(a, Util.reduce_list (size - cnt) sl) :: reduced_list] else loop size (cnt + List.length sl) [(a,sl) :: reduced_list] l ] in loop size 0 [] list ; (* ************************************************************************** *) (* [Fonc] update_person : conf -> base -> string -> string -> person -> gen_person iper istr *) (** [Description] : Met à jour le/les champ(s) de la personne. [Args] : - conf : configuration de la base - base : base de donnée - old : l'ancien contenu - new_input : le nouveau contenu - p : person [Retour] : - gen_person iper istr : gen_person avec les champs modifiés [Rem] : Non exporté en clair hors de ce module. *) (* ************************************************************************** *) value update_person conf base old new_input p = match p_getenv conf.env "data" with [ Some "occu" -> let new_istr = Gwdb.insert_string base (only_printable new_input) in let occupation = get_occupation p in let s_occupation = sou base occupation in let occupation = if old = s_occupation then new_istr else occupation in { (gen_person_of_person p) with occupation = occupation } | Some "place" -> let new_istr = Gwdb.insert_string base (no_html_tags (only_printable new_input)) in let pl_bi = get_birth_place p in let s_bi = sou base pl_bi in let pl_bp = get_baptism_place p in let s_bp = sou base pl_bp in let pl_de = get_death_place p in let s_de = sou base pl_de in let pl_bu = get_burial_place p in let s_bu = sou base pl_bu in let birth_place = if old = s_bi then new_istr else pl_bi in let baptism_place = if old = s_bp then new_istr else pl_bp in let death_place = if old = s_de then new_istr else pl_de in let burial_place = if old = s_bu then new_istr else pl_bu in { (gen_person_of_person p) with birth_place = birth_place; baptism_place = baptism_place; death_place = death_place; burial_place = burial_place } | Some "src" -> let new_istr = Gwdb.insert_string base (only_printable new_input) in let src_bi = get_birth_src p in let s_bi = sou base src_bi in let src_bp = get_baptism_src p in let s_bp = sou base src_bp in let src_de = get_death_src p in let s_de = sou base src_de in let src_bu = get_burial_src p in let s_bu = sou base src_bu in let src_p = get_psources p in let s_p = sou base src_p in let birth_src = if old = s_bi then new_istr else src_bi in let baptism_src = if old = s_bp then new_istr else src_bp in let death_src = if old = s_de then new_istr else src_de in let burial_src = if old = s_bu then new_istr else src_bu in let psources_src = if old = s_p then new_istr else src_p in { (gen_person_of_person p) with birth_src = birth_src; baptism_src = baptism_src; death_src = death_src; burial_src = burial_src; psources = psources_src } | _ -> gen_person_of_person p ] ; (* ************************************************************************** *) (* [Fonc] update_family : conf -> base -> string -> string -> person -> gen_family ifam istr *) (** [Description] : Met à jour le/les champ(s) de la famille. [Args] : - conf : configuration de la base - base : base de donnée - old : l'ancien contenu - new_input : le nouveau contenu - fam : family [Retour] : - gen_family ifam istr : gen_family avec les champs modifiés [Rem] : Non exporté en clair hors de ce module. *) (* ************************************************************************** *) value update_family conf base old new_istr fam = match p_getenv conf.env "data" with [ Some "place" -> let new_istr = Gwdb.insert_string base (no_html_tags (only_printable new_istr)) in let p_ma = get_marriage_place fam in let s_ma = sou base p_ma in let marriage_place = if old = s_ma then new_istr else p_ma in { (gen_family_of_family fam) with marriage_place = marriage_place } | Some "src" -> let new_istr = Gwdb.insert_string base (only_printable new_istr) in let src_ma = get_marriage_src fam in let s_ma = sou base src_ma in let src_f = get_fsources fam in let s_f = sou base src_f in let marriage_src = if old = s_ma then new_istr else src_ma in let fsources = if old = s_f then new_istr else src_f in { (gen_family_of_family fam) with marriage_src = marriage_src; fsources = fsources } | _ -> gen_family_of_family fam ] ; (* ********************************************************************** *) (* [Fonc] update_person_list : config -> base -> string -> (string * person) list -> int -> int -> unit *) (** [Description] : [Args] : - conf : configuration - base : base - new_input : le nouveau contenu - list : la liste des (clé, person list) - nb_pers : le nombre de personnes concernées par la mise à jour - max_updates = le nombre maximum de persons que l'on met à jour [Retour] : - unit [Rem] : Non exporté en clair hors de ce module. *) (* ********************************************************************** *) value update_person_list conf base new_input list nb_pers max_updates = do { let (_, test_family) = get_data conf in let action = match p_getenv conf.env "data" with [ Some "occu" -> "co" | Some "place" -> "cp" | Some "src" -> "cs" | _ -> "" ] in let list = if nb_pers > max_updates then reduce_cpl_list max_updates list else list in List.iter (fun (old, perl) -> do { (* Mise à jour de toutes les personnes concernées. *) List.iter (fun p -> do { let np = update_person conf base old new_input p in patch_person base np.key_index np; if test_family then let fam = Array.to_list (get_family p) in List.iter (fun ifam -> let fam = foi base ifam in let nfam = update_family conf base old new_input fam in patch_family base nfam.fam_index nfam) fam else (); (* On met aussi à jour l'historique. *) let changed = U_Multi (Util.string_gen_person base np) in History.record conf base changed action; } ) perl } ) list; Util.commit_patches conf base; (* On appelle explicitement notify_change car la base est modifiée. *) (* On fait cet appel à la fin de chaque mise à jour de la liste des *) (* personnes, car si l'administrateur de la base ne modifie pas tous *) (* les évènements liés à cette donnée, on ne sera pas mis au courant *) (* que la base à été mise à jour. *) History.notify conf base action; } ; (* ******************************************************************** *) (* [Fonc] print_mod_ok : config -> base -> unit *) (** [Description] : Met à jour toutes les personnes en relation avec la donnée que l'on veut modifié. [Args] : - conf : configuration - base : base [Retour] : - unit [Rem] : Non exporté en clair hors de ce module. *) (* ******************************************************************** *) value print_mod_ok conf base = do { let data = match p_getenv conf.env "data" with [ Some s -> s | None -> "" ] in let ini = match p_getenv conf.env "s" with [ Some s -> s | None -> "" ] in let env_keys = let list = ref [] in let keys = List.map fst (fst (get_data conf)) in let _ = List.map (fun key -> match p_getint conf.env key with [ Some hash -> list.val := [ (key, hash) :: list.val ] | None -> () ] ) keys in List.sort (fun (s1, _) (s2, _) -> compare s1 s2) list.val in let new_input = match p_getenv conf.env "nx_input" with [ Some s -> only_printable s | None -> "" ] in let list = get_person_from_data conf base in let list = List.map (fun (istr, perl) -> (sou base istr, perl)) list in let nb_pers = List.fold_left (fun accu (_, perl) -> accu + List.length perl) 0 list in let data_modified = List.for_all (fun (old, _) -> new_input <> old) list in (* Indication : 1000 fiches prend environ 1 seconde de traitement. *) (* Attention à ne pas mettre une limite trop grande (d'où le test) *) (* pour ne pas dépasser le time out du serveur. *) let max_updates = match p_getint conf.base_env "max_nb_update" with [ Some n -> if n > 50000 then 5000 else n | _ -> 5000 ] in if nb_pers <> 0 && data_modified then do { update_person_list conf base new_input list nb_pers max_updates; let title _ = Wserver.wprint "%s" (capitale (transl conf "modification successful")) in Hutil.header conf title; print_link_to_welcome conf True; tag "p" begin (* En attendant mieux ... *) Wserver.wprint "%s: %d " (capitale (transl conf "modification successful")) (min nb_pers max_updates); if p_getenv conf.base_env "history" = Some "yes" then stag "a" "href=\"%sm=HIST;k=20\"" (commd conf) begin Wserver.wprint "%s." (transl_nth conf "modification/modifications" (if nb_pers > 1 then 1 else 0)); end else Wserver.wprint "%s." (transl_nth conf "modification/modifications" (if nb_pers > 1 then 1 else 0)); end; if nb_pers > max_updates then do { tag "form" "method=\"post\" action=\"%s\"" conf.command begin tag "p" begin Util.hidden_env conf; List.iter (fun (s,i) -> xtag "input" "type=\"hidden\" name=\"%s\" value=\"%d\"" s i) env_keys ; xtag "input" "type=\"hidden\" name=\"m\" value=\"MOD_DATA_OK\"" ; xtag "input" "type=\"hidden\" name=\"data\" value=\"%s\"" data; xtag "input" "type=\"hidden\" name=\"s\" value=\"%s\"" ini; xtag "input" "type=\"hidden\" name=\"nx_input\" size=\"80\" maxlength=\"200\" value=\"%s\" id=\"data\"" (quote_escaped (only_printable new_input)); Wserver.wprint "%s" (capitale (transl conf "continue correcting")) ; xtag "input" "type=\"submit\" value=\"Ok\"" ; end; end } else (); tag "p" begin stag "a" "href=\"%sm=MOD_DATA;data=%s;s=%s\"" (commd conf) data ini begin Wserver.wprint "%s" (capitale (transl conf "new modification")); end; end; Hutil.trailer conf } else do { let title _ = Wserver.wprint "%s" (capitale (transl conf "no modification")) in Hutil.header conf title; print_link_to_welcome conf True; tag "p" begin stag "a" "href=\"%sm=MOD_DATA;data=%s;s=%s\"" (commd conf) data ini begin Wserver.wprint "%s" (capitale (transl conf "new modification")); end; end; Hutil.trailer conf } }; (**/**) (* template *) (* ********************************************************************* *) (* [Fonc] build_list : config -> base -> (string * (string * int) list) list *) (** [Description] : Récupère la liste de toutes les "données" de la base. [Args] : - conf : configuration - base : base [Retour] : Retourne la liste des données [Rem] : Non exporté en clair hors de ce module. *) (* ********************************************************************* *) value build_list conf base = (* Paramètre pour savoir par quoi commence la chaine. *) let ini = match p_getenv conf.env "s" with [ Some s -> s | None -> "" ] in (* Astuce pour gérer les espaces. *) let ini = Mutil.tr '_' ' ' ini in let list = get_all_data conf base in (* ! rev_map = tail-rec ! *) let list = List.rev_map (fun (istr, s, k) -> (sou base istr, s, k)) list in (* On tri la liste avant de la combiner *) (* sinon on n'élimine pas les doublons. *) let list = List.sort (fun (s1, _, _) (s2, _, _) -> compare s1 s2) list in (* On combine la liste parce qu'en gwc2, les données peuvent être à *) (* des adresses différentes. NB: on pourrait rassembler les lieux et *) (* les sources dans un seul index pour de meilleures performances. *) let list = combine list in (* Fonction qui à une liste de données retourne la *) (* liste de toutes les données commençant par ini. *) let reduce l = List.fold_left (fun acc (data, k) -> let data_tmp = Mutil.tr '_' ' ' data in if Mutil.start_with ini data_tmp || (data_tmp ^ " " = ini) then [ (data, k) :: acc ] else acc ) [] l in if ini <> "" then reduce list else list ; (* ************************************************************************* *) (* [Fonc] build_list_short : config -> base -> (string * 'a) list -> string list *) (** [Description] : [Args] : - conf : configuration - base : base - list : la liste des "data" [Retour] : Néant [Rem] : Non exporté en clair hors de ce module. *) (* ************************************************************************* *) value build_list_short conf base list = let ini = match p_getenv conf.env "s" with [ Some s -> s | None -> "" ] in (* Construit la liste des string commençant par ini. *) (* Pour certaines données comme les sources, on peut *) (* avoir beaucoup de sources qui commencent par les *) (* mêmes lettres. On calcul alors à partir de quelle *) (* lettre de ini, les sources sont différentes. *) (* ex: eta -> etat -> etat_ -> ... -> etat_civil *) let rec build_ini l len = (* Attention, il ne faut pas faire String.length *) (* ini + 1 parce qu'en utf8, il se peut que le *) (* caractère soit codé sur plusieurs octets. *) let ini_list = List.rev_map (fun (s, _) -> if String.length s > len then String.sub s 0 (index_of_next_char s len) else s ^ String.make (len + 1 - String.length s) '_') l in (* Fonction pour supprimer les doublons. *) let remove_dup list = StringSet.elements (List.fold_left (fun accu ini -> StringSet.add ini accu) StringSet.empty list) in (* Astuce pour gérer les espaces. *) let ini_list = List.rev_map (fun p -> Mutil.tr ' ' '_' p) ini_list in let ini_list = remove_dup ini_list in (* Si la liste des ini n'a qu'un élément, on calcul on 'rang' d'après *) if List.length ini_list = 1 then build_ini list (len + 1) else List.sort Gutil.alphabetic_order ini_list in build_ini list (String.length ini) ; (* ************************************************************************* *) (* [Fonc] build_list_long : config -> base -> (string * 'a) list -> (string * (string * 'a) list) list *) (** [Description] : [Args] : - conf : configuration - base : base - list : la liste des "data" [Retour] : La liste des couples (initiale de "data", "data") [Rem] : Non exporté en clair hors de ce module. *) (* ************************************************************************* *) value build_list_long conf base list = let ini = match p_getenv conf.env "s" with [ Some s -> s | None -> "" ] in (* Construit à partir de la liste de (src * hash) la liste dont *) (* le premier composant est les premières lettres de la sources. *) (* Attention, il ne faut pas faire String.length ini + 1 parce qu'en *) (* utf8, il se peut que le caractère soit codé sur plusieurs octets. *) let list = List.map (fun (s, k) -> let ini = if String.length s > String.length ini then String.sub s 0 (index_of_next_char s (String.length ini)) else ini in (ini, s, k)) list in (* Re-combine la liste en fonction des premières *) (* lettres afin de pouvoir poser des ancres. *) let list = combine_by_ini ini list in (* Astuce pour gérer les espaces. *) let list = List.map (fun (ini, l) -> (Mutil.tr ' ' '_' ini, l)) list in List.sort (fun (ini1, _) (ini2,_) -> Gutil.alphabetic_order ini1 ini2) list ; type env 'a = [ Vlist_data of list (string * list (string * int)) | Vlist_ini of list string | Vlist_value of list (string * list (string * int)) | Venv_keys of list (string * int) | Vint of int | Vstring of string | Vother of 'a | Vnone ] ; value get_env v env = try List.assoc v env with [ Not_found -> Vnone ]; value get_vother = fun [ Vother x -> Some x | _ -> None ]; value set_vother x = Vother x; value bool_val x = VVbool x; value str_val x = VVstring x; value rec eval_var conf base env xx loc sl = try eval_simple_var conf base env xx sl with [ Not_found -> eval_compound_var conf base env xx sl ] and eval_simple_var conf base env xx = fun [ [s] -> try bool_val (eval_simple_bool_var conf base env xx s) with [ Not_found -> str_val (eval_simple_str_var conf base env xx s) ] | _ -> raise Not_found ] and eval_simple_bool_var conf base env xx = fun [ "is_modified" -> let k = match get_env "keys" env with [ Venv_keys k -> k | _ -> [] ] in let env_keys = match get_env "env_keys" env with [ Venv_keys env_keys -> env_keys | _ -> [] ] in k = env_keys | _ -> raise Not_found ] and eval_simple_str_var conf base env xx = fun [ "entry_ini" -> eval_string_env "entry_ini" env | "entry_value" -> eval_string_env "entry_value" env | "ini" -> eval_string_env "ini" env | "keys" -> let k = match get_env "keys" env with [ Venv_keys k -> k | _ -> [] ] in List.fold_left (fun accu (k, i) -> accu ^ k ^ "=" ^ (string_of_int i) ^ ";") "" k | "key_name" -> eval_string_env "key_name" env | "key_value" -> eval_int_env "key_value" env | "nb_results" -> match get_env "list" env with [ Vlist_data l -> string_of_int (List.length l) | _ -> "0" ] | "title" -> let len = match get_env "list" env with [ Vlist_data l -> List.length l | _ -> 0 ] in let ini = match p_getenv conf.env "s" with [ Some s -> s | None -> "" ] in let (book_of, title) = translate_title conf in let result = if ini = "" then Printf.sprintf " (%d %s)" len title else " - " ^ Printf.sprintf (ftransl conf "%d %s starting with %s") len title ini in (capitale book_of) ^ result | _ -> raise Not_found ] and eval_compound_var conf base env xx sl = let rec loop = fun [ [s] -> eval_simple_str_var conf base env xx s | ["evar"; s] -> match p_getenv conf.env s with [ Some s -> s | None -> "" ] | ["encode" :: sl] -> code_varenv (loop sl) | ["escape" :: sl] -> quote_escaped (loop sl) | ["html_encode" :: sl] -> no_html_tags (loop sl) | ["printable" :: sl] -> only_printable (loop sl) | _ -> raise Not_found ] in str_val (loop sl) and eval_string_env s env = match get_env s env with [ Vstring s -> s | _ -> raise Not_found ] and eval_int_env s env = match get_env s env with [ Vint i -> string_of_int i | _ -> raise Not_found ] ; value print_foreach conf base print_ast eval_expr = let rec print_foreach env xx loc s sl el al = match [s :: sl] with [ ["initial"] -> print_foreach_initial env xx el al | ["entry"] -> print_foreach_entry env xx el al | ["value"] -> print_foreach_value env xx el al | ["env_keys"] -> print_foreach_env_keys env xx el al | _ -> raise Not_found ] and print_foreach_entry env xx el al = let env_keys = let keys = List.map fst (fst (get_data conf)) in let list = List.fold_left (fun accu key -> match p_getint conf.env key with [ Some hash -> [(key, hash) :: accu] | None -> accu ] ) [] keys in List.sort (fun (s1, _) (s2, _) -> compare s1 s2) list in let list = match get_env "list" env with [ Vlist_data l -> l | _ -> [] ] in let list = build_list_long conf base list in let env = [("env_keys", Venv_keys env_keys) :: env] in loop list where rec loop = fun [ [(ini_k, list_v) :: l] -> let env = [("entry_ini", Vstring ini_k); ("list_value", Vlist_value list_v) :: env] in do { List.iter (print_ast env xx) al; loop l } | [] -> () ] and print_foreach_value env xx el al = let list = match get_env "list_value" env with [ Vlist_value l -> List.sort (fun (s1, _) (s2, _) -> Gutil.alphabetic_order s1 s2) l | _ -> [] ] in loop list where rec loop = fun [ [(s, k) :: l] -> let k = List.sort (fun (s1, _) (s2, _) -> compare s1 s2) k in let env = [("entry_value", Vstring s); ("keys", Venv_keys k) :: env] in do { List.iter (print_ast env xx) al; loop l } | [] -> () ] and print_foreach_initial env xx el al = let list = match get_env "list" env with [ Vlist_data l -> l | _ -> [] ] in let ini_list = build_list_short conf base list in loop ini_list where rec loop = fun [ [ini :: l] -> let env = [("ini", Vstring ini) :: env] in do { List.iter (print_ast env xx) al; loop l } | [] -> () ] and print_foreach_env_keys env xx el al = let env_keys = match get_env "env_keys" env with [ Venv_keys env_keys -> env_keys | _ -> [] ] in loop env_keys where rec loop = fun [ [(s, i) :: l] -> let env = [("key_name", Vstring s); ("key_value", Vint i) :: env] in do { List.iter (print_ast env xx) al; loop l } | [] -> () ] in print_foreach ; value print_mod conf base = (* Pas forcément nécessaire mais bon ... On pourra faire le ménage après. *) if p_getenv conf.env "old" = Some "on" then print_mod_old conf base else match p_getenv conf.env "data" with [ Some ("place" | "src" | "occu") -> let list = build_list conf base in let env = [("list", Vlist_data list)] in Hutil.interp conf base "upddata" {Templ.eval_var = eval_var conf base; Templ.eval_transl _ = Templ.eval_transl conf; Templ.eval_predefined_apply _ = raise Not_found; Templ.get_vother = get_vother; Templ.set_vother = set_vother; Templ.print_foreach = print_foreach conf base} env () | _ -> Hutil.interp conf base "upddatamenu" {Templ.eval_var _ = raise Not_found; Templ.eval_transl _ = Templ.eval_transl conf; Templ.eval_predefined_apply _ = raise Not_found; Templ.get_vother = get_vother; Templ.set_vother = set_vother; Templ.print_foreach _ = raise Not_found} [] () ] ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/gwc2.ml0000660000175200017530000001746712664543647022423 0ustar guillaumeguillaume(* camlp5r ./pa_lock.cmo *) (* $Id: gwc2.ml,v 5.68 2008-01-15 11:06:04 ddr Exp $ *) (* Copyright (c) 2006-2007 INRIA *) open Gwcomp; open Printf; (* ******************************************************************** *) (* [Fonc] check_magic : string -> in_channel -> unit *) (** [Description] : Vérifie le header du fichier passé en paramètre tel que défini par magic_gwo [Args] : - fname : nom du fichier. - ic : descripteur du fichier. [Retour] : Si le header n'est pas compatible, on quite en lançant une exception Failure suivie du message d'erreur. [Rem] : Non exporté en clair hors de ce module. *) (* ******************************************************************** *) value check_magic = let b = Bytes.create (String.length magic_gwo) in fun fname ic -> do { really_input ic b 0 (String.length b); if b <> magic_gwo then if String.sub magic_gwo 0 4 = String.sub b 0 4 then failwith ("\"" ^ fname ^ "\" is a GeneWeb object file, but not compatible") else failwith ("\"" ^ fname ^ "\" is not a GeneWeb object file, or it is a very old version") else () } ; value next_family_fun_templ gwo_list fi = do { let ngwo = List.length gwo_list in let run = if ngwo < 10 || not Mutil.verbose.val then fun () -> () else if ngwo < 60 then fun () -> do { Printf.eprintf "."; flush stderr; } else do { let bar_cnt = ref 0 in let run () = do { ProgrBar.run bar_cnt.val ngwo; incr bar_cnt } in ProgrBar.empty.val := 'o'; ProgrBar.full.val := '*'; ProgrBar.start (); run } in let ic_opt = ref None in let gwo_list = ref gwo_list in fi.Db2link.f_sep_file_inx := 0; fun () -> loop () where rec loop () = let r = match ic_opt.val with [ Some ic -> match try Some (input_value ic : gw_syntax) with [ End_of_file -> None ] with [ Some fam -> Some fam | None -> do { close_in ic; ic_opt.val := None; fi.Db2link.f_sep_file_inx := fi.Db2link.f_sep_file_inx + 1; None } ] | None -> None ] in match r with [ Some fam -> Some fam | None -> match gwo_list.val with [ [(x, separate, shift) :: rest] -> do { run (); gwo_list.val := rest; let ic = open_in_bin x in check_magic x ic; fi.Db2link.f_curr_src_file := input_value ic; fi.Db2link.f_curr_gwo_file := x; fi.Db2link.f_separate := separate; fi.Db2link.f_has_separates := fi.Db2link.f_has_separates || separate; ic_opt.val := Some ic; loop (); } | [] -> do { if ngwo < 10 || not Mutil.verbose.val then () else if ngwo < 60 then do { Printf.eprintf "\n"; flush stderr } else ProgrBar.finish (); None } ] ] }; value just_comp = ref False; value out_file = ref (Filename.concat Filename.current_dir_name "a"); value force = ref False; value separate = ref False; value shift = ref 0; value files = ref []; (* ******************************************************************** *) (* [Var] speclist : (string * Arg.spec * string) list *) (** [Description] : Positionne les variables en fonction des options données à gwc2 [Rem] : Non exporté en clair hors de ce module. *) (* ******************************************************************** *) value speclist = [("-c", Arg.Set just_comp, "Only compiling"); ("-o", Arg.String (fun s -> out_file.val := s), " Output database (default: a.gwb)"); ("-f", Arg.Set force, " Remove database if already existing"); ("-stats", Arg.Set Db2link.pr_stats, "Print statistics"); ("-nc", Arg.Clear Db2link.do_check, "No consistency check"); ("-cg", Arg.Set Db2link.do_consang, "Compute consanguinity"); ("-sep", Arg.Set separate, " Separate all persons in next file"); ("-sh", Arg.Int (fun x -> shift.val := x), " Shift all persons numbers in next files"); ("-ds", Arg.String (fun s -> Db2link.default_source.val := s), "\ Set the source field for persons and families without source data"); ("-part", Arg.String (fun s -> Db2link.particules_file.val := s), "\ Particles file (default = predefined particles)"); ("-mem", Arg.Unit (fun () -> ()), " (obsolete option)"); ("-nolock", Arg.Set Lock.no_lock_flag, " do not lock database."); ("-nofail", Arg.Set Gwcomp.no_fail, " no failure in case of error."); ("-nopicture", Arg.Set Gwcomp.no_picture, " do not create associative pictures"); ("-q", Arg.Clear Mutil.verbose, " no verbose"); ("-v", Arg.Set Mutil.verbose, " verbose")] ; value anonfun x = let sep = separate.val in do { if Filename.check_suffix x ".gw" then () else if Filename.check_suffix x ".gwo" then () else raise (Arg.Bad ("Don't know what to do with \"" ^ x ^ "\"")); separate.val := False; files.val := [(x, sep, shift.val) :: files.val] } ; value errmsg = "\ Usage: gwc2 [options] [files] where [files] are a list of files: source files end with .gw object files end with .gwo and [options] are:" ; (* ******************************************************************** *) (* [Fonc] main : unit -> unit *) (** [Description] : Fonction principale de création d'une base au format gwb2. [Args] : Néant. [Retour] : Néant. [Rem] : Non exporté en clair hors de ce module. *) (* ******************************************************************** *) value main () = do { Mutil.verbose.val := False; Argl.parse speclist anonfun errmsg; Secure.set_base_dir (Filename.dirname out_file.val); let gwo = ref [] in List.iter (fun (x, separate, shift) -> if Filename.check_suffix x ".gw" then do { try Gwcomp.comp_families x with e -> do { printf "File \"%s\", line %d:\n" x line_cnt.val; raise e }; gwo.val := [(x ^ "o", separate, shift) :: gwo.val]; } else if Filename.check_suffix x ".gwo" then gwo.val := [(x, separate, shift) :: gwo.val] else raise (Arg.Bad ("Don't know what to do with \"" ^ x ^ "\""))) (List.rev files.val); if not just_comp.val then do { let bdir = if Filename.check_suffix out_file.val ".gwb" then out_file.val else out_file.val ^ ".gwb" in if not force.val && Sys.file_exists bdir then do { printf "\ The database \"%s\" already exists. Use option -f to overwrite it. " out_file.val; flush stdout; exit 2 } else (); lock (Mutil.lock_file out_file.val) with [ Accept -> let bdir = if Filename.check_suffix out_file.val ".gwb" then out_file.val else out_file.val ^ ".gwb" in let next_family_fun = next_family_fun_templ (List.rev gwo.val) in if Db2link.link next_family_fun bdir then () else do { eprintf "*** database not created\n"; flush stderr; exit 2; } | Refuse -> do { printf "Base is locked: cannot write it\n"; flush stdout; exit 2 } ]; } else (); } ; value print_exc = fun [ Failure txt -> do { printf "Failed: %s\n" txt; flush stdout; exit 2 } (* FIX ME : Printexc.catch is deprecated *) (* use Printexc.print raise exc instead *) | exc -> Printexc.catch raise exc ] ; try main () with exc -> print_exc exc; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/diff.ml0000660000175200017530000001166312664543647022461 0ustar guillaumeguillaume(* $Id: diff.ml,v 5.1 2006-11-03 10:31:18 ddr Exp $ *) (* Parts of Code of GNU diff (analyze.c) translated from C to OCaml and adjusted. Basic algorithm described by Eugene W.Myers in: "An O(ND) Difference Algorithm and Its Variations" *) exception DiagReturn of int; value diag fd bd sh xv yv xoff xlim yoff ylim = do { let dmin = xoff - ylim in let dmax = xlim - yoff in let fmid = xoff - yoff in let bmid = xlim - ylim in let odd = (fmid - bmid) land 1 <> 0 in fd.(sh + fmid) := xoff; bd.(sh + bmid) := xlim; try let rec loop fmin fmax bmin bmax = do { let fmin = if fmin > dmin then do { fd.(sh + fmin - 2) := -1; fmin - 1 } else fmin + 1 in let fmax = if fmax < dmax then do { fd.(sh + fmax + 2) := -1; fmax + 1 } else fmax - 1 in loop fmax where rec loop d = if d < fmin then () else do { let tlo = fd.(sh + d - 1) in let thi = fd.(sh + d + 1) in let x = if tlo >= thi then tlo + 1 else thi in let x = loop xv yv xlim ylim x (x - d) where rec loop xv yv xlim ylim x y = if x < xlim && y < ylim && xv x == yv y then loop xv yv xlim ylim (x + 1) (y + 1) else x in fd.(sh + d) := x; if odd && bmin <= d && d <= bmax && bd.(sh + d) <= fd.(sh + d) then raise (DiagReturn d) else loop (d - 2) }; let bmin = if bmin > dmin then do { bd.(sh + bmin - 2) := max_int; bmin - 1 } else bmin + 1 in let bmax = if bmax < dmax then do { bd.(sh + bmax + 2) := max_int; bmax + 1 } else bmax - 1 in loop bmax where rec loop d = if d < bmin then () else do { let tlo = bd.(sh + d - 1) in let thi = bd.(sh + d + 1) in let x = if tlo < thi then tlo else thi - 1 in let x = loop xv yv xoff yoff x (x - d) where rec loop xv yv xoff yoff x y = if x > xoff && y > yoff && xv (x - 1) == yv (y - 1) then loop xv yv xoff yoff (x - 1) (y - 1) else x in bd.(sh + d) := x; if not odd && fmin <= d && d <= fmax && bd.(sh + d) <= fd.(sh + d) then raise (DiagReturn d) else loop (d - 2) }; loop fmin fmax bmin bmax } in loop fmid fmid bmid bmid with [ DiagReturn i -> i ] }; value diff_loop a ai b bi n m = do { let fd = Array.make (n + m + 3) 0 in let bd = Array.make (n + m + 3) 0 in let sh = m + 1 in let xvec i = a.(ai.(i)) in let yvec j = b.(bi.(j)) in let chng1 = Array.make (Array.length a) True in let chng2 = Array.make (Array.length b) True in for i = 0 to n - 1 do { chng1.(ai.(i)) := False }; for j = 0 to m - 1 do { chng2.(bi.(j)) := False }; loop 0 n 0 m where rec loop xoff xlim yoff ylim = let (xoff, yoff) = loop xoff yoff where rec loop xoff yoff = if xoff < xlim && yoff < ylim && xvec xoff == yvec yoff then loop (xoff + 1) (yoff + 1) else (xoff, yoff) in let (xlim, ylim) = loop xlim ylim where rec loop xlim ylim = if xlim > xoff && ylim > yoff && xvec (xlim - 1) == yvec (ylim - 1) then loop (xlim - 1) (ylim - 1) else (xlim, ylim) in if xoff = xlim then for y = yoff to ylim - 1 do { chng2.(bi.(y)) := True } else if yoff = ylim then for x = xoff to xlim - 1 do { chng1.(ai.(x)) := True } else do { let d = diag fd bd sh xvec yvec xoff xlim yoff ylim in let b = bd.(sh + d) in loop xoff b yoff (b - d); loop b xlim (b - d) ylim }; (chng1, chng2) }; (* [make_indexer a b] returns an array of index of items of [a] which are also present in [b]; this way, the main algorithm can skip items which, anyway, are different. This improves the speed much. The same time, this function updates the items of so that all equal items point to the same unique item. All items comparisons in the main algorithm can therefore be done with [==] instead of [=], what can improve speed much. *) value make_indexer a b = do { let n = Array.length a in let htb = Hashtbl.create (10 * Array.length b) in Array.iteri (fun i e -> try b.(i) := Hashtbl.find htb e with [ Not_found -> Hashtbl.add htb e e ]) b; let ai = Array.make n 0 in let k = loop 0 0 where rec loop i k = if i = n then k else let k = try do { a.(i) := Hashtbl.find htb a.(i); (* line found (since "Not_found" not raised) *) ai.(k) := i; k + 1 } with [ Not_found -> k ] in loop (i + 1) k in Array.sub ai 0 k }; value f a b = let ai = make_indexer a b in let bi = make_indexer b a in let n = Array.length ai in let m = Array.length bi in diff_loop a ai b bi n m ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/robot.ml0000660000175200017530000001621512664543647022674 0ustar guillaumeguillaume(* camlp5r *) (* $Id: robot.ml,v 5.17 2007-09-12 09:58:44 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Config; open Util; open Printf; value magic_robot = "GWRB0007"; module W = Map.Make (struct type t = string; value compare = compare; end); type norfriwiz = [ Normal | Friend of string | Wizard of string ]; type who = { acc_times : list float; oldest_time : float; nb_connect : int; nbase : string; utype : norfriwiz } ; type excl = { excl : mutable list (string * ref int); who : mutable W.t who; max_conn : mutable (int * string) } ; value robot_error conf from cnt sec = do { if not conf.cgi then Wserver.http "403 Forbidden" else (); Wserver.wprint "Content-type: text/html; charset=iso-8859-1"; Util.nl (); Util.nl (); let env = [("cnt", string_of_int cnt) ; ("sec", string_of_int sec)] in match open_etc_file "robot" with [ Some ic -> Templ.copy_from_templ conf env ic | None -> let title _ = Wserver.wprint "Access refused" in do { Wserver.wprint ""; title True; Wserver.wprint "\n\n

      "; title False; Wserver.wprint "\n"; } ]; raise Exit } ; value purge_who tm xcl sec = let sec = float sec in let to_remove = W.fold (fun k who l -> match who.acc_times with [ [tm0 :: _] -> if tm -. tm0 > sec then [k :: l] else l | [] -> [k :: l] ]) xcl.who [] in List.iter (fun k -> xcl.who := W.remove k xcl.who) to_remove ; value fprintf_date oc tm = fprintf oc "%4d-%02d-%02d %02d:%02d:%02d" (1900 + tm.Unix.tm_year) (succ tm.Unix.tm_mon) tm.Unix.tm_mday tm.Unix.tm_hour tm.Unix.tm_min tm.Unix.tm_sec ; value input_excl = let b = Bytes.create (String.length magic_robot) in fun ic -> do { really_input ic b 0 (String.length b); if b <> magic_robot then raise Not_found else (input_value ic : excl) } ; value output_excl oc xcl = do { output_string oc magic_robot; output_value oc (xcl : excl); } ; value robot_excl () = let fname = Srcfile.adm_file "robot" in let xcl = match try Some (Secure.open_in_bin fname) with _ -> None with [ Some ic -> let v = try input_excl ic with _ -> {excl = []; who = W.empty; max_conn = (0, "")} in do { close_in ic; v } | None -> {excl = []; who = W.empty; max_conn = (0, "")} ] in (xcl, fname) ; value min_disp_req = ref 6; value check oc tm from max_call sec conf suicide = let nfw = if conf.wizard then Wizard conf.user else if conf.friend then Friend conf.user else Normal in let (xcl, fname) = robot_excl () in let refused = match try Some (List.assoc from xcl.excl) with [ Not_found -> None ] with [ Some att -> do { incr att; if att.val mod max_call = 0 then do { fprintf_date oc (Unix.localtime tm); fprintf oc "\n"; fprintf oc " From: %s\n" from; fprintf oc " %d refused attempts;" att.val; fprintf oc " to restore access, delete file \"%s\"\n" fname; } else (); True } | None -> do { purge_who tm xcl sec; let r = try (W.find from xcl.who).acc_times with [ Not_found -> [] ] in let (cnt, tml, tm0) = let sec = float sec in let rec count cnt tml = fun [ [] -> (cnt, tml, tm) | [tm1] -> if tm -. tm1 < sec then (cnt + 1, [tm1 :: tml], tm1) else (cnt, tml, tm1) | [tm1 :: tml1] -> if tm -. tm1 < sec then count (cnt + 1) [tm1 :: tml] tml1 else (cnt, tml, tm1) ] in count 1 [] r in let r = List.rev tml in xcl.who := W.add from {acc_times = [tm :: r]; oldest_time = tm0; nb_connect = cnt; nbase = conf.bname; utype = nfw} xcl.who; let refused = if suicide || cnt > max_call then do { fprintf oc "--- %s is a robot" from; if suicide then fprintf oc " (called the \"suicide\" request)\n" else fprintf oc " (%d > %d connections in %g <= %d seconds)\n" cnt max_call (tm -. tm0) sec; flush Pervasives.stderr; xcl.excl := [(from, ref 1) :: xcl.excl]; xcl.who := W.remove from xcl.who; xcl.max_conn := (0, ""); True } else False in if xcl.excl <> [] then do { List.iter (fun (s, att) -> do { fprintf oc "--- excluded:"; fprintf oc " %s (%d refused attempts)\n" s att.val; () }) xcl.excl; fprintf oc "--- to restore access, delete file \"%s\"\n" fname; } else (); let (list, nconn) = W.fold (fun k w (list, nconn) -> let tm = w.oldest_time in let nb = w.nb_connect in do { if nb > fst xcl.max_conn then xcl.max_conn := (nb, k) else (); (if nb < min_disp_req.val then list else [(k, tm, nb) :: list], nconn + 1) }) xcl.who ([], 0) in let list = List.sort (fun (_, tm1, nb1) (_, tm2, nb2) -> match compare nb2 nb1 with [ 0 -> compare tm2 tm1 | x -> x ]) list in List.iter (fun (k, tm0, nb) -> fprintf oc "--- %3d req - %3.0f sec - %s\n" nb (tm -. tm0) k) list; fprintf oc "--- max %d req by %s / conn %d\n" (fst xcl.max_conn) (snd xcl.max_conn) nconn; refused } ] in do { match try Some (Secure.open_out_bin fname) with [ Sys_error _ -> None ] with [ Some oc -> do { output_excl oc xcl; close_out oc; } | None -> () ]; if refused then robot_error conf from max_call sec else (); W.fold (fun _ w (c, cw, cf, wl) -> if w.nbase = conf.bname && w.nbase <> "" then match w.utype with [ Wizard n -> let at = List.hd w.acc_times in if List.mem_assoc n wl then let old_at = List.assoc n wl in if at > old_at then let wl = List.remove_assoc n wl in (c, cw, cf, [(n, at) :: wl]) else (c, cw, cf, wl) else (c + 1, cw + 1, cf, [(n, at) :: wl]) | Friend _ -> if w.nb_connect > 2 then (c + 1, cw, cf + 1, wl) else (c, cw, cf, wl) | Normal -> if w.nb_connect > 2 then (c + 1, cw, cf, wl) else (c, cw, cf, wl) ] else (c, cw, cf, wl)) xcl.who (0, 0, 0, []) } ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/notesLinks.ml0000660000175200017530000001521512664543647023677 0ustar guillaumeguillaume(* camlp5r *) (* $Id: notesLinks.ml,v 5.8 2007-09-12 09:58:44 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Def; value magic_notes_links = "GWNL0010"; type page = [ PgInd of iper | PgFam of ifam | PgNotes | PgMisc of string | PgWizard of string ] ; type key = (string * string * int); type ind_link = { lnTxt : option string; lnPos : int }; type notes_links_db = list (page * (list string * list (key * ind_link))); value char_dir_sep = ':'; value check_file_name s = loop [] 0 0 where rec loop path ibeg i = if i = String.length s then if i > ibeg then let path = (List.rev path, String.sub s ibeg (i - ibeg)) in Some path else None else match s.[i] with [ 'a'..'z' | 'A'..'Z' | '0'..'9' | '_' | '-' | '.' -> loop path ibeg (i + 1) | c -> if c = char_dir_sep then if i > ibeg then loop [String.sub s ibeg (i - ibeg) :: path] (i + 1) (i + 1) else None else None ] ; type wiki_link = [ WLpage of int and (list string * string) and string and string and string | WLperson of int and key and string and option string | WLwizard of int and string and string | WLnone ] ; value misc_notes_link s i = let slen = String.length s in if i < slen - 2 && s.[i] = '[' && s.[i+1] = '[' then if s.[i+2] = '[' then let j = loop (i + 3) where rec loop j = if j = slen then j else if j < slen - 3 && s.[j] = ']' && s.[j+1] = ']' && s.[j+2] = ']' then j + 3 else loop (j + 1) in if j > i + 6 then let b = String.sub s (i + 3) (j - i - 6) in let (fname, anchor, text) = try let k = String.rindex b '/' in let j = try String.index b '#' with [ Not_found -> k ] in (String.sub b 0 j, String.sub b j (k - j), String.sub b (k + 1) (String.length b - k - 1)) with [ Not_found -> (b, "", b) ] in match check_file_name fname with [ Some pg_path -> WLpage j pg_path fname anchor text | None -> WLnone ] else WLnone else let j = loop (i + 2) where rec loop j = if j = slen then j else if j < slen -2 && s.[j] = ']' && s.[j+1] = ']' then j + 2 else loop (j + 1) in let b = String.sub s (i + 2) (j - i - 4) in let (spe, b) = try let i = String.index b ':' in (Some (String.sub b 0 i), String.sub b (i + 1) (String.length b - i - 1)) with [ Not_found -> (None, b) ] in let (b, text) = try let i = String.rindex b ';' in (String.sub b 0 i, Some (String.sub b (i + 1) (String.length b - i - 1))) with [ Not_found -> (b, None) ] in if spe = Some "w" then let (wiz, name) = match try (Some (String.index b '/')) with [ Not_found -> None ] with [ Some i -> (String.sub b 0 i, String.sub b (i + 1) (String.length b - i - 1)) | None -> (b, "") ] in WLwizard j wiz name else try let k = 0 in let l = String.index_from b k '/' in let fn = String.sub b k (l - k) in let k = l + 1 in let (fn, sn, oc, name) = try let l = String.index_from b k '/' in let sn = String.sub b k (l - k) in let (oc, name) = try let k = l + 1 in let l = String.index_from b k '/' in let x = String.sub b k (l - k) in (x, String.sub b (l + 1) (String.length b - l - 1)) with [ Not_found -> ("", String.sub b (l + 1) (String.length b - l - 1)) ] in let oc = try int_of_string oc with [ Failure _ -> 0 ] in (fn, sn, oc, name) with [ Not_found -> let sn = String.sub b k (String.length b - k) in let name = fn ^ " " ^ sn in (fn, sn, 0, name) ] in let fn = Name.lower fn in let sn = Name.lower sn in WLperson j (fn, sn, oc) name text with [ Not_found -> WLnone ] else WLnone ; value read_db_from_file fname = match try Some (open_in_bin fname) with [ Sys_error _ -> None ] with [ Some ic -> do { let b = Bytes.create (String.length magic_notes_links) in really_input ic b 0 (String.length b); let r = if b <> magic_notes_links then [] else try (input_value ic : notes_links_db) with _ -> [] in close_in ic; r } | None -> [] ] ; value share ht s = try Hashtbl.find ht s with [ Not_found -> do { Hashtbl.add ht s s; s } ] ; value option f = fun [ Some x -> Some (f x) | None -> None ] ; value share_strings db = let ht = Hashtbl.create 103 in List.map (fun (page, (list_nt, list_ind)) -> let page = match page with [ PgMisc s -> PgMisc (share ht s) | PgWizard s -> PgWizard (share ht s) | x -> x ] in let list_nt = List.map (share ht) list_nt in let list_ind = List.map (fun ((fn, sn, oc), {lnTxt = txt; lnPos = pos}) -> ((share ht fn, share ht sn, oc), {lnTxt = option (share ht) txt; lnPos = pos})) list_ind in (page, (list_nt, list_ind))) db ; value update_db_list db who (list_nt, list_ind) = let db = List.remove_assoc who db in let new_db = if list_nt = [] && list_ind = [] then db else [(who, (list_nt, list_ind)) :: db] in share_strings new_db ; value read_db bdir = let fname_def = Filename.concat bdir "notes_links" in read_db_from_file fname_def ; value write_db bdir db = do { let db = share_strings db in let fname_tmp = Filename.concat bdir "1notes_links" in let fname_def = Filename.concat bdir "notes_links" in let fname_back = Filename.concat bdir "notes_links~" in let oc = open_out_bin fname_tmp in output_string oc magic_notes_links; output_value oc (db : notes_links_db); close_out oc; Mutil.remove_file fname_back; try Sys.rename fname_def fname_back with [ Sys_error _ -> () ]; try Sys.rename fname_tmp fname_def with [ Sys_error _ -> () ]; }; value add_in_db db who (list_nt, list_ind) = let db = List.remove_assoc who db in if list_nt = [] && list_ind = [] then db else [(who, (list_nt, list_ind)) :: db] ; value update_db bdir who list = let db = read_db bdir in let new_db = add_in_db db who list in write_db bdir new_db ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/utf82old.sh0000660000175200017530000000362412664543647023220 0ustar guillaumeguillaume#!/bin/sh cat $1 | sed -e 's/"/@/g' -e 's/\$/\$/g' | awk ' BEGIN { enc="" } function disp() { if (enc == "ar") ; else if (enc == "iso-8859-3") system("echo \"" $0 "\" | iconv -f utf-8 -t " enc " | sed -e 's/æ/cx/g' -e 's/ø/gx/g' -e 's/¼/jx/g' -e 's/þ/sx/g' -e 's/ý/ux/g'") else if (enc == "iso-8859-8") system("echo \"" $0 "\" | iconv -f utf-8 -t " enc " | sed -e \"s/he: \\([âàéø]\\)/he: \\1/\" -e \"s|/\\([âàéø]\\)|/ \\1|g\"") else if (enc == "lv") system("echo \"" $0 "\" | sed -e 's/Ä\\214/È/g' -e 's/Ä\\201/â/g' -e 's/Å\\206/ò/g' -e 's/ļ/ï/g' -e 's/Ä\\215/è/g' -e 's/Å¡/ð/g' -e 's/Å«/û/g' -e 's/Ä\\223/ç/g' -e 's/Ä¢/Ì/g' -e 's/Ä£/ì/g' -e 's/Ķ/Í/g' -e 's/Ä«/î/g' -e 's/Ä·/í/g' -e 's/þ/þ/g'") else system("echo \"" $0 "\" | iconv -f utf-8 -t " enc); fflush(stdout); } function conv(t) { enc=t; disp() } /^af: / { conv("iso-8859-1"); next } /^ar: / { enc="ar"; next } /^bg: / { conv("windows-1251"); next } /^br: / { conv("iso-8859-1"); next } /^ca: / { conv("iso-8859-1"); next } /^cs: / { conv("iso-8859-2"); next } /^da: / { conv("iso-8859-1"); next } /^eo: / { conv("iso-8859-3"); next } /^de: / { conv("iso-8859-1"); next } /^es: / { conv("iso-8859-1"); next } /^et: / { conv("iso-8859-15"); next } /^fi: / { conv("iso-8859-1"); next } /^fr: / { conv("iso-8859-1"); next } /^fr-cr: / { conv("iso-8859-1"); next } /^he: / { conv("iso-8859-8"); next } /^is: / { conv("iso-8859-1"); next } /^it: / { conv("iso-8859-1"); next } /^lv: / { conv("lv"); next } /^nl: / { conv("iso-8859-1"); next } /^no: / { conv("iso-8859-1"); next } /^pl: / { conv("iso-8859-2"); next } /^pt: / { conv("iso-8859-1"); next } /^pt-br: / { conv("iso-8859-1"); next } /^ru: / { conv("windows-1251"); next } /^sl: / { conv("iso-8859-2"); next } /^sv: / { conv("iso-8859-1"); next } /^zh: / { conv("gb2312"); next } enc== "" { print; next } /^ / { disp(); next } { enc=""; print; next } ' | sed -e 's/@/"/g' geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/srcfile.ml0000660000175200017530000005071012664543647023174 0ustar guillaumeguillaume(* camlp5r ./pa_lock.cmo ./pa_html.cmo pa_extend.cmo *) (* $Id: srcfile.ml,v 5.41 2007-09-12 09:58:44 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Config; open Def; open Gwdb; open TemplAst; open Util; type counter = { welcome_cnt : mutable int; request_cnt : mutable int; start_date : string; wizard_cnt : mutable int; friend_cnt : mutable int; normal_cnt : mutable int } ; value get_date conf = Printf.sprintf "%02d/%02d/%d" conf.today.day conf.today.month conf.today.year ; (* On cherche le fichier dans cet ordre : - dans la base (bases/bname/cnt/) - dans le répertoire des bases (bases/) *) value find_cnt_file conf = let bases_cnt = Filename.concat Util.cnt_dir.val "cnt" in let bname_cnt = List.fold_left Filename.concat Util.cnt_dir.val [conf.bname; "cnt"] in if Sys.file_exists bname_cnt then bname_cnt else bases_cnt ; value adm_file f = List.fold_right Filename.concat [Util.cnt_dir.val; "cnt"] f ; value cnt conf ext = adm_file (conf.bname ^ ext); value input_int ic = try int_of_string (input_line ic) with [ End_of_file | Failure _ -> 0 ] ; value count conf = let fname = cnt conf ".txt" in try let ic = Secure.open_in fname in let rd = try let wc = int_of_string (input_line ic) in let rc = int_of_string (input_line ic) in let d = input_line ic in let wzc = input_int ic in let frc = input_int ic in let nrc = input_int ic in {welcome_cnt = wc; request_cnt = rc; start_date = d; wizard_cnt = wzc; friend_cnt = frc; normal_cnt = nrc} with _ -> {welcome_cnt = 0; request_cnt = 0; start_date = get_date conf; wizard_cnt = 0; friend_cnt = 0; normal_cnt = 0} in do { close_in ic; rd } with _ -> {welcome_cnt = 0; request_cnt = 0; start_date = get_date conf; wizard_cnt = 0; friend_cnt = 0; normal_cnt = 0} ; value write_counter conf r = let fname = cnt conf ".txt" in try let oc = Secure.open_out_bin fname in do { output_string oc (string_of_int r.welcome_cnt); output_string oc "\n"; output_string oc (string_of_int r.request_cnt); output_string oc "\n"; output_string oc r.start_date; output_string oc "\n"; output_string oc (string_of_int r.wizard_cnt); output_string oc "\n"; output_string oc (string_of_int r.friend_cnt); output_string oc "\n"; output_string oc (string_of_int r.normal_cnt); output_string oc "\n"; close_out oc; } with _ -> () ; value set_wizard_and_friend_traces conf = if conf.wizard && conf.user <> "" then let wpf = try List.assoc "wizard_passwd_file" conf.base_env with [ Not_found -> "" ] in if wpf <> "" then let fname = adm_file (conf.bname ^ "_w.txt") in update_wf_trace conf fname else () else if conf.friend && not conf.just_friend_wizard && conf.user <> "" then let fpf = try List.assoc "friend_passwd_file" conf.base_env with [ Not_found -> "" ] in let fp = try List.assoc "friend_passwd" conf.base_env with [ Not_found -> "" ] in if fpf <> "" && is_that_user_and_password conf.auth_scheme conf.user fp = False then let fname = adm_file (conf.bname ^ "_f.txt") in update_wf_trace conf fname else () else () ; value incr_welcome_counter conf = let lname = cnt conf ".lck" in lock_wait lname with [ Accept -> let r = count conf in do { r.welcome_cnt := r.welcome_cnt + 1; if conf.wizard then r.wizard_cnt := r.wizard_cnt + 1 else if conf.friend then r.friend_cnt := r.friend_cnt + 1 else r.normal_cnt := r.normal_cnt + 1; write_counter conf r; set_wizard_and_friend_traces conf; Some (r.welcome_cnt, r.request_cnt, r.start_date) } | Refuse -> None ] ; value incr_request_counter conf = let lname = cnt conf ".lck" in lock_wait lname with [ Accept -> let r = count conf in do { r.request_cnt := r.request_cnt + 1; if conf.wizard then r.wizard_cnt := r.wizard_cnt + 1 else if conf.friend then r.friend_cnt := r.friend_cnt + 1 else r.normal_cnt := r.normal_cnt + 1; write_counter conf r; set_wizard_and_friend_traces conf; Some (r.welcome_cnt, r.request_cnt, r.start_date) } | Refuse -> None ] ; value lang_file_name conf fname = let fname1 = Util.base_path ["lang"; conf.lang] (Filename.basename fname ^ ".txt") in if Sys.file_exists fname1 then fname1 else search_in_lang_path (Filename.concat conf.lang (Filename.basename fname ^ ".txt")) ; value any_lang_file_name fname = let fname1 = Util.base_path ["lang"] (Filename.basename fname ^ ".txt") in if Sys.file_exists fname1 then fname1 else search_in_lang_path (Filename.concat "lang" (Filename.basename fname ^ ".txt")) ; value source_file_name conf fname = let bname = conf.bname in let lang = conf.lang in let fname1 = List.fold_right Filename.concat [Util.base_path ["src"] bname; lang] (Filename.basename fname ^ ".txt") in if Sys.file_exists fname1 then fname1 else Filename.concat (Util.base_path ["src"] bname) (Filename.basename fname ^ ".txt") ; value digit = fun [ '0'..'9' as c -> Char.code c - Char.code '0' | _ -> failwith "digit" ] ; module G = Grammar.GMake (struct type te = (string * string); value lexer = Plexer.gmake (); end) ; value date = G.Entry.create "date"; GEXTEND G date: [ [ d = INT; "/"; m = INT; "/"; y = INT; EOI -> (int_of_string d, int_of_string m, int_of_string y) ] ] ; END; value extract_date d = try Some (G.Entry.parse date (G.parsable (Stream.of_string d))) with [ Ploc.Exc _ (Stream.Error _ | Token.Error _) -> None ] ; value string_of_start_date conf = let r = count conf in match extract_date r.start_date with [ Some (d, m, y) -> let d = Dgreg {day = d; month = m; year = y; prec = Sure; delta = 0} Dgregorian in Util.translate_eval (Date.string_of_date conf d) | _ -> r.start_date ] ; value string_of_num sep num = let len = ref 0 in do { Num.print (fun x -> len.val := Buff.mstore len.val x) sep num; Buff.get len.val } ; value macro conf base = fun [ 'a' -> match Util.find_sosa_ref conf base with [ Some p -> referenced_person_title_text conf base p | None -> "" ] | 'b' -> let s = try " dir=\"" ^ Hashtbl.find conf.lexicon " !dir" ^ "\"" with [ Not_found -> "" ] in s ^ body_prop conf | 'c' -> let r = count conf in string_of_num (transl conf "(thousand separator)") (Num.of_int r.welcome_cnt) | 'd' -> string_of_start_date conf | 'D' -> (count conf).start_date | 'e' -> conf.charset | 'f' -> conf.command | 'g' -> conf.command ^ "?" ^ (if conf.cgi then "b=" ^ conf.bname ^ ";" else "") | 'i' -> conf.highlight | 'k' -> conf.indep_command | 'l' -> conf.lang | 'L' -> conf.left | 'm' -> try let s = List.assoc "latest_event" conf.base_env in if s = "" then "20" else s with [ Not_found -> "20" ] | 'n' -> string_of_num (transl conf "(thousand separator)") (Num.of_int (nb_of_persons base)) | 'N' -> let s = base_notes_read_first_line base "" in let len = String.length s in if len > 9 && String.sub s 0 5 = "" then " : " ^ String.sub s 5 (String.length s - 9) else "" | 'o' -> image_prefix conf | 'q' -> let r = count conf in string_of_num (transl conf "(thousand separator)") (Num.of_int (r.welcome_cnt + r.request_cnt)) | 'R' -> conf.right | 's' -> commd conf | 't' -> conf.bname | 'T' -> Util.doctype conf | 'U' -> if (conf.wizard || conf.just_friend_wizard) && conf.user <> "" then ": " ^ conf.user else "" | 'v' -> Version.txt | 'w' -> let s = Hutil.link_to_referer conf in if s = "" then " " else s | '/' -> conf.xhs | c -> "%" ^ String.make 1 c ] ; module Lbuff = Buff.Make (struct value buff = ref (Bytes.create 80); end); value rec lexicon_translate conf base nomin strm first_c = let (upp, s) = loop 0 first_c where rec loop len c = if c = ']' then let s = Lbuff.get len in if len > 0 && s.[0] = '*' then (True, String.sub s 1 (len - 1)) else (False, s) else loop (Lbuff.store len c) (Stream.next strm) in let (n, c) = match Stream.next strm with [ '0'..'9' as c -> (Char.code c - Char.code '0', "") | c -> (0, String.make 1 c) ] in let r = if c = "[" then Util.transl_decline conf s (lexicon_translate conf base False strm (Stream.next strm)) else let r = Util.transl_nth conf s n in match Mutil.lindex r '%' with [ Some i when c = "(" -> let sa = loop 0 where rec loop len = let c = Stream.next strm in if c = ')' then Lbuff.get len else let len = if c = '%' then let c = Stream.next strm in Lbuff.mstore len (macro conf base c) else Lbuff.store len c in loop len in String.sub r 0 i ^ sa ^ String.sub r (i + 2) (String.length r - i - 2) | _ -> (if nomin then Util.translate_eval r else r) ^ c ] in if upp then capitale r else r ; value browser_cannot_handle_passwords conf = let user_agent = Wserver.extract_param "user-agent: " '/' conf.request in String.lowercase user_agent = "konqueror" ; value get_variable strm = loop 0 where rec loop len = match Stream.next strm with [ ';' -> Buff.get len | c -> loop (Buff.store len c) ] ; value rec stream_line = parser [ [: `'\n' :] -> "" | [: `c; s :] -> String.make 1 c ^ stream_line s ] ; type src_mode = [ Lang | Source ]; value notes_links conf = let bdir = Util.base_path [] (conf.bname ^ ".gwb") in let fname = Filename.concat bdir "notes_links" in NotesLinks.read_db_from_file fname ; value rec copy_from_stream conf base strm mode = let echo = ref True in let no_tables = browser_doesnt_have_tables conf in let (push_echo, pop_echo) = let stack = ref [] in (fun x -> do { stack.val := [echo.val :: stack.val]; echo.val := x; }, fun () -> match stack.val with [ [x :: l] -> do { stack.val := l; echo.val := x; } | [] -> echo.val := True ]) in let rec if_expr = fun [ 'N' -> not (if_expr (Stream.next strm)) | 'a' -> conf.auth_file <> "" | 'c' -> conf.cgi || browser_cannot_handle_passwords conf | 'f' -> conf.friend | 'h' -> Sys.file_exists (History.file_name conf) | 'j' -> conf.just_friend_wizard | 'l' -> no_tables | 'm' -> notes_links conf <> [] | 'n' -> not (base_notes_are_empty base "") | 'o' -> Sys.file_exists (Wiznotes.dir conf base) | 'p' -> match p_getenv conf.base_env (get_variable strm) with [ Some "" | None -> False | Some _ -> True ] | 's' -> p_getenv conf.base_env (get_variable strm) <> Some "no" | 'w' -> conf.wizard | 'z' -> Util.find_sosa_ref conf base <> None | '|' -> let a = if_expr (Stream.next strm) in let b = if_expr (Stream.next strm) in a || b | '&' -> let a = if_expr (Stream.next strm) in let b = if_expr (Stream.next strm) in a && b | c -> do { Wserver.wprint "!!!!!%c!!!!!" c; True } ] in try while True do { match Stream.next strm with [ '[' -> src_translate conf base True strm echo mode | '<' when no_tables && echo.val -> let c = Stream.next strm in let (slash, c) = if c = '/' then ("/", Stream.next strm) else ("", c) in let (atag, c) = loop 0 c where rec loop len = fun [ '>' | ' ' | '\n' as c -> (Buff.get len, c) | c -> loop (Buff.store len c) (Stream.next strm) ] in match atag with [ "table" | "tr" | "td" -> let rec loop = fun [ '>' -> () | _ -> loop (Stream.next strm) ] in loop c | _ -> Wserver.wprint "<%s%s%c" slash atag c ] | '%' -> let c = Stream.next strm in match c with [ 'I' -> push_echo (echo.val && if_expr (Stream.next strm)) | 'E' -> pop_echo () | _ when not echo.val -> () | '%' -> Wserver.wprint "%%" | '[' | ']' -> Wserver.wprint "%c" c | 'h' -> hidden_env conf | 'j' -> Templ.include_hed_trl conf (Some base) "hed" | 'P' -> let _ = Stream.next strm in () | 'r' -> copy_from_file conf base (stream_line strm) mode | 'u' -> let lang = loop 0 where rec loop len = let c = Stream.next strm in if c = ';' then Buff.get len else loop (Buff.store len c) in let lang_def = transl conf " !languages" in Wserver.wprint "%s" (Translate.language_name lang lang_def) | 'V' -> let txt = try List.assoc (get_variable strm) conf.base_env with [ Not_found -> "" ] in copy_from_string conf base txt mode | c -> Wserver.wprint "%s" (macro conf base c) ] | c -> if echo.val then Wserver.wprint "%c" c else () ] } with [ Stream.Failure -> () ] and src_translate conf base nomin strm echo mode = let c = Stream.next strm in if c = '\n' then let s = loop 0 0 (Stream.next strm) where rec loop lev len = fun [ '[' -> loop (lev + 1) (Lbuff.store len '[') (Stream.next strm) | ']' -> if lev = 0 then Lbuff.get len else loop (lev - 1) (Lbuff.store len ']') (Stream.next strm) | c -> loop lev (Lbuff.store len c) (Stream.next strm) ] in let (s, _) = Translate.inline conf.lang '%' (macro conf base) s in if not echo.val then () else copy_from_stream conf base (Stream.of_string s) mode else let s = lexicon_translate conf base nomin strm c in if not echo.val then () else Wserver.wprint "%s" s and copy_from_file conf base name mode = let fname = match mode with [ Lang -> any_lang_file_name name | Source -> source_file_name conf name ] in match try Some (Secure.open_in fname) with [ Sys_error _ -> None ] with [ Some ic -> copy_from_channel conf base ic mode | None -> do { Wserver.wprint "... file not found: \"%s.txt\"" name; html_br conf; } ] and copy_from_channel conf base ic mode = do { copy_from_stream conf base (Stream.of_channel ic) mode; close_in ic } and copy_from_string conf base str mode = copy_from_stream conf base (Stream.of_string str) mode ; value gen_print with_logo mode conf base fname = let channel = match mode with [ Lang -> try Some (Secure.open_in (lang_file_name conf fname)) with [ Sys_error _ -> try Some (Secure.open_in (any_lang_file_name fname)) with [ Sys_error _ -> None ] ] | Source -> try Some (Secure.open_in (source_file_name conf fname)) with [ Sys_error _ -> None ] ] in match channel with [ Some ic -> do { Util.html conf; Util.nl (); copy_from_channel conf base ic mode; Hutil.gen_trailer with_logo conf; } | _ -> let title _ = Wserver.wprint "Error" in do { Hutil.header conf title; tag "ul" begin html_li conf; Wserver.wprint "Cannot access file \"%s.txt\".\n" fname; end; Hutil.gen_trailer with_logo conf; raise Exit } ] ; value print_source = gen_print True Source; (* welcome page *) type env 'a = [ Vsosa_ref of Lazy.t (option person) | Vother of 'a | Vnone ] ; value get_env v env = try List.assoc v env with [ Not_found -> Vnone ] ; value get_vother = fun [ Vother x -> Some x | _ -> None ]; value set_vother x = Vother x; value eval_var conf base env () loc = fun [ ["base"; "has_notes"] -> VVbool (not (base_notes_are_empty base "")) | ["base"; "name"] -> VVstring conf.bname | ["base"; "nb_persons"] -> VVstring (string_of_num (Util.transl conf "(thousand separator)") (Num.of_int (nb_of_persons base))) | ["base"; "title"] -> let s = base_notes_read_first_line base "" in let len = String.length s in let s = if len > 9 && String.sub s 0 5 = "" then " : " ^ String.sub s 5 (String.length s - 9) else "" in VVstring s | ["browsing_with_sosa_ref"] -> match get_env "sosa_ref" env with [ Vsosa_ref v -> VVbool (Lazy.force v <> None) | _ -> raise Not_found ] | ["has_history"] -> VVbool (Sys.file_exists (History.file_name conf)) | ["has_misc_notes"] -> VVbool (notes_links conf <> []) | ["nb_accesses"] -> let r = count conf in let s = string_of_num (transl conf "(thousand separator)") (Num.of_int (r.welcome_cnt + r.request_cnt)) in VVstring s | ["nb_accesses_to_welcome"] -> let r = count conf in let s = string_of_num (transl conf "(thousand separator)") (Num.of_int r.welcome_cnt) in VVstring s | ["random"; "init"] -> do { Random.self_init (); VVstring "" } | ["random"; s] -> try VVstring (string_of_int (Random.int (int_of_string s))) with [ Failure _ | Invalid_argument _ -> raise Not_found ] | ["sosa_ref"] -> match get_env "sosa_ref" env with [ Vsosa_ref v -> match Lazy.force v with [ Some p -> VVstring (referenced_person_title_text conf base p) | None -> raise Not_found ] | _ -> raise Not_found ] | ["start_date"] -> VVstring (string_of_start_date conf) | ["wiznotes_dir_exists"] -> VVbool (Sys.file_exists (Wiznotes.dir conf base)) | _ -> raise Not_found ] ; value eval_predefined_apply conf env f vl = raise Not_found; value print_start conf base = let new_welcome = match p_getenv conf.base_env "old_welcome" with [ Some "yes" -> False | Some _ | None -> Mutil.utf_8_db.val ] in if new_welcome then do { let env = let sosa_ref_l = let sosa_ref () = Util.find_sosa_ref conf base in Lazy.from_fun sosa_ref in [("sosa_ref", Vsosa_ref sosa_ref_l)] in Wserver.wrap_string.val := Util.xml_pretty_print; Hutil.interp conf base "welcome" {Templ.eval_var = eval_var conf base; Templ.eval_transl env = Templ.eval_transl conf; Templ.eval_predefined_apply = eval_predefined_apply conf; Templ.get_vother = get_vother; Templ.set_vother = set_vother; Templ.print_foreach = fun []} env () } else let fname = if Sys.file_exists (lang_file_name conf conf.bname) then conf.bname else if Sys.file_exists (any_lang_file_name conf.bname) then conf.bname else if Mutil.utf_8_db.val then "start_utf8" else "start" in gen_print False Lang conf base fname ; (* code déplacé et modifié pour gérer advanced.txt *) value print conf base fname = if Sys.file_exists (Util.etc_file_name conf fname) then do { Wserver.wrap_string.val := Util.xml_pretty_print; Hutil.interp conf base fname {Templ.eval_var = eval_var conf base; Templ.eval_transl env = Templ.eval_transl conf; Templ.eval_predefined_apply = eval_predefined_apply conf; Templ.get_vother = get_vother; Templ.set_vother = set_vother; Templ.print_foreach = fun []} [] () } else gen_print True Lang conf base fname ; (* lexicon (info) *) value print_lexicon conf base = let title _ = Wserver.wprint "Lexicon" in let fname = let f = if Mutil.utf_8_db.val then "lex_utf8.txt" else "lexicon.txt" in search_in_lang_path (Filename.concat "lang" f) in do { Hutil.header conf title; match try Some (Secure.open_in fname) with [ Sys_error _ -> None ] with [ Some ic -> do { Wserver.wprint "
      \n";
                try
                  while True do {
                    match input_char ic with
                    [ '<' -> Wserver.wprint "<"
                    | c -> Wserver.wprint "%c" c ];
                  }
                with
                [ End_of_file -> () ];
                Wserver.wprint "
      \n"; close_in ic; } | None -> do { Wserver.wprint "... file not found: \"%s.txt\"" "lexicon"; html_br conf; } ]; Hutil.trailer conf; } ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/consang.mli0000660000175200017530000000204112664543647023340 0ustar guillaumeguillaume(* $Id: consang.mli,v 5.5 2007-01-19 01:53:16 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Def; open Gwdb; type anc_stat = 'a; type relationship = { weight1 : mutable float; weight2 : mutable float; relationship : mutable float; lens1 : mutable list (int * int * list iper); lens2 : mutable list (int * int * list iper); inserted : mutable int; elim_ancestors : mutable bool; anc_stat1 : mutable anc_stat; anc_stat2 : mutable anc_stat } ; type relationship_info = { tstab : array int; reltab : array relationship; queue : mutable array (list int) } ; exception TopologicalSortError of person; value topological_sort : base -> (base -> iper -> person) -> array int; value make_relationship_info : base -> array int -> relationship_info; value relationship_and_links : base -> relationship_info -> bool -> iper -> iper -> (float * list int); value check_noloop : base -> (error person -> unit) -> unit; value check_noloop_for_person_list : base -> (error person -> unit) -> list iper -> unit ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/relationLink.ml0000660000175200017530000006257512664543647024214 0ustar guillaumeguillaume(* camlp5r ./pa_html.cmo *) (* $Id: relationLink.ml,v 5.20 2007-09-12 09:58:44 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Config; open Def; open Gwdb; open Hutil; open Util; (* Algorithm *) type info = { ip : iper; sp : sex; ip1 : iper; ip2 : iper; b1 : list (iper * sex); b2 : list (iper * sex); c1 : int; c2 : int; pb1 : option (list (iper * sex)); pb2 : option (list (iper * sex)); nb1 : option (list (iper * sex)); nb2 : option (list (iper * sex)); sp1 : option person; sp2 : option person; bd : int; td_prop : string } ; type dist = { dmin : mutable int; dmax : mutable int; mark : bool }; value infinity = 1000; value threshold = ref 10; value phony_dist_tab = (fun _ -> 0, fun _ -> infinity); value tsort_leq tstab x y = if tstab.(x) = tstab.(y) then x >= y else tstab.(x) < tstab.(y) ; value make_dist_tab conf base ia maxlev = if maxlev <= threshold.val then phony_dist_tab else (* optimization to be used 1/ if database not too big or 2/ running on machines with much memory *) (* let () = load_unions_array base in let () = load_descends_array base in *) let tstab = Util.create_topological_sort conf base in let module Pq = Pqueue.Make (struct type t = int; value leq x y = not (tsort_leq tstab x y); end) in let default = {dmin = infinity; dmax = 0; mark = False} in let dist = Array.make (nb_of_persons base) default in let q = ref Pq.empty in let add_children ip = let u = pget conf base ip in for i = 0 to Array.length (get_family u) - 1 do { let des = foi base (get_family u).(i) in for j = 0 to Array.length (get_children des) - 1 do { let k = Adef.int_of_iper (get_children des).(j) in let d = dist.(k) in if not d.mark then do { dist.(k) := {dmin = infinity; dmax = 0; mark = True}; q.val := Pq.add k q.val } else () } } in do { dist.(Adef.int_of_iper ia) := {dmin = 0; dmax = 0; mark = True}; add_children ia; while not (Pq.is_empty q.val) do { let (k, nq) = Pq.take q.val in q.val := nq; match get_parents (pget conf base (Adef.iper_of_int k)) with [ Some ifam -> let cpl = foi base ifam in let dfath = dist.(Adef.int_of_iper (get_father cpl)) in let dmoth = dist.(Adef.int_of_iper (get_mother cpl)) in do { dist.(k).dmin := min dfath.dmin dmoth.dmin + 1; dist.(k).dmax := max dfath.dmax dmoth.dmax + 1; if dist.(k).dmin > maxlev then () else add_children (Adef.iper_of_int k) } | None -> () ] }; (fun ip -> dist.(Adef.int_of_iper ip).dmin, fun ip -> dist.(Adef.int_of_iper ip).dmax) } ; value find_first_branch conf base (dmin, dmax) ia = find [] where rec find br len ip sp = if ip = ia then if len = 0 then Some br else None else if len = 0 then None else if len < dmin ip || len > dmax ip then None else match get_parents (pget conf base ip) with [ Some ifam -> let cpl = foi base ifam in match find [(ip, sp) :: br] (len - 1) (get_father cpl) Male with [ Some _ as r -> r | None -> find [(ip, sp) :: br] (len - 1) (get_mother cpl) Female ] | None -> None ] ; value rec next_branch_same_len conf base dist backward missing ia sa ipl = if backward then match ipl with [ [] -> None | [(ip, sp) :: ipl1] -> match sa with [ Female -> next_branch_same_len conf base dist True (missing + 1) ip sp ipl1 | Male -> match get_parents (pget conf base ip) with [ Some ifam -> let cpl = foi base ifam in next_branch_same_len conf base dist False missing (get_mother cpl) Female ipl | _ -> failwith "next_branch_same_len" ] | Neuter -> assert False ] ] else if missing = 0 then Some (ia, sa, ipl) else if missing < fst dist ia || missing > snd dist ia then next_branch_same_len conf base dist True missing ia sa ipl else match get_parents (pget conf base ia) with [ Some ifam -> let cpl = foi base ifam in next_branch_same_len conf base dist False (missing - 1) (get_father cpl) Male [(ia, sa) :: ipl] | None -> next_branch_same_len conf base dist True missing ia sa ipl ] ; value find_next_branch conf base dist ia sa ipl = loop ia sa ipl where rec loop ia1 sa1 ipl = match next_branch_same_len conf base dist True 0 ia1 sa1 ipl with [ Some (ia1, sa1, ipl) -> if ia = ia1 then Some ipl else loop ia1 sa1 ipl | _ -> None ] ; value rec prev_branch_same_len conf base dist backward missing ia sa ipl = if backward then match ipl with [ [] -> None | [(ip, sp) :: ipl1] -> match sa with [ Male -> prev_branch_same_len conf base dist True (missing + 1) ip sp ipl1 | Female -> match get_parents (pget conf base ip) with [ Some ifam -> let cpl = foi base ifam in prev_branch_same_len conf base dist False missing (get_father cpl) Male ipl | _ -> failwith "prev_branch_same_len" ] | Neuter -> assert False ] ] else if missing = 0 then Some (ia, sa, ipl) else if missing < fst dist ia || missing > snd dist ia then prev_branch_same_len conf base dist True missing ia sa ipl else match get_parents (pget conf base ia) with [ Some ifam -> let cpl = foi base ifam in prev_branch_same_len conf base dist False (missing - 1) (get_mother cpl) Female [(ia, sa) :: ipl] | None -> prev_branch_same_len conf base dist True missing ia sa ipl ] ; value find_prev_branch conf base dist ia sa ipl = loop ia sa ipl where rec loop ia1 sa1 ipl = match prev_branch_same_len conf base dist True 0 ia1 sa1 ipl with [ Some (ia1, sa1, ipl) -> if ia = ia1 then Some ipl else loop ia1 sa1 ipl | _ -> None ] ; (* Printing *) value someone_text conf base ip = let p = pget conf base ip in referenced_person_title_text conf base p ^ Date.short_dates_text conf base p ; value spouse_text conf base end_sp ip ipl = match (ipl, (p_getenv conf.env "spouse", p_getenv conf.env "opt")) with [ ([(ips, _) :: _], (Some "on", _) | (_, Some "spouse")) -> let a = pget conf base ips in match get_parents a with [ Some ifam -> let fam = foi base ifam in let sp = if ip = get_father fam then get_mother fam else get_father fam in let d = Date.short_marriage_date_text conf base fam (pget conf base (get_father fam)) (pget conf base (get_mother fam)) in (someone_text conf base sp, d, Some sp) | _ -> ("", "", None) ] | ([], _) -> match end_sp with [ Some p -> (someone_text conf base (get_key_index p), "", Some (get_key_index p)) | _ -> ("", "", None) ] | _ -> ("", "", None) ] ; value print_someone_and_spouse conf base info in_tab ip n ipl = let (s, d, spo) = spouse_text conf base n ip ipl in do { if in_tab && (info.bd > 0 || info.td_prop <> "") then Wserver.wprint "
      " info.bd info.td_prop else (); Wserver.wprint "%s\n" (someone_text conf base ip); Wserver.wprint "%s" (Dag.image_txt conf base (pget conf base ip)); if s <> "" then do { xtag "br"; Wserver.wprint "&%s" d; Wserver.wprint " %s\n" s; match spo with [ Some ip -> Wserver.wprint "%s" (Dag.image_txt conf base (pget conf base ip)) | _ -> () ] } else (); if in_tab && (info.bd > 0 || info.td_prop <> "") then Wserver.wprint "
      " else (); } ; value rec print_both_branches conf base info pl1 pl2 = if pl1 = [] && pl2 = [] then () else do { let (p1, pl1) = match pl1 with [ [(p1, _) :: pl1] -> (Some p1, pl1) | [] -> (None, []) ] in let (p2, pl2) = match pl2 with [ [(p2, _) :: pl2] -> (Some p2, pl2) | [] -> (None, []) ] in tag "tr" "align=\"%s\"" conf.left begin stag "td" "align=\"center\"" begin match p1 with [ Some p1 -> Wserver.wprint "|" | None -> Wserver.wprint " " ]; end; stag "td" begin Wserver.wprint " "; end; stag "td" "align=\"center\"" begin match p2 with [ Some p2 -> Wserver.wprint "|" | None -> Wserver.wprint " " ]; end; Wserver.wprint "\n"; end; tag "tr" "align=\"%s\"" conf.left begin tag "td" "valign=\"top\" align=\"center\"" begin match p1 with [ Some p1 -> print_someone_and_spouse conf base info True p1 info.sp1 pl1 | None -> Wserver.wprint " " ]; end; tag "td" begin Wserver.wprint " "; end; tag "td" "valign=\"top\" align=\"center\"" begin match p2 with [ Some p2 -> print_someone_and_spouse conf base info True p2 info.sp2 pl2 | None -> Wserver.wprint " " ]; end; end; print_both_branches conf base info pl1 pl2 } ; value rec print_both_branches_pre conf base info sz pl1 pl2 = if pl1 = [] && pl2 = [] then () else do { let (p1, pl1) = match pl1 with [ [(p1, _) :: pl1] -> (Some p1, pl1) | [] -> (None, []) ] in let (p2, pl2) = match pl2 with [ [(p2, _) :: pl2] -> (Some p2, pl2) | [] -> (None, []) ] in let s1 = match p1 with [ Some p1 -> "|" | None -> " " ] in let s2 = match p2 with [ Some p2 -> "|" | None -> " " ] in print_pre_center sz (s1 ^ String.make (sz / 2) ' ' ^ s2); match p1 with [ Some p1 -> do { print_pre_left sz (someone_text conf base p1); let (s, d, _) = spouse_text conf base info.sp1 p1 pl1 in if s <> "" then print_pre_left sz ("&" ^ d ^ " " ^ s) else () } | None -> Wserver.wprint "\n" ]; match p2 with [ Some p2 -> do { print_pre_right sz (someone_text conf base p2); let (s, d, _) = spouse_text conf base info.sp2 p2 pl2 in if s <> "" then print_pre_right sz ("&" ^ d ^ " " ^ s) else () } | None -> Wserver.wprint "\n" ]; print_both_branches_pre conf base info sz pl1 pl2 } ; value include_marr conf base n = match find_person_in_env conf base n with [ Some p -> ";" ^ acces_n conf base n p | None -> "" ] ; value sign_text conf base sign info b1 b2 c1 c2 = " ";spouse=on" | _ -> "" ]) ^ (match p_getenv conf.env "image" with [ Some "on" -> ";image=on" | _ -> "" ]) ^ (match p_getenv conf.env "bd" with [ None | Some ("0" | "") -> "" | Some x -> ";bd=" ^ x ]) ^ (match p_getenv conf.env "td" with [ None | Some "" -> "" | Some x -> ";td=" ^ x ]) ^ (match p_getenv conf.env "color" with [ None | Some "" -> "" | Some x -> ";color=" ^ code_varenv x ]) ^ include_marr conf base "3" ^ include_marr conf base "4" ^ "\">" ^ sign ^ "" ; value prev_next_1_text conf base info pb nb = let s = match pb with [ Some b1 -> let sign = "<<" in sign_text conf base sign info b1 info.b2 (info.c1 - 1) info.c2 ^ "\n" | _ -> "" ] in let s = match (pb, nb) with [ (None, None) -> s | _ -> s ^ "" ^ string_of_int info.c1 ^ "" ] in match nb with [ Some b1 -> let sign = ">>" in s ^ "\n" ^ sign_text conf base sign info b1 info.b2 (info.c1 + 1) info.c2 | _ -> s ] ; value prev_next_2_text conf base info pb nb = let s = match pb with [ Some b2 -> let sign = "<<" in sign_text conf base sign info info.b1 b2 info.c1 (info.c2 - 1) ^ "\n" | _ -> "" ] in let s = match (pb, nb) with [ (None, None) -> s | _ -> s ^ "" ^ string_of_int info.c2 ^ "" ] in match nb with [ Some b2 -> let sign = ">>" in s ^ "\n" ^ sign_text conf base sign info info.b1 b2 info.c1 (info.c2 + 1) | _ -> s ] ; value print_prev_next_1 conf base info pb nb = Wserver.wprint "%s\n" (prev_next_1_text conf base info pb nb) ; value print_prev_next_2 conf base info pb nb = Wserver.wprint "%s\n" (prev_next_2_text conf base info pb nb) ; value other_parent_text_if_same conf base info = match (info.b1, info.b2) with [ ([(sib1, _) :: _], [(sib2, _) :: _]) -> match (get_parents (pget conf base sib1), get_parents (pget conf base sib2)) with [ (Some ifam1, Some ifam2) -> let cpl1 = foi base ifam1 in let cpl2 = foi base ifam2 in let other_parent = if get_father cpl1 = info.ip then if get_mother cpl1 = get_mother cpl2 then Some (get_mother cpl1) else None else if get_father cpl1 = get_father cpl2 then Some (get_father cpl1) else None in match other_parent with [ Some ip -> let d = Date.short_marriage_date_text conf base (foi base ifam1) (pget conf base (get_father cpl1)) (pget conf base (get_mother cpl1)) in Some ("&" ^ d ^ " " ^ someone_text conf base ip, ip) | _ -> None ] | _ -> None ] | _ -> None ] ; value print_someone_and_other_parent_if_same conf base info = do { if info.bd > 0 || info.td_prop <> "" then Wserver.wprint "
      " info.bd info.td_prop else (); Wserver.wprint "%s\n" (someone_text conf base info.ip); Wserver.wprint "%s" (Dag.image_txt conf base (pget conf base info.ip)); match other_parent_text_if_same conf base info with [ Some (s, ip) -> do { xtag "br"; Wserver.wprint "%s" s; Wserver.wprint "%s" (Dag.image_txt conf base (pget conf base ip)) } | None -> () ]; if info.bd > 0 || info.td_prop <> "" then Wserver.wprint "
      " else (); } ; value rec list_iter_hd_tl f = fun [ [x :: l] -> do { f x l; list_iter_hd_tl f l } | [] -> () ] ; value print_one_branch_no_table conf base info = let b = if info.b1 = [] then info.b2 else info.b1 in let sp = if info.b1 = [] then info.sp2 else info.sp1 in tag "div" "style=\"text-align:center\"" begin print_someone_and_spouse conf base info False info.ip sp b; xtag "br"; list_iter_hd_tl (fun (ip1, _) ipl1 -> do { Wserver.wprint "|"; xtag "br"; print_someone_and_spouse conf base info False ip1 sp ipl1; xtag "br"; }) b; end ; value print_one_branch_with_table conf base info = let b = if info.b1 = [] then info.b2 else info.b1 in let sp = if info.b1 = [] then info.sp2 else info.sp1 in tag "table" "border=\"%d\" cellspacing=\"0\" cellpadding=\"0\" width=\"100%%\"" conf.border begin tag "tr" begin tag "td" "align=\"center\"" begin print_someone_and_spouse conf base info True info.ip sp b; end; list_iter_hd_tl (fun (ip1, _) ipl1 -> do { tag "tr" begin tag "td" "align=\"center\"" begin Wserver.wprint "|"; end; end; tag "tr" begin tag "td" "align=\"center\"" begin print_someone_and_spouse conf base info True ip1 sp ipl1; end; end; }) b; end; end ; value print_two_branches_with_pre conf base info = let sz = 79 in tag "pre" begin print_pre_center sz (someone_text conf base info.ip); match other_parent_text_if_same conf base info with [ Some (s, ip) -> print_pre_center sz s | None -> () ]; print_pre_center sz "|"; print_pre_center sz (String.make (sz / 2) '_'); print_both_branches_pre conf base info sz info.b1 info.b2; if info.pb1 <> None || info.nb1 <> None || info.pb2 <> None || info.nb2 <> None then do { Wserver.wprint "\n"; if info.pb1 <> None || info.nb1 <> None then let s = prev_next_1_text conf base info info.pb1 info.nb1 in print_pre_left sz s else (); if info.pb2 <> None || info.nb2 <> None then let s = prev_next_2_text conf base info info.pb2 info.nb2 in print_pre_right sz s else () } else (); end ; value print_two_branches_with_table conf base info = tag "table" "border=\"%d\" cellspacing=\"0\" cellpadding=\"0\" width=\"100%%\"" conf.border begin tag "tr" "align=\"%s\"" "left" begin stag "td" "colspan=\"3\" align=\"center\"" begin print_someone_and_other_parent_if_same conf base info; end; end; tag "tr" "align=\"%s\"" "left" begin stag "td" "colspan=\"3\" align=\"center\"" begin Wserver.wprint "|"; end; end; tag "tr" "align=\"%s\"" "left" begin stagn "td" "align=\"%s\"" conf.right begin xtag "hr" "class=\"%s\"" conf.right; end; stagn "td" begin xtag "hr" "class=\"full\""; end; stagn "td" "align=\"%s\"" conf.left begin xtag "hr" "class=\"%s\"" conf.left; end; end; print_both_branches conf base info info.b1 info.b2; if not conf.cancel_links && (info.pb1 <> None || info.nb1 <> None || info.pb2 <> None || info.nb2 <> None) then tag "tr" "align=\"%s\"" "left" begin tag "td" begin if info.pb1 <> None || info.nb1 <> None then do { xtag "br"; print_prev_next_1 conf base info info.pb1 info.nb1 } else Wserver.wprint " "; end; tag "td" begin Wserver.wprint " "; end; tag "td" begin if info.pb2 <> None || info.nb2 <> None then do { xtag "br"; print_prev_next_2 conf base info info.pb2 info.nb2 } else Wserver.wprint " "; end; end else (); end ; value print_relation_path conf base info = let with_table = match p_getenv conf.env "tab" with [ Some "on" -> True | Some "off" -> False | _ -> not (browser_doesnt_have_tables conf) ] in if info.b1 = [] || info.b2 = [] then do { if (info.bd > 0 || info.td_prop <> "") && with_table then print_one_branch_with_table conf base info else print_one_branch_no_table conf base info; if not conf.cancel_links && (info.pb1 <> None || info.nb1 <> None || info.pb2 <> None || info.nb2 <> None) then do { tag "p" begin if info.pb1 <> None || info.nb1 <> None then print_prev_next_1 conf base info info.pb1 info.nb1 else (); if info.pb2 <> None || info.nb2 <> None then print_prev_next_2 conf base info info.pb2 info.nb2 else (); end } else () } else if with_table then print_two_branches_with_table conf base info else print_two_branches_with_pre conf base info ; value print_relation_ok conf base info = let title _ = do { Wserver.wprint "%s" (capitale (transl_nth conf "relationship link/relationship links" 0)); match (info.pb1, info.nb1) with [ (None, None) -> () | _ -> Wserver.wprint " %d" info.c1 ]; match (info.pb2, info.nb2) with [ (None, None) -> () | _ -> Wserver.wprint " %d" info.c2 ] } in do { header_no_page_title conf title; print_link_to_welcome conf True; xtag "p" "style=\"clear:both\""; print_relation_path conf base info; trailer conf } ; value print_relation_no_dag conf base po ip1 ip2 = let params = match (po, p_getint conf.env "l1", p_getint conf.env "l2") with [ (Some p, Some l1, Some l2) -> let ip = get_key_index p in let dist = make_dist_tab conf base ip (max l1 l2 + 1) in let b1 = find_first_branch conf base dist ip l1 ip1 Neuter in let b2 = find_first_branch conf base dist ip l2 ip2 Neuter in Some (ip, get_sex (pget conf base ip), dist, b1, b2, 1, 1) | _ -> match (p_getenv conf.env "b1", p_getenv conf.env "b2") with [ (Some b1str, Some b2str) -> let n1 = Num.of_string b1str in let n2 = Num.of_string b2str in match (branch_of_sosa conf base ip1 n1, branch_of_sosa conf base ip2 n2) with [ (Some [(ia1, sa1) :: b1], Some [(ia2, sa2) :: b2]) -> if ia1 = ia2 then let c1 = match p_getint conf.env "c1" with [ Some n -> n | None -> 0 ] in let c2 = match p_getint conf.env "c2" with [ Some n -> n | None -> 0 ] in let dist = if c1 > 0 || c2 > 0 then let maxlev = max (List.length b1) (List.length b2) + 1 in make_dist_tab conf base ia1 maxlev else phony_dist_tab in Some (ia1, sa1, dist, Some b1, Some b2, c1, c2) else None | _ -> None ] | _ -> None ] ] in match params with [ Some (ip, sp, dist, Some b1, Some b2, c1, c2) -> let pb1 = if c1 <= 1 then None else find_prev_branch conf base dist ip sp b1 in let nb1 = if c1 = 0 then None else find_next_branch conf base dist ip sp b1 in let pb2 = if c2 <= 1 then None else find_prev_branch conf base dist ip sp b2 in let nb2 = if c2 = 0 then None else find_next_branch conf base dist ip sp b2 in let sp1 = find_person_in_env conf base "3" in let sp2 = find_person_in_env conf base "4" in let bd = match p_getint conf.env "bd" with [ Some x -> x | None -> 0 ] in let td_prop = match Util.p_getenv conf.env "td" with [ Some x -> " " ^ x | _ -> match Util.p_getenv conf.env "color" with [ None | Some "" -> "" | Some x -> " class=\"" ^ x ^ "\"" ] ] in let info = {ip = ip; sp = sp; ip1 = ip1; ip2 = ip2; b1 = b1; b2 = b2; c1 = c1; c2 = c2; pb1 = pb1; pb2 = pb2; nb1 = nb1; nb2 = nb2; sp1 = sp1; sp2 = sp2; bd = bd; td_prop = td_prop} in print_relation_ok conf base info | _ -> incorrect_request conf ] ; value print_relation_dag conf base a ip1 ip2 l1 l2 = let ia = get_key_index a in let add_branches dist set n ip l = let b = find_first_branch conf base dist ia l ip Neuter in let rec loop set n b = if n > 100 then raise Exit else match b with [ Some b -> let set = List.fold_left (fun set (ip, _) -> Dag.Pset.add ip set) set b in loop set (n + 1) (find_next_branch conf base dist ia (get_sex a) b) | None -> (set, n) ] in loop set n b in try let set = List.fold_left (fun set l1 -> List.fold_left (fun set l2 -> let dist = make_dist_tab conf base ia (max l1 l2 + 1) in let (set, n) = add_branches dist set 0 ip1 l1 in let (set, n) = add_branches dist set n ip2 l2 in set) set l2) (Dag.Pset.add ia Dag.Pset.empty) l1 in let spl = List.fold_right (fun (ip, s) spl -> match find_person_in_env conf base s with [ Some sp -> [(ip, (get_key_index sp, None)) :: spl] | None -> spl ]) [(ip1, "3"); (ip2, "4")] [] in let elem_txt p = Dag.Item p "" in let vbar_txt ip = "" in let invert = match Util.p_getenv conf.env "invert" with [ Some "on" -> True | _ -> False ] in let page_title = Util.capitale (Util.transl conf "tree") in Dag.make_and_print_dag conf base elem_txt vbar_txt invert set spl page_title "" with [ Exit -> Hutil.incorrect_request conf ] ; value int_list s = loop 0 0 where rec loop i n = if i = String.length s then [n] else match s.[i] with [ '0'..'9' as d -> loop (i + 1) (n * 10 + Char.code d - Char.code '0') | _ -> [n :: loop (i + 1) 0] ] ; value print_relation conf base p1 p2 = let l1 = p_getenv conf.env "l1" in let l2 = p_getenv conf.env "l2" in let po = find_person_in_env conf base "" in match (p_getenv conf.env "dag", po, l1, l2) with [ (Some "on", Some p, Some l1, Some l2) -> print_relation_dag conf base p (get_key_index p1) (get_key_index p2) (int_list l1) (int_list l2) | _ -> print_relation_no_dag conf base po (get_key_index p1) (get_key_index p2) ] ; value print conf base = do { Wserver.wrap_string.val := Util.xml_pretty_print; match (find_person_in_env conf base "1", find_person_in_env conf base "2") with [ (Some p1, Some p2) -> print_relation conf base p1 p2 | _ -> incorrect_request conf ] }; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/update.ml0000660000175200017530000011247712664543647023040 0ustar guillaumeguillaume(* camlp5r ./pa_html.cmo *) (* $Id: update.ml,v 5.48 2008-01-08 11:58:46 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Config; open Def; open Gutil; open Gwdb; open Hutil; open Util; exception ModErr; type create_info = { ci_birth_date : option date; ci_birth_place : string; ci_death : death; ci_death_date : option date; ci_death_place : string; ci_occupation : string; ci_public : bool } ; type create = [ Create of sex and option create_info | Link ]; type key = (string * string * int * create * string); value infer_death conf birth bapt = match (birth, bapt) with [ (Some (Dgreg d _), _) -> let a = (CheckItem.time_elapsed d conf.today).year in if a > 120 then OfCourseDead else if a <= 80 then NotDead else DontKnowIfDead | (_, Some (Dgreg d _)) -> let a = (CheckItem.time_elapsed d conf.today).year in if a > 120 then OfCourseDead else if a <= 80 then NotDead else DontKnowIfDead | _ -> DontKnowIfDead ] ; value restrict_to_small_list el = begin_list 0 [] el where rec begin_list n rl el = if n > 25 then end_list 0 [] (List.rev el) where rec end_list n sl el = if n > 25 then List.rev_append rl [None :: sl] else match el with [ [e :: el] -> end_list (n + 1) [Some e :: sl] el | [] -> List.rev_append rl sl ] else match el with [ [e :: el] -> begin_list (n + 1) [Some e :: rl] el | [] -> List.rev rl ] ; value print_same_name conf base p = match Gutil.find_same_name base p with [ [_] -> () | pl -> let print_person p = do { stag "a" "href=\"%s%s\"" (commd conf) (acces conf base p) begin Wserver.wprint "%s.%d %s" (p_first_name base p) (get_occ p) (p_surname base p); end; Wserver.wprint "%s" (Date.short_dates_text conf base p) } in let pl = restrict_to_small_list pl in tag "p" begin Wserver.wprint "%s:\n" (capitale (transl conf "persons having the same name")); tag "ul" begin List.iter (fun p -> stag "li" begin match p with [ Some p -> do { print_person p; let ifam = get_family p in List.iter (fun ifam -> do { let fam = foi base ifam in let sp = spouse (get_key_index p) fam in let sp = poi base sp in Wserver.wprint ", & "; print_person sp } ) (Array.to_list ifam); Wserver.wprint "\n" } | None -> Wserver.wprint "...\n" ]; end) pl; end; end ] ; value print_return conf = tag "p" begin tag "form" "method=\"post\" action=\"%s\"" conf.command begin List.iter (fun (x, v) -> (* Seul un textarea peut contenir des sauts de ligne. *) (* On remplace donc l'input par un textarea. *) if x = "notes" || x = "comment" then tag "textarea" "style=\"display:none;\" name=\"%s\"" x begin Wserver.wprint "%s" (quote_escaped (decode_varenv v)); end else xtag "input" "type=\"hidden\" name=\"%s\" value=\"%s\"" x (quote_escaped (decode_varenv v))) (conf.henv @ conf.env); xtag "input" "type=\"hidden\" name=\"return\" value=\"on\""; xtag "input" "type=\"submit\" value=\"%s\"" (capitale (transl conf "back")); end; end ; value print_err_unknown conf base (f, s, o) = let title _ = Wserver.wprint "%s" (capitale (transl conf "error")) in do { rheader conf title; Wserver.wprint "%s: %s.%d %s\n" (capitale (transl conf "unknown person")) f o s; print_return conf; trailer conf; raise ModErr } ; value update_misc_names_of_family base p_sex u = match p_sex with [ Male -> List.iter (fun ifam -> let fam = foi base ifam in List.iter (fun ip -> List.iter (fun name -> if not (List.mem ip (person_ht_find_all base name)) then person_ht_add base name ip else ()) (person_misc_names base (poi base ip) get_titles)) [get_mother fam :: Array.to_list (get_children fam)]) (Array.to_list u.family) | _ -> () ] ; value delete_topological_sort_v conf base = let bfile = Util.base_path [] (conf.bname ^ ".gwb") in do { let tstab_file = Filename.concat bfile "tstab_visitor" in try Sys.remove tstab_file with [ Sys_error _ -> () ]; let tstab_file = Filename.concat bfile "restrict" in try Sys.remove tstab_file with [ Sys_error _ -> () ] } ; value delete_topological_sort conf base = let _ = delete_topological_sort_v conf base in let bfile = Util.base_path [] (conf.bname ^ ".gwb") in let tstab_file = Filename.concat bfile "tstab" in try Sys.remove tstab_file with [ Sys_error _ -> () ] ; value print_someone conf base p = Wserver.wprint "%s%s %s" (p_first_name base p) (if get_occ p = 0 then "" else "." ^ string_of_int (get_occ p)) (p_surname base p) ; value print_first_name conf base p = Wserver.wprint "%s%s" (p_first_name base p) (if get_occ p = 0 then "" else "." ^ string_of_int (get_occ p)) ; value print_someone_strong conf base p = Printf.sprintf "%s%s %s" (p_first_name base p) (if get_occ p = 0 then "" else "." ^ string_of_int (get_occ p)) (p_surname base p) ; value print_first_name_strong conf base p = Wserver.wprint "%s%s" (p_first_name base p) (if get_occ p = 0 then "" else "." ^ string_of_int (get_occ p)) ; value print_error conf base = fun [ AlreadyDefined p -> Wserver.wprint (fcapitale (ftransl conf "name %s already used by %tthis person%t")) ("\"" ^ p_first_name base p ^ "." ^ string_of_int (get_occ p) ^ " " ^ p_surname base p ^ "\"") (fun _ -> Printf.sprintf "" (commd conf) (acces conf base p)) (fun _ -> ".") | OwnAncestor p -> Wserver.wprint "%s\n%s" (print_someone_strong conf base p) (transl conf "would be his/her own ancestor") | BadSexOfMarriedPerson p -> Wserver.wprint "%s." (capitale (transl conf "cannot change sex of a married person")) ] ; value print_someone_ref conf base p = Wserver.wprint "\n%s%s %s" (commd conf) (acces conf base p) (p_first_name base p) (if get_occ p = 0 then "" else "." ^ string_of_int (get_occ p)) (p_surname base p) ; value someone_ref_text conf base p = "\n" ^ p_first_name base p ^ (if get_occ p = 0 then "" else "." ^ string_of_int (get_occ p)) ^ " " ^ p_surname base p ^ "" ; value print_first_name_ref conf base p = Wserver.wprint "%s" (someone_ref_text conf base p) ; value print_warning conf base = fun [ BigAgeBetweenSpouses fath moth a -> do { Wserver.wprint (fcapitale (ftransl conf "the difference of age between %t and %t is quite important")) (fun _ -> print_someone_strong conf base fath) (fun _ -> print_someone_strong conf base moth); Wserver.wprint ": %s" (Date.string_of_age conf a) } | BirthAfterDeath p -> Wserver.wprint (ftransl conf "%t died before his/her birth") (fun _ -> Printf.sprintf "%s%s" (print_someone_strong conf base p) (Date.short_dates_text conf base p)) | ChangedOrderOfChildren ifam des before after -> do { let cpl = foi base ifam in let fath = poi base (get_father cpl) in let moth = poi base (get_mother cpl) in Wserver.wprint "%s\n" (capitale (transl conf "changed order of children")); Wserver.wprint "->\n"; Wserver.wprint "%s" (someone_ref_text conf base fath ^ "\n" ^ transl_nth conf "and" 0 ^ " " ^ someone_ref_text conf base moth ^ "\n"); let print_list arr diff_arr = Array.iteri (fun i ip -> let p = poi base ip in tag "li" "%s" (if diff_arr.(i) then "style=\"background:pink\"" else "") begin if eq_istr (get_surname p) (get_surname fath) then print_first_name conf base p else print_someone conf base p; Wserver.wprint "%s" (Date.short_dates_text conf base p); Wserver.wprint "\n"; end) arr in let (bef_d, aft_d) = Diff.f before after in tag "table" "style=\"margin:1em\"" begin tag "tr" begin tag "td" begin tag "ul" "style=\"list-style-type:none\"" begin print_list before bef_d; end; end; tag "td" begin tag "ul" "style=\"list-style-type:none\"" begin print_list after aft_d; end; end; end; end } | ChildrenNotInOrder ifam des elder x -> let cpl = foi base ifam in do { Wserver.wprint (fcapitale (ftransl conf "the following children of %t and %t are not in order")) (fun _ -> print_someone_strong conf base (poi base (get_father cpl))) (fun _ -> print_someone_strong conf base (poi base (get_mother cpl))); Wserver.wprint ":\n"; tag "ul" begin stag "li" begin print_first_name_strong conf base elder; Wserver.wprint "%s" (Date.short_dates_text conf base elder); end; stag "li" begin print_first_name_strong conf base x; Wserver.wprint "%s" (Date.short_dates_text conf base x); end; end; } | ChangedOrderOfMarriages p before after -> do { Wserver.wprint "%s\n" (capitale (transl conf "changed order of marriages")); Wserver.wprint "->\n"; let print_list arr diff_arr = Array.iteri (fun i ifam -> let fam = foi base ifam in let sp = spouse (get_key_index p) fam in let sp = poi base sp in tag "li" "%s" (if diff_arr.(i) then "style=\"background:pink\"" else "") begin print_first_name conf base p; Wserver.wprint " &"; Wserver.wprint "%s\n" (Date.short_marriage_date_text conf base fam p sp); print_someone conf base sp; Wserver.wprint "\n"; end) arr in let (bef_d, aft_d) = Diff.f before after in tag "table" "style=\"margin:1em\"" begin tag "tr" begin tag "td" begin tag "ul" "style=\"list-style-type:none\"" begin print_list before bef_d; end; end; tag "td" begin tag "ul" "style=\"list-style-type:none\"" begin print_list after aft_d; end; end; end; end } | CloseChildren ifam des elder x -> let cpl = foi base ifam in do { Wserver.wprint (fcapitale (ftransl conf "the following children of %t and %t are born very close")) (fun _ -> print_someone_strong conf base (poi base (get_father cpl))) (fun _ -> print_someone_strong conf base (poi base (get_mother cpl))); Wserver.wprint ":\n"; tag "ul" begin stag "li" begin print_first_name_strong conf base elder; Wserver.wprint "%s" (Date.short_dates_text conf base elder); end; stag "li" begin print_first_name_strong conf base x; Wserver.wprint "%s" (Date.short_dates_text conf base x); end; end; } | DeadOld p a -> do { Wserver.wprint "%s\n%s\n" (print_someone_strong conf base p) (transl_nth conf "died at an advanced age" (index_of_sex (get_sex p))); Wserver.wprint "(%s)" (Date.string_of_age conf a); } | DeadTooEarlyToBeFather father child -> Wserver.wprint (ftransl conf "\ %t is born more than 2 years after the death of his/her father %t") (fun _ -> Printf.sprintf "%s%s" (print_someone_strong conf base child) (Date.short_dates_text conf base child)) (fun _ -> Printf.sprintf "%s%s" (print_someone_strong conf base father) (Date.short_dates_text conf base father)) | IncoherentSex p _ _ -> Wserver.wprint (fcapitale (ftransl conf "%t's sex is not coherent with his/her relations")) (fun _ -> print_someone_strong conf base p) | IncoherentAncestorDate anc p -> Wserver.wprint "%s has a younger ancestor %s" (print_someone_strong conf base p) (print_someone_strong conf base anc) | MarriageDateAfterDeath p -> Wserver.wprint (fcapitale (ftransl conf "marriage had occured after the death of %t")) (fun _ -> Printf.sprintf "%s%s" (print_someone_strong conf base p) (Date.short_dates_text conf base p)) | MarriageDateBeforeBirth p -> Wserver.wprint (fcapitale (ftransl conf "marriage had occured before the birth of %t")) (fun _ -> Printf.sprintf "%s%s" (print_someone_strong conf base p) (Date.short_dates_text conf base p)) | MotherDeadAfterChildBirth mother child -> Wserver.wprint (ftransl conf "%t is born after the death of his/her mother %t") (fun _ -> Printf.sprintf "%s%s" (print_someone_strong conf base child) (Date.short_dates_text conf base child)) (fun _ -> Printf.sprintf "%s%s" (print_someone_strong conf base mother) (Date.short_dates_text conf base mother)) | ParentBornAfterChild p c -> Wserver.wprint "%s\n%s\n%s" (print_someone_strong conf base p) (transl conf "is born after his/her child") (print_someone_strong conf base c) | ParentTooYoung p a -> do { Wserver.wprint "%s\n%s\n" (print_someone_strong conf base p) (transl conf "is a very young parent"); Wserver.wprint "(%s)" (Date.string_of_age conf a); } | ParentTooOld p a -> do { Wserver.wprint "%s\n%s\n" (print_someone_strong conf base p) (transl conf "is a very old parent"); Wserver.wprint "(%s)" (Date.string_of_age conf a); } | TitleDatesError p t -> Wserver.wprint (fcapitale (ftransl conf "%t has incorrect title dates: %t")) (fun _ -> Printf.sprintf "%s%s" (print_someone_strong conf base p) (Date.short_dates_text conf base p)) (fun _ -> Printf.sprintf "%s %s %s-%s" (sou base t.t_ident) (sou base t.t_place) (match Adef.od_of_codate t.t_date_start with [ Some d -> Date.string_of_date conf d | _ -> "" ]) (match Adef.od_of_codate t.t_date_end with [ Some d -> Date.string_of_date conf d | _ -> "" ])) | UndefinedSex p -> Wserver.wprint (fcapitale (ftransl conf "undefined sex for %t")) (fun _ -> print_someone_strong conf base p) | WitnessDateAfterDeath p -> Wserver.wprint (fcapitale (ftransl conf "%t was witness after his/her death")) (fun _ -> Printf.sprintf "%s%s" (print_someone_strong conf base p) (Date.short_dates_text conf base p)) | WitnessDateBeforeBirth p -> Wserver.wprint (fcapitale (ftransl conf "%t was witness before his/her birth")) (fun _ -> Printf.sprintf "%s%s" (print_someone_strong conf base p) (Date.short_dates_text conf base p)) | YoungForMarriage p a -> do { Wserver.wprint "%s\n" (print_someone_strong conf base p); Wserver.wprint (ftransl conf "married at age %t") (fun _ -> Date.string_of_age conf a); } ] ; value print_warnings conf base wl = if wl = [] then () else do { Wserver.wprint "%s\n" (capitale (transl conf "warnings")); tag "ul" begin (* On rend la liste unique, parce qu'il se peut qu'un warning soit *) (* levé par plusieurs fonctions différents selon le context. *) let wl = let ht = Hashtbl.create 1 in loop wl [] where rec loop wl accu = match wl with [ [] -> accu | [x :: wl] -> if Hashtbl.mem ht (Hashtbl.hash x) then loop wl accu else do { Hashtbl.add ht (Hashtbl.hash x) True; loop wl [x :: accu] } ] in List.iter (fun w -> do { html_li conf; print_warning conf base w; Wserver.wprint "\n" }) wl; end } ; (* ************************************************************************* *) (* [Fonc] print_misc : config -> base -> Def.misc -> unit *) (** [Description] : Fonction d'impression des 'informations diverses'. [Args] : - conf : configuration - base : base - fun : Def.misc (miscellaneous) [Retour] : - unit [Rem] : Non exporté en clair hors de ce module. *) (* ************************************************************************* *) value print_misc conf base = fun [ MissingSources -> stag "em" begin Wserver.wprint "%s\n" (capitale (transl conf "missing sources")); end ] ; (* ************************************************************************* *) (* [Fonc] print_miscs : config -> base -> Def.misc list -> unit *) (** [Description] : Affiche la liste des 'informations diverses'. [Args] : - conf : configuration - base : base - ml : Def.misc list (miscellaneous) [Retour] : - unit [Rem] : Exporté en clair hors de ce module. *) (* ************************************************************************* *) value print_miscs conf base ml = if ml = [] then () else do { Wserver.wprint "%s\n" (capitale (transl conf "miscellaneous informations")); tag "ul" begin List.iter (fun m -> do { html_li conf; print_misc conf base m; Wserver.wprint "\n" }) ml; end } ; (* ************************************************************************* *) (* [Fonc] print_miscs : config -> base -> (Def.warning list * Def.misc list) -> unit *) (** [Description] : Affiche sous la même rubrique, la liste des warnings et la liste des 'informations diverses'. [Args] : - conf : configuration - base : base - wl : Def.warning list - ml : Def.misc list (miscellaneous) [Retour] : - unit [Rem] : Exporté en clair hors de ce module. *) (* ************************************************************************* *) value print_warnings_and_miscs conf base (wl, ml) = if wl = [] && ml = [] then () else do { Wserver.wprint "%s\n" (capitale (transl conf "warnings")); tag "ul" begin List.iter (fun w -> do { html_li conf; print_warning conf base w; Wserver.wprint "\n" }) wl; List.iter (fun m -> do { html_li conf; print_misc conf base m; Wserver.wprint "\n" }) ml; end } ; value error conf base x = let title _ = Wserver.wprint "%s" (capitale (transl conf "error")) in do { rheader conf title; print_error conf base x; Wserver.wprint "\n"; print_return conf; trailer conf; raise ModErr } ; value error_locked conf = let title _ = Wserver.wprint "%s" (capitale (transl conf "error")) in do { rheader conf title; tag "p" begin Wserver.wprint (fcapitale (ftransl conf "the file is temporarily locked: please try again")); Wserver.wprint ".\n"; end; tag "table" begin tag "tr" begin tag "td" begin tag "form" "method=\"post\" action=\"%s\"" conf.command begin List.iter (fun (x, v) -> if x = "retry" then () else do { (* Seul un textarea peut contenir des sauts de ligne. *) (* On remplace donc l'input par un textarea. *) if x = "notes" then tag "textarea" "style=\"display:none;\" name=\"%s\"" x begin Wserver.wprint "%s" (quote_escaped (decode_varenv v)); end else xtag "input" "type=\"hidden\" name=\"%s\" value=\"%s\"" x (quote_escaped (decode_varenv v))}) (conf.henv @ conf.env); (* just to see in the traces... *) xtag "input" "type=\"hidden\" name=\"retry\" value=\"%s\"" (quote_escaped conf.user); xtag "input" "type=\"submit\" value=\"%s\"" (capitale (transl conf "try again")); end; end; tag "td" begin tag "form" "method=\"get\" action=\"%s\"" conf.command begin List.iter (fun (x, v) -> xtag "input" "type=\"hidden\" name=\"%s\" value=\"%s\"" x (quote_escaped (decode_varenv v))) conf.henv; let ip = match p_getenv conf.env "ip" with [ Some ip -> Some ip | None -> p_getenv conf.env "i" ] in match ip with [ Some n -> xtag "input" "type=\"hidden\" name=\"i\" value=\"%s\"" n | None -> () ]; xtag "input" "type=\"submit\" value=\"%s\"" (capitale (transl_nth conf "user/password/cancel" 2)); end; end; end; end; trailer conf } ; value error_digest conf = let title _ = Wserver.wprint "%s" (capitale (transl conf "error")) in do { rheader conf title; print_link_to_welcome conf True; tag "p" begin Wserver.wprint (fcapitale (ftransl conf "\ the base has changed; do \"back\", \"reload\", and refill the form")); Wserver.wprint ".\n"; end; trailer conf; raise ModErr } ; value digest_person p = Iovalue.digest p; value digest_family (fam, cpl, des) = Iovalue.digest (fam, cpl, des); value get var key env = match p_getenv env (var ^ "_" ^ key) with [ Some v -> v | None -> failwith (var ^ "_" ^ key ^ " unbound") ] ; value get_number var key env = p_getint env (var ^ "_" ^ key); value bad_date conf d = let title _ = Wserver.wprint "%s" (capitale (transl conf "error")) in do { rheader conf title; Wserver.wprint "%s:\n" (capitale (transl conf "incorrect date")); match d with [ {day = 0; month = 0; year = a} -> Wserver.wprint "%d" a | {day = 0; month = m; year = a} -> Wserver.wprint "%d/%d" m a | {day = j; month = m; year = a} -> Wserver.wprint "%d/%d/%d" j m a ]; trailer conf; raise ModErr } ; value int_of_field s = try Some (int_of_string (strip_spaces s)) with [ Failure _ -> None ] ; value reconstitute_date_dmy conf var = let (prec, y) = let y = get var "yyyy" conf.env in let prec = p_getenv conf.env (var ^ "_prec") in let len = String.length y in if len > 1 then match (y.[0], y.[len-1]) with [ ('?', _) -> (Some "maybe", String.sub y 1 (len - 1)) | ('~', _) -> (Some "about", String.sub y 1 (len - 1)) | ('/', '/') -> (Some "about", String.sub y 1 (len - 2)) | ('<', _) | ('/', _) -> (Some "before", String.sub y 1 (len - 1)) | ('>', _) -> (Some "after", String.sub y 1 (len - 1)) | (_, '/') -> (Some "after", String.sub y 0 (len - 1)) | _ -> (prec, y) ] else (prec, y) in let (force_f_cal, m) = let m = get var "mm" conf.env in match String.uppercase m with [ "VD" -> (True, Some 1) | "BR" -> (True, Some 2) | "FM" -> (True, Some 3) | "NI" -> (True, Some 4) | "PL" -> (True, Some 5) | "VT" -> (True, Some 6) | "GE" -> (True, Some 7) | "FL" -> (True, Some 8) | "PR" -> (True, Some 9) | "ME" -> (True, Some 10) | "TH" -> (True, Some 11) | "FT" -> (True, Some 12) | "JC" -> (True, Some 13) | _ -> (False, int_of_field m) ] in let d = match int_of_field y with [ Some y -> let prec = match prec with [ Some "about" -> About | Some "maybe" -> Maybe | Some "before" -> Before | Some "after" -> After | Some "oryear" -> match get_number var "oryear" conf.env with [ Some y -> OrYear y | None -> Sure ] | Some "yearint" -> match get_number var "oryear" conf.env with [ Some y -> YearInt y | None -> Sure ] | _ -> Sure ] in match m with [ Some m -> match get_number var "dd" conf.env with [ Some d -> let d = {day = d; month = m; year = y; prec = prec; delta = 0} in if d.day >= 1 && d.day <= 31 && d.month >= 1 && d.month <= 13 then Some d else bad_date conf d | None -> let d = {day = 0; month = m; year = y; prec = prec; delta = 0} in if d.month >= 1 && d.month <= 13 then Some d else bad_date conf d ] | None -> Some {day = 0; month = 0; year = y; prec = prec; delta = 0} ] | None -> None ] in (d, force_f_cal) ; value check_greg_day conf d = if d.day > CheckItem.nb_days_in_month d.month d.year then bad_date conf d else () ; value reconstitute_date conf var = match reconstitute_date_dmy conf var with [ (Some d, False) -> let (d, cal) = match p_getenv conf.env (var ^ "_cal") with [ Some "G" | None -> do { check_greg_day conf d; (d, Dgregorian) } | Some "J" -> (Calendar.gregorian_of_julian d, Djulian) | Some "F" -> (Calendar.gregorian_of_french d, Dfrench) | Some "H" -> (Calendar.gregorian_of_hebrew d, Dhebrew) | _ -> (d, Dgregorian) ] in Some (Dgreg d cal) | (Some d, True) -> Some (Dgreg (Calendar.gregorian_of_french d) Dfrench) | (None, _) -> match p_getenv conf.env (var ^ "_text") with [ Some txt -> let txt = only_printable (get var "text" conf.env) in if txt = "" then None else Some (Dtext txt) | _ -> None ] ] ; value rec parse_int n = parser [ [: `('0'..'9' as i); s :] -> parse_int (10 * n + Char.code i - Char.code '0') s | [: :] -> n ] ; value parse_r_parent = parser [ [: `'f' :] -> 0 | [: `'m' :] -> 1 ]; value text_of_var conf = fun [ "pa1" -> transl_nth conf "him/her" 0 | "pa2" -> transl_nth conf "him/her" 1 | var -> match Stream.of_string var with parser [ [: `'r'; pos = parse_int 0; `'_'; pn = parse_r_parent :] -> transl_nth conf "relation/relations" 0 ^ " " ^ string_of_int pos ^ " - " ^ transl_nth conf "father/mother" pn | [: `'w'; `'i'; `'t'; `'n'; pos = parse_int 0 :] -> transl_nth conf "witness/witnesses" 0 ^ " " ^ string_of_int pos | [: `'c'; `'h'; pos = parse_int 0 :] -> Util.translate_eval (transl_nth conf "child/children" 0) ^ " " ^ string_of_int pos | [: :] -> var ] ] ; value print_create_conflict conf base p var = let text = text_of_var conf var in let title _ = Wserver.wprint "%s" (capitale (transl conf "error")) in do { rheader conf title; Wserver.wprint (fcapitale (ftransl conf "name %s already used by %tthis person%t")) ("\"" ^ p_first_name base p ^ "." ^ string_of_int (get_occ p) ^ " " ^ p_surname base p ^ "\" (" ^ text ^ ")") (fun _ -> Printf.sprintf "" (commd conf) (acces conf base p)) (fun _ -> "."); let free_n = find_free_occ base (p_first_name base p) (p_surname base p) 0 in tag "form" "method=\"post\" action=\"%s\"" conf.command begin List.iter (fun (x, v) -> (* Seul un textarea peut contenir des sauts de ligne. *) (* On remplace donc l'input par un textarea. *) if x = "notes" then tag "textarea" "style=\"display:none;\" name=\"%s\"" x begin Wserver.wprint "%s" (quote_escaped (decode_varenv v)); end else xtag "input" "type=\"hidden\" name=\"%s\" value=\"%s\"" x (quote_escaped (decode_varenv v))) (conf.henv @ conf.env); xtag "input" "type=\"hidden\" name=\"field\" value=\"%s\"" var; xtag "input" "type=\"hidden\" name=\"free_occ\" value=\"%d\"" free_n; tag "ul" begin stag "li" begin Wserver.wprint "%s: %d. \n" (capitale (transl conf "first free number")) free_n; Wserver.wprint (fcapitale (ftransl conf "click on \"%s\"")) (transl conf "create"); Wserver.wprint "%s." (transl conf " to try again with this number"); end; stag "li" begin Wserver.wprint "%s " (capitale (transl conf "or")); Wserver.wprint (ftransl conf "click on \"%s\"") (transl conf "back"); Wserver.wprint " %s %s." (transl_nth conf "and" 0) (transl conf "change it (the number) yourself"); end; stag "li" begin Wserver.wprint "%s " (capitale (transl conf "or")); Wserver.wprint (ftransl conf "click on \"%s\"") (transl conf "back"); Wserver.wprint " %s %s." (transl_nth conf "and" 0) (transl conf "use \"link\" instead of \"create\""); end; end; xtag "input" "type=\"submit\" name=\"create\" value=\"%s\"" (capitale (transl conf "create")); xtag "input" "type=\"submit\" name=\"return\" value=\"%s\"" (capitale (transl conf "back")); end; print_same_name conf base p; trailer conf; raise ModErr } ; value add_misc_names_for_new_persons base new_persons = List.iter (fun p -> List.iter (fun n -> person_ht_add base n p.key_index) (gen_person_misc_names base p (fun p -> p.titles))) new_persons ; value insert_person conf base src new_persons (f, s, o, create, var) = let f = if f = "" then "?" else f in let s = if s = "" then "?" else s in match create with [ Create sex info -> try if f = "?" || s = "?" then if o <= 0 || o >= nb_of_persons base then raise Not_found else let ip = Adef.iper_of_int o in let p = poi base ip in if p_first_name base p = f && p_surname base p = s then ip else raise Not_found else match person_of_key base f s o with [ Some ip -> print_create_conflict conf base (poi base ip) var | None -> raise Not_found ] with [ Not_found -> do { let o = if f = "?" || s = "?" then 0 else o in let ip = Adef.iper_of_int (nb_of_persons base) in let empty_string = Gwdb.insert_string base "" in let (birth, birth_place, baptism, baptism_place) = match info with [ Some {ci_birth_date = b; ci_birth_place = bpl} -> if String.length bpl >= 2 && String.sub bpl 0 2 = "b/" then (None, "", b, String.sub bpl 2 (String.length bpl - 2)) else (b, bpl, None, "") | None -> (None, "", None, "") ] in let (death, death_place) = match info with [ Some {ci_death_date = Some d; ci_death_place = dpl} -> (Death Unspecified (Adef.cdate_of_date d), dpl) | Some {ci_death_date = None; ci_death_place = dpl} when dpl <> "" -> (DeadDontKnowWhen, dpl) | Some {ci_death = (DeadDontKnowWhen | NotDead as dead); ci_death_date = None; ci_death_place = dpl} -> (dead, dpl) | _ -> (infer_death conf birth baptism, "") ] in let occupation = match info with [ Some { ci_occupation = occupation } -> occupation | _ -> "" ] in let access = match info with [ Some {ci_public = p} -> if p then Public else IfTitles | None -> IfTitles ] in let p = {first_name = Gwdb.insert_string base f; surname = Gwdb.insert_string base s; occ = o; image = empty_string; first_names_aliases = []; surnames_aliases = []; public_name = empty_string; qualifiers = []; aliases = []; titles = []; rparents = []; related = []; occupation = Gwdb.insert_string base occupation; sex = sex; access = access; birth = Adef.codate_of_od birth; birth_place = Gwdb.insert_string base birth_place; birth_src = empty_string; baptism = Adef.codate_of_od baptism; baptism_place = Gwdb.insert_string base baptism_place; baptism_src = empty_string; death = death; death_place = Gwdb.insert_string base death_place; death_src = empty_string; burial = UnknownBurial; burial_place = empty_string; burial_src = empty_string; notes = empty_string; psources = if f = "?" || s = "?" then empty_string else Gwdb.insert_string base (only_printable src); key_index = ip} in let a = {parents = None; consang = Adef.fix (-1)} in let u = {family = [| |]} in patch_person base p.key_index p; patch_ascend base p.key_index a; patch_union base p.key_index u; if f <> "?" && s <> "?" then do { let fn = Util.translate_eval f in let sn = Util.translate_eval s in patch_key base ip fn sn o; person_ht_add base (fn ^ " " ^ sn) ip; new_persons.val := [p :: new_persons.val] } else (); ip } ] | Link -> if f = "?" || s = "?" then if o < 0 || o >= nb_of_persons base then print_err_unknown conf base (f, s, o) else let ip = Adef.iper_of_int o in let p = poi base ip in if p_first_name base p = f && p_surname base p = s then ip else print_err_unknown conf base (f, s, o) else match person_of_key base f s o with [ Some ip -> ip | None -> print_err_unknown conf base (f, s, o) ] ] ; value rec update_conf_env field p occ o_env n_env = let get_name (n, v) = n in match o_env with [ [] -> n_env | [head :: rest] -> let name = get_name head in if name = field ^ "p" then update_conf_env field p occ rest [(name, p) :: n_env] else if name = field ^ "occ" then update_conf_env field p occ rest [(name, occ) :: n_env] else if name = "link" || name = "create" || name = "free_occ" || name = "field" || name = "link_occ" then update_conf_env field p occ rest n_env else update_conf_env field p occ rest [head :: n_env] ] ; value update_conf_create conf = let field = match p_getenv conf.env "field" with [ Some f -> f ^ "_" | _ -> "" ] in let occ = match p_getenv conf.env "free_occ" with [ Some occ -> occ | _ -> "" ] in {(conf) with env = update_conf_env field "create" occ conf.env []} ; value update_conf_link conf = let field = match p_getenv conf.env "field" with [ Some f -> f ^ "_" | _ -> "" ] in let occ = match p_getenv conf.env "link_occ" with [ Some occ -> occ | _ -> "" ] in {(conf) with env = update_conf_env field "link" occ conf.env []} ; value update_conf conf = match p_getenv conf.env "link" with [ Some _ -> update_conf_link conf | None -> match p_getenv conf.env "create" with [ Some _ -> update_conf_create conf | None -> conf ] ] ; value rec list_except x = fun [ [y :: l] -> if x = y then l else [y :: list_except x l] | [] -> invalid_arg "list_except" ] ; value update_related_pointers base pi ol nl = do { let ol = List.sort compare ol in let nl = List.sort compare nl in let (added_rel, removed_rel) = loop ([], []) ol nl where rec loop (added_rel, removed_rel) ol nl = match (ol, nl) with [ ([oip :: orl], [nip :: nrl]) -> if oip < nip then loop (added_rel, [oip :: removed_rel]) orl nl else if oip > nip then loop ([nip :: added_rel], removed_rel) ol nrl else loop (added_rel, removed_rel) orl nrl | ([], _) -> (nl @ added_rel, removed_rel) | (_, []) -> (added_rel, ol @ removed_rel) ] in List.iter (fun ip -> let p = gen_person_of_person (poi base ip) in patch_person base ip {(p) with related = [pi :: p.related]}) added_rel; List.iter (fun ip -> let p = gen_person_of_person (poi base ip) in let related = if List.mem pi p.related then list_except pi p.related else do { Printf.eprintf "Warning: related pointer was missing\n"; flush stderr; p.related } in patch_person base ip {(p) with related = related}) removed_rel; }; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/db1link.mli0000660000175200017530000000104112664543647023233 0ustar guillaumeguillaume(* $Id: db1link.mli,v 5.2 2008-01-15 11:06:04 ddr Exp $ *) (* Copyright (c) 2007-2008 INRIA *) type file_info = { f_curr_src_file : mutable string; f_curr_gwo_file : mutable string; f_separate : mutable bool; f_shift : mutable int; f_local_names : mutable Hashtbl.t (int * int) Def.iper } ; value particules_file : ref string; value do_check : ref bool; value do_consang : ref bool; value default_source : ref string; value pr_stats : ref bool; value link : (file_info -> unit -> option Gwcomp.gw_syntax) -> string -> bool; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/fpla.ml0000660000175200017530000000422312664543647022465 0ustar guillaumeguillaume(* $Id: fpla.ml,v 5.8 2007-01-19 01:53:16 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) (* First Parentless Ancestor *) open Gwdb; open Printf; value make_table base = let _ = load_ascends_array base in let _ = load_couples_array base in let fpla = Array.make (nb_of_persons base) None in let cnt = ref (nb_of_persons base) in do { while cnt.val > 0 do { Array.iteri (fun i v -> if v = None then let ip = Adef.iper_of_int i in match get_parents (poi base ip) with [ Some ifam -> let cpl = coi base ifam in match (fpla.(Adef.int_of_iper (get_father cpl)), fpla.(Adef.int_of_iper (get_mother cpl))) with [ (Some (m, k), Some (n, l)) -> do { decr cnt; let v = if m + k < n + 2 * l then (m + k, 2 * k) else (n + 2 * l, 2 * l) in fpla.(i) := Some v; } | _ -> () ] | None -> do { decr cnt; fpla.(i) := Some (1, 1) } ] else ()) fpla }; Array.mapi (fun i v -> match v with [ Some (m, k) -> (i, m) | None -> failwith "internal error" ]) fpla } ; value first_parentless_ancestor base = let tab = make_table base in do { Array.sort (fun (_, s1) (_, s2) -> compare s2 s1) tab; printf "First parentless ancestor\n\n"; Array.iter (fun (i, s) -> let p = poi base (Adef.iper_of_int i) in do { printf "Sosa %d \t%s.%d %s\n" s (p_first_name base p) (get_occ p) (p_surname base p); flush stdout; }) tab; } ; value bname = ref ""; value usage = "usage: " ^ Sys.argv.(0) ^ " "; value speclist = []; value main () = do { Argl.parse speclist (fun s -> bname.val := s) usage; Secure.set_base_dir (Filename.dirname bname.val); let base = Gwdb.open_base bname.val in first_parentless_ancestor base } ; Printexc.catch main (); geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/dbdisk.mli0000660000175200017530000000426212664543647023157 0ustar guillaumeguillaume(* $Id: dbdisk.mli,v 5.14 2006-12-23 23:41:28 ddr Exp $ *) open Def; type dsk_istr = Adef.istr; type dsk_person = gen_person iper dsk_istr; type dsk_ascend = gen_ascend ifam; type dsk_union = gen_union ifam; type dsk_family = gen_family iper dsk_istr; type dsk_couple = gen_couple iper; type dsk_descend = gen_descend iper; type dsk_title = gen_title dsk_istr; type notes = { nread : string -> rn_mode -> string; norigin_file : string; efiles : unit -> list string } ; type record_access 'a = { load_array : unit -> unit; get : int -> 'a; set : int -> 'a -> unit; len : mutable int; output_array : out_channel -> unit; clear_array : unit -> unit } ; type string_person_index 'istr = { find : 'istr -> list iper; cursor : string -> 'istr; next : 'istr -> 'istr } ; type visible_record_access = { v_write : unit -> unit; v_get : (dsk_person -> bool) -> int -> bool } ; type base_data = { persons : record_access dsk_person; ascends : record_access dsk_ascend; unions : record_access dsk_union; visible : visible_record_access; families : record_access dsk_family; couples : record_access dsk_couple; descends : record_access dsk_descend; strings : record_access string; particles : list string; bnotes : notes; bdir : string } ; type base_func = { person_of_key : string -> string -> int -> option iper; persons_of_name : string -> list iper; strings_of_fsname : string -> list dsk_istr; persons_of_surname : string_person_index dsk_istr; persons_of_first_name : string_person_index dsk_istr; patch_person : iper -> dsk_person -> unit; patch_ascend : iper -> dsk_ascend -> unit; patch_union : iper -> dsk_union -> unit; patch_family : ifam -> dsk_family -> unit; patch_couple : ifam -> dsk_couple -> unit; patch_descend : ifam -> dsk_descend -> unit; patch_name : string -> iper -> unit; insert_string : string -> dsk_istr; commit_patches : unit -> unit; commit_notes : string -> string -> unit; patched_ascends : unit -> list iper; is_patched_person : iper -> bool; cleanup : unit -> unit } ; type dsk_base = { data : base_data; func : base_func } ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/check.mli0000660000175200017530000000102312664543647022764 0ustar guillaumeguillaume(* $Id: check.mli,v 5.7 2007-01-19 01:53:16 ddr Exp $ *) (* Copyright (c) 2006-2007 INRIA *) (* checking database ; independant from its implementation on disk *) open Gwdb; open CheckItem; value print_base_error : out_channel -> base -> base_error -> unit; value print_base_warning : out_channel -> base -> base_warning -> unit; value check_base : base -> (base_error -> unit) -> (base_warning -> unit) -> (int -> bool) -> ((Def.iper * person * option Def.sex * option (list relation)) -> unit) -> bool -> unit; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/adef.mli0000660000175200017530000000303312664543647022611 0ustar guillaumeguillaume(* $Id: adef.mli,v 5.6 2007-02-21 18:14:01 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) type iper = 'a; type ifam = 'a; type istr = 'a; type fix = 'a; type cdate = 'a; type codate = 'a; type gen_couple 'person = 'a; type date = [ Dgreg of dmy and calendar | Dtext of string ] and calendar = [ Dgregorian | Djulian | Dfrench | Dhebrew ] and dmy = { day : int; month : int; year : int; prec : precision; delta : int } and precision = [ Sure | About | Maybe | Before | After | OrYear of int | YearInt of int ] ; value float_of_fix : fix -> float; value fix_of_float : float -> fix; external fix : int -> fix = "%identity"; external fix_repr : fix -> int = "%identity"; value no_consang : fix; value date_of_cdate : cdate -> date; value cdate_of_date : date -> cdate; value codate_None : codate; value od_of_codate : codate -> option date; value codate_of_od : option date -> codate; external int_of_iper : iper -> int = "%identity"; external iper_of_int : int -> iper = "%identity"; external int_of_ifam : ifam -> int = "%identity"; external ifam_of_int : int -> ifam = "%identity"; external int_of_istr : istr -> int = "%identity"; external istr_of_int : int -> istr = "%identity"; exception Request_failure of string; value father : gen_couple 'a -> 'a; value mother : gen_couple 'a -> 'a; value couple : 'a -> 'a -> gen_couple 'a; value parent : array 'a -> gen_couple 'a; value parent_array : gen_couple 'a -> array 'a; value multi_couple : 'a -> 'a -> gen_couple 'a; value multi_parent : array 'a -> gen_couple 'a; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/forum.ml0000660000175200017530000010012512664543647022671 0ustar guillaumeguillaume(* camlp5r *) (* $Id: forum.ml,v 5.22 2008-01-07 13:29:47 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Config; open Def; open Hutil; open Printf; open TemplAst; open Util; type message = { m_time : string; m_date : date; m_hour : string; m_waiting : bool; m_from : string; m_ident : string; m_wizard : string; m_friend : string; m_email : string; m_access : string; m_subject : string; m_wiki : string; m_text : string } ; module type MF = sig type in_chan = 'abstract; type filename = 'abstract; type pos = 'abstract; value filename_of_string : string -> filename; value open_in : filename -> in_chan; value last_pos : in_chan -> pos; value not_a_pos : pos; value prev_pos : pos -> pos; value next_pos : pos -> pos; value string_of_pos : pos -> string; value pos_of_string : string -> pos; value input_char : in_chan -> char; value input_line : in_chan -> string; value rpos_in : in_chan -> pos; value rseek_in : in_chan -> pos -> unit; value close_in : in_chan -> unit; value extend : filename -> (out_channel -> unit) -> unit; value patch : filename -> pos -> string -> unit; end ; module MF : MF = struct type in_chan = { ic_fname : string; ic_chan : mutable in_channel; ic_ext : mutable int } ; type filename = string; type pos = { p_ord : mutable bool; (* True > False *) p_ext : mutable int; p_pos : mutable int } ; value filename_of_string x = x; value last_pos ic = {p_ord = True; p_ext = 0; p_pos = in_channel_length ic.ic_chan} ; value not_a_pos = {p_ord = False; p_ext = 0; p_pos = -1}; value prev_pos pos = {(pos) with p_pos = pos.p_pos - 1}; value next_pos pos = {(pos) with p_pos = pos.p_pos + 1}; value string_of_pos pos = if pos = not_a_pos then "" else if pos.p_ext = 0 then string_of_int pos.p_pos else string_of_int pos.p_ext ^ "-" ^ string_of_int pos.p_pos ; value pos_of_string s = try let pos = int_of_string s in if pos < 0 then not_a_pos else {p_ord = True; p_ext = 0; p_pos = pos} with [ Failure _ -> try Scanf.sscanf s "%d-%d" (fun a b -> {p_ord = a = 0; p_ext = a; p_pos = b}) with [ Scanf.Scan_failure _ -> not_a_pos ] ] ; value extend fname f = let tmp = fname ^ "~" in let oc = open_out tmp in do { try f oc with e -> do { close_out oc; raise e }; match try Some (open_in fname) with [ Sys_error _ -> None ] with [ Some ic -> do { try while True do { output_char oc (input_char ic) } with [ End_of_file -> () ]; close_in ic; } | None -> () ]; close_out oc; try Sys.remove fname with [ Sys_error _ -> () ]; Sys.rename tmp fname; } ; value patch fname pos str = let fname = if pos.p_ext = 0 then fname else fname ^ "." ^ string_of_int pos.p_ext in match try Some (open_in fname) with [ Sys_error _ -> None ] with [ Some ic -> let tmp_fname = fname ^ "~" in let oc = open_out tmp_fname in let ic_len = in_channel_length ic in do { loop 0 where rec loop i = if i = ic_len then () else let c = input_char ic in do { if i < ic_len - pos.p_pos || i >= ic_len - pos.p_pos + String.length str then output_char oc c else output_char oc str.[i-ic_len+pos.p_pos]; loop (i + 1); }; close_in ic; close_out oc; try Sys.remove fname with [ Sys_error _ -> () ]; Sys.rename tmp_fname fname; } | None -> () ] ; value open_in fname = {ic_fname = fname; ic_chan = open_in_bin fname; ic_ext = 0} ; value input_char ic = input_char ic.ic_chan; value rec input_line ic = try Pervasives.input_line ic.ic_chan with [ End_of_file -> let ext = ic.ic_ext + 1 in let fn = ic.ic_fname ^ "." ^ string_of_int ext in let ic2 = try open_in_bin fn with [ Sys_error _ -> raise End_of_file ] in do { close_in ic.ic_chan; ic.ic_chan := ic2; ic.ic_ext := ext; input_line ic } ] ; value rpos_in ic = let pos = in_channel_length ic.ic_chan - pos_in ic.ic_chan in {p_ord = ic.ic_ext = 0; p_ext = ic.ic_ext; p_pos = pos} ; value rec rseek_in ic pos = if ic.ic_ext = pos.p_ext then let len = in_channel_length ic.ic_chan in if pos.p_pos > len then if pos.p_ext >= 1 then do { let ext = ic.ic_ext - 1 in pos.p_ord := ext = 0; pos.p_ext := ext; pos.p_pos := pos.p_pos - len; rseek_in ic pos } else invalid_arg "rseek_in" else seek_in ic.ic_chan (len - pos.p_pos) else do { let fn = if pos.p_ext = 0 then ic.ic_fname else ic.ic_fname ^ "." ^ string_of_int pos.p_ext in let ic2 = try open_in_bin fn with [ Sys_error _ -> failwith "rseek_in" ] in do { close_in ic.ic_chan; ic.ic_chan := ic2; ic.ic_ext := pos.p_ext; rseek_in ic pos } } ; value close_in ic = close_in ic.ic_chan; end ; value forum_file conf = let fn = Filename.concat (base_path [] (conf.bname ^ ".gwb")) "forum" in MF.filename_of_string fn ; (* Black list *) value match_strings regexp s = loop 0 0 where rec loop i j = if i = String.length regexp && j = String.length s then True else if i = String.length regexp then False else if j = String.length s then False else if regexp.[i] = s.[j] then loop (i + 1) (j + 1) else if regexp.[i] = '*' then if i + 1 = String.length regexp then True else if regexp.[i + 1] = s.[j] then loop (i + 2) (j + 1) else loop i (j + 1) else False ; value can_post conf = try let fname = List.assoc "forum_exclude_file" conf.base_env in let fname = Util.base_path [] fname in let ic = open_in fname in let rec loop () = match try Some (input_line ic) with [ End_of_file -> None ] with [ Some line -> if match_strings line conf.from then do { close_in ic; False } else loop () | None -> do { close_in ic; True } ] in loop () with [ Not_found | Sys_error _ -> True ] ; (* Print headers *) value get_var ic lab s = let len = String.length lab in if String.length s >= len && String.sub s 0 len = lab then let start = if String.length s > len && s.[len] = ' ' then len + 1 else len in (String.sub s start (String.length s - start), MF.input_line ic) else ("", s) ; value size_of_char s i = if Mutil.utf_8_db.val then max 1 (Name.nbc s.[i]) else 1 ; value string_length s i = loop i where rec loop i = if i >= String.length s then 0 else let size = size_of_char s i in size + loop (i + size) ; value sp2nbsp lim s = let trunc_signature = "..." in let signature_length = string_length trunc_signature 0 in loop 0 0 lim where rec loop i len lim = if i >= String.length s || s.[i] = '\n' then Buff.get len else if lim <= 0 && (string_length s i) > signature_length then Buff.get len ^ trunc_signature else let size = size_of_char s i in let len = match s.[i] with [ ' ' -> Buff.mstore len " " | '&' -> Buff.mstore len "&" | _ -> Buff.mstore len (String.sub s i size) ] in loop (i + size) len (lim - 1) ; (* Print a message *) value read_message conf ic = try let s = MF.input_line ic in let (time, s) = get_var ic "Time:" s in let ((time, s), deleted) = if time = "" then (get_var ic "****:" s, True) else ((time, s), False) in let (date, hour) = try let i = String.index time ' ' in (String.sub time 0 i, String.sub time (i + 1) (String.length time - i - 1)) with [ Not_found -> ("", time) ] in let date = try let y = int_of_string (String.sub date 0 4) in let m = int_of_string (String.sub date 5 2) in let d = int_of_string (String.sub date 8 2) in Dgreg {year = y; month = m; day = d; prec = Sure; delta = 0} Dgregorian with [ Failure _ | Invalid_argument _ -> Dtext date ] in let (moderator, s) = get_var ic "Moderator:" s in let (from, s) = get_var ic "From:" s in let (ident, s) = get_var ic "Ident:" s in let (wizard, s) = get_var ic "Wizard:" s in let (friend, s) = get_var ic "Friend:" s in let (email, s) = get_var ic "Email:" s in let (access, s) = get_var ic "Access:" s in let (subject, s) = get_var ic "Subject:" s in let (wiki, s) = get_var ic "Wiki:" s in let (_, s) = get_var ic "Text:" s in let (mess, s) = get_mess 0 s where rec get_mess len s = if String.length s >= 2 && s.[0] = ' ' && s.[1] = ' ' then let s = String.sub s 2 (String.length s - 2) in let len = if len = 0 then len else Buff.store len '\n' in get_mess (Buff.mstore len s) (MF.input_line ic) else (Buff.get len, s) in let waiting = String.length moderator > 0 && moderator.[0] = '.' in let mess = {m_time = time; m_waiting = waiting; m_from = from; m_date = date; m_hour = hour; m_ident = ident; m_wizard = wizard; m_friend = friend; m_email = email; m_access = access; m_subject = subject; m_wiki = wiki; m_text = mess} in let accessible = if deleted then False else if access <> "publ" && not conf.wizard && not conf.friend then False else True in Some (mess, accessible) with [ End_of_file -> None ] ; value get_message conf pos = let fname = forum_file conf in match try Some (MF.open_in fname) with [ Sys_error _ -> None ] with [ Some ic -> do { MF.rseek_in ic pos; let r = match read_message conf ic with [ Some (m, accessible) -> Some (accessible, m, pos, MF.rpos_in ic) | None -> None ] in MF.close_in ic; r } | None -> None ] ; value backward_pos conf pos = let fname = forum_file conf in match try Some (MF.open_in fname) with [ Sys_error _ -> None ] with [ Some ic -> let sync_txt = "\nTime: " in let sync_txt_last = String.length sync_txt - 1 in let last_pos = MF.last_pos ic in let new_pos = loop pos sync_txt_last where rec loop new_pos i = let new_pos = MF.next_pos new_pos in if new_pos = last_pos && i = 1 then new_pos else if new_pos < last_pos then do { MF.rseek_in ic new_pos; let c = MF.input_char ic in if c = sync_txt.[i] then if i = 0 then MF.prev_pos new_pos else loop new_pos (i - 1) else loop new_pos sync_txt_last } else pos in do { MF.close_in ic; new_pos } | None -> pos ] ; value passwd_in_file conf kind = match p_getenv conf.base_env (kind ^ "_passwd_file") with [ Some "" | None -> False | Some _ -> True ] ; type env 'a = [ Vmess of message and option message and MF.pos and MF.pos and option string | Vpos of ref MF.pos | Vother of 'a | Vnone ] ; value get_env v env = try List.assoc v env with [ Not_found -> Vnone ]; value get_vother = fun [ Vother x -> Some x | _ -> None ]; value set_vother x = Vother x; value moderators conf = match p_getenv conf.base_env "moderator_file" with [ None | Some "" -> [] | Some fname -> let fname = Util.base_path [] fname in match try Some (Secure.open_in fname) with [ Sys_error _ -> None ] with [ Some ic -> let list = loop [] where rec loop list = match try Some (input_line ic) with [ End_of_file -> None ] with [ Some line -> loop [line :: list] | None -> List.rev list ] in do { close_in ic; list } | None -> [] ] ] ; value is_moderator conf = conf.wizard && List.mem conf.user (moderators conf) ; value is_visible conf mess = not mess.m_waiting || is_moderator conf || conf.wizard && mess.m_wizard <> "" && mess.m_wizard = conf.user ; value rec eval_var conf base env xx loc = fun [ ["can_post"] -> VVbool (can_post conf) | ["is_moderated_forum"] -> VVbool (moderators conf <> []) | ["is_moderator"] -> VVbool (is_moderator conf) | ["message" :: sl] -> eval_message_var conf base env sl | ["pos"] -> match get_env "pos" env with [ Vpos r -> VVstring (MF.string_of_pos r.val) | _ -> raise Not_found ] | _ -> raise Not_found ] and eval_message_var conf base env = fun [ ["access"] -> match get_env "mess" env with [ Vmess mess _ _ _ _ -> VVstring mess.m_access | _ -> raise Not_found ] | ["date" :: sl] -> match get_env "mess" env with [ Vmess mess _ _ _ _ -> eval_date_var conf mess.m_date sl | _ -> raise Not_found ] | ["email" :: sl] -> match get_env "mess" env with [ Vmess mess _ _ _ so -> eval_message_string_var conf mess.m_email so sl | _ -> raise Not_found ] | ["friend"] -> if passwd_in_file conf "friend" then match get_env "mess" env with [ Vmess mess _ _ _ _ -> VVstring (mess.m_friend) | _ -> raise Not_found ] else VVstring "" | ["from"] -> match get_env "mess" env with [ Vmess mess _ _ _ _ -> VVstring (mess.m_from) | _ -> raise Not_found ] | ["hour"] -> match get_env "mess" env with [ Vmess mess _ _ _ _ -> VVstring mess.m_hour | _ -> raise Not_found ] | ["ident" :: sl] -> match get_env "mess" env with [ Vmess mess _ _ _ so -> eval_message_string_var conf mess.m_ident so sl | _ -> raise Not_found ] | ["is_waiting"] -> match get_env "mess" env with [ Vmess mess _ _ _ _ -> VVbool mess.m_waiting | _ -> raise Not_found ] | ["next_pos"] -> match get_env "mess" env with [ Vmess _ _ pos _ _ -> loop pos where rec loop pos = let back_pos = backward_pos conf pos in match get_message conf back_pos with [ Some (acc, mess, _, _) -> if back_pos = pos then VVstring "" else if acc && is_visible conf mess then VVstring (MF.string_of_pos back_pos) else loop back_pos | None -> VVstring "" ] | _ -> raise Not_found ] | ["pos"] -> match get_env "mess" env with [ Vmess _ _ pos _ _ -> VVstring (MF.string_of_pos pos) | _ -> raise Not_found ] | ["prev_date" :: sl] -> match get_env "mess" env with [ Vmess _ prev_mess _ _ _ -> match prev_mess with [ Some mess -> eval_date_var conf mess.m_date sl | None -> VVstring "" ] | _ -> raise Not_found ] | ["prev_pos"] -> match get_env "mess" env with [ Vmess _ _ pos next_pos _ -> loop next_pos where rec loop next_pos = match get_message conf next_pos with [ Some (acc, mess, next_pos, next_next_pos) -> if acc && is_visible conf mess then VVstring (MF.string_of_pos next_pos) else loop next_next_pos | None -> VVstring "" ] | _ -> raise Not_found ] | ["subject" :: sl] -> match get_env "mess" env with [ Vmess m _ _ _ so -> eval_message_string_var conf m.m_subject so sl | _ -> raise Not_found ] | ["text" :: sl] -> match get_env "mess" env with [ Vmess m _ _ _ so -> eval_message_text_var conf base m.m_text so sl | _ -> raise Not_found ] | ["time" :: sl] -> match get_env "mess" env with [ Vmess m _ _ _ so -> eval_message_text_var conf base m.m_time so sl | _ -> raise Not_found ] | ["wiki"] -> match get_env "mess" env with [ Vmess mess _ _ _ _ -> VVstring mess.m_wiki | _ -> raise Not_found ] | ["wizard"] -> if passwd_in_file conf "wizard" then match get_env "mess" env with [ Vmess mess _ _ _ _ -> VVstring (mess.m_wizard) | _ -> raise Not_found ] else VVstring "" | _ -> raise Not_found ] and eval_date_var conf date = fun [ ["month"] -> match date with [ Dgreg d _ -> VVstring (string_of_int d.month) | _ -> VVstring "" ] | [] -> VVstring (Util.translate_eval (Date.string_of_date conf date)) | _ -> raise Not_found ] and eval_message_text_var conf base str so = fun [ ["wiki"] -> let s = string_with_macros conf [] str in let lines = Wiki.html_of_tlsw conf s in let s = String.concat "\n" lines in let s = let wi = {Wiki.wi_mode = "NOTES"; Wiki.wi_cancel_links = conf.cancel_links; Wiki.wi_file_path = Notes.file_path conf base; Wiki.wi_person_exists = person_exists conf base; Wiki.wi_always_show_link = conf.wizard || conf.friend} in Wiki.syntax_links conf wi s in let s = match so with [ Some h -> let case_sens = p_getenv conf.env "c" = Some "on" in html_highlight case_sens h s | None -> s ] in VVstring s | ["nowiki"] -> let s = string_with_macros conf [] str in let s = match so with [ Some h -> let case_sens = p_getenv conf.env "c" = Some "on" in html_highlight case_sens h s | None -> s ] in VVstring s | ["raw"] -> VVstring (quote_escaped str) | sl -> eval_message_string_var conf str so sl ] and eval_message_string_var conf str so = fun [ ["cut"; s] -> try VVstring (no_html_tags (sp2nbsp (int_of_string s) str)) with [ Failure _ -> raise Not_found ] | ["v"] -> VVstring (quote_escaped str) | [] -> let s = quote_escaped str in let s = match so with [ Some h -> let case_sens = p_getenv conf.env "c" = Some "on" in html_highlight case_sens h s | None -> s ] in VVstring s | _ -> raise Not_found ] ; value print_foreach conf base print_ast eval_expr = let eval_int_expr env e = let s = eval_expr env () e in try int_of_string s with [ Failure _ -> raise Not_found ] in let rec print_foreach env xx loc s sl el al = match [s :: sl] with [ ["message"] -> print_foreach_message env el al | _ -> raise Not_found ] and print_foreach_message env el al = let eval_pos_expr env e = MF.pos_of_string (eval_expr env () e) in let (to_pos, max_mess) = match el with [ [[e1]; [e2]] -> (eval_pos_expr env e1, eval_int_expr env e2) | _ -> raise Not_found ] in let fname = forum_file conf in match try Some (MF.open_in fname) with [ Sys_error _ -> None ] with [ Some ic -> let rec loop prev_mess i = if i >= max_mess then MF.rpos_in ic else let pos = MF.rpos_in ic in match read_message conf ic with [ Some (mess, accessible) -> if accessible && is_visible conf mess then let next_pos = MF.rpos_in ic in let vmess = Vmess mess prev_mess pos next_pos None in let env = [("mess", vmess) :: env] in do { List.iter (print_ast env ()) al; loop (Some mess) (i + 1); } else loop prev_mess i | None -> MF.not_a_pos ] in do { if to_pos = MF.not_a_pos then () else try MF.rseek_in ic to_pos with [ Sys_error _ -> () ]; let pos = loop None 0 in match get_env "pos" env with [ Vpos r -> r.val := pos | _ -> () ]; MF.close_in ic; } | None -> () ] in print_foreach ; value print_forum_message conf base r so = let env = match r with [ Some (acc, mess, pos, next_pos) -> if acc && is_visible conf mess then [("mess", Vmess mess None pos next_pos so); ("pos", Vpos (ref pos))] else [("pos", Vpos (ref MF.not_a_pos))] | None -> [("pos", Vpos (ref MF.not_a_pos))] ] in Hutil.interp conf base "forum" {Templ.eval_var = eval_var conf base; Templ.eval_transl _ = Templ.eval_transl conf; Templ.eval_predefined_apply _ = raise Not_found; Templ.get_vother = get_vother; Templ.set_vother = set_vother; Templ.print_foreach = print_foreach conf base} env () ; value print conf base = let r = match p_getenv conf.env "p" with [ Some pos -> get_message conf (MF.pos_of_string pos) | None -> None ] in print_forum_message conf base r None ; value print_forum_headers conf base = let env = [("pos", Vpos (ref MF.not_a_pos))] in Hutil.interp conf base "forum" {Templ.eval_var = eval_var conf base; Templ.eval_transl _ = Templ.eval_transl conf; Templ.eval_predefined_apply _ = raise Not_found; Templ.get_vother = get_vother; Templ.set_vother = set_vother; Templ.print_foreach = print_foreach conf base} env () ; (* Send a message *) value print_add conf base = print conf base; value get conf key = match p_getenv conf.env key with [ Some v -> v | None -> failwith (key ^ " unbound") ] ; value get1 conf key = only_printable_or_nl (Mutil.strip_all_trailing_spaces (get conf key)) ; value forum_add conf base moderated mess = let access = if conf.wizard || conf.friend then match p_getenv conf.env "priv_acc" with [ Some _ -> "priv" | None -> "publ" ] else "publ" in if mess.m_ident <> "" && mess.m_text <> "" then MF.extend (forum_file conf) (fun oc -> let (hh, mm, ss) = conf.time in do { fprintf oc "Time: %04d-%02d-%02d %02d:%02d:%02d\n" conf.today.year conf.today.month conf.today.day hh mm ss; if moderated then fprintf oc "Moderator: ....................\n" else (); fprintf oc "From: %s\n" conf.from; fprintf oc "Ident: %s\n" mess.m_ident; if (conf.wizard || conf.just_friend_wizard) && conf.user <> "" then fprintf oc "Wizard: %s\n" conf.user else (); if conf.friend && not conf.just_friend_wizard && conf.user <> "" then fprintf oc "Friend: %s\n" conf.user else (); if mess.m_email <> "" then fprintf oc "Email: %s\n" mess.m_email else (); fprintf oc "Access: %s\n" access; let subject = if mess.m_subject = "" then "-" else mess.m_subject in fprintf oc "Subject: %s\n" subject; fprintf oc "Wiki: on\n"; fprintf oc "Text:\n"; let txt = mess.m_text in let rec loop i bol = if i = String.length txt then () else do { if bol then fprintf oc " " else (); if txt.[i] <> '\r' then output_char oc txt.[i] else (); loop (i + 1) (txt.[i] = '\n') } in loop 0 True; fprintf oc "\n\n"; }) else () ; value visualize conf base mess = let vmess = Vmess mess None MF.not_a_pos MF.not_a_pos None in let env = [("mess", vmess)] in Hutil.interp conf base "forum" {Templ.eval_var = eval_var conf base; Templ.eval_transl _ = Templ.eval_transl conf; Templ.eval_predefined_apply _ = raise Not_found; Templ.get_vother = get_vother; Templ.set_vother = set_vother; Templ.print_foreach = print_foreach conf base} env () ; value print_add_ok conf base = let mess = let time = let (hh, mm, ss) = conf.time in sprintf "%04d-%02d-%02d %02d:%02d:%02d" conf.today.year conf.today.month conf.today.day hh mm ss in let ident = Gutil.strip_spaces (get conf "Ident") in let email = Gutil.strip_spaces (get conf "Email") in let subject = Gutil.strip_spaces (get conf "Subject") in let text = Gutil.gen_strip_spaces False (get1 conf "Text") in {m_time = time; m_date = Dtext ""; m_hour = ""; m_waiting = False; m_from = ""; m_ident = ident; m_wizard = ""; m_friend = ""; m_email = email; m_access = ""; m_subject = subject; m_wiki = ""; m_text = text} in if not (can_post conf) then incorrect_request conf else if match p_getenv conf.env "visu" with [ Some _ -> True | None -> False ] then visualize conf base mess else if mess.m_ident = "" || mess.m_text = "" then print conf base else let title _ = Wserver.wprint "%s" (capitale (transl conf "message added")) in try do { let mods = moderators conf in forum_add conf base (mods <> []) mess; header conf title; print_link_to_welcome conf True; if mods <> [] then do { Wserver.wprint "

      %s. %s.

      " (capitale (transl conf "this forum is moderated")) (capitale (transl conf "your message is waiting for validation")); } else (); Wserver.wprint "%s\n" (commd conf) (capitale (transl conf "database forum")); trailer conf; } with [ Update.ModErr -> () ] ; (* Deleting a message *) value message_txt conf n = transl_nth conf "message/previous message/previous messages/next message" n ; value forum_del conf base pos = let fname = forum_file conf in MF.patch fname pos "****" ; value print_del_ok conf base next_pos = let title _ = Wserver.wprint "%s" (capitale (transl conf "message deleted")) in do { header conf title; print_link_to_welcome conf True; match next_pos with [ Some pos -> Wserver.wprint "%s\n" (commd conf) (MF.string_of_pos pos) (capitale (message_txt conf 3)) | None -> Wserver.wprint "%s\n" (commd conf) (capitale (transl conf "database forum")) ]; trailer conf; } ; value find_next_pos conf = loop where rec loop pos = let back_pos = backward_pos conf pos in match get_message conf back_pos with [ Some (acc, mess, _, _) -> if back_pos = pos then None else if acc then Some back_pos else loop back_pos | None -> None ] ; value delete_forum_message conf base pos = match get_message conf pos with [ Some (a, m, _, _) -> if a && conf.wizard && conf.user <> "" && m.m_wizard = conf.user && passwd_in_file conf "wizard" || conf.manitou || conf.supervisor then try do { forum_del conf base pos; print_del_ok conf base (find_next_pos conf pos); } with [ Update.ModErr -> () ] else print_forum_headers conf base | None -> print_forum_headers conf base ] ; value print_del conf base = match p_getenv conf.env "p" with [ Some pos -> delete_forum_message conf base (MF.pos_of_string pos) | None -> print_forum_headers conf base ] ; (* validate *) value set_validator conf base pos = let fname = forum_file conf in match try Some (MF.open_in fname) with [ Sys_error _ -> None ] with [ Some ic -> do { MF.rseek_in ic pos; let _ = MF.input_line ic in let pos = MF.rpos_in ic in let s = MF.input_line ic in let (moderator, _) = get_var ic "Moderator:" s in MF.close_in ic; if moderator <> "" && moderator.[0] = '.' then do { let m = let len = String.length moderator in if String.length conf.user < len - 1 then conf.user else String.sub conf.user 0 (len - 1) in MF.patch fname pos (sprintf "Moderator: /%s" m); True } else False } | None -> False ] ; value message_txt conf n = transl_nth conf "message/previous message/previous messages/next message" n ; value print_valid_ok conf base pos del = let mess = if del then transl conf "message deleted" else transl conf "message added" in let title _ = Wserver.wprint "%s" (capitale mess) in let next_pos = find_next_pos conf pos in do { header conf title; print_link_to_welcome conf True; match next_pos with [ Some pos -> Wserver.wprint "%s\n" (commd conf) (MF.string_of_pos pos) (capitale (message_txt conf 3)) | None -> Wserver.wprint "%s\n" (commd conf) (capitale (transl conf "database forum")) ]; trailer conf; } ; value valid_forum_message conf base pos = match get_message conf pos with [ Some (a, m, _, _) -> if a && conf.wizard && List.mem conf.user (moderators conf) then do { let del = match p_getenv conf.env "d" with [ Some "" | None -> False | Some _ -> True ] in if set_validator conf base pos then do { if del then forum_del conf base pos else (); print_valid_ok conf base pos del; } else print_forum_headers conf base } else print_forum_headers conf base | None -> print_forum_headers conf base ] ; value print_valid conf base = match p_getenv conf.env "p" with [ Some pos -> valid_forum_message conf base (MF.pos_of_string pos) | None -> print_forum_headers conf base ] ; (* access switch *) value set_access conf base pos = let rec get_access ic = let pos = MF.rpos_in ic in let s = MF.input_line ic in let (access, _) = get_var ic "Access:" s in if access = "" then get_access ic else (access, pos) in let fname = forum_file conf in match try Some (MF.open_in fname) with [ Sys_error _ -> None ] with [ Some ic -> do { MF.rseek_in ic pos; let (access, pos) = get_access ic in MF.close_in ic; if access = "publ" || access = "priv" then do { let new_access = match access with [ "publ" -> "priv" | _ -> "publ" ] in MF.patch fname pos (sprintf "Access: %s" new_access); True } else False } | None -> False ] ; value access_switch_forum_message conf base pos = match get_message conf pos with [ Some (a, m, _, _) -> if (a && conf.wizard && conf.user <> "" && m.m_wizard = conf.user && passwd_in_file conf "wizard" || conf.manitou || conf.supervisor) && set_access conf base pos then print_forum_message conf base (get_message conf pos) None else print_forum_headers conf base | None -> print_forum_headers conf base ] ; value print_access_switch conf base = match p_getenv conf.env "p" with [ Some pos -> access_switch_forum_message conf base (MF.pos_of_string pos) | None -> print_forum_headers conf base ] ; (* searching *) value search_text conf base s = let s = if s = "" then " " else s in let fname = forum_file conf in match try Some (MF.open_in fname) with [ Sys_error _ -> None ] with [ Some ic -> let case_sens = p_getenv conf.env "c" = Some "on" in let rec loop () = let pos = MF.rpos_in ic in match read_message conf ic with [ Some (m, accessible) -> if accessible && List.exists (in_text case_sens s) [m.m_ident; m.m_subject; m.m_time; m.m_text] then Some (m, pos) else loop () | None -> None ] in do { match p_getenv conf.env "p" with [ Some pos -> let pos = MF.pos_of_string pos in do { try MF.rseek_in ic pos with [ Sys_error _ -> () ]; let _ = read_message conf ic in () } | None -> () ]; let messo = loop () in let next_pos = MF.rpos_in ic in MF.close_in ic; match messo with [ Some (mess, pos) -> let r = Some (True, mess, pos, next_pos) in print_forum_message conf base r (Some s) | None -> print_forum_headers conf base ] } | None -> print_forum_headers conf base ] ; value print_search conf base = match try Some (List.assoc "s" conf.env) with [ Not_found -> None ] with [ Some s -> search_text conf base (Wserver.gen_decode False s) | None -> print_forum_headers conf base ] ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/mergeDup.ml0000660000175200017530000001266012664543647023317 0ustar guillaumeguillaume(* camlp5r ./pa_html.cmo *) (* $Id: mergeDup.ml,v 5.9 2007-09-12 09:58:44 ddr Exp $ *) (* Copyright (c) 2007 INRIA *) open Config; open Gwdb; open Hutil; open Util; value print_link conf base p = do { stag "a" "href=\"%s%s\"" (commd conf) (acces conf base p) begin Wserver.wprint "%s.%d %s" (sou base (get_first_name p)) (get_occ p) (sou base (get_surname p)); end; Wserver.wprint "%s" (Date.short_dates_text conf base p); match main_title conf base p with [ Some t -> Wserver.wprint "%s" (one_title_text conf base p t) | None -> () ]; }; value print_no_candidate conf base (ip, p) = do { let title _ = Wserver.wprint "%s\n" (capitale (transl_decline conf "merge" (transl conf "possible duplications"))) in Wserver.wrap_string.val := Util.xml_pretty_print; Hutil.header conf title; Hutil.print_link_to_welcome conf True; Wserver.wprint "%s\n" (capitale (transl conf "not found")); tag "ul" begin tag "li" begin print_link conf base p; end; end; Hutil.trailer conf; }; value input_excl int_of_i excl = List.fold_left (fun s (i1, i2) -> let t = string_of_int (int_of_i i1) ^ "," ^ string_of_int (int_of_i i2) in if s = "" then t else s ^ "," ^ t) "" excl ; value print_input_excl conf int_of_i excl excl_name = let s = input_excl int_of_i excl in if s = "" then () else xtag "input" "type=\"hidden\" name=\"%s\" value=\"%s\"" excl_name s ; value print_cand_ind conf base (ip, p) (iexcl, fexcl) ip1 ip2 = do { let title _ = Wserver.wprint "%s\n" (capitale (transl conf "merge")) in Wserver.wrap_string.val := Util.xml_pretty_print; Perso.interp_notempl_with_menu title "perso_header" conf base p; tag "h2" begin title False; end; Hutil.print_link_to_welcome conf True; tag "ul" begin tag "li" begin print_link conf base (poi base ip1); end; tag "li" begin print_link conf base (poi base ip2); end; end; tag "p" begin Wserver.wprint "%s ?\n" (capitale (transl conf "merge")); tag "form" "method=\"post\" action=\"%s\"" conf.command begin Util.hidden_env conf; xtag "input" "type=\"hidden\" name=\"m\" value=\"MRG_DUP_IND_Y_N\""; xtag "input" "type=\"hidden\" name=\"ip\" value=\"%d\"" (Adef.int_of_iper ip); print_input_excl conf Adef.int_of_iper [(ip1, ip2) :: iexcl] "iexcl"; print_input_excl conf Adef.int_of_ifam fexcl "fexcl"; xtag "input" "type=\"hidden\" name=\"i\" value=\"%d\"" (Adef.int_of_iper ip1); xtag "input" "type=\"hidden\" name=\"select\" value=\"%d\"" (Adef.int_of_iper ip2); xtag "input" "type=\"submit\" name=\"answer_y\" value=\"%s\"" (transl_nth conf "Y/N" 0); xtag "input" "type=\"submit\" name=\"answer_n\" value=\"%s\"" (transl_nth conf "Y/N" 1); end; end; Hutil.trailer conf; }; value print_cand_fam conf base (ip, p) (iexcl, fexcl) ifam1 ifam2 = do { let title _ = Wserver.wprint "%s\n" (capitale (transl_decline conf "merge" (transl_nth conf "family/families" 1))) in Wserver.wrap_string.val := Util.xml_pretty_print; Perso.interp_notempl_with_menu title "perso_header" conf base p; tag "h2" begin title False; end; Hutil.print_link_to_welcome conf True; let (ip1, ip2) = let cpl = foi base ifam1 in (Gwdb.get_father cpl, Gwdb.get_mother cpl) in tag "ul" begin tag "li" begin print_link conf base (poi base ip1); Wserver.wprint "\n&\n"; print_link conf base (poi base ip2); end; tag "li" begin print_link conf base (poi base ip1); Wserver.wprint "\n&\n"; print_link conf base (poi base ip2); end; end; tag "p" begin Wserver.wprint "%s ?\n" (capitale (transl conf "merge")); tag "form" "method=\"post\" action=\"%s\"" conf.command begin Util.hidden_env conf; xtag "input" "type=\"hidden\" name=\"m\" value=\"MRG_DUP_FAM_Y_N\""; xtag "input" "type=\"hidden\" name=\"ip\" value=\"%d\"" (Adef.int_of_iper ip); print_input_excl conf Adef.int_of_iper iexcl "iexcl"; print_input_excl conf Adef.int_of_ifam [(ifam1, ifam2) :: fexcl] "fexcl"; xtag "input" "type=\"hidden\" name=\"i\" value=\"%d\"" (Adef.int_of_ifam ifam1); xtag "input" "type=\"hidden\" name=\"i2\" value=\"%d\"" (Adef.int_of_ifam ifam2); xtag "input" "type=\"submit\" name=\"answer_y\" value=\"%s\"" (transl_nth conf "Y/N" 0); xtag "input" "type=\"submit\" name=\"answer_n\" value=\"%s\"" (transl_nth conf "Y/N" 1); end; end; Hutil.trailer conf; }; value main_page conf base = let ipp = match p_getint conf.env "ip" with [ Some i -> Some (Adef.iper_of_int i, poi base (Adef.iper_of_int i)) | None -> None ] in let excl = Perso.excluded_possible_duplications conf in match ipp with [ Some (ip, p) -> match Perso.first_possible_duplication base ip excl with [ Perso.DupInd ip1 ip2 -> print_cand_ind conf base (ip, p) excl ip1 ip2 | Perso.DupFam ifam1 ifam2 -> print_cand_fam conf base (ip, p) excl ifam1 ifam2 | Perso.NoDup -> print_no_candidate conf base (ip, p) ] | None -> incorrect_request conf ] ; value answ_ind_y_n conf base = let yes = p_getenv conf.env "answer_y" <> None in if yes then MergeInd.print conf base else main_page conf base ; value answ_fam_y_n conf base = let yes = p_getenv conf.env "answer_y" <> None in if yes then MergeFam.print conf base else main_page conf base ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/cousins.ml0000660000175200017530000003421212664543647023227 0ustar guillaumeguillaume(* camlp5r ./pa_html.cmo *) (* $Id: cousins.ml,v 5.17 2007-09-12 09:58:44 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Config; open Def; open Gutil; open Gwdb; open Hutil; open Util; value default_max_cnt = 2000; value brother_label conf x = match x with [ 1 -> transl conf "siblings" | 2 -> transl conf "cousins" | 3 -> transl conf "2nd cousins" | 4 -> transl conf "3rd cousins" | n -> Printf.sprintf (ftransl conf "%s cousins") (transl_nth conf "nth (cousin)" (n - 1)) ] ; value rec except x = fun [ [] -> [] | [y :: l] -> if x = y then l else [y :: except x l] ] ; value children_of base u = List.fold_right (fun ifam list -> let des = foi base ifam in Array.to_list (get_children des) @ list) (Array.to_list (get_family u)) [] ; value siblings_by conf base iparent ip = let list = children_of base (pget conf base iparent) in except ip list ; value merge_siblings l1 l2 = let l = rev_merge (List.rev l1) l2 where rec rev_merge r = fun [ [((v, _) as x) :: l] -> rev_merge (if List.mem_assoc v r then r else [x :: r]) l | [] -> r ] in List.rev l ; value siblings conf base ip = match get_parents (pget conf base ip) with [ Some ifam -> let cpl = foi base ifam in let fath_sib = List.map (fun ip -> (ip, (get_father cpl, Male))) (siblings_by conf base (get_father cpl) ip) in let moth_sib = List.map (fun ip -> (ip, (get_mother cpl, Female))) (siblings_by conf base (get_mother cpl) ip) in merge_siblings fath_sib moth_sib | None -> [] ] ; value rec has_desc_lev conf base lev u = if lev <= 1 then True else List.exists (fun ifam -> let des = foi base ifam in List.exists (fun ip -> has_desc_lev conf base (lev - 1) (pget conf base ip)) (Array.to_list (get_children des))) (Array.to_list (get_family u)) ; value br_inter_is_empty b1 b2 = List.for_all (fun (ip, _) -> not (List.mem_assoc ip b2)) b1 ; (* Algorithms *) value cnt = ref 0; value give_access conf base ia_asex p1 b1 p2 b2 = let reference _ _ p s = if is_hidden p then s else " x | None -> "0"]) ^ "\">" ^ s ^ "" in let reference_sp p3 _ _ p s = if is_hidden p then s else " x | None -> "0"]) ^ "\">" ^ s ^ "" in let print_nospouse _ = do { Perso.print_sosa conf base p2 True; Wserver.wprint "%s%s" (gen_person_title_text reference std_access conf base p2) (Date.short_dates_text conf base p2) } in let print_spouse sp first = do { if first then do { Perso.print_sosa conf base p2 True; Wserver.wprint "%s" (gen_person_title_text reference std_access conf base p2) } else do { Wserver.wprint "%s" conf.xhs (person_title_text conf base p2) }; Wserver.wprint "%s & " (Date.short_dates_text conf base p2); Perso.print_sosa conf base sp True; Wserver.wprint "%s%s" (gen_person_title_text (reference_sp sp) std_access conf base sp) (Date.short_dates_text conf base sp) } in if match p_getenv conf.env "spouse" with [ Some "on" -> False | _ -> True ] then print_nospouse () else let u = Array.to_list (get_family p2) in match u with [ [] -> print_nospouse () | _ -> let _ = List.fold_left (fun a ifam -> let cpl = foi base ifam in let sp = if get_sex p2 = Female then pget conf base (get_father cpl) else pget conf base (get_mother cpl) in let _ = print_spouse sp a in False) True u in () ] ; value rec print_descend_upto conf base max_cnt ini_p ini_br lev children = if lev > 0 && cnt.val < max_cnt then do { if lev <= 2 then Wserver.wprint "
        \n" else (); List.iter (fun (ip, ia_asex, rev_br) -> let p = pget conf base ip in let br = List.rev [(ip, get_sex p) :: rev_br] in let is_valid_rel = br_inter_is_empty ini_br br in if is_valid_rel && cnt.val < max_cnt && has_desc_lev conf base lev p then do { if lev <= 2 then do { Wserver.wprint "
      • \n"; if lev = 1 then do { give_access conf base ia_asex ini_p ini_br p br; incr cnt } else do { let s = transl_a_of_gr_eq_gen_lev conf (transl_nth conf "child/children" 1) (person_title_text conf base p) in Wserver.wprint "%s" (capitale (Util.translate_eval s)); Wserver.wprint ":" } } else (); let children = List.map (fun ip -> (ip, ia_asex, [(get_key_index p, get_sex p) :: rev_br])) (children_of base p) in print_descend_upto conf base max_cnt ini_p ini_br (lev - 1) children; if lev <= 2 then Wserver.wprint "
      • \n" else () } else ()) children; if lev <= 2 then Wserver.wprint "
      \n" else () } else () ; value sibling_has_desc_lev conf base lev (ip, _) = has_desc_lev conf base lev (pget conf base ip) ; value print_cousins_side_of conf base max_cnt a ini_p ini_br lev1 lev2 tips = let sib = siblings conf base (get_key_index a) in if List.exists (sibling_has_desc_lev conf base lev2) sib then do { if tips then Util.print_tips_relationship conf else (); if lev1 > 1 then do { Wserver.wprint "
    • \n"; Wserver.wprint "%s:\n" (capitale (cftransl conf "on %s's side" [gen_person_title_text no_reference raw_access conf base a])) } else (); let sib = List.map (fun (ip, ia_asex) -> (ip, ia_asex, [])) sib in print_descend_upto conf base max_cnt ini_p ini_br lev2 sib; if lev1 > 1 then Wserver.wprint "
    • \n" else (); True } else False ; value print_cousins_lev conf base max_cnt p lev1 lev2 = let first_sosa = loop Num.one lev1 where rec loop sosa lev = if lev <= 1 then sosa else loop (Num.twice sosa) (lev - 1) in let last_sosa = Num.twice first_sosa in do { if lev1 > 1 then Wserver.wprint "
        \n" else (); let some = loop first_sosa False True where rec loop sosa some print_tips = if cnt.val < max_cnt && Num.gt last_sosa sosa then let some = match Util.branch_of_sosa conf base (get_key_index p) sosa with [ Some ([(ia, _) :: _] as br) -> print_cousins_side_of conf base max_cnt (pget conf base ia) p br lev1 lev2 print_tips || some | _ -> some ] in loop (Num.inc sosa 1) some False else some in if some then () else Wserver.wprint "%s.\n" (capitale (transl conf "no match")); if lev1 > 1 then Wserver.wprint "
      \n" else () } ; (* HTML main *) value print_cousins conf base p lev1 lev2 = let title h = let txt_fun = if h then gen_person_text_no_html else gen_person_text in if lev1 = lev2 then let s = transl_a_of_gr_eq_gen_lev conf (brother_label conf lev1) (txt_fun raw_access conf base p) in Wserver.wprint "%s" (capitale (Util.translate_eval s)) else if lev1 = 2 && lev2 = 1 then let s = transl_a_of_b conf (transl conf "uncles and aunts") (txt_fun raw_access conf base p) in Wserver.wprint "%s" (capitale (Util.translate_eval s)) else if lev1 = 1 && lev2 = 2 then let s = transl_a_of_gr_eq_gen_lev conf (transl conf "nephews and nieces") (txt_fun raw_access conf base p) in Wserver.wprint "%s" (capitale (Util.translate_eval s)) else Wserver.wprint "%s %d / %s %d" (capitale (transl conf "ancestors")) lev1 (capitale (transl conf "descendants")) lev2 in let max_cnt = try int_of_string (List.assoc "max_cousins" conf.base_env) with [ Not_found | Failure _ -> default_max_cnt ] in do { header conf title; print_link_to_welcome conf True; cnt.val := 0; (* Construction de la table des sosa de la base *) let () = Perso.build_sosa_ht conf base in print_cousins_lev conf base max_cnt p lev1 lev2; tag "p" begin if cnt.val >= max_cnt then Wserver.wprint "etc...\n" else if cnt.val > 1 then Wserver.wprint "%s: %d %s.\n" (capitale (transl conf "total")) cnt.val (Util.translate_eval ("@(c)" ^ transl_nth conf "person/persons" 1)) else (); end; trailer conf } ; value sosa_of_persons conf base = loop 1 where rec loop n = fun [ [] -> n | [ip :: list] -> loop (if get_sex (pget conf base ip) = Male then 2 * n else 2 * n + 1) list ] ; value print_anniv conf base p dead_people level = let module S = Map.Make (struct type t = iper; value compare = compare; end) in let s_mem x m = try let _ = S.find x m in True with [ Not_found -> False ] in let rec insert_desc set up_sosa down_br n ip = if s_mem ip set then set else let set = S.add ip (up_sosa, down_br) set in if n = 0 then set else let u = get_family (pget conf base ip) in let down_br = [ip :: down_br] in let rec loop set i = if i = Array.length u then set else let chil = get_children (foi base u.(i)) in let set = loop set 0 where rec loop set i = if i = Array.length chil then set else let set = insert_desc set up_sosa down_br (n - 1) chil.(i) in loop set (i + 1) in loop set (i + 1) in loop set 0 in let set = let module P = Pqueue.Make (struct type t = (iper * int * int); value leq (_, lev1, _) (_, lev2, _) = lev1 <= lev2; end) in let a = P.add (get_key_index p, 0, 1) P.empty in let rec loop set a = if P.is_empty a then set else let ((ip, n, up_sosa), a) = P.take a in let set = insert_desc set up_sosa [] (n + 3) ip in if n >= level then set else let a = match get_parents (pget conf base ip) with [ Some ifam -> let cpl = foi base ifam in let n = n + 1 in let up_sosa = 2 * up_sosa in let a = P.add (get_father cpl, n, up_sosa) a in P.add (get_mother cpl, n, up_sosa + 1) a | None -> a ] in loop set a in loop S.empty a in let set = S.fold (fun ip (up_sosa, down_br) set -> let u = get_family (pget conf base ip) in let set = S.add ip (up_sosa, down_br, None) set in if Array.length u = 0 then set else let rec loop set i = if i = Array.length u then set else let cpl = foi base u.(i) in let c = spouse ip cpl in loop (S.add c (up_sosa, down_br, Some ip) set) (i + 1) in loop set 0) set S.empty in let txt_of (up_sosa, down_br, spouse) conf base c = " pget conf base ip | _ -> c ]) ^ ";b2=" ^ string_of_int (sosa_of_persons conf base down_br) ^ (match spouse with [ Some _ -> ";" ^ acces_n conf base "4" c | _ -> "" ]) ^ ";spouse=on\">" ^ person_title_text conf base c ^ "" in let f_scan = let list = ref (S.fold (fun ip b list -> [(ip, b) :: list]) set []) in fun () -> match list.val with [ [(x, b) :: l] -> do { list.val := l; (pget conf base x, txt_of b) } | [] -> raise Not_found ] in let mode () = do { xtag "input" "type=\"hidden\" name=\"m\" value=\"C\""; xtag "input" "type=\"hidden\" name=\"i\" value=\"%d\"" (Adef.int_of_iper (get_key_index p)); xtag "input" "type=\"hidden\" name=\"t\" value=\"%s\"" (if dead_people then "AD" else "AN") } in match p_getint conf.env "v" with [ Some i -> Birthday.gen_print conf base i f_scan dead_people | _ -> if dead_people then Birthday.gen_print_menu_dead conf base f_scan mode else Birthday.gen_print_menu_birth conf base f_scan mode ] ; value cousmenu_print = Perso.interp_templ "cousmenu"; value print conf base p = let max_lev = try int_of_string (List.assoc "max_cousins_level" conf.base_env) with [ Not_found | Failure _ -> Perso.default_max_cousin_lev ] in match (p_getint conf.env "v1", p_getenv conf.env "t") with [ (Some lev1, _) -> let lev1 = min (max 1 lev1) 10 in let lev2 = match p_getint conf.env "v2" with [ Some lev2 -> min (max 1 lev2) 10 | None -> lev1 ] in print_cousins conf base p lev1 lev2 | (_, Some (("AN" | "AD") as t)) when conf.wizard || conf.friend -> print_anniv conf base p (t = "AD") max_lev | _ -> cousmenu_print conf base p ] ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/gwcomp.mli0000660000175200017530000000142312664543647023207 0ustar guillaumeguillaume(* $Id: gwcomp.mli,v 5.1 2008-01-12 08:41:18 ddr Exp $ *) (* Copyright (c) 2007-2008 INRIA *) open Def; type key = { pk_first_name : string; pk_surname : string; pk_occ : int }; type somebody = [ Undefined of key | Defined of gen_person iper string ] ; type gw_syntax = [ Family of gen_couple somebody and sex and sex and list (somebody * sex) and gen_family (gen_person iper string) string and gen_descend (gen_person iper string) | Notes of key and string | Relations of somebody and sex and list (gen_relation somebody string) | Bnotes of string and string | Wnotes of string and string ] ; value magic_gwo : string; value line_cnt : ref int; value no_fail : ref bool; value comp_families : string -> unit; value no_picture : ref bool; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/translate.mli0000660000175200017530000000235712664543647023717 0ustar guillaumeguillaume(* camlp5r *) (* $Id: translate.mli,v 5.7 2007-09-12 09:58:44 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) value inline : string -> char -> (char -> string) -> string -> (string * bool); (* [Translate.inline lang macro_char macro str] return the translation and a boolean telling True if it is actually the English version *) value language_name : string -> string -> string; (* [Translate.language_name lang lang_def] *) value eval : string -> string; (* [eval str] return a transformation of [str]. The input string may contain actions between "@(" and ")" whose contents are evaluated like this: - @(x) set the predicate "x" - @(xyz...) set the predicates x, y, z... - @(expr) where expr is of the form "x?e1:e2": if predicate "x" then evaluates e1 else evaluates e2 where e1 and e2 are either another expression "y?e3:e4" or a string (whose 2nd char is not "?"). - @(n--) where n is a number: move the n preceding words to the end of the string. - @(@string) evaluates "@string" recursively; in particular, predicates inside the string remain local. Warning: this function makes obsolete many functions in "Util" taking care of declinations using the system with :x:. *) geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/descend.ml0000660000175200017530000015071712664543647023162 0ustar guillaumeguillaume(* camlp5r ./pa_html.cmo *) (* $Id: descend.ml,v 5.27 2007-09-12 09:58:44 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Config; open Def; open Dag2html; open Gutil; open Gwdb; open Hutil; open Mutil; open Util; value limit_by_tree conf = match p_getint conf.base_env "max_desc_tree" with [ Some x -> max 1 x | None -> 4 ] ; value text_to conf = fun [ 0 -> transl_decline conf "specify" (transl_nth conf "generation/generations" 0) | 1 -> transl conf "to the children" | 2 -> transl conf "to the grandchildren" | 3 -> transl conf "to the great-grandchildren" | i -> Printf.sprintf (ftransl conf "to the %s generation") (transl_nth conf "nth (generation)" i) ] ; value text_level conf = fun [ 0 -> transl_decline conf "specify" (transl_nth conf "generation/generations" 0) | 1 -> transl conf "the children" | 2 -> transl conf "the grandchildren" | 3 -> transl conf "the great-grandchildren" | i -> Printf.sprintf (ftransl conf "the %s generation") (transl_nth conf "nth (generation)" i) ] ; value descendants_title conf base p h = let txt_fun = if h then gen_person_text_no_html else gen_person_text in let s = translate_eval (transl_a_of_gr_eq_gen_lev conf (transl conf "descendants") (txt_fun raw_access conf base p)) in Wserver.wprint "%s" (capitale s) ; value display_descendants_level conf base max_level ancestor = let max_level = min (Perso.limit_desc conf) max_level in let (levt, _) = Perso.make_desc_level_table conf base max_level ancestor in let mark = Array.make (Array.length levt) False in let rec get_level level u list = List.fold_left (fun list ifam -> let des = foi base ifam in let enfants = get_children des in List.fold_left (fun list ix -> let x = pget conf base ix in if mark.(Adef.int_of_iper ix) then list else let _ = mark.(Adef.int_of_iper ix) := True in if levt.(Adef.int_of_iper ix) > max_level then list else if level = max_level then if p_first_name base x = "x" || levt.(Adef.int_of_iper ix) != level then list else [x :: list] else if level < max_level then get_level (succ level) (pget conf base ix) list else list) list (Array.to_list enfants)) list (Array.to_list (get_family u)) in let len = ref 0 in let list = get_level 1 (pget conf base (get_key_index ancestor)) [] in let list = List.sort (fun p1 p2 -> let c = alphabetic (p_surname base p2) (p_surname base p1) in if c = 0 then let c = alphabetic (p_first_name base p2) (p_first_name base p1) in if c = 0 then compare (get_occ p2) (get_occ p1) else c else c) list in let list = List.fold_left (fun pl p -> match pl with [ [(p1, n) :: pl] when get_key_index p = get_key_index p1 -> [(p1, succ n) :: pl] | _ -> do { incr len; [(p, 1) :: pl] } ]) [] list in do { header conf (descendants_title conf base ancestor); Wserver.wprint "%s" (capitale (text_level conf max_level)); if len.val > 1 then Wserver.wprint " (%d %s)" len.val (Util.translate_eval ("@(c)" ^ transl_nth conf "person/persons" 1)) else (); Wserver.wprint ".\n"; html_p conf; print_alphab_list conf (fun (p, _) -> if is_hidden p then "?" else String.sub (p_surname base p) (initial (p_surname base p)) 1) (fun (p, c) -> do { Wserver.wprint "\n%s" (referenced_person_title_text conf base p); Wserver.wprint "%s" (Date.short_dates_text conf base p); if not (is_hidden p) && c > 1 then Wserver.wprint " (%d)" c else (); Wserver.wprint "\n" }) list; trailer conf } ; (* With number *) value mark_descendants conf base marks max_lev ip = loop 0 ip (pget conf base ip) where rec loop lev ip u = if lev <= max_lev then do { marks.(Adef.int_of_iper ip) := True; Array.iter (fun ifam -> let el = get_children (foi base ifam) in Array.iter (fun e -> loop (succ lev) e (pget conf base e)) el) (get_family u) } else () ; value label_descendants conf base marks paths max_lev = loop [] 0 where rec loop path lev p = if lev < max_lev then let u = p in let _ = List.fold_left (fun cnt ifam -> let fam = foi base ifam in let c = spouse (get_key_index p) fam in let el = get_children fam in List.fold_left (fun cnt e -> do { if get_sex p = Male || not marks.(Adef.int_of_iper c) then do { let path = [Char.chr (Char.code 'A' + cnt) :: path] in paths.(Adef.int_of_iper e) := path; loop path (succ lev) (pget conf base e) } else (); succ cnt }) cnt (Array.to_list el)) 0 (Array.to_list (get_family u)) in () else () ; value close_lev = 2; value close_to_end conf base marks max_lev lev p = if lev + close_lev >= max_lev then True else let rec short dlev p = let u = p in List.for_all (fun ifam -> let fam = foi base ifam in let c = spouse (get_key_index p) fam in let el = get_children fam in if get_sex p = Male || not marks.(Adef.int_of_iper c) then if dlev = close_lev then Array.length el = 0 else List.for_all (fun e -> short (succ dlev) (pget conf base e)) (Array.to_list el) else True) (Array.to_list (get_family u)) in short 1 p ; value labelled conf base marks max_lev lev ip = let a = pget conf base ip in let u = a in Array.length (get_family u) <> 0 && (match get_parents a with [ Some ifam -> let fam = foi base ifam in List.exists (fun ifam -> let el = get_children fam in List.exists (fun ie -> let e = pget conf base ie in let u = e in Array.length (get_family u) <> 0 && not (close_to_end conf base marks max_lev lev e)) (Array.to_list el)) (Array.to_list (get_family (pget conf base (get_father fam)))) | _ -> False ]) ; value label_of_path paths p = loop paths.(Adef.int_of_iper (get_key_index p)) where rec loop = fun [ [] -> "" | [c :: cl] -> loop cl ^ String.make 1 c ] ; value print_child conf base p1 p2 e = do { stag "strong" begin if get_sex p1 = Male && eq_istr (get_surname e) (get_surname p1) || get_sex p2 = Male && eq_istr (get_surname e) (get_surname p2) then Wserver.wprint "%s" (referenced_person_text_without_surname conf base e) else Wserver.wprint "\n%s" (referenced_person_text conf base e); end; Wserver.wprint "%s" (Date.short_dates_text conf base e) }; value print_repeat_child conf base p1 p2 e = stag "em" begin if get_sex p1 = Male && eq_istr (get_surname e) (get_surname p1) || get_sex p2 = Male && eq_istr (get_surname e) (get_surname p2) then Wserver.wprint "%s" (person_text_without_surname conf base e) else Wserver.wprint "%s" (person_text conf base e); end ; value display_spouse conf base marks paths fam p c = do { Wserver.wprint "\n&"; Wserver.wprint "%s" (Date.short_marriage_date_text conf base fam p c); Wserver.wprint " "; stag "strong" begin Wserver.wprint "\n%s" (referenced_person_text conf base c); end; if marks.(Adef.int_of_iper (get_key_index c)) then Wserver.wprint " (%s)" (label_of_path paths c) else Wserver.wprint "%s" (Date.short_dates_text conf base c) } ; value total = ref 0; value print_family_locally conf base marks paths max_lev lev p1 c1 e = loop lev e where rec loop lev p = if lev < max_lev then let _ = List.fold_left (fun (cnt, first, need_br) ifam -> let fam = foi base ifam in let c = spouse (get_key_index p) fam in let el = get_children fam in let c = pget conf base c in do { if need_br then html_br conf else (); if not first then print_repeat_child conf base p1 c1 p else (); display_spouse conf base marks paths fam p c; Wserver.wprint "\n"; let print_children = get_sex p = Male || not marks.(Adef.int_of_iper (get_key_index c)) in if print_children then Wserver.wprint "
        \n" (succ cnt) else (); let cnt = List.fold_left (fun cnt ie -> let e = pget conf base ie in do { if print_children then do { Wserver.wprint "
      1. "; print_child conf base p c e; Wserver.wprint "\n"; incr total; if succ lev = max_lev then list_iter_first (fun first ifam -> let fam = foi base ifam in let c1 = spouse ie fam in let el = get_children fam in let c1 = pget conf base c1 in do { if not first then do { html_br conf; print_repeat_child conf base p c e } else (); display_spouse conf base marks paths fam e c1; if Array.length el <> 0 then Wserver.wprint "....." else (); Wserver.wprint "\n" }) (Array.to_list (get_family (pget conf base ie))) else loop (succ lev) e } else (); succ cnt }) cnt (Array.to_list el) in if print_children then Wserver.wprint "
      \n" else (); (cnt, False, not print_children) }) (0, True, False) (Array.to_list (get_family p)) in () else () ; value last_label = ref ""; value print_family conf base marks paths max_lev lev p = do { if lev <> 0 then do { Wserver.wprint "%s." (label_of_path paths p); html_br conf } else (); let lab = label_of_path paths p in if lab < last_label.val then failwith "print_family" else last_label.val := lab; let _ = List.fold_left (fun cnt ifam -> let fam = foi base ifam in let c = spouse (get_key_index p) fam in let el = get_children fam in let c = pget conf base c in do { stag "strong" begin Wserver.wprint "\n%s" (referenced_person_text conf base p); end; display_spouse conf base marks paths fam p c; Wserver.wprint "
        \n" (succ cnt); let cnt = List.fold_left (fun cnt ie -> let e = pget conf base ie in do { if get_sex p = Male || not marks.(Adef.int_of_iper (get_key_index c)) then do { Wserver.wprint "
      1. "; print_child conf base p c e; incr total; Wserver.wprint "\n"; if labelled conf base marks max_lev lev ie then Wserver.wprint " => %s\n" (label_of_path paths e) else if succ lev = max_lev then Array.iter (fun ifam -> let fam = foi base ifam in let c = spouse ie fam in let el = get_children fam in let c = pget conf base c in do { display_spouse conf base marks paths fam e c; if Array.length el <> 0 then Wserver.wprint "....." else (); Wserver.wprint "\n" }) (get_family (pget conf base ie)) else print_family_locally conf base marks paths max_lev (succ lev) p c e } else (); succ cnt }) cnt (Array.to_list el) in Wserver.wprint "
      \n"; cnt }) 0 (Array.to_list (get_family p)) in () } ; value print_families conf base marks paths max_lev = loop 0 where rec loop lev p = if lev < max_lev then do { print_family conf base marks paths max_lev lev p; Array.iter (fun ifam -> let fam = foi base ifam in let c = spouse (get_key_index p) fam in let el = get_children fam in let c = pget conf base c in if get_sex p = Male || not marks.(Adef.int_of_iper (get_key_index c)) then Array.iter (fun ie -> let e = pget conf base ie in if labelled conf base marks max_lev lev ie then loop (succ lev) e else ()) el else ()) (get_family p) } else () ; value display_descendants_with_numbers conf base max_level ancestor = let max_level = min (Perso.limit_desc conf) max_level in let title h = if h then descendants_title conf base ancestor h else wprint_geneweb_link conf ("m=D;i=" ^ string_of_int (Adef.int_of_iper (get_key_index ancestor)) ^ ";v=" ^ string_of_int max_level ^ ";t=G") (capitale (transl_a_of_gr_eq_gen_lev conf (transl conf "descendants") (person_text conf base ancestor))) in let marks = Array.make (nb_of_persons base) False in let paths = Array.make (nb_of_persons base) [] in do { header conf title; total.val := 0; Wserver.wprint "%s" (Date.short_dates_text conf base ancestor); let p = ancestor in if authorized_age conf base p then match (Adef.od_of_codate (get_birth p), get_death p) with [ (Some _, _) | (_, Death _ _) -> html_br conf | _ -> () ] else (); Wserver.wprint "%s." (capitale (text_to conf max_level)); html_p conf; mark_descendants conf base marks max_level (get_key_index ancestor); label_descendants conf base marks paths max_level ancestor; print_families conf base marks paths max_level ancestor; if total.val > 1 then do { html_p conf; Wserver.wprint "%s: %d %s" (capitale (transl conf "total")) total.val (Util.translate_eval ("@(c)" ^ transl_nth conf "person/persons" 1)); if max_level > 1 then Wserver.wprint " (%s)" (transl conf "spouses not included") else (); Wserver.wprint ".\n" } else (); trailer conf } ; value print_ref conf base paths p = if paths.(Adef.int_of_iper (get_key_index p)) <> [] then Wserver.wprint " => %s" (label_of_path paths p) else Array.iter (fun ifam -> let c = spouse (get_key_index p) (foi base ifam) in if paths.(Adef.int_of_iper c) <> [] then let c = pget conf base c in Wserver.wprint " => %s %s %s" (p_first_name base c) (p_surname base c) (label_of_path paths c) else ()) (get_family p) ; value print_elem conf base paths precision (n, pll) = do { html_li conf; match List.rev pll with [ [[p]] -> do { Wserver.wprint "%s %s %s" (surname_end base n) (reference conf base p (person_text_without_surname conf base p)) (surname_begin base n); Wserver.wprint "%s" (Date.short_dates_text conf base p); print_ref conf base paths p; Wserver.wprint "\n" } | pll -> do { Wserver.wprint "%s%s\n" (surname_end base n) (surname_begin base n); tag "ul" begin List.iter (fun pl -> let several = match pl with [ [_] -> False | _ -> True ] in List.iter (fun p -> do { html_li conf; stag "strong" begin wprint_geneweb_link conf (acces conf base p) (p_first_name base p); end; if several && precision then do { stag "em" begin specify_homonymous conf base p True; end; } else (); Wserver.wprint "%s" (Date.short_dates_text conf base p); print_ref conf base paths p; Wserver.wprint "\n" }) pl) pll; end } ] } ; value sort_and_display conf base paths precision list = let list = List.map (pget conf base) list in let list = List.sort (fun p1 p2 -> let c = alphabetic (p_surname base p2) (p_surname base p1) in if c = 0 then alphabetic (p_first_name base p2) (p_first_name base p1) else c) list in let list = List.fold_left (fun npll p -> match npll with [ [(n, pl) :: npll] when n = p_surname base p -> [(n, [p :: pl]) :: npll] | _ -> [(p_surname base p, [p]) :: npll] ]) [] list in let list = List.map (fun (n, pl) -> let pll = List.fold_left (fun pll p -> match pll with [ [([p1 :: _] as pl) :: pll] when eq_istr (get_first_name p1) (get_first_name p) -> [[p :: pl] :: pll] | _ -> [[p] :: pll] ]) [] pl in (n, pll)) list in if list <> [] then tag "ul" begin List.iter (print_elem conf base paths precision) list; end else () ; value display_descendant_index conf base max_level ancestor = let max_level = min (Perso.limit_desc conf) max_level in let title h = let txt = capitale (transl conf "index of the descendants") in if not h then wprint_geneweb_link conf ("m=D;i=" ^ string_of_int (Adef.int_of_iper (get_key_index ancestor)) ^ ";v=" ^ string_of_int max_level ^ ";t=C") txt else Wserver.wprint "%s" txt in do { header conf title; let marks = Array.make (nb_of_persons base) False in let paths = Array.make (nb_of_persons base) [] in mark_descendants conf base marks max_level (get_key_index ancestor); label_descendants conf base marks paths max_level ancestor; let list = ref [] in for i = 0 to nb_of_persons base - 1 do { if paths.(i) <> [] then let p = pget conf base (Adef.iper_of_int i) in if p_first_name base p <> "?" && p_surname base p <> "?" && p_first_name base p <> "x" && (not (is_hide_names conf p) || fast_auth_age conf p) then list.val := [get_key_index p :: list.val] else () else () }; sort_and_display conf base paths True list.val; trailer conf } ; value display_spouse_index conf base max_level ancestor = let max_level = min (Perso.limit_desc conf) max_level in let title _ = Wserver.wprint "%s" (capitale (transl conf "index of the spouses (non descendants)")) in do { header conf title; let marks = Array.make (nb_of_persons base) False in let paths = Array.make (nb_of_persons base) [] in mark_descendants conf base marks max_level (get_key_index ancestor); label_descendants conf base marks paths max_level ancestor; let list = ref [] in for i = 0 to nb_of_persons base - 1 do { if paths.(i) <> [] then let p = pget conf base (Adef.iper_of_int i) in let u = p in if p_first_name base p <> "?" && p_surname base p <> "?" && p_first_name base p <> "x" then Array.iter (fun ifam -> let c = spouse (get_key_index p) (foi base ifam) in if paths.(Adef.int_of_iper c) = [] then let c = pget conf base c in if p_first_name base c <> "?" && p_surname base c <> "?" && p_first_name base p <> "x" && (not (is_hide_names conf c) || fast_auth_age conf c) && not (List.mem (get_key_index c) list.val) then list.val := [get_key_index c :: list.val] else () else ()) (get_family u) else () else () }; sort_and_display conf base paths False list.val; trailer conf } ; (* *********************************************************************** *) (* [Fonc] print_desc_table_header : config -> base -> int *) (** [Description] : Affiche en fonction des options qui sont sélectionnées le header du tableau de descendance. [Args] : - conf : configuration de la base - base : base de donnée [Retour] : - Le nombre de colonnes à afficher (nombre d'options sélectionnées). [Rem] : Non exporté en clair hors de ce module. *) (* *********************************************************************** *) value print_desc_table_header conf base = do { let nb_col = ref 2 in tag "tr" "class=\"descends_table_header\"" begin tag "th" begin Wserver.wprint "%s" (capitale (transl conf "n° d'Aboville")); end; tag "th" begin Wserver.wprint "%s" (capitale (transl_nth conf "person/persons" 0)); end; if p_getenv conf.env "birth" = Some "on" then tag "th" begin incr nb_col; Wserver.wprint "%s" (capitale (transl conf "date of birth")); end else (); if p_getenv conf.env "birth_place" = Some "on" then tag "th" begin incr nb_col; Wserver.wprint "%s" (capitale (transl conf "where born")); end else (); if p_getenv conf.env "marr" = Some "on" then tag "th" begin incr nb_col; Wserver.wprint "%s" (capitale (transl_nth conf "spouse/spouses" 1)); end else (); if p_getenv conf.env "marr_date" = Some "on" then tag "th" begin Wserver.wprint "%s" (capitale (transl conf "date of marriage")); incr nb_col; end else (); if p_getenv conf.env "marr_place" = Some "on" then tag "th" begin incr nb_col; Wserver.wprint "%s" (capitale (transl conf "where married")); end else (); if p_getenv conf.env "child" = Some "on" then tag "th" begin incr nb_col; Wserver.wprint "%s" (capitale (transl conf "nb children")); end else (); if p_getenv conf.env "death" = Some "on" then tag "th" begin Wserver.wprint "%s" (capitale (transl conf "date of death")); incr nb_col; end else (); if p_getenv conf.env "death_place" = Some "on" then tag "th" begin incr nb_col; Wserver.wprint "%s" (capitale (transl conf "where dead")); end else (); if p_getenv conf.env "death_age" = Some "on" then tag "th" begin incr nb_col; Wserver.wprint "%s" (capitale (transl conf "age at death")); end else (); if p_getenv conf.env "occu" = Some "on" then tag "th" begin incr nb_col; Wserver.wprint "%s" (capitale (transl_nth conf "occupation/occupations" 1)); end else (); end; nb_col.val }; (* *********************************************************************** *) (* [Fonc] print_person_table : config -> base -> person -> string -> unit *) (** [Description] : Affiche en fonction des options qui sont sélectionnées les informations d'une personne (correspond à une ligne du tableau). [Args] : - conf : configuration de la base - base : base de donnée - p : person - lab : numéro d'Aboville de p [Retour] : Néant [Rem] : Non exporté en clair hors de ce module. *) (* *********************************************************************** *) value print_person_table conf base p lab = do { let p_auth = Util.authorized_age conf base p in let nb_families = Array.length (get_family p) in (* On calcul le nombre de rowspan pour avoir un affichage joli. *) let rowspan = if nb_families > 1 && (p_getenv conf.env "marr" = Some "on" || p_getenv conf.env "marr_date" = Some "on" || p_getenv conf.env "marr_place" = Some "on") then "rowspan=\"" ^ string_of_int nb_families ^ "\"" else "" in (* On met partout un   dans le cas où ce que l'on souhaite *) (* afficher est vide, comme ça, on ne casse pas le rowspan. *) tag "tr" begin tag "td" "%s" rowspan begin Wserver.wprint "%s" lab; end; tag "td" "%s" rowspan begin Util.print_image_sex conf p 11; Wserver.wprint " %s  " (referenced_person_title_text conf base p); end; if p_getenv conf.env "birth" = Some "on" then tag "td" "%s" rowspan begin if get_birth p <> Adef.codate_None then let d = match Adef.od_of_codate (get_birth p) with [ Some d when p_auth -> Date.string_slash_of_date conf d | _ -> " " ] in Wserver.wprint "%s" d else let d = match Adef.od_of_codate (get_baptism p) with [ Some d when p_auth -> Date.string_slash_of_date conf d | _ -> " " ] in Wserver.wprint "%s" d; end else (); if p_getenv conf.env "birth_place" = Some "on" then tag "td" "%s" rowspan begin if get_birth p <> Adef.codate_None then Wserver.wprint "%s  " (if p_auth then Util.string_of_place conf (sou base (get_birth_place p)) else "") else Wserver.wprint "%s  " (if p_auth then Util.string_of_place conf (sou base (get_baptism_place p)) else ""); end else (); (* On affiche que la première famille (get_family u).(0). *) (* Les autres familles seront affichées après qu'on ait *) (* fini de remplir le

    • \
      %s
      " bd td_prop txt else txt in (2 * ncol - 1, CenterA, TDitem txt) | None -> (1, LeftA, TDnothing) ] in [td :: tdl] in let spouses_txt v tdl po = let tdl = if tdl = [] then [] else [(1, LeftA, TDnothing) :: tdl] in match po with [ Some (p, auth) when Array.length (get_family p) > 0 -> let rec loop tdl i = if i = Array.length (get_family p) then tdl else let ifam = (get_family p).(i) in let tdl = if i > 0 then [(1, LeftA, TDtext "...") :: tdl] else tdl in let td = let fam = foi base ifam in let ncol = if v > 1 then fam_nb_column 0 (v - 1) fam else 1 in let s = let sp = pget conf base (spouse (get_key_index p) fam) in let txt = person_title_text conf base sp in let txt = reference conf base sp txt in let txt = if auth then txt ^ Date.short_dates_text conf base sp else txt in "&" ^ (if auth then Date.short_marriage_date_text conf base fam p sp else "") ^ " " ^ txt ^ Dag.image_txt conf base sp in let s = if bd > 0 || td_prop <> "" then Printf.sprintf "\
      %s
      " bd td_prop s else s in (2 * ncol - 1, CenterA, TDitem s) in loop [td :: tdl] (i + 1) in loop tdl 0 | _ -> [(1, LeftA, TDnothing) :: tdl] ] in let next_gen gen = List.fold_right (fun po gen -> match po with [ Some (p, auth) -> if Array.length (get_family p) = 0 then [None :: gen] else List.fold_right (fun ifam gen -> let des = foi base ifam in if Array.length (get_children des) = 0 then [None :: gen] else let age_auth = List.for_all (fun ip -> authorized_age conf base (pget conf base ip)) (Array.to_list (get_children des)) in List.fold_right (fun iper gen -> let g = (pget conf base iper, age_auth) in [Some g :: gen]) (Array.to_list (get_children des)) gen) (Array.to_list (get_family p)) gen | None -> [None :: gen] ]) gen [] in let hts = let tdal = loop [] [] [Some (p, True)] (gv + 1) where rec loop tdal prev_gen gen v = let tdal = if prev_gen <> [] then [children_vertical_bars v gen; horizontal_bars v prev_gen; spouses_vertical_bar (v + 1) prev_gen :: tdal] else tdal in let tdal = let tdl = List.fold_left (person_txt v) [] gen in [Array.of_list (List.rev tdl) :: tdal] in let tdal = let tdl = List.fold_left (spouses_txt v) [] gen in [Array.of_list (List.rev tdl) :: tdal] in if v > 1 then loop tdal gen (next_gen gen) (v - 1) else tdal in Array.of_list (List.rev tdal) in hts ; value print_tree conf base v p = let gv = min (limit_by_tree conf) v in let page_title = Printf.sprintf "%s: %s" (capitale (transl conf "tree")) (person_text_no_html conf base p) in let hts = make_tree_hts conf base gv p in Dag.print_slices_menu_or_dag_page conf base page_title hts "" ; value print_aboville conf base max_level p = let max_level = min (Perso.limit_desc conf) max_level in let num_aboville = p_getenv conf.env "num" = Some "on" in do { Hutil.header conf (descendants_title conf base p); print_link_to_welcome conf True; Wserver.wprint "%s.

      " (capitale (text_to conf max_level)); let rec loop_ind lev lab p = do { if num_aboville then Wserver.wprint "%s\n" lab else Wserver.wprint "%s\n" lab; Wserver.wprint "%s%s\n" (referenced_person_title_text conf base p) (Date.short_dates_text conf base p); let u = p in if lev < max_level then for i = 0 to Array.length (get_family u) - 1 do { let cpl = foi base (get_family u).(i) in let spouse = pget conf base (Gutil.spouse (get_key_index p) cpl) in let mdate = if authorized_age conf base p && authorized_age conf base spouse then let fam = foi base (get_family u).(i) in match Adef.od_of_codate (get_marriage fam) with [ Some (Dgreg d _) -> let date = Date.prec_year_text conf d in "" ^ date ^ "" | _ -> "" ] else "" in Wserver.wprint "&%s %s%s\n" mdate (referenced_person_title_text conf base spouse) (Date.short_dates_text conf base spouse) } else (); Wserver.wprint "
      \n"; if lev < max_level then let rec loop_fam cnt_chil i = if i = Array.length (get_family u) then () else let des = foi base (get_family u).(i) in let rec loop_chil cnt_chil j = if j = Array.length (get_children des) then loop_fam cnt_chil (i + 1) else do { loop_ind (lev + 1) (if num_aboville then lab ^ string_of_int cnt_chil ^ "." else lab ^ " ") (pget conf base (get_children des).(j)); loop_chil (cnt_chil + 1) (j + 1) } in loop_chil cnt_chil 0 in loop_fam 1 0 else () } in loop_ind 0 "" p; Hutil.trailer conf } ; value desmenu_print = Perso.interp_templ "desmenu"; value print conf base p = let templ = match p_getenv conf.env "t" with [ Some ("F" | "L" | "M") -> "deslist" | Some _ -> "" | _ -> "desmenu" ] in if templ <> "" then Perso.interp_templ templ conf base p else match (p_getenv conf.env "t", p_getint conf.env "v") with [ (Some "A", Some v) -> print_aboville conf base v p | (Some "S", Some v) -> display_descendants_level conf base v p | (Some "H", Some v) -> display_descendant_with_table conf base v p | (Some "N", Some v) -> display_descendants_with_numbers conf base v p | (Some "G", Some v) -> display_descendant_index conf base v p | (Some "C", Some v) -> display_spouse_index conf base v p | (Some "T", Some v) -> print_tree conf base v p | _ -> desmenu_print conf base p ] ; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/update_nldb.ml0000660000175200017530000001425012664543647024025 0ustar guillaumeguillaume(* camlp5r *) (* $Id: update_nldb.ml,v 5.23 2007-09-12 09:58:44 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Def; open Gwdb; value fname = ref ""; value errmsg = "usage: " ^ Sys.argv.(0) ^ " [options] "; value speclist = []; value anonfun s = if fname.val = "" then fname.val := s else raise (Arg.Bad "Cannot treat several databases") ; value notes_links s = let slen = String.length s in loop [] [] 1 0 where rec loop list_nt list_ind pos i = if i = slen then (list_nt, list_ind) else if i + 1 < slen && s.[i] = '%' then loop list_nt list_ind pos (i + 2) else match NotesLinks.misc_notes_link s i with [ NotesLinks.WLpage j _ lfname _ _ -> let list_nt = if List.mem lfname list_nt then list_nt else [lfname :: list_nt] in loop list_nt list_ind pos j | NotesLinks.WLperson j key _ text -> let list_ind = let link ={NotesLinks.lnTxt = text; NotesLinks.lnPos = pos} in [(key, link) :: list_ind] in loop list_nt list_ind (pos + 1) j | NotesLinks.WLwizard j _ _ -> loop list_nt list_ind pos j | NotesLinks.WLnone -> loop list_nt list_ind pos (i + 1) ] ; value read_file_contents fname = match try Some (open_in fname) with [ Sys_error _ -> None ] with [ Some ic -> let len = ref 0 in try loop () where rec loop () = do { len.val := Buff.store len.val (input_char ic); loop () } with [ End_of_file -> Buff.get len.val ] | None -> "" ] ; value compute base bdir = let bdir = if Filename.check_suffix bdir ".gwb" then bdir else bdir ^ ".gwb" in let nb_ind = nb_of_persons base in let nb_fam = nb_of_families base in do { Printf.eprintf "--- database notes\n"; flush stderr; let list = notes_links (base_notes_read base "") in if list = ([], []) then () else let pg = NotesLinks.PgNotes in NotesLinks.update_db bdir pg list; Printf.eprintf "--- wizard notes\n"; flush stderr; try let files = Sys.readdir (Filename.concat bdir (base_wiznotes_dir base)) in do { for i = 0 to Array.length files - 1 do { let file = files.(i) in if Filename.check_suffix file ".txt" then do { let wizid = Filename.chop_suffix file ".txt" in let wfile = List.fold_left Filename.concat bdir [base_wiznotes_dir base; file] in let list = notes_links (read_file_contents wfile) in if list = ([], []) then () else do { Printf.eprintf "%s... " wizid; flush stderr; let pg = NotesLinks.PgWizard wizid in NotesLinks.update_db bdir pg list; } } else () }; Printf.eprintf "\n"; flush stderr; } with [ Sys_error _ -> () ]; let db = ref (NotesLinks.read_db bdir) in Printf.eprintf "--- misc notes\n"; flush stderr; let ndir = Filename.concat bdir (base_notes_dir base) in let rec loop dir name = try let cdir = Filename.concat ndir dir in let files = Sys.readdir cdir in do { for i = 0 to Array.length files - 1 do { let file = files.(i) in if Filename.check_suffix file ".txt" then do { let fnotes = Filename.chop_suffix file ".txt" in let file = Filename.concat dir fnotes in let list = notes_links (base_notes_read base file) in if list = ([], []) then () else do { let fnotes = if name = "" then fnotes else Printf.sprintf "%s%c%s" name NotesLinks.char_dir_sep fnotes in Printf.eprintf "%s...\n" fnotes; flush stderr; let pg = NotesLinks.PgMisc fnotes in db.val := NotesLinks.add_in_db db.val pg list; } } else loop (Filename.concat dir file) (if name = "" then file else Printf.sprintf "%s%c%s" name NotesLinks.char_dir_sep file) }; flush stderr; } with [ Sys_error _ -> () ] in loop Filename.current_dir_name ""; Printf.eprintf "--- individual notes\n"; flush stderr; ProgrBar.full.val := '*'; ProgrBar.start (); for i = 0 to nb_ind - 1 do { let p = poi base (Adef.iper_of_int i) in let s = let sl = [get_notes; get_occupation; get_birth_src; get_baptism_src; get_death_src; get_burial_src; get_psources] in String.concat " " (List.map (fun f -> sou base (f p)) sl) in let list = notes_links s in if list = ([], []) then () else let pg = NotesLinks.PgInd (Adef.iper_of_int i) in db.val := NotesLinks.add_in_db db.val pg list; ProgrBar.run i nb_ind }; ProgrBar.finish (); Printf.eprintf "--- families notes\n"; flush stderr; ProgrBar.full.val := '*'; ProgrBar.start (); for i = 0 to nb_fam - 1 do { let fam = foi base (Adef.ifam_of_int i) in if not (is_deleted_family fam) then do { let s = let sl = [get_comment; get_fsources] in String.concat " " (List.map (fun f -> sou base (f fam)) sl) in let list = notes_links s in if list = ([], []) then () else let pg = NotesLinks.PgFam (Adef.ifam_of_int i) in db.val := NotesLinks.add_in_db db.val pg list; } else (); ProgrBar.run i nb_fam }; ProgrBar.finish (); NotesLinks.write_db bdir db.val; } ; value main () = do { Argl.parse speclist anonfun errmsg; if fname.val = "" then do { Printf.eprintf "Missing database name\n"; Printf.eprintf "Use option -help for usage\n"; flush stderr; exit 2; } else (); Secure.set_base_dir (Filename.dirname fname.val); let base = Gwdb.open_base fname.val in do { Sys.catch_break True; try compute base fname.val with [ Sys.Break -> do { Printf.eprintf "\n"; flush stderr; () } ]; } } ; Printexc.catch main (); geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/outbase.ml0000660000175200017530000004410112664543647023204 0ustar guillaumeguillaume(* $Id: outbase.ml,v 5.21 2007-01-19 01:53:16 ddr Exp $ *) (* Copyright (c) 2006-2007 INRIA *) open Dbdisk; open Dutil; open Def; open Mutil; value load_ascends_array base = base.data.ascends.load_array (); value load_unions_array base = base.data.unions.load_array (); value load_couples_array base = base.data.couples.load_array (); value load_descends_array base = base.data.descends.load_array (); value load_strings_array base = base.data.strings.load_array (); value close_base base = base.func.cleanup (); value save_mem = ref False; value trace s = if verbose.val then do { Printf.eprintf "*** %s\n" s; flush stderr } else () ; value count_error computed found = do { Printf.eprintf "Count error. Computed %d. Found %d.\n" computed found; flush stderr; exit 2 } ; value just_copy bname what oc oc_acc = do { Printf.eprintf "*** copying %s\n" what; flush stderr; let ic = let ic = Secure.open_in_bin (Filename.concat bname "base") in do { check_magic ic; ic } in let ic_acc = Secure.open_in_bin (Filename.concat bname "base.acc") in let persons_len = input_binary_int ic in let families_len = input_binary_int ic in let strings_len = input_binary_int ic in let persons_array_pos = input_binary_int ic in let ascends_array_pos = input_binary_int ic in let unions_array_pos = input_binary_int ic in let families_array_pos = input_binary_int ic in let couples_array_pos = input_binary_int ic in let descends_array_pos = input_binary_int ic in let strings_array_pos = input_binary_int ic in let _ (*norigin_file*) = input_value ic in let (beg_pos, end_pos, beg_acc_pos, array_len) = match what with [ "persons" -> let pos = 0 in (persons_array_pos, ascends_array_pos, pos, persons_len) | "ascends" -> let pos = persons_len * Iovalue.sizeof_long in (ascends_array_pos, unions_array_pos, pos, persons_len) | "unions" -> let pos = 2 * persons_len * Iovalue.sizeof_long in (unions_array_pos, families_array_pos, pos, persons_len) | "families" -> let pos = 3 * persons_len * Iovalue.sizeof_long in (families_array_pos, couples_array_pos, pos, families_len) | "couples" -> let pos = (3 * persons_len + families_len) * Iovalue.sizeof_long in (couples_array_pos, descends_array_pos, pos, families_len) | "descends" -> let pos = (3 * persons_len + 2 * families_len) * Iovalue.sizeof_long in (descends_array_pos, strings_array_pos, pos, families_len) | "strings" -> let pos = (3 * persons_len + 3 * families_len) * Iovalue.sizeof_long in (strings_array_pos, in_channel_length ic, pos, strings_len) | _ -> failwith ("just copy " ^ what) ] in let shift = pos_out oc - beg_pos in seek_in ic beg_pos; let rec loop pos = if pos = end_pos then close_in ic else do { output_char oc (input_char ic); loop (pos + 1) } in loop beg_pos; seek_in ic_acc beg_acc_pos; let rec loop len = if len = array_len then close_in ic_acc else do { output_binary_int oc_acc (input_binary_int ic_acc + shift); loop (len + 1) } in loop 0; } ; value make_name_index base = let t = Array.make table_size [| |] in let add_name key valu = let key = Name.crush (Name.abbrev key) in let i = Hashtbl.hash key mod Array.length t in if array_mem valu t.(i) then () else t.(i) := Array.append [| valu |] t.(i) in let rec add_names ip = fun [ [] -> () | [n :: nl] -> do { add_name n ip; add_names ip nl } ] in do { for i = 0 to base.data.persons.len - 1 do { let p = base.data.persons.get i in let first_name = p_first_name base p in let surname = p_surname base p in if first_name <> "?" && surname <> "?" then let names = [Name.lower (first_name ^ " " ^ surname) :: Dutil.dsk_person_misc_names base p (fun p -> p.titles)] in add_names p.key_index names else (); }; t } ; value create_name_index oc_inx oc_inx_acc base = let ni = make_name_index base in let bpos = pos_out oc_inx in do { output_value_no_sharing oc_inx (ni : name_index_data); let epos = Iovalue.output_array_access oc_inx_acc (Array.get ni) (Array.length ni) bpos in if epos <> pos_out oc_inx then count_error epos (pos_out oc_inx) else () } ; value add_name t key valu = let key = Name.crush_lower key in let i = Hashtbl.hash key mod Array.length t in if array_mem valu t.(i) then () else t.(i) := Array.append [| valu |] t.(i) ; value make_strings_of_fsname base = let t = Array.make table_size [| |] in do { for i = 0 to base.data.persons.len - 1 do { let p = poi base (Adef.iper_of_int i) in let first_name = p_first_name base p in let surname = p_surname base p in if first_name <> "?" then add_name t first_name p.first_name else (); if surname <> "?" then do { add_name t surname p.surname; List.iter (fun sp -> add_name t sp p.surname) (surnames_pieces surname); } else (); }; t } ; value create_strings_of_fsname oc_inx oc_inx_acc base = let t = make_strings_of_fsname base in let bpos = pos_out oc_inx in do { output_value_no_sharing oc_inx (t : strings_of_fsname); let epos = Iovalue.output_array_access oc_inx_acc (Array.get t) (Array.length t) bpos in if epos <> pos_out oc_inx then count_error epos (pos_out oc_inx) else () } ; value is_prime a = loop 2 where rec loop b = if a / b < b then True else if a mod b = 0 then False else loop (b + 1) ; value rec prime_after n = if is_prime n then n else prime_after (n + 1); value output_strings_hash oc2 base = let () = base.data.strings.load_array () in let strings_array = base.data.strings in let taba = Array.make (min Sys.max_array_length (prime_after (max 2 (10 * strings_array.len)))) (-1) in let tabl = Array.make strings_array.len (-1) in do { for i = 0 to strings_array.len - 1 do { let ia = Hashtbl.hash (base.data.strings.get i) mod Array.length taba in tabl.(i) := taba.(ia); taba.(ia) := i; }; output_binary_int oc2 (Array.length taba); output_binary_int oc2 0; output_binary_int oc2 0; for i = 0 to Array.length taba - 1 do { output_binary_int oc2 taba.(i) }; for i = 0 to Array.length tabl - 1 do { output_binary_int oc2 tabl.(i) }; } ; value output_surname_index oc2 base tmp_snames_inx tmp_snames_dat = let module IstrTree = Btree.Make (struct type t = dsk_istr; value compare = compare_istr_fun base.data; end) in let bt = ref IstrTree.empty in do { for i = 0 to base.data.persons.len - 1 do { let p = poi base (Adef.iper_of_int i) in let a = try IstrTree.find p.surname bt.val with [ Not_found -> [] ] in bt.val := IstrTree.add p.surname [p.key_index :: a] bt.val }; (* obsolete table: saved by compatibility with GeneWeb versions <= 4.09, i.e. the created database can be still read by these versions but this table will not be used in versions >= 4.10 *) output_value_no_sharing oc2 (bt.val : IstrTree.t (list iper)); (* new table created from version >= 4.10 *) let oc_sn_dat = Secure.open_out_bin tmp_snames_dat in let bt2 = IstrTree.map (fun ipl -> let i = pos_out oc_sn_dat in do { output_binary_int oc_sn_dat (List.length ipl); List.iter (fun ip -> output_binary_int oc_sn_dat (Adef.int_of_iper ip)) ipl; i }) bt.val in close_out oc_sn_dat; let oc_sn_inx = Secure.open_out_bin tmp_snames_inx in output_value_no_sharing oc_sn_inx (bt2 : IstrTree.t int); close_out oc_sn_inx; } ; value output_first_name_index oc2 base tmp_fnames_inx tmp_fnames_dat = let module IstrTree = Btree.Make (struct type t = dsk_istr; value compare = compare_istr_fun base.data; end) in let bt = ref IstrTree.empty in do { for i = 0 to base.data.persons.len - 1 do { let p = poi base (Adef.iper_of_int i) in let a = try IstrTree.find p.first_name bt.val with [ Not_found -> [] ] in bt.val := IstrTree.add p.first_name [p.key_index :: a] bt.val }; (* obsolete table: saved by compatibility with GeneWeb versions <= 4.09, i.e. the created database can be still read by these versions but this table will not be used in versions >= 4.10 *) output_value_no_sharing oc2 (bt.val : IstrTree.t (list iper)); (* new table created from version >= 4.10 *) let oc_fn_dat = Secure.open_out_bin tmp_fnames_dat in let bt2 = IstrTree.map (fun ipl -> let i = pos_out oc_fn_dat in do { output_binary_int oc_fn_dat (List.length ipl); List.iter (fun ip -> output_binary_int oc_fn_dat (Adef.int_of_iper ip)) ipl; i }) bt.val in close_out oc_fn_dat; let oc_fn_inx = Secure.open_out_bin tmp_fnames_inx in output_value_no_sharing oc_fn_inx (bt2 : IstrTree.t int); close_out oc_fn_inx; } ; value gen_output no_patches bname base = let bname = if Filename.check_suffix bname ".gwb" then bname else bname ^ ".gwb" in do { try Unix.mkdir bname 0o755 with _ -> (); let tmp_base = Filename.concat bname "1base" in let tmp_base_acc = Filename.concat bname "1base.acc" in let tmp_names_inx = Filename.concat bname "1names.inx" in let tmp_names_acc = Filename.concat bname "1names.acc" in let tmp_snames_inx = Filename.concat bname "1snames.inx" in let tmp_snames_dat = Filename.concat bname "1snames.dat" in let tmp_fnames_inx = Filename.concat bname "1fnames.inx" in let tmp_fnames_dat = Filename.concat bname "1fnames.dat" in let tmp_strings_inx = Filename.concat bname "1strings.inx" in let tmp_notes = Filename.concat bname "1notes" in let tmp_notes_d = Filename.concat bname "1notes_d" in if not no_patches then do { load_ascends_array base; load_unions_array base; load_couples_array base; load_descends_array base; load_strings_array base; } else (); let oc = Secure.open_out_bin tmp_base in let oc_acc = Secure.open_out_bin tmp_base_acc in let output_array arrname arr = let bpos = pos_out oc in do { Printf.eprintf "*** saving %s array\n" arrname; flush stderr; arr.output_array oc; let epos = Iovalue.output_array_access oc_acc arr.get arr.len bpos in if epos <> pos_out oc then count_error epos (pos_out oc) else () } in try do { output_string oc (if utf_8_db.val then magic_gwb else magic_gwb_iso_8859_1); output_binary_int oc base.data.persons.len; output_binary_int oc base.data.families.len; output_binary_int oc base.data.strings.len; let array_start_indexes = pos_out oc in output_binary_int oc 0; output_binary_int oc 0; output_binary_int oc 0; output_binary_int oc 0; output_binary_int oc 0; output_binary_int oc 0; output_binary_int oc 0; output_value_no_sharing oc (base.data.bnotes.norigin_file : string); let persons_array_pos = pos_out oc in if not no_patches then output_array "persons" base.data.persons else just_copy bname "persons" oc oc_acc; let ascends_array_pos = pos_out oc in if not no_patches then () else trace "saving ascends"; output_array "ascends" base.data.ascends; let unions_array_pos = pos_out oc in if not no_patches then output_array "unions" base.data.unions else just_copy bname "unions" oc oc_acc; let families_array_pos = pos_out oc in if not no_patches then output_array "families" base.data.families else just_copy bname "families" oc oc_acc; let couples_array_pos = pos_out oc in if not no_patches then output_array "couples" base.data.couples else just_copy bname "couples" oc oc_acc; let descends_array_pos = pos_out oc in if not no_patches then output_array "descends" base.data.descends else just_copy bname "descends" oc oc_acc; let strings_array_pos = pos_out oc in if not no_patches then output_array "strings" base.data.strings else just_copy bname "strings" oc oc_acc; seek_out oc array_start_indexes; output_binary_int oc persons_array_pos; output_binary_int oc ascends_array_pos; output_binary_int oc unions_array_pos; output_binary_int oc families_array_pos; output_binary_int oc couples_array_pos; output_binary_int oc descends_array_pos; output_binary_int oc strings_array_pos; base.data.families.clear_array (); base.data.descends.clear_array (); close_out oc; close_out oc_acc; if not no_patches then let oc_inx = Secure.open_out_bin tmp_names_inx in let oc_inx_acc = Secure.open_out_bin tmp_names_acc in let oc2 = Secure.open_out_bin tmp_strings_inx in try do { trace "create name index"; output_binary_int oc_inx 0; create_name_index oc_inx oc_inx_acc base; base.data.ascends.clear_array (); base.data.unions.clear_array (); base.data.couples.clear_array (); if save_mem.val then do { trace "compacting"; Gc.compact () } else (); let surname_or_first_name_pos = pos_out oc_inx in trace "create strings of fsname"; create_strings_of_fsname oc_inx oc_inx_acc base; seek_out oc_inx 0; output_binary_int oc_inx surname_or_first_name_pos; close_out oc_inx; close_out oc_inx_acc; if save_mem.val then do { trace "compacting"; Gc.compact () } else (); trace "create string index"; output_strings_hash oc2 base; if save_mem.val then do { trace "compacting"; Gc.compact () } else (); let surname_pos = pos_out oc2 in trace "create surname index"; output_surname_index oc2 base tmp_snames_inx tmp_snames_dat; if save_mem.val then do { trace "compacting"; Gc.compact () } else (); let first_name_pos = pos_out oc2 in trace "create first name index"; output_first_name_index oc2 base tmp_fnames_inx tmp_fnames_dat; seek_out oc2 int_size; output_binary_int oc2 surname_pos; output_binary_int oc2 first_name_pos; let s = base.data.bnotes.nread "" RnAll in if s = "" then () else do { let oc_not = Secure.open_out tmp_notes in output_string oc_not s; close_out oc_not; }; close_out oc2; List.iter (fun f -> let s = base.data.bnotes.nread f RnAll in let fname = Filename.concat tmp_notes_d (f ^ ".txt") in do { mkdir_p (Filename.dirname fname); let oc = open_out fname in output_string oc s; close_out oc; }) (List.rev (base.data.bnotes.efiles ())); } with e -> do { try close_out oc_inx with _ -> (); try close_out oc_inx_acc with _ -> (); try close_out oc2 with _ -> (); raise e } else (); trace "ok"; } with e -> do { try close_out oc with _ -> (); try close_out oc_acc with _ -> (); remove_file tmp_base; remove_file tmp_base_acc; if not no_patches then do { remove_file tmp_names_inx; remove_file tmp_names_acc; remove_file tmp_strings_inx; remove_dir tmp_notes_d; } else (); raise e }; close_base base; remove_file (Filename.concat bname "base"); Sys.rename tmp_base (Filename.concat bname "base"); remove_file (Filename.concat bname "base.acc"); Sys.rename tmp_base_acc (Filename.concat bname "base.acc"); if not no_patches then do { remove_file (Filename.concat bname "names.inx"); Sys.rename tmp_names_inx (Filename.concat bname "names.inx"); remove_file (Filename.concat bname "names.acc"); Sys.rename tmp_names_acc (Filename.concat bname "names.acc"); remove_file (Filename.concat bname "snames.dat"); Sys.rename tmp_snames_dat (Filename.concat bname "snames.dat"); remove_file (Filename.concat bname "snames.inx"); Sys.rename tmp_snames_inx (Filename.concat bname "snames.inx"); remove_file (Filename.concat bname "fnames.dat"); Sys.rename tmp_fnames_dat (Filename.concat bname "fnames.dat"); remove_file (Filename.concat bname "fnames.inx"); Sys.rename tmp_fnames_inx (Filename.concat bname "fnames.inx"); remove_file (Filename.concat bname "strings.inx"); Sys.rename tmp_strings_inx (Filename.concat bname "strings.inx"); remove_file (Filename.concat bname "notes"); if Sys.file_exists tmp_notes then Sys.rename tmp_notes (Filename.concat bname "notes") else (); if Sys.file_exists tmp_notes_d then do { let notes_d = Filename.concat bname "notes_d" in remove_dir notes_d; Sys.rename tmp_notes_d notes_d; } else (); remove_file (Filename.concat bname "patches"); remove_file (Filename.concat bname "patches~"); remove_file (Filename.concat bname "tstab"); remove_file (Filename.concat bname "tstab_visitor"); remove_file (Filename.concat bname "restrict") } else (); } ; value output = gen_output False; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/src/gutil.mli0000660000175200017530000000206112664543647023036 0ustar guillaumeguillaume(* $Id: gutil.mli,v 5.34 2007-01-19 01:53:16 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) open Def; open Gwdb; value spouse : iper -> family -> iper; value person_ht_add : base -> string -> iper -> unit; value person_not_a_key_find_all : base -> string -> list iper; value person_ht_find_all : base -> string -> list iper; value person_of_string_key : base -> string -> option iper; value find_same_name : base -> person -> list person; value designation : base -> person -> string; value strip_spaces : string -> string; value gen_strip_spaces : bool -> string -> string; value alphabetic_utf_8 : string -> string -> int; value alphabetic : string -> string -> int; value alphabetic_order : string -> string -> int; value arg_list_of_string : string -> list string; value sort_person_list : base -> list person -> list person; value father : gen_couple 'a -> 'a; value mother : gen_couple 'a -> 'a; value couple : bool -> 'a -> 'a -> gen_couple 'a; value parent_array : gen_couple 'a -> array 'a; value find_free_occ : base -> string -> string -> int -> int; geneweb-f658e5836554624435b9e46b75c9b2ac0ac61029/ICHANGES0000660000175200017530000016605412664543647021541 0ustar guillaumeguillaumeInternal, very small, undocumented, or invisible changes ******************************************************** GeneWeb Version 5.02 -------------------- GeneWeb Version 5.00 -------------------- Preliminary remark: I neglected to record the Internal changes between version 4.10 and 01 Jul 2005, but there are a lot of them... I add them when I have some time (and some courage). * GeneWeb server or CGI (gwd) - [11 Dec 05] In update family form, when creating a new person, if conflict, display now at most 50 persons. - [04 Sep 05] Data base forum file can be splited in several files: forum, forum.1, forum.2, and so on. - [27 Aug 05] In marriage relation kind added "no sex check married". - [22 Aug 05] Changed behaviour of displaying a surname : grouping branches when grandchildren have same name (and not children). - [15 Aug 05] Added some shortcuts ("Alt-U" for "update", "Alt-P" for (update) "Person" and ""Alt-F" for "Update family"...) - [08 Aug 05] Fixed bug: in normal access, in personal page, some displayed children could have "x x" and not all for however visible children. Due to combination of authorized_age in perso.ml and fast_auth_age in util.ml (2nd unuseful and perturbating). - [14 Jul 05] Fixed small bug: URL without index (";opt=no_index") displayed "oc=" twice. * Consanguinity computing (consang) - [02 Jul 05] Fixed bug: when number of persons was greater than 1M, the consang applied to a *modified* database failed by "Segmentation fault" after the message "*** read persons". Bug at creation of database. This was due to initial bad save of array header (OCaml integer overflowed on sign). * Dag2html - [14 Aug 05] Fixed bug. Sometimes horiz bar linking two mates did not appear in case of children exchange to nearer them. Had some influence in relationship links "shortest path" because of cleaning up the code by unifying parts coded differently. * Setup program (gwsetup) - [06 Dec 05] Added option -only to set the file containing the only address authorized to connect (default = "only.txt" in directory set by option -gd). Added option -bindir to specify the directory where executables are installed (default = the directory set by option -gd). GeneWeb Version 4.10 -------------------- * General - [11 Aug 04] Some changes to make GeneWeb compilable by the new ocaml, version 3.08. * GeneWeb server or CGI (gwd) - [04 Oct 04] Accept now JPEG files with header "Exif". - [30 Sep 04] Changed decline system and updfam.txt and updind.txt to allow sentences like "insert child/children", particularly in languages with accusative form, like Esperanto (the translation correct being "enmeti idon/idojn", "n" being added to "ido" and to "idoj") - [10 Aug 04] Automatic reordering of marriages from the weddings date in personal pages of witnesses. - [30 Jul 04] When using CGI mode, added a way to delegate authentifi- cation to the http server (apache). - [16 Jul 04] Added code to prepare a possible version allowing to manipulate any kinds of DAGs, not only the ones where people have only two parents, for genealogy of other kinds than humans and animals. - [12 Jul 04] In families forms, added shortcut for created persons: when the birth place starts with "b/", the date and place are set to the baptism instead of birth. Added also "~year" as equivalent to "/year/" to indicate "about date". - [01 Jul 04] Changed all gif files into png. - [22 Jun 04] Fixed slowness of "find_free_occ" if many many names in the list. - [16 Jun 04] Added "history of updates" in wizards notes. - [24 May 04] Display the wizards notes by last modification, and a link has been added for alphabetic order. - [13 May 04] Added index files snames.inx, snames.dat, fnames.inx and fnames.dat to improve memory use in requests dispaying a surname or a first name. - [05 May 04] In URLs referencing somebody with his internal number (i=...), added ";oc=n", n being his occurrence number (only if wizard and n different from 0): useful for updates. - [22 Mar 04] Fixed bug: surnames by alphabetic order failed when surname starting with a space (case not expected). - [03 Mar 04] Added new optional field in wizard and friend password files. With an extra colon, gives user name, which is displayed by default as ident in "forum add" and in wizard notes. - [23 Feb 04] Submit in forum when wizard or friend is now in two buttons, instead of "Ok". - [16 Feb 04] Fixed bug: in ascend pages, the image link remained even if cgl on. - [12 Feb 04] Changed method output of "patches" file: instead of 1/ renaming "patches" into "patches~" 2/ writing "patches", which can be dangerous (writing of "patches" file can fail in the middle and therefore the database is no more accessible) or creating temporary bad accesses ("Internal message: end of file"). Now it: 1/ writes the file "1patches" 2/ renames "patches" into "patches~" 3/ renames "1patches" into "patches". Why didn't I do it earlier? - [24 Jan 04] Improved much memory usage on large databases by adding an access file (name.acc) of the names index (name.inx). Built when database created or after consang. Still work if name.acc does not exist yet (in this case, no optimization, of course). Very sensitive when searching somebody by name, first name or surname. - [24 Jan 04] Improved speed on large databases and/or no memory enough by removing some of the codes "let _ = base.data....array ()" which where supposed to improve speed but using much memory (several tenths of MB in my database 600K persons, instead of about 8MB without this code). - [05 Jan 04] Now, when database notes are modified, an intermediate page is displayed with a link to the "notes" page, instead of the "notes" page itself (to be consistent with other updates pages). - [23 Dec 03] Nicer calendars page. - [23 Dec 03] Optimization: suppressed no-loop-check for added or modified marriages when it is not necessary (for big databases, this check can take much time and memory). - [23 Dec 03] Added "no mention" in marriage kinds (display only "with ...", instead of "married with", "relationship with"...) - [15 Dec 03] Added ability to add parameter ";title=..." in URL to display a title for pages which have no titles. - [07 Dec 03] French revolution year is now displayed in French as "an" instead of "année". - [22 Nov 03] Improved speed in relation by shortest path (computing of "next" links were not optimized). - [14 Nov 03] Improved speed of displaying by first name or by surname when many changes have been done (file "patches" is big). - [25 Sep 03] Added ability to put macros of start.txt in "motd" (in general macros in variables defined by macro %V); useful for example to put a "motd" for only wizards. - [26 Aug 03] In the titles in display by surname, the surnames are now displayed in alphabetic order. - [17 Jul 03] Added URL variable "alwsurn": if "yes" the surnames are always displayed in display by surname and in descendants (same behaviour than the configuration variable "always_surname"). - [15 Jul 03] Changed the personal image URL: now displays an HTML page with the image inside without width and height bounds (before, the image URL displayed the image itself, but it does not work with all browsers). - [07 Jul 03] Changed "wrap=virtual" into "wrap=soft" in textareas. - [31 May 03] Fixed little problem which can be dangerous: in case of empty line in wizard (or friend) authorization file, everybody is wizard (or friend). - [01 Apr 03] Fixed bug for personal pages template: the macro "%prefix_no_templ" had the bad side effect to make the possible "templ=" removed in all the %prefix macros following it in the template file (perso.txt). - [06 Mar 03] Fixed bug: in the template perso.txt, the boolean value child.has_children did not work correctly. - [14 Feb 03] Changed the ability to send messages to wizards (see the change of [24 Dec 01]). Now the message files must be in the databases directory, sub-directory "etc", sub-sub-directory having the name of the database. The file named "mess_wizard_user.txt" is displayed to the wizard named "user" and the file named "mess_wizard.txt" is displayed to all wizards. - [06 Feb 03] Fixed bug: in displaying by slices, if the person's name contained quotes (for example), the coding/decoding did not work correctly and the button "OK" resulted in bad request. - [30 Jan 03] Added option -min_disp_req * GeneWeb compiler (gwc) - [05 Aug 04] Save memory in creating database by saving "persons" data in files. * GeneWeb uncompiler (gwu) - [04 May 04] Fixed small bug displaying in reverse order isolated persons with relations, resulting no fixpoint when doing gwc/gwu. * Gedcom to GeneWeb (ged2gwb) - [12 Feb 03] Fixed problem with places containing only spaces: now replaced with empty strings. * Setup program (gwsetup) - [08 Dec 03] Fixed problem of output files containing spaces. - [17 Sep 03] Added interface for option -uin (code from Olivier Pasteur). - [07 Mar 03] Fixed bug: the -lang parameter of gwsetup did not work when option -daemon was set. - [12 Feb 03] Added double quotes around directories for information lines. * GeneWeb databases Transfer Program (gwtp) - [08 Dec 03] Added option -noup to forbid uploads. GeneWeb Version 4.09 -------------------- * GeneWeb server or CGI (gwd) - [30 Dec 02] In history of updates, added in HTML comments the person's first name/surname/number. - [23 Dec 02] Now, gwd can definitively fail if errors Unix.EBADF or Unix.ENOTSOCK on "accept", because they make the server loop with the same error message. I don't know why it happens sometimes. - [18 Dec 02] Save now a file named base_u.txt in the cnt directory, recording the latest wizards updates. GeneWeb Version 4.08 -------------------- * Compilation - [29 Nov 02] Added option -warn-error for compilation with ocamlc and ocamlopt. * GeneWeb server or CGI (gwd) - [09 Dec 02] Added code in some.ml in order that, in the display by surname, the order is by birth date if "order=d" is added in the URL (code by Ludovic Ledieu). - [28 Nov 02] Fixed bug in displaying relationship by marriage: in the text "are at the same time case1 case2" the "case2" where sometimes false (problems of declinations, in particular). - [22 Nov 02] Added ability to add inline translations in template files (inline translations are parts of text starting with "[" immediately followed by a newline, explicit translations in languages (one by line), and ending "]"). - [14 Nov 02] Fixed bug: in notes, the spaces were incorrectly stripped. - [14 Nov 02] Changed links in forum so that the URL for "next message" is the same as the URL in the forum main page. This way, it is indicated as "visited" the same way. - [13 Nov 02] Renamed some flags names (had old shortcut names). - [08 Nov 02] Changed in Util.string_with_macros the filtering of tags: now positive list (good_tags_list) instead of negative list (dangerous_tags_list): this is better protection against present and future HTML tags. - [07 Nov 02] The option -images_url did not apply in pages from the "DOC" link. Fixed. - [26 Oct 02] Some cleanup in src/perso.ml, using more strings than prints. - [18 Oct 02] One space too many when displaying French Revolution and Hebrew dates. - [14 Oct 02] Fixed problem of displaying consanguinities: sometimes displayed a lot of digits (too much precision). - [04 Oct 02] When entering a complete name (first name + surname), if the spelling does not match, display now an intermediate page ("specify") even if there is only one matching person. - [16 Sep 02] Fixed bug: the "renamed" variable did not work. - [19 Aug 02] Fixed a declination problem in phrase (e.g. in German): grand-parents of the spouse of s.o. which was incorrectly translated: Großeltern von der Ehemann von s.o ("der" was displayed instead of "dem") * Base configuration files (base.gwf) - [03 Oct 02] Fixed bug: when variable "always_surnames" is "yes", did not however displayed the surname when several marriages. * Lexicon (lang/lexicon.txt) - [18 Nov 02] Merged "%1 of %2" and "%1 of (same or...) %1" into one only entry "%1 of %2"; the second case being separated with the first one by a slash. - [26 Sep 02] Added 2 phrases (months) in Russian (Eric Kvaalen). - [25 Jul 02] Fixed and completed some phrases in Russian (Yuri Gavaga). * Gedcom to GeneWeb (ged2gwb) - [22 Aug 02] Fixed bug with option -ls: when the surname held "ß" the following character was converted into uppercase. * Setup program (gwsetup) - [14 Nov 02] Added ability to more use the lexicon; added some phrases; simplified some template files thanks to that. - [03 Nov 02] Added macro "%Lxx;" replaced by the language whose id is "xx" by its translation in the current language. Use it in template files "gwd.htm" and "gwf_1.htm". Added in the gwsetup lexicon the entry "!languages", the same than the one of the gwd lexicon. GeneWeb Version 4.07 -------------------- * GeneWeb daemon/CGI (gwd) - [17 May 02] In ancestor horizontally displaying, added a table with nowrap. - [13 Apr 02] Fixed problem of displaying "ancestors of xx", "descendants of xx" and "cousins of xx" when "xx" is a name with declinations. - [09 Apr 02] Does not index any more the "public name" when there is no title. Added display of misc names in personal page if opt=misc in the URL. - [26 Mar 02] Does not fail any more if the file cnt/actlog is not writable. - [22 Mar 02] Fixed bug in the index of the descendants: they were no more displayed by families. * Setup program (gwsetup) - [20 Jun 02] Changed the macro prefix from "$" into "%", because of a small problem: the CVS macro $Id was also interpreted (generated a BAD MACRO text: not a problem since it was in comments, but...). - [13 Apr 02] Added a "lexicon.txt" file, in order to be able to accept different languages with characters encodings different from iso-8859-1 and for future possible use of translations common to several template files. * General - [11 Mar 02] Big cleanup of the code, changing French named identifiers into English. GeneWeb Version 4.06 -------------------- * GeneWeb daemon/CGI (gwd) - [08 Mar 02] Added option -trace_failed_passwd. - [05 Mar 02] Changed implementation of the bug fix about the "disconnection" when inserting children: removed the bufferization. A simpler solution was just to shutdown "SEND" the socket, read the possible answer, and then shutdown "RECEIVE". The change with version 4.04 (two versions before) is then just the reading of the browser answer: this was because it was not read that the browser was unhappy. GeneWeb Version 4.05 -------------------- * GeneWeb daemon/CGI (gwd) - [24 Feb 02] Added " tags because some browsers display them centered by default. - [10 Dec 01] In configuration file (base.gwf), if the variable "expand_env" is set to "yes" ("no" by default), the system environment variables are expanded in the values of the customized variables (whose name start with "var_"). The syntax for environment variables si ${xxx} where xxx is the environment variable. See the example configuration file a.gwf of the distribution. - [17 Dec 01] Added request variables "by=", "bm=" and "bd=" in displaying of the latest birthdays and death days to specify resp. a year, a month and a day before. - [05 Dec 01] Fixed bug: when merging a person with family with a person with neuter sex, failed (assertion error). - [27 Sep 01] Added "%image_txt;" as variable in perso.txt. Return the person key used as default image name. - [19 Sep 01] Shorter names for variables in update family form, in order to have a shorter communication length and perhaps that it works better with internet explorer. - [19 Sep 01] Trace: too big texts in referer now cut. * Gedcom to GeneWeb (ged2gwb) - [05 Dec 01] Deletion of heading and trailing spaces in some fields. It resulted fields (occupation, sources) having just a space and gwu exported bad results. * GeneWeb databases Transfer Program (gwtp) - [05 Oct 01] Added other acceptable tags in trl files: ul, ol, li, table, tr, td. * Compilation - [07 Sep 01] All executables are now compiled static (no dynamic library) * Everywhere - [27 Nov 01] Changed all "data base" into "database". I am too bad in English... :-) GeneWeb Version 4.03 -------------------- * GeneWeb daemon/CGI (gwd) - [06 Aug 01] Removed in descendants display. - [13 Jul 01] In auth files, added ability to add a ':' after the password followed by a comment. - [11 Jul 01] Added trace of latest connected friends base_f.txt if there is a friend password file. (already exist for wizards) * Lexicon (lang/lexicon.txt) - [14 Jul 01] Added phrase "undefined sex for %t". * GeneWeb databases Transfer Program (gwtp) - [13 Jul 01] Added "wizard_just_friend" which is now configurable under gwtp. GeneWeb Version 4.02 -------------------- * General - [12 May 01] Added a directory "contrib". * Compilation - [17 Apr 01] Added tools/pa_newseq.ml because the Camlp4 revised syntax has changed for sequences. Allow to compile with both old and new versions of Camlp4. * GeneWeb daemon/CGI (gwd) - [17 Jun 01] Fixed problem in display by places/surnames when surnames have declinations: were displayed with their declinations instead of the nominative form. - [03 Jun 01] Fixed inverted alphabetic order of first name for index of descendants and spouses. - [01 Jun 01] Changed displaying in forum: the header are displayed by groups of two months, in order that the changes of the tables sizes in a new month be invisible. - [12 May 01] In request names by alphabetic order (short display), added ability to add ";atleast=xx" where xx is a number, to display only names having at least xx individuals. - [03 May 01] Rewrote some parts of name.ml in a cleaner and surer way. - [21 Apr 01] Added small test in relation.ml in case of request with bad fef parameter to avoid request failure. - [21 Apr 01] Changed robot traces (sorted by number of requests). - [15 Apr 01] In case of overflow while counting relationships, now display *** (instead of the number which overflowed). - [08 Apr 01] In forum headers displaying, put one table for each date, in order that we don't have to wait the end of the table to see the first messages * Lexicon (lang/lexicon.txt) - [25 Apr 01] Deleted some not so important phrases used only in anniversaries of dead people: "of the birth" (using "birth") and "of the death", "of the murder", "of the execution", "of the disappearance" (using "death"). * Setup program (gwsetup) - [09 Apr 01] Changed word "configurate" (which does not exist!) into "configure". - [08 Apr 01] fr/gw2gd.htm: fixed errored message GeneWeb Version 4.01 -------------------- * GeneWeb daemon/CGI (gwd) - [01 Apr 01] The URL to access GeneWeb images does not contains the "?" character any more (in this case, all browser will put hopefully put them in their cache). - [23 Mar 01] The log count is now displayed in the traces before the traitment. - [20 Mar 01] Added + as possible character in an URL. - [15 Mar 01] Added file "alias_lg" in lang directory to specify aliases for languages. GeneWeb Version 4.00 -------------------- * GeneWeb daemon/CGI (gwd) - [10 Mar 01] When sending an image with wrong content type, display that content type in an error page. - [20 Feb 01] Added option '-images_dir': works like '-images_url' but the parameter is a directory (absolute or relative to the -hd directory), where the images are supposed to be. This has been added to be able to add file:// accesses to images in Windows version. - [14 Feb 01] Fixed problem in lexicon: declinations were missing, e.g. combinations "merge persons" or "switch families" did not work in Esperanto. - [13 Feb 01] If "propose_add_family" is "no" in config file, forbid to add families not connected to the rest (i.e. "ok" on "add family" form when everybody is "create"). - [12 Feb 01] In list of all persons sharing same title, the "tree" link is proposed also for browser without tables. - [07 Feb 01] Fixed problem in dag2html. Had to add functions (shorten_too_long and bottom_adjust) to shorten too long branches which may appear in the algorithm. * Lexicon (lang/lexicon.txt) - [01 Mar 01] The existing trailing spaces at end of lines are deleted. Now gwd and the other utilities accept the line "xx:" without trailing space as an empty translation. * GeneWeb compiler (gwc) - [14 Feb 01] Delete empty titles (titles with empty identifier) * Template files - [16 Feb 01] Changed "%origin_file;": displays just the origin file (if wizard). The test "opt=from" is now done in perso.txt by eval_opt = "from" (new syntax). GeneWeb Version 3.11 -------------------- * Images - [03 Feb 01] Installed a much smaller GeneWeb logo. * GeneWeb daemon/CGI (gwd) - [31 Jan 01] Changed default mac_anc_tree to 7 (instead of 5) - [20 Jan 01] Added request "m=KILL_ANC" to kill someone's ancestors. Allowed only if variable "can_kill_ancestors" is set to "yes" in the configuration file. Not documented because need interface with buttons, links, intermediate pages to ask for confirmation, things like that. - [30 Dec 00] When option redirected used, the traces now display the referer. - [27 Dec 00] Fixed problem: age at death were sometimes not displayed when it should have to be. - [19 Dec 00] Fixed several problems of declinations appearing in esperanto version (e.g. texts "parents", "notes"). * Lexicon (lang/lexicon.txt) - [21 Jan 01] Changed phrase "up to" to accept ask for declination. Changed the translation in Czech (Hanus Adler) to indicate the good declination after it. * Setup program (gwsetup) - [30 Dec 00] Fixed information file about how to put a background image, the URL to use and the directory were wrong (obsolete). * GeneWeb databases Transfer Program (gwtp) - [05 Feb 01] Added a trace in case of error. So far, there were no traces, it just stopped. GeneWeb Version 3.10 -------------------- * GeneWeb daemon/CGI (gwd) - [28 Nov 00] Fixed problem in relationship displaying in German; sometimes displayed "ein:d:+em" in the text. - [26 Nov 00] In merging persons the default selected number is now 1/ the lowest if the first names are the same or 2/ the first one if the first names are different. - [18 Nov 00] Changed inference of origin file: trying to link to father or mother's other marriages first. - [10 Nov 00] Fixed bug in titles tree: when the same person appeared several times in the title list, the title tree showed his last order number instead of his (more logicial) first order number. * Installation by Linux rpm - [07..09 Nov 00] Many improvements. See geneweb.spec changelog GeneWeb Version 3.09 -------------------- * General - [29 Oct 00] Added useful function list_iter_first. Deleted functions applied to list to accept old versions of OCaml: now, it is necessary to compile with at least version 3.00. - [12 Oct 00] Changed all "nick_name" into "qualifier" in all source files. * GeneWeb daemon/CGI (gwd) - [31 Oct 00] Created the request "m=RLM" followed by the list of persons to link two by two to create arbitrary dags (i1=...;i2=...;i3=... and so on). Besides, the new code for initializing dags seems to be less bugged, giving better results for example in relationships by shortest path. - [30 Oct 00] In relation.ml changed the part computing the relationship by shortest path to get a function returning the result instead of displaying it and raising a "Found" exception. * GeneWeb uncompiler (gwu) - [02 Nov 00] Filter tabulations. * Consanguinity computing (consang) - [28 Oct 00] Put constants in progress bar (option -q) to have a more readable code. GeneWeb Version 3.08 -------------------- * Makefile - [29 Aug 00] Added variable DESTDIR to represent the distribution directory (request from Debian packagers). * GeneWeb daemon/CGI (gwd) - [22 Sep 00] Fixed gwd traces in case of cgi access with user:passwd; now display the user name in traces, not just the fact he is wizard or friend. - [14 Sep 00] Replaced srcfile.ml macros %d and %t by %s followed by the configuration variable and semicolon: resp. %spropose_add_family; and %spropose_titles;. Same change in start.txt files. - [13 Sep 00] For etc files (e.g. personal index.txt), added macros: %+ to increment a counter and %# to display it. - [12 Sep 00] In traces suspension points for long requests are applied in the middle instead of at end. - [25 Aug 00] Fixed option -redirect: did not apply to all requests - [22 Aug 00] Added test: no more display "age at death" if negative (because of erroneous dates). * Gedcom to GeneWeb (ged2gwb) - [23 Sep 00] Fixed bug: if GIVN = first name, should have ignored it, but did not. * GeneWeb databases Transfer Program (gwtp) - [06 Sep 00] Added ability to change the default language. - [22 Aug 00] Fixed bug: worked only if the CGI name was gwtp (could not be gwtp.cgi, for example). Fixed also the distribution: template files used by gwtp (3 files ending with .txt) were not installed. Fixed also a problem: when downloading a file, the proposed name for the file was not the good one (a trick was used but worked only with Netscape, not IE); changed the same thing for images in gwd. GeneWeb Version 3.07 -------------------- * GeneWeb daemon/CGI (gwd) - [12 Aug 00] For relationlinks by shortest path, if "cancel GeneWeb links" is selected, now it is applied to all pages browsed by ">>". - [12 Aug 00] Added also check baptism date to determine public and private. - [08 Aug 00] In first names by alphabetic order for a given surname, use now (the translation of) "%1 of %2" instead of "of". - [26 Jul 00] Fixed detail in Wserver: closed socket before callback in order to allow the callback to fork processes without being blocked - [25 Jul 00] Restructured Wserver to be cleaner and to save memory when sending big files. - [19 Jul 00] Message "Ready" of gwd display now date as yyyy-mm-dd. - [12 Jul 00] Refreshes with possible good address when bad character in base name (e.g. http://host.com/foo/ instead of http://host.com/foo?) - [12 Jul 00] "Server" answer separate "GeneWeb" and version number with a slash. GeneWeb Version 3.06 -------------------- * Setup program (gwsetup) - [28 Jun 00] Take only the 1st two characters of the language given. * GeneWeb daemon/CGI (gwd) - [12 Jul 00] Added "GeneWeb" and version in server answer. - [11 Jul 00] The first nobility title in personal page is no more capitalized. - [23 Jun 00] Added the macro %u in trailer files (base.trl) which is expanded as the current URL. - [22 Jun 00] Added, in the system of translation in welcome page with [], the ability to put an entry holding %d, with parameter after the [] between parentheses. Allows to have one common version of the paragraph "anniversaries" (and co). - [17 Jun 00] Suppressed traces of rejected robots failing on password accesses. * Welcome pages (*/start.txt) - [12 Jul 00] Completed Esperanto version - [21 Jun 00] The texts after "You can also consult" are now the same for all the welcome pages and translated from the lexicon. GeneWeb Version 3.05 -------------------- * General - [08 Jun 00] Strip executables. - [07 May 00] The files CHANGES and LICENSE now end with .txt. * Gwsetup program - [06 Jun 00] Hacked to fix a problem in clean up: the file cleanup_err.htm is missing in all languages! Used "bsi_err.htm" instead. * GeneWeb daemon/CGI (gwd) - [04 Jun 00] Check about titles dates no more done agains the death date, since titles can be given after death. - [19 May 00] Added a small + in display ancestors horizontally. Seems more pretty :-) - [17 May 00] Fixed problem of the request "robots.txt": the lines ends were "ctrl-o ctrl-j" instead of "ctrl-m ctrl-j (\r\n). - [14 May 00] Does not fail any more ("document contains no data") when the "cnt" directory has no access permissions. - [10 May 00] Changed traces when wizards, friends, global accesses. - [10 May 00] Reply now "no access" for attempt of access to database in CGI mode when base auth file defined (because that works only in server mode). - [04 May 00] Dates "or year" and "year interval" are shortly displayed now as "ca y1/y2" instead of just "ca y1". * GeneWeb uncompiler (gwu) - [16 May 00] Added options -sep and -sep_limit to be able to separate families in different files. * GeneWeb daemon/CGI (gwd) and uncompiler (gwu) - [03 May 00] Delete possible trailing space or newline at end of sources (code missing in some places). * Gedcom to GeneWeb (ged2gwb) - [09 May 00] Added notes CONC when sons (e.g. 2 CONC following 1 CONC). GeneWeb Version 3.04 -------------------- * General - [12 Apr 00] Cleaned up the code to provide a version without process nor threads (ifdef NO_PROCESS). Can prepare a possible Macintosh version. * GeneWeb daemon/CGI (gwd) and welcome files (lang/*/start.txt) - [23 Apr 00] Added macro %m = value of "latest_event" of base.gwf and put links "m=LB;k=%m" "m=LD;k=%m" "m=LM;k=%m" in welcome pages, so showing the default value and indicating (to smart people) the way to change it in the URL. * GeneWeb compiler (gwc) - [28 Apr 00] Cut possible trailing spaces in some input fields * GeneWeb uncompiler (gwu) - [02 Apr 00] Fixed problem in gwu: families could be written several times if phony spouses with several marriages. * GeneWeb compiler (gwc) and uncompiler (gwu) - [02 Apr 00] Added some missing "quote_escaped" in UpdateInd.ml (bug about quotes) - [30 Mar 00] In latest births, skip a line after future births if any. - [23 Mar 00] Generates "csrc" if at least two children have the same #src value (save file length). Added "cbp", idem for the birth place (#bp value). * Gedcom to GeneWeb (ged2gwb) - [10 Apr 00] Applies now "-fne" before "-efn". GeneWeb Version 3.03 -------------------- * GeneWeb daemon/CGI (gwd) - [20 Mar 00] Generates "pz,nz,ocz" instead of "iz" (Sosa reference) when access_by_key. - [16 Mar 00] Added "zur" as particle. - [16 Mar 00] Improved the inferring of origin_file field when updating a family. Now searches also among other marriages. - [05 Mar 00] Changed images request, because it was possible to display the images even for private persons ("friend" security hole). Consequently, there are now two forms of the "m=IM" requests: one for persons (images accessed in directory "bd/images/base"), one for other images (images accessed in directory "bd/images" or "hd/images"). Other consequence: background images must *not* be put in bd/images/base directory. - [05 Mar 00] In m=RL, added ability to add ";tab=on" or ";tab=off" to force printing with or without tables. - [23 Feb 00] Fixed bug: in notes, when " ) between the two branches in simple relationship displaying. - [Jan 9, 00] Centered title "genealogical database". - [Jan 9, 00] Added the ability to add ";td=bgcolor=xxx" in URL when printing a dag. Color the square of the person. - [Jan 5, 00] Added the ability to add ";bd=n" (n >= 1) in URL when printing a dag. Put a square around each person of the tree. - [Dec 14, 99] No more compatibility with old relationship request form e=... - [Dec 14, 99] Changed things so that adding ";em=R;ep=fn;en=sn" in the URL generates relationship computing with "fn sn" in welcome page and in notes (already worked for many other page kinds). * Lexicon - [Jan 14, 00] Deleted entry "his wife/her husband": use now "husband/wife" in all cases. GeneWeb Version 3.01 -------------------- * GeneWeb daemon/CGI (gwd) - [Dec 2, 99] Added a system of "areas" in databases protected by a password, based on the name of the ".gw" files => works only for databases created with "gwc". - [Nov 23, 99] Fixed problem of selecting a first name: sometimes it did not work. Used "Name.lower" instead of "Name.strip_lower" for the list for a future selection. - [Nov 19, 99] Fixed bug: redirected service and renamed service messages did not work in cgi mode - [Nov 13, 99] Added some checks of access tables out of bounds - [Nov 13, 99] Added link to welcome page in case of not found - [Nov 9, 99] Chop suffix ".gwb" if the base name has it in URL - [Nov 6, 99] The URL for the "up" image now independent from the database - [Nov 5, 99] Red display title for not found persons. - [Nov 5, 99] Lengthened the height of the database notes area. * GeneWeb compiler (gwc) and uncompiler (gwu) - [Nov 9, 99] Fixed problem for titles holding the character colon. The gwc raised syntax error. * Gedcom to GeneWeb (ged2gwb) - [Nov 8, 99] Fixed little problem with TITL field: could sometimes create bad titles names without label an place for gedcoms not coming from GeneWeb * Lexicon - [Nov 23, 99] Added entry "maximum". Deleted entry "max %d generations". Changed entry "generation" into "generation/generations". GeneWeb Version 3.00 -------------------- * GeneWeb daemon/CGI (gwd) - [Nov 1, 99] Print relations only for friends and wizards. - [Oct 31, 99] Added macro %k for images in order to have the same request for any database in any language. And several changes to make the DOC request independant from the database. - [Oct 25, 99] Modified the treatment of nth (overflowing after 100) to display the number itself (better than just "n-th"). - [Oct 25, 99] Commented the loading of the whole persons and families arrays in "descend.ml": supposed to make things go faster but consumming 13M in my database when clicking on "descendants" for anybody. - [Oct 15, 99] Added a check of month day in gregorian dates. - [Oct 9, 99] Added a "suicide" request: if exists in the request, the sender go the the robot black list... by setting a hidden URL with that in pages, I can detect them... ha ha ha. - [Oct 9, 99] Fixed bug in "family.ml": for the page "specify" the normal chronological order sometimes did not work correctly. - [Oct 6, 99] When displaying ascend tree in Lynx, changed disposition so that it is displayed in decreasing order of Sosa number. * Consanguinity computing (consang) - [Oct 6, 99] Improved it to save memory. GeneWeb Version 2.07 -------------------- * Gwsetup program - [Sep 25, 99] While saving a ".gwf" file, add the variables not treated in the form, but present in the file. * GeneWeb daemon/CGI (gwd) - [Sep 30, 99] When modifying a person, does not keep the notes when his first name or surname hold a "?" since it cannot not saved in GeneWeb source files. - [Sep 29, 99] Errorred when clicking on surnames by alphabetic order on empty databases. Fixed. - [Sep 28, 99] Forgot sharp (#) as possible character in URLs. Fixed. - [Sep 26, 99] Fixed bug of ordering persons by dates in "specify" page. GeneWeb Version 2.06 -------------------- * General - [Aug 31, 99] Changed internal representation of databases to add "notes origin file" and "sources" for global notes. - [Aug 16, 99] Now "make" does "make opt". To run the older "make" do "make out". The installation tells to run "make" (i.e. "make opt"). The previous installation version told to run "make" and "make opt" but it is unuseful to run both. * Setup program and GeneWeb daemon - [Aug 16, 99] In distribution (make distrib), creates "setup" and "gwd" as shell script wrappers under Unix and .bat files wrappers under Windows. Added the executable "setup" in "gw" directory as name "gwsetup". * GeneWeb daemon/CGI (gwd) - [Aug 30, 99] To make the new option "-no_pit" of ged2gwb, had to change the policy of private/public/iftitles. - [Aug 21, 99] Added request mode "TREE" to display general tree; no interface for it for the moment... - [Aug 17, 99] If option "-auth" used, print the password area like in cgi mode (i.e. an input area instead of hypertexts triggering a window for password), because the auth password and the wizard/friend password are contradictory. - [Aug 17, 99] In display by first name or surname, when several spellings are found, display them in decreasing frequence order. - [Aug 14, 99] In srcfile.ml, for start.txt files, added "o" macro (print if notes) and ability to decline verb + noun ([verb][noun] without space between 1st ] and snd [). - [Aug 8, 99] Improved -robot_xcl option (to exclude impolite robots). - [Aug 7, 99] Fixed bad behavior: in welcome pages, proposed "wizard" to to wizards when the flag "wizard_just_friend" was set. * GeneWeb to Gedcom (gwb2ged) - [Aug 31, 99] For adoptive parents, does not generate a CHIL field any more in adoptive parents family. GeneWeb Version 2.05 -------------------- * General - [Jul 22, 99] Added functions p_first_name and p_surname to prepare installation of declined forms for names. Hope it works one day (not sure...) - [Jul 15, 99] Changed internal reprentation of strings in databases: no more use of ansel encoding, returning back to version 1.06. Should not change anything to normal users. This was done because of too many drawbacks (many displaying bugs, code more complicated) against too few advantages (displaying supposed to be correct when mixing various encodings). Anyway, code is smaller. * GeneWeb daemon/CGI (gwd) - [Aug 6, 99] Dates in traces are now yyyy/mm/dd instead of dd/mm/yyyy - [Aug 5, 99] Restored the system of robot exclusion (had been deleted in version 1.10). - [Aug 3, 99] Increased speed of clicking on "ancestors" by pre-loading the arrays "ascends" and "couples". [Aug 5, 99] Idem with "descendants" by pre-loading "persons" and "families". - [Aug 3, 99] In ancestors and descendants pages moved the "Ok" near the selection popup menu. - [Jul 28, 99] In update family forms, shortened the names of the variables "first_name" and "surname" into "fn" and "sn". - [Jul 23, 99] Check translated formats (phrases holding %'s) displaying the initial format if failed (instead of scratching). - [Jul 9, 99] Changed request syntax for cousins: "v1=#" instead of "v=#" and ability to ask for "v1=#;v2=#" for uncles and nephews... - [Jul 2..Aug 2, 99] Added "access_by_key" in "base.gwf" files to generate accesses by keys instead of index in the person array (which can change when recompiling the base), allowing to update the database without disturbing the users accessing it. * GeneWeb compiler (gwc) - [Jul 20, 99] Translated into English some variables and functions whose names where in French or in mixed French-English. GeneWeb Version 2.04 -------------------- * Installation - [Jun 30, 99] Added "README.txt" (English) and "ALIRE.txt" (French) in distribution just to say that you have to launch the program "setup". GeneWeb Version 2.03 -------------------- * New - [May 30, 99] Added program "fpla": first parentless ancestors. Given a database, displays the Sosa number of the first ancestor without parent. Sorted by Sosa numbers: the first displayed person is therefore the person whose ancestors list is the most complete. * Setup program - [May 12, 99] Added "charset=iso-8859-1" in headers (undefined, before). - [May 11, 99] Give up the second command of base recovery when the first one returns an error code. * GeneWeb daemon/CGI (gwd) - [Jun 2, 99] Deleted the " " added between "on" (or any preposition before a date) and a date. Reasons: 1/ it was not absolutely necessary, 2/ there was a problem with the empty Swedish translation of "on (year)" the translation of "dead on 1953" was "död  1953" resulting on the displaying of two spaces. - [May 23, 99] Deleted supposed unuseful code, particularly in MergeIndOk, to make code cleaner, hopefully not introducing bugs. - [May 23, 99] Added renitialization of field "consang" when modifying families to prepare new version of program "consang" (minimalist). - [May 18, 99] Added thousand separator for displaying of number of persons in the welcome page. * GeneWeb uncompiler (gwu) - [May 28, 99] Fixed missing newlines when the initial sources came from several files and the option -odir was not used. * Compilation - [May 23, 99] Separed consang computation in another file "consangAll.ml". - [May 12,99] Fixed YAAP (yet another accent problem...) - [May 8, 99] Added "make opt" case in "setup" to build optimized versions. GeneWeb Version 2.02 -------------------- * GeneWeb daemon/CGI (gwd) - [May 4, 99] If default_lang of some base (file "base.gwf") is empty set it to default_lang of command "gwd" (was set before only when default_lang was not defined). Changed for the "setup" program. - [May 2, 99] Fixed small uncomfortable feature: when a new couple was added with new (created) persons, then modified to add existing children, the field "origin_file" was not updated for the family. The result is when using "gwu -odir" this new family was displayed on standard output instead of saved in the origin file of a child. - [May 1, 99] Fixed behavior in updating persons form for burial. - [Apr 28, 99] Fixed fragile part of code that reads the lexicon. Raised 'Invalid_argument "String.sub"' if the lexicon held lines interpreted as keys but of string length < 4. The lexicon should not, but if it is corrupted for some reason, this was not a good error message! - [Apr 28, 99] Added the ability to add a file named "refuse.txt" to explain reasons of gwd exclusion. - [Apr 24, 99] Dont print "+" in short dates for died person if there is no death date and if the person is older than 120 years, as it was done in 2.01 for long dates displaying. * GeneWeb compiler (gwc) GeneWeb uncompiler (gwu) Consanguinity computing (consang) GeneWeb to Gedcom (gwb2ged) - [May 2, 99] Changed return code in case of errors found. Now 2. Error messages on stdout instead of stderr. Had to be changed for the new "setup" program. GeneWeb Version 2.01 -------------------- * General - [Mar 31..Apr 5, 99] Changed some types, labels, constructors, functions names, cleaned up some code. * GeneWeb daemon/CGI (gwd) - [Apr 20, 99] Changed title text "nth generation" into "Generation n" because of necessity in Swedish to add another translation. - [Apr 19, 99] Added "value=on" in checkboxes generated HTML code. Seemed to be the default in several browsers (Netscape, IE, Lynx) but not all of them (Kfm). - [Apr 15, 99] Changed link of "gwd.opt", separating the objects in two parts, using cmxa files, because Windows 98 (or maybe Cygnus) does not work with this too long line, I don't know why. No difference in Unix. - [Apr 6, 99] Big cleanup about titles (hopefully not introducing bugs). - [Apr 3, 99] Dont print "died" in personal page if this is the only information (no date, no place) and if it is older than 120 years. - [Mar 22, 99] Ability to put "*" (to match any characters) in lines in exclude file. - [Mar 20, 99] When merging families, does not print any more the intermediate page when there is no differences to select. - [Mar 16, 99] Deleted display of trailing space in some links like in "Modify" in page "update" for example. - [Mar 14, 99] Cleaned up some generated HTML code. - [Mar 10, 99] Inlined "List.remove_assoc" in order to be compilable by OCaml and Camlp4 2.01 as well. * Welcome pages (hd/lang/xx/start.txt) - [Mar 20, 99] Changed order of links for displayed anniversaries and latest births and deaths. * Lexicon (hd/lang/lexicon.txt) - [Mar 22, 99] Changed "allied%t (euphemism for married or... not) to" into "allied%d to". Changed French translation "allie" into "marie". * Wserver (../wserver/wserver.ml) - [Mar 22, 99] Completed "special" list of characters that must be encoded (according to Jean-Christophe Filliatre). GeneWeb Version 2.00 -------------------- * GeneWeb daemon/CGI (gwd) - [Mar 8, 99] Fixed bug for excluded addresses in cgi mode. - [Mar 4, 99] Deleted all "open Unix" and use of "Unix." for all unix function. Deleted "Pervasives.". - [Feb 27, 99] No more newline before the ending dot of the titles displaying in personal pages. - [Feb 18. 99] Added (undocumented) feature: adding ";opt=spouse" to an URL of relationship link (m=RL), the spouses are displayed. * Doc - [Feb 23, 99] Correct HTML for creation of LICENSE.htm in directory doc. GeneWeb Version 1.11 -------------------- * GeneWeb daemon/CGI (gwd) - [Jan 29, 99] Print clear messages when missing files (lexicon.txt, etc.) - [Jan 12, 99] Changed test in input_lexicon (gwd.ml): length of line < 4 instead of line = "": better test to avoid failures when bad lexicon files. * Gedcom to GeneWeb (ged2gwb) - [Jan 16, 99] Ignore abnormal errors (displaying "uncaught exception: Stream.Failure"). * GeneWeb compiler (gwc) - [Jan 23, 99] Forgot to skip tabulations while reading lines in ".gw" files - [Jan 12, 99] Failure error now displayed in stdout instead of stderr. * Most descendants computation (mostdesc) - [Jan 25, 99] Fixed little problem of alphabetic order. - [Jan 16, 99] Added mostdesc.opt in Makefile. GeneWeb Version 1.10 -------------------- * GeneWeb daemon/CGI (gwd) - [06/01/99] Added %y and %z as macros in srcfile.ml - [16/12/98] Translated some program record fields and constructors in english. - [16/12/98] Separated "base" into "base_data" and "base_func" to prepare code cleanup. - [15/12/98] Added forgotten i18n translation of "liens de parenté" (title) and added "head_no_page_title" in util's interface. - [14/12/98] Improved speed in families update: check_noloop made too many accesses to the base (unnecessary accesses to "persons"). - [13/12/98] In src/num.ml, display at least "0" when number is 0! - [12/12/98] Fixed horrible programming of base patches applying, which resulted in much memory allocation and time loosing for bases having many added "things" (persons, families, strings). Now the code is cleaner. Consequence: saved speed and memory allocation in such bases in gwd, gwu, gwb2ged. - [11/12/98] Fixed bugs: newlines at end of fields displayed as newlines by "gwu", resulting of future syntax errors in "gwc" * GeneWeb uncompiler (gwu) - [11/12/98..12/12/98] Improved program (diminution of number of accesses to the base) to allow option "-mem" * Most descendants (mostdesc.out) - [29/12/98] Sort persons with same number of time by alphabetic order. * tools/camlp4_depend.sh - [13/12/98] Deleted "./" in depended file name, because that worked bad in alpha. GeneWeb Version 1.09 -------------------- * gwc: - Added lazy building of topological sort file inside bases (accelerate Sosa number computing in personal pages and relationship links). - Send error and warning messages on stdout, instead of stderr. - Delete non printable characters (e.g. newlines) in strings (first names, etc.) coming from forms. - Fixed some displaying and behavior bugs when adding elements in merging forms. - Fixed some displayed "value=" when the value hold the " character - Some parts of relationship computing use big nums (module Num). Still incomplete. - Change in request syntax "relation... with..." to allow explicit first names and surnames instead of i=. Ex: old syntax (still there for compatibility during some versions) base?e=m%3DR%3Bi%3D31440&m=NG&n=somebody&t=PN new syntax: base?em=R;ei=31440&m=NG&n=somebody&t=PN and ability to write in a direct link: base?em=R;ep=jack;en=nicholson;eoc=3&m=NG&n=somebody&t=PN to be somewhat independant from the index of "jack nicholson" in the base. - Hidden options in requests: ";opt=from" in personal pages, gives the .gw origin file (if any) ";opt=misc" in personal pages, gives the list of miscellaneous names - More complete traces in CGI mode * ged2gwb: - Display message "Strange input" giving the line number instead of character number. * added tools/camlp4_depend.sh to compute dependencies with camlp4 .cmo files in src directory. * added program "mostdesc" (not distributed in executable versions) computing the "most descendants from someone". * changed "pauillac" into "cristal" in addresses. GeneWeb Version 1.08 -------------------- * gwc: - Changed HTML generated by "last 10 births". - strip possible newlines in sources and comments while updating or creating families - small change in warning message telling that children has been reordered: "before" persons are no more clickable - forgot to reset some fields when a person is deleted GeneWeb Version 1.07 -------------------- * Documented structure of bases (file iobase.ml). * ANSEL encoding in base * gwc: - Fixed bug: hash table now with "crush_lower" names, not "strip_lower" because error while compiling base with names "Marie d'Orange" and "Marie Dorange", different in "gwd" but equal (beforewards) in "gwc". - Fixed bug: while decoding strings fields, forgot to skip the possible space (underscored). - A file "command.txt" is created into the base, showing the command line used like for the command "ged2gwb". * gwd: - Don't display person number any more in update form when holding ? in his/her surname or first name - Fixed bug: when updating person, checks were done before patch. - Strip spaces of first names and surnames in forms. * consang: - fixed bug: raised error for empty databases * ged2gwb - not error if no space after initial number GeneWeb Version 1.06 -------------------- * Restructuration (perestroika) for distribution of sources. * Some changes for compilation with version 2.00 of OCaml and Camlp4. * gwd: - added cannot change sex of married person while updating person, this check was missing - changed Name.crush to separate case "roman numbers" and "i" is now treated as other vowels - changed "(%d fois)" into "(%d)" in "descendants, only the selected generation". - updateInd.ml: display number = index for first name or surname = "?" * gwu: - fixed bug of behavior: created files even if not option -odir * lexicon.txt: - integrated Lars' updates for swedish version... in fact integrated in "intermediate" version 1.05. GeneWeb Version 1.05 -------------------- * gwc: - added "wrap=virtual" in notes updating. - added 1 generation in missing ancestors (because if a level complete => nothing printed!) - fixed "Chantal.1 N..." did not work because of searching . from the right - generated images have now "content-length" (necessary for Netscape 2) - srcfile.ml: accept now [] in txt files => translation! - p.birth is now of type Adef.codate - suppressed nobr in descend.ml - suppressed
        with no
      • in descend.ml - fixed bug: when creating or modifying someone, the test of existing was firstname1 ^ surname1 = firstname2 ^ surname2 instead of firstname1 = firstname2 && surname1 = surname2 - Soza -> Sosa GeneWeb Version 1.04 -------------------- * gwc: - added magic number in gwo files. - in case of option error, does not display usage, just invitation to use the -help option * gwd: - fixed bug in relation: if same person, was not detected. - using new pa_html.cmo - added option "-nolock" not to create lock files; drawback: risk of scratching counter (not grave), or the database, if two users attempt to modify it at the same time; this option were only in Unix version, it is now added in Windows version too. - in research by names, "s" ending words are ignored - when refusing a log (fucking robots!), return status 403 and a small message; logs in "refuse_log". - added option -robot_xcl to test fast attacks. - fixed bug descend "only the generation concerned": persons descending several time were not factorized. * gwd, consang: - in Windows NT/95, locking files never blocks: the action is just refused => * when updating the base, if the base cannot be locked, the update is rejected. * when applying "consang", if the base cannot be locked, "consang" is rejected. * if the counter file cannot be locked, the counter is just not updated. * gwc, gwu: - added "csrc" to factorize "#src" when all children have the same GeneWeb Version 1.03 -------------------- * gwd: - ascend.ml & relation.ml: print upto faster thanks to maxlen added (l=...) - capitalization of all letters with accents is now ok - added "gwd.xcl" to exclude connexions * Makefiles: - add and use of tools/camlp4_comm.sh GeneWeb Version 1.02 -------------------- * gwd - lower threshold for optimized relationship link from 25 to 15. * gwc - in photos => recode underscores (transformed into spaces!). - Can now wait for 4 clients in the queue (listen 4). GeneWeb Version 1.01 -------------------- * gwd - saw that sometimes "accept" fails for other reasons than timeout => no more message now in the trace. GeneWeb Version 1.0 ------------------- GeneWeb Version 1.0 beta.10 --------------------------- GeneWeb Version 1.0 beta.9 -------------------------- * gwd - added possible sleep in env to test memory consummation - changed algorithm of last n births: was o(n^2), now o(n*log n) GeneWeb Version 1.0 beta.8 -------------------------- * gwd - fixed problem of Maertens: "Cannot access to start.txt", although it was a problem of accessing "copyright.txt" - "%f" in language files (used in version.txt) do not generate just "command", but "command?" if not cgi and "command?b=base;" if cgi GeneWeb Version 1.0 beta.7 -------------------------- - changed big num (e.g. for Soza numbers) => no limit - HTTP protocol: always return status 202 OK, even on errors - lang/lexicon.txt: nth generation go up to 125 (fr) - ged2gwb: if surname or first name of someone = "?", may transform it into "x" (to preserve consistency between gwb2gw and gwc) - fixed problem of alphabetic order in displaying by titles - trailer always included even in source files, which must not yet hold at their end. - copyright added at end if file "copyright.txt" not accessible but without link to my site. - file "copyright.txt" changed into "copyr.txt" (I am afraid of problems of long file names in Windows). - fixed bug: problems of and in displaying "ancestors .. up to .."
      • in display by surname, to avoid that the lines be folded. Replaced the I had suppressed some time ago because it was not standard. - [26 Jan 02] The "calendars" page shows the time (of the server machine). - [20 Jan 02] Use of dates order (according to the language) in calendars page. * Gedcom to GeneWeb (ged2gwb) - [26 Feb 02] Some changes in witnesses (did not work any more), added the ability to be witness several times, fixed problems of dates written as text in titles. - [26 Feb 02] Fixed bug: did not import date FROM BET 1487 AND 1488. I am not sure it is correct gedcom but it can happen in title date range. * GeneWeb to Gedcom (gwb2ged) and Gedcom to GeneWeb (ged2gwb) - [20 Jan 02] Fixed bug when converting from and to ansel encoding: the German character es-tsett needed to be converted. * GeneWeb compiler (gwc) and Gedcom to GeneWeb (ged2gwb) - [10 Jan 02] Warranty that the index (istr) number of the empty string is 0 and of the string "?" is 1. * GeneWeb databases Transfer Program (gwtp) - [30 Jan 02] Grouped the two languages en and fr in common templates. * Setup program (gwsetup) - [04 Feb 02] When extracting a file (source or gedcom), take now the base name (the possible directory part is removed). * All executables - [10 Jan 02] No more statically linked by default. * Template files - [20 Jan 02] Fixed bug in perso.txt: has_image worked only for the current person. GeneWeb Version 4.04 -------------------- * GeneWeb daemon/CGI (gwd) - [31 Dec 01] Fixed bug: [*(month)]10 did not work in templates, because only one character was scanned. - [24 Dec 01] Added ability to create a file named "base_user_mess.txt" where base is the data base name, user a wizard name: in this case the connected wizard receive the contents of this file at each page which he receives. - [20 Dec 01] Added "align=left" to all "