alchi-flyer.en.html 158 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8">
  5. <title>alchi flyer</title>
  6. <!--
  7. nur wer sucht, kann finden.
  8. nur wer die wahrheit* sucht, kann sie auch finden.
  9. *(das richtige ziel)
  10. 13/24 rache, kritik: früher / später
  11. print settings:
  12. use mozilla firefox
  13. code is optimized for firefox
  14. chrome shows some bugs (page 2 moved up)
  15. and uses other font (increase font_size)
  16. scale to full page, not printable area
  17. duplex on long side
  18. some printers have slow duplex,
  19. so manual duplex is faster for large batches
  20. printer:
  21. im using a Canon Pixma G5050
  22. bottle ink printer
  23. with a 250 sheet paper capacity
  24. costing about 0.1 euro-cent per page
  25. needing 30 seconds per color page
  26. and 10 seconds per blackwhite page
  27. = one reason to keep the second page blackwhite
  28. print quality is only 600dpi
  29. but we can optimize our document (pixel hinting)
  30. for better print results
  31. con manual duplex: about 2% print errors (blank pages)
  32. auto duplex: 70 seconds per double-page print
  33. print larger:
  34. 1. print to PDF file alchi-flyer.pdf
  35. 2. run: pdfposter -mA4 -pA3 alchi-flyer.pdf alchi-flyer.poster.pdf
  36. this will scale pages from A4 to A3 = factor 1.4 larger
  37. 3. print the *.poster.pdf file with the option "shrink to printable area"
  38. skip empty pages 1 and 4, print: 2,3,5,6
  39. change text:
  40. change 'const font_size = ....;'
  41. to change font size, to fill pages
  42. TODO
  43. * use printer unit "points"
  44. and pixel-hinting / dot-hinting
  45. for better print results.
  46. optimize for 600dpi printers.
  47. translate html to svg coordinates 1:1.
  48. avoid scaling factors, or round scaled coordinates.
  49. -->
  50. <meta name="author"
  51. content="Milan Hauth <milahu@gmail.com>">
  52. <link rel="schema.dcterms" href="http://purl.org/dc/terms/">
  53. <meta name="dcterms.rights"
  54. content="License is Creative Commons Zero">
  55. <link rel="copyright"
  56. href="https://creativecommons.org/publicdomain/zero/1.0/deed.de">
  57. <!--
  58. printing from firefox is blurry
  59. use "print to PDF"
  60. and print from a PDF viewer (not firefox)
  61. - fixed?
  62. -->
  63. <script>
  64. const VERSION = "2020-09-01-en";
  65. const DOCNAME = `alchi-flyer-${VERSION}`;
  66. document.title = DOCNAME;
  67. // din a4 = 210 x 297 mm2
  68. const page_x = 210; // mm
  69. //const page_y = 297; // mm
  70. const page_y = 296.5; // mm
  71. // bigger values add empty page
  72. // TODO report bug to firefox?
  73. // 297mm != 296.6666666mm
  74. // rounding error from inch conversion?
  75. // firefox print dialog: A4 = 8.27 inch x 11.69 inch
  76. // also in firefox:
  77. // "print page 1" prints one empty page
  78. //const page_margin = 5; // mm
  79. const page_margin = {
  80. top: 5,
  81. right: 5,
  82. bottom: 5,
  83. left: 5,
  84. }; // mm
  85. const content_x = page_x - page_margin.left - page_margin.right;
  86. const content_y = page_y - page_margin.top - page_margin.bottom;
  87. const map_margin = 3;
  88. const map_w = 10;
  89. const map_a = map_w / 8;
  90. const map_x_html = content_x/4;
  91. const map_y_html = map_x_html;
  92. const map_x_svg = 4*map_w + 3*map_margin + 4*map_a;
  93. const map_y_svg = map_x_svg;
  94. const scale_svg_html = map_x_svg / map_x_html;
  95. const table_margin = 4;
  96. const bgpat_w = content_x / 5 / 4;
  97. // TODO scale with content
  98. const font_size = 2.365; // firefox
  99. const font_size_page2 = font_size;
  100. const font_size_map = 4;
  101. const footer_y = font_size * 1.25;
  102. // helper function
  103. Array.range = function(from, to=undefined) {
  104. if (to) {
  105. const len = to - from;
  106. if (len > 0) {
  107. // from <= val <= to
  108. return Array.from(Array(1+len)).map((_, idx) => from+idx);
  109. } else {
  110. // from >= val >= to
  111. return Array.from(Array(1-len)).map((_, idx) => from-idx);
  112. }
  113. } else {
  114. if (from > 0) {
  115. // 0 <= val <= "from"
  116. return Array.from(Array(1+from)).map((_, idx) => idx);
  117. } else {
  118. // 0 >= val >= "from"
  119. return Array.from(Array(1-from)).map((_, idx) => -idx);
  120. }
  121. }
  122. }
  123. // intake: `${energy}kCal` or `${mass}Gr`
  124. function macros_mass_ratio(type, intake, round_to=1) {
  125. // kiloCalories
  126. //const energy_intake = 2000; // daily intake
  127. //const energy_intake = 400; // one meal
  128. const energy_ratio = {
  129. // numbers in percent
  130. "endo": {c: 25, p: 35, f: 40}, // = air
  131. "meso": {c: 40, p: 30, f: 30}, // = fire + earth
  132. "ecto": {c: 55, p: 25, f: 20}, // = water
  133. };
  134. // energy density. D = E / M. M = E / D
  135. const cal_per_gram = {
  136. c: 4, p: 4, f: 9,
  137. };
  138. const density_cpf = ["c", "p", "f"].map(key => (
  139. energy_ratio[type][key]/100/cal_per_gram[key]
  140. ));
  141. function _round(f, round_to=1){
  142. return Math.round(f/round_to)*round_to;
  143. }
  144. const m1 = intake.match(/^([0-9]+)kCal$/);
  145. if (m1) {
  146. const energy_intake = parseInt(m1[1]);
  147. return density_cpf.map(val => _round(val*energy_intake, round_to)).join("+");
  148. }
  149. const m2 = intake.match(/^([0-9]+)Gr$/);
  150. if (m2) {
  151. const mass_intake = parseInt(m2[1]);
  152. const density_total = density_cpf.reduce((acc, val) => (acc + val), 0);
  153. return density_cpf.map(val => _round(val/density_total*100, round_to)).join("+");
  154. }
  155. }
  156. function macros_energy_ratio(mc, mp, mf, show_relative=true) {
  157. //const energy_intake = 2000; // kiloCalories
  158. const mass = { c: mc, p: mp, f: mf };
  159. // energy density. D = E / M. M = E / D
  160. const cal_per_gram = {
  161. c: 4, p: 4, f: 9,
  162. };
  163. const energy_cpf = ["c", "p", "f"].map(key => (
  164. mass[key]*cal_per_gram[key]
  165. ));
  166. if (show_relative) {
  167. // normalize to 100 grams total
  168. const energy_total = energy_cpf.reduce((acc, val) => (acc + val), 0);
  169. return energy_cpf.map(val => Math.round(val/energy_total*100)).join("+");
  170. }
  171. else {
  172. return energy_cpf.map(val => Math.round(val)).join("+");
  173. }
  174. }
  175. /* files are now inlined in html
  176. let file = {
  177. four_bodies: 'four elements - bodies 2020-07-30 color5.svg',
  178. three_hands: 'test-hands-long-or-broad.de.svg',
  179. };
  180. */
  181. let text = {
  182. page_footer: `
  183. <span>[ <a href="https://web.archive.org/web/*/https://github.com/milahu/alchi">web.archive.org/web/*/</a> ]&nbsp; <a href="https://github.com/milahu/alchi">github.com/milahu/alchi</a></span>
  184. <span><a href="https://creativecommons.org/publicdomain/zero/1.0/deed.de">Lizenz: CC-Zero-1.0</a></span>
  185. <span>${DOCNAME}.html</span>
  186. `,
  187. header_page1: `
  188. Hey! <b>We seek friends</b>,
  189. and this is our plan:
  190. `,
  191. header_page2: `
  192. Hey! <b>We seek friends</b>,
  193. and this is page 2:
  194. `,
  195. para_four_bodies: `
  196. The perfect <b>extended family</b>
  197. needs exactly <b>16 people</b>.
  198. Who is who?
  199. The <b>four bodies</b> ABCD
  200. are easy to see
  201. because <nw>gender (man or woman?)</nw>
  202. and <nw>age (parent or child?)</nw>
  203. are obvious
  204. (above threshold, loud voices, raw structure).
  205. Four bodies =
  206. `,
  207. para_four_elements: `
  208. Harder to see
  209. (subliminal, silent voices,
  210. fine structure, ghosts)
  211. are the <b>Four Elements</b> 1234.
  212. The four elements differ in sensing and moving.
  213. Sensing shapes our passive side
  214. (world view, impression, receive),
  215. Moving shapes our active side
  216. (Movement, expression, send).
  217. (Comparison:
  218. sensory and motor nerve fibers)
  219. Four elements =
  220. `,
  221. problem_misunderstandings: `
  222. A big problem in this world is:
  223. <nw>Bad communication</nw> and <b>misunderstandings</b>
  224. between different types of people.
  225. We like to surround ourselves only with friends
  226. but we have no idea what to do with our enemies
  227. except keep them at distance
  228. and secretly fight them.
  229. Our model shows:
  230. How can we use our friends to talk to our enemies?
  231. To do this, our <b>friends work as translators</b>.
  232. Direct communication with enemies is prohibited
  233. because that always leads to misunderstandings
  234. (dont talk to stranger),
  235. because friendship and hostility
  236. are mostly based on (hidden) <b>personal reasons</b>
  237. and obvious reasons are often just pretext.
  238. `,
  239. /* moved to natural order
  240. mutual_completion: `
  241. In the perfect world
  242. each element is allowed to live its strength
  243. and can <b>delegate his weaknesses</b>
  244. to his friends.
  245. `,
  246. */
  247. mix_types: `
  248. <nw><b>Mix types</b> - Where do mix types come from?</nw>
  249. Each element can play three modalities.
  250. Each modality is also an element.
  251. Example: fire plays water = 1x4.
  252. The element that can <b>not</b> be played,
  253. is the opposite element = typical weakness.
  254. (Therefore only three modalities, and not four.)
  255. Opposite elements are: fire-earth and air-water
  256. (see compass or
  257. <nw>tense-cross &xmark;</nw> on the map).
  258. Example: water can never play air.
  259. Sometimes it's easier to ask:
  260. <b>What element can I never play?</b>
  261. Or which two properties (sense + move)
  262. can i never play at the same time?
  263. When an element plays itself
  264. then it plays the "mutable" modality
  265. (Sagittarius, Virgo, Gemini, Pisces).
  266. E.g. air plays air
  267. = 3x3 = mutable air = Gemini.
  268. (Zodiac sign? Yes, but
  269. <b>Calendar astrology is wrong</b>.
  270. Birthday has zero influence on element or modality,
  271. but elements are
  272. <nw>distributed by <b>random</b></nw>,
  273. <nw>not hereditary</nw>,
  274. <nw>not computable</nw>).
  275. The two external modalities,
  276. childish modality (x13) and
  277. mature modality (x24),
  278. correspond to relations
  279. with certain other types
  280. (Relation as cause <b>or</b> effect
  281. = Having a partner or Looking for a partner).
  282. With the two <b>external modalities</b>
  283. (childish or mature)
  284. one property is made stronger
  285. <!-- (sense or move), -->
  286. and the other property is made weaker.
  287. Example:
  288. <nw>2x4 = earth plays water</nw>
  289. = female-mature plays male-mature
  290. = inner gender is made weaker
  291. and inner age is made stronger.
  292. The weaker property
  293. is balanced
  294. (middle-old or "bi-sexual"),
  295. the stronger property is extreme
  296. (<nw>extreme masculine</nw>, <nw>extreme feminine</nw>,
  297. <nw>extreme childish</nw>, <nw>extreme mature</nw>).
  298. Mutable modality also means:
  299. The two external modalities
  300. are played equally often / strong,
  301. so they are in balance.
  302. <nw>When do I play <b>what modality?</b></nw>
  303. We see that on the Map Of The 16 Types.
  304. `,
  305. mix_types_sample: `
  306. Example: As "Me" we take
  307. <nw>point A1 (fire son).</nw>
  308. As partner we choose
  309. <nw>point C3 (air daughter).</nw>
  310. Then we go <b>one step further</b> to A4
  311. - this is the modality of A1,
  312. so:
  313. <nw>Fire (1) plays water (4) = 1x4</nw>
  314. = fixed fire = Leo,
  315. more precise:
  316. <nw>Fire <b>seeks air</b> plays water = 134.</nw>
  317. The following applies to partner C3:
  318. <nw>Air (seeks fire) plays earth = 312.</nw>
  319. In total, we see a dialog-bond
  320. <nw>2 1&lt;&gt;3 4 = 1&lt;&gt;3</nw>.
  321. Let's stay with "Me is A1".
  322. Now we take C2 (earth daughter) as partner.
  323. Again, we go "one step further"
  324. and arrive at A4, again
  325. (the map is simply repeated:
  326. leave the map at the top, continue on the bottom).
  327. Here we see:
  328. <nw>Fire <b>seeks earth</b> plays water = 124</nw>
  329. And:
  330. <nw>Earth seeks fire plays air = 213.</nw>
  331. In total, we see a monolog-bond
  332. <nw>4 2&gt;&gt;1 3 = 2&gt;&gt;1</nw>.
  333. So for every modality there are
  334. always two partners.
  335. <!--
  336. The childish modalities (x13) are called "cardinal"
  337. (Aries, Capricorn, Libra, Cancer) (arrow out),
  338. the mature modalities (x24) were called "fixed"
  339. (Leo, Taurus, Aquarius, Scorpio) (arrow in).
  340. -->
  341. `,
  342. two_modalities: `
  343. Childish modality
  344. = Me plays a <nw>childish element (x13)</nw>
  345. = <nw><b>strong</b> but stupid</nw>
  346. = <nw>See and talk.</nw>
  347. mature modality
  348. = Me plays a <nw>mature element (x24)</nw>
  349. = <nw><b>smart</b> but weak</nw>
  350. = <nw>Listen and show.</nw>
  351. Modality is the <b>preferred</b> stress response,
  352. which "in doubt" (neutral stress)
  353. is chosen more often.
  354. Or the preferred partner,
  355. who is chosen more often
  356. (out of habit / one-sidedness).
  357. Theoretical personality tests
  358. (blind to body type)
  359. or political-opinion polls
  360. are answered by the modality, not by the element.
  361. Modality shapes <b>self-image</b>.
  362. `,
  363. monolog_bond: `
  364. Strength and smartness
  365. in a <b>monolog</b> relation (direct current):
  366. <nw>Talker &gt;&gt; Listener</nw>
  367. (Arrows as seen on the map,
  368. for example <nw>3 4&lt;&lt;1 2 = 4&lt;&lt;1</nw>).
  369. <b>Talker</b> is strong but stupid
  370. (plays his childish modality)
  371. <b>Listener</b> is smart but weak
  372. (plays its mature modality).
  373. Talker is seer and speaker, teacher,
  374. Narrator, answerer, spokesman,
  375. has distrust and influence.
  376. Listener is listener and pointer,
  377. Student, understanding,
  378. Denominator, questioner,
  379. is trusting and powerless.
  380. Speakers and listeners have an <b>interview</b>:
  381. Speaker sends long sentences,
  382. The listener sends short keywords.
  383. The Faith-Question (What Do I Believe?)
  384. is always a personal question
  385. so <b>who do I believe?</b>,
  386. So who am I listening to?
  387. so who are my speakers?
  388. So who do I play with
  389. my mature modality (listener)
  390. and can understand?
  391. <!--
  392. (and the other plays
  393. his childish modality.)
  394. -->
  395. And vice versa:
  396. <b>Who believes me?</b>,
  397. so who listens to me?
  398. so who are my listeners?
  399. So who do I play with
  400. my childish modality (speaker)
  401. and am understood?
  402. <!--
  403. So who is playing with me
  404. his mature modality?
  405. (and I play
  406. my childish modality.)
  407. The map provides answers:
  408. -->
  409. <!--
  410. Answers / stories flow from speaker to listener,
  411. Questions / emotions flow from listener to speaker.
  412. Answers / narratives are emotionless, value-neutral.
  413. Questions / emotions are groundless, inexplicable.
  414. Speaker sends rations and captures emotions.
  415. The listener catches rations and sends emotions.
  416. TODO better.
  417. Rational information flows from speaker to listener [complex],
  418. Emotional information flows from listener to speaker [simply].
  419. The listener is deaf to the speaker's emotions
  420. Speaker is deaf to the rations of listener.
  421. Natural order
  422. Personal reasons
  423. teacher and student
  424. Sender and catcher
  425. Influence and Mind
  426. Unbelief and belief
  427. -->
  428. `,
  429. four_truths: `
  430. The four elements
  431. bring <b>four truths</b>,
  432. and only when speaker and listener
  433. are naturally connected,
  434. every truth can be heard
  435. and only in this way can every element
  436. use other truths as well.
  437. `,
  438. anti_nature: `
  439. A common cause of violence and pain
  440. is communication <b>against nature</b>,
  441. giving false strength or false smartness.
  442. False expectation means:
  443. (By nature) unable to have something
  444. but <b>despite</b> want to have it
  445. (Violence, force, rebellion, the hard way).
  446. Example:
  447. By nature, two partners can
  448. only have a monolog relation,
  449. because their modalities dictate it.
  450. If the two still force a dialog,
  451. then it's always a false dialog,
  452. and always brings misunderstandings
  453. because the relation is "not made" for it.
  454. `,
  455. false_talking: `
  456. <b>False speakers</b>:
  457. The listener and speaker are in a monolog relation:
  458. <nw>speaker &gt;&gt; listener</nw>.
  459. Talker plays his childish modality,
  460. listener plays his mature modality.
  461. The listener wants to talk back
  462. (Role-exchange without partner-exchange),
  463. but the listener automatically plays the listener
  464. in the presence of speaker.
  465. On the direct way
  466. the listener can not speak
  467. so the listener must use psychological violence (scream louder)
  468. to send a false speech.
  469. Listener will try to break
  470. the natural deafness of speaker.
  471. Talker seems deaf, disobedient,
  472. distrusting, unteachable,
  473. ungrateful child, problem student.
  474. In extreme cases, the listener makes the wrong conclusion:
  475. "The speaker learns nothing from me
  476. so he doesn't learn from anyone."
  477. `,
  478. false_hearing: `
  479. <b>False listener</b>:
  480. The speaker wants to hear and understand
  481. what the listener says and means
  482. (role-exchange without partner-exchange).
  483. But a speaker automatically becomes a speaker
  484. near listener.
  485. Speaker is deaf to the listener's answers,
  486. and only understands questions from the listener.
  487. To find the answers <b>despite</b> this limitation,
  488. speakers will answer the questions himself,
  489. but these wrong answers
  490. are not the real answers from listener.
  491. Speaker will try
  492. to break natural misunderstandings.
  493. Listener seems like a mute,
  494. mysterious, fool, madman, immature,
  495. who only asks a thousand questions
  496. but can never give an answer.
  497. In extreme cases, the speaker makes the wrong conclusion:
  498. "I can't understand him
  499. so nobody can understand him."
  500. `,
  501. right_feedback: `
  502. (Naturally) correct speaking and listening:
  503. When we want to have a dialog with monolog partners
  504. (Talking back or listening back),
  505. we need <b>mutual friends</b>
  506. to build a <nw>Flow-square &square;</nw>
  507. or <nw>tense-cross &xmark;</nw>.
  508. Then the <b>way back</b> does not go directly to the partner,
  509. but via the <b>long way</b>
  510. via the other two partners in the group-of-four
  511. (see partner-exchange in the Flow-square).
  512. `,
  513. dialog_bonds: `
  514. In a <b>dialog</b> relation (alternating current)
  515. both have same sense,
  516. i.e. <nw>2 1 &lt;&gt; 3 4 = 1 &lt;&gt; 3</nw>
  517. (Both play listener)
  518. or <nw>1 2 &gt;&lt; 4 3 = 2 &gt;&lt; 4</nw>
  519. (Both play speaker).
  520. <!-- TODO expand? -->
  521. `,
  522. ////////// TODO translate
  523. diagonal_bonds: `
  524. To the <b>same element</b>
  525. do we have exactly one bond
  526. namely the diagonal binding in the Flow-square.
  527. This bond only works
  528. when both play the same modality
  529. (Example: D4x2 and C4x2)
  530. and at the same time change their modality
  531. (for D4x1 and C4x1).
  532. This change of modality
  533. also happens with
  534. <b>Partner swap</b> in the Flow-square,
  535. the diagonal partner is an opponent (half-friend),
  536. with whom you share two partners,
  537. and again and again at the same time
  538. the partner changes,
  539. so that there are always <b>two pairs</b>.
  540. `,
  541. club16: `
  542. <nw><b>Club 16</b>: We meet <b>every day</b> at 4 p.m.</nw>
  543. at the house numbers <nw>"K Mal 16"</nw>
  544. in the streets of our neighborhood.
  545. <nw>So, house numbers ${Array.range(8).map(v=>v*16).join(", ")}, ...</nw>
  546. <!-- 0, 16, 32, 48, 64, 80, 96, 112, 128 -->
  547. That is our minimal consensus
  548. as a basis for self-organization.
  549. Nobody comes to your meeting point?
  550. Then try other meeting places,
  551. in other streets in your neighborhood.
  552. We ask:
  553. <nw>1. What's your element?</nw>
  554. <nw>2. How old are you?</nw>
  555. <nw>3. Who do you know here?</nw>
  556. <nw>4. Who fits together?</nw>
  557. We go <nw>from house to house</nw>,
  558. <nw>from door to door</nw>
  559. and we say <nw>"Hey! We're looking for friends."</nw>
  560. (The rest then somehow happens ...)
  561. <!-- all meeting points are beautiful. decentralized!
  562. Larger meeting points are house numbers
  563. K * 32, K * 64, K * 128, etc.
  564. The biggest meeting point is always
  565. House number zero (at the beginning of the street).
  566. -->
  567. <nw><b>Domes</b>: Who fits together?</nw>
  568. If according to our map
  569. two people go well together,
  570. then we bring the two together.
  571. Meetings:
  572. With our friends
  573. we have two meetings every day
  574. to organize our <b>private life</b>.
  575. A <b>morning meeting</b>,
  576. where the night is followed up,
  577. and where the day is being prepared.
  578. And an <b>evening meeting</b>,
  579. where the day is followed up,
  580. and where the night is prepared.
  581. Follow-up means:
  582. What was good?
  583. What was bad
  584. Preparing means:
  585. Forming pairs and groups,
  586. for the day or for the night.
  587. We can use it to organize in the long term
  588. a <b>vote with your feet</b>,
  589. So partner swap, child swap,
  590. Home exchange, ....
  591. so that everyone has their friends close by
  592. (<nw>Close ties instead of long-distance relations,</nw>
  593. <nw>Movement instead of captivity</nw>).
  594. <!--
  595. Who wants to carry his element outwards,
  596. who wears
  597. its opposite color (as a bracelet or dress)
  598. or its secondary colors
  599. as a two-piece dress (top-bottom).
  600. -->
  601. `,
  602. gender_vs_modality: `
  603. Gender of partner:
  604. mature items
  605. with gay partners
  606. play <b>pupils</b> / listeners (24sg24).
  607. mature items
  608. with heterosexual partners
  609. play <b>teacher</b> / speaker (24dg13).
  610. Childish elements
  611. with gay partners
  612. play teacher / speaker (13sg13).
  613. Childish elements
  614. with heterosexual partners
  615. play pupils / listeners (13dg24).
  616. "Homo" = same sex
  617. = same gender = sg.
  618. "Hetero" = opposite sex
  619. = diff (erent) gender = dg.
  620. So:
  621. mature items (24)
  622. need teachers / speakers of the same sex.
  623. Childish Elements (13)
  624. need teachers / speakers from the opposite sex.
  625. `,
  626. /*
  627. props_are_positive: `
  628. Eigenschaften der vier Elemente
  629. sind immer Stärken, Talente (positiv).
  630. Für Extraverts ist Introversion eine Schwäche.
  631. Für Neurotiker ist Psychotik eine Schwäche.
  632. Und umgekehrt.
  633. `,
  634. */
  635. nature_vs_art: `
  636. Born or made?
  637. <!-- order of nature and order of art .-->
  638. Half of all people
  639. believes in natural order,
  640. the other half
  641. believes in art order.
  642. <b>Both</b> are subjectively right, as is so often the case.
  643. The key question is:
  644. Which modality is better?
  645. The changeable modality
  646. or an external modality?
  647. `,
  648. natural_order: `
  649. <b>Natural order</b> means:
  650. Everyone is born
  651. with one of the four elements (one middle),
  652. the element / talent remains the same for life.
  653. Predestination, fate.
  654. Everyone should play their changeable modality.
  655. Do what you want,
  656. Be yourself, not artificial
  657. Four color system.
  658. In the natural order
  659. each element is allowed to live its strength
  660. and can <b>delegate his weaknesses</b>
  661. to his friends
  662. (natural division of labor).
  663. The one-sided playing of external modalities
  664. is a misalignment that should be corrected.
  665. <b>correct misalignment</b>:
  666. To do this, you create Flow-squares and / or tie bars,
  667. in which the others have a suitable imbalance,
  668. so that there are always two pairs,
  669. then carefully
  670. be able to practice <b>partner swapping</b>.
  671. The preferred / old partner gives security,
  672. so you can meet the other / new partner
  673. slowly get to know
  674. (Rule and exception),
  675. and exercise his weak external modality.
  676. All members of the group
  677. leave their imbalance at the same time,
  678. so that the group stays in balance.
  679. <!-- repetition
  680. Element is innate and lifelong.
  681. Talent is predetermined and constant.
  682. -->
  683. `,
  684. made_order: `
  685. <b>Art order</b> means:
  686. All people are born equal
  687. (changeable modality)
  688. and through education (art, culture)
  689. either "good" (mature modality)
  690. or "evil" (childish modality, Peter Pan).
  691. Modality is learned and changeable.
  692. Talent can be learned.
  693. "You just have to want to, then anything will work."
  694. (Constructivism, three color system).
  695. `,
  696. mutable_modality: `
  697. <!-- no, only subjectively valid for 12
  698. The changeable modality is considered particularly healthy,
  699. it is the middle between the two other modalities (cardinal and fixed).
  700. -->
  701. The <b>changeable</b> modality (middle-aged)
  702. is the middle
  703. between the external modalities,
  704. between childish and mature.
  705. Changeable modality means:
  706. The element plays on average
  707. both external modalities equally strong / often
  708. (constant change, balanced back and forth).
  709. Changeable modality also means:
  710. The element plays itself
  711. e.g. "air plays air" = 3x3,
  712. `,
  713. in_case_of_doubt: `
  714. In case of <b>Doubt</b>:
  715. Just a theory / vision / daydream?
  716. If the map is wrong:
  717. <nw>The 16 types of people</nw> are real
  718. <nw>(4 bodies x 4 elements)</nw>,
  719. and if you put them all in one place
  720. then they will
  721. find the right order by themself
  722. (Self-organisation).
  723. Other worldviews are also "just theory"
  724. and only because other experiments have been running for a long time,
  725. are they not automatically better.
  726. More competition please!
  727. And, trying is better than studying:
  728. A theory can only be compared
  729. if you've tried them beforehand.
  730. Who wants to attack a good theory
  731. that will distract from the topic
  732. and argue with wrong reasons
  733. (Formal criticism).
  734. Research:
  735. What is still <b>unclear</b>?
  736. As a modality we take
  737. the triple sensors,
  738. but what about the triple motor skills?
  739. More accurate:
  740. As a flow of speech we take
  741. the direction of the childish modality,
  742. i.e. the <nw>sensor flow (> sense>)</nw>.
  743. But what role does it play
  744. the <nw>motor skills flow (> move>)</nw>
  745. towards the female modality?
  746. (Example <nw>4 3> move> 1 2</nw>)
  747. `,
  748. education_mothers: `
  749. A problem of <b>upbringing</b>
  750. is the over-presence of women.
  751. This pushes children into a modality:
  752. Childish Sons (A13) and
  753. mature daughters (C24)
  754. play their mature modality (x24)
  755. (become "good").
  756. mature sons (A24) and
  757. childish daughters (C13)
  758. play their childish modality (x13)
  759. (become "angry").
  760. Hence the popular confusion
  761. "Men are childish (so strong but stupid)".
  762. No,
  763. Gender (AD-BC) and Inner Age (13-24)
  764. are different properties.
  765. Another reason for confusion
  766. "Men are childish"
  767. are the external modalities of altruists (34):
  768. Either an altruist plays fire (34x1),
  769. then he feels masculine and childish.
  770. Or an altruist plays earth (34x2),
  771. then he feels feminine and grown up.
  772. Awareness and <b>self-image</b>
  773. are an expression of modality,
  774. not of element.
  775. <!-- why only 34? 12 do that too! = same element bonds
  776. Art order:
  777. Altruists (34) tend to agree
  778. under a common modality.
  779. Example:
  780. Altruists (34) agree
  781. "mature modality is good (34x2),
  782. and childish modality is evil. "
  783. So:
  784. "Mother good, son bad".
  785. (Feminists, mother goddess, earth ideal).
  786. Or:
  787. Altruists (34) agree
  788. "childish modality is good (34x1),
  789. and mature modality is evil. "
  790. So:
  791. "Son good, mother bad".
  792. (Satanists, Son God, Fire Ideal).
  793. These two collectives (34x2 and 34x1)
  794. wage an endless war for
  795. which ideal is better (earth or fire).
  796. -->
  797. `,
  798. school_no_choice: `
  799. One problem facing <b>school</b> is:
  800. Teachers are superiors and cannot be elected.
  801. Ideally both students and teachers can
  802. choose each other (personality cult, mutuality).
  803. `,
  804. works_everywhere: `
  805. The nice thing is:
  806. Natural order works <b>always</b> and everywhere,
  807. this means,
  808. all areas of life can be reformed
  809. that all people
  810. have their natural bonds.
  811. A disadvantage of this generality is:
  812. Nobody feels responsible
  813. and nobody wants to take the first step ...
  814. `,
  815. four_crosses: `
  816. The <b>four tense-crosses</b>
  817. (<nw>crosses &xmark;</nw> on the map)
  818. differ in the two congruences:
  819. <nw>1. Gender congruence</nw>
  820. = <nw>Outside gender</nw>
  821. times <nw>Inner Gender</nw>.
  822. <nw>2. Age congruence</nw>
  823. = <nw>External age</nw>
  824. times <nw>Inner Age</nw>.
  825. Positive products are called "congruence",
  826. negative products are called "opposition".
  827. Example:
  828. (positive) gender congruence
  829. = Men are male
  830. and women are feminine
  831. = M1 F2 F3 M4
  832. = "PatriArchy" (Ark = pointed below = 14).
  833. Gender opposition
  834. = Women are male
  835. and men are female
  836. = F1 M2 M3 F4
  837. = "MatriArchy" (women are strategists = 14).
  838. `,
  839. four_dots: `
  840. In a <b>square</b> (ABCD) applies:
  841. Mother and father are <b>the same age</b>.
  842. Daughter and son are the same age.
  843. Children of the same age come from different mothers,
  844. so are not related by blood.
  845. (Element is <nw>not hereditary</nw>,
  846. the conclusion of blood relatives
  847. on kindred is wrong.)
  848. But for good communication
  849. are they <b>related</b>,
  850. so next to each other on the map,
  851. in a common
  852. <nw>Flow-square &square;</nw> or
  853. <nw>Tense-cross &xmark;</nw>.
  854. `,
  855. post_script: `
  856. What else?
  857. We need a better leaflet
  858. (<tt>github.com/milahu/alchi</tt>),
  859. a video with our plan,
  860. more translations,
  861. maybe a book
  862. and lots of people
  863. who like and share our project
  864. (share on the internet,
  865. Print and distribute flyers).
  866. <!--
  867. Because: We are looking for friends.
  868. -->
  869. `,
  870. post_script_2: `
  871. Read once and understand everything?
  872. I don't believe you: P
  873. I looked for many years myself
  874. to find these answers ....
  875. Take a break
  876. and read the note again.
  877. <nw>Back to: We're looking for friends!</nw>
  878. `,
  879. // TODO remove?
  880. body1: `A : Sohn : jung + männlich`,
  881. body2: `B : Mutter : alt + weiblich`,
  882. body3: `C : Tochter : jung + weiblich`,
  883. body4: `D : Vater : alt + männlich`,
  884. // TODO remove?
  885. element1: `1 : Feuer : extravertiert + psychotisch`,
  886. element2: `2 : Erde : introvertiert + neurotisch`,
  887. element3: `3 : Luft : extravertiert + neurotisch`,
  888. element4: `4 : Wasser : introvertiert + psychotisch`,
  889. // pallas
  890. me: 'Me',
  891. you: 'You',
  892. he: 'He',
  893. she: 'She',
  894. dress_opposite_color: `
  895. Dress in <b>opposite color</b>:
  896. Women <nw>wear purple and are looking for men</nw>,
  897. Men <nw>wear lime and are looking for women</nw>
  898. (of the same age).
  899. Children <nw>wear turquoise and are looking for parents</nw>,
  900. Parents <nw>wear orange and are looking for children</nw>
  901. (of the same sex).
  902. `,
  903. translation_bigfive: `
  904. Translation for The <b>Big Five</b>:
  905. childish (13) = high openness,
  906. female (23) = high neuroticism,
  907. altruistic (34) = High Agreeableness,
  908. childish modality (x13) = high extraversion,
  909. male modality (x14) = high conscientiousness.
  910. `,
  911. translation_mbti: `
  912. Translation to <b>MBTI</b>:
  913. female (23) = "extraversion",
  914. childish (13) = intuition,
  915. male modality (x14) = Thinking,
  916. childish modality (x13) = perceiving.
  917. `,
  918. project_intro: `
  919. <!-- TODO expand? -->
  920. Who is writing here?
  921. <nw>"We're looking for friends"</nw>
  922. is a project by Element Feuer
  923. (<nw>liberal strategist</nw>,
  924. <nw>main job son</nw>),
  925. to get rid of the problem of misunderstandings,
  926. for liberation from weakness and stupidity.
  927. An answer to the prayer "Deliver us from evil".
  928. One answer to the question:
  929. <b><nw>Who has to talk to whom,</nw>
  930. <nw>so that everyone is heard?</nw></b>
  931. A complex solution to complex problems.
  932. <nw>We promise:
  933. <b>Strength and cunning for everyone!</b></nw>
  934. <!--
  935. And: balance sheet in all four dimensions
  936. (Gender, motor skills, sensory skills, age).
  937. -->
  938. `,
  939. bodies: `
  940. <!-- body -->
  941. <nw>A. Son</nw>
  942. <nw>B. Mother</nw>
  943. <nw>C. Daughter</nw>
  944. <nw>D. Father</nw>
  945. <nw>Age + Gender</nw>
  946. <nw>child + man</nw>
  947. <nw>Parent + wife</nw>
  948. <nw>child + woman</nw>
  949. <nw>parent + husband</nw>
  950. `,
  951. gender2_age3: `
  952. <b>Gender is twofold</b>:
  953. Man or woman.
  954. ("Other gender" is clear.)
  955. The inner gender is also twofold:
  956. male or female.
  957. <b>Age is three times</b>:
  958. Children or peers or parents.
  959. ("Different age" is ambiguous: younger or older.)
  960. The inner age is also threefold,
  961. because <b>inner age equals modality</b>:
  962. childish or middle-aged or mature.
  963. Because there are many different ages
  964. We differentiate between <b>My balance</b>
  965. only by gender and element
  966. (2 x 4 = <b>Eight guys</b>, Noah's family).
  967. The <b>age</b> is important for pairing,
  968. that shows the map of the sixteen types.
  969. 2 out of 6 friends are the same age,
  970. 4 out of 6 friends are of different ages (younger and older).
  971. The old friends
  972. we need in both ages, i.e. younger <b>and</b> older.
  973. Ideally, everyone needs <b>10 friends</b>:
  974. 4 parents + 2 equals + 4 children.
  975. Nobody wants to be the youngest or the oldest.
  976. Children have cuddly toys
  977. as a substitute for younger friends.
  978. Parents have gods
  979. as a replacement for older friends
  980. (Ancestors, ancestors, elders).
  981. The age difference to friends of different ages
  982. should be several years.
  983. Each age group needs 8 types (4 elements times 2 genders),
  984. so three ages give 24 types (4 E x 2 G x 3 age).
  985. Three ages = grandparents, parents, children = "upper class, middle class, lower class".
  986. Then all relations are fulfilled for the <b>middle class</b>.
  987. `,
  988. elements: `
  989. <!-- element -->
  990. 1. Fire
  991. 2. Earth
  992. 3. Air
  993. 4. Water
  994. Own color <!-- (is never worn outside TODO ??) -->
  995. red
  996. green
  997. yellow
  998. blue
  999. Brain, instinct, spirit, inner life, "main job"
  1000. son
  1001. mother
  1002. daughter
  1003. father
  1004. Plato, David Keirsey
  1005. Artist-craftsman <!-- iconic -->
  1006. Dealer <!-- pistic -->
  1007. Idealist-ethicist <!-- noetic -->
  1008. Technician <!-- dianoetic -->
  1009. Counter color <!-- TODO ?? (one color summer dress / slip) -->
  1010. green
  1011. red
  1012. blue
  1013. yellow
  1014. Carl Jung
  1015. intuition
  1016. sensation
  1017. Feel
  1018. Think
  1019. William Sheldon
  1020. Meso-
  1021. Meso-
  1022. endo-
  1023. Ecto- <div class="suffix">Morph</div>
  1024. Anton LaVey
  1025. Satan <!-- Arian -->
  1026. Belial <!-- Bella -->
  1027. Lucifer <!-- Lucas? -->
  1028. Leviathan
  1029. symbol
  1030. ♥ heart
  1031. ♠ spades, spades
  1032. ♣ sheet
  1033. ♦ diamond, diamond
  1034. body shape
  1035. Apple
  1036. pear
  1037. hourglass
  1038. asparagus
  1039. "Race" above-below
  1040. White black
  1041. Black-and-white
  1042. White
  1043. black
  1044. South Park
  1045. Kenny
  1046. Stan
  1047. Eric
  1048. Kyle
  1049. Body up-down
  1050. Wide long
  1051. Long wide
  1052. Wide-wide
  1053. Long long
  1054. <!-- body above-below -->
  1055. soft hard
  1056. hard soft
  1057. soft-soft
  1058. hard-hard
  1059. Sports
  1060. boxer
  1061. runner
  1062. Wrestler
  1063. High jumper
  1064. Harry Potter
  1065. Gryffindor
  1066. Hufflepuff
  1067. Ravenclaw
  1068. Slytherin
  1069. Simpsons
  1070. margin
  1071. Homer
  1072. beard
  1073. Lisa
  1074. Secondary colors (two-tone summer dress / slip, figure-accentuating) top-bottom
  1075. Yellow blue
  1076. Blue yellow
  1077. Red Green
  1078. Green red
  1079. Inner age + inner gender (sensory + motor skills)
  1080. childish + masculine
  1081. mature + female
  1082. childish + feminine
  1083. mature + male
  1084. Macro nutrient requirement in grams of carbs + protein + fat per day (2000 kCal)
  1085. ${macros_mass_ratio("meso", "2000kCal", 5)}
  1086. ${macros_mass_ratio("meso", "2000kCal", 5)}
  1087. ${macros_mass_ratio("endo", "2000kCal", 5)}
  1088. ${macros_mass_ratio("ecto", "2000kCal", 5)}
  1089. Milton Rokeach
  1090. Communist
  1091. nationalist
  1092. socialist
  1093. fascist
  1094. <a href="https://flowgenomeproject.com/">FlowGenomeProject.com</a>
  1095. Hard charger
  1096. Flow goer
  1097. Crowd Pleaser
  1098. Deep thinker
  1099. <!--
  1100. Fat distribution above-below
  1101. Fat-lean
  1102. Lean fat
  1103. fat
  1104. Skinny
  1105. body part
  1106. tongue
  1107. nose
  1108. Mouth?
  1109. Eyes?
  1110. body shape
  1111. carrot
  1112. Bell jar
  1113. eight
  1114. Line
  1115. Stress hormone
  1116. adrenaline
  1117. endorphin
  1118. Cortisol
  1119. Serotonin
  1120. Typical defect
  1121. Tyrosine
  1122. D-phenylalanine
  1123. GABA
  1124. Tryptophan
  1125. Macros per 100 grams
  1126. ${macros_mass_ratio("meso", "100Gr")}
  1127. ${macros_mass_ratio("meso", "100Gr")}
  1128. ${macros_mass_ratio("endo", "100Gr")}
  1129. ${macros_mass_ratio("ecto", "100Gr")}
  1130. number
  1131. 1
  1132. 2
  1133. 3
  1134. 4
  1135. Talent?
  1136. Smart
  1137. Weak
  1138. Strong
  1139. Stupid
  1140. flag of
  1141. North Holland
  1142. Berber
  1143. Ghana
  1144. Dagestan
  1145. job
  1146. Killer (horny goat, breeder)
  1147. Creator (farmer, gardener)
  1148. Robber (hunters, entrepreneurs)
  1149. Donor (diplomat?)
  1150. Hans Eysenck <!-- Sensory (inner age) + motor (inner gender) -->
  1151. extroverted + psychotic
  1152. introverted + neurotic
  1153. extroverted + neurotic
  1154. introverted + psychotic
  1155. body part
  1156. chest
  1157. ass
  1158. head
  1159. neck
  1160. Tobias Beck
  1161. 1 shark, egoist
  1162. 2 whale, helpers, workers
  1163. 3 dolphin, optimist
  1164. 4 Owl, questioning, analyzing
  1165. Macronutrient requirement in grams of carbs + protein + fat per serving (400 kCal)
  1166. ${macros_mass_ratio("meso", "400kCal")}
  1167. ${macros_mass_ratio("meso", "400kCal")}
  1168. ${macros_mass_ratio("endo", "400kCal")}
  1169. ${macros_mass_ratio("ecto", "400kCal")}
  1170. -->
  1171. `,
  1172. sense: `
  1173. Inner age
  1174. Childish
  1175. Grown up
  1176. numbers
  1177. 13
  1178. 24
  1179. <!-- -->
  1180. Reckless
  1181. Stubborn
  1182. <!-- -->
  1183. curious
  1184. old-fashioned
  1185. Hans Eysenck
  1186. Extraverted
  1187. Introvert
  1188. <!-- Hans Eysenck -->
  1189. E.
  1190. I.
  1191. <!-- -->
  1192. Proud
  1193. shame
  1194. solutions
  1195. improvise
  1196. repeat
  1197. conscience
  1198. bad
  1199. good
  1200. Guess
  1201. feeling
  1202. Experience
  1203. <!-- -->
  1204. Fight problems
  1205. Increase the good
  1206. focus
  1207. distributed
  1208. concentrated
  1209. Understand new things, learn
  1210. fast
  1211. slowly
  1212. job
  1213. Universalist
  1214. specialist
  1215. <!-- -->
  1216. Feline
  1217. Canine <div class="suffix">people</div>
  1218. nose
  1219. fine
  1220. rough
  1221. chest
  1222. large
  1223. small
  1224. <!-- -->
  1225. Anticipation <!-- before trying something, happily waiting, idealistic -->
  1226. Rejoicing <!-- after the job is done, making it happy, materialistic -->
  1227. <!-- child's play -->
  1228. truth
  1229. mandatory
  1230. Big Five - openness to experience
  1231. Open
  1232. Closed
  1233. job
  1234. creative
  1235. routine
  1236. Move
  1237. In freedom
  1238. on command
  1239. <!-- work -->
  1240. Meat hunter
  1241. Flower collectors
  1242. <!-- day after rhythm -->
  1243. Early riser
  1244. Late riser
  1245. <!-- -->
  1246. Tomorrow-
  1247. Evening <div class="suffix">human</div>
  1248. Own color
  1249. orange
  1250. turquoise
  1251. <!-- -->
  1252. Red Yellow
  1253. Green Blue
  1254. <!-- -->
  1255. naughty fortune tellers
  1256. polite liars
  1257. <!-- -->
  1258. Viewfinder
  1259. Hideout
  1260. In case of problems <!-- deviation -->
  1261. sensitive
  1262. capable of suffering <!-- ignorant -->
  1263. Problems
  1264. attack
  1265. displace
  1266. Against problems
  1267. aggressive
  1268. defensive
  1269. Poison
  1270. spit
  1271. to swallow
  1272. <!--
  1273. -
  1274. confront
  1275. avoid
  1276. -->
  1277. <!-- -->
  1278. indulgence
  1279. Attention
  1280. <!--
  1281. For new experience
  1282. open
  1283. closed
  1284. -->
  1285. <!-- -->
  1286. naive
  1287. Experienced
  1288. <!-- age -->
  1289. late childhood
  1290. precocious
  1291. <!-- -->
  1292. sensor
  1293. Storage
  1294. Well
  1295. Feel
  1296. Knowledge
  1297. Well
  1298. future
  1299. past
  1300. Evil
  1301. deliberately
  1302. careless
  1303. <!-- Evil -->
  1304. deliberately
  1305. unconsciously
  1306. <!-- -->
  1307. Tasters
  1308. Student
  1309. <!--
  1310. -
  1311. practitioner
  1312. theorist
  1313. -->
  1314. <!-- -->
  1315. curiosity
  1316. patience
  1317. <!-- -->
  1318. Demanding <!-- Critical -->
  1319. Modest
  1320. Healthy
  1321. body
  1322. Spirit (reputation, reputation)
  1323. Political compass
  1324. liberal
  1325. conservative
  1326. <!--
  1327. negligent, by the way
  1328. creative
  1329. destructive
  1330. pain
  1331. Perpetrator
  1332. Victim
  1333. -->
  1334. civilization
  1335. criminal
  1336. Civilians
  1337. principle
  1338. Lust
  1339. anxiety
  1340. <!-- -->
  1341. Dispute
  1342. Harmony addiction
  1343. humor
  1344. warm
  1345. cold
  1346. Cutout
  1347. Round neck
  1348. V-neck
  1349. Scalp hair
  1350. fine
  1351. strong
  1352. <!-- head hair -->
  1353. short
  1354. long
  1355. <!--
  1356. Talk
  1357. Channel
  1358. Catcher
  1359. Communication
  1360. Speaker
  1361. Listener
  1362. Communication
  1363. teller
  1364. poet
  1365. Communication
  1366. long sentences
  1367. short sentences
  1368. Communication
  1369. Speaker
  1370. Scribe (pointer)
  1371. job
  1372. Nanny
  1373. Caregiver
  1374. feeling
  1375. Optimist
  1376. pessimist
  1377. Relaxed
  1378. manic
  1379. depressive
  1380. people
  1381. Goyim
  1382. Jews
  1383. -->
  1384. `,
  1385. move: `
  1386. Inner gender
  1387. Male
  1388. Female
  1389. numbers
  1390. 14th
  1391. 23
  1392. Motor skills
  1393. Fine
  1394. Rough
  1395. Hans Eysenck
  1396. Psychotic
  1397. Neurotic
  1398. <!-- Hans Eysenck -->
  1399. P
  1400. N
  1401. Psychostress tolerance
  1402. High
  1403. Low
  1404. <!-- -->
  1405. strategist
  1406. Politician
  1407. <!-- -->
  1408. domestic ("dominant")
  1409. public
  1410. <!-- -->
  1411. Back office
  1412. External sales
  1413. <!-- -->
  1414. Houseworkers
  1415. Field workers
  1416. Own color
  1417. purple
  1418. Lime
  1419. <!-- own color on the body -->
  1420. Acorn
  1421. mucus
  1422. <!-- -->
  1423. Red Blue
  1424. Green yellow
  1425. <!-- -->
  1426. loner
  1427. Journeyman
  1428. <!-- -->
  1429. the master
  1430. society
  1431. <!-- -->
  1432. the underground
  1433. the surface
  1434. <!-- -->
  1435. the background
  1436. the public
  1437. <!-- -->
  1438. the household
  1439. the world outside
  1440. Alone
  1441. fighter
  1442. Plaintiff
  1443. <!-- -->
  1444. minority
  1445. majority
  1446. ass
  1447. small
  1448. large
  1449. Finger nail bed <!-- TODO size or length? -->
  1450. Large <!-- Long -->
  1451. Small <!-- Short -->
  1452. Leg hair
  1453. strong
  1454. fine
  1455. Political compass
  1456. authoritarian
  1457. democratically
  1458. <!-- -->
  1459. Daydreamer
  1460. Night dreamer
  1461. <!--
  1462. Big Five - Neuroticism
  1463. Low
  1464. High
  1465. -->
  1466. work
  1467. mental
  1468. physical
  1469. `,
  1470. // sensexmove aka flowsquare, class, diagonal, angle, half
  1471. sensexmove: `
  1472. Big Five - compatibility (Agreeableness)
  1473. Low
  1474. High
  1475. elements
  1476. Fire + earth
  1477. Air + water
  1478. numbers
  1479. 12th
  1480. 34
  1481. Inside
  1482. Son + mother
  1483. Daughter + father
  1484. <!-- -->
  1485. classic
  1486. Romantics
  1487. Spencer Stuart CAF
  1488. Results Culture
  1489. Caring culture
  1490. <!--
  1491. Leadership (see Big Five Agreeableness)
  1492. Transformational (soft power)
  1493. Transactional
  1494. -->
  1495. Culture
  1496. Primitive
  1497. High
  1498. <!-- -->
  1499. Egoists
  1500. Altruists
  1501. Labor sector
  1502. Primary
  1503. service
  1504. <!-- Political (N) -->
  1505. Politically Conservative (2)
  1506. Politically Liberal (3)
  1507. <!-- Strategic (P) -->
  1508. Strategic Liberal (1)
  1509. Strategic Conservative (4)
  1510. <!-- -->
  1511. antisocial
  1512. social
  1513. Culture
  1514. Sedentary people
  1515. Nomads
  1516. humor
  1517. Dry
  1518. Wet
  1519. <!-- -->
  1520. Narcissus (1st grandiose + 2nd vulnerable)
  1521. echo
  1522. <!-- -->
  1523. Individualists
  1524. Collectivists
  1525. <!-- applies more to motor skills: male / female
  1526. Strong
  1527. alone
  1528. in groups
  1529. -->
  1530. <!--? -->
  1531. Sociologist
  1532. Psychologists
  1533. <!-- soz / psych -->
  1534. Society is to blame
  1535. A scapegoat is to blame
  1536. <!-- -->
  1537. competition
  1538. cooperation
  1539. <!-- -->
  1540. Performance principle (well done)
  1541. Ethics (well meant)
  1542. <!-- -->
  1543. Individual sport
  1544. Team sport
  1545. Motor skills times sensor skills: there are male elements
  1546. childish (1)
  1547. mature (4)
  1548. <!-- motor skills times sensory skills --> are female elements
  1549. mature (2)
  1550. childish (3)
  1551. <!-- -->
  1552. Lone fighter
  1553. Cooperator
  1554. <!-- -->
  1555. Realists
  1556. Idealists
  1557. Matrix (strategy)
  1558. Red pill (bitter truth)
  1559. Blue pill (beautiful lie)
  1560. <!-- -->
  1561. loner
  1562. Fellow travelers
  1563. Assertions <!-- theses -->
  1564. testable
  1565. endless
  1566. science
  1567. Hard
  1568. Soft
  1569. <!-- -->
  1570. Nature-
  1571. Spiritual <div class="suffix">science</div>
  1572. William Sheldon
  1573. MesoMorph
  1574. ExtraMorph (Endo + Ecto)
  1575. <!-- -->
  1576. Protestants (earthly happiness)
  1577. Catholics (wages after death)
  1578. <!--
  1579. Are psychotics
  1580. extroverted (1)
  1581. introverted (4)
  1582. Are neurotics
  1583. introverted (2)
  1584. extroverted (3)
  1585. -->
  1586. `,
  1587. modalities: `
  1588. modality
  1589. cardinal
  1590. Changeable
  1591. Firmly
  1592. Inner age
  1593. young
  1594. medium
  1595. old
  1596. Hans Eysenck
  1597. extroverted
  1598. ambiverted
  1599. introverted
  1600. Sigmund Freud
  1601. It
  1602. I
  1603. About me
  1604. <!-- Sigmund Freud -->
  1605. Drive
  1606. Intermediary
  1607. moral
  1608. Islam Nafs
  1609. al-'ammārah
  1610. al-lawwāmah
  1611. al-mutma'innah
  1612. <!-- Islam Nafs -->
  1613. Drive
  1614. doubt
  1615. Quiet
  1616. Christian Trinity
  1617. body
  1618. soul
  1619. ghost
  1620. `,
  1621. bal: {
  1622. title: `
  1623. My balance: who do I know? (Example) <br/>
  1624. Dealer: Milan Hauth, Jägerstr. 10, Trostberg
  1625. `,
  1626. f1: ["Lena 3", "Caro 30"],
  1627. f2: ["Laura 30", "Ramo 40"],
  1628. f3: ["Ameli 5", "Vroni 12"],
  1629. f4: ["Conny 30"],
  1630. m1: ["Mila 30", "Chris 30"],
  1631. m2: ["Franz 30"],
  1632. m3: ["Fabi 12", "Tom 30"],
  1633. m4: ["Markus 30"],
  1634. },
  1635. caption: {
  1636. double_pallas: `Key of the 10 friends
  1637. <br/> 4 parents (BD) <br/> 2 equals (FM) <br/> 4 children (AC)
  1638. `,
  1639. eight_double_pallas: `Eight keys`,
  1640. map_6x6: 'Large map of 16 keys',
  1641. exchange: 'Partner exchange in the Flow Square',
  1642. pallas: 'Key of the <br/> 6 friends <br/> (Pallas symbol)',
  1643. compass: 'Compass: 4 elements <br/> and 3 modalities',
  1644. map: 'Map of the 16 types',
  1645. four_bodies: `
  1646. <span style="margin-left:1.0em">Fire</span>
  1647. <span style="margin-left:2.1em">Earth</span>
  1648. <span style="margin-left:2.5em">Air</span>
  1649. <span style="margin-left:1.9em">Water</span>
  1650. `,
  1651. three_hands: 'Finger test shows Sheldon-type',
  1652. sense: "Sense",
  1653. move: "Move",
  1654. modality: "Threefold Sense",
  1655. flowsquare: `
  1656. <nw><b>Flow Square</b> = Square &square; on the map</nw>
  1657. `,
  1658. },
  1659. };
  1660. /* old stuff
  1661. // format body* and element*
  1662. text = Object.keys(text).reduce((acc, key) => {
  1663. //const t = text[key];
  1664. //if (!(key.startsWith("body") || key.startsWith("element"))) {
  1665. if (!key.match(/(body[ABCD]|element[1234])/)) {
  1666. acc[key] = text[key];
  1667. return acc;
  1668. }
  1669. const [a, b, cd] = text[key].split(" : ");
  1670. const [c, d] = cd.split(" + ");
  1671. //acc[key] = `<div>${a}</div><div>${b}</div><div>${c}<br/>${d}</div>`;
  1672. acc[key] = `<div>${a}</div><div>${b}</div><div>${c} + ${d}</div>`;
  1673. return acc;
  1674. }, {});
  1675. */
  1676. // helper function
  1677. Array.prototype.contains = function(needle) {
  1678. return this.indexOf(needle) !== -1
  1679. };
  1680. const color = {
  1681. "map": {
  1682. 1: "#a80000", // dark red
  1683. 2: "#58ff58", // light green
  1684. 3: "#ffff58", // light yellow
  1685. 4: "#0000a8", // dark blue
  1686. },
  1687. "light": {
  1688. 1: "#ffc0c0", // light red
  1689. 2: "#c0ffc0", // light green
  1690. 3: "#ffff80", // light yellow
  1691. 4: "#c0c0ff", // light blue
  1692. 13: "#ffdfc0", // light orange
  1693. 24: "#c0ffff", // light turc
  1694. 14: "#ffc0ff", // light purple
  1695. 23: "#dfffc0", // light lime
  1696. },
  1697. "dark": {
  1698. 1: "#800000", // dark red
  1699. 2: "#008000", // dark green
  1700. 3: "#808000", // dark yellow
  1701. 4: "#000080", // dark blue
  1702. },
  1703. "medium": {
  1704. 1: "#ff0000", // red
  1705. 2: "#00ff00", // green
  1706. 3: "#ffff00", // yellow
  1707. 4: "#0000ff", // blue
  1708. // deviations from "exact" values come from print color matching
  1709. // printer = canon G5000
  1710. //13: "#ff8000", // orange 30deg
  1711. 13: "#ff9100", // orange 34deg
  1712. //24: "#00ffff", // turc 180deg
  1713. 24: "#00ffee", // turc 176deg
  1714. //14: "#ff00ff", // purple 300deg
  1715. 14: "#ea00ff", // purple 295deg
  1716. //23: "#80ff00", // lime 90deg
  1717. 23: "#aaff00", // lime 80deg
  1718. },
  1719. };
  1720. color.map = color.medium;
  1721. color.map.A = color.map[1];
  1722. color.map.B = color.map[2];
  1723. color.map.C = color.map[3];
  1724. color.map.D = color.map[4];
  1725. // old
  1726. const opposite = {
  1727. 1: 2,
  1728. 2: 1,
  1729. 3: 4,
  1730. 4: 3,
  1731. "A": "B",
  1732. "B": "A",
  1733. "C": "D",
  1734. "D": "C",
  1735. };
  1736. // escape hex color for svg inline data url
  1737. function sesc(s) {
  1738. return s.replace("#", "%23");
  1739. }
  1740. function cssVarsOfColorMap(mapname){
  1741. const mapval = color[mapname];
  1742. return Object.keys(mapval).reduce((acc, key) => {
  1743. return acc + "--" + mapname + key + ": " + mapval[key] + ";\n";
  1744. }, "");
  1745. }
  1746. // dashed border
  1747. const dash_length = 6;
  1748. document.write(`
  1749. <style type="text/css">
  1750. /* set css variables */
  1751. :root {
  1752. ${cssVarsOfColorMap("light")}
  1753. ${cssVarsOfColorMap("dark")}
  1754. ${cssVarsOfColorMap("medium")}
  1755. }
  1756. /* debug on screen, hide for print */
  1757. @media screen {
  1758. div.page {
  1759. outline: solid 1px black;
  1760. }
  1761. }
  1762. /* print settings */
  1763. @page {
  1764. size: A4 portrait;
  1765. margin: 0;
  1766. }
  1767. /*
  1768. hidden margins are a pain .... !
  1769. child-margins affect margins of parent ??
  1770. blame margin-collapsing
  1771. solve with - overflow: auto
  1772. https://stackoverflow.com/questions/1762539/margin-on-child-element-moves-parent-element
  1773. */
  1774. * {
  1775. margin: 0;
  1776. padding: 0;
  1777. }
  1778. /*
  1779. always hide script source
  1780. <script style="display: none">
  1781. https://stackoverflow.com/questions/21440225
  1782. the-javascript-code-is-visible-on-the-browser
  1783. */
  1784. script {
  1785. display: none !important;
  1786. }
  1787. body {
  1788. font-family: sans-serif;
  1789. font-size: ${font_size}mm;
  1790. /* TODO use points? like 10pt
  1791. for better print quality? */
  1792. line-height: 125%; /* default 121% in firefox */
  1793. }
  1794. div.page1 {
  1795. }
  1796. div.page2 {
  1797. font-size: ${font_size_page2}mm;
  1798. }
  1799. div.page {
  1800. page-break-after: always; /* TODO remove? */
  1801. width: ${page_x}mm;
  1802. height: ${page_y}mm;
  1803. /*outline: solid 1px blue;*/
  1804. overflow: auto; /* disable css margin collapsing */
  1805. }
  1806. div.content {
  1807. /*outline: solid 1pt black; /* outline vs border: outline does not add height/width */
  1808. width: ${content_x}mm;
  1809. height: ${content_y}mm;
  1810. /*
  1811. position: relative;
  1812. left: ${page_margin.left}mm;
  1813. top: ${page_margin.top}mm;
  1814. */
  1815. margin-left: ${page_margin.left}mm;
  1816. margin-top: ${page_margin.top}mm;
  1817. display: flex;
  1818. flex-direction: column; /* content / footer */
  1819. justify-content: space-between;
  1820. }
  1821. div.inner_content {
  1822. height: ${content_y - footer_y}mm;
  1823. overflow: hidden; /* auto = scroll on demand */
  1824. }
  1825. html {
  1826. background: white;
  1827. }
  1828. p#h1 {
  1829. margin-bottom: .5em;
  1830. }
  1831. /* TODO why start at N=2 ? */
  1832. /*
  1833. .table-four > div:nth-child(2) { background: var(--light1) }
  1834. .table-four > div:nth-child(3) { background: var(--light2) }
  1835. .table-four > div:nth-child(4) { background: var(--light3) }
  1836. .table-four > div:nth-child(5) { background: var(--light4) }
  1837. */
  1838. .table-four > div {
  1839. /*border: solid 1pt black;*/
  1840. }
  1841. .table-four > div:nth-child(1) { box-shadow: inset 0 0 0 1pt var(--medium1) }
  1842. .table-four > div:nth-child(2) { box-shadow: inset 0 0 0 1pt var(--medium2) }
  1843. .table-four > div:nth-child(3) { box-shadow: inset 0 0 0 1pt var(--medium3) }
  1844. .table-four > div:nth-child(4) { box-shadow: inset 0 0 0 1pt var(--medium4) }
  1845. div#map-and-tables {
  1846. /* border: solid 1pt red; /* DEBUG */
  1847. margin-bottom: .5em;
  1848. /*
  1849. height: ${content_x/3}mm;
  1850. */
  1851. width: ${content_x}mm;
  1852. display: flex;
  1853. /*
  1854. flex-direction: row;
  1855. flex-wrap: nowrap;
  1856. align-items: baseline;
  1857. */
  1858. align-items: flex-start;
  1859. /*
  1860. align-items: center;
  1861. justify-content: center;
  1862. */
  1863. }
  1864. div#table-bodies,
  1865. div#table-elements {
  1866. width: ${content_x/8*3 - 2*table_margin}mm;
  1867. line-height: 120%;
  1868. overflow: hidden;
  1869. margin: 0 ${table_margin}mm;
  1870. /* border: solid 1pt green; /* DEBUG */
  1871. }
  1872. /*
  1873. div#table-bodies {
  1874. margin-right: ${table_margin}mm;
  1875. }
  1876. div#table-elements {
  1877. margin-left: ${table_margin}mm;
  1878. }
  1879. */
  1880. svg.map {
  1881. /* border: solid 1pt blue; /* DEBUG */
  1882. }
  1883. div.table-four > div {
  1884. display: flex;
  1885. align-items: center;
  1886. justify-content: center;
  1887. }
  1888. div#table-bodies > div {
  1889. flex-direction: row-reverse; /* right to left */
  1890. text-align: right;
  1891. padding-right: 4mm;
  1892. }
  1893. div#table-elements > div {
  1894. padding-left: 4mm;
  1895. flex-direction: row; /* left to right */
  1896. }
  1897. div.table-four > div {
  1898. /*
  1899. height: ${content_x/16}mm;
  1900. TODO:
  1901. height: ${map_w / scale_svg_html}mm;
  1902. margin: ${2*map_a / scale_svg_html}mm 0;
  1903. */
  1904. /* TODO better .... */
  1905. height: 9.4mm;
  1906. margin: 2.65mm 0;
  1907. }
  1908. .table-four {
  1909. margin-top: -0.5mm !important;
  1910. }
  1911. div.table-four > div > div {
  1912. display: inline-block;
  1913. vertical-align: middle;
  1914. }
  1915. #table-bodies > * > *:nth-child(1) { width: 7% }
  1916. #table-bodies > * > *:nth-child(2) { width: 23% }
  1917. #table-bodies > * > *:nth-child(3) { width: 70% }
  1918. #table-elements > * > *:nth-child(1) { width: 7% }
  1919. #table-elements > * > *:nth-child(2) { width: 23% }
  1920. #table-elements > * > *:nth-child(3) { width: 70% }
  1921. #table-elements-two {
  1922. display: flex;
  1923. flex-direction: column;
  1924. width: ${content_x}mm;
  1925. align-items: stretch;
  1926. }
  1927. #table-elements-two > * {
  1928. display: flex;
  1929. }
  1930. #table-elements-two > * > * {
  1931. display: block;
  1932. width: 20%;
  1933. padding: 0 1mm;
  1934. border-bottom: solid 1pt black;
  1935. /* TODO smaller border in firefox print */
  1936. }
  1937. #table-elements-two > *:first-child > * {
  1938. border-top: solid 1pt black;
  1939. }
  1940. #table-elements-two > * > *:nth-child(2) { border-color: var(--medium1) }
  1941. #table-elements-two > * > *:nth-child(3) { border-color: var(--medium2) }
  1942. #table-elements-two > * > *:nth-child(4) { border-color: var(--medium3) }
  1943. #table-elements-two > * > *:nth-child(5) { border-color: var(--medium4) }
  1944. #table-properties {
  1945. display: flex;
  1946. flex-direction: column;
  1947. width: ${content_x}mm;
  1948. align-items: stretch;
  1949. }
  1950. #table-properties > * {
  1951. display: flex;
  1952. }
  1953. #table-properties > * > * {
  1954. display: block;
  1955. width: 20%;
  1956. padding: 0 1mm;
  1957. }
  1958. /*
  1959. con: mix colors are hard to read
  1960. #table-properties > * > *:nth-child(2) { background: var(--light13) }
  1961. #table-properties > * > *:nth-child(3) { background: var(--light24) }
  1962. #table-properties > * > *:nth-child(4) { background: var(--light14) }
  1963. #table-properties > * > *:nth-child(5) { background: var(--light23) }
  1964. */
  1965. #table-properties > * > * {
  1966. border-bottom: solid 1pt black;
  1967. }
  1968. #table-properties > *:first-child > * {
  1969. border-top: solid 1pt black;
  1970. }
  1971. #table-properties > * > *:nth-child(2) { border-color: var(--medium13) }
  1972. #table-properties > * > *:nth-child(3) { border-color: var(--medium24) }
  1973. #table-properties > * > *:nth-child(4) { border-color: var(--medium14) }
  1974. #table-properties > * > *:nth-child(5) { border-color: var(--medium23) }
  1975. /*
  1976. .two-column {
  1977. column-count: 2;
  1978. column-gap: 4mm;
  1979. column-rule: solid 1pt black;
  1980. }
  1981. .three-column {
  1982. column-count: 3;
  1983. column-gap: 4mm;
  1984. }
  1985. */
  1986. .table-inline {
  1987. /*
  1988. column-count: 2;
  1989. column-gap: 4mm;
  1990. column-rule: solid 1pt black;
  1991. */
  1992. }
  1993. .table-inline > div {
  1994. white-space: nowrap;
  1995. }
  1996. #table-inline-elements,
  1997. #table-inline-elements > *,
  1998. #table-inline-elements > * > * {
  1999. display: inline;
  2000. }
  2001. #table-inline-elements > * > * {
  2002. text-decoration: underline;
  2003. text-decoration-color: transparent;
  2004. text-decoration-thickness: 1pt;
  2005. }
  2006. #table-inline-elements > * > *:nth-child(2) { text-decoration-color: var(--medium1) }
  2007. #table-inline-elements > * > *:nth-child(3) { text-decoration-color: var(--medium2) }
  2008. #table-inline-elements > * > *:nth-child(4) { text-decoration-color: var(--medium3) }
  2009. #table-inline-elements > * > *:nth-child(5) { text-decoration-color: var(--medium4) }
  2010. #table-inline-bodies,
  2011. #table-inline-bodies > *,
  2012. #table-inline-bodies > * > * {
  2013. display: inline;
  2014. }
  2015. #table-inline-bodies > * > * {
  2016. text-decoration: underline;
  2017. text-decoration-color: transparent;
  2018. text-decoration-thickness: 1pt;
  2019. }
  2020. #table-inline-bodies > * > *:nth-child(2) { text-decoration-color: var(--medium1) }
  2021. #table-inline-bodies > * > *:nth-child(3) { text-decoration-color: var(--medium2) }
  2022. #table-inline-bodies > * > *:nth-child(4) { text-decoration-color: var(--medium3) }
  2023. #table-inline-bodies > * > *:nth-child(5) { text-decoration-color: var(--medium4) }
  2024. #table-inline-properties {
  2025. }
  2026. #table-inline-properties > * {
  2027. display: inline;
  2028. }
  2029. #table-inline-properties > * > * {
  2030. display: inline;
  2031. }
  2032. #table-inline-properties > * > * {
  2033. text-decoration: underline;
  2034. text-decoration-color: transparent;
  2035. text-decoration-thickness: 1pt;
  2036. }
  2037. #table-inline-properties > * > *:nth-child(2) { text-decoration-color: var(--medium13) }
  2038. #table-inline-properties > * > *:nth-child(3) { text-decoration-color: var(--medium24) }
  2039. #table-inline-properties > * > *:nth-child(4) { text-decoration-color: var(--medium14) }
  2040. #table-inline-properties > * > *:nth-child(5) { text-decoration-color: var(--medium23) }
  2041. #table-inline-sense,
  2042. #table-inline-sense > *,
  2043. #table-inline-sense > * > * {
  2044. display: inline;
  2045. }
  2046. #table-inline-sense > * > * {
  2047. text-decoration: underline;
  2048. text-decoration-color: transparent;
  2049. text-decoration-thickness: 1pt;
  2050. }
  2051. #table-inline-sense > * > *:nth-child(2) { text-decoration-color: var(--medium13) }
  2052. #table-inline-sense > * > *:nth-child(3) { text-decoration-color: var(--medium24) }
  2053. #table-inline-move,
  2054. #table-inline-move > *,
  2055. #table-inline-move > * > * {
  2056. display: inline;
  2057. }
  2058. #table-inline-move > * > * {
  2059. text-decoration: underline;
  2060. text-decoration-color: transparent;
  2061. text-decoration-thickness: 1pt;
  2062. }
  2063. #table-inline-move > * > *:nth-child(2) { text-decoration-color: var(--medium14) }
  2064. #table-inline-move > * > *:nth-child(3) { text-decoration-color: var(--medium23) }
  2065. #table-inline-sensexmove,
  2066. #table-inline-sensexmove > *,
  2067. #table-inline-sensexmove > * > * {
  2068. display: inline;
  2069. }
  2070. #table-inline-sensexmove > * > * {
  2071. text-decoration: underline;
  2072. text-decoration-color: transparent;
  2073. text-decoration-thickness: 1pt;
  2074. }
  2075. /*
  2076. realism = red pill = republican party
  2077. idealism = blue pill = democratic party
  2078. */
  2079. /* color variant N - eigencolor of neurotic */
  2080. /*
  2081. #table-inline-sensexmove > * > *:nth-child(2) { text-decoration-color: var(--medium2) }
  2082. #table-inline-sensexmove > * > *:nth-child(3) { text-decoration-color: var(--medium3) }
  2083. */
  2084. /* color variant P - eigencolor of psychotic */
  2085. #table-inline-sensexmove > * > *:nth-child(2) { text-decoration-color: var(--medium1) }
  2086. #table-inline-sensexmove > * > *:nth-child(3) { text-decoration-color: var(--medium4) }
  2087. #table-inline-modalities,
  2088. #table-inline-modalities > *,
  2089. #table-inline-modalities > * > * {
  2090. display: inline;
  2091. }
  2092. #table-inline-modalities > * > * {
  2093. text-decoration: underline;
  2094. text-decoration-color: transparent;
  2095. text-decoration-thickness: 1pt;
  2096. }
  2097. /*
  2098. three primary colors?
  2099. - red green blue ("additive")
  2100. - cyan magenta yellow = blue-green blue-red yellow
  2101. - red yellow blue ("subtractive")
  2102. */
  2103. /* variant: sense colors + neutral color black */
  2104. #table-inline-modalities > * > *:nth-child(2) { text-decoration-color: var(--medium13) }
  2105. #table-inline-modalities > * > *:nth-child(3) { text-decoration-color: black }
  2106. #table-inline-modalities > * > *:nth-child(4) { text-decoration-color: var(--medium24) }
  2107. .para-margin-bottom {
  2108. margin-bottom: .5em;
  2109. display: inline;
  2110. margin-right: 2em;
  2111. }
  2112. .para-page-footer {
  2113. width: ${content_x}mm;
  2114. font-family: monospace;
  2115. display: flex;
  2116. justify-content: space-between;
  2117. }
  2118. p, .para {
  2119. display: inline;
  2120. margin-right: 2em;
  2121. }
  2122. svg {
  2123. float: right;
  2124. clear: right; /* stack vertical */
  2125. }
  2126. svg.map {
  2127. /*
  2128. margin: 1em;
  2129. */
  2130. }
  2131. span.a1,
  2132. span.b2,
  2133. span.c3,
  2134. span.d4 {
  2135. text-decoration: underline;
  2136. text-decoration-color: transparent;
  2137. text-decoration-thickness: 1pt;
  2138. }
  2139. span.a1 { text-decoration-color: var(--medium1) }
  2140. span.b2 { text-decoration-color: var(--medium2) }
  2141. span.c3 { text-decoration-color: var(--medium3) }
  2142. span.d4 { text-decoration-color: var(--medium4) }
  2143. .balance {
  2144. display: inline-flex;
  2145. /*
  2146. float: right;
  2147. margin: 1em 0 1em 1em;
  2148. */
  2149. flex-direction: column;
  2150. width: 23em; /* TODO */
  2151. }
  2152. .balance > .title {
  2153. margin-bottom: .5em;
  2154. }
  2155. .balance > .f, .balance > .m {
  2156. display: flex;
  2157. flex-direction: row;
  2158. }
  2159. .balance > .f {
  2160. padding-bottom: .25em;
  2161. border-bottom: solid 1px black;
  2162. /* TODO smaller border in firefox print */
  2163. }
  2164. .balance > .m {
  2165. padding-top: .25em;
  2166. }
  2167. .balance > div > div {
  2168. display: flex;
  2169. flex-basis: 25%;
  2170. }
  2171. .balance > .f > div {
  2172. flex-direction: column-reverse;
  2173. }
  2174. .balance > .m > div {
  2175. flex-direction: column;
  2176. }
  2177. .balance > div > div > div {
  2178. text-align: center;
  2179. }
  2180. .balance > .f > div > .h2 {
  2181. margin-top: .25em;
  2182. }
  2183. .balance > .m > div > .h2 {
  2184. margin-bottom: .25em;
  2185. }
  2186. /* workaround. print borders are too thick */
  2187. @media print {
  2188. * {
  2189. /* no effect in firefox, but working in chrome */
  2190. border-width: 0.5pt !important;
  2191. }
  2192. }
  2193. .caption-container.four_bodies > div:nth-child(2) {
  2194. display: flex;
  2195. justify-content: center;
  2196. }
  2197. .caption-container {
  2198. display: inline-flex;
  2199. flex-direction: column;
  2200. width: auto;
  2201. margin: 0.5em 0;
  2202. }
  2203. .caption-container > div {
  2204. display: inline-block;
  2205. text-align: center;
  2206. }
  2207. /*
  2208. https://stackoverflow.com/a/19735997/10440128
  2209. for vertical-stacked floats, use style="float: right; clear: right"
  2210. */
  2211. .float-right {
  2212. float: right;
  2213. clear: right; /* stack vertical */
  2214. margin-left: 1em;
  2215. }
  2216. .float-left {
  2217. float: left;
  2218. clear: left; /* stack vertical */
  2219. margin-right: 1em;
  2220. }
  2221. #div_four_bodies > svg {
  2222. width: 175px;
  2223. height: auto;
  2224. }
  2225. #div_three_hands > svg {
  2226. width: 160px;
  2227. height: auto;
  2228. }
  2229. a {
  2230. text-decoration: none;
  2231. color: black;
  2232. }
  2233. /* not working, solve in javascript
  2234. .suffix {
  2235. text-decoration: none !important;
  2236. }
  2237. */
  2238. /* square sign */
  2239. .square-sign {
  2240. position:relative;
  2241. top:-0.5px;
  2242. }
  2243. /* cross sign */
  2244. .xmark-sign {
  2245. font-size: 125%;
  2246. position:relative;
  2247. top:0.5px;
  2248. }
  2249. .nowrap-element, b {
  2250. white-space: nowrap;
  2251. }
  2252. .double-pallas-small-container > svg {
  2253. border-bottom: solid 1px black;
  2254. /* TODO smaller border in firefox print */
  2255. }
  2256. .double-pallas-small-container > svg:last-child {
  2257. border-bottom: none;
  2258. }
  2259. </style>
  2260. `)
  2261. /* css dashed border with two colors */
  2262. /*
  2263. #table-properties > * > *:nth-child(2) {
  2264. /* red + yellow * /
  2265. border-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" x="0px" y="0px" width="30px" height="30px"><g stroke-width="4" fill="none"><rect stroke="${sesc(color.medium[1])}" x="0" y="0" width="24" height="24" /><path stroke="${sesc(color.medium[3])}" stroke-dasharray="${dash_length}" d="M 0 0 H 24 M 24 2 V 24 M 20 24 H 0 M 0 18 V 2" /></g></svg>') 1 repeat;
  2266. }
  2267. #table-properties > * > *:nth-child(3) {
  2268. /* green + blue * /
  2269. border-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" x="0px" y="0px" width="30px" height="30px"><g stroke-width="4" fill="none"><rect stroke="${sesc(color.medium[2])}" x="0" y="0" width="24" height="24" /><path stroke="${sesc(color.medium[4])}" stroke-dasharray="${dash_length}" d="M 0 0 H 24 M 24 2 V 24 M 20 24 H 0 M 0 18 V 2" /></g></svg>') 1 repeat;
  2270. }
  2271. #table-properties > * > *:nth-child(4) {
  2272. /* red + blue * /
  2273. border-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" x="0px" y="0px" width="30px" height="30px"><g stroke-width="4" fill="none"><rect stroke="${sesc(color.medium[1])}" x="0" y="0" width="24" height="24" /><path stroke="${sesc(color.medium[4])}" stroke-dasharray="${dash_length}" d="M 0 0 H 24 M 24 2 V 24 M 20 24 H 0 M 0 18 V 2" /></g></svg>') 1 repeat;
  2274. }
  2275. #table-properties > * > *:nth-child(5) {
  2276. /* green + yellow * /
  2277. border-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" x="0px" y="0px" width="30px" height="30px"><g stroke-width="4" fill="none"><rect stroke="${sesc(color.medium[2])}" x="0" y="0" width="24" height="24" /><path stroke="${sesc(color.medium[3])}" stroke-dasharray="${dash_length}" d="M 0 0 H 24 M 24 2 V 24 M 20 24 H 0 M 0 18 V 2" /></g></svg>') 1 repeat;
  2278. }
  2279. */
  2280. /* css background images
  2281. #table-properties > * > *:nth-child(2) {
  2282. background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${bgpat_w} ${bgpat_w}" x="0" y="0" width="${bgpat_w}mm" height="${bgpat_w}mm"><rect fill="${sesc(color.light[1])}" x="0" y="0" width="${bgpat_w}" height="100" /><rect fill="${sesc(color.light[3])}" x="${bgpat_w/2}" y="0" width="${bgpat_w/2}" height="100" /></svg>');
  2283. }
  2284. #table-properties > * > *:nth-child(3) {
  2285. background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${bgpat_w} ${bgpat_w}" x="0" y="0" width="${bgpat_w}mm" height="${bgpat_w}mm"><rect fill="${sesc(color.light[2])}" x="0" y="0" width="${bgpat_w}" height="100" /><rect fill="${sesc(color.light[4])}" x="${bgpat_w/2}" y="0" width="${bgpat_w/2}" height="100" /></svg>');
  2286. }
  2287. #table-properties > * > *:nth-child(4) {
  2288. background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${bgpat_w} ${bgpat_w}" x="0" y="0" width="${bgpat_w}mm" height="${bgpat_w}mm"><rect fill="${sesc(color.light[1])}" x="0" y="0" width="${bgpat_w}" height="100" /><rect fill="${sesc(color.light[4])}" x="${bgpat_w/2}" y="0" width="${bgpat_w/2}" height="100" /></svg>');
  2289. }
  2290. #table-properties > * > *:nth-child(5) {
  2291. background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${bgpat_w} ${bgpat_w}" x="0" y="0" width="${bgpat_w}mm" height="${bgpat_w}mm"><rect fill="${sesc(color.light[2])}" x="0" y="0" width="${bgpat_w}" height="100" /><rect fill="${sesc(color.light[3])}" x="${bgpat_w/2}" y="0" width="${bgpat_w/2}" height="100" /></svg>');
  2292. }
  2293. */
  2294. </script>
  2295. <style type="text/css">
  2296. </style>
  2297. <script>
  2298. function write_para(id, _class="para-margin-bottom") {
  2299. if (_class) {
  2300. document.write(`<div id="${id}" class="${_class}">${text[id]}</div>`)
  2301. }
  2302. else {
  2303. document.write(`<div id="${id}">${text[id]}</div>`)
  2304. }
  2305. }
  2306. function write_caption(id) {
  2307. document.write(text.caption[id]);
  2308. }
  2309. // alchi.js
  2310. // age sense move gender, origin 11
  2311. // signs: 0 = same, 1 = diff
  2312. // these factors are XOR-ed with the origin asmg
  2313. const ac_bits_asmg_11 = [
  2314. 0b1001, 0b0111, 0b1011, 0b0101,
  2315. 0b1110, 0b0000, 0b1100, 0b0010,
  2316. 0b1101, 0b0011, 0b1111, 0b0001,
  2317. 0b1010, 0b0100, 0b1000, 0b0110,
  2318. ];
  2319. // XOR factors for "key of 10 friends" aka "double pallas"
  2320. // five bits! XOR only last three bits!
  2321. //
  2322. // typeList index vs position in double-pallas
  2323. //
  2324. // 0 1 2 3 // parents
  2325. // 4 5 6 // same age
  2326. // 7 8 9 A // kids
  2327. const ac_bits_aasmg_double_pallas = [
  2328. 0b01001, 0b01110, 0b01100, 0b01111, // D3 B4 B2 D4
  2329. 0b10111, 0b10000, 0b10011, // M4 F3 M1
  2330. 0b00001, 0b00110, 0b00100, 0b00111, // A3 C4 C2 A4
  2331. ];
  2332. /*
  2333. // young age: aa = 00
  2334. const C3 = 0b0000, A3 = 0b0001, C1 = 0b0010, A1 = 0b0011;
  2335. const C2 = 0b0100, A2 = 0b0101, C4 = 0b0110, A4 = 0b0111;
  2336. // old age: aa = 01
  2337. const B3 = 0b1000, D3 = 0b1001, B1 = 0b1010, D1 = 0b1011;
  2338. const B2 = 0b1100, D2 = 0b1101, B4 = 0b1110, D4 = 0b1111;
  2339. // no age: aa = 10 (five bits)
  2340. const F3 = 0b10000, M3 = 0b10001, F1 = 0b10010, M1 = 0b10011;
  2341. const F2 = 0b10100, M2 = 0b10101, F4 = 0b10110, M4 = 0b10111;
  2342. */
  2343. const get_bit = function (num, idx) {
  2344. return (num & (1 << idx)) >> idx;
  2345. }
  2346. const decode_bitstring = function (asmg) {
  2347. return parseInt(asmg, 2);
  2348. }
  2349. const ac_xor = function(factor, list) {
  2350. return list.map(function (n) {
  2351. return factor ^ n
  2352. })
  2353. }
  2354. // letters of the four dimensions
  2355. const letter_asmg = [
  2356. ['S', 'L'], // age = Short or Long
  2357. ['E', 'I'], // sense = Extra or Intro
  2358. ['N', 'P'], // move = Neuro or Psycho
  2359. ['F', 'M'], // gen = Female or Male
  2360. ]
  2361. // element = sense + move
  2362. const element = [
  2363. [
  2364. '3', // _00_ = EN = 3
  2365. '1', // _01_ = EP = 1
  2366. ], [
  2367. '2', // _10_ = IN = 2
  2368. '4', // _11_ = IP = 4
  2369. ],
  2370. ]
  2371. // body = age + gender
  2372. const element_outside = [
  2373. [
  2374. 'C', // 0__0 = SF = C
  2375. 'A', // 0__1 = SM = A
  2376. ], [
  2377. 'B', // 1__0 = LF = B
  2378. 'D', // 1__1 = LM = D
  2379. ],
  2380. ]
  2381. const idxFromDim = {
  2382. 'A': 0,
  2383. 'S': 1,
  2384. 'M': 2,
  2385. 'G': 3,
  2386. 'a': 0,
  2387. 's': 1,
  2388. 'm': 2,
  2389. 'g': 3,}
  2390. function getDimBit (asmg, dim) {
  2391. //global idxFromDim
  2392. return asmg[idxFromDim[dim]]
  2393. }
  2394. const letterFromASMG = function (dim, asmg) { //TODO change to (asmg, dim)
  2395. // ASMG
  2396. const i = idxFromDim[dim]
  2397. //document.write('dim '+dim+' idx '+i)
  2398. if (i !== undefined) {
  2399. return letter_asmg[i][asmg[i]]
  2400. }
  2401. // element
  2402. if (dim == 'E' || dim == 'e') {
  2403. return element[asmg[1]][asmg[2]]
  2404. }
  2405. // outside element = Body = material = family role
  2406. if (dim == 'B' || dim == 'b') {
  2407. return element_outside[asmg[0]][asmg[3]]
  2408. }
  2409. }
  2410. /*
  2411. if(Array.prototype.contains) {
  2412. console.warn("Overriding existing Array.prototype.contains. Possible causes: New API defines the method, there's a framework conflict or you've got double inclusions in your code.");
  2413. }
  2414. */
  2415. Array.prototype.contains = function(needle) {
  2416. return this.indexOf(needle) !== -1
  2417. };
  2418. // modulo function, also for negative numbers
  2419. Number.prototype.mod = function(n) {
  2420. return ((this%n)+n)%n
  2421. }
  2422. // body + element = asmg
  2423. // young age: aa = 00
  2424. const C3 = 0b0000;
  2425. const A3 = 0b0001;
  2426. const C1 = 0b0010;
  2427. const A1 = 0b0011;
  2428. const C2 = 0b0100;
  2429. const A2 = 0b0101;
  2430. const C4 = 0b0110;
  2431. const A4 = 0b0111;
  2432. // old age: aa = 01
  2433. const B3 = 0b1000;
  2434. const D3 = 0b1001;
  2435. const B1 = 0b1010;
  2436. const D1 = 0b1011;
  2437. const B2 = 0b1100;
  2438. const D2 = 0b1101;
  2439. const B4 = 0b1110;
  2440. const D4 = 0b1111;
  2441. // no age: aa = 10
  2442. const F3 = 0b10000;
  2443. const M3 = 0b10001;
  2444. const F1 = 0b10010;
  2445. const M1 = 0b10011;
  2446. const F2 = 0b10100;
  2447. const M2 = 0b10101;
  2448. const F4 = 0b10110;
  2449. const M4 = 0b10111;
  2450. function write_map(map_origin = A1) {
  2451. const w = map_w;
  2452. const h = w;
  2453. const margin = 3;
  2454. const wh = w/2;
  2455. //const a = 1.25;
  2456. const a = map_a;
  2457. //const map_margin = a;
  2458. //const sw = 2*w;
  2459. //const sh = 2*h;
  2460. const sw = w + 2*a;
  2461. const sh = h + 2*a;
  2462. const d_gap = 0.1;
  2463. const wh2 = wh + d_gap; // fill gap between rect-s
  2464. //const page_x = 210; // mm
  2465. //const page_y = 297; // mm
  2466. const stroke_width = 0.4;
  2467. const puzzle_path = {
  2468. "IL": `
  2469. M ${sw/2+d_gap} ${(sh-h)/2-a}
  2470. h ${-d_gap}
  2471. l ${-a} ${a}
  2472. h ${-(w/2-a)}
  2473. v ${h/2-a}
  2474. l ${a} ${a}
  2475. l ${-a} ${a}
  2476. v ${h/2-a}
  2477. h ${w/2-a}
  2478. l ${a} ${a}
  2479. h ${d_gap}
  2480. `,
  2481. "EL": `
  2482. M ${sw/2+d_gap} ${(sh-h)/2+a}
  2483. h ${-d_gap}
  2484. l ${-a} ${-a}
  2485. h ${-(w/2-a)}
  2486. v ${h/2-a}
  2487. l ${-a} ${a}
  2488. l ${a} ${a}
  2489. v ${h/2-a}
  2490. h ${w/2-a}
  2491. l ${a} ${-a}
  2492. h ${d_gap}
  2493. `,
  2494. "IR": `
  2495. M ${sw/2} ${(sh-h)/2-a}
  2496. l ${a} ${a}
  2497. h ${w/2-a}
  2498. v ${h/2-a}
  2499. l ${-a} ${a}
  2500. l ${a} ${a}
  2501. v ${h/2-a}
  2502. h ${-(w/2-a)}
  2503. l ${-a} ${a}
  2504. `,
  2505. "ER": `
  2506. M ${sw/2} ${(sh-h)/2+a}
  2507. l ${a} ${-a}
  2508. h ${+(w/2-a)}
  2509. v ${h/2-a}
  2510. l ${a} ${a}
  2511. l ${-a} ${a}
  2512. v ${h/2-a}
  2513. h ${-(w/2-a)}
  2514. l ${-a} ${-a}
  2515. `,
  2516. };
  2517. document.write(`<svg
  2518. class="map"
  2519. xmlns="http://www.w3.org/2000/svg"
  2520. xmlns:xlink="http://www.w3.org/1999/xlink"
  2521. x="0" y="0" width="${map_x_html*0.7}mm" height="${map_y_html*0.7}mm"
  2522. viewBox="0 0 ${map_x_svg} ${map_y_svg}"
  2523. >
  2524. `);
  2525. // svg user unit: 1 = 1mm
  2526. // style
  2527. document.write(`<g
  2528. font-size="${font_size}"
  2529. font-family="sans-serif"
  2530. dominant-baseline="hanging"
  2531. stroke-width="${stroke_width}"
  2532. >
  2533. `);
  2534. const w_alcimap = (2*a+4*w+3*margin);
  2535. // alcimap
  2536. if (1) {
  2537. document.write(`<g
  2538. transform="translate(${map_a}, ${map_a})"
  2539. dominant-baseline="mathematical" text-anchor="middle"
  2540. font-size="${font_size_map}"
  2541. >
  2542. `);
  2543. // flowsquares
  2544. const a_square = 2;
  2545. const a_cross = 2.4;
  2546. [[0,0], [0,1], [1,0], [1,1]].forEach(([x,y]) => (
  2547. document.write(`<rect
  2548. x="${-a_square/2+(1+2*x)*sw+(1+5*x)*stroke_width/2}"
  2549. y="${-a_square/2+(1+2*y)*sh+(1+5*y)*stroke_width/2}"
  2550. width="${a_square}" height="${a_square}"
  2551. stroke="black" fill="none" />`)
  2552. ));
  2553. // tenscross
  2554. /*
  2555. document.write(`<rect
  2556. x="${-a_square/2+2*sw+4*stroke_width/2}"
  2557. y="${-a_square/2+2*sh+4*stroke_width/2}"
  2558. width="${a_square}" height="${a_square}"
  2559. stroke="black" fill="none" />`);
  2560. */
  2561. document.write(`<line
  2562. x1="${-a_cross/2+2*sw+4*stroke_width/2}"
  2563. y1="${-a_cross/2+2*sh+4*stroke_width/2}"
  2564. x2="${+a_cross/2+2*sw+4*stroke_width/2}"
  2565. y2="${+a_cross/2+2*sh+4*stroke_width/2}"
  2566. stroke="black" fill="none" />`);
  2567. document.write(`<line
  2568. x2="${-a_cross/2+2*sw+4*stroke_width/2}"
  2569. y1="${-a_cross/2+2*sh+4*stroke_width/2}"
  2570. x1="${+a_cross/2+2*sw+4*stroke_width/2}"
  2571. y2="${+a_cross/2+2*sh+4*stroke_width/2}"
  2572. stroke="black" fill="none" />`);
  2573. // tenscross parts
  2574. document.write(`
  2575. <!-- half crosses -->
  2576. <path d="
  2577. M
  2578. ${2*sw+4*stroke_width/2-a_cross/2}
  2579. ${0*sh-1*stroke_width/2+a_cross/2}
  2580. l
  2581. ${a_cross/2}
  2582. ${-a_cross/2}
  2583. l
  2584. ${a_cross/2}
  2585. ${a_cross/2}
  2586. "
  2587. stroke="black" fill="none"
  2588. />
  2589. <path d="
  2590. M
  2591. ${2*sw+4*stroke_width/2-a_cross/2}
  2592. ${4*sh+9*stroke_width/2-a_cross/2}
  2593. l
  2594. ${a_cross/2}
  2595. ${a_cross/2}
  2596. l
  2597. ${a_cross/2}
  2598. ${-a_cross/2}
  2599. "
  2600. stroke="black" fill="none"
  2601. />
  2602. <path d="
  2603. M
  2604. ${4*sw+9*stroke_width/2-a_cross/2}
  2605. ${2*sh+4*stroke_width/2-a_cross/2}
  2606. l
  2607. ${a_cross/2}
  2608. ${a_cross/2}
  2609. l
  2610. ${-a_cross/2}
  2611. ${a_cross/2}
  2612. "
  2613. stroke="black" fill="none"
  2614. />
  2615. <path d="
  2616. M
  2617. ${0*sw-1*stroke_width/2+a_cross/2}
  2618. ${2*sh+4*stroke_width/2-a_cross/2}
  2619. l
  2620. ${-a_cross/2}
  2621. ${a_cross/2}
  2622. l
  2623. ${a_cross/2}
  2624. ${a_cross/2}
  2625. "
  2626. stroke="black" fill="none"
  2627. />
  2628. <!-- quarter crosses -->
  2629. <path d="
  2630. M
  2631. ${0*sw-1*stroke_width/2+a_cross/2}
  2632. ${0*sh-1*stroke_width/2+a_cross/2}
  2633. l
  2634. ${-a_cross/2}
  2635. ${-a_cross/2}
  2636. "
  2637. stroke="black" fill="none"
  2638. />
  2639. <path d="
  2640. M
  2641. ${4*sw+9*stroke_width/2-a_cross/2}
  2642. ${0*sh-1*stroke_width/2+a_cross/2}
  2643. l
  2644. ${a_cross/2}
  2645. ${-a_cross/2}
  2646. "
  2647. stroke="black" fill="none"
  2648. />
  2649. <path d="
  2650. M
  2651. ${4*sw+9*stroke_width/2-a_cross/2}
  2652. ${4*sh+9*stroke_width/2-a_cross/2}
  2653. l
  2654. ${a_cross/2}
  2655. ${a_cross/2}
  2656. "
  2657. stroke="black" fill="none"
  2658. />
  2659. <path d="
  2660. M
  2661. ${0*sw-1*stroke_width/2+a_cross/2}
  2662. ${4*sh+9*stroke_width/2-a_cross/2}
  2663. l
  2664. ${-a_cross/2}
  2665. ${a_cross/2}
  2666. "
  2667. stroke="black" fill="none"
  2668. />
  2669. `);
  2670. // puzzle pieces
  2671. // origin = A1 = 0b0011
  2672. //ac_xor(0b0011, ac_bits_asmg_11).forEach((num, idx) => {
  2673. ac_xor(map_origin, ac_bits_asmg_11).forEach((num, idx) => {
  2674. const asmg = num.toString(2).padStart(4, 0).split('');
  2675. const e = letterFromASMG('E', asmg); // element
  2676. const b = letterFromASMG('B', asmg); // body
  2677. const e_sense = (e % 2 == 0) ? "I" : "E";
  2678. const cb = color.map[b];
  2679. const ce = color.map[e];
  2680. //const cbt = color.map[opposite[b]];
  2681. //const cet = color.map[opposite[e]];
  2682. /*
  2683. const cbt = (b == "A" || b == "D") ? "white" : "black";
  2684. const cet = (e == 1 || e == 4) ? "white" : "black";
  2685. */
  2686. const cbt = "black";
  2687. const cet = "black";
  2688. const x = idx % 4;
  2689. const xp = x * (w + margin);
  2690. const xb = xp + a;
  2691. const xe = xp + a + wh;
  2692. const yp = ((idx / 4)|0) * (h + margin);
  2693. const y = yp + a;
  2694. const xbt = xb + 0.5*(wh+a);
  2695. const xet = xe + 0.5*(wh-a);
  2696. const yt = y + 0.5*h;
  2697. document.write(`<!-- ${b}${e} -->`)
  2698. /*
  2699. document.write(`<path transform="translate(${xp}, ${yp})" fill="${cb}" stroke="${cbt}" d="${puzzle_path[e_sense+"L"]}" />`)
  2700. document.write(`<path transform="translate(${xp}, ${yp})" fill="${ce}" stroke="${cet}" d="${puzzle_path[e_sense+"R"]}" />`)
  2701. */
  2702. document.write(`<path transform="translate(${xp}, ${yp})" stroke="${cb}" fill="none" d="${puzzle_path[e_sense+"L"]}" />`)
  2703. document.write(`<path transform="translate(${xp}, ${yp})" stroke="${ce}" fill="none" d="${puzzle_path[e_sense+"R"]}" />`)
  2704. document.write(`<text x="${xbt}" y="${yt}" fill="${cbt}" width="${wh}" height="${h}">${b}</text>`)
  2705. document.write(`<text x="${xet}" y="${yt}" fill="${cet}" width="${wh}" height="${h}">${e}</text>`)
  2706. });
  2707. document.write(`</g>`);
  2708. }
  2709. //document.write(`</g>`); // header
  2710. //document.write(`</g>`); // content
  2711. document.write(`</g>`); // style
  2712. document.write(`</svg>`);
  2713. }
  2714. // 6x6 map shows all pallas keys
  2715. function write_map_6x6(map_origin = A1) {
  2716. // lazy version, we just hide unwanted areas
  2717. // by changing the svg viewBox
  2718. // and using transform-translate-groups
  2719. const w = map_w;
  2720. const h = w;
  2721. const margin = 3;
  2722. const wh = w/2;
  2723. //const a = 1.25;
  2724. const a = map_a;
  2725. //const map_margin = a;
  2726. //const sw = 2*w;
  2727. //const sh = 2*h;
  2728. const sw = w + 2*a;
  2729. const sh = h + 2*a;
  2730. const d_gap = 0.1;
  2731. const wh2 = wh + d_gap; // fill gap between rect-s
  2732. //const page_x = 210; // mm
  2733. //const page_y = 297; // mm
  2734. const stroke_width = 0.4;
  2735. // shadow var
  2736. const font_size_map = 5; // orig is 4
  2737. document.write(`<svg
  2738. class="map map-6x6"
  2739. xmlns="http://www.w3.org/2000/svg"
  2740. xmlns:xlink="http://www.w3.org/1999/xlink"
  2741. x="0" y="0" width="${map_x_html*0.8}mm" height="${map_y_html*0.8}mm"
  2742. viewBox="${map_x_svg*0.5} ${map_x_svg*0.5} ${map_x_svg*1.5} ${map_y_svg*1.5}"
  2743. >
  2744. `);
  2745. // style + move
  2746. document.write(`<g
  2747. font-size="${font_size}"
  2748. font-family="sans-serif"
  2749. dominant-baseline="hanging"
  2750. stroke-width="${stroke_width}"
  2751. transform="translate(${-sw}, ${-sh})"
  2752. >
  2753. `);
  2754. const w_alcimap = (2*a+4*w+3*margin);
  2755. // alcimap
  2756. document.write(`<g
  2757. transform="translate(${map_a}, ${map_a})"
  2758. dominant-baseline="mathematical" text-anchor="middle"
  2759. font-size="${font_size_map}"
  2760. >
  2761. `);
  2762. // flowsquares
  2763. //const a_square = 2;
  2764. //const a_cross = 2.4;
  2765. const a_square = 3;
  2766. const a_cross = 3.6;
  2767. Array.range(2, 3).forEach(x => {
  2768. Array.range(2, 3).forEach(y => {
  2769. document.write(`<rect
  2770. x="${-a_square/2+(1+2*x)*sw+(1+5*x)*stroke_width/2}"
  2771. y="${-a_square/2+(1+2*y)*sh+(1+5*y)*stroke_width/2}"
  2772. width="${a_square}" height="${a_square}"
  2773. stroke="black" fill="none" />`
  2774. );
  2775. });
  2776. });
  2777. // tenscross
  2778. // todo make formulas simpler, use svg group with translate?
  2779. Array.range(1, 3).forEach(x => {
  2780. Array.range(1, 3).forEach(y => {
  2781. document.write(`<line
  2782. x1="${-a_cross/2+2*sw+4*stroke_width/2+(2*x)*sw+(5*x)*stroke_width/2}"
  2783. y1="${-a_cross/2+2*sh+4*stroke_width/2+(2*y)*sh+(5*y)*stroke_width/2}"
  2784. x2="${+a_cross/2+2*sw+4*stroke_width/2+(2*x)*sw+(5*x)*stroke_width/2}"
  2785. y2="${+a_cross/2+2*sh+4*stroke_width/2+(2*y)*sh+(5*y)*stroke_width/2}"
  2786. stroke="black" fill="none" />`);
  2787. document.write(`<line
  2788. x2="${-a_cross/2+2*sw+4*stroke_width/2+(2*x)*sw+(5*x)*stroke_width/2}"
  2789. y1="${-a_cross/2+2*sh+4*stroke_width/2+(2*y)*sh+(5*y)*stroke_width/2}"
  2790. x1="${+a_cross/2+2*sw+4*stroke_width/2+(2*x)*sw+(5*x)*stroke_width/2}"
  2791. y2="${+a_cross/2+2*sh+4*stroke_width/2+(2*y)*sh+(5*y)*stroke_width/2}"
  2792. stroke="black" fill="none" />`);
  2793. });
  2794. });
  2795. const mapSize = 4*(w + margin); // TODO
  2796. // repeat map 3x3 times
  2797. Array.from(Array(3).keys()).forEach(xRepeat => {
  2798. Array.from(Array(3).keys()).forEach(yRepeat => {
  2799. document.write(`<g transform="translate(${mapSize*xRepeat},${mapSize*yRepeat})">`)
  2800. // puzzle pieces + names
  2801. ac_xor(map_origin, ac_bits_asmg_11).forEach((num, idx) => {
  2802. const asmg = num.toString(2).padStart(4, 0).split('');
  2803. const e = letterFromASMG('E', asmg); // element
  2804. const b = letterFromASMG('B', asmg); // body
  2805. const e_sense = (e % 2 == 0) ? "I" : "E";
  2806. const cb = color.map[b];
  2807. const ce = color.map[e];
  2808. //const cbt = color.map[opposite[b]];
  2809. //const cet = color.map[opposite[e]];
  2810. /*
  2811. const cbt = (b == "A" || b == "D") ? "white" : "black";
  2812. const cet = (e == 1 || e == 4) ? "white" : "black";
  2813. */
  2814. const cbt = "black";
  2815. const cet = "black";
  2816. const x = idx % 4;
  2817. const xp = x * (w + margin);
  2818. const xb = xp + a;
  2819. const xe = xp + a + wh;
  2820. const yp = ((idx / 4)|0) * (h + margin);
  2821. const y = yp + a;
  2822. const xbt = xb + 0.5*(wh+a);
  2823. const xet = xe + 0.5*(wh-a);
  2824. const yt = y + 0.5*h;
  2825. document.write(`<!-- ${b}${e} -->`)
  2826. document.write(`<text x="${xbt}" y="${yt}" fill="${cbt}" width="${wh}" height="${h}">${b}</text>`)
  2827. document.write(`<text x="${xet}" y="${yt}" fill="${cet}" width="${wh}" height="${h}">${e}</text>`)
  2828. });
  2829. document.write(`</g>`);
  2830. });
  2831. });
  2832. document.write(`</g>`); // style + move
  2833. //document.write(`</g>`); // header
  2834. //document.write(`</g>`); // content
  2835. document.write(`</g>`); // style
  2836. document.write(`</svg>`);
  2837. }
  2838. function write_compass(){
  2839. const stroke_width = 1;
  2840. const stroke_width_circles = 2 * stroke_width;
  2841. // outer circle
  2842. const r1 = 80;
  2843. // inner circle (parent nodes)
  2844. const r2 = r1 * (
  2845. Math.cos(2*Math.PI/12) - Math.sin(2*Math.PI/12)
  2846. );
  2847. // r2 so that angles are 45 degrees
  2848. const r3 = 17;
  2849. const r4 = 40.5; // x - r3
  2850. const cx = 100;
  2851. const cy = 100;
  2852. document.write(`<svg
  2853. id="compass"
  2854. xmlns="http://www.w3.org/2000/svg"
  2855. xmlns:xlink="http://www.w3.org/1999/xlink"
  2856. x="0" y="0" width="${map_x_html*0.7}mm" height="${map_y_html*0.7}mm"
  2857. viewBox="0 0 200 200"
  2858. >
  2859. `);
  2860. // style
  2861. document.write(`
  2862. <g
  2863. font-size="${font_size*6}"
  2864. font-family="sans-serif"
  2865. text-anchor="middle"
  2866. dominant-baseline="mathematical"
  2867. stroke-width="${stroke_width}"
  2868. >
  2869. `);
  2870. /*
  2871. <line x1="${cx}" y1="${cy}" x2="${cx + r1}" y2="${cy}" stroke="yellow" />
  2872. <line x1="${cx}" y1="${cy}" x2="${cx - r1}" y2="${cy}" stroke="blue" />
  2873. <line x1="${cx}" y1="${cy}" x2="${cx}" y2="${cy + r1}" stroke="red" />
  2874. <line x1="${cx}" y1="${cy}" x2="${cx}" y2="${cy - r1}" stroke="green" />
  2875. */
  2876. document.write(`
  2877. <!--
  2878. <circle cx="100" cy="100" r="80" fill="white" stroke="black" />
  2879. -->
  2880. <line x1="${cx - r1}" y1="${cy}" x2="${cx + r1}" y2="${cy}" stroke="black" />
  2881. <line x1="${cx}" y1="${cy - r1}" x2="${cx}" y2="${cy + r1}" stroke="black" />
  2882. `);
  2883. // 12 "zodiac" signs
  2884. /*
  2885. idx:
  2886. 0
  2887. 11 1
  2888. 10 2
  2889. 9 3
  2890. 8 4
  2891. 7 5
  2892. 6
  2893. label:
  2894. 22
  2895. 24 23
  2896. 42 32
  2897. 44 33
  2898. 41 31
  2899. 14 13
  2900. 11
  2901. */
  2902. //const label = ["22", "23", "32", "33", "31", "13", "11", "14", "41", "44", "42", "24"];
  2903. const label = [
  2904. "2x2", "2x3",
  2905. "3x2", "3x3", "3x1",
  2906. "1x3", "1x1", "1x4",
  2907. "4x1", "4x4", "4x2",
  2908. "2x4",
  2909. ];
  2910. const color = ["green", "yellow", "red", "blue"];
  2911. const colidx2 = [
  2912. null, 1, 0,
  2913. null, 2, 1,
  2914. null, 3, 2,
  2915. null, 0, 3,
  2916. ];
  2917. // TODO use group-transform-translate to center to (cx, cy)
  2918. document.write(`<g fill="white" stroke="black">`)
  2919. Array.from(Array(12)).map((v,i)=>i).forEach(idx => {
  2920. // idx = 0, 1, 2, ... 10, 11
  2921. // child node, outer circle
  2922. const a = 2*Math.PI*idx/12; // angle
  2923. let x = cx + r1 * Math.sin(a);
  2924. let y = cy - r1 * Math.cos(a);
  2925. // parent node, inner circle
  2926. const pidx = Math.round((idx) / 3)*3;
  2927. const pa = 2*Math.PI*pidx/12;
  2928. const px = cx + r2 * Math.sin(pa);
  2929. const py = cy - r2 * Math.cos(pa);
  2930. const piby4 = Math.PI/4;
  2931. const daList = [0,piby4,piby4,0,3*piby4,3*piby4,0,5*piby4,5*piby4,0,7*piby4,7*piby4];
  2932. if (idx == pidx) {
  2933. document.write(`<line x1="${x}" y1="${y}" x2="${px}" y2="${py}" />`);
  2934. } else {
  2935. const da = daList[idx];
  2936. const dx = r4 * Math.sin(da);
  2937. const dy = -r4 * Math.cos(da);
  2938. document.write(`<path d="M ${px} ${py} l ${dx} ${dy}" />`);
  2939. }
  2940. const tf_rotate = [0, 135, -45, 0, 225, 45, 0, -45, 135, 0, 45, 225];
  2941. document.write(`<g transform="rotate(${tf_rotate[idx]}, ${x}, ${y})">`);
  2942. if (idx == pidx) {
  2943. // 11, 22, 33, 44
  2944. document.write(`<circle cx="${x}" cy="${y}" r="${r3}" stroke="${color[(pidx/3).mod(4)]}" stroke-width="${stroke_width_circles}" />`);
  2945. }
  2946. else {
  2947. // 23, 32, 31, 13, ...
  2948. // two half circles
  2949. const col2 = color[colidx2[idx]];
  2950. document.write(`<circle cx="${x}" cy="${y}" r="${r3}" stroke="none" fill="none" />`);
  2951. //console.log(`idx ${idx} (pidx/3).mod(4) = ${(pidx/3).mod(4)}`)
  2952. document.write(`<path d="M ${x + r3} ${y} a ${r3} ${r3} 0 0 1 ${-2*r3} 0" stroke="${color[(pidx/3).mod(4)]}" fill="none" stroke-width="${stroke_width_circles}" />`);
  2953. document.write(`<path d="M ${x + r3} ${y} a ${r3} ${r3} 0 0 0 ${-2*r3} 0" stroke="${col2}" fill="none" stroke-width="${stroke_width_circles}" />`);
  2954. }
  2955. document.write('</g>');
  2956. document.write(`<text x="${x}" y="${y}" stroke="none" fill="black">${label[idx]}</text>`)
  2957. })
  2958. // four corners I P E N
  2959. const a_square = 26;
  2960. ([
  2961. [+1, +1, 'E', 1, 1],
  2962. [-1, -1, 'I', 0, 0],
  2963. [+1, -1, 'N', 1, 0],
  2964. [-1, +1, 'P', 0, 1],
  2965. ]).forEach(([ix, iy, label, ix2, iy2]) => {
  2966. /*
  2967. let x = cx + ix*(r1+r3) - ix2*a_square;
  2968. let y = cy + iy*(r1+r3) - iy2*a_square;
  2969. let tx = x + a_square/2;
  2970. let ty = y + a_square/2;
  2971. */
  2972. let tx = cx + ix*r1;
  2973. let ty = cy + iy*r1;
  2974. let x = tx - a_square/2;
  2975. let y = ty - a_square/2;
  2976. document.write(`<rect x="${x}" y="${y}"
  2977. width="${a_square}" height="${a_square}"
  2978. stroke="black" fill="none"
  2979. />`);
  2980. document.write(`<text
  2981. x="${tx}" y="${ty}"
  2982. fill="black" stroke="none"
  2983. >${label}</text>`);
  2984. });
  2985. document.write(`</g>`)
  2986. document.write(`<g fill="white" stroke="black">`)
  2987. Array.from(Array(4)).map((v,i)=>3*i).forEach(idx => {
  2988. const a = 2*Math.PI/12*idx;
  2989. const x = 100 + r2 * Math.sin(a);
  2990. const y = 100 - r2 * Math.cos(a);
  2991. document.write(`<circle cx="${x}" cy="${y}" r="15" stroke="${color[idx/3]}" stroke-width="${stroke_width_circles}" />`)
  2992. document.write(`<text x="${x}" y="${y}" stroke="none" fill="black">${label[idx][0]}</text>`)
  2993. })
  2994. document.write(`</g>`)
  2995. document.write('</g>');
  2996. document.write('</svg>');
  2997. }
  2998. function write_pallas(){
  2999. const stroke_width = 1;
  3000. const g = 50; // grid size
  3001. const g2 = g*0.5;
  3002. const cx = 100;
  3003. const cy = 100;
  3004. document.write(`<svg
  3005. id="pallas"
  3006. xmlns="http://www.w3.org/2000/svg"
  3007. xmlns:xlink="http://www.w3.org/1999/xlink"
  3008. x="0" y="0" width="${map_x_html*0.4}mm" height="${map_y_html*0.4}mm"
  3009. viewBox="35 35 130 130"
  3010. >
  3011. `);
  3012. // style
  3013. document.write(`
  3014. <g
  3015. font-size="${font_size*6}"
  3016. font-family="sans-serif"
  3017. text-anchor="middle"
  3018. dominant-baseline="mathematical"
  3019. stroke-width="${stroke_width}"
  3020. >
  3021. `);
  3022. document.write(`<text fill="black" x="${cx}" y="${cy}">${text.me}</text>`);
  3023. document.write(`<text fill="black" x="${cx + g}" y="${cy + g}">${text.you}</text>`);
  3024. document.write(`<text fill="black" x="${cx - g}" y="${cy - g}">${text.you}</text>`);
  3025. document.write(`<text fill="black" x="${cx}" y="${cy + g}">${text.he}</text>`);
  3026. document.write(`<text fill="black" x="${cx}" y="${cy - g}">${text.he}</text>`);
  3027. document.write(`<text fill="black" x="${cx + g}" y="${cy}">${text.she}</text>`);
  3028. document.write(`<text fill="black" x="${cx - g}" y="${cy}">${text.she}</text>`);
  3029. // same class square, flusskreis, flowsquare
  3030. document.write(`<rect x="${cx + (g - g2)/2}" y="${cy + g/2 - g2/2}" width="${g2}" height="${g2}" fill="none" stroke="black" />`);
  3031. // spannkreuz, tenscross
  3032. document.write(`<line x1="${cx - (g - g2)/2}" y1="${cy - (g - g2)/2}" x2="${cx - (g - g2)/2 - g2}" y2="${cy - (g - g2)/2 - g2}" stroke="black" />`);
  3033. document.write(`<line x1="${cx - (g - g2)/2}" y1="${cy - (g - g2)/2 - g2}" x2="${cx - (g - g2)/2 - g2}" y2="${cy - (g - g2)/2}" stroke="black" />`);
  3034. document.write('</g>');
  3035. document.write('</svg>');
  3036. }
  3037. /*
  3038. typeList index vs position in double-pallas
  3039. 0 1 2 3 // parents
  3040. 4 5 6 // same age
  3041. 7 8 9 A // kids
  3042. */
  3043. // TODO move
  3044. function getBits(number, numBits = 4) {
  3045. return number.toString(2).slice(-numBits).padStart(numBits, 0).split('').map(x => x|0);
  3046. }
  3047. function write_double_pallas(pallas_origin = M1){
  3048. typeList = ac_bits_aasmg_double_pallas.map(n => {
  3049. // XOR (multiply) only last three bits, OR (add) two other bits
  3050. return ((pallas_origin & 0b111) ^ (n & 0b111)) | (n & 0b11000);
  3051. });
  3052. // NOTE age-less types need 5 bits
  3053. // TODO also encode three modalities?
  3054. const stroke_width = 1;
  3055. const g = 66.6; // grid size
  3056. const g2 = g*0.666;
  3057. const cx = 100;
  3058. const cy = 100;
  3059. document.write(`<svg
  3060. class="double-pallas"
  3061. xmlns="http://www.w3.org/2000/svg"
  3062. xmlns:xlink="http://www.w3.org/1999/xlink"
  3063. x="0" y="0" width="${map_x_html*0.5*4/3}mm" height="${map_y_html*0.5}mm"
  3064. viewBox="10 10 180 180"
  3065. >
  3066. `);
  3067. // style
  3068. document.write(`
  3069. <g
  3070. font-size="${font_size*7}"
  3071. font-family="sans-serif"
  3072. text-anchor="middle"
  3073. dominant-baseline="mathematical"
  3074. stroke-width="${stroke_width}"
  3075. >
  3076. `);
  3077. //const g = letterFromASMG('g', asmgBits); // gender
  3078. //const aasmgBits = getBits(asmgNum, 5);
  3079. //const noAge = aasmgBits[0];
  3080. // typeList index vs position in double-pallas
  3081. //
  3082. // 0 1 2 3 // parents
  3083. // 4 5 6 // same age
  3084. // 7 8 9 A // kids
  3085. // TODO shorter, use one loop
  3086. // use lookup-tables for text positions?
  3087. // parents = idx 0, 1, 2, 3
  3088. typeList.slice(0, 4).forEach((asmgNum, posIdx) => {
  3089. const asmgBits = getBits(asmgNum, 4);
  3090. const b = letterFromASMG('B', asmgBits); // body
  3091. const e = letterFromASMG('E', asmgBits); // element
  3092. //const pos = 2/3*(posIdx - 3/2);
  3093. //const pos = 7/8*(posIdx - 3/2);
  3094. const posMap = [-4/3, -1/3, +1/3, +4/3];
  3095. const pos = posMap[posIdx];
  3096. document.write(`<text fill="black" x="${cx + g*pos}" y="${cy - g}">${b+e}</text>`);
  3097. });
  3098. // same age = idx 4, 5, 6
  3099. typeList.slice(4, 7).forEach((asmgNum, posIdx) => {
  3100. const asmgBits = getBits(asmgNum, 4);
  3101. const gender = letterFromASMG('g', asmgBits); // gender
  3102. // var `g` already taken for "grid constant"
  3103. const e = letterFromASMG('E', asmgBits); // element
  3104. //const pos = 2/3*(posIdx - 3/2);
  3105. //const pos = posIdx - 1;
  3106. const pos = 4/3*(posIdx - 1);
  3107. document.write(`<text fill="black" x="${cx + g*pos}" y="${cy}">${gender+e}</text>`);
  3108. });
  3109. // kids = idx 7, 8, 9, 10
  3110. typeList.slice(7, 11).forEach((asmgNum, posIdx) => {
  3111. const asmgBits = getBits(asmgNum, 4);
  3112. const b = letterFromASMG('B', asmgBits); // body
  3113. const e = letterFromASMG('E', asmgBits); // element
  3114. //const pos = 2/3*(posIdx - 3/2);
  3115. const posMap = [-4/3, -1/3, +1/3, +4/3];
  3116. const pos = posMap[posIdx];
  3117. document.write(`<text fill="black" x="${cx + g*pos}" y="${cy + g}">${b+e}</text>`);
  3118. });
  3119. /*
  3120. document.write(`<text x="${cx}" y="${cy}">${text.me}</text>`);
  3121. document.write(`<text x="${cx + g}" y="${cy + g}">${text.you}</text>`);
  3122. document.write(`<text x="${cx - g}" y="${cy - g}">${text.you}</text>`);
  3123. document.write(`<text x="${cx}" y="${cy + g}">${text.he}</text>`);
  3124. document.write(`<text x="${cx}" y="${cy - g}">${text.he}</text>`);
  3125. document.write(`<text x="${cx + g}" y="${cy}">${text.she}</text>`);
  3126. document.write(`<text x="${cx - g}" y="${cy}">${text.she}</text>`);
  3127. */
  3128. //const oddness = g/6;
  3129. const oddness = 0;
  3130. // same class square, flusskreis, flowsquare
  3131. // top left:
  3132. document.write(`<rect
  3133. x="${(cx-g2/2) - g*5/6}"
  3134. y="${(cy-g2/2) - g*1/2}"
  3135. width="${g2}" height="${g2}" fill="none" stroke="black" />`);
  3136. // bottom left:
  3137. document.write(`<rect
  3138. x="${(cx-g2/2) - g*5/6}"
  3139. y="${(cy-g2/2) + g*1/2}"
  3140. width="${g2}" height="${g2}" fill="none" stroke="black" />`);
  3141. /*
  3142. // top left (odd):
  3143. document.write(`<path d="
  3144. M ${(cx-g2/2) - g*5/6} ${(cy-g2/2) - g*1/2}
  3145. h ${ g2}
  3146. l ${oddness} ${ g2}
  3147. h ${-g2-oddness}
  3148. z
  3149. " fill="none" stroke="black" />`);
  3150. // bottom left (odd):
  3151. document.write(`<path d="
  3152. M ${(cx-g2/2) - g*5/6} ${(cy-g2/2) + g*1/2}
  3153. h ${ g2+oddness}
  3154. l ${-oddness} ${ g2}
  3155. h ${-g2}
  3156. z
  3157. " fill="none" stroke="black" />`);
  3158. */
  3159. // spannkreuz, tenscross
  3160. // top right:
  3161. document.write(`<line stroke="black"
  3162. x1="${cx+g2/2 + g*5/6}" x2="${cx+g2/2 + g*5/6 - g2}"
  3163. y1="${cy+g2/2 - g*1/2}" y2="${cy+g2/2 - g*1/2 - g2}" />`);
  3164. document.write(`<line stroke="black"
  3165. x1="${cx+g2/2 + g*5/6}" x2="${cx+g2/2 + g*5/6 - g2 - (oddness /* odd cross */)}"
  3166. y2="${cy+g2/2 - g*1/2}" y1="${cy+g2/2 - g*1/2 - g2}" />`);
  3167. // bottom right:
  3168. document.write(`<line stroke="black"
  3169. x1="${cx+g2/2 + g*5/6}" x2="${cx+g2/2 + g*5/6 - g2 - (oddness /* odd cross */)}"
  3170. y1="${cy+g2/2 + g*1/2}" y2="${cy+g2/2 + g*1/2 - g2}" />`);
  3171. document.write(`<line stroke="black"
  3172. x1="${cx+g2/2 + g*5/6}" x2="${cx+g2/2 + g*5/6 - g2}"
  3173. y2="${cy+g2/2 + g*1/2}" y1="${cy+g2/2 + g*1/2 - g2}" />`);
  3174. // dotted lines to connect original pallas keys
  3175. document.write(`<path stroke="black" d="
  3176. M ${cx+g2/2 + g*5/6 - g2 - (oddness /* odd cross */)} ${cy+g2/2 - g*1/2}
  3177. h ${-g-g2}
  3178. " stroke-dasharray="${stroke_width*3} ${stroke_width*6}" />`);
  3179. document.write(`<path stroke="black" d="
  3180. M ${cx+g2/2 + g*5/6 - g2 - (oddness /* odd cross */)} ${cy+g2/2 + g*1/2 - g2}
  3181. h ${-g-g2}
  3182. " stroke-dasharray="${stroke_width*3} ${stroke_width*6}" />`);
  3183. document.write('</g>');
  3184. document.write('</svg>');
  3185. }
  3186. function write_double_pallas_small(pallas_origin = M1){
  3187. typeList = ac_bits_aasmg_double_pallas.map(n => {
  3188. // XOR (multiply) only last three bits, OR (add) two other bits
  3189. return ((pallas_origin & 0b111) ^ (n & 0b111)) | (n & 0b11000);
  3190. });
  3191. // NOTE age-less types need 5 bits! TODO encode?
  3192. // TODO also encode three modalities? --> 7 bits
  3193. const stroke_width = 1;
  3194. const g = 66.6; // grid size
  3195. const g2 = g*0.4;
  3196. const cx = 100;
  3197. const cy = 100;
  3198. const margin_x = 10;
  3199. document.write(`<svg
  3200. class="double-pallas-small"
  3201. xmlns="http://www.w3.org/2000/svg"
  3202. xmlns:xlink="http://www.w3.org/1999/xlink"
  3203. x="0" y="0" width="${content_x/9}mm" height="${content_x/9*200/(200+2*margin_x)}mm"
  3204. viewBox="-${margin_x} 0 ${200+2*margin_x} 200"
  3205. >
  3206. `);
  3207. // style
  3208. document.write(`
  3209. <g
  3210. font-size="${font_size*9}"
  3211. font-family="sans-serif"
  3212. text-anchor="middle"
  3213. dominant-baseline="mathematical"
  3214. stroke-width="${stroke_width*2}"
  3215. >
  3216. `);
  3217. //const g = letterFromASMG('g', asmgBits); // gender
  3218. //const aasmgBits = getBits(asmgNum, 5);
  3219. //const noAge = aasmgBits[0];
  3220. // typeList index vs position in double-pallas
  3221. //
  3222. // 0 1 2 3 // parents
  3223. // 4 5 6 // same age
  3224. // 7 8 9 A // kids
  3225. // TODO shorter, use one loop
  3226. // use lookup-tables for text positions?
  3227. // parents = idx 0, 1, 2, 3
  3228. typeList.slice(0, 4).forEach((asmgNum, posIdx) => {
  3229. const asmgBits = getBits(asmgNum, 4);
  3230. const b = letterFromASMG('B', asmgBits); // body
  3231. const e = letterFromASMG('E', asmgBits); // element
  3232. //const pos = 2/3*(posIdx - 3/2);
  3233. //const pos = 7/8*(posIdx - 3/2);
  3234. const posMap = [-4/3, -1/3, +1/3, +4/3];
  3235. const pos = posMap[posIdx];
  3236. document.write(`<text fill="black" x="${cx + g*pos}" y="${cy - g}">${b+e}</text>`);
  3237. });
  3238. // same age = idx 4, 5, 6
  3239. typeList.slice(4, 7).forEach((asmgNum, posIdx) => {
  3240. const asmgBits = getBits(asmgNum, 4);
  3241. const gender = letterFromASMG('g', asmgBits); // gender
  3242. // var `g` already taken for "grid constant"
  3243. const e = letterFromASMG('E', asmgBits); // element
  3244. //const pos = 2/3*(posIdx - 3/2);
  3245. //const pos = posIdx - 1;
  3246. const pos = 4/3*(posIdx - 1);
  3247. document.write(`<text fill="black" x="${cx + g*pos}" y="${cy}">${gender+e}</text>`);
  3248. });
  3249. // kids = idx 7, 8, 9, 10
  3250. typeList.slice(7, 11).forEach((asmgNum, posIdx) => {
  3251. const asmgBits = getBits(asmgNum, 4);
  3252. const b = letterFromASMG('B', asmgBits); // body
  3253. const e = letterFromASMG('E', asmgBits); // element
  3254. //const pos = 2/3*(posIdx - 3/2);
  3255. const posMap = [-4/3, -1/3, +1/3, +4/3];
  3256. const pos = posMap[posIdx];
  3257. document.write(`<text fill="black" x="${cx + g*pos}" y="${cy + g}">${b+e}</text>`);
  3258. });
  3259. //const oddness = g/6;
  3260. const oddness = 0;
  3261. // same class square, flusskreis, flowsquare
  3262. // top left:
  3263. document.write(`<rect
  3264. x="${(cx-g2/2) - g*5/6}"
  3265. y="${(cy-g2/2) - g*1/2}"
  3266. width="${g2}" height="${g2}" fill="none" stroke="black" />`);
  3267. // bottom left:
  3268. document.write(`<rect
  3269. x="${(cx-g2/2) - g*5/6}"
  3270. y="${(cy-g2/2) + g*1/2}"
  3271. width="${g2}" height="${g2}" fill="none" stroke="black" />`);
  3272. /*
  3273. // top left (odd):
  3274. document.write(`<path d="
  3275. M ${(cx-g2/2) - g*5/6} ${(cy-g2/2) - g*1/2}
  3276. h ${ g2}
  3277. l ${oddness} ${ g2}
  3278. h ${-g2-oddness}
  3279. z
  3280. " fill="none" stroke="black" />`);
  3281. // bottom left (odd):
  3282. document.write(`<path d="
  3283. M ${(cx-g2/2) - g*5/6} ${(cy-g2/2) + g*1/2}
  3284. h ${ g2+oddness}
  3285. l ${-oddness} ${ g2}
  3286. h ${-g2}
  3287. z
  3288. " fill="none" stroke="black" />`);
  3289. */
  3290. // spannkreuz, tenscross
  3291. // top right:
  3292. document.write(`<line stroke="black"
  3293. x1="${cx+g2/2 + g*5/6}" x2="${cx+g2/2 + g*5/6 - g2}"
  3294. y1="${cy+g2/2 - g*1/2}" y2="${cy+g2/2 - g*1/2 - g2}" />`);
  3295. document.write(`<line stroke="black"
  3296. x1="${cx+g2/2 + g*5/6}" x2="${cx+g2/2 + g*5/6 - g2 - (oddness /* odd cross */)}"
  3297. y2="${cy+g2/2 - g*1/2}" y1="${cy+g2/2 - g*1/2 - g2}" />`);
  3298. // bottom right:
  3299. document.write(`<line stroke="black"
  3300. x1="${cx+g2/2 + g*5/6}" x2="${cx+g2/2 + g*5/6 - g2 - (oddness /* odd cross */)}"
  3301. y1="${cy+g2/2 + g*1/2}" y2="${cy+g2/2 + g*1/2 - g2}" />`);
  3302. document.write(`<line stroke="black"
  3303. x1="${cx+g2/2 + g*5/6}" x2="${cx+g2/2 + g*5/6 - g2}"
  3304. y2="${cy+g2/2 + g*1/2}" y1="${cy+g2/2 + g*1/2 - g2}" />`);
  3305. // dotted lines to connect original pallas keys
  3306. document.write(`<path stroke="black" d="
  3307. M
  3308. ${cx+g2/2 + g*5/6 - g2 - (oddness /* odd cross */)}
  3309. ${cy+g2/2 - g*1/2}
  3310. h ${-g-g2}
  3311. " stroke-dasharray="${stroke_width*3} ${stroke_width*6}" />`);
  3312. document.write(`<path stroke="black" d="
  3313. M ${cx+g2/2 + g*5/6 - g2 - (oddness /* odd cross */)} ${cy+g2/2 + g*1/2 - g2}
  3314. h ${-g-g2}
  3315. " stroke-dasharray="${stroke_width*3} ${stroke_width*6}" />`);
  3316. document.write('</g>');
  3317. document.write('</svg>');
  3318. }
  3319. function write_exchange() {
  3320. const stroke_width = 1;
  3321. //const g = 66.6; // grid size
  3322. //const g2 = g*0.666;
  3323. const s = 200; // size
  3324. const m = 4; // margin
  3325. const A = 1.5; // aspect
  3326. const d = 20; // distance
  3327. const m2 = m - stroke_width; // margin of boxes
  3328. const H = (s - d) / (A + 1);
  3329. const W = A * H;
  3330. // puzzle pieces
  3331. const h = 0.4 * H;
  3332. const w = h;
  3333. const a = w / 8;
  3334. const sw = w + 2*a;
  3335. const sh = h + 2*a;
  3336. const puzzle_path = {
  3337. I: `
  3338. M ${sw/2} ${(sh-h)/2-a}
  3339. l ${-a} ${a}
  3340. h ${-(w/2-a)}
  3341. v ${h/2-a}
  3342. l ${a} ${a}
  3343. l ${-a} ${a}
  3344. v ${h/2-a}
  3345. h ${w/2-a}
  3346. l ${a} ${a}
  3347. l ${a} ${-a}
  3348. h ${w/2-a}
  3349. v ${-(h/2-a)}
  3350. l ${-a} ${-a}
  3351. l ${a} ${-a}
  3352. v ${-(h/2-a)}
  3353. h ${-(w/2-a)}
  3354. z
  3355. `,
  3356. E: `
  3357. M ${sw/2} ${(sh-h)/2+a}
  3358. l ${-a} ${-a}
  3359. h ${-(w/2-a)}
  3360. v ${h/2-a}
  3361. l ${-a} ${a}
  3362. l ${a} ${a}
  3363. v ${h/2-a}
  3364. h ${w/2-a}
  3365. l ${a} ${-a}
  3366. l ${a} ${a}
  3367. h ${w/2-a}
  3368. v ${-(h/2-a)}
  3369. l ${a} ${-a}
  3370. l ${-a} ${-a}
  3371. v ${-(h/2-a)}
  3372. h ${-(w/2-a)}
  3373. z
  3374. `,
  3375. };
  3376. const x0 = 20;
  3377. // these numbers are a mess, but it works
  3378. let svg_exchange_h = s+2*m-2*x0;
  3379. let svg_exchange_w = s+2*m;
  3380. document.write(`<svg
  3381. id="exchange"
  3382. xmlns="http://www.w3.org/2000/svg"
  3383. xmlns:xlink="http://www.w3.org/1999/xlink"
  3384. x="0" y="0" width="${map_x_html*0.75}mm" height="${map_y_html*0.75*0.7}mm"
  3385. viewBox="${-x0*0.8} ${-x0*1} ${svg_exchange_w} ${svg_exchange_h-1.25*x0}"
  3386. style="margin: 0.5em"
  3387. >
  3388. `);
  3389. document.write(`
  3390. <defs>
  3391. <marker id="arrowhead" markerWidth="10" markerHeight="10" refX="0" refY="3" orient="auto" markerUnits="strokeWidth">
  3392. <path d="M0,0 L0,6 L9,3 z" fill="black" />
  3393. </marker>
  3394. <marker id="arrowhead-back" markerWidth="10" markerHeight="10" refX="10" refY="3" orient="auto" markerUnits="strokeWidth">
  3395. <path d="M10,0 L10,6 L1,3 z" fill="black" />
  3396. </marker>
  3397. </defs>
  3398. `);
  3399. // style + transform
  3400. // TODO set text anchor to center
  3401. document.write(`
  3402. <g
  3403. transform="
  3404. translate(${+(svg_exchange_w/2)} ${+(svg_exchange_h/2)})
  3405. rotate(90)
  3406. translate(${-(svg_exchange_w/2)} ${-(svg_exchange_h/2)})
  3407. translate(${-1.5*x0} 0 )
  3408. "
  3409. font-size="${font_size*6}"
  3410. font-family="sans-serif"
  3411. text-anchor="middle"
  3412. dominant-baseline="mathematical"
  3413. stroke-width="${stroke_width}"
  3414. fill="none"
  3415. stroke="black"
  3416. >
  3417. <style>
  3418. .rotateBack text {
  3419. transform: rotate(-90deg);
  3420. transform-box: fill-box;
  3421. }
  3422. </style>
  3423. `);
  3424. // boxes
  3425. document.write(`
  3426. <rect x="${(s-W)/2-m2}" y="${-m2}" width="${W+2*m2}" height="${H+2*m2}" stroke-dasharray="${stroke_width} ${stroke_width*2}" />
  3427. <rect x="${(s-H)/2-m2}" y="${H+d-m2}" width="${H+2*m2}" height="${W+2*m2}" stroke-dasharray="${stroke_width} ${stroke_width*2}" />
  3428. `);
  3429. // puzzle pieces
  3430. document.write(`
  3431. <path transform="translate(${(s-W)/2+W-sw},${0})" d="${puzzle_path.I}"/>
  3432. <path transform="translate(${(s-W)/2},${0})" d="${puzzle_path.E}"/>
  3433. <path transform="translate(${(s-W)/2},${H-sw})" d="${puzzle_path.I}"/>
  3434. <path transform="translate(${(s-W)/2+W-sw},${H-sw})" d="${puzzle_path.E}"/>
  3435. <path transform="translate(${s/2},${H+d})" d="${puzzle_path.I}"/>
  3436. <path transform="translate(${s/2-sw},${H+d})" d="${puzzle_path.E}"/>
  3437. <path transform="translate(${s/2-sw},${H+d+W-sw})" d="${puzzle_path.I}"/>
  3438. <path transform="translate(${s/2},${H+d+W-sw})" d="${puzzle_path.E}"/>
  3439. `);
  3440. // labels
  3441. // set fill="black" for every text node,
  3442. // so firefox-darkreader can invert colors correctly
  3443. document.write(`
  3444. <g stroke="none" class="rotateBack" transform="translate(-4, 14)">
  3445. <text fill="black" y="${sh/2}" x="${(s-W)/2+sw/2}">C</text>
  3446. <text fill="black" y="${sh/2}" x="${(s-W)/2-sw/2+W}">A</text>
  3447. <text fill="black" y="${H-sw+sh/2}" x="${(s-W)/2-sw/2+W}">D</text>
  3448. <text fill="black" y="${H-sw+sh/2}" x="${(s-W)/2+sw/2}">B</text>
  3449. <text fill="black" y="${H+d+sh/2}" x="${s/2+sw/2}">A</text>
  3450. <text fill="black" y="${H+d+sh/2}" x="${s/2-sw/2}">C</text>
  3451. <text fill="black" y="${H+d+sh/2+W-sw}" x="${s/2-sw/2}">B</text>
  3452. <text fill="black" y="${H+d+sh/2+W-sw}" x="${s/2+sw/2}">D</text>
  3453. </g>
  3454. `);
  3455. // arrows
  3456. /* variant: middle to corner
  3457. document.write(`<path d="
  3458. M ${s/2+W/2+3*m2} ${H+5}
  3459. A ${s/4} ${s/4} 0 0 1 ${s/2+(H/2+2*m2)+8} ${H+d+W/2-5}
  3460. " marker-end="url(#arrowhead)" />`);
  3461. document.write(`<path d="
  3462. M ${s/2-(W/2+3*m2)} ${H+15}
  3463. A ${s/4} ${s/4} 0 0 0 ${s/2-(H/2+3*m2)} ${H+d+W/2}
  3464. " marker-start="url(#arrowhead-back)" />`);
  3465. */
  3466. // variant: middle to middle
  3467. document.write(`<path d="
  3468. M ${s/2+W/2+3*m2-2} ${H+5-40}
  3469. A ${s/4*2} ${s/4*2} 0 0 1 ${s/2+(H/2+2*m2)+8} ${H+d+W/2-5}
  3470. " marker-end="url(#arrowhead)" />`);
  3471. document.write(`<path d="
  3472. M ${s/2-(W/2+3*m2)} ${H+15-40}
  3473. A ${s/4*2} ${s/4*2} 0 0 0 ${s/2-(H/2+3*m2)} ${H+d+W/2}
  3474. " marker-start="url(#arrowhead-back)" />`);
  3475. document.write('</g>');
  3476. document.write('</svg>');
  3477. }
  3478. function write_balance(id) {
  3479. const bal = text[id];
  3480. document.write(`<div class="balance">`);
  3481. if (bal.title) {
  3482. document.write(`<div class="title">${bal.title}</div>`);
  3483. }
  3484. ["f", "m"].forEach(gender => {
  3485. document.write(`<div class="${gender}">`);
  3486. [1, 2, 3, 4].forEach(element => {
  3487. document.write(`<div class="${gender}${element}">`);
  3488. document.write(`<div class="h1">${gender.toUpperCase() + element}</div>`);
  3489. /* save some space
  3490. if (gender == "f") {
  3491. document.write(`<div class="h2">B${element} + C${element}</div>`);
  3492. } else {
  3493. document.write(`<div class="h2">A${element} + D${element}</div>`);
  3494. }
  3495. */
  3496. bal[gender + element].forEach(name => {
  3497. document.write(`<div>${name}</div>`);
  3498. });
  3499. document.write(`</div>`);
  3500. });
  3501. document.write(`</div>`);
  3502. });
  3503. document.write(`</div>`);
  3504. }
  3505. function write_table(id) {
  3506. text[id]
  3507. .trim().split("\n\n").forEach(line => {
  3508. document.write(`<div>`);
  3509. line.split("\n").forEach(cell => {
  3510. document.write(`<div>${cell.trim()}</div>`);
  3511. });
  3512. document.write(`</div>`);
  3513. });
  3514. }
  3515. const numword = ["zero", "one", "two", "three", "four", "five"];
  3516. function write_table_inline(id /*, idx_list=null*/) {
  3517. // TODO use regular expression for .split()
  3518. // like .split(/\n[ \t]*\n/g)
  3519. // to ignore empty indent lines
  3520. /*
  3521. const cell_filter = idx_list ? (
  3522. (val, idx) => (idx in idx_list)
  3523. ) : () => true;
  3524. const cell_count = idx_list ? idx_list.length : (
  3525. text[id].trim().split("\n\n")[0].split("\n").length
  3526. );
  3527. */
  3528. // remove multi-line comments
  3529. const text2 = text[id].replace(/\n<!--.*?-->\n/sg, '\n\n').trim();
  3530. const cell_count = (
  3531. text2.trim().split("\n\n")[0].split("\n").length
  3532. );
  3533. document.write(`<div id="table-inline-${id}" class="table-inline ${numword[cell_count]}-cell">`);
  3534. text2
  3535. .trim().split("\n\n").forEach((line, line_idx, line_arr) => {
  3536. document.write(`<div>`);
  3537. line.split("\n")
  3538. //.filter(cell_filter)
  3539. .forEach((cell, idx, cell_arr) => {
  3540. const ct = cell.trim();
  3541. let ctr = ct.replace(/<!--.*?-->/g, '').trim();
  3542. const sm = ctr.match(/<div class="suffix">.*<\/div>/s);
  3543. let suf = '';
  3544. if (sm) {
  3545. ctr = ctr.replace(sm[0], ''); // remove suffix
  3546. suf = sm[0];
  3547. }
  3548. if (idx == 0) {
  3549. if (ctr == "") {
  3550. document.write(`<div></div>`);
  3551. }
  3552. else {
  3553. document.write(`<div>${ctr}</div>:&nbsp;`);
  3554. }
  3555. }
  3556. else if (idx == cell_arr.length-1) {
  3557. // add suffix only in last cell
  3558. if (line_idx == line_arr.length-1) {
  3559. document.write(`<div>${ctr}</div>${suf}`);
  3560. }
  3561. else {
  3562. document.write(`<div>${ctr}</div>${suf} = `);
  3563. }
  3564. }
  3565. else {
  3566. document.write(`<div>${ctr}</div>&nbsp;/&nbsp;`);
  3567. }
  3568. });
  3569. document.write(`</div> `);
  3570. // extra whitespace after</div> = allow wrap
  3571. });
  3572. document.write('</div>')
  3573. }
  3574. </script>
  3575. </head>
  3576. <body>
  3577. <!-- page 1 -->
  3578. <div class="page page1">
  3579. <div class="content">
  3580. <div class="inner_content"><!-- content above footer -->
  3581. <script>write_para("header_page1")</script>
  3582. <script>write_para("project_intro")</script>
  3583. <script>write_para("problem_misunderstandings")</script>
  3584. <div id="table-inline-bodies-wrapper" class="para-margin-bottom">
  3585. <script>
  3586. document.write(text["para_four_bodies"]);
  3587. write_table_inline("bodies");
  3588. </script>
  3589. </div>
  3590. <div class="caption-container float-right four_bodies">
  3591. <div id="div_four_bodies"><!--<script>document.write(`<img style="width: 210px" src="${file.four_bodies}" />`)</script>--></div>
  3592. <div><script>write_caption("four_bodies")</script></div>
  3593. </div>
  3594. <div id="table-inline-elements-wrapper" class="para-margin-bottom">
  3595. <script>
  3596. document.write(text["para_four_elements"]);
  3597. write_table_inline("elements");
  3598. </script>
  3599. </div>
  3600. <div class="caption-container float-left" style="margin-top:0.5em">
  3601. <div id="div_three_hands"><!--<script>document.write(`<img style="width: 180px" src="${file.three_hands}" />`)</script>--></div>
  3602. <div><script>write_caption("three_hands")</script></div>
  3603. </div>
  3604. <script>write_para("mix_types")</script>
  3605. <!-- compass illustrates four elements x three modalities -->
  3606. <div class="caption-container float-right">
  3607. <div><script>write_compass()</script></div>
  3608. <div><script>write_caption("compass")</script></div>
  3609. </div>
  3610. <script>write_para("mix_types_sample")</script>
  3611. <script>write_para("two_modalities")</script>
  3612. <div class="caption-container float-left">
  3613. <div style="margin-left:0.5em"><script>write_map()</script></div>
  3614. <div><script>write_caption("map")</script></div>
  3615. </div>
  3616. <div id="table-inline-sense-wrapper" class="para-margin-bottom">
  3617. <nw><b><script>document.write(text.caption.sense)</script></b>
  3618. =</nw><script>write_table_inline("sense")</script>
  3619. </div>
  3620. <div id="table-inline-modalities-wrapper" class="para-margin-bottom">
  3621. <nw><b><script>document.write(text.caption.modality)</script></b>
  3622. =</nw><script>write_table_inline("modalities")</script>
  3623. </div>
  3624. <div class="caption-container float-right">
  3625. <div><script>write_pallas()</script></div>
  3626. <div><script>write_caption("pallas")</script></div>
  3627. </div>
  3628. <script>write_para("club16")</script>
  3629. <div id="table-inline-sense-wrapper" class="para-margin-bottom">
  3630. <nw><b><script>document.write(text.caption.move)</script></b>
  3631. =</nw><script>write_table_inline("move")</script>
  3632. </div>
  3633. <script>write_para("dress_opposite_color")</script>
  3634. <div id="table-inline-sensexmove-wrapper" class="para-margin-bottom">
  3635. <script>document.write(text.caption.flowsquare)</script>
  3636. = <script>write_table_inline("sensexmove")</script>
  3637. </div>
  3638. <script>write_para("translation_bigfive")</script>
  3639. <script>write_para("translation_mbti")</script>
  3640. </div><!-- close .inner_content -->
  3641. <div class="footer">
  3642. <script>write_para("page_footer", "para-page-footer para-page-footer-1")</script>
  3643. </div>
  3644. </div><!-- close .content -->
  3645. </div><!-- close .page -->
  3646. <!-- ######################################## -->
  3647. <div class="page page2">
  3648. <div class="content">
  3649. <div class="inner_content"><!-- content above footer -->
  3650. <script>write_para("header_page2")</script>
  3651. <div class="caption-container float-right">
  3652. <div><script>write_double_pallas(M3)</script></div>
  3653. <div><script>write_caption("double_pallas")</script></div>
  3654. </div>
  3655. <script>write_para("monolog_bond")</script>
  3656. <script>write_para("dialog_bonds")</script>
  3657. <script>write_para("diagonal_bonds")</script>
  3658. <script>write_para("four_truths")</script>
  3659. <script>write_para("anti_nature")</script>
  3660. <script>write_para("false_talking")</script>
  3661. <script>write_para("false_hearing")</script>
  3662. <script>write_para("right_feedback")</script>
  3663. <div class="float-right" style="margin: 1em 1em 1em 0">
  3664. <script>write_balance("bal")</script>
  3665. </div>
  3666. <div class="caption-container float-left">
  3667. <div class="double-pallas-small-container">
  3668. <script>
  3669. //[M1, F1, M2, F2, M3, F3, M4, F4]
  3670. [F1, M1, F2, M2, F3, M3, F4, M4]
  3671. .forEach(pallas_origin => (
  3672. write_double_pallas_small(pallas_origin)
  3673. ))
  3674. </script>
  3675. </div>
  3676. <div><script>write_caption("eight_double_pallas")</script></div>
  3677. </div>
  3678. <div class="caption-container float-right">
  3679. <div><script>write_map_6x6()</script></div>
  3680. <div><script>write_caption("map_6x6")</script></div>
  3681. </div>
  3682. <script>write_para("nature_vs_art")</script>
  3683. <script>write_para("natural_order")</script>
  3684. <script>write_para("made_order")</script>
  3685. <script>write_para("mutable_modality")</script>
  3686. <script>write_para("gender2_age3")</script>
  3687. <div class="caption-container float-right">
  3688. <div><script>write_exchange()</script></div>
  3689. <div><script>write_caption("exchange")</script></div>
  3690. </div>
  3691. <script>write_para("gender_vs_modality")</script>
  3692. <script>write_para("education_mothers")</script>
  3693. <script>write_para("school_no_choice")</script>
  3694. <script>write_para("works_everywhere")</script>
  3695. <script>write_para("four_crosses")</script>
  3696. <script>write_para("four_dots")</script>
  3697. <script>write_para("in_case_of_doubt")</script>
  3698. <script>write_para("post_script")</script>
  3699. <script>write_para("post_script_2")</script>
  3700. </div><!-- close .inner_content -->
  3701. <!-- footer -->
  3702. <div class="footer">
  3703. <script>write_para("page_footer", "para-page-footer")</script>
  3704. </div>
  3705. </div></div><!-- .content .page -->
  3706. <script>
  3707. // attached/inlined SVG files to have only one HTML file
  3708. // TODO make SVGs smaller, inkscape is too verbose
  3709. //color = {};
  3710. color.middle = {};
  3711. if (1) {
  3712. // variant: eigencolor is middle
  3713. color.middle.fire = "#ff0000";
  3714. color.middle.earth = "#00ff00";
  3715. color.middle.air = "#ffff00";
  3716. color.middle.water = "#0000ff";
  3717. } else {
  3718. // variant: gegencolor is middle
  3719. color.middle.fire = "#00ff00";
  3720. color.middle.earth = "#ff0000";
  3721. color.middle.air = "#0000ff";
  3722. color.middle.water = "#ffff00";
  3723. }
  3724. // TODO verify leg positions. who has x-legs? wo has o-legs?
  3725. // current variant: 14 have x-legs and 23 have o-legs
  3726. // weak legs = x legs, strong legs = o legs
  3727. // xml header only needed for standalone svg file
  3728. const svg_four_bodies = `
  3729. <!--
  3730. <?xml version="1.0" encoding="UTF-8" standalone="no"?>
  3731. -->
  3732. <svg
  3733. xmlns:dc="http://purl.org/dc/elements/1.1/"
  3734. xmlns:cc="http://creativecommons.org/ns#"
  3735. xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  3736. xmlns:svg="http://www.w3.org/2000/svg"
  3737. xmlns="http://www.w3.org/2000/svg"
  3738. xmlns:xlink="http://www.w3.org/1999/xlink"
  3739. xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
  3740. xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
  3741. sodipodi:docname="four-bodies.svg"
  3742. inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
  3743. id="svg1005"
  3744. version="1.1"
  3745. viewBox="0 0 73.146881 36.105923"
  3746. height="36.105923mm"
  3747. width="73.146881mm">
  3748. <defs
  3749. id="defs999">
  3750. <linearGradient
  3751. inkscape:collect="always"
  3752. id="linearGradient1205-3">
  3753. <!-- water: red blue green -->
  3754. <stop
  3755. style="stop-color:#ff0000;stop-opacity:1"
  3756. offset="0"
  3757. id="stop1201" />
  3758. <stop
  3759. id="stop971"
  3760. offset="0.05"
  3761. style="stop-color:${color.middle.water};stop-opacity:1" />
  3762. <!-- firefox prints 0.99 as sharp edge but 0.96 as gradient -->
  3763. <!-- chrome prints 0.95 as sharp edge but 0.99 is wrong color -->
  3764. <stop
  3765. id="stop969"
  3766. offset="0.95"
  3767. style="stop-color:${color.middle.water};stop-opacity:1" />
  3768. <stop
  3769. style="stop-color:#00ff00;stop-opacity:1"
  3770. offset="1"
  3771. id="stop1203" />
  3772. </linearGradient>
  3773. <linearGradient
  3774. id="linearGradient1168"
  3775. inkscape:collect="always">
  3776. <!-- earth: blue green yellow -->
  3777. <stop
  3778. style="stop-color:#0000ff;stop-opacity:1"
  3779. offset="0"
  3780. id="stop1162" />
  3781. <stop
  3782. id="stop955"
  3783. offset="0.05"
  3784. style="stop-color:${color.middle.earth};stop-opacity:1" />
  3785. <stop
  3786. style="stop-color:${color.middle.earth};stop-opacity:1"
  3787. offset="0.95"
  3788. id="stop957" />
  3789. <stop
  3790. id="stop1164"
  3791. offset="1"
  3792. style="stop-color:#ffff00;stop-opacity:1" />
  3793. </linearGradient>
  3794. <linearGradient
  3795. inkscape:collect="always"
  3796. id="linearGradient1124">
  3797. <!-- fire: blue red yellow -->
  3798. <stop
  3799. id="stop1132"
  3800. offset="0"
  3801. style="stop-color:#0000ff;stop-opacity:1" />
  3802. <stop
  3803. style="stop-color:${color.middle.fire};stop-opacity:1"
  3804. offset="0.05"
  3805. id="stop925" />
  3806. <stop
  3807. id="stop927"
  3808. offset="0.95"
  3809. style="stop-color:${color.middle.fire};stop-opacity:1" />
  3810. <stop
  3811. style="stop-color:#ffff00;stop-opacity:1"
  3812. offset="1"
  3813. id="stop1134" />
  3814. </linearGradient>
  3815. <rect
  3816. id="rect1766"
  3817. height="22.613817"
  3818. width="1.7945622"
  3819. y="141.39067"
  3820. x="86.136185" />
  3821. <linearGradient
  3822. inkscape:collect="always"
  3823. xlink:href="#linearGradient1168"
  3824. id="linearGradient1158"
  3825. x1="120.57774"
  3826. y1="38.886681"
  3827. x2="120.57774"
  3828. y2="33.754547"
  3829. gradientUnits="userSpaceOnUse" />
  3830. <linearGradient
  3831. gradientTransform="translate(0,-0.49254013)"
  3832. inkscape:collect="always"
  3833. xlink:href="#linearGradient1205-3"
  3834. id="linearGradient1227"
  3835. x1="114.7877"
  3836. y1="148.13826"
  3837. x2="114.7877"
  3838. y2="145.40222"
  3839. gradientUnits="userSpaceOnUse" />
  3840. <linearGradient
  3841. y2="33.689411"
  3842. x2="120.28236"
  3843. y1="38.821548"
  3844. x1="120.28236"
  3845. gradientUnits="userSpaceOnUse"
  3846. id="linearGradient953"
  3847. xlink:href="#linearGradient1124"
  3848. inkscape:collect="always" />
  3849. </defs>
  3850. <sodipodi:namedview
  3851. inkscape:window-maximized="1"
  3852. inkscape:window-y="0"
  3853. inkscape:window-x="0"
  3854. inkscape:window-height="835"
  3855. inkscape:window-width="1440"
  3856. fit-margin-bottom="1"
  3857. fit-margin-right="1"
  3858. lock-margins="true"
  3859. fit-margin-left="1"
  3860. fit-margin-top="1"
  3861. showgrid="false"
  3862. inkscape:document-rotation="0"
  3863. inkscape:current-layer="layer1"
  3864. inkscape:document-units="mm"
  3865. inkscape:cy="85.135138"
  3866. inkscape:cx="142.11401"
  3867. inkscape:zoom="4"
  3868. inkscape:pageshadow="2"
  3869. inkscape:pageopacity="0.0"
  3870. borderopacity="1.0"
  3871. bordercolor="#666666"
  3872. pagecolor="#ffffff"
  3873. id="base"
  3874. showguides="true"
  3875. inkscape:guide-bbox="true">
  3876. <sodipodi:guide
  3877. id="guide933"
  3878. orientation="0,-1"
  3879. position="58.406772,26.962817" />
  3880. <sodipodi:guide
  3881. id="guide935"
  3882. orientation="0,-1"
  3883. position="48.905566,21.496227" />
  3884. <sodipodi:guide
  3885. id="guide937"
  3886. orientation="0,-1"
  3887. position="48.846455,18.760196" />
  3888. <sodipodi:guide
  3889. id="guide939"
  3890. orientation="0,-1"
  3891. position="47.707611,13.248413" />
  3892. </sodipodi:namedview>
  3893. <metadata
  3894. id="metadata1002">
  3895. <rdf:RDF>
  3896. <cc:Work
  3897. rdf:about="">
  3898. <dc:format>image/svg+xml</dc:format>
  3899. <dc:type
  3900. rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
  3901. <dc:title />
  3902. </cc:Work>
  3903. </rdf:RDF>
  3904. </metadata>
  3905. <g
  3906. transform="translate(-49.496701,-130.29999)"
  3907. id="layer1"
  3908. inkscape:groupmode="layer"
  3909. inkscape:label="Layer 1">
  3910. <path
  3911. transform="matrix(0.35499659,0,0,-0.53311774,35.565007,165.64086)"
  3912. inkscape:transform-center-y="-3.2714685"
  3913. inkscape:transform-center-x="1.1137021e-06"
  3914. inkscape:randomized="0"
  3915. inkscape:rounded="0"
  3916. inkscape:flatsided="true"
  3917. sodipodi:arg2="2.6179939"
  3918. sodipodi:arg1="1.5707963"
  3919. sodipodi:r2="8.4144154"
  3920. sodipodi:r1="16.828831"
  3921. sodipodi:cy="32.204994"
  3922. sodipodi:cx="120.20919"
  3923. sodipodi:sides="3"
  3924. id="path1354"
  3925. style="fill:url(#linearGradient1158);fill-opacity:1;stroke:#000000;stroke-width:0.574667;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
  3926. sodipodi:type="star"
  3927. d="M 120.20919,49.033825 105.635,23.790579 l 29.14839,-1e-6 z" />
  3928. <path
  3929. inkscape:transform-center-x="1.0041159e-06"
  3930. sodipodi:type="star"
  3931. style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.00573;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
  3932. id="path1360"
  3933. sodipodi:sides="3"
  3934. sodipodi:cx="120.20919"
  3935. sodipodi:cy="32.204994"
  3936. sodipodi:r1="16.828831"
  3937. sodipodi:r2="8.4144154"
  3938. sodipodi:arg1="1.5707963"
  3939. sodipodi:arg2="2.6179939"
  3940. inkscape:flatsided="true"
  3941. inkscape:rounded="0"
  3942. inkscape:randomized="0"
  3943. inkscape:transform-center-y="-1.8692973"
  3944. transform="matrix(0.20284289,0,0,-0.30462022,53.855276,146.74714)"
  3945. d="M 120.20919,49.033825 105.635,23.790579 l 29.14839,-1e-6 z" />
  3946. <path
  3947. sodipodi:nodetypes="cc"
  3948. inkscape:connector-curvature="0"
  3949. id="path2414"
  3950. d="m 79.168509,141.91816 c 1.934125,3.70083 4.022425,5.90565 5.851055,6.5019"
  3951. style="fill:none;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
  3952. <path
  3953. style="fill:none;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
  3954. d="m 77.309218,141.91816 c -1.93412,3.70083 -4.022431,5.90565 -5.851059,6.5019"
  3955. id="path4798"
  3956. inkscape:connector-curvature="0"
  3957. sodipodi:nodetypes="cc" />
  3958. <text
  3959. style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88056px;line-height:1.25;font-family:monospace;-inkscape-font-specification:monospace;text-align:start;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect1766);fill:#000000;fill-opacity:1;stroke:none;"
  3960. id="text1764"
  3961. xml:space="preserve" />
  3962. <!-- air middle -->
  3963. <ellipse
  3964. style="fill:${color.middle.air};fill-opacity:1;stroke:#000000;stroke-width:0.25;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
  3965. id="ellipse1816"
  3966. cx="96.767349"
  3967. cy="146.28188"
  3968. rx="2.4822698"
  3969. ry="1.534127" />
  3970. <!-- air bottom = green -->
  3971. <ellipse
  3972. ry="2.6319511"
  3973. rx="5.2639022"
  3974. cy="150.54318"
  3975. cx="96.767349"
  3976. id="ellipse1818"
  3977. style="fill:#00ff00;fill-opacity:1;stroke:#000000;stroke-width:0.25;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0" />
  3978. <ellipse
  3979. ry="0.92686599"
  3980. rx="1.4997007"
  3981. cy="138.50757"
  3982. cx="96.767349"
  3983. id="ellipse1820"
  3984. style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.25;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0" />
  3985. <!-- air top = red -->
  3986. <ellipse
  3987. style="fill:#ff0000;fill-opacity:1;stroke:#000000;stroke-width:0.25;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
  3988. id="ellipse2412"
  3989. cx="96.767349"
  3990. cy="142.0704"
  3991. rx="5.2639022"
  3992. ry="2.6319511" />
  3993. <circle
  3994. r="3.0492694"
  3995. style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.25;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
  3996. id="circle1860"
  3997. cx="96.77066"
  3998. cy="134.47426" />
  3999. <path
  4000. sodipodi:type="star"
  4001. style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.00573;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
  4002. id="path1025"
  4003. sodipodi:sides="3"
  4004. sodipodi:cx="120.20919"
  4005. sodipodi:cy="32.204994"
  4006. sodipodi:r1="16.828831"
  4007. sodipodi:r2="8.4144154"
  4008. sodipodi:arg1="1.5707963"
  4009. sodipodi:arg2="2.6179939"
  4010. inkscape:flatsided="true"
  4011. inkscape:rounded="0"
  4012. inkscape:randomized="0"
  4013. inkscape:transform-center-y="1.8692966"
  4014. transform="matrix(0.20284291,0,0,0.30462024,35.542288,124.69572)"
  4015. d="M 120.20919,49.033825 105.635,23.790579 l 29.14839,-1e-6 z" />
  4016. <path
  4017. transform="matrix(0.35499659,0,0,0.53311774,17.252018,126.94926)"
  4018. inkscape:transform-center-y="3.2714685"
  4019. inkscape:transform-center-x="1.1137021e-06"
  4020. inkscape:randomized="0"
  4021. inkscape:rounded="0"
  4022. inkscape:flatsided="true"
  4023. sodipodi:arg2="2.6179939"
  4024. sodipodi:arg1="1.5707963"
  4025. sodipodi:r2="8.4144154"
  4026. sodipodi:r1="16.828831"
  4027. sodipodi:cy="32.204994"
  4028. sodipodi:cx="120.20919"
  4029. sodipodi:sides="3"
  4030. id="path196"
  4031. style="fill:url(#linearGradient953);fill-opacity:1;stroke:#000000;stroke-width:0.574667;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
  4032. sodipodi:type="star"
  4033. d="M 120.20919,49.033825 105.635,23.790579 l 29.14839,-1e-6 z" />
  4034. <g
  4035. transform="translate(0,-0.23195425)"
  4036. id="g1005">
  4037. <path
  4038. style="fill:none;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
  4039. d="m 60.952953,150.65508 c -0.795942,2.95292 -0.388135,9.12065 1.196325,13.61511"
  4040. id="path1009"
  4041. inkscape:connector-curvature="0"
  4042. sodipodi:nodetypes="cc" />
  4043. <path
  4044. sodipodi:nodetypes="cc"
  4045. inkscape:connector-curvature="0"
  4046. id="path1001"
  4047. d="m 58.899912,150.65508 c 0.795942,2.95292 0.388135,9.12065 -1.196325,13.61511"
  4048. style="fill:none;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
  4049. </g>
  4050. <path
  4051. inkscape:connector-curvature="0"
  4052. id="path2212"
  4053. d="m 114.82582,139.48181 2.57522,6.72882 -2.57522,6.72881 -2.57521,-6.72881 z"
  4054. style="fill:url(#linearGradient1227);fill-opacity:1;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
  4055. <path
  4056. style="fill:none;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
  4057. d="m 114.82582,131.79221 1.47147,3.8448 -1.47147,3.8448 -1.47146,-3.8448 z"
  4058. id="path2309"
  4059. inkscape:connector-curvature="0" />
  4060. <path
  4061. sodipodi:nodetypes="cc"
  4062. inkscape:connector-curvature="0"
  4063. id="path4859"
  4064. d="m 115.75377,141.90647 c 1.93412,3.70083 4.02243,5.90565 5.85106,6.5019"
  4065. style="fill:none;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
  4066. <path
  4067. style="fill:none;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
  4068. d="m 113.89448,141.90647 c -1.93412,3.70083 -4.02243,5.90565 -5.85106,6.5019"
  4069. id="path4861"
  4070. inkscape:connector-curvature="0"
  4071. sodipodi:nodetypes="cc" />
  4072. <g
  4073. transform="translate(0,-0.49254013)"
  4074. id="g1024">
  4075. <path
  4076. sodipodi:nodetypes="cc"
  4077. inkscape:connector-curvature="0"
  4078. id="path1014"
  4079. d="m 115.89104,150.65508 c -0.79595,2.95292 -0.38814,9.12065 1.19632,13.61511"
  4080. style="fill:none;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
  4081. <path
  4082. style="fill:none;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
  4083. d="m 113.76108,150.65508 c 0.79595,2.95292 0.38814,9.12065 -1.19632,13.61511"
  4084. id="path1016"
  4085. inkscape:connector-curvature="0"
  4086. sodipodi:nodetypes="cc" />
  4087. </g>
  4088. <g
  4089. id="g137">
  4090. <circle
  4091. transform="rotate(-12.964937)"
  4092. r="1.37503"
  4093. cy="151.64958"
  4094. cx="33.121284"
  4095. id="circle2182"
  4096. style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.25;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0" />
  4097. <circle
  4098. style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.25;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
  4099. id="circle2186"
  4100. cx="34.192848"
  4101. cy="156.75101"
  4102. r="1.37503"
  4103. transform="rotate(-12.964937)" />
  4104. <circle
  4105. transform="rotate(-12.964937)"
  4106. r="1.37503"
  4107. cy="161.85565"
  4108. cx="33.121284"
  4109. id="circle2188"
  4110. style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.25;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0" />
  4111. <path
  4112. style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
  4113. d="m 67.428238,141.22636 1.138883,2.46236"
  4114. id="path117" />
  4115. <path
  4116. style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
  4117. d="m 66.197057,141.7958 1.138884,2.46236"
  4118. id="path119" />
  4119. <path
  4120. style="fill:none;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
  4121. d="m 67.847489,146.31337 0.05249,2.71248"
  4122. id="path126" />
  4123. <path
  4124. style="fill:none;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
  4125. d="m 69.203727,146.28713 0.05249,2.71247"
  4126. id="path128" />
  4127. </g>
  4128. <g
  4129. transform="matrix(-1,0,0,1,119.8348,0)"
  4130. id="g153">
  4131. <circle
  4132. style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.25;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
  4133. id="circle139"
  4134. cx="33.121284"
  4135. cy="151.64958"
  4136. r="1.37503"
  4137. transform="rotate(-12.964937)" />
  4138. <circle
  4139. transform="rotate(-12.964937)"
  4140. r="1.37503"
  4141. cy="156.75101"
  4142. cx="34.192848"
  4143. id="circle141"
  4144. style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.25;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0" />
  4145. <circle
  4146. style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.25;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
  4147. id="circle143"
  4148. cx="33.121284"
  4149. cy="161.85565"
  4150. r="1.37503"
  4151. transform="rotate(-12.964937)" />
  4152. <path
  4153. id="path145"
  4154. d="m 67.428238,141.22636 1.138883,2.46236"
  4155. style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
  4156. <path
  4157. id="path147"
  4158. d="m 66.197057,141.7958 1.138884,2.46236"
  4159. style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
  4160. <path
  4161. id="path149"
  4162. d="m 67.847489,146.31337 0.05249,2.71248"
  4163. style="fill:none;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
  4164. <path
  4165. id="path151"
  4166. d="m 69.203727,146.28713 0.05249,2.71247"
  4167. style="fill:none;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
  4168. </g>
  4169. <g
  4170. transform="translate(36.559604)"
  4171. id="g169">
  4172. <circle
  4173. style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.25;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
  4174. id="circle155"
  4175. cx="33.121284"
  4176. cy="151.64958"
  4177. r="1.37503"
  4178. transform="rotate(-12.964937)" />
  4179. <circle
  4180. transform="rotate(-12.964937)"
  4181. r="1.37503"
  4182. cy="156.75101"
  4183. cx="34.192848"
  4184. id="circle157"
  4185. style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.25;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0" />
  4186. <circle
  4187. style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.25;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
  4188. id="circle159"
  4189. cx="33.121284"
  4190. cy="161.85565"
  4191. r="1.37503"
  4192. transform="rotate(-12.964937)" />
  4193. <path
  4194. id="path161"
  4195. d="m 67.428238,141.22636 1.138883,2.46236"
  4196. style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
  4197. <path
  4198. id="path163"
  4199. d="m 66.197057,141.7958 1.138884,2.46236"
  4200. style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
  4201. <path
  4202. id="path165"
  4203. d="m 67.847489,146.31337 0.05249,2.71248"
  4204. style="fill:none;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
  4205. <path
  4206. id="path167"
  4207. d="m 69.203727,146.28713 0.05249,2.71247"
  4208. style="fill:none;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
  4209. </g>
  4210. <g
  4211. id="g185"
  4212. transform="matrix(-1,0,0,1,156.9543,0)">
  4213. <circle
  4214. transform="rotate(-12.964937)"
  4215. r="1.37503"
  4216. cy="151.64958"
  4217. cx="33.121284"
  4218. id="circle171"
  4219. style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.25;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0" />
  4220. <circle
  4221. style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.25;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
  4222. id="circle173"
  4223. cx="34.192848"
  4224. cy="156.75101"
  4225. r="1.37503"
  4226. transform="rotate(-12.964937)" />
  4227. <circle
  4228. transform="rotate(-12.964937)"
  4229. r="1.37503"
  4230. cy="161.85565"
  4231. cx="33.121284"
  4232. id="circle175"
  4233. style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.25;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0" />
  4234. <path
  4235. style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
  4236. d="m 67.428238,141.22636 1.138883,2.46236"
  4237. id="path177" />
  4238. <path
  4239. style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
  4240. d="m 66.197057,141.7958 1.138884,2.46236"
  4241. id="path179" />
  4242. <path
  4243. style="fill:none;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
  4244. d="m 67.847489,146.31337 0.05249,2.71248"
  4245. id="path181" />
  4246. <path
  4247. style="fill:none;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
  4248. d="m 69.203727,146.28713 0.05249,2.71247"
  4249. id="path183" />
  4250. </g>
  4251. <g
  4252. transform="translate(-0.56042484,0.19809781)"
  4253. id="g210">
  4254. <circle
  4255. style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.25;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
  4256. id="circle1468"
  4257. cx="-74.280235"
  4258. cy="154.16206"
  4259. r="1.37503"
  4260. transform="scale(-1,1)" />
  4261. <circle
  4262. transform="scale(-1,1)"
  4263. r="1.37503"
  4264. cy="159.2635"
  4265. cx="-73.208672"
  4266. id="circle1472"
  4267. style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.25;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0" />
  4268. <circle
  4269. style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.25;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
  4270. id="circle1474"
  4271. cx="-74.280235"
  4272. cy="164.36815"
  4273. r="1.37503"
  4274. transform="scale(-1,1)" />
  4275. <path
  4276. style="fill:none;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
  4277. d="m 73.377004,155.26649 -0.557407,2.6551"
  4278. id="path192" />
  4279. <path
  4280. style="fill:none;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
  4281. d="m 74.704555,155.54519 -0.557407,2.6551"
  4282. id="path197" />
  4283. <path
  4284. style="fill:none;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
  4285. d="m 74.109734,160.31788 0.557407,2.6551"
  4286. id="path199" />
  4287. <path
  4288. style="fill:none;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
  4289. d="m 72.782182,160.59658 0.557408,2.6551"
  4290. id="path201" />
  4291. </g>
  4292. <g
  4293. transform="matrix(-1,0,0,1,157.04387,0.19809781)"
  4294. id="g226">
  4295. <circle
  4296. transform="scale(-1,1)"
  4297. r="1.37503"
  4298. cy="154.16206"
  4299. cx="-74.280235"
  4300. id="circle212"
  4301. style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.25;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0" />
  4302. <circle
  4303. style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.25;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
  4304. id="circle214"
  4305. cx="-73.208672"
  4306. cy="159.2635"
  4307. r="1.37503"
  4308. transform="scale(-1,1)" />
  4309. <circle
  4310. transform="scale(-1,1)"
  4311. r="1.37503"
  4312. cy="164.36815"
  4313. cx="-74.280235"
  4314. id="circle216"
  4315. style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.25;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0" />
  4316. <path
  4317. id="path218"
  4318. d="m 73.377004,155.26649 -0.557407,2.6551"
  4319. style="fill:none;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
  4320. <path
  4321. id="path220"
  4322. d="m 74.704555,155.54519 -0.557407,2.6551"
  4323. style="fill:none;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
  4324. <path
  4325. id="path222"
  4326. d="m 74.109734,160.31788 0.557407,2.6551"
  4327. style="fill:none;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
  4328. <path
  4329. id="path224"
  4330. d="m 72.782182,160.59658 0.557408,2.6551"
  4331. style="fill:none;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
  4332. </g>
  4333. <g
  4334. id="g242"
  4335. transform="translate(17.968689,-0.59775811)">
  4336. <circle
  4337. transform="scale(-1,1)"
  4338. r="1.37503"
  4339. cy="154.16206"
  4340. cx="-74.280235"
  4341. id="circle228"
  4342. style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.25;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0" />
  4343. <circle
  4344. style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.25;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
  4345. id="circle230"
  4346. cx="-73.208672"
  4347. cy="159.2635"
  4348. r="1.37503"
  4349. transform="scale(-1,1)" />
  4350. <circle
  4351. transform="scale(-1,1)"
  4352. r="1.37503"
  4353. cy="164.36815"
  4354. cx="-74.280235"
  4355. id="circle232"
  4356. style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.25;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0" />
  4357. <path
  4358. id="path234"
  4359. d="m 73.377004,155.26649 -0.557407,2.6551"
  4360. style="fill:none;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
  4361. <path
  4362. id="path236"
  4363. d="m 74.704555,155.54519 -0.557407,2.6551"
  4364. style="fill:none;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
  4365. <path
  4366. id="path238"
  4367. d="m 74.109734,160.31788 0.557407,2.6551"
  4368. style="fill:none;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
  4369. <path
  4370. id="path240"
  4371. d="m 72.782182,160.59658 0.557408,2.6551"
  4372. style="fill:none;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
  4373. </g>
  4374. <g
  4375. id="g258"
  4376. transform="matrix(-1,0,0,1,175.57298,-0.59775811)">
  4377. <circle
  4378. style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.25;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
  4379. id="circle244"
  4380. cx="-74.280235"
  4381. cy="154.16206"
  4382. r="1.37503"
  4383. transform="scale(-1,1)" />
  4384. <circle
  4385. transform="scale(-1,1)"
  4386. r="1.37503"
  4387. cy="159.2635"
  4388. cx="-73.208672"
  4389. id="circle246"
  4390. style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.25;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0" />
  4391. <circle
  4392. style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.25;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
  4393. id="circle248"
  4394. cx="-74.280235"
  4395. cy="164.36815"
  4396. r="1.37503"
  4397. transform="scale(-1,1)" />
  4398. <path
  4399. style="fill:none;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
  4400. d="m 73.377004,155.26649 -0.557407,2.6551"
  4401. id="path250" />
  4402. <path
  4403. style="fill:none;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
  4404. d="m 74.704555,155.54519 -0.557407,2.6551"
  4405. id="path252" />
  4406. <path
  4407. style="fill:none;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
  4408. d="m 74.109734,160.31788 0.557407,2.6551"
  4409. id="path254" />
  4410. <path
  4411. style="fill:none;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
  4412. d="m 72.782182,160.59658 0.557408,2.6551"
  4413. id="path256" />
  4414. </g>
  4415. </g>
  4416. </svg>
  4417. `;
  4418. // xml header only needed for standalone svg file
  4419. const svg_three_hands = `
  4420. <!--
  4421. <?xml version="1.0" encoding="UTF-8" standalone="no"?>
  4422. -->
  4423. <svg
  4424. xmlns:dc="http://purl.org/dc/elements/1.1/"
  4425. xmlns:cc="http://creativecommons.org/ns#"
  4426. xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  4427. xmlns:svg="http://www.w3.org/2000/svg"
  4428. xmlns="http://www.w3.org/2000/svg"
  4429. xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
  4430. xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
  4431. width="158.22539mm"
  4432. height="113.21396mm"
  4433. viewBox="0 0 158.22539 113.21396"
  4434. version="1.1"
  4435. id="svg8"
  4436. inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
  4437. sodipodi:docname="three-hands.svg"
  4438. inkscape:export-filename="/home/user/doc/alchi/alchi hands wrist size test 2019-04-03.svg.png"
  4439. inkscape:export-xdpi="199"
  4440. inkscape:export-ydpi="199">
  4441. <defs
  4442. id="defs2">
  4443. <marker
  4444. inkscape:isstock="true"
  4445. style="overflow:visible"
  4446. id="marker1750"
  4447. refX="0"
  4448. refY="0"
  4449. orient="auto"
  4450. inkscape:stockid="Arrow1Mend">
  4451. <path
  4452. transform="matrix(-0.4,0,0,-0.4,-4,0)"
  4453. style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
  4454. d="M 0,0 5,-5 -12.5,0 5,5 Z"
  4455. id="path1748"
  4456. inkscape:connector-curvature="0" />
  4457. </marker>
  4458. <marker
  4459. inkscape:stockid="Arrow1Mend"
  4460. orient="auto"
  4461. refY="0"
  4462. refX="0"
  4463. id="Arrow1Mend"
  4464. style="overflow:visible"
  4465. inkscape:isstock="true"
  4466. inkscape:collect="always">
  4467. <path
  4468. id="path1135"
  4469. d="M 0,0 5,-5 -12.5,0 5,5 Z"
  4470. style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
  4471. transform="matrix(-0.4,0,0,-0.4,-4,0)"
  4472. inkscape:connector-curvature="0" />
  4473. </marker>
  4474. <marker
  4475. inkscape:stockid="Arrow1Lend"
  4476. orient="auto"
  4477. refY="0"
  4478. refX="0"
  4479. id="Arrow1Lend"
  4480. style="overflow:visible"
  4481. inkscape:isstock="true">
  4482. <path
  4483. id="path1129"
  4484. d="M 0,0 5,-5 -12.5,0 5,5 Z"
  4485. style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
  4486. transform="matrix(-0.8,0,0,-0.8,-10,0)"
  4487. inkscape:connector-curvature="0" />
  4488. </marker>
  4489. <marker
  4490. inkscape:stockid="Arrow1Lstart"
  4491. orient="auto"
  4492. refY="0"
  4493. refX="0"
  4494. id="marker1590"
  4495. style="overflow:visible"
  4496. inkscape:isstock="true">
  4497. <path
  4498. id="path1588"
  4499. d="M 0,0 5,-5 -12.5,0 5,5 Z"
  4500. style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
  4501. transform="matrix(0.8,0,0,0.8,10,0)"
  4502. inkscape:connector-curvature="0" />
  4503. </marker>
  4504. <marker
  4505. inkscape:stockid="Arrow1Lstart"
  4506. orient="auto"
  4507. refY="0"
  4508. refX="0"
  4509. id="marker1514"
  4510. style="overflow:visible"
  4511. inkscape:isstock="true">
  4512. <path
  4513. id="path1512"
  4514. d="M 0,0 5,-5 -12.5,0 5,5 Z"
  4515. style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
  4516. transform="matrix(0.8,0,0,0.8,10,0)"
  4517. inkscape:connector-curvature="0" />
  4518. </marker>
  4519. <marker
  4520. inkscape:stockid="Arrow1Lstart"
  4521. orient="auto"
  4522. refY="0"
  4523. refX="0"
  4524. id="marker1450"
  4525. style="overflow:visible"
  4526. inkscape:isstock="true">
  4527. <path
  4528. id="path1448"
  4529. d="M 0,0 5,-5 -12.5,0 5,5 Z"
  4530. style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
  4531. transform="matrix(0.8,0,0,0.8,10,0)"
  4532. inkscape:connector-curvature="0" />
  4533. </marker>
  4534. <marker
  4535. inkscape:stockid="Arrow1Lstart"
  4536. orient="auto"
  4537. refY="0"
  4538. refX="0"
  4539. id="marker1410"
  4540. style="overflow:visible"
  4541. inkscape:isstock="true">
  4542. <path
  4543. id="path1408"
  4544. d="M 0,0 5,-5 -12.5,0 5,5 Z"
  4545. style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
  4546. transform="matrix(0.8,0,0,0.8,10,0)"
  4547. inkscape:connector-curvature="0" />
  4548. </marker>
  4549. <marker
  4550. inkscape:stockid="Arrow1Lstart"
  4551. orient="auto"
  4552. refY="0"
  4553. refX="0"
  4554. id="Arrow1Lstart"
  4555. style="overflow:visible"
  4556. inkscape:isstock="true">
  4557. <path
  4558. id="path1126"
  4559. d="M 0,0 5,-5 -12.5,0 5,5 Z"
  4560. style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
  4561. transform="matrix(0.8,0,0,0.8,10,0)"
  4562. inkscape:connector-curvature="0" />
  4563. </marker>
  4564. </defs>
  4565. <sodipodi:namedview
  4566. id="base"
  4567. pagecolor="#ffffff"
  4568. bordercolor="#666666"
  4569. borderopacity="1.0"
  4570. inkscape:pageopacity="0.0"
  4571. inkscape:pageshadow="2"
  4572. inkscape:zoom="1.4142136"
  4573. inkscape:cx="367.64485"
  4574. inkscape:cy="255.66586"
  4575. inkscape:document-units="mm"
  4576. inkscape:current-layer="layer1"
  4577. showgrid="false"
  4578. inkscape:window-width="1440"
  4579. inkscape:window-height="835"
  4580. inkscape:window-x="0"
  4581. inkscape:window-y="0"
  4582. inkscape:window-maximized="1"
  4583. showguides="true"
  4584. inkscape:guide-bbox="true"
  4585. fit-margin-top="2"
  4586. fit-margin-left="2"
  4587. fit-margin-right="2"
  4588. fit-margin-bottom="2"
  4589. inkscape:document-rotation="0"
  4590. lock-margins="true" />
  4591. <metadata
  4592. id="metadata5">
  4593. <rdf:RDF>
  4594. <cc:Work
  4595. rdf:about="">
  4596. <dc:format>image/svg+xml</dc:format>
  4597. <dc:type
  4598. rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
  4599. <dc:title />
  4600. </cc:Work>
  4601. </rdf:RDF>
  4602. </metadata>
  4603. <g
  4604. inkscape:label="Layer 1"
  4605. inkscape:groupmode="layer"
  4606. id="layer1"
  4607. transform="translate(-38.506274,-140.83657)">
  4608. <path
  4609. style="fill:#ffff41;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
  4610. d="m 65.734413,250.57877 c 0,0 1.37016,-29.31678 1.55915,-32.34059 0.0697,-1.11573 0.3025,-4.26463 0.5326,-5.79524 l 1.101647,-4.30403 c -0.439771,-0.26418 -1.437529,-0.90339 -1.99009,-1.6727 -2.139607,1.92645 -4.711031,2.57948 -5.443526,1.50721 -1.825734,-2.67263 4.114402,-6.09791 5.536307,-6.31638 0.389939,-0.0599 2.218211,0.17752 3.982475,0.68445 0.33073,-0.8032 1.430517,-3.71083 1.808487,-5.26998 0.37798,-1.55915 0.79984,-4.02787 0.89434,-6.24848 0.0945,-2.22061 0.0783,-3.10782 0.0783,-3.48579 0,-0.37798 0.2558,-2.45546 0.3503,-3.11692 0.0945,-0.66146 0.96856,-5.90587 1.06305,-7.27604 0.0945,-1.37016 0.47784,-4.03457 0.11812,-5.95312 -0.2209,-1.17817 -1.13393,-0.44885 -1.79538,0.80319 -0.67702,1.2815 -0.75596,1.96076 -1.32292,3.96876 -0.29528,1.04579 -1.13393,3.49627 -1.51191,4.81919 -0.37797,1.32292 -1.19124,5.58916 -1.75821,5.44742 -0.56697,-0.14174 0.81327,-5.21118 1.33299,-7.14831 0.51972,-1.93713 2.55855,-9.48765 2.87257,-11.17856 0.30711,-1.65364 0.67362,-4.25623 -0.18899,-4.53571 -1.11977,-0.3628 -2.17558,2.28516 -3.1183,5.05543 -0.70888,2.0831 -2.82532,8.62722 -3.2033,9.85564 -0.37798,1.22842 -2.26172,6.86205 -2.59245,6.67306 -0.33073,-0.18899 1.31678,-6.1061 1.60026,-7.66525 0.28348,-1.55915 0.99219,-4.44122 1.46466,-5.95313 0.47247,-1.5119 1.2048,-5.26804 1.34654,-6.77994 0.14174,-1.51191 0.15009,-3.17351 -0.59059,-3.28367 -0.76293,-0.11347 -1.62878,1.01644 -2.38597,2.50409 -1.12385,2.208 -1.88922,4.9313 -2.57497,7.32329 -0.39664,1.38356 -1.18117,3.96876 -1.65364,5.85864 -0.395628,1.58251 -1.730537,7.20759 -2.344748,6.92411 -0.614212,-0.28348 0.953291,-6.32201 1.541547,-8.53052 0.566386,-2.1264 0.666946,-2.7346 1.141051,-4.64454 0.48399,-1.94975 0.45821,-1.60378 0.67243,-2.98647 0.30596,-1.97482 0.86478,-3.3574 -0.2219,-3.82987 -1.086686,-0.47247 -1.63887,0.53623 -2.982297,2.86922 -1.393244,2.4195 -1.954731,4.02016 -2.663436,6.09903 -0.708705,2.07887 -2.814845,8.87729 -3.018216,9.57951 0.02456,-0.83167 0.100481,-1.55071 0.09262,-2.32876 -0.01146,-1.13393 0.188032,-2.32649 0.199466,-4.12434 0.01058,-1.6633 -0.12486,-3.12284 -0.362458,-3.78381 -0.286249,-0.79631 -0.676688,-1.71641 -1.881488,-1.19669 -1.13393,1.2048 -0.894919,2.24651 -1.464657,3.55875 -0.501025,1.15399 -1.067093,2.61911 -1.371555,3.95688 -0.251855,1.10661 -0.660069,4.20163 -1.038045,5.19382 -0.377976,0.99218 -1.181174,1.93712 -1.181174,2.97656 0,1.03943 1.181174,3.9215 1.511903,5.10268 0.330729,1.18117 0.992188,4.81919 1.417413,5.81138 0.425222,0.99219 1.322916,1.22842 1.842632,2.64583 0.740502,1.88953 0.129344,5.47625 0.129344,5.47625 3.289157,0.42904 4.402447,2.43948 3.77946,3.69718 -0.492722,0.99472 -1.419866,0.66661 -3.28694,0.34244 1.686528,0.3267 5.219787,1.29895 4.511551,3.52622 -0.601405,1.8913 -2.943749,0.76494 -4.899526,0.58395 2.744832,0.57413 6.213296,1.97738 5.429089,3.59873 -0.84458,1.74618 -4.832514,0.50845 -6.816517,0.12561 3.459791,0.7031 4.269615,1.8226 3.922403,2.52475 -0.572822,1.15838 -2.187951,1.81263 -5.149962,1.71265 -0.321051,1.157 -0.699205,3.00473 -1.080906,4.52772 -0.33073,1.93712 -0.969669,4.52686 -1.442138,7.50342 -0.472469,2.97657 -2.371849,11.64373 -2.844318,13.20289"
  4611. id="path95-3"
  4612. inkscape:connector-curvature="0"
  4613. sodipodi:nodetypes="cscccsscscscsssssscssssssscssssssssssscssscsscsccccscscscsccsc" />
  4614. <path
  4615. style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
  4616. d="m 53.434874,189.27789 c -0.712065,-2.93325 -0.232038,-4.44174 -0.160331,-5.38395 0.03341,-0.43899 0.07973,-1.3017 0.09583,-1.65817"
  4617. id="path97-6"
  4618. inkscape:connector-curvature="0"
  4619. sodipodi:nodetypes="csc" />
  4620. <path
  4621. style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
  4622. d="m 45.874608,209.95817 c -1.365898,-3.76955 1.681117,-4.55145 4.5249,-4.49522 1.928055,0.0381 5.102898,1.13014 4.754445,3.35673 -0.299038,1.91083 -2.54633,1.05929 -3.957874,0.61883"
  4623. id="path54"
  4624. sodipodi:nodetypes="cssc" />
  4625. <path
  4626. style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
  4627. d="m 47.373696,226.65364 c -2.17042,-0.78142 -3.385651,-1.75527 -3.847719,-3.81573 -0.811057,-4.89614 3.774646,-5.86667 6.758633,-5.39375 m -6.005255,1.54363 c -1.332617,-2.43868 -0.630183,-3.8034 0.993177,-4.86573 -0.914482,-1.34932 -0.801374,-2.23276 -0.442278,-2.9835 1.038364,-2.17084 5.090909,-2.05314 7.067211,-1.54749 1.390173,0.34066 4.931735,1.18252 4.302567,3.63592 -0.479788,1.8709 -4.342618,0.44904 -4.87136,0.44627 2.972242,0.85961 5.719354,1.78274 5.562005,3.16306 -0.290658,2.54975 -5.562895,0.71341 -6.606067,0.60784 1.430311,0.28365 4.002863,1.21503 3.659637,2.40145 -0.730798,2.1548 -5.269671,1.77197 -6.226678,1.76186 m -2.445037,-7.48541 c 1.71155,-1.1577 4.293745,-0.87123 6.05614,-0.4488"
  4628. id="path103-3"
  4629. inkscape:connector-curvature="0"
  4630. sodipodi:nodetypes="cccccscscsccccc" />
  4631. <path
  4632. style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
  4633. d="m 87.160843,214.68372 c -3.355865,0.0179 -7.926806,-1.22825 -8.77828,-1.92265 -0.968775,-0.79006 -2.845344,-7.86165 -4.027431,-8.99273 -1.182087,-1.13108 -6.077027,-2.17018 -7.268112,-2.16055 -1.891845,0.0153 -7.308394,4.40664 -5.598002,6.24831 1.190637,1.28202 3.463644,0.36351 5.36908,-1.39443 0.76135,0.64898 0.850881,1.04258 2.069712,1.67724 0,0 -1.279346,2.83185 -1.467077,7.91515 -0.03822,0.81626 -0.320242,3.64282 -0.367243,4.85271 -0.05636,1.4509 -0.334297,5.42759 -0.374473,8.72377 3.13887,-0.12885 16.989896,0.32711 19.832659,1.09016"
  4634. id="path115-2"
  4635. inkscape:connector-curvature="0"
  4636. sodipodi:nodetypes="cszsscccscc" />
  4637. <path
  4638. style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
  4639. d="m 64.982314,152.92736 -2.40543,7.75082"
  4640. id="path319"
  4641. inkscape:connector-curvature="0" />
  4642. <text
  4643. xml:space="preserve"
  4644. style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9.87778px;line-height:1.25;font-family:monospace;-inkscape-font-specification:monospace;letter-spacing:0px;word-spacing:0px;fill:#010101;fill-opacity:1;stroke:none;stroke-width:0.264583"
  4645. x="58.454838"
  4646. y="197.80933"
  4647. id="text2134"><tspan
  4648. sodipodi:role="line"
  4649. id="tspan2132"
  4650. x="58.454838"
  4651. y="197.80933"
  4652. style="font-size:12px;stroke-width:0.264583">3</tspan></text>
  4653. <path
  4654. style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
  4655. d="m 119.78299,249.73529 c 0,0 0.74958,-17.08094 0.93857,-20.10475 m 4.04268,-27.3526 c 0.33073,-0.8032 1.72783,-4.49076 2.10581,-6.04991 0.37797,-1.55915 1.13393,-5.19717 1.22842,-7.41778 0.0945,-2.22061 -0.18899,-2.74033 -0.18899,-3.1183 0,-0.37798 0.18899,-1.65365 0.28349,-2.31511 0.0945,-0.66146 1.27249,-5.96337 1.46465,-7.32329 0.3071,-2.17336 0.95441,-4.48428 0.0473,-5.62239 -0.41647,-0.5225 -1.93246,-0.79085 -2.55134,0.51971 -0.4016,0.85045 -1.03943,2.78758 -1.27567,4.1105 -0.19103,1.06976 -0.75595,3.35453 -1.13393,4.67745 -0.37797,1.32292 -0.60408,3.11226 -1.03943,2.92932 -0.42352,-0.17797 0.0945,-2.69308 0.61421,-4.63021 0.51972,-1.93713 1.79539,-7.41778 2.26786,-9.07143 0.47247,-1.65364 1.55915,-3.73252 -0.51972,-4.77195 -2.07887,-1.03943 -2.64583,2.50409 -3.59077,5.00818 -0.77687,2.05871 -1.98438,7.11068 -2.36235,8.3391 -0.37798,1.22842 -0.6117,2.3683 -1.06306,2.24424 -0.466,-0.12808 0.2008,-1.92532 0.62602,-3.44903 0.42597,-1.52639 1.004,-4.15774 1.47647,-5.66965 0.47247,-1.5119 2.22061,-6.14211 2.36235,-7.65401 0.14174,-1.51191 -0.56696,-2.45685 -1.6064,-2.78758 -1.03943,-0.33073 -2.07887,0 -2.97656,2.3151 -0.89769,2.31511 -2.03162,6.04763 -2.59859,7.37054 -0.56696,1.32292 -1.44103,4.016 -1.72451,5.6224 -0.28348,1.6064 -0.44216,2.8596 -0.87407,2.64583 -0.42886,-0.21226 0.11306,-2.21587 0.47247,-3.66165 0.41449,-1.66737 0.80805,-3.63905 1.32291,-5.5279 0.52231,-1.91617 1.17396,-4.21163 1.43264,-5.67468 0.17531,-0.99152 0.33983,-2.06978 -0.74686,-2.54225 -1.08668,-0.47247 -2.22298,-0.42042 -3.35691,2.13087 -1.13392,2.55134 -2.14805,6.6294 -2.85676,8.70827 -0.7087,2.07887 -1.22251,6.58506 -1.79541,7.24947 0.124,-1.10145 0.37795,-2.19403 0.47245,-3.98942 0.0945,-1.79539 -0.3241,-3.11647 -0.66146,-3.73252 -0.54334,-0.99218 -1.84439,-1.5934 -2.57497,-1.02762 -0.84617,0.65531 -0.9996,2.8669 -1.7083,3.80611 -0.75777,1.00423 -0.78708,1.67098 -1.20451,3.08825 -0.32065,1.08867 -0.55984,4.66935 -0.93782,5.66154 -0.37798,0.99218 -1.18117,1.93712 -1.18117,2.97656 0,1.03943 1.18117,3.9215 1.5119,5.10268 0.33073,1.18117 0.99219,4.81919 1.41741,5.81138 0.42522,0.99219 1.32292,1.22842 1.84263,2.64583 0.51972,1.41741 0.0897,6.30006 0.0897,6.30006 m -2.7862,16.12334 c 0,0 -0.42183,1.67259 -0.75256,3.60972 -0.33073,1.93712 -0.92608,4.5202 -1.3985,7.49676 -0.472467,2.97657 -2.42851,11.73277 -2.900979,13.29193"
  4656. id="path95"
  4657. inkscape:connector-curvature="0"
  4658. sodipodi:nodetypes="cccscscsssssscssssssccssccssssscsccsssscsccccccsc" />
  4659. <path
  4660. sodipodi:nodetypes="cac"
  4661. style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
  4662. d="m 108.46902,185.29399 c -0.4782,-1.12918 -0.7706,-2.10936 -0.81374,-3.21349 -0.0425,-1.08775 0.36324,-2.08477 0.55223,-3.2187"
  4663. id="path97"
  4664. inkscape:connector-curvature="0" />
  4665. <path
  4666. style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
  4667. d="m 109.19498,155.70439 8.4961,3.15808 m 8.10683,3.06506 7.69014,2.8068"
  4668. id="path2130"
  4669. inkscape:connector-curvature="0"
  4670. sodipodi:nodetypes="cccc" />
  4671. <text
  4672. xml:space="preserve"
  4673. style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9.87778px;line-height:1.25;font-family:monospace;-inkscape-font-specification:monospace;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
  4674. x="109.11175"
  4675. y="194.62601"
  4676. id="text2138"><tspan
  4677. sodipodi:role="line"
  4678. id="tspan2136"
  4679. x="109.11175"
  4680. y="194.62601"
  4681. style="font-size:11px;stroke-width:0.264583">12</tspan></text>
  4682. <path
  4683. sodipodi:nodetypes="cscccszcccscsssssscssssssssssssssssssscsssscsscscccccscscscsccsc"
  4684. inkscape:connector-curvature="0"
  4685. id="path295"
  4686. d="m 174.17303,250.39409 c 0,0 1.37016,-29.31678 1.55915,-32.34059 0.0697,-1.11573 0.34885,-3.15004 0.44535,-5.01473 l 1.22835,-4.89986 c -1.52163,-0.74498 -3.81726,-1.63227 -4.56389,-2.23475 -1.59467,0.73916 -8.89578,1.11221 -10.20469,-1.40073 -1.49064,-2.86185 10.46065,-3.00292 11.64789,-3.09786 1.18724,-0.0949 3.87249,0.57682 4.90905,0.88803 0.4643,-1.2466 1.68498,-3.85785 2.06585,-5.40677 0.38308,-1.5579 0.79984,-4.02787 0.89433,-6.24848 0.0945,-2.22061 0.0783,-3.10782 0.0783,-3.48579 0,-0.37798 2.26032,-9.67174 2.35482,-10.3332 0.0945,-0.66146 0.96856,-5.90587 1.06306,-7.27604 0.0945,-1.37016 0.47783,-4.03457 0.11811,-5.95312 -0.2209,-1.17817 -1.13392,-0.44885 -1.79538,0.80319 -0.67702,1.2815 -0.75596,1.96076 -1.32292,3.96876 -0.29528,1.04579 -1.13393,3.49627 -1.5119,4.81919 -0.37798,1.32292 -1.19125,5.58916 -1.75822,5.44742 -0.56696,-0.14174 0.81327,-5.21118 1.33299,-7.14831 0.51972,-1.93713 1.48947,-6.07996 1.8035,-7.77087 0.3071,-1.65364 0.67362,-4.25623 -0.18899,-4.53571 -1.11978,-0.3628 -2.17558,2.28516 -3.1183,5.05543 -0.70888,2.0831 -1.75625,5.21953 -2.13423,6.44795 -0.37797,1.22842 -2.26171,6.86205 -2.59244,6.67306 -0.33073,-0.18899 1.31677,-6.1061 1.60026,-7.66525 0.28348,-1.55915 1.12582,-4.77531 1.59829,-6.28722 0.47247,-1.5119 0.97853,-3.76957 1.34654,-5.44359 0.4359,-1.98284 0.28373,-3.9085 -0.45695,-4.01866 -0.76293,-0.11347 -1.42833,0.61554 -2.18553,2.10319 -1.12384,2.208 -1.42149,3.26086 -2.10724,5.65285 -0.39665,1.38356 -1.60782,5.55804 -2.255,7.39544 -0.86335,2.45114 -2.06462,7.47486 -2.67883,7.19138 -0.61422,-0.28348 0.95329,-6.32201 1.54154,-8.53052 0.56639,-2.1264 0.66695,-2.7346 1.14105,-4.64454 0.484,-1.94975 1.46522,-4.74223 1.67944,-6.12492 0.30596,-1.97482 0.86478,-3.3574 -0.2219,-3.82987 -1.08668,-0.47247 -1.50523,0.73668 -2.84866,3.06967 -1.39324,2.4195 -3.09537,6.95816 -3.80408,9.03703 -0.7087,2.07887 -4.68844,13.78741 -5.06642,14.16539 0.0141,-0.25976 0.0314,-0.47838 0.0314,-0.59843 0,-0.94494 0.1166,-2.20265 0.10498,-3.35216 -0.0115,-1.13393 0.18803,-2.32649 0.19946,-4.12434 0.0106,-1.6633 -0.12486,-3.12284 -0.36245,-3.78381 -0.28625,-0.79631 -0.67669,-1.71641 -1.88149,-1.19669 -1.13393,1.2048 -0.89492,2.24651 -1.46466,3.55875 -0.50102,1.15399 -1.06709,2.61911 -1.37155,3.95688 -0.25186,1.10661 -0.66007,4.20163 -1.03805,5.19382 -0.37798,0.99218 -1.18117,6.18935 -1.18117,7.22879 0,1.03943 1.18117,3.9215 1.5119,5.10268 0.33073,1.18117 0.99219,4.81919 1.41741,5.81138 0.42522,0.99219 1.32292,1.22842 1.84263,2.64583 0.51972,1.41741 0.78937,3.06869 0.78937,3.06869 l -0.45363,2.58237 c 5.0366,0.67658 14.94189,4.19709 13.33404,6.13948 -1.01841,1.2303 -4.0578,0.32565 -6.24015,-0.15176 0,0 5.43509,1.72195 4.97146,3.73358 -0.42656,1.85083 -7.47339,-0.26131 -7.47339,-0.26131 0,0 5.50948,1.81776 4.99789,3.38461 -0.6275,1.92187 -7.1969,0.0501 -7.1969,0.0501 0,0 5.37917,1.49419 4.57447,3.17197 -1.20074,2.50349 -9.63528,-0.44623 -9.77518,0.063 -0.36124,1.315 -0.73864,2.85567 -0.97705,4.25205 -0.33073,1.93712 -0.98269,4.60924 -1.45516,7.5858 -0.47247,2.97657 -2.37185,11.64373 -2.84432,13.20289"
  4687. style="fill:#0000c0;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
  4688. <path
  4689. sodipodi:nodetypes="cc"
  4690. inkscape:connector-curvature="0"
  4691. id="path297"
  4692. d="m 161.95701,188.45844 c -0.6216,-2.56059 -0.28012,-7.44082 -0.18332,-9.22568"
  4693. style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
  4694. <path
  4695. inkscape:connector-curvature="0"
  4696. id="path1746"
  4697. d="m 173.98659,151.52845 2.40543,-7.75082"
  4698. style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1750)" />
  4699. <text
  4700. xml:space="preserve"
  4701. style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9.87778px;line-height:1.25;font-family:monospace;-inkscape-font-specification:monospace;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
  4702. x="167.42401"
  4703. y="193.33865"
  4704. id="text2142"><tspan
  4705. sodipodi:role="line"
  4706. id="tspan2140"
  4707. x="167.42401"
  4708. y="193.33865"
  4709. style="font-size:12px;fill:#fefefe;stroke-width:0.264583">4</tspan></text>
  4710. <path
  4711. style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
  4712. d="m 66.858098,206.46167 0.742889,-0.77779"
  4713. id="path56" />
  4714. <path
  4715. sodipodi:nodetypes="cssc"
  4716. id="path58"
  4717. d="m 99.877151,209.95817 c -1.365898,-3.76955 1.681119,-4.55145 4.524899,-4.49522 1.92806,0.0381 8.64812,1.34366 8.29967,3.57025 -0.29904,1.91083 -6.09155,0.84577 -7.5031,0.40531"
  4718. style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
  4719. <path
  4720. sodipodi:nodetypes="csccscscsccccccc"
  4721. inkscape:connector-curvature="0"
  4722. id="path60"
  4723. d="m 101.37624,226.65364 c -2.170421,-0.78142 -3.385652,-1.75527 -3.84772,-3.81573 -0.510589,-2.27683 0.459256,-3.47826 0.8043,-3.65357 -1.332617,-2.43868 -0.681105,-3.99995 0.942255,-5.06228 -0.914482,-1.34932 -0.801374,-2.23276 -0.442278,-2.9835 1.038364,-2.17084 5.090913,-2.05314 7.067213,-1.54749 1.39017,0.34066 7.97322,1.60075 7.34406,4.05415 -0.47979,1.8709 -7.38411,0.0308 -7.91285,0.028 2.97224,0.85961 5.96172,1.76787 5.80437,3.14819 -0.29066,2.54975 -6.00679,0.95064 -7.00737,0.6867 1.50407,0.16583 5.24141,1.62421 4.89819,2.81063 -0.7308,2.1548 -6.34929,1.2988 -7.3063,1.28869 m -2.445035,-7.48541 c 1.711555,-1.1577 4.293745,-0.87123 6.056145,-0.4488 m -6.83947,5.44709 c 1.169927,-1.2345 2.67864,-2.23895 5.7954,-1.67619"
  4724. style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
  4725. <path
  4726. sodipodi:nodetypes="cszsscccscc"
  4727. inkscape:connector-curvature="0"
  4728. id="path62"
  4729. d="m 141.16339,214.68372 c -3.35587,0.0179 -7.92681,-1.22825 -8.77828,-1.92265 -0.96878,-0.79006 -2.84535,-7.86165 -4.02743,-8.99273 -1.18209,-1.13108 -6.07703,-2.17018 -7.26812,-2.16055 -1.89184,0.0153 -9.56804,4.84062 -7.85765,6.68229 1.19064,1.28202 5.7233,-0.0705 7.62873,-1.82841 0.76135,0.64898 0.85088,1.04258 2.06971,1.67724 0,0 -1.27934,2.83185 -1.46707,7.91515 -0.0382,0.81626 -0.32025,3.64282 -0.36725,4.85271 -0.0564,1.4509 -0.33429,5.42759 -0.37447,8.72377 3.13887,-0.12885 16.9899,0.32711 19.83266,1.09016"
  4730. style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
  4731. <path
  4732. id="path64"
  4733. d="m 120.86064,206.46167 0.74289,-0.77779"
  4734. style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
  4735. <path
  4736. style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
  4737. d="m 154.35269,209.95817 c -1.3659,-3.76955 1.68111,-4.55145 4.52489,-4.49522 1.92806,0.0381 15.20167,3.24132 14.48739,5.96672 -0.60608,2.31255 -12.27927,-1.5507 -13.69082,-1.99116"
  4738. id="path66"
  4739. sodipodi:nodetypes="cssc" />
  4740. <path
  4741. style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
  4742. d="m 155.85177,226.65364 c -2.17042,-0.78142 -3.38565,-1.75527 -3.84772,-3.81573 -0.51058,-2.27683 0.45926,-3.47826 0.8043,-3.65357 -1.33261,-2.43868 -0.6811,-3.99995 0.94226,-5.06228 -0.91448,-1.34932 -0.80137,-2.23276 -0.44228,-2.9835 1.03837,-2.17084 5.09091,-2.05314 7.06721,-1.54749 1.39017,0.34066 11.95873,2.65787 11.51553,5.55024 -0.33879,2.21101 -11.55558,-1.46528 -12.08432,-1.46805 2.97224,0.85961 9.98615,2.63959 9.72404,4.57936 -0.34365,2.54316 -10.01768,-0.57632 -11.01826,-0.84026 1.43638,0.42923 8.80722,1.83696 8.38504,4.16651 -0.7308,2.1548 -9.74492,0.0387 -10.70193,0.0286 m -2.44503,-7.48541 c 1.71155,-1.1577 4.29374,-0.87123 6.05614,-0.4488 m -6.83947,5.44709 c 1.16993,-1.2345 2.53591,-2.24487 5.65267,-1.68211"
  4743. id="path68"
  4744. inkscape:connector-curvature="0"
  4745. sodipodi:nodetypes="csccscscsccccccc" />
  4746. <path
  4747. style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
  4748. d="m 195.63892,214.68372 c -3.35587,0.0179 -7.92681,-1.22825 -8.77828,-1.92265 -0.96878,-0.79006 -2.84535,-7.86165 -4.02743,-8.99273 -1.18209,-1.13108 -7.51321,-2.40393 -8.7043,-2.3943 -1.89184,0.0153 -13.27048,0.52191 -11.30391,3.38633 0.99028,1.44241 7.35841,2.41491 10.01699,1.14379 0.76135,0.64898 3.34506,1.60009 4.56389,2.23475 0,0 -1.27934,2.83185 -1.46707,7.91515 -0.0382,0.81626 -0.32025,3.64282 -0.36725,4.85271 -0.0564,1.4509 -0.33429,5.42759 -0.37447,8.72377 3.13887,-0.12885 16.9899,0.32711 19.83266,1.09016"
  4749. id="path70"
  4750. inkscape:connector-curvature="0"
  4751. sodipodi:nodetypes="cszsscccscc" />
  4752. <path
  4753. style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
  4754. d="m 172.84199,205.90416 0.67602,-0.39964"
  4755. id="path72"
  4756. sodipodi:nodetypes="cc" />
  4757. <path
  4758. style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
  4759. d="m 48.692274,221.82226 -1.180757,5.21477"
  4760. id="path74"
  4761. sodipodi:nodetypes="cc" />
  4762. </g>
  4763. </svg>
  4764. `;
  4765. // post process
  4766. // transform custom element <nw>content</nw>
  4767. Array.from(document.getElementsByTagName("nw")).forEach(e => {
  4768. e.outerHTML = '<span class="nowrap-element">' + e.innerHTML + '</span>';
  4769. });
  4770. // https://stackoverflow.com/a/41886794/10440128
  4771. const replaceOnDocument = (pattern, string, {target = document.body} = {}) => {
  4772. [ target, ...target.querySelectorAll(
  4773. "*:not(script):not(noscript):not(style)")
  4774. ].forEach(({childNodes: [...nodes]}) => nodes.map(node => {
  4775. if (node.nodeType === document.ELEMENT_NODE) {
  4776. node.innerHTML = node.innerHTML.replace(pattern, string);
  4777. }}));};
  4778. // &square; = □
  4779. replaceOnDocument(/□/g, '<span class="square-sign">&#x25A1;</span>');
  4780. // &xmark; = &amp;xmark;
  4781. replaceOnDocument(/&amp;xmark;/g, '<span class="xmark-sign">&#x2A2F;</span>');
  4782. document.getElementById('div_four_bodies').innerHTML = svg_four_bodies;
  4783. document.getElementById('div_three_hands').innerHTML = svg_three_hands;
  4784. </script>
  4785. </body>
  4786. </html>