Files
Maison/Wiki-print/data/article.md
2026-02-10 12:12:11 +01:00

83 KiB
Raw Blame History

🛰️ MKII / Magnetometer

MKii est un dispositif de mesure magnétique, il est constitué de 7 capteurs immergés et reliés via un cable de 300m à une application Magnetometer chargée de l'acquisiion des données.

PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7IGNvbG9yLXNjaGVtZTogbGlnaHQgZGFyazsiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI2OTFweCIgaGVpZ2h0PSIzMzZweCIgdmlld0JveD0iLTAuNSAtMC41IDY5MSAzMzYiIGNvbnRlbnQ9IiZsdDtteGZpbGUgaG9zdD0mcXVvdDtlbWJlZC5kaWFncmFtcy5uZXQmcXVvdDsgYWdlbnQ9JnF1b3Q7TW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NDsgcnY6MTM1LjApIEdlY2tvLzIwMTAwMTAxIEZpcmVmb3gvMTM1LjAmcXVvdDsgdmVyc2lvbj0mcXVvdDsyOC4xLjEmcXVvdDsmZ3Q7Jmx0O2RpYWdyYW0gaWQ9JnF1b3Q7dkRvY2ItM19fUzN4eVhZRWNySVQmcXVvdDsgbmFtZT0mcXVvdDtQYWdlLTEmcXVvdDsmZ3Q7N1ZoTGI2TXdFUDQxWENNd2o1QmprelM3aDY1VXFZZnRuaW9YSFBDdXdjaVlQUGJYN3ppWWh3TnRVMjJhcUZJakpaa1pqeC96ZWI0eHhuSVgyZTZid0VYNmc4ZUVXY2lPZDVhN3RCQnlQQlRBbjdMc2Ewc1lPTFVoRVRUV1RwM2hnZjRsMm1ocmEwVmpVaHFPa25NbWFXRWFJNTduSkpLR0RRdkJ0NmJibWpOejFnSW5aR0I0aURBYlduL1NXS1k2Q2pUdDdOOEpUZEptWmllWTFTMFpicHgxSkdXS1k3N3RtZHhieTEwSXptVXRaYnNGWVFxOEJwZTYzK3FGMW5aaGd1VHlwQTUrM1dPRFdhV0Qwd3VUK3laYXdhczhKcXFEYmJuemJVb2xlU2h3cEZxM3NMOWdTMlhHUUhOQTFNTVJJY251eFRVNWJhU1FJb1JuUklvOXVEUWRiQTJPemc3a2EzM2JZUjNNdEMzdDRleTYyb2oxL2lidDJCMEVJR2dVeGhHWkR1SW5NV3krVnJtUUtVOTRqdGx0WjUyYkNIVStkNXdYR3BmZlJNcTl6bVJjU1c2aVJuWlVQdmJrWDJxb2lhKzE1VTZQZkZEMmpaSkRaSTk5cGRkTHFWMjNnOWIxaTI4VUIwRE5lVTVxeTRvcVFBN3RheEFYbkhGeGlONjFiZDhtYTdDWFV2QS94R2h4bHZORnUrY0twdGQzSEZEbGxZaTBsMDQwaVVWQ3RKYzNuaGVDTUN6cHhoejlmL1lZdlNmcG5iZVQvZ2l5K25NZU1yU1ZRcFBCZDBiSU1NYUZNMUJoOWtXRnkxREJIVkxCdnhBVjNNOURCUys0SGhYQ0x5cGNoZ3Jla0FydWhhamdmUjRxdUw1M05TcTg2NG54dWpCTm5ldFZqR0FBMDJReXNkcm4vZzRzQ0UrYWlHQkdreHprQ01Ja0FNdGNnVURoK25Hakd6SWF4NGNTTXdhdFdYYk9nS0kvdXg2S3pWUTlHS2ZxWW9jTFNTcFJmajR3UGZjSVROKy9ISmpPMjlTTktyRnBtZHM3RkNLR3k1SkdKclltT3MxeDFjZ2ZlVnhkOFpMaW9QRU43bTJnUDdLQmplM2tZMHZQY004cHJLKzdIQi9sajRlT0VxTmV2ZTdWdi9rZkR4U2FBdzB1ejNYTWc0RWdJZkMrNTFZb2gvSWRDdzd0MTlkMWRPRnhBOE1maEhvRlhjYTNlM0FhQ1U2NC9OSHM4QUtvbityYXRLUlpBak13K2d5L0VhUEZFeFpTaVR3cktxZ3ZBTVRxRG9vVEw1NGNGTzdnT3lueTVBeDFBeDNCaU1KaEVRNUgwaTQ4UjkwWVhoTHVvSFlTQ3dWTVZkdG5BVktpSktCYmR1R2F2T2E1TlBodTI2dlZtVjVFb1JlNGRvbGFQWHdhdmVlbEJNenRXUDFJZ1RlWXNzOTNBQ0p2bk44ZkFDcW8zWnZVdWxSMDc2UGQyMzg9Jmx0Oy9kaWFncmFtJmd0OyZsdDsvbXhmaWxlJmd0OyI+PGRlZnMvPjxnPjxnIGRhdGEtY2VsbC1pZD0iMCI+PGcgZGF0YS1jZWxsLWlkPSIxIj48ZyBkYXRhLWNlbGwtaWQ9IjE1Ij48Zz48cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iNjkwIiBoZWlnaHQ9IjMzMCIgZmlsbD0iI2ZmZmZmZiIgc3R5bGU9ImZpbGw6IGxpZ2h0LWRhcmsoI2ZmZmZmZiwgdmFyKC0tZ2UtZGFyay1jb2xvciwgIzEyMTIxMikpOyBzdHJva2U6IGxpZ2h0LWRhcmsocmdiKDAsIDAsIDApLCByZ2IoMjU1LCAyNTUsIDI1NSkpOyIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludGVyLWV2ZW50cz0iYWxsIi8+PC9nPjwvZz48ZyBkYXRhLWNlbGwtaWQ9IjciPjxnPjxwYXRoIGQ9Ik0gMTgwIDI3NSBMIDI1NCAyNzUiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMWRiYyIgc3R5bGU9InN0cm9rZTogbGlnaHQtZGFyayhyZ2IoMCwgMjksIDE4OCksIHJnYigxNzgsIDIwMywgMjU1KSk7IiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiIHBvaW50ZXItZXZlbnRzPSJzdHJva2UiLz48L2c+PC9nPjxnIGRhdGEtY2VsbC1pZD0iMiI+PGc+PHJlY3QgeD0iMTIwIiB5PSIyNjAiIHdpZHRoPSI2MCIgaGVpZ2h0PSIzMCIgcng9IjQuNSIgcnk9IjQuNSIgZmlsbD0iIzMzMzMzMyIgc3R5bGU9ImZpbGw6IGxpZ2h0LWRhcmsocmdiKDUxLCA1MSwgNTEpLCByZ2IoMTkzLCAxOTMsIDE5MykpOyBzdHJva2U6IGxpZ2h0LWRhcmsocmdiKDAsIDAsIDApLCByZ2IoMjU1LCAyNTUsIDI1NSkpOyIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludGVyLWV2ZW50cz0iYWxsIi8+PC9nPjwvZz48ZyBkYXRhLWNlbGwtaWQ9IjkiPjxnPjxwYXRoIGQ9Ik0gNDIwIDI3NSBMIDYxMCAyNzUiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMWRiYyIgc3R5bGU9InN0cm9rZTogbGlnaHQtZGFyayhyZ2IoMCwgMjksIDE4OCksIHJnYigxNzgsIDIwMywgMjU1KSk7IiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiIHBvaW50ZXItZXZlbnRzPSJzdHJva2UiLz48L2c+PC9nPjxnIGRhdGEtY2VsbC1pZD0iMyI+PGc+PHJlY3QgeD0iMzYwIiB5PSIyNjAiIHdpZHRoPSI2MCIgaGVpZ2h0PSIzMCIgcng9IjQuNSIgcnk9IjQuNSIgZmlsbD0iIzMzMzMzMyIgc3R5bGU9ImZpbGw6IGxpZ2h0LWRhcmsocmdiKDUxLCA1MSwgNTEpLCByZ2IoMTkzLCAxOTMsIDE5MykpOyBzdHJva2U6IGxpZ2h0LWRhcmsocmdiKDAsIDAsIDApLCByZ2IoMjU1LCAyNTUsIDI1NSkpOyIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludGVyLWV2ZW50cz0iYWxsIi8+PC9nPjwvZz48ZyBkYXRhLWNlbGwtaWQ9IjgiPjxnPjxwYXRoIGQ9Ik0gMzE0IDI3NSBMIDM2MCAyNzUiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMWRiYyIgc3R5bGU9InN0cm9rZTogbGlnaHQtZGFyayhyZ2IoMCwgMjksIDE4OCksIHJnYigxNzgsIDIwMywgMjU1KSk7IiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiIHBvaW50ZXItZXZlbnRzPSJzdHJva2UiLz48L2c+PC9nPjxnIGRhdGEtY2VsbC1pZD0iNCI+PGc+PHJlY3QgeD0iMjU0IiB5PSIyNjAiIHdpZHRoPSI2MCIgaGVpZ2h0PSIzMCIgcng9IjQuNSIgcnk9IjQuNSIgZmlsbD0iIzMzMzMzMyIgc3R5bGU9ImZpbGw6IGxpZ2h0LWRhcmsocmdiKDUxLCA1MSwgNTEpLCByZ2IoMTkzLCAxOTMsIDE5MykpOyBzdHJva2U6IGxpZ2h0LWRhcmsocmdiKDAsIDAsIDApLCByZ2IoMjU1LCAyNTUsIDI1NSkpOyIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludGVyLWV2ZW50cz0iYWxsIi8+PC9nPjwvZz48ZyBkYXRhLWNlbGwtaWQ9IjUiPjxnPjxyZWN0IHg9IjYxMCIgeT0iMjYwIiB3aWR0aD0iNjAiIGhlaWdodD0iMzAiIHJ4PSI0LjUiIHJ5PSI0LjUiIGZpbGw9IiMzMzMzMzMiIHN0eWxlPSJmaWxsOiBsaWdodC1kYXJrKHJnYig1MSwgNTEsIDUxKSwgcmdiKDE5MywgMTkzLCAxOTMpKTsgc3Ryb2tlOiBsaWdodC1kYXJrKHJnYigwLCAwLCAwKSwgcmdiKDI1NSwgMjU1LCAyNTUpKTsiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRlci1ldmVudHM9ImFsbCIvPjwvZz48L2c+PGcgZGF0YS1jZWxsLWlkPSI2Ij48Zz48cmVjdCB4PSI0OTAiIHk9IjI2MCIgd2lkdGg9IjYwIiBoZWlnaHQ9IjMwIiBmaWxsPSJub25lIiBzdHJva2U9Im5vbmUiIHBvaW50ZXItZXZlbnRzPSJhbGwiLz48L2c+PGc+PGc+PHN3aXRjaD48Zm9yZWlnbk9iamVjdCBzdHlsZT0ib3ZlcmZsb3c6IHZpc2libGU7IHRleHQtYWxpZ246IGxlZnQ7IiBwb2ludGVyLWV2ZW50cz0ibm9uZSIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgcmVxdWlyZWRGZWF0dXJlcz0iaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHMTEvZmVhdHVyZSNFeHRlbnNpYmlsaXR5Ij48ZGl2IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBzdHlsZT0iZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IHVuc2FmZSBjZW50ZXI7IGp1c3RpZnktY29udGVudDogdW5zYWZlIGNlbnRlcjsgd2lkdGg6IDU4cHg7IGhlaWdodDogMXB4OyBwYWRkaW5nLXRvcDogMjc1cHg7IG1hcmdpbi1sZWZ0OiA0OTFweDsiPjxkaXYgc3R5bGU9ImJveC1zaXppbmc6IGJvcmRlci1ib3g7IGZvbnQtc2l6ZTogMDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogIzAwMDAwMDsgIj48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IGZvbnQtc2l6ZTogMTJweDsgZm9udC1mYW1pbHk6IEhlbHZldGljYTsgY29sb3I6IGxpZ2h0LWRhcmsoIzAwMDAwMCwgI2ZmZmZmZik7IGxpbmUtaGVpZ2h0OiAxLjI7IHBvaW50ZXItZXZlbnRzOiBhbGw7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdvcmQtd3JhcDogbm9ybWFsOyAiPi4uLiA8L2Rpdj48L2Rpdj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PHRleHQgeD0iNTIwIiB5PSIyNzkiIGZpbGw9ImxpZ2h0LWRhcmsoIzAwMDAwMCwgI2ZmZmZmZikiIGZvbnQtZmFtaWx5PSJIZWx2ZXRpY2EiIGZvbnQtc2l6ZT0iMTJweCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+Li4uIDwvdGV4dD48L3N3aXRjaD48L2c+PC9nPjwvZz48ZyBkYXRhLWNlbGwtaWQ9IjEwIj48Zz48cmVjdCB4PSIzMzAiIHk9IjMwNSIgd2lkdGg9IjYwIiBoZWlnaHQ9IjMwIiBmaWxsPSJub25lIiBzdHJva2U9Im5vbmUiIHBvaW50ZXItZXZlbnRzPSJhbGwiLz48L2c+PGc+PGc+PHN3aXRjaD48Zm9yZWlnbk9iamVjdCBzdHlsZT0ib3ZlcmZsb3c6IHZpc2libGU7IHRleHQtYWxpZ246IGxlZnQ7IiBwb2ludGVyLWV2ZW50cz0ibm9uZSIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgcmVxdWlyZWRGZWF0dXJlcz0iaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHMTEvZmVhdHVyZSNFeHRlbnNpYmlsaXR5Ij48ZGl2IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBzdHlsZT0iZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IHVuc2FmZSBjZW50ZXI7IGp1c3RpZnktY29udGVudDogdW5zYWZlIGNlbnRlcjsgd2lkdGg6IDU4cHg7IGhlaWdodDogMXB4OyBwYWRkaW5nLXRvcDogMzIwcHg7IG1hcmdpbi1sZWZ0OiAzMzFweDsiPjxkaXYgc3R5bGU9ImJveC1zaXppbmc6IGJvcmRlci1ib3g7IGZvbnQtc2l6ZTogMDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogIzAwMDAwMDsgIj48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IGZvbnQtc2l6ZTogMTJweDsgZm9udC1mYW1pbHk6IEhlbHZldGljYTsgY29sb3I6IGxpZ2h0LWRhcmsoIzAwMDAwMCwgI2ZmZmZmZik7IGxpbmUtaGVpZ2h0OiAxLjI7IHBvaW50ZXItZXZlbnRzOiBhbGw7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdvcmQtd3JhcDogbm9ybWFsOyAiPjcgY2FwdGV1cnM8L2Rpdj48L2Rpdj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PHRleHQgeD0iMzYwIiB5PSIzMjQiIGZpbGw9ImxpZ2h0LWRhcmsoIzAwMDAwMCwgI2ZmZmZmZikiIGZvbnQtZmFtaWx5PSJIZWx2ZXRpY2EiIGZvbnQtc2l6ZT0iMTJweCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+NyBjYXB0ZXVyczwvdGV4dD48L3N3aXRjaD48L2c+PC9nPjwvZz48ZyBkYXRhLWNlbGwtaWQ9IjExIj48Zz48cGF0aCBkPSJNIDEyMCAyNzUgUSAzMCAyMzAgMjUgMTcwIFEgMjAgMTEwIDEyNC4wMiA3Mi4xOCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAxZGJjIiBzdHlsZT0ic3Ryb2tlOiBsaWdodC1kYXJrKHJnYigwLCAyOSwgMTg4KSwgcmdiKDE3OCwgMjAzLCAyNTUpKTsiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgcG9pbnRlci1ldmVudHM9InN0cm9rZSIvPjxwYXRoIGQ9Ik0gMTI4Ljk1IDcwLjM4IEwgMTIzLjU3IDc2LjA2IEwgMTI0LjAyIDcyLjE4IEwgMTIxLjE3IDY5LjQ4IFoiIGZpbGw9IiMwMDFkYmMiIHN0eWxlPSJmaWxsOiBsaWdodC1kYXJrKHJnYigwLCAyOSwgMTg4KSwgcmdiKDE3OCwgMjAzLCAyNTUpKTsgc3Ryb2tlOiBsaWdodC1kYXJrKHJnYigwLCAyOSwgMTg4KSwgcmdiKDE3OCwgMjAzLCAyNTUpKTsiIHN0cm9rZT0iIzAwMWRiYyIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIiBwb2ludGVyLWV2ZW50cz0iYWxsIi8+PC9nPjwvZz48ZyBkYXRhLWNlbGwtaWQ9IjEyIj48Zz48aW1hZ2UgeD0iMTMwIiB5PSIzMCIgd2lkdGg9IjgwIiBoZWlnaHQ9IjgwIiB4bGluazpocmVmPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUh3QUFBQmxDQVlBQUFDUHg0ZnRBQUFnQUVsRVFWUjRYdTJkQ1hRYzFabnZ2MWJ2VW5lclcxdHIzNzFiWHVRRlc4WUdzKzlaZ0JBbUx3bERRaWJKOEpJNFpBakpPMG1ZNFdTZDVERlo0SVVYRXNnRUJzSXlRSmhnWW9ObGJMQXh0aVZMdHZaZDFyN3ZVa3N0OWZ2K3QvcTJxdHV0eGJJc1c1cDN6OUdSVkYxVlhWVy8rNjMzdTdjMDlOKzQzYjFuajdubXlLa2Job1pHdG9Wb05GRTJpK1YvSFRteXIyMHBQeExOVXI0NWVXOVhYMzIxWldCWWN5M0FqbytQYlNHUFo2V0hOTmFKY1hlb3grUFJUVXlNRTM0aUlwMnY1Sjg0ZVBkU2ZpWkxDcmdFT3pMc3VzMmo4YXgzajQ3R0E2eEdRemIzMkpqZ0tPSGk3NUFRclI5YnZjSFV0Mzd0d3hFdnYveXA4YVVLZlZFQ3o4bTVJYWFudi9mV0VJMDJSdzFXcTlYYTNPNHhtaGhYSkJZL1U3VkEySEsvU0VmVTdoTW5EaDc4LzhBdndSTUlCR3ZRNjFQSEp5aDZmTnhON3JGUi9tRzRESFdNL3c3V3VBTUUzUTdZOW9nWXlseWVUS2taYTZtL3A0MzI3LzJiT0pjNTFQcVQ0dE5IdjNNSmJuZEJ2dkt5a1BCMW0zZXNjTHZjT1ZKaUFaWTBPZ0YyYk5SRmtGb0FCbGkxMUU0bHBYaHlFclpPWjZEWXBFeGFuaGxMaWFscktDVXBucEtUWWlncUtsbzhZS1BSUUxXMWRmVHd0eDZob1lFKzBobU1SUlVsSjljdXlOTy9CRit5b01BQlZ1UFIzaGFpQ2RrMk91WktBZGdRblRsNllueU1Sa2RIYU5RMUlzQzZYTU9zbHNjb1JLcy9MNVZzdFRrb09XMDV4U2NsZTlKU0V6VHhjZkdVRUI5TkpvYXExU25uMG1wMXBOTXBrcS9YNjN6bjMvUE5IMUI5VmFHdzYySGhscFdGSno0b3V3UThMdnBYWGhUZ2FyQm1jOWc2RDNsaU9leXhqb3k2TlNQRC9RSXE0RXF3d2U1eU90aDZ2WUdpbk1ua1RFeW4xT1FFanpNdVhwTVFHMEVSRVJGZXFCTU1Ua002aHF0QTFwQmVBcDhDL1BNdnZFcXZ2L1NDMk45aUMvOVd3Y2xEdjdqb1QvOFNmTUVGQWQrOCtlcXJ4endUbXlDeFByQjZzODNOYW5oNHFJOWNJME1DTFA0ZW41anczWjQySkdUR1c1WEF6V2FMVU1teENja1V6OUlhNDB5bDZFZ3JWQzhaZE1ybEc3U3NON1RzaTNQVHNQQ0dhQlJwMXVzOS9MZEdTQzJnZTBMNG1CRGxPaUR4YW1rdkxpbW5uLzNvUitKNmRYcjl1MlhGSjY2YjhTSVg0UTR6QXIvNzdwZTBOVFZQN2dUWTBGRHJUWHhBc3NrVW1qU3UwWnZkSTcyZW9lRmhsdHBCd2cvQVNnY3F4Q3RkZ2M5a0t0Z0E3SWgwc3VTbVVteGlBc1U2NHlrcTJrbDJ1ODEzQ3IyV2d5eXZtdGRxSnp0Tk1QQ1RLbnlDSlQzRUY0SUZTanVneS9iTlBZOVFSK3RaMG1nMDdzUjR1K1Bnd1lNRGk1RHB0SmZzQXk2eVRvZnpyeGh5dVc0TXQwZHNsbUQxSnBONVlIQ0lSb1lHMktucG9hRkJTTzdnbEo2eC9MYnBnT3YwSm5MR3AxRjRUQm81WXhQSTZZd21xejJPYktIblhxdmU2MmhydlhaWFNLNEt2S0t5US95a1hkbW1TSHd3OElBdXpnTXBWNm40cDU5NXdYTm8vMytKRHgwUkVSOC9jU3ozalNVSEhQYldHWmZ4Z2Q0WUZvbWJHM2NOVUVkN0cvWDF0Rk4vYndlTmpBejczZk5Vb1k1Nkp6VnNpOFV1UXFDNGxCVVVFWk5NanFoNHNvZmIvYzVwMUUrcWUvbUJVZSt2OW1jQ0x5VmVMZTBUSWF5SE5EcWZtdGRxRmR1dVZ2TnEyMzdzb3p6NncvOTlTcWgxTmxGUG55azg4c0NTQTM3ZExmZlVHVUlqa210Szg2aTdzL2tjd09lbzVDbGlXemhTNFk0WWhodEx4dWdzc29USDhQL1JaRENHaWxCS3g1TGtEQjlucVpwVW9ZSG5EZ1llKzZqaHp3YThJWVRqY3RocnR1MnprWFlKbmMwVGZmOTdQNlNlemhaSS9wTE11bWx1dlAyem52cWFjbXB1cko1Vlo0YUVtME50Rk8xTUpFZmNjakxhTThnZUdVZldjQ1d1UlZPeVhHN3lzS00ySVg3NGY4NSs2YmhUeERrRUExK2JxZ1BNSlBXQjRLSG0wZFEyUGhoNDZkUkIyb1BaOXFkWXdvOGZQUzdzdU4xbXYzNnBaZDAwa1BDenRWWEpyYzExNXdBSDNLaVlSSXFLVFNFelMyMUVUQXIvSkpHUlBXZWgvamtoSWdDTFZLWmIvSjRPT0Q0TDRYUEdoTU4raHRDWWUwTDhucWtEQk1LZlR1TFY0QTBoTGhyWG1Oa3puNVI0dFpxSEdSRFFWWjc4d1VNZjBhc3ZQaWV5ZUVaVDZKTEx1bW5XcnN2NW5kNW8rbUpONVdueDNCMFJUdHA0N1FNVUZiK1M0U2I0V1BnR0h6ajdOZTdOVWM4Rk9Eb0dXbnlVTVFDMFAvZ3d2WXNHeDR5RTM2T2VNREpvQmpuNVp2WTdaamJnZFNIaklpUVR2a2VBbWhmU3pqWWRrWU9VOXZhT2Jucjg1LytiZlpoT0N0SHBsbHpXVFlOWU9pd2lQcmZnK0g3eE1Oa3BwL3UrOXhhUmpzTWhkOTlGQVM3VG8zRVJrMTZ5djVTZkc2Y0R2THBKK0hyTk1IdnRJVUtTMGFTcU4rcGNyTjZWYlJJNi9oYmc0ZFdIR1B4aWQwaTcxZ3YvVjcvNkhWV1djdFlONXN0aVhsSlpOdzNpN0VGUHJ2dll3ZGRvM0t1U2IzL2dTVXJJdk9LaUFvZDlSM002K0VHclVxZ3lUSkp3VFNGS2xEQWVFaVorQjRMSE5vTTNBd3Z3c25IS2xnQWRiU3J3QnIzSjM2blRLOUwrVHU0UmV2dU5WK0NEdU1Pc3RrZVdVdFpOeEp5dzQxVmxSY25kWGEzaUFXWHZ2Sk8yM3ZiZGl3NWNxdmNvbTVZMWk4bFBnZ1ZJMkY1dkM3VDFCcDJiSmREL21ObUFoN1Fya3U1VjgxNXBWOXYycy9VTjlNelR2K2RFMGdDci9KQWxsWFVUd0RkdXZ2cGwwb1RjSmUxNHRET0o3dnptNndzQ25JYzdSWFBhdFp3S25Sek9WRXY5aFlMWDZ5Wm9uTUw4Skg0bU5mK2JKMzVQVGZXbEFFNXhNUmJyVXNtNkNlRDMzdmZnVjV1YXVwNlFkaHgyN3A0OUw1TE5FZVdUc1BsMDJtRERsWkFORGlDOGZNV1JpN1I2S0N4TVVkMkJEUjFBRFI2ZnE2VWVFbyttbHZwQWlRZDROSjAzRjREY2daKzA4ejlRODVEMi9mc09lZDQvc0ZjOG4vRHc4Q1dUZFJNM2hOS2cwS2hWL1dvN2Z1MG5IcVJsbSs5Y1VPQVN1c0V3cWFyVlVpOHZ4c3lESXVvMkYvQVN1bzRIWURRODJDTFRyZEtwcTYydXBUOC8vNXpJdWhrTnBpV1RkZlBsMHErLy9YTWRsY1Y1a2RLT1o2eklwdXMvTnpsQ3VCQVN6Z1dHZ2lNUDBsQ0V4UjhxdHB0MC9wVXQ2bzR4azhUUEpPMXE4SUErT3VxbVozNzNPMDliVzdPRzQvVEdzcEtUaVVGVnp5TGI2QU8rZmVldCt6bHZmcDIwNDNvZWZ2ejhkOS9FVUtHNHBZVUVqZ1JPYUppRjRNd0ZhNEhnalRxbGMzaEN2S0daS3BtalZ2VW0zWWpZYjBKakVxR2Mwa2ttMVR5Z28wbUozNy92TFRyKzRYR3hMZHhpV3hLMWJqN2dtNi9ZL2JHdzhMalhwUjNIVGQ1ODMrT1VzbXpESlFIdVlmdHVOaG5JYmxVNm5HbUs0aGVEYXBCRmdwZndqZG9oY1N4RzUyUXphTjArR3k3QlMraGlYN2J2VXRwTFNrdnByVGRlRXlWV2VyMXhTV1RkL0laSEI4K09ET1Y5OEZjeGdBSzF0ajduNDdUMXBnY3ZHWERrNGNOQ1RUN29FbG93K0ZPQnh6RUdyODJmQ3J3c2VjSUFqNFNPMzNnT0wvN0h5OVRWMGNTRFFNYmpSUVZIdC9wNnppTDl3NjhBQXZGNFkzMXRNZ1pTQU56dWNOTGRlNTYvcE1EaHdldDV4QzNHeGtPYmV2L1Vxa0dqcU9nUW5VcUNBNFpWcGRSTDZHcUpoN1NyQWF2QlM2ZnV6YmR5cWVMTU1SR2VSZG9qbkl0OVpvb2ZjTVRqb2JiSXUwb0xQL0QxM3pzZi9LUElxUyswRFlkS0Z5TnQzcEFOSTIxT3V5cVRwb0lmQ0Y2dm1VekRJZ1dyVnZWcWlVY05vNGZ0ZVREd1V0cExTcXM5dWZ2ZTFDQ1VaQ0c0di9qMHNXY1dxWENMeS9ZRGpyeDZUT3FxWElSbnN1Mjg1WXUwY3R1bkx6bHd6OFFZNTRaNFRKMVRzU2c5RG13bWczKzFscEhUcExKTjV0MDVjNmFkalBNaDliSndWUTdUVG9acmlzUFkxVE5JYi8zbERScm82K1Rvd2JMb3B5S2RVOU9HOFhFTUhQUjBLMm5XMU16MUlqeTcxQklPNE9NVEhqSEFFUnVwakxTZEwzaEZ1cFhVS3NCcldSTm92WjFuT3ZCdjczMkhhcXRLZUVvYTlhMi9hV2ZzeTQ4LzdsOEd0SWhFL2h6Z09UdHZMWE9OdVpmWFZoYUkyMEEyNnA2SFhvS1hLdjZIaXIzUTRkR3BNbTB5RGtkWUZxalNKWEFjaXlyVVdJZU9ZVTFXendUQ24wN2lKWGdKSGY4SEF5K2x2ZkJNQlowNGNrQVVjbGl0MWtXZGRUc0grUHBOdXg2S2pVLzUrWW1qeW5BcDJ1NTdIcVBVNVpzdkcrQWU3M2g4dElQdEw4ZmNhdkR5bXRVZFFBMWZyZW9sZUhYVlRURHdIWjFkZEdEZlBsSEFxZGNaRm5YVzdSemdTTE1hclVuOVJRWEhSTmt4V3VhbVQ5RE9XNzUwV1FISFVDNGlDUWxkclZVREpWOVBTcld4WHFmbFBIbW91R2U5ZG9RMWhSd3ZkN0dLMS9uVjJ3RzhhbUlLdmZ2Tys5VFNVTTVlbm1kUlo5MkMxcVh2dU9xT3h2NytudmpHZXI1QmJnalBQdkhnczVjZGNBazUyajQ1bFFnU0w5dDA0SVVhMTdORDRHM3lPRFY0dGJRWG5LNmc0dndqU3NjeDZSWnRVVVJRNENoN0NvK0srNklNei9BUVVCUVJFWjEwV2Rod3FIUlpyT0YySy9uMXVDaUxyOFpjcU9xQVdqa0ozNnpLeDBQaWc0R1haZFpTMVFOOFMwczdIWHYvWFRHNWtaTXdpM1lxVWxEZ3FGVlBURjFYaXF5Ym5FbXk4ZG92MDRhY2oxMjJ3QUhPYXJXVHhhZ2tVOVNWTTRGU3p5cmV3emJlZCs5VGdjZDVwTVM3ZU5Uc1E2NW03V3ByZ1BPMmFJc2lnZ0xIalY1ei9kMURqWTAxNWc2K1FUU0VaN3Z2L2NsbERaeG5VUWlicmpQNGo2bEwrS0U4ZU9LbVVOTFJFSWQwSVVLNnB3T3ZWdlBZdDZpNGlsQy9qK2F3aFMvS3JOdVV3SkYxTTVnc2QxV1dubERzRm9kbmQzMzllY0tRNUtVT3k0S3BkTUNXeldTSkpLdCs4Qnp3c3NiTjRCZk96UjU4VzNzdjVSMTdUNVJqYzJYem9zeTZUUWtjV2JmSXVLVGN2STl5aFZSRHRWMTExdzhvT1dQRDVRa2N0Qm42NkppaTBxM2hVV1F6S3JuMlFJbWZLL2lSNFRFcXpEc3VwbUZ4ZGUraXpMcE5DVnlxOVpycUV2TUFUeUpFUzk5d08rMjQ4ZjVGQVJ6WEcycHhrQ05VS2FxUXphZ2FadFdwNHE1QXFaOUsxWmNYbHhCbTZyRFR1Q2luSWswTFhCWkZOSGpETTVzdGtqNzJsYWNGY1BVa0JEek0yYzQ4RWZ0TlVkTTIyMHhiVUpVZUlPRVNzTUVVUnRHMmMyOXpKdkRTeGdzTjRYWHc0TnkxdG5kcVpIZ1daakl2dXFLSUtZR2pYcjJvOUJlZmk0N0wrRU54d1NHZmhOenk5NzhpTzg4QVhRekFFVUtob1RDUzF4QVFUVDJVaXYvUEYvekl5QWdWRithSnFkTWFUY2lpSzRxWVZzSUJ2Vy9rVFRleWJpNlhVajJ5NFpxdjBPcE4xd3JncmdrdUZmTHdZZ0RqeXVqVnVEY21WdjVXVk9uNHVCSW5ZNWtQTkFNUFdJaHFWZS9uWTI3TVNWUHM3bnhMdUFRdW9ZY1pQYVJPczg0R3ZsVDFVdUtOdWpGTlNXa0R0VFZWa1h2Y3ZlaW1JazBMSEE4S2d5bTlmZDNMMjFycUJaVGt0RFcwNVpNLzg0TWJETHFlUTU4UnQySXdKWFNkQjl1NGhJZzdpVlRyQ3dYY1BjWnp2c1BDeVdHWnJKT2JDcjZVK21BMkh1QmIyN28wTWp4YmJGbTNHWUd2enRyK1kwZDAvQ1BsUmNjRVBJeWEzZlNsUHhGc1l6Q0pWa3U2bE9KZ2tvNWowUUZjYmkyRkVFczlSdUc4VmFzempaYk4xb2FySlJ6QTBRS2hZOXRNNExHUGhBK0pIeG9lb1lxaWs0c3k2ellqY0N5T1o0MTB0cDdtUFBMWW1HSVRkMy9xTVlwSXl2WURyb0NlOUlobFo1aEt0ZnMrNTNNQ09KcUVmakdCSy9CTUZCTng3dm9pZ1VPcVV1VkQ0bDE4YTJPREhUVFEyK1hwNmUzVzRCb3gyWkJOMWFMS3VzMElIQThJZ3lsZG5hM3hIZTJOWXJKZHhwWlBVOWFWbnhHUTFCSjlvZEFYQ3ZqbzZCQ1hRVWNJWnc1MlBiQ3B3V01KbEo3dWJocm83L0xOZjVmN0Evalk2T2lpQ3M5bUJWd01wdGdkWHlndks5QUFPSklhMTk3dlg5cWxWdS9Cd0U4bjZlTmV6VUhqZzBLdFgyd0pCM0EwZ3lHVWx5R1pMS0xRbXBRVm84Wkgra1JKRXp6eHFScGdvNDBNRFM2cWhmeG1CUnlES1hGeDZhVUZKOTd6M2Y5dEQveVdkSmJKQlFQVUR5YW90ODQyV3cxZGV1MkJxbDB0NWZoTWV2RHFpcGNMc2VHNFRnbGNEZDN0ZHRGUWY3Y29jZ2kycENjQVIwUmF1RWJkVFQxZGc3N2xRT0Y4aGxuc2l5WThteFZ3UEJnTXBwdzlXMlhHeWs1b09iYy9SQW1yYnZSeGx2WTlHSGdmNkdtZ1R5WGxzbVBNSjNCY1kyVFlPS2tYRVBTcGFlK1MybUo5VjlZNGlVa3A5TG43SHFERDd4Mmc0dUl6WW0zV2xzWU9CbzVsUkhnb2htZkltSGtSQmMrRXJuM2wybldQdWdkM1BYVTVMNzg5YStESXVuR2UrcnJHdWhMeGJESldiYUhzMjM4NHBjcFRkd0JJNm5UUTFWSU90WTQyeG11dnF1dmFMaFE0emhsdVlNbmtaQXpzTVNZSm90WThzRW5wdG9hYjZKWmJicVhYWG51Vkp5U01zUG8zTUd5VE9LYTN0MGZNWjlkNk93ZWtmL1hxdGJUNzJwdllKSG1vcnI3bXBaR3hzYS8vNjZNUHQwejVnQzdSQjdNR0xnZFRwRnJIeW9sM1B2Ulh3aHcwZFZPSFFnS2MxejRIZzQ3NFhLM2FnMG01Vk90ekFZN3Z0K2s0TWNTbFdoS3krbG9EZ1V2WXlpcFVFelRJWHJtUnBkZkFvQUZjdlQ5Z2gxbDRXVkJld05kdXQxTjBWQlJsWlc4VmE4YWd1ZGl0cjYycCtxQzFxZUVmbm5qOHAwV1hpTzg1WHp0cjREZ1NhcjJ1dHR3OE9OQXRUblRMRjM1RDlyaXNxYVhjbTlvTWhLNE8yU1QwUUNtWHp0djVBc2ZGbUR5OUFqSkd0YUNhZzdWZzBnM0lzdUZ6OThRUWd6YUsrV1p5ZjBoNVZIUU14Y2JHaVJVZ3RWb2x5emcwMkUvSGozOUkxMTkvRTIzZXZwTzFnVXc2VFZCTlpXVnBXMGZIOTMvNWt4KzhmS25Cbnhkd09aalMzRkFwcmp2cjZuK2dUYnMvSzBwOEE3MzAwVEdsL2x0S1BLRDdnZmFxK2FCU0h1Q3RRd3ZNSk9FbWQ1dndyQUZaTGg4bVBlbVpnS3RCWThaSkNKWVRVYWw3TE54bjU1V2FZM21aVUtPQlYzWms2UjRaY1ZGUFR4ZEZSVWJScWpVYkZha2U3cUhHcGlZcU9KVlAyWnV1b0N1MjdhQlFxeEx2VDNCTmZVTkRVMHRIUzhzdmYvcllJeis1Vk9EUEM3aWNZVnAyK24xeHZRNWVrTytUM3d5K0hLbUVDL0NCMEdIUDFTcmVOYUpVbFlwdDBnU005dmpDczZtQTYwWWFxSys3aGRXMXNxKzZ6UWEyQkEyNElUclV1eXMyWGY2MldLd1VIY01ML0hxWENuWHpjaFdkblczS1ZPYklTREU1WTJCd2tOVzNpOWF1V2NQaGFvelFCdkRrSzhyUFVHVmxPV1drWjlEV2JWZng0b1dUeTQxMmRIUU5NL2huaWp2cXZyWFFreHJPQ3pnZUJ0UjZWZVVaTXhiWWhSMy91Mzk2aFN3UktlSkJhZmlCeWRVWDhUYURRT2pCVkx1QTc3WGxhdUJ3M3FUakpvR1Bzb25RRE5aUmQwY0REZmIzVGlza3dZQkxrQUR0Zzh1ZzFaQ05yTUlqMkI1SFJjWDR3ak5JTXBvekpvYXZkWUtMTEJRelliVnk0U1NyOVBqRVZOWXNyU3pCalJRVEhjM3J0anNvekJvbEZ1SnZiS2ltRDk0L1RDbXA2U3p4TzNrWjhEamZkWThNRGxORlplWCtzWW54enkyVWczZmV3S0hXQndmN3IydHJyaFVYZnYxbmYwRXJzMi95ZS9odWxyWng3dVVTK2t4U0hnejRPRXM0cEgxb2tNSDJWL095MXJYaUZSV3lUZmY2aTBEWTU5anJFSDdiZ2twbFF5cnRkZ2V2T3Vua0JmcVVoRXBmWDYrb2pJMlA0NG1VREhtQXZ4dUZqSkdSTVp5aFUrclpYYXpXQVQrUmwvdm10enVRaWJOM0k0TmQxTkxhUmhiTzRsa3NTbTBkSEQ1b2d2THljcmJ0UmxiM09aU1Nub0xsUGNYblkxeWxjN2EycG5SZ2FQQ0xQLzcrdzVNek9hZnQwblA3OEx5QlE2MGJ3eUplcnlwUlZrWllrWFVsM1hEL1UreXRUNWFTakkyTzhVM2dCK0VZdi8xZ0JyWHVCM3lraXdaN1cybTQvYlNvRU1VNjdNSGFUTURWUUlYcTVpWEExTWZnOHpCV3paRXN6VkRSQ2tCbGdNVm1DeGY3TmpXZEZlWW9KamFlckx6UE1NOFhSMGVBNDRheTUzNysyOHI3cmxxeFFrQWRIY1c5S3RMZjI5dkxOcjVIZEpBSWg4MEh2WTA3QXhyT3RXYjFha3Bmc1ZhOGlvUGZuMFlUL05QYzFOTFMzOVh6Nkw5ODd4dFB6UTNwOUVlZE4zQ2NEbXFkMDZ4bWpFQmhJT0wreDQ2UWhkV2JiT2NEZk5URjZkU2hOb1piSnlDM05kVndqRHdjTk5zbHp6OFZiQ3hQZ3M5a1dDWDI5NjcxSm84QkdFZEVKRXNmdjFYQmEyK2hpUUFSMHRmYTJzSkxaL01VWXkvVTdxNU9zUjMvb3cxeEtqVTBsQXNxMkltRDg5YmQwODJPbkpFMVJBUkx1VlpJTmI0RFRYWUFLZG5MTWpPRkZrQzllMzl2RzUwcEtoSWRaOVhxVGJRc000Mk12UGlCYkoyZDNjT05aK3YrcmFvbzdYdnptY2laRTNDbzliNis3dXM2V1FKaHh6L0pzMUxpVXBXbFFkQm1VdW1qV0dCL29KSGhWbE5QN1dIeEZnSTVvV0FtcUlLaDZnVnpVTjl5THJkNFp4bDVGd253VTlsNnRyYzJzb1dIaStsSmVBc0MvQUg4RFpDZEhXMjhRclNpZm9jWktNNFB5VFZ5Y2dWU2o1VWdvQkdnM2lIQkxTMU52azRBQnkwaElRRkxld20xanM5SFhkNWlEODdLWVp2c0FQRGcwZVMrZ2FvZXI5UmFucGxDWVRhYmtIYTAvdTQrYW1wdW5MZEV6cHlBQzdWdURIMnRwcnBVSEwvMW1udHB3L1hmRkJjb1BWKzEvY1oycU1iaDdtcHFyQzJpcnVyM0NEN0FWQytTbTFaZE13dzFaSnhEVEdYVytzZmJBQVJKNUVFZjN3TlhsdkpXSERZWFF3UmsvTi9UMVNYQ0xrZzlKQTZRQndiNnhmOFlVV3ZuRndiZ0dQd3ZPalJEUm1ld001ald0amF4RDlLclJwT1NoTUxmQm9ZdEd6b0F6Qm8wQUxaM2RYV0xhdzROcy9JNXpjTGVReHV3QXljNjQxVlgzMEJXTmdQcU5qYnNvck9OOVJlY3lKa1RjRnlJVk90NDRPSDJxSFBDTTJtN1IzcnFxS1d1Z09vSzMySkpydmRORVpydXpRcEJCeThZTkRKZWdJMFFES2xSS2MxQzZyM09GaElsa09aUTFRSi82R3dkSFIwc1dYWWg1UUFLYUZEdEFJYzJOTWl2K0dESFNrbzF0dUVjMEFEWUZ4b0J4MkViOXBNYUFNNHBHdFIrSENkamZKQVpNRjdOSmM0OU5DUWNXRnlYWEdvTThPSEl5Wm13NkRnd0N6dDNYVXZoRWVFK0NWZERoNTMzY0R3UEIyK3VpWnc1QTVkcXZidFRXVGpnN204OFQyWmJ2T2pKby8wTjFGU2RkdzVrZWZIbkF4dVFzZHdIR29ZaTFaRGwrV0M3SWMzNGdWMUdlQWdvNkJqUlRxZlliYUMvVHlRL0VGZWpBU0xzTS9iWHc0dnU3eGN3Y1E0SkhVNFoyakMvS2NIdWNBakk4T0poc3ZBWnRFTWtKMTdRQnZuN0lPbW9DSUlRd05hakV3QXlHc0QyOUNsUkJqUURycm0xdFZYc3QzNWpEbTNZdEY3VUdzZ21WWG9nY1BYL0xjMnQ1NTNJbVJOdythWWpZMmpZQWFuVzEreThYOFNsTmZsdlVIdXJNajFwcWpZVGNBQTJoMXFFVk1pWDEwMTRxMkp3VHVtQm04eWh3dFBXQzJkTncvYVhiUzBEZ2VlTmtBcjJHQ0dQeFdvVis3VHpBd1pNL0VBeUFSMFNMNzEwUU94ajc5ckVUdHNJUTBZS1ZTNEZDcUM5SEk5YnZBQ3hIelFFUG9jYWRyRUc2R1VIRGliRXdUOUl1eUpzYTIxckVlY0haRGg1L2R6eFdwcWJLQ0V4MlM4dWgvU3EyMnlBS3gzSnd4RkJuMGprdERmMmZQdkpKeCtkOWsxTWN3SXVMMHdtWVFMZi9UblRLeUpOWVFaZWppdU1lcnN4cml3ZEhMT0FqQ2JmZHdiSXNwUklmaWZQM0JScnVzdVJLN2tVQ1d3d09nS3FVMlFiSGg0U0hRS1NLKzAyT2dEK1IrZ0Y2UUk0aEVYU3UrYzNPdms2Ukh0YnE1QitPRmZvUEppamhuZ2RXZ0NkRVNFYU5BZU9nY29YSFFqT0hsOGp0QURNQkQ1M3NRMkg1NC92WGJGOEpXM2V1b09uSFB1dlUzTWh3T1g5dXZnYWEycnJwMDNrWEJCd21ZVHBhR3YwNjUzQmdHdDVBWjNJeUdpNmN1ZFZJajZ0cUNpandRRWxPUU83Qm51SHhJb0lxVHoraStGRC9VRzFxNGNreDdCWUhnUEFaNUFhT0VxUU1qTkxQU1FhRHgwcFQ2aDJnQWNvQUpGaEZVQXFXVUZlV0lEUEE0ZXNqVU15akhkamhBenFHcllmRWcySW9pUHkrV0FHNE5oQlE4aU9Bd25IUFNPVDJOM2RKVHFSVVBlc2Fad3hzV0kwTFMxanBWK1dMVkQ3elFkd2VjNXh6b00wTlRVRVRlUmNFSEFNbVJwdGtiazE1YWQ4MTYrR0xkN1dhekhTUGZmOEhXMitJb2VlK2orL0Z1b01FeE9oWXRIYW1qdlo3dmNIMWY0R1ZyM3EwU3A0c25pUXZaM2Q1T1FVSmFRYzJTOUluRGswVkVneEhqWUE0ek5vQnlRNEFCdHFYRXE1VlAzUVROaFBjYzZVRGdMSUdQS0Z1b2FUSnVKd1BsYXU5NElMZFRpVVYxNGlac2M1Y1N3U1RjUHNuS0hGeGllSVJBMHljTXRXWklrQkZQZ1AwN1g1Qks3K25sYTJLUTFuNjc0bVIrb3VDRGhPTElkTWg0Y1YwNkVHYmpTYWFkZnVLK25BdS91RUpBSWUxQ1BHa2lHTlVIZnE4WE1oS1d5RG9iWnhIanhNQUI1aGdKQTBTQXBVTWlDakFUVFVLaHFTSHpnV240bEY5UGp0d2RMV1E4MmpFMGhvZ0NuVnNwUmFDNDl0QXdvMEFDUmFldmtTSkxiak9LbXloZmJnYmVnVVhkd3A0QXhHczgzSE5hWm5yT2JYVktjS3YwSzJTd1ZjZkQrbmhrdkx5dmIvNlBzUDNYREJ3T1dRS2Q2S0ZLakt3eXcyR25FcFFKUXNHSTh4c3lRZ0JsWTNDVnJ1QThpai9DQWpHSm9DaHIxaTdod0FwaVJCT0RIQ0hRQmFBZzhjblFmcU9vWWZPangwMkY3aGZiT3F4anc0YUJSNDJYQVdvZUxSU2JBTjE0UHpRZ1BBZVpNaEdKdzNlT2JZSm1Odm1VcVZpUmw4SDY0TGpoMDZBYVI1eGNxMXZNYTgvMHY0TGlWd1hnWmFSQlY0NytzRXJ3NWRVbFo4NVFVRGx5L0p3YXVZb1NMaGVGbDRKUWJZWkJteWFYbTFZOWpxd0NaQnEwZXg0SGtESmtDSU1pUytZSHp1Y0VRSzV3cVNncVFJdEFPa1huUU9MTVBCRWc3N2phYThaM3hDL0ErSmwzOER1TXp4dzV1R0k0VnJnTnJHZG5RZ2RCU29jR2xLY0Q1SU1rQVBEQXlJQkFuZVBRNXB4N0Fwa2kwMU5kV2lrK0djMTkxd0I2MVl0ZXljZTExSUNjY29IU1pNakhHSGhFYUVoQnREalhUaVpIN2NCUVBIbmFGdW5VZVU0cEhhN0dpdjVtSjl4U1pqVHJrNnRneFJ2WlJRL1pKWDJHcEFIV0ViaUwvUjRJa0RHTGFqaGd6bkZ1UFdLRDVRcVhqOEQya2NaSTlZVnJjQUZxUU9qaG5YalF1WStCeVNqRzBBRE9rM2gvcXYzUXB2V3paMFVHZ0RxRzRjSzRkTm9YSGk0NU9FbGlnNmM0cER2V2IyVDNaUVRYVWxuYTJwRlZwazQ5YXRkT3R0ZC9KN3pPTVhUS1ZEbXMxOGJ6ekRsWVk0S2hDZ3VWbDVaTTg5T2tHbkMwOS9HUU15OHdJY2kvTG1mL1Jlc3JwYkI4S1dud25vSG5iWU5LemFoMGQ1SFZlTUcrc0ZMR1Z0VlNWVktqMXpIQ2MrNCsyUWNwa1phK1A0RmczSHdqa1VuN0h0aDBvSFpOaFZXWm9FQ1lWcWxwMEFKZ1doRXV3NmJEMGtYVFowSGh3dlRRV09rZkUyUnI1UUFKRjM4aU0ySDdHMCs3bzc2S3BycnlHTEFjdUJhaWt2L3pROTgvc25xS3Fzak9lbWg5Sm1ybmk1NFliYmVURWt4MFZ6MmlCUVlheGxFTGNmUDE1QVZ2N2V4TlFrbm1BUkpvWjBxeW9ybnl3K0ZmODFPUUF6TDhCLytQTW5TbXcyeDhvLy9mRXBydCtxRXM4dUlqcVNicnp4Rm40OWRCSy9XZUNYTkR3d0xHeUp5V3dnRzB1YVZNV0R2YnorS1hjQ00zdTFJcGNOaVdVZ2tHS1JiK1p0QURyS2tnWm5EdElMK3dscFYvTFhKaUZ0MktZZXBRSnN0ZU1HYVpXU0NqTUIrNncySmZDd3BickhOVmc0VVlLT2tKQ1FKTUxHK3ZvYUljWHJOMnlpcTYvOUdLV2xzZlI2WDc4bGdjUGtvSDF3NURqOXgzTlBVME45cmJqK25Kd3JhUmZueDAzZWNmUno5RDFrNER3VEw1RG1NTE9KZWdZRzZYUkJzUUM5YTJjT3hVU0YwM3RIVDNaVmxKVCthN0JTcW5rQi90MS8rY1crMVZscnJvZGo4T1pmWGhIanZEazdyaFQzQmRYWjJkTkgzM240NjBKbDR3SDA5L0tRSXNOQ0Jzcm5TYk5FQ29sbE95b2wzY0xTQmFod3ZGQXFqRTZBeitIUVFmV0gyK3ppZjlocDJGWTBxRzE0eDhpZEMzdk1IUVRIQTZKSXdYcVRNTmdYa2l3a1dtWHpFY09qNDZXbXBJcU9WMXBTTExRR3IxQkpHN2RmeVErWjQzUStyeG1MOTA0QkhMRTgycjc5QittTjEvOU01YThWaWd3QUFBeHJTVVJCVk1WbGxKaVNTTnUyNWRDV0hidDhSUlpxOExNQmp2MXRQSVJxTkZ1cHRibVpQZTlLenQvSDBJNmNMYXk2VFZSVGQ1YmVQL3lSVU4zQk9oVzJ6UXZ3cnoveXozZHYzcnIxSmFUNTRDREFlMTIrTE1OYjhjS0ZFS3lTQjRaRzZFLy8vZ3dkZmU4OU1SSWtNMlRLaER5dkN2ZUdiYmd3U0d3ZnB5cmxvQWhnUVczTERnSzdEcWNPVHA2WU5DQkdueXdpczRZR2RRMlBIcDBNR2dYaGtsek5DV2xUR2RwaFg0Ums2SUFvVW95S2pCQU9ZMmxwaVlpbnQrMjRtYUtUbE5lZEFEYmFiSUYvZFB3VXZmelNjOVRTMU1pbW9KMHJlRFMwZlBWeTJuYkZObHE3Y1l1djRnWG5uQTQ0N0xMRHlubDZGcDVLZnZsT1RXMmpHRC9mdW1XRFdJK3V1S3lLeWtvclB2M3dOeDc0ODFTZzVmWjVBWTZUUWEwbnBhYXRGREZmOFNtS1MwaW45ZXRXODBOWGtoR3lGUlNXMHJOL2VFS2tIWkU5ZzdSYnd5ZUhNT1hJbFBJMlltVlFCSzJITTFpQWpXMkFDeTFnWXk4WmpwM016Y051b3hOZ0h5dUhoSERLNE5SQjVVTkRTSnVPOHlBc0U0VU9yQ2t5TTFlS1lVclVwSFh3MkhoU2FwWW5lL04yalprQjQzM2tidS9Dd3JNQlBzekRtRWVPZnNTYTdpV2hLWGJ1dXA0N2twTTFWWmludENSUDg1YzNYdWNNNHlqZCs1bFAwWXExa3pVRXdZQmJXV1hidkdWU1o0b3JxSzJqaDUvcENxNnd5UlRQNVBUcENrL0JtYnlkNTFNV05XL0EvM0hQdDlla3BxMDQ0M1RHME50NytlVTRQSGlRdFg0TFpXU21VaFRudWRYZ0IvbWh2UHpuRitud3dmMUN4VU5DaDdrRHdITUhMRWl0dWhZY3NNUndxUEFCZU1BRXNUbXI2VDZXY2xubGdnZWd2SzlFSjhJMk9ITUk3MlMyVFdvR09HSFlCNDVZOXNhTnRHcmRSbDZrNXl6OTZkbG51YWJOUmx1MjM4clRpMkMzT2NMQVd3dG5DYnlqczRNT0g4cmw2VWpGb2hOdHpON09uUzVNUkJzbWRxb0F2THVuUzFOU2xNL0NrQ1lTTStvbWdhUE96YzdINFRwUitYTWk3N1RRZHB1eTE0cENDemliSjArZVBubnExTEhQejJXQ3c3d0J4OFVEK3NwVjY4L3MzL2VtdUVqVWJFZnpxNmhUVTVLRFNudFplUzIvOHZFMzFOdlhJNlIzRURseFZzbDRTRExEaHQ5UzByR1BuTjZEWkF0VU51dzVtcDBCeWpnYy8wdVZMOHdBbXcwWll5L2p3WXVOMmRzb09Wa1ZNckhEMU5MY1RrYy95S1dUSndyb2l1MmJhY1dhYlNJWFBoUHdzOVZjbFhwNHZ5OTNVRmRmSjRaYWtaRFpmYzNOd2x5ME50ZUtvb2VzOWRsa1lXY3hXRE95dytld1dZVlo2dUtDakZNRlJhSmpYckUxbThjZ0hEeiswTStkcWZ4a2VVM2xiUmRTNFRxdndIRWo5Lzc5bDY5SlMwNTh0NFJERXd3d0lGU0M0NFZpL2N5TURISTZJLzJrZllSNzdPdXYvU2ZsdnZzM0liMUlva0Rha2M5V2c4YTUwWWtBR1NvZEhqdlV2ZXdBc0pFeVV5ZVRKcklPRFI0NXhwdzNidDRnbko0QWg5aXYyS0N5b29aeUQremxUamhCMjdadm9lV3JOcENlUFdBMHFkTHhkM1ZSSVIzTTNVdk5qWjIwNTFzUGNkbFRxNmhUazFVcnB3dnp4YlhlOHJIL3djT2cyWDc1Q0RWd1hBOEtIOHhtSTUxbGsxSlFXTXpEcTNhMnp4dTVzNFJTUTNNSE8yS0hYdXBzN1AzQ1RFT2ZRWHRTd01aNUI0N3pZN3pjRm5QeUFJOEk3MnBzVkViU2NGTWJzL21OeGR3MloyY0pSMDQyVE1DcnJXdWtmMy8ydDhLR3d1NE9zVnFHSnc1cFJ5ZEFXS1oraDVwNHR4bWJBNHlnU1pVdmJiZk16cVZuTEtOTm0zTm8rZkowckp6b2E5TUJ4MDZqM0xGS0dOamV2WWU0NXR6QnhRbTdLV2xaSmszd1VoOWxKWVgwenQ2M2hFTWFsYmlhTzUyWlRZeU9NbEs1VkZtclJBcDUrZm5DeTk5eDlUVys3MVJuMmhCRjJNTWpLRHBDS1k0b3E2cWhDdmE0a3pnOXUzclZjcEZScksxcjVoa3NlWDR4OUd5QXpyVFBSUUV1dnhUU0hoM2hlTGUycmxaSUoxUWNmbU1oSDZqNXBBU25BQS9nYUlpMy8vYjJYbjdRYi9yaTdjQVFUdHBpSkZOZ0F2aDF6MExTNFlTaEU4QlIyN1JwcXhoemRqaXM1M2kvK0o2WmdDdjdjQXFYSTR2ajdHbi9kZDhSMnJKeEZWVVdGMUszUzAvaGpqaXVUK000bjB2Y3NDd0lnSXZyZDdYVHJxdHVvTGg0SjQxN0p1ZXBLZmZHNzFYbE1mRElpQ2p1L0ZaaGl5SE5rT3JNNVJtME1qTmRuT05NU1MwVkZaNzh6c1dham5SUmdlTUdJTzJhMFBmK2M4elZkMGRPem00QkhBM1EwYlp0VlR4VkNSMS9OelEyMGZQUFBjT3pOdW9GZU9UTkliMXd4SlFLbURFUmFzSEdRYVhEZ2NQTWpzMWJkMUpXMWlyaE1Nb1c2UDJlRDNCNWpsNjJuMi96QXZuSDgwdElPOXhFMnZCTXpwdEhDdUJZRWlReU1wUnV2dVBqSXJVWkNCcm5RRWlGL0R2aTg0R0JJWkdSUTAzQTJyVXJLQ0UrbmtOSUY1VlVWSGFkTGl6NDhzV2VjSGpSZ2N1SEJtbFBTc2w0a1ZjaGpwYkFSVjZmSzE0UVU2YXlFd1Y3TGh1a1BUZjNYZnJyZi8zRlZ6OE8xUzZrbWNITEFvZ04yWnRwZTg1T0xpRjJUbG40NXp1cDk0L1pTcmo2T0tRdzYrdWJhTysrdzFSOXRsTXNLSkMxTm9OdXZQbG1NZjFJTmdsY3E4Rjd6bXdVdzFFTFl1VzJEbDZZTjc5UW1KOTFHOVlMZGQ3ZU8weUZwL0phOGs1OCtKa1hudm50QVFqSGZOYWdCOTQzL2w4dzRGTGFROElPUGM1bHVldWR6cmhkZ2JOT2QrN1lJdDd5cTViMmx0WU9ldkdGWjZtZXpZS2MzUkdIaEFnbkw3SzNiQ2V6YWluRldkZUJCZFFpek9ZNGFZTXhlNVJmUGl1bUg0MjUvU2N3NGg1UmplcmtZZG9JdTVJQWFtaHNFYUdWVnNlNTlXekUrMkZjT01INStQeFRwVTJOOVhmTkpiUUtCbksyMnhZVXVQcWlFTUo1Tk5iVGRydEZYSU5jb0M4ekk1MVdMazg3UjlyTDJYdnU1N3d4UE5qMHRPQXYrcDBOdUxtb2RCd3owL0NtalJNM1VOdk9TSzZWNCtMRnl1cDZFVm9odzdjdWE3VVlYSUdHeUM4NHRhQ1RCd003d2lVRExpL2tudnNlL0ZWaVF1TC94T2dhRnZBWmRYTnloVzNkTlZkdDk3dFcrZnFxcVNZdkNDaUJ1cHEzelljTm53NDQxSFppUWl5RmNuSUZvRThWbGxObFZSVWxKQ2RTQmp1bWFPVVZWVlJkVXoxdm9kVnNwZm1TcS9SZ0Z3QzdwYk1jdU1wa2pud253bUhWQURnYW9HUGFUV1o2cXBEMjZVREw4eTRVY0todGVOdXBpVEhpcTN0NEpCQjU4M3FPeWRlc1N1SG9JNTU2aHNhb3ZMUjQrUDNEN3o4OU1iaHJ6OFcyemJQdEJKZGN3dFVYK3FuUC8rTWJ6dGlFT3lSd1RMb3pjU2dEVHg1MmZTYm9GeHM0aGlPUk9vYmFSbXZ0N0JWRG9haUUyYkIrRGM4TGo2Qm1YdEtyb3ZSTVM5N3hFNCs5OE94dm5wd3RpSVhhNzdJQ2pwdUdOdzlwajRweWFBQmN2ajlNeHUxRFBOSTFWYnNZd0VWdW15ZFlRRzFIT3NJNWhCcWhocFpPT25UNHFMZ01lTndXenBJMTh5U0hqMDdrdGRmVzFIM2xwVC8rNXRXRkFuaSszM1BaQWNjTnlOZzlKU1h0RHBNcFZMd3dUcjVTYWwzV1N0K2tnY0NiblUvZzhNUXhGZ0MxYldiSkJ1anlxanI2OEtOOGtSOWZ2bklGeDkxYXFqM2J6b01aeDg2NFhmMmZYbWlQKzN4aFkvL0xFcmk4a1U5OS9zRTduYkh4cjBUeitpZ0Fyb3lHWVE1MktLVWtKL2pxdHViVGhodjQvSEZ4Y1F4YW1ZTUcwRWRQbnVhc1dCbWxjSTFhVXJxU0Vhc3VLK1dpd0pPSFN2THo3MTVNN3hTL3JJRUxhZCt6eDJ3Yk5iek5BeSs3SkhCWkE1Zk95MmFvczJvWEl1RmhySll4L0ppZUZNdVZMaTdxN082bDk0L21VVFVYR3l4Zm1jWUpsQVRlUGtwbHhlVmMwM2JrMXhNTy9iY1hla0dldVVoMDRER1hQWEMxdEdkbVpMNFNIWVdVcWxKT2pQdzVFalVKOGRGQzJzOFhPQVpVVUdxY2tSTFB5M0t3ZldiUXplM2RkQ0QzQTEreGdkVVJUWU9jQnMwdk9NTnJ0QlQvV25yY0M1RVZtdy9BaXhZNEx2eXJYMzNVb3JmcGptYW1wNitWd0ZHbzRPSkNnWmlZYUNIdGdkQ0R4ZUZJa3lKSnNpd3RnWWR1alFKMFJVMGpnejVNbytNNldzbVZPblkyRzYxTnJid3N4Nm4yczdWMWoxNk9IdmRjT3NTaWtYRDF6ZDE3MzROZnpjN09mZ0p6dkFCY3czRXhJTHA1dWN0WVp3VFBSSmtjZWxVRFIyd1AwTERQQU4zRmFodWgxZC8yNVZLSTNrSXJ1TjRNeFlrMU5VMVVVbEp3cHEyMTRldkljYy9sd1Y2dXh5eEs0SGlZLy9Ub3oySkhSMGIzYjFpWHRWYkhzVHFtMUtCcUJFT2FTYkhSL0Z1cHBRTndLMWVxSXF4S2pGTVNKUUNOMEtxam81MTZlYTAwOTFnSTJYaHR0V29la3k0cXlqOTAvTmo3WHlvODhVSFo1UXJ0UXE1cjBRS1hOLzN0Ny8za2tkUzA5QjlqcFVNQWgxckhhSnFjcUkrd0N2WlpncTZxYStKcWxsNmUxdHN2eW55cjJDa0xOUms4ZzRNOWJ6WlVWRHl3bUR6dXVZQmY5TUNsdEhQaFgrNnExYXRXU3VBaHZKeVluYWZwSnNaR2lodzNScTBnOVMwdGJWUllWTUh6cDl0NVNzN0FrQzNVK1B2RjZuSC90d1V1Yi95UlIzLzZvdzNyTmowU0htN1dBRGdTSTJqZDdHVlhWOWRSNFpseThRcXFNZGRnWjF0VDdZOExUaDc2eFZ3ZTJtSStaa2xJdUJxQUtKZk9YUFhPdXF5c1dBQ3ZZdEJIUGp6RnF4eTMwT2hRVjMxUFo5dlhUaHpMRGI0aThHSW1PY3RyWDNMQTVYMy80SWYvOWtSU1d1cW45NzY5cjVPellhL2FyZGJIbDdwOW5nM3ovd2NqMEllT1BUVHcxQUFBQUFCSlJVNUVya0pnZ2c9PSIvPjwvZz48L2c+PGcgZGF0YS1jZWxsLWlkPSIxMyI+PGc+PHJlY3QgeD0iMjAiIHk9IjE3MCIgd2lkdGg9IjYwIiBoZWlnaHQ9IjMwIiBmaWxsPSJub25lIiBzdHJva2U9Im5vbmUiIHBvaW50ZXItZXZlbnRzPSJhbGwiLz48L2c+PGc+PGc+PHN3aXRjaD48Zm9yZWlnbk9iamVjdCBzdHlsZT0ib3ZlcmZsb3c6IHZpc2libGU7IHRleHQtYWxpZ246IGxlZnQ7IiBwb2ludGVyLWV2ZW50cz0ibm9uZSIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgcmVxdWlyZWRGZWF0dXJlcz0iaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHMTEvZmVhdHVyZSNFeHRlbnNpYmlsaXR5Ij48ZGl2IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBzdHlsZT0iZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IHVuc2FmZSBjZW50ZXI7IGp1c3RpZnktY29udGVudDogdW5zYWZlIGNlbnRlcjsgd2lkdGg6IDU4cHg7IGhlaWdodDogMXB4OyBwYWRkaW5nLXRvcDogMTg1cHg7IG1hcmdpbi1sZWZ0OiAyMXB4OyI+PGRpdiBzdHlsZT0iYm94LXNpemluZzogYm9yZGVyLWJveDsgZm9udC1zaXplOiAwOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiAjMDAwMEZGOyAiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgZm9udC1zaXplOiAxMnB4OyBmb250LWZhbWlseTogSGVsdmV0aWNhOyBjb2xvcjogbGlnaHQtZGFyaygjMDAwMEZGLCAjY2RjZGZmKTsgbGluZS1oZWlnaHQ6IDEuMjsgcG9pbnRlci1ldmVudHM6IGFsbDsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd29yZC13cmFwOiBub3JtYWw7ICI+TGlnbmU8YnIgLz4zMDBtPC9kaXY+PC9kaXY+PC9kaXY+PC9mb3JlaWduT2JqZWN0Pjx0ZXh0IHg9IjUwIiB5PSIxODkiIGZpbGw9IiMwMDAwRkYiIGZvbnQtZmFtaWx5PSJIZWx2ZXRpY2EiIGZvbnQtc2l6ZT0iMTJweCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+TGlnbmUuLi48L3RleHQ+PC9zd2l0Y2g+PC9nPjwvZz48L2c+PGcgZGF0YS1jZWxsLWlkPSIxNCI+PGc+PHJlY3QgeD0iMTQwIiB5PSIxMTAiIHdpZHRoPSI2MCIgaGVpZ2h0PSIzMCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJub25lIiBwb2ludGVyLWV2ZW50cz0iYWxsIi8+PC9nPjxnPjxnPjxzd2l0Y2g+PGZvcmVpZ25PYmplY3Qgc3R5bGU9Im92ZXJmbG93OiB2aXNpYmxlOyB0ZXh0LWFsaWduOiBsZWZ0OyIgcG9pbnRlci1ldmVudHM9Im5vbmUiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHJlcXVpcmVkRmVhdHVyZXM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1NWRzExL2ZlYXR1cmUjRXh0ZW5zaWJpbGl0eSI+PGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiB1bnNhZmUgY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IHVuc2FmZSBjZW50ZXI7IHdpZHRoOiA1OHB4OyBoZWlnaHQ6IDFweDsgcGFkZGluZy10b3A6IDEyNXB4OyBtYXJnaW4tbGVmdDogMTQxcHg7Ij48ZGl2IHN0eWxlPSJib3gtc2l6aW5nOiBib3JkZXItYm94OyBmb250LXNpemU6IDA7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6ICMwMDAwMDA7ICI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyBmb250LXNpemU6IDEycHg7IGZvbnQtZmFtaWx5OiBIZWx2ZXRpY2E7IGNvbG9yOiBsaWdodC1kYXJrKCMwMDAwMDAsICNmZmZmZmYpOyBsaW5lLWhlaWdodDogMS4yOyBwb2ludGVyLWV2ZW50czogYWxsOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3b3JkLXdyYXA6IG5vcm1hbDsgIj5Qb3N0ZSBkZSB0cmF2YWlsPC9kaXY+PC9kaXY+PC9kaXY+PC9mb3JlaWduT2JqZWN0Pjx0ZXh0IHg9IjE3MCIgeT0iMTI5IiBmaWxsPSJsaWdodC1kYXJrKCMwMDAwMDAsICNmZmZmZmYpIiBmb250LWZhbWlseT0iSGVsdmV0aWNhIiBmb250LXNpemU9IjEycHgiIHRleHQtYW5jaG9yPSJtaWRkbGUiPlBvc3RlIGRlIHQuLi48L3RleHQ+PC9zd2l0Y2g+PC9nPjwvZz48L2c+PC9nPjwvZz48L2c+PHN3aXRjaD48ZyByZXF1aXJlZEZlYXR1cmVzPSJodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcxMS9mZWF0dXJlI0V4dGVuc2liaWxpdHkiLz48YSB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC01KSIgeGxpbms6aHJlZj0iaHR0cHM6Ly93d3cuZHJhd2lvLmNvbS9kb2MvZmFxL3N2Zy1leHBvcnQtdGV4dC1wcm9ibGVtcyIgdGFyZ2V0PSJfYmxhbmsiPjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTBweCIgeD0iNTAlIiB5PSIxMDAlIj5UZXh0IGlzIG5vdCBTVkcgLSBjYW5ub3QgZGlzcGxheTwvdGV4dD48L2E+PC9zd2l0Y2g+PC9zdmc+

C'est une application web moderne et responsive pour la visualisation de données de capteurs en temps réel avec des coordonnées X, Y, Z. Elle comprend :

  • un logiciel d'acquisition
  • une interface IHM
  • un service windows pour synchroniser l'heure avec un GPS
  • un simulateur Python
  • un utilitaire pour lister les ports COM disponibles

📋 Dépôt Source

Fonctionnalités

Caractéristiques principales

  • Graphiques en Temps Réel : Visualisation des données issue des capteurs en direct.
  • Graphiques Intelligent : graphiques dynamique avec capacités de zoom, survol des valeurs, ...
  • Support Multi-capteurs : affichage de 7 capteurs simultanément
  • Vues Individuelles/Combinées : Affichage de l'ensemble des capteurs ainsi que le détail pour chacun
  • Contrôles d'Échelle et Décalage : Ajustement en temps réel des valeurs d'échelle et de décalage des capteurs
  • Synchronisation de l'heure: synchronisation de l'heure sur une référence fiable (GPS)

Simulateur

Programme créé pour simuler le fonctionnement des la partie acquisition.

  • Simulateur Toujours Actif : Le programme fonctionne en continu en arrière-plan
  • Contrôle d'Acquisition Instantané : Réagit aux ordres de démarrage / arret
  • Communication d'État YAML : Mises à jour d'état en temps réel via fichier status.yaml
  • Données : Génère les données pour tous les capteurs configurés indépendamment de l'état activé

Interface Utilisateur IHM

  • Interface Modale : Sélection des capteurs, intégration de fichiers et paramètres dans des popups (modal box)
  • Suivit d'acquisition : rafraichissment des graphiques uniquement en mode acquisition
  • État en Temps Réel : Affichage en direct de l'état de l'acquisition et du nombre d'échantillons
  • Design Responsive : Interface basée sur Bootstrap.

Magnetometer

  • Simulateur Continu : Génération de données de capteurs basée sur Python avec contrôle instantané
  • Lecteur CSV Magnétomètre : Importer et relire des fichiers de données historiques
  • Lancement d'Application Externe : Démarrer des applications externes et lire leurs fichiers de données
  • Entrée Temps Réel : Prêt pour l'intégration de matériel de capteurs en direct

Gestion de Configuration

  • Sauvegardes Automatiques : Sauvegardes de configuration horodatées.
  • Mappage Dynamique des Capteurs : Configurer les capteurs sans modifications de code

Gestion des Données

  • Fichiers CSV : Chaque acquisition crée des fichiers de données horodatés
  • Navigateur de Fichiers Historiques : Charge et analyse les sessions de données précédentes

Déploiement de Production

  • PHP 8.2/Apache : Serveur web professionnel avec configuration personnalisée
  • Python 3.12 : pour la partie acquisition et simulateur
  • Cpp : pour certains outils anexes (synchro GPS, ...)

🚀 Démarrage Rapide

Déploiement de Production (Docker)

  1. Installation

  2. Accéder à l'Application :

    • Interface Web : http://localhost

Configuration de Développement

  1. Installer les Dépendances Python :

    pip install -r requirements.txt
    
  2. Démarrer le Simulateur Continu :

    python3 sensor_simulator.py --rate 10
    
  3. Démarrer l'Application :

    cd setup && ./startup.sh
    
  4. Démarrer le Simulateur de Capteurs :

    # Démarrage de base (contrôle manuel via interface web)
    ./start_simulator.sh
    
    # Démarrage automatique avec projet et campagne
    ./start_simulator.sh --project test_project --campaign demo_run
    
  5. Contrôler l'Acquisition :

    • Interface Web : Utiliser les contrôles modaux ou l'interface principale
    • CLI : python3 simulator_control.py start --project monproject --campaign test

🎮 Contrôle de l'acquisition / du simulateur

Communication par Fichier d'État

L'IHM et Magnetometer.exe lisent régulièrement le fichier config/status.yaml, la communication se fait au travers de ce fichier.

acquisition:
  campaign: _
  commands: []
  current_file: _
  project: _
  sample_count: 0
  status: Stopped

Démarrage de l'application

Magnetometer.exe modifie le champs status: lors de l'initialisation des capteurs. Quand les capteurs sont correctement initialisés, status prend la valeur status: Ready

Lancement d'une acquisition

L'IHM place dans status.yaml, les informations nécessaires :

...
commands:
   - type: start
     project: <nom projet>
     campaign: <nom mesure>
...

Le programme Magnetometer.exe 'voit' cette demande et déclanche la lecture des capteurs, il vide le champs 'commands', puis met à jour les informations à transmettre à l'IHM

acquisition:
  campaign: <nom mesure>
  commands: []
  current_file: MAGNETOMETER_<timestamp>_<nom projet>_<nom mesure>.csv
  project: <nom projet>
  sample_count: <nb mesures effectuées>
  status: Running

Arret d'une acquisition

L'IHM place dans status.yaml, les informations nécessaires :

...
commands:
   - type: stop
...

Le programme Magnetometer.exe 'voit' cette demande et arrete la lecture des capteurs, il vide le champs 'commands', puis met à jour les informations.

acquisition:
  campaign: -
  commands: []
  current_file: -
  project: -
  sample_count: 0
  status: Idle

Arret de magnetometer.exe

Le programme Magnetometer.exe met à jour les informations comme suit :

acquisition:
  campaign: -
  commands: []
  current_file: -
  project: -
  sample_count: 0
  status: Not Running

📁 Fichiers de Données

Génération CSV Automatique

  • Basé sur Session : Chaque acquisition crée un nouveau fichier horodaté
  • Format : SENSOR_YYYY-MM-DD_HH-MM-SS_projet_campagne.csv
  • Localisation : Dossier c:/Mkii/data/
  • En-têtes : Timestamp, Time_s, Bx, By, Bz, Temperature, Angle_X, Angle_Y, Angle_Z

Accès aux Données Historiques

  • Navigateur de Fichiers : Interface modale pour la sélection de fichiers historiques
  • Lecture : Lecture en temps réel des données historiques
  • Importation : Télécharger des fichiers CSV externes pour analyse

🏗️ Architecture

Composants du Système

Le diagramme suivant représente le principe de fonctionnement de l'application. Nous retrouvons les deux processus IHM et Magnetometer.exe qui sont deux applications autonomes. Elles échangent leurs informations au travers du fichier c:/Mkii/config/status.yaml

PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7IGNvbG9yLXNjaGVtZTogbGlnaHQgZGFyazsiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI2NTFweCIgaGVpZ2h0PSI1MzFweCIgdmlld0JveD0iLTAuNSAtMC41IDY1MSA1MzEiIGNvbnRlbnQ9IiZsdDtteGZpbGUgaG9zdD0mcXVvdDtlbWJlZC5kaWFncmFtcy5uZXQmcXVvdDsgYWdlbnQ9JnF1b3Q7TW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NDsgcnY6MTM1LjApIEdlY2tvLzIwMTAwMTAxIEZpcmVmb3gvMTM1LjAmcXVvdDsgdmVyc2lvbj0mcXVvdDsyOC4xLjEmcXVvdDsmZ3Q7Jmx0O2RpYWdyYW0gaWQ9JnF1b3Q7emNDNXU0Y0d2TlZUUW1oaElKUFImcXVvdDsgbmFtZT0mcXVvdDtQYWdlLTEmcXVvdDsmZ3Q7N1psZGI2TTZFSVovVFc0ckRJRW1sMDNhN2g2cDFhNjJGM3Z0d0FCV0RZNk1zMG4yMTU4eG1LK1liSEowU0t1VnFDSVZqNy9meHg3alllYXRzOE1YU2JmcHE0aUF6MXduT3N5OHg1bnJrcmtiNEQ5dE9WYVdSVUFxUXlKWlpBcTFoamYyRzR6Uk1kWWRpNkRvRlZSQ2NNVzJmV01vOGh4QzFiTlJLY1crWHl3V3ZOL3JsaVpnR2Q1Q3ltM3JUeGFwMU16Q3ZXL3RYNEVsYWQwekNaWlZUa2Jyd21ZbVJVb2pzZStZdktlWnQ1WkNxT29wTzZ5QmEvRnFYYXA2ejJkeW00Rkp5TlUxRmVweC9LSjhaeVpuQnFhTzlXeWwyT1VSNkFyT3pGdnRVNmJnYlV0RG5idEh2bWhMVmNZeFJmRFJOQWRTd2VIc21FZ3pVMXdpSURKUThvaEZUQVhQak1rc2pzQWs5NjNTZ1c5c2FVZGx2NjVIRGQya2Fia1ZBQitNQm1jRVhQd1hQY2hsUFJKSkk0WVRYd3N1WkZuZlc2K2Y4US96Qk5aaVNrL1RkOGFSenAzM3RXdlNIZkVhVzFjOGJ3engzTXZhNFhyZjZzZHd0NEhMNG0wcXBWODJqWUdHNzBtcC83ZWQ0aXdIWTQrb2ZQL1dxT25jT1g3ZjZKWldYVEptbkhkWXhISHNoaUhhQ3lYRk8zUnlvbUFUK01FNFdQdytsWVVOaFN3R29KQXhvSGdUbEdFbzg4VW5VcGxiVlA3NSttcUJ3Y21wdnZpVXN5VFhxSENTZ0tLc3RBUU1UNllIazVHeEtPTG5LUFk5ZVN4eVpjNVdNcEttaFBRMUpRUCtKeGh5UHlOSTZsdVN2dElrQjZWYkFua0hCL2o3OWZYOXo5TTNzUFF0RkZXNzR1NUlVVDdMcCt4WnhxbjJCWlVPSmtmckVxYU1SeS8wS0haNmROaEkrRjZuVnFtUTdEZVdwelVRekphMWlwN1RLL0dtYTVvMkpSUlk1bnN0SkRreHZkSkRyK0FMTFZROUdzRTUzUlpzdzJ1L2xWR1pzSHdsRkM2ZEQzdnBjWmNuSi9lUU94bzZ1WmNqb0wyMzBLNUZsdEU4d2pZZnp1MmF2blBPUmNXNjQ4bU5xZDVTSEdMMXB3MVY2Rk1oVDE3S1lvL3oxdkxEVEZhYkJGYVBlZm5HbkdKRndCWldXOEZ5VmM3ZVgrRVA5Vmc3ZC83TXg3R3VNVTNhTlA1MGNZbHZZemtPbjdLU0RlQmkySU5lRUxpQmNVblRUYk5VeCtBZURITS85bmZtSmN4ajdHRDczYmJhd1NWa1orSjhTODREdDVpYmNhNFA0UTVvdkFuSExKbGM5UzFjOVp4Y3laYTRZOEFsOWk2R3ZCQnk4dFVqZ0hlR3lYK0NzeWIyYmJvQXlmUnVtekRmRnZPSCttcjdmcDVzcDYxOGM4YkxqMlJzMy9idFE5akVZR0lPaHdjZG9zWjVRaDZaeDhlUTA2SmdZWDNLMnVhT1BQMWJhTlVUUkZaRSsrSngxNVhHR1RyT2FxTUVUaFg3MWU5Z1NERFR4M2U5Y2pwQmc1TkxyWHQ2VEJaaUowTXd0ZHhPTVB1a0lmY2tvbU1GTlZHNkJKVFZVTW12bWZoMVNPMW93NFMwSlhIdjM0Wm9FN083QVZFN3ZqRVJiVW5NNXhmMjFyVklUME5ZMXRvWUVha2QxNWlRbmtkcWJhNXJrUWJPeHlGZFdraWZHZDVTQWE4L1oxNlliaG5kTlozVlY3TC85ZFh6NUxQbjBLZTdrVUs3bUd5L01GY1EydS8wM3RPLyZsdDsvZGlhZ3JhbSZndDsmbHQ7L214ZmlsZSZndDsiPjxkZWZzPjxsaW5lYXJHcmFkaWVudCB4MT0iMCUiIHkxPSIwJSIgeDI9IjAlIiB5Mj0iMTAwJSIgaWQ9ImRyYXdpby1zdmctZXppT1hHa3k5OHBvZzRtTGxWd2MtZ3JhZGllbnQtbGlnaHQtZGFya19mZmZmZmZfdmFyXy0tZ2UtZGFyay1jb2xvcl8xMjEyMTJfLTEtbGlnaHQtZGFya19jY2ZmZmZfMDAyNTI1Xy0xLXMtMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIgc3R5bGU9InN0b3AtY29sb3I6IGxpZ2h0LWRhcmsoI2ZmZmZmZiwgdmFyKC0tZ2UtZGFyay1jb2xvciwgIzEyMTIxMikpOyBzdG9wLW9wYWNpdHk6IDE7IiBzdG9wLW9wYWNpdHk9IjEiLz48c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNDQ0ZGRkYiIHN0eWxlPSJzdG9wLWNvbG9yOiBsaWdodC1kYXJrKHJnYigyMDQsIDI1NSwgMjU1KSwgcmdiKDAsIDM3LCAzNykpOyBzdG9wLW9wYWNpdHk6IDE7IiBzdG9wLW9wYWNpdHk9IjEiLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48Zz48ZyBkYXRhLWNlbGwtaWQ9IjAiPjxnIGRhdGEtY2VsbC1pZD0iMSI+PGcgZGF0YS1jZWxsLWlkPSIyMCI+PGc+PHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjY1MCIgaGVpZ2h0PSI1MzAiIGZpbGw9IiNmZmZmZmYiIHN0eWxlPSJmaWxsOiBsaWdodC1kYXJrKCNmZmZmZmYsIHZhcigtLWdlLWRhcmstY29sb3IsICMxMjEyMTIpKTsgc3Ryb2tlOiBsaWdodC1kYXJrKHJnYigwLCAwLCAwKSwgcmdiKDI1NSwgMjU1LCAyNTUpKTsiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRlci1ldmVudHM9ImFsbCIvPjwvZz48L2c+PGcgZGF0YS1jZWxsLWlkPSIxOCI+PGc+PHJlY3QgeD0iMjEwIiB5PSIxODAiIHdpZHRoPSIyNDAiIGhlaWdodD0iMzMwIiByeD0iMzYiIHJ5PSIzNiIgZmlsbC1vcGFjaXR5PSIwLjUiIGZpbGw9InVybCgjZHJhd2lvLXN2Zy1lemlPWEdreTk4cG9nNG1MbFZ3Yy1ncmFkaWVudC1saWdodC1kYXJrX2ZmZmZmZl92YXJfLS1nZS1kYXJrLWNvbG9yXzEyMTIxMl8tMS1saWdodC1kYXJrX2NjZmZmZl8wMDI1MjVfLTEtcy0wKSIgc3R5bGU9ImZpbGw6IHVybCgmcXVvdDsjZHJhd2lvLXN2Zy1lemlPWEdreTk4cG9nNG1MbFZ3Yy1ncmFkaWVudC1saWdodC1kYXJrX2ZmZmZmZl92YXJfLS1nZS1kYXJrLWNvbG9yXzEyMTIxMl8tMS1saWdodC1kYXJrX2NjZmZmZl8wMDI1MjVfLTEtcy0wJnF1b3Q7KTsgc3Ryb2tlOiBsaWdodC1kYXJrKHJnYigwLCAwLCAwKSwgcmdiKDI1NSwgMjU1LCAyNTUpKTsiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuNSIgcG9pbnRlci1ldmVudHM9ImFsbCIvPjwvZz48L2c+PGcgZGF0YS1jZWxsLWlkPSIyIj48Zz48cGF0aCBkPSJNIDIwIDIwIEwgMTgwIDIwIEwgMjAwIDQwIEwgMjAwIDE1MCBMIDQwIDE1MCBMIDIwIDEzMCBMIDIwIDIwIFoiIGZpbGw9IiNmZmYyY2MiIHN0eWxlPSJmaWxsOiBsaWdodC1kYXJrKHJnYigyNTUsIDI0MiwgMjA0KSwgcmdiKDQwLCAyOSwgMCkpOyBzdHJva2U6IGxpZ2h0LWRhcmsocmdiKDIxNCwgMTgyLCA4NiksIHJnYigxMDksIDgxLCAwKSk7IiBzdHJva2U9IiNkNmI2NTYiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgcG9pbnRlci1ldmVudHM9ImFsbCIvPjxwYXRoIGQ9Ik0gMjAgMjAgTCAxODAgMjAgTCAyMDAgNDAgTCA0MCA0MCBaIiBmaWxsLW9wYWNpdHk9IjAuMDUiIGZpbGw9IiMwMDAwMDAiIHN0eWxlPSJmaWxsOiBsaWdodC1kYXJrKHJnYigwLCAwLCAwKSwgcmdiKDIzNywgMjM3LCAyMzcpKTsiIHN0cm9rZT0ibm9uZSIgcG9pbnRlci1ldmVudHM9ImFsbCIvPjxwYXRoIGQ9Ik0gMjAgMjAgTCA0MCA0MCBMIDQwIDE1MCBMIDIwIDEzMCBaIiBmaWxsLW9wYWNpdHk9IjAuMSIgZmlsbD0iIzAwMDAwMCIgc3R5bGU9ImZpbGw6IGxpZ2h0LWRhcmsocmdiKDAsIDAsIDApLCByZ2IoMjM3LCAyMzcsIDIzNykpOyIgc3Ryb2tlPSJub25lIiBwb2ludGVyLWV2ZW50cz0iYWxsIi8+PHBhdGggZD0iTSA0MCAxNTAgTCA0MCA0MCBMIDIwIDIwIE0gNDAgNDAgTCAyMDAgNDAiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2Q2YjY1NiIgc3R5bGU9InN0cm9rZTogbGlnaHQtZGFyayhyZ2IoMjE0LCAxODIsIDg2KSwgcmdiKDEwOSwgODEsIDApKTsiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgcG9pbnRlci1ldmVudHM9ImFsbCIvPjwvZz48L2c+PGcgZGF0YS1jZWxsLWlkPSIzIj48Zz48cGF0aCBkPSJNIDQ1MCAyMCBMIDYxMCAyMCBMIDYzMCA0MCBMIDYzMCAxNTAgTCA0NzAgMTUwIEwgNDUwIDEzMCBMIDQ1MCAyMCBaIiBmaWxsPSIjZmZmMmNjIiBzdHlsZT0iZmlsbDogbGlnaHQtZGFyayhyZ2IoMjU1LCAyNDIsIDIwNCksIHJnYig0MCwgMjksIDApKTsgc3Ryb2tlOiBsaWdodC1kYXJrKHJnYigyMTQsIDE4MiwgODYpLCByZ2IoMTA5LCA4MSwgMCkpOyIgc3Ryb2tlPSIjZDZiNjU2IiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiIHBvaW50ZXItZXZlbnRzPSJhbGwiLz48cGF0aCBkPSJNIDQ1MCAyMCBMIDYxMCAyMCBMIDYzMCA0MCBMIDQ3MCA0MCBaIiBmaWxsLW9wYWNpdHk9IjAuMDUiIGZpbGw9IiMwMDAwMDAiIHN0eWxlPSJmaWxsOiBsaWdodC1kYXJrKHJnYigwLCAwLCAwKSwgcmdiKDIzNywgMjM3LCAyMzcpKTsiIHN0cm9rZT0ibm9uZSIgcG9pbnRlci1ldmVudHM9ImFsbCIvPjxwYXRoIGQ9Ik0gNDUwIDIwIEwgNDcwIDQwIEwgNDcwIDE1MCBMIDQ1MCAxMzAgWiIgZmlsbC1vcGFjaXR5PSIwLjEiIGZpbGw9IiMwMDAwMDAiIHN0eWxlPSJmaWxsOiBsaWdodC1kYXJrKHJnYigwLCAwLCAwKSwgcmdiKDIzNywgMjM3LCAyMzcpKTsiIHN0cm9rZT0ibm9uZSIgcG9pbnRlci1ldmVudHM9ImFsbCIvPjxwYXRoIGQ9Ik0gNDcwIDE1MCBMIDQ3MCA0MCBMIDQ1MCAyMCBNIDQ3MCA0MCBMIDYzMCA0MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZDZiNjU2IiBzdHlsZT0ic3Ryb2tlOiBsaWdodC1kYXJrKHJnYigyMTQsIDE4MiwgODYpLCByZ2IoMTA5LCA4MSwgMCkpOyIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIiBwb2ludGVyLWV2ZW50cz0iYWxsIi8+PC9nPjwvZz48ZyBkYXRhLWNlbGwtaWQ9IjQiPjxnPjxyZWN0IHg9IjgwIiB5PSI4MCIgd2lkdGg9IjYwIiBoZWlnaHQ9IjMwIiBmaWxsPSJub25lIiBzdHJva2U9Im5vbmUiIHBvaW50ZXItZXZlbnRzPSJhbGwiLz48L2c+PGc+PGc+PHN3aXRjaD48Zm9yZWlnbk9iamVjdCBzdHlsZT0ib3ZlcmZsb3c6IHZpc2libGU7IHRleHQtYWxpZ246IGxlZnQ7IiBwb2ludGVyLWV2ZW50cz0ibm9uZSIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgcmVxdWlyZWRGZWF0dXJlcz0iaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHMTEvZmVhdHVyZSNFeHRlbnNpYmlsaXR5Ij48ZGl2IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBzdHlsZT0iZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IHVuc2FmZSBjZW50ZXI7IGp1c3RpZnktY29udGVudDogdW5zYWZlIGNlbnRlcjsgd2lkdGg6IDU4cHg7IGhlaWdodDogMXB4OyBwYWRkaW5nLXRvcDogOTVweDsgbWFyZ2luLWxlZnQ6IDgxcHg7Ij48ZGl2IHN0eWxlPSJib3gtc2l6aW5nOiBib3JkZXItYm94OyBmb250LXNpemU6IDA7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6ICMwMDAwMDA7ICI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyBmb250LXNpemU6IDE2cHg7IGZvbnQtZmFtaWx5OiBIZWx2ZXRpY2E7IGNvbG9yOiBsaWdodC1kYXJrKCMwMDAwMDAsICNmZmZmZmYpOyBsaW5lLWhlaWdodDogMS4yOyBwb2ludGVyLWV2ZW50czogYWxsOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3b3JkLXdyYXA6IG5vcm1hbDsgIj5JSE08L2Rpdj48L2Rpdj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PHRleHQgeD0iMTEwIiB5PSIxMDAiIGZpbGw9ImxpZ2h0LWRhcmsoIzAwMDAwMCwgI2ZmZmZmZikiIGZvbnQtZmFtaWx5PSJIZWx2ZXRpY2EiIGZvbnQtc2l6ZT0iMTZweCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+SUhNPC90ZXh0Pjwvc3dpdGNoPjwvZz48L2c+PC9nPjxnIGRhdGEtY2VsbC1pZD0iNSI+PGc+PHJlY3QgeD0iNTIwIiB5PSI4MCIgd2lkdGg9IjYwIiBoZWlnaHQ9IjMwIiBmaWxsPSJub25lIiBzdHJva2U9Im5vbmUiIHBvaW50ZXItZXZlbnRzPSJhbGwiLz48L2c+PGc+PGc+PHN3aXRjaD48Zm9yZWlnbk9iamVjdCBzdHlsZT0ib3ZlcmZsb3c6IHZpc2libGU7IHRleHQtYWxpZ246IGxlZnQ7IiBwb2ludGVyLWV2ZW50cz0ibm9uZSIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgcmVxdWlyZWRGZWF0dXJlcz0iaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHMTEvZmVhdHVyZSNFeHRlbnNpYmlsaXR5Ij48ZGl2IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBzdHlsZT0iZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IHVuc2FmZSBjZW50ZXI7IGp1c3RpZnktY29udGVudDogdW5zYWZlIGNlbnRlcjsgd2lkdGg6IDU4cHg7IGhlaWdodDogMXB4OyBwYWRkaW5nLXRvcDogOTVweDsgbWFyZ2luLWxlZnQ6IDUyMXB4OyI+PGRpdiBzdHlsZT0iYm94LXNpemluZzogYm9yZGVyLWJveDsgZm9udC1zaXplOiAwOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiAjMDAwMDAwOyAiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgZm9udC1zaXplOiAxNnB4OyBmb250LWZhbWlseTogSGVsdmV0aWNhOyBjb2xvcjogbGlnaHQtZGFyaygjMDAwMDAwLCAjZmZmZmZmKTsgbGluZS1oZWlnaHQ6IDEuMjsgcG9pbnRlci1ldmVudHM6IGFsbDsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd29yZC13cmFwOiBub3JtYWw7ICI+TWFnbmV0b21ldGVyLmV4ZTwvZGl2PjwvZGl2PjwvZGl2PjwvZm9yZWlnbk9iamVjdD48dGV4dCB4PSI1NTAiIHk9IjEwMCIgZmlsbD0ibGlnaHQtZGFyaygjMDAwMDAwLCAjZmZmZmZmKSIgZm9udC1mYW1pbHk9IkhlbHZldGljYSIgZm9udC1zaXplPSIxNnB4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj5NYWduZXRvLi4uPC90ZXh0Pjwvc3dpdGNoPjwvZz48L2c+PC9nPjxnIGRhdGEtY2VsbC1pZD0iNiI+PGc+PHBhdGggZD0iTSAyNjAgMjUwIEwgMjYwIDIyMCBMIDQwMCAyMjAgTCA0MDAgMjUwIiBmaWxsPSIjZmZmZmZmIiBzdHlsZT0iZmlsbDogbGlnaHQtZGFyaygjZmZmZmZmLCB2YXIoLS1nZS1kYXJrLWNvbG9yLCAjMTIxMjEyKSk7IHN0cm9rZTogbGlnaHQtZGFyayhyZ2IoMCwgMCwgMCksIHJnYigyNTUsIDI1NSwgMjU1KSk7IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgcG9pbnRlci1ldmVudHM9ImFsbCIvPjxwYXRoIGQ9Ik0gMjYwIDI1MCBMIDI2MCAzMTAgTCA0MDAgMzEwIEwgNDAwIDI1MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHlsZT0ic3Ryb2tlOiBsaWdodC1kYXJrKHJnYigwLCAwLCAwKSwgcmdiKDI1NSwgMjU1LCAyNTUpKTsiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgcG9pbnRlci1ldmVudHM9Im5vbmUiLz48cGF0aCBkPSJNIDI2MCAyNTAgTCA0MDAgMjUwIiBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIHN0eWxlPSJzdHJva2U6IGxpZ2h0LWRhcmsocmdiKDAsIDAsIDApLCByZ2IoMjU1LCAyNTUsIDI1NSkpOyIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIiBwb2ludGVyLWV2ZW50cz0ibm9uZSIvPjwvZz48Zz48Zz48c3dpdGNoPjxmb3JlaWduT2JqZWN0IHN0eWxlPSJvdmVyZmxvdzogdmlzaWJsZTsgdGV4dC1hbGlnbjogbGVmdDsiIHBvaW50ZXItZXZlbnRzPSJub25lIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiByZXF1aXJlZEZlYXR1cmVzPSJodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcxMS9mZWF0dXJlI0V4dGVuc2liaWxpdHkiPjxkaXYgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHN0eWxlPSJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogdW5zYWZlIGNlbnRlcjsganVzdGlmeS1jb250ZW50OiB1bnNhZmUgY2VudGVyOyB3aWR0aDogMTM4cHg7IGhlaWdodDogMXB4OyBwYWRkaW5nLXRvcDogMjM1cHg7IG1hcmdpbi1sZWZ0OiAyNjFweDsiPjxkaXYgc3R5bGU9ImJveC1zaXppbmc6IGJvcmRlci1ib3g7IGZvbnQtc2l6ZTogMDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogIzAwMDAwMDsgIj48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IGZvbnQtc2l6ZTogMTJweDsgZm9udC1mYW1pbHk6IEhlbHZldGljYTsgY29sb3I6IGxpZ2h0LWRhcmsoIzAwMDAwMCwgI2ZmZmZmZik7IGxpbmUtaGVpZ2h0OiAxLjI7IHBvaW50ZXItZXZlbnRzOiBhbGw7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdvcmQtd3JhcDogbm9ybWFsOyAiPnN0YXR1cy55YW1sPC9kaXY+PC9kaXY+PC9kaXY+PC9mb3JlaWduT2JqZWN0Pjx0ZXh0IHg9IjMzMCIgeT0iMjM5IiBmaWxsPSJsaWdodC1kYXJrKCMwMDAwMDAsICNmZmZmZmYpIiBmb250LWZhbWlseT0iSGVsdmV0aWNhIiBmb250LXNpemU9IjEycHgiIHRleHQtYW5jaG9yPSJtaWRkbGUiPnN0YXR1cy55YW1sPC90ZXh0Pjwvc3dpdGNoPjwvZz48L2c+PGcgZGF0YS1jZWxsLWlkPSI3Ij48Zz48cmVjdCB4PSIyNjAiIHk9IjI1MCIgd2lkdGg9IjE0MCIgaGVpZ2h0PSIzMCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJub25lIiBwb2ludGVyLWV2ZW50cz0iYWxsIi8+PC9nPjxnPjxnPjxzd2l0Y2g+PGZvcmVpZ25PYmplY3Qgc3R5bGU9Im92ZXJmbG93OiB2aXNpYmxlOyB0ZXh0LWFsaWduOiBsZWZ0OyIgcG9pbnRlci1ldmVudHM9Im5vbmUiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHJlcXVpcmVkRmVhdHVyZXM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1NWRzExL2ZlYXR1cmUjRXh0ZW5zaWJpbGl0eSI+PGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiB1bnNhZmUgY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IHVuc2FmZSBmbGV4LXN0YXJ0OyB3aWR0aDogMTMwcHg7IGhlaWdodDogMXB4OyBwYWRkaW5nLXRvcDogMjY1cHg7IG1hcmdpbi1sZWZ0OiAyNjZweDsiPjxkaXYgc3R5bGU9ImJveC1zaXppbmc6IGJvcmRlci1ib3g7IGZvbnQtc2l6ZTogMDsgdGV4dC1hbGlnbjogbGVmdDsgbWF4LWhlaWdodDogMjZweDsgb3ZlcmZsb3c6IGhpZGRlbjsgY29sb3I6ICMwMDAwMDA7ICI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyBmb250LXNpemU6IDEycHg7IGZvbnQtZmFtaWx5OiBIZWx2ZXRpY2E7IGNvbG9yOiBsaWdodC1kYXJrKCMwMDAwMDAsICNmZmZmZmYpOyBsaW5lLWhlaWdodDogMS4yOyBwb2ludGVyLWV2ZW50czogYWxsOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3b3JkLXdyYXA6IG5vcm1hbDsgIj5Db21tYW5kczo8L2Rpdj48L2Rpdj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PHRleHQgeD0iMjY2IiB5PSIyNjkiIGZpbGw9ImxpZ2h0LWRhcmsoIzAwMDAwMCwgI2ZmZmZmZikiIGZvbnQtZmFtaWx5PSJIZWx2ZXRpY2EiIGZvbnQtc2l6ZT0iMTJweCI+Q29tbWFuZHM6PC90ZXh0Pjwvc3dpdGNoPjwvZz48L2c+PC9nPjxnIGRhdGEtY2VsbC1pZD0iOCI+PGc+PHJlY3QgeD0iMjYwIiB5PSIyODAiIHdpZHRoPSIxNDAiIGhlaWdodD0iMzAiIGZpbGw9Im5vbmUiIHN0cm9rZT0ibm9uZSIgcG9pbnRlci1ldmVudHM9ImFsbCIvPjwvZz48Zz48Zz48c3dpdGNoPjxmb3JlaWduT2JqZWN0IHN0eWxlPSJvdmVyZmxvdzogdmlzaWJsZTsgdGV4dC1hbGlnbjogbGVmdDsiIHBvaW50ZXItZXZlbnRzPSJub25lIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiByZXF1aXJlZEZlYXR1cmVzPSJodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcxMS9mZWF0dXJlI0V4dGVuc2liaWxpdHkiPjxkaXYgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHN0eWxlPSJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogdW5zYWZlIGNlbnRlcjsganVzdGlmeS1jb250ZW50OiB1bnNhZmUgZmxleC1zdGFydDsgd2lkdGg6IDEzMHB4OyBoZWlnaHQ6IDFweDsgcGFkZGluZy10b3A6IDI5NXB4OyBtYXJnaW4tbGVmdDogMjY2cHg7Ij48ZGl2IHN0eWxlPSJib3gtc2l6aW5nOiBib3JkZXItYm94OyBmb250LXNpemU6IDA7IHRleHQtYWxpZ246IGxlZnQ7IG1heC1oZWlnaHQ6IDI2cHg7IG92ZXJmbG93OiBoaWRkZW47IGNvbG9yOiAjMDAwMDAwOyAiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgZm9udC1zaXplOiAxMnB4OyBmb250LWZhbWlseTogSGVsdmV0aWNhOyBjb2xvcjogbGlnaHQtZGFyaygjMDAwMDAwLCAjZmZmZmZmKTsgbGluZS1oZWlnaHQ6IDEuMjsgcG9pbnRlci1ldmVudHM6IGFsbDsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd29yZC13cmFwOiBub3JtYWw7ICI+c3RhdHVzOiA8L2Rpdj48L2Rpdj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PHRleHQgeD0iMjY2IiB5PSIyOTkiIGZpbGw9ImxpZ2h0LWRhcmsoIzAwMDAwMCwgI2ZmZmZmZikiIGZvbnQtZmFtaWx5PSJIZWx2ZXRpY2EiIGZvbnQtc2l6ZT0iMTJweCI+c3RhdHVzOiA8L3RleHQ+PC9zd2l0Y2g+PC9nPjwvZz48L2c+PC9nPjxnIGRhdGEtY2VsbC1pZD0iMTAiPjxnPjxwYXRoIGQ9Ik0gMjYwIDM4MCBMIDI2MCAzNTAgTCA0MDAgMzUwIEwgNDAwIDM4MCIgZmlsbD0iI2ZmZmZmZiIgc3R5bGU9ImZpbGw6IGxpZ2h0LWRhcmsoI2ZmZmZmZiwgdmFyKC0tZ2UtZGFyay1jb2xvciwgIzEyMTIxMikpOyBzdHJva2U6IGxpZ2h0LWRhcmsocmdiKDAsIDAsIDApLCByZ2IoMjU1LCAyNTUsIDI1NSkpOyIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiIHBvaW50ZXItZXZlbnRzPSJhbGwiLz48cGF0aCBkPSJNIDI2MCAzODAgTCAyNjAgNDcwIEwgNDAwIDQ3MCBMIDQwMCAzODAiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgc3R5bGU9InN0cm9rZTogbGlnaHQtZGFyayhyZ2IoMCwgMCwgMCksIHJnYigyNTUsIDI1NSwgMjU1KSk7IiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiIHBvaW50ZXItZXZlbnRzPSJub25lIi8+PHBhdGggZD0iTSAyNjAgMzgwIEwgNDAwIDM4MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHlsZT0ic3Ryb2tlOiBsaWdodC1kYXJrKHJnYigwLCAwLCAwKSwgcmdiKDI1NSwgMjU1LCAyNTUpKTsiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgcG9pbnRlci1ldmVudHM9Im5vbmUiLz48L2c+PGc+PGc+PHN3aXRjaD48Zm9yZWlnbk9iamVjdCBzdHlsZT0ib3ZlcmZsb3c6IHZpc2libGU7IHRleHQtYWxpZ246IGxlZnQ7IiBwb2ludGVyLWV2ZW50cz0ibm9uZSIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgcmVxdWlyZWRGZWF0dXJlcz0iaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHMTEvZmVhdHVyZSNFeHRlbnNpYmlsaXR5Ij48ZGl2IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBzdHlsZT0iZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IHVuc2FmZSBjZW50ZXI7IGp1c3RpZnktY29udGVudDogdW5zYWZlIGNlbnRlcjsgd2lkdGg6IDEzOHB4OyBoZWlnaHQ6IDFweDsgcGFkZGluZy10b3A6IDM2NXB4OyBtYXJnaW4tbGVmdDogMjYxcHg7Ij48ZGl2IHN0eWxlPSJib3gtc2l6aW5nOiBib3JkZXItYm94OyBmb250LXNpemU6IDA7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6ICMwMDAwMDA7ICI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyBmb250LXNpemU6IDEycHg7IGZvbnQtZmFtaWx5OiBIZWx2ZXRpY2E7IGNvbG9yOiBsaWdodC1kYXJrKCMwMDAwMDAsICNmZmZmZmYpOyBsaW5lLWhlaWdodDogMS4yOyBwb2ludGVyLWV2ZW50czogYWxsOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3b3JkLXdyYXA6IG5vcm1hbDsgIj5jb25maWcueWFtbDwvZGl2PjwvZGl2PjwvZGl2PjwvZm9yZWlnbk9iamVjdD48dGV4dCB4PSIzMzAiIHk9IjM2OSIgZmlsbD0ibGlnaHQtZGFyaygjMDAwMDAwLCAjZmZmZmZmKSIgZm9udC1mYW1pbHk9IkhlbHZldGljYSIgZm9udC1zaXplPSIxMnB4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj5jb25maWcueWFtbDwvdGV4dD48L3N3aXRjaD48L2c+PC9nPjxnIGRhdGEtY2VsbC1pZD0iMTEiPjxnPjxyZWN0IHg9IjI2MCIgeT0iMzgwIiB3aWR0aD0iMTQwIiBoZWlnaHQ9IjMwIiBmaWxsPSJub25lIiBzdHJva2U9Im5vbmUiIHBvaW50ZXItZXZlbnRzPSJhbGwiLz48L2c+PGc+PGc+PHN3aXRjaD48Zm9yZWlnbk9iamVjdCBzdHlsZT0ib3ZlcmZsb3c6IHZpc2libGU7IHRleHQtYWxpZ246IGxlZnQ7IiBwb2ludGVyLWV2ZW50cz0ibm9uZSIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgcmVxdWlyZWRGZWF0dXJlcz0iaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHMTEvZmVhdHVyZSNFeHRlbnNpYmlsaXR5Ij48ZGl2IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBzdHlsZT0iZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IHVuc2FmZSBjZW50ZXI7IGp1c3RpZnktY29udGVudDogdW5zYWZlIGZsZXgtc3RhcnQ7IHdpZHRoOiAxMzBweDsgaGVpZ2h0OiAxcHg7IHBhZGRpbmctdG9wOiAzOTVweDsgbWFyZ2luLWxlZnQ6IDI2NnB4OyI+PGRpdiBzdHlsZT0iYm94LXNpemluZzogYm9yZGVyLWJveDsgZm9udC1zaXplOiAwOyB0ZXh0LWFsaWduOiBsZWZ0OyBtYXgtaGVpZ2h0OiAyNnB4OyBvdmVyZmxvdzogaGlkZGVuOyBjb2xvcjogIzAwMDAwMDsgIj48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IGZvbnQtc2l6ZTogMTJweDsgZm9udC1mYW1pbHk6IEhlbHZldGljYTsgY29sb3I6IGxpZ2h0LWRhcmsoIzAwMDAwMCwgI2ZmZmZmZik7IGxpbmUtaGVpZ2h0OiAxLjI7IHBvaW50ZXItZXZlbnRzOiBhbGw7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdvcmQtd3JhcDogbm9ybWFsOyAiPnNlbnNvcnM6PC9kaXY+PC9kaXY+PC9kaXY+PC9mb3JlaWduT2JqZWN0Pjx0ZXh0IHg9IjI2NiIgeT0iMzk5IiBmaWxsPSJsaWdodC1kYXJrKCMwMDAwMDAsICNmZmZmZmYpIiBmb250LWZhbWlseT0iSGVsdmV0aWNhIiBmb250LXNpemU9IjEycHgiPnNlbnNvcnM6PC90ZXh0Pjwvc3dpdGNoPjwvZz48L2c+PC9nPjxnIGRhdGEtY2VsbC1pZD0iMTIiPjxnPjxyZWN0IHg9IjI2MCIgeT0iNDEwIiB3aWR0aD0iMTQwIiBoZWlnaHQ9IjMwIiBmaWxsPSJub25lIiBzdHJva2U9Im5vbmUiIHBvaW50ZXItZXZlbnRzPSJhbGwiLz48L2c+PGc+PGc+PHN3aXRjaD48Zm9yZWlnbk9iamVjdCBzdHlsZT0ib3ZlcmZsb3c6IHZpc2libGU7IHRleHQtYWxpZ246IGxlZnQ7IiBwb2ludGVyLWV2ZW50cz0ibm9uZSIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgcmVxdWlyZWRGZWF0dXJlcz0iaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHMTEvZmVhdHVyZSNFeHRlbnNpYmlsaXR5Ij48ZGl2IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBzdHlsZT0iZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IHVuc2FmZSBjZW50ZXI7IGp1c3RpZnktY29udGVudDogdW5zYWZlIGZsZXgtc3RhcnQ7IHdpZHRoOiAxMzBweDsgaGVpZ2h0OiAxcHg7IHBhZGRpbmctdG9wOiA0MjVweDsgbWFyZ2luLWxlZnQ6IDI2NnB4OyI+PGRpdiBzdHlsZT0iYm94LXNpemluZzogYm9yZGVyLWJveDsgZm9udC1zaXplOiAwOyB0ZXh0LWFsaWduOiBsZWZ0OyBtYXgtaGVpZ2h0OiAyNnB4OyBvdmVyZmxvdzogaGlkZGVuOyBjb2xvcjogIzAwMDAwMDsgIj48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IGZvbnQtc2l6ZTogMTJweDsgZm9udC1mYW1pbHk6IEhlbHZldGljYTsgY29sb3I6IGxpZ2h0LWRhcmsoIzAwMDAwMCwgI2ZmZmZmZik7IGxpbmUtaGVpZ2h0OiAxLjI7IHBvaW50ZXItZXZlbnRzOiBhbGw7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdvcmQtd3JhcDogbm9ybWFsOyAiPnNlcmlhbDo8L2Rpdj48L2Rpdj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PHRleHQgeD0iMjY2IiB5PSI0MjkiIGZpbGw9ImxpZ2h0LWRhcmsoIzAwMDAwMCwgI2ZmZmZmZikiIGZvbnQtZmFtaWx5PSJIZWx2ZXRpY2EiIGZvbnQtc2l6ZT0iMTJweCI+c2VyaWFsOjwvdGV4dD48L3N3aXRjaD48L2c+PC9nPjwvZz48ZyBkYXRhLWNlbGwtaWQ9IjEzIj48Zz48cmVjdCB4PSIyNjAiIHk9IjQ0MCIgd2lkdGg9IjE0MCIgaGVpZ2h0PSIzMCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJub25lIiBwb2ludGVyLWV2ZW50cz0iYWxsIi8+PC9nPjxnPjxnPjxzd2l0Y2g+PGZvcmVpZ25PYmplY3Qgc3R5bGU9Im92ZXJmbG93OiB2aXNpYmxlOyB0ZXh0LWFsaWduOiBsZWZ0OyIgcG9pbnRlci1ldmVudHM9Im5vbmUiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHJlcXVpcmVkRmVhdHVyZXM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1NWRzExL2ZlYXR1cmUjRXh0ZW5zaWJpbGl0eSI+PGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiB1bnNhZmUgY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IHVuc2FmZSBmbGV4LXN0YXJ0OyB3aWR0aDogMTMwcHg7IGhlaWdodDogMXB4OyBwYWRkaW5nLXRvcDogNDU1cHg7IG1hcmdpbi1sZWZ0OiAyNjZweDsiPjxkaXYgc3R5bGU9ImJveC1zaXppbmc6IGJvcmRlci1ib3g7IGZvbnQtc2l6ZTogMDsgdGV4dC1hbGlnbjogbGVmdDsgbWF4LWhlaWdodDogMjZweDsgb3ZlcmZsb3c6IGhpZGRlbjsgY29sb3I6ICMwMDAwMDA7ICI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyBmb250LXNpemU6IDEycHg7IGZvbnQtZmFtaWx5OiBIZWx2ZXRpY2E7IGNvbG9yOiBsaWdodC1kYXJrKCMwMDAwMDAsICNmZmZmZmYpOyBsaW5lLWhlaWdodDogMS4yOyBwb2ludGVyLWV2ZW50czogYWxsOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3b3JkLXdyYXA6IG5vcm1hbDsgIj5ncHM6PC9kaXY+PC9kaXY+PC9kaXY+PC9mb3JlaWduT2JqZWN0Pjx0ZXh0IHg9IjI2NiIgeT0iNDU5IiBmaWxsPSJsaWdodC1kYXJrKCMwMDAwMDAsICNmZmZmZmYpIiBmb250LWZhbWlseT0iSGVsdmV0aWNhIiBmb250LXNpemU9IjEycHgiPmdwczo8L3RleHQ+PC9zd2l0Y2g+PC9nPjwvZz48L2c+PC9nPjxnIGRhdGEtY2VsbC1pZD0iMTQiPjxnPjxwYXRoIGQ9Ik0gMTMxLjY2IDE3Ni40MSBMIDEyNC44NyAxODQuNDMgTCAxMjAuMzggMTYwLjMyIEwgMTQ0LjkgMTYwLjc2IEwgMTM4LjEyIDE2OC43OCBMIDIzOC4zNCAyNTMuNTkgTCAyNDUuMTMgMjQ1LjU3IEwgMjQ5LjYyIDI2OS42OCBMIDIyNS4xIDI2OS4yNCBMIDIzMS44OCAyNjEuMjIgWiIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHlsZT0ic3Ryb2tlOiBsaWdodC1kYXJrKHJnYigwLCAwLCAwKSwgcmdiKDI1NSwgMjU1LCAyNTUpKTsiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgcG9pbnRlci1ldmVudHM9ImFsbCIvPjwvZz48L2c+PGcgZGF0YS1jZWxsLWlkPSIxNSI+PGc+PHBhdGggZD0iTSA1My4xNSAxNzguNDEgTCA0NC45IDE4NC45MSBMIDQ1LjMxIDE2MC4zOSBMIDY5LjI1IDE2NS43MiBMIDYxIDE3Mi4yMiBMIDI0MS44NSA0MDEuNTkgTCAyNTAuMSAzOTUuMDkgTCAyNDkuNjkgNDE5LjYxIEwgMjI1Ljc1IDQxNC4yOCBMIDIzNCA0MDcuNzggWiIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHlsZT0ic3Ryb2tlOiBsaWdodC1kYXJrKHJnYigwLCAwLCAwKSwgcmdiKDI1NSwgMjU1LCAyNTUpKTsiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgcG9pbnRlci1ldmVudHM9ImFsbCIvPjwvZz48L2c+PGcgZGF0YS1jZWxsLWlkPSIxNiI+PGc+PHBhdGggZD0iTSA0MjcuMzIgMjU5Ljc1IEwgNDM0Ljc1IDI2Ny4xNyBMIDQxMC4zNSAyNjkuNjUgTCA0MTIuODMgMjQ1LjI1IEwgNDIwLjI1IDI1Mi42OCBMIDUwMi42OCAxNzAuMjUgTCA0OTUuMjUgMTYyLjgzIEwgNTE5LjY1IDE2MC4zNSBMIDUxNy4xNyAxODQuNzUgTCA1MDkuNzUgMTc3LjMyIFoiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgc3R5bGU9InN0cm9rZTogbGlnaHQtZGFyayhyZ2IoMCwgMCwgMCksIHJnYigyNTUsIDI1NSwgMjU1KSk7IiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiIHBvaW50ZXItZXZlbnRzPSJhbGwiLz48L2c+PC9nPjxnIGRhdGEtY2VsbC1pZD0iMTciPjxnPjxwYXRoIGQ9Ik0gNDI0LjQ4IDQwNi4wMSBMIDQzMy40MiA0MTEuNTIgTCA0MTAuMjYgNDE5LjU3IEwgNDA3LjAyIDM5NS4yNyBMIDQxNS45NiA0MDAuNzcgTCA1NTUuNTIgMTczLjk5IEwgNTQ2LjU4IDE2OC40OCBMIDU2OS43NCAxNjAuNDMgTCA1NzIuOTggMTg0LjczIEwgNTY0LjA0IDE3OS4yMyBaIiBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIHN0eWxlPSJzdHJva2U6IGxpZ2h0LWRhcmsocmdiKDAsIDAsIDApLCByZ2IoMjU1LCAyNTUsIDI1NSkpOyIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIiBwb2ludGVyLWV2ZW50cz0iYWxsIi8+PC9nPjwvZz48ZyBkYXRhLWNlbGwtaWQ9IjE5Ij48Zz48cmVjdCB4PSIzMDAiIHk9IjE4MCIgd2lkdGg9IjYwIiBoZWlnaHQ9IjMwIiBmaWxsPSJub25lIiBzdHJva2U9Im5vbmUiIHBvaW50ZXItZXZlbnRzPSJhbGwiLz48L2c+PGc+PGc+PHN3aXRjaD48Zm9yZWlnbk9iamVjdCBzdHlsZT0ib3ZlcmZsb3c6IHZpc2libGU7IHRleHQtYWxpZ246IGxlZnQ7IiBwb2ludGVyLWV2ZW50cz0ibm9uZSIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgcmVxdWlyZWRGZWF0dXJlcz0iaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHMTEvZmVhdHVyZSNFeHRlbnNpYmlsaXR5Ij48ZGl2IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBzdHlsZT0iZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IHVuc2FmZSBjZW50ZXI7IGp1c3RpZnktY29udGVudDogdW5zYWZlIGNlbnRlcjsgd2lkdGg6IDU4cHg7IGhlaWdodDogMXB4OyBwYWRkaW5nLXRvcDogMTk1cHg7IG1hcmdpbi1sZWZ0OiAzMDFweDsiPjxkaXYgc3R5bGU9ImJveC1zaXppbmc6IGJvcmRlci1ib3g7IGZvbnQtc2l6ZTogMDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogIzAwMDAwMDsgIj48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IGZvbnQtc2l6ZTogMTJweDsgZm9udC1mYW1pbHk6IEhlbHZldGljYTsgY29sb3I6IGxpZ2h0LWRhcmsoIzAwMDAwMCwgI2ZmZmZmZik7IGxpbmUtaGVpZ2h0OiAxLjI7IHBvaW50ZXItZXZlbnRzOiBhbGw7IGZvbnQtd2VpZ2h0OiBib2xkOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3b3JkLXdyYXA6IG5vcm1hbDsgIj5GaWNoaWVyczwvZGl2PjwvZGl2PjwvZGl2PjwvZm9yZWlnbk9iamVjdD48dGV4dCB4PSIzMzAiIHk9IjE5OSIgZmlsbD0ibGlnaHQtZGFyaygjMDAwMDAwLCAjZmZmZmZmKSIgZm9udC1mYW1pbHk9IkhlbHZldGljYSIgZm9udC1zaXplPSIxMnB4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXdlaWdodD0iYm9sZCI+RmljaGllcnM8L3RleHQ+PC9zd2l0Y2g+PC9nPjwvZz48L2c+PC9nPjwvZz48L2c+PHN3aXRjaD48ZyByZXF1aXJlZEZlYXR1cmVzPSJodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcxMS9mZWF0dXJlI0V4dGVuc2liaWxpdHkiLz48YSB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC01KSIgeGxpbms6aHJlZj0iaHR0cHM6Ly93d3cuZHJhd2lvLmNvbS9kb2MvZmFxL3N2Zy1leHBvcnQtdGV4dC1wcm9ibGVtcyIgdGFyZ2V0PSJfYmxhbmsiPjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTBweCIgeD0iNTAlIiB5PSIxMDAlIj5UZXh0IGlzIG5vdCBTVkcgLSBjYW5ub3QgZGlzcGxheTwvdGV4dD48L2E+PC9zd2l0Y2g+PC9zdmc+

Prérequis

  • La partie IHM est concue autour d'une page Web, il faut en conséquence que le port 80 soit disponible sur la machine.

Points d'Accès

  • 📊 Ecran Principal : http://localhost
  • ⚙️ Barre des tâches : 🧲 click droit

📁 Structure des Fichiers

Format de Fichier

Les fichiers CSV de magnétomètre ont la structure suivante :

  • Valeurs séparées par point-virgule (;)
  • 6 capteurs maximum (Capteur 1-6)
  • Colonnes de données par capteur :
    • Horodatage - Horodatage Unix
    • Bx (nT) - Champ magnétique axe X (nanotesla)
    • By (nT) - Champ magnétique axe Y (nanotesla)
    • Bz (nT) - Champ magnétique axe Z (nanotesla)
    • P (Bar) - Pression (bar)
    • Temperature - Température (°C)
    • Angle X/Y/Z - Angles d'orientation

⚙️ Configuration

Configuration des Capteurs

L'édition des capteurs peut être réalisée directement dans l'interface web :

sensors:
  sensor_1:
    id: 1
    name: "Accéléromètre Avant"
    description: "Capteur accéléromètre panneau avant"
    serial: "HEXAH-024545-001"
    enabled: true
    color:
      x: "#FF6384"  # Couleur axe X
      y: "#36A2EB"  # Couleur axe Y  
      z: "#4BC0C0"  # Couleur axe Z
    default_scale:
      x: 1.0
      y: 1.0
      z: 1.0
    default_offset:
      x: 0.0
      y: 0.0
      z: 0.0
    units: "g"
    location: "Panneau Avant"

Paramètres d'Affichage

display:
  max_sensors_displayed: 12   # Capteurs maximum à afficher (1-12)
  default_time_window: 30     # secondes
  default_update_rate: 100    # millisecondes (10 Hz)
  chart_height: 300          # pixels
  show_legend: true
  show_grid: true

📊 Guide d'Utilisation

Tableau de Bord Principal

Sources de Données

  1. Simulation de Capteurs : Générateur de données intégré avec modes multiples
    • Réaliste : Simule des données réelles d'accéléromètre
    • Onde Sinusoïdale : Motifs d'ondes sinusoïdales mathématiques
    • Aléatoire : Données aléatoires dans des plages spécifiées
    • Zéro : Données plates pour tests

🎛️ Interface Utilisateur

Tableau de Bord Principal

  • Graphiques Temps Réel : Visualisation de données de capteurs en direct avec contrôle de streaming automatique
  • Panneau de Contrôle : Démarrer/arrêter l'acquisition de données avec réponse instantanée
  • Affichage d'État : État du simulateur en temps réel, nombre d'échantillons et état d'acquisition
  • Contrôles Modaux : Interface propre avec dialogues modaux pour fonctionnalités avancées

Composants Interface Modale

📡 Modale de Sélection de Capteurs

  • Liste Dynamique de Capteurs : Choisir quels capteurs afficher
  • Configuration Temps Réel : Les changements s'appliquent immédiatement aux graphiques
  • Gestion des Capteurs : Activer/désactiver les capteurs sans rechargement de page

📂 Modale d'Intégration de Fichiers

  • Lancement d'Application Externe : Démarrer des applications externes avec paramètres projet/campagne
  • Navigateur de Fichiers Historiques : Parcourir et charger les sessions de données précédentes
  • Téléchargement de Fichier : Importation manuelle de fichiers CSV pour analyse
  • Contrôles de Lecture : Lecture temps réel avec contrôle de vitesse (0.5x à 5x)

⚙️ Modale de Paramètres de Capteurs

  • Contrôles Échelle/Décalage : Ajustement de données temps réel par axe
  • Configuration de Graphique : Options d'affichage et fenêtres temporelles
  • Exportation de Données : Exportation CSV avec gestion de session

Contrôle d'Acquisition

  • Streaming de Graphiques Intelligent : Les graphiques se mettent automatiquement en pause quand aucune acquisition
  • Réponse Instantanée : Démarrer/arrêter l'acquisition sans délais de redémarrage de processus
  • Indicateurs d'État : Retour visuel pour l'état d'acquisition et l'état du simulateur
  • Suivi de Progression : Nombres d'échantillons temps réel et informations de fichier de données

🔧 Gestion de Configuration

Système de Configuration YAML

Éditer la configuration à /config.html ou directement dans config/config.yaml :

sensors:
  sensor_1:
    id: 1
    name: "Magnétomètre X"
    description: "Magnétomètre primaire axe X"
    serial: "HEXAH-024545-001"
    enabled: true
    color:
      x: "#FF6384"
      y: "#36A2EB"
      z: "#4BC0C0"
    units: "nT"
    location: "Position Avant"

Traitement des Données

  • Conversion d'Horodatage : Horodatages Unix convertis en objets Date JavaScript
  • Données de Champ Magnétique : Valeurs Bx, By, Bz en nanotesla (nT) → Visualisation graphique
  • Données Environnementales : Température en °C, Pression en Bar
  • Données d'Angle : Angles format IEEE 754 automatiquement convertis en degrés
  • Taux Temps Réel : Lecture de données à 10Hz (configurable)
  • Mises à Jour Statiques : Température et angles se rafraîchissent toutes les 5 secondes

Fonctionnalités d'Intégration

  • Mappage Automatique de Capteurs : Capteurs de fichier (Capteur 1-6) → Capteurs d'application (sensor_1-6)
  • Respect de Configuration : Affiche seulement les capteurs activés
  • Suivi de Progression : Barre de progression visuelle avec capacité de navigation
  • Contrôle de Vitesse : Ajuster la lecture de 0.5x à 5x vitesse
  • Gestion d'Erreurs : Rapports d'erreurs complets et récupération

<EFBFBD> Système de Gestion d'État

L'application utilise config/status.yaml pour la communication en temps réel entre les composants :

app:
  mode: development              # Mode application : development|production
  test_trigger: false           # Indicateur de déclenchement de test

acquisition:
  type: stop                    # Opération courante : start|stop
  current_file: null           # Nom du fichier de données actif
  mode: realistic              # Mode simulation : realistic|sine|random|step|vibration
  project: test_project        # Nom du projet de collecte de données
  campaign: demo_run           # Nom de la campagne de collecte de données
  running: false               # État d'acquisition
  sample_count: 0              # Nombre d'échantillons collectés

simulator:
  commands: []                 # File d'attente des commandes en attente

Modes d'Application

  • production : Mode d'opération standard

    • Contrôles de test cachés dans l'interface
    • Optimisé pour la collecte de données
    • Mode par défaut pour le déploiement
  • development : Mode de développement amélioré

    • Contrôles de test visibles dans le tableau de bord
    • Bouton "Exécuter Tests" activé
    • Lien "Résultats des Tests" accessible
    • Fonctionnalités de débogage améliorées

Points de Terminaison API d'État

Obtenir l'État Actuel :

GET /api.php?action=get_status

Définir le Mode d'Application :

POST /api.php
Content-Type: application/json
{
  "action": "send_simulator_command",
  "command": {
    "type": "set_mode",
    "mode": "development"
  }
}

Déclencher les Tests (Mode Développement) :

POST /api.php
Content-Type: application/json
{
  "action": "send_simulator_command", 
  "command": {
    "type": "trigger_tests",
    "test_trigger": true
  }
}

<EFBFBD>🔧 Développement

Développement Local (sans Docker)

Pour le développement avec un serveur PHP local :

# Démarrer serveur de développement PHP (recommandé)
php -S localhost:8080

Note : Pour la fonctionnalité complète incluant la sauvegarde de configuration, utilisez le setup Docker au lieu du serveur PHP local.

Développement Docker

Pour le développement avec changements de code en direct :

# Utiliser montages de volumes pour développement
cd setup/
docker-compose down
docker-compose up -d

# Surveiller les logs
docker-compose logs -f

Permissions de Fichiers

S'assurer que le répertoire config est accessible en écriture :

chmod -R 755 config/
chown -R www-data:www-data config/  # Pour Apache

Vue d'Ensemble de l'Architecture

Composants Frontend

  • index.html : Tableau de bord principal avec graphiques temps réel
  • config.html : Interface éditeur de configuration
  • Modules CSS : Style responsive avec design moderne
  • Modules JavaScript : Architecture modulaire ES6+

Modules JavaScript

  • sensor-chart.js : Intégration Chart.js avec données streaming
  • data-logger.js : Exportation CSV et gestion de données
  • config-manager.js : Chargement et gestion de configuration
  • php-config-manager.js : Persistance de configuration côté serveur
  • magneto-file-reader.js : Analyse de fichiers CSV et extraction de données
  • magneto-file-integration.js : Intégration UI pour lecteur de fichiers

Composants Backend

  • api.php : API RESTful pour gestion de configuration
  • Alpine Linux : Image de base Docker légère
  • Apache + PHP 8.2 : Serveur web avec support PHP moderne
  • Persistance de Volumes : Volumes Docker pour persistance de données

🚀 Déploiement de Production

Déploiement Docker (Recommandé)

  1. Configurer Environnement :

    git clone <repository>
    cd Mkii
    
  2. Configurer Application :

    # Éditer configuration si nécessaire
    nano config/config.yaml
    
  3. Déployer :

    cd setup/
    ./setup.sh
    
  4. Vérifier Déploiement :

    ./status.sh
    curl http://localhost:8080
    

Déploiement Manuel

Pour déploiement manuel sur stack LAMP existante :

  1. Copier Fichiers :

    cp -r * /var/www/html/
    
  2. Définir Permissions :

    chown -R www-data:www-data /var/www/html/config/
    chmod -R 755 /var/www/html/config/
    
  3. Configurer Apache :

    <Directory /var/www/html>
        AllowOverride All
        Require all granted
    </Directory>
    

🛠️ Dépannage / Problèmes Courants

Configuration Non Sauvegardée

# Vérifier permissions fichiers
ls -la config/
# Devrait montrer : drwxr-xr-x www-data www-data

# Corriger permissions
sudo chown -R www-data:www-data config/
sudo chmod -R 755 config/

Graphiques Non Affichés

  1. Vérifier console navigateur pour erreurs JavaScript
  2. Vérifier que les bibliothèques Chart.js se chargent
  3. S'assurer que la configuration des capteurs est valide
  4. Vérifier que la source de données est active

Lecteur de Fichiers Non Fonctionnel

  1. Vérifier que le format de fichier CSV correspond à la structure attendue
  2. Vérifier console navigateur pour erreurs d'analyse
  3. S'assurer que le fichier contient les en-têtes requis : "Horodatage", "Bx (nT)", etc.
  4. Essayer avec fichier de données exemple du répertoire /data/

Problèmes Docker

# Vérifier état conteneur
cd setup/
./status.sh

# Voir logs
./logs.sh

# Redémarrer conteneurs
./restart.sh

# Reconstruire si nécessaire
./rebuild.sh

Optimisation des Performances

Données Haute Fréquence

  • Ajuster max_buffer_size dans la configuration
  • Réduire le taux de mise à jour graphique si nécessaire
  • Utiliser la décimation de données pour longs enregistrements

Performance Navigateur

  • Vider cache navigateur si les graphiques deviennent lents
  • Fermer onglets navigateur inutilisés
  • Utiliser navigateur moderne avec accélération matérielle

Performance Docker

# Surveiller utilisation ressources
docker stats

# Ajuster limites mémoire dans docker-compose.yml si nécessaire
services:
  sensor-viz-app:
    mem_limit: 512m

📝 Référence API

API de Configuration

GET /api.php?action=read

Obtenir configuration actuelle

{
  "success": true,
  "config": { /* Config YAML en JSON */ }
}

POST /api.php

Sauvegarder configuration

{
  "action": "write",
  "config": { /* Nouvelle configuration */ }
}

GET /api.php?action=backup

Créer sauvegarde configuration

{
  "success": true,
  "backup_file": "config_backup_2025-07-28_14-30-15.yaml"
}

Format d'Exportation de Données

L'exportation CSV inclut :

timestamp,sensor_id,x_raw,y_raw,z_raw,x_processed,y_processed,z_processed
2025-07-28T14:30:15.123Z,1,0.123,0.456,0.789,0.123,0.456,0.789

🔍 Surveillance

Logs d'Application

# Logs Docker
cd setup/
./logs.sh

# Logs Apache (si déploiement manuel)
tail -f /var/log/apache2/error.log
tail -f /var/log/apache2/access.log

Métriques de Performance

  • Taux de Données : Affiché dans barre d'état tableau de bord
  • Utilisation Mémoire : Surveiller via outils dev navigateur
  • Trafic Réseau : Vérifier onglet réseau navigateur
  • Ressources Serveur : Utiliser htop ou stats Docker

🤝 Contribution

Style de Code

  • Utiliser fonctionnalités JavaScript ES6+
  • Suivre indentation cohérente (4 espaces)
  • Ajouter commentaires JSDoc pour fonctions
  • Utiliser HTML et CSS sémantiques

Tests

  • Tester avec fichiers de données magnétomètre exemple
  • Vérifier persistance configuration
  • Vérifier design responsive sur appareils mobiles
  • Valider fonctionnalité exportation CSV

Pull Requests

  1. Fork le dépôt
  2. Créer branche fonctionnalité
  3. Ajouter tests pour nouvelle fonctionnalité
  4. Mettre à jour documentation
  5. Soumettre pull request avec description claire

🐳 Commandes Docker

Toutes les commandes Docker doivent être exécutées depuis le répertoire setup/ :

# Naviguer vers répertoire setup
cd setup/

# Démarrer application
docker-compose up -d

# Voir logs
docker-compose logs -f

# Arrêter application
docker-compose down

# Redémarrer services
docker-compose restart

# Reconstruire conteneurs
docker-compose build --no-cache

# Accéder shell conteneur
docker-compose exec sensor-viz bash

Scripts de Gestion

Le répertoire setup inclut des scripts de gestion pratiques :

cd setup/

# Configuration initiale
./setup.sh

# Vérifier état
./status.sh

# Voir logs
./logs.sh

# Redémarrer application
./restart.sh

# Arrêter application
./stop.sh

# Reconstruire application
./rebuild.sh

🔒 Considérations de Sécurité

Protection des Données

  • Fichiers de configuration protégés de l'accès web direct via règles Apache
  • En-têtes CORS correctement configurés pour points de terminaison API
  • Système de sauvegarde automatique empêche perte de configuration
  • Validation d'entrée sur tous changements de configuration
  • Aucune donnée sensible stockée dans localStorage navigateur

Sécurité Téléchargement de Fichiers

  • Validation fichiers CSV avant traitement
  • Limites de taille de fichier appliquées
  • Pas de stockage côté serveur pour données téléchargées
  • Analyse côté client empêche vulnérabilités serveur

📈 Caractéristiques de Performance

Performance Temps Réel

  • Optimisé pour mises à jour de données soutenues à 10Hz
  • Streaming Chart.js efficace avec mise en mémoire tampon circulaire
  • Décimation automatique de données pour sessions longue durée
  • Structures de données efficaces en mémoire

Compatibilité Navigateur

  • Navigateurs modernes avec support ES6+ requis
  • Rendu Canvas accéléré matériellement
  • Support WebWorker pour traitement arrière-plan
  • Design responsive pour appareils mobiles

Utilisation Ressources

  • Utilisation mémoire typique : 50-100MB
  • Utilisation CPU : <10% sur matériel moderne
  • Bande passante réseau : Minimale (mises à jour config seulement)
  • Stockage : Rétention données configurable

🏗️ Spécifications Techniques

Technologies Frontend

  • HTML5 : Balisage sémantique avec fonctionnalités accessibilité
  • CSS3 : Mise en page Grid/Flexbox avec variables CSS
  • JavaScript ES6+ : Motifs async/await modernes
  • Chart.js 4.x : Graphiques accélérés matériellement
  • Plugin Streaming : Visualisation données temps réel

Technologies Backend

  • PHP 8.2 : PHP moderne avec typage fort
  • Apache 2.4 : Serveur web prêt production
  • Alpine Linux : Empreinte conteneur minimale
  • Docker Compose : Orchestration multi-conteneurs

Formats de Données

  • YAML : Configuration lisible humainement
  • CSV : Exportation données standard industrie
  • JSON : Communication API
  • IEEE 754 : Représentation angles virgule flottante

📋 Exigences

Exigences Système Minimales

  • CPU : Processeur dual-core 1 GHz
  • RAM : 2GB mémoire disponible
  • Stockage : 1GB espace disque libre
  • Réseau : 100 Mbps pour mises à jour temps réel

Exigences Navigateur

  • Chrome/Chromium : 80+
  • Firefox : 75+
  • Safari : 13+
  • Edge : 80+

Exigences Docker

  • Docker : 20.10+
  • Docker Compose : 2.0+
  • Ports Disponibles : 8080
  • Volumes : Accès système fichiers hôte

🎯 Cas d'Usage

Applications de Recherche

  • Études Magnétomètre : Visualisation champ magnétique temps réel
  • Analyse Accéléromètre : Surveillance mouvement et vibration
  • Surveillance Environnementale : Suivi température et orientation
  • Validation Données : Comparaison en direct de capteurs multiples

Applications Industrielles

  • Contrôle Qualité : Validation capteurs temps réel
  • Surveillance Équipement : Analyse vibration continue
  • Calibration : Vérification décalage et échelle capteurs
  • Journalisation Données : Enregistrement mesures automatisé

Usage Éducatif

  • Démonstrations Physique : Visualisation données capteurs en direct
  • Formation Ingénierie : Analyse données monde réel
  • Exemples Programmation : Motifs développement web modernes
  • Science des Données : Workflows importation et analyse CSV

📄 Licence

Ce projet est open source et disponible pour usage éducatif et commercial.

🙏 Remerciements

Bibliothèques Tierces

  • Chart.js : Bibliothèque graphiques puissante avec support streaming
  • js-yaml : Analyseur YAML JavaScript pour fichiers configuration
  • Alpine Linux : Image de base Docker légère
  • Serveur HTTP Apache : Plateforme serveur web fiable

Support Format de Données

  • CSV Magnétomètre : Support pour fichiers données magnétomètre externes
  • IEEE 754 : Gestion appropriée données angles virgule flottante
  • CSV Point-virgule : Compatibilité format CSV européen

🤝 Contribution

Les contributions sont bienvenues ! Veuillez vous concentrer sur :

  • Améliorations performance pour données haute fréquence
  • Nouveaux modes simulation et motifs de données
  • Support mobile amélioré et design responsive
  • Formats exportation données additionnels et outils analyse
  • Exemples intégration matériel capteurs réels
  • Support étendu format données magnétomètre

Mises à Jour Majeures Récentes

V2.0 - Architecture Simulateur Continu

  • Simulateur Toujours Actif : Processus arrière-plan élimine délais démarrage
  • Contrôle Acquisition Instantané : Démarrer/arrêter acquisition données sans surcharge processus
  • Streaming Graphiques Intelligent : Pause/reprise automatique basée sur état acquisition
  • Contrôle Basé Commandes : Contrôle professionnel via communication fichier état

V1.5 - Interface Utilisateur/UX Professionnelle

  • Interface Modale : Interface propre et organisée avec dialogues modaux
  • État Temps Réel : Surveillance simulateur en direct et affichage nombre échantillons
  • Graphiques Conscients Acquisition : Graphiques se mettent intelligemment en pause quand pas d'acquisition
  • Gestion Fichiers Améliorée : Navigateur fichiers données complet et contrôles

V1.0 - Fonctionnalités Core

  • Lecteur Fichiers Magnétomètre : Système importation CSV complet pour données externes
  • Configuration Capteurs Dynamique : Jusqu'à 12 capteurs avec configuration en direct
  • Déploiement Docker : Conteneurs basés Alpine avec persistance volumes
  • Configuration Web : Éditeur YAML avec système sauvegarde automatique

📞 Support & Documentation

Liens Rapides

Problèmes Courants

  • Port 8080 utilisé : Changer port dans setup/docker-compose.yml
  • Problèmes permissions : S'assurer volumes Docker ont permissions correctes
  • Simulateur ne répond pas : Vérifier config/status.yaml pour communication
  • Fichiers CSV ne se chargent pas : Vérifier format fichier correspond structure attendue

Conseils Performance

  • Données haute fréquence : Utiliser déploiement Docker pour meilleure performance
  • Gros fichiers : Considérer chunking fichiers pour très gros ensembles données
  • Capteurs multiples : Limiter capteurs actifs pour performance graphiques optimale
  • Acquisition arrière-plan : Simulateur continue même quand navigateur fermé

Construit avec : Chart.js, JavaScript Vanilla, CSS3, HTML5, PHP 8.2, Apache, Alpine Linux, Docker

🛰️ Visualisation de Données de Capteurs en Temps Réel - Système d'Acquisition Continue Professionnel !