From 7184b9a572f3e3a5cf3d4b7c97c97d498ad70ee4 Mon Sep 17 00:00:00 2001 From: "Z. Cliffe Schreuders" Date: Mon, 24 Mar 2025 13:04:14 +0000 Subject: [PATCH] Updates to labtainers --- .../desktop/kde_minimal/manifests/config.pp | 2 +- .../Labtainers-master/MakepackUI/README.txt | 2 + .../MakepackUI/bin/buildUI2.sh | 10 + .../MakepackUI/bin/json-simple-1.1.1.jar | Bin 0 -> 23737 bytes .../MakepackUI/bin/makepackui.mf | 3 + .../Labtainers-master/MakepackUI/pom.xml | 26 + .../src/main/java/newpackage/NewJFrame.form | 908 + .../src/main/java/newpackage/NewJFrame.java | 1626 + .../src/main/resources/labtainer5-sm.png | Bin 0 -> 67186 bytes .../src/main/resources/saveButton.png | Bin 0 -> 588 bytes .../files/Labtainers-master/README.md | 477 +- .../Labtainers-master/UI/Goals/build.xml | 73 - .../Labtainers-master/UI/Goals/manifest.mf | 3 - .../UI/Goals/nbproject/build-impl.xml | 1420 - .../UI/Goals/nbproject/genfiles.properties | 8 - .../nbproject/private/private.properties | 2 - .../UI/Goals/nbproject/project.properties | 75 - .../UI/Goals/nbproject/project.xml | 15 - .../UI/Goals/src/GoalsUI/GoalsUI.java | 316 - .../Labtainers-master/UI/MainUI/.classpath | 44 + .../Labtainers-master/UI/MainUI/.project | 23 + .../org.eclipse.core.resources.prefs | 3 + .../.settings/org.eclipse.jdt.apt.core.prefs | 2 + .../.settings/org.eclipse.jdt.core.prefs | 9 + .../.settings/org.eclipse.m2e.core.prefs | 4 + .../UI/MainUI/addContainer.sh | 6 + .../UI/MainUI/buildMainUI.sh | 12 + .../UI/MainUI/buildMainUI.xml | 48 + .../Labtainers-master/UI/MainUI/callNewLab.sh | 15 + .../Labtainers-master/UI/MainUI/cloneLab.sh | 5 + .../UI/MainUI/editDockerfile.sh | 5 + .../UI/MainUI/images/labtainer5-sm.png | Bin 0 -> 67186 bytes .../SNAPSHOT/AbsoluteLayout-SNAPSHOT.jar | Bin 0 -> 10424 bytes .../UI/MainUI/nb-configuration.xml | 19 + .../files/Labtainers-master/UI/MainUI/pom.xml | 50 + .../UI/MainUI/removeContainer.sh | 8 + .../UI/MainUI/renameContainer.sh | 5 + .../java/labtainers/goalsui/DocPanel.form | 82 + .../java/labtainers/goalsui/DocPanel.java | 132 + .../java/labtainers/goalsui}/GoalPanels.form | 146 +- .../java/labtainers/goalsui}/GoalPanels.java | 278 +- .../java/labtainers/goalsui}/GoalValues.java | 373 +- .../java/labtainers/goalsui}/GoalsData.java | 2534 +- .../java/labtainers/goalsui}/GoalsUI.form | 169 +- .../main/java/labtainers/goalsui/GoalsUI.java | 349 + .../goalsui}/ParamReferenceStorage.java | 434 +- .../labtainers/mainui/CompareTextFiles.java | 111 + .../mainui/ContainerConfigAddHosts.form | 93 + .../mainui/ContainerConfigAddHosts.java | 209 + .../ContainerConfigNetworksSubpanel.form | 99 + .../ContainerConfigNetworksSubpanel.java | 215 + .../labtainers/mainui/ContainerObjPanel.form | 1142 + .../labtainers/mainui/ContainerObjPanel.java | 1456 + .../main/java/labtainers/mainui/LabData.java | 803 + .../main/java/labtainers/mainui/LabPanel.form | 91 + .../main/java/labtainers/mainui/LabPanel.java | 143 + .../java/labtainers/mainui/MainWindow.form | 1330 + .../java/labtainers/mainui/MainWindow.java | 2567 ++ .../labtainers/mainui/NetworkObjPanel.form | 274 + .../labtainers/mainui/NetworkObjPanel.java | 425 + .../labtainers/mainui/PreferencesPanel.form | 117 + .../labtainers/mainui/PreferencesPanel.java | 183 + .../main/java/labtainers/mainui/Status.java | 132 + .../labtainers/mainui}/ToolTipHandlers.java | 174 +- .../paramsui/ContainerFileDialog.form | 108 + .../paramsui/ContainerFileDialog.java | 171 + .../paramsui/ContainerFileTable.java | 306 + .../java/labtainers/paramsui/ParamPanels.form | 330 + .../java/labtainers/paramsui/ParamPanels.java | 494 + .../java/labtainers/paramsui/ParamValues.java | 162 + .../java/labtainers/paramsui/ParamsData.java | 638 + .../java/labtainers/paramsui/ParamsUI.form | 158 + .../java/labtainers/paramsui/ParamsUI.java | 377 + .../labtainers/resultsui}/ArtifactPanels.form | 243 +- .../labtainers/resultsui}/ArtifactPanels.java | 450 +- .../labtainers/resultsui}/ArtifactValues.java | 570 +- .../resultsui}/ParamReferenceStorage.java | 334 +- .../labtainers/resultsui}/ResultsData.java | 1579 +- .../java/labtainers/resultsui}/ResultsUI.form | 163 +- .../java/labtainers/resultsui/ResultsUI.java | 417 + .../UI/MainUI/src/main/resources/UI.ini | 3 + .../UI/MainUI/src/main/resources/base.list | 9 + .../src/main/resources/labtainer5-sm.png | Bin 0 -> 67186 bytes .../MainUI/staging/dist/labtainers.mainui.jar | Bin 0 -> 370 bytes .../UI/MainUI/staging/dist/mainui.jar | Bin 0 -> 359 bytes .../files/Labtainers-master/UI/MainUI/test.sh | 3 + .../files/Labtainers-master/UI/README.txt | 115 + .../Labtainers-master/UI/Results/build.xml | 73 - .../Labtainers-master/UI/Results/manifest.mf | 3 - .../UI/Results/nbproject/build-impl.xml | 1420 - .../UI/Results/nbproject/genfiles.properties | 8 - .../nbproject/private/private.properties | 2 - .../UI/Results/nbproject/project.properties | 75 - .../UI/Results/nbproject/project.xml | 15 - .../UI/Results/src/ResultsUI/ResultsUI.java | 355 - .../src/ResultsUI/ToolTipHandlers.java | 73 - .../Labtainers-master/UI/bin/buildUI2.sh | 10 + .../UI/bin/mainUI.ini.backup | 3 + .../files/Labtainers-master/UI/bin/mainUI.mf | 2 + .../Labtainers-master/azure/README-DEV.txt | 12 + .../files/Labtainers-master/azure/README.txt | 82 + .../Labtainers-master/azure/account_env.sh | 5 + .../Labtainers-master/azure/base_create_vm.sh | 34 + .../Labtainers-master/azure/checktunnel.ps1 | 23 + .../Labtainers-master/azure/checktunnel.sh | 35 + .../azure/cloud_init.template | 67 + .../Labtainers-master/azure/cloud_init.txt | 67 + .../Labtainers-master/azure/copy_to_blob.sh | 39 + .../Labtainers-master/azure/create_disk.ps1 | 6 + .../Labtainers-master/azure/create_disk.sh | 7 + .../Labtainers-master/azure/create_gallery.sh | 18 + .../Labtainers-master/azure/create_vm.ps1 | 32 + .../Labtainers-master/azure/create_vm.sh | 33 + .../Labtainers-master/azure/deallocate_vm.ps1 | 8 + .../Labtainers-master/azure/deallocate_vm.sh | 10 + .../Labtainers-master/azure/delete_all.sh | 1 + .../Labtainers-master/azure/delete_blob.sh | 7 + .../Labtainers-master/azure/delete_disk.ps1 | 8 + .../Labtainers-master/azure/delete_disk.sh | 8 + .../azure/delete_resource_goup.sh | 1 + .../Labtainers-master/azure/delete_vm.ps1 | 9 + .../Labtainers-master/azure/delete_vm.sh | 11 + .../Labtainers-master/azure/do_newterm.sh | 4 + .../Labtainers-master/azure/dotunnel.bat | 3 + .../Labtainers-master/azure/generalize.sh | 16 + .../Labtainers-master/azure/get_disk_id.sh | 15 + .../Labtainers-master/azure/get_headless.ps1 | 10 + .../Labtainers-master/azure/get_headless.sh | 14 + .../Labtainers-master/azure/get_results.ps1 | 18 + .../Labtainers-master/azure/get_results.sh | 17 + .../files/Labtainers-master/azure/getip.ps1 | 9 + .../files/Labtainers-master/azure/getip.sh | 10 + .../Labtainers-master/azure/image_create.sh | 9 + .../Labtainers-master/azure/image_def.sh | 12 + .../azure/install_labtainers.ps1 | 13 + .../azure/install_labtainers.sh | 12 + .../Labtainers-master/azure/list-gallery.sh | 1 + .../files/Labtainers-master/azure/newterm.sh | 16 + .../Labtainers-master/azure/resourcecheck.ps1 | 6 + .../Labtainers-master/azure/resourcecheck.sh | 8 + .../files/Labtainers-master/azure/restart.ps1 | 8 + .../files/Labtainers-master/azure/restart.sh | 8 + .../Labtainers-master/azure/restore_vm.ps1 | 9 + .../Labtainers-master/azure/restore_vm.sh | 11 + .../Labtainers-master/azure/share_gallery.sh | 3 + .../Labtainers-master/azure/snapshot_disk.sh | 18 + .../files/Labtainers-master/azure/stop_vm.sh | 9 + .../Labtainers-master/azure/update_user.ps1 | 13 + .../Labtainers-master/azure/update_user.sh | 10 + .../Labtainers-master/azure/wait_tunnel.ps1 | 17 + .../Labtainers-master/azure/wait_tunnel.sh | 19 + .../Labtainers-master/azure/waitdone.ps1 | 14 + .../files/Labtainers-master/azure/waitdone.sh | 19 + .../Labtainers-master/azure/waitdone2.sh | 19 + .../files/Labtainers-master/azure/waitweb.ps1 | 23 + .../files/Labtainers-master/azure/waitweb.sh | 22 + .../config/gnome-terminal-profiles.dconf | 8 + .../Labtainers-master/config/labtainer.config | 3 +- .../Labtainers-master/config/registry.config | 10 + .../distrib/LabtainerBase.py | 59 + .../Labtainers-master/distrib/check_tag.py | 33 +- .../Labtainers-master/distrib/cloneOrPull.sh | 11 + .../Labtainers-master/distrib/cloneSimlab.sh | 16 + .../Labtainers-master/distrib/cpall2test.sh | 13 + .../distrib/fix-git-dates.py | 59 +- .../Labtainers-master/distrib/full_build.sh | 71 + .../distrib/get_reg_dates.py | 84 + .../distrib/git-restore-mtime.py | 2 +- .../Labtainers-master/distrib/justrelease.sh | 113 + .../Labtainers-master/distrib/mac/READEME.md | 5 + .../distrib/mac/labtainers-desktop.pkg | Bin 0 -> 1648 bytes .../Labtainers-master/distrib/mac/mkpkg.sh | 8 + .../distrib/mac/scripts/postinstall | 22 + .../distrib/mac/scripts/preinstall | 12 + .../distrib/mac/test-package.sh | 4 + .../Labtainers-master/distrib/mergePre.sh | 31 + .../distrib/mk-devel-dist.sh | 52 +- .../Labtainers-master/distrib/mk-lab-pdf.sh | 18 +- .../files/Labtainers-master/distrib/mkall.sh | 20 + .../files/Labtainers-master/distrib/mkdist.sh | 123 +- .../Labtainers-master/distrib/mkrelease.sh | 74 + .../files/Labtainers-master/distrib/mktest.sh | 30 +- .../Labtainers-master/distrib/move_base.py | 35 + .../Labtainers-master/distrib/move_reg.py | 103 + .../Labtainers-master/distrib/publish.py | 179 +- .../distrib/publish_grader.py | 74 - .../distrib/pull_tag_push.py | 46 +- .../Labtainers-master/distrib/push_base.sh | 2 +- .../distrib/refresh_branch.py | 165 + .../distrib/refresh_mirror.py | 301 + .../distrib/release/README.txt | 3 + .../distrib/release/labtainer.tar | 3 + .../distrib/reset_premaster.sh | 15 + .../Labtainers-master/distrib/retag_all.py | 33 +- .../files/Labtainers-master/distrib/skip-labs | 9 + .../docs/development/Makefile | 5 +- .../docs/development/compat.tex | 2 + .../docs/development/dev.tex | 93 - .../docs/development/development.pdf | Bin 0 -> 241020 bytes .../docs/development/development.tex | 671 +- .../docs/development/git.txt | 26 + .../docs/development/labtainer5-sm.png | Bin 0 -> 67186 bytes .../Labtainers-master/docs/gns3/gns3.tex | 162 +- .../docs/gns3/labtainers_GNS3.pdf | Bin 0 -> 129107 bytes .../docs/instructor/Makefile | 2 +- .../docs/instructor/labtainer-instructor.pdf | Bin 0 -> 187728 bytes .../docs/instructor/labtainer-instructor.tex | 311 +- .../docs/instructor/labtainer5-sm.png | Bin 0 -> 67186 bytes .../docs/labdesigner/Makefile | 1 + .../docs/labdesigner/labdesigner.pdf | Bin 0 -> 593188 bytes .../docs/labdesigner/labdesigner.tex | 1591 +- .../docs/labdesigner/labtainer5-sm.png | Bin 0 -> 67186 bytes .../files/Labtainers-master/docs/license.md | 54 + .../Labtainers-master/docs/student/Makefile | 6 +- .../docs/student/labtainer-student.pdf | Bin 0 -> 162123 bytes .../docs/student/labtainer-student.tex | 388 +- .../docs/student/labtainer5-sm.png | Bin 0 -> 67186 bytes .../files/Labtainers-master/google/README.txt | 93 + .../Labtainers-master/google/base_create.sh | 16 + .../Labtainers-master/google/base_create22.sh | 19 + .../Labtainers-master/google/base_create24.sh | 19 + .../Labtainers-master/google/checktunnel.ps1 | 22 + .../Labtainers-master/google/checktunnel.sh | 30 + .../google/cloud_init.template | 73 + .../Labtainers-master/google/create_vm.ps1 | 26 + .../Labtainers-master/google/create_vm.sh | 21 + .../Labtainers-master/google/create_vm_ec.sh | 21 + .../Labtainers-master/google/delete_vm.ps1 | 9 + .../Labtainers-master/google/delete_vm.sh | 9 + .../Labtainers-master/google/do_newterm.sh | 4 + .../Labtainers-master/google/dotunnel.bat | 3 + .../Labtainers-master/google/findzone.ps1 | 3 + .../Labtainers-master/google/findzone.sh | 3 + .../Labtainers-master/google/get_results.ps1 | 18 + .../Labtainers-master/google/get_results.sh | 17 + .../files/Labtainers-master/google/getip.ps1 | 9 + .../files/Labtainers-master/google/getip.sh | 10 + .../google/install_labtainers.ps1 | 13 + .../google/install_labtainers.sh | 12 + .../files/Labtainers-master/google/newterm.sh | 17 + .../Labtainers-master/google/project.ps1 | 2 + .../files/Labtainers-master/google/project.sh | 2 + .../Labtainers-master/google/publishImage.sh | 20 + .../Labtainers-master/google/restart.ps1 | 7 + .../files/Labtainers-master/google/restart.sh | 8 + .../Labtainers-master/google/set_defaults.ps1 | 1 + .../Labtainers-master/google/set_defaults.sh | 4 + .../Labtainers-master/google/start_vm.ps1 | 10 + .../Labtainers-master/google/start_vm.sh | 11 + .../Labtainers-master/google/stop_vm.ps1 | 8 + .../files/Labtainers-master/google/stop_vm.sh | 9 + .../Labtainers-master/google/user_config.txt | 13 + .../Labtainers-master/google/waitdone.ps1 | 20 + .../Labtainers-master/google/waitdone.sh | 19 + .../files/Labtainers-master/google/waitup.ps1 | 27 + .../files/Labtainers-master/google/waitup.sh | 22 + .../Dockerfile.labtainer.headless.tester | 12 + .../Dockerfile.labtainer.master.base | 104 + .../Dockerfile.labtainer.master.headless | 43 + .../Labtainers-master/headless-lite/README.md | 154 + .../headless-lite/buildTester.sh | 12 + .../headless-lite/cloud-config | 60 + .../headless-lite/docker-compose.yml | 39 + .../headless-lite/docker-entrypoint | 28 + .../Labtainers-master/headless-lite/doterm.sh | 24 + .../headless-lite/doupdate.sh | 7 + .../headless-lite/get-results.sh | 4 + .../headless-lite/headless-labtainers.sh | 139 + .../headless-lite/install-headless.sh | 64 + .../headless-lite/labtainers-client.sh | 10 + .../Labtainers-master/headless-lite/motd | 9 + .../headless-lite/wait-for-it.sh | 178 + .../headless-lite/waitForX.sh | 37 + .../headless/Dockerfile.labtainer.master | 98 + .../files/Labtainers-master/headless/LICENSE | 19 + .../Labtainers-master/headless/README.md | 54 + .../headless/docker-compose.yml | 81 + .../headless/docker-entrypoint | 7 + .../headless/labtainer.master.create.txt | 11 + .../files/Labtainers-master/headless/motd | 7 + .../headless/nginx-default.conf/default.conf | 87 + .../Labtainers-master/headless/wait-for-it.sh | 178 + .../Labtainers-master/host_scripts/README | 6 +- .../Labtainers-master/host_scripts/push.txt | 7 - .../host_scripts/registry/start_reg.sh | 28 + .../host_scripts/remote/remote.py | 37 + .../host_scripts/testscripts/powerSmoke.sh | 2 + .../host_scripts/testscripts/powerSmokeOld.sh | 2 + .../host_scripts/testscripts/smoke.cron | 1 + .../testscripts/vbox-test-server.service | 13 + .../host_scripts/testscripts/vboxserver.py | 39 + .../host_scripts/vbox/compact.sh | 3 +- .../host_scripts/vbox/exportVB.sh | 8 +- .../host_scripts/vbox/poweroffVB.sh | 2 +- .../host_scripts/vbox/poweronVB.sh | 2 +- .../host_scripts/vmware/compact.sh | 3 +- .../host_scripts/vmware/export.sh | 13 +- .../host_scripts/vmware/poweroff.sh | 2 +- .../host_scripts/vmware/poweron.sh | 2 +- .../host_scripts/vmware/teston.sh | 2 +- .../Labtainers-master/host_scripts/winscp | 1 - .../Labtainers-master/labpacks/access.labpack | 1 + .../Labtainers-master/labpacks/crypto.labpack | 1 + .../Labtainers-master/labpacks/ics.labpack | 1 + .../labpacks/net-traffic.labpack | 1 + .../labpacks/network-intro.labpack | 1 + .../labpacks/networks.labpack | 1 + .../labpacks/operations.labpack | 1 + .../Labtainers-master/labpacks/vuln.labpack | 1 + .../labpacks/web-security.labpack | 1 + .../labs/acl/acl/_bin/fixlocal.sh | 1 + .../labs/acl/config/keywords.txt | 4 + .../Labtainers-master/labs/acl/docs/acl.aux | 27 - .../Labtainers-master/labs/acl/docs/acl.dvi | Bin 10764 -> 0 bytes .../Labtainers-master/labs/acl/docs/acl.log | 484 - .../Labtainers-master/labs/acl/docs/acl.out | 9 - .../Labtainers-master/labs/acl/docs/acl.pdf | Bin 54924 -> 54936 bytes .../Labtainers-master/labs/acl/docs/acl.tex | 2 +- .../labs/acl/instr_config/instructions.txt | 1 - .../labs/acl/instr_config/results.config | 4 + .../arp-spoof/attacker/_system/sbin/faux_init | 18 - .../labs/arp-spoof/config/keywords.txt | 3 + .../Dockerfile.arp-spoof.attacker.student | 2 +- .../Dockerfile.arp-spoof.gateway.student | 2 +- .../Dockerfile.arp-spoof.user.student | 2 +- .../Dockerfile.arp-spoof.webserver.student | 2 +- .../docs/.~lock.arp-spoof-report.docx# | 1 - .../labs/arp-spoof/docs/Makefile | 1 + .../labs/arp-spoof/docs/arp-spoof.aux | 29 - .../labs/arp-spoof/docs/arp-spoof.log | 495 - .../labs/arp-spoof/docs/arp-spoof.out | 7 - .../labs/arp-spoof/docs/arp-spoof.pdf | Bin 85706 -> 85628 bytes .../labs/arp-spoof/docs/arp-spoof.tex | 2 +- .../arp-spoof/gateway/_system/sbin/faux_init | 18 - .../arp-spoof/instr_config/instructions.txt | 1 - .../arp-spoof/user/_system/sbin/faux_init | 18 - .../webserver/_system/sbin/faux_init | 15 - .../lib/systemd/system/httpserver.service | 0 .../labs/backups/docs/backups.pdf | Bin 199989 -> 187410 bytes .../backups/instr_config/instructions.txt | 1 - .../labs/backups2/config/keywords.txt | 2 + .../labs/backups2/docs/backups.docx | Bin 280466 -> 143316 bytes .../labs/backups2/docs/backups.pdf | Bin 201123 -> 188145 bytes .../labs/backups2/server/_bin/fixlocal.sh | 2 +- .../labs/bird-bgp/.~lock.topo.odg# | 1 + .../labs/bird-bgp/config/about.txt | 1 + .../labs/bird-bgp/config/keywords.txt | 4 + .../labs/bird-bgp/config/parameter.config | 9 + .../labs/bird-bgp/config/start.config | 130 + .../labs/bird-bgp/config/start.config.bu | 166 + .../Dockerfile.bird-bgp.e1.student | 72 + .../Dockerfile.bird-bgp.e2.student | 72 + .../Dockerfile.bird-bgp.e3.student | 72 + .../Dockerfile.bird-bgp.e4.student | 72 + .../Dockerfile.bird-bgp.e5.student | 72 + .../Dockerfile.bird-bgp.netmon.student | 71 + .../Dockerfile.bird-bgp.r1.student} | 2 +- .../Dockerfile.bird-bgp.r2.student | 71 + .../Dockerfile.bird-bgp.r3.student | 71 + .../Dockerfile.bird-bgp.r4.student | 71 + .../Dockerfile.bird-bgp.tap.student | 71 + .../labs/bird-bgp/docs/Makefile | 7 + .../labs/bird-bgp/docs/bird-bgp.pdf | Bin 0 -> 110342 bytes .../labs/bird-bgp/docs/bird-bgp.tex | 97 + .../labs/bird-bgp/docs/header.tex | 120 + .../labs/bird-bgp/docs/read_first.txt | 10 + .../labs/bird-bgp/docs/topo.odg | Bin 0 -> 13361 bytes .../labs/bird-bgp/docs/topo.png | Bin 0 -> 89884 bytes .../labs/bird-bgp/e1/_bin/fixlocal.sh | 18 + .../labs/bird-bgp/e1/_system/etc/login.defs | 341 + .../labs/bird-bgp/e1/_system/etc/securetty | 7 + .../labs/bird-bgp/e2/_bin/fixlocal.sh | 18 + .../labs/bird-bgp/e2/_system/etc/login.defs | 341 + .../labs/bird-bgp/e2/_system/etc/securetty | 7 + .../labs/bird-bgp/e3/_bin/fixlocal.sh | 18 + .../labs/bird-bgp/e3/_system/etc/login.defs | 341 + .../labs/bird-bgp/e3/_system/etc/securetty | 7 + .../labs/bird-bgp/e4/_bin/fixlocal.sh | 18 + .../labs/bird-bgp/e4/_bin/treataslocal | 1 + .../labs/bird-bgp/e4/_system/etc/login.defs | 341 + .../labs/bird-bgp/e4/_system/etc/securetty | 7 + .../labs/bird-bgp/e5/_bin/fixlocal.sh | 18 + .../labs/bird-bgp/e5/_system/etc/login.defs | 341 + .../labs/bird-bgp/e5/_system/etc/securetty | 7 + .../labs/bird-bgp/instr_config/goals.config | 1 + .../instr_config/pregrade.sh | 21 +- .../labs/bird-bgp/instr_config/results.config | 7 + .../labs/bird-bgp/netmon/_bin/fixlocal.sh | 18 + .../bird-bgp/netmon/_system/etc/login.defs | 341 + .../bird-bgp/netmon/_system/etc/securetty | 7 + .../labs/bird-bgp/r1/_bin/fixlocal.sh | 18 + .../labs/bird-bgp/r1/_system/etc/login.defs | 341 + .../labs/bird-bgp/r1/_system/etc/securetty | 7 + .../r1/_system/usr/local/etc/bird.conf | 79 + .../labs/bird-bgp/r2/_bin/fixlocal.sh | 18 + .../labs/bird-bgp/r2/_system/etc/login.defs | 341 + .../labs/bird-bgp/r2/_system/etc/securetty | 7 + .../r2/_system/usr/local/etc/bird.conf | 85 + .../labs/bird-bgp/r3/_bin/fixlocal.sh | 18 + .../labs/bird-bgp/r3/_system/etc/login.defs | 341 + .../labs/bird-bgp/r3/_system/etc/securetty | 7 + .../r3/_system/usr/local/etc/bird.conf | 84 + .../labs/bird-bgp/r4/_bin/fixlocal.sh | 18 + .../labs/bird-bgp/r4/_system/etc/login.defs | 341 + .../labs/bird-bgp/r4/_system/etc/securetty | 7 + .../r4/_system/usr/local/etc/bird.conf | 31 + .../labs/bird-bgp/tap/_bin/fixlocal.sh | 18 + .../labs/bird-bgp/tap/_system/etc/login.defs | 341 + .../labs/bird-bgp/tap/_system/etc/securetty | 7 + .../labs/bird-ospf/.~lock.topo.odg# | 1 + .../labs/bird-ospf/br/_bin/fixlocal.sh | 18 + .../labs/bird-ospf/br/_system/etc/login.defs | 341 + .../labs/bird-ospf/br/_system/etc/securetty | 7 + .../br/_system/usr/local/etc/bird.conf | 93 + .../labs/bird-ospf/brx/_bin/fixlocal.sh | 18 + .../labs/bird-ospf/brx/_system/etc/login.defs | 341 + .../labs/bird-ospf/brx/_system/etc/securetty | 7 + .../brx/_system/usr/local/etc/bird.conf | 74 + .../labs/bird-ospf/config/about.txt | 1 + .../labs/bird-ospf/config/keywords.txt | 4 + .../labs/bird-ospf/config/parameter.config | 1 + .../labs/bird-ospf/config/start.config | 135 + .../Dockerfile.bird-ospf.br.student | 71 + .../Dockerfile.bird-ospf.brx.student | 71 + .../Dockerfile.bird-ospf.ir1.student | 71 + .../Dockerfile.bird-ospf.ir2.student | 71 + .../Dockerfile.bird-ospf.ir3.student | 71 + .../Dockerfile.bird-ospf.netmon.student | 71 + .../Dockerfile.bird-ospf.s1.student | 71 + .../Dockerfile.bird-ospf.tap.student | 71 + .../Dockerfile.bird-ospf.w1.student | 71 + .../Dockerfile.bird-ospf.w2.student | 71 + .../Dockerfile.bird-ospf.w3.student | 72 + .../Dockerfile.bird-ospf.wx.student | 71 + .../labs/bird-ospf/docs/Makefile | 7 + .../labs/bird-ospf/docs/bird-ospf.pdf | Bin 0 -> 122990 bytes .../labs/bird-ospf/docs/bird-ospf.tex | 143 + .../labs/bird-ospf/docs/header.tex | 120 + .../labs/bird-ospf/docs/read_first.txt | 10 + .../labs/bird-ospf/docs/topo.odg | Bin 0 -> 13263 bytes .../labs/bird-ospf/docs/topo.png | Bin 0 -> 105258 bytes .../labs/bird-ospf/instr_config/goals.config | 6 + .../labs/bird-ospf/instr_config/pregrade.sh | 42 + .../bird-ospf/instr_config/results.config | 8 + .../labs/bird-ospf/ir1/_bin/fixlocal.sh | 18 + .../labs/bird-ospf/ir1/_system/etc/login.defs | 341 + .../labs/bird-ospf/ir1/_system/etc/securetty | 7 + .../ir1/_system/usr/local/etc/bird.conf | 61 + .../labs/bird-ospf/ir2/_bin/fixlocal.sh | 18 + .../labs/bird-ospf/ir2/_system/etc/login.defs | 341 + .../labs/bird-ospf/ir2/_system/etc/securetty | 7 + .../ir2/_system/usr/local/etc/bird.conf | 61 + .../labs/bird-ospf/ir3/_bin/fixlocal.sh | 18 + .../labs/bird-ospf/ir3/_system/etc/login.defs | 341 + .../labs/bird-ospf/ir3/_system/etc/securetty | 7 + .../ir3/_system/usr/local/etc/bird.conf | 61 + .../labs/bird-ospf/netmon/_bin/fixlocal.sh | 18 + .../bird-ospf/netmon/_system/etc/login.defs | 341 + .../bird-ospf/netmon/_system/etc/securetty | 7 + .../labs/bird-ospf/s1/_bin/fixlocal.sh | 18 + .../labs/bird-ospf/s1/_system/etc/login.defs | 341 + .../labs/bird-ospf/s1/_system/etc/securetty | 7 + .../labs/bird-ospf/tap/_bin/fixlocal.sh | 18 + .../labs/bird-ospf/tap/_system/etc/login.defs | 341 + .../labs/bird-ospf/tap/_system/etc/securetty | 7 + .../labs/bird-ospf/w1/_bin/fixlocal.sh | 18 + .../labs/bird-ospf/w1/_bin/treataslocal | 1 + .../labs/bird-ospf/w1/_system/etc/login.defs | 341 + .../labs/bird-ospf/w1/_system/etc/securetty | 7 + .../labs/bird-ospf/w2/_bin/fixlocal.sh | 18 + .../labs/bird-ospf/w2/_system/etc/login.defs | 341 + .../labs/bird-ospf/w2/_system/etc/securetty | 7 + .../labs/bird-ospf/w3/MyHTTPServer.py | 26 + .../labs/bird-ospf/w3/_bin/fixlocal.sh | 18 + .../labs/bird-ospf/w3/_system/etc/login.defs | 341 + .../labs/bird-ospf/w3/_system/etc/securetty | 7 + .../w3/_system/usr/local/etc/bird.conf | 54 + .../labs/bird-ospf/w3/index.html | 1 + .../wx}/MyHTTPServer.py | 0 .../labs/bird-ospf/wx/_bin/fixlocal.sh | 18 + .../labs/bird-ospf/wx/_system/etc/login.defs | 341 + .../labs/bird-ospf/wx/_system/etc/securetty | 7 + .../lib/systemd/system/httpserver.service | 13 + .../wx/_system/var/www/html/index.html | 12 + .../labs/buf64/buf64/_bin/fixlocal.sh | 18 + .../labs/buf64/buf64/_system/etc/login.defs | 341 + .../labs/buf64/buf64/_system/etc/securetty | 7 + .../labs/buf64/buf64/compile.sh | 15 + .../labs/buf64/buf64/exploit.c | 33 + .../labs/buf64/buf64/hexit.py | 10 + .../labs/buf64/buf64/shell.asm | 15 + .../labs/buf64/buf64/stack.c | 32 + .../labs/buf64/config/about.txt | 1 + .../labs/buf64/config/keywords.txt | 2 + .../labs/buf64/config/parameter.config | 10 + .../labs/buf64/config/start.config | 37 + .../Dockerfile.buf64.buf64.student | 71 + .../labs/buf64/docs/Makefile | 8 + .../labs/buf64/docs/buf64.pdf | Bin 0 -> 45495 bytes .../labs/buf64/docs/buf64.tex | 92 + .../labs/buf64/docs/header.tex | 118 + .../labs/buf64/docs/read_first.txt | 6 + .../labs/buf64/instr_config/goals.config | 4 + .../labs/buf64/instr_config/pregrade.sh | 42 + .../labs/buf64/instr_config/results.config | 7 + .../labs/bufoverflow/bufoverflow/whilebash.sh | 1 + .../labs/bufoverflow/config/keywords.txt | 2 + .../labs/bufoverflow/docs/Buffer_Overflow.tex | 18 +- .../labs/bufoverflow/docs/Makefile | 1 + .../labs/bufoverflow/docs/bufoverflow.pdf | Bin 126808 -> 127228 bytes .../bufoverflow/instr_config/goals.config | 5 +- .../bufoverflow/instr_config/results.config | 4 +- .../labs/capabilities/config/keywords.txt | 3 + .../docs/Capability_Exploration.tex | 2 +- .../docs/capabilities-report.docx | Bin 0 -> 4049 bytes .../labs/capabilities/docs/capabilities.pdf | Bin 72002 -> 72002 bytes .../instr_config/instructions.txt | 1 - .../labs/centos-log/docs/centos-log.pdf | Bin 100612 -> 90166 bytes .../centos-log/instr_config/instructions.txt | 1 - .../labs/centos-log2/config/keywords.txt | 3 + .../labs/centos-log2/docs/centos-log.pdf | Bin 166126 -> 101074 bytes .../centos-log2/instr_config/instructions.txt | 1 - .../labs/cgc/buildfiles/common_names.txt | 109 + .../labs/cgc/buildfiles/cpserver.py | 130 + .../labs/cgc/buildfiles/docker/Dockerfile | 5 + .../labs/cgc/buildfiles/dorun.sh | 2 + .../labs/cgc/buildfiles/setpaths.sh | 1 + .../labs/cgc/buildfiles/skiplist.txt | 17 + .../labs/cgc/client/_bin/fixlocal.sh | 18 + .../labs/cgc/client/_system/etc/login.defs | 341 + .../labs/cgc/client/_system/etc/securetty | 7 + .../labs/cgc/client/_system/usr/lib/libcgc.so | Bin 0 -> 29024 bytes .../labs/cgc/client/_system/usr/lib/libpov.so | Bin 0 -> 376220 bytes .../_system/usr/lib/libtiny-AES128-C.so | Bin 0 -> 23072 bytes .../cgc/client/_system/usr/sbin/cb-replay | 1444 + .../cgc/client/_system/usr/sbin/cb-replay-pov | 519 + .../labs/cgc/client/cb-replay-pov.md | 72 + .../labs/cgc/client/cb-replay.md | 62 + .../Labtainers-master/labs/cgc/client/cfe.txt | 22 + .../labs/cgc/client/common_names.txt | 109 + .../Labtainers-master/labs/cgc/client/poll.py | 35 + .../Labtainers-master/labs/cgc/client/pov.py | 37 + .../labs/cgc/client/service.map | 226 + .../Labtainers-master/labs/cgc/client/t.py | 10 + .../labs/cgc/client/throw.py | 119 + .../labs/cgc/config/about.txt | 1 + .../labs/cgc/config/bigexternal.txt | 4 + .../labs/cgc/config/keywords.txt | 5 + .../labs/cgc/config/parameter.config | 5 + .../labs/cgc/config/start.config | 45 + .../dockerfiles/Dockerfile.cgc.client.student | 72 + .../dockerfiles/Dockerfile.cgc.server.student | 67 + .../Labtainers-master/labs/cgc/docs/Makefile | 8 + .../Labtainers-master/labs/cgc/docs/cgc.pdf | Bin 0 -> 76320 bytes .../Labtainers-master/labs/cgc/docs/cgc.tex | 228 + .../labs/cgc/docs/header.tex | 118 + .../Labtainers-master/labs/cgc/docs/notes.txt | 24 + .../labs/cgc/docs/read_first.txt | 6 + .../labs/cgc/instr_config/goals.config | 5 + .../labs/cgc/instr_config/pregrade.sh | 42 + .../labs/cgc/instr_config/results.config | 4 + .../.ghidra/.ghidra_9.1.1_PUBLIC/preferences | 1 + .../labs/cgc/server/_bin/fixlocal.sh | 25 + .../labs/cgc/server/_system/etc/gdb/gdbinit | 1 + .../labs/cgc/server/_system/etc/login.defs | 341 + .../labs/cgc/server/_system/etc/securetty | 7 + .../labs/cgc/server/_system/etc/services | 833 + .../labs/cgc/server/_system/etc/services.orig | 607 + .../systemd/system/xinetd.service.d/core.conf | 3 + .../labs/cgc/server/_system/etc/xinetd.conf | 15 + .../_system/etc/xinetd.d/3d_image_toolkit | 11 + .../cgc/server/_system/etc/xinetd.d/accel | 11 + .../cgc/server/_system/etc/xinetd.d/ais-lite | 11 + .../server/_system/etc/xinetd.d/anagram_game | 11 + .../_system/etc/xinetd.d/ascii_content_server | 11 + .../cgc/server/_system/etc/xinetd.d/asl6parse | 11 + .../_system/etc/xinetd.d/audio_visualizer | 11 + .../cgc/server/_system/etc/xinetd.d/azurad | 11 + .../cgc/server/_system/etc/xinetd.d/barcoder | 11 + .../_system/etc/xinetd.d/basic_emulator | 11 + .../_system/etc/xinetd.d/basic_messaging | 11 + .../server/_system/etc/xinetd.d/bitblaster | 11 + .../server/_system/etc/xinetd.d/bloomy_sunday | 11 + .../server/_system/etc/xinetd.d/board_game | 11 + .../cgc/server/_system/etc/xinetd.d/budgit | 11 + .../server/_system/etc/xinetd.d/cablegrind | 11 + .../_system/etc/xinetd.d/cablegrindllama | 11 + .../cgc/server/_system/etc/xinetd.d/carbonate | 11 + .../server/_system/etc/xinetd.d/casino_games | 11 + ...mixup__a_cereal_vending_machine_controller | 11 + .../cgc/server/_system/etc/xinetd.d/cgc_board | 11 + .../_system/etc/xinetd.d/cgc_file_system | 11 + .../_system/etc/xinetd.d/cgc_hangman_game | 11 + .../_system/etc/xinetd.d/cgc_image_parser | 11 + .../cgc_planet_markup_language_parser | 11 + .../etc/xinetd.d/cgc_symbol_viewer_csv | 11 + .../cgc_video_format_parser_and_viewer | 11 + .../_system/etc/xinetd.d/character_statistics | 11 + .../cgc/server/_system/etc/xinetd.d/charter | 11 + .../cgc/server/_system/etc/xinetd.d/checkmate | 11 + .../server/_system/etc/xinetd.d/chess_mimic | 11 + .../server/_system/etc/xinetd.d/childs_game | 11 + .../server/_system/etc/xinetd.d/cloudcompute | 11 + .../labs/cgc/server/_system/etc/xinetd.d/cml | 11 + .../labs/cgc/server/_system/etc/xinetd.d/cnmp | 11 + .../server/_system/etc/xinetd.d/collideoscope | 11 + .../cgc/server/_system/etc/xinetd.d/corinth | 11 + .../etc/xinetd.d/cotton_swab_arithmetic | 11 + .../etc/xinetd.d/cromulence_all_service | 11 + .../labs/cgc/server/_system/etc/xinetd.d/cttp | 11 + .../server/_system/etc/xinetd.d/cyber_blogger | 11 + .../_system/etc/xinetd.d/dfars_sample_service | 11 + .../server/_system/etc/xinetd.d/diary_parser | 11 + .../cgc/server/_system/etc/xinetd.d/differ | 11 + .../etc/xinetd.d/diophantine_password_wallet | 11 + .../server/_system/etc/xinetd.d/dive_logger | 11 + .../server/_system/etc/xinetd.d/divelogger2 | 11 + .../etc/xinetd.d/document_rendering_engine | 11 + .../_system/etc/xinetd.d/dungeon_master | 11 + .../_system/etc/xinetd.d/ecm_tcm_simulator | 11 + .../labs/cgc/server/_system/etc/xinetd.d/eddy | 11 + .../_system/etc/xinetd.d/electronictrading | 11 + .../_system/etc/xinetd.d/email_system_2 | 11 + .../_system/etc/xinetd.d/enslavednode_chat | 11 + .../cgc/server/_system/etc/xinetd.d/estadio | 11 + .../server/_system/etc/xinetd.d/eternalpass | 11 + .../_system/etc/xinetd.d/expression_database | 11 + .../server/_system/etc/xinetd.d/fablesreport | 11 + .../cgc/server/_system/etc/xinetd.d/facemag | 11 + .../xinetd.d/facilities_access_control_system | 11 + .../cgc/server/_system/etc/xinetd.d/failav | 11 + .../cgc/server/_system/etc/xinetd.d/fastlane | 11 + .../cgc/server/_system/etc/xinetd.d/filesys | 11 + .../etc/xinetd.d/filesystem_command_shell | 11 + .../_system/etc/xinetd.d/finicky_file_folder | 11 + .../cgc/server/_system/etc/xinetd.d/fishyxml | 11 + .../_system/etc/xinetd.d/flash_file_system | 11 + .../server/_system/etc/xinetd.d/flight_routes | 11 + .../cgc/server/_system/etc/xinetd.d/fortress | 11 + .../cgc/server/_system/etc/xinetd.d/fsk_bbs | 11 + .../etc/xinetd.d/fsk_messaging_service | 11 + .../labs/cgc/server/_system/etc/xinetd.d/fun | 11 + .../server/_system/etc/xinetd.d/game_night | 11 + .../labs/cgc/server/_system/etc/xinetd.d/glue | 11 + .../server/_system/etc/xinetd.d/gps_tracker | 11 + .../cgc/server/_system/etc/xinetd.d/greatview | 11 + .../cgc/server/_system/etc/xinetd.d/greeter | 11 + .../server/_system/etc/xinetd.d/greymatter | 11 + .../cgc/server/_system/etc/xinetd.d/gridder | 11 + .../cgc/server/_system/etc/xinetd.d/griswold | 11 + .../labs/cgc/server/_system/etc/xinetd.d/grit | 11 + .../server/_system/etc/xinetd.d/h20flowinc | 11 + .../cgc/server/_system/etc/xinetd.d/hackman | 11 + .../server/_system/etc/xinetd.d/hawaii_sets | 11 + .../server/_system/etc/xinetd.d/headscratch | 11 + .../server/_system/etc/xinetd.d/heartthrob | 11 + .../cgc/server/_system/etc/xinetd.d/highcoo | 11 + .../etc/xinetd.d/highfrequencytradingalgo | 11 + .../cgc/server/_system/etc/xinetd.d/hug_game | 11 + .../_system/etc/xinetd.d/humaninterface | 11 + .../_system/etc/xinetd.d/image_compressor | 11 + .../cgc/server/_system/etc/xinetd.d/insulatr | 11 + .../server/_system/etc/xinetd.d/kaprica_go | 11 + .../etc/xinetd.d/kaprica_script_interpreter | 11 + .../_system/etc/xinetd.d/kty_pretty_printer | 11 + .../cgc/server/_system/etc/xinetd.d/lazybox | 11 + .../cgc/server/_system/etc/xinetd.d/lazycalc | 11 + .../labs/cgc/server/_system/etc/xinetd.d/lms | 11 + ...ud_square_instant_messaging_protocol_lsimp | 11 + .../server/_system/etc/xinetd.d/matchmaker | 11 + .../xinetd.d/material_temperature_simulation | 11 + .../_system/etc/xinetd.d/mathematical_solver | 11 + .../_system/etc/xinetd.d/matrices_for_sale | 11 + .../etc/xinetd.d/matrix_math_calculator | 11 + .../_system/etc/xinetd.d/message_service | 11 + .../cgc/server/_system/etc/xinetd.d/middleout | 11 + .../_system/etc/xinetd.d/middleware_handshake | 11 + .../etc/xinetd.d/minimalistic_memo_manager_3m | 11 + .../cgc/server/_system/etc/xinetd.d/mixology | 11 + .../_system/etc/xinetd.d/modern_family_tree | 11 + .../server/_system/etc/xinetd.d/monster_game | 11 + .../_system/etc/xinetd.d/mount_filemore | 11 + .../_system/etc/xinetd.d/movie_rental_service | 11 + .../etc/xinetd.d/movie_rental_service_redux | 11 + .../xinetd.d/multi_arena_pursuit_simulator | 11 + .../_system/etc/xinetd.d/multi_user_calendar | 11 + .../etc/xinetd.d/multicast_chat_server | 11 + .../cgc/server/_system/etc/xinetd.d/multipass | 11 + .../server/_system/etc/xinetd.d/multipass2 | 11 + .../server/_system/etc/xinetd.d/multipass3 | 11 + .../_system/etc/xinetd.d/music_store_client | 11 + .../_system/etc/xinetd.d/narfagainshell | 11 + .../cgc/server/_system/etc/xinetd.d/narfrpn | 11 + .../server/_system/etc/xinetd.d/netstorage | 11 + .../_system/etc/xinetd.d/network_file_system | 11 + .../etc/xinetd.d/network_file_system_v3 | 11 + .../etc/xinetd.d/network_queuing_simulator | 11 + .../server/_system/etc/xinetd.d/neural_house | 11 + .../etc/xinetd.d/no_paper._not_ever._nope | 11 + .../cgc/server/_system/etc/xinetd.d/nohic | 11 + .../cgc/server/_system/etc/xinetd.d/on_sale | 11 + .../cgc/server/_system/etc/xinetd.d/one_amp | 11 + .../cgc/server/_system/etc/xinetd.d/one_vote | 11 + .../etc/xinetd.d/online_job_application | 11 + .../etc/xinetd.d/online_job_application2 | 11 + .../cgc/server/_system/etc/xinetd.d/otpsim | 11 + .../_system/etc/xinetd.d/overflow_parking | 11 + .../server/_system/etc/xinetd.d/pac_for_edges | 11 + .../_system/etc/xinetd.d/packet_analyzer | 11 + .../_system/etc/xinetd.d/packet_receiver | 11 + .../server/_system/etc/xinetd.d/palindrome | 11 + .../server/_system/etc/xinetd.d/palindrome2 | 11 + .../parking_permit_management_system_ppms | 11 + .../_system/etc/xinetd.d/particle_simulator | 11 + .../_system/etc/xinetd.d/pattern_finder | 11 + .../cgc/server/_system/etc/xinetd.d/payroll | 11 + .../_system/etc/xinetd.d/pcm_message_decoder | 11 + .../etc/xinetd.d/personal_fitness_manager | 11 + .../etc/xinetd.d/pizza_ordering_system | 11 + .../_system/etc/xinetd.d/pkk_steganography | 11 + .../cgc/server/_system/etc/xinetd.d/printer | 11 + .../labs/cgc/server/_system/etc/xinetd.d/pru | 11 + .../cgc/server/_system/etc/xinetd.d/ptaas | 11 + .../_system/etc/xinetd.d/quadtreeconways | 11 + .../_system/etc/xinetd.d/query_calculator | 11 + .../server/_system/etc/xinetd.d/quietsquare | 11 + .../_system/etc/xinetd.d/ram_based_filesystem | 11 + .../server/_system/etc/xinetd.d/reallystream | 11 + .../etc/xinetd.d/recipe_and_pantry_manager | 11 + .../_system/etc/xinetd.d/recipe_database | 11 + .../cgc/server/_system/etc/xinetd.d/rejistar | 11 + .../rematch_2--mail_server--crackaddr | 11 + ...3--address_resolution_service--sql_slammer | 11 + .../rematch_4--cgcrpc_server--ms08-067 | 11 + .../rematch_5--file_explorer--lnk_bug | 11 + .../rematch_6--secure_server--heartbleed | 11 + .../_system/etc/xinetd.d/resort_modeller | 11 + .../_system/etc/xinetd.d/root64_and_parcour | 11 + .../_system/etc/xinetd.d/router_simulator | 11 + .../labs/cgc/server/_system/etc/xinetd.d/rrpn | 11 + .../xinetd.d/sad_face_template_engine_sfte | 11 + .../_system/etc/xinetd.d/sample_shipgame | 11 + .../cgc/server/_system/etc/xinetd.d/sauth | 11 + .../_system/etc/xinetd.d/scrum_database | 11 + .../_system/etc/xinetd.d/scuba_dive_logging | 11 + .../_system/etc/xinetd.d/secure_compression | 11 + .../cgc/server/_system/etc/xinetd.d/sensr | 11 + .../server/_system/etc/xinetd.d/sftscbsiss | 11 + .../xinetd.d/shortest_path_tree_calculator | 11 + .../cgc/server/_system/etc/xinetd.d/shoutctf | 11 + .../cgc/server/_system/etc/xinetd.d/sigsegv | 11 + .../etc/xinetd.d/simple_integer_calculator | 11 + .../_system/etc/xinetd.d/simple_stack_machine | 11 + .../server/_system/etc/xinetd.d/simplenote | 11 + .../cgc/server/_system/etc/xinetd.d/simpleocr | 11 + .../_system/etc/xinetd.d/single-sign-on | 11 + .../xinetd.d/slur_reference_implementation | 11 + .../server/_system/etc/xinetd.d/snail_mail | 11 + .../cgc/server/_system/etc/xinetd.d/solfedge | 11 + .../cgc/server/_system/etc/xinetd.d/sorter | 11 + .../_system/etc/xinetd.d/space_attackers | 11 + .../cgc/server/_system/etc/xinetd.d/spiffs | 11 + .../server/_system/etc/xinetd.d/square_rabbit | 11 + .../cgc/server/_system/etc/xinetd.d/stack_vm | 11 + .../etc/xinetd.d/stock_exchange_simulator | 11 + .../cgc/server/_system/etc/xinetd.d/stream_vm | 11 + .../server/_system/etc/xinetd.d/stream_vm2 | 11 + .../_system/etc/xinetd.d/street_map_service | 11 + .../etc/xinetd.d/string_info_calculator | 11 + .../etc/xinetd.d/string_storage_and_retrieval | 11 + .../server/_system/etc/xinetd.d/taintedlove | 11 + .../xinetd.d/tennis_ball_motion_calculator | 11 + .../etc/xinetd.d/terrible_ticket_tracker | 11 + .../server/_system/etc/xinetd.d/textsearch | 11 + .../cgc/server/_system/etc/xinetd.d/tfttp | 11 + .../_system/etc/xinetd.d/the_longest_road | 11 + .../etc/xinetd.d/thermal_controller_v2 | 11 + .../etc/xinetd.d/thermal_controller_v3 | 11 + .../cgc/server/_system/etc/xinetd.d/tiaca | 11 + .../server/_system/etc/xinetd.d/tick-a-tack | 11 + .../labs/cgc/server/_system/etc/xinetd.d/tvs | 11 + .../etc/xinetd.d/university_enrollment | 11 + .../server/_system/etc/xinetd.d/user_manager | 11 + .../cgc/server/_system/etc/xinetd.d/utf-late | 11 + .../server/_system/etc/xinetd.d/valvechecks | 11 + .../_system/etc/xinetd.d/vector_graphics_2 | 11 + .../etc/xinetd.d/vector_graphics_format | 11 + .../_system/etc/xinetd.d/venture_calculator | 11 + .../cgc/server/_system/etc/xinetd.d/vfilter | 11 + .../_system/etc/xinetd.d/virtual_machine | 11 + .../server/_system/etc/xinetd.d/virtual_pet | 11 + .../water_treatment_facility_simulator | 11 + .../cgc/server/_system/etc/xinetd.d/whackjack | 11 + .../_system/etc/xinetd.d/wordcompletion | 11 + .../cgc/server/_system/etc/xinetd.d/xstore | 11 + .../cgc/server/_system/etc/xinetd.d/yolodex | 11 + .../labs/cgc/server/_system/usr/lib/libcgc.so | Bin 0 -> 29024 bytes .../labs/cgc/server/_system/usr/lib/libpov.so | Bin 0 -> 376220 bytes .../_system/usr/lib/libtiny-AES128-C.so | Bin 0 -> 23072 bytes .../Labtainers-master/labs/cgc/server/ghidra | 3 + .../Labtainers-master/labs/cgc/server/ida | 3 + .../labs/cyberciege/docs/read_pre.txt | 3 + .../cyberciege/instr_config/instructions.txt | 1 - .../labs/db-access/config/about.txt | 1 + .../labs/db-access/config/db.quiz | 29 + .../labs/db-access/config/keywords.txt | 4 + .../labs/db-access/config/parameter.config | 5 + .../labs/db-access/config/start.config | 71 + .../database/.mysql/workbench/connections.xml | 37 + .../.mysql/workbench/server_instances.xml | 40 + .../.mysql/workbench/shell_bookmarks.txt | 10 + .../.mysql/workbench/shell_history.txt} | 0 .../workbench/snippets/DB_Management.txt | 121 + .../workbench/snippets/SQL_DDL_Statements.txt | 325 + .../workbench/snippets/SQL_DML_Statements.txt | 140 + .../.mysql/workbench/starters_settings.xml | 12 + .../.mysql/workbench/user_starters.xml | 4 + .../database/.mysql/workbench/wb_options.xml | 717 + .../database/.mysql/workbench/wb_state.xml | 8 + .../labs/db-access/database/MYCO.sql | 235 + .../labs/db-access/database/_bin/fixlocal.sh | 51 + .../db-access/database/_system/etc/login.defs | 341 + .../_system/etc/mysql/mysql.conf.d/mysqld.cnf | 105 + .../db-access/database/_system/etc/securetty | 7 + .../database/_system/usr}/bin/firefox | 0 .../database/_system}/var/tmp/home.tar | Bin .../labs/db-access/database/users.sql | 18 + .../Dockerfile.db-access.database.student | 73 + .../Dockerfile.db-access.executive.student | 72 + .../Dockerfile.db-access.finance.student | 72 + .../Dockerfile.db-access.hr.student | 72 + .../Dockerfile.db-access.it.student | 72 + .../labs/db-access/docs/Makefile | 6 + .../labs/db-access/docs/db-access.docx | Bin 0 -> 17874 bytes .../labs/db-access/docs/db-access.pdf | Bin 0 -> 73581 bytes .../labs/db-access/docs/read_first.txt | 6 + .../labs/db-access/executive/_bin/fixlocal.sh | 18 + .../labs/db-access/executive/_bin/prestop | 2 + .../db-access/executive/_bin/treataslocal | 1 + .../executive/_system/etc/login.defs | 341 + .../db-access/executive/_system/etc/securetty | 7 + .../labs/db-access/executive/steven.sql | 43 + .../labs/db-access/finance/_bin/fixlocal.sh | 18 + .../labs/db-access/finance/_bin/prestop | 2 + .../labs/db-access/finance/_bin/treataslocal | 1 + .../db-access/finance/_system/etc/login.defs | 341 + .../db-access/finance/_system/etc/securetty | 7 + .../labs/db-access/finance/nancy.sql | 20 + .../labs/db-access/hr/_bin/fixlocal.sh | 18 + .../labs/db-access/hr/_bin/prestop | 2 + .../labs/db-access/hr/_bin/treataslocal | 1 + .../labs/db-access/hr/_system/etc/login.defs | 341 + .../labs/db-access/hr/_system/etc/securetty | 7 + .../labs/db-access/hr/susan.sql | 32 + .../labs/db-access/instr_config/goals.config | 62 + .../labs/db-access/instr_config/pregrade.sh | 42 + .../db-access/instr_config/results.config | 150 + .../labs/db-access/it/_bin/fixlocal.sh | 18 + .../labs/db-access/it/_bin/prestop | 2 + .../labs/db-access/it/_bin/treataslocal | 1 + .../labs/db-access/it/_system/etc/login.defs | 341 + .../labs/db-access/it/_system/etc/securetty | 7 + .../labs/db-access/it/david.sql | 28 + .../labs/db-access/steven/_bin/prestop | 2 + .../labs/denyhost/client/bot.py | 2 +- .../labs/denyhost/config/keywords.txt | 3 + .../labs/denyhost/docs/denyhosts.docx | Bin 9121 -> 9190 bytes .../labs/denyhost/docs/denyhosts.pdf | Bin 58647 -> 52506 bytes .../dhcp-test/instr_config/instructions.txt | 1 - .../labs/dmz-example/config/parameter.config | 6 +- .../labs/dmz-example/config/start.config | 2 +- .../labs/dmz-example/dns/_bin/fixlocal.sh | 6 +- .../labs/dmz-example/dns/_system/etc/rc.local | 1 + .../dmz-example/dns/_system/sbin/faux_init | 20 - .../Dockerfile.dmz-example.dns.student | 3 + .../labs/dmz-example/docs/Makefile | 1 + .../labs/dmz-example/docs/dmz-example.jpg | Bin 58223 -> 48334 bytes .../labs/dmz-example/docs/dmz-example.odg | Bin 16985 -> 16487 bytes .../labs/dmz-example/docs/dmz-example.pdf | Bin 98592 -> 88451 bytes .../labs/dmz-example/docs/dmz-example.tex | 2 +- .../dmz-example/instr_config/instructions.txt | 1 - .../labs/dmz-example/isp/_bin/fixlocal.sh | 7 +- .../labs/dmz-example/isp/_system/etc/rc.local | 4 + .../dmz-example/isp/_system/sbin/faux_init | 17 - .../dmz-example/outer_gw/_system/etc/rc.local | 2 +- .../web_server/_system/etc/rc.d/rc.local | 4 + .../web_server/_system/etc/rc.local | 4 +- .../labs/dmz-example/ws1/_bin/fixlocal.sh | 3 - .../labs/dmz-example/ws1/_system/etc/rc.local | 5 +- .../labs/dmz-example/ws2/_bin/fixlocal.sh | 4 - .../labs/dmz-example/ws2/_system/etc/rc.local | 6 +- .../labs/dmz-example/ws3/_system/etc/rc.local | 4 +- .../labs/dmz-lab/config/dmz-lab.quiz | 13 + .../labs/dmz-lab/config/keywords.txt | 3 + .../labs/dmz-lab/config/start.config | 2 +- .../labs/dmz-lab/dns/_system/sbin/faux_init | 18 - .../labs/dmz-lab/docs/Makefile | 1 + .../labs/dmz-lab/docs/dmz-lab.jpg | Bin 64754 -> 63542 bytes .../labs/dmz-lab/docs/dmz-lab.odg | Bin 17586 -> 17111 bytes .../labs/dmz-lab/docs/dmz-lab.pdf | Bin 114298 -> 100401 bytes .../labs/dmz-lab/docs/dmz-lab.tex | 32 +- .../labs/dmz-lab/inner_gw/_bin/notify | 1 + .../labs/dmz-lab/inner_gw/_bin/notify_cb.sh | 27 + .../dmz-lab/inner_gw/_system/etc/rc.local | 2 +- .../dmz-lab/inner_gw/_system/sbin/faux_init | 18 - .../labs/dmz-lab/instr_config/goals.config | 20 +- .../dmz-lab/instr_config/instructions.txt | 1 - .../labs/dmz-lab/instr_config/results.config | 31 +- .../labs/dmz-lab/isp/_bin/fixlocal.sh | 4 - .../labs/dmz-lab/isp/_system/etc/rc.local | 4 + .../labs/dmz-lab/isp/_system/sbin/faux_init | 17 - .../dmz-lab/outer_gw/_system/sbin/faux_init | 19 - .../dmz-lab/remote_gw/_system/sbin/faux_init | 18 - .../labs/dmz-lab/remote_ws/_bin/prestop | 4 + .../labs/dmz-lab/remote_ws/_bin/treataslocal | 1 + .../dmz-lab/web_server/_system/sbin/faux_init | 19 - .../labs/dmz-lab/ws1/_bin/prestop | 4 + .../labs/dmz-lab/ws1/_system/sbin/faux_init | 19 - .../labs/dmz-lab/ws2/_bin/fixlocal.sh | 2 + .../etc/systemd/system/httpserver.service | 12 + .../labs/dmz-lab/ws2/_system/sbin/faux_init | 19 - .../ws2/_system/usr/bin/MyHTTPServer.py | 25 + .../ws2/_system/var/www/html/index.html | 7 + .../labs/dmz-lab/ws3/_system/sbin/faux_init | 19 - .../labs/dns/config/about.txt | 1 + .../labs/dns/config/keywords.txt | 2 + .../labs/dns/config/parameter.config | 1 + .../labs/dns/config/post.quiz | 2 + .../labs/dns/config/start.config | 61 + .../labs/dns/dns/_bin/fixlocal.sh | 22 + .../dns/dns/_system/etc/bind/example.conf | 9 + .../labs/dns/dns/_system/etc/login.defs | 341 + .../labs/dns/dns/_system/etc/rc.local | 5 + .../labs/dns/dns/_system/etc/securetty | 7 + .../etc/systemd/system/mynotify.service | 8 + .../dns/dns/_system/var/named/192.168.0.0 | 12 + .../dns/_system/var/named/example.com.zone | 14 + .../dockerfiles/Dockerfile.dns.dns.student | 66 + .../dns/dockerfiles/Dockerfile.dns.gw.student | 63 + .../dockerfiles/Dockerfile.dns.isp.student | 73 + .../Dockerfile.dns.net-monitor.student | 68 + .../dockerfiles/Dockerfile.dns.tap.student | 68 + .../dockerfiles/Dockerfile.dns.ws1.student | 73 + .../dockerfiles/Dockerfile.dns.ws2.student | 73 + .../dockerfiles/Dockerfile.dns.ws3.student | 73 + .../Labtainers-master/labs/dns/docs/Makefile | 7 + .../Labtainers-master/labs/dns/docs/dns.jpg | Bin 0 -> 23560 bytes .../Labtainers-master/labs/dns/docs/dns.odg | Bin 0 -> 13198 bytes .../Labtainers-master/labs/dns/docs/dns.pdf | Bin 0 -> 89760 bytes .../Labtainers-master/labs/dns/docs/dns.tex | 190 + .../labs/dns/docs/header.tex | 122 + .../Labtainers-master/labs/dns/docs/note.txt | 18 + .../labs/dns/docs/read_first.txt | 5 + .../labs/dns/gw/_bin/fixlocal.sh | 11 + .../Labtainers-master/labs/dns/gw/_bin/notify | 1 + .../labs/dns/gw/_bin/notify_cb.sh | 27 + .../labs/dns/gw/_system/etc/login.defs | 341 + .../labs/dns/gw/_system/etc/rc.local | 9 + .../labs/dns/gw/_system/etc/securetty | 7 + .../etc/systemd/system/mynotify.service | 8 + .../labs/dns/instr_config/goals.config | 1 + .../labs/dns/instr_config/pregrade.sh | 42 + .../labs/dns/instr_config/results.config | 5 + .../labs/dns/isp/_bin/fixlocal.sh | 18 + .../labs/dns/isp/_system/etc/login.defs | 341 + .../labs/dns/isp/_system/etc/rc.local | 2 + .../labs/dns/isp/_system/etc/securetty | 7 + .../labs/dns/net-monitor/_bin/fixlocal.sh | 18 + .../dns/net-monitor/_system/etc/login.defs | 341 + .../dns/net-monitor/_system/etc/securetty | 7 + .../labs/dns/tap/_bin/fixlocal.sh | 18 + .../labs/dns/tap/_system/etc/login.defs | 341 + .../labs/dns/tap/_system/etc/securetty | 7 + .../labs/dns/ws1/_bin/fixlocal.sh | 18 + .../labs/dns/ws1/_bin/treataslocal | 1 + .../labs/dns/ws1/_system/etc/login.defs | 341 + .../labs/dns/ws1/_system/etc/rc.local | 3 + .../labs/dns/ws1/_system/etc/securetty | 7 + .../labs/dns/ws2/_bin/fixlocal.sh | 18 + .../labs/dns/ws2/_bin/treataslocal | 1 + .../labs/dns/ws2/_system/etc/login.defs | 341 + .../labs/dns/ws2/_system/etc/rc.local | 3 + .../labs/dns/ws2/_system/etc/securetty | 7 + .../labs/dns/ws3/_bin/fixlocal.sh | 18 + .../labs/dns/ws3/_bin/treataslocal | 1 + .../labs/dns/ws3/_system/etc/login.defs | 341 + .../labs/dns/ws3/_system/etc/securetty | 7 + .../labs/file-deletion/config/keywords.txt | 3 + .../file-deletion/docs/file-deletion.docx | Bin 21164 -> 21134 bytes .../labs/file-deletion/docs/file-deletion.pdf | Bin 117469 -> 98010 bytes .../file-deletion/_bin/fixlocal.sh | 8 + .../instr_config/instructions.txt | 1 - .../labs/file-integrity/config/keywords.txt | 3 + .../file-integrity/docs/file-integrity.pdf | Bin 169394 -> 97978 bytes .../instr_config/instructions.txt | 1 - .../labs/format64/config/about.txt | 1 + .../labs/format64/config/keywords.txt | 3 + .../labs/format64/config/parameter.config | 7 + .../labs/format64/config/start.config | 19 + .../Dockerfile.format64.format64.student | 15 + .../labs/format64/docs/Makefile | 8 + .../labs/format64/docs/format64.pdf | Bin 0 -> 53253 bytes .../labs/format64/docs/format64.tex | 89 + .../labs/format64/docs/header.tex | 118 + .../labs/format64/docs/read_first.txt | 6 + .../labs/format64/format64/_bin/fixlocal.sh | 3 + .../labs/format64/format64/_bin/precheck.sh | 1 + .../format64}/_system/sbin/faux_init | 0 .../labs/format64/format64/vul_prog.c | 42 + .../labs/format64/instr_config/goals.config | 12 + .../labs/format64/instr_config/results.config | 8 + .../labs/formatstring/config/keywords.txt | 3 + .../labs/formatstring/docs/Format_String.tex | 9 +- .../labs/formatstring/docs/Makefile | 1 + .../labs/formatstring/docs/formatstring.pdf | Bin 139299 -> 145911 bytes .../formatstring/instr_config/goals.config | 5 +- .../formatstring/instr_config/results.config | 14 +- .../labs/gdb-cpp/config/about.txt | 1 + .../labs/gdb-cpp/config/keywords.txt | 2 + .../labs/gdb-cpp/config/parameter.config | 5 + .../labs/gdb-cpp/config/start.config | 37 + .../Dockerfile.gdb-cpp.gdb-cpp.student | 73 + .../labs/gdb-cpp/docs/Makefile | 8 + .../labs/gdb-cpp/docs/gdb-cpp.pdf | Bin 0 -> 97369 bytes .../labs/gdb-cpp/docs/gdb-cpp.tex | 190 + .../labs/gdb-cpp/docs/header.tex | 120 + .../labs/gdb-cpp/docs/read_first.txt | 5 + .../labs/gdb-cpp/gdb-cpp/Makefile | 8 + .../labs/gdb-cpp/gdb-cpp/_bin/fixlocal.sh | 18 + .../labs/gdb-cpp/gdb-cpp/_bin/treataslocal | 1 + .../gdb-cpp/gdb-cpp/_system/etc/login.defs | 341 + .../gdb-cpp/gdb-cpp/_system/etc/securetty | 7 + .../labs/gdb-cpp/gdb-cpp/main.cc | 134 + .../labs/gdb-cpp/instr_config/goals.config | 2 + .../labs/gdb-cpp/instr_config/pregrade.sh | 42 + .../labs/gdb-cpp/instr_config/results.config | 1 + .../labs/gdblesson/config/keywords.txt | 2 + .../labs/gdblesson/docs/gdblesson.pdf | Bin 44101 -> 38529 bytes .../labs/gdblesson/gdblesson/sampleMath.c | 2 +- .../labs/gdblesson/gdblesson/sampleMath2.c | 2 +- .../labs/gdblesson/instr_config/goals.config | 1 - .../gdblesson/instr_config/instructions.txt | 1 - .../gdblesson/instr_config/results.config | 1 - .../labs/ghidra/config/about.txt | 1 + .../labs/ghidra/config/keywords.txt | 3 + .../labs/ghidra/config/parameter.config | 9 + .../labs/ghidra/config/start.config | 45 + .../Dockerfile.ghidra.ghidra.student | 66 + .../Dockerfile.ghidra.server.student | 72 + .../labs/ghidra/docs/Makefile | 7 + .../labs/ghidra/docs/ghidra.pdf | Bin 0 -> 49910 bytes .../labs/ghidra/docs/ghidra.tex | 101 + .../labs/ghidra/docs/header.tex | 122 + .../labs/ghidra/docs/read_first.txt | 6 + .../labs/ghidra/ghidra/_bin/fixlocal.sh | 19 + .../labs/ghidra/ghidra/_bin/treataslocal | 1 + .../labs/ghidra/ghidra/_system/etc/login.defs | 341 + .../labs/ghidra/ghidra/_system/etc/securetty | 7 + .../ghidra/ghidra/_system/usr/bin/setbyte | 12 + .../labs/ghidra/ghidra/cadet01 | Bin 0 -> 7856 bytes .../labs/ghidra/ghidra/ghidra | 2 + .../labs/ghidra/instr_config/goals.config | 5 + .../labs/ghidra/instr_config/pregrade.sh | 42 + .../labs/ghidra/instr_config/results.config | 8 + .../labs/ghidra/server/_bin/fixlocal.sh | 20 + .../server/_system/etc/init.d/cadet.sh} | 17 +- .../labs/ghidra/server/_system/etc/login.defs | 341 + .../labs/ghidra/server/_system/etc/securetty | 7 + .../_system/lib/systemd/system/cadet.service | 13 + .../ghidra/server/_system/usr/bin/setbyte | 12 + .../labs/ghidra/server/cadet01 | Bin 0 -> 7856 bytes .../labs/grassmarlin/config/keywords.txt | 4 + .../labs/grassmarlin/docs/grassmarlin.dvi | Bin 7480 -> 0 bytes .../labs/grassmarlin/docs/grassmarlin.pdf | Bin 41410 -> 41410 bytes .../labs/grassmarlin/docs/grassmarlin.tex | 2 +- .../grassmarlin/instr_config/instructions.txt | 1 - .../labs/grfics/docs/grfics.dvi | Bin 3660 -> 0 bytes .../labs/grfics/docs/grfics.pdf | Bin 44811 -> 44811 bytes .../labs/grfics/instr_config/instructions.txt | 1 - .../labs/httplab/config/keywords.txt | 1 + .../labs/httplab/config/start.config | 1 - .../Labtainers-master/labs/ida/config/version | 1 + .../Labtainers-master/labs/ida/docs/ida.pdf | Bin 96000 -> 35942 bytes .../labs/ida/instr_config/instructions.txt | 1 - .../labs/ida2/config/about.txt | 1 + .../labs/ida2/config/bigexternal.txt | 1 + .../labs/ida2/config/keywords.txt | 3 + .../labs/ida2/config/parameter.config | 5 + .../{shellbasics => ida2}/config/start.config | 32 +- .../labs/ida2/config/version | 1 + .../dockerfiles/Dockerfile.ida2.ida.student | 72 + .../Labtainers-master/labs/ida2/docs/Makefile | 6 + .../Labtainers-master/labs/ida2/docs/ida.docx | Bin 0 -> 14816 bytes .../Labtainers-master/labs/ida2/docs/ida.pdf | Bin 0 -> 35942 bytes .../labs/ida2/docs/read_first.txt | 6 + .../labs/ida2/ida/_bin/fixlocal.sh | 24 + .../labs/ida2/ida/_system/etc/login.defs | 341 + .../labs/ida2/ida/_system/etc/securetty | 7 + .../Labtainers-master/labs/ida2/ida/mk.sh | 1 + .../Labtainers-master/labs/ida2/ida/sample.c | 20 + .../labs/ida2/instr_config/goals.config | 5 + .../labs/ida2/instr_config/pregrade.sh | 42 + .../labs/ida2/instr_config/results.config | 4 + .../labs/iptables-ics/client1/_bin/prestop | 7 + .../labs/iptables-ics/client2/_bin/prestop | 7 + .../labs/iptables-ics/config/keywords.txt | 5 + .../labs/iptables-ics/config/start.config | 2 + .../Dockerfile.iptables-ics.plc.student | 25 +- .../labs/iptables-ics/docs/Makefile | 1 + .../labs/iptables-ics/docs/iptables-ics.pdf | Bin 69085 -> 68945 bytes .../labs/iptables-ics/docs/iptables-ics.tex | 2 +- .../instr_config/instructions.txt | 1 - .../labs/iptables-ics/plc/_bin/fixlocal.sh | 7 +- .../iptables-ics/plc/_system/etc/rc.local | 16 - .../_system/lib/systemd/system/plc.service | 13 - .../_system/sbin/OpenPLC_v2x/core/modbus.cpp | 899 - .../plc/_system/sbin/OpenPLC_v2x/server.js | 476 - .../plc/_system/var/tmp/mbconfig.cfg | 26 + .../plc/_system/var/tmp/openplc.db | Bin 0 -> 40960 bytes .../plc/sys_tar/external-manifest | 1 - .../labs/iptables/docs/Makefile | 6 + .../labs/iptables/docs/iptables.docx | Bin 0 -> 6913 bytes .../labs/iptables/docs/iptables.pdf | Bin 0 -> 34839 bytes .../labs/iptables/docs/read_first.txt | 6 + .../iptables/instr_config/instructions.txt | 1 - .../labs/iptables2/client/_bin/prestop | 3 + .../iptables2/client/_system/sbin/faux_init | 18 - .../labs/iptables2/config/iptables.quiz | 7 + .../labs/iptables2/config/keywords.txt | 3 + .../labs/iptables2/config/parameter.config | 2 +- .../Dockerfile.iptables2.client.student | 2 +- .../Dockerfile.iptables2.firewall.student | 6 +- .../Dockerfile.iptables2.server.student | 2 +- .../labs/iptables2/docs/Makefile | 1 + .../labs/iptables2/docs/iptables.out | 8 - .../labs/iptables2/docs/iptables.pdf | Bin 54855 -> 54302 bytes .../labs/iptables2/docs/iptables.tex | 27 +- .../labs/iptables2/firewall/_bin/fixlocal.sh | 2 +- .../iptables2/firewall/_system/sbin/faux_init | 19 - .../labs/iptables2/instr_config/goals.config | 12 +- .../iptables2/instr_config/instructions.txt | 1 - .../iptables2/instr_config/results.config | 17 +- .../iptables2/server/_system/sbin/faux_init | 21 - .../lib/systemd/system/httpserver.service | 0 .../lib/systemd/system/wizbang.service | 0 .../kali-test/instr_config/instructions.txt | 1 - .../labs/ldap/config/keywords.txt | 2 + .../labs/ldap/config/parameter.config | 4 - .../labs/ldap/config/start.config | 82 +- .../dockerfiles/Dockerfile.ldap.ldap.student | 2 +- .../Dockerfile.ldap.server1.student | 2 +- .../Dockerfile.ldap.server2.student | 2 +- .../Labtainers-master/labs/ldap/docs/Makefile | 1 + .../Labtainers-master/labs/ldap/docs/ldap.pdf | Bin 65544 -> 76611 bytes .../Labtainers-master/labs/ldap/docs/ldap.tex | 59 +- .../labs/ldap/instr_config/goals.config | 4 +- .../labs/ldap/instr_config/instructions.txt | 1 - .../labs/ldap/ldap/_bin/fixlocal.sh | 5 +- .../labs/ldap/ldap/_system/sbin/faux_init | 19 - .../ldap/ldap/_system/var/tmp/enable-ssl.sh | 7 + .../ldap/ldap/_system/var/tmp/selfsign.sh | 17 + .../labs/ldap/ldap/_system/var/tmp/xcert.ldif | 4 + .../labs/ldap/ldap/_system/var/tmp/xkey.ldif | 4 + .../labs/ldap/ldap/mike.ldif | 16 + .../labs/ldap/ldap/projx.ldif | 4 + .../labs/ldap/server1/_bin/fixlocal.sh | 2 +- .../labs/ldap/server1/_system/etc/ldap.secret | 1 + .../labs/ldap/server1/_system/etc/nscd.conf | 96 + .../labs/ldap/server1/_system/sbin/faux_init | 19 - .../_system/var/tmp/configure-ldap-client.sh | 9 +- .../server1/_system/var/tmp/dogs/dog2.txt | 2 +- .../labs/ldap/server2/_system/etc/ldap.secret | 1 + .../labs/ldap/server2/_system/etc/nscd.conf | 96 + .../labs/ldap/server2/_system/sbin/faux_init | 19 - .../_system/var/tmp/configure-ldap-client.sh | 6 +- .../server2/_system/var/tmp/dogs/dog2.txt | 2 +- .../labs/ldaptst/client/_bin/fixlocal.sh | 18 + .../ldaptst/client/_system/etc/login.defs | 341 + .../labs/ldaptst/client/_system/etc/securetty | 7 + .../ldaptst/client/_system/var/tmp/doauth.sh | 7 + .../client/_system/var/tmp/enablessl.sh | 7 + .../labs/ldaptst/config/about.txt | 1 + .../labs/ldaptst/config/client-home_tar.list | 0 .../labs/ldaptst/config/ldaptst-home_tar.list | 0 .../labs/ldaptst/config/parameter.config | 1 + .../labs/ldaptst/config/start.config | 15 + .../Dockerfile.ldaptst.client.student | 63 + .../Dockerfile.ldaptst.ldaptst.student | 63 + .../labs/ldaptst/docs/read_first.txt | 5 + .../labs/ldaptst/instr_config/goals.config | 1 + .../labs/ldaptst/instr_config/pregrade.sh | 42 + .../labs/ldaptst/instr_config/results.config | 1 + .../labs/ldaptst/ldaptst/_bin/fixlocal.sh | 21 + .../ldaptst/ldaptst/_system/etc/login.defs | 341 + .../ldaptst/ldaptst/_system/etc/securetty | 7 + .../ldaptst/_system/var/tmp/adduser.sh | 3 + .../ldaptst/ldaptst/_system/var/tmp/base.ldif | 17 + .../ldaptst/ldaptst/_system/var/tmp/db.ldif | 14 + .../ldaptst/_system/var/tmp/enabless.sh | 7 + .../ldaptst/ldaptst/_system/var/tmp/mike.ldif | 17 + .../ldaptst/_system/var/tmp/monitor.ldif | 4 + .../ldaptst/_system/var/tmp/projx.ldif | 4 + .../ldaptst/_system/var/tmp/selfsign.sh | 15 + .../ldaptst/_system/var/tmp/update_ldap.sh | 11 + .../ldaptst/_system/var/tmp/xcert.ldif | 4 + .../ldaptst/ldaptst/_system/var/tmp/xkey.ldif | 4 + .../instr_config/instructions.txt | 1 - .../labs/local-dns/config/keywords.txt | 3 + .../labs/local-dns/docs/DNS_Local.tex | 2 +- .../labs/local-dns/docs/Makefile | 1 + .../labs/local-dns/docs/local-dns.pdf | Bin 170243 -> 170657 bytes .../local-dns/instr_config/instructions.txt | 1 - .../labs/macs-hash/config/keywords.txt | 5 + .../labs/macs-hash/config/start.config | 11 +- .../labs/macs-hash/docs/macs-hash.pdf | Bin 100938 -> 90284 bytes .../macs-hash/instr_config/instructions.txt | 1 - .../labs/mariadbtst/config/about.txt | 1 + .../labs/mariadbtst/config/parameter.config | 1 + .../labs/mariadbtst/config/start.config | 20 + .../Dockerfile.mariadbtst.ldapserver.student | 63 + .../Dockerfile.mariadbtst.mariadbtst.student | 63 + .../Dockerfile.mariadbtst.ws.student | 74 + .../labs/mariadbtst/docs/read_first.txt | 5 + .../labs/mariadbtst/instr_config/goals.config | 1 + .../labs/mariadbtst/instr_config/pregrade.sh | 42 + .../mariadbtst/instr_config/results.config | 1 + .../mariadbtst/ldapserver/_bin/fixlocal.sh | 21 + .../ldapserver/_system/etc/login.defs | 341 + .../ldapserver/_system/etc/securetty | 7 + .../ldapserver/_system/var/tmp/adduser.sh | 3 + .../ldapserver/_system/var/tmp/base.ldif | 17 + .../ldapserver/_system/var/tmp/db.ldif | 14 + .../ldapserver/_system/var/tmp/enable-ssl.sh | 7 + .../ldapserver/_system/var/tmp/mike.ldif | 17 + .../ldapserver/_system/var/tmp/monitor.ldif | 4 + .../ldapserver/_system/var/tmp/projx.ldif | 4 + .../ldapserver/_system/var/tmp/selfsign.sh | 15 + .../ldapserver/_system/var/tmp/update_ldap.sh | 11 + .../ldapserver/_system/var/tmp/xcert.ldif | 4 + .../ldapserver/_system/var/tmp/xkey.ldif | 4 + .../mariadbtst/mariadbtst/_bin/fixlocal.sh | 22 + .../mariadbtst/_system/etc/login.defs | 341 + .../mariadbtst/_system/etc/pam.d/mysql | 3 + .../mariadbtst/_system/etc/securetty | 7 + .../labs/mariadbtst/mariadbtst/admin.sql | 4 + .../labs/mariadbtst/mariadbtst/configldap.sh | 6 + .../labs/mariadbtst/mariadbtst/docerts.sh | 9 + .../mariadbtst/mariadbtst/enable-ssl-ldap.sh | 7 + .../labs/mariadbtst/mariadbtst/netcnf.sh | 2 + .../labs/mariadbtst/mariadbtst/sslcnf.sh | 5 + .../labs/mariadbtst/mariadbtst/users.sql | 7 + .../labs/mariadbtst/ws/_bin/fixlocal.sh | 18 + .../labs/mariadbtst/ws/_system/etc/login.defs | 341 + .../labs/mariadbtst/ws/_system/etc/securetty | 7 + .../labs/mariadbtst/ws/docnf.sh | 4 + .../metasploit/attacker/_system/etc/rc.local | 2 - .../labs/metasploit/config/keywords.txt | 4 + .../labs/metasploit/config/start.config | 6 +- .../Dockerfile.metasploit.attacker.student | 4 +- .../labs/metasploit/docs/metasploit.docx | Bin 7905 -> 7906 bytes .../labs/metasploit/docs/metasploit.pdf | Bin 52907 -> 45790 bytes .../metasploit/instr_config/instructions.txt | 1 - .../metasploit/victim/_system/etc/rc.local | 2 +- .../labs/netflow/config/about.txt | 1 + .../labs/netflow/config/bigexternal.txt | 3 + .../labs/netflow/config/keywords.txt | 3 + .../labs/netflow/config/parameter.config | 5 + .../labs/netflow/config/start.config | 37 + .../Dockerfile.netflow.workstation.student | 75 + .../labs/netflow/docs/Makefile | 7 + .../labs/netflow/docs/header.tex | 122 + .../labs/netflow/docs/netflow.pdf | Bin 0 -> 117025 bytes .../labs/netflow/docs/netflow.tex | 122 + .../labs/netflow/docs/pic.png | Bin 0 -> 84798 bytes .../labs/netflow/docs/read_first.txt | 6 + .../labs/netflow/instr_config/goals.config | 5 + .../labs/netflow/instr_config/pregrade.sh | 42 + .../labs/netflow/instr_config/results.config | 4 + .../labs/netflow/workstation/_bin/fixlocal.sh | 19 + .../workstation/_system/etc/login.defs | 341 + .../netflow/workstation/_system/etc/securetty | 7 + .../labs/netflow/workstation/bashadd | 3 + .../labs/network-basics/box1/_bin/fixlocal.sh | 19 + .../network-basics/box1/_bin/treataslocal | 2 + .../box1/_system/etc/login.defs | 341 + .../network-basics/box1/_system/etc/rc.local | 2 + .../network-basics/box1/_system/etc/securetty | 7 + .../labs/network-basics/box2/_bin/fixlocal.sh | 18 + .../network-basics/box2/_bin/treataslocal | 1 + .../box2/_system/etc/login.defs | 341 + .../network-basics/box2/_system/etc/rc.local | 2 + .../network-basics/box2/_system/etc/securetty | 7 + .../labs/network-basics/config/about.txt | 1 + .../labs/network-basics/config/keywords.txt | 3 + .../network-basics/config/parameter.config | 1 + .../labs/network-basics/config/start.config | 15 + .../Dockerfile.network-basics.box1.student | 73 + .../Dockerfile.network-basics.box2.student | 73 + .../labs/network-basics/docs/Makefile | 7 + .../labs/network-basics/docs/header.tex | 122 + .../network-basics/docs/network-basics.pdf | Bin 0 -> 70842 bytes .../network-basics/docs/network-basics.tex | 175 + .../labs/network-basics/docs/read_first.txt | 6 + .../network-basics/instr_config/goals.config | 1 + .../network-basics/instr_config/pregrade.sh | 42 + .../instr_config/results.config | 5 + .../labs/nix-commands/config/keywords.txt | 2 + .../labs/nix-commands/docs/nix-commands.docx | Bin 295799 -> 296170 bytes .../labs/nix-commands/docs/nix-commands.pdf | Bin 453452 -> 179894 bytes .../instr_config/instructions.txt | 1 - .../labs/nmap-discovery/config/keywords.txt | 2 + .../labs/nmap-discovery/config/start.config | 1 - .../nmap-discovery/docs/nmapdiscovery.docx | Bin 7571 -> 7588 bytes .../nmap-discovery/docs/nmapdiscovery.pdf | Bin 45427 -> 40323 bytes .../mycomputer/instructions.txt | 47 - .../labs/nmap-ssh/config/keywords.txt | 3 + .../labs/nmap-ssh/docs/nmap-ssh.docx | Bin 7994 -> 7929 bytes .../labs/nmap-ssh/docs/nmap-ssh.pdf | Bin 43885 -> 38202 bytes .../labs/onewayhash/config/keywords.txt | 3 + .../labs/onewayhash/docs/onewayhash.pdf | Bin 72205 -> 72205 bytes .../labs/ossec/client1/_bin/fixlocal.sh | 19 + .../labs/ossec/client1/_system/etc/login.defs | 341 + .../labs/ossec/client1/_system/etc/securetty | 7 + .../labs/ossec/config/about.txt | 1 + .../labs/ossec/config/keywords.txt | 5 + .../labs/ossec/config/parameter.config | 1 + .../labs/ossec/config/start.config | 21 + .../Dockerfile.ossec.client1.student | 74 + .../Dockerfile.ossec.ossec.student | 75 + .../Dockerfile.ossec.web_server.student | 69 + .../labs/ossec/docs/Makefile | 7 + .../labs/ossec/docs/header.tex | 120 + .../labs/ossec/docs/ossec.odg | Bin 0 -> 9560 bytes .../labs/ossec/docs/ossec.pdf | Bin 0 -> 107128 bytes .../labs/ossec/docs/ossec.png | Bin 0 -> 19392 bytes .../labs/ossec/docs/ossec.tex | 362 + .../labs/ossec/docs/read_first.txt | 7 + .../labs/ossec/instr_config/goals.config | 1 + .../labs/ossec/instr_config/pregrade.sh | 42 + .../labs/ossec/instr_config/results.config | 5 + .../labs/ossec/ossec/_bin/fixlocal.sh | 19 + .../labs/ossec/ossec/_system/etc/login.defs | 341 + .../labs/ossec/ossec/_system/etc/securetty | 7 + .../labs/ossec/ossec/_system/root/.vimrc | 1 + .../labs/ossec/ossec/local_rules.xml | 12 + .../labs/ossec/web_server/MyHTTPServer.py | 26 + .../labs/ossec/web_server/_bin/fixlocal.sh | 16 + .../web_server/_system/etc/rc.d/rc.local | 5 + .../_system/var/www/html/index.html | 11 + .../web_server/_system/var/www/html/plan.html | 12 + .../labs/overrun/config/about.txt | 1 + .../labs/overrun/config/keywords.txt | 2 + .../labs/overrun/config/parameter.config | 1 + .../labs/overrun/config/start.config | 5 + .../Dockerfile.overrun.overrun.student | 73 + .../labs/overrun/docs/Makefile | 7 + .../labs/overrun/docs/header.tex | 120 + .../labs/overrun/docs/overrun.pdf | Bin 0 -> 66862 bytes .../labs/overrun/docs/overrun.tex | 147 + .../labs/overrun/docs/read_first.txt | 7 + .../labs/overrun/instr_config/goals.config | 2 + .../labs/overrun/instr_config/pregrade.sh | 42 + .../labs/overrun/instr_config/results.config | 5 + .../labs/overrun/overrun/_bin/fixlocal.sh | 18 + .../labs/overrun/overrun/_bin/treataslocal | 1 + .../overrun/overrun/_system/etc/login.defs | 341 + .../overrun/overrun/_system/etc/securetty | 7 + .../labs/overrun/overrun/mystuff.c | 62 + .../packet-introspection/config/about.txt | 1 + .../packet-introspection/config/keywords.txt | 3 + .../docs/packet-introspection.pdf | Bin 60978 -> 60990 bytes .../docs/packet-introspection.tex | 5 +- .../instr_config/instructions.txt | 1 - .../labs/parallel/config/about.txt | 1 + .../labs/parallel/config/parameter.config | 5 + .../labs/parallel/config/start.config | 37 + .../Dockerfile.parallel.parallel.student | 76 + .../labs/parallel/docs/parallel.pdf | Bin 0 -> 72213 bytes .../labs/parallel/docs/parallel.rtf | 236 + .../labs/parallel/docs/read_first.txt | 5 + .../labs/parallel/instr_config/goals.config | 5 + .../labs/parallel/instr_config/pregrade.sh | 42 + .../labs/parallel/instr_config/results.config | 4 + .../labs/parallel/parallel/_bin/fixlocal.sh | 18 + .../parallel/parallel/_system/etc/login.defs | 341 + .../parallel/parallel/_system/etc/securetty | 7 + .../labs/parallel/parallel/arraysum.c | 146 + .../labs/parallel/parallel/hello.c | 21 + .../labs/parallel/parallel/image.c | 259 + .../labs/parallel/parallel/lil_sun.ppm | 25084 ++++++++++++++++ .../labs/parallel/parallel/procid.c | 27 + .../labs/parallel/parallel/search.c | 129 + .../labs/pass-crack/config/keywords.txt | 3 + .../labs/pass-crack/docs/pass-crack.pdf | Bin 94738 -> 80267 bytes .../pass-crack/instr_config/instructions.txt | 1 - .../labs/pcap-lib/config/about.txt | 1 + .../labs/pcap-lib/config/bigexternal.txt | 1 + .../labs/pcap-lib/config/keywords.txt | 3 + .../labs/pcap-lib/config/parameter.config | 5 + .../labs/pcap-lib/config/start.config | 38 + .../Dockerfile.pcap-lib.workstation.student | 75 + .../labs/pcap-lib/docs/Makefile | 8 + .../labs/pcap-lib/docs/header.tex | 122 + .../labs/pcap-lib/docs/pcap-lib.pdf | Bin 0 -> 68578 bytes .../labs/pcap-lib/docs/pcap-lib.tex | 138 + .../labs/pcap-lib/docs/read_first.txt | 6 + .../labs/pcap-lib/instr_config/goals.config | 22 + .../labs/pcap-lib/instr_config/pregrade.sh | 42 + .../labs/pcap-lib/instr_config/results.config | 15 + .../pcap-lib/workstation/_bin/fixlocal.sh | 18 + .../labs/pcap-lib/workstation/_bin/notify | 1 + .../workstation/_system/etc/login.defs | 341 + .../workstation/_system/etc/securetty | 7 + .../labs/pcap-lib/workstation/dpktpcap.py | 17 + .../labs/pcap-lib/workstation/pcaplib.cpp | 61 + .../labs/pcap-lib/workstation/tutorial1.py | 17 + .../labs/pcapanalysis/config/about.txt | 2 +- .../labs/pcapanalysis/config/keywords.txt | 3 + .../labs/pcapanalysis/config/start.config | 1 - .../labs/pcapanalysis/docs/pcapanalysis.pdf | Bin 47742 -> 41797 bytes .../labs/plc-app/config/keywords.txt | 3 + .../labs/plc-app/docs/plc-app.pdf | Bin 106335 -> 106335 bytes .../labs/plc-app/docs/plc-app.tex | 2 +- .../plc-app/instr_config/instructions.txt | 1 - .../plc-forensics-adv/config/keywords.txt | 6 + .../plc-forensics-adv/docs/plc-forensics.pdf | Bin 291799 -> 229687 bytes .../labs/plc-forensics/config/keywords.txt | 5 + .../labs/plc-forensics/docs/plc-forensics.pdf | Bin 230699 -> 168689 bytes .../labs/plc-traffic/config/about.txt | 1 + .../labs/plc-traffic/config/bigexternal.txt | 1 + .../labs/plc-traffic/config/keywords.txt | 8 + .../labs/plc-traffic/config/parameter.config | 5 + .../labs/plc-traffic/config/start.config | 76 + .../labs/plc-traffic/config/version | 1 + .../Dockerfile.plc-traffic.hmi.student | 92 + .../Dockerfile.plc-traffic.netmon.student | 76 + .../Dockerfile.plc-traffic.plc.student} | 17 +- ...ockerfile.plc-traffic.slave-device.student | 74 + .../Dockerfile.plc-traffic.tap.student | 72 + .../docs/GRASSMARLIN_User_Guide.pdf | Bin 0 -> 2920318 bytes .../labs/plc-traffic/docs/Makefile | 7 + .../labs/plc-traffic/docs/header.tex | 120 + .../labs/plc-traffic/docs/openplcEditor.png | Bin 0 -> 125080 bytes .../labs/plc-traffic/docs/plc-traffic.odp | Bin 0 -> 17308 bytes .../labs/plc-traffic/docs/plc-traffic.pdf | Bin 0 -> 112925 bytes .../labs/plc-traffic/docs/plc-traffic.png | Bin 0 -> 68584 bytes .../labs/plc-traffic/docs/plc-traffic.tex | 181 + .../labs/plc-traffic/docs/read_first.txt | 10 + .../labs/plc-traffic/docs/softplc2.png | Bin 0 -> 54287 bytes .../labs/plc-traffic/hmi/_bin/fixlocal.sh | 18 + .../plc-traffic/hmi/_system/etc/login.defs | 341 + .../plc-traffic/hmi/_system/etc/securetty | 7 + .../labs/plc-traffic/hmi/hello.st | 21 + .../labs/plc-traffic/hmi/hello/beremiz.xml | 4 + .../plc-traffic/hmi/hello/build/Config0.c | 29 + .../plc-traffic/hmi/hello/build/Config0.h | 2 + .../plc-traffic/hmi/hello/build/Config0.o | Bin 0 -> 1760 bytes .../hmi/hello/build/Hello World.so | Bin 0 -> 48408 bytes .../hmi/hello/build/LOCATED_VARIABLES.h | 0 .../labs/plc-traffic/hmi/hello/build/POUS.c | 223 + .../labs/plc-traffic/hmi/hello/build/POUS.h | 118 + .../labs/plc-traffic/hmi/hello/build/Res0.c | 37 + .../labs/plc-traffic/hmi/hello/build/Res0.o | Bin 0 -> 7696 bytes .../plc-traffic/hmi/hello/build/VARIABLES.csv | 22 + .../plc-traffic/hmi/hello/build/beremiz.h | 30 + .../hmi/hello/build/generated_plc.st | 21 + .../hmi/hello/build/lastbuildPLC.md5 | 1 + .../labs/plc-traffic/hmi/hello/build/plc.st | 115 + .../hmi/hello/build/plc_debugger.c | 395 + .../hmi/hello/build/plc_debugger.o | Bin 0 -> 17248 bytes .../plc-traffic/hmi/hello/build/plc_main.c | 888 + .../plc-traffic/hmi/hello/build/plc_main.o | Bin 0 -> 21512 bytes .../labs/plc-traffic/hmi/hello/build/py_ext.c | 221 + .../labs/plc-traffic/hmi/hello/build/py_ext.o | Bin 0 -> 4328 bytes .../labs/plc-traffic/hmi/hello/plc.xml | 162 + .../plc-traffic/instr_config/goals.config | 6 + .../labs/plc-traffic/instr_config/pregrade.sh | 13 + .../plc-traffic/instr_config/results.config | 6 + .../labs/plc-traffic/netmon/_bin/fixlocal.sh | 18 + .../plc-traffic/netmon/_system/etc/login.defs | 341 + .../plc-traffic/netmon/_system/etc/securetty | 7 + .../labs/plc-traffic/plc/_bin/fixlocal.sh | 9 + .../plc/_system/var/tmp/mbconfig.cfg | 26 + .../plc/_system/var/tmp/openplc.db | Bin 0 -> 40960 bytes .../plc-traffic/slave-device/_bin/fixlocal.sh | 18 + .../slave-device/_system/etc/login.defs | 341 + .../slave-device/_system/etc/rc.local | 3 + .../slave-device/_system/etc/securetty | 7 + .../labs/plc-traffic/slave-device/server.py | 268 + .../labs/plc-traffic/tap/_bin/fixlocal.sh | 18 + .../plc-traffic/tap/_system/etc/login.defs | 341 + .../plc-traffic/tap/_system/etc/securetty | 7 + .../labs/plc/config/keywords.txt | 3 + .../Labtainers-master/labs/plc/docs/plc.pdf | Bin 166662 -> 160996 bytes .../labs/plc/instr_config/instructions.txt | 1 - .../labs/printf/config/about.txt | 1 + .../labs/printf/config/keywords.txt | 3 + .../labs/printf/config/parameter.config | 1 + .../labs/printf/config/start.config | 5 + .../Dockerfile.printf.printf.student | 73 + .../labs/printf/docs/Makefile | 7 + .../labs/printf/docs/header.tex | 120 + .../labs/printf/docs/printf.pdf | Bin 0 -> 63644 bytes .../labs/printf/docs/printf.tex | 219 + .../labs/printf/docs/read_first.txt | 7 + .../labs/printf/instr_config/goals.config | 1 + .../labs/printf/instr_config/pregrade.sh | 42 + .../labs/printf/instr_config/results.config | 1 + .../labs/printf/printf/_bin/fixlocal.sh | 18 + .../labs/printf/printf/_bin/treataslocal | 1 + .../labs/printf/printf/_system/etc/login.defs | 341 + .../labs/printf/printf/_system/etc/securetty | 7 + .../labs/printf/printf/mkit.sh | 1 + .../labs/printf/printf/printTest.c | 16 + .../labs/pubkey/config/keywords.txt | 4 + .../labs/pubkey/docs/pubkey.pdf | Bin 80081 -> 72437 bytes .../labs/quantum/config/keywords.txt | 3 + .../labs/quantum/docs/quantum.pdf | Bin 195187 -> 118655 bytes .../quantum/instr_config/instructions.txt | 1 - .../labs/radius/config/keywords.txt | 3 + .../labs/radius/controller1/_bin/fixlocal.sh | 5 +- .../labs/radius/controller2/_bin/fixlocal.sh | 4 +- .../controller2/{ => _bin}/student_startup.sh | 0 .../labs/radius/docs/Makefile | 1 + .../labs/radius/docs/header.tex | 1 + .../labs/radius/docs/radius.pdf | Bin 66058 -> 70515 bytes .../labs/radius/docs/radius.tex | 39 +- .../labs/radius/instr_config/goals.config | 6 +- .../labs/radius/instr_config/instructions.txt | 1 - .../labs/radius/instr_config/results.config | 2 + .../labs/radius/radius/_bin/prestop | 10 + .../radius/radius/_bin/student_startup.sh | 4 +- .../labs/remote-dns/config/keywords.txt | 3 + .../labs/remote-dns/docs/DNS_Remote.tex | 2 +- .../labs/remote-dns/docs/remote-dns.pdf | Bin 2054891 -> 2054891 bytes .../remote-dns/instr_config/instructions.txt | 1 - .../labs/retlibc/config/keywords.txt | 3 + .../labs/retlibc/docs/Return_to_libc.tex | 2 +- .../labs/retlibc/docs/retlibc.pdf | Bin 107800 -> 108611 bytes .../retlibc/instr_config/instructions.txt | 1 - .../labs/routing-basics/config/keywords.txt | 2 + .../routing-basics/config/parameter.config | 4 - .../labs/routing-basics/config/start.config | 124 +- .../Dockerfile.routing-basics.gateway.student | 2 +- .../Dockerfile.routing-basics.isp.student | 2 +- ...ockerfile.routing-basics.remote_gw.student | 60 + ...ockerfile.routing-basics.remote_ws.student | 60 + ...ckerfile.routing-basics.web_server.student | 64 + .../Dockerfile.routing-basics.ws1.student | 2 +- .../Dockerfile.routing-basics.ws2.student | 2 +- .../Dockerfile.routing-basics.ws3.student | 2 +- .../labs/routing-basics/docs/Makefile | 3 +- .../routing-basics/docs/routing-basics.jpg | Bin 27172 -> 36009 bytes .../routing-basics/docs/routing-basics.odg | Bin 14444 -> 17630 bytes .../routing-basics/docs/routing-basics.pdf | Bin 83043 -> 103708 bytes .../routing-basics/docs/routing-basics.tex | 172 +- .../routing-basics/gateway/_bin/treataslocal | 1 + .../gateway/_system/etc/rc.local | 25 +- .../gateway/_system/sbin/faux_init | 19 - .../routing-basics/instr_config/goals.config | 4 - .../instr_config/instructions.txt | 1 - .../instr_config/results.config | 12 +- .../labs/routing-basics/isp/_bin/fixlocal.sh | 5 - .../routing-basics/isp/_system/etc/rc.local | 5 + .../routing-basics/isp/_system/sbin/faux_init | 19 - .../routing-basics/remote_gw/_bin/fixlocal.sh | 9 + .../remote_gw/_system/etc/rc.local | 25 + .../routing-basics/remote_ws/_bin/fixlocal.sh | 9 + .../remote_ws/_bin/treataslocal | 1 + .../remote_ws/_system/etc/rc.local | 5 + .../routing-basics/web_server/MyHTTPServer.py | 26 + .../web_server/_bin/fixlocal.sh | 10 + .../_system/etc/init.d/httpserver.sh | 62 + .../web_server/_system/etc/rc.d/rc.local | 4 + .../_system/var/www/html/index.html | 10 + .../web_server/index.html | 0 .../web_server/link1.html | 0 .../web_server/link2.html | 0 .../labs/routing-basics/ws1/_bin/treataslocal | 2 + .../routing-basics/ws1/_system/sbin/faux_init | 19 - .../labs/routing-basics/ws2/_bin/treataslocal | 2 + .../routing-basics/ws2/_system/sbin/faux_init | 19 - .../labs/routing-basics/ws3/_bin/treataslocal | 2 + .../routing-basics/ws3/_system/sbin/faux_init | 19 - .../labs/routing-basics2/config/keywords.txt | 2 + .../labs/routing-basics2/docs/Makefile | 7 +- ...routing-basics.pdf => routing-basics2.pdf} | Bin 93787 -> 93709 bytes ...routing-basics.tex => routing-basics2.tex} | 2 +- .../gateway/_system/etc/rc.local | 6 +- .../instr_config/instructions.txt | 1 - .../remote_gw/_system/etc/rc.local | 4 +- .../labs/setuid-env/config/keywords.txt | 2 + .../docs/Environment_Variable_and_SetUID.tex | 2 +- .../labs/setuid-env/docs/setuid-env.pdf | Bin 87686 -> 87686 bytes .../labs/setuid-env/instr_config/goals.config | 15 +- .../setuid-env/instr_config/instructions.txt | 1 - .../setuid-env/instr_config/results.config | 15 +- .../setuid-env/setuid-env/_bin/ignorelocal | 1 - .../labs/setuid-env/setuid-env/execve.c | 2 + .../labs/setuid-env/setuid-env/ls.c | 11 + .../labs/setuid-env/setuid-env/printall.c | 1 + .../labs/setuid-env/setuid-env/printenv.c | 2 + .../labs/setuid-env/setuid-env/system.c | 1 + .../labs/shellbasics/config/about.txt | 1 - .../labs/shellbasics/config/parameter.config | 5 - .../shellbasics/config/student_manual.txt | 81 - .../shellbasics/instr_config/goals.config | 23 - .../shellbasics/instr_config/instructions.txt | 1 - .../shellbasics/instr_config/results.config | 20 - .../labs/shellbasics/shellbasics/RunMe.py | 5 - .../shellbasics/shellbasics/_bin/fixlocal.sh | 5 - .../shellbasics/shellbasics/_bin/treataslocal | 21 - .../shellbasics/_system/sbin/faux_init | 19 - .../shellbasics/shellbasics/instructions.txt | 84 - .../labs/snort/config/keywords.txt | 3 + .../labs/snort/docs/Makefile | 1 + .../labs/snort/docs/snort.pdf | Bin 103861 -> 104173 bytes .../labs/snort/docs/snort.tex | 4 +- .../labs/snort/instr_config/instructions.txt | 1 - .../labs/softplc/docs/softplc.pdf | Bin 1661500 -> 1072672 bytes .../softplc/instr_config/instructions.txt | 1 - .../labs/softplc2/config/keywords.txt | 5 + .../labs/softplc2/docs/Makefile | 3 +- .../labs/softplc2/docs/softplc2.pdf | Bin 205705 -> 204746 bytes .../labs/softplc2/docs/softplc2.tex | 6 +- .../softplc2/instr_config/instructions.txt | 1 - .../labs/sql-inject/config/keywords.txt | 2 + .../labs/sql-inject/docs/sql-inject.pdf | Bin 253922 -> 198557 bytes .../sql-inject/instr_config/instructions.txt | 1 - .../labs/ssh-agent/config/keywords.txt | 5 + .../labs/ssh-agent/docs/Makefile | 1 + .../labs/ssh-agent/docs/ssh-agent.pdf | Bin 64106 -> 64125 bytes .../labs/ssh-agent/docs/ssh-agent.tex | 2 +- .../labs/ssh-tunnel/base/_bin/fixlocal.sh | 18 + .../labs/ssh-tunnel/base/_bin/treataslocal | 5 + .../ssh-tunnel/base/_system/etc/login.defs | 341 + .../labs/ssh-tunnel/base/_system/etc/rc.local | 4 + .../ssh-tunnel/base/_system/etc/securetty | 7 + .../labs/ssh-tunnel/config/about.txt | 2 + .../labs/ssh-tunnel/config/keywords.txt | 1 + .../labs/ssh-tunnel/config/parameter.config | 1 + .../labs/ssh-tunnel/config/start.config | 80 + .../Dockerfile.ssh-tunnel.base.student | 73 + .../Dockerfile.ssh-tunnel.gw1.student | 73 + .../Dockerfile.ssh-tunnel.gw2.student | 73 + .../Dockerfile.ssh-tunnel.gw3.student | 73 + .../Dockerfile.ssh-tunnel.gw4.student | 73 + .../Dockerfile.ssh-tunnel.hosta.student | 73 + .../Dockerfile.ssh-tunnel.hostb.student | 73 + .../Dockerfile.ssh-tunnel.hostc.student | 76 + .../Dockerfile.ssh-tunnel.hostd.student | 73 + .../labs/ssh-tunnel/docs/Makefile | 10 + .../labs/ssh-tunnel/docs/about.txt | 1 + .../labs/ssh-tunnel/docs/header.tex | 202 + .../docs/network-eps-converted-to.pdf | Bin 0 -> 6321 bytes .../labs/ssh-tunnel/docs/network.eps | 196 + .../labs/ssh-tunnel/docs/network.fig | 71 + .../labs/ssh-tunnel/docs/network.fig.bak | 71 + .../labs/ssh-tunnel/docs/read_first.txt | 6 + .../labs/ssh-tunnel/docs/ssh-tunnel.pdf | Bin 0 -> 93952 bytes .../labs/ssh-tunnel/docs/ssh-tunnel.tex | 314 + .../labs/ssh-tunnel/gw1/_bin/fixlocal.sh | 18 + .../ssh-tunnel/gw1/_system/etc/login.defs | 341 + .../labs/ssh-tunnel/gw1/_system/etc/securetty | 7 + .../labs/ssh-tunnel/gw2/_bin/fixlocal.sh | 18 + .../ssh-tunnel/gw2/_system/etc/login.defs | 341 + .../labs/ssh-tunnel/gw2/_system/etc/securetty | 7 + .../labs/ssh-tunnel/gw3/_bin/fixlocal.sh | 18 + .../ssh-tunnel/gw3/_system/etc/login.defs | 341 + .../labs/ssh-tunnel/gw3/_system/etc/securetty | 7 + .../labs/ssh-tunnel/gw4/_bin/fixlocal.sh | 18 + .../ssh-tunnel/gw4/_system/etc/login.defs | 341 + .../labs/ssh-tunnel/gw4/_system/etc/securetty | 7 + .../labs/ssh-tunnel/hosta/_bin/fixlocal.sh | 18 + .../ssh-tunnel/hosta/_system/etc/login.defs | 341 + .../ssh-tunnel/hosta/_system/etc/rc.local | 5 + .../ssh-tunnel/hosta/_system/etc/securetty | 7 + .../labs/ssh-tunnel/hostb/_bin/fixlocal.sh | 18 + .../ssh-tunnel/hostb/_system/etc/login.defs | 341 + .../ssh-tunnel/hostb/_system/etc/rc.local | 5 + .../ssh-tunnel/hostb/_system/etc/securetty | 7 + .../labs/ssh-tunnel/hostc/_bin/fixlocal.sh | 18 + .../ssh-tunnel/hostc/_system/etc/login.defs | 341 + .../ssh-tunnel/hostc/_system/etc/rc.local | 5 + .../ssh-tunnel/hostc/_system/etc/securetty | 7 + .../labs/ssh-tunnel/hostd/_bin/fixlocal.sh | 18 + .../ssh-tunnel/hostd/_system/etc/login.defs | 341 + .../ssh-tunnel/hostd/_system/etc/rc.local | 3 + .../ssh-tunnel/hostd/_system/etc/securetty | 7 + .../labs/ssh-tunnel/hostd/copyfile.txt | 2 + .../labs/ssh-tunnel/instr_config/goals.config | 0 .../labs/ssh-tunnel/instr_config/pregrade.sh | 42 + .../ssh-tunnel/instr_config/results.config | 6 + .../labs/sshlab/config/keywords.txt | 3 + .../labs/sshlab/docs/sshlab.pdf | Bin 113345 -> 45579 bytes .../labs/ssl/config/keywords.txt | 4 + .../Labtainers-master/labs/ssl/docs/ssl.pdf | Bin 64346 -> 64358 bytes .../Labtainers-master/labs/ssl/docs/ssl.tex | 2 +- .../labs/ssl/instr_config/instructions.txt | 1 - .../labs/strace/config/about.txt | 1 + .../labs/strace/config/keywords.txt | 2 + .../labs/strace/config/parameter.config | 1 + .../labs/strace/config/start.config | 14 + .../Dockerfile.strace.the-client.student | 65 + .../Dockerfile.strace.the-server.student | 73 + .../labs/strace/docs/Makefile | 7 + .../labs/strace/docs/header.tex | 120 + .../labs/strace/docs/read_first.txt | 5 + .../labs/strace/docs/strace.pdf | Bin 0 -> 58723 bytes .../labs/strace/docs/strace.tex | 113 + .../labs/strace/instr_config/goals.config | 2 + .../labs/strace/instr_config/pregrade.sh | 42 + .../labs/strace/instr_config/results.config | 5 + .../labs/strace/the-client/_bin/fixlocal.sh | 19 + .../labs/strace/the-client/_bin/mkit.sh | 3 + .../strace/the-client/_system/etc/login.defs | 341 + .../strace/the-client/_system/etc/securetty | 7 + .../labs/strace/the-client/ghidra | 2 + .../labs/strace/the-client/ob.c | 82 + .../labs/strace/the-client/sendudp.py | 22 + .../labs/strace/the-server/_bin/fixlocal.sh | 19 + .../strace/the-server/_system/etc/login.defs | 341 + .../strace/the-server/_system/etc/rc.local | 2 + .../strace/the-server/_system/etc/securetty | 7 + .../the-server/_system/var/run/config.txt | 1 + .../labs/strace/the-server/mkit.sh | 2 + .../labs/strace/the-server/ob.c | 82 + .../labs/strace/the-server/observer | Bin 0 -> 13088 bytes .../labs/symkeylab/config/keywords.txt | 4 + .../labs/symkeylab/docs/symkey.docx | Bin 264948 -> 265974 bytes .../labs/symkeylab/docs/symkey.pdf | Bin 344387 -> 166369 bytes .../symkeylab/instr_config/instructions.txt | 1 - .../labs/sys-log/config/keywords.txt | 2 + .../labs/sys-log/docs/sys-log.pdf | Bin 101429 -> 90787 bytes .../labs/tcpip/config/keywords.txt | 3 + .../labs/tcpip/config/parameter.config | 4 - .../labs/tcpip/config/start.config | 152 +- .../Dockerfile.tcpip.router.student | 73 + .../Dockerfile.tcpip.server.student | 2 +- .../labs/tcpip/docs/tcpip.docx | Bin 424912 -> 262739 bytes .../labs/tcpip/docs/tcpip.pdf | Bin 400982 -> 273875 bytes .../labs/tcpip/instr_config/goals.config | 6 +- .../labs/tcpip/instr_config/instructions.txt | 1 - .../labs/tcpip/instr_config/results.config | 2 +- .../labs/tcpip/router/_bin/fixlocal.sh | 18 + .../labs/tcpip/router/_system/etc/login.defs | 341 + .../labs/tcpip/router/_system/etc/rc.local | 10 + .../labs/tcpip/router/_system/etc/securetty | 7 + .../labs/tcpip/server/_bin/fixlocal.sh | 4 + .../labs/tcpip/server/_bin/treataslocal | 1 + .../labs/tcpip/server/_system/etc/rc.local | 2 + .../labs/tcpip/server/_system/sbin/faux_init | 19 - .../labs/telnetlab/config/keywords.txt | 4 + .../labs/telnetlab/docs/telnet.docx | Bin 15943 -> 11469 bytes .../labs/telnetlab/docs/telnet.pdf | Bin 110951 -> 42956 bytes .../labs/users/config/about.txt | 1 + .../labs/users/config/keywords.txt | 5 + .../labs/users/config/parameter.config | 1 + .../labs/users/config/start.config | 7 + .../Dockerfile.users.shared.student | 65 + .../labs/users/docs/Makefile | 7 + .../labs/users/docs/header.tex | 120 + .../labs/users/docs/read_first.txt | 5 + .../labs/users/docs/users.pdf | Bin 0 -> 69074 bytes .../labs/users/docs/users.tex | 164 + .../labs/users/instr_config/goals.config | 1 + .../labs/users/instr_config/pregrade.sh | 42 + .../labs/users/instr_config/results.config | 8 + .../labs/users/shared/_bin/fixlocal.sh | 22 + .../labs/users/shared/_bin/student_startup.sh | 14 + .../labs/users/shared/_system/etc/login.defs | 341 + .../labs/users/shared/_system/etc/securetty | 7 + .../shared/_system/shared_stuff/beefstew.txt | 12 + .../shared/_system/shared_stuff/tarts.txt | 8 + .../users/shared/_system/usr/bin/eggcheck | 22 + .../labs/vpnlab/client/instructions.txt | 76 - .../labs/vpnlab/config/keywords.txt | 3 + .../labs/vpnlab/config/start.config | 1 - .../labs/vpnlab/docs/Makefile | 7 + .../labs/vpnlab/docs/header.tex | 120 + .../labs/vpnlab/docs/read_first.txt | 7 + .../labs/vpnlab/docs/vpnlab.pdf | Bin 0 -> 50491 bytes .../labs/vpnlab/docs/vpnlab.tex | 90 + .../labs/vpnlab2/client/instructions.txt | 82 - .../labs/vpnlab2/config/keywords.txt | 4 + .../labs/vpnlab2/config/start.config | 1 - .../labs/vpnlab2/docs/Makefile | 7 + .../labs/vpnlab2/docs/header.tex | 120 + .../labs/vpnlab2/docs/read_first.txt | 7 + .../labs/vpnlab2/docs/vpnlab2.pdf | Bin 0 -> 59142 bytes .../labs/vpnlab2/docs/vpnlab2.tex | 104 + .../docs/.~lock.webtrack-report.docx# | 1 - .../labs/webtrack/docs/Makefile | 3 +- .../docs/Web_Environment_PartI_Elgg.tex | 3 +- .../labs/webtrack/docs/Web_Tracking_Elgg.tex | 47 +- .../labs/webtrack/docs/webtrack.pdf | Bin 245290 -> 245609 bytes .../labs/webtrack/instr_config/goals.config | 2 - .../webtrack/instr_config/instructions.txt | 1 - .../labs/webtrack/instr_config/results.config | 3 +- .../labs/wireshark-intro/README | 23 - .../wireshark-intro/config/parameter.config | 4 +- .../labs/wireshark-intro/config/start.config | 1 - ...le.wireshark-intro.wireshark-intro.student | 2 +- .../labs/wireshark-intro/docs/Makefile | 7 + .../labs/wireshark-intro/docs/header.tex | 120 + .../labs/wireshark-intro/docs/read_first.txt | 5 + .../wireshark-intro/docs/wireshark-intro.pdf | Bin 0 -> 118589 bytes .../wireshark-intro/docs/wireshark-intro.tex | 95 + .../wireshark-intro/instr_config/goals.config | 5 +- .../instr_config/results.config | 4 +- .../wireshark-intro/_bin/fixlocal.sh | 5 +- .../wireshark-intro/_system/sbin/faux_init | 21 - .../wireshark-intro/instructions.txt | 60 - .../lib/systemd/system/httpserver.service | 1 + .../labs/xforge/config/keywords.txt | 4 + .../labs/xforge/docs/Makefile | 1 + .../docs/Web_Environment_PartI_Elgg.tex | 2 +- .../labs/xforge/docs/xforge.pdf | Bin 111346 -> 111346 bytes .../labs/xforge/instr_config/goals.config | 4 +- .../labs/xforge/instr_config/instructions.txt | 1 - .../labs/xforge/instr_config/results.config | 8 +- .../labs/xsite/config/keywords.txt | 3 + .../labs/xsite/docs/Makefile | 1 + .../xsite/docs/Web_Environment_PartI_Elgg.tex | 2 +- .../labs/xsite/docs/xsite.pdf | Bin 97557 -> 97646 bytes .../labs/xsite/instr_config/instructions.txt | 1 - .../Dockerfile.labtainer.base2 | 52 + .../Dockerfile.labtainer.base3 | 58 + .../Dockerfile.labtainer.bird | 17 + .../Dockerfile.labtainer.centos.xtra | 4 +- .../Dockerfile.labtainer.centos6.xtra | 4 + .../Dockerfile.labtainer.firefox3 | 18 + .../Dockerfile.labtainer.ghidra | 14 + .../Dockerfile.labtainer.grader | 10 + .../Dockerfile.labtainer.juiceshop | 12 + .../Dockerfile.labtainer.ldap | 11 + .../Dockerfile.labtainer.ldap-client | 11 + .../Dockerfile.labtainer.mariadb | 22 + .../Dockerfile.labtainer.mariadb-client | 12 + .../Dockerfile.labtainer.mysql | 8 + .../Dockerfile.labtainer.netmon | 8 + .../Dockerfile.labtainer.network.ssh | 6 + .../Dockerfile.labtainer.network.ssh2 | 6 + .../Dockerfile.labtainer.network2 | 26 + .../Dockerfile.labtainer.network3 | 26 + .../Dockerfile.labtainer.owasp | 16 + .../base_dockerfiles/Dockerfile.labtainer.tap | 8 + .../Dockerfile.labtainer.wine | 1 + .../Dockerfile.labtainer.wireshark | 2 + .../Dockerfile.labtainer.wireshark2 | 9 + .../scripts/designer/bin/cleanlab4svn.py | 44 +- .../scripts/designer/bin/create-imodules.sh | 87 + .../scripts/designer/bin/create_all.sh | 25 - .../scripts/designer/bin/create_base_image.sh | 24 - .../scripts/designer/bin/create_bird_image.sh | 73 + .../designer/bin/create_centos_image.sh | 14 - .../designer/bin/create_firefox_image.sh | 28 - .../designer/bin/create_ghidra_image.sh | 72 + .../designer/bin/create_headless_tester.sh | 31 + .../scripts/designer/bin/create_image.sh | 41 +- .../scripts/designer/bin/create_java_image.sh | 28 - .../scripts/designer/bin/create_kali_image.sh | 20 + .../designer/bin/create_lamp_images.sh | 28 - .../designer/bin/create_master_base.sh | 28 + .../designer/bin/create_master_headless.sh | 55 + .../designer/bin/create_master_image.sh | 9 +- .../bin/create_metasploitable_image.sh | 20 + .../designer/bin/create_network_image.sh | 28 - .../designer/bin/create_wireshark_image.sh | 29 - .../scripts/designer/bin/exempt.txt | 19 + .../scripts/designer/bin/hash-goals.py | 67 + .../scripts/designer/bin/labedit | 32 + .../scripts/designer/bin/mkbases.py | 134 + .../scripts/designer/bin/new_lab_setup.py | 173 +- .../scripts/designer/bin/publish_image.sh | 44 +- .../scripts/designer/bin/rmbase.py | 26 + .../scripts/designer/bin/set_reg.sh | 14 +- .../scripts/designer/bin/svn_rm.py | 23 - .../etc/systemd/system/httpserver.service | 12 + .../services/_system/usr/bin/MyHTTPServer.py | 25 + .../services/_system/var/www/html/index.html | 7 + .../scripts/designer/services/web-server.tar | Bin 0 -> 10240 bytes .../templates/config/start.config.template | 13 +- .../Dockerfile.template.base.student | 7 +- .../Dockerfile.template.base2.student | 73 + .../Dockerfile.template.base3.student | 74 + .../Dockerfile.template.centos.student | 1 - .../Dockerfile.template.centos6.student | 49 + .../Dockerfile.template.kali.student | 8 +- .../designer/templates/docs/read_first.txt | 5 + .../templates/instr_config/instructions.txt | 1 - .../designer/{ => workspace}/system/README | 0 .../{ => workspace}/system/bin/apt-source.sh | 0 .../designer/workspace/system/bin/firefox | 111 + .../{ => workspace}/system/bin/funbuffer | 0 .../{ => workspace}/system/bin/funbuffer-8.5 | 0 .../designer/workspace/system/bin/labdump.sh | 13 + .../workspace/system/bin/labdump_client.py | 90 + .../workspace/system/bin/labdump_server.py | 53 + .../designer/{ => workspace}/system/bin/login | Bin .../system/bin/set_default_gw.sh | 0 .../designer/workspace/system/bin/sharktap | 9 + .../workspace/system/bin/start_labdump.sh | 29 + .../{ => workspace}/system/bin/togglegw.sh | 0 .../{ => workspace}/system/bin/wait_param.sh | 0 .../{ => workspace}/system/bin/yum-source.sh | 0 .../{ => workspace}/system/etc/nps.repo | 0 .../system/etc/nps.sources.list | 0 .../{ => workspace}/system/etc/rc.local | 0 .../designer/workspace/system/etc/services | 612 + .../{ => workspace}/system/etc/sudoers | 0 .../system/etc/systemd/system/bird.service | 11 + .../system/etc/systemd/system/httpd.service | 0 .../system/etc/systemd/system/labdump.service | 8 + .../etc/systemd/system/labdump_client.service | 8 + .../etc/systemd/system/mynotify.service | 0 .../workspace/system/etc/xinetd.d/ssh | 12 + .../workspace/system/etc/xinetd.d/telnet | 10 + .../system/lib/systemd/system/labdump.service | 12 + .../lib/systemd/system/labdump_client.service | 12 + .../lib/systemd/system/waitparam.service | 0 .../lib/systemd/system/waitparam.service.cfs | 0 .../{ => workspace}/system/sbin/mynotify.py | 0 .../{ => workspace}/system/sbin/waitparam.sh | 0 .../system/usr/share/man/man1.tar | Bin .../workspace/system/var/tmp/home.tar | Bin 0 -> 1692466 bytes .../scripts/gns3/labtainersGNS3.py | 168 +- .../scripts/gns3/rmContainer.py | 34 + .../assess_bin/GenReport.py | 108 +- .../assess_bin/GoalsParser.py | 100 +- .../labtainer-instructor/assess_bin/Grader.py | 215 +- .../assess_bin/InstructorLogging.py | 24 +- .../labtainer-instructor/assess_bin/MyUtil.py | 24 +- .../assess_bin/ResultParser.py | 409 +- .../assess_bin/UniqueCheck.py | 33 +- .../assess_bin/docgoals.py | 26 +- .../assess_bin/docwork.py | 98 + .../assess_bin/evalBoolean.py | 29 +- .../assess_bin/instructor.py | 93 +- .../bin/buildInstructorImage.sh | 2 +- .../labtainer-instructor/bin/checklab.py | 24 +- .../labtainer-instructor/bin/configtest.py | 26 +- .../scripts/labtainer-instructor/bin/gradelab | 270 +- .../bin/instructor.build.sh | 20 - .../scripts/labtainer-instructor/bin/makepack | 308 + .../labtainer-instructor/bin/makepackui | 35 + .../labtainer-instructor/bin/regresstest.py | 24 +- .../scripts/labtainer-instructor/bin/saki.py | 144 +- .../scripts/labtainer-instructor/bin/stop.py | 24 +- .../labtainer-instructor/bin/stopgrade | 3 +- .../labtainer-instructor/bin/sum_saki.py | 2 +- .../labtainer-instructor/bin/update-gradelab | 11 +- .../labtainer-instructor/bin/validate.py | 33 +- .../labtainer-instructor/bin/watermarktest.py | 24 +- .../labtainer-instructor/flask/README.txt | 8 + .../labtainer-instructor/flask/server.py | 952 + .../flask/static/favicon.ico | Bin 0 -> 15406 bytes .../flask/static/labtainer5-sm.png | Bin 0 -> 67186 bytes .../flask/static/main.css | 21 + .../flask/templates/error.html | 11 + .../flask/templates/files.html | 31 + .../flask/templates/goal.html | 42 + .../flask/templates/goal_count_greater.html | 27 + .../flask/templates/goal_during.html | 35 + .../flask/templates/goals_config.html | 15 + .../flask/templates/goals_json.html | 12 + .../flask/templates/grades.html | 13 + .../flask/templates/history.html | 12 + .../flask/templates/home.html | 45 + .../flask/templates/raw.html | 17 + .../flask/templates/result.html | 23 + .../flask/templates/result_table.html | 18 + .../flask/templates/student.html | 33 + .../flask/templates/ts.html | 14 + .../scripts/labtainer-student/README | 5 +- .../labtainer-student/bin/BigExternal.py | 65 +- .../scripts/labtainer-student/bin/BigFiles.py | 31 +- .../labtainer-student/bin/CheckTars.py | 56 +- .../labtainer-student/bin/CurrentLab.py | 29 + .../labtainer-student/bin/InspectLocalReg.py | 59 +- .../labtainer-student/bin/InspectRemoteReg.py | 189 +- .../scripts/labtainer-student/bin/LabCount.py | 29 + .../labtainer-student/bin/LabtainerLogging.py | 56 +- .../labtainer-student/bin/LocalBase.py | 94 + .../bin/ParseLabtainerConfig.py | 27 +- .../labtainer-student/bin/ParseStartConfig.py | 108 +- .../labtainer-student/bin/RemoteBase.py | 143 + .../labtainer-student/bin/VersionInfo.py | 39 +- .../labtainer-student/bin/buildImage.sh | 62 +- .../labtainer-student/bin/check_nets.py | 95 +- .../scripts/labtainer-student/bin/checkwork | 83 +- .../labtainer-student/bin/dockerPull.py | 84 + .../scripts/labtainer-student/bin/imodule | 132 + .../scripts/labtainer-student/bin/keywords.py | 84 + .../scripts/labtainer-student/bin/labList.py | 127 + .../scripts/labtainer-student/bin/labpack | 202 + .../scripts/labtainer-student/bin/labtainer | 34 +- .../scripts/labtainer-student/bin/labutils.py | 1697 +- .../scripts/labtainer-student/bin/moreterm.py | 35 +- .../scripts/labtainer-student/bin/quiz | 198 + .../labtainer-student/bin/ratelimit.sh | 14 + .../scripts/labtainer-student/bin/rebuild | 36 + .../scripts/labtainer-student/bin/rebuild.py | 737 +- .../scripts/labtainer-student/bin/redo.py | 24 +- .../scripts/labtainer-student/bin/registry.py | 102 + .../labtainer-student/bin/removelab.py | 43 +- .../scripts/labtainer-student/bin/start.py | 176 +- .../scripts/labtainer-student/bin/stop.py | 75 +- .../scripts/labtainer-student/bin/transfer.py | 25 +- .../lab_bin/ParameterParser.py | 71 +- .../lab_bin/ParameterizeLogging.py | 22 +- .../labtainer-student/lab_bin/Student.py | 84 +- .../lab_bin/bash-pre-capinout.sh | 61 +- .../labtainer-student/lab_bin/dochown.sh | 15 + .../labtainer-student/lab_bin/hookBash.sh | 27 +- .../labtainer-student/lab_bin/parameterize.sh | 51 +- .../labtainer-student/lab_bin/profile-add | 1 - .../labtainer-student/lab_bin/profile-display | 8 + .../labtainer-student/lab_bin/save.student.sh | 22 +- .../labtainer-student/lab_bin/startup.sh | 22 +- .../lab_sys/bin/set_default_gw.sh | 20 + .../systemd/system/mynotify.service | 3 +- .../lab_sys/usr/sbin/capinout | Bin 0 -> 2040632 bytes .../lab_sys/{ => usr}/sbin/capinout.sh | 0 .../lab_sys/{ => usr}/sbin/dhclient-labtainer | 0 .../lab_sys/{ => usr}/sbin/exec_wrap.sh | 5 + .../lab_sys/{ => usr}/sbin/mynotify.py | 52 +- .../scripts/remote/remote.py | 189 + .../setup_scripts/after-checkout.sh | 30 + .../setup_scripts/build-docs.sh | 32 + .../setup_scripts/cleanupDocker.sh | 21 + .../setup_scripts/destroy-docker.sh | 30 + .../setup_scripts/dev-pkg.sh | 8 + .../setup_scripts/dns-add.py | 7 +- .../setup_scripts/fix-bashrc.sh | 30 + .../setup_scripts/fixresolv.sh | 18 +- .../setup_scripts/full-smoke-test.sh | 80 +- .../setup_scripts/getinfo.py | 29 +- .../setup_scripts/gnome-terminal.desktop | 10 + .../setup_scripts/install-docker-arch.sh | 101 + .../setup_scripts/install-docker-centos.sh | 27 +- .../setup_scripts/install-docker-debian.sh | 27 +- .../setup_scripts/install-docker-fedora.sh | 30 +- .../setup_scripts/install-docker-ubuntu.sh | 97 +- .../setup_scripts/install-labtainer.sh | 58 +- .../setup_scripts/lab-completion.bash | 30 + .../setup_scripts/mkreg-tunnel.sh | 2 + .../setup_scripts/prep-testregistry.sh | 30 + .../setup_scripts/pull-all.py | 24 +- .../setup_scripts/pull-all.sh | 2 +- .../setup_scripts/pull_lab.py | 80 + .../setup_scripts/removealllabs.sh | 30 + .../setup_scripts/smoke-profile-add.sh | 13 + .../setup_scripts/testreg-add.py | 4 +- .../setup_scripts/update-add-new.sh | 9 + .../setup_scripts/update-add.sh | 56 + .../setup_scripts/update-designer.sh | 75 +- .../setup_scripts/update-labtainer.sh | 60 +- .../setup_scripts/update-testsets.sh | 36 +- .../setup_scripts/update-ubuntu.sh | 35 + .../setup_scripts/vbox-share.sh | 3 + .../setup_scripts/vm-profile-add.sh | 81 +- .../Labtainers-master/testsets/bin/SimLab.py | 158 +- .../testsets/bin/build_lab_test.sh | 37 + .../Labtainers-master/testsets/bin/getLog.sh | 34 + .../testsets/bin/jenkinsPipeline.txt | 33 + .../testsets/bin/skip_test.txt | 4 + .../testsets/bin/smoketest.py | 101 +- .../Labtainers-master/testsets/bin/stopall.sh | 3 + .../testsets/bin/test-ubuntu16.sh | 31 + .../testsets/bin/test-ubuntu18.sh | 31 + .../testsets/bin/test-ubuntu24.sh | 31 + .../Labtainers-master/testsets/bin/testVMs.sh | 20 + .../testsets/bin/testvm-do.sh | 26 + .../testsets/bin/vbox-client.py | 24 + .../Labtainers-master/testsets/bin/waitLog.py | 31 + .../tool-src/capinout/capinout | Bin 0 -> 2040632 bytes .../tool-src/capinout/capinout.odg | Bin 10081 -> 18500 bytes .../tool-src/capinout/mkit.sh | 2 +- .../tool-src/capinout/mypty2.cpp | 749 +- .../modified-install-docker-debian.sh | 42 +- .../utilities/unix/labtainers/labtainers.pp | 2 + .../unix/labtainers/manifests/config.pp | 81 +- .../unix/labtainers/manifests/install.pp | 126 +- .../unix/labtainers/secgen_metadata.xml | 4 + .../templates/auto_start_lab.desktop.erb | 8 +- outputlog | 9779 ++++++ .../labs/labtainers/acl-hackerbot-flags.xml | 2 +- scenarios/labs/labtainers/acl.xml | 2 +- scenarios/labs/labtainers/arp-spoof.xml | 2 +- scenarios/labs/labtainers/backups.xml | 2 +- scenarios/labs/labtainers/backups2.xml | 2 +- scenarios/labs/labtainers/capabilities.xml | 2 +- scenarios/labs/labtainers/centos-log.xml | 2 +- scenarios/labs/labtainers/centos-log2.xml | 2 +- scenarios/labs/labtainers/cyberciege.xml | 2 +- scenarios/labs/labtainers/denyhost.xml | 2 +- scenarios/labs/labtainers/dhcp-test.xml | 2 +- scenarios/labs/labtainers/dmz-example.xml | 2 +- scenarios/labs/labtainers/dmz-lab.xml | 2 +- scenarios/labs/labtainers/file-deletion.xml | 2 +- scenarios/labs/labtainers/file-integrity.xml | 2 +- scenarios/labs/labtainers/formatstring.xml | 2 +- scenarios/labs/labtainers/gdblesson.xml | 2 +- scenarios/labs/labtainers/grassmarlin.xml | 2 +- scenarios/labs/labtainers/grfics.xml | 2 +- scenarios/labs/labtainers/httplab.xml | 2 +- scenarios/labs/labtainers/ida.xml | 2 +- scenarios/labs/labtainers/iptables-ics.xml | 2 +- scenarios/labs/labtainers/iptables.xml | 2 +- scenarios/labs/labtainers/iptables2.xml | 2 +- scenarios/labs/labtainers/kali-test.xml | 2 +- scenarios/labs/labtainers/ldap.xml | 2 +- scenarios/labs/labtainers/liveforensics.xml | 2 +- scenarios/labs/labtainers/local-dns.xml | 2 +- scenarios/labs/labtainers/macs-hash.xml | 2 +- scenarios/labs/labtainers/metasploit.xml | 2 +- scenarios/labs/labtainers/nix-commands.xml | 2 +- scenarios/labs/labtainers/nmap-discovery.xml | 2 +- scenarios/labs/labtainers/nmap-ssh.xml | 2 +- scenarios/labs/labtainers/onewayhash.xml | 2 +- .../labs/labtainers/packet-introspection.xml | 2 +- scenarios/labs/labtainers/pass-crack.xml | 2 +- scenarios/labs/labtainers/pcapanalysis.xml | 2 +- scenarios/labs/labtainers/plc-app.xml | 2 +- .../labs/labtainers/plc-forensics-adv.xml | 2 +- scenarios/labs/labtainers/plc-forensics.xml | 2 +- scenarios/labs/labtainers/plc.xml | 2 +- scenarios/labs/labtainers/pubkey.xml | 2 +- scenarios/labs/labtainers/quantum.xml | 2 +- scenarios/labs/labtainers/radius.xml | 2 +- scenarios/labs/labtainers/remote-dns.xml | 2 +- scenarios/labs/labtainers/retlibc.xml | 2 +- scenarios/labs/labtainers/routing-basics.xml | 2 +- scenarios/labs/labtainers/routing-basics2.xml | 2 +- scenarios/labs/labtainers/setuid-env.xml | 2 +- scenarios/labs/labtainers/shellbasics.xml | 2 +- scenarios/labs/labtainers/snort.xml | 2 +- scenarios/labs/labtainers/softplc.xml | 2 +- scenarios/labs/labtainers/softplc2.xml | 2 +- scenarios/labs/labtainers/sql-inject.xml | 2 +- scenarios/labs/labtainers/ssh-agent.xml | 2 +- scenarios/labs/labtainers/sshlab.xml | 2 +- scenarios/labs/labtainers/ssl.xml | 2 +- scenarios/labs/labtainers/symkeylab.xml | 2 +- scenarios/labs/labtainers/sys-log.xml | 2 +- scenarios/labs/labtainers/tcpip.xml | 2 +- scenarios/labs/labtainers/telnetlab.xml | 2 +- scenarios/labs/labtainers/vpnlab.xml | 2 +- scenarios/labs/labtainers/vpnlab2.xml | 2 +- scenarios/labs/labtainers/webtrack.xml | 2 +- scenarios/labs/labtainers/wireshark-intro.xml | 2 +- scenarios/labs/labtainers/xforge.xml | 2 +- scenarios/labs/labtainers/xsite.xml | 2 +- 2154 files changed, 133053 insertions(+), 15153 deletions(-) create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/MakepackUI/README.txt create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/MakepackUI/bin/buildUI2.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/MakepackUI/bin/json-simple-1.1.1.jar create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/MakepackUI/bin/makepackui.mf create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/MakepackUI/pom.xml create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/MakepackUI/src/main/java/newpackage/NewJFrame.form create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/MakepackUI/src/main/java/newpackage/NewJFrame.java create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/MakepackUI/src/main/resources/labtainer5-sm.png create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/MakepackUI/src/main/resources/saveButton.png delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/build.xml delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/manifest.mf delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/nbproject/build-impl.xml delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/nbproject/genfiles.properties delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/nbproject/private/private.properties delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/nbproject/project.properties delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/nbproject/project.xml delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/src/GoalsUI/GoalsUI.java create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/.classpath create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/.project create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/.settings/org.eclipse.core.resources.prefs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/.settings/org.eclipse.jdt.apt.core.prefs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/.settings/org.eclipse.jdt.core.prefs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/.settings/org.eclipse.m2e.core.prefs create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/addContainer.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/buildMainUI.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/buildMainUI.xml create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/callNewLab.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/cloneLab.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/editDockerfile.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/images/labtainer5-sm.png create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/lib/unknown/binary/AbsoluteLayout/SNAPSHOT/AbsoluteLayout-SNAPSHOT.jar create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/nb-configuration.xml create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/pom.xml create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/removeContainer.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/renameContainer.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/goalsui/DocPanel.form create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/goalsui/DocPanel.java rename modules/utilities/unix/labtainers/files/Labtainers-master/UI/{Goals/src/GoalsUI => MainUI/src/main/java/labtainers/goalsui}/GoalPanels.form (76%) rename modules/utilities/unix/labtainers/files/Labtainers-master/UI/{Goals/src/GoalsUI => MainUI/src/main/java/labtainers/goalsui}/GoalPanels.java (75%) rename modules/utilities/unix/labtainers/files/Labtainers-master/UI/{Goals/src/GoalsUI => MainUI/src/main/java/labtainers/goalsui}/GoalValues.java (60%) rename modules/utilities/unix/labtainers/files/Labtainers-master/UI/{Goals/src/GoalsUI => MainUI/src/main/java/labtainers/goalsui}/GoalsData.java (75%) rename modules/utilities/unix/labtainers/files/Labtainers-master/UI/{Goals/src/GoalsUI => MainUI/src/main/java/labtainers/goalsui}/GoalsUI.form (52%) create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/goalsui/GoalsUI.java rename modules/utilities/unix/labtainers/files/Labtainers-master/UI/{Goals/src/GoalsUI => MainUI/src/main/java/labtainers/goalsui}/ParamReferenceStorage.java (77%) create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/CompareTextFiles.java create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/ContainerConfigAddHosts.form create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/ContainerConfigAddHosts.java create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/ContainerConfigNetworksSubpanel.form create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/ContainerConfigNetworksSubpanel.java create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/ContainerObjPanel.form create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/ContainerObjPanel.java create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/LabData.java create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/LabPanel.form create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/LabPanel.java create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/MainWindow.form create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/MainWindow.java create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/NetworkObjPanel.form create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/NetworkObjPanel.java create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/PreferencesPanel.form create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/PreferencesPanel.java create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/Status.java rename modules/utilities/unix/labtainers/files/Labtainers-master/UI/{Goals/src/GoalsUI => MainUI/src/main/java/labtainers/mainui}/ToolTipHandlers.java (52%) create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/paramsui/ContainerFileDialog.form create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/paramsui/ContainerFileDialog.java create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/paramsui/ContainerFileTable.java create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/paramsui/ParamPanels.form create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/paramsui/ParamPanels.java create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/paramsui/ParamValues.java create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/paramsui/ParamsData.java create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/paramsui/ParamsUI.form create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/paramsui/ParamsUI.java rename modules/utilities/unix/labtainers/files/Labtainers-master/UI/{Results/src/ResultsUI => MainUI/src/main/java/labtainers/resultsui}/ArtifactPanels.form (65%) rename modules/utilities/unix/labtainers/files/Labtainers-master/UI/{Results/src/ResultsUI => MainUI/src/main/java/labtainers/resultsui}/ArtifactPanels.java (55%) rename modules/utilities/unix/labtainers/files/Labtainers-master/UI/{Results/src/ResultsUI => MainUI/src/main/java/labtainers/resultsui}/ArtifactValues.java (74%) rename modules/utilities/unix/labtainers/files/Labtainers-master/UI/{Results/src/ResultsUI => MainUI/src/main/java/labtainers/resultsui}/ParamReferenceStorage.java (67%) rename modules/utilities/unix/labtainers/files/Labtainers-master/UI/{Results/src/ResultsUI => MainUI/src/main/java/labtainers/resultsui}/ResultsData.java (72%) rename modules/utilities/unix/labtainers/files/Labtainers-master/UI/{Results/src/ResultsUI => MainUI/src/main/java/labtainers/resultsui}/ResultsUI.form (58%) create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/resultsui/ResultsUI.java create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/resources/UI.ini create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/resources/base.list create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/resources/labtainer5-sm.png create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/staging/dist/labtainers.mainui.jar create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/staging/dist/mainui.jar create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/test.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/README.txt delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/Results/build.xml delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/Results/manifest.mf delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/Results/nbproject/build-impl.xml delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/Results/nbproject/genfiles.properties delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/Results/nbproject/private/private.properties delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/Results/nbproject/project.properties delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/Results/nbproject/project.xml delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/Results/src/ResultsUI/ResultsUI.java delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/Results/src/ResultsUI/ToolTipHandlers.java create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/UI/bin/buildUI2.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/bin/mainUI.ini.backup create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/UI/bin/mainUI.mf create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/azure/README-DEV.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/azure/README.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/azure/account_env.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/azure/base_create_vm.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/azure/checktunnel.ps1 create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/azure/checktunnel.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/azure/cloud_init.template create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/azure/cloud_init.txt create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/azure/copy_to_blob.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/azure/create_disk.ps1 create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/azure/create_disk.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/azure/create_gallery.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/azure/create_vm.ps1 create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/azure/create_vm.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/azure/deallocate_vm.ps1 create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/azure/deallocate_vm.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/azure/delete_all.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/azure/delete_blob.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/azure/delete_disk.ps1 create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/azure/delete_disk.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/azure/delete_resource_goup.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/azure/delete_vm.ps1 create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/azure/delete_vm.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/azure/do_newterm.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/azure/dotunnel.bat create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/azure/generalize.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/azure/get_disk_id.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/azure/get_headless.ps1 create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/azure/get_headless.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/azure/get_results.ps1 create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/azure/get_results.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/azure/getip.ps1 create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/azure/getip.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/azure/image_create.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/azure/image_def.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/azure/install_labtainers.ps1 create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/azure/install_labtainers.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/azure/list-gallery.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/azure/newterm.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/azure/resourcecheck.ps1 create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/azure/resourcecheck.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/azure/restart.ps1 create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/azure/restart.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/azure/restore_vm.ps1 create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/azure/restore_vm.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/azure/share_gallery.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/azure/snapshot_disk.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/azure/stop_vm.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/azure/update_user.ps1 create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/azure/update_user.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/azure/wait_tunnel.ps1 create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/azure/wait_tunnel.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/azure/waitdone.ps1 create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/azure/waitdone.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/azure/waitdone2.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/azure/waitweb.ps1 create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/azure/waitweb.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/config/gnome-terminal-profiles.dconf create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/config/registry.config create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/distrib/LabtainerBase.py create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/distrib/cloneOrPull.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/distrib/cloneSimlab.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/distrib/cpall2test.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/distrib/full_build.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/distrib/get_reg_dates.py create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/distrib/justrelease.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/distrib/mac/READEME.md create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/distrib/mac/labtainers-desktop.pkg create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/distrib/mac/mkpkg.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/distrib/mac/scripts/postinstall create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/distrib/mac/scripts/preinstall create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/distrib/mac/test-package.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/distrib/mergePre.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/distrib/mkall.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/distrib/mkrelease.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/distrib/move_base.py create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/distrib/move_reg.py delete mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/distrib/publish_grader.py create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/distrib/refresh_branch.py create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/distrib/refresh_mirror.py create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/distrib/release/README.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/distrib/release/labtainer.tar create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/distrib/reset_premaster.sh delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/docs/development/dev.tex create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/docs/development/development.pdf create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/docs/development/labtainer5-sm.png create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/docs/gns3/labtainers_GNS3.pdf create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/docs/instructor/labtainer-instructor.pdf create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/docs/instructor/labtainer5-sm.png create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/docs/labdesigner/labdesigner.pdf create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/docs/labdesigner/labtainer5-sm.png create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/docs/license.md create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/docs/student/labtainer-student.pdf create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/docs/student/labtainer5-sm.png create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/google/README.txt create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/google/base_create.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/google/base_create22.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/google/base_create24.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/google/checktunnel.ps1 create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/google/checktunnel.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/google/cloud_init.template create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/google/create_vm.ps1 create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/google/create_vm.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/google/create_vm_ec.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/google/delete_vm.ps1 create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/google/delete_vm.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/google/do_newterm.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/google/dotunnel.bat create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/google/findzone.ps1 create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/google/findzone.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/google/get_results.ps1 create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/google/get_results.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/google/getip.ps1 create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/google/getip.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/google/install_labtainers.ps1 create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/google/install_labtainers.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/google/newterm.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/google/project.ps1 create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/google/project.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/google/publishImage.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/google/restart.ps1 create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/google/restart.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/google/set_defaults.ps1 create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/google/set_defaults.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/google/start_vm.ps1 create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/google/start_vm.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/google/stop_vm.ps1 create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/google/stop_vm.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/google/user_config.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/google/waitdone.ps1 create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/google/waitdone.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/google/waitup.ps1 create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/google/waitup.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/headless-lite/Dockerfile.labtainer.headless.tester create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/headless-lite/Dockerfile.labtainer.master.base create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/headless-lite/Dockerfile.labtainer.master.headless create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/headless-lite/README.md create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/headless-lite/buildTester.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/headless-lite/cloud-config create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/headless-lite/docker-compose.yml create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/headless-lite/docker-entrypoint create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/headless-lite/doterm.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/headless-lite/doupdate.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/headless-lite/get-results.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/headless-lite/headless-labtainers.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/headless-lite/install-headless.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/headless-lite/labtainers-client.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/headless-lite/motd create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/headless-lite/wait-for-it.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/headless-lite/waitForX.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/headless/Dockerfile.labtainer.master create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/headless/LICENSE create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/headless/README.md create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/headless/docker-compose.yml create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/headless/docker-entrypoint create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/headless/labtainer.master.create.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/headless/motd create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/headless/nginx-default.conf/default.conf create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/headless/wait-for-it.sh delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/host_scripts/push.txt create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/host_scripts/remote/remote.py create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/host_scripts/testscripts/powerSmoke.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/host_scripts/testscripts/powerSmokeOld.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/host_scripts/testscripts/smoke.cron create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/host_scripts/testscripts/vbox-test-server.service create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/host_scripts/testscripts/vboxserver.py delete mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/host_scripts/winscp create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labpacks/access.labpack create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labpacks/crypto.labpack create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labpacks/ics.labpack create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labpacks/net-traffic.labpack create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labpacks/network-intro.labpack create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labpacks/networks.labpack create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labpacks/operations.labpack create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labpacks/vuln.labpack create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labpacks/web-security.labpack create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/acl/config/keywords.txt delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/acl/docs/acl.aux delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/acl/docs/acl.dvi delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/acl/docs/acl.log delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/acl/docs/acl.out delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/acl/instr_config/instructions.txt delete mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/arp-spoof/attacker/_system/sbin/faux_init create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/arp-spoof/config/keywords.txt delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/arp-spoof/docs/.~lock.arp-spoof-report.docx# delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/arp-spoof/docs/arp-spoof.aux delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/arp-spoof/docs/arp-spoof.log delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/arp-spoof/docs/arp-spoof.out delete mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/arp-spoof/gateway/_system/sbin/faux_init delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/arp-spoof/instr_config/instructions.txt delete mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/arp-spoof/user/_system/sbin/faux_init delete mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/arp-spoof/webserver/_system/sbin/faux_init rename modules/utilities/unix/labtainers/files/Labtainers-master/labs/arp-spoof/webserver/_system/{ => usr}/lib/systemd/system/httpserver.service (100%) delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/backups/instr_config/instructions.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/backups2/config/keywords.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/.~lock.topo.odg# create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/config/about.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/config/keywords.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/config/parameter.config create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/config/start.config create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/config/start.config.bu create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/dockerfiles/Dockerfile.bird-bgp.e1.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/dockerfiles/Dockerfile.bird-bgp.e2.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/dockerfiles/Dockerfile.bird-bgp.e3.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/dockerfiles/Dockerfile.bird-bgp.e4.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/dockerfiles/Dockerfile.bird-bgp.e5.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/dockerfiles/Dockerfile.bird-bgp.netmon.student rename modules/utilities/unix/labtainers/files/Labtainers-master/labs/{softplc2/dockerfiles/Dockerfile.softplc2.modbus.student => bird-bgp/dockerfiles/Dockerfile.bird-bgp.r1.student} (98%) create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/dockerfiles/Dockerfile.bird-bgp.r2.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/dockerfiles/Dockerfile.bird-bgp.r3.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/dockerfiles/Dockerfile.bird-bgp.r4.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/dockerfiles/Dockerfile.bird-bgp.tap.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/docs/Makefile create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/docs/bird-bgp.pdf create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/docs/bird-bgp.tex create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/docs/header.tex create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/docs/read_first.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/docs/topo.odg create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/docs/topo.png create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/e1/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/e1/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/e1/_system/etc/securetty create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/e2/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/e2/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/e2/_system/etc/securetty create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/e3/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/e3/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/e3/_system/etc/securetty create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/e4/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/e4/_bin/treataslocal create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/e4/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/e4/_system/etc/securetty create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/e5/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/e5/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/e5/_system/etc/securetty create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/instr_config/goals.config rename modules/utilities/unix/labtainers/files/Labtainers-master/labs/{wireshark-intro => bird-bgp}/instr_config/pregrade.sh (65%) create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/instr_config/results.config create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/netmon/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/netmon/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/netmon/_system/etc/securetty create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/r1/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/r1/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/r1/_system/etc/securetty create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/r1/_system/usr/local/etc/bird.conf create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/r2/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/r2/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/r2/_system/etc/securetty create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/r2/_system/usr/local/etc/bird.conf create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/r3/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/r3/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/r3/_system/etc/securetty create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/r3/_system/usr/local/etc/bird.conf create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/r4/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/r4/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/r4/_system/etc/securetty create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/r4/_system/usr/local/etc/bird.conf create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/tap/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/tap/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-bgp/tap/_system/etc/securetty create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/.~lock.topo.odg# create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/br/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/br/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/br/_system/etc/securetty create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/br/_system/usr/local/etc/bird.conf create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/brx/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/brx/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/brx/_system/etc/securetty create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/brx/_system/usr/local/etc/bird.conf create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/config/about.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/config/keywords.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/config/parameter.config create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/config/start.config create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/dockerfiles/Dockerfile.bird-ospf.br.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/dockerfiles/Dockerfile.bird-ospf.brx.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/dockerfiles/Dockerfile.bird-ospf.ir1.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/dockerfiles/Dockerfile.bird-ospf.ir2.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/dockerfiles/Dockerfile.bird-ospf.ir3.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/dockerfiles/Dockerfile.bird-ospf.netmon.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/dockerfiles/Dockerfile.bird-ospf.s1.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/dockerfiles/Dockerfile.bird-ospf.tap.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/dockerfiles/Dockerfile.bird-ospf.w1.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/dockerfiles/Dockerfile.bird-ospf.w2.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/dockerfiles/Dockerfile.bird-ospf.w3.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/dockerfiles/Dockerfile.bird-ospf.wx.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/docs/Makefile create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/docs/bird-ospf.pdf create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/docs/bird-ospf.tex create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/docs/header.tex create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/docs/read_first.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/docs/topo.odg create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/docs/topo.png create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/instr_config/goals.config create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/instr_config/pregrade.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/instr_config/results.config create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/ir1/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/ir1/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/ir1/_system/etc/securetty create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/ir1/_system/usr/local/etc/bird.conf create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/ir2/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/ir2/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/ir2/_system/etc/securetty create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/ir2/_system/usr/local/etc/bird.conf create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/ir3/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/ir3/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/ir3/_system/etc/securetty create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/ir3/_system/usr/local/etc/bird.conf create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/netmon/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/netmon/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/netmon/_system/etc/securetty create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/s1/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/s1/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/s1/_system/etc/securetty create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/tap/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/tap/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/tap/_system/etc/securetty create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/w1/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/w1/_bin/treataslocal create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/w1/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/w1/_system/etc/securetty create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/w2/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/w2/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/w2/_system/etc/securetty create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/w3/MyHTTPServer.py create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/w3/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/w3/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/w3/_system/etc/securetty create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/w3/_system/usr/local/etc/bird.conf create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/w3/index.html rename modules/utilities/unix/labtainers/files/Labtainers-master/labs/{dmz-lab/web_server => bird-ospf/wx}/MyHTTPServer.py (100%) create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/wx/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/wx/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/wx/_system/etc/securetty create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/wx/_system/lib/systemd/system/httpserver.service create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bird-ospf/wx/_system/var/www/html/index.html create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/buf64/buf64/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/buf64/buf64/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/buf64/buf64/_system/etc/securetty create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/buf64/buf64/compile.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/buf64/buf64/exploit.c create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/buf64/buf64/hexit.py create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/buf64/buf64/shell.asm create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/buf64/buf64/stack.c create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/buf64/config/about.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/buf64/config/keywords.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/buf64/config/parameter.config create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/buf64/config/start.config create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/buf64/dockerfiles/Dockerfile.buf64.buf64.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/buf64/docs/Makefile create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/buf64/docs/buf64.pdf create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/buf64/docs/buf64.tex create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/buf64/docs/header.tex create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/buf64/docs/read_first.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/buf64/instr_config/goals.config create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/buf64/instr_config/pregrade.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/buf64/instr_config/results.config create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/bufoverflow/config/keywords.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/capabilities/config/keywords.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/capabilities/docs/capabilities-report.docx delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/capabilities/instr_config/instructions.txt delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/centos-log/instr_config/instructions.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/centos-log2/config/keywords.txt delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/centos-log2/instr_config/instructions.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/buildfiles/common_names.txt create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/buildfiles/cpserver.py create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/buildfiles/docker/Dockerfile create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/buildfiles/dorun.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/buildfiles/setpaths.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/buildfiles/skiplist.txt create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/client/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/client/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/client/_system/etc/securetty create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/client/_system/usr/lib/libcgc.so create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/client/_system/usr/lib/libpov.so create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/client/_system/usr/lib/libtiny-AES128-C.so create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/client/_system/usr/sbin/cb-replay create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/client/_system/usr/sbin/cb-replay-pov create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/client/cb-replay-pov.md create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/client/cb-replay.md create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/client/cfe.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/client/common_names.txt create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/client/poll.py create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/client/pov.py create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/client/service.map create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/client/t.py create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/client/throw.py create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/config/about.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/config/bigexternal.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/config/keywords.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/config/parameter.config create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/config/start.config create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/dockerfiles/Dockerfile.cgc.client.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/dockerfiles/Dockerfile.cgc.server.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/docs/Makefile create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/docs/cgc.pdf create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/docs/cgc.tex create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/docs/header.tex create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/docs/notes.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/docs/read_first.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/instr_config/goals.config create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/instr_config/pregrade.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/instr_config/results.config create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/.ghidra/.ghidra_9.1.1_PUBLIC/preferences create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/gdb/gdbinit create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/securetty create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/services create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/services.orig create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/systemd/system/xinetd.service.d/core.conf create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.conf create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/3d_image_toolkit create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/accel create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/ais-lite create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/anagram_game create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/ascii_content_server create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/asl6parse create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/audio_visualizer create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/azurad create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/barcoder create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/basic_emulator create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/basic_messaging create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/bitblaster create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/bloomy_sunday create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/board_game create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/budgit create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/cablegrind create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/cablegrindllama create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/carbonate create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/casino_games create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/cereal_mixup__a_cereal_vending_machine_controller create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/cgc_board create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/cgc_file_system create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/cgc_hangman_game create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/cgc_image_parser create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/cgc_planet_markup_language_parser create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/cgc_symbol_viewer_csv create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/cgc_video_format_parser_and_viewer create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/character_statistics create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/charter create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/checkmate create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/chess_mimic create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/childs_game create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/cloudcompute create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/cml create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/cnmp create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/collideoscope create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/corinth create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/cotton_swab_arithmetic create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/cromulence_all_service create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/cttp create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/cyber_blogger create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/dfars_sample_service create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/diary_parser create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/differ create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/diophantine_password_wallet create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/dive_logger create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/divelogger2 create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/document_rendering_engine create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/dungeon_master create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/ecm_tcm_simulator create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/eddy create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/electronictrading create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/email_system_2 create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/enslavednode_chat create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/estadio create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/eternalpass create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/expression_database create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/fablesreport create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/facemag create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/facilities_access_control_system create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/failav create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/fastlane create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/filesys create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/filesystem_command_shell create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/finicky_file_folder create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/fishyxml create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/flash_file_system create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/flight_routes create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/fortress create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/fsk_bbs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/fsk_messaging_service create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/fun create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/game_night create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/glue create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/gps_tracker create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/greatview create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/greeter create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/greymatter create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/gridder create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/griswold create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/grit create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/h20flowinc create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/hackman create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/hawaii_sets create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/headscratch create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/heartthrob create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/highcoo create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/highfrequencytradingalgo create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/hug_game create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/humaninterface create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/image_compressor create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/insulatr create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/kaprica_go create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/kaprica_script_interpreter create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/kty_pretty_printer create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/lazybox create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/lazycalc create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/lms create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/loud_square_instant_messaging_protocol_lsimp create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/matchmaker create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/material_temperature_simulation create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/mathematical_solver create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/matrices_for_sale create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/matrix_math_calculator create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/message_service create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/middleout create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/middleware_handshake create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/minimalistic_memo_manager_3m create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/mixology create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/modern_family_tree create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/monster_game create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/mount_filemore create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/movie_rental_service create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/movie_rental_service_redux create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/multi_arena_pursuit_simulator create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/multi_user_calendar create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/multicast_chat_server create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/multipass create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/multipass2 create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/multipass3 create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/music_store_client create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/narfagainshell create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/narfrpn create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/netstorage create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/network_file_system create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/network_file_system_v3 create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/network_queuing_simulator create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/neural_house create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/no_paper._not_ever._nope create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/nohic create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/on_sale create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/one_amp create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/one_vote create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/online_job_application create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/online_job_application2 create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/otpsim create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/overflow_parking create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/pac_for_edges create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/packet_analyzer create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/packet_receiver create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/palindrome create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/palindrome2 create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/parking_permit_management_system_ppms create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/particle_simulator create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/pattern_finder create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/payroll create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/pcm_message_decoder create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/personal_fitness_manager create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/pizza_ordering_system create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/pkk_steganography create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/printer create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/pru create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/ptaas create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/quadtreeconways create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/query_calculator create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/quietsquare create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/ram_based_filesystem create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/reallystream create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/recipe_and_pantry_manager create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/recipe_database create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/rejistar create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/rematch_2--mail_server--crackaddr create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/rematch_3--address_resolution_service--sql_slammer create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/rematch_4--cgcrpc_server--ms08-067 create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/rematch_5--file_explorer--lnk_bug create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/rematch_6--secure_server--heartbleed create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/resort_modeller create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/root64_and_parcour create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/router_simulator create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/rrpn create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/sad_face_template_engine_sfte create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/sample_shipgame create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/sauth create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/scrum_database create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/scuba_dive_logging create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/secure_compression create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/sensr create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/sftscbsiss create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/shortest_path_tree_calculator create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/shoutctf create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/sigsegv create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/simple_integer_calculator create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/simple_stack_machine create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/simplenote create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/simpleocr create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/single-sign-on create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/slur_reference_implementation create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/snail_mail create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/solfedge create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/sorter create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/space_attackers create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/spiffs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/square_rabbit create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/stack_vm create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/stock_exchange_simulator create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/stream_vm create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/stream_vm2 create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/street_map_service create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/string_info_calculator create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/string_storage_and_retrieval create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/taintedlove create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/tennis_ball_motion_calculator create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/terrible_ticket_tracker create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/textsearch create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/tfttp create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/the_longest_road create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/thermal_controller_v2 create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/thermal_controller_v3 create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/tiaca create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/tick-a-tack create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/tvs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/university_enrollment create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/user_manager create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/utf-late create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/valvechecks create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/vector_graphics_2 create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/vector_graphics_format create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/venture_calculator create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/vfilter create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/virtual_machine create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/virtual_pet create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/water_treatment_facility_simulator create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/whackjack create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/wordcompletion create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/xstore create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/etc/xinetd.d/yolodex create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/usr/lib/libcgc.so create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/usr/lib/libpov.so create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/_system/usr/lib/libtiny-AES128-C.so create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/ghidra create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cgc/server/ida delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/cyberciege/instr_config/instructions.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/config/about.txt create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/config/db.quiz create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/config/keywords.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/config/parameter.config create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/config/start.config create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/database/.mysql/workbench/connections.xml create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/database/.mysql/workbench/server_instances.xml create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/database/.mysql/workbench/shell_bookmarks.txt rename modules/utilities/unix/labtainers/files/Labtainers-master/labs/{nmap-ssh/pserver/Untitled Document => db-access/database/.mysql/workbench/shell_history.txt} (100%) create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/database/.mysql/workbench/snippets/DB_Management.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/database/.mysql/workbench/snippets/SQL_DDL_Statements.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/database/.mysql/workbench/snippets/SQL_DML_Statements.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/database/.mysql/workbench/starters_settings.xml create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/database/.mysql/workbench/user_starters.xml create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/database/.mysql/workbench/wb_options.xml create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/database/.mysql/workbench/wb_state.xml create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/database/MYCO.sql create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/database/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/database/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/database/_system/etc/mysql/mysql.conf.d/mysqld.cnf create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/database/_system/etc/securetty rename modules/utilities/unix/labtainers/files/Labtainers-master/{scripts/designer/system => labs/db-access/database/_system/usr}/bin/firefox (100%) rename modules/utilities/unix/labtainers/files/Labtainers-master/{scripts/designer/system => labs/db-access/database/_system}/var/tmp/home.tar (100%) create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/database/users.sql create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/dockerfiles/Dockerfile.db-access.database.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/dockerfiles/Dockerfile.db-access.executive.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/dockerfiles/Dockerfile.db-access.finance.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/dockerfiles/Dockerfile.db-access.hr.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/dockerfiles/Dockerfile.db-access.it.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/docs/Makefile create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/docs/db-access.docx create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/docs/db-access.pdf create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/docs/read_first.txt create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/executive/_bin/fixlocal.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/executive/_bin/prestop create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/executive/_bin/treataslocal create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/executive/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/executive/_system/etc/securetty create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/executive/steven.sql create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/finance/_bin/fixlocal.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/finance/_bin/prestop create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/finance/_bin/treataslocal create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/finance/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/finance/_system/etc/securetty create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/finance/nancy.sql create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/hr/_bin/fixlocal.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/hr/_bin/prestop create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/hr/_bin/treataslocal create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/hr/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/hr/_system/etc/securetty create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/hr/susan.sql create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/instr_config/goals.config create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/instr_config/pregrade.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/instr_config/results.config create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/it/_bin/fixlocal.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/it/_bin/prestop create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/it/_bin/treataslocal create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/it/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/it/_system/etc/securetty create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/it/david.sql create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/db-access/steven/_bin/prestop create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/denyhost/config/keywords.txt delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dhcp-test/instr_config/instructions.txt delete mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dmz-example/dns/_system/sbin/faux_init delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dmz-example/instr_config/instructions.txt delete mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dmz-example/isp/_system/sbin/faux_init create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dmz-lab/config/dmz-lab.quiz create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dmz-lab/config/keywords.txt delete mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dmz-lab/dns/_system/sbin/faux_init create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dmz-lab/inner_gw/_bin/notify create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dmz-lab/inner_gw/_bin/notify_cb.sh delete mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dmz-lab/inner_gw/_system/sbin/faux_init delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dmz-lab/instr_config/instructions.txt delete mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dmz-lab/isp/_system/sbin/faux_init delete mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dmz-lab/outer_gw/_system/sbin/faux_init delete mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dmz-lab/remote_gw/_system/sbin/faux_init create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dmz-lab/remote_ws/_bin/prestop delete mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dmz-lab/web_server/_system/sbin/faux_init create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dmz-lab/ws1/_bin/prestop delete mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dmz-lab/ws1/_system/sbin/faux_init create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dmz-lab/ws2/_system/etc/systemd/system/httpserver.service delete mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dmz-lab/ws2/_system/sbin/faux_init create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dmz-lab/ws2/_system/usr/bin/MyHTTPServer.py create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dmz-lab/ws2/_system/var/www/html/index.html delete mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dmz-lab/ws3/_system/sbin/faux_init create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/config/about.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/config/keywords.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/config/parameter.config create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/config/post.quiz create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/config/start.config create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/dns/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/dns/_system/etc/bind/example.conf create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/dns/_system/etc/login.defs create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/dns/_system/etc/rc.local create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/dns/_system/etc/securetty create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/dns/_system/etc/systemd/system/mynotify.service create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/dns/_system/var/named/192.168.0.0 create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/dns/_system/var/named/example.com.zone create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/dockerfiles/Dockerfile.dns.dns.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/dockerfiles/Dockerfile.dns.gw.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/dockerfiles/Dockerfile.dns.isp.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/dockerfiles/Dockerfile.dns.net-monitor.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/dockerfiles/Dockerfile.dns.tap.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/dockerfiles/Dockerfile.dns.ws1.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/dockerfiles/Dockerfile.dns.ws2.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/dockerfiles/Dockerfile.dns.ws3.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/docs/Makefile create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/docs/dns.jpg create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/docs/dns.odg create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/docs/dns.pdf create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/docs/dns.tex create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/docs/header.tex create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/docs/note.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/docs/read_first.txt create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/gw/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/gw/_bin/notify create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/gw/_bin/notify_cb.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/gw/_system/etc/login.defs create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/gw/_system/etc/rc.local create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/gw/_system/etc/securetty create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/gw/_system/etc/systemd/system/mynotify.service create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/instr_config/goals.config create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/instr_config/pregrade.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/instr_config/results.config create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/isp/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/isp/_system/etc/login.defs create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/isp/_system/etc/rc.local create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/isp/_system/etc/securetty create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/net-monitor/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/net-monitor/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/net-monitor/_system/etc/securetty create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/tap/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/tap/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/tap/_system/etc/securetty create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/ws1/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/ws1/_bin/treataslocal create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/ws1/_system/etc/login.defs create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/ws1/_system/etc/rc.local create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/ws1/_system/etc/securetty create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/ws2/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/ws2/_bin/treataslocal create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/ws2/_system/etc/login.defs create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/ws2/_system/etc/rc.local create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/ws2/_system/etc/securetty create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/ws3/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/ws3/_bin/treataslocal create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/ws3/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/dns/ws3/_system/etc/securetty create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/file-deletion/config/keywords.txt delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/file-deletion/instr_config/instructions.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/file-integrity/config/keywords.txt delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/file-integrity/instr_config/instructions.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/format64/config/about.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/format64/config/keywords.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/format64/config/parameter.config create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/format64/config/start.config create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/format64/dockerfiles/Dockerfile.format64.format64.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/format64/docs/Makefile create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/format64/docs/format64.pdf create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/format64/docs/format64.tex create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/format64/docs/header.tex create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/format64/docs/read_first.txt create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/format64/format64/_bin/fixlocal.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/format64/format64/_bin/precheck.sh rename modules/utilities/unix/labtainers/files/Labtainers-master/labs/{dmz-lab/remote_ws => format64/format64}/_system/sbin/faux_init (100%) create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/format64/format64/vul_prog.c create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/format64/instr_config/goals.config create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/format64/instr_config/results.config create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/formatstring/config/keywords.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/gdb-cpp/config/about.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/gdb-cpp/config/keywords.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/gdb-cpp/config/parameter.config create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/gdb-cpp/config/start.config create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/gdb-cpp/dockerfiles/Dockerfile.gdb-cpp.gdb-cpp.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/gdb-cpp/docs/Makefile create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/gdb-cpp/docs/gdb-cpp.pdf create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/gdb-cpp/docs/gdb-cpp.tex create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/gdb-cpp/docs/header.tex create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/gdb-cpp/docs/read_first.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/gdb-cpp/gdb-cpp/Makefile create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/gdb-cpp/gdb-cpp/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/gdb-cpp/gdb-cpp/_bin/treataslocal create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/gdb-cpp/gdb-cpp/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/gdb-cpp/gdb-cpp/_system/etc/securetty create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/gdb-cpp/gdb-cpp/main.cc create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/gdb-cpp/instr_config/goals.config create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/gdb-cpp/instr_config/pregrade.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/gdb-cpp/instr_config/results.config create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/gdblesson/config/keywords.txt delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/gdblesson/instr_config/instructions.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ghidra/config/about.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ghidra/config/keywords.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ghidra/config/parameter.config create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ghidra/config/start.config create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ghidra/dockerfiles/Dockerfile.ghidra.ghidra.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ghidra/dockerfiles/Dockerfile.ghidra.server.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ghidra/docs/Makefile create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ghidra/docs/ghidra.pdf create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ghidra/docs/ghidra.tex create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ghidra/docs/header.tex create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ghidra/docs/read_first.txt create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ghidra/ghidra/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ghidra/ghidra/_bin/treataslocal create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ghidra/ghidra/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ghidra/ghidra/_system/etc/securetty create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ghidra/ghidra/_system/usr/bin/setbyte create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ghidra/ghidra/cadet01 create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ghidra/ghidra/ghidra create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ghidra/instr_config/goals.config create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ghidra/instr_config/pregrade.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ghidra/instr_config/results.config create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ghidra/server/_bin/fixlocal.sh rename modules/utilities/unix/labtainers/files/Labtainers-master/labs/{iptables-ics/plc/_system/etc/init.d/plc.sh => ghidra/server/_system/etc/init.d/cadet.sh} (80%) create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ghidra/server/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ghidra/server/_system/etc/securetty create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ghidra/server/_system/lib/systemd/system/cadet.service create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ghidra/server/_system/usr/bin/setbyte create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ghidra/server/cadet01 create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/grassmarlin/config/keywords.txt delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/grassmarlin/docs/grassmarlin.dvi delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/grassmarlin/instr_config/instructions.txt delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/grfics/docs/grfics.dvi delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/grfics/instr_config/instructions.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/httplab/config/keywords.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ida/config/version delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ida/instr_config/instructions.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ida2/config/about.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ida2/config/bigexternal.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ida2/config/keywords.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ida2/config/parameter.config rename modules/utilities/unix/labtainers/files/Labtainers-master/labs/{shellbasics => ida2}/config/start.config (67%) create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ida2/config/version create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ida2/dockerfiles/Dockerfile.ida2.ida.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ida2/docs/Makefile create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ida2/docs/ida.docx create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ida2/docs/ida.pdf create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ida2/docs/read_first.txt create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ida2/ida/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ida2/ida/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ida2/ida/_system/etc/securetty create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ida2/ida/mk.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ida2/ida/sample.c create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ida2/instr_config/goals.config create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ida2/instr_config/pregrade.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ida2/instr_config/results.config create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/iptables-ics/client1/_bin/prestop create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/iptables-ics/client2/_bin/prestop create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/iptables-ics/config/keywords.txt delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/iptables-ics/instr_config/instructions.txt delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/iptables-ics/plc/_system/lib/systemd/system/plc.service delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/iptables-ics/plc/_system/sbin/OpenPLC_v2x/core/modbus.cpp delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/iptables-ics/plc/_system/sbin/OpenPLC_v2x/server.js create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/iptables-ics/plc/_system/var/tmp/mbconfig.cfg create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/iptables-ics/plc/_system/var/tmp/openplc.db delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/iptables-ics/plc/sys_tar/external-manifest create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/iptables/docs/Makefile create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/iptables/docs/iptables.docx create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/iptables/docs/iptables.pdf create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/iptables/docs/read_first.txt delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/iptables/instr_config/instructions.txt create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/iptables2/client/_bin/prestop delete mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/iptables2/client/_system/sbin/faux_init create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/iptables2/config/iptables.quiz create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/iptables2/config/keywords.txt delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/iptables2/docs/iptables.out delete mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/iptables2/firewall/_system/sbin/faux_init delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/iptables2/instr_config/instructions.txt delete mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/iptables2/server/_system/sbin/faux_init rename modules/utilities/unix/labtainers/files/Labtainers-master/labs/iptables2/server/_system/{ => usr}/lib/systemd/system/httpserver.service (100%) rename modules/utilities/unix/labtainers/files/Labtainers-master/labs/iptables2/server/_system/{ => usr}/lib/systemd/system/wizbang.service (100%) delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/kali-test/instr_config/instructions.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ldap/config/keywords.txt delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ldap/instr_config/instructions.txt delete mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ldap/ldap/_system/sbin/faux_init create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ldap/ldap/_system/var/tmp/enable-ssl.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ldap/ldap/_system/var/tmp/selfsign.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ldap/ldap/_system/var/tmp/xcert.ldif create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ldap/ldap/_system/var/tmp/xkey.ldif create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ldap/ldap/mike.ldif create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ldap/ldap/projx.ldif create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ldap/server1/_system/etc/ldap.secret create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ldap/server1/_system/etc/nscd.conf delete mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ldap/server1/_system/sbin/faux_init create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ldap/server2/_system/etc/ldap.secret create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ldap/server2/_system/etc/nscd.conf delete mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ldap/server2/_system/sbin/faux_init create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ldaptst/client/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ldaptst/client/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ldaptst/client/_system/etc/securetty create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ldaptst/client/_system/var/tmp/doauth.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ldaptst/client/_system/var/tmp/enablessl.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ldaptst/config/about.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ldaptst/config/client-home_tar.list create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ldaptst/config/ldaptst-home_tar.list create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ldaptst/config/parameter.config create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ldaptst/config/start.config create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ldaptst/dockerfiles/Dockerfile.ldaptst.client.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ldaptst/dockerfiles/Dockerfile.ldaptst.ldaptst.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ldaptst/docs/read_first.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ldaptst/instr_config/goals.config create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ldaptst/instr_config/pregrade.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ldaptst/instr_config/results.config create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ldaptst/ldaptst/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ldaptst/ldaptst/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ldaptst/ldaptst/_system/etc/securetty create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ldaptst/ldaptst/_system/var/tmp/adduser.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ldaptst/ldaptst/_system/var/tmp/base.ldif create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ldaptst/ldaptst/_system/var/tmp/db.ldif create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ldaptst/ldaptst/_system/var/tmp/enabless.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ldaptst/ldaptst/_system/var/tmp/mike.ldif create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ldaptst/ldaptst/_system/var/tmp/monitor.ldif create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ldaptst/ldaptst/_system/var/tmp/projx.ldif create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ldaptst/ldaptst/_system/var/tmp/selfsign.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ldaptst/ldaptst/_system/var/tmp/update_ldap.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ldaptst/ldaptst/_system/var/tmp/xcert.ldif create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ldaptst/ldaptst/_system/var/tmp/xkey.ldif delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/liveforensics/instr_config/instructions.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/local-dns/config/keywords.txt delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/local-dns/instr_config/instructions.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/macs-hash/config/keywords.txt delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/macs-hash/instr_config/instructions.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/mariadbtst/config/about.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/mariadbtst/config/parameter.config create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/mariadbtst/config/start.config create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/mariadbtst/dockerfiles/Dockerfile.mariadbtst.ldapserver.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/mariadbtst/dockerfiles/Dockerfile.mariadbtst.mariadbtst.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/mariadbtst/dockerfiles/Dockerfile.mariadbtst.ws.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/mariadbtst/docs/read_first.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/mariadbtst/instr_config/goals.config create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/mariadbtst/instr_config/pregrade.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/mariadbtst/instr_config/results.config create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/mariadbtst/ldapserver/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/mariadbtst/ldapserver/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/mariadbtst/ldapserver/_system/etc/securetty create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/mariadbtst/ldapserver/_system/var/tmp/adduser.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/mariadbtst/ldapserver/_system/var/tmp/base.ldif create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/mariadbtst/ldapserver/_system/var/tmp/db.ldif create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/mariadbtst/ldapserver/_system/var/tmp/enable-ssl.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/mariadbtst/ldapserver/_system/var/tmp/mike.ldif create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/mariadbtst/ldapserver/_system/var/tmp/monitor.ldif create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/mariadbtst/ldapserver/_system/var/tmp/projx.ldif create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/mariadbtst/ldapserver/_system/var/tmp/selfsign.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/mariadbtst/ldapserver/_system/var/tmp/update_ldap.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/mariadbtst/ldapserver/_system/var/tmp/xcert.ldif create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/mariadbtst/ldapserver/_system/var/tmp/xkey.ldif create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/mariadbtst/mariadbtst/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/mariadbtst/mariadbtst/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/mariadbtst/mariadbtst/_system/etc/pam.d/mysql create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/mariadbtst/mariadbtst/_system/etc/securetty create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/mariadbtst/mariadbtst/admin.sql create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/mariadbtst/mariadbtst/configldap.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/mariadbtst/mariadbtst/docerts.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/mariadbtst/mariadbtst/enable-ssl-ldap.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/mariadbtst/mariadbtst/netcnf.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/mariadbtst/mariadbtst/sslcnf.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/mariadbtst/mariadbtst/users.sql create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/mariadbtst/ws/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/mariadbtst/ws/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/mariadbtst/ws/_system/etc/securetty create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/mariadbtst/ws/docnf.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/metasploit/config/keywords.txt delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/metasploit/instr_config/instructions.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/netflow/config/about.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/netflow/config/bigexternal.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/netflow/config/keywords.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/netflow/config/parameter.config create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/netflow/config/start.config create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/netflow/dockerfiles/Dockerfile.netflow.workstation.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/netflow/docs/Makefile create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/netflow/docs/header.tex create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/netflow/docs/netflow.pdf create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/netflow/docs/netflow.tex create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/netflow/docs/pic.png create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/netflow/docs/read_first.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/netflow/instr_config/goals.config create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/netflow/instr_config/pregrade.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/netflow/instr_config/results.config create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/netflow/workstation/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/netflow/workstation/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/netflow/workstation/_system/etc/securetty create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/netflow/workstation/bashadd create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/network-basics/box1/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/network-basics/box1/_bin/treataslocal create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/network-basics/box1/_system/etc/login.defs create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/network-basics/box1/_system/etc/rc.local create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/network-basics/box1/_system/etc/securetty create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/network-basics/box2/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/network-basics/box2/_bin/treataslocal create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/network-basics/box2/_system/etc/login.defs create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/network-basics/box2/_system/etc/rc.local create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/network-basics/box2/_system/etc/securetty create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/network-basics/config/about.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/network-basics/config/keywords.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/network-basics/config/parameter.config create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/network-basics/config/start.config create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/network-basics/dockerfiles/Dockerfile.network-basics.box1.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/network-basics/dockerfiles/Dockerfile.network-basics.box2.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/network-basics/docs/Makefile create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/network-basics/docs/header.tex create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/network-basics/docs/network-basics.pdf create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/network-basics/docs/network-basics.tex create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/network-basics/docs/read_first.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/network-basics/instr_config/goals.config create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/network-basics/instr_config/pregrade.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/network-basics/instr_config/results.config create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/nix-commands/config/keywords.txt delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/nix-commands/instr_config/instructions.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/nmap-discovery/config/keywords.txt delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/nmap-discovery/mycomputer/instructions.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/nmap-ssh/config/keywords.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/onewayhash/config/keywords.txt create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ossec/client1/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ossec/client1/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ossec/client1/_system/etc/securetty create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ossec/config/about.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ossec/config/keywords.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ossec/config/parameter.config create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ossec/config/start.config create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ossec/dockerfiles/Dockerfile.ossec.client1.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ossec/dockerfiles/Dockerfile.ossec.ossec.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ossec/dockerfiles/Dockerfile.ossec.web_server.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ossec/docs/Makefile create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ossec/docs/header.tex create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ossec/docs/ossec.odg create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ossec/docs/ossec.pdf create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ossec/docs/ossec.png create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ossec/docs/ossec.tex create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ossec/docs/read_first.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ossec/instr_config/goals.config create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ossec/instr_config/pregrade.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ossec/instr_config/results.config create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ossec/ossec/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ossec/ossec/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ossec/ossec/_system/etc/securetty create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ossec/ossec/_system/root/.vimrc create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ossec/ossec/local_rules.xml create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ossec/web_server/MyHTTPServer.py create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ossec/web_server/_bin/fixlocal.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ossec/web_server/_system/etc/rc.d/rc.local create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ossec/web_server/_system/var/www/html/index.html create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ossec/web_server/_system/var/www/html/plan.html create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/overrun/config/about.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/overrun/config/keywords.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/overrun/config/parameter.config create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/overrun/config/start.config create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/overrun/dockerfiles/Dockerfile.overrun.overrun.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/overrun/docs/Makefile create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/overrun/docs/header.tex create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/overrun/docs/overrun.pdf create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/overrun/docs/overrun.tex create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/overrun/docs/read_first.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/overrun/instr_config/goals.config create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/overrun/instr_config/pregrade.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/overrun/instr_config/results.config create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/overrun/overrun/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/overrun/overrun/_bin/treataslocal create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/overrun/overrun/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/overrun/overrun/_system/etc/securetty create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/overrun/overrun/mystuff.c create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/packet-introspection/config/about.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/packet-introspection/config/keywords.txt delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/packet-introspection/instr_config/instructions.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/parallel/config/about.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/parallel/config/parameter.config create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/parallel/config/start.config create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/parallel/dockerfiles/Dockerfile.parallel.parallel.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/parallel/docs/parallel.pdf create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/parallel/docs/parallel.rtf create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/parallel/docs/read_first.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/parallel/instr_config/goals.config create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/parallel/instr_config/pregrade.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/parallel/instr_config/results.config create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/parallel/parallel/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/parallel/parallel/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/parallel/parallel/_system/etc/securetty create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/parallel/parallel/arraysum.c create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/parallel/parallel/hello.c create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/parallel/parallel/image.c create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/parallel/parallel/lil_sun.ppm create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/parallel/parallel/procid.c create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/parallel/parallel/search.c create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/pass-crack/config/keywords.txt delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/pass-crack/instr_config/instructions.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/pcap-lib/config/about.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/pcap-lib/config/bigexternal.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/pcap-lib/config/keywords.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/pcap-lib/config/parameter.config create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/pcap-lib/config/start.config create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/pcap-lib/dockerfiles/Dockerfile.pcap-lib.workstation.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/pcap-lib/docs/Makefile create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/pcap-lib/docs/header.tex create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/pcap-lib/docs/pcap-lib.pdf create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/pcap-lib/docs/pcap-lib.tex create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/pcap-lib/docs/read_first.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/pcap-lib/instr_config/goals.config create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/pcap-lib/instr_config/pregrade.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/pcap-lib/instr_config/results.config create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/pcap-lib/workstation/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/pcap-lib/workstation/_bin/notify create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/pcap-lib/workstation/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/pcap-lib/workstation/_system/etc/securetty create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/pcap-lib/workstation/dpktpcap.py create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/pcap-lib/workstation/pcaplib.cpp create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/pcap-lib/workstation/tutorial1.py create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/pcapanalysis/config/keywords.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-app/config/keywords.txt delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-app/instr_config/instructions.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-forensics-adv/config/keywords.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-forensics/config/keywords.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/config/about.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/config/bigexternal.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/config/keywords.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/config/parameter.config create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/config/start.config create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/config/version create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/dockerfiles/Dockerfile.plc-traffic.hmi.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/dockerfiles/Dockerfile.plc-traffic.netmon.student rename modules/utilities/unix/labtainers/files/Labtainers-master/labs/{shellbasics/dockerfiles/Dockerfile.shellbasics.shellbasics.student => plc-traffic/dockerfiles/Dockerfile.plc-traffic.plc.student} (65%) create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/dockerfiles/Dockerfile.plc-traffic.slave-device.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/dockerfiles/Dockerfile.plc-traffic.tap.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/docs/GRASSMARLIN_User_Guide.pdf create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/docs/Makefile create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/docs/header.tex create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/docs/openplcEditor.png create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/docs/plc-traffic.odp create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/docs/plc-traffic.pdf create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/docs/plc-traffic.png create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/docs/plc-traffic.tex create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/docs/read_first.txt create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/docs/softplc2.png create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/hmi/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/hmi/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/hmi/_system/etc/securetty create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/hmi/hello.st create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/hmi/hello/beremiz.xml create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/hmi/hello/build/Config0.c create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/hmi/hello/build/Config0.h create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/hmi/hello/build/Config0.o create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/hmi/hello/build/Hello World.so create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/hmi/hello/build/LOCATED_VARIABLES.h create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/hmi/hello/build/POUS.c create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/hmi/hello/build/POUS.h create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/hmi/hello/build/Res0.c create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/hmi/hello/build/Res0.o create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/hmi/hello/build/VARIABLES.csv create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/hmi/hello/build/beremiz.h create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/hmi/hello/build/generated_plc.st create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/hmi/hello/build/lastbuildPLC.md5 create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/hmi/hello/build/plc.st create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/hmi/hello/build/plc_debugger.c create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/hmi/hello/build/plc_debugger.o create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/hmi/hello/build/plc_main.c create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/hmi/hello/build/plc_main.o create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/hmi/hello/build/py_ext.c create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/hmi/hello/build/py_ext.o create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/hmi/hello/plc.xml create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/instr_config/goals.config create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/instr_config/pregrade.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/instr_config/results.config create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/netmon/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/netmon/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/netmon/_system/etc/securetty create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/plc/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/plc/_system/var/tmp/mbconfig.cfg create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/plc/_system/var/tmp/openplc.db create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/slave-device/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/slave-device/_system/etc/login.defs create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/slave-device/_system/etc/rc.local create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/slave-device/_system/etc/securetty create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/slave-device/server.py create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/tap/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/tap/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc-traffic/tap/_system/etc/securetty create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc/config/keywords.txt delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/plc/instr_config/instructions.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/printf/config/about.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/printf/config/keywords.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/printf/config/parameter.config create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/printf/config/start.config create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/printf/dockerfiles/Dockerfile.printf.printf.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/printf/docs/Makefile create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/printf/docs/header.tex create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/printf/docs/printf.pdf create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/printf/docs/printf.tex create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/printf/docs/read_first.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/printf/instr_config/goals.config create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/printf/instr_config/pregrade.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/printf/instr_config/results.config create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/printf/printf/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/printf/printf/_bin/treataslocal create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/printf/printf/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/printf/printf/_system/etc/securetty create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/printf/printf/mkit.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/printf/printf/printTest.c create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/pubkey/config/keywords.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/quantum/config/keywords.txt delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/quantum/instr_config/instructions.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/radius/config/keywords.txt rename modules/utilities/unix/labtainers/files/Labtainers-master/labs/radius/controller2/{ => _bin}/student_startup.sh (100%) delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/radius/instr_config/instructions.txt create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/radius/radius/_bin/prestop create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/remote-dns/config/keywords.txt delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/remote-dns/instr_config/instructions.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/retlibc/config/keywords.txt delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/retlibc/instr_config/instructions.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/routing-basics/config/keywords.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/routing-basics/dockerfiles/Dockerfile.routing-basics.remote_gw.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/routing-basics/dockerfiles/Dockerfile.routing-basics.remote_ws.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/routing-basics/dockerfiles/Dockerfile.routing-basics.web_server.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/routing-basics/gateway/_bin/treataslocal delete mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/routing-basics/gateway/_system/sbin/faux_init delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/routing-basics/instr_config/instructions.txt delete mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/routing-basics/isp/_system/sbin/faux_init create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/routing-basics/remote_gw/_bin/fixlocal.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/routing-basics/remote_gw/_system/etc/rc.local create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/routing-basics/remote_ws/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/routing-basics/remote_ws/_bin/treataslocal create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/routing-basics/remote_ws/_system/etc/rc.local create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/routing-basics/web_server/MyHTTPServer.py create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/routing-basics/web_server/_bin/fixlocal.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/routing-basics/web_server/_system/etc/init.d/httpserver.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/routing-basics/web_server/_system/etc/rc.d/rc.local create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/routing-basics/web_server/_system/var/www/html/index.html rename modules/utilities/unix/labtainers/files/Labtainers-master/labs/{dmz-lab => routing-basics}/web_server/index.html (100%) rename modules/utilities/unix/labtainers/files/Labtainers-master/labs/{dmz-lab => routing-basics}/web_server/link1.html (100%) rename modules/utilities/unix/labtainers/files/Labtainers-master/labs/{dmz-lab => routing-basics}/web_server/link2.html (100%) create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/routing-basics/ws1/_bin/treataslocal delete mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/routing-basics/ws1/_system/sbin/faux_init create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/routing-basics/ws2/_bin/treataslocal delete mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/routing-basics/ws2/_system/sbin/faux_init create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/routing-basics/ws3/_bin/treataslocal delete mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/routing-basics/ws3/_system/sbin/faux_init create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/routing-basics2/config/keywords.txt rename modules/utilities/unix/labtainers/files/Labtainers-master/labs/routing-basics2/docs/{routing-basics.pdf => routing-basics2.pdf} (81%) rename modules/utilities/unix/labtainers/files/Labtainers-master/labs/routing-basics2/docs/{routing-basics.tex => routing-basics2.tex} (99%) delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/routing-basics2/instr_config/instructions.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/setuid-env/config/keywords.txt delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/setuid-env/instr_config/instructions.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/setuid-env/setuid-env/ls.c delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/shellbasics/config/about.txt delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/shellbasics/config/parameter.config delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/shellbasics/config/student_manual.txt delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/shellbasics/instr_config/goals.config delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/shellbasics/instr_config/instructions.txt delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/shellbasics/instr_config/results.config delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/shellbasics/shellbasics/RunMe.py delete mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/shellbasics/shellbasics/_bin/fixlocal.sh delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/shellbasics/shellbasics/_bin/treataslocal delete mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/shellbasics/shellbasics/_system/sbin/faux_init delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/shellbasics/shellbasics/instructions.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/snort/config/keywords.txt delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/snort/instr_config/instructions.txt delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/softplc/instr_config/instructions.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/softplc2/config/keywords.txt delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/softplc2/instr_config/instructions.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/sql-inject/config/keywords.txt delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/sql-inject/instr_config/instructions.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-agent/config/keywords.txt create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/base/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/base/_bin/treataslocal create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/base/_system/etc/login.defs create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/base/_system/etc/rc.local create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/base/_system/etc/securetty create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/config/about.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/config/keywords.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/config/parameter.config create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/config/start.config create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/dockerfiles/Dockerfile.ssh-tunnel.base.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/dockerfiles/Dockerfile.ssh-tunnel.gw1.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/dockerfiles/Dockerfile.ssh-tunnel.gw2.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/dockerfiles/Dockerfile.ssh-tunnel.gw3.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/dockerfiles/Dockerfile.ssh-tunnel.gw4.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/dockerfiles/Dockerfile.ssh-tunnel.hosta.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/dockerfiles/Dockerfile.ssh-tunnel.hostb.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/dockerfiles/Dockerfile.ssh-tunnel.hostc.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/dockerfiles/Dockerfile.ssh-tunnel.hostd.student create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/docs/Makefile create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/docs/about.txt create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/docs/header.tex create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/docs/network-eps-converted-to.pdf create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/docs/network.eps create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/docs/network.fig create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/docs/network.fig.bak create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/docs/read_first.txt create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/docs/ssh-tunnel.pdf create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/docs/ssh-tunnel.tex create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/gw1/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/gw1/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/gw1/_system/etc/securetty create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/gw2/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/gw2/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/gw2/_system/etc/securetty create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/gw3/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/gw3/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/gw3/_system/etc/securetty create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/gw4/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/gw4/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/gw4/_system/etc/securetty create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/hosta/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/hosta/_system/etc/login.defs create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/hosta/_system/etc/rc.local create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/hosta/_system/etc/securetty create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/hostb/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/hostb/_system/etc/login.defs create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/hostb/_system/etc/rc.local create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/hostb/_system/etc/securetty create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/hostc/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/hostc/_system/etc/login.defs create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/hostc/_system/etc/rc.local create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/hostc/_system/etc/securetty create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/hostd/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/hostd/_system/etc/login.defs create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/hostd/_system/etc/rc.local create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/hostd/_system/etc/securetty create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/hostd/copyfile.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/instr_config/goals.config create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/instr_config/pregrade.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssh-tunnel/instr_config/results.config create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/sshlab/config/keywords.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssl/config/keywords.txt delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/ssl/instr_config/instructions.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/strace/config/about.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/strace/config/keywords.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/strace/config/parameter.config create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/strace/config/start.config create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/strace/dockerfiles/Dockerfile.strace.the-client.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/strace/dockerfiles/Dockerfile.strace.the-server.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/strace/docs/Makefile create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/strace/docs/header.tex create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/strace/docs/read_first.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/strace/docs/strace.pdf create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/strace/docs/strace.tex create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/strace/instr_config/goals.config create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/strace/instr_config/pregrade.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/strace/instr_config/results.config create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/strace/the-client/_bin/fixlocal.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/strace/the-client/_bin/mkit.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/strace/the-client/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/strace/the-client/_system/etc/securetty create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/strace/the-client/ghidra create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/strace/the-client/ob.c create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/strace/the-client/sendudp.py create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/strace/the-server/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/strace/the-server/_system/etc/login.defs create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/strace/the-server/_system/etc/rc.local create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/strace/the-server/_system/etc/securetty create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/strace/the-server/_system/var/run/config.txt create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/strace/the-server/mkit.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/strace/the-server/ob.c create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/strace/the-server/observer create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/symkeylab/config/keywords.txt delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/symkeylab/instr_config/instructions.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/sys-log/config/keywords.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/tcpip/config/keywords.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/tcpip/dockerfiles/Dockerfile.tcpip.router.student delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/tcpip/instr_config/instructions.txt create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/tcpip/router/_bin/fixlocal.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/tcpip/router/_system/etc/login.defs create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/tcpip/router/_system/etc/rc.local create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/tcpip/router/_system/etc/securetty create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/tcpip/server/_system/etc/rc.local delete mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/tcpip/server/_system/sbin/faux_init create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/telnetlab/config/keywords.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/users/config/about.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/users/config/keywords.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/users/config/parameter.config create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/users/config/start.config create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/users/dockerfiles/Dockerfile.users.shared.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/users/docs/Makefile create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/users/docs/header.tex create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/users/docs/read_first.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/users/docs/users.pdf create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/users/docs/users.tex create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/users/instr_config/goals.config create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/users/instr_config/pregrade.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/users/instr_config/results.config create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/users/shared/_bin/fixlocal.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/users/shared/_bin/student_startup.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/users/shared/_system/etc/login.defs create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/users/shared/_system/etc/securetty create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/users/shared/_system/shared_stuff/beefstew.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/users/shared/_system/shared_stuff/tarts.txt create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/users/shared/_system/usr/bin/eggcheck delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/vpnlab/client/instructions.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/vpnlab/config/keywords.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/vpnlab/docs/Makefile create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/vpnlab/docs/header.tex create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/vpnlab/docs/read_first.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/vpnlab/docs/vpnlab.pdf create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/vpnlab/docs/vpnlab.tex delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/vpnlab2/client/instructions.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/vpnlab2/config/keywords.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/vpnlab2/docs/Makefile create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/vpnlab2/docs/header.tex create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/vpnlab2/docs/read_first.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/vpnlab2/docs/vpnlab2.pdf create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/vpnlab2/docs/vpnlab2.tex delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/webtrack/docs/.~lock.webtrack-report.docx# delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/webtrack/instr_config/instructions.txt delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/wireshark-intro/README create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/wireshark-intro/docs/Makefile create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/wireshark-intro/docs/header.tex create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/wireshark-intro/docs/read_first.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/wireshark-intro/docs/wireshark-intro.pdf create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/wireshark-intro/docs/wireshark-intro.tex delete mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/labs/wireshark-intro/wireshark-intro/_system/sbin/faux_init delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/wireshark-intro/wireshark-intro/instructions.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/xforge/config/keywords.txt delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/xforge/instr_config/instructions.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/xsite/config/keywords.txt delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/labs/xsite/instr_config/instructions.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/base_dockerfiles/Dockerfile.labtainer.base2 create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/base_dockerfiles/Dockerfile.labtainer.base3 create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/base_dockerfiles/Dockerfile.labtainer.bird create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/base_dockerfiles/Dockerfile.labtainer.centos6.xtra create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/base_dockerfiles/Dockerfile.labtainer.firefox3 create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/base_dockerfiles/Dockerfile.labtainer.ghidra create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/base_dockerfiles/Dockerfile.labtainer.juiceshop create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/base_dockerfiles/Dockerfile.labtainer.ldap create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/base_dockerfiles/Dockerfile.labtainer.ldap-client create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/base_dockerfiles/Dockerfile.labtainer.mariadb create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/base_dockerfiles/Dockerfile.labtainer.mariadb-client create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/base_dockerfiles/Dockerfile.labtainer.mysql create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/base_dockerfiles/Dockerfile.labtainer.netmon create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/base_dockerfiles/Dockerfile.labtainer.network.ssh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/base_dockerfiles/Dockerfile.labtainer.network.ssh2 create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/base_dockerfiles/Dockerfile.labtainer.network2 create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/base_dockerfiles/Dockerfile.labtainer.network3 create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/base_dockerfiles/Dockerfile.labtainer.owasp create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/base_dockerfiles/Dockerfile.labtainer.tap create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/base_dockerfiles/Dockerfile.labtainer.wireshark2 create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/bin/create-imodules.sh delete mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/bin/create_all.sh delete mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/bin/create_base_image.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/bin/create_bird_image.sh delete mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/bin/create_centos_image.sh delete mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/bin/create_firefox_image.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/bin/create_ghidra_image.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/bin/create_headless_tester.sh delete mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/bin/create_java_image.sh delete mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/bin/create_lamp_images.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/bin/create_master_base.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/bin/create_master_headless.sh delete mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/bin/create_network_image.sh delete mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/bin/create_wireshark_image.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/bin/exempt.txt create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/bin/hash-goals.py create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/bin/labedit create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/bin/mkbases.py create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/bin/rmbase.py delete mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/bin/svn_rm.py create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/services/_system/etc/systemd/system/httpserver.service create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/services/_system/usr/bin/MyHTTPServer.py create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/services/_system/var/www/html/index.html create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/services/web-server.tar create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/templates/dockerfiles/Dockerfile.template.base2.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/templates/dockerfiles/Dockerfile.template.base3.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/templates/dockerfiles/Dockerfile.template.centos6.student create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/templates/docs/read_first.txt delete mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/templates/instr_config/instructions.txt rename modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/{ => workspace}/system/README (100%) rename modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/{ => workspace}/system/bin/apt-source.sh (100%) create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/workspace/system/bin/firefox rename modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/{ => workspace}/system/bin/funbuffer (100%) rename modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/{ => workspace}/system/bin/funbuffer-8.5 (100%) create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/workspace/system/bin/labdump.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/workspace/system/bin/labdump_client.py create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/workspace/system/bin/labdump_server.py rename modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/{ => workspace}/system/bin/login (100%) rename modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/{ => workspace}/system/bin/set_default_gw.sh (100%) create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/workspace/system/bin/sharktap create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/workspace/system/bin/start_labdump.sh rename modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/{ => workspace}/system/bin/togglegw.sh (100%) rename modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/{ => workspace}/system/bin/wait_param.sh (100%) rename modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/{ => workspace}/system/bin/yum-source.sh (100%) rename modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/{ => workspace}/system/etc/nps.repo (100%) rename modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/{ => workspace}/system/etc/nps.sources.list (100%) rename modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/{ => workspace}/system/etc/rc.local (100%) create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/workspace/system/etc/services rename modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/{ => workspace}/system/etc/sudoers (100%) create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/workspace/system/etc/systemd/system/bird.service rename modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/{ => workspace}/system/etc/systemd/system/httpd.service (100%) create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/workspace/system/etc/systemd/system/labdump.service create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/workspace/system/etc/systemd/system/labdump_client.service rename modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/{ => workspace}/system/etc/systemd/system/mynotify.service (100%) create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/workspace/system/etc/xinetd.d/ssh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/workspace/system/etc/xinetd.d/telnet create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/workspace/system/lib/systemd/system/labdump.service create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/workspace/system/lib/systemd/system/labdump_client.service rename modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/{ => workspace}/system/lib/systemd/system/waitparam.service (100%) rename modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/{ => workspace}/system/lib/systemd/system/waitparam.service.cfs (100%) rename modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/{ => workspace}/system/sbin/mynotify.py (100%) rename modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/{ => workspace}/system/sbin/waitparam.sh (100%) rename modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/{ => workspace}/system/usr/share/man/man1.tar (100%) create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/designer/workspace/system/var/tmp/home.tar create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/gns3/rmContainer.py create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/labtainer-instructor/assess_bin/docwork.py delete mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/labtainer-instructor/bin/instructor.build.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/labtainer-instructor/bin/makepack create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/labtainer-instructor/bin/makepackui create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/labtainer-instructor/flask/README.txt create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/labtainer-instructor/flask/server.py create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/labtainer-instructor/flask/static/favicon.ico create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/labtainer-instructor/flask/static/labtainer5-sm.png create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/labtainer-instructor/flask/static/main.css create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/labtainer-instructor/flask/templates/error.html create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/labtainer-instructor/flask/templates/files.html create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/labtainer-instructor/flask/templates/goal.html create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/labtainer-instructor/flask/templates/goal_count_greater.html create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/labtainer-instructor/flask/templates/goal_during.html create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/labtainer-instructor/flask/templates/goals_config.html create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/labtainer-instructor/flask/templates/goals_json.html create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/labtainer-instructor/flask/templates/grades.html create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/labtainer-instructor/flask/templates/history.html create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/labtainer-instructor/flask/templates/home.html create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/labtainer-instructor/flask/templates/raw.html create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/labtainer-instructor/flask/templates/result.html create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/labtainer-instructor/flask/templates/result_table.html create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/labtainer-instructor/flask/templates/student.html create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/labtainer-instructor/flask/templates/ts.html create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/labtainer-student/bin/LocalBase.py create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/labtainer-student/bin/RemoteBase.py create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/labtainer-student/bin/dockerPull.py create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/labtainer-student/bin/imodule create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/labtainer-student/bin/keywords.py create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/labtainer-student/bin/labList.py create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/labtainer-student/bin/labpack create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/labtainer-student/bin/quiz create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/labtainer-student/bin/ratelimit.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/labtainer-student/bin/rebuild create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/labtainer-student/bin/registry.py create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/labtainer-student/lab_bin/dochown.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/labtainer-student/lab_bin/profile-display create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/labtainer-student/lab_sys/bin/set_default_gw.sh rename modules/utilities/unix/labtainers/files/Labtainers-master/scripts/labtainer-student/lab_sys/{lib => etc}/systemd/system/mynotify.service (74%) create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/labtainer-student/lab_sys/usr/sbin/capinout rename modules/utilities/unix/labtainers/files/Labtainers-master/scripts/labtainer-student/lab_sys/{ => usr}/sbin/capinout.sh (100%) rename modules/utilities/unix/labtainers/files/Labtainers-master/scripts/labtainer-student/lab_sys/{ => usr}/sbin/dhclient-labtainer (100%) rename modules/utilities/unix/labtainers/files/Labtainers-master/scripts/labtainer-student/lab_sys/{ => usr}/sbin/exec_wrap.sh (58%) rename modules/utilities/unix/labtainers/files/Labtainers-master/scripts/labtainer-student/lab_sys/{ => usr}/sbin/mynotify.py (77%) create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/scripts/remote/remote.py create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/setup_scripts/dev-pkg.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/setup_scripts/gnome-terminal.desktop create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/setup_scripts/install-docker-arch.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/setup_scripts/lab-completion.bash create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/setup_scripts/mkreg-tunnel.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/setup_scripts/pull_lab.py create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/setup_scripts/smoke-profile-add.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/setup_scripts/update-add-new.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/setup_scripts/update-add.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/setup_scripts/update-ubuntu.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/setup_scripts/vbox-share.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/testsets/bin/build_lab_test.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/testsets/bin/getLog.sh create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/testsets/bin/jenkinsPipeline.txt create mode 100644 modules/utilities/unix/labtainers/files/Labtainers-master/testsets/bin/skip_test.txt create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/testsets/bin/stopall.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/testsets/bin/test-ubuntu16.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/testsets/bin/test-ubuntu18.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/testsets/bin/test-ubuntu24.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/testsets/bin/testVMs.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/testsets/bin/testvm-do.sh create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/testsets/bin/vbox-client.py create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/testsets/bin/waitLog.py create mode 100755 modules/utilities/unix/labtainers/files/Labtainers-master/tool-src/capinout/capinout create mode 100644 outputlog diff --git a/modules/utilities/unix/desktop/kde_minimal/manifests/config.pp b/modules/utilities/unix/desktop/kde_minimal/manifests/config.pp index bd63e3106..f18f22352 100644 --- a/modules/utilities/unix/desktop/kde_minimal/manifests/config.pp +++ b/modules/utilities/unix/desktop/kde_minimal/manifests/config.pp @@ -54,7 +54,7 @@ class kde_minimal::config { $account = parsejson($raw_account) $username = $account['username'] - file { ["/home/$username/", "/home/$username/.config/"]: + file { ["/home/$username/", "/home/$username/.config/", "/home/$username/.config/autostart/"]: ensure => directory, owner => $username, group => $username, diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/MakepackUI/README.txt b/modules/utilities/unix/labtainers/files/Labtainers-master/MakepackUI/README.txt new file mode 100644 index 000000000..5324f5133 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/MakepackUI/README.txt @@ -0,0 +1,2 @@ +A GUI for managing Labpacks, replacing the functions of makepack. +Program created by Samuel Liao, Summer Intern '21. diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/MakepackUI/bin/buildUI2.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/MakepackUI/bin/buildUI2.sh new file mode 100755 index 000000000..b17ca4be7 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/MakepackUI/bin/buildUI2.sh @@ -0,0 +1,10 @@ +#!/bin/bash +# +# Rebuild the Labtianers Lab Editor UI +# Use -n to supress running the UI after rebuild. +#/src/main/java/newpackage +javac -classpath json-simple-1.1.1.jar ../src/main/java/newpackage/NewJFrame.java -d . -Xlint:unchecked || exit +jar cmf makepackui.mf ./makepackui.jar newpackage/*.class ../src/main/resources/* || exit +if [[ "$1" != "-n" ]]; then + java -jar makepackui.jar & +fi diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/MakepackUI/bin/json-simple-1.1.1.jar b/modules/utilities/unix/labtainers/files/Labtainers-master/MakepackUI/bin/json-simple-1.1.1.jar new file mode 100755 index 0000000000000000000000000000000000000000..66347a6c86b7d6442358ca7643e4dc484fb01866 GIT binary patch literal 23737 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 A{Qv*} literal 0 HcmV?d00001 diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/MakepackUI/bin/makepackui.mf b/modules/utilities/unix/labtainers/files/Labtainers-master/MakepackUI/bin/makepackui.mf new file mode 100644 index 000000000..d15ce6680 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/MakepackUI/bin/makepackui.mf @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Class-Path: json-simple-1.1.1.jar +Main-Class: newpackage/NewJFrame diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/MakepackUI/pom.xml b/modules/utilities/unix/labtainers/files/Labtainers-master/MakepackUI/pom.xml new file mode 100644 index 000000000..da35ae44f --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/MakepackUI/pom.xml @@ -0,0 +1,26 @@ + + + 4.0.0 + com.mycompany + MakepackUI + 1.0-SNAPSHOT + jar + + UTF-8 + 1.8 + 1.8 + + + + + com.googlecode.json-simple + json-simple + 1.1.1 + + + com.fasterxml.jackson.core + jackson-databind + 2.12.7.1 + + + \ No newline at end of file diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/MakepackUI/src/main/java/newpackage/NewJFrame.form b/modules/utilities/unix/labtainers/files/Labtainers-master/MakepackUI/src/main/java/newpackage/NewJFrame.form new file mode 100644 index 000000000..89fb74d97 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/MakepackUI/src/main/java/newpackage/NewJFrame.form @@ -0,0 +1,908 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/MakepackUI/src/main/java/newpackage/NewJFrame.java b/modules/utilities/unix/labtainers/files/Labtainers-master/MakepackUI/src/main/java/newpackage/NewJFrame.java new file mode 100644 index 000000000..6bbc09622 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/MakepackUI/src/main/java/newpackage/NewJFrame.java @@ -0,0 +1,1626 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package newpackage; + +/** + * + * @author student + */ + +import java.awt.Color; +import java.awt.event.KeyEvent; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.io.IOException; +import java.io.FileWriter; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.concurrent.Executors; +import java.util.function.Consumer; +import javax.imageio.ImageIO; +import javax.swing.ImageIcon; +import javax.swing.JFrame; +import org.json.simple.JSONObject; +import org.json.simple.JSONArray; +import org.json.simple.parser.JSONParser; +import org.json.simple.parser.ParseException; +//this is for the filechooser, making sure it choose files with .labpack +class MyCustomFilter extends javax.swing.filechooser.FileFilter { + @Override + public boolean accept(java.io.File file) { + // Allow only directories, or files with ".labpack" extension + return file.isDirectory() || file.getAbsolutePath().endsWith(".labpack"); + } + @Override + public String getDescription() { + // This description will be displayed in the dialog, + // hard-coded = ugly, should be done via I18N + return "Text documents (*.labpack)"; + } +} + + +public class NewJFrame extends javax.swing.JFrame { + +private ArrayList filelist = new ArrayList(); //this is for storing the list of existing labs to look for + +String labdir = System.getenv("LABTAINER_DIR"); +private String labpack_path = labdir + java.io.File.separator + "labpacks";//making a String name that defines the path to labpacks directory + +private static java.util.HashMap labnotes = new java.util.HashMap(); + /** + * Creates new form NewJFrame + */ + private static java.util.HashMap labpack = new java.util.HashMap();//making a dictionary to storing labpack contents the the UI currently shows + + public void sorting(javax.swing.JList list){ //this is for sorting the elements in list models alphabetically + javax.swing.ListModel model= list.getModel(); + int n = model.getSize(); + + String [] data = new String[n]; + + for(int i=0; i mode){ + mode.clear(); + String labdir = System.getenv("LABTAINER_DIR"); + + + String labpath = labdir + java.io.File.separator + "labs"; + + java.io.File path = new java.io.File(labpath); + String contents[] = path.list(); + for(int i=0; i labs = new ArrayList(); + java.util.Set keys = labnotes.keySet(); + java.util.List listKeys = new ArrayList(keys); + for(int i =0; i labdes = new java.util.HashMap(); + labdes.put("name",labsadded.getElementAt(i)); + labdes.put("notes",labnotes.get(labsadded.getElementAt(i))); + labs.add(labdes); + } + JSONObject Objects = new JSONObject(); + + Objects.put("name",labpack.get("name")); + Objects.put("labs", labs); + Objects.put("description",labpack.get("description")); + if (labpack.containsKey("order")){ + Objects.put("order",Long.parseLong(labpack.get("order"))); + } + try { + if(labpack.containsKey("name")){ + FileWriter file = new FileWriter(path+java.io.File.separator+labpack.get("name")+".labpack"); + file.write(Objects.toJSONString()); + file.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + //debug for creating json objects + //System.out.println("JSON file created: "+Objects); + } + + //Right as we close out of the frame, a method will be called to check if something changed or a new labpack was created. + //the dialog will ask if you want to save. + private void CloseWindow(){ + this.addWindowListener(new java.awt.event.WindowAdapter() { + @Override + public void windowClosing(java.awt.event.WindowEvent e) { + saving("/tmp"); + if(labpack.containsKey("name")){ + java.io.File labpac = new java.io.File(labpack_path+java.io.File.separator+labpack.get("name")+".labpack"); + if(!labpac.exists() || SomethingChanged()){ + + + int choose = javax.swing.JOptionPane.showConfirmDialog(null, + "You have made changes to the labpack", + "keep chages?", javax.swing.JOptionPane.YES_NO_OPTION, + javax.swing.JOptionPane.INFORMATION_MESSAGE); + if (choose == javax.swing.JOptionPane.YES_OPTION) { + saving(labpack_path); + e.getWindow().dispose(); + System.exit(0); + System.out.println("close"); + + } else if(choose == javax.swing.JOptionPane.NO_OPTION) { + + e.getWindow().dispose(); + System.exit(0); + System.out.println("close"); + } else { + System.out.println("do nothing"); + } + + } + else{ + e.getWindow().dispose(); + System.exit(0); + } + + } + else{ + e.getWindow().dispose(); + System.exit(0); + } + + } + + + }); + } + public NewJFrame() { + + initComponents(); + //defining list models, setting them to panels. + lab = new javax.swing.DefaultListModel(); + labslabel = new javax.swing.DefaultListModel(); + labsadded = new javax.swing.DefaultListModel(); + keys = new javax.swing.DefaultListModel(); + labs_in_labpack.setModel(labsadded); + lablist.setModel(lab); + keywords.setModel(keys); + + String labdir = System.getenv("LABTAINER_DIR"); + //for fileChooser to start with current directory according to $LABTAINER_DIR + java.io.File labpackDir = new java.io.File(labdir + java.io.File.separator+ "labpacks"); + fileChooser.setCurrentDirectory(labpackDir); + + + String labpath = labdir + java.io.File.separator + "labs"; + + java.io.File path = new java.io.File(labpath); + String contents[] = path.list(); + + //For each lab look at keywords + for(int i=0; i//GEN-BEGIN:initComponents + private void initComponents() { + + fileChooser = new javax.swing.JFileChooser(); + labpackinfo = new javax.swing.JDialog(); + jPanel1 = new javax.swing.JPanel(); + Create = new javax.swing.JButton(); + TextName = new javax.swing.JTextField(); + TextOrder = new javax.swing.JTextField(); + jLabel1 = new javax.swing.JLabel(); + jLabel2 = new javax.swing.JLabel(); + jLabel3 = new javax.swing.JLabel(); + jScrollPane3 = new javax.swing.JScrollPane(); + TextDescription = new javax.swing.JTextArea(); + order_and_description = new javax.swing.JDialog(); + jPanel2 = new javax.swing.JPanel(); + save_OandD = new javax.swing.JButton(); + TextOrder1 = new javax.swing.JTextField(); + jLabel5 = new javax.swing.JLabel(); + jLabel6 = new javax.swing.JLabel(); + jScrollPane1 = new javax.swing.JScrollPane(); + TextDescription1 = new javax.swing.JTextArea(); + listlabpacks = new javax.swing.JDialog(); + jPanel3 = new javax.swing.JPanel(); + jScrollPane2 = new javax.swing.JScrollPane(); + labpacktextbox = new javax.swing.JTextArea(); + jPanel4 = new javax.swing.JPanel(); + labsPane = new javax.swing.JScrollPane(); + labs_in_labpack = new javax.swing.JList<>(); + labnotePane = new javax.swing.JScrollPane(); + notes_box = new javax.swing.JTextPane(); + AddNoteButton = new javax.swing.JButton(); + RemoveButton = new javax.swing.JButton(); + Move_Down_Button = new javax.swing.JButton(); + Move_Up_Button = new javax.swing.JButton(); + jPanel5 = new javax.swing.JPanel(); + labdescriptionPane = new javax.swing.JScrollPane(); + description_box = new javax.swing.JTextPane(); + ClearButton = new javax.swing.JButton(); + LablistlPane = new javax.swing.JScrollPane(); + lablist = new javax.swing.JList<>(); + KeyPane = new javax.swing.JScrollPane(); + keywords = new javax.swing.JList<>(); + FindButton = new javax.swing.JButton(); + logo = new javax.swing.JLabel(); + jPanel9 = new javax.swing.JPanel(); + SaveIcon = new javax.swing.JButton(); + jMenuBar1 = new javax.swing.JMenuBar(); + jMenu1 = new javax.swing.JMenu(); + OpenButton = new javax.swing.JMenuItem(); + NewButton = new javax.swing.JMenuItem(); + SaveButton = new javax.swing.JMenuItem(); + QuitBUtton = new javax.swing.JMenuItem(); + jMenu2 = new javax.swing.JMenu(); + Order_Description = new javax.swing.JMenuItem(); + ViewButton = new javax.swing.JMenu(); + list_labpacks = new javax.swing.JMenuItem(); + ChangeFont = new javax.swing.JMenu(); + InreaseFont = new javax.swing.JMenuItem(); + DecreaseFont = new javax.swing.JMenuItem(); + + fileChooser.setCurrentDirectory(new java.io.File("/home/student/labtainer/trunk/labpacks")); + fileChooser.setFileFilter(new MyCustomFilter()); + + labpackinfo.addKeyListener(new java.awt.event.KeyAdapter() { + public void keyPressed(java.awt.event.KeyEvent evt) { + labpackinfoKeyPressed(evt); + } + }); + + jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("Labpack")); + + Create.setText("Create"); + Create.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + CreateActionPerformed(evt); + } + }); + + TextName.addKeyListener(new java.awt.event.KeyAdapter() { + public void keyPressed(java.awt.event.KeyEvent evt) { + TextNameKeyPressed(evt); + } + public void keyTyped(java.awt.event.KeyEvent evt) { + TextNameKeyTyped(evt); + } + }); + + TextOrder.addKeyListener(new java.awt.event.KeyAdapter() { + public void keyTyped(java.awt.event.KeyEvent evt) { + TextOrderKeyTyped(evt); + } + }); + + jLabel1.setText("Name:"); + + jLabel2.setText("Description:"); + + jLabel3.setText("Order:"); + + TextDescription.setColumns(20); + TextDescription.setRows(5); + jScrollPane3.setViewportView(TextDescription); + + javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); + jPanel1.setLayout(jPanel1Layout); + jPanel1Layout.setHorizontalGroup( + jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel1Layout.createSequentialGroup() + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel1Layout.createSequentialGroup() + .addGap(35, 35, 35) + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jLabel2) + .addComponent(jLabel1) + .addComponent(jLabel3)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(TextName, javax.swing.GroupLayout.DEFAULT_SIZE, 440, Short.MAX_VALUE) + .addComponent(TextOrder, javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(jScrollPane3))) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup() + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(Create))) + .addContainerGap()) + ); + jPanel1Layout.setVerticalGroup( + jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel1Layout.createSequentialGroup() + .addGap(39, 39, 39) + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jLabel1, javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(TextName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(18, 18, 18) + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jLabel2) + .addComponent(jScrollPane3, javax.swing.GroupLayout.DEFAULT_SIZE, 137, Short.MAX_VALUE)) + .addGap(18, 18, 18) + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel3) + .addComponent(TextOrder, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(Create) + .addContainerGap()) + ); + + javax.swing.GroupLayout labpackinfoLayout = new javax.swing.GroupLayout(labpackinfo.getContentPane()); + labpackinfo.getContentPane().setLayout(labpackinfoLayout); + labpackinfoLayout.setHorizontalGroup( + labpackinfoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + ); + labpackinfoLayout.setVerticalGroup( + labpackinfoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + ); + + jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder("Labpack")); + + save_OandD.setText("Save"); + save_OandD.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + save_OandDActionPerformed(evt); + } + }); + + TextOrder1.addKeyListener(new java.awt.event.KeyAdapter() { + public void keyTyped(java.awt.event.KeyEvent evt) { + TextOrder1KeyTyped(evt); + } + }); + + jLabel5.setText("Description:"); + + jLabel6.setText("Order:"); + + TextDescription1.setColumns(20); + TextDescription1.setRows(5); + TextDescription1.addKeyListener(new java.awt.event.KeyAdapter() { + public void keyPressed(java.awt.event.KeyEvent evt) { + TextDescription1KeyPressed(evt); + } + }); + jScrollPane1.setViewportView(TextDescription1); + + javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2); + jPanel2.setLayout(jPanel2Layout); + jPanel2Layout.setHorizontalGroup( + jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel2Layout.createSequentialGroup() + .addContainerGap() + .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel2Layout.createSequentialGroup() + .addGap(0, 0, Short.MAX_VALUE) + .addComponent(save_OandD)) + .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 399, Short.MAX_VALUE) + .addGroup(jPanel2Layout.createSequentialGroup() + .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jLabel5) + .addComponent(jLabel6)) + .addGap(0, 0, Short.MAX_VALUE)) + .addComponent(TextOrder1)) + .addContainerGap()) + ); + jPanel2Layout.setVerticalGroup( + jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup() + .addGap(20, 20, 20) + .addComponent(jLabel5) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 146, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jLabel6) + .addGap(9, 9, 9) + .addComponent(TextOrder1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(save_OandD) + .addGap(8, 8, 8)) + ); + + javax.swing.GroupLayout order_and_descriptionLayout = new javax.swing.GroupLayout(order_and_description.getContentPane()); + order_and_description.getContentPane().setLayout(order_and_descriptionLayout); + order_and_descriptionLayout.setHorizontalGroup( + order_and_descriptionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + ); + order_and_descriptionLayout.setVerticalGroup( + order_and_descriptionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + ); + + labpacktextbox.setColumns(20); + labpacktextbox.setFont(new java.awt.Font("Dialog", 0, 14)); // NOI18N + labpacktextbox.setRows(5); + labpacktextbox.addKeyListener(new java.awt.event.KeyAdapter() { + public void keyPressed(java.awt.event.KeyEvent evt) { + labpacktextboxKeyPressed(evt); + } + }); + jScrollPane2.setViewportView(labpacktextbox); + + javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3); + jPanel3.setLayout(jPanel3Layout); + jPanel3Layout.setHorizontalGroup( + jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel3Layout.createSequentialGroup() + .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 767, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(0, 0, Short.MAX_VALUE)) + ); + jPanel3Layout.setVerticalGroup( + jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel3Layout.createSequentialGroup() + .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 539, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(0, 0, Short.MAX_VALUE)) + ); + + javax.swing.GroupLayout listlabpacksLayout = new javax.swing.GroupLayout(listlabpacks.getContentPane()); + listlabpacks.getContentPane().setLayout(listlabpacksLayout); + listlabpacksLayout.setHorizontalGroup( + listlabpacksLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jPanel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + ); + listlabpacksLayout.setVerticalGroup( + listlabpacksLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jPanel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + ); + + setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); + setTitle("makepack"); + + jPanel4.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED)); + + labsPane.setBorder(javax.swing.BorderFactory.createTitledBorder("labs in labpack")); + + labs_in_labpack.setModel(new javax.swing.AbstractListModel() { + String[] strings = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" }; + public int getSize() { return strings.length; } + public String getElementAt(int i) { return strings[i]; } + }); + labs_in_labpack.setNextFocusableComponent(Move_Up_Button); + labs_in_labpack.addListSelectionListener(new javax.swing.event.ListSelectionListener() { + public void valueChanged(javax.swing.event.ListSelectionEvent evt) { + labs_in_labpackValueChanged(evt); + } + }); + labsPane.setViewportView(labs_in_labpack); + + labnotePane.setBorder(javax.swing.BorderFactory.createTitledBorder("notes")); + + notes_box.setFocusCycleRoot(false); + notes_box.setNextFocusableComponent(AddNoteButton); + labnotePane.setViewportView(notes_box); + + AddNoteButton.setText("Save"); + AddNoteButton.setToolTipText("This saves changes to any notes for a lab."); + AddNoteButton.setNextFocusableComponent(description_box); + AddNoteButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + AddNoteButtonActionPerformed(evt); + } + }); + + RemoveButton.setText("Remove"); + RemoveButton.setToolTipText("This button removes any selected labs from the labpack."); + RemoveButton.setNextFocusableComponent(notes_box); + RemoveButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + RemoveButtonActionPerformed(evt); + } + }); + + Move_Down_Button.setText("\\/"); + Move_Down_Button.setToolTipText("Move a lab down in the labpack."); + Move_Down_Button.setName(""); // NOI18N + Move_Down_Button.setNextFocusableComponent(RemoveButton); + Move_Down_Button.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + Move_Down_ButtonActionPerformed(evt); + } + }); + + Move_Up_Button.setText("/\\"); + Move_Up_Button.setToolTipText("Move a lab up in the labpack."); + Move_Up_Button.setNextFocusableComponent(Move_Down_Button); + Move_Up_Button.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + Move_Up_ButtonActionPerformed(evt); + } + }); + + javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4); + jPanel4.setLayout(jPanel4Layout); + jPanel4Layout.setHorizontalGroup( + jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel4Layout.createSequentialGroup() + .addGap(24, 24, 24) + .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(labnotePane) + .addComponent(AddNoteButton, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 77, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel4Layout.createSequentialGroup() + .addComponent(labsPane, javax.swing.GroupLayout.DEFAULT_SIZE, 210, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(Move_Down_Button, javax.swing.GroupLayout.PREFERRED_SIZE, 44, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(Move_Up_Button, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 45, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(RemoveButton)) + .addGap(5, 5, 5))) + .addContainerGap()) + ); + jPanel4Layout.setVerticalGroup( + jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel4Layout.createSequentialGroup() + .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel4Layout.createSequentialGroup() + .addGap(24, 24, 24) + .addComponent(Move_Up_Button) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(Move_Down_Button, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(176, 176, 176) + .addComponent(RemoveButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 109, Short.MAX_VALUE)) + .addGroup(jPanel4Layout.createSequentialGroup() + .addContainerGap() + .addComponent(labsPane) + .addGap(30, 30, 30))) + .addComponent(labnotePane, javax.swing.GroupLayout.DEFAULT_SIZE, 145, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(AddNoteButton, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(23, 23, 23)) + ); + + jPanel5.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED)); + + labdescriptionPane.setBorder(javax.swing.BorderFactory.createTitledBorder("lab description")); + + description_box.setFocusCycleRoot(false); + description_box.setNextFocusableComponent(keywords); + labdescriptionPane.setViewportView(description_box); + + ClearButton.setText("Clear"); + ClearButton.setToolTipText("This refreshes the lab list so that user can see the list of all labs after find."); + ClearButton.setNextFocusableComponent(labs_in_labpack); + ClearButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + ClearButtonActionPerformed(evt); + } + }); + + LablistlPane.setBorder(javax.swing.BorderFactory.createTitledBorder("lab list")); + + lablist.setModel(new javax.swing.AbstractListModel() { + String[] strings = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" }; + public int getSize() { return strings.length; } + public String getElementAt(int i) { return strings[i]; } + }); + lablist.setToolTipText("Double click to add lab to labpack."); + lablist.setNextFocusableComponent(ClearButton); + lablist.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + lablistMouseClicked(evt); + } + }); + lablist.addKeyListener(new java.awt.event.KeyAdapter() { + public void keyPressed(java.awt.event.KeyEvent evt) { + lablistKeyPressed(evt); + } + }); + lablist.addListSelectionListener(new javax.swing.event.ListSelectionListener() { + public void valueChanged(javax.swing.event.ListSelectionEvent evt) { + lablistValueChanged(evt); + } + }); + LablistlPane.setViewportView(lablist); + + KeyPane.setBorder(javax.swing.BorderFactory.createTitledBorder("keywords")); + + keywords.setModel(new javax.swing.AbstractListModel() { + String[] strings = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" }; + public int getSize() { return strings.length; } + public String getElementAt(int i) { return strings[i]; } + }); + keywords.setFocusCycleRoot(true); + keywords.setNextFocusableComponent(FindButton); + KeyPane.setViewportView(keywords); + + FindButton.setText("Find"); + FindButton.setToolTipText("This button filters the lab list panel so that the lablist shows which labs have the selected keywords."); + FindButton.setNextFocusableComponent(lablist); + FindButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + FindButtonActionPerformed(evt); + } + }); + + javax.swing.GroupLayout jPanel5Layout = new javax.swing.GroupLayout(jPanel5); + jPanel5.setLayout(jPanel5Layout); + jPanel5Layout.setHorizontalGroup( + jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel5Layout.createSequentialGroup() + .addContainerGap() + .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel5Layout.createSequentialGroup() + .addComponent(labdescriptionPane) + .addContainerGap()) + .addGroup(jPanel5Layout.createSequentialGroup() + .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel5Layout.createSequentialGroup() + .addComponent(KeyPane) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)) + .addGroup(jPanel5Layout.createSequentialGroup() + .addComponent(FindButton, javax.swing.GroupLayout.PREFERRED_SIZE, 84, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(83, 83, 83))) + .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel5Layout.createSequentialGroup() + .addComponent(ClearButton, javax.swing.GroupLayout.PREFERRED_SIZE, 73, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(0, 92, Short.MAX_VALUE)) + .addGroup(jPanel5Layout.createSequentialGroup() + .addComponent(LablistlPane) + .addGap(6, 6, 6)))))) + ); + jPanel5Layout.setVerticalGroup( + jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel5Layout.createSequentialGroup() + .addContainerGap() + .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(LablistlPane, javax.swing.GroupLayout.DEFAULT_SIZE, 303, Short.MAX_VALUE) + .addComponent(KeyPane)) + .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel5Layout.createSequentialGroup() + .addGap(12, 12, 12) + .addComponent(FindButton)) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel5Layout.createSequentialGroup() + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(ClearButton))) + .addGap(18, 18, 18) + .addComponent(labdescriptionPane, javax.swing.GroupLayout.DEFAULT_SIZE, 189, Short.MAX_VALUE) + .addGap(30, 30, 30)) + ); + + logo.setText("jLabel17"); + + jPanel9.setBorder(javax.swing.BorderFactory.createEtchedBorder()); + + SaveIcon.setFocusable(false); + SaveIcon.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + SaveIconActionPerformed(evt); + } + }); + + javax.swing.GroupLayout jPanel9Layout = new javax.swing.GroupLayout(jPanel9); + jPanel9.setLayout(jPanel9Layout); + jPanel9Layout.setHorizontalGroup( + jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel9Layout.createSequentialGroup() + .addComponent(SaveIcon, javax.swing.GroupLayout.PREFERRED_SIZE, 38, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(0, 0, Short.MAX_VALUE)) + ); + jPanel9Layout.setVerticalGroup( + jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel9Layout.createSequentialGroup() + .addGap(0, 0, Short.MAX_VALUE) + .addComponent(SaveIcon, javax.swing.GroupLayout.PREFERRED_SIZE, 38, javax.swing.GroupLayout.PREFERRED_SIZE)) + ); + + jMenu1.setMnemonic('F'); + jMenu1.setText("File"); + jMenu1.setToolTipText(""); + + OpenButton.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_O, java.awt.event.InputEvent.CTRL_DOWN_MASK)); + OpenButton.setText("Open"); + OpenButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + OpenButtonActionPerformed(evt); + } + }); + jMenu1.add(OpenButton); + + NewButton.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_N, java.awt.event.InputEvent.CTRL_DOWN_MASK)); + NewButton.setText("New"); + NewButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + NewButtonActionPerformed(evt); + } + }); + jMenu1.add(NewButton); + + SaveButton.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_S, java.awt.event.InputEvent.CTRL_DOWN_MASK)); + SaveButton.setText("Save"); + SaveButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + SaveButtonActionPerformed(evt); + } + }); + jMenu1.add(SaveButton); + + QuitBUtton.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_Q, java.awt.event.InputEvent.CTRL_DOWN_MASK)); + QuitBUtton.setText("Quit"); + QuitBUtton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + QuitBUttonActionPerformed(evt); + } + }); + jMenu1.add(QuitBUtton); + + jMenuBar1.add(jMenu1); + + jMenu2.setMnemonic('E'); + jMenu2.setText("Edit"); + + Order_Description.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_D, java.awt.event.InputEvent.CTRL_DOWN_MASK)); + Order_Description.setText("Order & Description"); + Order_Description.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + Order_DescriptionActionPerformed(evt); + } + }); + jMenu2.add(Order_Description); + + jMenuBar1.add(jMenu2); + + ViewButton.setMnemonic('V'); + ViewButton.setText("View"); + + list_labpacks.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_L, java.awt.event.InputEvent.CTRL_DOWN_MASK)); + list_labpacks.setText("labpacks"); + list_labpacks.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + list_labpacksActionPerformed(evt); + } + }); + ViewButton.add(list_labpacks); + + ChangeFont.setMnemonic('S'); + ChangeFont.setText("Font Size"); + + InreaseFont.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_EQUALS, java.awt.event.InputEvent.CTRL_DOWN_MASK)); + InreaseFont.setText("Increase"); + InreaseFont.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + InreaseFontActionPerformed(evt); + } + }); + ChangeFont.add(InreaseFont); + + DecreaseFont.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_MINUS, java.awt.event.InputEvent.CTRL_DOWN_MASK)); + DecreaseFont.setText("Decrease"); + DecreaseFont.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + DecreaseFontActionPerformed(evt); + } + }); + ChangeFont.add(DecreaseFont); + + ViewButton.add(ChangeFont); + + jMenuBar1.add(ViewButton); + + setJMenuBar(jMenuBar1); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(jPanel5, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jPanel4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(logo, javax.swing.GroupLayout.PREFERRED_SIZE, 220, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(32, 32, 32)) + .addComponent(jPanel9, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(jPanel9, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jPanel4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(layout.createSequentialGroup() + .addGap(56, 56, 56) + .addComponent(logo) + .addContainerGap()) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addComponent(jPanel5, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addContainerGap()))) + ); + + pack(); + }// //GEN-END:initComponents + //when clicked it will call the refresh function to refresh labs + private void ClearButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ClearButtonActionPerformed + refresh(lab); + sorting(lablist); + description_box.setText("");//for the lab description textbox + }//GEN-LAST:event_ClearButtonActionPerformed + + private void RemoveButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_RemoveButtonActionPerformed + //this is for the remove button that will remove any selcted lab elements from the labs_in_labpack list model; + java.util.List value = labs_in_labpack.getSelectedValuesList(); + + + for(int i=0; i 0){ + model.remove(itemIndex);// remove selected item from the list + model.add(itemIndex - 1, selectedItem);// add the item to a new position in the list + labs_in_labpack.setSelectedIndex(itemIndex - 1);// set selection to the new item + } + ChangeStatusButtonColor(); + }//GEN-LAST:event_Move_Up_ButtonActionPerformed +//move a lab in the labs in labpack model down in the order + private void Move_Down_ButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_Move_Down_ButtonActionPerformed + String selectedItem = labs_in_labpack.getSelectedValue();//get item value + int itemIndex = labs_in_labpack.getSelectedIndex();// get item index + javax.swing.DefaultListModel model = (javax.swing.DefaultListModel)labs_in_labpack.getModel();// get list model + + if(itemIndex < model.getSize() -1){ + model.remove(itemIndex);// remove selected item from the list + model.add(itemIndex + 1, selectedItem);// add the item to a new position in the list + labs_in_labpack.setSelectedIndex(itemIndex + 1);// set selection to the new item + } + ChangeStatusButtonColor(); + }//GEN-LAST:event_Move_Down_ButtonActionPerformed + + private void OpenButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_OpenButtonActionPerformed + + //refresh(labs); + + int returnVal = fileChooser.showOpenDialog(this); + if (returnVal == fileChooser.APPROVE_OPTION) { + java.io.File file = fileChooser.getSelectedFile(); + savepackname(file.getName()); + DoesOPEN(file); + } else { + //System.out.println("File access cancelled by user."); + ; + } + }//GEN-LAST:event_OpenButtonActionPerformed + //set dialog for new labpack to visible. + private void NewButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_NewButtonActionPerformed + labpackinfo.setVisible(rootPaneCheckingEnabled); + labpackinfo.pack(); + }//GEN-LAST:event_NewButtonActionPerformed +//saves + private void SaveButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_SaveButtonActionPerformed + this.saving(labpack_path);//this save is for saving labpacks changes to the actual + ChangeStatusButtonColor();//changes SaveIcon color to Gray since changes are saved + }//GEN-LAST:event_SaveButtonActionPerformed + + private void FindButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_FindButtonActionPerformed + //find a display labs with keywords that are selected. + java.util.List selectedlist = keywords.getSelectedValuesList(); + + lab.clear(); + + for(int i=0; i keywordslist = new ArrayList (); + keywordslist.clear(); + while (Freader.hasNextLine()) { + String line = Freader.nextLine().trim(); + keywordslist.add(line); + + } + + if (keywordslist.containsAll(selectedlist)){ + String labname = filelist.get(i).getParentFile().getParentFile().getName(); + //the keywords.txt parent is config, and config's parent is the name of the lab + lab.addElement(labname); + } + }catch (java.io.FileNotFoundException e) { + System.out.println("An error occurred."); + e.printStackTrace(); + } + + } + sorting(lablist); + + + + lablist.setModel(lab); + + + + + + lablist.revalidate(); + lablist.repaint(); + + + }//GEN-LAST:event_FindButtonActionPerformed +//This is for whenever you change the selection for the lablist model, the lab's description appears + private void lablistValueChanged(javax.swing.event.ListSelectionEvent evt) {//GEN-FIRST:event_lablistValueChanged + String word = lablist.getSelectedValue(); + //this is a debug: System.out.println("value change to: "+ word); + String labdir = System.getenv("LABTAINER_DIR"); + String path = labdir + java.io.File.separator + "labs" + java.io.File.separator + word +java.io.File.separator+ "config" + java.io.File.separator + "about.txt"; + java.io.File aboutpath = new java.io.File(path); + try{ + java.util.Scanner Freader = new java.util.Scanner(aboutpath); + while (Freader.hasNextLine()) { + String data = Freader.nextLine().trim(); + description_box.setText(data); + + + + } + }catch (java.io.FileNotFoundException e) { + // System.out.println("about.txt missing: " + path); + //e.printStackTrace(); + } + }//GEN-LAST:event_lablistValueChanged +//this is for whenever a lab in the the labs_in_labpack model is selected, it will display its notes in the textbox + private void labs_in_labpackValueChanged(javax.swing.event.ListSelectionEvent evt) {//GEN-FIRST:event_labs_in_labpackValueChanged + String lab = labs_in_labpack.getSelectedValue(); + String description = labnotes.get(lab); + notes_box.setText(description); + }//GEN-LAST:event_labs_in_labpackValueChanged + + private void lablistMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_lablistMouseClicked + javax.swing.JList list = (javax.swing.JList)evt.getSource(); + if (evt.getClickCount() == 2) { + int index = list.locationToIndex(evt.getPoint()); + String name = lablist.getModel().getElementAt(index); + //System.out.println("index: "+name); + if(labsadded.contains(name)==false) { + labsadded.addElement(name); + labnotes.put(name, ""); + } + ChangeStatusButtonColor();//this will changes the color of the SaveIcon button depending on changes + } + }//GEN-LAST:event_lablistMouseClicked +//creating a new labpack from a dialog, it will take the name, description and order but will not be saved if you don't click save. + private void CreateActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_CreateActionPerformed + + labsadded.clear(); + labnotes.clear(); + String pack_name = TextName.getText(); + if (pack_name.length() !=0){ + labpack.put("name", pack_name); + + String des_name = TextDescription.getText(); + labpack.put("description", des_name); + + + String order_name = TextOrder.getText().toString(); + if (order_name.length() !=0){ + labpack.put("order", order_name); + } + if (order_name.length() ==0){ + labpack.remove("order"); + } + this.setTitle("makepack: "+pack_name); + labpackinfo.setVisible(false); + TextName.setText(""); + TextDescription.setText(""); + TextOrder.setText(""); + + saving("/tmp"); + + savepackname(labpack.get("name")+".labpack"); + } + else{ + TextName.setText(""); + TextDescription.setText(""); + TextOrder.setText(""); + labpack.clear(); + labpackinfo.setVisible(false); + this.setTitle("makepack"); + savepackname("empty");//this will just make sure that if you create a labpack with no name, and then leave, once you open the UI again it will show an empty labpack. + } + + //System.out.println(labpack.get("name")); + ChangeStatusButtonColor();//calls method for changing the SaveIcon buttons color depending on Something_Changed + }//GEN-LAST:event_CreateActionPerformed + + private void TextNameKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_TextNameKeyTyped + char c = evt.getKeyChar(); + if(c == ' '){ + evt.consume(); + } + }//GEN-LAST:event_TextNameKeyTyped + + private void TextOrderKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_TextOrderKeyTyped + char c = evt.getKeyChar(); + if(!Character.isDigit(c)){ + evt.consume(); + } + + }//GEN-LAST:event_TextOrderKeyTyped +//when you click on edit order & description make dialog visible and set textboxes for order and description + private void Order_DescriptionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_Order_DescriptionActionPerformed + TextOrder1.setText(labpack.get("order")); + TextDescription1.setText(labpack.get("description")); + order_and_description.setVisible(rootPaneCheckingEnabled); + order_and_description.pack(); + + + }//GEN-LAST:event_Order_DescriptionActionPerformed +//the save button action method is for saving changes made to description and order in the order and description dialog + private void save_OandDActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_save_OandDActionPerformed + String order = TextOrder1.getText(); + + if (order.length() != 0){ + labpack.put("order", order); + } + if (order.length() ==0){ + labpack.remove("order"); + } + String description = TextDescription1.getText(); + labpack.put("description", description); + order_and_description.setVisible(false); + ChangeStatusButtonColor(); + }//GEN-LAST:event_save_OandDActionPerformed +//this prevents user from typing letter in the order textbox that requires digits + private void TextOrder1KeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_TextOrder1KeyTyped + char c = evt.getKeyChar(); + if(!Character.isDigit(c)){ + evt.consume(); + } + }//GEN-LAST:event_TextOrder1KeyTyped +//to view the list of labpacks click on view then labpacks + public void doCommand(String cmd){ + ProcessBuilder builder = new ProcessBuilder(); + builder.command("sh", "-c", cmd); + try{ + Process process = builder.start(); + StreamGobbler streamGobbler = new StreamGobbler(process.getInputStream(), System.out::println); + Executors.newSingleThreadExecutor().submit(streamGobbler); + int exitCode = process.waitFor(); + assert exitCode == 0; + } catch (IOException e){ + System.out.println(e); + } catch (InterruptedException ie){ + System.out.println(ie); + } + } + private void list_labpacksActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_list_labpacksActionPerformed + String labdir = System.getenv("LABTAINER_DIR"); + String instructor_path = labdir + java.io.File.separator + "scripts"+java.io.File.separator +"labtainer-instructor"; + String labpack_path = "bin" +java.io.File.separator +"makepack"; + //System.out.println(labpack_path); + try{ + ProcessBuilder pb = new ProcessBuilder(labpack_path); + pb.directory(new java.io.File(instructor_path)); + pb.redirectErrorStream(true); + Process process = pb.start(); + int waitfor = process.waitFor(); + BufferedReader reader = + new BufferedReader(new InputStreamReader(process.getInputStream())); + StringBuilder builder = new StringBuilder(); + String line = null; + while ( (line = reader.readLine()) != null) { + if(line.equals("usage: makepack [-h] [name]")){ + break; + + } else{ + builder.append(line); + + builder.append(System.getProperty("line.separator")); + } + } + String result = builder.toString(); + //System.out.println(result);//debug to see list of labpacks + labpacktextbox.setText(result); + } catch (IOException | InterruptedException ex) { + //System.out.println(ex); + + } + + listlabpacks.setVisible(rootPaneCheckingEnabled); + listlabpacks.pack(); + + + }//GEN-LAST:event_list_labpacksActionPerformed +//Increase font size from font size menue item + private void InreaseFontActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_InreaseFontActionPerformed + ((javax.swing.border.TitledBorder) KeyPane.getBorder()). + setTitleFont(new java.awt.Font("Arial", java.awt.Font.PLAIN,18)); + ((javax.swing.border.TitledBorder) LablistlPane.getBorder()). + setTitleFont(new java.awt.Font("Arial", java.awt.Font.PLAIN,18)); + ((javax.swing.border.TitledBorder) labdescriptionPane.getBorder()). + setTitleFont(new java.awt.Font("Arial", java.awt.Font.PLAIN,18)); + ((javax.swing.border.TitledBorder) labsPane.getBorder()). + setTitleFont(new java.awt.Font("Arial", java.awt.Font.PLAIN,18)); + ((javax.swing.border.TitledBorder) labnotePane.getBorder()). + setTitleFont(new java.awt.Font("Arial", java.awt.Font.PLAIN,18)); + keywords.setFont(new java.awt.Font("Dialog",java.awt.Font.PLAIN,18)); + lablist.setFont(new java.awt.Font("Dialog",java.awt.Font.PLAIN,18)); + labs_in_labpack.setFont(new java.awt.Font("Dialog",java.awt.Font.PLAIN,18)); + description_box.setFont(new java.awt.Font("Dialog",java.awt.Font.PLAIN,18)); + notes_box.setFont(new java.awt.Font("Dialog",java.awt.Font.PLAIN,18)); + jLabel1.setFont(new java.awt.Font("Dialog",java.awt.Font.PLAIN,18)); + jLabel2.setFont(new java.awt.Font("Dialog",java.awt.Font.PLAIN,18)); + jLabel3.setFont(new java.awt.Font("Dialog",java.awt.Font.PLAIN,18)); + + TextName.setFont(new java.awt.Font("Dialog",java.awt.Font.PLAIN,18)); + TextDescription.setFont(new java.awt.Font("Dialog",java.awt.Font.PLAIN,18)); + TextOrder.setFont(new java.awt.Font("Dialog",java.awt.Font.PLAIN,18)); + + jLabel5.setFont(new java.awt.Font("Dialog",java.awt.Font.PLAIN,18)); + jLabel6.setFont(new java.awt.Font("Dialog",java.awt.Font.PLAIN,18)); + + TextDescription1.setFont(new java.awt.Font("Dialog",java.awt.Font.PLAIN,18)); + TextOrder1.setFont(new java.awt.Font("Dialog",java.awt.Font.PLAIN,18)); + labpacktextbox.setFont(new java.awt.Font("Dialog",java.awt.Font.PLAIN,18)); + + FindButton.setFont(new java.awt.Font("Dialog",java.awt.Font.BOLD,12)); + ClearButton.setFont(new java.awt.Font("Dialog",java.awt.Font.BOLD,12)); + RemoveButton.setFont(new java.awt.Font("Dialog",java.awt.Font.BOLD,12)); + AddNoteButton.setFont(new java.awt.Font("Dialog",java.awt.Font.BOLD,12)); + Create.setFont(new java.awt.Font("Dialog",java.awt.Font.BOLD,12)); + save_OandD.setFont(new java.awt.Font("Dialog",java.awt.Font.BOLD,12)); + }//GEN-LAST:event_InreaseFontActionPerformed +//Decrease font size from font size menue item + private void DecreaseFontActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_DecreaseFontActionPerformed + ((javax.swing.border.TitledBorder) KeyPane.getBorder()). + setTitleFont(new java.awt.Font("Arial", java.awt.Font.BOLD,12)); + ((javax.swing.border.TitledBorder) LablistlPane.getBorder()). + setTitleFont(new java.awt.Font("Arial", java.awt.Font.BOLD,12)); + ((javax.swing.border.TitledBorder) labdescriptionPane.getBorder()). + setTitleFont(new java.awt.Font("Arial", java.awt.Font.BOLD,12)); + ((javax.swing.border.TitledBorder) labsPane.getBorder()). + setTitleFont(new java.awt.Font("Arial", java.awt.Font.BOLD,12)); + ((javax.swing.border.TitledBorder) labnotePane.getBorder()). + setTitleFont(new java.awt.Font("Arial", java.awt.Font.BOLD,12)); + keywords.setFont(new java.awt.Font("Dialog",java.awt.Font.PLAIN,12)); + lablist.setFont(new java.awt.Font("Dialog",java.awt.Font.PLAIN,12)); + labs_in_labpack.setFont(new java.awt.Font("Dialog",java.awt.Font.PLAIN,12)); + description_box.setFont(new java.awt.Font("Dialog",java.awt.Font.PLAIN,12)); + notes_box.setFont(new java.awt.Font("Dialog",java.awt.Font.PLAIN,12)); + jLabel1.setFont(new java.awt.Font("Dialog",java.awt.Font.PLAIN,12)); + jLabel2.setFont(new java.awt.Font("Dialog",java.awt.Font.PLAIN,12)); + jLabel3.setFont(new java.awt.Font("Dialog",java.awt.Font.PLAIN,12)); + + TextName.setFont(new java.awt.Font("Dialog",java.awt.Font.PLAIN,12)); + TextDescription.setFont(new java.awt.Font("Dialog",java.awt.Font.PLAIN,12)); + TextOrder.setFont(new java.awt.Font("Dialog",java.awt.Font.PLAIN,12)); + + jLabel5.setFont(new java.awt.Font("Dialog",java.awt.Font.PLAIN,12)); + jLabel6.setFont(new java.awt.Font("Dialog",java.awt.Font.PLAIN,12)); + + TextDescription1.setFont(new java.awt.Font("Dialog",java.awt.Font.PLAIN,12)); + TextOrder1.setFont(new java.awt.Font("Dialog",java.awt.Font.PLAIN,12)); + labpacktextbox.setFont(new java.awt.Font("Dialog",java.awt.Font.PLAIN,14)); + + FindButton.setFont(new java.awt.Font("Dialog",java.awt.Font.PLAIN,12)); + ClearButton.setFont(new java.awt.Font("Dialog",java.awt.Font.PLAIN,12)); + RemoveButton.setFont(new java.awt.Font("Dialog",java.awt.Font.PLAIN,12)); + AddNoteButton.setFont(new java.awt.Font("Dialog",java.awt.Font.PLAIN,12)); + Create.setFont(new java.awt.Font("Dialog",java.awt.Font.PLAIN,12)); + save_OandD.setFont(new java.awt.Font("Dialog",java.awt.Font.PLAIN,12)); + + }//GEN-LAST:event_DecreaseFontActionPerformed +//this is another way of adding labs to labpack, through pressing the Enter key + private void lablistKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_lablistKeyPressed + if(evt.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) + { + + String name = lablist.getSelectedValue(); + + if(labsadded.contains(name)==false) { + labsadded.addElement(name); + labnotes.put(name, ""); + } + ChangeStatusButtonColor(); + } + + }//GEN-LAST:event_lablistKeyPressed + + private void QuitBUttonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_QuitBUttonActionPerformed + this.dispatchEvent(new java.awt.event.WindowEvent(this, java.awt.event.WindowEvent.WINDOW_CLOSING)); + }//GEN-LAST:event_QuitBUttonActionPerformed + + private void labpackinfoKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_labpackinfoKeyPressed + int code = evt.getKeyCode(); + if (code== KeyEvent.VK_ESCAPE){ + System.out.print(code); + labpackinfo.setVisible(false); + } + }//GEN-LAST:event_labpackinfoKeyPressed +//this will close the make new labpack dialog when you hit the Esc key while focused on name + private void TextNameKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_TextNameKeyPressed + int code = evt.getKeyCode(); + if (code== KeyEvent.VK_ESCAPE){ + System.out.print(code); + labpackinfo.setVisible(false); + } + }//GEN-LAST:event_TextNameKeyPressed +//this will close the description and order dialog when you hit the Esc key while focused on description + private void TextDescription1KeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_TextDescription1KeyPressed + int code = evt.getKeyCode(); + if (code== KeyEvent.VK_ESCAPE){ + System.out.print(code); + order_and_description.setVisible(false); + } + }//GEN-LAST:event_TextDescription1KeyPressed +//this will close the list of labpacks dialog when you his Esc + private void labpacktextboxKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_labpacktextboxKeyPressed + int code = evt.getKeyCode(); + if (code== KeyEvent.VK_ESCAPE){ + System.out.print(code); + listlabpacks.setVisible(false); + } + }//GEN-LAST:event_labpacktextboxKeyPressed + + private void SaveIconActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_SaveIconActionPerformed + if(SaveIcon.getBackground().equals(Color.white)){ + saving(labpack_path); + } + ChangeStatusButtonColor();//now the SaveIcon button will turn grey after saving changes + }//GEN-LAST:event_SaveIconActionPerformed + + /** + * @param args the command line arguments + */ + public static void main(String args[]) { + /* Set the Nimbus look and feel */ + // + /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. + * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html + */ + try { + for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { + if ("Nimbus".equals(info.getName())) { + javax.swing.UIManager.setLookAndFeel(info.getClassName()); + break; + } + } + } catch (ClassNotFoundException ex) { + java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } catch (InstantiationException ex) { + java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } catch (IllegalAccessException ex) { + java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } catch (javax.swing.UnsupportedLookAndFeelException ex) { + java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } + // + + /* Create and display the form */ + java.awt.EventQueue.invokeLater(new Runnable() { + public void run() { + new NewJFrame().setVisible(true); + } + }); + } + private static class StreamGobbler implements Runnable { + private InputStream inputStream; + private Consumer consumer; + + public StreamGobbler(InputStream inputStream, Consumer consumer) { + this.inputStream = inputStream; + this.consumer = consumer; + } + + @Override + public void run() { + new BufferedReader(new InputStreamReader(inputStream)).lines() + .forEach(consumer); + } + } + private javax.swing.DefaultListModel lab; + private javax.swing.DefaultListModel labslabel; + private javax.swing.DefaultListModel keys; + private javax.swing.DefaultListModel labsadded; + private javax.swing.JList JlabelList; + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton AddNoteButton; + private javax.swing.JMenu ChangeFont; + private javax.swing.JButton ClearButton; + private javax.swing.JButton Create; + private javax.swing.JMenuItem DecreaseFont; + private javax.swing.JButton FindButton; + private javax.swing.JMenuItem InreaseFont; + private javax.swing.JScrollPane KeyPane; + private javax.swing.JScrollPane LablistlPane; + private javax.swing.JButton Move_Down_Button; + private javax.swing.JButton Move_Up_Button; + private javax.swing.JMenuItem NewButton; + private javax.swing.JMenuItem OpenButton; + private javax.swing.JMenuItem Order_Description; + private javax.swing.JMenuItem QuitBUtton; + private javax.swing.JButton RemoveButton; + private javax.swing.JMenuItem SaveButton; + private javax.swing.JButton SaveIcon; + private javax.swing.JTextArea TextDescription; + private javax.swing.JTextArea TextDescription1; + private javax.swing.JTextField TextName; + private javax.swing.JTextField TextOrder; + private javax.swing.JTextField TextOrder1; + private javax.swing.JMenu ViewButton; + private javax.swing.JTextPane description_box; + private javax.swing.JFileChooser fileChooser; + private javax.swing.JLabel jLabel1; + private javax.swing.JLabel jLabel2; + private javax.swing.JLabel jLabel3; + private javax.swing.JLabel jLabel5; + private javax.swing.JLabel jLabel6; + private javax.swing.JMenu jMenu1; + private javax.swing.JMenu jMenu2; + private javax.swing.JMenuBar jMenuBar1; + private javax.swing.JPanel jPanel1; + private javax.swing.JPanel jPanel2; + private javax.swing.JPanel jPanel3; + private javax.swing.JPanel jPanel4; + private javax.swing.JPanel jPanel5; + private javax.swing.JPanel jPanel9; + private javax.swing.JScrollPane jScrollPane1; + private javax.swing.JScrollPane jScrollPane2; + private javax.swing.JScrollPane jScrollPane3; + private javax.swing.JList keywords; + private javax.swing.JScrollPane labdescriptionPane; + private javax.swing.JList lablist; + private javax.swing.JScrollPane labnotePane; + private javax.swing.JDialog labpackinfo; + private javax.swing.JTextArea labpacktextbox; + private javax.swing.JScrollPane labsPane; + private javax.swing.JList labs_in_labpack; + private javax.swing.JMenuItem list_labpacks; + private javax.swing.JDialog listlabpacks; + private javax.swing.JLabel logo; + private javax.swing.JTextPane notes_box; + private javax.swing.JDialog order_and_description; + private javax.swing.JButton save_OandD; + // End of variables declaration//GEN-END:variables +} diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/MakepackUI/src/main/resources/labtainer5-sm.png b/modules/utilities/unix/labtainers/files/Labtainers-master/MakepackUI/src/main/resources/labtainer5-sm.png new file mode 100644 index 0000000000000000000000000000000000000000..88708474179309733731a9deebb6537480823cdf GIT binary patch literal 67186 zcmXt916XA5_n$n~WZP}r?AmN^O}1^f*|s-xv)j$sY+KuAd-H$3|L6HVgL~&io9035JNP+N>wP_h0e8>XcL|$3~@bTZRpsPFuvIWse zM%xttK*sv-0R_nZ{@-B;ZnBD!2!COrp<&7Htb%qRn@FtHwcNxV?d{DS+#oLj0C5*{ zV>fd%a!+eFD{^UBMHREp<_G`)IY3rIRNZUsOyBdH-eSZ16!UtAhWjFO)lc0E6e7EN zYt&3KqfZIAy;WA8alG;>znISFXG9} zqm9hBUZF;D{x2!b``>*pr#vmXv-n&Q-(mJ|xiLOo&4e`!z(@eEo0R)l=~gTXY|*|E z=&eKK3gaZ>lxprd0-#z`-&ok|WKn;ncb=+xTe*DNeyEs4UF9KP`&lZdyZ%jNjsPZ~7^j1hqI?uL zw~yRSlUV~OJw5L&TehwJ1wSqPAqXfaDiRBL+RsqF^%7idWXi!0SDmnMy`3wS_uO({)+YsIa#*5r z+pVxx|N2BFvbCiV6;p;w_WW_mOk@vkG*z(VWuweiNd{~07mi?1mH*V1pDKy{`*)iy z^h!nDikDQ;{>zm_m_glOOkG#P6Y{~I7R{}JmD#MHCu60N!|F#|uu`Ovj7WdjW7<#T zylmR22$78X7AU`IAB1PPi!8)aX=}NWA`18;LXwIzpEIMOx5g!yHsp^H{xn3c#I^I+g2eu5?$yHMFedPQMw>e zY4XuP9{k}o$5xZE60zSjNF+(K`==s`If01|XcG9Ysh;PQ1nz*A3!;FIbrPNHqql`LVN6&ClU+cmx|F;cWBT_1dW{){R!_>e;HzF@d=|9`s?EyKQ-lRVq8!(;)kk%#%; zZe%x{22cjFKk@;I<=h&3JWWWV^n-i0XtD88KN+#h@gn{(5Yr+jpIhMH>qz`z7sJ4S zCqc#uWMQIY9u2b0_a*vPgkfpu#rJ;L9pQ9(uDMHg=_oCBwOjkqO=`~Q)VaQT<7YBQ##^MSjI&mo}k*cBzeh<=~PN@zy5h#?4pp(ePFXEOizJ5#SZ1)&g z5AY+u9?Lj&dLk$%ZHNE$>z5}FC+DlRj3F*X{i@yN(!v6hJAdwtN*zaODwK#X6DEM1 zg9EFs^9Bi*NsBc$*cAA9`Mnc?*lh6R#yl>!VYmqK^Pq!Ape2^oF;dW>+l;NEjC*#k z3$z_SGm}OzYESS%E%2NDB=6px^}px!E_}7rs5R8+p)MllmrWki{T$o+mjNC&%DvC{ z(ZeD|49)z|V46TN@-cQo9U&PdkKjX;9blMJm8hK0=OPSY&hPNYvh)C$Pz8-JBp3rEX|#lSC5YTHE73UjJ*JQrKPL-L)x5VPf??c9%V=Ze&$=z%$FgZg zzH{Y@@4IfR-7JgVPp2TIa%5nz5fQWqcDS+2P#h5tZtq2R-DIu+-sy530zl7gR#JAo z)t(41VK_!YRiSm&4qonuP19tC|J`kRR=qz@Q2jegS*)n4 z8b=Ki+vAJp7&K`}-P7mDI~<^riluw>65KDMBR%u$Zf?egM73`KP1vrsy1Fx9I!`D7 z2|lDJc6bjDa*i6DXlAYq^+9BjS35b-@^ZT;K-9;lT>u+tacOxOt$1hHLUilJ2S$ly zYDoI!q|Bifv1{ar{bwvT5vuxPQFkd$Wo1!e4M{YE>FooF3JngZ4$e4}G(Si*m`&88 zxuV)3xZ9qn= zIWm(|Ekg}S$w*r8R*vq)T`6G$c8!Mzt9kyH13Z-(Oz)C#0EO?oY&xo{yEDgbaR4bY zPcBn!uqt-IHhJHl!I2{C8gRzn{p1E$OKWs zz{9}Q2}2nSQ&G^fjxcowd02TvGr%SuAsN?oK!-Ba<9i)>lYZ|DzpKWO87G7b;Dwb; z+WG6}gpNiWrw?3mi0H33Qp8oM6x-*!lA_{-=iod-1*(LLz#)el8_#1@?qX|-ie5Zh z=J~pvxi4@1@xGgt7UIrP)KyWbA3XQSH|NeNoIgfK3PX<>?7bB{^AIr84krgfB4ZG ziW1Ok!GF@D`=+-$<+ndFJr$VH5k!%J8dH`uAjG%gp4`!F|?%@lsA&M-lRE>tmxd-tTOPKh^n%CpsR z+kh=FKtUbMm9_UXlxcj8BGJQ3kThk|qA3=i&E%_}-&=bOOE-R%Mh!IJyZe&%zq@(m zh}mm#n7_CB2=x_ioUO}grGDC@dL3=;1Z))X>Jg~avtgXM03Z}k(4BA0$;Wf7=V$BB z|Ikm2O!Z$!@KV^5QOE{ekmtG-!7}dqR6Ev^8hyY8jSK17Bg_R2o+6WJkCKuy3i{Dl z!3>m2Xg7G%f3IDh1spe4RDu;qPW&)h@nNF{$MA6m2qCLLNyb7tVKjP4rRHY$-d>rR zYml1{idPPd;BcV1wi6R_`ksh7+_e@^UA5lN5T+TPggsZsNdjKpOQuobo`3QfzW91I zE{EsUWGR*}A4AL{flQcGsT>QS0tUkYuAaVKy}Uv2U+bq6g-JuE@yo-xA!;Wsch00E zD?a7u=%^uBQ`69=`SjA|7pv_OlbM;B2zuyshsU{2)%@`Wpx$PYVZ&qHel7pw_0X(8 z6tQ0tPd~J6+yA8m0eCB})LPNJKDp)3>d`%#`p3@3alkr7nnF8Aq`U(cwYZ`rb0nS>Hw0l!e#ed=#(x$!5Q>L1VMsseF8B%aE5HE0qWOE4C4r%AS9T1ztf*Ev`0| z%k|>&`t0f~RK75vBS@rHL{a3>8Ux4N?Frh-!MV7*0Vi+C z!fW%sxoe+X@Pa$ifJf{?%B!+!R#gqgP@g1NQ4!eM+`GL1FqFrV2ms8Apd-|0=L>T)Guz82@q_{noFKpI+5~;hT_kAdL6r+Ug5lY%V5@p2WUC1fj377Tg(B0%K@H4 z9BNWl8M)lHsc6_E6JrIWZ3wmMSlC;z$-w^fq!<(;Zt-+%U@}M*E>?%R*@8%&28xYP zqHG*>$poGTgw2KunYRUjG}zjx%tP&*I~Bo7N#wu3{&ok!A}0XrD5a<+l0?*_D2N}Z z{+^4~H^D>|kQL_&{s|6F2ZU+ZhRbmQDE>XHPkKG9W~dl$d+n|<=X_W-t&TA=GA3nb zM>E#`gkIKjMfv=52U_rP!`18gxZIc(|EeFEMI~ks)8~2+4<_|%cXjm{O~NpT#eA9K zC_qJ1(-UlIX&E)JyON%qJohw0mC(C)z0>u$H87U8i9BwaAQV1K>I)K_4nc=b8U1~> z)%9{b7=xDp4d^n+X9D&|<~X$ffLxw)mSug<-0Rc29#Tkn>7#lz6m2azOB-7;bh=2L zv!EPVDH&vd!)b~Dr>D4OQrFn=gMMiLsO04pQQ_pYYR-{Is#yU2mb%rOC0SIYpDs<$?zbf<~)D zgqR8FYdK5W=Z+WHvKCBcLs&tuk})@^$Pb=c&NG%_cuI8XW~{gZyg4v-F6=An2-F=I z&LOyxPu7{Kj^dSR5vx|P<{+=9bH@>$Z3l#L)}Mdos;-w9S++R}-Tssh4h}wQ*DUD( zZtjlfAtThNZQZzSy>QlQ4H+4En^4&Q6>M#7y}WAIs*yjPG1X}I0>NprlhGuZ+}zxG zg7E9f?|ipSe69x~~aeg%&3@ zE$vOac$V6Ye=~$iI-W^hNh#eqc^pk?PPY_$3$OYQT$U&~cEprbAQe60`Q(eyloAI_ zFWjL)q~`nc2HWt{_{}K*pxoVqTkRkR-Kz`OdcGwx%&1+DgY$rK$Hg|w$3lgdllz2Q zWTywo|4dNMgPP4|=R8$-lrW@!7}(R}bG~>io3+HQX1S z?yJxtzcVt!KW*~UM~@re1V5dPvxmH0xdxdn^sc(fTIS;-WLy*7QUov;N+Ko6QN=2v zc5Fx`Z2Di$l6WQwk9I7znB?OT5D^nUDLFtsP((t6j<#qM4@R7>nUI_#s$gY5lyMYM zI|(BL2R$6lIM9g|NI@F0SsfupFPQ7!j8Ggo4m*lV!p@N#m5fdp;6A#zOmz1gwz|4H z_$A+wf#Nq|!f+uSQniL{2wgNEYQ$dqWDZZve+UH`Uo8)DGR!*7R(}uk0}PabNxnro zdu?{BH}uoD1X9HqqzMSzIVfpqXpVtZzSDkM8?t`xe|Xk3Jyly(^-@q)X7Ln> zLG^j1)qXvE>k4uyVw(qp<9S?qVfJvJ@%vcOgV1sw=4b7?*+u-uNQT-8?FO)h=X6`w2tho>n$?^ z7xDY9m`n-*{5k78$jFgWMUfJFSO2Jh(papgT=iLQ_(>L$7L5cyEKm+o&304S24}F~ zD~ke6@l|92zhNV(MW>qpr7ARtm6;;cpGBnAc~L<8A zlW1sYmag}Piy?vpvI-e+N*4Ix3VDLRs%vV_OS^Xffjrya=6?o!yuYNRq&$9io#Gn= z)ce0ZcR>y>=OvC8&Q>VHBS9U`2oe#|X?LUF^4ddT(y9l5!C-tYn+317^;{F~96V-& zPA@qY-v6SvKc4Z}(f!GG<#9V%tm`1FPV+axup*x}90(0cfZGqGWEEcJM5%|mH{NE* z`%~JZX2GH#7?QMB*cvxIj zg$x?#wd3Avn*JiLp|M0_P{-rINoXi^*?CI|Awd1&XhJ2asj28WlMfPf*v}}#&h(j8phPm6i*Frg?VDU%IKTLcn?0nFbZpxw zj`#rbHc%7%gSti-)16O$!qy#qpEv}+4Q6exciz^uqj`4!L-;NQ{2XBM(d8f1Q&riD zX#~7;L0=0cO0G7!IHUi$|JtC^r&6p0lfK{E$n-}H8c{a92#{Pvjvpl|2b{r#lPbog z4M9Z$&&)2tmv5rxEeDEFBss~XnPu(X`A7)bTUpx=RI+df&7Y?F>2ga|jWIS8#vSaP zot-5-UTk(i2X2})h+sc0Aa zAVZ{#F?$yGc%xmqIiDJOC^i@jVd<_%&GSm@6yrB(s1XB2i#9Fx_Vy7sl#NWqEiE{Z zyt&xg+}s>EeV9{A7mX+KiQ+d+bdl|9qdApkt)912X32-Jyk;+2`D8pc<0F?iwyG(s zEesn$*#c%Lm2>3pSk{cx1q^{JWVwdiM2?>2r{&sC*hLTf3P{RNkzAraxS?lrI_li4;UIXTb4 z&hFJ_FdFCXM|qwN#42#*i+8Q8BsA6bc=_qP_vQ6(iZZ6@aJ*j|WbS61pPzf4y0wp$ zm6a_I#gm*;guYrVR)U#B(SKY%z2D}4aCSqm2(@n6Hb#OH`RmuOv^fg2*tocq=)i)~ zQaD9L#g$*KpNLT-Sg5G>;#KI>>Be372Uu4tE2lKE2N&n&Oh{;th3oZh{0I))G3lzmf3Q6U6Xo}3_q@YrY<^fYa+Keh`^r79 zc8sA>;^L|3q=v|bDOIm)!(mbFOhk>+G0O#2ew8Vj)AuZ8KsQGe6Wbt@kMyU&wKhkz zPlWT97Q_$+*UjgRUccrRSrw&DNs=tG?G@x%ZC6Jd$`w7^C-nay3OG7hs980e(Xf0}PEO^pwgif@7a zX?KhRIaqR4))(fzx9i%fB+aThzN~fXf!i?S@St?OsB7=b{cDP>MT&Rm=<$YYU%#t_ z9KBDKx!Tv{+1Xh{fY;76nw1wyUC;fJZU`2wLN7!@007L)%s(OHBC3e)KiSu4hIk%F z`%CY0b8G9Lnzk+WAC+1rOHS2KO*B)#SPOhexA{kfq43=UUV%_@iF(aq+kJIam(0tS*}uo`{gL}}Img3z zYhq6PgXL|Wu_=n}_WT!zRJmn|)+`S8^+F}Hm5ogZ(?5#A;+aPE^w1gRUH3X6G&kz^ z{BE=+j#0L}{hubeN{7^;umgoE?sV8z&N^{5_FFP$6}7kjRH+o5qm*o{?fsO|VQE=- z9^2R2pL<|>&)eR)TbjnJ44>wzCWU^b81oT|Y&f*R1fqz9qEn(`!YctHOUujWFKy@c z6M7HI0MJIU^@XqW=dg~Ka;3KHQ zqJyF8jM>;X|B1HFH)^ZWdv4r^gZ$i!Qj^=Wqvx{6VC0Kt@c~GI5Jui_;p&Eqo%Ss) zDXmRf75hMI@2i|F?~!s$cnH<_<7F-$Qdo1A_Ue9~;0z=dg!7%euCnaNVjnn)F`&kWEhLqwrDtYh#kuwm0BT{haef`o(3b>k)Mrh_& zn-hRf+0&DR;>G=UmYYVG%}e6Zfn|-#@o>KWJUgKISqB6_>;A{!(DU4QX?_vl_m09` z#}ABIT&vRF?D5$Eg;N+2K;Qk8h7FX10+$L^`kE9JgmiK`fy99L>4Uu}3Jl;v2AhNz z4$k2~^gweh^l%X{m@azFQR$iF?R0AzV~(SiiBg#3n5atDbL~vKDZphZvbm*&=3WbZ z?QlIB`U*PHC+OO*Lkq3538$yWi7-!l`5S{{bHLcGPj0$#eVrY$nWU&`3?YRQCu(do-aGDF)c1Rgx07zc(1w z?Kqq6dDb2jV(Coq^>=^w%=3i!0A>dhS$FFwM5NW$R$W}8EuaDC85{QzX1ef23xwfY ztLiE#YE1Zn`hrw3RqTpN26MB6GpDi=Qo;AHO3xpg^X}!BO@uX4Iz7)#9OtOg6*s-z zl;OrNy$*@HKqxSHBHME)V=9$%T7?;L+*yu#CQGly_3b;`AQki8P(nlzT>(?f6y46X zRG+h6&+ap6NM&V3-H*_=CX!I&*t{fjJ1^z-CE7m&!0V>?|!7jLX^D(6CvC#m(z;` zY(J$|dJt2Tw0jl9!=>oVVTe@KwcQTI|9Sx=)%0=V5CqLG=$kIT9Da8tqYkBm=m|Oo zhJNMQ;GK^cOOWLI-2wOO^`RORpzWjh!MKa+MWcfKPXjAu;b(j=)WsGY^6&7)(u#mj zFN|4bbyL55pB!y2zg_6RKCK~l&vy!VUi^kgYybdKukv-%)P8bV$^^+`7A~Hs@Y*ne zq_6-5o139BymJG4^y=WCq6#PTeY@6G68B2E)#BRc5L*_EKWxQYRv#Id&yjJQxJ08|~qwFnX4>4apPLjD&& z$;+*$dFcpriN0D zRB>87$cJRfE_`2|9-~R)QqNP$S+u+L=TF$wuPWhT%7FG@L{=tO>Y``ocm~)ve*pHZ z3gC-p4ZrDHs(|H0X2YLyJ1&1W090Uktq|Tg**C1|k6q0mE$PL&G^h28;8&1BK0l&I z6{3C~{O^$5nHhZku3RAf5F)kp#A#d4)hs1|*LKQm2RB6UnA4nCbJr}zauHIaFZ|6zd(gc zkj2(3Zi2mf?3R#Cpw6gg(dLnaZe6IWre$^CiPqOlvM=1RXAr`e$z?Gc**W^yL7n>g zMg;I;f~b-jR{o;Sk~TgT>$@|nNrY23otP*dG@5oVC#kcNVQW#PrRZ3Q= zZmv#ZeDRv=x;Y&D0_*eYlIGRiIl_!>1xd!*e55faRb%5r?#*rc*y*ubieO1iHLxmB z&K()=bLjfH6eppiygVbMyt(7ifr0m@56&|8BZ@i-H0&HLN3Skv{NkS!YHY>%SFv{O zY4VPbqdcdvv9X{MsrT9nP3|gUpY)3>wqk*ZyEj3wKN)YHbVLVYU%b?JkCP4EgK5Jn ze2UOKrlmb;b5WoDi{)-;!0UeHd}Y-*L_m1ALu(TpAKgeM<>~{Or^P^?{WeRK6j2qG zHL_nxOfx==!K*wxLe1=t*F;mpFaf@g0+Vlj2xNii!N@G_M{yIJ!{FS>H1^?J86flt zn#RKk+8l>#?=7)}_DL%yF|r&`&9A@?9#~8hT6nEB(R{z|UVgsOZS7#{XYZ_Ls=xc* zxH;cr@OEutm@)ig{y5aRRISa@;&6#`c^TK0*w&4jPk{;7apk8>C6W*e^y z!(J9oaB(?3&&#P5=+;U~vcYseAQd6ZKUTICuyGM=esfm;_}B1$iYeI)xlrLz<%%Ho!sW|>JwDHnOj@Q03(M81srd*@sTR)usd8*d;L-u5;()Q z_vw;}K)_j<2~*Yt-vm{lm(SV1H;#h|-Hf~>{X=W}sf{l8 zy|WN7PBD$D1p+Ouq^wC}lj~hpR#rqFav0Uo35b+SXYo{rEmX4iGGhA>0&Y9E&9q86 z0*BGo^JPM6+N)h6*m!t*X31pk%YWoQu80jfK6EzjmJ_6YNhy8fqjgsEjw3apj88A~ z2^IS?kt;yvQ;fTKpNo#An%RuhEO)2;9%7sCa~Hp_54gG-Yjau$k1JVSK&rQB_rWPG zDIzW8^iMurP*~+t!Icc;p`vt0(z>=B_~CFOeXLA6Ij3wEuO%$w9*+4$F;XpW`UG>i zYZlrxJaq-1iBWZi(v&tK4hD#L+y&v`LU7WiCD>G(S^@)-WdeVve4i>nqI7fjI!mUr zp|2Qo&dw~7(`i~I%wxCR;@3__bw9>4Vaxl?ZxPEpHBDZUqa0eq#_1llbAMo3m(GOj z=?e2;w;fDfjAgPd*rnn7))IN0(4gp@?$+y~p0{!y%C-8e{lvl6ws9?p9a~6#h*D!M;Mn)pXjcKT?lwx%!LMLpn|bIpYStR2Hm7&q1s-`rwM%@)b7|g~*j>Q^3Kd}n_5~c}CMpvK3VLdK zcFYcM`;d7W`Ww6kF&@6rE~$FwNFsaxSz&{i@aQ-qRXj!Wr=oh$#6O-`wbf<_C@lI6 zd`|NlJxDs=uRWECJ`PGJgc5{N06+Ji-#3Xm+S?cUSkR7(Ibg-BxrN2x=u7LhJ91PK zAiYzj!?6_S_BB}zUh2cn)kSnjoI1ILNMQ?*xvFDmsQl(15L%gfw%TpoN*66yno3;D zQ(jPDHX{g65kibgaOIkcJyJN0y3O%d7@EAx<+ky*p=uTl;_A#1BmnbH3~6*Z9dfi2 zv;>1fC;Bhy3%h?1+%x-2U=bdHMvsnCXGoh4qkoiF*YNH4e0V&CTw+7@7Ap%!3~#ST zdkTBusg)`8#ghmu(5sb!+J{ivZyr`Z%_*M)`Tn?KW2b)oyMNek(h|rD%io1cJbrUt z!@R0bl9wtWHlvisZ~NAqb-RRzo3N_MX>)e5dW-9yl_gNbzVoQvW~b$A(Yu{S4P@)8 ztelvw7EK^g@zrOV8y*x0hdTCW^(zn!XM=vtxm5Kk`kHMzyjQifcMx;)XrN zVvFptWCCV*4sjGKYffzaszM~Pu{u|{5l4=31ApHLwnH6RsCMd^<(+g6+ixj&BWD=WWR+W0V1h)8z`EM{eI@p(UgzxVZU$ZGMM4}W?n zDVh2+yXTq3+`6OMMH@)`OE`?Ujkaff@WhcVf_Wq$bK~2!-s^MFG86#K!2OvA0qyKn zyI=Q(Cl8)HicNuTOiWb?{)R)Xu!3ETf(M@_uoHwp49@}bF)b`n45*l@H=4XT{GtmB zNFZizkb!qf^vB(kK@}5)fMD?EuZWA>K-?xcR^*kIGi}9 zpiWo|{BO~c>~rl8Ix-fZv+KxZ+YfbfJ5)={*@{_&MweS6t#okw#it-lm0#Q824eA- z1}G*35ym%U2PXGvF&3nA)*H=cQqa90dfp$W0-vTbpUjds`N!~XFsc@#*}}Xl%&=26 z)5Ql=Vn2_COWX|q5{B_~rI3!|de1M&f47 zDxsQbhk^Qe*<<|23Dmgj{&{_%EDOIregllSWMj+0yI!H`CUvu@fd`MSQ#|(nCREIv z++m~)8npOMldjFo1U^6e{5EyA+ipdPE;2G){em9{e{@HfYfyI>8d|`!Zr81*Bz&8~ zhdiaHCfMrcc)Y-u)95O_YslVryr$u!sspZvr5 z=I?pNPJfld5c9NOkmGj1RKO!#DUSy?$v+mtN7Bep7)bGx*KdkiA)lAfq6>EsfvBOb zosi@US+x}McWxr}u%P}-jzU*KHsgnWG%_#GWf({QCq*cjk*+B2IY=XJy%ic1wxsbK zd*f!-RC83A(*NiPAn;(^x$@-u16fCglXd)%3s7Vt-4!MF? z%}_>*elsNh9!(zkp>FI0qv|K(^pDL-6(_a(bx-AY9Pz2M8E?*93Mtvgug^;&-j@4& zy<@}IInp0NI6Ve;*J_vc8$@bHP0=Mny8GA)bW;+t4oK>f5@2znP6IM*)!@zA zFb&J_pm_=k>X{83;@lK9z3-{n?r{sPEzND?s5?WMxsH=z5>lUxtZDNyQ=D0BqisgvsB6|uA0pXk$q z`W%b+L5UwK-Y4m$fWS1e%UGr9IPZ)& z^yNq13gqhyMRa7>|Kud{)DwI;maoSc` zA5m7v&9Hztk^z4u1-(ue^}Q?x>pt#I+L!N_su^{u8W^=gNC*B7Edd zv}Gj1R?VOhT@ptC@@$FFASdGq3)>ZwmbPbp0d{HJgsr6PgPTmI^vFsNp6~~E_cDw9 z{pHd!ORf_X_@G11BFb?l0!%=>DH!#>xmfy)=hN`GN`#+CK#|WknHV22uZ!&qNn+3M z_D|kYvi>HeSywpEj8IVLJ*xy!^|=enKvFU+4V1;1!ZS zG*EN?1-2hiE6xXfjQq2zj9Y;RIx%z5(#v-qe1gKSV`Ua*zf$Je*XT<_JsdNkhn;O8 zX0A+}6l2-1#&sM?VPDZkY=X&}>zDC9x`%qI< zX$ToA)30>vXzLqrx7W1rP207?^5x;tsQyI_==7!5PUh84*J>$`5g4dX-Sf^m!O-VpG_zr6*`MN$ zLnk@a}}SBWx}tylq_%SQFQr;19MBd%&XbsQ4;W||)>F;WR*^u&Gl z1Zyl|f@Iu9x>UyYrF^{P0IqiOJ$9-K6AOVtS;6GRk&Nu*Q9TXcTQn1gbOq-za`U@t z_2t*>bw7=PEc6SrFHa^JD1iE^R+3VxIj0wvY2kVX7@nn?l?Hb7Xg%87XIsqbicfC} z!$#f*1JM=cvK-^&MPKJG*IWcyaB&lU000mPE(>0p4~lPO4W_O$}n~ z`htC@%fF`6v@sdi_lIrIqrAgKCoRu`R-Bz2M!sQ$js3XGBMG!@lB-VqSL-W3<@wAu zUPs|pgWC=1V$*$3Q%jI6zsB{wh6M`U7Ren;M^c@-uU=J9cXwrFEac8izq)Mc<8heo zsEim9%q>T+6%HjXGaYj5e`mKH7b?DVas#v1Us$mJ&r%ZY7HKE)WUH8>goTNY97}A$ zI1n_B!T!UlBy(bzP&*v)zKIm(CmX@eA19`$oZQw=x={-W#4W^jFbYhSs zQwUa+3f<1p$sO;Deqvn*DTN&3$QP7#K-YPwM9Uc z*G@EiA3u8T(8D%j9_{bXHd;Y-3g1{tQ7~M?+F7>~UG*{%sEB$z(Tt$cMT-STGKg9> z(VPH8fi&#QKJG#}&}g%r`rg0`-xsy9USo)Bz7h-?*zqFo!??hKS4qAo&!UQkP2h7- zUUZy_><@qI@LZXoZDKd>hb<{9gOo(RL7LQNth^Mm*s&n(!C&&pULG$a7A+n>(UiNn zxq|pZO@|6Feu}CJt-z1{7yN4scCA*Qoh4mdFv>@B{Y~Aowmo8R7$7DfHV<=_8A417sHfK3E+?_3+U+T zHu%5sKw=&wk~m6GnB?vgX~Ma|elnp9>Jn(1TJ5r5cSEU5`p?Ixtl->QT7u6Rj9yq! z*Q(Z7Awl(O&k>}KmQL8rPs*BaHNA}|$m!7*P?n=!S<4=Sm}kOK=wb;nGay_=0gaq3 zC_PCq*cx)#$DQ>`zP!x5KnJsiXr+p_KB7dTtEJ63W6_@f@m4IFpU=}V)YM;C+u)=W zaFn?JJv#46R?RSt2KQ#YxCp-T5=@jpJg%MK*0e|`Bkyl#`NAJjnL0VjSTQv*S(kx{ zSiEHvJsadl5RW-dSQN52OpOX-rWHRdI$|VL1}}d$Tc|!cm+Gd8Ot+(;_z=rPss>j3 z`V-#kWo@J-D}9)B)ihp*ZzeNBb87!bNuUPQ6L<8 z!HKc*juppzp`G;QKwCJK)&PKy0@dX#)_t2feAwy4nU4QAAdo4D0+b{_6t^zi=%t`& zYQMPR#rYlL>P1;`!q-TxZw3YRW5h`csabq)lr5$~)P`o1kLd0we4M8hFCY`r4++;z zKy^*TIwbd7KT7N_y@VmudW2EzA=-Rcjghc=gh@3IoQi)~P~ok{q4`nH+wkHlI8H%` z>Ixd5%_cf=!GRMT5TSuhMW6AH@TShe}PPAAjTX|qpR8QVE5Xhv}l6l zis@`*SY;|o7bsj7*emWIg_2w0r1e{|%MTV0rmKBL*LrSW zkYGKWZ?Z`ynNgRQdQRjD2h^01>Rv|Jh{13B3WE}j`932Md|UPm7`!BEpp;Jj=P$Gh zBvIw8+&Da!^Pr}2kImI;*DVc1kDz5_DX0G=TrP=D4Fgp$d(EbzA_-;6P9W~8l-u#% zyY*&zVp}ylrOO%+M~C8+5&;eUy1mT-`Gn)9)H$d}LcueeAY$*wAS(I42*0j~S@04F z+J@~K;LJ;PM-ida;i{1W51;S>bT_-ZU?izzk=q!#N<~~-_2idJSklHnDSKVz5sD~O z=J@2|2xB{vfqx}5cD}H%G8OZus0k#DWgPDWQ6r(po2SK2RMXCgI`+?)-aYHq7lt}S zK(T=mv4-IIEGBUX2suYozjHuWFwm%jWqGW$kl0g+oJdXMO|K%bY()7dM8lz6OvZwt zqBz-k5hy~I1yBI+X*gl$H_Zaj{&iFkZY%<*5*p3O%AGG-Jo)`Wq)PtDKmKiF(AWqB zV>UwFwQfz|<$G6buO^&VC5Ep;fxCRZ+G1Z+S2aKrgSq{pW2*)u0%k9&FL~%lwiip- z6;3K7ii5xlDDkrXH|a4YiRX()08R1ON8{s`vkO?W`_eOCkI!96jv0}fLgX(w`sm*y z;^95khZX<4>wl}Jz7}Ve33UkHE@QD!SMaeEh5~_NW~_bWp%N-0Ul}8&Hq!>8E)yzi zYfl{D>Mvu1w(j}#{VJ78U6&l|?saX?TZpB-@AvVP@y|}}vGyB<7eAS6KlG*u3R2ie z=o3FLSCynj(uWzo67;-m@|RH^NBkBotH1puL>`x8sK)98Re^L7&zy5WD;-XBs=%g7 zdp_%B$BT|+PHo+}eFkMp7~n9q5affcWNNAtLd-8_!{o~5Zu2j-FbT1fDrfYiY1PeC z5JOYmBFc_do({W6izzq}sX<~uglUUar#yDcOhgaJ#>aMz-seX5q%#l5BE5&+TfB{a z12cc;e>3~;2@K*96vP*>d+!YQVjAL@7L+#?ry3^l1VLIk%L1ItY;_M~h28_}cG_Q- z&k*(wOoWHFD5{exPtAEJMa!UEj%Y{xElivXZoZquYVMS%Wz{o{KWyc$qdop;x{o7T zN+BjGY-u5Yy|ddKOB&Amxp>HPBSy|(zqE}>!)wG=AZ~@m4tXQKk$lC)K`7AE8h>|m zY=`4?-b2R6-Pw;{3jBin?3jMu_cr_j0>|02gJqLBzdpJV>h;@r&^d1gzl}bgoGcD! zAi=#&W=bQ-{`GV9m^TbwSAhAu2@`c4jEt3?5(R^tMtv0?5nlY}``Db5ek@NTP4w0$ za#BBlCaqy6B_$0hk8q1o3y7J7b85s=%CS-AlSgYS(tY`_?1}eDdcE5 z`gomXn4Ph#Fd@?6#0)J>I!*}uIWjf8w%=5ru$*W1a z*=yIti;D-ft)|l;QFoTdJ+7eGdg3rvy7 z577Z-{jZ`a=BlFWrWEvoEaw7F6 zCiPAz7+3BHwQKv9!`iyKwl6(%=^qnKvB7X8l2KKKOgh8v-Mf)hZMQGrH(y=7>cng& z89UuR}bLuA^-I^b+9 z>dC9vPrr|fq$#FZplX^qW9F>wa}Jxc#WLUeH4_H` z$v6j@2F5f%-i!(n`&nB)LDD==kZ5e~Q&hP$wjxlHWxJzm=JxiEt{s)qqwegv^EPeY zwq@R)-8<*lwiRq?Yu{chm6S~z)-5qhC6y^!Jts$o8%IZm8jm^YgcodUvgQ|4c;4Qu zx#UfAkZFLtMFuiu*Vo!M%VQcwD(A0z6Xs!0$Wk?;q8Ub^qqA%K_N_g0cJ18JKG@&a zp3mp&Qr{;Dujh%qdv2+DY zl90p{MNK9GYsT#E9wABj;lY8fbSf1&5IDvJHlAomCP#)F&62fKQC0h(N?@Y-bg*13 zrYkB=lk~S@vmanh$P^~cly%!C66$zke0bsFqc*#)>(z6edeU9n#jTjn`BYW4GMRLs z@;M%rxTFxMLJ$xV{=bacoCe9X26Bi6z@Bsw9c4irx7k7*5ZNaLAR>!zGYC#PhIDIY&rP)?Nj zir3QC-Wv!8bKZW!=dvsl3WsTJZzmj$YHb~zb}$syfgqq)uA#)i%3e*>O6=eKt1%m= z8|X|!Vd}B;_(e1|Hu%G#a8MEg+p#7pl*wQaHDV?9Z@CCju6q?vB$C-oI@H|K+B+tk zhR;Vd79$W0l4xw?v}Mb<=;8}Gec9<8cG!HWR5CqHS4se;S@I1J4zx)U5&~Ta{8HJ( zdTXVFYAr-r#%CB!58ZpaJ`IrRQ8ylZay0;hBdJe~q|yzN1WqYim)R=`fvPHXwu$4| zb)qRI666V7Mb#v;xwUPd=Xpk3M@P1M?p#h;x|FleIfs_kRwPM~%Vil`KxNyGoJl2H z9LEdE3ck_dq1l52{c{WXe20J#;0IwKNk;7l*|v@AIQ#F;P>th2LqnWwCJ6}o2L>+N zxH~y(8X(i7IyP({;=(hIQ&XY6voqD*-Az+N98HtTebFVEfx#hm@7crf zXp-U4QB+O!fg8xAvMr+{BTb&?$)m#~3DJJHILVE4`)%sp&w-tkE7$D)yiASeWlKnw@~8X&iIcI_5ID(v02 z4^KcUQ$RBe7A#swXICf5REnLucH!8zmuPGp$!5~w-8*;82!+G>!xt^;Y3*nqkrg>8 zAS6p7?8u5R9k)34!G>X=dJeeuL46UX1@F1=LN>m>1|g~Bi{>{yRaavzGp7MEJ<8*z zyB@wg8cQtkTo21Oi6)wmRjDfW#X=6x^N=dRLrIoNr-q%*nR8x&YR;6XfWj{X@d_}4 zfK2@&K1B!u;b>GYluB&axS6e6dypiFU@$~D946rRBg--!U0p+(rfHdUy0g8bBil7| z#(*SAiV#As0i~q*1BH=HA?v#1_FhM8GkbRIKuA*%_6eFqHw9{XlGo%Vr4C}_~VU=D7j2Zv+ZBu7#RNv^W)TsA`@5iR-r z{uH1Jflmk`LXe=$4U`(-D1adZLD#Vprde$9JTDLog)-52e8ls-qO7R4EX$NiCGz2>M^hpv%<$qm(iiZ}6 zMoR-D>0IsaJMxG{Y}>d2RjW6vrV30(6EPYZ6F8>HNV?R1$KCf{0kGnsmD2!uH;(%r zeV%7tdOcCHtZxV*i7gvmP^mP#SVu{Fnbv_ifRbX`{znqyr~0 z27*2!u`s4(;tz(9RsZ(@E;#?ZX@I=j#+@tv$R+2TOduHiqAbbnvg8p8`{E+Wd_4Wsglg33qe!};$^pMO%P91IY~r7(9m@k4vRzf*Tnt8_`?s?bQSn|6a94~L! z&eib5`nt?1~6UTi;Y2jnH=In> z{^nU-ouvDFk)}w9tlcaZPCVrVhWht{kQhp4mkr5@6Q)h9cgeVW#S;MBeD7oDA><26 zW(l7zF=zffWJRt9`8>yCbU2BS#&bJ0O=JD5FLTZX=Vgi|>(9?&Rzc3i*<{PapLl zQt?cUfnqGc=3<0|ET-CHJT?m1$>!y$d2vi{nRg#1%2_XxR#RL%4 zE{7i@=M|nKm1{mANs>^|G%r^)bK}2BV5l;}G7q}i&~)MK^Uh=Ss^^eZjmCz=7Zx0G zRQ$T@Z<+?kyMmzaIpHIY;~cN33WNQ7IpL&}v1`gBxVA%bG=t}jcehnkjdg2Qx$imu zf{f!3tjywLvZgYwNpxz1f@Q#rxnt$(8Y@}G&^1?8RY^!y4Izp8&OKwdF%ZaOAed+& zO}xfJl|y;cDb!{RcXf6!yk`%t>rAaaYTiuoDIB(NK4z&z-*7hY`ua_O`>9WUoCj8{ zoCe4{dEC45sfNae#OEbh2{>k+a6CiwrN6VRKg^v|T#h@ctappwev>zadhbat?H{RT8~ zaIpD<1~X@LkjrM#{NeUjH}3ipz`y_Cs%e0{)5i68tl-OkdzlCZegAPw{QLPG(g^IzhpIisJ~JFt7%jMy z&dX5?4`+MNwmMJ4RGuxrp^<2e;Mf+9>nS5S>yy{~;%AX*fV@M-vf~a1Af3+suv9XA zrBadhju!M#q|T=I9GBt2QCy_D6;A=5&b~dnGP7rQx}IC*7P2UlZB3NTEUA*iC^60@ z#urabTo=9{-XKi~;7z4HY8Rs)DoFg%Fe9l<-FXRxLdcGTY1dabo%nhOSaSTaq>@7@ zih|{c1(q5;2jHPc9-jut+j%Ts`3wNJ-v87|iN=Nt^Z5drag4qe`|b-lmGesS|9NK&~hFXZJUIOB}dk^P3s| zfJ(AZzi>*HWdgcJ|E}E!1e`~Cbz(kRJLu|$XVx}Pc;LhBCOeDnrya+ zRFm$is4B0oeTj>%xJ)q}LRGdh1u$y0!$i|)f1ubOAjBbRjyD4k09li;CscBj6@_px zh*vZZ`k5wh(g{c6m<1dZW!LWBum17b=ap%IyiLbFE1%(k$DUVPTADu}jm27UibP^@ zqRp{t5nTbej>E`E8dubu79o&?hh-H>G$vfHoYKBuVAO)GZeQ#l0K7$@ycJVR0IDKm zBT+2Xg+-V-vx}`8-#|ME2tDAa6OU)0cPED7qq(*HW64x{<}^UwrsMMSmg2bH8HGaW zbSg_WSJoc2QM>*3%e06+Ta&!++Mb{fCB z>0SVA*Zq#=cCrMRlEbMgD8`2CSm?S;I1wKZ<@AsVO=jv%s3|Kf zPO*P5Gi!gE;?Ln9wZrGrDA*461kY7hXD55M@4z^SmXd{_sl6FR_ONUhPtrf~uiyH{ z%&&a;i_-vkyNvrDf056B{4#!d(>-TK!qJlz8FWJ?+}MOylW!#n$fU9qizbq+*4agN zseoZ6Wi1U8_KhSY+1st{eiYy@%h5Q6F3(9ek9Xoc{3CC3L*V5cX zYik3Ad=||Y;E3avUO8=Iy-mid)oZ!rtP{BZiB-PlrlxC?nJlT%Vdfn^AAi7K7ng8s zmuw~vLN2d+sCcg=Jgic|Yiemi(N(<`4AKPe6bBJvspej;xtD9q9(jUUHObWSJZ#6N z=vox8DS9@x>y+!5zDY32fMIA9Z3oAx4<05G2~r~?liqhKPSVg2Lz6vZMJC$Nde;5- zEuR5!?RD3`Bjo5ETiyNmV~++v*VOOXjyubj8<}XB+R(5)2W2(+b4ujkm*PXGpIO7G1*s%3WDXi*uq0{J#?W=2^`P$ za9jt|v9UcD&vQ|Pgeohjl7cKr)n0=h{S>zL&`t8YL`(ks!0@RSGdwW`4V5(zj=r7p-mlvf*WV-6Y4+L3_M`p;D5Yqi;wn zeLLhiqdrF(bPUrmcReh6Vs|*}gPl2pR$m+eY|jnysI-G^g&{gEKR#WrHl%S~m*ISh zS5v!rBD0BylN))c)Wf6ZcAhM3=eg1@UMlQmUA~tc`C*2NSxSzD@IXgFm&zHBilpEP z*lv#UXlXl7YXhv&hS^Z+hmu3P6vVG+ctWrzGsv%UtGU&`gIApa5=DhBC5j@+WX%FM zCD-t);)|sA^s+cIi;%9@fk2id(&;q5P^hd`55Q@H;Rvt4`WoSA0@Jd?r<`=cqbnY~ ze|TDh{FROimn|t@xM1XCd-?_r4+n$n+TO#*KJ{_(Ry}{nrt*XgKU=jld*T*LwkotX z#K;zMJZNv^p_V?5&O`~Mq>$-Yp`D?0^cwk9jdYPO`Ig{$Fi=eMtNbb+Rr`4F?glRJ zJ{-3)!zK$E{*>Cv3TrFtf?0-rCYCDj6bVmAHC5uvojoKMWDhh~!skjPiW;4+pLuSC z1td6JZ{%yCrTkrS2~Q-qal5>g7s5$a$!oYSxt!`8?rpsH!!f94z!|T)wl~ zTX@#WW9S+KspMg@FLDyFc^V*p#pAa7pPm^E1^&iy1*60JIA!TliY|2#?(|5KAO6?( zd1>owQ0Rl@`Jm?Nx} zhZvL!c$&b)Lk3LCWKD7hzjrq9N+L(mCn1E4@IbR5V0r{g5>ZPg>}dp1F(d^cWGu<0 zAUULDhaNT0S~Wvn?7*^Yq6LMcXkeMYgDb`9^rl9+mu>thlHy-N>$owwna}2q;60If zT$$DQx772z7R~eh>{`rGm&>AyIL_C>Olu2U8b-Ny)1PS4{9JtaNvQI;NHjGh`0{^z zn~k|)gj6>7Vj01Yzw;loR+c4ufCZd=-np!N@G)l2Ur1xr|E)hh`=O<5QbBJ9ap#qLMH| zG#33RZXOS>96)hA^ny!!QstOpl;e~(7W!Lh3&jZ-eq;fT>rt{zvZXwuxg3Lbo_;sS zUM0^qEzj#pif_eA#b|9UTTPJS-R z$#Z4?HN2GIBL6&2&Ns2SA;s{}5cibUajdz3E?=U0F8zT3OBO9;d2|ywzlV@zN{_DN z&U^0WD_{CTm791#Q)7&1G=Nz$QGNb-{e8R61#bDxZ?EICpZ?S|2l;Cmx8HOvcdUFi znn`CK35LSbj-K_LbJ0a8hEeB!F|#?o{lEV|He4LSJ7*@sr!sFOz{SQbhV9)^MrS;fIk=Q%;?BqIAsjgGRBA$lVYFS)&B(rIQBVNR%p zZaGf404Xy^TDEXhfu&1~`doGxc{WI+Y$^>fn$2LKplb#t&t_Y0fG0COtSI*IjM&Fk zHH+yvbmUY{&BZu57pE_urkKrh zqTR?#Rxi8bkoF1sawA;qKMbE-lWd~OM7EFecx!>8Y=Wea!^HQ{R?a!&G-~sLRZS&5 zI*Mt7khR!_=bqKK{GPjC9vMw>)m3lL5Xn0x4zm2Q7kSUANAuv5tB#FE!XLG42hX$U zn9)(mJFocvWfiIQkNQ{0Kfd%)ohw;!^!Ok+ryI}o>nl59#8pq zQ;h2fA@FhqN}Km`UvVvW&fQ0LU1zZ=B zd7>MWbnSy3&M5yo`waig)7;(C&qz!uSBEz(+`&<_*ZSyuW{6lp<~M;JzLr?aV>3&X zVqpw9fQE*GjD&)Mf{KbFbR56N_I5#PeiSsdy3~D-UZAJN!Bxt|Q*1@zX=^9DoD_KF z^}wS+xY^vmj^TZHu8V_<;g9g+>~oVl9Lj>P#ZDoTkt!yY$I#bK;Wt-bGbxF&wY3>T zDR<>X3(i^b$P*s{_|ea=oi?%lr^YS!J;fhxy`BdifAI<-DgRJ19aW*k{DlkfhXYlg zq%OhB&#mT%cmABrcTT_-ZW#y?%-e0C6kJ}IoyUuY$`?G9p@hlE5plex2r@D*F0O4O zk|mOHnb&4{?2QXNO#$KIxHew4fauSlI)cGAgXfxayb{fk4oJANz;hkELJ4;?hn%+1 zRD;5TX12~X7>;Vlx`8SbJUm=nyo$t1NXW=z^Efs(PC&+P4WY;e8d~{r#ldL_B6I_V za_poK5V(l|w!aKAA;~18f>KDq4QmKde&20!p7S#aTK)05bKDVY=GiyavbRmc!-1|C zsTD7A#;jvVG{mZy3g|k${rxzugzZUEAQ)(R;fY6XyZQGw*wY&1e`tK`O!fWb-+i+bTI%m7riYQ{c`!Z)M&&+f!oJd<=skdhx9VPa9l!9o%; zh8`l+*iK;X9K_sC?5H14cvuuEkRwNq0(neISXj7tRe%Vj@;8w@%zy&2f`*1vxtxw) z#rBnr9|?hi3b7!?m|Bfy$jHb6A5ME1Z>(wypa!Z!$!Baq)k!BFM|PwaMNt?Y%^vrtlbas^03ZNKL_t)w?_G5Pz_r)kJPnZl zsj+bGj1vll!g~}|;q|qD;@pcb!gA{zSFBsJhKG}{Q9QK;ud~6ZSy3rbq(}}669ttJVd69p z5ivB`kE3|x$&n>Zjtm9zSeV$@Wgu2=W%qDp0es~q#*4&PYX!+D6?3d?Zn=~LKV`E_ zL#h}IUIlC_YB?@bqn}(%UTRa>IIykm{0d3p6s?2B*--Vfi;EgrKDv&+-Mw|^S(79h z8=?r;A{Yu8jg8G8{qaw(j(p~mADsrsfA_fSp=Y>f<#Ya$?S9L0JfG(jm@{`Snju$R zkO28imYeUsoxXDuxB;~a4k+hkWjcJA&3+`c(io~(Y4>3m6~XcqT3fbu(<9TJ>Vt0Z}>529}+AGTS!2hODS)y8n`S3yzrm!>fKc4UqrN zvA2Ji_np5KBypT!_|7skl^t8RaQZoCV7oQMT!NRLe}RY0b(qIAgCwe+Ed=;fA2MnM z3`)5{XQ5aQ9qT^iih1Q#QU}ZMD92dcO5%lrf{uZVjD>}bRS{T&AR!EVxVYrWQ6!Ip zjX|CD#Ljg8Bx$)cI+vLvYE^rc&YjQoPcA2)FVtla zTfpMQ3rUR(p!ou_;q(9f*Z=wJ{P^d;o(9N&*Z9Vj*OVi^e&26Pmd)N>TRHjka!N^U zNgcaja?^viF?@OhBJLkw?1aD*peH@DyL%DQvO7`~ZS0Uh4u&f;aaqv3iuM>YSDcFe zsMQ`WPMM3~qM{NaM1TMe4mom^DB$9up%W%T1C2D%OaqN1NDwDMyz*%I@g|}~G0^ew zC{iF#4i~oyECU}NE+!@(9tOUOc9E-wS{cB4MdMJXwaT!Ns(M61X1h^hrL%p~Iq#m+ z%~|U`{P@b6sH2h9U3u=hdwHG9*8>(Ec?7xSP}x9K{h$5efBt0dKYsD=rUCNbF>d_B z!`$?vZ*k+@kNlHavgSCpMLZUwd8~CoMc)U28?U{ACq)m+x%2UCr)D{zN7xACz21*} z+Cm&0Y%KJl0?OSxaMtzVWYU-wQ%SAZ_YM{Xaus1TDgx?}B}0)C8ajcB*03;1k)%i- z6_qd%qQnRiL_xvCBtwQINs^2*$_PnDNs%N=7Q2SOBxoQ;3=N$UMY5!Eu<;WhN&-KA zENlwo5eR~WDrTL)q=bu$fu8_DB;+dB(JCgLRC6n75-Z(Z3>1=+&i&`RPRG|XK$)7` zsQ>sL{_A%?BU3QzdR*&@%#vdl)8D%n$CGKFHUGx|KmXNlrvdVRbNuG!`}o9r&jkV^ z7zqBLVA`049J9J-6A1dp%k~S{)U%U^-uNT=OS^Gwv!>o>xp|F9ITRBHo+=|MbF1AJ zLJb87T(cUl`}=6Ou0hydHO@dCL6&NWGSxX)K|!h^(_FOK=*=ReK&ulldIg{+CUBS1XQ zLkPjWkG}Ztx?z0NESa)nrZ{%#Nf-hDnCBMRgR6h^Q?AOdr1%d@AZJ#W{|Nz-qT*Yh zp?G*RZbP^t$YUP;vQTL&*JJ(jz4$(KJnlc8iPM(?(?*E~ks6~F3*W1;;-v%L*FPfF zL5#ZN#^6SEZ}KJc>i&8)f883V!r1>_l}Sx}#H;a_jUQp*@!>r_e$sJC<(rI;-MxD` zJ#{;Shs6LF)s>m^fjhYWXE)N)+JIB}UJ~%aOKV6KB@{&`m)!Tzo?oM+gST!Jz=_*S^MsdtbnM?|i)ccnK3xDO{!GU8Fz| zH)`Pj!#aXbZL5f_52?}+$~y08pM@t)*4>uw_7YPYVa_Rk>Bf0hWzpv9E05fNFVinSO2*R=E;~std zvBdz_TzBJNy}Z5c(%r8(_vA9S2!}s3oJ@7c<8juneU^`Y?lU;v`1{O^@LVe-1O_=#62NSP(B{AO{V!vln0#Vc|ZV*6w3*GI@rF zh8TEZkk@a$7O|+E*e^c~3%e>s<7A{AgQ%*G*WQZ2tTCNLovmNHFZOe**CF*YxmTk< zCjMWq6UOyKSxjNZR9wd**2J%NKF3v|E9y-TA^7Obleo9%K?dhW zkbumIt=#|Y>%4czUb<$sSC{3sH8o=9U!bwIi$bB)5NquCJK#&7`_w1?>gDZinQC&! zgHO-&`TSQ)vKrmDYYS(da}NG+u#x~+7NO1SH}b<5Z(;D<7Q8@(I*RewhvW&2ofd@! zaU|V`v2qjktGkJP;cTSy7b3bF5v>uFc!;>IF>h0e-Lnj$y#-_;p=c_tZLJ)+U=jA# z0S5oHp2%@?Q3i7;sUqrV5&fnY$o%jwA{U&1>+@CS=y6+LshQcw`Git8!z%~SJoPN1 zRufDFqS%iCI2nr6KyoZ%ve(P-QD-)~R^MJE=*bKxGpvi3a3l{YV36E5O!q#Q#fui! zl~3yE?Bq{>dVz4PkyJX<{Lznn?D1P}{N2E`2Kh?@gRZs z|HsNjxTIrIe!S-?z8$=z?z2OY2%!GjlWR|vZ(=VUoqVvxu5sOq^zL9{R zpdl0RskmNXMrJtk-v9LYym$~c%R}hSa zt3O5qo__opKEL8h2LApq+=v3+xaL5V>(I8p0y`J`QR3kV^JckqVBnDr6wdo8U1y(& z7c%I3Y!##F6uB)77 zW4rNn&p=dS54Cf?sI&aXVZ(mr_wmc-O#sQ%0CB5^m0N|z_jDwJV5uN;}{v( zo6L<49QKh9T-rZP(*FYE_6Pn5KrWa6iR}^^9Ufru5r-3ugsLJV0Lygv)x9?`azY$0 zp;IlsTRF(XBOy1iXLv74JYEIISe}!A?LMOSzK(q7t9<;rt5BAIgU}uS%zJ+Q9fTwp z8X98GoH=~^+uz3L_tUd!Gdo2dE?GkIpKqq{qq~uW4^Q_&bArf+E+p7JznU~yPr%g) zHw~@&pIS*h(JFiDgh%QhAKxawt6D?vRaE2}nqP0$)jNO33_=%|LMYB3a<5OiF8)}A ziw44U5Tu;1W}|#=89%z=mt;%z3A{dCW5MBbNR12-49B8F$<(I+uKYhgp5`Eb?zrog z-*Nq&k1lR+YreWz6B?kk~7=zr{| z_@224Rj$ku<#|GXW(VHqZ%3cm#PAJIGdtSE*=L^32E!z>s2g?pD(?Qn-MsO}8(e$s zwY>4h8{l{(S8qn1(?Z}g=P>f^TggBC5{b)BrT2R`G5qD9!YiAJoqIAu){raWDOY_> za^2o!p_S|WQgYoku8SsenK2=s>|&N`OgHM7hp3zfX@Wr~5EO)kV#6}830QEIOV2h!(FXhh-&wcbaP4;=dt~Lb2Kh^j z=9c&mQkkMK%>se2kEV{c@sj?)&RxCS`RXH>7j=^XUJ;GWjM?&|tOO7%-&?!9@uPMX0QoORTo`O~GVkJ|TA!w#v?3i#-0XUdlCh{f^Oe zzV6UiC`3zBoNOjVqOpYsA9>=hI%4=&50KmMe*%Et-}Bf>iX@*b$r7?xq^YgBs{RCk z>#_2Yhj^_kkF_|C@Fo|NcEz9(NVi7m|`nq~7DKagMF@$T9%a=$rw}0Zs8*fSg z{OBh?n>MlDv}twg4gB=Cw*@-dTE3GnIVT1JI?3T)PFZ?NwP1h*?B2SA|6Fkc+b?g# z4an7etFfS<5a72BNLpAk;|N8ri(l(Wlgw2QkXg5D%I{HI13jBeBkvd_o-t|D1B6SE zeR&h&D;J~8Zbd>Nc+w(*3+52{>}4S2{e<+?{p_oC=9F3&G@L47q~5@i>WIIzU+3=F zeyx*&nzJ&|1XCrQp2BV}Q)d&Bje2j7BoWUFo>0o=PF-x2+3gJ6`Xpx^c`}g-R|JSf zqrCCPMuO1>az)z+1cUtk`fDG1c;!RW0C_9ppT7RB;~h`@NRm~taosDt_e1Z)t8||o zYr1*=eGhO?a5IJD8}a0tOFLGGT9Szl2nrzsrzu$1lw2SnY@jXQK(Rl0(C?Ga<>+0# zo`Hv7V9%|Ovi+tNs3#qUrs>GX%q@$mq+-lyM;3D3Os&@Fk%@p%rvOg9X;dE&Yyfpa3tlGYjeXZq8Usn?pizc1x(;R)w zk##{vAqo2X`_cUop~zDFjMGkh_}+W&8J#w<-o&`|{-?NQ`D2DAP>j%HL{ zty>H=IxxsxYabl z|C-9HH5K_E+aF80lqw-hflQ1z*N6?{VUn5=4}`cZJP&C!TLzkt$S!GR`L4AL435+t zJ8#Zxl7stDWQknCTo6ihTnsQgGBOR2Lm5x4dW{cXyo_Kd+^MMgM=aZA{cA6C;YH_R z*MLI>?!NCq*0v_G=7sURv8A*X?NPykVQUn!1w?CNf`?{&RxMt*fY{GIf!-8-b6?hV z%l@L0jk+&Y=ckeI^K-;|2*3$#jXM+5XJw%X@3LaatWW-nyGv6;AWa zOOuaZddi6m?At~-8b?vI5B~0^TN+wtE|><$p^Rn6FD?hc9Op*YgMq%ioV@g8N;Sf* z0b4e1<+c~^qjY&Uwrx`1{;3QSS9m1)HBwzVQl0jw559Slg#CqOByRf>@e7VYKEybx z8VMphphz-OJW`h=qEu=5RA8B?KjcZEFaTd=n+S}l_QzhMBk&{RN5#t&$o1?%wwOTE zYt!V%_>N9#<4!hx=v%Bi?vre}@T+V&Aq=z9BlmV_6GpC@vapg z(p2TdOeRY}mzXtw?j!wAEPEwTXb$)!5~g zd1oAke&c6pzV#nyTDlnZAm7)@7U=oK9fXfL45_0Txe|1o7>rY^B3bWM8Y{C zWy2@FN%GMb>VBi$JIuh9x3KpUSCY;SlTNhq@W^XZxO^qv7hOPGzg;<_F6z8lyckb% z|H{WE9e&y=C$ek%7BpXo=H{lW0G@pMkAF3?_*a>W^|v3q2!O_hrXQCaf#;ZX%xK3S z@K+Nobl}Oyp5wXE*D&9EG?dJmh`FeeK~E7#YX&h-=tLST9$lw5m`vDlaS}nK4<3(t z$r3u(?8UzRS%x2cfkNN#Wb@myXgO;cP2c-FBvqdx`Fx@|Ge*2+R75$rRsp;YWQT@$ z>c9Sr*KfOx?7#rHE<%=>clOzQ{N|f6{N=R%u@(zs=Vb4O4Lo(#RqTB3IWoPyxR!-$ z+jyRbtSG21XsDId@B({+7fV8=@A+p*uU-#8^t5A`d(FQgHAfk|>k+np;VLpKUS!|L zet_@Zt9V)+5iglT6m4`pfF|ixxM&E}3OF=? ze4ZDtzM2~^ypSDFJ%wvoWd}l`fMc2rZr+ThX)HSZ^lHmCrLsAt5?9Wh%bwM%vGREo zUB?KADP^-|*Xo=(EcoCD(fol*zS+cBI!Ng3yzw>$pLh->=%@P!Um$j zBAql3;hFV~0>>`9A`#e>C%a?@RMwSKlRi5wo_pwA zvV=t!UBv8@P6FHJo^O7Wee2fYxi0(GuEi^r&?_CR#x_ZoIqzTog?uVS(}D%G9ep(U zY?hy&TwXupkH;}It!B-*TyrL<>gB@LavVsFMG4KHiwu=?MQHl)`J^6S#o+Z1GVq<> z(Rb--tZE8zl;a@D^>gi_1xIk^gU@sOg#jGEB2Vax7jg67+{C4qUPNOeJnkNj$B2ja z;yO02=4-j{!IfXSn4Vc@QdQGR1O(*}$=+VXtfmRBU9GZ>iKjG4v(&>xLneT|tDnqWPatp* zn1BgbNVqlYz%{mB`D<2P_!)Zs^EYIBcHlV=eq%)aWXlsYr3p_QfC0FpOW z0MDU#${g<7wT8aF!MbCY9CaikeLGPV6`|;}7oT#`#Q?vUkgD>o1;`yMp5n4|ml6tx z&QetUsG#3qWN45%^Si5^j0BJ#O>^Vpchi4L7*CgBFo$>ZtB@*|8=hAX;uC&kOCj&C zsXsoNrS$%5D1GtadQbd1**l&E)287c zF0ayCxdt8*GOvE@EA0FK**ov}sOoh8zfYN(ne;{qN$9`SE?E;2Xw|-b;J8pO(gYG;up-#9 zd>(RdZ3C{t5+n>^L5mUwlCBvEfV=o2@}X+xDreC2<^Yi;i5VGvNIF#(upPQvnK_ha zVAGcE=n>~6B_$vzjfk>2Mw87q|MB@h*dF@X-TxmT0MjOoWag5!21NP4Gz1PG+Q;PU zt|ruSZU$B^U(LqiooE;9&~E!0wcERBPp?O?8NgJZohi@HKsMRKG!zL5LDf0+)a#VaSw)*i z?qK+mIam@>5YegFwhMste*MVo-yg|Om=#Blvf|-~X{@N=nwMT;)b#1TsAB(O1gc9) zSnR6S8Fr9Fzhe;0vIXzC8ibA+2xy?Fc%NA0Bd+JC zVEXk0ZKXVI`$rKj&CnDoGewGst z|B1A#$I|%^PXvm<>8Kof`E`^=2VHKvjZTw&z8x#@?bA$dOp00K*XRE&*x1 z`UJ+M_V5Xm%9DRlLX#jOC4w z-oYK=jPKUD1GSYGkt7jaw%oXK)tX+n-aPd`7a$A#`5s1V%xfmIHMX&#fmpkloVIyk z&YGgaBI=xt2wjRGlts- z`@dBS1l&m-TOkNdk3z*frYEUup20SK1db)!F?PtrHm-j}i5?%h9GmtV3<+^`eD3F% z;u8FO4U{Zh$+?wluxDp8_T6`Vr8t3O-+aRluf2vTCWeVmJw;~QwgIuL$*Q$+@nYV( z_g(--+;9Vrz5Y5jizQ4Im@Ur$03ZNKL_t*iGKGYo;Ps-r-FO-rXsD=Q@9Ncf-EN<` z)?}jZxN!m9B-HZN1db+uiU_24?MiBY-^5Y9?;sW5Zx5^SC^Ts!X1_9D(}3=FlWfT3 z4SjFaF*e(6Oe?b!iyTN%Q&SQs=%2v62<{*NBS#G8+?fIpjU*(cz5(#%tU3RA0GYG& zTc%AJ&DJbbf0ALk!OBJ8>!;g^HJB7?(k{LPC8 z)yF+dMhmX(MHmKk_4}Gt)YmqES;jE^3WPXc1x0kwN_^4P@}RbUC!^ooD~X6kGoJlt zaP2rr+}-0aWT%924+#@RfBJ}qLj|3s0f|9l&_ z|5Zof^lQiZl*q)SJ8BzU83v<~k~2rRZS?do<^1H~<19J5h58$E!K;8KLZt&5d`F3G z5ZgR0G^s!HjKW8&cFRR_C8(F3KhKlCZ0(kIUR9fBGMPA4aFmgwhJ0X7E-{o_5uocZ_2*z4fI)fY}CmuA7 zSW7%r>rNuw*vqF3VnAJa5EKn*WCuihJOVytQTHf#S02DHtRqrZVuVlKfP2SLT;Cri z?w;|OyR`M!w2}f`=KL$OQ0p3K|LLDFniCLE5s`78FJ;efpC`6W8+twV7?Pi`YtNnI zD|A7pth|P0T3N{_MLaA zudPMXbqr=Rx-TmX6;K2Lud3qJG#oA$PLBtN+fAdxL8HTgM^&+;rD4m;!W$xDY5sK$ z=y3DRh_)EEKlvopM~`vn>6Z`<29QKFS8&Ep7&{PSN)jq6wX(`_lf(sAB^j2aW@CMA zpW(c*?Oo0cYlDgh4G+#K-B|I=2CgZ+mR7A&fE*N>ay;0m7~= zETpoazz2FwW6_gOvieVd!dY93qqde-ZQAg{^5tAHb}TlF1wDjtn?#?`)&d9uiShCN zI#|I)@!zGvU_b#(Rx9>^&p)`h{o6v%m;8(B|J^o|CzCR;Kc|;0;>71)P_b<{0oE>w zWZi!g*^k|h5NJ56bHL!@gu9jub5b)dBFQq3CG_Dpm1j_r>JMpa$y>YAV&sHsUEMr^Bni4g{%4m^im) zIp-FyBxA%ddOY$-02~sat16lr!aa ziIyX_OHq!Cwk}0*BIzeB0@mbII^TC6lecbSn(G1+PHkuO;q{EG+E3Sa|Aa9vF02iN z!)#@-=Oj+e9d+zS=JcdvaWJ$;7X+&NCbRtP0V*oOGj6XOJ(45)cOptMjUI*_J$8K9 ze}s~ro$8yhB}w`uJ}w@oqmkY{I-|+KfHxEH?fNZzb8#Eul+NfLH5f#vxfIioM6)Jw}){FF+y<`L$--O0SI!$HZh97qoqY`1|-pc=Q;*c z3~_Bc5Z|>Mrq~1oe*x1_K{5-ESBpVogNx$E9u;`TbNn5 zvbvtx3%;cMuC{nYPdK-BDp2YJh|n(+K?7qwD0VY~(GW1>>W9vQM?t!|e;D`ht~!X` z=tdsd3DIm1h))6nT3s!!{QbyzY1k$V@H+;B5nADC~?@@c~ zB>i7`k<_leLORp>mZYpKZvFgo9?Q??sf`k%yH8oYFrYB*Giw#qZ zzFoDJEh**bz0<)P!aV@Nsi2qC`ql?zf=fZH(@a6X zC?;GX3TT9g{bH2!#0X{n$AEA-fJx1MS7=r~NQ}}UtLc-9LRL&?KB?W+0@Vpz6_Z7` z+5~?nk*_bV^yC!YeE$tRYIqQ1+q@j=s>%^%BevM22WNdbGky9kH~;$qWMGdry!!q; zAuToOH#Kz*n<(lCcxj)P8z3H4)7iCc2U~J#XiN}-#iyIX*+l`pv>rSvLdRr;BrEFf z5`+P53D%+!z~MnJsX=U)>JLNlk&buGVf3R6 zM5b})Q6Gm(h()s7&^4VC&%Hs__I-4F_E*^3wh1|hW*j86e_tfgUk)r{3qXmsFH+Pp zL@^T!Er20%2?tSl?~!P=wwm&4WJHRoXIm1~)<>^1*0WnLdhNZ08&6MEaK#CXpL1iyF{;1IPATpJEyo!k$>Vv5K>lxW=L`(34~mWF-DIPugg6u$Z~Y2!wa zGh=F4x53Dl5CM*#vOOBWqHS;LXQC4DTUbyhz!w<4y>pqH#&&P<8@peI!&2CpCNy)J! zCne$vnX#6ySjB0`lownmXovVJdRuEpryv3*K5cRj0l26QGMoM zImD`UxCG_<ZkI#uJiXw4INu;%I zO>Vbt^q(||A=9Q|^7}(t66u)~a?s2j75=(Zhp?pMA5V~FsHl8I)!WuXgl=Ic-`%2K4 z9z=I}nv-Uo%SX7XhIjdX^b0kZ9vtN-=J0y7?r#quwMsy4odRJk0Q{qnZwdKbGT4k8~}&aW~2Aep|on< zn!>|}`DW%!{(R@1Jld}xd%pY57ys1)NW>`IEwb2!7@>Ux*MfS>1%rXj+PN0*<AQ2jYujhZw;r4FmngV`BO|Tf?$)N}%bD?hrU&}{m6^AssYoI53sPyk%e;7mi4CIVNbS<*DkA|UDc=$x_ z<9CsB=X5_fgv%0oG{SEJiK41#x*qk|mX^rxFdD-X#>`eLD~=pt_Qs7Y*u9(04hOHS zTuENnt`zLq!|%q7Vb1fx%eKG|31FR`k+Z+>_qIIq6OGY6pfJ`y(X81a%LW2d%6I zrML{`SP6pJh;!p%DxdxwwWcwsz@rj3+7|{cT1;d;Je|(3K7|%2ClT7MJUXX{BzzI5 zE-T}cC!b{FqD6Q-o`AsjQ-PuT!$z*Z?KZmi=@TZmqiMd_EWfBV@~W%&Y}YOxefM1w z)6<#%hd=Pz)TvYy6(RowE1DRhclZif82t54qLsk*k(LDuo5V_rmD;HEVKf-HA*CC( zGnIt44t0)d%a>c%(co}}OClqOQGDt!veAN5;fB>~*SG)gq~HJcx>%oo?DKlw^T1=@ zcr_uTwz`teo!XF=)e2GY=a^~m-e2Ef_0R^?UMUDoX1=BfTTKVI242;d8f!CS!iYAp z8{9n%aawQ0Zdv#O6#YZ%Qc+hOf(y0i7iyr!fnYad{@oO$j+wsibt*VsUxVYNWw_>U zK|NQ2a<-htd7E)NWBKPsTkYr;-U#HN<1VS?ho)}?W zIL0tj_)W(|*VhPVU~#@y(k#x?uyY`}HF+GZU}>*w94-yo$o9C5t)v z<(HJ?ucP|VA>6f9NJ()REODqP5pAb^>k0~r(Sp6Yf&nqDqtZwsCeBn>a4f+KqHl^2 zk`gKUVJAIFp<_sHP>j_|Vc{8MlNC`mBq?6cq3f@{YTtqd3;yo`WZkA+%=-Le7OmXy zggq|)&iY0NCP|}f@2(ilrhxTj-}b$HbZ9B%x3@!UGSvzpIzZDuf2Uf}r9hQ}H$5J~ zC?S}Pem_S@F*Ku$zPkv0e{s+vF}wq&Urs4{HG z!;lacl(Yqzxc)tf?bZoNlAE{tp7gv8v>B3bso;`!T ze|KcF9TiWrrlP7KQs}wF%|Z^c+`N#h$!tPBU%`%e1&1NnMpWvaO~JEYaND$7kV0-g zBO{$H+jo+lnM<5i?lF4g&^HDQ8OfYkGyiXiSXU13&-zU}lH%eM?x|^TV2d#$n?&Mb z?Sa9rt7~Nb!ucG#G6t_fyS#nW|1NtabX`WUSwrU02=XzTkgn|o@fP1{F(wQTk4A_M zHgeIb8qqFBXZ>P~8ADzxbeiiTzOWTN@VmiA%)zCJutGmK5p-2)DSw$bk&FK5UTbX7 z!c$pV%G$YexpUYst{F0f_3PH5`av7{osqw#09ko?ygqj>qx>npD`(B(j}JfGtW2o_ zq~+%F`|rNPV6jko^eA&4dWibU%BVwdbmmMnk0%IDO~X@FL*3!yoPOm4Hn$m0$?OG4 zVFieq1SXA&gm`9GZf}uRu4>XF6vxRy$;_P-o^@!oSjbLK#?e@ZXpYPI zX8q=SuNpV%|E7p_&D0t9m@L-mnl4I3XHPNVs&OGER5-ftFmIk%M%kn^1d~hz+X(mv zn^r_Y#CB1jG0lu%w>Gmhg?h2Yju{AvR;X&k@QW)k-7&%+OXQEcI$e%?=H{rNjD2J> z_VEKloMe%q7E+*(lhi^x&1i8^p2kN0I&2sfXU_OyjUIZ4mp5*t%YXsCILyXIAMv?d zl%6}s@>#Q3vv46Xb~`EQ>6k1QBvFhC65Y=wOlC6^r%&hP;lrFhdXyu(b|D#!bR9G( zkTcQ*C~I6C>0P_Beg1r^i;Gbeg%0D#HxscAeEczWMZwA?DZ>Vlch@b*32`X3^>{8- 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 a{;R)&O}^ZZti}5P0000. +Labtainers provide controlled and consistent execution environments in which students perform labs entirely within the confines of their computer, regardless of the Linux distribution and packages installed on the student's computer. Labtainers run on our [VM appliance][vm-appliancee], or on any Linux +with Dockers installed. And Labtainers is available as cloud-based VMs, e.g., on Azure as described in the [Student Guide][student-guide]. -[Papers]: https://my.nps.edu/web/c3o/labtainers#papers +See the [Student Guide][student-guide] for installation and use, and the [Instructor Guide][instructor-guide] for student assessment. Developing and customizing +lab exercises is described in the [Designer Guide][designer-guide]. +See the [Papers][Papers] for additional information about the framework. +The Labtainers website, and downloads (including VM appliances with Labtainers pre-installed) are at . -Distribution created: mm/dd/yyyy -Revision: +[vm-appliance]: https://nps.edu/web/c3o/virtual-machine-images +[student-guide]: docs/student/labtainer-student.pdf +[instructor-guide]: docs/instructor/labtainer-instructor.pdf +[designer-guide]: docs/labdesigner/labdesigner.pdf +[Papers]: https://nps.edu/web/c3o/labtainers#papers + +Distribution created: 11/22/2024 09:42
+Revision: v1.4.4e
+Commit: a3a40d0e
+Branch: master
## Content [Distribution and Use](#distribution-and-use) @@ -26,19 +37,8 @@ Revision: [Release notes](#release-notes) ## Distribution and Use -Labtainers was created by United States Government employees at -The Center for Cybersecurity and Cyber Operations (C3O) -at the Naval Postgraduate School NPS. Please note that within the -United States, copyright protection is not available for any works -created by United States Government employees, pursuant to Title 17 -United States Code Section 105. This software is in the public -domain and is not subject to copyright. - -However, several of the labs are derived from SEED labs from -Syracuse University, and include copyrighted and licensed elements -as set forth in their respective Lab Manuals. These labs include: -bufoverflow, capabilities, formatstring, local-dns, onewayhash, -retlibc, setuid-env, sql-inject, tcpip, webtrack, xforge and xsite. +Please see the licensing and distribution information +in the [docs/license.md file](docs/license.md). ## Guide to directories @@ -52,16 +52,23 @@ retlibc, setuid-env, sql-inject, tcpip, webtrack, xforge and xsite. * labs -- Files specific to each of the labs -* setup_scripts -- scripts for installing Labtainers and Docker and updating Labtainers +* setup\_scripts -- scripts for installing Labtainers and Docker and updating Labtainers * docs -- latex source for the labdesigner.pdf, and other documentation. + +* UI -- Labtainers lab editor source code (Java). + +* headless-lite -- scripts for managing Docker Workstation and cloud instances of Labtainers (systems +that do not have native X11 servers.) +* scripts/designer -- Tools for building new labs and managing base Docker images. + * config -- system-wide configuration settings (these are not the lab-specific configuration settings. * distrib -- distribution support scripts, e.g., for publishing labs to the Docker hub. -* testsets -- Test procedures and expected results. (Per-lab drivers for SimSec are not +* testsets -- Test procedures and expected results. (Per-lab drivers for SimLab are not distributed). * pkg-mirrors -- utility scripts for internal NPS package mirroring to reduce external @@ -82,6 +89,434 @@ The installation script and the update-designer.sh script set environment variab so you may want to logout/login, or start a new bash shell before using Labtainers the first time. +November 22, 2024 +- Replaced google cloud VM, this time due to a failure of systemd within containers. + +September 23, 2024 +- Replaced google cloud VM, which was using the wrong Docker version + +September 10, 2024 +- Typo in creation of imodule path + +July 26, 2024 +- Modify capinout to not use grantpt clib function, which now seems to crash when run from a container. + +July 22, 2024 +- Add a base container for Ubuntu22 and changes to framework to support that. + +July 5, 2024 +- Migrate to Ubuntu 24 as the VM appliance +- The docker pyhton package uses a broken python http library, requires package downgrade. +- Use virtual python environment to avoid Ubuntu lockdown of python packages. +- Add boot parameter to allow sharing systemd between containers and the VM. +- Redirect error messages from broken tar utility on updates. +- Ubuntu update breakage for msc packages (see update-ubuntu.sh) for version 18 VMs +- The docker-compose command is broken, use "docker compose" +- Force socket permissions in headless labtainers. +- Update headless Labtainers to use Ubuntu 24 + +November 27, 2023 +- Add Google Cloud Platform option for ubuntu22 on ec2 machine. + +September 18, 2023 +- Previous fix implementation was flawed. + +August 8, 2023 +- Handle change to DockerHub image json format. Thanks Kees! + +April 17, 2023 +- Force use latest lab version, e.g., iptables2 intead of iptables. Fix tab completion to only display latest. (Issue #77) +- CyberCIEGE lab installation was failing due to X11 race condition. (Issue #76) +- Note in CyberCIEGE readme to direct students to save collected logs in $HOME directory. (Issue #75) +- Radius lab checkwork was incorrectly reporting "radiusd not running", missing prestop script. (Issue #74) +- Labedit corrupted the start configuration file when the MACVLAN\_EXT option was used. (Issue #73) + +February 1, 2023 +- Bash history for non-default users was not being saved. +January 26, 2023 +- Modified powershell scripts for gcloud to use the selected zone to qualify VM names. +January 4, 2023 +- Containers using systemd were failing on newer systemd present in Ubuntu 22 +- Add --zone parameter to google cloud scripts, with value derived from the set\_defaults script. +December 21, 2022 +- Fix xforge results criteria to not expect pathname, and add check to see if POST issued to edit profile. And fix attacker + http server to run from the home directory. +December 19, 2022 +- Add strace lab to introduce system call tracing. +- X11 DISPLAY value was incorrect if multiple devices in the /tmp/.X11-unix directory. +- Use of python/bash/sh/etc with no arguments was causing capinout to crash. +December 9, 2022 +- Modify Azure vm creation script to use a prebuilt Labtainer VM image from the Azure Community Gallery. +- Terminals on cloud VMs crash for unknown reasons during startup or right click on the terminal. Attempt + to address by start/stop of a terminal. +December 5, 2022 +- When collecting artifacts, include modified files from directories of non-default users, e.g., their bash histories. +- Alter web assessment to display the new "other user" files. +- Include files from .local/bin on each container in artifacts. Intended to make these available to instructor via web assesment. +- In the ACL lab, include th /shared\_data/bob/fun file in the results for reference by the instructor. +- Catch use of "sh" or "bash" from command line and skip when parsing for given command, e.g., as done with "time" or "sudo". +- In the tcpip lab, could not ssh into the server during subsequent lab sessions, the /run/sshd directory was not being remade. +November 16, 2022 +- Fix path to Snort Manual in snort lab. +- In ossec manual,fix path to manage\_agents +October 12, 2022 +- Google cloud remove background operator from gnome-terminal command, still crashes on right click + but seems stable after running a newterm.sh. +October 10, 2022 +- Fix Google cloud newterm.sh; expand that boot disk to 30G. +September 20, 2022 +- Note user id and password for TCP/IP lab in the lab manual. +August 30, 2022 +- Use the X11 socket name when setting DISPLAY from a container's .profile +August 9, 2022 +- Fix name of processValueMax function in grader. Issue #63 + +August 4, 2022 +- The labedit program was rebuilt with the wrong JDK, preventing older JREs from running labedit + +July 18, 2022 +- Creation of Ubuntu20-based containers was failing within IModules. Issue #61. + +March 23, 2022 +- Fix path to tap lock directory; was causing failure of labs using network taps +- Update plc-traffic netmon computer to have openjfx needed for new grassmarlin in java environment +- Speed up lab startup by avoiding chown -R, which is very slow in docker. +- Another shot at avoiding deletion of the X11 link in container /tmp directory. +- Fix webtrack counting of sites visited and remove live-headers goal, that tool is no longer available. + Clarified some lab manual steps. + +March 2, 2022 +- Add new ssh-tunnel lab (thanks GWD!) +- Fix labedit failure to reflect X11 value set by new\_lab\_setup +- Add option to not parameterize a container + +February 23, 2022 +- labedit was corrupting start.config after addition of new containers +- Incorrect path to student guide in the student README file; dynamically change for cloud configs +- Incorrect extension to update-labtainer.sh +- Msc guide enahancements +- Update the ghidra lab to include version 10.1.2 of Ghidra + +February 15, 2022 +- Revert Azure cloud support to provision for each student. Azure discourages sharing resources. + +January 24, 2022 +- Azure cloud now uses image stored in an Azure blob instead of provisioning for each student. +- Added support for Google Cloud. + +January 19, 2022 +- Introduce Labtainers on the Azure cloud. See the Student Guide for details on how to use this. + +January 3, 2022 +- Revise setuid-env lab to add better assessment; simlab testing and avoid sighup in the printenv child. +- Fix assessment goal count directive to exclude result tag values of false. +- Do not require labname when using gradelab -a with a grader started with the debug option. +- Revise capinout (stdin/stdout mirroring) to handle orphaning of command process children, improved documentation +and error handling. +- Added display of progress bars of docker images being pulled when a lab is first run. +- User feedback on progress of container initialization. +- The pcap-lib lab was missing a notify file needed for automated assessment; Remove extraneous step from Lab Manual. + +November 23, 2021 +- Disable ubuntu popup errors on test VM. +- Fix handling of different DISPLAY variable formats. + +October 22, 2021 +- Revise the tcpip lab guide to note a successful syn-flood attack is not possible. Fix its automated assessment and add SimLab scripts. +- Change artifact file extension from zip to lab, and add a preamble to confuse GUI file managers. Students were opening the zip and submitting its guts. +- Make the -r option to gradelab the default, add a -c option for cumulative use of grader. +- Modify refresh\_mirror to refer to the local release date to avoid frequent queries of DockerHub. Each such query counts as an image pull, +and they are now trying to monetize those. + +September 30, 2021 +- Change bufoverflow lab guide and grading to not expect success with ASLR turned on, assess whether it was run. +- Error handling for web grader for cases where student lacks results. +- Print warning when deprecated lab is run. +- Change formatstring grading to remove unused "\_leaked\_secret" description and clarify value of leaked\_no\_scanf. +- Also change formatstring grading to allow any name for the vulnerable executable. + +September 29, 2021 +- Gradelab error handling, reduce instances of crashes due to bad zip files. +- Limit stdout artifact files to 1MB + +September 17, 2021 +- Ghidra lab guide had wrong IP address, was not remade from source. + +September 14, 2021 +- Example labs for LDAP and Mariadb using SSL. Intended as templates for new labs. +- Handle Mariadb log format +- Add per-container parameters to limit CPU use or pin container to CPU set. +- Labpack creation now available via a GUI (makepackui). +- Tab completion for the labtainer, labpack and gradelab commands. +- New parallel computing lab ``parallel'' using MPI. + +August 3, 2021 +- Add a "WAIT\_FOR" configuration option to cause a container to delay parameterization until +another container completes its parameterization. +- Support for Mariadb log formats in results parsing +- Remove support for Mac and Windows use of Docker Desktop. That product is too unstable for us to support. +- Supress stderr messages when user uses built-in bash commands such as "which". +- Bug fixes to makepack/labpack programs. + +July 19, 2021 +- Add a DNS lab to introduce the DNS protocol and configuration. +- Revised VirtualBox appliance image to start with the correct update script. +- Split resolv.conf nameserver parameter out of the lab\_gw configuration field into its own value. +- IModule command failed if run before any labs had been started. + +July 5, 2021 +- Errors in DISPLAY env variable management broke GUI applications on Docker Desktop. + +July 1, 2021 +- Support Mac package installation of headless Labtainers. +- The routing-basics lab automated assessment failed due to lack of treataslocal files +- Correct typos and incorrect addresses in routing-basics lab, and fix automated assessment. +- Assessment of pcapanalysis was failing. + +June 10, 2021 +- All lab manual PDFs are now in the github repo +- Convert vpnlab and vpnlab2 instructions to PDF lab manuals. + +May 25, 2021 +- Add searchable keywords to each lab. See "labtainer -h" for usage. +- Expand routing-basics lab and lab manual +- Remove routing-basics2 lab, it is now redundant. +- sudo on some containers failed because hostnames remove underscores, leading to mismatch + with the hosts file. Fix with extra entry in the hosts file with container name sans underscore. +- New Labpack feature to package a collection of labs, and makepack tool to create Labpacks. +- Error check for /sbin directory when using ubuntu20 -- would be silently fatal. +- New network-basics lab + +May 5, 2021 +- Introduce a new users lab to introduce user/group management +- Surpress Apparmor host messages in centos container syslogs + +April 28, 2021 +- New base2 images lacked man pages. Used unminimize to restore them in the base image. +- Introduce a OSSEC host-based IDS lab. + +April 13, 2021 +- CyberCIEGE lab failed because X11 socket was not relocated prior to starting Wine via fixlocal. + +April 9, 2021 +- New gdb-cpp tutorial lab for using GDB on a simple C++ program. +- Floating point exceptions were revealing use of exec\_wrap.sh for stdin/stdout mirroring. + +April 7, 2021 +- ldap lab failed when moved to Ubuntu 20. Problem traced to problem with nscd cache of pwd. Move ldap to Ubuntu 20 + +March 23, 2021 +- Parameterizing with RANDOM did not include the upper bound. +- Add optional step parameter to RANDOM, e.g., to ensure word boundaries. +- db-access lab: add mysql-workbench to database computer. +- New overrun lab to illustrate memory references beyond bounds of c data structures. +- New printf lab to introduce memory references made by the printf function. + +March 19, 2021 +- gradelab ignore makdirs error, problem with Windows rmtree on shared folders. +- gradelab handle spaces in student zip file names. +- gradelab handle zip file names from Moodle, including build downloads. + +March 12, 2021 +- labedit UI: Remove old wireshark image from list of base images. +- labedit UI: Increase some font sizes. +- grader web interface failed to display lab manuals if the manual name does not follow naming conventions. + +March 11, 2021 +- labedit UI add registry setting in new global lab configuration panel. + +March 10, 2021 +- labedit UI fixes to not build if syntax error in lab +- labedit UI "Lab running" indicator fix to reflect current lab. + +March 8, 2021 +- Deprecate use of HOST\_HOME\_XFER, all labs use directory per the labtainer.config file. +- Add documentation comment to start.config for REGISTRY and BASE\_REGISTRY + +March 5, 2021 +- Error handling on gradelab web interface when missing results. +- labedit addition of precheck, msc bug fixes. + +February 26, 2021 +- The dmz-example lab had errors in routing and setup of dnsmasq on some components. + +February 18, 2021 +- UI was rebuilding images because it was updating file times without cause +- Clean up UI code to remove some redundant data copies. + +February 14, 2021 +- Add local build option to UI +- Create empty faux\_init for centos6 bases. + +February 11, 2021 +- Fix UI handling of editing files. Revise layout and eliminate unused fields. +- Add ubuntu20 base2 base configuration along with ssh2, network2 and wireshark2 +- The new wireshark solves the prolem of black/noise windows. +- Map /tmp/.X11-unix to /var/tmp and create a link. Needed for ubuntu20 (was deleting /tmp?) and may fix others. + +February 4, 2021 +- Add SIZE option to results artifacts +- Simplify wireshark-intro assessment and parameterization and add PDF lab manual. +- Provide parameter list values to pregrade.sh script as environment variables +- enable X11 on the grader +- put update-designer.sh into users path. + +January 19, 2021 +- Change management of README date/rev to update file in source repo. +- Introduce GUI for creating/editing labs -- see labedit command. + +December 21, 2020 +- The gradelab function failed when zip files were copied from a VirtualBox shared folder. +- Update Instructor Guide to describe management of student zip files on host computers. + +December 4, 2020 +- Transition distribution of tar to GitHub releaese artifacts +- Eliminate seperate designer tar file, use git repo tarball. +- Testing of grader web functions for analysis of student lab artifacts +- Clear logs from full smoketest and delete grader container in removelab command. + +December 1, 2020 +- The iptables2 lab assessment relied on random ports being "unknown" to nmap. +- Use a sync diretory to delay smoketests from starting prior to lab startup. +- Begin integrating Lab designer UI elements. + +October 13, 2020 +- Headless configuraions for running on Docker Desktop on Macs & Windows +- Headless server support, cloud-config file for cloud deployments +- Testing support for headless configurations +- Force mynotify to wait until rc.local runs on boot +- Improve mynotify service ability to merge output into single timestamp +- Python3 for stopgrade script +- SimLab now uses docker top rather than system ps + +September 26, 2020 +- Clean up the stoplab scripts to ignore non-lab containers +- Add db-access database access control lab for controlles sharing of a mysql db. + +September 17, 2020 +- The macs-hash lab was unable to run Leafpad due to the X11 setting. +- Grader logging was being redirected to the wrong log file, now captures errors from instructor.py +- Copy instructor.log from grader to the host logs directory if there is an error. + +August 28, 2020 +- Fix install script to use python3-pip and fix broken scripts: getinfo.py and pull-all.py +- Registry logic was broken, test systems were not using the test registry, add development documentation. +- Add juiceshop and owasp base files for OWASP-based web security labs +- Remove unnecessary sudos from check\_nets +- Add CHECK\_OK documentation directive for automated assessment +- Change check\_nets to fix iptables and routing issues if so directed. + +August 12, 2020 +- Add timeout to prestop scripts +- Add quiz and checkwork to dmz-lab +- Restarting the dmz-lab without -r option broke routing out of the ISP. +- Allow multiple files for time\_delim results. + +August 6, 2020 +- Bug in error handling when X11 socket is missing +- Commas in quiz questions led to parse errors +- Add quiz and checkwork to iptables2 lab + +July 28, 2020 +- Add quiz support -- these are guidance quizzes, not assessment quizzes. See the designer guide. +- Add current-state assessment for use with the checkwork command. + +July 21, 2020 +- Add testsets/bin to designer's path +- Designer guide corrections and explainations for IModule steps. +- Add RANGE\_REGEX result type for defining time ranges using regular expressions on log entries. +- Check that X11 socket exists if it is needed when starting a lab. +- Add base image for mysql +- Handle mysql log timestamp formats in results parsing. + +June 15, 2020 +- New base image contianing the Bird open source router +- Add bird-bgp Border Gateway Protocol lab. +- Add bird-ospf Open Shortest Path First routing protocol. +- Improve handling of DNS changes, external access from some containers was blocked in some sites. +- Add section to Instructor Guide on using Labtainers in environments lacking Internet access. + +May 21, 2020 +- Move all repositories to the Docker Hub labtainers registry +- Support mounts defined in the start.config to allow persistent software installs +- Change ida lab to use persistent installation of IDA -- new name is ida2 +- Add cgc lab for exploration of over 200 vulnerable services from the DARPA Cyber Grand Challenge +- Add type\_string command to SimLab +- Add netflow lab for use of NetFlow network traffic analysis +- Add 64-bit versions of the bufoverflow and the formatstring labs + +April 9, 2020 +- Grader failed assessment of CONTAINS and FILE\_REGX conditions when wildcards were used for file selection. +- Include hints for using hexedit in the symlab lab. +- Add hash\_equal operator and hash-goals.py to automated assessment to avoid publishing expected answers in configuration files. +- Automated assessment for the pcap-lib lab. + +April 7, 2020 +- Logs have been moved to $LABTAINER\_DIR/logs +- Other cleanup to permit rebuilds and tests using Jenkins, including use of unique temporary directories for builds +- Move build support functions out of labutils into build.py +- Add pcap-lib lab for PCAP library based development of traffic analysis programs + +March 13, 2020 +- Add plc-traffic lab for use of GrassMarlin with traffic generated during the lab. +- Introduce ability to add "tap" containers to collect PCAPs from selected networks. +- Update GNS3 documentation for external access to containers, and use of dummy\_hcd to + simulate USB drives. +- Change kali template to use faux\_init rather than attempting to use systemd. +- Moving distributions (tar files) to box.com +- Change SimLab use of netstat to not do a dns lookup. + +February 26, 2020 +- If labtainer command does not find lab, suggest that user run update-labtainer.sh +- Add support preliminary support for a network tap component to view all network traffic. +- Script to fetch lab images to prep VMs that will be used without internet. +- Provide username and password for nmap-discovery lab. + +February 18, 2020 +- Inherit the DISPLAY environment variable from the host (e.g., VM) instead of assuming :0 + +February 14, 2020 +- Add Ghidra software reverse engineering introduction exercise. + +February 11, 2020 +- Update guides to describe remote access to containers withing GNS3 environments +- Hide selected components and links within GNS3. +- Figures in the webtrack lab guide were not visible; typos in this and nmap-ssh + +February 6, 2020 +- Introduce function to remotely manage containers, e.g., push files. +- Add GNS3 environment function to simulate insertion of a USB drive. +- Improve handling of Docker build errors. + +February 3, 2020 +- On the metasploit lab, the postgresql service was not running on the victim. +- Merge the IModule manual content into the Lab Designer guide. +- More IModule support. + +January 27, 2020 +- Introduce initial support for IModules (instructor-developed labs). See docs/imodules.pdf. +- Fix broken LABTAINER\_DIR env variable within update-labtainer +- Fix access mode on accounting.txt file in ACL lab (had become rw-r-r). Use explicit chmod in fixlocal.sh. + +January 14, 2020 +- Port framework and gradelab to Python3 (existing Python2 labs will not change) + - Use backward compatible random.seed options + - Hack non-compatable randint to return old values + - Continue to support python2 for platforms that lack python3 (or those such as the + older VM appliance that include python 3.5.2, which breaks random.seed compatability). + - Add rebuild alias for rebuild.py that will select python2 if needed. +- Centos-based labs manpages were failing; use mandb within base docker file +- dmz-lab netmask for DMZ network was wrong (caught by python3); as was IP address of inner gateway in lab manual +- ghex removed from centos labs -- no longer easily supported by centos 7 +- file-deletion lab must be completed without rebooting the VM, note this in the Lab Manual. +- Add NO\_GW switch to start.config to disable default gateways on containers. +- Metasploit lab, crashes host VM if runs as privileged; long delays on su if systemd enabled; so run without systemd. + Remove use of database from lab manual, configure to use new no\_gw switch +- Update file headers for licensing/terms; add consolidated license file. +- Modify publish.py to default to use of test registry, use -d to force use of default\_registry +- Revise source control procedures to use different test registry for each branch, and use a premaster +branch for final testing of a release. + October 9, 2019 - Remove dnsmasq from dns component in the dmz-lab. Was causing bind to fail on some installations. diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/build.xml b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/build.xml deleted file mode 100644 index 91517e999..000000000 --- a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/build.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - - Builds, tests, and runs the project GoalsUI_Sep13. - - - diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/manifest.mf b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/manifest.mf deleted file mode 100644 index 1574df4a2..000000000 --- a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/manifest.mf +++ /dev/null @@ -1,3 +0,0 @@ -Manifest-Version: 1.0 -X-COMMENT: Main-Class will be added automatically by build - diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/nbproject/build-impl.xml b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/nbproject/build-impl.xml deleted file mode 100644 index 5497c9c60..000000000 --- a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/nbproject/build-impl.xml +++ /dev/null @@ -1,1420 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must set src.dir - Must set test.src.dir - Must set build.dir - Must set dist.dir - Must set build.classes.dir - Must set dist.javadoc.dir - Must set build.test.classes.dir - Must set build.test.results.dir - Must set build.classes.excludes - Must set dist.jar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must set javac.includes - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - No tests executed. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must set JVM to use for profiling in profiler.info.jvm - Must set profiler agent JVM arguments in profiler.info.jvmargs.agent - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must select some files in the IDE or set javac.includes - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - To run this application from the command line without Ant, try: - - java -jar "${dist.jar.resolved}" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must select one file in the IDE or set run.class - - - - Must select one file in the IDE or set run.class - - - - - - - - - - - - - - - - - - - - - - - Must select one file in the IDE or set debug.class - - - - - Must select one file in the IDE or set debug.class - - - - - Must set fix.includes - - - - - - - - - - This target only works when run from inside the NetBeans IDE. - - - - - - - - - Must select one file in the IDE or set profile.class - This target only works when run from inside the NetBeans IDE. - - - - - - - - - This target only works when run from inside the NetBeans IDE. - - - - - - - - - - - - - This target only works when run from inside the NetBeans IDE. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must select one file in the IDE or set run.class - - - - - - Must select some files in the IDE or set test.includes - - - - - Must select one file in the IDE or set run.class - - - - - Must select one file in the IDE or set applet.url - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must select some files in the IDE or set javac.includes - - - - - - - - - - - - - - - - - - - - Some tests failed; see details above. - - - - - - - - - Must select some files in the IDE or set test.includes - - - - Some tests failed; see details above. - - - - Must select some files in the IDE or set test.class - Must select some method in the IDE or set test.method - - - - Some tests failed; see details above. - - - - - Must select one file in the IDE or set test.class - - - - Must select one file in the IDE or set test.class - Must select some method in the IDE or set test.method - - - - - - - - - - - - - - Must select one file in the IDE or set applet.url - - - - - - - - - Must select one file in the IDE or set applet.url - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/nbproject/genfiles.properties b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/nbproject/genfiles.properties deleted file mode 100644 index bee36be94..000000000 --- a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/nbproject/genfiles.properties +++ /dev/null @@ -1,8 +0,0 @@ -build.xml.data.CRC32=eec53d04 -build.xml.script.CRC32=e676bb1d -build.xml.stylesheet.CRC32=8064a381@1.80.1.48 -# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. -# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. -nbproject/build-impl.xml.data.CRC32=eec53d04 -nbproject/build-impl.xml.script.CRC32=4d702800 -nbproject/build-impl.xml.stylesheet.CRC32=830a3534@1.80.1.48 diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/nbproject/private/private.properties b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/nbproject/private/private.properties deleted file mode 100644 index 9436b19f6..000000000 --- a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/nbproject/private/private.properties +++ /dev/null @@ -1,2 +0,0 @@ -compile.on.save=true -user.properties.file=C:\\Users\\Dan\\AppData\\Roaming\\NetBeans\\8.2\\build.properties diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/nbproject/project.properties b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/nbproject/project.properties deleted file mode 100644 index 73526481e..000000000 --- a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/nbproject/project.properties +++ /dev/null @@ -1,75 +0,0 @@ -annotation.processing.enabled=true -annotation.processing.enabled.in.editor=false -annotation.processing.processor.options= -annotation.processing.processors.list= -annotation.processing.run.all.processors=true -annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output -build.classes.dir=${build.dir}/classes -build.classes.excludes=**/*.java,**/*.form -# This directory is removed when the project is cleaned: -build.dir=build -build.generated.dir=${build.dir}/generated -build.generated.sources.dir=${build.dir}/generated-sources -# Only compile against the classpath explicitly listed here: -build.sysclasspath=ignore -build.test.classes.dir=${build.dir}/test/classes -build.test.results.dir=${build.dir}/test/results -# Uncomment to specify the preferred debugger connection transport: -#debug.transport=dt_socket -debug.classpath=\ - ${run.classpath} -debug.test.classpath=\ - ${run.test.classpath} -# Files in build.classes.dir which should be excluded from distribution jar -dist.archive.excludes= -# This directory is removed when the project is cleaned: -dist.dir=dist -dist.jar=${dist.dir}/GoalsUI_Sep13.jar -dist.javadoc.dir=${dist.dir}/javadoc -excludes= -includes=** -jar.compress=false -javac.classpath=\ - ${libs.absolutelayout.classpath} -# Space-separated list of extra javac options -javac.compilerargs= -javac.deprecation=false -javac.external.vm=true -javac.processorpath=\ - ${javac.classpath} -javac.source=1.8 -javac.target=1.8 -javac.test.classpath=\ - ${javac.classpath}:\ - ${build.classes.dir} -javac.test.processorpath=\ - ${javac.test.classpath} -javadoc.additionalparam= -javadoc.author=false -javadoc.encoding=${source.encoding} -javadoc.noindex=false -javadoc.nonavbar=false -javadoc.notree=false -javadoc.private=false -javadoc.splitindex=true -javadoc.use=true -javadoc.version=false -javadoc.windowtitle= -main.class=GoalsUI.GoalsUI -manifest.file=manifest.mf -meta.inf.dir=${src.dir}/META-INF -mkdist.disabled=false -platform.active=default_platform -run.classpath=\ - ${javac.classpath}:\ - ${build.classes.dir} -# Space-separated list of JVM arguments used when running the project. -# You may also define separate properties like run-sys-prop.name=value instead of -Dname=value. -# To set system properties for unit tests define test-sys-prop.name=value: -run.jvmargs= -run.test.classpath=\ - ${javac.test.classpath}:\ - ${build.test.classes.dir} -source.encoding=UTF-8 -src.dir=src -test.src.dir=test diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/nbproject/project.xml b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/nbproject/project.xml deleted file mode 100644 index a1ebdf5c8..000000000 --- a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/nbproject/project.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - org.netbeans.modules.java.j2seproject - - - GoalsUI_Sep13 - - - - - - - - - diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/src/GoalsUI/GoalsUI.java b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/src/GoalsUI/GoalsUI.java deleted file mode 100644 index 1530dbb3c..000000000 --- a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/src/GoalsUI/GoalsUI.java +++ /dev/null @@ -1,316 +0,0 @@ -package GoalsUI; - -import java.awt.Component; -import javax.swing.JFrame; -import javax.swing.JOptionPane; -import javax.swing.JPanel; - -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ - -/** - * - * @author Daniel Liao - */ -public class GoalsUI extends javax.swing.JFrame { - GoalsData dataUI; - - public GoalsUI() { - initComponents(); - LabNotExist.setVisible(false); - dataUI = new GoalsData(); - } - - /** - * This method is called from within the constructor to initialize the form. - * WARNING: Do NOT modify this code. The content of this method is always - * regenerated by the Form Editor. - */ - @SuppressWarnings("unchecked") - // //GEN-BEGIN:initComponents - private void initComponents() { - - ScrollPaneOfGoals = new javax.swing.JScrollPane(); - PanelofGoals = new javax.swing.JPanel(); - UpdateButton = new javax.swing.JButton(); - RemoveAllButton = new javax.swing.JButton(); - jLabel9 = new javax.swing.JLabel(); - CreateButton = new javax.swing.JButton(); - jLabel3 = new javax.swing.JLabel(); - jLabel1 = new javax.swing.JLabel(); - LabNameTextField = new javax.swing.JTextField(); - LabNotExist = new javax.swing.JLabel(); - - setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); - setBackground(new java.awt.Color(255, 255, 255)); - setMinimumSize(new java.awt.Dimension(1590, 500)); - setPreferredSize(new java.awt.Dimension(1110, 389)); - addWindowListener(new java.awt.event.WindowAdapter() { - public void windowClosing(java.awt.event.WindowEvent evt) { - formWindowClosing(evt); - } - }); - - ScrollPaneOfGoals.setAutoscrolls(true); - ScrollPaneOfGoals.setMaximumSize(new java.awt.Dimension(1300, 800)); - - PanelofGoals.setLayout(new javax.swing.BoxLayout(PanelofGoals, javax.swing.BoxLayout.PAGE_AXIS)); - ScrollPaneOfGoals.setViewportView(PanelofGoals); - - UpdateButton.setText("Update"); - UpdateButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - UpdateButtonActionPerformed(evt); - } - }); - - RemoveAllButton.setFont(new java.awt.Font("Dialog", 1, 12)); // NOI18N - RemoveAllButton.setText("Remove All"); - RemoveAllButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - RemoveAllButtonActionPerformed(evt); - } - }); - - jLabel9.setFont(new java.awt.Font("Arial Black", 0, 12)); // NOI18N - jLabel9.setText("Lab Name: "); - - CreateButton.setFont(new java.awt.Font("Dialog", 1, 12)); // NOI18N - CreateButton.setText("Create"); - CreateButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - CreateButtonActionPerformed(evt); - } - }); - - jLabel3.setFont(new java.awt.Font("Arial", 1, 12)); // NOI18N - jLabel3.setText("Goal Type"); - jLabel3.setToolTipText("The mode in which a value is found."); - - jLabel1.setFont(new java.awt.Font("Arial", 1, 12)); // NOI18N - jLabel1.setText("Goal ID"); - jLabel1.setToolTipText("The symbolic name of the result, which will be referenced in the goals configuration file. \n\n(It must be alphanumeric, underscores permitted) "); - - LabNameTextField.setPreferredSize(new java.awt.Dimension(6, 25)); - LabNameTextField.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - LabNameTextFieldActionPerformed(evt); - } - }); - - LabNotExist.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N - LabNotExist.setText("Lab does not exist!"); - - javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); - getContentPane().setLayout(layout); - layout.setHorizontalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(ScrollPaneOfGoals, javax.swing.GroupLayout.DEFAULT_SIZE, 1300, Short.MAX_VALUE) - .addGroup(layout.createSequentialGroup() - .addContainerGap() - .addComponent(CreateButton) - .addGap(10, 10, 10) - .addComponent(RemoveAllButton) - .addGap(98, 98, 98) - .addComponent(jLabel9) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(LabNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 378, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(18, 18, 18) - .addComponent(LabNotExist) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 344, Short.MAX_VALUE) - .addComponent(UpdateButton)) - .addGroup(layout.createSequentialGroup() - .addGap(50, 50, 50) - .addComponent(jLabel1) - .addGap(89, 89, 89) - .addComponent(jLabel3) - .addGap(0, 0, Short.MAX_VALUE))) - .addContainerGap()) - ); - layout.setVerticalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addContainerGap() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(CreateButton) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(RemoveAllButton) - .addComponent(jLabel9) - .addComponent(LabNameTextField, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(UpdateButton) - .addComponent(LabNotExist))) - .addGap(14, 14, 14) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(jLabel1) - .addComponent(jLabel3)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(ScrollPaneOfGoals, javax.swing.GroupLayout.DEFAULT_SIZE, 317, Short.MAX_VALUE)) - ); - - pack(); - }// //GEN-END:initComponents - - private void UpdateButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_UpdateButtonActionPerformed - update(); - }//GEN-LAST:event_UpdateButtonActionPerformed - private void update(){ - if(dataUI.isLoaded()) - dataUI.writeGoalsConfig(PanelofGoals); - } - - private void LabNameTextFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_LabNameTextFieldActionPerformed - loadLab(); - }//GEN-LAST:event_LabNameTextFieldActionPerformed - //Checks if the lab exists and will load lab's goals config if it does - private void loadLab(){ - dataUI = new GoalsData(getLabName()); - - if(dataUI.isLoaded()){ - LabNotExist.setVisible(false); - goalsPanelRedraw(); - } - else - LabNotExist.setVisible(true); - } - - private void CreateButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_CreateButtonActionPerformed - createFreshGoal(); - }//GEN-LAST:event_CreateButtonActionPerformed - //Creates and loads a new goal row *Note: creating a new row does not automatically save the new row into the GoalsData(acti) - private void createFreshGoal(){ - if(dataUI.isLoaded()){ - dataUI.increaseRowCount(); - GoalPanels newGoal = new GoalPanels(this, dataUI); - PanelofGoals.add(newGoal); - PanelofGoals.revalidate(); - PanelofGoals.repaint(); - } - } - - private void RemoveAllButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_RemoveAllButtonActionPerformed - removeAllButton(); - }//GEN-LAST:event_RemoveAllButtonActionPerformed - private void removeAllButton(){ - if(dataUI.isLoaded()){ - if(JOptionPane.showConfirmDialog(null, "Are you sure you want to remove all?") == JOptionPane.YES_OPTION){ - removeAllGoals(); - dataUI.resetData(); - } - } - } - - private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing - checkUnsavedChangesMade(); - }//GEN-LAST:event_formWindowClosing - //Check if the the current state of the UI matches with what's saved in the goals.config - void checkUnsavedChangesMade(){ - if(dataUI.isLoaded()){ - dataUI.updateListofGoals(PanelofGoals); - - if(GoalsData.goalValuesDiffer(dataUI.getListofGoals(), dataUI.getGoalValuesOfConfigFile())){ - int confirmed = JOptionPane.showConfirmDialog(null, - "There are Unsaved Changes. Are you sure you want to exit the program?", "Unsaved Changes", - JOptionPane.YES_NO_OPTION); - - if (confirmed == JOptionPane.YES_OPTION) - dispose(); - else - setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); - } - else - dispose(); - } - } - -//General Methods - //Updates the list of goals and redraws them on screen - void refresh(){ - dataUI.updateListofGoals(PanelofGoals); - goalsPanelRedraw(); - } - - //Redraws the goals Panel - void goalsPanelRedraw(){ - removeAllGoals(); - for(int i=0; i < dataUI.getListofGoals().size(); i++) - loadGoal(dataUI.getListofGoals().get(i), i+1); - } - - //Removes all the goal lines for the lab *note: this doesn't update results.config until the user hits the update button - private void removeAllGoals(){ - Component[] componentList = PanelofGoals.getComponents(); - for(Component c: componentList) - PanelofGoals.remove(c); - PanelofGoals.revalidate(); - PanelofGoals.repaint(); - } - - //Load's the goals into GUI - private void loadGoal(GoalValues goalVal, int rowNum){ - GoalPanels newGoal = new GoalPanels(this, dataUI, goalVal, rowNum); - PanelofGoals.add(newGoal); - PanelofGoals.revalidate(); - PanelofGoals.repaint(); - } - - - - //Gets the labname - private String getLabName(){ - return LabNameTextField.getText(); - } - - //Gets the panel holding the goals - protected JPanel getPanelofGoals(){ - return PanelofGoals; - } - - - public static void main(String args[]) { - /* Set the Nimbus look and feel */ - // - /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. - * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html - */ - try { - for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { - if ("Nimbus".equals(info.getName())) { - javax.swing.UIManager.setLookAndFeel(info.getClassName()); - break; - } - } - } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) { - java.util.logging.Logger.getLogger(GoalsUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); - } - // - // - - // - - /* Create and display the form */ - java.awt.EventQueue.invokeLater(() -> { - GoalsUI newGoalsUI = new GoalsUI(); - newGoalsUI.setSize(1000, 1000); - newGoalsUI.setVisible(true); - }); - } - - - // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JButton CreateButton; - private javax.swing.JTextField LabNameTextField; - private javax.swing.JLabel LabNotExist; - private javax.swing.JPanel PanelofGoals; - private javax.swing.JButton RemoveAllButton; - private javax.swing.JScrollPane ScrollPaneOfGoals; - private javax.swing.JButton UpdateButton; - private javax.swing.JLabel jLabel1; - private javax.swing.JLabel jLabel3; - private javax.swing.JLabel jLabel9; - // End of variables declaration//GEN-END:variables -} diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/.classpath b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/.classpath new file mode 100644 index 000000000..47c4fb516 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/.classpath @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/.project b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/.project new file mode 100644 index 000000000..feb938336 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/.project @@ -0,0 +1,23 @@ + + + MainUI + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + + diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/.settings/org.eclipse.core.resources.prefs b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 000000000..654c1750c --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +encoding//src/main/java=UTF-8 +encoding/=UTF-8 diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/.settings/org.eclipse.jdt.apt.core.prefs b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/.settings/org.eclipse.jdt.apt.core.prefs new file mode 100644 index 000000000..ec0c557e5 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/.settings/org.eclipse.jdt.apt.core.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.apt.aptEnabled=false diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/.settings/org.eclipse.jdt.core.prefs b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 000000000..d1d55d769 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,9 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=14 +org.eclipse.jdt.core.compiler.compliance=14 +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore +org.eclipse.jdt.core.compiler.processAnnotations=disabled +org.eclipse.jdt.core.compiler.release=disabled +org.eclipse.jdt.core.compiler.source=14 diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/.settings/org.eclipse.m2e.core.prefs b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 000000000..14b697b7b --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/addContainer.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/addContainer.sh new file mode 100755 index 000000000..67fa90ab9 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/addContainer.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +cd $1 +cd $2 +new_lab_setup.py -a $3 -b $4 + diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/buildMainUI.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/buildMainUI.sh new file mode 100755 index 000000000..c8d875a3b --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/buildMainUI.sh @@ -0,0 +1,12 @@ +#!/bin/bash +#1.4 + +export ANT_HOME=/PDFdata/library/apache_ant/ + +export PATH=$ANT_HOME/bin:$PATH + +ant -buildfile buildMainUI.xml main +if [ $? -eq 1]; then + echo "Failed on Build" + exit 1 +fi diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/buildMainUI.xml b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/buildMainUI.xml new file mode 100644 index 000000000..978e30999 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/buildMainUI.xml @@ -0,0 +1,48 @@ + + + + + + + Main UI to the Labtainers Framework that makes the labs and edits the start configs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/callNewLab.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/callNewLab.sh new file mode 100755 index 000000000..5b8bdb00f --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/callNewLab.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +echo Current Directory: +pwd +cd $1 +echo Changed Directroy to: +pwd +echo Making lab: +echo $2 +mkdir $2 +cd $2 +new_lab_setup.py -b $3 +echo Made new lab: +pwd + diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/cloneLab.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/cloneLab.sh new file mode 100755 index 000000000..04c920e52 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/cloneLab.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +cd $1 +cd $2 +new_lab_setup.py -c $3 diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/editDockerfile.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/editDockerfile.sh new file mode 100755 index 000000000..2218a0a49 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/editDockerfile.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +gnome-terminal -- $1 $2 + + diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/images/labtainer5-sm.png b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/images/labtainer5-sm.png new file mode 100755 index 0000000000000000000000000000000000000000..88708474179309733731a9deebb6537480823cdf GIT binary patch literal 67186 zcmXt916XA5_n$n~WZP}r?AmN^O}1^f*|s-xv)j$sY+KuAd-H$3|L6HVgL~&io9035JNP+N>wP_h0e8>XcL|$3~@bTZRpsPFuvIWse zM%xttK*sv-0R_nZ{@-B;ZnBD!2!COrp<&7Htb%qRn@FtHwcNxV?d{DS+#oLj0C5*{ zV>fd%a!+eFD{^UBMHREp<_G`)IY3rIRNZUsOyBdH-eSZ16!UtAhWjFO)lc0E6e7EN zYt&3KqfZIAy;WA8alG;>znISFXG9} zqm9hBUZF;D{x2!b``>*pr#vmXv-n&Q-(mJ|xiLOo&4e`!z(@eEo0R)l=~gTXY|*|E z=&eKK3gaZ>lxprd0-#z`-&ok|WKn;ncb=+xTe*DNeyEs4UF9KP`&lZdyZ%jNjsPZ~7^j1hqI?uL zw~yRSlUV~OJw5L&TehwJ1wSqPAqXfaDiRBL+RsqF^%7idWXi!0SDmnMy`3wS_uO({)+YsIa#*5r z+pVxx|N2BFvbCiV6;p;w_WW_mOk@vkG*z(VWuweiNd{~07mi?1mH*V1pDKy{`*)iy z^h!nDikDQ;{>zm_m_glOOkG#P6Y{~I7R{}JmD#MHCu60N!|F#|uu`Ovj7WdjW7<#T zylmR22$78X7AU`IAB1PPi!8)aX=}NWA`18;LXwIzpEIMOx5g!yHsp^H{xn3c#I^I+g2eu5?$yHMFedPQMw>e zY4XuP9{k}o$5xZE60zSjNF+(K`==s`If01|XcG9Ysh;PQ1nz*A3!;FIbrPNHqql`LVN6&ClU+cmx|F;cWBT_1dW{){R!_>e;HzF@d=|9`s?EyKQ-lRVq8!(;)kk%#%; zZe%x{22cjFKk@;I<=h&3JWWWV^n-i0XtD88KN+#h@gn{(5Yr+jpIhMH>qz`z7sJ4S zCqc#uWMQIY9u2b0_a*vPgkfpu#rJ;L9pQ9(uDMHg=_oCBwOjkqO=`~Q)VaQT<7YBQ##^MSjI&mo}k*cBzeh<=~PN@zy5h#?4pp(ePFXEOizJ5#SZ1)&g z5AY+u9?Lj&dLk$%ZHNE$>z5}FC+DlRj3F*X{i@yN(!v6hJAdwtN*zaODwK#X6DEM1 zg9EFs^9Bi*NsBc$*cAA9`Mnc?*lh6R#yl>!VYmqK^Pq!Ape2^oF;dW>+l;NEjC*#k z3$z_SGm}OzYESS%E%2NDB=6px^}px!E_}7rs5R8+p)MllmrWki{T$o+mjNC&%DvC{ z(ZeD|49)z|V46TN@-cQo9U&PdkKjX;9blMJm8hK0=OPSY&hPNYvh)C$Pz8-JBp3rEX|#lSC5YTHE73UjJ*JQrKPL-L)x5VPf??c9%V=Ze&$=z%$FgZg zzH{Y@@4IfR-7JgVPp2TIa%5nz5fQWqcDS+2P#h5tZtq2R-DIu+-sy530zl7gR#JAo z)t(41VK_!YRiSm&4qonuP19tC|J`kRR=qz@Q2jegS*)n4 z8b=Ki+vAJp7&K`}-P7mDI~<^riluw>65KDMBR%u$Zf?egM73`KP1vrsy1Fx9I!`D7 z2|lDJc6bjDa*i6DXlAYq^+9BjS35b-@^ZT;K-9;lT>u+tacOxOt$1hHLUilJ2S$ly zYDoI!q|Bifv1{ar{bwvT5vuxPQFkd$Wo1!e4M{YE>FooF3JngZ4$e4}G(Si*m`&88 zxuV)3xZ9qn= zIWm(|Ekg}S$w*r8R*vq)T`6G$c8!Mzt9kyH13Z-(Oz)C#0EO?oY&xo{yEDgbaR4bY zPcBn!uqt-IHhJHl!I2{C8gRzn{p1E$OKWs zz{9}Q2}2nSQ&G^fjxcowd02TvGr%SuAsN?oK!-Ba<9i)>lYZ|DzpKWO87G7b;Dwb; z+WG6}gpNiWrw?3mi0H33Qp8oM6x-*!lA_{-=iod-1*(LLz#)el8_#1@?qX|-ie5Zh z=J~pvxi4@1@xGgt7UIrP)KyWbA3XQSH|NeNoIgfK3PX<>?7bB{^AIr84krgfB4ZG ziW1Ok!GF@D`=+-$<+ndFJr$VH5k!%J8dH`uAjG%gp4`!F|?%@lsA&M-lRE>tmxd-tTOPKh^n%CpsR z+kh=FKtUbMm9_UXlxcj8BGJQ3kThk|qA3=i&E%_}-&=bOOE-R%Mh!IJyZe&%zq@(m zh}mm#n7_CB2=x_ioUO}grGDC@dL3=;1Z))X>Jg~avtgXM03Z}k(4BA0$;Wf7=V$BB z|Ikm2O!Z$!@KV^5QOE{ekmtG-!7}dqR6Ev^8hyY8jSK17Bg_R2o+6WJkCKuy3i{Dl z!3>m2Xg7G%f3IDh1spe4RDu;qPW&)h@nNF{$MA6m2qCLLNyb7tVKjP4rRHY$-d>rR zYml1{idPPd;BcV1wi6R_`ksh7+_e@^UA5lN5T+TPggsZsNdjKpOQuobo`3QfzW91I zE{EsUWGR*}A4AL{flQcGsT>QS0tUkYuAaVKy}Uv2U+bq6g-JuE@yo-xA!;Wsch00E zD?a7u=%^uBQ`69=`SjA|7pv_OlbM;B2zuyshsU{2)%@`Wpx$PYVZ&qHel7pw_0X(8 z6tQ0tPd~J6+yA8m0eCB})LPNJKDp)3>d`%#`p3@3alkr7nnF8Aq`U(cwYZ`rb0nS>Hw0l!e#ed=#(x$!5Q>L1VMsseF8B%aE5HE0qWOE4C4r%AS9T1ztf*Ev`0| z%k|>&`t0f~RK75vBS@rHL{a3>8Ux4N?Frh-!MV7*0Vi+C z!fW%sxoe+X@Pa$ifJf{?%B!+!R#gqgP@g1NQ4!eM+`GL1FqFrV2ms8Apd-|0=L>T)Guz82@q_{noFKpI+5~;hT_kAdL6r+Ug5lY%V5@p2WUC1fj377Tg(B0%K@H4 z9BNWl8M)lHsc6_E6JrIWZ3wmMSlC;z$-w^fq!<(;Zt-+%U@}M*E>?%R*@8%&28xYP zqHG*>$poGTgw2KunYRUjG}zjx%tP&*I~Bo7N#wu3{&ok!A}0XrD5a<+l0?*_D2N}Z z{+^4~H^D>|kQL_&{s|6F2ZU+ZhRbmQDE>XHPkKG9W~dl$d+n|<=X_W-t&TA=GA3nb zM>E#`gkIKjMfv=52U_rP!`18gxZIc(|EeFEMI~ks)8~2+4<_|%cXjm{O~NpT#eA9K zC_qJ1(-UlIX&E)JyON%qJohw0mC(C)z0>u$H87U8i9BwaAQV1K>I)K_4nc=b8U1~> z)%9{b7=xDp4d^n+X9D&|<~X$ffLxw)mSug<-0Rc29#Tkn>7#lz6m2azOB-7;bh=2L zv!EPVDH&vd!)b~Dr>D4OQrFn=gMMiLsO04pQQ_pYYR-{Is#yU2mb%rOC0SIYpDs<$?zbf<~)D zgqR8FYdK5W=Z+WHvKCBcLs&tuk})@^$Pb=c&NG%_cuI8XW~{gZyg4v-F6=An2-F=I z&LOyxPu7{Kj^dSR5vx|P<{+=9bH@>$Z3l#L)}Mdos;-w9S++R}-Tssh4h}wQ*DUD( zZtjlfAtThNZQZzSy>QlQ4H+4En^4&Q6>M#7y}WAIs*yjPG1X}I0>NprlhGuZ+}zxG zg7E9f?|ipSe69x~~aeg%&3@ zE$vOac$V6Ye=~$iI-W^hNh#eqc^pk?PPY_$3$OYQT$U&~cEprbAQe60`Q(eyloAI_ zFWjL)q~`nc2HWt{_{}K*pxoVqTkRkR-Kz`OdcGwx%&1+DgY$rK$Hg|w$3lgdllz2Q zWTywo|4dNMgPP4|=R8$-lrW@!7}(R}bG~>io3+HQX1S z?yJxtzcVt!KW*~UM~@re1V5dPvxmH0xdxdn^sc(fTIS;-WLy*7QUov;N+Ko6QN=2v zc5Fx`Z2Di$l6WQwk9I7znB?OT5D^nUDLFtsP((t6j<#qM4@R7>nUI_#s$gY5lyMYM zI|(BL2R$6lIM9g|NI@F0SsfupFPQ7!j8Ggo4m*lV!p@N#m5fdp;6A#zOmz1gwz|4H z_$A+wf#Nq|!f+uSQniL{2wgNEYQ$dqWDZZve+UH`Uo8)DGR!*7R(}uk0}PabNxnro zdu?{BH}uoD1X9HqqzMSzIVfpqXpVtZzSDkM8?t`xe|Xk3Jyly(^-@q)X7Ln> zLG^j1)qXvE>k4uyVw(qp<9S?qVfJvJ@%vcOgV1sw=4b7?*+u-uNQT-8?FO)h=X6`w2tho>n$?^ z7xDY9m`n-*{5k78$jFgWMUfJFSO2Jh(papgT=iLQ_(>L$7L5cyEKm+o&304S24}F~ zD~ke6@l|92zhNV(MW>qpr7ARtm6;;cpGBnAc~L<8A zlW1sYmag}Piy?vpvI-e+N*4Ix3VDLRs%vV_OS^Xffjrya=6?o!yuYNRq&$9io#Gn= z)ce0ZcR>y>=OvC8&Q>VHBS9U`2oe#|X?LUF^4ddT(y9l5!C-tYn+317^;{F~96V-& zPA@qY-v6SvKc4Z}(f!GG<#9V%tm`1FPV+axup*x}90(0cfZGqGWEEcJM5%|mH{NE* z`%~JZX2GH#7?QMB*cvxIj zg$x?#wd3Avn*JiLp|M0_P{-rINoXi^*?CI|Awd1&XhJ2asj28WlMfPf*v}}#&h(j8phPm6i*Frg?VDU%IKTLcn?0nFbZpxw zj`#rbHc%7%gSti-)16O$!qy#qpEv}+4Q6exciz^uqj`4!L-;NQ{2XBM(d8f1Q&riD zX#~7;L0=0cO0G7!IHUi$|JtC^r&6p0lfK{E$n-}H8c{a92#{Pvjvpl|2b{r#lPbog z4M9Z$&&)2tmv5rxEeDEFBss~XnPu(X`A7)bTUpx=RI+df&7Y?F>2ga|jWIS8#vSaP zot-5-UTk(i2X2})h+sc0Aa zAVZ{#F?$yGc%xmqIiDJOC^i@jVd<_%&GSm@6yrB(s1XB2i#9Fx_Vy7sl#NWqEiE{Z zyt&xg+}s>EeV9{A7mX+KiQ+d+bdl|9qdApkt)912X32-Jyk;+2`D8pc<0F?iwyG(s zEesn$*#c%Lm2>3pSk{cx1q^{JWVwdiM2?>2r{&sC*hLTf3P{RNkzAraxS?lrI_li4;UIXTb4 z&hFJ_FdFCXM|qwN#42#*i+8Q8BsA6bc=_qP_vQ6(iZZ6@aJ*j|WbS61pPzf4y0wp$ zm6a_I#gm*;guYrVR)U#B(SKY%z2D}4aCSqm2(@n6Hb#OH`RmuOv^fg2*tocq=)i)~ zQaD9L#g$*KpNLT-Sg5G>;#KI>>Be372Uu4tE2lKE2N&n&Oh{;th3oZh{0I))G3lzmf3Q6U6Xo}3_q@YrY<^fYa+Keh`^r79 zc8sA>;^L|3q=v|bDOIm)!(mbFOhk>+G0O#2ew8Vj)AuZ8KsQGe6Wbt@kMyU&wKhkz zPlWT97Q_$+*UjgRUccrRSrw&DNs=tG?G@x%ZC6Jd$`w7^C-nay3OG7hs980e(Xf0}PEO^pwgif@7a zX?KhRIaqR4))(fzx9i%fB+aThzN~fXf!i?S@St?OsB7=b{cDP>MT&Rm=<$YYU%#t_ z9KBDKx!Tv{+1Xh{fY;76nw1wyUC;fJZU`2wLN7!@007L)%s(OHBC3e)KiSu4hIk%F z`%CY0b8G9Lnzk+WAC+1rOHS2KO*B)#SPOhexA{kfq43=UUV%_@iF(aq+kJIam(0tS*}uo`{gL}}Img3z zYhq6PgXL|Wu_=n}_WT!zRJmn|)+`S8^+F}Hm5ogZ(?5#A;+aPE^w1gRUH3X6G&kz^ z{BE=+j#0L}{hubeN{7^;umgoE?sV8z&N^{5_FFP$6}7kjRH+o5qm*o{?fsO|VQE=- z9^2R2pL<|>&)eR)TbjnJ44>wzCWU^b81oT|Y&f*R1fqz9qEn(`!YctHOUujWFKy@c z6M7HI0MJIU^@XqW=dg~Ka;3KHQ zqJyF8jM>;X|B1HFH)^ZWdv4r^gZ$i!Qj^=Wqvx{6VC0Kt@c~GI5Jui_;p&Eqo%Ss) zDXmRf75hMI@2i|F?~!s$cnH<_<7F-$Qdo1A_Ue9~;0z=dg!7%euCnaNVjnn)F`&kWEhLqwrDtYh#kuwm0BT{haef`o(3b>k)Mrh_& zn-hRf+0&DR;>G=UmYYVG%}e6Zfn|-#@o>KWJUgKISqB6_>;A{!(DU4QX?_vl_m09` z#}ABIT&vRF?D5$Eg;N+2K;Qk8h7FX10+$L^`kE9JgmiK`fy99L>4Uu}3Jl;v2AhNz z4$k2~^gweh^l%X{m@azFQR$iF?R0AzV~(SiiBg#3n5atDbL~vKDZphZvbm*&=3WbZ z?QlIB`U*PHC+OO*Lkq3538$yWi7-!l`5S{{bHLcGPj0$#eVrY$nWU&`3?YRQCu(do-aGDF)c1Rgx07zc(1w z?Kqq6dDb2jV(Coq^>=^w%=3i!0A>dhS$FFwM5NW$R$W}8EuaDC85{QzX1ef23xwfY ztLiE#YE1Zn`hrw3RqTpN26MB6GpDi=Qo;AHO3xpg^X}!BO@uX4Iz7)#9OtOg6*s-z zl;OrNy$*@HKqxSHBHME)V=9$%T7?;L+*yu#CQGly_3b;`AQki8P(nlzT>(?f6y46X zRG+h6&+ap6NM&V3-H*_=CX!I&*t{fjJ1^z-CE7m&!0V>?|!7jLX^D(6CvC#m(z;` zY(J$|dJt2Tw0jl9!=>oVVTe@KwcQTI|9Sx=)%0=V5CqLG=$kIT9Da8tqYkBm=m|Oo zhJNMQ;GK^cOOWLI-2wOO^`RORpzWjh!MKa+MWcfKPXjAu;b(j=)WsGY^6&7)(u#mj zFN|4bbyL55pB!y2zg_6RKCK~l&vy!VUi^kgYybdKukv-%)P8bV$^^+`7A~Hs@Y*ne zq_6-5o139BymJG4^y=WCq6#PTeY@6G68B2E)#BRc5L*_EKWxQYRv#Id&yjJQxJ08|~qwFnX4>4apPLjD&& z$;+*$dFcpriN0D zRB>87$cJRfE_`2|9-~R)QqNP$S+u+L=TF$wuPWhT%7FG@L{=tO>Y``ocm~)ve*pHZ z3gC-p4ZrDHs(|H0X2YLyJ1&1W090Uktq|Tg**C1|k6q0mE$PL&G^h28;8&1BK0l&I z6{3C~{O^$5nHhZku3RAf5F)kp#A#d4)hs1|*LKQm2RB6UnA4nCbJr}zauHIaFZ|6zd(gc zkj2(3Zi2mf?3R#Cpw6gg(dLnaZe6IWre$^CiPqOlvM=1RXAr`e$z?Gc**W^yL7n>g zMg;I;f~b-jR{o;Sk~TgT>$@|nNrY23otP*dG@5oVC#kcNVQW#PrRZ3Q= zZmv#ZeDRv=x;Y&D0_*eYlIGRiIl_!>1xd!*e55faRb%5r?#*rc*y*ubieO1iHLxmB z&K()=bLjfH6eppiygVbMyt(7ifr0m@56&|8BZ@i-H0&HLN3Skv{NkS!YHY>%SFv{O zY4VPbqdcdvv9X{MsrT9nP3|gUpY)3>wqk*ZyEj3wKN)YHbVLVYU%b?JkCP4EgK5Jn ze2UOKrlmb;b5WoDi{)-;!0UeHd}Y-*L_m1ALu(TpAKgeM<>~{Or^P^?{WeRK6j2qG zHL_nxOfx==!K*wxLe1=t*F;mpFaf@g0+Vlj2xNii!N@G_M{yIJ!{FS>H1^?J86flt zn#RKk+8l>#?=7)}_DL%yF|r&`&9A@?9#~8hT6nEB(R{z|UVgsOZS7#{XYZ_Ls=xc* zxH;cr@OEutm@)ig{y5aRRISa@;&6#`c^TK0*w&4jPk{;7apk8>C6W*e^y z!(J9oaB(?3&&#P5=+;U~vcYseAQd6ZKUTICuyGM=esfm;_}B1$iYeI)xlrLz<%%Ho!sW|>JwDHnOj@Q03(M81srd*@sTR)usd8*d;L-u5;()Q z_vw;}K)_j<2~*Yt-vm{lm(SV1H;#h|-Hf~>{X=W}sf{l8 zy|WN7PBD$D1p+Ouq^wC}lj~hpR#rqFav0Uo35b+SXYo{rEmX4iGGhA>0&Y9E&9q86 z0*BGo^JPM6+N)h6*m!t*X31pk%YWoQu80jfK6EzjmJ_6YNhy8fqjgsEjw3apj88A~ z2^IS?kt;yvQ;fTKpNo#An%RuhEO)2;9%7sCa~Hp_54gG-Yjau$k1JVSK&rQB_rWPG zDIzW8^iMurP*~+t!Icc;p`vt0(z>=B_~CFOeXLA6Ij3wEuO%$w9*+4$F;XpW`UG>i zYZlrxJaq-1iBWZi(v&tK4hD#L+y&v`LU7WiCD>G(S^@)-WdeVve4i>nqI7fjI!mUr zp|2Qo&dw~7(`i~I%wxCR;@3__bw9>4Vaxl?ZxPEpHBDZUqa0eq#_1llbAMo3m(GOj z=?e2;w;fDfjAgPd*rnn7))IN0(4gp@?$+y~p0{!y%C-8e{lvl6ws9?p9a~6#h*D!M;Mn)pXjcKT?lwx%!LMLpn|bIpYStR2Hm7&q1s-`rwM%@)b7|g~*j>Q^3Kd}n_5~c}CMpvK3VLdK zcFYcM`;d7W`Ww6kF&@6rE~$FwNFsaxSz&{i@aQ-qRXj!Wr=oh$#6O-`wbf<_C@lI6 zd`|NlJxDs=uRWECJ`PGJgc5{N06+Ji-#3Xm+S?cUSkR7(Ibg-BxrN2x=u7LhJ91PK zAiYzj!?6_S_BB}zUh2cn)kSnjoI1ILNMQ?*xvFDmsQl(15L%gfw%TpoN*66yno3;D zQ(jPDHX{g65kibgaOIkcJyJN0y3O%d7@EAx<+ky*p=uTl;_A#1BmnbH3~6*Z9dfi2 zv;>1fC;Bhy3%h?1+%x-2U=bdHMvsnCXGoh4qkoiF*YNH4e0V&CTw+7@7Ap%!3~#ST zdkTBusg)`8#ghmu(5sb!+J{ivZyr`Z%_*M)`Tn?KW2b)oyMNek(h|rD%io1cJbrUt z!@R0bl9wtWHlvisZ~NAqb-RRzo3N_MX>)e5dW-9yl_gNbzVoQvW~b$A(Yu{S4P@)8 ztelvw7EK^g@zrOV8y*x0hdTCW^(zn!XM=vtxm5Kk`kHMzyjQifcMx;)XrN zVvFptWCCV*4sjGKYffzaszM~Pu{u|{5l4=31ApHLwnH6RsCMd^<(+g6+ixj&BWD=WWR+W0V1h)8z`EM{eI@p(UgzxVZU$ZGMM4}W?n zDVh2+yXTq3+`6OMMH@)`OE`?Ujkaff@WhcVf_Wq$bK~2!-s^MFG86#K!2OvA0qyKn zyI=Q(Cl8)HicNuTOiWb?{)R)Xu!3ETf(M@_uoHwp49@}bF)b`n45*l@H=4XT{GtmB zNFZizkb!qf^vB(kK@}5)fMD?EuZWA>K-?xcR^*kIGi}9 zpiWo|{BO~c>~rl8Ix-fZv+KxZ+YfbfJ5)={*@{_&MweS6t#okw#it-lm0#Q824eA- z1}G*35ym%U2PXGvF&3nA)*H=cQqa90dfp$W0-vTbpUjds`N!~XFsc@#*}}Xl%&=26 z)5Ql=Vn2_COWX|q5{B_~rI3!|de1M&f47 zDxsQbhk^Qe*<<|23Dmgj{&{_%EDOIregllSWMj+0yI!H`CUvu@fd`MSQ#|(nCREIv z++m~)8npOMldjFo1U^6e{5EyA+ipdPE;2G){em9{e{@HfYfyI>8d|`!Zr81*Bz&8~ zhdiaHCfMrcc)Y-u)95O_YslVryr$u!sspZvr5 z=I?pNPJfld5c9NOkmGj1RKO!#DUSy?$v+mtN7Bep7)bGx*KdkiA)lAfq6>EsfvBOb zosi@US+x}McWxr}u%P}-jzU*KHsgnWG%_#GWf({QCq*cjk*+B2IY=XJy%ic1wxsbK zd*f!-RC83A(*NiPAn;(^x$@-u16fCglXd)%3s7Vt-4!MF? z%}_>*elsNh9!(zkp>FI0qv|K(^pDL-6(_a(bx-AY9Pz2M8E?*93Mtvgug^;&-j@4& zy<@}IInp0NI6Ve;*J_vc8$@bHP0=Mny8GA)bW;+t4oK>f5@2znP6IM*)!@zA zFb&J_pm_=k>X{83;@lK9z3-{n?r{sPEzND?s5?WMxsH=z5>lUxtZDNyQ=D0BqisgvsB6|uA0pXk$q z`W%b+L5UwK-Y4m$fWS1e%UGr9IPZ)& z^yNq13gqhyMRa7>|Kud{)DwI;maoSc` zA5m7v&9Hztk^z4u1-(ue^}Q?x>pt#I+L!N_su^{u8W^=gNC*B7Edd zv}Gj1R?VOhT@ptC@@$FFASdGq3)>ZwmbPbp0d{HJgsr6PgPTmI^vFsNp6~~E_cDw9 z{pHd!ORf_X_@G11BFb?l0!%=>DH!#>xmfy)=hN`GN`#+CK#|WknHV22uZ!&qNn+3M z_D|kYvi>HeSywpEj8IVLJ*xy!^|=enKvFU+4V1;1!ZS zG*EN?1-2hiE6xXfjQq2zj9Y;RIx%z5(#v-qe1gKSV`Ua*zf$Je*XT<_JsdNkhn;O8 zX0A+}6l2-1#&sM?VPDZkY=X&}>zDC9x`%qI< zX$ToA)30>vXzLqrx7W1rP207?^5x;tsQyI_==7!5PUh84*J>$`5g4dX-Sf^m!O-VpG_zr6*`MN$ zLnk@a}}SBWx}tylq_%SQFQr;19MBd%&XbsQ4;W||)>F;WR*^u&Gl z1Zyl|f@Iu9x>UyYrF^{P0IqiOJ$9-K6AOVtS;6GRk&Nu*Q9TXcTQn1gbOq-za`U@t z_2t*>bw7=PEc6SrFHa^JD1iE^R+3VxIj0wvY2kVX7@nn?l?Hb7Xg%87XIsqbicfC} z!$#f*1JM=cvK-^&MPKJG*IWcyaB&lU000mPE(>0p4~lPO4W_O$}n~ z`htC@%fF`6v@sdi_lIrIqrAgKCoRu`R-Bz2M!sQ$js3XGBMG!@lB-VqSL-W3<@wAu zUPs|pgWC=1V$*$3Q%jI6zsB{wh6M`U7Ren;M^c@-uU=J9cXwrFEac8izq)Mc<8heo zsEim9%q>T+6%HjXGaYj5e`mKH7b?DVas#v1Us$mJ&r%ZY7HKE)WUH8>goTNY97}A$ zI1n_B!T!UlBy(bzP&*v)zKIm(CmX@eA19`$oZQw=x={-W#4W^jFbYhSs zQwUa+3f<1p$sO;Deqvn*DTN&3$QP7#K-YPwM9Uc z*G@EiA3u8T(8D%j9_{bXHd;Y-3g1{tQ7~M?+F7>~UG*{%sEB$z(Tt$cMT-STGKg9> z(VPH8fi&#QKJG#}&}g%r`rg0`-xsy9USo)Bz7h-?*zqFo!??hKS4qAo&!UQkP2h7- zUUZy_><@qI@LZXoZDKd>hb<{9gOo(RL7LQNth^Mm*s&n(!C&&pULG$a7A+n>(UiNn zxq|pZO@|6Feu}CJt-z1{7yN4scCA*Qoh4mdFv>@B{Y~Aowmo8R7$7DfHV<=_8A417sHfK3E+?_3+U+T zHu%5sKw=&wk~m6GnB?vgX~Ma|elnp9>Jn(1TJ5r5cSEU5`p?Ixtl->QT7u6Rj9yq! z*Q(Z7Awl(O&k>}KmQL8rPs*BaHNA}|$m!7*P?n=!S<4=Sm}kOK=wb;nGay_=0gaq3 zC_PCq*cx)#$DQ>`zP!x5KnJsiXr+p_KB7dTtEJ63W6_@f@m4IFpU=}V)YM;C+u)=W zaFn?JJv#46R?RSt2KQ#YxCp-T5=@jpJg%MK*0e|`Bkyl#`NAJjnL0VjSTQv*S(kx{ zSiEHvJsadl5RW-dSQN52OpOX-rWHRdI$|VL1}}d$Tc|!cm+Gd8Ot+(;_z=rPss>j3 z`V-#kWo@J-D}9)B)ihp*ZzeNBb87!bNuUPQ6L<8 z!HKc*juppzp`G;QKwCJK)&PKy0@dX#)_t2feAwy4nU4QAAdo4D0+b{_6t^zi=%t`& zYQMPR#rYlL>P1;`!q-TxZw3YRW5h`csabq)lr5$~)P`o1kLd0we4M8hFCY`r4++;z zKy^*TIwbd7KT7N_y@VmudW2EzA=-Rcjghc=gh@3IoQi)~P~ok{q4`nH+wkHlI8H%` z>Ixd5%_cf=!GRMT5TSuhMW6AH@TShe}PPAAjTX|qpR8QVE5Xhv}l6l zis@`*SY;|o7bsj7*emWIg_2w0r1e{|%MTV0rmKBL*LrSW zkYGKWZ?Z`ynNgRQdQRjD2h^01>Rv|Jh{13B3WE}j`932Md|UPm7`!BEpp;Jj=P$Gh zBvIw8+&Da!^Pr}2kImI;*DVc1kDz5_DX0G=TrP=D4Fgp$d(EbzA_-;6P9W~8l-u#% zyY*&zVp}ylrOO%+M~C8+5&;eUy1mT-`Gn)9)H$d}LcueeAY$*wAS(I42*0j~S@04F z+J@~K;LJ;PM-ida;i{1W51;S>bT_-ZU?izzk=q!#N<~~-_2idJSklHnDSKVz5sD~O z=J@2|2xB{vfqx}5cD}H%G8OZus0k#DWgPDWQ6r(po2SK2RMXCgI`+?)-aYHq7lt}S zK(T=mv4-IIEGBUX2suYozjHuWFwm%jWqGW$kl0g+oJdXMO|K%bY()7dM8lz6OvZwt zqBz-k5hy~I1yBI+X*gl$H_Zaj{&iFkZY%<*5*p3O%AGG-Jo)`Wq)PtDKmKiF(AWqB zV>UwFwQfz|<$G6buO^&VC5Ep;fxCRZ+G1Z+S2aKrgSq{pW2*)u0%k9&FL~%lwiip- z6;3K7ii5xlDDkrXH|a4YiRX()08R1ON8{s`vkO?W`_eOCkI!96jv0}fLgX(w`sm*y z;^95khZX<4>wl}Jz7}Ve33UkHE@QD!SMaeEh5~_NW~_bWp%N-0Ul}8&Hq!>8E)yzi zYfl{D>Mvu1w(j}#{VJ78U6&l|?saX?TZpB-@AvVP@y|}}vGyB<7eAS6KlG*u3R2ie z=o3FLSCynj(uWzo67;-m@|RH^NBkBotH1puL>`x8sK)98Re^L7&zy5WD;-XBs=%g7 zdp_%B$BT|+PHo+}eFkMp7~n9q5affcWNNAtLd-8_!{o~5Zu2j-FbT1fDrfYiY1PeC z5JOYmBFc_do({W6izzq}sX<~uglUUar#yDcOhgaJ#>aMz-seX5q%#l5BE5&+TfB{a z12cc;e>3~;2@K*96vP*>d+!YQVjAL@7L+#?ry3^l1VLIk%L1ItY;_M~h28_}cG_Q- z&k*(wOoWHFD5{exPtAEJMa!UEj%Y{xElivXZoZquYVMS%Wz{o{KWyc$qdop;x{o7T zN+BjGY-u5Yy|ddKOB&Amxp>HPBSy|(zqE}>!)wG=AZ~@m4tXQKk$lC)K`7AE8h>|m zY=`4?-b2R6-Pw;{3jBin?3jMu_cr_j0>|02gJqLBzdpJV>h;@r&^d1gzl}bgoGcD! zAi=#&W=bQ-{`GV9m^TbwSAhAu2@`c4jEt3?5(R^tMtv0?5nlY}``Db5ek@NTP4w0$ za#BBlCaqy6B_$0hk8q1o3y7J7b85s=%CS-AlSgYS(tY`_?1}eDdcE5 z`gomXn4Ph#Fd@?6#0)J>I!*}uIWjf8w%=5ru$*W1a z*=yIti;D-ft)|l;QFoTdJ+7eGdg3rvy7 z577Z-{jZ`a=BlFWrWEvoEaw7F6 zCiPAz7+3BHwQKv9!`iyKwl6(%=^qnKvB7X8l2KKKOgh8v-Mf)hZMQGrH(y=7>cng& z89UuR}bLuA^-I^b+9 z>dC9vPrr|fq$#FZplX^qW9F>wa}Jxc#WLUeH4_H` z$v6j@2F5f%-i!(n`&nB)LDD==kZ5e~Q&hP$wjxlHWxJzm=JxiEt{s)qqwegv^EPeY zwq@R)-8<*lwiRq?Yu{chm6S~z)-5qhC6y^!Jts$o8%IZm8jm^YgcodUvgQ|4c;4Qu zx#UfAkZFLtMFuiu*Vo!M%VQcwD(A0z6Xs!0$Wk?;q8Ub^qqA%K_N_g0cJ18JKG@&a zp3mp&Qr{;Dujh%qdv2+DY zl90p{MNK9GYsT#E9wABj;lY8fbSf1&5IDvJHlAomCP#)F&62fKQC0h(N?@Y-bg*13 zrYkB=lk~S@vmanh$P^~cly%!C66$zke0bsFqc*#)>(z6edeU9n#jTjn`BYW4GMRLs z@;M%rxTFxMLJ$xV{=bacoCe9X26Bi6z@Bsw9c4irx7k7*5ZNaLAR>!zGYC#PhIDIY&rP)?Nj zir3QC-Wv!8bKZW!=dvsl3WsTJZzmj$YHb~zb}$syfgqq)uA#)i%3e*>O6=eKt1%m= z8|X|!Vd}B;_(e1|Hu%G#a8MEg+p#7pl*wQaHDV?9Z@CCju6q?vB$C-oI@H|K+B+tk zhR;Vd79$W0l4xw?v}Mb<=;8}Gec9<8cG!HWR5CqHS4se;S@I1J4zx)U5&~Ta{8HJ( zdTXVFYAr-r#%CB!58ZpaJ`IrRQ8ylZay0;hBdJe~q|yzN1WqYim)R=`fvPHXwu$4| zb)qRI666V7Mb#v;xwUPd=Xpk3M@P1M?p#h;x|FleIfs_kRwPM~%Vil`KxNyGoJl2H z9LEdE3ck_dq1l52{c{WXe20J#;0IwKNk;7l*|v@AIQ#F;P>th2LqnWwCJ6}o2L>+N zxH~y(8X(i7IyP({;=(hIQ&XY6voqD*-Az+N98HtTebFVEfx#hm@7crf zXp-U4QB+O!fg8xAvMr+{BTb&?$)m#~3DJJHILVE4`)%sp&w-tkE7$D)yiASeWlKnw@~8X&iIcI_5ID(v02 z4^KcUQ$RBe7A#swXICf5REnLucH!8zmuPGp$!5~w-8*;82!+G>!xt^;Y3*nqkrg>8 zAS6p7?8u5R9k)34!G>X=dJeeuL46UX1@F1=LN>m>1|g~Bi{>{yRaavzGp7MEJ<8*z zyB@wg8cQtkTo21Oi6)wmRjDfW#X=6x^N=dRLrIoNr-q%*nR8x&YR;6XfWj{X@d_}4 zfK2@&K1B!u;b>GYluB&axS6e6dypiFU@$~D946rRBg--!U0p+(rfHdUy0g8bBil7| z#(*SAiV#As0i~q*1BH=HA?v#1_FhM8GkbRIKuA*%_6eFqHw9{XlGo%Vr4C}_~VU=D7j2Zv+ZBu7#RNv^W)TsA`@5iR-r z{uH1Jflmk`LXe=$4U`(-D1adZLD#Vprde$9JTDLog)-52e8ls-qO7R4EX$NiCGz2>M^hpv%<$qm(iiZ}6 zMoR-D>0IsaJMxG{Y}>d2RjW6vrV30(6EPYZ6F8>HNV?R1$KCf{0kGnsmD2!uH;(%r zeV%7tdOcCHtZxV*i7gvmP^mP#SVu{Fnbv_ifRbX`{znqyr~0 z27*2!u`s4(;tz(9RsZ(@E;#?ZX@I=j#+@tv$R+2TOduHiqAbbnvg8p8`{E+Wd_4Wsglg33qe!};$^pMO%P91IY~r7(9m@k4vRzf*Tnt8_`?s?bQSn|6a94~L! z&eib5`nt?1~6UTi;Y2jnH=In> z{^nU-ouvDFk)}w9tlcaZPCVrVhWht{kQhp4mkr5@6Q)h9cgeVW#S;MBeD7oDA><26 zW(l7zF=zffWJRt9`8>yCbU2BS#&bJ0O=JD5FLTZX=Vgi|>(9?&Rzc3i*<{PapLl zQt?cUfnqGc=3<0|ET-CHJT?m1$>!y$d2vi{nRg#1%2_XxR#RL%4 zE{7i@=M|nKm1{mANs>^|G%r^)bK}2BV5l;}G7q}i&~)MK^Uh=Ss^^eZjmCz=7Zx0G zRQ$T@Z<+?kyMmzaIpHIY;~cN33WNQ7IpL&}v1`gBxVA%bG=t}jcehnkjdg2Qx$imu zf{f!3tjywLvZgYwNpxz1f@Q#rxnt$(8Y@}G&^1?8RY^!y4Izp8&OKwdF%ZaOAed+& zO}xfJl|y;cDb!{RcXf6!yk`%t>rAaaYTiuoDIB(NK4z&z-*7hY`ua_O`>9WUoCj8{ zoCe4{dEC45sfNae#OEbh2{>k+a6CiwrN6VRKg^v|T#h@ctappwev>zadhbat?H{RT8~ zaIpD<1~X@LkjrM#{NeUjH}3ipz`y_Cs%e0{)5i68tl-OkdzlCZegAPw{QLPG(g^IzhpIisJ~JFt7%jMy z&dX5?4`+MNwmMJ4RGuxrp^<2e;Mf+9>nS5S>yy{~;%AX*fV@M-vf~a1Af3+suv9XA zrBadhju!M#q|T=I9GBt2QCy_D6;A=5&b~dnGP7rQx}IC*7P2UlZB3NTEUA*iC^60@ z#urabTo=9{-XKi~;7z4HY8Rs)DoFg%Fe9l<-FXRxLdcGTY1dabo%nhOSaSTaq>@7@ zih|{c1(q5;2jHPc9-jut+j%Ts`3wNJ-v87|iN=Nt^Z5drag4qe`|b-lmGesS|9NK&~hFXZJUIOB}dk^P3s| zfJ(AZzi>*HWdgcJ|E}E!1e`~Cbz(kRJLu|$XVx}Pc;LhBCOeDnrya+ zRFm$is4B0oeTj>%xJ)q}LRGdh1u$y0!$i|)f1ubOAjBbRjyD4k09li;CscBj6@_px zh*vZZ`k5wh(g{c6m<1dZW!LWBum17b=ap%IyiLbFE1%(k$DUVPTADu}jm27UibP^@ zqRp{t5nTbej>E`E8dubu79o&?hh-H>G$vfHoYKBuVAO)GZeQ#l0K7$@ycJVR0IDKm zBT+2Xg+-V-vx}`8-#|ME2tDAa6OU)0cPED7qq(*HW64x{<}^UwrsMMSmg2bH8HGaW zbSg_WSJoc2QM>*3%e06+Ta&!++Mb{fCB z>0SVA*Zq#=cCrMRlEbMgD8`2CSm?S;I1wKZ<@AsVO=jv%s3|Kf zPO*P5Gi!gE;?Ln9wZrGrDA*461kY7hXD55M@4z^SmXd{_sl6FR_ONUhPtrf~uiyH{ z%&&a;i_-vkyNvrDf056B{4#!d(>-TK!qJlz8FWJ?+}MOylW!#n$fU9qizbq+*4agN zseoZ6Wi1U8_KhSY+1st{eiYy@%h5Q6F3(9ek9Xoc{3CC3L*V5cX zYik3Ad=||Y;E3avUO8=Iy-mid)oZ!rtP{BZiB-PlrlxC?nJlT%Vdfn^AAi7K7ng8s zmuw~vLN2d+sCcg=Jgic|Yiemi(N(<`4AKPe6bBJvspej;xtD9q9(jUUHObWSJZ#6N z=vox8DS9@x>y+!5zDY32fMIA9Z3oAx4<05G2~r~?liqhKPSVg2Lz6vZMJC$Nde;5- zEuR5!?RD3`Bjo5ETiyNmV~++v*VOOXjyubj8<}XB+R(5)2W2(+b4ujkm*PXGpIO7G1*s%3WDXi*uq0{J#?W=2^`P$ za9jt|v9UcD&vQ|Pgeohjl7cKr)n0=h{S>zL&`t8YL`(ks!0@RSGdwW`4V5(zj=r7p-mlvf*WV-6Y4+L3_M`p;D5Yqi;wn zeLLhiqdrF(bPUrmcReh6Vs|*}gPl2pR$m+eY|jnysI-G^g&{gEKR#WrHl%S~m*ISh zS5v!rBD0BylN))c)Wf6ZcAhM3=eg1@UMlQmUA~tc`C*2NSxSzD@IXgFm&zHBilpEP z*lv#UXlXl7YXhv&hS^Z+hmu3P6vVG+ctWrzGsv%UtGU&`gIApa5=DhBC5j@+WX%FM zCD-t);)|sA^s+cIi;%9@fk2id(&;q5P^hd`55Q@H;Rvt4`WoSA0@Jd?r<`=cqbnY~ ze|TDh{FROimn|t@xM1XCd-?_r4+n$n+TO#*KJ{_(Ry}{nrt*XgKU=jld*T*LwkotX z#K;zMJZNv^p_V?5&O`~Mq>$-Yp`D?0^cwk9jdYPO`Ig{$Fi=eMtNbb+Rr`4F?glRJ zJ{-3)!zK$E{*>Cv3TrFtf?0-rCYCDj6bVmAHC5uvojoKMWDhh~!skjPiW;4+pLuSC z1td6JZ{%yCrTkrS2~Q-qal5>g7s5$a$!oYSxt!`8?rpsH!!f94z!|T)wl~ zTX@#WW9S+KspMg@FLDyFc^V*p#pAa7pPm^E1^&iy1*60JIA!TliY|2#?(|5KAO6?( zd1>owQ0Rl@`Jm?Nx} zhZvL!c$&b)Lk3LCWKD7hzjrq9N+L(mCn1E4@IbR5V0r{g5>ZPg>}dp1F(d^cWGu<0 zAUULDhaNT0S~Wvn?7*^Yq6LMcXkeMYgDb`9^rl9+mu>thlHy-N>$owwna}2q;60If zT$$DQx772z7R~eh>{`rGm&>AyIL_C>Olu2U8b-Ny)1PS4{9JtaNvQI;NHjGh`0{^z zn~k|)gj6>7Vj01Yzw;loR+c4ufCZd=-np!N@G)l2Ur1xr|E)hh`=O<5QbBJ9ap#qLMH| zG#33RZXOS>96)hA^ny!!QstOpl;e~(7W!Lh3&jZ-eq;fT>rt{zvZXwuxg3Lbo_;sS zUM0^qEzj#pif_eA#b|9UTTPJS-R z$#Z4?HN2GIBL6&2&Ns2SA;s{}5cibUajdz3E?=U0F8zT3OBO9;d2|ywzlV@zN{_DN z&U^0WD_{CTm791#Q)7&1G=Nz$QGNb-{e8R61#bDxZ?EICpZ?S|2l;Cmx8HOvcdUFi znn`CK35LSbj-K_LbJ0a8hEeB!F|#?o{lEV|He4LSJ7*@sr!sFOz{SQbhV9)^MrS;fIk=Q%;?BqIAsjgGRBA$lVYFS)&B(rIQBVNR%p zZaGf404Xy^TDEXhfu&1~`doGxc{WI+Y$^>fn$2LKplb#t&t_Y0fG0COtSI*IjM&Fk zHH+yvbmUY{&BZu57pE_urkKrh zqTR?#Rxi8bkoF1sawA;qKMbE-lWd~OM7EFecx!>8Y=Wea!^HQ{R?a!&G-~sLRZS&5 zI*Mt7khR!_=bqKK{GPjC9vMw>)m3lL5Xn0x4zm2Q7kSUANAuv5tB#FE!XLG42hX$U zn9)(mJFocvWfiIQkNQ{0Kfd%)ohw;!^!Ok+ryI}o>nl59#8pq zQ;h2fA@FhqN}Km`UvVvW&fQ0LU1zZ=B zd7>MWbnSy3&M5yo`waig)7;(C&qz!uSBEz(+`&<_*ZSyuW{6lp<~M;JzLr?aV>3&X zVqpw9fQE*GjD&)Mf{KbFbR56N_I5#PeiSsdy3~D-UZAJN!Bxt|Q*1@zX=^9DoD_KF z^}wS+xY^vmj^TZHu8V_<;g9g+>~oVl9Lj>P#ZDoTkt!yY$I#bK;Wt-bGbxF&wY3>T zDR<>X3(i^b$P*s{_|ea=oi?%lr^YS!J;fhxy`BdifAI<-DgRJ19aW*k{DlkfhXYlg zq%OhB&#mT%cmABrcTT_-ZW#y?%-e0C6kJ}IoyUuY$`?G9p@hlE5plex2r@D*F0O4O zk|mOHnb&4{?2QXNO#$KIxHew4fauSlI)cGAgXfxayb{fk4oJANz;hkELJ4;?hn%+1 zRD;5TX12~X7>;Vlx`8SbJUm=nyo$t1NXW=z^Efs(PC&+P4WY;e8d~{r#ldL_B6I_V za_poK5V(l|w!aKAA;~18f>KDq4QmKde&20!p7S#aTK)05bKDVY=GiyavbRmc!-1|C zsTD7A#;jvVG{mZy3g|k${rxzugzZUEAQ)(R;fY6XyZQGw*wY&1e`tK`O!fWb-+i+bTI%m7riYQ{c`!Z)M&&+f!oJd<=skdhx9VPa9l!9o%; zh8`l+*iK;X9K_sC?5H14cvuuEkRwNq0(neISXj7tRe%Vj@;8w@%zy&2f`*1vxtxw) z#rBnr9|?hi3b7!?m|Bfy$jHb6A5ME1Z>(wypa!Z!$!Baq)k!BFM|PwaMNt?Y%^vrtlbas^03ZNKL_t)w?_G5Pz_r)kJPnZl zsj+bGj1vll!g~}|;q|qD;@pcb!gA{zSFBsJhKG}{Q9QK;ud~6ZSy3rbq(}}669ttJVd69p z5ivB`kE3|x$&n>Zjtm9zSeV$@Wgu2=W%qDp0es~q#*4&PYX!+D6?3d?Zn=~LKV`E_ zL#h}IUIlC_YB?@bqn}(%UTRa>IIykm{0d3p6s?2B*--Vfi;EgrKDv&+-Mw|^S(79h z8=?r;A{Yu8jg8G8{qaw(j(p~mADsrsfA_fSp=Y>f<#Ya$?S9L0JfG(jm@{`Snju$R zkO28imYeUsoxXDuxB;~a4k+hkWjcJA&3+`c(io~(Y4>3m6~XcqT3fbu(<9TJ>Vt0Z}>529}+AGTS!2hODS)y8n`S3yzrm!>fKc4UqrN zvA2Ji_np5KBypT!_|7skl^t8RaQZoCV7oQMT!NRLe}RY0b(qIAgCwe+Ed=;fA2MnM z3`)5{XQ5aQ9qT^iih1Q#QU}ZMD92dcO5%lrf{uZVjD>}bRS{T&AR!EVxVYrWQ6!Ip zjX|CD#Ljg8Bx$)cI+vLvYE^rc&YjQoPcA2)FVtla zTfpMQ3rUR(p!ou_;q(9f*Z=wJ{P^d;o(9N&*Z9Vj*OVi^e&26Pmd)N>TRHjka!N^U zNgcaja?^viF?@OhBJLkw?1aD*peH@DyL%DQvO7`~ZS0Uh4u&f;aaqv3iuM>YSDcFe zsMQ`WPMM3~qM{NaM1TMe4mom^DB$9up%W%T1C2D%OaqN1NDwDMyz*%I@g|}~G0^ew zC{iF#4i~oyECU}NE+!@(9tOUOc9E-wS{cB4MdMJXwaT!Ns(M61X1h^hrL%p~Iq#m+ z%~|U`{P@b6sH2h9U3u=hdwHG9*8>(Ec?7xSP}x9K{h$5efBt0dKYsD=rUCNbF>d_B z!`$?vZ*k+@kNlHavgSCpMLZUwd8~CoMc)U28?U{ACq)m+x%2UCr)D{zN7xACz21*} z+Cm&0Y%KJl0?OSxaMtzVWYU-wQ%SAZ_YM{Xaus1TDgx?}B}0)C8ajcB*03;1k)%i- z6_qd%qQnRiL_xvCBtwQINs^2*$_PnDNs%N=7Q2SOBxoQ;3=N$UMY5!Eu<;WhN&-KA zENlwo5eR~WDrTL)q=bu$fu8_DB;+dB(JCgLRC6n75-Z(Z3>1=+&i&`RPRG|XK$)7` zsQ>sL{_A%?BU3QzdR*&@%#vdl)8D%n$CGKFHUGx|KmXNlrvdVRbNuG!`}o9r&jkV^ z7zqBLVA`049J9J-6A1dp%k~S{)U%U^-uNT=OS^Gwv!>o>xp|F9ITRBHo+=|MbF1AJ zLJb87T(cUl`}=6Ou0hydHO@dCL6&NWGSxX)K|!h^(_FOK=*=ReK&ulldIg{+CUBS1XQ zLkPjWkG}Ztx?z0NESa)nrZ{%#Nf-hDnCBMRgR6h^Q?AOdr1%d@AZJ#W{|Nz-qT*Yh zp?G*RZbP^t$YUP;vQTL&*JJ(jz4$(KJnlc8iPM(?(?*E~ks6~F3*W1;;-v%L*FPfF zL5#ZN#^6SEZ}KJc>i&8)f883V!r1>_l}Sx}#H;a_jUQp*@!>r_e$sJC<(rI;-MxD` zJ#{;Shs6LF)s>m^fjhYWXE)N)+JIB}UJ~%aOKV6KB@{&`m)!Tzo?oM+gST!Jz=_*S^MsdtbnM?|i)ccnK3xDO{!GU8Fz| zH)`Pj!#aXbZL5f_52?}+$~y08pM@t)*4>uw_7YPYVa_Rk>Bf0hWzpv9E05fNFVinSO2*R=E;~std zvBdz_TzBJNy}Z5c(%r8(_vA9S2!}s3oJ@7c<8juneU^`Y?lU;v`1{O^@LVe-1O_=#62NSP(B{AO{V!vln0#Vc|ZV*6w3*GI@rF zh8TEZkk@a$7O|+E*e^c~3%e>s<7A{AgQ%*G*WQZ2tTCNLovmNHFZOe**CF*YxmTk< zCjMWq6UOyKSxjNZR9wd**2J%NKF3v|E9y-TA^7Obleo9%K?dhW zkbumIt=#|Y>%4czUb<$sSC{3sH8o=9U!bwIi$bB)5NquCJK#&7`_w1?>gDZinQC&! zgHO-&`TSQ)vKrmDYYS(da}NG+u#x~+7NO1SH}b<5Z(;D<7Q8@(I*RewhvW&2ofd@! zaU|V`v2qjktGkJP;cTSy7b3bF5v>uFc!;>IF>h0e-Lnj$y#-_;p=c_tZLJ)+U=jA# z0S5oHp2%@?Q3i7;sUqrV5&fnY$o%jwA{U&1>+@CS=y6+LshQcw`Git8!z%~SJoPN1 zRufDFqS%iCI2nr6KyoZ%ve(P-QD-)~R^MJE=*bKxGpvi3a3l{YV36E5O!q#Q#fui! zl~3yE?Bq{>dVz4PkyJX<{Lznn?D1P}{N2E`2Kh?@gRZs z|HsNjxTIrIe!S-?z8$=z?z2OY2%!GjlWR|vZ(=VUoqVvxu5sOq^zL9{R zpdl0RskmNXMrJtk-v9LYym$~c%R}hSa zt3O5qo__opKEL8h2LApq+=v3+xaL5V>(I8p0y`J`QR3kV^JckqVBnDr6wdo8U1y(& z7c%I3Y!##F6uB)77 zW4rNn&p=dS54Cf?sI&aXVZ(mr_wmc-O#sQ%0CB5^m0N|z_jDwJV5uN;}{v( zo6L<49QKh9T-rZP(*FYE_6Pn5KrWa6iR}^^9Ufru5r-3ugsLJV0Lygv)x9?`azY$0 zp;IlsTRF(XBOy1iXLv74JYEIISe}!A?LMOSzK(q7t9<;rt5BAIgU}uS%zJ+Q9fTwp z8X98GoH=~^+uz3L_tUd!Gdo2dE?GkIpKqq{qq~uW4^Q_&bArf+E+p7JznU~yPr%g) zHw~@&pIS*h(JFiDgh%QhAKxawt6D?vRaE2}nqP0$)jNO33_=%|LMYB3a<5OiF8)}A ziw44U5Tu;1W}|#=89%z=mt;%z3A{dCW5MBbNR12-49B8F$<(I+uKYhgp5`Eb?zrog z-*Nq&k1lR+YreWz6B?kk~7=zr{| z_@224Rj$ku<#|GXW(VHqZ%3cm#PAJIGdtSE*=L^32E!z>s2g?pD(?Qn-MsO}8(e$s zwY>4h8{l{(S8qn1(?Z}g=P>f^TggBC5{b)BrT2R`G5qD9!YiAJoqIAu){raWDOY_> za^2o!p_S|WQgYoku8SsenK2=s>|&N`OgHM7hp3zfX@Wr~5EO)kV#6}830QEIOV2h!(FXhh-&wcbaP4;=dt~Lb2Kh^j z=9c&mQkkMK%>se2kEV{c@sj?)&RxCS`RXH>7j=^XUJ;GWjM?&|tOO7%-&?!9@uPMX0QoORTo`O~GVkJ|TA!w#v?3i#-0XUdlCh{f^Oe zzV6UiC`3zBoNOjVqOpYsA9>=hI%4=&50KmMe*%Et-}Bf>iX@*b$r7?xq^YgBs{RCk z>#_2Yhj^_kkF_|C@Fo|NcEz9(NVi7m|`nq~7DKagMF@$T9%a=$rw}0Zs8*fSg z{OBh?n>MlDv}twg4gB=Cw*@-dTE3GnIVT1JI?3T)PFZ?NwP1h*?B2SA|6Fkc+b?g# z4an7etFfS<5a72BNLpAk;|N8ri(l(Wlgw2QkXg5D%I{HI13jBeBkvd_o-t|D1B6SE zeR&h&D;J~8Zbd>Nc+w(*3+52{>}4S2{e<+?{p_oC=9F3&G@L47q~5@i>WIIzU+3=F zeyx*&nzJ&|1XCrQp2BV}Q)d&Bje2j7BoWUFo>0o=PF-x2+3gJ6`Xpx^c`}g-R|JSf zqrCCPMuO1>az)z+1cUtk`fDG1c;!RW0C_9ppT7RB;~h`@NRm~taosDt_e1Z)t8||o zYr1*=eGhO?a5IJD8}a0tOFLGGT9Szl2nrzsrzu$1lw2SnY@jXQK(Rl0(C?Ga<>+0# zo`Hv7V9%|Ovi+tNs3#qUrs>GX%q@$mq+-lyM;3D3Os&@Fk%@p%rvOg9X;dE&Yyfpa3tlGYjeXZq8Usn?pizc1x(;R)w zk##{vAqo2X`_cUop~zDFjMGkh_}+W&8J#w<-o&`|{-?NQ`D2DAP>j%HL{ zty>H=IxxsxYabl z|C-9HH5K_E+aF80lqw-hflQ1z*N6?{VUn5=4}`cZJP&C!TLzkt$S!GR`L4AL435+t zJ8#Zxl7stDWQknCTo6ihTnsQgGBOR2Lm5x4dW{cXyo_Kd+^MMgM=aZA{cA6C;YH_R z*MLI>?!NCq*0v_G=7sURv8A*X?NPykVQUn!1w?CNf`?{&RxMt*fY{GIf!-8-b6?hV z%l@L0jk+&Y=ckeI^K-;|2*3$#jXM+5XJw%X@3LaatWW-nyGv6;AWa zOOuaZddi6m?At~-8b?vI5B~0^TN+wtE|><$p^Rn6FD?hc9Op*YgMq%ioV@g8N;Sf* z0b4e1<+c~^qjY&Uwrx`1{;3QSS9m1)HBwzVQl0jw559Slg#CqOByRf>@e7VYKEybx z8VMphphz-OJW`h=qEu=5RA8B?KjcZEFaTd=n+S}l_QzhMBk&{RN5#t&$o1?%wwOTE zYt!V%_>N9#<4!hx=v%Bi?vre}@T+V&Aq=z9BlmV_6GpC@vapg z(p2TdOeRY}mzXtw?j!wAEPEwTXb$)!5~g zd1oAke&c6pzV#nyTDlnZAm7)@7U=oK9fXfL45_0Txe|1o7>rY^B3bWM8Y{C zWy2@FN%GMb>VBi$JIuh9x3KpUSCY;SlTNhq@W^XZxO^qv7hOPGzg;<_F6z8lyckb% z|H{WE9e&y=C$ek%7BpXo=H{lW0G@pMkAF3?_*a>W^|v3q2!O_hrXQCaf#;ZX%xK3S z@K+Nobl}Oyp5wXE*D&9EG?dJmh`FeeK~E7#YX&h-=tLST9$lw5m`vDlaS}nK4<3(t z$r3u(?8UzRS%x2cfkNN#Wb@myXgO;cP2c-FBvqdx`Fx@|Ge*2+R75$rRsp;YWQT@$ z>c9Sr*KfOx?7#rHE<%=>clOzQ{N|f6{N=R%u@(zs=Vb4O4Lo(#RqTB3IWoPyxR!-$ z+jyRbtSG21XsDId@B({+7fV8=@A+p*uU-#8^t5A`d(FQgHAfk|>k+np;VLpKUS!|L zet_@Zt9V)+5iglT6m4`pfF|ixxM&E}3OF=? ze4ZDtzM2~^ypSDFJ%wvoWd}l`fMc2rZr+ThX)HSZ^lHmCrLsAt5?9Wh%bwM%vGREo zUB?KADP^-|*Xo=(EcoCD(fol*zS+cBI!Ng3yzw>$pLh->=%@P!Um$j zBAql3;hFV~0>>`9A`#e>C%a?@RMwSKlRi5wo_pwA zvV=t!UBv8@P6FHJo^O7Wee2fYxi0(GuEi^r&?_CR#x_ZoIqzTog?uVS(}D%G9ep(U zY?hy&TwXupkH;}It!B-*TyrL<>gB@LavVsFMG4KHiwu=?MQHl)`J^6S#o+Z1GVq<> z(Rb--tZE8zl;a@D^>gi_1xIk^gU@sOg#jGEB2Vax7jg67+{C4qUPNOeJnkNj$B2ja z;yO02=4-j{!IfXSn4Vc@QdQGR1O(*}$=+VXtfmRBU9GZ>iKjG4v(&>xLneT|tDnqWPatp* zn1BgbNVqlYz%{mB`D<2P_!)Zs^EYIBcHlV=eq%)aWXlsYr3p_QfC0FpOW z0MDU#${g<7wT8aF!MbCY9CaikeLGPV6`|;}7oT#`#Q?vUkgD>o1;`yMp5n4|ml6tx z&QetUsG#3qWN45%^Si5^j0BJ#O>^Vpchi4L7*CgBFo$>ZtB@*|8=hAX;uC&kOCj&C zsXsoNrS$%5D1GtadQbd1**l&E)287c zF0ayCxdt8*GOvE@EA0FK**ov}sOoh8zfYN(ne;{qN$9`SE?E;2Xw|-b;J8pO(gYG;up-#9 zd>(RdZ3C{t5+n>^L5mUwlCBvEfV=o2@}X+xDreC2<^Yi;i5VGvNIF#(upPQvnK_ha zVAGcE=n>~6B_$vzjfk>2Mw87q|MB@h*dF@X-TxmT0MjOoWag5!21NP4Gz1PG+Q;PU zt|ruSZU$B^U(LqiooE;9&~E!0wcERBPp?O?8NgJZohi@HKsMRKG!zL5LDf0+)a#VaSw)*i z?qK+mIam@>5YegFwhMste*MVo-yg|Om=#Blvf|-~X{@N=nwMT;)b#1TsAB(O1gc9) zSnR6S8Fr9Fzhe;0vIXzC8ibA+2xy?Fc%NA0Bd+JC zVEXk0ZKXVI`$rKj&CnDoGewGst z|B1A#$I|%^PXvm<>8Kof`E`^=2VHKvjZTw&z8x#@?bA$dOp00K*XRE&*x1 z`UJ+M_V5Xm%9DRlLX#jOC4w z-oYK=jPKUD1GSYGkt7jaw%oXK)tX+n-aPd`7a$A#`5s1V%xfmIHMX&#fmpkloVIyk z&YGgaBI=xt2wjRGlts- z`@dBS1l&m-TOkNdk3z*frYEUup20SK1db)!F?PtrHm-j}i5?%h9GmtV3<+^`eD3F% z;u8FO4U{Zh$+?wluxDp8_T6`Vr8t3O-+aRluf2vTCWeVmJw;~QwgIuL$*Q$+@nYV( z_g(--+;9Vrz5Y5jizQ4Im@Ur$03ZNKL_t*iGKGYo;Ps-r-FO-rXsD=Q@9Ncf-EN<` z)?}jZxN!m9B-HZN1db+uiU_24?MiBY-^5Y9?;sW5Zx5^SC^Ts!X1_9D(}3=FlWfT3 z4SjFaF*e(6Oe?b!iyTN%Q&SQs=%2v62<{*NBS#G8+?fIpjU*(cz5(#%tU3RA0GYG& zTc%AJ&DJbbf0ALk!OBJ8>!;g^HJB7?(k{LPC8 z)yF+dMhmX(MHmKk_4}Gt)YmqES;jE^3WPXc1x0kwN_^4P@}RbUC!^ooD~X6kGoJlt zaP2rr+}-0aWT%924+#@RfBJ}qLj|3s0f|9l&_ z|5Zof^lQiZl*q)SJ8BzU83v<~k~2rRZS?do<^1H~<19J5h58$E!K;8KLZt&5d`F3G z5ZgR0G^s!HjKW8&cFRR_C8(F3KhKlCZ0(kIUR9fBGMPA4aFmgwhJ0X7E-{o_5uocZ_2*z4fI)fY}CmuA7 zSW7%r>rNuw*vqF3VnAJa5EKn*WCuihJOVytQTHf#S02DHtRqrZVuVlKfP2SLT;Cri z?w;|OyR`M!w2}f`=KL$OQ0p3K|LLDFniCLE5s`78FJ;efpC`6W8+twV7?Pi`YtNnI zD|A7pth|P0T3N{_MLaA zudPMXbqr=Rx-TmX6;K2Lud3qJG#oA$PLBtN+fAdxL8HTgM^&+;rD4m;!W$xDY5sK$ z=y3DRh_)EEKlvopM~`vn>6Z`<29QKFS8&Ep7&{PSN)jq6wX(`_lf(sAB^j2aW@CMA zpW(c*?Oo0cYlDgh4G+#K-B|I=2CgZ+mR7A&fE*N>ay;0m7~= zETpoazz2FwW6_gOvieVd!dY93qqde-ZQAg{^5tAHb}TlF1wDjtn?#?`)&d9uiShCN zI#|I)@!zGvU_b#(Rx9>^&p)`h{o6v%m;8(B|J^o|CzCR;Kc|;0;>71)P_b<{0oE>w zWZi!g*^k|h5NJ56bHL!@gu9jub5b)dBFQq3CG_Dpm1j_r>JMpa$y>YAV&sHsUEMr^Bni4g{%4m^im) zIp-FyBxA%ddOY$-02~sat16lr!aa ziIyX_OHq!Cwk}0*BIzeB0@mbII^TC6lecbSn(G1+PHkuO;q{EG+E3Sa|Aa9vF02iN z!)#@-=Oj+e9d+zS=JcdvaWJ$;7X+&NCbRtP0V*oOGj6XOJ(45)cOptMjUI*_J$8K9 ze}s~ro$8yhB}w`uJ}w@oqmkY{I-|+KfHxEH?fNZzb8#Eul+NfLH5f#vxfIioM6)Jw}){FF+y<`L$--O0SI!$HZh97qoqY`1|-pc=Q;*c z3~_Bc5Z|>Mrq~1oe*x1_K{5-ESBpVogNx$E9u;`TbNn5 zvbvtx3%;cMuC{nYPdK-BDp2YJh|n(+K?7qwD0VY~(GW1>>W9vQM?t!|e;D`ht~!X` z=tdsd3DIm1h))6nT3s!!{QbyzY1k$V@H+;B5nADC~?@@c~ zB>i7`k<_leLORp>mZYpKZvFgo9?Q??sf`k%yH8oYFrYB*Giw#qZ zzFoDJEh**bz0<)P!aV@Nsi2qC`ql?zf=fZH(@a6X zC?;GX3TT9g{bH2!#0X{n$AEA-fJx1MS7=r~NQ}}UtLc-9LRL&?KB?W+0@Vpz6_Z7` z+5~?nk*_bV^yC!YeE$tRYIqQ1+q@j=s>%^%BevM22WNdbGky9kH~;$qWMGdry!!q; zAuToOH#Kz*n<(lCcxj)P8z3H4)7iCc2U~J#XiN}-#iyIX*+l`pv>rSvLdRr;BrEFf z5`+P53D%+!z~MnJsX=U)>JLNlk&buGVf3R6 zM5b})Q6Gm(h()s7&^4VC&%Hs__I-4F_E*^3wh1|hW*j86e_tfgUk)r{3qXmsFH+Pp zL@^T!Er20%2?tSl?~!P=wwm&4WJHRoXIm1~)<>^1*0WnLdhNZ08&6MEaK#CXpL1iyF{;1IPATpJEyo!k$>Vv5K>lxW=L`(34~mWF-DIPugg6u$Z~Y2!wa zGh=F4x53Dl5CM*#vOOBWqHS;LXQC4DTUbyhz!w<4y>pqH#&&P<8@peI!&2CpCNy)J! zCne$vnX#6ySjB0`lownmXovVJdRuEpryv3*K5cRj0l26QGMoM zImD`UxCG_<ZkI#uJiXw4INu;%I zO>Vbt^q(||A=9Q|^7}(t66u)~a?s2j75=(Zhp?pMA5V~FsHl8I)!WuXgl=Ic-`%2K4 z9z=I}nv-Uo%SX7XhIjdX^b0kZ9vtN-=J0y7?r#quwMsy4odRJk0Q{qnZwdKbGT4k8~}&aW~2Aep|on< zn!>|}`DW%!{(R@1Jld}xd%pY57ys1)NW>`IEwb2!7@>Ux*MfS>1%rXj+PN0*<AQ2jYujhZw;r4FmngV`BO|Tf?$)N}%bD?hrU&}{m6^AssYoI53sPyk%e;7mi4CIVNbS<*DkA|UDc=$x_ z<9CsB=X5_fgv%0oG{SEJiK41#x*qk|mX^rxFdD-X#>`eLD~=pt_Qs7Y*u9(04hOHS zTuENnt`zLq!|%q7Vb1fx%eKG|31FR`k+Z+>_qIIq6OGY6pfJ`y(X81a%LW2d%6I zrML{`SP6pJh;!p%DxdxwwWcwsz@rj3+7|{cT1;d;Je|(3K7|%2ClT7MJUXX{BzzI5 zE-T}cC!b{FqD6Q-o`AsjQ-PuT!$z*Z?KZmi=@TZmqiMd_EWfBV@~W%&Y}YOxefM1w z)6<#%hd=Pz)TvYy6(RowE1DRhclZif82t54qLsk*k(LDuo5V_rmD;HEVKf-HA*CC( zGnIt44t0)d%a>c%(co}}OClqOQGDt!veAN5;fB>~*SG)gq~HJcx>%oo?DKlw^T1=@ zcr_uTwz`teo!XF=)e2GY=a^~m-e2Ef_0R^?UMUDoX1=BfTTKVI242;d8f!CS!iYAp z8{9n%aawQ0Zdv#O6#YZ%Qc+hOf(y0i7iyr!fnYad{@oO$j+wsibt*VsUxVYNWw_>U zK|NQ2a<-htd7E)NWBKPsTkYr;-U#HN<1VS?ho)}?W zIL0tj_)W(|*VhPVU~#@y(k#x?uyY`}HF+GZU}>*w94-yo$o9C5t)v z<(HJ?ucP|VA>6f9NJ()REODqP5pAb^>k0~r(Sp6Yf&nqDqtZwsCeBn>a4f+KqHl^2 zk`gKUVJAIFp<_sHP>j_|Vc{8MlNC`mBq?6cq3f@{YTtqd3;yo`WZkA+%=-Le7OmXy zggq|)&iY0NCP|}f@2(ilrhxTj-}b$HbZ9B%x3@!UGSvzpIzZDuf2Uf}r9hQ}H$5J~ zC?S}Pem_S@F*Ku$zPkv0e{s+vF}wq&Urs4{HG z!;lacl(Yqzxc)tf?bZoNlAE{tp7gv8v>B3bso;`!T ze|KcF9TiWrrlP7KQs}wF%|Z^c+`N#h$!tPBU%`%e1&1NnMpWvaO~JEYaND$7kV0-g zBO{$H+jo+lnM<5i?lF4g&^HDQ8OfYkGyiXiSXU13&-zU}lH%eM?x|^TV2d#$n?&Mb z?Sa9rt7~Nb!ucG#G6t_fyS#nW|1NtabX`WUSwrU02=XzTkgn|o@fP1{F(wQTk4A_M zHgeIb8qqFBXZ>P~8ADzxbeiiTzOWTN@VmiA%)zCJutGmK5p-2)DSw$bk&FK5UTbX7 z!c$pV%G$YexpUYst{F0f_3PH5`av7{osqw#09ko?ygqj>qx>npD`(B(j}JfGtW2o_ zq~+%F`|rNPV6jko^eA&4dWibU%BVwdbmmMnk0%IDO~X@FL*3!yoPOm4Hn$m0$?OG4 zVFieq1SXA&gm`9GZf}uRu4>XF6vxRy$;_P-o^@!oSjbLK#?e@ZXpYPI zX8q=SuNpV%|E7p_&D0t9m@L-mnl4I3XHPNVs&OGER5-ftFmIk%M%kn^1d~hz+X(mv zn^r_Y#CB1jG0lu%w>Gmhg?h2Yju{AvR;X&k@QW)k-7&%+OXQEcI$e%?=H{rNjD2J> z_VEKloMe%q7E+*(lhi^x&1i8^p2kN0I&2sfXU_OyjUIZ4mp5*t%YXsCILyXIAMv?d zl%6}s@>#Q3vv46Xb~`EQ>6k1QBvFhC65Y=wOlC6^r%&hP;lrFhdXyu(b|D#!bR9G( zkTcQ*C~I6C>0P_Beg1r^i;Gbeg%0D#HxscAeEczWMZwA?DZ>Vlch@b*32`X3^>{8- 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 literal 0 HcmV?d00001 diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/nb-configuration.xml b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/nb-configuration.xml new file mode 100644 index 000000000..747c494ed --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/nb-configuration.xml @@ -0,0 +1,19 @@ + + + + + + JDK_14 + ${project.basedir}/licenseheader.txt + + diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/pom.xml b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/pom.xml new file mode 100644 index 000000000..ccbaae520 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/pom.xml @@ -0,0 +1,50 @@ + + + 4.0.0 + Labtainers + MainUI + 1.2-SNAPSHOT + jar + + + unknown-jars-temp-repo + A temporary repository created by NetBeans for libraries and jars it could not identify. Please replace the dependencies in this repository with correct ones and delete this repository. + file:${project.basedir}/lib + + + + + unknown.binary + AbsoluteLayout + SNAPSHOT + + + commons-io + commons-io + 2.8.0 + + + + UTF-8 + 14 + 14 + + + + + + org.apache.maven.plugins + maven-jar-plugin + 2.4 + + + + true + labtainers.mainui.MainWindow + + + + + + + \ No newline at end of file diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/removeContainer.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/removeContainer.sh new file mode 100755 index 000000000..67db75cc5 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/removeContainer.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +cd $1 +cd $2 +new_lab_setup.py -d $3 +cd dockerfiles +#delete the dockerfile associated with this container +rm Dockerfile.$2.$3.student diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/renameContainer.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/renameContainer.sh new file mode 100755 index 000000000..90f73741a --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/renameContainer.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +cd $1 +cd $2 +new_lab_setup.py -r $3 $4 diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/goalsui/DocPanel.form b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/goalsui/DocPanel.form new file mode 100644 index 000000000..e80f4c300 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/goalsui/DocPanel.form @@ -0,0 +1,82 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/goalsui/DocPanel.java b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/goalsui/DocPanel.java new file mode 100644 index 000000000..6eac03b10 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/goalsui/DocPanel.java @@ -0,0 +1,132 @@ +/* +This software was created by United States Government employees at +The Center for Cybersecurity and Cyber Operations (C3O) +at the Naval Postgraduate School NPS. Please note that within the +United States, copyright protection is not available for any works +created by United States Government employees, pursuant to Title 17 +United States Code Section 105. This software is in the public +domain and is not subject to copyright. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +*/ +package labtainers.goalsui; +/** + * + * @author mike + */ +public class DocPanel extends javax.swing.JPanel { + + /** + * Creates new form DocPanel + */ + javax.swing.JDialog dialog; + boolean ok = false; + public DocPanel() { + initComponents(); + } + public void setDoc(String text){ + this.text.setText(text); + } + public String getDoc(){ + return this.text.getText()+"\n"; + } + public void setDialog(javax.swing.JDialog dialog){ + this.dialog = dialog; + } + public boolean isOK(){ + return this.ok; + } + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + jScrollPane1 = new javax.swing.JScrollPane(); + text = new javax.swing.JTextArea(); + okButton = new javax.swing.JButton(); + cancelButton = new javax.swing.JButton(); + + text.setColumns(20); + text.setRows(5); + jScrollPane1.setViewportView(text); + + okButton.setText("OK"); + okButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + okButtonActionPerformed(evt); + } + }); + + cancelButton.setText("Cancel"); + cancelButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + cancelButtonActionPerformed(evt); + } + }); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(296, 296, 296) + .addComponent(okButton) + .addGap(104, 104, 104) + .addComponent(cancelButton)) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 852, javax.swing.GroupLayout.PREFERRED_SIZE))) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 264, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(okButton) + .addComponent(cancelButton))) + ); + }// //GEN-END:initComponents + + private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButtonActionPerformed + this.ok = true; + this.dialog.setVisible(false); + }//GEN-LAST:event_okButtonActionPerformed + + private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelButtonActionPerformed + this.dialog.setVisible(false); + }//GEN-LAST:event_cancelButtonActionPerformed + + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton cancelButton; + private javax.swing.JScrollPane jScrollPane1; + private javax.swing.JButton okButton; + private javax.swing.JTextArea text; + // End of variables declaration//GEN-END:variables +} diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/src/GoalsUI/GoalPanels.form b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/goalsui/GoalPanels.form similarity index 76% rename from modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/src/GoalsUI/GoalPanels.form rename to modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/goalsui/GoalPanels.form index f3f16c0b9..9f2194ca9 100644 --- a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/src/GoalsUI/GoalPanels.form +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/goalsui/GoalPanels.form @@ -1,8 +1,8 @@ -
+ - + @@ -28,32 +28,39 @@ - - + + - - - + + + + + + - - - - - - + + + + + + + + + - - + + + @@ -76,8 +83,8 @@ - - + + @@ -93,10 +100,10 @@ + + - - - + @@ -104,51 +111,51 @@ - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + @@ -161,9 +168,19 @@ + + + + + + + + + + - + @@ -318,6 +335,7 @@ + @@ -332,7 +350,7 @@ - + @@ -350,6 +368,16 @@ + + + + + + + + + + @@ -418,5 +446,13 @@ + + + + + + + + diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/src/GoalsUI/GoalPanels.java b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/goalsui/GoalPanels.java similarity index 75% rename from modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/src/GoalsUI/GoalPanels.java rename to modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/goalsui/GoalPanels.java index 43a39f334..f521ee1ef 100644 --- a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/src/GoalsUI/GoalPanels.java +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/goalsui/GoalPanels.java @@ -1,50 +1,75 @@ /* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package GoalsUI; +This software was created by United States Government employees at +The Center for Cybersecurity and Cyber Operations (C3O) +at the Naval Postgraduate School NPS. Please note that within the +United States, copyright protection is not available for any works +created by United States Government employees, pursuant to Title 17 +United States Code Section 105. This software is in the public +domain and is not subject to copyright. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + */ +package labtainers.goalsui; -import static GoalsUI.ParamReferenceStorage.GoalType_ITEMS; -import static GoalsUI.ParamReferenceStorage.Operator_ITEMS; -import static GoalsUI.ParamReferenceStorage.answerTypes; -import static GoalsUI.ParamReferenceStorage.goalInput; -import static GoalsUI.ParamReferenceStorage.opInput; -import static GoalsUI.ParamReferenceStorage.resultTagInput; -import GoalsUI.ToolTipHandlers.ToolTipWrapper; -import static GoalsUI.ToolTipHandlers.setComboItems; import java.awt.Dimension; import java.util.List; import javax.swing.DefaultComboBoxModel; import javax.swing.JComboBox; import javax.swing.JPanel; import javax.swing.JTextField; +import javax.swing.JDialog; +import static labtainers.goalsui.ParamReferenceStorage.GoalType_ITEMS; +import static labtainers.goalsui.ParamReferenceStorage.Operator_ITEMS; +import static labtainers.goalsui.ParamReferenceStorage.Answer_ITEMS; +import static labtainers.goalsui.ParamReferenceStorage.goalInput; +import static labtainers.goalsui.ParamReferenceStorage.opInput; +import static labtainers.goalsui.ParamReferenceStorage.resultTagInput; +import labtainers.goalsui.ParamReferenceStorage; +import labtainers.mainui.ToolTipHandlers.ToolTipWrapper; +import static labtainers.mainui.ToolTipHandlers.setComboItems; /** * - * @author Dan + * @author student */ - -//NOTE: Previous Matchany ComboBox has not been implemented at all- 9/13/17 - - - public class GoalPanels extends javax.swing.JPanel { + + /** + * Creates new form GoalPanels + */ static Dimension dim = new Dimension(975, 100); private GoalsUI goalsUI; + private GoalsData dataUI; private int rowNum; private List resultTags; private List parameterIDs; private List booleanResultTags; - + private String comments; + //Creating fresh goal line public GoalPanels(GoalsUI ui, GoalsData dataUI) { initiateGoalPanel(ui, dataUI, dataUI.getRowCount()); - this.revalidate(); - this.repaint(); } - + //Loading goal line public GoalPanels(GoalsUI ui, GoalsData dataUI, GoalValues goalVal, int rowNum) { initiateGoalPanel(ui, dataUI, rowNum); @@ -63,13 +88,18 @@ public class GoalPanels extends javax.swing.JPanel { setArithmeticResultTagTextField(goalVal.resultTag); setAnswerTypeComboBox(goalVal.answerType); - - if(goalVal.answerType.equals(answerTypes[0])) //Literal + + if(goalVal.answerType.equals(Answer_ITEMS[0].getItem())){ + //Literal + //System.out.println("literal set "+goalVal.answerTag); setAnswerTagTextField(goalVal.answerTag); - else if(goalVal.answerType.equals(answerTypes[1])) //Result Tag + }else if(goalVal.answerType.equals(Answer_ITEMS[1].getItem())){ + //Result Tag setResultTag2ComboBox(goalVal.answerTag); - else //Parameter & Parameter_ASCII + }else{ + //Parameter & Parameter_ASCII setParameterComboBox(goalVal.answerTag); + } setBooleanTextField(goalVal.booleanExp); @@ -81,15 +111,18 @@ public class GoalPanels extends javax.swing.JPanel { setSubgoalTextField(goalVal.subgoalList); + this.comments = goalVal.comments; + this.revalidate(); this.repaint(); } - //Use for loading a line + //Use for loading a line private void initiateGoalPanel(GoalsUI ui, GoalsData dataUI, int rowNum){ initComponents(); this.goalsUI = ui; + this.dataUI = dataUI; this.rowNum = rowNum; resultTags = dataUI.getResultTagList(); @@ -117,14 +150,13 @@ public class GoalPanels extends javax.swing.JPanel { //Load ComboBox Items setComboItems(GoalTypeComboBox, GoalType_ITEMS); setComboItems(OperatorComboBox, Operator_ITEMS); - ResultTagComboBox.setModel(new javax.swing.DefaultComboBoxModel<>(resultTags.toArray(new String[resultTags.size()]))); - AnswerTypeComboBox.setModel(new javax.swing.DefaultComboBoxModel<>(answerTypes)); + AnswerTypeComboBox.setModel(new javax.swing.DefaultComboBoxModel<>(Answer_ITEMS)); if(parameterIDs.isEmpty()){ - AnswerTypeComboBox.removeItem(answerTypes[2]); - AnswerTypeComboBox.removeItem(answerTypes[3]); + AnswerTypeComboBox.removeItem(Answer_ITEMS[2]); + AnswerTypeComboBox.removeItem(Answer_ITEMS[3]); } else ParameterComboBox.setModel(new javax.swing.DefaultComboBoxModel<>(parameterIDs.toArray(new String[parameterIDs.size()]))); @@ -165,16 +197,19 @@ public class GoalPanels extends javax.swing.JPanel { rowLabel = new javax.swing.JLabel(); UpButton = new javax.swing.JButton(); DownButton = new javax.swing.JButton(); + DocButton = new javax.swing.JButton(); - setPreferredSize(new java.awt.Dimension(1110, 69)); + setMinimumSize(new java.awt.Dimension(1110, 69)); ArtifactPanel.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED)); ArtifactPanel.setMinimumSize(new java.awt.Dimension(1400, 0)); ArtifactPanel.setPreferredSize(new java.awt.Dimension(1300, 34)); + GoalTypeComboBox.setToolTipText("Hover over pulldown items for information about each goal type."); + GoalTypeComboBox.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Goal Type")); GoalTypeComboBox.addItemListener(new java.awt.event.ItemListener() { public void itemStateChanged(java.awt.event.ItemEvent evt) { - goalTypeItemChanged(evt); + GoalTypeComboBoxgoalTypeItemChanged(evt); } }); @@ -200,6 +235,7 @@ public class GoalPanels extends javax.swing.JPanel { ArithmeticResultTagTextField.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Arithmetic Result Tag")); + AnswerTypeComboBox.setToolTipText("Hover over pulldown values for information about different answer types."); AnswerTypeComboBox.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Answer Type")); AnswerTypeComboBox.addItemListener(new java.awt.event.ItemListener() { public void itemStateChanged(java.awt.event.ItemEvent evt) { @@ -207,6 +243,9 @@ public class GoalPanels extends javax.swing.JPanel { } }); + ParameterComboBox.setToolTipText("Parameter whose value is to be compared."); + ParameterComboBox.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Parameter")); + BooleanResultTagsComboBox.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Boolean Result Tags")); javax.swing.GroupLayout ArtifactPanelLayout = new javax.swing.GroupLayout(ArtifactPanel); @@ -230,10 +269,10 @@ public class GoalPanels extends javax.swing.JPanel { .addComponent(AnswerTypeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 150, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(AnswerTagTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 193, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGap(52, 52, 52) .addComponent(ResultTag2ComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 155, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(ParameterComboBox, 0, 150, Short.MAX_VALUE) + .addComponent(ParameterComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 153, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(BooleanTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 404, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) @@ -250,47 +289,36 @@ public class GoalPanels extends javax.swing.JPanel { .addComponent(PreviousMatchanyComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); - - ArtifactPanelLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {Goal1TextField, Goal2TextField}); - - ArtifactPanelLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {ParameterComboBox, ResultTag2ComboBox}); - - ArtifactPanelLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {BooleanResultTagsComboBox, PreviousMatchanyComboBox}); - ArtifactPanelLayout.setVerticalGroup( ArtifactPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, ArtifactPanelLayout.createSequentialGroup() + .addGroup(ArtifactPanelLayout.createSequentialGroup() .addGap(14, 14, 14) - .addGroup(ArtifactPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) + .addGroup(ArtifactPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(ArtifactPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(GoalTypeComboBox, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(OperatorComboBox, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(ArtifactPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(ParameterComboBox) .addGroup(ArtifactPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(ValueTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 44, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(SubgoalTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addComponent(Goal2TextField, javax.swing.GroupLayout.Alignment.TRAILING) - .addGroup(ArtifactPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(GoalIDTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(GoalTypeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(ArtifactPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(BooleanTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 41, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(Goal1TextField, javax.swing.GroupLayout.PREFERRED_SIZE, 41, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(ArtifactPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(OperatorComboBox) .addComponent(ExecutableFileTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 44, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(ResultTagComboBox) .addComponent(ArithmeticResultTagTextField) .addComponent(AnswerTypeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(AnswerTagTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addComponent(ResultTag2ComboBox, javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(ParameterComboBox, javax.swing.GroupLayout.Alignment.TRAILING)) - .addComponent(BooleanResultTagsComboBox) - .addComponent(PreviousMatchanyComboBox)) - .addGap(83, 83, 83)) + .addComponent(ResultTag2ComboBox, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(BooleanResultTagsComboBox, javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(PreviousMatchanyComboBox, javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(GoalIDTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); - ArtifactPanelLayout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {Goal1TextField, Goal2TextField, SubgoalTextField, ValueTextField}); - - ArtifactPanelLayout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {AnswerTagTextField, AnswerTypeComboBox, ArithmeticResultTagTextField, BooleanTextField, ExecutableFileTextField, OperatorComboBox, ParameterComboBox, ResultTag2ComboBox, ResultTagComboBox}); - DeleteButton.setText("Delete"); DeleteButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { @@ -315,6 +343,13 @@ public class GoalPanels extends javax.swing.JPanel { } }); + DocButton.setText("Doc"); + DocButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + DocButtonActionPerformed(evt); + } + }); + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( @@ -328,37 +363,43 @@ public class GoalPanels extends javax.swing.JPanel { .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addComponent(UpButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(DownButton, javax.swing.GroupLayout.PREFERRED_SIZE, 41, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(DeleteButton) - .addGap(73, 73, 73)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(DocButton) + .addComponent(DeleteButton)) + .addGap(51, 51, 51)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(ArtifactPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 80, javax.swing.GroupLayout.PREFERRED_SIZE) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) - .addGroup(layout.createSequentialGroup() + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(UpButton) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(DownButton)) - .addComponent(DeleteButton, javax.swing.GroupLayout.PREFERRED_SIZE, 58, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addComponent(rowLabel))) + .addComponent(DeleteButton, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(DownButton) + .addComponent(DocButton))) + .addComponent(rowLabel)) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addComponent(ArtifactPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 92, Short.MAX_VALUE) ); }// //GEN-END:initComponents + private void GoalTypeComboBoxgoalTypeItemChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_GoalTypeComboBoxgoalTypeItemChanged + goalTypeListener(); + }//GEN-LAST:event_GoalTypeComboBoxgoalTypeItemChanged + + private void AnswerTypeComboBoxItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_AnswerTypeComboBoxItemStateChanged + answerTypeListener(); + }//GEN-LAST:event_AnswerTypeComboBoxItemStateChanged + private void DeleteButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_DeleteButtonActionPerformed - deleteButton(); + deleteButton(); }//GEN-LAST:event_DeleteButtonActionPerformed - private void deleteButton(){ - JPanel container = (JPanel)this.getParent(); - container.remove(this); - goalsUI.dataUI.decreaseRowCount(); - goalsUI.refresh(); - } - private void UpButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_UpButtonActionPerformed swapUpdate("UP", rowNum-1); //Subtract rowNum by one to get the proper index number }//GEN-LAST:event_UpButtonActionPerformed @@ -367,15 +408,42 @@ public class GoalPanels extends javax.swing.JPanel { swapUpdate("DOWN", rowNum-1); //Subtract rowNum by one to get the proper index number }//GEN-LAST:event_DownButtonActionPerformed - private void goalTypeItemChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_goalTypeItemChanged - goalTypeListener(); - }//GEN-LAST:event_goalTypeItemChanged + private void DocButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_DocButtonActionPerformed + DocPanel panel = new DocPanel(); - private void AnswerTypeComboBoxItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_AnswerTypeComboBoxItemStateChanged - answerTypeListener(); - }//GEN-LAST:event_AnswerTypeComboBoxItemStateChanged + panel.setDoc(this.comments); + //panel.setVisible(true); + JDialog dialog = new JDialog(); + panel.setDialog(dialog); + //dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); + dialog.setModal(true); + dialog.add(panel); + dialog.pack(); + dialog.setLocation(200, 200); + dialog.setTitle("Documentation for "+GoalIDTextField.getText()); + dialog.setVisible(true); + if(panel.isOK()){ + this.comments = panel.getDoc(); + } + dialog.dispose(); + }//GEN-LAST:event_DocButtonActionPerformed + + // BUTTONS and LISTENERS // + + private void deleteButton(){ + JPanel container = (JPanel)this.getParent(); + container.remove(this); + goalsUI.data.decreaseRowCount(); + goalsUI.refresh(); + } + private void goalTypeListener(){ + Object item = GoalTypeComboBox.getSelectedItem(); + if(item == null){ + System.out.println("Goal type item "+item); + return; + } String goalType = ((ToolTipWrapper)GoalTypeComboBox.getSelectedItem()).getItem(); if(opInput.contains(goalType)) @@ -398,6 +466,8 @@ public class GoalPanels extends javax.swing.JPanel { private void visibilityHandler(String type){ OperatorComboBox.setVisible(false); + if(((DefaultComboBoxModel)OperatorComboBox.getModel()).getIndexOf(Operator_ITEMS[5]) == -1) + OperatorComboBox.insertItemAt(Operator_ITEMS[5], 0); if(((DefaultComboBoxModel)OperatorComboBox.getModel()).getIndexOf(Operator_ITEMS[4]) == -1) OperatorComboBox.insertItemAt(Operator_ITEMS[4], 0); if(((DefaultComboBoxModel)OperatorComboBox.getModel()).getIndexOf(Operator_ITEMS[2]) == -1) @@ -424,10 +494,10 @@ public class GoalPanels extends javax.swing.JPanel { ArithmeticResultTagTextField.setText(""); AnswerTypeComboBox.setVisible(false); - AnswerTypeComboBox.setSelectedItem(answerTypes[0]); + AnswerTypeComboBox.setSelectedItem(Answer_ITEMS[0]); //"Result Tag" may have been removed by the execute goaltype so readd it to the combo box to reset it back to default if(((DefaultComboBoxModel)AnswerTypeComboBox.getModel()).getIndexOf("Result Tag") == -1) - AnswerTypeComboBox.addItem("Result Tag"); + AnswerTypeComboBox.addItem(Answer_ITEMS[1]); AnswerTagTextField.setVisible(false); AnswerTagTextField.setText(""); @@ -492,7 +562,7 @@ public class GoalPanels extends javax.swing.JPanel { ResultTagComboBox.setVisible(true); AnswerTypeComboBox.setVisible(true); //Answertag is expected to be a literal value or a symbolic name from parameters.config (pg. 26 in labtainers manual) - AnswerTypeComboBox.removeItem("Result Tag"); + AnswerTypeComboBox.removeItem(Answer_ITEMS[1]); // Result Tag AnswerTagTextField.setVisible(true); break; case "matche": @@ -515,9 +585,9 @@ public class GoalPanels extends javax.swing.JPanel { } private void answerTypeListener(){ - String answerType = (String)(AnswerTypeComboBox.getSelectedItem()); + ToolTipWrapper answerType = (ToolTipWrapper)(AnswerTypeComboBox.getSelectedItem()); - if(answerType.equals(answerTypes[0])){ //Literal + if(answerType.equals(Answer_ITEMS[0])){ //Literal AnswerTagTextField.setVisible(true); ResultTag2ComboBox.setVisible(false); @@ -528,7 +598,7 @@ public class GoalPanels extends javax.swing.JPanel { if(parameterIDs != null && !parameterIDs.isEmpty()) ParameterComboBox.setSelectedItem(parameterIDs.get(0)); } - else if(answerType.equals(answerTypes[1])){ //Result Tag + else if(answerType.equals(Answer_ITEMS[1])){ //Result Tag AnswerTagTextField.setVisible(false); AnswerTagTextField.setText(""); @@ -538,7 +608,7 @@ public class GoalPanels extends javax.swing.JPanel { if(parameterIDs != null && !parameterIDs.isEmpty()) ParameterComboBox.setSelectedItem(parameterIDs.get(0)); } - else if(answerType.equals(answerTypes[2]) || answerType.equals(answerTypes[3])){ + else if(answerType.equals(Answer_ITEMS[2]) || answerType.equals(Answer_ITEMS[3])){ AnswerTagTextField.setVisible(false); AnswerTagTextField.setText(""); @@ -555,11 +625,22 @@ public class GoalPanels extends javax.swing.JPanel { //Swaps goal order in the list of goals and then redraws them protected void swapUpdate(String type, int rowIndex){ - goalsUI.dataUI.updateListofGoals(goalsUI.getPanelofGoals()); - goalsUI.dataUI.swapGoals(type, rowIndex); - goalsUI.goalsPanelRedraw(); + goalsUI.data.updateListofGoals(goalsUI.getPanelofGoals()); + goalsUI.data.swapGoals(type, rowIndex); + goalsUI.loadUI(); } - + + public void updateParameters(){ + String current = (String) ParameterComboBox.getSelectedItem(); + parameterIDs = dataUI.getParameters(); + ParameterComboBox.setModel(new javax.swing.DefaultComboBoxModel<>(parameterIDs.toArray(new String[parameterIDs.size()]))); + if(parameterIDs.contains(current)){ + ParameterComboBox.setSelectedItem(current); + }else{ + String id = getGoalIDTextField().getText(); + System.out.println("ERROR, goal "+id+" parameter of "+current+" was removed from parameters."); + } + } //Field Getters public JTextField getGoalIDTextField(){ @@ -622,6 +703,9 @@ public class GoalPanels extends javax.swing.JPanel { return SubgoalTextField; } + public String getComments(){ + return this.comments; + } //Field SETTERS @@ -650,7 +734,8 @@ public class GoalPanels extends javax.swing.JPanel { } private void setAnswerTypeComboBox(String v){ - AnswerTypeComboBox.setSelectedItem(v); + ToolTipWrapper tip = ParamReferenceStorage.getWrapper(Answer_ITEMS, v); + AnswerTypeComboBox.setSelectedItem(tip); } private void setAnswerTagTextField(String v){ @@ -686,14 +771,17 @@ public class GoalPanels extends javax.swing.JPanel { } + + // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JTextField AnswerTagTextField; - private javax.swing.JComboBox AnswerTypeComboBox; + private javax.swing.JComboBox AnswerTypeComboBox; private javax.swing.JTextField ArithmeticResultTagTextField; private javax.swing.JPanel ArtifactPanel; private javax.swing.JComboBox BooleanResultTagsComboBox; private javax.swing.JTextField BooleanTextField; private javax.swing.JButton DeleteButton; + private javax.swing.JButton DocButton; private javax.swing.JButton DownButton; private javax.swing.JTextField ExecutableFileTextField; private javax.swing.JTextField Goal1TextField; diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/src/GoalsUI/GoalValues.java b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/goalsui/GoalValues.java similarity index 60% rename from modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/src/GoalsUI/GoalValues.java rename to modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/goalsui/GoalValues.java index 18286fa8c..4d99ea6c5 100644 --- a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/src/GoalsUI/GoalValues.java +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/goalsui/GoalValues.java @@ -1,158 +1,215 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package GoalsUI; - -import static GoalsUI.ParamReferenceStorage.GoalType_ITEMS; -import static GoalsUI.ParamReferenceStorage.Operator_ITEMS; -import static GoalsUI.ParamReferenceStorage.answerTypes; -import static GoalsUI.ParamReferenceStorage.goalInput; -import static GoalsUI.ParamReferenceStorage.opInput; -import static GoalsUI.ParamReferenceStorage.resultTagInput; -import java.util.List; - - -/** - * - * @author Dan - */ - -//****The param parsing in this class is limited to where the param value's corresponding index is on the goal line. - //If at any point this alignment is modified with less or more params, this code will need to be revised -public class GoalValues { - //Values to be obtained - String goalID, resultTag, answerTag, answerType, booleanExp, goal1, goal2, value, subgoalList, executableFile; - - ToolTipHandlers.ToolTipWrapper goalType, operator; - - //Constructor for loading goals into the UI - GoalValues(String goalLine, List resultTags){ - goalID = resultTag = answerType = answerTag = booleanExp = goal1 = goal2 = value = subgoalList = executableFile = ""; - goalType = null; - operator = Operator_ITEMS[0]; - //by default set the result tag to the first result tag in the resultTags list (Warning: an error will occur if there is nothing the results tags list) - resultTag = resultTags.get(0); - answerType = answerTypes[0]; - - String[] paramParsedLine = goalLine.split(" : "); - - //Get goal ID - goalID = paramParsedLine[0].split(" = ")[0].trim(); - - //System.out.println(paramParsedLine[0].split(" = ")[1]); - - - - //Get goal type - if(paramParsedLine[0].split(" = ")[1].trim().equals("count")){ - if(paramParsedLine.length > 2) - goalType = GoalType_ITEMS[10]; //count_matches - else - goalType = GoalType_ITEMS[9]; //count_value - } - else - goalType = itemFinder(GoalType_ITEMS, paramParsedLine[0].split(" = ")[1].trim()); - - if(opInput.contains(goalType.getItem())){ - operator = itemFinder(Operator_ITEMS, paramParsedLine[1]); - resultTag = paramParsedLine[2]; - - //Overwrite the goaltype to "matchExpression" if the result tag has a parenthesis (this indicates an arithmetic expression) - if(resultTag.contains("(")){ - goalType = GoalType_ITEMS[12]; - //take out outer parens in resultTag - if(resultTag.startsWith("(") && resultTag.endsWith(")")) - resultTag = resultTag.substring(1, resultTag.length() -1); - } - - answerTagModifier(paramParsedLine[3], resultTags); - } - else if(goalInput.contains(goalType.getItem())){ - goal1 = paramParsedLine[1].trim(); - goal2 = paramParsedLine[2].trim(); - } - else if(resultTagInput.contains(goalType.getItem())){ - resultTag = paramParsedLine[1].trim(); - } - else if("boolean".equals(goalType.getItem())){ - booleanExp = paramParsedLine[1]; - } - else if("count_greater".equals(goalType.getItem())){ - value = paramParsedLine[1].trim(); - subgoalList = paramParsedLine[2].trim(); - //Chop off the surrounding parens since this will be readded when written - if(subgoalList.startsWith("(") && subgoalList.endsWith(")")) - subgoalList = subgoalList.substring(1, subgoalList.length() -1); - } - else if("execute".equals(goalType.getItem())){ - executableFile = paramParsedLine[1]; - resultTag = paramParsedLine[2]; - answerTagModifier(paramParsedLine[3], resultTags); - } - else - System.out.println("Goal Type doesn't match any"); - } - - //Constructor for temporarily storing values of artifacts in the UI - GoalValues(String goalID, ToolTipHandlers.ToolTipWrapper goalType, ToolTipHandlers.ToolTipWrapper operator, String resultTag, String answerType, String answerTag, String booleanExp, String goal1, String goal2, String value, String subgoalList, String executableFile){ - this.goalID = goalID; - this.goalType = goalType; - this.operator = operator; - this.resultTag = resultTag; - this.answerType = answerType; - this.answerTag = answerTag; - this.booleanExp = booleanExp; - this.goal1 = goal1; - this.goal2 = goal2; - this.value = value; - this.subgoalList = subgoalList; - this.executableFile = executableFile; - } - - //set the answertype & answertag to be displayed on the gui based on the config's answer tag - private void answerTagModifier(String aT, List resultTags){ - if(aT.contains("answer=")){ - answerTag = aT.split("answer=")[1]; - } - else if(resultTags.contains(aT)){ - answerTag = aT; - answerType = answerTypes[1]; //Result Tags - } - else if(aT.contains("result.")){ - answerTag = aT.split("result.")[1]; - answerType = answerTypes[1]; //Result Tags - } - else if(aT.contains("parameter.")){ - answerTag = aT.split("parameter.")[1]; - answerType = answerTypes[2]; //Parameter - } - else if(aT.contains("parameter_ascii.")){ - answerTag = aT.split("parameter_ascii.")[1]; - answerType = answerTypes[3]; //Parameter_ASCII - } - } - - - private ToolTipHandlers.ToolTipWrapper itemFinder(ToolTipHandlers.ToolTipWrapper[] list,String desired){ - for(ToolTipHandlers.ToolTipWrapper item : list){ - if(item.getItem().equals(desired)){ - return item; - } - } - return null; - } - - private boolean isInteger(String s){ - try{ - Integer.parseInt(s); - - return true; - } - catch(NumberFormatException ex){ - return false; - } - } - -} +/* +This software was created by United States Government employees at +The Center for Cybersecurity and Cyber Operations (C3O) +at the Naval Postgraduate School NPS. Please note that within the +United States, copyright protection is not available for any works +created by United States Government employees, pursuant to Title 17 +United States Code Section 105. This software is in the public +domain and is not subject to copyright. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +*/ +package labtainers.goalsui; + +import java.util.List; +import static labtainers.goalsui.ParamReferenceStorage.GoalType_ITEMS; +import static labtainers.goalsui.ParamReferenceStorage.Operator_ITEMS; +import static labtainers.goalsui.ParamReferenceStorage.answerTypes; +import static labtainers.goalsui.ParamReferenceStorage.goalInput; +import static labtainers.goalsui.ParamReferenceStorage.opInput; +import static labtainers.goalsui.ParamReferenceStorage.resultTagInput; +import labtainers.mainui.ToolTipHandlers; + +/** + * + * @author Daniel Liao + */ +public class GoalValues { + //Values to be obtained + String goalID, resultTag, answerTag, answerType, booleanExp, goal1, goal2, value, subgoalList, executableFile, comments; + + ToolTipHandlers.ToolTipWrapper goalType, operator; + + //Constructor for loading goals into the UI + GoalValues(String inputLine, List resultTags){ + goalID = resultTag = answerType = answerTag = booleanExp = goal1 = goal2 = value = subgoalList = executableFile = comments = ""; + goalType = null; + operator = Operator_ITEMS[0]; + //by default set the result tag to the first result tag in the resultTags list (Warning: an error will occur if there is nothing the results tags list) + resultTag = resultTags.get(0); + answerType = answerTypes[0]; + + String goalLine; + if(inputLine.contains("\n")){ + String[] the_lines = inputLine.split("\n"); + goalLine = the_lines[the_lines.length-1]; + for(int i=0; i 2) + goalType = GoalType_ITEMS[10]; //count_matches + else + goalType = GoalType_ITEMS[9]; //count_value + } + else + goalType = itemFinder(GoalType_ITEMS, paramParsedLine[0].split(" = ")[1].trim()); + + if(opInput.contains(goalType.getItem())){ + operator = itemFinder(Operator_ITEMS, paramParsedLine[1]); + if(operator == null){ + System.out.println("Operator unknown in "+inputLine); + } + resultTag = paramParsedLine[2]; + + //Overwrite the goaltype to "matchExpression" if the result tag has a parenthesis (this indicates an arithmetic expression) + if(resultTag.contains("(")){ + goalType = GoalType_ITEMS[12]; + //take out outer parens in resultTag + if(resultTag.startsWith("(") && resultTag.endsWith(")")) + resultTag = resultTag.substring(1, resultTag.length() -1); + } + + answerTagModifier(paramParsedLine[3], resultTags); + } + else if(goalInput.contains(goalType.getItem())){ + goal1 = paramParsedLine[1].trim(); + goal2 = paramParsedLine[2].trim(); + } + else if(resultTagInput.contains(goalType.getItem())){ + resultTag = paramParsedLine[1].trim(); + } + else if("boolean".equals(goalType.getItem())){ + booleanExp = paramParsedLine[1]; + } + else if("count_greater".equals(goalType.getItem())){ + value = paramParsedLine[1].trim(); + subgoalList = paramParsedLine[2].trim(); + //Chop off the surrounding parens since this will be readded when written + if(subgoalList.startsWith("(") && subgoalList.endsWith(")")) + subgoalList = subgoalList.substring(1, subgoalList.length() -1); + } + else if("execute".equals(goalType.getItem())){ + executableFile = paramParsedLine[1]; + resultTag = paramParsedLine[2]; + answerTagModifier(paramParsedLine[3], resultTags); + } + else + System.out.println("Goal Type doesn't match any"); + } + + //Constructor for temporarily storing values of artifacts in the UI + GoalValues(String goalID, ToolTipHandlers.ToolTipWrapper goalType, ToolTipHandlers.ToolTipWrapper operator, String resultTag, String answerType, String answerTag, String booleanExp, String goal1, String goal2, String value, String subgoalList, String executableFile, String comments){ + this.goalID = goalID; + this.goalType = goalType; + this.operator = operator; + this.resultTag = resultTag; + this.answerType = answerType; + this.answerTag = answerTag; + this.booleanExp = booleanExp; + this.goal1 = goal1; + this.goal2 = goal2; + this.value = value; + this.subgoalList = subgoalList; + this.executableFile = executableFile; + this.comments = comments; + } + + //Deep copy + GoalValues(GoalValues original){ + goalID = original.goalID; + goalType = original.goalType; + operator = original.operator; + resultTag = original.resultTag; + answerTag = original.answerTag; + answerType = original.answerType; + booleanExp = original.booleanExp; + goal1 = original.goal1; + goal2 = original.goal2; + value = original.value; + subgoalList = original.subgoalList; + executableFile = original.executableFile; + comments = original.comments; + } + + //set the answertype & answertag to be displayed on the gui based on the config's answer tag + private void answerTagModifier(String aT, List resultTags){ + answerTag = ""; + try{ + if(aT.contains("answer=")){ + answerTag = aT.split("answer=")[1]; + //System.out.println("answer tag set to "+answerTag); + } + else if(resultTags.contains(aT)){ + answerTag = aT; + answerType = answerTypes[1]; //Result Tags + } + else if(aT.contains("result.")){ + answerTag = aT.split("result.")[1]; + answerType = answerTypes[1]; //Result Tags + } + else if(aT.contains("parameter.")){ + answerTag = aT.split("parameter.")[1]; + answerType = answerTypes[2]; //Parameter + } + else if(aT.contains("parameter_ascii.")){ + answerTag = aT.split("parameter_ascii.")[1]; + answerType = answerTypes[3]; //Parameter_ASCII + } + }catch(java.lang.ArrayIndexOutOfBoundsException ex){ + System.out.println("Error in goal value "+aT); + } + } + + + private ToolTipHandlers.ToolTipWrapper itemFinder(ToolTipHandlers.ToolTipWrapper[] list,String desired){ + for(ToolTipHandlers.ToolTipWrapper item : list){ + if(item.getItem().equals(desired)){ + return item; + } + } + return null; + } + + private boolean isInteger(String s){ + try{ + Integer.parseInt(s); + + return true; + } + catch(NumberFormatException ex){ + return false; + } + } +} diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/src/GoalsUI/GoalsData.java b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/goalsui/GoalsData.java similarity index 75% rename from modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/src/GoalsUI/GoalsData.java rename to modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/goalsui/GoalsData.java index dfcbe7fe5..433ff2aea 100644 --- a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/src/GoalsUI/GoalsData.java +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/goalsui/GoalsData.java @@ -1,1249 +1,1285 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package GoalsUI; - -import static GoalsUI.ParamReferenceStorage.GoalType_ITEMS; -import static GoalsUI.ParamReferenceStorage.answerTypes; -import static GoalsUI.ParamReferenceStorage.booleanResultTypes; -import static GoalsUI.ParamReferenceStorage.goalInput; -import static GoalsUI.ParamReferenceStorage.opInput; -import static GoalsUI.ParamReferenceStorage.resultTagInput; -import GoalsUI.ToolTipHandlers.ToolTipWrapper; -import java.awt.Component; -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; -import javax.swing.JOptionPane; -import javax.swing.JPanel; - -/** - * - * @author Dan - */ -public class GoalsData { - private List listofGoals; - final private List resultTagList; - final private List parameters; - final private List booleanResults; - private boolean labloaded; - final private String labname; - private int rowCount; - - GoalsData(){ - listofGoals = new ArrayList<>(); - resultTagList = new ArrayList<>(); - parameters = new ArrayList<>(); - booleanResults = new ArrayList<>(); - labloaded = false; - labname = ""; - rowCount = 0; - } - - GoalsData(String labname){ - listofGoals = new ArrayList<>(); - resultTagList = new ArrayList<>(); - parameters = new ArrayList<>(); - booleanResults = new ArrayList<>(); - labloaded = false; - this.labname = labname; - rowCount = 0; - - getData(); - } - - -//LOADING~~~~~~~~~~~~~~~~~~~~~~~~ - - //Checks if the lab exists and will load lab's goals.config if it does - private void getData(){ - //Check if the Folder exists - String userHomeFolder = System.getProperty("user.home"); - File lab = new File(userHomeFolder + File.separator + "labtainer" + File.separator + "trunk" + File.separator + "labs" + File.separator+ labname); - - if(lab.isDirectory()){ - if(getResultTags(lab) && getGoals()){ - labloaded = true; - getParameters(lab); - getBooleanResults(lab); - } - } - else - System.out.println("Lab does not exist!"); - } - - //Updates the resultTagList (all goal panels refer to this list to fill in the resultTag combobox) - private boolean getResultTags(File lab){ - File resultsConfig = new File(lab + File.separator + "instr_config" + File.separator + "results.config"); - try { - if(resultsConfig.exists()){ - try (FileReader fileReader = new FileReader(resultsConfig)) { - BufferedReader bufferedReader = new BufferedReader(fileReader); - - String line = bufferedReader.readLine(); - while (line != null) { - if(!line.isEmpty() && line.charAt(0) != '#' && !Character.isWhitespace(line.charAt(0))) - resultTagList.add(line.split(" = ")[0]); - line = bufferedReader.readLine(); - } - } - return true; - } - else{ - System.out.println("results.config is missing"); - return false; - } - } - catch (FileNotFoundException ex) { - Logger.getLogger(GoalsUI.class.getName()).log(Level.SEVERE, null, ex); - return false; - } - catch (IOException ex) { - Logger.getLogger(GoalsUI.class.getName()).log(Level.SEVERE, null, ex); - return false; - } - } - - //Parses the goals.config to obtain all the relevant goal lines, - //extracts the values of each goal line and stores them into a list of "goals"(Goal Values) - private boolean getGoals(){ - //Attempt to set the listofGoals, if it ends up being null then there was an issue accessing the goal lines, which would be paresd into Goal Values - listofGoals = getGoalValuesOfConfigFile(); - if(listofGoals != null){ - rowCount=listofGoals.size(); - return true; - } - else - return false; - } - - //Get the parameter.config IDs - private void getParameters(File lab){ - File parameterConfig = new File(lab + File.separator + "config" + File.separator + "parameter.config"); - try { - if(parameterConfig.exists()){ - try (FileReader fileReader = new FileReader(parameterConfig)) { - BufferedReader bufferedReader = new BufferedReader(fileReader); - - String line = bufferedReader.readLine(); - while (line != null) { - if(!line.isEmpty() && line.charAt(0) != '#' && !Character.isWhitespace(line.charAt(0))) - parameters.add(line.split(" : ")[0]); - line = bufferedReader.readLine(); - } - } - } - else - System.out.println("parameter.config is missing"); - } - catch (FileNotFoundException ex) { - Logger.getLogger(GoalsUI.class.getName()).log(Level.SEVERE, null, ex); - } - catch (IOException ex) { - Logger.getLogger(GoalsUI.class.getName()).log(Level.SEVERE, null, ex); - } - } - - //Get the result tags that are boolean result types - private void getBooleanResults(File lab){ - File resultsConfig = new File(lab + File.separator + "instr_config" + File.separator + "results.config"); - try { - if(resultsConfig.exists()){ - try (FileReader fileReader = new FileReader(resultsConfig)) { - BufferedReader bufferedReader = new BufferedReader(fileReader); - - String line = bufferedReader.readLine(); - while (line != null) { - if(!line.isEmpty() && line.charAt(0) != '#' && !Character.isWhitespace(line.charAt(0))) - if(booleanResultTypes.contains(line.split(" : ")[1])) - booleanResults.add(line.split(" = ")[0]); - - line = bufferedReader.readLine(); - } - } - } - else - System.out.println("results.config is missing"); - } - catch (FileNotFoundException ex) { - Logger.getLogger(GoalsUI.class.getName()).log(Level.SEVERE, null, ex); - } - catch (IOException ex) { - Logger.getLogger(GoalsUI.class.getName()).log(Level.SEVERE, null, ex); - } - } - -//WRITING~~~~~~~~~~~~~~~~~~~~~~~~ - - //Update the results.config file with the user's input - protected void writeGoalsConfig(JPanel PanelofGoals){ - try { - Component[] goals = PanelofGoals.getComponents(); //Access the list of goals - String goalID, - goalType, - - operator, - resultTag, - answerType, - - booleanExp, - - goal1, - goal2, - - value, - subgoalList, - - executableFile; - String goalsConfigText = ""; - ErrorHandler error = new ErrorHandler(); - List goalIDs = new ArrayList(); //Used for goal ID duplication check - - //Iterate through each goal - for(int i=0;i < goals.length;i++){ - error.checkReset(); //Reset the error statuses for a new goal line - - String goalConfigLine = ""; - - //Goal ID - goalID = ((GoalPanels)goals[i]).getGoalIDTextField().getText(); - goalIDs.add(goalID); - //Checks if goal ID is valid or inputted - if(error.checkGoalID(goalID)) - goalConfigLine += (goalID + " = "); //add to goal ID Config line - - //Goal Type - ToolTipHandlers.ToolTipWrapper goalTypeTTW = (ToolTipHandlers.ToolTipWrapper)(((GoalPanels)goals[i]).getGoalTypeComboBox().getSelectedItem()); - goalType = goalTypeTTW.getItem(); - - switch (goalType) { - case "matchExpression": - goalConfigLine += "matchany : "; - break; - case "count_value": - case "count_matches": - goalConfigLine += "count : "; - break; - default: - goalConfigLine += goalType+" : "; - break; - } - - if(opInput.contains(goalType)){ - ToolTipHandlers.ToolTipWrapper operatorTTW = (ToolTipHandlers.ToolTipWrapper)(((GoalPanels)goals[i]).getOperatorComboBox().getSelectedItem()); - operator = operatorTTW.getItem(); - resultTag = (String)((GoalPanels)goals[i]).getResultTagComboBox().getSelectedItem(); - answerType = (String)((GoalPanels)goals[i]).getAnswerTypeComboBox().getSelectedItem(); - - goalConfigLine += operator+" : "; - goalConfigLine += resultTag+" : "; - goalConfigLine += answerHandler(answerType, (GoalPanels)goals[i]); - } - - else if(goalInput.contains(goalType)){ - goal1 = ((GoalPanels)goals[i]).getGoal1TextField().getText(); - goal2 = ((GoalPanels)goals[i]).getGoal2TextField().getText(); - - ArrayList listOfAboveGoals = getAboveGoals("GOAL1&2", i, goals); - if(error.checkGoal1(goal1, listOfAboveGoals)) - goalConfigLine += goal1+" : "; - if(error.checkGoal2(goal2, listOfAboveGoals)) - goalConfigLine += goal2; - } - - else if(resultTagInput.contains(goalType)){ - resultTag = (String)((GoalPanels)goals[i]).getResultTagComboBox().getSelectedItem(); - goalConfigLine += resultTag; - } - - else if("boolean".equals(goalType)){ - booleanExp = ((GoalPanels)goals[i]).getBooleanTextField().getText(); - - if(error.checkBooleanExp(booleanExp, getAboveGoals("BOOLEAN", i, goals), booleanResults)){ - goalConfigLine += booleanExp; - } - } - - else if("count_greater".equals(goalType)){ - value = ((GoalPanels)goals[i]).getValueTextField().getText(); - subgoalList = ((GoalPanels)goals[i]).getSubgoalTextField().getText(); - - if(error.checkValueAndSubgoals(value, subgoalList, getAboveGoals("ALL", i, goals), booleanResults)){ - goalConfigLine += value+" : "; - goalConfigLine += "("; - goalConfigLine += subgoalList; - goalConfigLine += ")"; - } - - - - } - else if("execute".equals(goalType)){ - executableFile = ((GoalPanels)goals[i]).getExecutableFileTextField().getText(); - resultTag = (String)((GoalPanels)goals[i]).getResultTagComboBox().getSelectedItem(); - answerType = (String)((GoalPanels)goals[i]).getAnswerTypeComboBox().getSelectedItem(); - - goalConfigLine += executableFile+" : "; - goalConfigLine += resultTag+" : "; - goalConfigLine += answerHandler(answerType, (GoalPanels)goals[i]); - } - else if("matchExpression".equals(goalType)){ - ToolTipHandlers.ToolTipWrapper operatorTTW = (ToolTipHandlers.ToolTipWrapper)(((GoalPanels)goals[i]).getOperatorComboBox().getSelectedItem()); - operator = operatorTTW.getItem(); - - //May need modification /validation - String rt = (String)((GoalPanels)goals[i]).getArithmeticResultTagTextField().getText(); - resultTag=""; - if(error.checkArithRT(rt)){ //NOTE: the checkArithRT is incomplete and simply returns 'true' - resultTag += "("; - resultTag += rt; - resultTag += ")"; - } - - answerType = (String)((GoalPanels)goals[i]).getAnswerTypeComboBox().getSelectedItem(); - - goalConfigLine += operator+" : "; - goalConfigLine += resultTag+" : "; - goalConfigLine += answerHandler(answerType, (GoalPanels)goals[i]); - } - - - //If there's no error, put the goalConfigLine in the resultsConfigText string, - //Otherwise the overallPass of the user input is false - if(error.userInputCheck(i+1)){ - if(i < goals.length-1) - goalConfigLine+= System.lineSeparator(); - //Add the goal config line to the Results Config text - goalsConfigText += goalConfigLine; - } - else - error.fail(); - } - - //Check for duplicate goal IDs - error.checkDuplicateGoalIDs(goalIDs, booleanResults); - - - if(error.passStatus()){ - //Resets the results.config file - File goalsConfigFile = initializeGoalsConfig(); - - try ( //Write the resultsConfigText to the results.config - BufferedWriter writer = new BufferedWriter(new FileWriter(goalsConfigFile, true))) { - writer.write(goalsConfigText); - } - } - else - JOptionPane.showMessageDialog(null, error.toString(), "INPUT ERROR", JOptionPane.ERROR_MESSAGE); - } - catch (IOException ex) { - Logger.getLogger(GoalsUI.class.getName()).log(Level.SEVERE, null, ex); - } - } - - //Builds the string bit to be added in the goals.config that describes the answer for a goal - private String answerHandler(String answerType, GoalPanels goal){ - String answer = ""; - - if(answerType.equals(answerTypes[0])){ //Literal - answer += "answer="; - answer += goal.getAnswerTagTextField().getText(); - } - else if(answerType.equals(answerTypes[1])){ //Result Tag - answer += "result."; - answer += (String)(goal.getResultTag2ComboBox().getSelectedItem()); - } - else if(answerType.equals(answerTypes[2])){ //Parameter - answer += "parameter."; - answer += (String)(goal.getParameterComboBox().getSelectedItem()); - } - else if(answerType.equals(answerTypes[3])){ //Parameter ASCII - answer += "parameter_ascii."; - answer += (String)(goal.getParameterComboBox().getSelectedItem()); - } - else - System.out.println("Issue writing answer in the goals.config"); - - return answer; - } - - //Checks if the goals.config file exists and prepares the goals.config file for the lab - private File initializeGoalsConfig() throws IOException{ - //Get the filepath for the lab's goals.config - String userHomeFolder = System.getProperty("user.home"); - File goalsConfigFile = new File(userHomeFolder + File.separator + "labtainer" + File.separator + "trunk" + File.separator + "labs" + File.separator + labname + File.separator + "instr_config" + File.separator + "goals.config"); - - //May not be necessary, subject to remove the base text, perhaps there is an option for the user to add their own comments - String baseText = - "# goals.config" + System.lineSeparator() - + "#" + System.lineSeparator() - + "# Please see the Labtainer Lab Designer User Guide" + System.lineSeparator(); - - if(goalsConfigFile.exists()){ - //Overwrite goals.config file if it already exists - try (BufferedWriter writer = new BufferedWriter(new FileWriter(goalsConfigFile, false))) { - writer.write(baseText); - } - return goalsConfigFile; - } - else if(goalsConfigFile.createNewFile()){ - //Create new goals.config file otherwise(if it does not already exist) - try (BufferedWriter writer = new BufferedWriter(new FileWriter(goalsConfigFile))) { - writer.write(baseText); - } - return goalsConfigFile; - } - else{ //File could not be created so return error message - System.out.println("Goals Config File couldn't be initialzed."); - return null; - } - } - - //Handles all the error data and error checking before writing the goals.config - protected class ErrorHandler{ - private boolean overallPass; - private String errorMsg; - boolean - goalError, - goalIDMissing, - - goal1Error, - goal1Missing, - goal2Error, - goal2Missing, - - booleanExpCharError, - booleanExpTagError, - booleanExpNotError, - booleanExpStartError, - booleanExpEndError, - booleanParensError, - booleanAlternateError, - booleanMissing, - - arithRTCharError, - arithRTMissing, - - valueError, - valueMissing, - subgoalError, - subgoalMissing; - - ErrorHandler(){ - overallPass = true; - errorMsg = ""; - checkReset(); - } - - void fail(){ - overallPass = false; - } - - //Rests the error status(used right before looking at new goal line) - private void checkReset(){ - goalError = false; - goalIDMissing = false; - - goal1Error = false; - goal1Missing = false; - goal2Error = false; - goal2Missing = false; - - booleanExpCharError = false; - booleanExpTagError = false; - booleanExpNotError = false; - booleanExpStartError = false; - booleanExpEndError = false; - booleanParensError = false; - booleanAlternateError = false; - booleanMissing = false; - - arithRTCharError = false; - arithRTMissing = false; - - valueError = false; - valueMissing = false; - subgoalError = false; - subgoalMissing = false; - } - - - - //Builds error message detailing the errors that appear in the user input - boolean userInputCheck(int goalIndex){ - boolean rowPassed = true; - String infoMsg = "Goal Line: " + goalIndex + System.lineSeparator(); - - if(goalError){ - rowPassed = false; - infoMsg+= "-Make sure your Goal ID has only alphanumeric characters or underscores." + System.lineSeparator(); - } - if(goalIDMissing){ - rowPassed = false; - infoMsg+= "-Goal ID input is missing." + System.lineSeparator(); - } - - - if(goal1Error){ - rowPassed = false; - infoMsg+= "-Make sure that Goal 1 is a 'matchany' goal above this line or a results boolean." + System.lineSeparator(); - } - if(goal1Missing){ - rowPassed = false; - infoMsg+= "-Goal 1 input is missing." + System.lineSeparator(); - } - if(goal2Error){ - rowPassed = false; - infoMsg+= "-Make sure that Goal 2 is a 'matchany' goal above this line or a results boolean." + System.lineSeparator(); - } - if(goal2Missing){ - rowPassed = false; - infoMsg+= "-Goal 2 input is missing." + System.lineSeparator(); - } - - - if(booleanExpCharError || booleanExpTagError){ - rowPassed = false; - infoMsg+= "-Make sure Boolean Expression contains only result booleans, non-matchacross goal IDs above this goal line," + System.lineSeparator() + - "parentheses, and boolean operators(and, or, and_not, or_not, not)." + System.lineSeparator(); - } - if(booleanExpNotError){ - rowPassed = false; - infoMsg+= "-The 'not' boolean operator can only appear at the beginning of a boolean expression." + System.lineSeparator(); - } - if(booleanExpStartError || booleanExpEndError || booleanParensError || booleanAlternateError){ - rowPassed = false; - infoMsg+= "-Make sure your expression is formatted correctly: Proper Parentheses and making sure an item precedes and follows " + System.lineSeparator() - + "a boolean operator." + System.lineSeparator(); - } - if(booleanMissing){ - rowPassed = false; - infoMsg+= "-Boolean input is missing." + System.lineSeparator(); - } - - - if(arithRTCharError){ - rowPassed = false; - infoMsg+= "-Make sure Arithmetic Result Tag is formatted correctly." + System.lineSeparator(); - } - if(arithRTMissing){ - rowPassed = false; - infoMsg+= "-Arithmetic Result Tag input is missing." + System.lineSeparator(); - } - - - if(valueError){ - rowPassed = false; - infoMsg+= "-Value can only be a positive number(includes zero) less than the number of subgoal items." + System.lineSeparator(); - } - if(valueMissing){ - rowPassed = false; - infoMsg+= "-Value input is missing." + System.lineSeparator(); - } - if(subgoalError){ - rowPassed = false; - infoMsg+= "-Make sure your Subgoal list is seperated by commas(', ') and only contains goals from above this goal line" + System.lineSeparator() - + "and/or result booleans." + System.lineSeparator(); - } - if(subgoalMissing){ - rowPassed = false; - infoMsg+= "-Subgoal List input is missing." + System.lineSeparator(); - } - - if(!rowPassed) - errorMsg += (infoMsg + System.lineSeparator()); - - return rowPassed; - } - - //Checks is goal ID is missing or has invalid characters(valid: alphanumeric, and underscores) - boolean checkGoalID(String goalID){ - if(goalID.isEmpty() || goalID.equals("")){ - goalIDMissing = true; - return false; - } - else if(!goalID.matches("^[a-zA-Z0-9_-]+$")){ - goalError = true; - return false; - } - else - return true; - } - - - //Checks if goal 1 is either an above goal or a boolean results - boolean checkGoal1(String goal1, List listOfAboveGoals){ - if(goal1.isEmpty() || goal1.equals("")){ - goal1Missing = true; - return false; - } - else if(!listOfAboveGoals.contains(goal1) && !booleanResults.contains(goal1)){ - goal1Error = true; - return false; - } - else - return true; - } - - //Checks if goal 2 is either an above goal or a boolean results - boolean checkGoal2(String goal2, List listOfAboveGoals){ - if(goal2.isEmpty() || goal2.equals("")){ - goal2Missing = true; - return false; - } - else if(!listOfAboveGoals.contains(goal2) && !booleanResults.contains(goal2)){ - goal2Error = true; - return false; - } - else - return true; - } - - //Checks if boolean expression is valid: (The checking may have some overlap thta may need to be recoded) - boolean checkBooleanExp(String booleanExp, List nonMAAGoals, List booleanResults) { - String[] booleanOperators = {"and", "or", "and_not", "or_not"}; - - if(booleanExp.isEmpty() || booleanExp.equals("")){ - booleanMissing = true; - return false; - } - - //Does the boolean exp contain invalid chars (char not: alphnumeric, undescore, hyphen, whitespace, parenthesis) - if(!booleanExp.matches("^[a-zA-Z0-9_() -]+$")){ - booleanExpCharError = true; - return false; - } - - //Reformat the boolean expression string to identitfy things that shouldn't be there - //Replace all " not" with % - booleanExp = " "+booleanExp; - //The line above is necessary because when 'not' is used in the beginning there may or may not be a space before it. - //Adding the space includes the non-space-preceeded case. - booleanExp = booleanExp.replaceAll(" not ", "%"); - - booleanExp = booleanExp.trim(); - - //System.out.println("OG: "+booleanExp); - //System.out.println(); - //System.out.println("GOALS:"); - - //Replace all non Matchacross Goals with an asterisk symbol - for(String toReplace : nonMAAGoals){ - booleanExp = symbolReplace(booleanExp, toReplace, "*"); - } - - //System.out.println(); - //System.out.println("RESULT BOOLEANS:"); - //Replace all non boolean results with an asterisk symbol - for(String toReplace : booleanResults){ - booleanExp = symbolReplace(booleanExp, toReplace, "*"); - } - - //System.out.println(); - //System.out.println("BOOLEAN OPERATORS:"); - //Replace all boolean operators with a pound symbol - for(String toReplace : booleanOperators){ - booleanExp = symbolReplace(booleanExp, toReplace, "#"); - } - - //System.out.println(booleanExp); - - booleanExp = booleanExp.replaceAll("\\s+","");//removes white space - - //If the boolean expression had a "not " in it, did it not occur at the beginning and/or more than once - if(booleanExp.contains("%") && (!booleanExp.startsWith("%") || (booleanExp.indexOf("%") != booleanExp.lastIndexOf("%")))){ - booleanExpNotError = true; - return false; - } - //Does the reformatted Boolean Expression string pick up alphnumeric(with underscore) substring that doesn't belong in either nonMAAGoals or booleanResults - if(!booleanExp.matches("^[%*#()]+$")){ - - booleanExpTagError = true; - return false; - } - //Does it start with an operator or a close parens - else if(booleanExp.startsWith("#") || booleanExp.startsWith(")")){ - booleanExpStartError = true; - return false; - } - //Does it end with an operator or an open parens - else if(booleanExp.endsWith("#") || booleanExp.endsWith("(")){ - booleanExpEndError = true; - return false; - } - //Does the boolean expression have bad parens - else if(parensHandler(booleanExp)){ - booleanParensError = true; - return false; - } - //Does it at least have one operator not preceeded and not followed by a nonMAA goal/boolean result - else if(alternatationCheck(booleanExp)){ - booleanAlternateError = true; - return false; - } - - return true; - } - - //Replaces the a substring in the a string with another string - String symbolReplace(String booleanExp, String toReplace, String replaceWith){ - int tRIndex = booleanExp.indexOf(toReplace); - while(tRIndex != -1){ - int indexAfterWord = tRIndex+toReplace.length(); - int indexBeforeWord = tRIndex-1; - //System.out.println(toReplace+": "); - //System.out.println("tRIndex: "+tRIndex); - //System.out.println("indexAfterWord: "+indexAfterWord); - - - //IF the word to replace is at the beginning: "toReplace and_not other" -> "* and_not other" - if(tRIndex == 0 && booleanExp.charAt(indexAfterWord) == ' '){ - booleanExp = booleanExp.substring(0, indexAfterWord).replaceFirst(toReplace, replaceWith)+ - booleanExp.substring(indexAfterWord, booleanExp.length()); - } - //IF the word to replace is at the end: "other and_not toRepalce" -> "other and_not *" - else if(tRIndex == booleanExp.length()-toReplace.length() && - booleanExp.charAt(booleanExp.length()-toReplace.length()-1) == ' '){ - booleanExp = booleanExp.substring(0, tRIndex) + - booleanExp.substring(tRIndex, booleanExp.length()).replaceFirst(toReplace, replaceWith); - } - /* - IF the word to replace is in the middle: "other and toReplace and another" -> "other and * and another" - "(other and toReplace) and another" -> "(other and *) and another" - "(toReplace and other) and another" -> "(* and other) and another" - "(toReplace) and another" -> "(*) and another" - */ - else if((booleanExp.charAt(indexBeforeWord) == ' ' || booleanExp.charAt(indexBeforeWord) == '(') && - (booleanExp.charAt(indexAfterWord) == ' ' || booleanExp.charAt(indexAfterWord) == ')')){ - booleanExp = booleanExp.substring(0, tRIndex)+ - booleanExp.substring(tRIndex, indexAfterWord).replaceFirst(toReplace, replaceWith)+ - booleanExp.substring(indexAfterWord, booleanExp.length()); - } - - //System.out.println(booleanExp); - //System.out.println(); - - indexAfterWord = tRIndex+replaceWith.length(); //The indexAfterWord is shifted since the word has been deleted and replaced - if(indexAfterWord aboveGoals, List booleanResults){ - boolean pass = true; - - if(subgoalList.isEmpty() || subgoalList.equals("")){ - subgoalMissing = true; - pass = false; - } - if(value.isEmpty() || value.equals("")){ - valueMissing = true; - pass = false; - } - - if(!subgoalMissing && !valueMissing){ - String[] subgoals = subgoalList.split(", "); - for(String subgoal : subgoals){ - subgoal = subgoal.replaceAll("\\s+", ""); - if(!aboveGoals.contains(subgoal) && !booleanResults.contains(subgoal)){ - subgoalError = true; - pass = false; - } - } - - if(!value.matches("^[0-9]+$") || subgoals.length <= Integer.parseInt(value)){ - valueError = true; - pass = false; - } - - - } - return pass; - } - - //Checks if the result tag has any arithmetic errors (NEEDS REVISION) ***Incomplete - boolean checkArithRT(String arithRT){ - if(arithRT.isEmpty() || arithRT.equals("")){ - arithRTMissing = true; - return false; - } -// for(String rt : resultTagList) -// arithRT.replaceAll(rt, "0"); -// arithRT.replaceAll("\\s+","");//removes white space -// -// if(!arithRT.matches("^[-+0*/&0-9()]+$")){ -// arithRTCharError = true; -// return false; -// } - - return true; - } - - - - - - //Check if there are goalID duplicates (this includes checking duplicates with boolean results) - void checkDuplicateGoalIDs(List goalIDs, List booleanResults){ - ArrayList goalIDSet = new ArrayList<>(); - - //Store all the indices for each unique goal ID - for(int i=0;i 1){ - duplicateErrorMsg+= "Duplicate Goal ID: \"" + goal.goalID + "\" on rows "; - - for(int i=0;i indices; - - GoalIDIndices(String goalID, int index){ - this.goalID = goalID; - indices = new ArrayList<>(); - indices.add(index); - isResultTagBoolean = false; - } - - void addIndex(int index){ - indices.add(index); - } - } - - //Is the goal ID already in the duplicate list? - boolean isDuplicate(List goalIDSet, String goalID){ - for(GoalIDIndices goalIndices : goalIDSet){ - if(goalIndices.goalID.equals(goalID)) - return true; - } - return false; - } - - //Get the duplicate object based on the duplicate string - GoalIDIndices getDuplicate(List goalIDSet, String goalID){ - for(GoalIDIndices goalIndices : goalIDSet){ - if(goalIndices.goalID.equals(goalID)) - return goalIndices; - } - return null; - } - - @Override - public String toString(){ - return errorMsg; - } - - boolean passStatus(){ - return overallPass; - } - - - } - - -//GENERAL~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - //Gets a list of GoalValues from the the current state of the goals.config file - protected ArrayList getGoalValuesOfConfigFile(){ - ArrayList officialListofGoals = new ArrayList<>(); - - ArrayList goalLines = getGoalLines(); - if(goalLines != null){ - for(String goalLine : goalLines){ - GoalValues values = new GoalValues(goalLine, resultTagList); - officialListofGoals.add(values); - } - return officialListofGoals; - } - else - return null; - } - - //Get the list of goal lines from the goals.config that need to be parsed - private ArrayList getGoalLines(){ - ArrayList goals = new ArrayList<>(); - - try { - String userHomeFolder = System.getProperty("user.home"); - File lab = new File(userHomeFolder + File.separator + "labtainer" + File.separator + "trunk" + File.separator + "labs" + File.separator+ labname); - File goalsConfig = new File(lab+"/instr_config/goals.config"); - - //Get the artifact lines - if(goalsConfig.exists()){ - try (FileReader fileReader = new FileReader(goalsConfig)) { - BufferedReader bufferedReader = new BufferedReader(fileReader); - - String line = bufferedReader.readLine(); - while (line != null) { - //just checks if the first character is: not empty, not a hash, and not whitspace) - if(!line.isEmpty() && line.charAt(0) != '#' && !Character.isWhitespace(line.charAt(0))) - goals.add(line); - - line = bufferedReader.readLine(); - } - } - return goals; - } - else{ - System.out.println("No goals.config file in the loaded lab!"); - return null; - } - } - catch (IOException e) { - System.out.println("Issue with getting goals.config goals"); - return null; - } - } - - - //Updates the list of goals - protected void updateListofGoals(JPanel PanelofGoals){ - Component[] goals = PanelofGoals.getComponents(); //Access the list of goals - - ArrayList listofGoalsTMP = new ArrayList<>(); - - //Iterate through each goal panel in the UI and add its values to the temp list of goal values - for (Component goal : goals) { - //Goal ID - String goalID = ((GoalPanels) goal).getGoalIDTextField().getText(); - //GoalType - ToolTipWrapper goalType = (ToolTipWrapper)((GoalPanels) goal).getGoalTypeComboBox().getSelectedItem(); - - - //Operator - ToolTipWrapper operator = (ToolTipWrapper)((GoalPanels) goal).getOperatorComboBox().getSelectedItem(); - String resultTag = ""; - if(goalType.equals(GoalType_ITEMS[12])){ //matchExpression - resultTag = ((GoalPanels) goal).getArithmeticResultTagTextField().getText(); - } - else{ - //Result Tag - resultTag = (String)((GoalPanels) goal).getResultTagComboBox().getSelectedItem(); - } - //Answer Type - String answerType = (String)((GoalPanels) goal).getAnswerTypeComboBox().getSelectedItem(); - //Answer Tag - String answerTag = ""; - if(answerType.equals(answerTypes[0])) //Literal - answerTag = ((GoalPanels) goal).getAnswerTagTextField().getText(); - else if(answerType.equals(answerTypes[1])) //Result Tag - answerTag = (String)(((GoalPanels) goal).getResultTag2ComboBox().getSelectedItem()); - else if(answerType.equals(answerTypes[2]) || answerType.equals(answerTypes[3])) //Parameter and Parameter ASCII - answerTag = (String)(((GoalPanels) goal).getParameterComboBox().getSelectedItem()); - - - - //Boolean Expression - String booleanExp = ((GoalPanels) goal).getBooleanTextField().getText(); - - - //Goal 1 - String goal1 = ((GoalPanels) goal).getGoal1TextField().getText(); - //Goal 2 - String goal2 = ((GoalPanels) goal).getGoal2TextField().getText(); - - - //Value - String value = ((GoalPanels) goal).getValueTextField().getText(); - //Subgoal List - String subgoalList = ((GoalPanels) goal).getSubgoalTextField().getText(); - - - //Executable File - String executableFile = ((GoalPanels) goal).getExecutableFileTextField().getText(); - - listofGoalsTMP.add(new GoalValues(goalID, goalType, operator, resultTag, answerType, answerTag, booleanExp, goal1, goal2, value, subgoalList, executableFile)); - } - listofGoals = listofGoalsTMP; //overwrite the old listofGoals with the temp listofGoals - } - - //Swaps goal order in the list of goals and then redraws them - protected void swapGoals(String type, int rowIndex){ - switch(type){ - case "UP": - if(rowIndex > 0){ - //System.out.println("UP: "+listofGoals.get(rowIndex).resultTag+" Index: "+rowIndex); - Collections.swap(listofGoals, rowIndex, rowIndex-1); - } - break; - case "DOWN": - if(rowIndex < rowCount-1){ - //System.out.println("DOWN: "+listofGoals.get(rowIndex).resultTag); - Collections.swap(listofGoals, rowIndex, rowIndex+1); - } - break; - default: - System.out.println("swap case not registered"); - } - } - - - //Compares the data of two lists of ArtifactValues. If there is a difference then return 'true', 'false' otherwise - static boolean goalValuesDiffer(List list1, List list2){ - if(list1 == null || list2 == null || list1.size() != list2.size()) - return true; - else{ - //This is a gross implemenation of copmaring each individual value between two sets of Goal Values (Maybe conisder implementing the GoalValues Class as a comparable) - for(int i=0;i getAboveGoals(String type, int rowIndex, Component[] goals){ - ArrayList aboveGoals = new ArrayList<>(); - for(int i=0;i(); - rowCount = listofGoals.size(); - } - -//RowCount setters - void increaseRowCount(){ - rowCount++; - } - - void decreaseRowCount(){ - rowCount--; - } - -//Getters - boolean isLoaded(){ - return labloaded; - } - - int getRowCount(){ - return rowCount; - } - - List getListofGoals(){ - return listofGoals; - } - - List getResultTagList(){ - return resultTagList; - } - - List getParameters(){ - return parameters; - } - - List getBooleanResults(){ - return booleanResults; - } - -//Debug - static private void goalValuesDifferDEBUG(List list1, List list2, int i){ - System.out.println("GOAL: "+i); - System.out.println(); - System.out.println("Goal ID"); - System.out.println(list1.get(i).goalID + " : " + list2.get(i).goalID); - System.out.println(); - System.out.println("Goal Type"); - System.out.println(list1.get(i).goalType + " : " + list2.get(i).goalType); - System.out.println(); - System.out.println("Opertor"); - System.out.println(list1.get(i).operator + " : " + list2.get(i).operator); - System.out.println(); - System.out.println("Result Tag"); - System.out.println(list1.get(i).resultTag + " : " + list2.get(i).resultTag); - System.out.println(); - System.out.println("Answer Tag"); - System.out.println(list1.get(i).answerTag + " : " + list2.get(i).answerTag); - System.out.println(); - System.out.println("Boolean Expression"); - System.out.println(list1.get(i).booleanExp + " : " + list2.get(i).booleanExp); - System.out.println(); - System.out.println("Goal 1"); - System.out.println(list1.get(i).goal1 + " : " + list2.get(i).goal1); - System.out.println(); - System.out.println("Goal 2"); - System.out.println(list1.get(i).goal2 + " : " + list2.get(i).goal2); - System.out.println(); - System.out.println("Value"); - System.out.println(list1.get(i).value + " : " + list2.get(i).value); - System.out.println(); - System.out.println("Subgoal List"); - System.out.println(list1.get(i).subgoalList + " : " + list2.get(i).subgoalList); - System.out.println(); - System.out.println("Goal ID"); - System.out.println(list1.get(i).executableFile + " : " + list2.get(i).executableFile); - } - -} +/* +This software was created by United States Government employees at +The Center for Cybersecurity and Cyber Operations (C3O) +at the Naval Postgraduate School NPS. Please note that within the +United States, copyright protection is not available for any works +created by United States Government employees, pursuant to Title 17 +United States Code Section 105. This software is in the public +domain and is not subject to copyright. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + */ +package labtainers.goalsui; + +import java.awt.Component; +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JComboBox; +import static labtainers.goalsui.ParamReferenceStorage.GoalType_ITEMS; +import static labtainers.goalsui.ParamReferenceStorage.Answer_ITEMS; +import static labtainers.goalsui.ParamReferenceStorage.booleanResultTypes; +import static labtainers.goalsui.ParamReferenceStorage.goalInput; +import static labtainers.goalsui.ParamReferenceStorage.opInput; +import static labtainers.goalsui.ParamReferenceStorage.resultTagInput; +import labtainers.mainui.MainWindow; +import labtainers.mainui.ToolTipHandlers.ToolTipWrapper; +import labtainers.mainui.CompareTextFiles; +import labtainers.mainui.LabData; +import labtainers.resultsui.ResultsData; + +/** + * + * @author Daniel Liao + */ +public class GoalsData { + private List listofGoals; + //final private List resultTagList; + private int rowCount; + MainWindow mainUI; + + public GoalsData(MainWindow main, File labPath){ + listofGoals = new ArrayList<>(); + //resultTagList = new ArrayList<>(); + rowCount = 0; + this.mainUI = main; + } + + // Creates a deep copy of the original + public GoalsData(GoalsData original){ + listofGoals = new ArrayList<>(); + for(GoalValues goal : original.getListofGoals()){ + listofGoals.add(new GoalValues(goal)); + } + + //resultTagList = new ArrayList<>(); + //for(String resultTag : original.getResultTagList()) + // resultTagList.add(resultTag); + + + rowCount = original.getRowCount(); + mainUI = original.getMainUI(); + } + + +//LOADING~~~~~~~~~~~~~~~~~~~~~~~~ + + //Checks if the lab exists and will load lab's goals.config if it does + public void retrieveData(){ + //if(retrieveResultTags() && retrieveGoals()){ + if(retrieveGoals()){ + //retrieveParameters(); + //retrieveBooleanResults(); + } + } + //Parses the goals.config to obtain all the relevant goal lines, + //extracts the values of each goal line and stores them into a list of "goals"(Goal Values) + private boolean retrieveGoals(){ + //Attempt to set the listofGoals, if it ends up being null then there was an issue accessing the goal lines, which would be paresd into Goal Values + listofGoals = getGoalValuesOfConfigFile(); + if(listofGoals != null){ + rowCount=listofGoals.size(); + return true; + } + else + return false; + } + + +//WRITING~~~~~~~~~~~~~~~~~~~~~~~~ + + //Update the results.config file with the user's input + public String writeGoalsConfig(boolean usetmp){ + if(listofGoals == null){ + mainUI.output("ERROR listofGoals is null\n"); + return null; + } + List booleanResults = mainUI.getCurrentData().getResultsData().getBooleanResults(); + File goalsConfigFile = null; + try { + String goalID, + goalType, + + operator, + resultTag, + answerType, + + booleanExp, + + goal1, + goal2, + + value, + subgoalList, + + executableFile; + String goalsConfigText = ""; + ErrorHandler error = new ErrorHandler(); + List goalIDs = new ArrayList(); //Used for goal ID duplication check + String comments; + + //Iterate through each goal + for(int i=0;i < listofGoals.size();i++){ + error.checkReset(); //Reset the error statuses for a new goal line + + String goalConfigLine = listofGoals.get(i).comments; + if(goalConfigLine == null){ + goalConfigLine = ""; + } + + //Goal ID + goalID = listofGoals.get(i).goalID; + goalIDs.add(goalID); + //Checks if goal ID is valid or inputted + if(error.checkGoalID(goalID)){ + goalConfigLine += (goalID + " = "); //add to goal ID Config line + } + + //Goal Type + if(listofGoals.get(i).goalType == null){ + System.out.println("Goal type is null for goal "+i); + continue; + } + goalType = listofGoals.get(i).goalType.getItem(); + + switch (goalType) { + case "matchExpression": + goalConfigLine += "matchany : "; + break; + case "count_value": + case "count_matches": + goalConfigLine += "count : "; + break; + default: + goalConfigLine += goalType+" : "; + break; + } + + if(opInput.contains(goalType)){ + + if(listofGoals.get(i).operator == null){ + error.badOperator = true; + System.out.println("NULL operator "+goalID); + mainUI.output("Unknownn operator for goal "+goalID); + continue; + } + operator = listofGoals.get(i).operator.getItem(); + resultTag = listofGoals.get(i).resultTag; + answerType = listofGoals.get(i).answerType; + + goalConfigLine += operator+" : "; + goalConfigLine += resultTag+" : "; + goalConfigLine += answerHandler(answerType, listofGoals.get(i)); + } + + else if(goalInput.contains(goalType)){ + goal1 = listofGoals.get(i).goal1; + goal2 = listofGoals.get(i).goal2; + + ArrayList listOfAboveGoals = getAboveGoals("GOAL1&2", i); + if(error.checkGoal1(goal1, listOfAboveGoals, booleanResults)) + goalConfigLine += goal1+" : "; + if(error.checkGoal2(goal2, listOfAboveGoals, booleanResults)) + goalConfigLine += goal2; + } + + else if(resultTagInput.contains(goalType)){ + resultTag = listofGoals.get(i).resultTag; + goalConfigLine += resultTag; + } + + else if("boolean".equals(goalType)){ + booleanExp = listofGoals.get(i).booleanExp; + + if(error.checkBooleanExp(booleanExp, getAboveGoals("BOOLEAN", i), booleanResults)){ + goalConfigLine += booleanExp; + } + } + + else if("count_greater".equals(goalType)){ + value = listofGoals.get(i).value; + subgoalList = listofGoals.get(i).subgoalList; + + if(error.checkValueAndSubgoals(value, subgoalList, getAboveGoals("ALL", i), booleanResults)){ + goalConfigLine += value+" : "; + goalConfigLine += "("; + goalConfigLine += subgoalList; + goalConfigLine += ")"; + } + + + + } + else if("execute".equals(goalType)){ + executableFile = listofGoals.get(i).executableFile; + resultTag = listofGoals.get(i).resultTag; + answerType = listofGoals.get(i).answerType; + + goalConfigLine += executableFile+" : "; + goalConfigLine += resultTag+" : "; + goalConfigLine += answerHandler(answerType, listofGoals.get(i)); + } + else if("matchExpression".equals(goalType)){ + operator = listofGoals.get(i).operator.getItem(); + + //May need modification /validation + String rt = listofGoals.get(i).resultTag; + resultTag=""; + if(error.checkArithRT(rt)){ //NOTE: the checkArithRT is incomplete and simply returns 'true' + resultTag += "("; + resultTag += rt; + resultTag += ")"; + } + + answerType = listofGoals.get(i).answerType; + + goalConfigLine += operator+" : "; + goalConfigLine += resultTag+" : "; + goalConfigLine += answerHandler(answerType, listofGoals.get(i)); + } + + + //If there's no error, put the goalConfigLine in the resultsConfigText string, + //Otherwise the overallPass of the user input is false + if(error.userInputCheck(i+1, booleanResults)){ + if(i < listofGoals.size()-1) + goalConfigLine+= System.lineSeparator(); + //Add the goal config line to the Results Config text + goalsConfigText += goalConfigLine; + } + else + error.fail(); + } + + //Check for duplicate goal IDs + error.checkDuplicateGoalIDs(goalIDs, booleanResults); + + + if(error.passStatus()){ + //Resets the results.config file + goalsConfigFile = initializeGoalsConfig(usetmp); + + try ( //Write the goals configuration to the results.config + BufferedWriter writer = new BufferedWriter(new FileWriter(goalsConfigFile, true))) { + writer.write(goalsConfigText+"\n"); + } + /* + if(usetmp){ + String new_file = goalsConfigFile.getAbsolutePath(); + String old_file = getGoalsPath(); + boolean same = CompareTextFiles.compare(old_file, new_file); + if(!same){ + retval = false; + System.out.println("files differ"); + } + } + */ + } + else + JOptionPane.showMessageDialog(null, error.toString(), "INPUT ERROR", JOptionPane.ERROR_MESSAGE); + } + catch (IOException ex) { + Logger.getLogger(GoalsUI.class.getName()).log(Level.SEVERE, null, ex); + } + if(goalsConfigFile != null){ + return goalsConfigFile.getAbsolutePath(); + }else{ + return null; + } + } + private String getGoalsPath(){ + String retval = mainUI.getCurrentLab() + File.separator + "instr_config" + File.separator + "goals.config"; + return retval; + } + //Builds the string bit to be added in the goals.config that describes the answer for a goal + private String answerHandler(String answerType, GoalValues goal){ + String answer = ""; + ToolTipWrapper tip = ParamReferenceStorage.getWrapper(Answer_ITEMS, answerType); + if(tip.equals(Answer_ITEMS[0])) //Literal + answer += "answer="; + else if(tip.equals(Answer_ITEMS[1])) //Result Tag + answer += "result."; + else if(tip.equals(Answer_ITEMS[2])) //Parameter + answer += "parameter."; + else if(tip.equals(Answer_ITEMS[3])) //Parameter ASCII + answer += "parameter_ascii."; + else + System.out.println("Issue writing answer in the goals.config"); + answer += goal.answerTag; + return answer; + } + + //Checks if the goals.config file exists and prepares the goals.config file for the lab + private File initializeGoalsConfig(boolean usetmp) throws IOException{ + //Get the filepath for the lab's goals.config + File goalsConfigFile; + if(!usetmp){ + goalsConfigFile = new File(getGoalsPath()); + }else{ + Path tempDir=null; + try{ + tempDir = Files.createTempDirectory(mainUI.getLabName()); + }catch(IOException ex){ + System.out.println("failed creating temporary directory" + ex); + System.exit(1); + } + String dir_s = tempDir.getFileName().toString(); + goalsConfigFile = new File(File.separator+"tmp"+File.separator+dir_s+ File.separator + "goals.config"); + } + + //May not be necessary, subject to remove the base text, perhaps there is an option for the user to add their own comments + //String baseText = + // "# goals.config" + System.lineSeparator() + // + "#" + System.lineSeparator() + // + "# Please see the Labtainer Lab Designer User Guide" + System.lineSeparator(); + + if(goalsConfigFile.exists()){ + //Overwrite goals.config file if it already exists + try (BufferedWriter writer = new BufferedWriter(new FileWriter(goalsConfigFile, false))) { + //writer.write(baseText); + } + return goalsConfigFile; + } + else if(goalsConfigFile.createNewFile()){ + //Create new goals.config file otherwise(if it does not already exist) + try (BufferedWriter writer = new BufferedWriter(new FileWriter(goalsConfigFile))) { + //writer.write(baseText); + } + return goalsConfigFile; + } + else{ //File could not be created so return error message + System.out.println("Goals Config File couldn't be initialzed."); + return null; + } + } + + + + //Handles all the error data and error checking before writing the goals.config + protected class ErrorHandler{ + private boolean overallPass; + private String errorMsg; + boolean + goalError, + goalIDMissing, + + goal1Error, + goal1Missing, + goal2Error, + goal2Missing, + badOperator, + booleanExpCharError, + booleanExpTagError, + booleanExpNotError, + booleanExpStartError, + booleanExpEndError, + booleanParensError, + booleanAlternateError, + booleanMissing, + + arithRTCharError, + arithRTMissing, + + valueError, + valueMissing, + subgoalError, + subgoalMissing; + + ErrorHandler(){ + overallPass = true; + errorMsg = ""; + checkReset(); + } + + void fail(){ + overallPass = false; + } + + //Rests the error status(used right before looking at new goal line) + private void checkReset(){ + goalError = false; + goalIDMissing = false; + + goal1Error = false; + goal1Missing = false; + goal2Error = false; + goal2Missing = false; + + badOperator = false; + + booleanExpCharError = false; + booleanExpTagError = false; + booleanExpNotError = false; + booleanExpStartError = false; + booleanExpEndError = false; + booleanParensError = false; + booleanAlternateError = false; + booleanMissing = false; + + arithRTCharError = false; + arithRTMissing = false; + + valueError = false; + valueMissing = false; + subgoalError = false; + subgoalMissing = false; + } + + + + //Builds error message detailing the errors that appear in the user input + boolean userInputCheck(int goalIndex, List booleanResults){ + boolean rowPassed = true; + String infoMsg = "Goal Line: " + goalIndex + System.lineSeparator(); + + if(goalError){ + rowPassed = false; + infoMsg+= "-Make sure your Goal ID has only alphanumeric characters or underscores." + System.lineSeparator(); + } + if(goalIDMissing){ + rowPassed = false; + infoMsg+= "-Goal ID input is missing." + System.lineSeparator(); + } + + + if(goal1Error){ + rowPassed = false; + infoMsg+= "-Make sure that Goal 1 is a 'matchany' goal above this line or a results boolean." + System.lineSeparator(); + } + if(goal1Missing){ + rowPassed = false; + infoMsg+= "-Goal 1 input is missing." + System.lineSeparator(); + } + if(goal2Error){ + rowPassed = false; + infoMsg+= "-Make sure that Goal 2 is a 'matchany' goal above this line or a results boolean." + System.lineSeparator(); + } + if(goal2Missing){ + rowPassed = false; + infoMsg+= "-Goal 2 input is missing." + System.lineSeparator(); + } + if(badOperator){ + rowPassed = false; + infoMsg+= "-Unknown operator." + System.lineSeparator(); + } + + + if(booleanExpCharError || booleanExpTagError){ + rowPassed = false; + infoMsg+= "-Make sure Boolean Expression contains only result booleans, non-matchacross goal IDs above this goal line," + System.lineSeparator() + + "parentheses, and boolean operators(and, or, and_not, or_not, not)." + System.lineSeparator(); + } + if(booleanExpNotError){ + rowPassed = false; + infoMsg+= "-The 'not' boolean operator can only appear at the beginning of a boolean expression." + System.lineSeparator(); + } + if(booleanExpStartError || booleanExpEndError){ + rowPassed = false; + infoMsg+= "-Make sure your expression is starts and ends correctly." + System.lineSeparator(); + } + if(booleanParensError){ + rowPassed = false; + infoMsg+= "-Make sure your expression has proper parentheses " + System.lineSeparator(); + } + if(booleanAlternateError){ + rowPassed = false; + infoMsg+= "-Make sure your expression is formatted correctly and make sure an item precedes and follows " + System.lineSeparator() + + "a boolean operator." + System.lineSeparator(); + } + if(booleanMissing){ + rowPassed = false; + infoMsg+= "-Boolean input is missing." + System.lineSeparator(); + } + + + if(arithRTCharError){ + rowPassed = false; + infoMsg+= "-Make sure Arithmetic Result Tag is formatted correctly." + System.lineSeparator(); + } + if(arithRTMissing){ + rowPassed = false; + infoMsg+= "-Arithmetic Result Tag input is missing." + System.lineSeparator(); + } + + + if(valueError){ + rowPassed = false; + infoMsg+= "-Value can only be a positive number(includes zero) less than the number of subgoal items." + System.lineSeparator(); + } + if(valueMissing){ + rowPassed = false; + infoMsg+= "-Value input is missing." + System.lineSeparator(); + } + if(subgoalError){ + rowPassed = false; + infoMsg+= "-Make sure your Subgoal list is seperated by commas(', ') and only contains goals from above this goal line" + System.lineSeparator() + + "and/or result booleans." + System.lineSeparator(); + } + if(subgoalMissing){ + rowPassed = false; + infoMsg+= "-Subgoal List input is missing." + System.lineSeparator(); + } + + if(!rowPassed) + errorMsg += (infoMsg + System.lineSeparator()); + + return rowPassed; + } + + //Checks is goal ID is missing or has invalid characters(valid: alphanumeric, and underscores) + boolean checkGoalID(String goalID){ + if(goalID.isEmpty() || goalID.equals("")){ + goalIDMissing = true; + return false; + } + else if(!goalID.matches("^[a-zA-Z0-9_-]+$")){ + goalError = true; + return false; + } + else + return true; + } + + + //Checks if goal 1 is either an above goal or a boolean results + boolean checkGoal1(String goal1, List listOfAboveGoals, List booleanResults){ + if(goal1.isEmpty() || goal1.equals("")){ + goal1Missing = true; + return false; + } + else if(!listOfAboveGoals.contains(goal1) && !booleanResults.contains(goal1)){ + goal1Error = true; + System.out.println("problem with goal1 "+goal1); + return false; + } + else + return true; + } + + //Checks if goal 2 is either an above goal or a boolean results + boolean checkGoal2(String goal2, List listOfAboveGoals, List booleanResults){ + if(goal2.isEmpty() || goal2.equals("")){ + goal2Missing = true; + return false; + } + else if(!listOfAboveGoals.contains(goal2) && !booleanResults.contains(goal2)){ + goal2Error = true; + System.out.println("problem with goal2 "+goal2); + return false; + } + else + return true; + } + + //Checks if boolean expression is valid: (The checking may have some overlap thta may need to be recoded) + boolean checkBooleanExp(String booleanExp, List nonMAAGoals, List booleanResults) { + String[] booleanOperators = {"and", "or", "and_not", "or_not"}; + + if(booleanExp.isEmpty() || booleanExp.equals("")){ + booleanMissing = true; + return false; + } + + //Does the boolean exp contain invalid chars (char not: alphnumeric, undescore, hyphen, whitespace, parenthesis) + if(!booleanExp.matches("^[a-zA-Z0-9_() -]+$")){ + booleanExpCharError = true; + return false; + } + + //Reformat the boolean expression string to identitfy things that shouldn't be there + //Replace all " not" with % + if(!booleanExp.startsWith("(")){ + booleanExp = "("+booleanExp+")"; + } + //booleanExp = " "+booleanExp; + //The line above is necessary because when 'not' is used in the beginning there may or may not be a space before it. + //Adding the space includes the non-space-preceeded case. + booleanExp = booleanExp.replaceAll(" not ", "% "); + booleanExp = booleanExp.replaceAll("[(]not ", "(% "); + + booleanExp = booleanExp.trim(); + + //System.out.println("OG: "+booleanExp); + //System.out.println(); + //System.out.println("GOALS:"); + + //Replace all non Matchacross Goals with an asterisk symbol + for(String toReplace : nonMAAGoals){ + booleanExp = symbolReplace(booleanExp, toReplace, "*"); + } + + //System.out.println(); + //System.out.println("RESULT BOOLEANS:"); + //Replace all non boolean results with an asterisk symbol + for(String toReplace : booleanResults){ + //System.out.println("boolean result <"+toReplace+">"); + //System.out.println("boolean exp "+booleanExp); + booleanExp = symbolReplace(booleanExp, toReplace, "*"); + } + + //System.out.println(); + //System.out.println("BOOLEAN OPERATORS:"); + //Replace all boolean operators with a pound symbol + for(String toReplace : booleanOperators){ + booleanExp = symbolReplace(booleanExp, toReplace, "#"); + } + + //System.out.println(booleanExp); + + booleanExp = booleanExp.replaceAll("\\s+","");//removes white space + + //If the boolean expression had a "not " in it, did it not occur at the beginning and/or more than once + //if(booleanExp.contains("%") && (!booleanExp.startsWith("(%") || (booleanExp.indexOf("%") != booleanExp.lastIndexOf("%")))){ + // booleanExpNotError = true; + // System.out.println("not error "+booleanExp); + // return false; + // } + //Does the reformatted Boolean Expression string pick up alphnumeric(with underscore) substring that doesn't belong in either nonMAAGoals or booleanResults + if(!booleanExp.matches("^[%*#()]+$")){ + System.out.println("TagError "+booleanExp); + booleanExpTagError = true; + return false; + } + //Does it start with an operator or a close parens + else if(booleanExp.startsWith("#") || booleanExp.startsWith(")")){ + booleanExpStartError = true; + System.out.println("boolean starts incorretly "+booleanExp); + return false; + } + //Does it end with an operator or an open parens + else if(booleanExp.endsWith("#") || booleanExp.endsWith("(")){ + booleanExpEndError = true; + return false; + } + //Does the boolean expression have bad parens + else if(parensHandler(booleanExp)){ + booleanParensError = true; + return false; + } + //Does it at least have one operator not preceeded and not followed by a nonMAA goal/boolean result + else if(alternatationCheck(booleanExp)){ + booleanAlternateError = true; + return false; + } + + return true; + } + + //Replaces the a substring in the a string with another string + String symbolReplace(String booleanExp, String toReplace, String replaceWith){ + int tRIndex = booleanExp.indexOf(toReplace); + while(tRIndex != -1){ + int indexAfterWord = tRIndex+toReplace.length(); + int indexBeforeWord = tRIndex-1; + //System.out.println(toReplace+": "); + //System.out.println("tRIndex: "+tRIndex); + //System.out.println("indexAfterWord: "+indexAfterWord); + + + //IF the word to replace is at the beginning: "toReplace and_not other" -> "* and_not other" + if(tRIndex == 0 && booleanExp.charAt(indexAfterWord) == ' '){ + booleanExp = booleanExp.substring(0, indexAfterWord).replaceFirst(toReplace, replaceWith)+ + booleanExp.substring(indexAfterWord, booleanExp.length()); + } + //IF the word to replace is at the end: "other and_not toRepalce" -> "other and_not *" + else if(tRIndex == booleanExp.length()-toReplace.length() && + booleanExp.charAt(booleanExp.length()-toReplace.length()-1) == ' '){ + booleanExp = booleanExp.substring(0, tRIndex) + + booleanExp.substring(tRIndex, booleanExp.length()).replaceFirst(toReplace, replaceWith); + } + /* + IF the word to replace is in the middle: "other and toReplace and another" -> "other and * and another" + "(other and toReplace) and another" -> "(other and *) and another" + "(toReplace and other) and another" -> "(* and other) and another" + "(toReplace) and another" -> "(*) and another" + */ + else if((booleanExp.charAt(indexBeforeWord) == ' ' || booleanExp.charAt(indexBeforeWord) == '(') && + (booleanExp.charAt(indexAfterWord) == ' ' || booleanExp.charAt(indexAfterWord) == ')')){ + booleanExp = booleanExp.substring(0, tRIndex)+ + booleanExp.substring(tRIndex, indexAfterWord).replaceFirst(toReplace, replaceWith)+ + booleanExp.substring(indexAfterWord, booleanExp.length()); + }else{ + //System.out.println("No replace "+booleanExp); + } + //System.out.println(booleanExp); + //System.out.println(); + + indexAfterWord = tRIndex+replaceWith.length(); //The indexAfterWord is shifted since the word has been deleted and replaced + if(indexAfterWord aboveGoals, List booleanResults){ + boolean pass = true; + + if(subgoalList.isEmpty() || subgoalList.equals("")){ + subgoalMissing = true; + pass = false; + } + if(value.isEmpty() || value.equals("")){ + valueMissing = true; + pass = false; + } + + if(!subgoalMissing && !valueMissing){ + String[] subgoals = subgoalList.split(", "); + for(String subgoal : subgoals){ + subgoal = subgoal.replaceAll("\\s+", ""); + if(!aboveGoals.contains(subgoal) && !booleanResults.contains(subgoal)){ + subgoalError = true; + pass = false; + } + } + + if(!value.matches("^[0-9]+$") || subgoals.length <= Integer.parseInt(value)){ + valueError = true; + pass = false; + } + + + } + return pass; + } + + //Checks if the result tag has any arithmetic errors (NEEDS REVISION) ***Incomplete + boolean checkArithRT(String arithRT){ + if(arithRT.isEmpty() || arithRT.equals("")){ + arithRTMissing = true; + return false; + } +// for(String rt : resultTagList) +// arithRT.replaceAll(rt, "0"); +// arithRT.replaceAll("\\s+","");//removes white space +// +// if(!arithRT.matches("^[-+0*/&0-9()]+$")){ +// arithRTCharError = true; +// return false; +// } + + return true; + } + + + + + + //Check if there are goalID duplicates (this includes checking duplicates with boolean results) + void checkDuplicateGoalIDs(List goalIDs, List booleanResults){ + ArrayList goalIDSet = new ArrayList<>(); + + //Store all the indices for each unique goal ID + for(int i=0;i 1){ + duplicateErrorMsg+= "Duplicate Goal ID: \"" + goal.goalID + "\" on rows "; + + for(int i=0;i indices; + + GoalIDIndices(String goalID, int index){ + this.goalID = goalID; + indices = new ArrayList<>(); + indices.add(index); + isResultTagBoolean = false; + } + + void addIndex(int index){ + indices.add(index); + } + } + + //Is the goal ID already in the duplicate list? + boolean isDuplicate(List goalIDSet, String goalID){ + for(GoalIDIndices goalIndices : goalIDSet){ + if(goalIndices.goalID.equals(goalID)) + return true; + } + return false; + } + + //Get the duplicate object based on the duplicate string + GoalIDIndices getDuplicate(List goalIDSet, String goalID){ + for(GoalIDIndices goalIndices : goalIDSet){ + if(goalIndices.goalID.equals(goalID)) + return goalIndices; + } + return null; + } + + @Override + public String toString(){ + return errorMsg; + } + + boolean passStatus(){ + return overallPass; + } + + + } + + +//GENERAL~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + //Gets a list of GoalValues from the the current state of the goals.config file + protected ArrayList getGoalValuesOfConfigFile(){ + ArrayList officialListofGoals = new ArrayList<>(); + + ArrayList goalLines = getGoalLines(); + LabData ldata = mainUI.getCurrentData(); + ResultsData rdata = ldata.getResultsData(); + ArrayList resultTagList = mainUI.getCurrentData().getResultsData().getResultNames(); + if(goalLines != null){ + for(String goalLine : goalLines){ + GoalValues values = new GoalValues(goalLine, resultTagList); + officialListofGoals.add(values); + } + return officialListofGoals; + } + else + return null; + } + + //Get the list of goal lines from the goals.config that need to be parsed + private ArrayList getGoalLines(){ + ArrayList goals = new ArrayList<>(); + + try { + File goalsConfig = new File(mainUI.getCurrentLab()+File.separator+"instr_config"+File.separator+"goals.config"); + + //Get the goal lines + if(goalsConfig.exists()){ + try (FileReader fileReader = new FileReader(goalsConfig)) { + BufferedReader bufferedReader = new BufferedReader(fileReader); + + String goal_line = ""; + String line = bufferedReader.readLine(); + while (line != null) { + goal_line = goal_line + line; + //just checks if the first character is: not empty, not a hash, and not whitspace) + if(!line.isEmpty() && line.charAt(0) != '#' && !Character.isWhitespace(line.charAt(0))) + { + goals.add(goal_line); + goal_line = ""; + }else{ + goal_line=goal_line+"\n"; + } + + line = bufferedReader.readLine(); + } + } + return goals; + } + else{ + System.out.println("No goals.config file in the loaded lab!"); + return null; + } + } + catch (IOException e) { + System.out.println("Issue with getting goals.config goals"); + return null; + } + } + + + //Updates the list of goals + protected void updateListofGoals(JPanel PanelofGoals){ + Component[] goals = PanelofGoals.getComponents(); //Access the list of goals + + ArrayList listofGoalsTMP = new ArrayList<>(); + + //Iterate through each goal panel in the UI and add its values to the temp list of goal values + for (Component goal : goals) { + //Goal ID + String goalID = ((GoalPanels) goal).getGoalIDTextField().getText(); + //GoalType + ToolTipWrapper goalType = (ToolTipWrapper)((GoalPanels) goal).getGoalTypeComboBox().getSelectedItem(); + + //Operator + ToolTipWrapper operator = (ToolTipWrapper)((GoalPanels) goal).getOperatorComboBox().getSelectedItem(); + String resultTag = ""; + if(goalType.equals(GoalType_ITEMS[14])){ //matchExpression + resultTag = ((GoalPanels) goal).getArithmeticResultTagTextField().getText(); + } + else{ + //Result Tag + resultTag = (String)((GoalPanels) goal).getResultTagComboBox().getSelectedItem(); + } + //Answer Type + ToolTipWrapper answerTypeTip = (ToolTipWrapper)((GoalPanels) goal).getAnswerTypeComboBox().getSelectedItem(); + //Answer Tag + String answerTag = ""; + if(answerTypeTip.equals(Answer_ITEMS[0])) //Literal + answerTag = ((GoalPanels) goal).getAnswerTagTextField().getText(); + else if(answerTypeTip.equals(Answer_ITEMS[1])) //Result Tag + answerTag = (String)(((GoalPanels) goal).getResultTag2ComboBox().getSelectedItem()); + else if(answerTypeTip.equals(Answer_ITEMS[2]) || answerTypeTip.equals(Answer_ITEMS[3])) //Parameter and Parameter ASCII + answerTag = (String)(((GoalPanels) goal).getParameterComboBox().getSelectedItem()); + + + + //Boolean Expression + String booleanExp = ((GoalPanels) goal).getBooleanTextField().getText(); + + + //Goal 1 + String goal1 = ((GoalPanels) goal).getGoal1TextField().getText(); + //Goal 2 + String goal2 = ((GoalPanels) goal).getGoal2TextField().getText(); + + + //Value + String value = ((GoalPanels) goal).getValueTextField().getText(); + //Subgoal List + String subgoalList = ((GoalPanels) goal).getSubgoalTextField().getText(); + + + //Executable File + String executableFile = ((GoalPanels) goal).getExecutableFileTextField().getText(); + + String comments = ((GoalPanels) goal).getComments(); + listofGoalsTMP.add(new GoalValues(goalID, goalType, operator, resultTag, answerTypeTip.getItem(), answerTag, booleanExp, goal1, goal2, value, subgoalList, executableFile, comments)); + } + listofGoals = listofGoalsTMP; //overwrite the old listofGoals with the temp listofGoals + } + + //Swaps goal order in the list of goals and then redraws them + protected void swapGoals(String type, int rowIndex){ + switch(type){ + case "UP": + if(rowIndex > 0){ + //System.out.println("UP: "+listofGoals.get(rowIndex).resultTag+" Index: "+rowIndex); + Collections.swap(listofGoals, rowIndex, rowIndex-1); + } + break; + case "DOWN": + if(rowIndex < rowCount-1){ + //System.out.println("DOWN: "+listofGoals.get(rowIndex).resultTag); + Collections.swap(listofGoals, rowIndex, rowIndex+1); + } + break; + default: + System.out.println("swap case not registered"); + } + } + + + //Compares the data of two lists of ArtifactValues. If there is a difference then return 'true', 'false' otherwise + static boolean goalValuesDiffer(List list1, List list2){ + if(list1 == null || list2 == null || list1.size() != list2.size()) + return true; + else{ + //This is a gross implemenation of copmaring each individual value between two sets of Goal Values (Maybe conisder implementing the GoalValues Class as a comparable) + for(int i=0;i getAboveGoals(String type, int rowIndex){ + ArrayList aboveGoals = new ArrayList<>(); + for(int i=0;i(); + rowCount = listofGoals.size(); + } + + public void updateParameters(JPanel PanelofGoals){ + Component[] goals = PanelofGoals.getComponents(); //Access the list of goals + + for (Component goal : goals) { + GoalPanels gp = (GoalPanels) goal; + JComboBox box = gp.getParameterComboBox(); + if(box.isVisible()){ + gp.updateParameters(); + } + } + } + +//RowCount setters + void increaseRowCount(){ + rowCount++; + } + + void decreaseRowCount(){ + rowCount--; + } + + void resetRowCount(){ + rowCount = 0; + } + +//Getters + int getRowCount(){ + return rowCount; + } + + List getListofGoals(){ + return listofGoals; + } + + List getResultTagList(){ + ArrayList resultTagList = mainUI.getCurrentData().getResultsData().getResultNames(); + return resultTagList; + } + + List getParameters(){ + return mainUI.getCurrentData().getParamsData().getParamNames(); + } + + List getBooleanResults(){ + return mainUI.getCurrentData().getResultsData().getBooleanResults(); + } + + MainWindow getMainUI() { + return mainUI; + } + + +//Debug + static private void goalValuesDifferDEBUG(List list1, List list2, int i){ + System.out.println("GOAL: "+i); + System.out.println(); + System.out.println("Goal ID"); + System.out.println(list1.get(i).goalID + " : " + list2.get(i).goalID); + System.out.println(); + System.out.println("Goal Type"); + System.out.println(list1.get(i).goalType + " : " + list2.get(i).goalType); + System.out.println(); + System.out.println("Opertor"); + System.out.println(list1.get(i).operator + " : " + list2.get(i).operator); + System.out.println(); + System.out.println("Result Tag"); + System.out.println(list1.get(i).resultTag + " : " + list2.get(i).resultTag); + System.out.println(); + System.out.println("Answer Tag"); + System.out.println(list1.get(i).answerTag + " : " + list2.get(i).answerTag); + System.out.println(); + System.out.println("Boolean Expression"); + System.out.println(list1.get(i).booleanExp + " : " + list2.get(i).booleanExp); + System.out.println(); + System.out.println("Goal 1"); + System.out.println(list1.get(i).goal1 + " : " + list2.get(i).goal1); + System.out.println(); + System.out.println("Goal 2"); + System.out.println(list1.get(i).goal2 + " : " + list2.get(i).goal2); + System.out.println(); + System.out.println("Value"); + System.out.println(list1.get(i).value + " : " + list2.get(i).value); + System.out.println(); + System.out.println("Subgoal List"); + System.out.println(list1.get(i).subgoalList + " : " + list2.get(i).subgoalList); + System.out.println(); + System.out.println("Goal ID"); + System.out.println(list1.get(i).executableFile + " : " + list2.get(i).executableFile); + } + +} diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/src/GoalsUI/GoalsUI.form b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/goalsui/GoalsUI.form similarity index 52% rename from modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/src/GoalsUI/GoalsUI.form rename to modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/goalsui/GoalsUI.form index 1b91e7dbc..e7bc92e22 100644 --- a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/src/GoalsUI/GoalsUI.form +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/goalsui/GoalsUI.form @@ -1,17 +1,11 @@ -
+ - - - - + - - - @@ -37,26 +31,31 @@ - - + - - - - - - - - - - - + + + + + + + + + - - - - - + + + + + + + + + + + + + @@ -66,54 +65,36 @@ - + - - - - - - - - - - - - - + + - - + + + + + + + + + + - + - - - + + - - - - - - - - - - - - - - - + - + @@ -127,60 +108,48 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - - - + - + - + - - + + + - + + + + + + + + + + + + + + + + + + diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/goalsui/GoalsUI.java b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/goalsui/GoalsUI.java new file mode 100644 index 000000000..7109b4cb8 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/goalsui/GoalsUI.java @@ -0,0 +1,349 @@ +/* +This software was created by United States Government employees at +The Center for Cybersecurity and Cyber Operations (C3O) +at the Naval Postgraduate School NPS. Please note that within the +United States, copyright protection is not available for any works +created by United States Government employees, pursuant to Title 17 +United States Code Section 105. This software is in the public +domain and is not subject to copyright. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + */ +package labtainers.goalsui; + +import java.awt.Component; +import java.awt.Dimension; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JScrollBar; +import labtainers.mainui.MainWindow; + +/** + * + * @author student + */ + + +public class GoalsUI extends javax.swing.JFrame { + + /** + * Creates new form GoalsUI + */ + GoalsData data; + GoalsData saved; + MainWindow mainUI; + + public GoalsUI(java.awt.Frame parent, boolean modal) { + //super(parent, modal); + initComponents(); + this.setVisible(true); + goalsScrollPaneBar = ScrollPaneOfGoals.getVerticalScrollBar(); + this.mainUI = (MainWindow)parent; + this.data = this.mainUI.getCurrentData().getGoalsData(); + this.saved = new GoalsData(this.data); + loadUI(); + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + CreateButton = new javax.swing.JButton(); + RemoveAllButton = new javax.swing.JButton(); + jLabel1 = new javax.swing.JLabel(); + UpdateButton = new javax.swing.JButton(); + ScrollPaneOfGoals = new javax.swing.JScrollPane(); + PanelofGoals = new javax.swing.JPanel(); + CancelButton = new javax.swing.JButton(); + + setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); + setMinimumSize(new java.awt.Dimension(1590, 500)); + addWindowListener(new java.awt.event.WindowAdapter() { + public void windowClosing(java.awt.event.WindowEvent evt) { + formWindowClosing(evt); + } + }); + + CreateButton.setFont(new java.awt.Font("Dialog", 1, 12)); // NOI18N + CreateButton.setText("Create"); + CreateButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + CreateButtonActionPerformed(evt); + } + }); + + RemoveAllButton.setFont(new java.awt.Font("Dialog", 1, 12)); // NOI18N + RemoveAllButton.setText("Remove All"); + RemoveAllButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + RemoveAllButtonActionPerformed(evt); + } + }); + + jLabel1.setFont(new java.awt.Font("Arial", 1, 12)); // NOI18N + jLabel1.setText("Goal ID"); + jLabel1.setToolTipText("The goal identifier displayed in lab grading output. Use an underscore prefix to supress inclusion in that output, e.g., to use the goal within a boolean expression."); + + UpdateButton.setText("OK"); + UpdateButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + UpdateButtonActionPerformed(evt); + } + }); + + ScrollPaneOfGoals.setAutoscrolls(true); + ScrollPaneOfGoals.setMaximumSize(new java.awt.Dimension(1300, 800)); + + PanelofGoals.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT)); + ScrollPaneOfGoals.setViewportView(PanelofGoals); + + CancelButton.setText("Cancel"); + CancelButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + CancelButtonActionPerformed(evt); + } + }); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(ScrollPaneOfGoals, javax.swing.GroupLayout.DEFAULT_SIZE, 1566, Short.MAX_VALUE) + .addGroup(layout.createSequentialGroup() + .addComponent(CreateButton) + .addGap(18, 18, 18) + .addComponent(RemoveAllButton) + .addGap(0, 0, Short.MAX_VALUE)))) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(140, 140, 140) + .addComponent(jLabel1)) + .addGroup(layout.createSequentialGroup() + .addGap(434, 434, 434) + .addComponent(UpdateButton) + .addGap(62, 62, 62) + .addComponent(CancelButton))) + .addGap(0, 0, Short.MAX_VALUE))) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(CreateButton) + .addComponent(RemoveAllButton)) + .addGap(18, 18, 18) + .addComponent(jLabel1) + .addGap(18, 18, 18) + .addComponent(ScrollPaneOfGoals, javax.swing.GroupLayout.PREFERRED_SIZE, 380, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(18, 18, 18) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(UpdateButton) + .addComponent(CancelButton)) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + + pack(); + }// //GEN-END:initComponents + + private void CreateButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_CreateButtonActionPerformed + createButton(); + }//GEN-LAST:event_CreateButtonActionPerformed + + private void RemoveAllButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_RemoveAllButtonActionPerformed + removeAllButton(); + }//GEN-LAST:event_RemoveAllButtonActionPerformed + + private void UpdateButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_UpdateButtonActionPerformed + if(updateButton()){ + mainUI.setGoalsClosed(); + setVisible(false); + dispose(); + } + }//GEN-LAST:event_UpdateButtonActionPerformed + + private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing + mainUI.setGoalsClosed(); + }//GEN-LAST:event_formWindowClosing + + private void CancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_CancelButtonActionPerformed + mainUI.setGoalsClosed(); + setVisible(false); + }//GEN-LAST:event_CancelButtonActionPerformed + + // BUTTONS // + + private void createButton(){ + addGoalsPanel(new GoalPanels(this, data)); + goalsScrollPaneBar.setValue(goalsScrollPaneBar.getMaximum()); + } + + private void removeAllButton(){ + if(JOptionPane.showConfirmDialog(null, "Are you sure you want to remove all?") == JOptionPane.YES_OPTION){ + removeAllGoals(); + } + } + + private boolean updateButton(){ + boolean retval = true; + data.updateListofGoals(PanelofGoals); + saved = new GoalsData(data); + String fname = saved.writeGoalsConfig(true); + if(fname == null){ + retval = false; + }else{ + this.mainUI.getCurrentData().setGoalsData(saved); + } + return retval; + } + + public void updateParameters(){ + data.updateParameters(PanelofGoals); + } + + + // CORE FUNCTIONS// + + //Removes all the goal lines for the lab *note: this doesn't update results.config until the user hits the update button + private void removeAllGoals(){ + data.resetRowCount(); + goalsPanePanelLength = 0; + PanelofGoals.setPreferredSize(new Dimension(0,goalsPanePanelLength)); + + Component[] componentList = PanelofGoals.getComponents(); + for(Component c: componentList) + PanelofGoals.remove(c); + + + PanelofGoals.revalidate(); + PanelofGoals.repaint(); + } + + + // Loads all goals into GUI + protected void loadUI(){ + removeAllGoals(); + for(int i=0; i < data.getListofGoals().size(); i++){ + loadGoal(data.getListofGoals().get(i), i+1); + } + } + + //Loads the goal into GUI + private void loadGoal(GoalValues goalVal, int rowNum){ + GoalPanels newGoal = new GoalPanels(this, data, goalVal, rowNum); + addGoalsPanel(newGoal); + } + + + // Add the goals panel into GUI + public int goalsPanePanelLength = 0; + private JScrollBar goalsScrollPaneBar; + private void addGoalsPanel(GoalPanels panel){ + //Resize the JPanel Holding all the Goal Panels to fit another one (makes the scroll bar resize and should show all objects listed) + //as of 8/24/2020 the PanelofArtifacts uses a flow layout with a horizontal gap of 5, that's where the 5 comes from in the line below + goalsPanePanelLength+=panel.getPreferredSize().height+5; + PanelofGoals.setPreferredSize(new Dimension(0,goalsPanePanelLength)); + + // Create the Goal Panel and add it + data.increaseRowCount(); + PanelofGoals.add(panel); //takes in parent(this), containerlist, rowcount + + // Redraw GUI with the new Panel + PanelofGoals.revalidate(); + PanelofGoals.repaint(); + } + + //Updates the list of goals and redraws them on screen + void refresh(){ + data.updateListofGoals(PanelofGoals); + loadUI(); + } + + //Gets the panel holding the goals + protected JPanel getPanelofGoals(){ + return PanelofGoals; + } + + + /** + * @param args the command line arguments + */ + public static void main(String args[]) { + /* Set the Nimbus look and feel */ + // + /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. + * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html + */ + try { + for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { + if ("Nimbus".equals(info.getName())) { + javax.swing.UIManager.setLookAndFeel(info.getClassName()); + break; + } + } + } catch (ClassNotFoundException ex) { + java.util.logging.Logger.getLogger(GoalsUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } catch (InstantiationException ex) { + java.util.logging.Logger.getLogger(GoalsUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } catch (IllegalAccessException ex) { + java.util.logging.Logger.getLogger(GoalsUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } catch (javax.swing.UnsupportedLookAndFeelException ex) { + java.util.logging.Logger.getLogger(GoalsUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } + // + + /* Create and display the dialog */ + java.awt.EventQueue.invokeLater(new Runnable() { + public void run() { + GoalsUI dialog = new GoalsUI(new javax.swing.JFrame(), true); + dialog.addWindowListener(new java.awt.event.WindowAdapter() { + @Override + public void windowClosing(java.awt.event.WindowEvent e) { + System.exit(0); + } + }); + dialog.setVisible(true); + } + }); + } + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton CancelButton; + private javax.swing.JButton CreateButton; + private javax.swing.JPanel PanelofGoals; + private javax.swing.JButton RemoveAllButton; + private javax.swing.JScrollPane ScrollPaneOfGoals; + private javax.swing.JButton UpdateButton; + private javax.swing.JLabel jLabel1; + // End of variables declaration//GEN-END:variables +} diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/src/GoalsUI/ParamReferenceStorage.java b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/goalsui/ParamReferenceStorage.java similarity index 77% rename from modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/src/GoalsUI/ParamReferenceStorage.java rename to modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/goalsui/ParamReferenceStorage.java index 445057a98..b46dab72e 100644 --- a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/src/GoalsUI/ParamReferenceStorage.java +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/goalsui/ParamReferenceStorage.java @@ -1,190 +1,244 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package GoalsUI; - -import GoalsUI.ToolTipHandlers.ToolTipWrapper; -import java.util.ArrayList; -import java.util.Arrays; - - -/** - * - * @author Dan - */ -public class ParamReferenceStorage { - - public static final ToolTipWrapper[] GoalType_ITEMS = new ToolTipWrapper[] { - //0 - new ToolTipWrapper("matchany", "Results from all timestamped sets are evaluated.
" + - "If the answertag names a result, then both that
" + - "result and the resulttag must occur in the same
" + - "timestamped set. The ’matchany’ goals are treated
" + - "as a set of values, each timestamped based on the
" + - "timestamp of the reference resulttag."), - // 1 - new ToolTipWrapper("matchlast", "only results from the latest timestamped set are
" + - "evaluated."), - // 2 - new ToolTipWrapper("matchacross", "The resulttag and answertag name results. The
" + - "operator is applied against values in different
" + - "timestamped sets. For example, a \"string_diff\"
" + - "operator would require the named results to have
" + - "at least two distinct values in different
" + - "timestamped sets."), - // 3 - new ToolTipWrapper("boolean", "The goal value is computed from a boolean expression
" + - "consisting of goal_id’s and boolean operators, (\"and\",
" + - "\"or\", \"and_not\", \"or_not\", and \"not\"), and parenthisis
" + - "for precedence. The goal_id’s must be from goals defined
" + - "earlier in the goals.config file, or boolean results
" + - "from results.config. The goal evalutes to
" + - "TRUE if the boolen expression evaluates to TRUE for any
" + - "of the timestamped sets of goal_ids, (see the ’matchany’
" + - "discussion above). The goal_id’s cannot include any
" + - "\"matchacross\" goals. NOTE: evaluation is within
" + - "timestamped sets. If you want to evaluate across
" + - "timestamps, use the count_greater_operator below."), - // 4 - new ToolTipWrapper("count_greater", "The goal is TRUE if the count of TRUE subgoals in the
" + - "list exceeds the given value. The subgoals are
" + - "summed across all timestamps. The subgoal list is
" + - "comma-separated within parenthesis."), - // 5 - new ToolTipWrapper("time_before", "Both goal1 and goal2 must be goal_ids from previous
" + - "matchany, or boolean values from results.config
" + - "A timestamped goal is created for each goal2
" + - "timestamped instance whose timestamp is proceeded
" + - "by a goal1 timestamped instance. The goal for that
" + - "timestamp will be TRUE if the goal2
" + - "instance is TRUE, and at least one of the goal1
" + - "instances is TRUE. These timestamped goals can
" + - "then be evaluated within boolean goals."), - // 6 - new ToolTipWrapper("time_during", "Both goal1 and goal2 must be goal_ids from previous
" + - "matchany goal types, or boolean values from
" + - "results.config. Timestamps include a start and end
" + - "time, reflecting when the program starts and when it
" + - "terminates. A timestamped goal is created for each
" + - "goal2 range that encompasses a goal1 timestamp.
" + - "The goal for that timestamp will be TRUE if the
" + - "goal2 instance is TRUE, and at least one goal1 instance
" + - "is TRUE. These timestamped goals can then be
" + - "evaluated within boolean goals."), - // 7 - new ToolTipWrapper("time_not_during", "Similar to time_during, but timestamped goals are
" + - "always created for each goal2. Each such goal is True
" + - "unless one or more goal1 times occur within a True goal2
" + - "range."), - // 8 - new ToolTipWrapper("execute", "The is treated as a file name of a script to
" + - "execute, with the resulttag and answertag passed to the
" + - "script as arguments. The resulttag is expected to be
" + - "one of the symbolic names defined in the results.config
" + - "file, while the answertag is expected to be a literal
" + - "value or the symbolic name in the parameters.config file
" + - "Note: the answertag cannot be a symbolic name from
" + - "results.config"), - // 9 - new ToolTipWrapper("count_value", "If the remainder of the line only includes a resulttag,
" + - "then the goal value is assigned the quanity of
" + - "timestamped files containing the given resulttag.
" + - "Otherwise the goal value is assigned the
" + - "quantity of timestamped files having results
" + - "that satisfy the given operator and arguments."), - // 10 - new ToolTipWrapper("count_matches", "If the remainder of the line only includes a resulttag,
" + - "then the goal value is assigned the quanity of
" + - "timestamped files containing the given resulttag.
" + - "Otherwise the goal value is assigned the
" + - "quantity of timestamped files having results
" + - "that satisfy the given operator and arguments."), - // 11 - new ToolTipWrapper("value", "The goal value is assigned the given resulttag value from
" + - "the most recent timestamped file that contains the resulttag."), - - // 12 - new ToolTipWrapper("matchExpression", "The resultTag is an arithmetic expression")}; - - - public static final ToolTipWrapper[] Operator_ITEMS = new ToolTipWrapper[] { - // 0 - new ToolTipWrapper("string_equal", "The strings derived from answertag and resulttag
" + - "are equal."), - // 1 - new ToolTipWrapper("string_diff", "The line_id is an integer line number
" + - "(starting at one). Use of this to identify
" + - "lines is discouraged since minor lab changes
" + - "might alter the count."), - // 2 - new ToolTipWrapper("string_start", "the line_id is a string. This names the
" + - "first occurrence of a line that starts with
" + - "this string." ), - // 3 - new ToolTipWrapper("string_end", "The line_id is a string. This names the
" + - "first occurrence of a line that contains the
" + - "string." ), - // 4 - new ToolTipWrapper("string_contains", "The line_id is a regular expression. This names the
" + - "first occurrence of a line that matches the regular
" + - "expression. Also see the \"GROUP\" field_type." ), - - // 5 - new ToolTipWrapper("integer_equal", "The line_id is a regular expression. This names the
" + - "first occurrence of a line that matches the regular
" + - "expression. Also see the \"GROUP\" field_type." ), - - // 6 - new ToolTipWrapper("integer_greater", "The line_id is a regular expression. This names the
" + - "first occurrence of a line that matches the regular
" + - "expression. Also see the \"GROUP\" field_type." ), - - // 7 - new ToolTipWrapper("integer_lessthan", "The line_id is a regular expression. This names the
" + - "first occurrence of a line that matches the regular
" + - "expression. Also see the \"GROUP\" field_type." )}; - - - //Answer Types - public static final String[] answerTypes = new String[] { - "Literal", - "Result Tag", - "Parameter", - "Parameter ASCII" - }; - - //Boolean Result Types - public static final ArrayList booleanResultTypes = new ArrayList(Arrays.asList( - "CONTAINS", - "FILE_REGEX", - "LOG_TS", - "FILE_REGEX_TS", - "LOG_RANGE", - "TIME_DELIM" - )); - - //Input format 1: [operator : resultTag : answerTag] - public static final ArrayList opInput = new ArrayList(Arrays.asList( - "matchany", - "matchlast", - "matchacross", - "count_matches" - )); - - //Input format 2: [goal1 : goal2] - public static final ArrayList goalInput = new ArrayList(Arrays.asList( - "time_before", - "time_during", - "time_not_during" - )); - - //Input format 2: [resultTag] - public static final ArrayList resultTagInput = new ArrayList(Arrays.asList( - "count_value", - "value" - )); - - -} +/* +This software was created by United States Government employees at +The Center for Cybersecurity and Cyber Operations (C3O) +at the Naval Postgraduate School NPS. Please note that within the +United States, copyright protection is not available for any works +created by United States Government employees, pursuant to Title 17 +United States Code Section 105. This software is in the public +domain and is not subject to copyright. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + */ +package labtainers.goalsui; + +import java.util.ArrayList; +import java.util.Arrays; +import labtainers.mainui.ToolTipHandlers.ToolTipWrapper; + + +/** + * + * @author Daniel Liao + */ +public class ParamReferenceStorage { + public static ToolTipWrapper getWrapper(ToolTipWrapper[] tipList, String item){ + ToolTipWrapper retval = null; + + for(ToolTipWrapper tool_tip : tipList){ + if(tool_tip.getItem().equals(item)){ + retval = tool_tip; + break; + } + } + return retval; + } + public static final ToolTipWrapper[] GoalType_ITEMS = new ToolTipWrapper[] { + //0 + new ToolTipWrapper("matchany", "Results from all timestamped sets are evaluated.
" + + "If the answertag names a result, then both that
" + + "result and the resulttag must occur in the same
" + + "timestamped set. The ’matchany’ goals are treated
" + + "as a set of values, each timestamped based on the
" + + "timestamp of the reference resulttag."), + // 1 + new ToolTipWrapper("matchlast", "only results from the latest timestamped set are
" + + "evaluated."), + // 2 + new ToolTipWrapper("matchacross", "The resulttag and answertag name results. The
" + + "operator is applied against values in different
" + + "timestamped sets. For example, a \"string_diff\"
" + + "operator would require the named results to have
" + + "at least two distinct values in different
" + + "timestamped sets."), + // 3 + new ToolTipWrapper("boolean", "The goal value is computed from a boolean expression
" + + "consisting of goal_id’s and boolean operators, (\"and\",
" + + "\"or\", \"and_not\", \"or_not\", and \"not\"), and parenthisis
" + + "for precedence. The goal_id’s must be from goals defined
" + + "earlier in the goals.config file, or boolean results
" + + "from results.config. The goal evalutes to
" + + "TRUE if the boolen expression evaluates to TRUE for any
" + + "of the timestamped sets of goal_ids, (see the ’matchany’
" + + "discussion above). The goal_id’s cannot include any
" + + "\"matchacross\" goals. NOTE: evaluation is within
" + + "timestamped sets. If you want to evaluate across
" + + "timestamps, use the count_greater_operator below."), + // 4 + new ToolTipWrapper("count_greater", "The goal is TRUE if the count of TRUE subgoals in the
" + + "list exceeds the given value. The subgoals are
" + + "summed across all timestamps. The subgoal list is
" + + "comma-separated within parenthesis."), + // 5 + new ToolTipWrapper("time_before", "Both goal1 and goal2 must be goal_ids from previous
" + + "matchany, or boolean values from results.config
" + + "A timestamped goal is created for each goal2
" + + "timestamped instance whose timestamp is proceeded
" + + "by a goal1 timestamped instance. The goal for that
" + + "timestamp will be TRUE if the goal2
" + + "instance is TRUE, and at least one of the goal1
" + + "instances is TRUE. These timestamped goals can
" + + "then be evaluated within boolean goals."), + // 6 + new ToolTipWrapper("time_during", "Both goal1 and goal2 must be goal_ids from previous
" + + "matchany goal types, or boolean values from
" + + "results.config. Timestamps include a start and end
" + + "time, reflecting when the program starts and when it
" + + "terminates. A timestamped goal is created for each
" + + "goal2 range that encompasses a goal1 timestamp.
" + + "The goal for that timestamp will be TRUE if the
" + + "goal2 instance is TRUE, and at least one goal1 instance
" + + "is TRUE. These timestamped goals can then be
" + + "evaluated within boolean goals."), + // 7 + new ToolTipWrapper("time_not_during", "Similar to time_during, but timestamped goals are
" + + "always created for each goal2. Each such goal is True
" + + "unless one or more goal1 times occur within a True goal2
" + + "range."), + // 8 + new ToolTipWrapper("execute", "The is treated as a file name of a script to
" + + "execute, with the resulttag and answertag passed to the
" + + "script as arguments. The resulttag is expected to be
" + + "one of the symbolic names defined in the results.config
" + + "file, while the answertag is expected to be a literal
" + + "value or the symbolic name in the parameters.config file
" + + "Note: the answertag cannot be a symbolic name from
" + + "results.config"), + // 9 + new ToolTipWrapper("count_value", "If the remainder of the line only includes a resulttag,
" + + "then the goal value is assigned the quanity of
" + + "timestamped files containing the given resulttag.
" + + "Otherwise the goal value is assigned the
" + + "quantity of timestamped files having results
" + + "that satisfy the given operator and arguments."), + // 10 + new ToolTipWrapper("count_matches", "If the remainder of the line only includes a resulttag,
" + + "then the goal value is assigned the quanity of
" + + "timestamped files containing the given resulttag.
" + + "Otherwise the goal value is assigned the
" + + "quantity of timestamped files having results
" + + "that satisfy the given operator and arguments."), + // 11 + new ToolTipWrapper("value", "The goal value is assigned the given resulttag value from
" + + "the most recent timestamped file that contains the resulttag."), + // 12 + new ToolTipWrapper("value_sum", "The goal value is assigned the sum of all the given
" + + "resulttag values."), + // 13 + new ToolTipWrapper("value_max", "The goal value is assigned the maximum resulttag value
" + + ""), + + // 14 + new ToolTipWrapper("matchExpression", "The resultTag is an arithmetic expression")}; + + + public static final ToolTipWrapper[] Operator_ITEMS = new ToolTipWrapper[] { + // 0 + new ToolTipWrapper("string_equal", "The strings derived from answertag and resulttag
" + + "are equal."), + // 1 + new ToolTipWrapper("string_diff", "The line_id is an integer line number
" + + "(starting at one). Use of this to identify
" + + "lines is discouraged since minor lab changes
" + + "might alter the count."), + // 2 + new ToolTipWrapper("string_start", "the line_id is a string. This names the
" + + "first occurrence of a line that starts with
" + + "this string." ), + // 3 + new ToolTipWrapper("string_end", "The line_id is a string. This names the
" + + "first occurrence of a line that contains the
" + + "string." ), + // 4 + new ToolTipWrapper("string_contains", "The line_id is a regular expression. This names the
" + + "first occurrence of a line that matches the regular
" + + "expression. Also see the \"GROUP\" field_type." ), + + // 5 + new ToolTipWrapper("integer_equal", "The line_id is a regular expression. This names the
" + + "first occurrence of a line that matches the regular
" + + "expression. Also see the \"GROUP\" field_type." ), + + // 6 + new ToolTipWrapper("integer_greater", "The line_id is a regular expression. This names the
" + + "first occurrence of a line that matches the regular
" + + "expression. Also see the \"GROUP\" field_type." ), + + // 7 + new ToolTipWrapper("integer_lessthan", "The line_id is a regular expression. This names the
" + + "first occurrence of a line that matches the regular
" + + "expression. Also see the \"GROUP\" field_type." ), + + // 8 + new ToolTipWrapper("hash_equal", "The resulttag value is hashed using the Lab Master Seed
"+ + "defined in the start.config. That is compared with
"+ + "the answertag, which should have been generated by
"+ + "the hash-goals.py utility")}; + + public static final ToolTipWrapper[] Answer_ITEMS = new ToolTipWrapper[] { + //0 + new ToolTipWrapper("Literal", "blahblahblahblah booleanResultTypes = new ArrayList(Arrays.asList( + "CONTAINS", + "FILE_REGEX", + "LOG_TS", + "FILE_REGEX_TS", + "LOG_RANGE", + "RANGE_REGEX", + "TIME_DELIM" + )); + + //Input format 1: [operator : resultTag : answerTag] + public static final ArrayList opInput = new ArrayList(Arrays.asList( + "matchany", + "matchlast", + "matchacross", + "count_matches" + )); + + //Input format 2: [goal1 : goal2] + public static final ArrayList goalInput = new ArrayList(Arrays.asList( + "time_before", + "time_during", + "time_not_during" + )); + + //Input format 2: [resultTag] + public static final ArrayList resultTagInput = new ArrayList(Arrays.asList( + "count_value", + "value", + "value_sum", + "value_max" + )); +} diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/CompareTextFiles.java b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/CompareTextFiles.java new file mode 100644 index 000000000..ce91dd89f --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/CompareTextFiles.java @@ -0,0 +1,111 @@ +/* +This software was created by United States Government employees at +The Center for Cybersecurity and Cyber Operations (C3O) +at the Naval Postgraduate School NPS. Please note that within the +United States, copyright protection is not available for any works +created by United States Government employees, pursuant to Title 17 +United States Code Section 105. This software is in the public +domain and is not subject to copyright. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + */ +package labtainers.mainui; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; + +public class CompareTextFiles +{ + private static boolean plainComment(String line){ + boolean retval = false; + if(line.trim().startsWith("#") && !line.contains("DOC:")){ + retval = true; + } + return retval; + } + private static String nextLine(BufferedReader br) throws IOException{ + String line = br.readLine(); + //System.out.println("nextLine line: "+line); + // when did java lose its evaluation precidence? + if(line != null){ + line = line.trim().replaceAll(" +", " "); + while(line != null && (plainComment(line) || line.trim().length() == 0)){ + line = br.readLine(); + if(line == null) + break; + line = line.trim().replaceAll(" +", " "); + } + } + return line; + } + public static boolean compare(String path1, String path2) throws IOException + { + if(path1 == null || path2 == null){ + return false; + } + BufferedReader reader1 = new BufferedReader(new FileReader(path1)); + BufferedReader reader2 = new BufferedReader(new FileReader(path2)); + String line1 = nextLine(reader1); + String line2 = nextLine(reader2); + boolean areEqual = true; + int lineNum = 1; + + while (line1 != null || line2 != null) + { + if((line1 == null && line2.trim().length()>0) || (line2 == null && line1.trim().length()>0)) + { + areEqual = false; + break; + } + else if((line1 != null && line2 != null) && (! line1.trim().equalsIgnoreCase(line2.trim()))) + { + /* + System.out.println("DIFFERENT"); + System.out.println("\t"+line1); + System.out.println("\t"+line2); + */ + areEqual = false; + break; + } + line1 = nextLine(reader1); + line2 = nextLine(reader2); + lineNum++; + } + + if(areEqual) + { + //System.out.println("Two files have same content."); + } + else + { + /* + System.out.println("Two files have different content. They differ at line "+lineNum); + System.out.println("File1 has "+line1+" and File2 has "+line2+" at line "+lineNum); + System.out.println("file1 "+path1+" file2: "+path2); + */ + } + + reader1.close(); + reader2.close(); + return areEqual; + } +} + diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/ContainerConfigAddHosts.form b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/ContainerConfigAddHosts.form new file mode 100644 index 000000000..0d3f87635 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/ContainerConfigAddHosts.form @@ -0,0 +1,93 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/ContainerConfigAddHosts.java b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/ContainerConfigAddHosts.java new file mode 100644 index 000000000..a3d262fe6 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/ContainerConfigAddHosts.java @@ -0,0 +1,209 @@ +/* +This software was created by United States Government employees at +The Center for Cybersecurity and Cyber Operations (C3O) +at the Naval Postgraduate School NPS. Please note that within the +United States, copyright protection is not available for any works +created by United States Government employees, pursuant to Title 17 +United States Code Section 105. This software is in the public +domain and is not subject to copyright. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + */ +package labtainers.mainui; + +import java.awt.Dimension; +import java.util.ArrayList; +import javax.swing.JPanel; + +/** + * + * @author Daniel Liao + */ +public class ContainerConfigAddHosts extends javax.swing.JPanel { + + /** + * Creates new form ContainerConfigAddHosts + */ + private final ContainerObjPanel parent; + public ContainerConfigAddHosts(ContainerObjPanel parent, LabData data, String type, String host, String ip, String network) { + initComponents(); + this.parent = parent; + + // IP MODE + if(type.equals("ip")){ + this.AddHostHostTF.setText(host); + this.AddHostIpTF.setText(ip); + this.AddHostNetworkCombobox.setVisible(false); + } + // NETWORK MODE + else { + //Fill the combobox with the current list of Networks + for(int i = 0;i//GEN-BEGIN:initComponents + private void initComponents() { + + AddHostIpTF = new javax.swing.JTextField(); + AddHostNetworkCombobox = new javax.swing.JComboBox<>(); + AddHostHostTF = new javax.swing.JTextField(); + AddHostDeleteButton = new javax.swing.JButton(); + + setBorder(javax.swing.BorderFactory.createEtchedBorder()); + setMaximumSize(new java.awt.Dimension(545, 58)); + setMinimumSize(new java.awt.Dimension(545, 58)); + setName(""); // NOI18N + setPreferredSize(new java.awt.Dimension(545, 58)); + + AddHostIpTF.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N + + AddHostHostTF.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N + + AddHostDeleteButton.setText("Delete"); + AddHostDeleteButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + AddHostDeleteButtonActionPerformed(evt); + } + }); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(AddHostNetworkCombobox, javax.swing.GroupLayout.PREFERRED_SIZE, 188, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(AddHostHostTF, javax.swing.GroupLayout.PREFERRED_SIZE, 213, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(AddHostIpTF, javax.swing.GroupLayout.PREFERRED_SIZE, 213, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(AddHostDeleteButton) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(AddHostNetworkCombobox, javax.swing.GroupLayout.DEFAULT_SIZE, 34, Short.MAX_VALUE) + .addComponent(AddHostHostTF, javax.swing.GroupLayout.PREFERRED_SIZE, 32, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(AddHostDeleteButton) + .addComponent(AddHostIpTF, javax.swing.GroupLayout.PREFERRED_SIZE, 32, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addContainerGap()) + ); + }// //GEN-END:initComponents + + private void AddHostDeleteButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_AddHostDeleteButtonActionPerformed + remove(); + }//GEN-LAST:event_AddHostDeleteButtonActionPerformed + + // MANIPULATION // + + // Deletes this object + protected void remove(){ + JPanel containerAddhostPanel = (JPanel)this.getParent(); + + // delete the container from the list + containerAddhostPanel.remove(this); + + // Shorten the panel height holding all the containers and resize it. + parent.containerAddHostPanelLength-=63; + containerAddhostPanel.setPreferredSize(new Dimension(0,parent.containerAddHostPanelLength)); + + // Redraw the panel containing the list of containers + containerAddhostPanel.revalidate(); + containerAddhostPanel.repaint(); + } + + // Adds network to combobox + protected void addNetworkToComboBox(String newNetworkName){ + AddHostNetworkCombobox.addItem(newNetworkName); + } + + // Deletes network from combobox + protected void deleteNetworkInComboBox(String deletedNetwork){ + AddHostNetworkCombobox.removeItem(deletedNetwork); + } + + // Updates the combobox list with the renamed network + protected void renameNetworkToComboBox(String oldNetwork, String newNetwork){ + boolean updateSelectedItem = AddHostNetworkCombobox.getSelectedItem().equals(oldNetwork); + ArrayList tmp = new ArrayList(); + + //Create new list to set as the combobox items + for(int i=0;i getNetworkCombobox(){ + return AddHostNetworkCombobox; + } + + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton AddHostDeleteButton; + private javax.swing.JTextField AddHostHostTF; + private javax.swing.JTextField AddHostIpTF; + private javax.swing.JComboBox AddHostNetworkCombobox; + // End of variables declaration//GEN-END:variables +} diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/ContainerConfigNetworksSubpanel.form b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/ContainerConfigNetworksSubpanel.form new file mode 100644 index 000000000..9e420eea8 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/ContainerConfigNetworksSubpanel.form @@ -0,0 +1,99 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/ContainerConfigNetworksSubpanel.java b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/ContainerConfigNetworksSubpanel.java new file mode 100644 index 000000000..a6d1882f1 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/ContainerConfigNetworksSubpanel.java @@ -0,0 +1,215 @@ +/* +This software was created by United States Government employees at +The Center for Cybersecurity and Cyber Operations (C3O) +at the Naval Postgraduate School NPS. Please note that within the +United States, copyright protection is not available for any works +created by United States Government employees, pursuant to Title 17 +United States Code Section 105. This software is in the public +domain and is not subject to copyright. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + */ +package labtainers.mainui; + +import java.awt.Dimension; +import java.util.ArrayList; +import javax.swing.JPanel; + +/** + * + * @author Daniel Liao + */ +public class ContainerConfigNetworksSubpanel extends javax.swing.JPanel { + + /** + * Creates new form ContainerConfigNetworksSubpanel + */ + private final ContainerObjPanel parent; + private LabData data; + public ContainerConfigNetworksSubpanel(ContainerObjPanel parent, LabData data, String network, String ip) { + initComponents(); + this.parent = parent; + this.data = data; + //Fill the combobox with the current list of Networks + for(int i = 0;i//GEN-BEGIN:initComponents + private void initComponents() { + + ContainerConfigNetworksNameCombobox = new javax.swing.JComboBox<>(); + ContainerConfigNetworksIPTextfield = new javax.swing.JTextField(); + ContainerConfigNetworksDeleteButton = new javax.swing.JButton(); + + setBorder(javax.swing.BorderFactory.createEtchedBorder()); + setMaximumSize(new java.awt.Dimension(543, 53)); + setMinimumSize(new java.awt.Dimension(543, 53)); + setPreferredSize(new java.awt.Dimension(543, 53)); + + ContainerConfigNetworksNameCombobox.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N + ContainerConfigNetworksNameCombobox.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + ContainerConfigNetworksNameComboboxActionPerformed(evt); + } + }); + + ContainerConfigNetworksIPTextfield.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N + + ContainerConfigNetworksDeleteButton.setText("Delete"); + ContainerConfigNetworksDeleteButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + ContainerConfigNetworksDeleteButtonActionPerformed(evt); + } + }); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(27, 27, 27) + .addComponent(ContainerConfigNetworksNameCombobox, javax.swing.GroupLayout.PREFERRED_SIZE, 169, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(ContainerConfigNetworksIPTextfield, javax.swing.GroupLayout.PREFERRED_SIZE, 250, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(ContainerConfigNetworksDeleteButton) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(ContainerConfigNetworksDeleteButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() + .addGap(1, 1, 1) + .addComponent(ContainerConfigNetworksIPTextfield)) + .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() + .addComponent(ContainerConfigNetworksNameCombobox, javax.swing.GroupLayout.PREFERRED_SIZE, 31, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(0, 0, Short.MAX_VALUE))) + .addContainerGap()) + ); + }// //GEN-END:initComponents + + private void ContainerConfigNetworksDeleteButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ContainerConfigNetworksDeleteButtonActionPerformed + remove(); + }//GEN-LAST:event_ContainerConfigNetworksDeleteButtonActionPerformed + + private void ContainerConfigNetworksNameComboboxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ContainerConfigNetworksNameComboboxActionPerformed + int index = ContainerConfigNetworksNameCombobox.getSelectedIndex(); + String subnet = this.data.getNetworks().get(index).mask; + String ip_part = subnet.split("/")[0]; + this.ContainerConfigNetworksIPTextfield.setText(ip_part); + }//GEN-LAST:event_ContainerConfigNetworksNameComboboxActionPerformed + + // MANIPULATION // + + // Deletes this object + protected void remove(){ + JPanel containerConfigNetworksPanel = (JPanel)this.getParent(); + // Delete the container from the list + containerConfigNetworksPanel.remove(this); + + // Shorten the panel height holding all the containers and resize it. + parent.containerConfigNetworksPanelLength-=53; + containerConfigNetworksPanel.setPreferredSize(new Dimension(0,parent.containerConfigNetworksPanelLength)); + + // Redraw the panel containing the list of containers + containerConfigNetworksPanel.revalidate(); + containerConfigNetworksPanel.repaint(); + } + + // Adds a network into the combobox + protected void addNetworkToComboBox(String newNetworkName){ + ContainerConfigNetworksNameCombobox.addItem(newNetworkName); + } + + // Deletes a network from the combobox + protected void deleteNetworkInComboBox(String deletedNetwork){ + ContainerConfigNetworksNameCombobox.removeItem(deletedNetwork); + } + + // Updates the combobox list with the renamed network + protected void renameNetworkToComboBox(String oldNetwork, String newNetwork){ + boolean updateSelectedItem = ContainerConfigNetworksNameCombobox.getSelectedItem().equals(oldNetwork); + ArrayList tmp = new ArrayList(); + + //Create new list to set as the combobox items + for(int i=0;i getNetworkComboBox(){ + return ContainerConfigNetworksNameCombobox; + } + + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton ContainerConfigNetworksDeleteButton; + private javax.swing.JTextField ContainerConfigNetworksIPTextfield; + private javax.swing.JComboBox ContainerConfigNetworksNameCombobox; + // End of variables declaration//GEN-END:variables +} diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/ContainerObjPanel.form b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/ContainerObjPanel.form new file mode 100644 index 000000000..b737434ff --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/ContainerObjPanel.form @@ -0,0 +1,1142 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/ContainerObjPanel.java b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/ContainerObjPanel.java new file mode 100644 index 000000000..d58763a6b --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/ContainerObjPanel.java @@ -0,0 +1,1456 @@ +/* +This software was created by United States Government employees at +The Center for Cybersecurity and Cyber Operations (C3O) +at the Naval Postgraduate School NPS. Please note that within the +United States, copyright protection is not available for any works +created by United States Government employees, pursuant to Title 17 +United States Code Section 105. This software is in the public +domain and is not subject to copyright. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + */ +package labtainers.mainui; + +import java.awt.Component; +import java.awt.Dimension; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStreamReader; +import javax.swing.JDialog; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JScrollBar; +import javax.swing.SwingUtilities; +import java.io.IOException; +import java.io.FileNotFoundException; +import java.util.logging.Level; +import java.util.logging.Logger; +/** + * + * @author Daniel Liao + */ +public class ContainerObjPanel extends javax.swing.JPanel { + + /** + * Creates new form ContainerObjPanel + */ + private final MainWindow mainWindow; + private final LabData.ContainerData data; + + // Constructor for loading a container object panel based on a container data object + public ContainerObjPanel(MainWindow mainWindow, LabData.ContainerData data){ + initComponents(); + //editMenu.add(fixlocalMenuItem); + //editMenu.add(editDockerMenuItem); + //editMenu.add(openShellMenuItem); + //editMenuBar.add(treataslocalMenuItem); + //editMenuBar.add(editDockerMenuItem); + editMenuBar.add(openShellMenuItem); + editMenu.add(openShellMenuItem); + this.data = data; + this.mainWindow = mainWindow; + this.containerAddHostScrollPaneBar = AddHostsScrollPane.getVerticalScrollBar(); + this.containerConfigNetworksScrollPaneBar = ContainerConfigNetworksScrollpane.getVerticalScrollBar(); + this.ContainerLabelName.setText(this.data.name); + this.RenameContainerTextfield.setVisible(false); + } + void setNameLabel(){ + String l = "Container: "+data.name+" Base: "+getBaseName(); + this.containerLabel.setText(l); + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + ContainerConfigWindow = new javax.swing.JDialog(); + containerTabPane = new javax.swing.JTabbedPane(); + ContainerConfigGeneralTab = new javax.swing.JPanel(); + UserTF = new javax.swing.JTextField(); + PasswordTF = new javax.swing.JTextField(); + TerminalQuantitySpinner = new javax.swing.JSpinner(); + TerminalGroupTextfield = new javax.swing.JTextField(); + LabGatewayTextfield = new javax.swing.JTextField(); + NoGWCheckbox = new javax.swing.JCheckBox(); + X11Checkbox = new javax.swing.JCheckBox(); + ContainerConfigNetworksAddButton = new javax.swing.JButton(); + ContainerConfigNetworksScrollpane = new javax.swing.JScrollPane(); + ContainerConfigNetworksPanel = new javax.swing.JPanel(); + containerLabel = new javax.swing.JLabel(); + NoResolveCheckbox = new javax.swing.JCheckBox(); + ResolvConfTextfield = new javax.swing.JTextField(); + ContainerConfigDockerTab = new javax.swing.JPanel(); + jLabel2 = new javax.swing.JLabel(); + jLabel3 = new javax.swing.JLabel(); + jLabel4 = new javax.swing.JLabel(); + jLabel5 = new javax.swing.JLabel(); + RegistryTextfield = new javax.swing.JTextField(); + PublishTextfield = new javax.swing.JTextField(); + BaseRegistryTextfield = new javax.swing.JTextField(); + NoPrivilegeCheckbox = new javax.swing.JCheckBox(); + EditDockerfileButton = new javax.swing.JButton(); + ContainerConfigNetworkTab = new javax.swing.JPanel(); + AddHostsScrollPane = new javax.swing.JScrollPane(); + AddHostsSubPanel = new javax.swing.JPanel(); + AddHostLabel3 = new javax.swing.JLabel(); + ContainerConfigAddHostIPButton = new javax.swing.JButton(); + ContainerConfigAddHostNetworkButton = new javax.swing.JButton(); + ContainerConfigGNS3Tab = new javax.swing.JPanel(); + ThumbVolumeLabel = new javax.swing.JLabel(); + HideLabel = new javax.swing.JLabel(); + ThumbCommandLabel = new javax.swing.JLabel(); + ThumbStopLabel = new javax.swing.JLabel(); + ThumbStopTextfield = new javax.swing.JTextField(); + ThumbVolumeTextfield = new javax.swing.JTextField(); + ThumbCommandTextfield = new javax.swing.JTextField(); + HideCheckbox = new javax.swing.JCheckBox(); + ContainerConfigOtherTab = new javax.swing.JPanel(); + jLabel8 = new javax.swing.JLabel(); + jLabel10 = new javax.swing.JLabel(); + jLabel11 = new javax.swing.JLabel(); + jLabel12 = new javax.swing.JLabel(); + XtermTitleTextfield = new javax.swing.JTextField(); + XtermScriptTextfield = new javax.swing.JTextField(); + MyStuffCheckbox = new javax.swing.JCheckBox(); + NoPullCheckbox = new javax.swing.JCheckBox(); + ClonesSpinner = new javax.swing.JSpinner(); + jLabel13 = new javax.swing.JLabel(); + MountTextfield1 = new javax.swing.JTextField(); + MountTextfield2 = new javax.swing.JTextField(); + TapRadioButton = new javax.swing.JRadioButton(); + WaitForTextField = new javax.swing.JTextField(); + NumCPUTextField = new javax.swing.JTextField(); + CPUSetTextField = new javax.swing.JTextField(); + NoParamCheckbox = new javax.swing.JCheckBox(); + ContainerConfigUpdateButton = new javax.swing.JButton(); + ContainerConfigCancelButton = new javax.swing.JButton(); + jMenuBar1 = new javax.swing.JMenuBar(); + editMenuBar = new javax.swing.JMenu(); + editDockerMenuItem = new javax.swing.JMenuItem(); + fixlocalMenuItem = new javax.swing.JMenuItem(); + treataslocalMenuItem = new javax.swing.JMenuItem(); + openShellMenu = new javax.swing.JMenuItem(); + precheckMenuItem = new javax.swing.JMenuItem(); + ContainerRightClick = new javax.swing.JPopupMenu(); + editMenu = new javax.swing.JMenu(); + editDockerMenuItem1 = new javax.swing.JMenuItem(); + fixlocalMenuItem1 = new javax.swing.JMenuItem(); + treataslocalMenuItem1 = new javax.swing.JMenuItem(); + precheckMenuItem1 = new javax.swing.JMenuItem(); + openShellMenuItem = new javax.swing.JMenuItem(); + renameContainerOption = new javax.swing.JMenuItem(); + jSeparator1 = new javax.swing.JPopupMenu.Separator(); + deleteContainerOption = new javax.swing.JMenuItem(); + copyContainerMenuItem = new javax.swing.JMenuItem(); + ContainerLabelName = new javax.swing.JLabel(); + RenameContainerTextfield = new javax.swing.JTextField(); + + ContainerConfigWindow.setTitle("Container Configuration: "); + ContainerConfigWindow.setMinimumSize(new java.awt.Dimension(601, 700)); + ContainerConfigWindow.setResizable(false); + ContainerConfigWindow.addWindowListener(new java.awt.event.WindowAdapter() { + public void windowClosing(java.awt.event.WindowEvent evt) { + ContainerConfigWindowWindowClosing(evt); + } + }); + + containerTabPane.setBorder(javax.swing.BorderFactory.createEtchedBorder()); + + UserTF.setFont(new java.awt.Font("Arial", 0, 18)); // NOI18N + UserTF.setText("ubuntu"); + UserTF.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "User name", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Dialog", 1, 14))); // NOI18N + + PasswordTF.setFont(new java.awt.Font("Arial", 0, 18)); // NOI18N + PasswordTF.setToolTipText("Defaults to user name."); + PasswordTF.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Password", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Dialog", 1, 14))); // NOI18N + PasswordTF.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + PasswordTFActionPerformed(evt); + } + }); + + TerminalQuantitySpinner.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N + TerminalQuantitySpinner.setModel(new javax.swing.SpinnerNumberModel(1, -1, null, 1)); + TerminalQuantitySpinner.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Terminal quantity", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Dialog", 1, 14))); // NOI18N + + TerminalGroupTextfield.setFont(new java.awt.Font("Arial", 0, 14)); // NOI18N + TerminalGroupTextfield.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Terminal group", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Dialog", 1, 14))); // NOI18N + + LabGatewayTextfield.setFont(new java.awt.Font("Ubuntu", 0, 18)); // NOI18N + LabGatewayTextfield.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Lab Gateway", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Dialog", 1, 14))); // NOI18N + + NoGWCheckbox.setFont(new java.awt.Font("Dialog", 1, 14)); // NOI18N + NoGWCheckbox.setText("No external gateway"); + + X11Checkbox.setFont(new java.awt.Font("Dialog", 1, 14)); // NOI18N + X11Checkbox.setText("X11 enabled"); + + ContainerConfigNetworksAddButton.setText("Add"); + ContainerConfigNetworksAddButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + ContainerConfigNetworksAddButtonActionPerformed(evt); + } + }); + + ContainerConfigNetworksScrollpane.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Networks", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Dialog", 1, 14))); // NOI18N + ContainerConfigNetworksScrollpane.setMaximumSize(new java.awt.Dimension(541, 32767)); + ContainerConfigNetworksScrollpane.setMinimumSize(new java.awt.Dimension(541, 136)); + ContainerConfigNetworksScrollpane.setPreferredSize(new java.awt.Dimension(541, 136)); + + ContainerConfigNetworksPanel.setMaximumSize(new java.awt.Dimension(541, 32767)); + ContainerConfigNetworksPanel.setMinimumSize(new java.awt.Dimension(0, 0)); + ContainerConfigNetworksPanel.setPreferredSize(new java.awt.Dimension(0, 0)); + ContainerConfigNetworksScrollpane.setViewportView(ContainerConfigNetworksPanel); + + containerLabel.setFont(new java.awt.Font("Ubuntu", 1, 18)); // NOI18N + containerLabel.setText("jLabel6"); + + NoResolveCheckbox.setFont(new java.awt.Font("Dialog", 1, 14)); // NOI18N + NoResolveCheckbox.setText("No resolv.conf server"); + NoResolveCheckbox.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + NoResolveCheckboxActionPerformed(evt); + } + }); + + ResolvConfTextfield.setFont(new java.awt.Font("Ubuntu", 0, 18)); // NOI18N + ResolvConfTextfield.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "nameserver", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Dialog", 1, 14))); // NOI18N + + javax.swing.GroupLayout ContainerConfigGeneralTabLayout = new javax.swing.GroupLayout(ContainerConfigGeneralTab); + ContainerConfigGeneralTab.setLayout(ContainerConfigGeneralTabLayout); + ContainerConfigGeneralTabLayout.setHorizontalGroup( + ContainerConfigGeneralTabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(ContainerConfigGeneralTabLayout.createSequentialGroup() + .addContainerGap() + .addGroup(ContainerConfigGeneralTabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(ContainerConfigGeneralTabLayout.createSequentialGroup() + .addComponent(containerLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addContainerGap()) + .addGroup(ContainerConfigGeneralTabLayout.createSequentialGroup() + .addComponent(ContainerConfigNetworksAddButton) + .addGap(0, 0, Short.MAX_VALUE)) + .addGroup(ContainerConfigGeneralTabLayout.createSequentialGroup() + .addGroup(ContainerConfigGeneralTabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(UserTF, javax.swing.GroupLayout.PREFERRED_SIZE, 209, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(PasswordTF, javax.swing.GroupLayout.PREFERRED_SIZE, 209, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(ResolvConfTextfield, javax.swing.GroupLayout.PREFERRED_SIZE, 244, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(LabGatewayTextfield, javax.swing.GroupLayout.PREFERRED_SIZE, 244, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(ContainerConfigGeneralTabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(ContainerConfigGeneralTabLayout.createSequentialGroup() + .addGap(91, 91, 91) + .addGroup(ContainerConfigGeneralTabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(TerminalQuantitySpinner, javax.swing.GroupLayout.PREFERRED_SIZE, 186, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(TerminalGroupTextfield, javax.swing.GroupLayout.PREFERRED_SIZE, 189, javax.swing.GroupLayout.PREFERRED_SIZE))) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, ContainerConfigGeneralTabLayout.createSequentialGroup() + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(ContainerConfigGeneralTabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(NoGWCheckbox, javax.swing.GroupLayout.PREFERRED_SIZE, 217, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(X11Checkbox, javax.swing.GroupLayout.PREFERRED_SIZE, 200, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(NoResolveCheckbox)) + .addGap(22, 22, 22)))) + .addComponent(ContainerConfigNetworksScrollpane, javax.swing.GroupLayout.DEFAULT_SIZE, 560, Short.MAX_VALUE))) + ); + ContainerConfigGeneralTabLayout.setVerticalGroup( + ContainerConfigGeneralTabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(ContainerConfigGeneralTabLayout.createSequentialGroup() + .addGroup(ContainerConfigGeneralTabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addGroup(ContainerConfigGeneralTabLayout.createSequentialGroup() + .addComponent(containerLabel) + .addGap(18, 18, 18) + .addGroup(ContainerConfigGeneralTabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(ContainerConfigGeneralTabLayout.createSequentialGroup() + .addComponent(TerminalQuantitySpinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(TerminalGroupTextfield, javax.swing.GroupLayout.PREFERRED_SIZE, 65, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(ContainerConfigGeneralTabLayout.createSequentialGroup() + .addComponent(UserTF, javax.swing.GroupLayout.PREFERRED_SIZE, 54, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(PasswordTF, javax.swing.GroupLayout.PREFERRED_SIZE, 53, javax.swing.GroupLayout.PREFERRED_SIZE))) + .addGap(14, 14, 14) + .addComponent(LabGatewayTextfield, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(18, 18, 18) + .addComponent(ResolvConfTextfield, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(ContainerConfigGeneralTabLayout.createSequentialGroup() + .addComponent(X11Checkbox) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(NoGWCheckbox, javax.swing.GroupLayout.PREFERRED_SIZE, 35, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(NoResolveCheckbox))) + .addGap(35, 35, 35) + .addComponent(ContainerConfigNetworksAddButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(ContainerConfigNetworksScrollpane, javax.swing.GroupLayout.DEFAULT_SIZE, 200, Short.MAX_VALUE)) + ); + + containerTabPane.addTab("General ", ContainerConfigGeneralTab); + + jLabel2.setFont(new java.awt.Font("Arial", 1, 14)); // NOI18N + jLabel2.setText("Base Registry:"); + + jLabel3.setFont(new java.awt.Font("Arial", 1, 14)); // NOI18N + jLabel3.setText("Registry:"); + + jLabel4.setFont(new java.awt.Font("Arial", 1, 14)); // NOI18N + jLabel4.setText("No Privilege:"); + + jLabel5.setFont(new java.awt.Font("Arial", 1, 14)); // NOI18N + jLabel5.setText("Publish:"); + jLabel5.setToolTipText("Optional arguments to the Docker --publish argument for
\nmaking container ports visible at the host interface. For example, a value of
\n127.0.0.1:60022:22/tcp
\nwill bind host port 60022 to container port 22."); + + RegistryTextfield.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N + + PublishTextfield.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N + + BaseRegistryTextfield.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N + + EditDockerfileButton.setText("Edit Dockerfile"); + EditDockerfileButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + EditDockerfileButtonActionPerformed(evt); + } + }); + + javax.swing.GroupLayout ContainerConfigDockerTabLayout = new javax.swing.GroupLayout(ContainerConfigDockerTab); + ContainerConfigDockerTab.setLayout(ContainerConfigDockerTabLayout); + ContainerConfigDockerTabLayout.setHorizontalGroup( + ContainerConfigDockerTabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(ContainerConfigDockerTabLayout.createSequentialGroup() + .addGap(25, 25, 25) + .addGroup(ContainerConfigDockerTabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(jLabel4) + .addComponent(jLabel2) + .addComponent(jLabel3) + .addComponent(jLabel5)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(ContainerConfigDockerTabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(ContainerConfigDockerTabLayout.createSequentialGroup() + .addGap(0, 0, Short.MAX_VALUE) + .addComponent(EditDockerfileButton)) + .addGroup(ContainerConfigDockerTabLayout.createSequentialGroup() + .addGroup(ContainerConfigDockerTabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(PublishTextfield, javax.swing.GroupLayout.PREFERRED_SIZE, 188, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(BaseRegistryTextfield, javax.swing.GroupLayout.PREFERRED_SIZE, 188, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(RegistryTextfield, javax.swing.GroupLayout.PREFERRED_SIZE, 188, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(NoPrivilegeCheckbox)) + .addGap(0, 221, Short.MAX_VALUE))) + .addContainerGap()) + ); + ContainerConfigDockerTabLayout.setVerticalGroup( + ContainerConfigDockerTabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(ContainerConfigDockerTabLayout.createSequentialGroup() + .addGap(24, 24, 24) + .addComponent(EditDockerfileButton) + .addGap(14, 14, 14) + .addGroup(ContainerConfigDockerTabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(RegistryTextfield, javax.swing.GroupLayout.PREFERRED_SIZE, 32, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel3)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(ContainerConfigDockerTabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(BaseRegistryTextfield, javax.swing.GroupLayout.PREFERRED_SIZE, 32, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel2)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(ContainerConfigDockerTabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(PublishTextfield, javax.swing.GroupLayout.PREFERRED_SIZE, 32, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel5)) + .addGap(18, 18, 18) + .addGroup(ContainerConfigDockerTabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jLabel4) + .addComponent(NoPrivilegeCheckbox)) + .addContainerGap(338, Short.MAX_VALUE)) + ); + + containerTabPane.addTab("Docker", ContainerConfigDockerTab); + + AddHostsScrollPane.setMaximumSize(new java.awt.Dimension(548, 32767)); + AddHostsScrollPane.setMinimumSize(new java.awt.Dimension(548, 19)); + AddHostsScrollPane.setPreferredSize(new java.awt.Dimension(548, 100)); + + AddHostsSubPanel.setMaximumSize(new java.awt.Dimension(0, 0)); + AddHostsSubPanel.setMinimumSize(new java.awt.Dimension(0, 0)); + AddHostsSubPanel.setPreferredSize(new java.awt.Dimension(0, 0)); + AddHostsScrollPane.setViewportView(AddHostsSubPanel); + + AddHostLabel3.setFont(new java.awt.Font("Arial", 1, 14)); // NOI18N + AddHostLabel3.setText("Add-Hosts:"); + + ContainerConfigAddHostIPButton.setText("Add Host:IP"); + ContainerConfigAddHostIPButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + ContainerConfigAddHostIPButtonActionPerformed(evt); + } + }); + + ContainerConfigAddHostNetworkButton.setText("Add Network"); + ContainerConfigAddHostNetworkButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + ContainerConfigAddHostNetworkButtonActionPerformed(evt); + } + }); + + javax.swing.GroupLayout ContainerConfigNetworkTabLayout = new javax.swing.GroupLayout(ContainerConfigNetworkTab); + ContainerConfigNetworkTab.setLayout(ContainerConfigNetworkTabLayout); + ContainerConfigNetworkTabLayout.setHorizontalGroup( + ContainerConfigNetworkTabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(ContainerConfigNetworkTabLayout.createSequentialGroup() + .addContainerGap() + .addGroup(ContainerConfigNetworkTabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(AddHostsScrollPane, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(ContainerConfigNetworkTabLayout.createSequentialGroup() + .addComponent(AddHostLabel3) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(ContainerConfigAddHostIPButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(ContainerConfigAddHostNetworkButton) + .addGap(0, 0, Short.MAX_VALUE))) + .addContainerGap()) + ); + ContainerConfigNetworkTabLayout.setVerticalGroup( + ContainerConfigNetworkTabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, ContainerConfigNetworkTabLayout.createSequentialGroup() + .addGap(15, 15, 15) + .addGroup(ContainerConfigNetworkTabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(AddHostLabel3) + .addComponent(ContainerConfigAddHostIPButton) + .addComponent(ContainerConfigAddHostNetworkButton)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(AddHostsScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 505, Short.MAX_VALUE) + .addContainerGap()) + ); + + containerTabPane.addTab("Hosts", ContainerConfigNetworkTab); + + ThumbVolumeLabel.setFont(new java.awt.Font("Arial", 1, 14)); // NOI18N + ThumbVolumeLabel.setText("Thumb Volume:"); + + HideLabel.setFont(new java.awt.Font("Arial", 1, 14)); // NOI18N + HideLabel.setText("Hide:"); + + ThumbCommandLabel.setFont(new java.awt.Font("Arial", 1, 14)); // NOI18N + ThumbCommandLabel.setText("Thumb Command:"); + + ThumbStopLabel.setFont(new java.awt.Font("Arial", 1, 14)); // NOI18N + ThumbStopLabel.setText("Thumb Stop:"); + + javax.swing.GroupLayout ContainerConfigGNS3TabLayout = new javax.swing.GroupLayout(ContainerConfigGNS3Tab); + ContainerConfigGNS3Tab.setLayout(ContainerConfigGNS3TabLayout); + ContainerConfigGNS3TabLayout.setHorizontalGroup( + ContainerConfigGNS3TabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(ContainerConfigGNS3TabLayout.createSequentialGroup() + .addContainerGap() + .addGroup(ContainerConfigGNS3TabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(ThumbStopLabel) + .addComponent(ThumbCommandLabel) + .addComponent(ThumbVolumeLabel) + .addComponent(HideLabel)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(ContainerConfigGNS3TabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(ThumbStopTextfield, javax.swing.GroupLayout.PREFERRED_SIZE, 189, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(ThumbVolumeTextfield, javax.swing.GroupLayout.PREFERRED_SIZE, 189, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(ThumbCommandTextfield, javax.swing.GroupLayout.PREFERRED_SIZE, 189, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(HideCheckbox)) + .addContainerGap(216, Short.MAX_VALUE)) + ); + ContainerConfigGNS3TabLayout.setVerticalGroup( + ContainerConfigGNS3TabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(ContainerConfigGNS3TabLayout.createSequentialGroup() + .addGap(21, 21, 21) + .addGroup(ContainerConfigGNS3TabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(ThumbVolumeTextfield, javax.swing.GroupLayout.PREFERRED_SIZE, 32, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(ThumbVolumeLabel)) + .addGap(18, 18, 18) + .addGroup(ContainerConfigGNS3TabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(ThumbCommandTextfield, javax.swing.GroupLayout.PREFERRED_SIZE, 32, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(ThumbCommandLabel)) + .addGap(18, 18, 18) + .addGroup(ContainerConfigGNS3TabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(ThumbStopTextfield, javax.swing.GroupLayout.PREFERRED_SIZE, 32, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(ThumbStopLabel)) + .addGap(18, 18, 18) + .addGroup(ContainerConfigGNS3TabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(HideLabel) + .addComponent(HideCheckbox)) + .addContainerGap(373, Short.MAX_VALUE)) + ); + + containerTabPane.addTab("GNS3", ContainerConfigGNS3Tab); + + jLabel8.setFont(new java.awt.Font("Arial", 1, 14)); // NOI18N + jLabel8.setText("Xterm:"); + + jLabel10.setFont(new java.awt.Font("Arial", 1, 14)); // NOI18N + jLabel10.setText("# of Clones:"); + + jLabel11.setFont(new java.awt.Font("Arial", 1, 14)); // NOI18N + jLabel11.setText("No Pull:"); + + jLabel12.setFont(new java.awt.Font("Arial", 1, 14)); // NOI18N + jLabel12.setText("My Stuff:"); + + XtermTitleTextfield.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N + + XtermScriptTextfield.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N + + ClonesSpinner.setModel(new javax.swing.SpinnerNumberModel(0, 0, null, 1)); + ClonesSpinner.setMinimumSize(new java.awt.Dimension(45, 20)); + ClonesSpinner.setPreferredSize(new java.awt.Dimension(45, 20)); + + jLabel13.setFont(new java.awt.Font("Arial", 1, 14)); // NOI18N + jLabel13.setText("Mount:"); + + MountTextfield1.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N + + MountTextfield2.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N + + TapRadioButton.setFont(new java.awt.Font("Ubuntu", 1, 15)); // NOI18N + TapRadioButton.setText("Tap"); + + WaitForTextField.setBorder(javax.swing.BorderFactory.createTitledBorder("Wait for")); + + NumCPUTextField.setBorder(javax.swing.BorderFactory.createTitledBorder("Num CPUs")); + + CPUSetTextField.setBorder(javax.swing.BorderFactory.createTitledBorder("CPU Set")); + + NoParamCheckbox.setText("No Parameterize"); + NoParamCheckbox.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + NoParamCheckboxActionPerformed(evt); + } + }); + + javax.swing.GroupLayout ContainerConfigOtherTabLayout = new javax.swing.GroupLayout(ContainerConfigOtherTab); + ContainerConfigOtherTab.setLayout(ContainerConfigOtherTabLayout); + ContainerConfigOtherTabLayout.setHorizontalGroup( + ContainerConfigOtherTabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(ContainerConfigOtherTabLayout.createSequentialGroup() + .addContainerGap() + .addGroup(ContainerConfigOtherTabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(ContainerConfigOtherTabLayout.createSequentialGroup() + .addComponent(jLabel8) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(XtermTitleTextfield, javax.swing.GroupLayout.PREFERRED_SIZE, 189, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(XtermScriptTextfield, javax.swing.GroupLayout.PREFERRED_SIZE, 189, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(ContainerConfigOtherTabLayout.createSequentialGroup() + .addGroup(ContainerConfigOtherTabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(ContainerConfigOtherTabLayout.createSequentialGroup() + .addComponent(jLabel10) + .addGap(4, 4, 4) + .addComponent(ClonesSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, 45, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(TapRadioButton) + .addComponent(NoParamCheckbox)) + .addGroup(ContainerConfigOtherTabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(ContainerConfigOtherTabLayout.createSequentialGroup() + .addGap(110, 110, 110) + .addComponent(NoPullCheckbox) + .addGap(18, 18, 18) + .addComponent(jLabel12) + .addGap(6, 6, 6) + .addComponent(MyStuffCheckbox)) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, ContainerConfigOtherTabLayout.createSequentialGroup() + .addGap(46, 46, 46) + .addComponent(WaitForTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 153, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(98, 98, 98)))) + .addGroup(ContainerConfigOtherTabLayout.createSequentialGroup() + .addComponent(NumCPUTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 160, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(28, 28, 28) + .addComponent(CPUSetTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 158, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(ContainerConfigOtherTabLayout.createSequentialGroup() + .addGroup(ContainerConfigOtherTabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(jLabel11) + .addGroup(ContainerConfigOtherTabLayout.createSequentialGroup() + .addComponent(jLabel13) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(MountTextfield1, javax.swing.GroupLayout.PREFERRED_SIZE, 189, javax.swing.GroupLayout.PREFERRED_SIZE))) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(MountTextfield2, javax.swing.GroupLayout.PREFERRED_SIZE, 189, javax.swing.GroupLayout.PREFERRED_SIZE))) + .addContainerGap(103, Short.MAX_VALUE)) + ); + ContainerConfigOtherTabLayout.setVerticalGroup( + ContainerConfigOtherTabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(ContainerConfigOtherTabLayout.createSequentialGroup() + .addGap(18, 18, 18) + .addGroup(ContainerConfigOtherTabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel8) + .addComponent(XtermTitleTextfield, javax.swing.GroupLayout.PREFERRED_SIZE, 32, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(XtermScriptTextfield, javax.swing.GroupLayout.PREFERRED_SIZE, 32, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(ContainerConfigOtherTabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel13) + .addComponent(MountTextfield1, javax.swing.GroupLayout.PREFERRED_SIZE, 32, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(MountTextfield2, javax.swing.GroupLayout.PREFERRED_SIZE, 32, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(ContainerConfigOtherTabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(ContainerConfigOtherTabLayout.createSequentialGroup() + .addGap(18, 18, 18) + .addGroup(ContainerConfigOtherTabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(MyStuffCheckbox, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGroup(ContainerConfigOtherTabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(NoPullCheckbox, javax.swing.GroupLayout.PREFERRED_SIZE, 35, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGroup(ContainerConfigOtherTabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel10) + .addComponent(ClonesSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, 34, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel11))))) + .addGroup(ContainerConfigOtherTabLayout.createSequentialGroup() + .addGap(26, 26, 26) + .addComponent(jLabel12))) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(ContainerConfigOtherTabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(ContainerConfigOtherTabLayout.createSequentialGroup() + .addComponent(TapRadioButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(NoParamCheckbox)) + .addComponent(WaitForTextField, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 61, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(ContainerConfigOtherTabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(NumCPUTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 56, Short.MAX_VALUE) + .addComponent(CPUSetTextField)) + .addContainerGap(281, Short.MAX_VALUE)) + ); + + containerTabPane.addTab("Other", ContainerConfigOtherTab); + + ContainerConfigUpdateButton.setText("OK"); + ContainerConfigUpdateButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + ContainerConfigUpdateButtonActionPerformed(evt); + } + }); + + ContainerConfigCancelButton.setText("Cancel"); + ContainerConfigCancelButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + ContainerConfigCancelButtonActionPerformed(evt); + } + }); + + editMenuBar.setText("Edit"); + + editDockerMenuItem.setText("dockerfile"); + editDockerMenuItem.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + editDockerMenuItemActionPerformed(evt); + } + }); + editMenuBar.add(editDockerMenuItem); + + fixlocalMenuItem.setText("fixlocal"); + fixlocalMenuItem.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + fixlocalMenuItemActionPerformed(evt); + } + }); + editMenuBar.add(fixlocalMenuItem); + + treataslocalMenuItem.setText("treataslocal"); + treataslocalMenuItem.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + treataslocalMenuItemActionPerformed(evt); + } + }); + editMenuBar.add(treataslocalMenuItem); + + openShellMenu.setText("Open shell"); + openShellMenu.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + openShellMenuActionPerformed(evt); + } + }); + editMenuBar.add(openShellMenu); + + precheckMenuItem.setText("precheck"); + precheckMenuItem.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + precheckMenuItemActionPerformed(evt); + } + }); + editMenuBar.add(precheckMenuItem); + + jMenuBar1.add(editMenuBar); + + ContainerConfigWindow.setJMenuBar(jMenuBar1); + + javax.swing.GroupLayout ContainerConfigWindowLayout = new javax.swing.GroupLayout(ContainerConfigWindow.getContentPane()); + ContainerConfigWindow.getContentPane().setLayout(ContainerConfigWindowLayout); + ContainerConfigWindowLayout.setHorizontalGroup( + ContainerConfigWindowLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(ContainerConfigWindowLayout.createSequentialGroup() + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(ContainerConfigUpdateButton, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(18, 18, 18) + .addComponent(ContainerConfigCancelButton, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE) + .addContainerGap()) + .addGroup(ContainerConfigWindowLayout.createSequentialGroup() + .addComponent(containerTabPane, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(0, 2, Short.MAX_VALUE)) + ); + ContainerConfigWindowLayout.setVerticalGroup( + ContainerConfigWindowLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, ContainerConfigWindowLayout.createSequentialGroup() + .addComponent(containerTabPane, javax.swing.GroupLayout.PREFERRED_SIZE, 606, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 31, Short.MAX_VALUE) + .addGroup(ContainerConfigWindowLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(ContainerConfigUpdateButton) + .addComponent(ContainerConfigCancelButton)) + .addGap(10, 10, 10)) + ); + + editMenu.setText("Edit..."); + + editDockerMenuItem1.setText("dockerfile"); + editDockerMenuItem1.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + editDockerMenuItem1ActionPerformed(evt); + } + }); + editMenu.add(editDockerMenuItem1); + + fixlocalMenuItem1.setText("fixlocal"); + fixlocalMenuItem1.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + fixlocalMenuItem1ActionPerformed(evt); + } + }); + editMenu.add(fixlocalMenuItem1); + + treataslocalMenuItem1.setText("treataslocal"); + treataslocalMenuItem1.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + treataslocalMenuItem1ActionPerformed(evt); + } + }); + editMenu.add(treataslocalMenuItem1); + + precheckMenuItem1.setText("precheck"); + precheckMenuItem1.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + precheckMenuItem1ActionPerformed(evt); + } + }); + editMenu.add(precheckMenuItem1); + + ContainerRightClick.add(editMenu); + + openShellMenuItem.setText("Open shell in container dir"); + openShellMenuItem.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + openShellMenuItemActionPerformed(evt); + } + }); + ContainerRightClick.add(openShellMenuItem); + + renameContainerOption.setText("rename"); + renameContainerOption.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + renameContainerOptionActionPerformed(evt); + } + }); + ContainerRightClick.add(renameContainerOption); + ContainerRightClick.add(jSeparator1); + + deleteContainerOption.setText("delete"); + deleteContainerOption.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + deleteContainerOptionActionPerformed(evt); + } + }); + ContainerRightClick.add(deleteContainerOption); + + copyContainerMenuItem.setText("Copy"); + copyContainerMenuItem.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + copyContainerMenuItemActionPerformed(evt); + } + }); + ContainerRightClick.add(copyContainerMenuItem); + + setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED)); + setMaximumSize(new java.awt.Dimension(340, 50)); + setPreferredSize(new java.awt.Dimension(340, 50)); + addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + formMouseClicked(evt); + } + }); + + ContainerLabelName.setFont(new java.awt.Font("Arial", 1, 18)); // NOI18N + ContainerLabelName.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); + ContainerLabelName.setText("container_name"); + add(ContainerLabelName); + + RenameContainerTextfield.setFont(new java.awt.Font("Arial", 1, 18)); // NOI18N + RenameContainerTextfield.setHorizontalAlignment(javax.swing.JTextField.CENTER); + RenameContainerTextfield.setMinimumSize(new java.awt.Dimension(300, 35)); + RenameContainerTextfield.setName(""); // NOI18N + RenameContainerTextfield.setPreferredSize(new java.awt.Dimension(300, 35)); + RenameContainerTextfield.setRequestFocusEnabled(false); + RenameContainerTextfield.addFocusListener(new java.awt.event.FocusAdapter() { + public void focusLost(java.awt.event.FocusEvent evt) { + RenameContainerTextfieldFocusLost(evt); + } + }); + RenameContainerTextfield.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + RenameContainerTextfieldActionPerformed(evt); + } + }); + add(RenameContainerTextfield); + }//
//GEN-END:initComponents + + private void formMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_formMouseClicked + containerPanelClickHandler(evt); + }//GEN-LAST:event_formMouseClicked + + private void renameContainerOptionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_renameContainerOptionActionPerformed + renameContainerButton(); + }//GEN-LAST:event_renameContainerOptionActionPerformed + + private void deleteContainerOptionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deleteContainerOptionActionPerformed + deleteButton(); + }//GEN-LAST:event_deleteContainerOptionActionPerformed + + private void RenameContainerTextfieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_RenameContainerTextfieldActionPerformed + renameButton(); + }//GEN-LAST:event_RenameContainerTextfieldActionPerformed + + private void RenameContainerTextfieldFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_RenameContainerTextfieldFocusLost + // hide the textfield and show the container label + RenameContainerTextfield.setVisible(false); + ContainerLabelName.setVisible(true); + }//GEN-LAST:event_RenameContainerTextfieldFocusLost + + private void ContainerConfigWindowWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_ContainerConfigWindowWindowClosing + closeConfigWindow(); + }//GEN-LAST:event_ContainerConfigWindowWindowClosing + + private void ContainerConfigUpdateButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ContainerConfigUpdateButtonActionPerformed + updateData(); + }//GEN-LAST:event_ContainerConfigUpdateButtonActionPerformed + + private void ContainerConfigCancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ContainerConfigCancelButtonActionPerformed + closeConfigWindow(); + }//GEN-LAST:event_ContainerConfigCancelButtonActionPerformed + + private void EditDockerfileButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_EditDockerfileButtonActionPerformed + editDockerfile(); + }//GEN-LAST:event_EditDockerfileButtonActionPerformed + + private void ContainerConfigNetworksAddButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ContainerConfigNetworksAddButtonActionPerformed + addContainerNetworkSubPanel("", ""); + }//GEN-LAST:event_ContainerConfigNetworksAddButtonActionPerformed + + private void ContainerConfigAddHostIPButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ContainerConfigAddHostIPButtonActionPerformed + addAddHostSubPanel("ip","","",""); + }//GEN-LAST:event_ContainerConfigAddHostIPButtonActionPerformed + + private void ContainerConfigAddHostNetworkButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ContainerConfigAddHostNetworkButtonActionPerformed + addAddHostSubPanel("network","","",""); + }//GEN-LAST:event_ContainerConfigAddHostNetworkButtonActionPerformed + + private void editDockerMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_editDockerMenuItemActionPerformed + String dockerfilePath = mainWindow.getCurrentLab().getPath()+File.separator+"dockerfiles"+File.separator+ + "Dockerfile."+mainWindow.getLabName()+"."+this.data.name+".student"; + String cmd = mainWindow.getTextEditor()+dockerfilePath+" &"; + mainWindow.doCommand(cmd); + }//GEN-LAST:event_editDockerMenuItemActionPerformed + + private void editBin(String fname){ + String full_path = mainWindow.getCurrentLab().getPath()+File.separator+this.data.name+File.separator+"_bin"+File.separator+ + fname; + String cmd = mainWindow.getTextEditor()+full_path+" &"; + //System.out.println("full_path cmd: "+cmd); + mainWindow.doCommand(cmd); + } + private void treataslocalMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_treataslocalMenuItemActionPerformed + editBin("treataslocal"); + }//GEN-LAST:event_treataslocalMenuItemActionPerformed + + private void fixlocalMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_fixlocalMenuItemActionPerformed + editBin("fixlocal.sh"); + }//GEN-LAST:event_fixlocalMenuItemActionPerformed + + private void openShellMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_openShellMenuItemActionPerformed + String cmd = "gnome-terminal --working-directory="+mainWindow.getCurrentLab().getPath()+File.separator+data.name; + System.out.println("cmd: "+cmd); + mainWindow.doCommand(cmd); + }//GEN-LAST:event_openShellMenuItemActionPerformed + + private void editDockerMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_editDockerMenuItem1ActionPerformed + editDockerMenuItemActionPerformed(evt); + }//GEN-LAST:event_editDockerMenuItem1ActionPerformed + + private void fixlocalMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_fixlocalMenuItem1ActionPerformed + fixlocalMenuItemActionPerformed(evt); + }//GEN-LAST:event_fixlocalMenuItem1ActionPerformed + + private void treataslocalMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_treataslocalMenuItem1ActionPerformed + treataslocalMenuItemActionPerformed(evt); + }//GEN-LAST:event_treataslocalMenuItem1ActionPerformed + + private void openShellMenuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_openShellMenuActionPerformed + openShellMenuItemActionPerformed(evt); + }//GEN-LAST:event_openShellMenuActionPerformed + + private void PasswordTFActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_PasswordTFActionPerformed + // TODO add your handling code here: + }//GEN-LAST:event_PasswordTFActionPerformed + + private void precheckMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_precheckMenuItem1ActionPerformed + editBin("precheck.sh"); + }//GEN-LAST:event_precheckMenuItem1ActionPerformed + + private void precheckMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_precheckMenuItemActionPerformed + editBin("precheck.sh"); + }//GEN-LAST:event_precheckMenuItemActionPerformed + + private void copyContainerMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_copyContainerMenuItemActionPerformed + try{ + mainWindow.saveLab(false, true); + }catch (FileNotFoundException ex) { + Logger.getLogger(MainWindow.class.getName()).log(Level.SEVERE, null, ex); + return; + } + String cmd = "new_lab_setup.py -A "+this.data.name+" newcontainer"; + mainWindow.doLabCommand(cmd); + System.out.println("ran command "+cmd); + mainWindow.reloadLab(); + ContainerObjPanel newPanel = mainWindow.getContainerPanel("newcontainer"); + if(newPanel != null){ + newPanel.renameContainerButton(); + }else{ + System.out.println("Error getting new container name"); + } + }//GEN-LAST:event_copyContainerMenuItemActionPerformed + + private void NoResolveCheckboxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_NoResolveCheckboxActionPerformed + // TODO add your handling code here: + }//GEN-LAST:event_NoResolveCheckboxActionPerformed + + private void NoParamCheckboxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_NoParamCheckboxActionPerformed + // TODO add your handling code here: + }//GEN-LAST:event_NoParamCheckboxActionPerformed + + // BUTTONS/HANDLERS // + + // Handle left-click or right-click event for the container obj panel + private boolean clicked = false; + private void containerPanelClickHandler(java.awt.event.MouseEvent evt){ + if(!clicked){ + if(SwingUtilities.isLeftMouseButton(evt)){ + clicked = true; + loadDataIntoContainerPanel(); + ContainerConfigWindow.setVisible(true); + } + else if(SwingUtilities.isRightMouseButton(evt)){ + ContainerRightClick.show(this, evt.getX(), evt.getY()); + } + } + } + + // Handler for when Container Config Window closes + private void closeConfigWindow(){ + ContainerConfigWindow.setVisible(false); + clearLists(); + clicked = false; + } + + // Clears the list of Networks and Add-Hosts Container Config Window UI + private void clearLists(){ + // Clear Add-host + Component[] componentList = AddHostsSubPanel.getComponents(); + for(Component c: componentList) + AddHostsSubPanel.remove(c); + + containerAddHostPanelLength=0; + AddHostsSubPanel.setPreferredSize(new Dimension(0,containerAddHostPanelLength)); + + // Clear network + componentList = ContainerConfigNetworksPanel.getComponents(); + for(Component c: componentList) + ContainerConfigNetworksPanel.remove(c); + + containerConfigNetworksPanelLength=0; + ContainerConfigNetworksPanel.setPreferredSize(new Dimension(0,containerConfigNetworksPanelLength)); + } + + // Prompt textfield for renaming + public void renameContainerButton(){ + // Make the rename textfield visible, active, and all text inside preselected + RenameContainerTextfield.setText(this.data.name); + RenameContainerTextfield.setVisible(true); + RenameContainerTextfield.requestFocusInWindow(); + RenameContainerTextfield.selectAll(); + + // Hide the original container label + ContainerLabelName.setVisible(false); + } + + // Prompts the user to confirm deletion of container and removes all traces of the container + private void deleteButton(){ + int confirm = JOptionPane.showConfirmDialog(null, "Are you sure you want to delete the container '"+this.data.name+"'?\n"+ + "Deleting this will delete all references to this container, \n"+ + " Namely in the Results and Goals Configuration." + , "Delete Container", JOptionPane.YES_NO_OPTION); + if (confirm == JOptionPane.YES_OPTION){ + JPanel containerPanel = (JPanel)this.getParent(); + + // Delete the container from the container list in the main data object + mainWindow.getCurrentData().deleteReferenceToContainer(data.name); + + // Removes all results artifact lines with the container name in it in Results Conguration UI + if(mainWindow.getResultsUI() != null){ + mainWindow.getResultsUI().refresh(); + } + + // Remove the panel + containerPanel.remove(this); + + // Shorten the panel height holding all the containers and resize it. + mainWindow.containerPanePanelLength-=50; + containerPanel.setPreferredSize(new Dimension(0,mainWindow.containerPanePanelLength)); + + // Redraw the panel containing the list of containers + containerPanel.revalidate(); + containerPanel.repaint(); + + // Delete the container in the file system + deleteContainer(); + } + } + + // Deletes the container in the lab directory structure by calling 'new_lab_setup.py -d containername' + private void deleteContainer(){ + //call python new_lab_script to delete container + String cmd = "new_lab_setup.py -d "+this.data.name; + mainWindow.doLabCommand(cmd); + } + + // Prompts the user to confirm renaming the container + private void renameButton(){ + // Prompt user to confirm their changes + //int confirm = JOptionPane.showConfirmDialog(null, "Are you sure you want to rename the container '"+this.data.name+"' to '"+ + // RenameContainerTextfield.getText()+"'?", "Rename Container", JOptionPane.YES_NO_OPTION); + //if (confirm == JOptionPane.YES_OPTION){ + if (true){ + String newName = RenameContainerTextfield.getText(); + if(newName.equals("newcontainer")){ + JOptionPane.showMessageDialog(null, "The name 'newcontainer' is reserved and cannot b used.", "Warning", JOptionPane.WARNING_MESSAGE); + }else{ + //Refactor the mainUI's current LabData.ResultsData obj + mainWindow.getCurrentData().getResultsData().refactorContainerReference(data.name, newName); + + // Refactor the container name in the result s UI + if(mainWindow.getResultsUI() != null){ + mainWindow.getResultsUI().refactorContainerReferenceInUI(data.name, newName); + } + + // Rename the container in directory + renameContainer(this.data.name,newName); + + // Rename the container in GUI and data object + this.data.name = newName; + ContainerLabelName.setText(newName); + setNameLabel(); + } + } + + // hide the textfield and show the container label + RenameContainerTextfield.setVisible(false); + ContainerLabelName.setVisible(true); + } + + // Renames the container in the lab directory structure by calling 'new_lab_setup.py -r oldName newName' + private void renameContainer(String oldName, String newName){ + String cmd = "new_lab_setup.py -r "+oldName+" "+newName; + mainWindow.doLabCommand(cmd); + } + + // Sets the data info based on the fields in the Container Configuration Window + public void updateData(){ + // General Tab + data.user = UserTF.getText(); + if(data.user.trim().length() == 0){ + JOptionPane.showMessageDialog(null, "User name must be defined.", "Warning", JOptionPane.WARNING_MESSAGE); + return; + } + data.password = PasswordTF.getText(); + data.terminal_count = (int)TerminalQuantitySpinner.getValue(); + data.terminal_group = TerminalGroupTextfield.getText(); + data.lab_gateway = LabGatewayTextfield.getText(); + data.name_server = ResolvConfTextfield.getText(); + data.no_gw = NoGWCheckbox.isSelected(); + data.no_resolve = NoResolveCheckbox.isSelected(); + + // List of Networks + data.listOfContainerNetworks.clear(); //clear the networks so that is can be refilled with updated list of networks + Component[] networkPanels = ContainerConfigNetworksPanel.getComponents(); + for(Component component: networkPanels){ + ContainerConfigNetworksSubpanel networkPanel = (ContainerConfigNetworksSubpanel)component; + + String networkName = networkPanel.getNetwork(); + //System.out.println("hi: \'"+networkName+"\'"); + String ipAddr = networkPanel.getIP(); + data.listOfContainerNetworks.add(new LabData.ContainerNetworkSubData(networkName,ipAddr)); + } + + // Docker + data.registry = RegistryTextfield.getText(); + data.base_registry = BaseRegistryTextfield.getText(); + data.publish = PublishTextfield.getText(); + data.no_privilege = NoPrivilegeCheckbox.isSelected(); + + // Hosts + data.listOfContainerAddHost.clear(); + Component[] addhostPanels = AddHostsSubPanel.getComponents(); + for(Component component: addhostPanels){ + ContainerConfigAddHosts addhostPanel = (ContainerConfigAddHosts)component; + + //String type + String type; + if(addhostPanel.getNetworkCombobox().isVisible()) + type = "network"; + else + type = "ip"; + + String host = addhostPanel.getHost(); + String ip = addhostPanel.getIp(); + String network = addhostPanel.getNetwork(); + data.listOfContainerAddHost.add(new LabData.ContainerAddHostSubData(type, host, ip, network)); + } + + // Other + data.xterm_title = XtermTitleTextfield.getText(); + data.xterm_script = XtermScriptTextfield.getText(); + data.clone = (int)(ClonesSpinner.getValue()); + data.x11 = X11Checkbox.isSelected(); + data.no_param = NoParamCheckbox.isSelected(); + data.no_pull = NoPullCheckbox.isSelected(); + data.mystuff = MyStuffCheckbox.isSelected(); + data.tap = TapRadioButton.isSelected(); + data.mount1 = MountTextfield1.getText(); + data.mount2 = MountTextfield2.getText(); + data.wait_for = WaitForTextField.getText(); + data.num_cpus = NumCPUTextField.getText(); + data.cpu_set = CPUSetTextField.getText(); + // GNS3 + data.thumb_command = ThumbCommandTextfield.getText(); + data.thumb_stop = ThumbStopTextfield.getText(); + data.thumb_volume = ThumbVolumeTextfield.getText(); + data.hide = HideCheckbox.isSelected(); + + closeConfigWindow(); + } + private String getBaseName(){ + String dockerfilePath = mainWindow.getCurrentLab().getPath()+File.separator+"dockerfiles"+File.separator+ + "Dockerfile."+mainWindow.getLabName()+"."+this.data.name+".student"; + String retval="not defined"; + String line; + try{ + BufferedReader br = new BufferedReader(new FileReader(dockerfilePath)); + + while ((line = br.readLine()) != null) + { + if(line.startsWith("FROM")){ + int i = line.lastIndexOf("/"); + if(i>=0){ + retval = line.substring(i+1).trim(); + }else{ + retval = line.substring(4).trim(); + } + } + } + }catch (FileNotFoundException ex) { + Logger.getLogger(MainWindow.class.getName()).log(Level.SEVERE, null, ex); + mainWindow.output("ERROR dockerfile not found at "+dockerfilePath+" "+ex+"\n"); + }catch (IOException ex) { + Logger.getLogger(MainWindow.class.getName()).log(Level.SEVERE, null, ex); + mainWindow.output("ERROR FROM not found in "+dockerfilePath+" "+ex+"\n"); + } + return retval; + } + + // Opens the container's dockerfile file in a terminal text editor + private void editDockerfile(){ + String dockerfilePath = mainWindow.getCurrentLab().getPath()+File.separator+"dockerfiles"+File.separator+ + "Dockerfile."+mainWindow.getLabName()+"."+this.data.name+".student"; + String cmd = mainWindow.getTextEditor()+dockerfilePath+" &"; + mainWindow.doCommand(cmd); + } + + // Add Network Subpanel to the Container Config Window + public int containerConfigNetworksPanelLength = 0; + private final JScrollBar containerConfigNetworksScrollPaneBar; + private void addContainerNetworkSubPanel(String network, String ip){ + if(mainWindow.getCurrentData().getNetworkCount() == 0){ + mainWindow.output("No networks have been defined.\n"); + return; + } + //Resize the JPanel Holding all the containerConfigNetworksPanel to fit another containerConfigNetworksPanel + containerConfigNetworksPanelLength+=58; + ContainerConfigNetworksPanel.setPreferredSize(new Dimension(0,containerConfigNetworksPanelLength)); + + // Create the Container Obj Panel and add it + ContainerConfigNetworksSubpanel newContainerConfigNetwork = new ContainerConfigNetworksSubpanel(this, mainWindow.getCurrentData(), network, ip); + ContainerConfigNetworksPanel.add(newContainerConfigNetwork); + + // Redraw GUI with the new Panel + ContainerConfigNetworksPanel.revalidate(); + ContainerConfigNetworksPanel.repaint(); + + // Lower the Scroll Bar to show the newly added container + containerConfigNetworksScrollPaneBar.setValue(58+containerConfigNetworksScrollPaneBar.getMaximum()); + } + + // Add Add-host Subpanel to Container Config Window + public int containerAddHostPanelLength = 0; + private final JScrollBar containerAddHostScrollPaneBar; + private void addAddHostSubPanel(String type, String host, String ip, String network){ + // Resize the JPanel Holding all the containerAddHostsPanel to fit another containerAddHostsPanel + containerAddHostPanelLength+=63; + AddHostsSubPanel.setPreferredSize(new Dimension(0,containerAddHostPanelLength)); + + // Create the Container Obj Panel and add it + ContainerConfigAddHosts newContainerConfigAddHost = new ContainerConfigAddHosts(this, mainWindow.getCurrentData(), type, host, ip, network); + AddHostsSubPanel.add(newContainerConfigAddHost); + + // Redraw GUI with the new Panel + AddHostsSubPanel.revalidate(); + AddHostsSubPanel.repaint(); + + // Lower the Scroll Bar to show the newly added container + containerAddHostScrollPaneBar.setValue(63+containerAddHostScrollPaneBar.getMaximum()); + } + + // Set the fields of the Container Dialog Window with the data + private void loadDataIntoContainerPanel(){ + this.ContainerConfigWindow.setTitle("Container Config: "+this.data.name); + + // General Tab + if(data.user.trim().length() == 0){ + data.user = "ubuntu"; + } + this.UserTF.setText(data.user); + this.PasswordTF.setText(data.password); + this.TerminalQuantitySpinner.setValue(data.terminal_count); + this.LabGatewayTextfield.setText(data.lab_gateway); + this.ResolvConfTextfield.setText(data.name_server); + this.NoGWCheckbox.setSelected(data.no_gw); + this.NoResolveCheckbox.setSelected(data.no_resolve); + for(int i=0;i global_settings_params; + private ArrayList listOfContainers; + private ArrayList listOfNetworks; + + private ResultsData resultsData; + private GoalsData goalsData; + private ParamsData paramsData; + + static protected class NetworkData { + public String name = ""; + public String mask = ""; + public String gateway = ""; + public int macvlan_ext; + public int macvlan; + public boolean tap = false; + + public ArrayList unknownNetworkParams; + + NetworkData(String name){ + this.name = name; + this.unknownNetworkParams = new ArrayList(); + } + + NetworkData(String name, String mask, String gateway, int macvlan_ext, int macvlan, boolean tap){ + this.name = name; + this.mask = mask; + this.gateway = gateway; + this.macvlan_ext = macvlan_ext; + this.macvlan = macvlan; + this.tap = tap; + this.unknownNetworkParams = new ArrayList(); + } + } + + static protected class ContainerData{ + public String name; + public int terminal_count = 1; + public String terminal_group = ""; + public String xterm_title = ""; + public String xterm_script = ""; + public String user = ""; + public String password = ""; + public ArrayList listOfContainerNetworks; + public ArrayList listOfContainerAddHost; + public boolean x11; + public boolean no_param; + public int clone; + public boolean no_pull; + public String lab_gateway = ""; + public String name_server = ""; + public boolean no_gw; + public boolean no_resolve; + public String registry = ""; + public String base_registry = ""; + public String thumb_volume = ""; + public String thumb_command = ""; + public String thumb_stop = ""; + public String publish = ""; + public boolean hide; + public boolean no_privilege; + public boolean mystuff; + public boolean tap; + public String mount1 = ""; + public String mount2 = ""; + public String wait_for = ""; + public String num_cpus = ""; + public String cpu_set = ""; + + public ArrayList unknownContainerParams; + + ContainerData(String name){ + this.name = name; + this.listOfContainerNetworks = new ArrayList(); + this.listOfContainerAddHost = new ArrayList(); + this.unknownContainerParams = new ArrayList(); + } + } + + static protected class ContainerNetworkSubData{ + public String network_name; + public String network_ipaddress; + + ContainerNetworkSubData(String name, String ipaddress){ + this.network_name = name; + this.network_ipaddress = ipaddress; + } + } + + static protected class ContainerAddHostSubData{ + public String type = ""; + public String add_host_host = ""; + public String add_host_ip = ""; + public String add_host_network = ""; + + ContainerAddHostSubData(String type, String host, String ip, String network){ + this.type = type; + this.add_host_host = host; + this.add_host_ip = ip; + this.add_host_network = network; + } + } + + LabData(MainWindow main, File labPath, String labName) throws IOException{ + this.path = labPath; + this.name = labName; + this.global_settings_params = new ArrayList(); + this.listOfContainers = new ArrayList(); + this.listOfNetworks = new ArrayList(); + this.resultsData = new ResultsData(main,labPath); + this.goalsData = new GoalsData(main, labPath); + this.paramsData = new ParamsData(main, labPath); + + retrieveData(main); + } + public void retrieveResultsGoalsParams(){ + //Set the list of containers the results UI will references, then parse the results.config file + ResultsData.setContainerList(getContainerNames()); + ParamsData.setContainerList(getContainerNames()); + resultsData.retrieveData(); + + //Parse the goals.config + goalsData.retrieveData(); + + paramsData.retrieveData(); + } + + // Parse the start.config and parse the goasl.config and results.config if the start.config exists + private void retrieveData(MainWindow main) throws FileNotFoundException, IOException{ + File startConfig = new File(this.path+"/config/start.config"); + + if(startConfig.exists()){ + FileReader fileReader = new FileReader(startConfig); + String parseType = "GLOBAL_SETTINGS"; + + BufferedReader bufferedReader = new BufferedReader(fileReader); + String line = bufferedReader.readLine(); + while (line != null) { + line = line.trim(); + // Check if we need to switch to Network or Container Parsing mode + try{ + if(line.startsWith("NETWORK ")){ + parseType = "NETWORK"; + listOfNetworks.add(new NetworkData(line.split("NETWORK ")[1].trim().toUpperCase())); + line = bufferedReader.readLine(); + continue; + } + else if(line.startsWith("CONTAINER ")){ + parseType = "CONTAINER"; + listOfContainers.add(new ContainerData(line.split("CONTAINER ")[1].trim())); + line = bufferedReader.readLine(); + continue; + } + }catch(java.lang.ArrayIndexOutOfBoundsException ex){ + System.out.println("Error in line "+line); + line = bufferedReader.readLine(); + continue; + } + // Check if not a comment or empty space + if(!line.startsWith("#") && !line.isEmpty()){ + try{ + // Check if we're looking for gloabl_settings params, + // which should be at the start before container and network info; + // otherwise parse the specified accepted params in the lab designer manual. + if(parseType.equals("GLOBAL_SETTINGS")) + global_settings_params.add(line); + else { + String parameter = line.split("\\s+")[0]; + if(parseType.equals("NETWORK")){ + NetworkData currNetwork = listOfNetworks.get(listOfNetworks .size()-1); + switch(parameter){ + case "MASK": + currNetwork.mask = line.split("MASK ")[1].trim(); + break; + case "GATEWAY": + if(line.contains("GATEWAY ")){ + currNetwork.gateway = line.split("GATEWAY ")[1].trim(); + } + break; + case "MACVLAN_EXT": + currNetwork.macvlan_ext = Integer.parseInt(line.split("MACVLAN_EXT ")[1].trim()); + break; + case "MACVLAN": + currNetwork.macvlan = Integer.parseInt(line.split("MACVLAN ")[1].trim()); + break; + case "TAP": + currNetwork.tap = (line.split("TAP ")[1].trim()).equals("YES"); + break; + default: + currNetwork.unknownNetworkParams.add(line); + break; + } + } + else if(parseType.equals("CONTAINER")){ + ContainerData currContainer = listOfContainers.get(listOfContainers.size()-1); + switch(parameter){ + case "TERMINALS": + currContainer.terminal_count = Integer.parseInt(line.split("TERMINALS ")[1].trim()); + break; + case "TERMINAL_GROUP": + currContainer.terminal_group = line.split("TERMINAL_GROUP ")[1].trim(); + break; + case "XTERM": + currContainer.xterm_title = line.split("\\s+")[1].trim(); + + if(!currContainer.xterm_title.equals("INSTRUCTIONS")) + currContainer.xterm_script = line.split("\\s+")[2].trim(); + break; + case "USER": + currContainer.user = line.split("USER ")[1].trim(); + break; + case "PASSWORD": + currContainer.password = line.split("PASSWORD ")[1].trim(); + break; + case "ADD-HOST": + String addhostParams = line.split("ADD-HOST ")[1].trim(); + if(addhostParams.contains(":")) //host:ip + currContainer.listOfContainerAddHost.add(new ContainerAddHostSubData("ip",addhostParams.split(":")[0].trim(), addhostParams.split(":")[1].trim(), "")); + else //network + currContainer.listOfContainerAddHost.add(new ContainerAddHostSubData("network","", "", addhostParams)); + break; + case "X11": + currContainer.x11 = (line.split("X11 ")[1].trim()).equals("YES"); + break; + case "NO_PARAM": + currContainer.no_param = (line.split("NO_PARAM ")[1].trim()).equals("YES"); + break; + case "CLONE": + currContainer.clone = Integer.parseInt(line.split("CLONE ")[1].trim()); + break; + case "NO_PULL": + currContainer.no_pull = (line.split("NO_PULL ")[1].trim()).equals("YES"); + break; + case "LAB_GATEWAY": + currContainer.lab_gateway = line.split("LAB_GATEWAY ")[1].trim(); + break; + case "NAME_SERVER": + currContainer.name_server = line.split("NAME_SERVER ")[1].trim(); + break; + case "NO_GW": + currContainer.no_gw = (line.split("NO_GW ")[1].trim()).equals("YES"); + break; + case "NO_RESOLVE": + currContainer.no_resolve = (line.split("NO_RESOLVE ")[1].trim()).equals("YES"); + break; + case "REGISTRY": + currContainer.registry = line.split("REGISTRY ")[1].trim(); + break; + case "BASE_REGISTRY": + currContainer.base_registry = line.split("BASE_REGISTRY ")[1].trim(); + break; + case "THUMB_VOLUME": + currContainer.thumb_volume = line.split("THUMB_VOLUME\\s+")[1].trim(); + break; + case "THUMB_COMMAND": + currContainer.thumb_command = line.split("THUMB_COMMAND\\s+")[1].trim(); + break; + case "THUMB_STOP": + currContainer.thumb_stop = line.split("THUMB_STOP\\s+")[1].trim(); + break; + case "PUBLISH": + currContainer.publish = line.split("PUBLISH\\s+")[1].trim(); + break; + case "HIDE": + currContainer.hide = (line.split("HIDE\\s+")[1].trim()).equals("YES"); + break; + case "NO_PRIVILEGE": + currContainer.no_privilege = (line.split("NO_PRIVILEGE\\s+")[1].trim()).equals("YES"); + break; + case "MYSTUFF": + currContainer.mystuff = (line.split("MYSTUFF\\s+")[1].trim()).equals("YES"); + break; + case "TAP": + currContainer.tap = (line.split("TAP ")[1].trim()).equals("YES"); + break; + case "MOUNT": + String mountParam = line.split("MOUNT ")[1].trim(); + currContainer.mount1 = mountParam.split(":")[0].trim(); + currContainer.mount2 = mountParam.split(":")[1].trim(); + break; + case "WAIT_FOR": + currContainer.wait_for = (line.split("WAIT_FOR\\s+")[1].trim()); + break; + case "NUM_CPUS": + currContainer.num_cpus = (line.split("NUM_CPUS\\s+")[1].trim()); + break; + case "CPU_SET": + currContainer.cpu_set = (line.split("CPU_SET\\s+")[1].trim()); + break; + default: + boolean foundMatchingNetwork = false; + String networkName = line.split("\\s+")[0].toUpperCase(); + String ipAddrName = line.split("\\s+")[1].toUpperCase(); + //Check the array of network names to to see if it matches it + for(int i = 0;i getContainers(){ + return listOfContainers; + } + + public ArrayList getContainerNames(){ + ArrayList names = new ArrayList(); + for (ContainerData container : listOfContainers) + names.add(container.name); + + return names; + } + + public int getNetworkCount(){ + return listOfNetworks.size(); + } + public ArrayList getNetworks(){ + return listOfNetworks; + } + + public ArrayList getNetworkNames(){ + ArrayList names = new ArrayList(); + for (NetworkData network : listOfNetworks) + names.add(network.name); + + return names; + } + + public ArrayList getGlobals(){ + return global_settings_params; + } + + public String getGlobalValue(String tag){ + String retval = null; + for(String line : global_settings_params){ + if(line.trim().startsWith(tag)){ + retval = line.trim().split(" ")[1]; + break; + } + } + return retval; + } + public ResultsData getResultsData(){ + return resultsData; + } + + public GoalsData getGoalsData(){ + return goalsData; + } + + public ParamsData getParamsData(){ + return paramsData; + } + + + // SETTERS // + + public void setName(String newName){ + name = newName; + } + + public void setPath(File newPath){ + path = newPath; + } + + public void setResultsData(ResultsData data){ + resultsData = new ResultsData(data); + } + + public void setGoalsData(GoalsData data){ + //goalsData = new GoalsData(data); + // eh? + goalsData = data; + } + + public void setParamsData(ParamsData data){ + paramsData = new ParamsData(data); + } + + public void resetContainers(){ + listOfContainers = new ArrayList(); + } + + public void resetNetworks(){ + listOfNetworks = new ArrayList(); + } + public void setGlobalValue(String tag, String value){ + boolean gotit = false; + int index = 0; + for(String line : global_settings_params){ + if(line.trim().startsWith(tag)){ + global_settings_params.set(index, tag+" "+value); + gotit = true; + } + index++; + } + if(!gotit){ + String entry = tag+" "+value; + global_settings_params.add(entry); + } + } + + + // DATA MANIPULATION // + + //Called when a user renames a network. + //The function will overwrite any instances of the old Network Name with the new Network Name in this state object + public void refactorNetworkName(String oldName, String newName){ + //Rename the network in the list of networks + for(NetworkData network : listOfNetworks){ + if(network.name.equals(oldName)){ + network.name = newName; + break; + } + } + + //Rename the network in list of Networks and list of addHosts for each container + for(ContainerData container : listOfContainers){ + // check list of networks + for(ContainerNetworkSubData networkSubData: container.listOfContainerNetworks){ + if(networkSubData.network_name.equals(oldName)) + networkSubData.network_name = newName; + } + //check list of add-hosts + for(ContainerAddHostSubData addHostSubData: container.listOfContainerAddHost){ + if(addHostSubData.add_host_network.equals(oldName)) + addHostSubData.add_host_network = newName; + } + } + } + + // Called when a user deletes a network + // The function deletes any instances of the Network name being referenced in the Lab data + public void deleteReferenceToNetwork(String networkName){ + // Delete the network in the list of networks + for(NetworkData network : listOfNetworks){ + if(network.name.equals(networkName)){ + listOfNetworks.remove(network); + break; + } + } + + // Delete the network in list of Networks and list of addHosts for each container + for(ContainerData container : listOfContainers){ + // Check list of networks + ArrayList networksToRemove = new ArrayList(); + for(ContainerNetworkSubData networkSubData: container.listOfContainerNetworks){ + if(networkSubData.network_name.equals(networkName)) + networksToRemove.add(networkSubData); + } + container.listOfContainerNetworks.removeAll(networksToRemove); + + // Check list of add-hosts + ArrayList addHostsToRemove = new ArrayList(); + for(ContainerAddHostSubData addHostSubData: container.listOfContainerAddHost){ + if(addHostSubData.add_host_network.equals(networkName)) + addHostsToRemove.add(addHostSubData); + } + container.listOfContainerAddHost.removeAll(addHostsToRemove); + } + } + + // Called when a user deletes a conainer + // The function deletes any instances of the Container name being referenced in the Lab data + public void deleteReferenceToContainer(String containerName){ + // Delete the network in the list of networks + for(ContainerData container : listOfContainers){ + if(container.name.equals(containerName)){ + listOfContainers.remove(container); + break; + } + } + + // Update the results data to not include the container reference + resultsData.removeContainerReference(containerName); + } + + + // PRINT // + + public void printNetworkData(NetworkData data) { + System.out.println("NETWORK----------------------"); + System.out.println("name: " + data.name); + System.out.println("mask: " + data.mask); + System.out.println("gateway: " + data.gateway); + System.out.println("macvlan_ext: " + data.macvlan_ext); + System.out.println("macvlan: " + data.macvlan); + + if(!data.unknownNetworkParams.isEmpty()){ + System.out.println("UNKNOWN PARAMS: "); + for(int i = 0;i 0){ + startConfigText += " MACVLAN "+data.macvlan+"\n"; + } + if(data.macvlan_ext > 0){ + startConfigText += " MACVLAN_EXT " +data.macvlan_ext+"\n"; + } + + if(data.tap){ + startConfigText += " TAP YES"+"\n"; + } + for(String unknownParam : data.unknownNetworkParams){ + startConfigText += " "+unknownParam+"\n"; + } + } + + // Cycle through container objects and write + for(ContainerData data : listOfContainers){ + startConfigText += "CONTAINER "+data.name+"\n"; + startConfigText += " USER "+data.user+"\n"; + + if(data.x11){ + startConfigText += " X11 YES\n"; + } + else{ + startConfigText += " X11 NO\n"; + } + // Not default + if(data.terminal_count != 1) + startConfigText += " TERMINALS "+data.terminal_count+"\n"; + if(!data.terminal_group.isEmpty()) + startConfigText += " TERMINAL_GROUP "+data.terminal_group+"\n"; + if(!data.xterm_title.isEmpty()) + startConfigText += " XTERM "+data.xterm_title+" "+data.xterm_script+"\n"; + if(!data.password.isEmpty()) + startConfigText += " PASSWORD "+data.password+"\n"; + for(ContainerAddHostSubData addHost : data.listOfContainerAddHost){ + if(addHost.type.equals("network")) + startConfigText += " ADD-HOST "+addHost.add_host_network+"\n"; + else if(addHost.type.equals("ip")) + startConfigText += " ADD-HOST "+addHost.add_host_host+":"+addHost.add_host_ip+"\n"; + } + for(ContainerNetworkSubData network : data.listOfContainerNetworks){ + startConfigText += " "+network.network_name+" "+network.network_ipaddress+"\n"; + } + if(data.clone > 0){ + startConfigText += " CLONE "+data.clone+"\n"; + } + if(!data.lab_gateway.isEmpty()){ + startConfigText += " LAB_GATEWAY "+data.lab_gateway+"\n"; + } + if(!data.name_server.isEmpty()){ + startConfigText += " NAME_SERVER "+data.name_server+"\n"; + } + if(data.no_gw){ + startConfigText += " NO_GW YES\n"; + } + if(data.no_param){ + startConfigText += " NO_PARAM YES\n"; + } + if(data.no_resolve){ + startConfigText += " NO_RESOLVE YES\n"; + } + if(!data.base_registry.isEmpty()){ + startConfigText += " BASE_REGISTRY "+data.base_registry+"\n"; + } + if(!data.thumb_volume.isEmpty()){ + startConfigText += " THUMB_VOLUME "+data.thumb_volume+"\n"; + } + if(!data.thumb_command.isEmpty()){ + startConfigText += " THUMB_COMMAND "+data.thumb_command+"\n"; + } + if(!data.thumb_stop.isEmpty()){ + startConfigText += " THUMB_STOP "+data.thumb_stop+"\n"; + } + if(!data.publish.isEmpty()){ + startConfigText += " PUBLISH "+data.publish+"\n"; + } + if(data.hide){ + startConfigText += " HIDE YES\n"; + } + if(data.no_privilege){ + startConfigText += " NO_PRIVILEGE YES\n"; + } + if(data.no_pull){ + startConfigText += " NO_PULL YES\n"; + } + if(data.mystuff){ + startConfigText += " MYSTUFF YES\n"; + } + if(data.tap){ + startConfigText += " TAP YES\n"; + } + if(!data.mount1.isEmpty() && !data.mount2.isEmpty()){ + startConfigText += " MOUNT "+data.mount1+":"+data.mount2+"\n"; + } + if(!data.wait_for.isEmpty()){ + startConfigText += " WAIT_FOR "+data.wait_for+"\n"; + } + if(!data.num_cpus.isEmpty()){ + startConfigText += " NUM_CPUS "+data.num_cpus+"\n"; + } + if(!data.cpu_set.isEmpty()){ + startConfigText += " CPU_SET "+data.cpu_set+"\n"; + } + + } + + //Write to File + writer.print(startConfigText); + writer.close(); + return startConfigPath; + /* + boolean something_changed = false; + if(usetmp){ + String old_file = this.path+File.separator+"config"+File.separator+"start.config"; + String new_file = startConfigPath; + try{ + something_changed = ! CompareTextFiles.compare(old_file, new_file); + }catch(IOException ex){ + System.out.println("Error comparing text files "+ex); + } + } + return something_changed; + */ + } +} + diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/LabPanel.form b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/LabPanel.form new file mode 100644 index 000000000..8c9601f27 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/LabPanel.form @@ -0,0 +1,91 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/LabPanel.java b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/LabPanel.java new file mode 100644 index 000000000..8dfd3f3f2 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/LabPanel.java @@ -0,0 +1,143 @@ +/* +This software was created by United States Government employees at +The Center for Cybersecurity and Cyber Operations (C3O) +at the Naval Postgraduate School NPS. Please note that within the +United States, copyright protection is not available for any works +created by United States Government employees, pursuant to Title 17 +United States Code Section 105. This software is in the public +domain and is not subject to copyright. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +*/ + +package labtainers.mainui; + +/** + * + * @author mike + */ +public class LabPanel extends javax.swing.JPanel { + javax.swing.JDialog dialog; + LabData labData = null; + + /** + * Creates new form LabPanel + */ + public LabPanel() { + initComponents(); + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + registryTextField = new javax.swing.JTextField(); + OKButton = new javax.swing.JButton(); + CancelButton = new javax.swing.JButton(); + jLabel1 = new javax.swing.JLabel(); + + registryTextField.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Registry", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Dialog", 0, 14))); // NOI18N + + OKButton.setText("OK"); + OKButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + OKButtonActionPerformed(evt); + } + }); + + CancelButton.setText("Cancel"); + CancelButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + CancelButtonActionPerformed(evt); + } + }); + + jLabel1.setText("Lab properties"); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(128, 128, 128) + .addComponent(OKButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(CancelButton)) + .addGroup(layout.createSequentialGroup() + .addGap(147, 147, 147) + .addComponent(jLabel1)) + .addGroup(layout.createSequentialGroup() + .addGap(21, 21, 21) + .addComponent(registryTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 357, javax.swing.GroupLayout.PREFERRED_SIZE))) + .addContainerGap(22, Short.MAX_VALUE)) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(jLabel1) + .addGap(51, 51, 51) + .addComponent(registryTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 68, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 59, Short.MAX_VALUE) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(OKButton) + .addComponent(CancelButton)) + .addGap(62, 62, 62)) + ); + }// //GEN-END:initComponents + + private void OKButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_OKButtonActionPerformed + String registry = registryTextField.getText().trim(); + if(registry.length() > 0){ + this.labData.setGlobalValue("REGISTRY", registry); + } + this.dialog.setVisible(false); + }//GEN-LAST:event_OKButtonActionPerformed + + private void CancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_CancelButtonActionPerformed + this.dialog.setVisible(false); + }//GEN-LAST:event_CancelButtonActionPerformed + public void setDialog(javax.swing.JDialog dialog){ + this.dialog = dialog; + } + public void setData(LabData labData){ + this.labData = labData; + String registry = labData.getGlobalValue("REGISTRY"); + if(registry != null){ + this.registryTextField.setText(registry); + } + } + + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton CancelButton; + private javax.swing.JButton OKButton; + private javax.swing.JLabel jLabel1; + private javax.swing.JTextField registryTextField; + // End of variables declaration//GEN-END:variables +} diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/MainWindow.form b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/MainWindow.form new file mode 100644 index 000000000..4e7854690 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/MainWindow.form @@ -0,0 +1,1330 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/MainWindow.java b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/MainWindow.java new file mode 100644 index 000000000..6749fb8b6 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/MainWindow.java @@ -0,0 +1,2567 @@ +/* +This software was created by United States Government employees at +The Center for Cybersecurity and Cyber Operations (C3O) +at the Naval Postgraduate School NPS. Please note that within the +United States, copyright protection is not available for any works +created by United States Government employees, pursuant to Title 17 +United States Code Section 105. This software is in the public +domain and is not subject to copyright. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +*/ +package labtainers.mainui; + +import java.awt.Component; +import java.awt.Dimension; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.File; +import java.nio.file.Files; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.FilenameFilter; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.InputStream; +import java.io.PrintWriter; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Properties; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.Set; +import javax.swing.JFileChooser; +import javax.swing.JScrollBar; +import java.util.function.Consumer; +import java.util.Arrays; +import java.util.ArrayList; +import java.lang.ClassLoader; +import java.lang.Thread; +import java.nio.charset.StandardCharsets; +import javax.swing.ImageIcon; +import javax.imageio.ImageIO; +import javax.swing.JDialog; +import javax.swing.JOptionPane; +import java.util.concurrent.Executors; +import java.util.Collections; + +import labtainers.mainui.LabData.ContainerData; +import labtainers.mainui.LabData.NetworkData; +import labtainers.mainui.Status; +import labtainers.goalsui.GoalsUI; +import labtainers.resultsui.ResultsData; +import labtainers.resultsui.ResultsUI; +import labtainers.paramsui.ParamsData; +import labtainers.paramsui.ParamsUI; + + +/** + * + * @author Daniel Liao + */ +public class MainWindow extends javax.swing.JFrame { + private LabData labDataCurrent; + private String labtainerPath; + private File labsPath; + private String labName; + private File currentLab=null; + private final File iniFile; + private final Properties prefProperties; + private String[] bases; + private String textEditorPref; + private Status status=null; + + SimpleDateFormat formatter; + Date date; + + private ResultsUI resultsUI; + private GoalsUI goalsUI; + private ParamsUI paramsUI; + private boolean resultsOpened; + private boolean goalsOpened; + private boolean paramsOpened; + + public MainWindow() throws IOException { + initComponents(); + setMnemonics(); + + this.setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE); + + containerScrollPaneBar = ContainerScrollPane.getVerticalScrollBar(); + networkScrollPaneBar = NetworkScrollPane.getVerticalScrollBar(); + LabExistLabel.setVisible(false); + String localpath = System.getenv("HOME")+File.separator+".local/share/labtainers"; + File local = new File(localpath); + local.mkdirs(); + + this.iniFile = new File(localpath+File.separator+"UI.ini"); + if(!this.iniFile.isFile()) + resetINIFile(); + + prefProperties = new Properties(); + prefProperties.load(new FileInputStream(iniFile)); + formatter = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); + // Parse preferences properties and load most recent lab + parseINI(); + + + //Set logo icon + InputStream inputStream = brokenJavaNaming("labtainer5-sm.png"); + ImageIcon logoImg = new ImageIcon(ImageIO.read(inputStream)); + + this.setIconImage(logoImg.getImage()); + logo.setIcon(logoImg); + // For use in creating new labs + getBaseImageDockerfiles(); + // Update status of whether a lab is running + status = new Status(RunningLabel, "Lab running: ", this.labName+"\\."); + status.addLabel(GraderRunning, "Grader running: ", "igrader"); + Thread thread1 = new Thread(status); + thread1.setDaemon(true); + thread1.setName("status-thread"); + System.out.println("Starting status thread..."); + thread1.start(); + } + private void setMnemonics(){ + FileMenuBar.setMnemonic(java.awt.event.KeyEvent.VK_F); + OpenLabMenuItem.setMnemonic(java.awt.event.KeyEvent.VK_O); + NewLabMenuItem.setMnemonic(java.awt.event.KeyEvent.VK_N); + SaveMenuItem.setMnemonic(java.awt.event.KeyEvent.VK_S); + SaveAsMenuItem.setMnemonic(java.awt.event.KeyEvent.VK_A); + PreferencesMenuItem.setMnemonic(java.awt.event.KeyEvent.VK_P); + ExitMenuItem.setMnemonic(java.awt.event.KeyEvent.VK_X); + RunMenu.setMnemonic(java.awt.event.KeyEvent.VK_R); + BuildAndRun.setMnemonic(java.awt.event.KeyEvent.VK_B); + BuildOnlyMenuItem.setMnemonic(java.awt.event.KeyEvent.VK_Y); + StopLabMenuItem.setMnemonic(java.awt.event.KeyEvent.VK_T); + checkWorkMenuItem.setMnemonic(java.awt.event.KeyEvent.VK_C); + HelpMenu.setMnemonic(java.awt.event.KeyEvent.VK_H); + ViewMenu.setMnemonic(java.awt.event.KeyEvent.VK_V); + } + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + ContainerAddDialog = new javax.swing.JDialog(); + jLabel3 = new javax.swing.JLabel(); + jLabel4 = new javax.swing.JLabel(); + jLabel5 = new javax.swing.JLabel(); + ContainerAddDialogNameTextfield = new javax.swing.JTextField(); + ContainerAddDialogCreateButton = new javax.swing.JButton(); + ContainerAddDialogCancelButton = new javax.swing.JButton(); + ContainerAddDialogBaseImageCombobox = new javax.swing.JComboBox<>(); + NetworkAddDialog = new javax.swing.JDialog(); + jLabel7 = new javax.swing.JLabel(); + jLabel11 = new javax.swing.JLabel(); + jLabel12 = new javax.swing.JLabel(); + NetworkAddDialogNameTextfield = new javax.swing.JTextField(); + NetworkAddDialogMaskTextfield = new javax.swing.JTextField(); + NetworkAddDialogGatewayTextfield = new javax.swing.JTextField(); + NetworkAddDialogCreateButton = new javax.swing.JButton(); + NetworkAddDialogCancelButton = new javax.swing.JButton(); + NetworkAddDialogMacVLanExtSpinner = new javax.swing.JSpinner(); + NetworkAddDialogMacVLanSpinner = new javax.swing.JSpinner(); + NetworkAddDialogTapRadioButton = new javax.swing.JRadioButton(); + labChooser = new javax.swing.JFileChooser(); + NewLabDialog = new javax.swing.JDialog(); + jLabel6 = new javax.swing.JLabel(); + jLabel14 = new javax.swing.JLabel(); + NewLabNameTextfield = new javax.swing.JTextField(); + NewLabBaseImageComboBox = new javax.swing.JComboBox<>(); + NewLabCreateButton = new javax.swing.JButton(); + NewLabCancelButton = new javax.swing.JButton(); + LabExistLabel = new javax.swing.JLabel(); + SaveAsDialog = new javax.swing.JDialog(); + SaveAsLabNameTextField = new javax.swing.JTextField(); + SaveAsErrorLabel = new javax.swing.JLabel(); + SaveAsCancelButton = new javax.swing.JButton(); + SaveAsConfirmButton = new javax.swing.JButton(); + Header = new javax.swing.JPanel(); + LabnameLabel = new javax.swing.JLabel(); + RunningLabel = new javax.swing.JLabel(); + GraderRunning = new javax.swing.JLabel(); + ContainerPanel = new javax.swing.JPanel(); + jLabel1 = new javax.swing.JLabel(); + ContainerScrollPane = new javax.swing.JScrollPane(); + ContainerPanePanel = new javax.swing.JPanel(); + addContainerButton = new javax.swing.JButton(); + copyContainerButton = new javax.swing.JButton(); + NetworkPanel = new javax.swing.JPanel(); + jLabel2 = new javax.swing.JLabel(); + NetworkScrollPane = new javax.swing.JScrollPane(); + NetworkPanePanel = new javax.swing.JPanel(); + addNetworkButton = new javax.swing.JButton(); + logo = new javax.swing.JLabel(); + AssessmentPanel = new javax.swing.JPanel(); + AssessmentButton = new javax.swing.JButton(); + AssessmentButton1 = new javax.swing.JButton(); + IndividualizePanel = new javax.swing.JPanel(); + paramsButton = new javax.swing.JButton(); + jScrollPane1 = new javax.swing.JScrollPane(); + OutputTextArea = new javax.swing.JTextArea(); + MainMenuBar = new javax.swing.JMenuBar(); + FileMenuBar = new javax.swing.JMenu(); + NewLabMenuItem = new javax.swing.JMenuItem(); + jSeparator1 = new javax.swing.JPopupMenu.Separator(); + OpenLabMenuItem = new javax.swing.JMenuItem(); + jSeparator2 = new javax.swing.JPopupMenu.Separator(); + SaveMenuItem = new javax.swing.JMenuItem(); + SaveAsMenuItem = new javax.swing.JMenuItem(); + jSeparator4 = new javax.swing.JPopupMenu.Separator(); + PreferencesMenuItem = new javax.swing.JMenuItem(); + jSeparator5 = new javax.swing.JPopupMenu.Separator(); + ExitMenuItem = new javax.swing.JMenuItem(); + RunMenu = new javax.swing.JMenu(); + RunLabMenu = new javax.swing.JMenuItem(); + BuildAndRun = new javax.swing.JMenuItem(); + BuildOnlyMenuItem = new javax.swing.JMenuItem(); + LocalBuildCheckbox = new javax.swing.JCheckBoxMenuItem(); + StopLabMenuItem = new javax.swing.JMenuItem(); + checkWorkMenuItem = new javax.swing.JMenuItem(); + SimLabMenu = new javax.swing.JMenuItem(); + GradeLabMenu = new javax.swing.JMenuItem(); + StopGraderMenu = new javax.swing.JMenuItem(); + EditMenu = new javax.swing.JMenu(); + AboutLabMenuItem = new javax.swing.JMenuItem(); + LabDocumentsMenuItem = new javax.swing.JMenuItem(); + readfirstMenu = new javax.swing.JMenuItem(); + SimlabDirectivesMenuItem = new javax.swing.JMenuItem(); + configMenuItem = new javax.swing.JMenuItem(); + keywordsMenuItem = new javax.swing.JMenuItem(); + HelpMenu = new javax.swing.JMenu(); + DesignerMenuItem = new javax.swing.JMenuItem(); + StudentMenuItem = new javax.swing.JMenuItem(); + InstructorMenuItem = new javax.swing.JMenuItem(); + ViewMenu = new javax.swing.JMenu(); + labtainerLogMenuItem = new javax.swing.JMenuItem(); + buildMenuItem = new javax.swing.JMenuItem(); + + ContainerAddDialog.setTitle("Adding New Container"); + ContainerAddDialog.setMinimumSize(new java.awt.Dimension(433, 220)); + ContainerAddDialog.setResizable(false); + + jLabel3.setFont(new java.awt.Font("Arial", 0, 14)); // NOI18N + jLabel3.setText("Provide container name and the docker base image used:"); + + jLabel4.setFont(new java.awt.Font("Arial", 1, 14)); // NOI18N + jLabel4.setText("Name: "); + + jLabel5.setFont(new java.awt.Font("Arial", 1, 14)); // NOI18N + jLabel5.setText("Base Image:"); + + ContainerAddDialogNameTextfield.setMinimumSize(new java.awt.Dimension(300, 20)); + ContainerAddDialogNameTextfield.setPreferredSize(new java.awt.Dimension(300, 20)); + + ContainerAddDialogCreateButton.setText("Create"); + ContainerAddDialogCreateButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + ContainerAddDialogCreateButtonActionPerformed(evt); + } + }); + + ContainerAddDialogCancelButton.setText("Cancel"); + ContainerAddDialogCancelButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + ContainerAddDialogCancelButtonActionPerformed(evt); + } + }); + + javax.swing.GroupLayout ContainerAddDialogLayout = new javax.swing.GroupLayout(ContainerAddDialog.getContentPane()); + ContainerAddDialog.getContentPane().setLayout(ContainerAddDialogLayout); + ContainerAddDialogLayout.setHorizontalGroup( + ContainerAddDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(ContainerAddDialogLayout.createSequentialGroup() + .addGroup(ContainerAddDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addGroup(ContainerAddDialogLayout.createSequentialGroup() + .addGap(0, 285, Short.MAX_VALUE) + .addComponent(ContainerAddDialogCreateButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(ContainerAddDialogCancelButton)) + .addGroup(ContainerAddDialogLayout.createSequentialGroup() + .addGroup(ContainerAddDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(ContainerAddDialogLayout.createSequentialGroup() + .addContainerGap() + .addComponent(jLabel3)) + .addGroup(ContainerAddDialogLayout.createSequentialGroup() + .addGap(23, 23, 23) + .addGroup(ContainerAddDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addGroup(ContainerAddDialogLayout.createSequentialGroup() + .addComponent(jLabel4) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(ContainerAddDialogNameTextfield, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(ContainerAddDialogLayout.createSequentialGroup() + .addComponent(jLabel5) + .addGap(4, 4, 4) + .addComponent(ContainerAddDialogBaseImageCombobox, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))) + .addGap(2, 2, 2))) + .addContainerGap(24, Short.MAX_VALUE)) + ); + ContainerAddDialogLayout.setVerticalGroup( + ContainerAddDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(ContainerAddDialogLayout.createSequentialGroup() + .addContainerGap() + .addComponent(jLabel3) + .addGap(18, 18, 18) + .addGroup(ContainerAddDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel4) + .addComponent(ContainerAddDialogNameTextfield, javax.swing.GroupLayout.PREFERRED_SIZE, 31, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(10, 10, 10) + .addGroup(ContainerAddDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(ContainerAddDialogBaseImageCombobox, javax.swing.GroupLayout.PREFERRED_SIZE, 38, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel5)) + .addGap(18, 18, 18) + .addGroup(ContainerAddDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(ContainerAddDialogCreateButton) + .addComponent(ContainerAddDialogCancelButton)) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + + NetworkAddDialog.setTitle("Adding New Network"); + NetworkAddDialog.setMinimumSize(new java.awt.Dimension(400, 500)); + NetworkAddDialog.setResizable(false); + + jLabel7.setFont(new java.awt.Font("Arial", 0, 14)); // NOI18N + jLabel7.setText("Please fill the sections below to create a new network:"); + + jLabel11.setFont(new java.awt.Font("Arial", 1, 14)); // NOI18N + jLabel11.setText("MACVLAN:"); + + jLabel12.setFont(new java.awt.Font("Arial", 1, 14)); // NOI18N + jLabel12.setText("MACVLAN_EXT:"); + + NetworkAddDialogNameTextfield.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Name", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Dialog", 1, 14))); // NOI18N + NetworkAddDialogNameTextfield.setMinimumSize(new java.awt.Dimension(300, 20)); + NetworkAddDialogNameTextfield.setName(""); // NOI18N + NetworkAddDialogNameTextfield.setPreferredSize(new java.awt.Dimension(300, 20)); + + NetworkAddDialogMaskTextfield.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Subnet ", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Dialog", 1, 14))); // NOI18N + NetworkAddDialogMaskTextfield.setMinimumSize(new java.awt.Dimension(300, 20)); + NetworkAddDialogMaskTextfield.setName(""); // NOI18N + NetworkAddDialogMaskTextfield.setPreferredSize(new java.awt.Dimension(300, 20)); + + NetworkAddDialogGatewayTextfield.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Gateway", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Dialog", 1, 14))); // NOI18N + NetworkAddDialogGatewayTextfield.setMinimumSize(new java.awt.Dimension(300, 20)); + NetworkAddDialogGatewayTextfield.setName(""); // NOI18N + NetworkAddDialogGatewayTextfield.setPreferredSize(new java.awt.Dimension(300, 20)); + NetworkAddDialogGatewayTextfield.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + NetworkAddDialogGatewayTextfieldActionPerformed(evt); + } + }); + + NetworkAddDialogCreateButton.setText("Create"); + NetworkAddDialogCreateButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + NetworkAddDialogCreateButtonActionPerformed(evt); + } + }); + + NetworkAddDialogCancelButton.setText("Cancel"); + NetworkAddDialogCancelButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + NetworkAddDialogCancelButtonActionPerformed(evt); + } + }); + + NetworkAddDialogMacVLanExtSpinner.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N + + NetworkAddDialogMacVLanSpinner.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N + + NetworkAddDialogTapRadioButton.setFont(new java.awt.Font("Ubuntu", 1, 18)); // NOI18N + NetworkAddDialogTapRadioButton.setText("Tap"); + + javax.swing.GroupLayout NetworkAddDialogLayout = new javax.swing.GroupLayout(NetworkAddDialog.getContentPane()); + NetworkAddDialog.getContentPane().setLayout(NetworkAddDialogLayout); + NetworkAddDialogLayout.setHorizontalGroup( + NetworkAddDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(NetworkAddDialogLayout.createSequentialGroup() + .addGroup(NetworkAddDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(NetworkAddDialogLayout.createSequentialGroup() + .addContainerGap() + .addComponent(jLabel7)) + .addGroup(NetworkAddDialogLayout.createSequentialGroup() + .addGap(24, 24, 24) + .addGroup(NetworkAddDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(NetworkAddDialogLayout.createSequentialGroup() + .addComponent(jLabel12) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(NetworkAddDialogMacVLanExtSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, 45, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(NetworkAddDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addGroup(NetworkAddDialogLayout.createSequentialGroup() + .addComponent(NetworkAddDialogCreateButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(NetworkAddDialogCancelButton)) + .addGroup(NetworkAddDialogLayout.createSequentialGroup() + .addGroup(NetworkAddDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(NetworkAddDialogTapRadioButton) + .addGroup(NetworkAddDialogLayout.createSequentialGroup() + .addComponent(jLabel11) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(NetworkAddDialogMacVLanSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, 45, javax.swing.GroupLayout.PREFERRED_SIZE))) + .addGap(224, 224, 224))))) + .addGroup(NetworkAddDialogLayout.createSequentialGroup() + .addGap(48, 48, 48) + .addGroup(NetworkAddDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(NetworkAddDialogMaskTextfield, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(NetworkAddDialogNameTextfield, javax.swing.GroupLayout.PREFERRED_SIZE, 300, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(NetworkAddDialogGatewayTextfield, javax.swing.GroupLayout.PREFERRED_SIZE, 300, javax.swing.GroupLayout.PREFERRED_SIZE)))) + .addContainerGap(26, Short.MAX_VALUE)) + ); + NetworkAddDialogLayout.setVerticalGroup( + NetworkAddDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(NetworkAddDialogLayout.createSequentialGroup() + .addContainerGap() + .addComponent(jLabel7) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(NetworkAddDialogNameTextfield, javax.swing.GroupLayout.PREFERRED_SIZE, 66, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(NetworkAddDialogMaskTextfield, javax.swing.GroupLayout.PREFERRED_SIZE, 59, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(18, 18, 18) + .addComponent(NetworkAddDialogGatewayTextfield, javax.swing.GroupLayout.PREFERRED_SIZE, 65, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(NetworkAddDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(NetworkAddDialogMacVLanExtSpinner, javax.swing.GroupLayout.DEFAULT_SIZE, 30, Short.MAX_VALUE) + .addComponent(jLabel12)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(NetworkAddDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel11) + .addComponent(NetworkAddDialogMacVLanSpinner, javax.swing.GroupLayout.DEFAULT_SIZE, 30, Short.MAX_VALUE)) + .addGap(27, 27, 27) + .addComponent(NetworkAddDialogTapRadioButton) + .addGap(35, 35, 35) + .addGroup(NetworkAddDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(NetworkAddDialogCreateButton) + .addComponent(NetworkAddDialogCancelButton)) + .addGap(42, 42, 42)) + ); + + labChooser.setCurrentDirectory(null); + labChooser.setFileSelectionMode(javax.swing.JFileChooser.DIRECTORIES_ONLY); + + NewLabDialog.setTitle("Creating New Lab"); + NewLabDialog.setMinimumSize(new java.awt.Dimension(469, 200)); + + jLabel6.setFont(new java.awt.Font("Dialog", 1, 15)); // NOI18N + jLabel6.setText("Name"); + + jLabel14.setFont(new java.awt.Font("Dialog", 1, 15)); // NOI18N + jLabel14.setText("Base Image"); + + NewLabNameTextfield.setFont(new java.awt.Font("Dialog", 0, 15)); // NOI18N + + NewLabCreateButton.setText("Create"); + NewLabCreateButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + NewLabCreateButtonActionPerformed(evt); + } + }); + + NewLabCancelButton.setText("Cancel"); + NewLabCancelButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + NewLabCancelButtonActionPerformed(evt); + } + }); + + LabExistLabel.setText("Lab already exists!"); + + javax.swing.GroupLayout NewLabDialogLayout = new javax.swing.GroupLayout(NewLabDialog.getContentPane()); + NewLabDialog.getContentPane().setLayout(NewLabDialogLayout); + NewLabDialogLayout.setHorizontalGroup( + NewLabDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(NewLabDialogLayout.createSequentialGroup() + .addGroup(NewLabDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(NewLabDialogLayout.createSequentialGroup() + .addGap(20, 20, 20) + .addComponent(jLabel6) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(NewLabNameTextfield)) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, NewLabDialogLayout.createSequentialGroup() + .addContainerGap() + .addGroup(NewLabDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(NewLabDialogLayout.createSequentialGroup() + .addComponent(jLabel14) + .addGap(4, 4, 4) + .addComponent(NewLabBaseImageComboBox, 0, 344, Short.MAX_VALUE)) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, NewLabDialogLayout.createSequentialGroup() + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 311, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(NewLabCreateButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(NewLabCancelButton))))) + .addContainerGap()) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, NewLabDialogLayout.createSequentialGroup() + .addGap(0, 0, Short.MAX_VALUE) + .addComponent(LabExistLabel) + .addGap(158, 158, 158)) + ); + NewLabDialogLayout.setVerticalGroup( + NewLabDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(NewLabDialogLayout.createSequentialGroup() + .addGap(23, 23, 23) + .addGroup(NewLabDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel6) + .addComponent(NewLabNameTextfield, javax.swing.GroupLayout.PREFERRED_SIZE, 37, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(LabExistLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 11, Short.MAX_VALUE) + .addGroup(NewLabDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel14) + .addComponent(NewLabBaseImageComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(NewLabDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(NewLabCreateButton) + .addComponent(NewLabCancelButton)) + .addGap(23, 23, 23)) + ); + + SaveAsDialog.setTitle("Save As"); + SaveAsDialog.setMinimumSize(new java.awt.Dimension(400, 140)); + + SaveAsLabNameTextField.setFont(new java.awt.Font("Ubuntu", 0, 18)); // NOI18N + SaveAsLabNameTextField.setHorizontalAlignment(javax.swing.JTextField.CENTER); + + SaveAsErrorLabel.setText("Lab Already Exists!"); + + SaveAsCancelButton.setText("Cancel"); + SaveAsCancelButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + SaveAsCancelButtonActionPerformed(evt); + } + }); + + SaveAsConfirmButton.setText("Confirm"); + SaveAsConfirmButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + SaveAsConfirmButtonActionPerformed(evt); + } + }); + + javax.swing.GroupLayout SaveAsDialogLayout = new javax.swing.GroupLayout(SaveAsDialog.getContentPane()); + SaveAsDialog.getContentPane().setLayout(SaveAsDialogLayout); + SaveAsDialogLayout.setHorizontalGroup( + SaveAsDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(SaveAsDialogLayout.createSequentialGroup() + .addContainerGap() + .addGroup(SaveAsDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(SaveAsDialogLayout.createSequentialGroup() + .addGap(0, 0, Short.MAX_VALUE) + .addComponent(SaveAsErrorLabel) + .addGap(0, 0, Short.MAX_VALUE)) + .addComponent(SaveAsLabNameTextField) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, SaveAsDialogLayout.createSequentialGroup() + .addGap(0, 242, Short.MAX_VALUE) + .addComponent(SaveAsConfirmButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(SaveAsCancelButton))) + .addContainerGap()) + ); + SaveAsDialogLayout.setVerticalGroup( + SaveAsDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(SaveAsDialogLayout.createSequentialGroup() + .addContainerGap() + .addComponent(SaveAsLabNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(SaveAsErrorLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(SaveAsDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(SaveAsCancelButton) + .addComponent(SaveAsConfirmButton)) + .addContainerGap()) + ); + + setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); + setTitle("Labtainers"); + setResizable(false); + addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + formMouseClicked(evt); + } + }); + addWindowListener(new java.awt.event.WindowAdapter() { + public void windowClosing(java.awt.event.WindowEvent evt) { + MainWindow.this.windowClosing(evt); + } + }); + + LabnameLabel.setFont(new java.awt.Font("Arial Black", 0, 18)); // NOI18N + LabnameLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT); + LabnameLabel.setText("Lab:"); + + RunningLabel.setFont(new java.awt.Font("Ubuntu", 0, 18)); // NOI18N + RunningLabel.setText("Running: "); + + GraderRunning.setFont(new java.awt.Font("Ubuntu", 0, 18)); // NOI18N + GraderRunning.setText("gradelab"); + + javax.swing.GroupLayout HeaderLayout = new javax.swing.GroupLayout(Header); + Header.setLayout(HeaderLayout); + HeaderLayout.setHorizontalGroup( + HeaderLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, HeaderLayout.createSequentialGroup() + .addGap(20, 20, 20) + .addComponent(LabnameLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGap(153, 153, 153) + .addGroup(HeaderLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(GraderRunning, javax.swing.GroupLayout.PREFERRED_SIZE, 215, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(RunningLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 201, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(477, 477, 477)) + ); + HeaderLayout.setVerticalGroup( + HeaderLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(HeaderLayout.createSequentialGroup() + .addContainerGap() + .addComponent(LabnameLabel) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGroup(HeaderLayout.createSequentialGroup() + .addComponent(RunningLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(GraderRunning) + .addContainerGap()) + ); + + ContainerPanel.setBorder(javax.swing.BorderFactory.createEtchedBorder()); + ContainerPanel.setMaximumSize(new java.awt.Dimension(384, 400)); + ContainerPanel.setMinimumSize(new java.awt.Dimension(384, 400)); + ContainerPanel.setPreferredSize(new java.awt.Dimension(384, 400)); + + jLabel1.setFont(new java.awt.Font("Arial", 1, 24)); // NOI18N + jLabel1.setText("Containers"); + + ContainerScrollPane.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); + ContainerScrollPane.setAutoscrolls(true); + + ContainerPanePanel.setMaximumSize(new java.awt.Dimension(0, 0)); + ContainerPanePanel.setMinimumSize(new java.awt.Dimension(0, 0)); + ContainerPanePanel.setPreferredSize(new java.awt.Dimension(0, 0)); + ContainerPanePanel.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.CENTER, 5, 0)); + ContainerScrollPane.setViewportView(ContainerPanePanel); + + addContainerButton.setText("Add"); + addContainerButton.setToolTipText("Add a new container. (Right click containers to change names, delete, etc.)"); + addContainerButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + addContainerButtonActionPerformed(evt); + } + }); + + copyContainerButton.setText("Copy from"); + copyContainerButton.setToolTipText("Copy a container from another lab."); + copyContainerButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + copyContainerButtonActionPerformed(evt); + } + }); + + javax.swing.GroupLayout ContainerPanelLayout = new javax.swing.GroupLayout(ContainerPanel); + ContainerPanel.setLayout(ContainerPanelLayout); + ContainerPanelLayout.setHorizontalGroup( + ContainerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(ContainerPanelLayout.createSequentialGroup() + .addGap(15, 15, 15) + .addGroup(ContainerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addGroup(ContainerPanelLayout.createSequentialGroup() + .addComponent(ContainerScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 350, Short.MAX_VALUE) + .addGap(15, 15, 15)) + .addGroup(ContainerPanelLayout.createSequentialGroup() + .addComponent(jLabel1) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(ContainerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(addContainerButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(copyContainerButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addContainerGap()))) + ); + ContainerPanelLayout.setVerticalGroup( + ContainerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(ContainerPanelLayout.createSequentialGroup() + .addGroup(ContainerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(ContainerPanelLayout.createSequentialGroup() + .addGap(10, 10, 10) + .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(ContainerPanelLayout.createSequentialGroup() + .addComponent(addContainerButton, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(copyContainerButton, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE))) + .addGap(9, 9, 9) + .addComponent(ContainerScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 343, Short.MAX_VALUE) + .addGap(10, 10, 10)) + ); + + NetworkPanel.setBorder(javax.swing.BorderFactory.createEtchedBorder()); + NetworkPanel.setMaximumSize(new java.awt.Dimension(384, 400)); + NetworkPanel.setMinimumSize(new java.awt.Dimension(384, 400)); + NetworkPanel.setPreferredSize(new java.awt.Dimension(384, 400)); + + jLabel2.setFont(new java.awt.Font("Arial", 1, 24)); // NOI18N + jLabel2.setText("Networks"); + + NetworkScrollPane.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); + NetworkScrollPane.setAutoscrolls(true); + + NetworkPanePanel.setMaximumSize(new java.awt.Dimension(0, 0)); + NetworkPanePanel.setMinimumSize(new java.awt.Dimension(0, 0)); + NetworkPanePanel.setPreferredSize(new java.awt.Dimension(0, 0)); + NetworkPanePanel.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.CENTER, 5, 0)); + NetworkScrollPane.setViewportView(NetworkPanePanel); + + addNetworkButton.setText("Add"); + addNetworkButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + addNetworkButtonActionPerformed(evt); + } + }); + + javax.swing.GroupLayout NetworkPanelLayout = new javax.swing.GroupLayout(NetworkPanel); + NetworkPanel.setLayout(NetworkPanelLayout); + NetworkPanelLayout.setHorizontalGroup( + NetworkPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, NetworkPanelLayout.createSequentialGroup() + .addGap(15, 15, 15) + .addGroup(NetworkPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addGroup(NetworkPanelLayout.createSequentialGroup() + .addComponent(jLabel2) + .addGap(41, 41, 41) + .addComponent(addNetworkButton, javax.swing.GroupLayout.PREFERRED_SIZE, 82, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(NetworkScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 350, Short.MAX_VALUE)) + .addGap(15, 15, 15)) + ); + NetworkPanelLayout.setVerticalGroup( + NetworkPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(NetworkPanelLayout.createSequentialGroup() + .addGap(10, 10, 10) + .addGroup(NetworkPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jLabel2) + .addComponent(addNetworkButton)) + .addGap(5, 5, 5) + .addComponent(NetworkScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 365, Short.MAX_VALUE) + .addGap(10, 10, 10)) + ); + + logo.setText("jLabel17"); + + AssessmentPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Automated Assessment", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Dialog", 0, 18))); // NOI18N + + AssessmentButton.setText("Results"); + AssessmentButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + ResultsConfigButtonActionPerformed(evt); + } + }); + + AssessmentButton1.setText("Goals "); + AssessmentButton1.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + GoalsConfigButtonActionPerformed(evt); + } + }); + + javax.swing.GroupLayout AssessmentPanelLayout = new javax.swing.GroupLayout(AssessmentPanel); + AssessmentPanel.setLayout(AssessmentPanelLayout); + AssessmentPanelLayout.setHorizontalGroup( + AssessmentPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(AssessmentPanelLayout.createSequentialGroup() + .addGap(25, 25, 25) + .addGroup(AssessmentPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(AssessmentButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 160, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(AssessmentButton, javax.swing.GroupLayout.PREFERRED_SIZE, 160, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + AssessmentPanelLayout.setVerticalGroup( + AssessmentPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(AssessmentPanelLayout.createSequentialGroup() + .addGap(6, 6, 6) + .addComponent(AssessmentButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 8, Short.MAX_VALUE) + .addComponent(AssessmentButton1) + .addContainerGap()) + ); + + IndividualizePanel.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Individualize", javax.swing.border.TitledBorder.CENTER, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Dialog", 1, 18))); // NOI18N + + paramsButton.setText("Parameters"); + paramsButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + paramsButtonActionPerformed(evt); + } + }); + + javax.swing.GroupLayout IndividualizePanelLayout = new javax.swing.GroupLayout(IndividualizePanel); + IndividualizePanel.setLayout(IndividualizePanelLayout); + IndividualizePanelLayout.setHorizontalGroup( + IndividualizePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 223, Short.MAX_VALUE) + .addGroup(IndividualizePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(IndividualizePanelLayout.createSequentialGroup() + .addGap(0, 0, Short.MAX_VALUE) + .addComponent(paramsButton) + .addGap(0, 0, Short.MAX_VALUE))) + ); + IndividualizePanelLayout.setVerticalGroup( + IndividualizePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 52, Short.MAX_VALUE) + .addGroup(IndividualizePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(IndividualizePanelLayout.createSequentialGroup() + .addGap(0, 11, Short.MAX_VALUE) + .addComponent(paramsButton) + .addGap(0, 11, Short.MAX_VALUE))) + ); + + OutputTextArea.setColumns(20); + OutputTextArea.setFont(new java.awt.Font("Ubuntu", 0, 16)); // NOI18N + OutputTextArea.setRows(5); + jScrollPane1.setViewportView(OutputTextArea); + + MainMenuBar.setFont(new java.awt.Font("Ubuntu", 0, 48)); // NOI18N + + FileMenuBar.setText("File"); + FileMenuBar.setFont(new java.awt.Font("Ubuntu", 0, 18)); // NOI18N + + NewLabMenuItem.setText("New Lab"); + NewLabMenuItem.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + NewLabMenuItemActionPerformed(evt); + } + }); + FileMenuBar.add(NewLabMenuItem); + FileMenuBar.add(jSeparator1); + + OpenLabMenuItem.setText("Open Lab"); + OpenLabMenuItem.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + OpenLabMenuItemActionPerformed(evt); + } + }); + FileMenuBar.add(OpenLabMenuItem); + FileMenuBar.add(jSeparator2); + + SaveMenuItem.setText("Save Lab"); + SaveMenuItem.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + SaveMenuItemActionPerformed(evt); + } + }); + FileMenuBar.add(SaveMenuItem); + + SaveAsMenuItem.setText("Save Lab As"); + SaveAsMenuItem.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + SaveAsMenuItemActionPerformed(evt); + } + }); + FileMenuBar.add(SaveAsMenuItem); + FileMenuBar.add(jSeparator4); + + PreferencesMenuItem.setText("Preferences"); + PreferencesMenuItem.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + PreferencesMenuItemActionPerformed(evt); + } + }); + FileMenuBar.add(PreferencesMenuItem); + FileMenuBar.add(jSeparator5); + + ExitMenuItem.setText("Exit"); + ExitMenuItem.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + ExitMenuItemActionPerformed(evt); + } + }); + FileMenuBar.add(ExitMenuItem); + + MainMenuBar.add(FileMenuBar); + + RunMenu.setText("Run"); + RunMenu.setFont(new java.awt.Font("Ubuntu", 0, 18)); // NOI18N + + RunLabMenu.setText("Run lab"); + RunLabMenu.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + RunLabMenuActionPerformed(evt); + } + }); + RunMenu.add(RunLabMenu); + + BuildAndRun.setText("Build and run"); + BuildAndRun.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + BuildAndRunActionPerformed(evt); + } + }); + RunMenu.add(BuildAndRun); + + BuildOnlyMenuItem.setText("Build only"); + BuildOnlyMenuItem.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + BuildOnlyMenuItemActionPerformed(evt); + } + }); + RunMenu.add(BuildOnlyMenuItem); + + LocalBuildCheckbox.setText("Local builds"); + LocalBuildCheckbox.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + LocalBuildCheckboxActionPerformed(evt); + } + }); + RunMenu.add(LocalBuildCheckbox); + + StopLabMenuItem.setText("Stop lab"); + StopLabMenuItem.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + StopLabMenuItemActionPerformed(evt); + } + }); + RunMenu.add(StopLabMenuItem); + + checkWorkMenuItem.setText("Check work"); + checkWorkMenuItem.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + checkWorkMenuItemActionPerformed(evt); + } + }); + RunMenu.add(checkWorkMenuItem); + + SimLabMenu.setText("SimLab"); + SimLabMenu.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + SimLabMenuActionPerformed(evt); + } + }); + RunMenu.add(SimLabMenu); + + GradeLabMenu.setText("Grade lab"); + GradeLabMenu.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + GradeLabMenuActionPerformed(evt); + } + }); + RunMenu.add(GradeLabMenu); + + StopGraderMenu.setText("Stop grader"); + StopGraderMenu.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + StopGraderMenuActionPerformed(evt); + } + }); + RunMenu.add(StopGraderMenu); + + MainMenuBar.add(RunMenu); + + EditMenu.setText("Edit"); + EditMenu.setFont(new java.awt.Font("Ubuntu", 0, 18)); // NOI18N + + AboutLabMenuItem.setText("About this lab"); + AboutLabMenuItem.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + AboutLabMenuItemActionPerformed(evt); + } + }); + EditMenu.add(AboutLabMenuItem); + + LabDocumentsMenuItem.setText("Lab documents"); + LabDocumentsMenuItem.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + LabDocumentsMenuItemActionPerformed(evt); + } + }); + EditMenu.add(LabDocumentsMenuItem); + + readfirstMenu.setText("readfirst.txt"); + readfirstMenu.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + readfirstMenuActionPerformed(evt); + } + }); + EditMenu.add(readfirstMenu); + + SimlabDirectivesMenuItem.setText("SimLab directives"); + SimlabDirectivesMenuItem.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + SimlabDirectivesMenuItemActionPerformed(evt); + } + }); + EditMenu.add(SimlabDirectivesMenuItem); + + configMenuItem.setText("Config (registry)"); + configMenuItem.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + configMenuItemActionPerformed(evt); + } + }); + EditMenu.add(configMenuItem); + + keywordsMenuItem.setText("keyworkds"); + keywordsMenuItem.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + keywordsMenuItemActionPerformed(evt); + } + }); + EditMenu.add(keywordsMenuItem); + + MainMenuBar.add(EditMenu); + + HelpMenu.setText("Help"); + HelpMenu.setFont(new java.awt.Font("Ubuntu", 0, 18)); // NOI18N + + DesignerMenuItem.setText("Designer Guide"); + DesignerMenuItem.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + DesignerMenuItemActionPerformed(evt); + } + }); + HelpMenu.add(DesignerMenuItem); + + StudentMenuItem.setText("Student Guide"); + StudentMenuItem.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + StudentMenuItemActionPerformed(evt); + } + }); + HelpMenu.add(StudentMenuItem); + + InstructorMenuItem.setText("Instructor Guide"); + InstructorMenuItem.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + InstructorMenuItemActionPerformed(evt); + } + }); + HelpMenu.add(InstructorMenuItem); + + MainMenuBar.add(HelpMenu); + + ViewMenu.setText("View"); + ViewMenu.setFont(new java.awt.Font("Ubuntu", 0, 18)); // NOI18N + + labtainerLogMenuItem.setText("labtainer.log"); + labtainerLogMenuItem.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + labtainerLogMenuItemActionPerformed(evt); + } + }); + ViewMenu.add(labtainerLogMenuItem); + + buildMenuItem.setText("docker_build.log"); + buildMenuItem.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buildMenuItemActionPerformed(evt); + } + }); + ViewMenu.add(buildMenuItem); + + MainMenuBar.add(ViewMenu); + + setJMenuBar(MainMenuBar); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(Header, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(ContainerPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(NetworkPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 758, javax.swing.GroupLayout.PREFERRED_SIZE))) + .addGap(14, 14, 14) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(AssessmentPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addGap(0, 0, Short.MAX_VALUE) + .addComponent(IndividualizePanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(layout.createSequentialGroup() + .addComponent(logo, javax.swing.GroupLayout.PREFERRED_SIZE, 201, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(0, 0, Short.MAX_VALUE))) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(Header, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) + .addComponent(NetworkPanel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 424, Short.MAX_VALUE) + .addComponent(ContainerPanel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 424, Short.MAX_VALUE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(layout.createSequentialGroup() + .addComponent(AssessmentPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(IndividualizePanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(logo))) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + + pack(); + }// //GEN-END:initComponents + + private void ResultsConfigButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ResultsConfigButtonActionPerformed + resultsConfigButton(); + }//GEN-LAST:event_ResultsConfigButtonActionPerformed + + private void addContainerButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addContainerButtonActionPerformed + addContainerButton(); + }//GEN-LAST:event_addContainerButtonActionPerformed + + private void addNetworkButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addNetworkButtonActionPerformed + addNetworkButton(); + }//GEN-LAST:event_addNetworkButtonActionPerformed + + private void ContainerAddDialogCreateButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ContainerAddDialogCreateButtonActionPerformed + addContainerPanel(null); + }//GEN-LAST:event_ContainerAddDialogCreateButtonActionPerformed + + private void NetworkAddDialogCreateButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_NetworkAddDialogCreateButtonActionPerformed + newNetworkDialogCreateButton(); + }//GEN-LAST:event_NetworkAddDialogCreateButtonActionPerformed + + private void OpenLabMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_OpenLabMenuItemActionPerformed + try { + File lab = openLabButton(); + if(lab != null){ + openLab(lab); + } + } catch (IOException ex) { + Logger.getLogger(MainWindow.class.getName()).log(Level.SEVERE, null, ex); + } + }//GEN-LAST:event_OpenLabMenuItemActionPerformed + + private void NetworkAddDialogCancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_NetworkAddDialogCancelButtonActionPerformed + NetworkAddDialog.setVisible(false); + }//GEN-LAST:event_NetworkAddDialogCancelButtonActionPerformed + + private void windowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_windowClosing + if(labName != null){ + try{ + if(!saveLab(true, false)){ + int result = JOptionPane.showConfirmDialog(this,"Changes not saved due to errors and will be lost if you exit. Exit anyway?", "Errors", + JOptionPane.YES_NO_OPTION, + JOptionPane.QUESTION_MESSAGE); + if(result != JOptionPane.YES_OPTION){ + return; + } + } + } catch (IOException ex) { + Logger.getLogger(MainWindow.class.getName()).log(Level.SEVERE, null, ex); + } + } + this.dispose(); + rememberOpenedlab(); + }//GEN-LAST:event_windowClosing + + private void NewLabMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_NewLabMenuItemActionPerformed + newLabButton(); + }//GEN-LAST:event_NewLabMenuItemActionPerformed + + private void NewLabCreateButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_NewLabCreateButtonActionPerformed + createNewLab(); + }//GEN-LAST:event_NewLabCreateButtonActionPerformed + + private void NewLabCancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_NewLabCancelButtonActionPerformed + NewLabDialog.setVisible(false); + }//GEN-LAST:event_NewLabCancelButtonActionPerformed + + private void SaveMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_SaveMenuItemActionPerformed + if(this.currentLab == null){ + saveAsButton(); + }else{ + try { + saveLab(false, false); + } + catch (FileNotFoundException ex) { + Logger.getLogger(MainWindow.class.getName()).log(Level.SEVERE, null, ex); + } + } + }//GEN-LAST:event_SaveMenuItemActionPerformed + + private void SaveAsMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_SaveAsMenuItemActionPerformed + saveAsButton(); + }//GEN-LAST:event_SaveAsMenuItemActionPerformed + + private void ExitMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ExitMenuItemActionPerformed + rememberOpenedlab(); + if(labName != null){ + try{ + saveLab(true, false); + } catch (IOException ex) { + Logger.getLogger(MainWindow.class.getName()).log(Level.SEVERE, null, ex); + } + } + System.exit(0); + }//GEN-LAST:event_ExitMenuItemActionPerformed + + private void SaveAsCancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_SaveAsCancelButtonActionPerformed + SaveAsDialog.setVisible(false); + }//GEN-LAST:event_SaveAsCancelButtonActionPerformed + + private void SaveAsConfirmButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_SaveAsConfirmButtonActionPerformed + saveAsConfirmButton(); + }//GEN-LAST:event_SaveAsConfirmButtonActionPerformed + + private void GoalsConfigButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_GoalsConfigButtonActionPerformed + goalsConfigButton(); + }//GEN-LAST:event_GoalsConfigButtonActionPerformed + + private void ContainerAddDialogCancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ContainerAddDialogCancelButtonActionPerformed + ContainerAddDialog.setVisible(false); + }//GEN-LAST:event_ContainerAddDialogCancelButtonActionPerformed + + public void doCommand(String cmd){ + ProcessBuilder builder = new ProcessBuilder(); + builder.command("sh", "-c", cmd); + try{ + Process process = builder.start(); + StreamGobbler streamGobbler = new StreamGobbler(process.getInputStream(), System.out::println); + Executors.newSingleThreadExecutor().submit(streamGobbler); + int exitCode = process.waitFor(); + assert exitCode == 0; + } catch (IOException e){ + System.out.println(e); + } catch (InterruptedException ie){ + System.out.println(ie); + } + } + public void doLabCommand(String cmd){ + ProcessBuilder builder = new ProcessBuilder(); + builder.command("sh", "-c", cmd); + File labdir = new File(labsPath+File.separator+this.labName); + builder.directory(labdir); + try{ + Process process = builder.start(); + StreamGobbler streamGobbler = new StreamGobbler(process.getInputStream(), System.out::println); + Executors.newSingleThreadExecutor().submit(streamGobbler); + int exitCode = process.waitFor(); + assert exitCode == 0; + } catch (IOException e){ + System.out.println(e); + } catch (InterruptedException ie){ + System.out.println(ie); + } + } + public String getLastLine(String path) throws IOException{ + String lastLine = ""; + String line; + BufferedReader br = new BufferedReader(new FileReader(path)); + + while ((line = br.readLine()) != null) + { + if(line.trim().length() > 0){ + lastLine = line; + } + } + return lastLine; + } + public void doStudentCommand(String cmd){ + String path = this.labtainerPath+File.separator+"scripts"+File.separator+"labtainer-student"; + doCommand(cmd, path); + } + public void doInstructorCommand(String cmd){ + String path = this.labtainerPath+File.separator+"scripts"+File.separator+"labtainer-instructor"; + doCommand(cmd, path); + } + public void doCommand(String cmd, String path){ + output(cmd+"\n"); + ProcessBuilder builder = new ProcessBuilder(); + builder.command("sh", "-c", cmd); + builder.directory(new File(path)); + try{ + Process process = builder.start(); + StreamGobbler streamGobbler = new StreamGobbler(process.getInputStream(), System.out::println); + Executors.newSingleThreadExecutor().submit(streamGobbler); + int exitCode = process.waitFor(); + System.out.println("exit code is "+exitCode); + if(exitCode == 0){ + output("Command successful.\n"); + }else if(cmd.startsWith("SimLab")){ + output("SimLab failed, see diagnostics in terminal that started labedit.\n"); + }else if(cmd.contains("build")){ + output("Command failed, see the labtainer log and/or the docker build log.\n"); + String log_path = this.labtainerPath+File.separator+"logs"+File.separator+"labtainer.log"; + String last = getLastLine(log_path); + if(last.contains("ERROR")){ + output(last+"\n"); + } + }else{ + output("Command failed, see the labtainer log and/or the docker build log.\n"); + String log_path = this.labtainerPath+File.separator+"logs"+File.separator+"labtainer.log"; + String last = getLastLine(log_path); + if(last.contains("ERROR")){ + output(last+"\n"); + } + } + } catch (IOException e){ + System.out.println("IOException "+e); + } catch (InterruptedException ie){ + System.out.println("InterruptedException "+ie); + } + } + private void BuildOnlyMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_BuildOnlyMenuItemActionPerformed + try { + if(!saveLab(false, true)){ + output("Build aborted due to errors in lab.\n"); + return; + } + } + catch (FileNotFoundException ex) { + Logger.getLogger(MainWindow.class.getName()).log(Level.SEVERE, null, ex); + } + + String cmd = "rebuild -b "+this.labName; + if(this.LocalBuildCheckbox.isSelected()){ + cmd = "rebuild -b -L "+this.labName; + } + //System.out.println("BuildOnly cmd: "+cmd); + doStudentCommand(cmd); + }//GEN-LAST:event_BuildOnlyMenuItemActionPerformed + + private void StopLabMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_StopLabMenuItemActionPerformed + String cmd = "stoplab"; + System.out.println("stoplab"); + doStudentCommand(cmd); + }//GEN-LAST:event_StopLabMenuItemActionPerformed + private void openPDF(String fname){ + String cmd = "evince "+fname+" &"; + doCommand(cmd); + } + private void DesignerMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_DesignerMenuItemActionPerformed + String guide = labtainerPath+File.separator+"docs"+File.separator+"labdesigner"+File.separator+"labdesigner.pdf"; + openPDF(guide); + }//GEN-LAST:event_DesignerMenuItemActionPerformed + + private void StudentMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_StudentMenuItemActionPerformed + String guide = labtainerPath+File.separator+"docs"+File.separator+"student"+File.separator+"student.pdf"; + openPDF(guide); + }//GEN-LAST:event_StudentMenuItemActionPerformed + + private void InstructorMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_InstructorMenuItemActionPerformed + String guide = labtainerPath+File.separator+"docs"+File.separator+"instructor"+File.separator+"instructor.pdf"; + openPDF(guide); + }//GEN-LAST:event_InstructorMenuItemActionPerformed + + private void labtainerLogMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_labtainerLogMenuItemActionPerformed + String cmd = "gnome-terminal -t 'labtainer.log' -- tail -f $LABTAINER_DIR/logs/labtainer.log"; + doCommand(cmd); + }//GEN-LAST:event_labtainerLogMenuItemActionPerformed + + private void buildMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buildMenuItemActionPerformed + String cmd = "gnome-terminal -t 'docker_build.log' -- tail -f $LABTAINER_DIR/logs/docker_build.log"; + doCommand(cmd); + }//GEN-LAST:event_buildMenuItemActionPerformed + + private void checkWorkMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_checkWorkMenuItemActionPerformed + String path = this.labtainerPath+File.separator+"scripts"+File.separator+"labtainer-student"; + String cmd = "gnome-terminal -t 'checkwork' --working-directory="+path+" -- checkwork "+this.labName+" -p"; + doCommand(cmd); + }//GEN-LAST:event_checkWorkMenuItemActionPerformed + + private void paramsButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_paramsButtonActionPerformed + if(!paramsOpened){ + paramsUI = new ParamsUI(this, false); + paramsUI.setTitle("Parameters (Individualize) for "+this.labName); + paramsOpened = true; + } + }//GEN-LAST:event_paramsButtonActionPerformed + + private void formMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_formMouseClicked + //System.out.println("clicked"); + //this.toFront(); + }//GEN-LAST:event_formMouseClicked + + private void BuildAndRunActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_BuildAndRunActionPerformed + try { + if(!saveLab(false, true)){ + output("Build aborted due to errors in lab.\n"); + return; + } + } + catch (FileNotFoundException ex) { + Logger.getLogger(MainWindow.class.getName()).log(Level.SEVERE, null, ex); + } + String cmd = "rebuild "+this.labName; + if(this.LocalBuildCheckbox.isSelected()){ + cmd = "rebuild -L "+this.labName; + } + //System.out.println("BuildAndRun cmd: "+cmd); + doStudentCommand(cmd); + }//GEN-LAST:event_BuildAndRunActionPerformed + + private void PreferencesMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_PreferencesMenuItemActionPerformed + PreferencesPanel panel = new PreferencesPanel(); + + panel.setPrefs(this.iniFile, this.prefProperties); + //panel.setVisible(true); + JDialog dialog = new JDialog(); + panel.setDialog(dialog); + //dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); + dialog.setModal(true); + dialog.add(panel); + dialog.pack(); + dialog.setLocation(200, 200); + dialog.setTitle("Labtainers Lab Editor Preferences"); + dialog.setVisible(true); + dialog.dispose(); + + }//GEN-LAST:event_PreferencesMenuItemActionPerformed + + private void AboutLabMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_AboutLabMenuItemActionPerformed + String aboutPath = this.currentLab.toString()+File.separator+"config"+File.separator+"about.txt"; + String cmd = getTextEditor()+" "+aboutPath+" &"; + doCommand(cmd); + }//GEN-LAST:event_AboutLabMenuItemActionPerformed + + private void LabDocumentsMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_LabDocumentsMenuItemActionPerformed + String cmd = "gnome-terminal --working-directory="+currentLab.getPath()+File.separator+"docs"; + System.out.println("cmd: "+cmd); + doCommand(cmd); + }//GEN-LAST:event_LabDocumentsMenuItemActionPerformed + + private void SimlabDirectivesMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_SimlabDirectivesMenuItemActionPerformed + String labtainerPath = System.getenv("LABTAINER_DIR"); + //System.out.println("labtainerdir is "+labtainerPath); + File labtainer_path = new File(labtainerPath); + String parent = labtainer_path.getParentFile().getPath(); + //System.out.println("parent is "+parent); + File simlab_dir = new File(parent+File.separator+"simlab"+File.separator+this.labName); + simlab_dir.mkdirs(); + String cmd = "gnome-terminal --working-directory="+simlab_dir; + //System.out.println("cmd: "+cmd); + doCommand(cmd); + + }//GEN-LAST:event_SimlabDirectivesMenuItemActionPerformed + + private void readfirstMenuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_readfirstMenuActionPerformed + String readFirstPath = this.currentLab.toString()+File.separator+"docs"+File.separator+"read_first.txt"; + String cmd = getTextEditor()+readFirstPath+" &"; + doCommand(cmd); + }//GEN-LAST:event_readfirstMenuActionPerformed + + + private void NetworkAddDialogGatewayTextfieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_NetworkAddDialogGatewayTextfieldActionPerformed + // TODO add your handling code here: + }//GEN-LAST:event_NetworkAddDialogGatewayTextfieldActionPerformed + + private void LocalBuildCheckboxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_LocalBuildCheckboxActionPerformed + if(this.LocalBuildCheckbox.isSelected()){ + writeValueToINI("localBuild", "true"); + //System.out.println("set localBuild true"); + }else{ + writeValueToINI("localBuild", "false"); + //System.out.println("set localBuild false"); + } + + }//GEN-LAST:event_LocalBuildCheckboxActionPerformed + + private void SimLabMenuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_SimLabMenuActionPerformed + if(! isLabRunning()){ + output("Lab is not running."); + return; + } + String cmd = "SimLab.py "+this.labName; + doStudentCommand(cmd); + }//GEN-LAST:event_SimLabMenuActionPerformed + + private void GradeLabMenuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_GradeLabMenuActionPerformed + String path = this.labtainerPath+File.separator+"scripts"+File.separator+"labtainer-instructor"; + String cmd = "gnome-terminal -t 'gradelab' --working-directory="+path+" -- gradelab "+this.labName+" -wrp"; + doCommand(cmd); + }//GEN-LAST:event_GradeLabMenuActionPerformed + + private void StopGraderMenuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_StopGraderMenuActionPerformed + String cmd = "stopgrade"; + doInstructorCommand(cmd); + }//GEN-LAST:event_StopGraderMenuActionPerformed + + private void RunLabMenuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_RunLabMenuActionPerformed + String cmd = "labtainer -q "+this.labName; + doStudentCommand(cmd); + }//GEN-LAST:event_RunLabMenuActionPerformed + + private void configMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_configMenuItemActionPerformed + LabPanel panel = new LabPanel(); + + //panel.setVisible(true); + JDialog dialog = new JDialog(); + panel.setDialog(dialog); + panel.setData(this.labDataCurrent); + //dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); + dialog.setModal(true); + dialog.add(panel); + dialog.pack(); + dialog.setLocation(200, 200); + dialog.setTitle("Lab configuration"); + dialog.setVisible(true); + dialog.dispose(); + }//GEN-LAST:event_configMenuItemActionPerformed + + private void copyContainerButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_copyContainerButtonActionPerformed + try{ + File container = labContainerButton(); + if(container != null){ + + File lab = container.getParentFile(); + File lab_dir = lab.getParentFile(); + if(lab_dir.getName().equals("labs")){ + saveLab(false, true); + String cmd = "new_lab_setup.py -C "+lab.getName()+" "+container.getName()+" newcontainer"; + doLabCommand(cmd); + ContainerObjPanel newPanel = getContainerPanel("newcontainer"); + if(newPanel != null){ + newPanel.renameContainerButton(); + }else{ + System.out.println("Error getting new container name"); + } + reloadLab(); + }else{ + output("Not a lab container: "+container.getName()); + } + } + } catch (IOException ex) { + Logger.getLogger(MainWindow.class.getName()).log(Level.SEVERE, null, ex); + } + }//GEN-LAST:event_copyContainerButtonActionPerformed + + private void keywordsMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_keywordsMenuItemActionPerformed + String keywordPath = this.currentLab.toString()+File.separator+"config"+File.separator+"keywords.txt"; + String cmd = getTextEditor()+" "+keywordPath+" &"; + doCommand(cmd); + }//GEN-LAST:event_keywordsMenuItemActionPerformed + + + //BUTTON FUNCTIONS// + + // Preps the Container Dialog components and sets the Container Dialog visible + private void addContainerButton(){ + ContainerAddDialogNameTextfield.setText(""); + ContainerAddDialog.setVisible(true); + } + + // Preps the Network Dialog components and sets the Network Dialog visible + private void addNetworkButton(){ + NetworkAddDialogGatewayTextfield.setText(""); + NetworkAddDialogMacVLanExtSpinner.setValue(0); + NetworkAddDialogMacVLanSpinner.setValue(0); + NetworkAddDialogMaskTextfield.setText(""); + NetworkAddDialogNameTextfield.setText(""); + NetworkAddDialogTapRadioButton.setSelected(false); + NetworkAddDialog.setVisible(true); + } + + // Adds new Network to the data state and the UI + private void newNetworkDialogCreateButton(){ + //Create new networkData object here based on the field info + LabData.NetworkData newNetworkData = new LabData.NetworkData( + NetworkAddDialogNameTextfield.getText().toUpperCase(), + NetworkAddDialogMaskTextfield.getText(), + NetworkAddDialogGatewayTextfield.getText(), + (int)NetworkAddDialogMacVLanExtSpinner.getValue(), + (int)NetworkAddDialogMacVLanSpinner.getValue(), + NetworkAddDialogTapRadioButton.isSelected() + ); + + // Update the list of labs in the current UI data object + labDataCurrent.getNetworks().add(newNetworkData); + + // Add the network into the UI + addNetworkPanel(newNetworkData); + + // Update the Container Config dialogs to include the new network + updateNetworkReferenceInContainerConfigDialogs("Add", NetworkAddDialogNameTextfield.getText().toUpperCase(), null); + } + + // Opens up file chooser window that defaults to the labs directory relative to the set labtainerPath + // and opens the lab based on the lab directory chosen + private File openLabButton() throws IOException{ + File retval = null; + if(labName != null){ + try{ + saveLab(true, false); + } catch (IOException ex) { + Logger.getLogger(MainWindow.class.getName()).log(Level.SEVERE, null, ex); + } + } + labChooser.setCurrentDirectory(labsPath); + int returnVal = labChooser.showOpenDialog(this); + if (returnVal == JFileChooser.APPROVE_OPTION) { + File lab = labChooser.getSelectedFile(); + while(!lab.getParent().endsWith(File.separator+"labs")){ + lab = new File(lab.getParent()); + } + retval = lab; + } + return retval; + } + + private File labContainerButton() throws IOException{ + File retval = null; + if(labName != null){ + try{ + saveLab(true, false); + } catch (IOException ex) { + Logger.getLogger(MainWindow.class.getName()).log(Level.SEVERE, null, ex); + } + } + labChooser.setCurrentDirectory(labsPath); + int returnVal = labChooser.showOpenDialog(this); + if (returnVal == JFileChooser.APPROVE_OPTION) { + retval = labChooser.getSelectedFile(); + } + return retval; + } + // Preps the NewLab Dialog and makes it visible + private void newLabButton(){ + if(labName != null){ + try{ + saveLab(true, false); + } catch (IOException ex) { + Logger.getLogger(MainWindow.class.getName()).log(Level.SEVERE, null, ex); + } + } + NewLabNameTextfield.setText(""); + NewLabDialog.setVisible(true); + NewLabNameTextfield.requestFocusInWindow(); + } + + + // Preps Save As Dialog and makes it visible + private void saveAsButton(){ + SaveAsLabNameTextField.setText(""); + SaveAsErrorLabel.setVisible(false); + SaveAsDialog.setVisible(true); + } + + // Checks if save lab as input is valid: makes a saveas() call if valid, and displays error message if otherwise + private void saveAsConfirmButton(){ + //Check if the input is valid (lcase and no spaces) + String input = SaveAsLabNameTextField.getText(); + + if(input.contains(" ") || !input.equals(input.toLowerCase())){ + SaveAsErrorLabel.setText("Lab name must be lowercase and contain no spaces!"); + SaveAsErrorLabel.setVisible(true); + } + //Check if lab already exists + else if(Arrays.asList(labsPath.list()).contains(input)){ + SaveAsErrorLabel.setText("Lab already exists!"); + SaveAsErrorLabel.setVisible(true); + } + else{ + SaveAsErrorLabel.setVisible(false); + saveAs(input); + SaveAsDialog.setVisible(false); + } + } + + // Creates, Loads, and Opens Results Configuration UI + private void resultsConfigButton(){ + if(!resultsOpened){ + resultsUI = new ResultsUI(this, false); + resultsUI.setTitle("Results for "+this.labName); + resultsOpened = true; + } + } + + // Creates, Loads, and Opens the Goals Configuration UI + private void goalsConfigButton(){ + if(!goalsOpened){ + goalsUI = new GoalsUI(this, false); + goalsUI.setTitle("Goals for "+this.labName); + goalsOpened = true; + } + } + + // CORE FUNCTIONS // + + public int containerPanePanelLength = 0; + private final JScrollBar containerScrollPaneBar; + private void addContainerPanel(ContainerData data){ + // Create the Container Obj Panel and add it + ContainerObjPanel newContainer; + // If null then this is a new container being added + if(data == null){ + String containerName = ContainerAddDialogNameTextfield.getText(); + if(containerName == null || containerName.trim().length() == 0){ + System.out.println("No container name provided."); + return; + } + if(containerName.equals("newcontainer")){ + JOptionPane.showMessageDialog(null, "The name 'newcontainer' is reserved and cannot b used.", "Warning", + JOptionPane.WARNING_MESSAGE); + return; + } + String baseImage = (String)ContainerAddDialogBaseImageCombobox.getSelectedItem(); + // Add the container into the user's file system + addContainer(containerName, baseImage); + // Reload from newly modified start.config + File lab = null; + lab = new File(labsPath+File.separator+this.labName); + try{ + this.labDataCurrent = new LabData(this, lab, this.labName); + }catch(IOException ex){ + System.out.println("failed load labData file for "+this.labName); + } + + //ContainerData freshContainerData = new ContainerData(containerName); + ArrayList containerList = labDataCurrent.getContainers(); + ContainerData newContainerData = containerList.get(containerList.size()-1); + newContainer = new ContainerObjPanel(this, newContainerData); + + // Update the data object to include the new container + // labDataCurrent.getContainers().add(newContainerData); + ResultsData.containerList.add(containerName); + + // Update the Results UI to include the new container + if(resultsUI!= null) + resultsUI.refresh(); + + } + else { + newContainer = new ContainerObjPanel(this, data); + } + newContainer.setNameLabel(); + + // Resize the JPanel holding all the ContainerObjPanels to fit another ContainerObjPanel + containerPanePanelLength+=50; + ContainerPanePanel.setPreferredSize(new Dimension(0,containerPanePanelLength)); + ContainerPanePanel.add(newContainer); + + // Redraw GUI with the new Panel + ContainerPanePanel.revalidate(); + ContainerPanePanel.repaint(); + + // Lower the Scroll Bar to show the newly added container. BUG[6/25/20]: still always off by a single panel + containerScrollPaneBar.setValue(50+containerScrollPaneBar.getMaximum()); + + // Make the Container Add Dialog Invisible + ContainerAddDialog.setVisible(false); + } + + // Adds the container in the lab directory structure by calling 'new_lab_setup.py -a containername -b baseImage' + private void addContainer(String containerName, String baseImage){ + // Call python new_lab_script: new_lab_setup.py -b basename + //String cmd = "./addContainer.sh "+labsPath+" "+labName+" "+containerName+" "+baseImage; + String cmd = "new_lab_setup.py -a "+containerName+" -b "+baseImage; + doLabCommand(cmd); + } + + public int networkPanePanelLength = 0; + private JScrollBar networkScrollPaneBar; + private void addNetworkPanel(NetworkData data){ + //Resize the JPanel Holding all the NetworkObjPanels to fit another NetworkObjPanel + //[BUG: 6/25/2020] Not sure Why but the network obj panel needs to be 1 px taller than the container panel to be the same size + networkPanePanelLength+=51; + NetworkPanePanel.setPreferredSize(new Dimension(0,networkPanePanelLength)); + + // Create the Network Obj Panel and add it + NetworkPanePanel.add(new NetworkObjPanel(this, data)); + + // Redraw GUI with the new Panel + NetworkPanePanel.revalidate(); + NetworkPanePanel.repaint(); + + //Lower the Scroll Bar to show the newly added container (BUG[6/25/20]: still always off by a single panel) + networkScrollPaneBar.setValue(networkScrollPaneBar.getMaximum()); + + // Make the Network Add Dialog Disappear + NetworkAddDialog.setVisible(false); + } + private void checkManual() throws IOException{ + String readFirstPath = this.currentLab.toString()+File.separator+"docs"+File.separator+"read_first.txt"; + BufferedReader br = null; + try{ + br = new BufferedReader(new FileReader(readFirstPath)); + }catch(FileNotFoundException ex){ + output("Missing file at "+readFirstPath); + return; + } + String docname = null; + String line; + while ((line = br.readLine()) != null) + { + if(line.trim().startsWith("file://LAB_DOCS")){ + docname = line.substring(line.lastIndexOf(File.separator)+1); + break; + }else if(line.contains("LAB_MANUAL")){ + docname = this.labName+".pdf"; + break; + } + } + if(docname != null){ + String manualPath = currentLab.toString()+File.separator+"docs"+File.separator+docname; + File manual = new File(manualPath); + if(! manual.exists()){ + output("No lab manual found at docs/"+docname+" Use 'Edit=>Lab documents' and create a lab manual there, or\n"); + output("change the name in read_first.txt to match your lab manual.\n"); + } + }else{ + output("No link to a lab manual found in "+readFirstPath+"\n"); + output("path should include: file://LAB_DOCS/ OBE = Set.of("base", "network", "centos6", "centos", "network.ssh", "wireshark"); + + ArrayList baseList = new ArrayList(); + InputStream inputStream = brokenJavaNaming("base.list"); + if(inputStream == null){ + System.out.println("No base.list file found."); + }else{ + InputStreamReader streamReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8); + BufferedReader reader = new BufferedReader(streamReader); + try{ + for (String line; (line = reader.readLine()) != null;) { + baseList.add(line); + } + }catch(IOException ex){ + System.out.println(ex); + } + } + + // Get list of valid base dockerfiles + File dockerfileBasesPath = new File(labtainerPath + File.separator +"scripts"+ File.separator+"designer"+File.separator+"base_dockerfiles"); + File[] baseFiles = dockerfileBasesPath.listFiles(new FilenameFilter(){ + public boolean accept(File dockerfileBasesPath, String filename) + {return filename.startsWith("Dockerfile.labtainer."); } + } ); + Arrays.sort(baseFiles); + for(int i = 0;i 0){ + outstream.write(buffer, 0, length); + } + + //Closing the input/output file streams + instream.close(); + outstream.close(); + + System.out.println("File copied successfully!!"); + + }catch(IOException ioe){ + ioe.printStackTrace(); + } + } + + // Writes a value to a key in the main.ini file + private void writeValueToINI(String key, String value){ + try{ + // update the labtainerPath property + //prefProperties.load(new FileInputStream(iniFile)); + prefProperties.put(key, value); + + // write update to the ini File + date = new Date(); + FileOutputStream out = new FileOutputStream(this.iniFile); + prefProperties.store(out, "Updated: "+ formatter.format(date)); + out.close(); + }catch(IOException ioe){ + output("Error writing to INI file "+ioe+"\n"); + } + } + + // Clears the panels of Containers and Networks + private void resetWindow(){ + // Clear Container Panel + Component[] componentList = ContainerPanePanel.getComponents(); + for(Component c: componentList) + ContainerPanePanel.remove(c); + + containerPanePanelLength=0; + ContainerPanePanel.setPreferredSize(new Dimension(0,containerPanePanelLength)); + + // Clear Network Panel + componentList = NetworkPanePanel.getComponents(); + for(Component c: componentList) + NetworkPanePanel.remove(c); + + networkPanePanelLength=0; + NetworkPanePanel.setPreferredSize(new Dimension(0,networkPanePanelLength)); + + this.revalidate(); + this.repaint(); + } + + // Load the data into the UI + private void loadLab(){ + LabnameLabel.setText("Lab: "+labDataCurrent.getName()); + + // Load the networks + for(int i = 0;i + /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. + * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html + */ + try { + for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { + if ("Nimbus".equals(info.getName())) { + javax.swing.UIManager.setLookAndFeel(info.getClassName()); + break; + } + } + } catch (ClassNotFoundException ex) { + java.util.logging.Logger.getLogger(MainWindow.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } catch (InstantiationException ex) { + java.util.logging.Logger.getLogger(MainWindow.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } catch (IllegalAccessException ex) { + java.util.logging.Logger.getLogger(MainWindow.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } catch (javax.swing.UnsupportedLookAndFeelException ex) { + java.util.logging.Logger.getLogger(MainWindow.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } + // + + /* Create and display the form */ + java.awt.EventQueue.invokeLater(new Runnable() { + public void run() { + try { + new MainWindow().setVisible(true); + } catch (IOException ex) { + System.out.println(ex); + } + } + }); + } + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JMenuItem AboutLabMenuItem; + private javax.swing.JButton AssessmentButton; + private javax.swing.JButton AssessmentButton1; + private javax.swing.JPanel AssessmentPanel; + private javax.swing.JMenuItem BuildAndRun; + private javax.swing.JMenuItem BuildOnlyMenuItem; + private javax.swing.JDialog ContainerAddDialog; + private javax.swing.JComboBox ContainerAddDialogBaseImageCombobox; + private javax.swing.JButton ContainerAddDialogCancelButton; + private javax.swing.JButton ContainerAddDialogCreateButton; + private javax.swing.JTextField ContainerAddDialogNameTextfield; + private javax.swing.JPanel ContainerPanePanel; + private javax.swing.JPanel ContainerPanel; + private javax.swing.JScrollPane ContainerScrollPane; + private javax.swing.JMenuItem DesignerMenuItem; + private javax.swing.JMenu EditMenu; + private javax.swing.JMenuItem ExitMenuItem; + private javax.swing.JMenu FileMenuBar; + private javax.swing.JMenuItem GradeLabMenu; + private javax.swing.JLabel GraderRunning; + private javax.swing.JPanel Header; + private javax.swing.JMenu HelpMenu; + private javax.swing.JPanel IndividualizePanel; + private javax.swing.JMenuItem InstructorMenuItem; + private javax.swing.JMenuItem LabDocumentsMenuItem; + private javax.swing.JLabel LabExistLabel; + private javax.swing.JLabel LabnameLabel; + private javax.swing.JCheckBoxMenuItem LocalBuildCheckbox; + private javax.swing.JMenuBar MainMenuBar; + private javax.swing.JDialog NetworkAddDialog; + private javax.swing.JButton NetworkAddDialogCancelButton; + private javax.swing.JButton NetworkAddDialogCreateButton; + private javax.swing.JTextField NetworkAddDialogGatewayTextfield; + private javax.swing.JSpinner NetworkAddDialogMacVLanExtSpinner; + private javax.swing.JSpinner NetworkAddDialogMacVLanSpinner; + private javax.swing.JTextField NetworkAddDialogMaskTextfield; + private javax.swing.JTextField NetworkAddDialogNameTextfield; + private javax.swing.JRadioButton NetworkAddDialogTapRadioButton; + private javax.swing.JPanel NetworkPanePanel; + private javax.swing.JPanel NetworkPanel; + private javax.swing.JScrollPane NetworkScrollPane; + private javax.swing.JComboBox NewLabBaseImageComboBox; + private javax.swing.JButton NewLabCancelButton; + private javax.swing.JButton NewLabCreateButton; + private javax.swing.JDialog NewLabDialog; + private javax.swing.JMenuItem NewLabMenuItem; + private javax.swing.JTextField NewLabNameTextfield; + private javax.swing.JMenuItem OpenLabMenuItem; + private javax.swing.JTextArea OutputTextArea; + private javax.swing.JMenuItem PreferencesMenuItem; + private javax.swing.JMenuItem RunLabMenu; + private javax.swing.JMenu RunMenu; + private javax.swing.JLabel RunningLabel; + private javax.swing.JButton SaveAsCancelButton; + private javax.swing.JButton SaveAsConfirmButton; + private javax.swing.JDialog SaveAsDialog; + private javax.swing.JLabel SaveAsErrorLabel; + private javax.swing.JTextField SaveAsLabNameTextField; + private javax.swing.JMenuItem SaveAsMenuItem; + private javax.swing.JMenuItem SaveMenuItem; + private javax.swing.JMenuItem SimLabMenu; + private javax.swing.JMenuItem SimlabDirectivesMenuItem; + private javax.swing.JMenuItem StopGraderMenu; + private javax.swing.JMenuItem StopLabMenuItem; + private javax.swing.JMenuItem StudentMenuItem; + private javax.swing.JMenu ViewMenu; + private javax.swing.JButton addContainerButton; + private javax.swing.JButton addNetworkButton; + private javax.swing.JMenuItem buildMenuItem; + private javax.swing.JMenuItem checkWorkMenuItem; + private javax.swing.JMenuItem configMenuItem; + private javax.swing.JButton copyContainerButton; + private javax.swing.JLabel jLabel1; + private javax.swing.JLabel jLabel11; + private javax.swing.JLabel jLabel12; + private javax.swing.JLabel jLabel14; + private javax.swing.JLabel jLabel2; + private javax.swing.JLabel jLabel3; + private javax.swing.JLabel jLabel4; + private javax.swing.JLabel jLabel5; + private javax.swing.JLabel jLabel6; + private javax.swing.JLabel jLabel7; + private javax.swing.JScrollPane jScrollPane1; + private javax.swing.JPopupMenu.Separator jSeparator1; + private javax.swing.JPopupMenu.Separator jSeparator2; + private javax.swing.JPopupMenu.Separator jSeparator4; + private javax.swing.JPopupMenu.Separator jSeparator5; + private javax.swing.JMenuItem keywordsMenuItem; + private javax.swing.JFileChooser labChooser; + private javax.swing.JMenuItem labtainerLogMenuItem; + private javax.swing.JLabel logo; + private javax.swing.JButton paramsButton; + private javax.swing.JMenuItem readfirstMenu; + // End of variables declaration//GEN-END:variables + + private static class StreamGobbler implements Runnable { + private InputStream inputStream; + private Consumer consumer; + + public StreamGobbler(InputStream inputStream, Consumer consumer) { + this.inputStream = inputStream; + this.consumer = consumer; + } + + @Override + public void run() { + new BufferedReader(new InputStreamReader(inputStream)).lines() + .forEach(consumer); + } + } + +} diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/NetworkObjPanel.form b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/NetworkObjPanel.form new file mode 100644 index 000000000..5e2ac5023 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/NetworkObjPanel.form @@ -0,0 +1,274 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/NetworkObjPanel.java b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/NetworkObjPanel.java new file mode 100644 index 000000000..67b632f06 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/NetworkObjPanel.java @@ -0,0 +1,425 @@ +/* +This software was created by United States Government employees at +The Center for Cybersecurity and Cyber Operations (C3O) +at the Naval Postgraduate School NPS. Please note that within the +United States, copyright protection is not available for any works +created by United States Government employees, pursuant to Title 17 +United States Code Section 105. This software is in the public +domain and is not subject to copyright. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + */ +package labtainers.mainui; + +import java.awt.Dimension; +import javax.swing.JDialog; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.SwingUtilities; + +/** + * + * @author Daniel Liao + */ +public class NetworkObjPanel extends javax.swing.JPanel { + + /** + * Creates new form NetworkObjPanel + */ + private final MainWindow mainWindow; + private final LabData.NetworkData data; + + // Constructor for loading a network object panel based on a network data object + NetworkObjPanel(MainWindow mainWindow, LabData.NetworkData data) { + initComponents(); + this.mainWindow = mainWindow; + this.data = data; + + this.NetworkLabelName.setText(this.data.name); + this.NetworkMaskLabel.setText(this.data.mask); + this.RenameNetworkTextfield.setVisible(false); + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + NetworkConfigWindow = new javax.swing.JDialog(); + jLabel4 = new javax.swing.JLabel(); + jLabel5 = new javax.swing.JLabel(); + NetworkConfigMaskTextfield = new javax.swing.JTextField(); + NetworkConfigGatewayTextField = new javax.swing.JTextField(); + NetworkConfigCancelButton = new javax.swing.JButton(); + NetworkConfigUpdateButton = new javax.swing.JButton(); + NetworkConfigMacVLanExtSpinner = new javax.swing.JSpinner(); + NetworkConfigMacVLanSpinner = new javax.swing.JSpinner(); + TapRadioButton = new javax.swing.JRadioButton(); + NetworkRightClick = new javax.swing.JPopupMenu(); + renameNetworkOption = new javax.swing.JMenuItem(); + jSeparator1 = new javax.swing.JPopupMenu.Separator(); + deleteNetworkOption = new javax.swing.JMenuItem(); + RenameNetworkTextfield = new javax.swing.JTextField(); + NetworkLabelName = new javax.swing.JLabel(); + NetworkMaskLabel = new javax.swing.JLabel(); + + NetworkConfigWindow.setMinimumSize(new java.awt.Dimension(377, 335)); + NetworkConfigWindow.setResizable(false); + NetworkConfigWindow.addWindowListener(new java.awt.event.WindowAdapter() { + public void windowClosing(java.awt.event.WindowEvent evt) { + NetworkConfigWindowWindowClosing(evt); + } + }); + + jLabel4.setFont(new java.awt.Font("Arial", 1, 14)); // NOI18N + jLabel4.setText("MACVLAN_EXT:"); + + jLabel5.setFont(new java.awt.Font("Arial", 1, 14)); // NOI18N + jLabel5.setText("MACVLAN:"); + + NetworkConfigMaskTextfield.setFont(new java.awt.Font("Ubuntu", 0, 18)); // NOI18N + NetworkConfigMaskTextfield.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Subnet", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Dialog", 1, 14))); // NOI18N + + NetworkConfigGatewayTextField.setFont(new java.awt.Font("Ubuntu", 0, 18)); // NOI18N + NetworkConfigGatewayTextField.setToolTipText("IP used as the default gateway on containers connected to this network. Used to communicate with the host computer and the outside world. This should not be the IP address of any of the containers."); + NetworkConfigGatewayTextField.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "External gateway", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Dialog", 1, 14))); // NOI18N + + NetworkConfigCancelButton.setText("Cancel"); + NetworkConfigCancelButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + NetworkConfigCancelButtonActionPerformed(evt); + } + }); + + NetworkConfigUpdateButton.setText("OK"); + NetworkConfigUpdateButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + NetworkConfigUpdateButtonActionPerformed(evt); + } + }); + + NetworkConfigMacVLanExtSpinner.setFont(new java.awt.Font("Arial", 0, 18)); // NOI18N + + NetworkConfigMacVLanSpinner.setFont(new java.awt.Font("Arial", 0, 18)); // NOI18N + + TapRadioButton.setFont(new java.awt.Font("Ubuntu", 1, 15)); // NOI18N + TapRadioButton.setText("TAP"); + + javax.swing.GroupLayout NetworkConfigWindowLayout = new javax.swing.GroupLayout(NetworkConfigWindow.getContentPane()); + NetworkConfigWindow.getContentPane().setLayout(NetworkConfigWindowLayout); + NetworkConfigWindowLayout.setHorizontalGroup( + NetworkConfigWindowLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(NetworkConfigWindowLayout.createSequentialGroup() + .addContainerGap() + .addGroup(NetworkConfigWindowLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addGroup(NetworkConfigWindowLayout.createSequentialGroup() + .addComponent(NetworkConfigUpdateButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(NetworkConfigCancelButton)) + .addGroup(NetworkConfigWindowLayout.createSequentialGroup() + .addGroup(NetworkConfigWindowLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jLabel4, javax.swing.GroupLayout.Alignment.TRAILING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, NetworkConfigWindowLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(TapRadioButton) + .addComponent(jLabel5))) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(NetworkConfigWindowLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(NetworkConfigMacVLanSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, 45, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(NetworkConfigMacVLanExtSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, 45, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(184, 184, 184))) + .addContainerGap(22, Short.MAX_VALUE)) + .addGroup(NetworkConfigWindowLayout.createSequentialGroup() + .addGroup(NetworkConfigWindowLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(NetworkConfigMaskTextfield, javax.swing.GroupLayout.PREFERRED_SIZE, 229, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(NetworkConfigGatewayTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 229, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(0, 0, Short.MAX_VALUE)) + ); + NetworkConfigWindowLayout.setVerticalGroup( + NetworkConfigWindowLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(NetworkConfigWindowLayout.createSequentialGroup() + .addContainerGap() + .addComponent(NetworkConfigMaskTextfield, javax.swing.GroupLayout.PREFERRED_SIZE, 61, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(NetworkConfigGatewayTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 58, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(NetworkConfigWindowLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel4) + .addComponent(NetworkConfigMacVLanExtSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, 33, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(NetworkConfigWindowLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(NetworkConfigWindowLayout.createSequentialGroup() + .addGap(25, 25, 25) + .addComponent(jLabel5)) + .addGroup(NetworkConfigWindowLayout.createSequentialGroup() + .addGap(18, 18, 18) + .addComponent(NetworkConfigMacVLanSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, 33, javax.swing.GroupLayout.PREFERRED_SIZE))) + .addGap(27, 27, 27) + .addComponent(TapRadioButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 9, Short.MAX_VALUE) + .addGroup(NetworkConfigWindowLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(NetworkConfigUpdateButton) + .addComponent(NetworkConfigCancelButton)) + .addContainerGap()) + ); + + renameNetworkOption.setText("Rename"); + renameNetworkOption.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + renameNetworkOptionActionPerformed(evt); + } + }); + NetworkRightClick.add(renameNetworkOption); + NetworkRightClick.add(jSeparator1); + + deleteNetworkOption.setText("Delete"); + deleteNetworkOption.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + deleteNetworkOptionActionPerformed(evt); + } + }); + NetworkRightClick.add(deleteNetworkOption); + + setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED)); + setMaximumSize(new java.awt.Dimension(340, 51)); + setMinimumSize(new java.awt.Dimension(340, 51)); + setName(""); // NOI18N + setPreferredSize(new java.awt.Dimension(340, 51)); + addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + formMouseClicked(evt); + } + }); + + RenameNetworkTextfield.setFont(new java.awt.Font("Arial", 1, 18)); // NOI18N + RenameNetworkTextfield.setHorizontalAlignment(javax.swing.JTextField.CENTER); + RenameNetworkTextfield.setMinimumSize(new java.awt.Dimension(300, 35)); + RenameNetworkTextfield.setPreferredSize(new java.awt.Dimension(300, 35)); + RenameNetworkTextfield.setRequestFocusEnabled(false); + RenameNetworkTextfield.addFocusListener(new java.awt.event.FocusAdapter() { + public void focusLost(java.awt.event.FocusEvent evt) { + RenameNetworkTextfieldFocusLost(evt); + } + }); + RenameNetworkTextfield.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + RenameNetworkTextfieldActionPerformed(evt); + } + }); + add(RenameNetworkTextfield); + + NetworkLabelName.setFont(new java.awt.Font("Arial", 1, 18)); // NOI18N + NetworkLabelName.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); + NetworkLabelName.setText("network_name"); + add(NetworkLabelName); + + NetworkMaskLabel.setFont(new java.awt.Font("Ubuntu", 0, 18)); // NOI18N + NetworkMaskLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); + NetworkMaskLabel.setText("000.00.0.000/00"); + add(NetworkMaskLabel); + }// //GEN-END:initComponents + + private boolean clicked = false; + private void formMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_formMouseClicked + clickPanelHandler(evt); + }//GEN-LAST:event_formMouseClicked + + private void renameNetworkOptionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_renameNetworkOptionActionPerformed + renameNetworkOptionActionPerformed(); + }//GEN-LAST:event_renameNetworkOptionActionPerformed + + private void deleteNetworkOptionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deleteNetworkOptionActionPerformed + deleteNetworkAction(); + }//GEN-LAST:event_deleteNetworkOptionActionPerformed + + private void RenameNetworkTextfieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_RenameNetworkTextfieldActionPerformed + renameNetworkTextfieldActionPerformed(); + }//GEN-LAST:event_RenameNetworkTextfieldActionPerformed + + private void RenameNetworkTextfieldFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_RenameNetworkTextfieldFocusLost + renameNetworkTextfieldFocusLost(); + }//GEN-LAST:event_RenameNetworkTextfieldFocusLost + + private void NetworkConfigWindowWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_NetworkConfigWindowWindowClosing + clicked = false; + }//GEN-LAST:event_NetworkConfigWindowWindowClosing + + private void NetworkConfigUpdateButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_NetworkConfigUpdateButtonActionPerformed + networkConfigUpdateButton(); + }//GEN-LAST:event_NetworkConfigUpdateButtonActionPerformed + + private void NetworkConfigCancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_NetworkConfigCancelButtonActionPerformed + clicked = false; + NetworkConfigWindow.setVisible(false); + }//GEN-LAST:event_NetworkConfigCancelButtonActionPerformed + + // BUTTONS and HANDLERS // + + // Handles whether or not to open Network Configuration Window or prompt rename/delete options + private void clickPanelHandler(java.awt.event.MouseEvent evt){ + if(!clicked){ + if(SwingUtilities.isLeftMouseButton(evt)){ + clicked = true; + loadDataIntoNetworkPanel(); + NetworkConfigWindow.setVisible(true); + } + else if(SwingUtilities.isRightMouseButton(evt)) + NetworkRightClick.show(this, evt.getX(), evt.getY()); + } + } + + // Deletes the network and removes all references to it at the UI and data layer + private void deleteNetworkAction(){ + int confirm = JOptionPane.showConfirmDialog(null, "Are you sure you want to delete the network '"+data.name+"'?\n" + + "Deleting this network will delete all references \n" + + "to this network in the Container Configurations as well.", + "Delete Network", JOptionPane.YES_NO_OPTION); + if (confirm == JOptionPane.YES_OPTION){ + mainWindow.getCurrentData().deleteReferenceToNetwork(data.name); //Delete the network in data object + mainWindow.updateNetworkReferenceInContainerConfigDialogs("Delete",data.name, null); //Delete the network on the immediate UI interface + JPanel networkPanel = (JPanel)this.getParent(); + + // delete the network from the list + networkPanel.remove(this); + + // Shorten the panel height holding all the containers and resize it. + mainWindow.networkPanePanelLength-=51; + networkPanel.setPreferredSize(new Dimension(0,mainWindow.networkPanePanelLength)); + + // Redraw the panel containing the list of networks + networkPanel.revalidate(); + networkPanel.repaint(); + } + } + + // Prompts renaming fields + private void renameNetworkOptionActionPerformed(){ + // Make the rename textfield visible, active, and all text inside preselected + RenameNetworkTextfield.setText(data.name); + RenameNetworkTextfield.setVisible(true); + RenameNetworkTextfield.requestFocusInWindow(); + RenameNetworkTextfield.selectAll(); + + // Hide the original network label + NetworkLabelName.setVisible(false); + NetworkMaskLabel.setVisible(false); + } + + // Renames the network and refactors the name at the UI and data layer + private void renameNetworkTextfieldActionPerformed(){ + // Prompt user to confirm their changes + String newNetworkName = RenameNetworkTextfield.getText().toUpperCase(); + String oldName = data.name; + + int confirm = JOptionPane.showConfirmDialog(null, "Are you sure you want to rename the network '"+oldName+"' to '"+newNetworkName+"'?", + "Rename Network", JOptionPane.YES_NO_OPTION); + if (confirm == JOptionPane.YES_OPTION){ + // Rename the network on the data level + mainWindow.getCurrentData().refactorNetworkName(oldName,newNetworkName); + + //Rename the network on the immediate Container Dialog UI + mainWindow.updateNetworkReferenceInContainerConfigDialogs("Rename",oldName, newNetworkName); + + // Rename the network + NetworkLabelName.setText(newNetworkName); + data.name = newNetworkName; + //System.out.println("Renamed network to: "+data.name); + } + + // Hide the textfield and show the network label + RenameNetworkTextfield.setVisible(false); + NetworkLabelName.setVisible(true); + NetworkMaskLabel.setVisible(true); + + } + + // When User clicks off of the rename textfield + private void renameNetworkTextfieldFocusLost(){ + // Hide the textfield and show the network label + RenameNetworkTextfield.setVisible(false); + NetworkLabelName.setVisible(true); + NetworkMaskLabel.setVisible(true); + } + + // Updates the data object based on whats in the fields, closes the network configuration window, + // (and sets the mask label on the network panel) + public void networkConfigUpdateButton(){ + // Set the textfield and spinner values into the data Objects + this.data.mask = this.NetworkConfigMaskTextfield.getText(); + this.data.gateway = this.NetworkConfigGatewayTextField.getText(); + this.data.macvlan_ext = (int) this.NetworkConfigMacVLanExtSpinner.getValue(); + this.data.macvlan = (int) this.NetworkConfigMacVLanSpinner.getValue(); + this.data.tap = this.TapRadioButton.isSelected(); + + clicked = false; + NetworkConfigWindow.setVisible(false); + NetworkMaskLabel.setText(this.data.mask); + } + + + // CORE // + + // Set the fields of the Network Dialog Window with the data + private void loadDataIntoNetworkPanel(){ + this.NetworkConfigWindow.setTitle("NetworkConfig: "+this.data.name); + this.NetworkConfigMaskTextfield.setText(this.data.mask); + this.NetworkConfigGatewayTextField.setText(this.data.gateway); + this.NetworkConfigMacVLanExtSpinner.setValue(this.data.macvlan_ext); + this.NetworkConfigMacVLanSpinner.setValue(this.data.macvlan); + this.TapRadioButton.setSelected(this.data.tap); + } + + + // GETTERS // + + public LabData.NetworkData getConfigData(){ + return this.data; + } + + public JDialog getNetworkConfigDialog(){ + return NetworkConfigWindow; + } + public boolean configShowing(){ + return NetworkConfigWindow.isShowing(); + } + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton NetworkConfigCancelButton; + private javax.swing.JTextField NetworkConfigGatewayTextField; + private javax.swing.JSpinner NetworkConfigMacVLanExtSpinner; + private javax.swing.JSpinner NetworkConfigMacVLanSpinner; + private javax.swing.JTextField NetworkConfigMaskTextfield; + private javax.swing.JButton NetworkConfigUpdateButton; + private javax.swing.JDialog NetworkConfigWindow; + private javax.swing.JLabel NetworkLabelName; + private javax.swing.JLabel NetworkMaskLabel; + private javax.swing.JPopupMenu NetworkRightClick; + private javax.swing.JTextField RenameNetworkTextfield; + private javax.swing.JRadioButton TapRadioButton; + private javax.swing.JMenuItem deleteNetworkOption; + private javax.swing.JLabel jLabel4; + private javax.swing.JLabel jLabel5; + private javax.swing.JPopupMenu.Separator jSeparator1; + private javax.swing.JMenuItem renameNetworkOption; + // End of variables declaration//GEN-END:variables +} diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/PreferencesPanel.form b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/PreferencesPanel.form new file mode 100644 index 000000000..734c0f4f3 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/PreferencesPanel.form @@ -0,0 +1,117 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/PreferencesPanel.java b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/PreferencesPanel.java new file mode 100644 index 000000000..7381c9f22 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/PreferencesPanel.java @@ -0,0 +1,183 @@ +/* +This software was created by United States Government employees at +The Center for Cybersecurity and Cyber Operations (C3O) +at the Naval Postgraduate School NPS. Please note that within the +United States, copyright protection is not available for any works +created by United States Government employees, pursuant to Title 17 +United States Code Section 105. This software is in the public +domain and is not subject to copyright. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +*/ + +package labtainers.mainui; +import java.util.Properties; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.io.FileReader; +import java.io.File; +import java.io.FileOutputStream; + +/** + * + * @author mike + */ +public class PreferencesPanel extends javax.swing.JPanel { + javax.swing.JDialog dialog; + private File iniFile=null; + private Properties prefProperties = null; + /** + * Creates new form PreferencesPanel + */ + public PreferencesPanel() { + initComponents(); + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + jLabel1 = new javax.swing.JLabel(); + editorTextField = new javax.swing.JTextField(); + labtainersPathTextField = new javax.swing.JTextField(); + OKButton = new javax.swing.JButton(); + CancelButton = new javax.swing.JButton(); + registryTextField = new javax.swing.JTextField(); + + jLabel1.setText("Preferences"); + + editorTextField.setBorder(javax.swing.BorderFactory.createTitledBorder("Text editor")); + + labtainersPathTextField.setBorder(javax.swing.BorderFactory.createTitledBorder("LABTAINERS_DIR path")); + + OKButton.setText("OK"); + OKButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + OKButtonActionPerformed(evt); + } + }); + + CancelButton.setText("Cancel"); + CancelButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + CancelButtonActionPerformed(evt); + } + }); + + registryTextField.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Registry", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Dialog", 0, 14))); // NOI18N + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(241, 241, 241) + .addComponent(jLabel1)) + .addGroup(layout.createSequentialGroup() + .addGap(73, 73, 73) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(labtainersPathTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 483, Short.MAX_VALUE) + .addComponent(editorTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 472, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(registryTextField))) + .addGroup(layout.createSequentialGroup() + .addGap(157, 157, 157) + .addComponent(OKButton) + .addGap(64, 64, 64) + .addComponent(CancelButton))) + .addContainerGap(58, Short.MAX_VALUE)) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(jLabel1) + .addGap(39, 39, 39) + .addComponent(editorTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 54, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(labtainersPathTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 65, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(registryTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 53, Short.MAX_VALUE) + .addGap(18, 18, 18) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(OKButton) + .addComponent(CancelButton)) + .addGap(41, 41, 41)) + ); + }// //GEN-END:initComponents + + private void CancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_CancelButtonActionPerformed + this.dialog.setVisible(false); + }//GEN-LAST:event_CancelButtonActionPerformed + public void setDialog(javax.swing.JDialog dialog){ + this.dialog = dialog; + } + + private void OKButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_OKButtonActionPerformed + savePrefs(); + this.dialog.setVisible(false); + }//GEN-LAST:event_OKButtonActionPerformed + void setPrefs(File iniFile, Properties prefProperties){ + this.iniFile = iniFile; + this.prefProperties = prefProperties; + String textEditorPref = prefProperties.getProperty("textEditor"); + String labtainerPath = prefProperties.getProperty("labtainerPath"); + System.out.println("labtainerPath "+labtainerPath); + this.editorTextField.setText(textEditorPref); + this.labtainersPathTextField.setText(labtainerPath); + } + void savePrefs(){ + SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); + prefProperties.put("textEditor", this.editorTextField.getText()); + String path = this.labtainersPathTextField.getText(); + if(new File(path).isDirectory()){ + prefProperties.put("labtainerPath", this.labtainersPathTextField.getText()); + }else{ + System.out.println("Error path does not exist, ignored: "+path); + } + // write update to the ini File + Date date = new Date(); + try{ + FileOutputStream out = new FileOutputStream(this.iniFile); + prefProperties.store(out, "Updated: "+ formatter.format(date)); + out.close(); + }catch(java.io.FileNotFoundException ex){ + System.out.println(ex); + }catch(java.io.IOException ex){ + System.out.println(ex); + } + } + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton CancelButton; + private javax.swing.JButton OKButton; + private javax.swing.JTextField editorTextField; + private javax.swing.JLabel jLabel1; + private javax.swing.JTextField labtainersPathTextField; + private javax.swing.JTextField registryTextField; + // End of variables declaration//GEN-END:variables +} diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/Status.java b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/Status.java new file mode 100644 index 000000000..534e58599 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/Status.java @@ -0,0 +1,132 @@ +/* +This software was created by United States Government employees at +The Center for Cybersecurity and Cyber Operations (C3O) +at the Naval Postgraduate School NPS. Please note that within the +United States, copyright protection is not available for any works +created by United States Government employees, pursuant to Title 17 +United States Code Section 105. This software is in the public +domain and is not subject to copyright. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +*/ + +/* +Report on status of Docker containers using given labels and messages. +Running containers are named via strings matched to the output of "docker ps". +*/ +package labtainers.mainui; +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.IOException; +import java.util.regex.Pattern; +import java.util.regex.Matcher; +import java.util.Set; +import java.util.HashSet; +import java.util.ArrayList; + + +public class Status implements Runnable { + private class StatusInfo{ + protected javax.swing.JLabel label; + protected String message; + protected String look_for; + protected boolean was_running; + protected boolean now_running; + protected StatusInfo(javax.swing.JLabel label, String message, String look_for){ + this.label = label; + this.message = message; + this.look_for = look_for; + this.was_running = false; + this.now_running = false; + } + } + private javax.swing.JLabel label; + private String message; + private ArrayList look_for; + private boolean was_running = false; + private ArrayList status_info; + + public Status(javax.swing.JLabel label, String message, String look_for) { + this.status_info = new ArrayList(); + StatusInfo stat = new StatusInfo(label, message, look_for); + stat.label.setText(stat.message+" No"); + this.status_info.add(stat); + } + public void addLabel(javax.swing.JLabel label, String message, String look_for) { + StatusInfo stat = new StatusInfo(label, message, look_for); + stat.label.setText(stat.message+" No"); + this.status_info.add(stat); + } + public void changeLook(javax.swing.JLabel label, String look_for){ + for(StatusInfo stat : this.status_info){ + if(stat.label == label){ + stat.look_for = look_for; + break; + } + } + } + + public void run() { + Set running_set; + boolean now_running; + while(true) { + isRunning(); + for(StatusInfo stat : this.status_info){ + if(stat.now_running &! stat.was_running){ + stat.label.setText(stat.message+" Yes"); + }else if(!stat.now_running && stat.was_running){ + stat.label.setText(stat.message+" No"); + } + stat.was_running = stat.now_running; + } + try{ + Thread.sleep(2000); + }catch(InterruptedException ex){ + System.out.println(ex); + } + } + } + private void isRunning(){ + String line; + //Executable file name of the application to check. + + try{ + Process proc = Runtime.getRuntime().exec("docker ps"); + InputStream stream = proc.getInputStream(); + BufferedReader reader = new BufferedReader(new InputStreamReader(stream)); + for(StatusInfo stat : this.status_info){ + stat.now_running = false; + } + while ((line = reader.readLine()) != null) { + for(StatusInfo stat : this.status_info){ + Pattern pattern = Pattern.compile(stat.look_for); + Matcher matcher = pattern.matcher(line); + if (matcher.find()) { + stat.now_running = true; + } + } + } + }catch(IOException ex){ + System.out.println("Status error getting ps "+ex.toString()); + } + } +} diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/src/GoalsUI/ToolTipHandlers.java b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/ToolTipHandlers.java similarity index 52% rename from modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/src/GoalsUI/ToolTipHandlers.java rename to modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/ToolTipHandlers.java index a94b57ec1..67e0531ba 100644 --- a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Goals/src/GoalsUI/ToolTipHandlers.java +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/mainui/ToolTipHandlers.java @@ -1,75 +1,99 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package GoalsUI; - -import java.awt.Component; -import javax.swing.DefaultComboBoxModel; -import javax.swing.DefaultListCellRenderer; -import javax.swing.JComboBox; -import javax.swing.JComponent; -import javax.swing.JList; - -/** - * - * @author Daniel Liao - */ -public class ToolTipHandlers { - public static interface ToolTipProvider{ - public String getToolTip(); - } - - //Stores an item and its correspoinding tool tip. (Items put into a combobox) - public static class ToolTipWrapper implements ToolTipProvider{ - final String item; - final String toolTip; - - public ToolTipWrapper(String item, String toolTip){ - this.item = item; - this.toolTip = toolTip; - } - - @Override - public String getToolTip(){ - return toolTip; - } - - @Override - public String toString(){ - return item; - } - - public String getItem(){ - return item; - } - } - - //custom combobox renderer to handle ToolTipWrapper objects that contain an string item and string tool tip - public static class ComboBoxRenderer extends DefaultListCellRenderer { - - @Override - public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { - JComponent component = (JComponent) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); - String tip = null; - if (value instanceof ToolTipProvider) { - ToolTipProvider ttp = (ToolTipProvider) value; - tip = ttp.getToolTip(); - } - list.setToolTipText(tip); - return component; - } - } - - //Sets the combo items with associated tool tips (called in the constructors) - public static void setComboItems(JComboBox combobox, ToolTipWrapper[] items){ - ComboBoxRenderer renderer = new ComboBoxRenderer(); - combobox.setRenderer(renderer); - - for (ToolTipWrapper item : items) { - if(((DefaultComboBoxModel)combobox.getModel()).getIndexOf(item) == -1) - combobox.addItem(item); - } - } -} +/* +This software was created by United States Government employees at +The Center for Cybersecurity and Cyber Operations (C3O) +at the Naval Postgraduate School NPS. Please note that within the +United States, copyright protection is not available for any works +created by United States Government employees, pursuant to Title 17 +United States Code Section 105. This software is in the public +domain and is not subject to copyright. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + */ +package labtainers.mainui; + +import java.awt.Component; +import javax.swing.DefaultComboBoxModel; +import javax.swing.DefaultListCellRenderer; +import javax.swing.JComboBox; +import javax.swing.JComponent; +import javax.swing.JList; + +/** + * + * @author student + */ +public class ToolTipHandlers { + public static interface ToolTipProvider{ + public String getToolTip(); + } + + //Stores an item and its correspoinding tool tip. (Items put into a combobox) + public static class ToolTipWrapper implements ToolTipProvider{ + final String item; + final String toolTip; + + public ToolTipWrapper(String item, String toolTip){ + this.item = item; + this.toolTip = toolTip; + } + + @Override + public String getToolTip(){ + return toolTip; + } + + @Override + public String toString(){ + return item; + } + + public String getItem(){ + return item; + } + } + + //custom combobox renderer to handle ToolTipWrapper objects that contain an string item and string tool tip + public static class ComboBoxRenderer extends DefaultListCellRenderer { + + @Override + public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + JComponent component = (JComponent) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + String tip = null; + if (value instanceof ToolTipProvider) { + ToolTipProvider ttp = (ToolTipProvider) value; + tip = ttp.getToolTip(); + } + list.setToolTipText(tip); + return component; + } + } + + //Sets the combo items with associated tool tips (called in the constructors) + public static void setComboItems(JComboBox combobox, ToolTipWrapper[] items){ + ComboBoxRenderer renderer = new ComboBoxRenderer(); + combobox.setRenderer(renderer); + + for (ToolTipWrapper item : items) { + if(((DefaultComboBoxModel)combobox.getModel()).getIndexOf(item) == -1) + combobox.addItem(item); + } + } +} diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/paramsui/ContainerFileDialog.form b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/paramsui/ContainerFileDialog.form new file mode 100644 index 000000000..ddb946797 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/paramsui/ContainerFileDialog.form @@ -0,0 +1,108 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/paramsui/ContainerFileDialog.java b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/paramsui/ContainerFileDialog.java new file mode 100644 index 000000000..2fb005105 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/paramsui/ContainerFileDialog.java @@ -0,0 +1,171 @@ +/* +This software was created by United States Government employees at +The Center for Cybersecurity and Cyber Operations (C3O) +at the Naval Postgraduate School NPS. Please note that within the +United States, copyright protection is not available for any works +created by United States Government employees, pursuant to Title 17 +United States Code Section 105. This software is in the public +domain and is not subject to copyright. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + */ +package labtainers.paramsui; +import java.util.ArrayList; +import javax.swing.JDialog; +/** + * + * @author mike + */ +public class ContainerFileDialog extends javax.swing.JPanel { + boolean is_ok = false; + JDialog dialog = null; + ContainerFileTable container_file_table = null; + /** + * Creates new form ContainerFileDialog + */ + public ContainerFileDialog(ArrayList containers, ArrayList fileList) { + initComponents(); + container_file_table = new ContainerFileTable(containers, fileList); + TablePanel.add(container_file_table); + } + public boolean isOK(){ + return this.is_ok; + } + public void setDialog(JDialog dialog){ + this.dialog = dialog; + } + public ArrayList getFileList(){ + return container_file_table.getFileList(); + } + + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + okButton = new javax.swing.JButton(); + TablePanel = new javax.swing.JPanel(); + cancelButton = new javax.swing.JButton(); + AddButton = new javax.swing.JButton(); + DeleteButton = new javax.swing.JButton(); + + okButton.setText("OK"); + okButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + okButtonActionPerformed(evt); + } + }); + + TablePanel.setLayout(new java.awt.GridLayout(1, 0)); + + cancelButton.setText("Cancel"); + cancelButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + cancelButtonActionPerformed(evt); + } + }); + + AddButton.setText("Add"); + AddButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + AddButtonActionPerformed(evt); + } + }); + + DeleteButton.setText("Delete"); + DeleteButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + DeleteButtonActionPerformed(evt); + } + }); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(TablePanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(326, 326, 326) + .addComponent(okButton) + .addGap(76, 76, 76) + .addComponent(cancelButton)) + .addGroup(layout.createSequentialGroup() + .addGap(264, 264, 264) + .addComponent(AddButton) + .addGap(159, 159, 159) + .addComponent(DeleteButton))) + .addGap(0, 428, Short.MAX_VALUE))) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addGap(9, 9, 9) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(AddButton) + .addComponent(DeleteButton)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(TablePanel, javax.swing.GroupLayout.DEFAULT_SIZE, 413, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(cancelButton) + .addComponent(okButton)) + .addContainerGap()) + ); + }// //GEN-END:initComponents + + private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButtonActionPerformed + this.is_ok = true; + this.dialog.setVisible(false); + }//GEN-LAST:event_okButtonActionPerformed + + private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelButtonActionPerformed + this.dialog.setVisible(false); + }//GEN-LAST:event_cancelButtonActionPerformed + + private void DeleteButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_DeleteButtonActionPerformed + this.container_file_table.deleteRow(); + }//GEN-LAST:event_DeleteButtonActionPerformed + + private void AddButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_AddButtonActionPerformed + this.container_file_table.addRow(); + }//GEN-LAST:event_AddButtonActionPerformed + + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton AddButton; + private javax.swing.JButton DeleteButton; + private javax.swing.JPanel TablePanel; + private javax.swing.JButton cancelButton; + private javax.swing.JButton okButton; + // End of variables declaration//GEN-END:variables +} diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/paramsui/ContainerFileTable.java b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/paramsui/ContainerFileTable.java new file mode 100644 index 000000000..5c7e722fa --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/paramsui/ContainerFileTable.java @@ -0,0 +1,306 @@ +package labtainers.paramsui; + +/* + * TableRenderDemo.java requires no other files. + */ + +import java.util.ArrayList; +import javax.swing.DefaultCellEditor; +import javax.swing.JComboBox; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTable; +import javax.swing.table.AbstractTableModel; +import javax.swing.table.DefaultTableCellRenderer; +import javax.swing.table.TableCellRenderer; +import javax.swing.table.TableColumn; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.GridLayout; +import java.awt.event.MouseEvent; +import java.awt.event.MouseMotionAdapter; +import java.util.HashMap; +import java.util.Map; + +import javax.swing.JTable; +import javax.swing.table.JTableHeader; +import javax.swing.table.TableColumnModel; + +/** + + */ +public class ContainerFileTable extends JPanel { + private boolean DEBUG = true; + private boolean multipleContainers = false; + private JTable table; + private ArrayList containers; + public ContainerFileTable(ArrayList containers, ArrayList fileList) { + super(new GridLayout(1,0)); + + this.table = new JTable(new MyTableModel()); + this.containers = containers; + addList(fileList); + this.table.setRowSelectionInterval(0, 0); + table.setPreferredScrollableViewportSize(new Dimension(500, 70)); + table.setFillsViewportHeight(true); + + JScrollPane scrollPane = new JScrollPane(table); + + initColumnSizes(table); + + setUpContainersColumn(table, table.getColumnModel().getColumn(0), containers); + + add(scrollPane); + if(containers.size() > 1){ + multipleContainers = true; + } + + + JTableHeader header = table.getTableHeader(); + + ColumnHeaderToolTips tips = new ColumnHeaderToolTips(); + TableColumn container_col = this.table.getColumnModel().getColumn(0); + tips.setToolTip(container_col, "Click for combo box, select container whose file is to be modified or start.config
or select start.config to modify configuration values, e.g., IP addresses."); + TableColumn file_col = this.table.getColumnModel().getColumn(1); + tips.setToolTip(file_col, "Absolute path of the file to be modifed on the container."); + header.addMouseMotionListener(tips); + } + public ArrayList getFileList(){ + MyTableModel model = (MyTableModel)this.table.getModel(); + return model.getFileList(this.multipleContainers); + } + private void addList(ArrayList fileList){ + MyTableModel model = (MyTableModel)this.table.getModel(); + if(fileList != null && fileList.size() > 0){ + for(String item : fileList){ + System.out.println("addList item "+item); + String container = ""; + String file = ""; + if(item.contains(":")){ + String[] parts = item.split(":"); + container = parts[0]; + if(parts.length > 1){ + file = parts[1]; + } + }else if(item.equals("start.config")){ + container = item; + }else{ + file = item; + container = this.containers.get(0); + } + model.addRow(container, file); + } + }else{ + String container = this.containers.get(0); + model.addRow(container, ""); + } + } + public void addRow(){ + MyTableModel model = (MyTableModel)this.table.getModel(); + String container = this.containers.get(0); + model.addRow(container, ""); + int last = model.getRowCount()-1; + this.table.setRowSelectionInterval(last, last); + } + public void deleteRow(){ + int selected = this.table.getSelectedRow(); + if(selected >=0){ + MyTableModel model = (MyTableModel)this.table.getModel(); + model.deleteRow(selected); + this.table.setRowSelectionInterval(0, 0); + } + } + /* + * This method picks good column sizes. + * If all column heads are wider than the column's cells' + * contents, then you can just use column.sizeWidthToFit(). + */ + private void initColumnSizes(JTable table) { + MyTableModel model = (MyTableModel)table.getModel(); + TableColumn column = null; + Component comp = null; + int headerWidth = 0; + int cellWidth = 0; + Object[] longValues = model.longValues; + TableCellRenderer headerRenderer = + table.getTableHeader().getDefaultRenderer(); + + for (int i = 0; i < 1; i++) { + column = table.getColumnModel().getColumn(i); + + comp = headerRenderer.getTableCellRendererComponent( + null, column.getHeaderValue(), + false, false, 0, 0); + headerWidth = comp.getPreferredSize().width; + + comp = table.getDefaultRenderer(model.getColumnClass(i)). + getTableCellRendererComponent( + table, longValues[i], + false, false, 0, i); + cellWidth = comp.getPreferredSize().width; + + if (DEBUG) { + System.out.println("Initializing width of column " + + i + ". " + + "headerWidth = " + headerWidth + + "; cellWidth = " + cellWidth); + } + + column.setPreferredWidth(Math.max(headerWidth, cellWidth)); + } + } + + public void setUpContainersColumn(JTable table, + TableColumn containerColumn, ArrayList containers) { + //Set up the editor for the container column. + JComboBox comboBox = new JComboBox(); + for(String c : containers){ + comboBox.addItem(c); + } + comboBox.addItem("start.config"); + + containerColumn.setCellEditor(new DefaultCellEditor(comboBox)); + + //Set up tool tips for the container cells. + DefaultTableCellRenderer renderer = + new DefaultTableCellRenderer(); + renderer.setToolTipText("Click for combo box"); + containerColumn.setCellRenderer(renderer); + } + + class ColumnHeaderToolTips extends MouseMotionAdapter { + TableColumn curCol; + Map tips = new HashMap(); + public void setToolTip(TableColumn col, String tooltip) { + if (tooltip == null) { + tips.remove(col); + } else { + tips.put(col, tooltip); + } + } + public void mouseMoved(MouseEvent evt) { + JTableHeader header = (JTableHeader) evt.getSource(); + JTable table = header.getTable(); + TableColumnModel colModel = table.getColumnModel(); + int vColIndex = colModel.getColumnIndexAtX(evt.getX()); + TableColumn col = null; + if (vColIndex >= 0) { + col = colModel.getColumn(vColIndex); + } + if (col != curCol) { + header.setToolTipText((String) tips.get(col)); + curCol = col; + } + } + } + class MyTableModel extends AbstractTableModel { + private String[] columnNames = {"Container", + "File"}; + //private Object[][] data = { + //}; + private ArrayList data = new ArrayList(); + public void addRow(String container, String file){ + System.out.println("addRow "+container+":"+file); + String[] entry = {container, file}; + data.add(entry); + } + public void deleteRow(int row){ + data.remove(row); + fireTableDataChanged(); + } + + public final Object[] longValues = {"some container", "some file"}; + + public int getColumnCount() { + return columnNames.length; + } + + public int getRowCount() { + return data.size(); + } + + public String getColumnName(int col) { + return columnNames[col]; + } + + public Object getValueAt(int row, int col) { + String[] r = data.get(row); + return r[col]; + } + + /* + * JTable uses this method to determine the default renderer/ + * editor for each cell. If we didn't implement this method, + * then the last column would contain text ("true"/"false"), + * rather than a check box. + */ + public Class getColumnClass(int c) { + return getValueAt(0, c).getClass(); + } + + /* + * Don't need to implement this method unless your table's + * editable. + */ + public boolean isCellEditable(int row, int col) { + return true; + } + + /* + * Don't need to implement this method unless your table's + * data can change. + */ + public void setValueAt(Object value, int row, int col) { + if(row < getRowCount()){ + if (DEBUG) { + System.out.println("Setting value at " + row + "," + col + + " to " + value + + " (an instance of " + + value.getClass() + ")"); + } + String[] r = data.get(row); + r[col] = (String) value; + fireTableCellUpdated(row, col); + + if (DEBUG) { + System.out.println("New value of data:"); + printDebugData(); + } + } + } + + private void printDebugData() { + int numRows = getRowCount(); + int numCols = getColumnCount(); + + for (int i=0; i < numRows; i++) { + System.out.print(" row " + i + ":"); + for (int j=0; j < numCols; j++) { + //System.out.print(" " + data[i][j]); + } + System.out.println(); + } + System.out.println("--------------------------"); + } + public ArrayList getFileList(boolean multipleContainers){ + ArrayList retval = new ArrayList(); + String containerFile = ""; + for(String[] row : this.data){ + String container = row[0]; + String file = row[1]; + if(container.equals("start.config")){ + containerFile = container; + }else{ + if(!multipleContainers){ + containerFile = file; + }else{ + containerFile = container+":"+file; + } + } + retval.add(containerFile); + } + return retval; + } + } +} diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/paramsui/ParamPanels.form b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/paramsui/ParamPanels.form new file mode 100644 index 000000000..982259b35 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/paramsui/ParamPanels.form @@ -0,0 +1,330 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/paramsui/ParamPanels.java b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/paramsui/ParamPanels.java new file mode 100644 index 000000000..892f6f4da --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/paramsui/ParamPanels.java @@ -0,0 +1,494 @@ +/* +This software was created by United States Government employees at +The Center for Cybersecurity and Cyber Operations (C3O) +at the Naval Postgraduate School NPS. Please note that within the +United States, copyright protection is not available for any works +created by United States Government employees, pursuant to Title 17 +United States Code Section 105. This software is in the public +domain and is not subject to copyright. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + */ +package labtainers.paramsui; +import java.awt.Dimension; +import java.util.ArrayList; +import java.util.List; +import java.util.Arrays; +import javax.swing.DefaultComboBoxModel; +import javax.swing.JComboBox; +import javax.swing.JPanel; +import javax.swing.JTextField; +import javax.swing.JDialog; +import labtainers.mainui.ToolTipHandlers.ToolTipWrapper; +import labtainers.mainui.ToolTipHandlers.ToolTipWrapper; +import static labtainers.mainui.ToolTipHandlers.setComboItems; +import static labtainers.resultsui.ParamReferenceStorage.Operator_ITEMS; +import labtainers.resultsui.ParamReferenceStorage; +import labtainers.goalsui.DocPanel; + +/** + * + */ +public class ParamPanels extends javax.swing.JPanel { + + static Dimension dim = new Dimension(975, 100); + ParamsUI uiParam; + ParamsData dataUI; + int rowNum; + String comments=""; + + /** + * Creates new form ParamsPanel + */ + //Creating fresh params line + public ParamPanels(ParamsUI ui, int rowNum) { + initComponents(); + this.uiParam = ui; + this.dataUI = ui.data; + this.rowNum = rowNum; + + jLabel3.setText(Integer.toString(rowNum)); + LowerBoundTextField.setVisible(false); + + setComboItems(OperationComboBox, Operator_ITEMS); + } + + //Loading params line + public ParamPanels(ParamsUI ui, int rowNum, String paramID, ArrayList fileList, + String operator, String symbol, + String hashedString, String upperBound, String lowerBound, String step, String comments){ + initComponents(); + this.uiParam = ui; + this.dataUI = ui.data; + this.rowNum = rowNum; + this.comments = comments; + jLabel3.setText(Integer.toString(rowNum)); + + setComboItems(OperationComboBox, Operator_ITEMS); + + //Set Values + setOperatorComboBox(operator); + setParamIDTextField(paramID); + String file_list = String.join(";", fileList); + setFileTextField(file_list); + setSymbolTextField(symbol); + setHashedStringTextField(hashedString); + setUpperBoundTextField(upperBound); + setLowerBoundTextField(lowerBound); + setStepTextField(step); + + this.revalidate(); + this.repaint(); + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + jLabel3 = new javax.swing.JLabel(); + DeleteButton = new javax.swing.JButton(); + UpButton = new javax.swing.JButton(); + DownButton = new javax.swing.JButton(); + ParamPanel = new javax.swing.JPanel(); + ParamIDTextField = new javax.swing.JTextField(); + OperationComboBox = new javax.swing.JComboBox<>(); + FileNameTextField = new javax.swing.JTextField(); + SymbolTextField = new javax.swing.JTextField(); + LowerBoundTextField = new javax.swing.JTextField(); + UpperBoundTextField = new javax.swing.JTextField(); + HashedStringTextField = new javax.swing.JTextField(); + ShowListButton = new javax.swing.JButton(); + stepTextField = new javax.swing.JTextField(); + DocButton = new javax.swing.JButton(); + + setBorder(javax.swing.BorderFactory.createEtchedBorder()); + setMaximumSize(new java.awt.Dimension(1560, 86)); + setMinimumSize(new java.awt.Dimension(1560, 86)); + setName(""); // NOI18N + setPreferredSize(new java.awt.Dimension(1580, 86)); + + jLabel3.setFont(new java.awt.Font("Ubuntu", 1, 48)); // NOI18N + jLabel3.setText("10"); + + DeleteButton.setText("Delete"); + DeleteButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + DeleteButtonActionPerformed(evt); + } + }); + + UpButton.setFont(new java.awt.Font("Ubuntu Condensed", 0, 12)); // NOI18N + UpButton.setText("^"); + UpButton.setMaximumSize(new java.awt.Dimension(19, 50)); + UpButton.setMinimumSize(new java.awt.Dimension(19, 31)); + UpButton.setPreferredSize(new java.awt.Dimension(19, 31)); + UpButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + UpButtonActionPerformed(evt); + } + }); + + DownButton.setFont(new java.awt.Font("Ubuntu Condensed", 0, 12)); // NOI18N + DownButton.setText("v"); + DownButton.setToolTipText(""); + DownButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + DownButtonActionPerformed(evt); + } + }); + + ParamPanel.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1)); + + OperationComboBox.addItemListener(new java.awt.event.ItemListener() { + public void itemStateChanged(java.awt.event.ItemEvent evt) { + OperationComboBoxItemStateChanged(evt); + } + }); + OperationComboBox.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + OperationComboBoxActionPerformed(evt); + } + }); + + FileNameTextField.setToolTipText("Name of the file containing parameterized data."); + FileNameTextField.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "File name")); + + SymbolTextField.setHorizontalAlignment(javax.swing.JTextField.LEFT); + SymbolTextField.setToolTipText("Symbol within the file that is to be replaced, e.g., with a hash or a random value."); + SymbolTextField.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Symbol")); + + LowerBoundTextField.setHorizontalAlignment(javax.swing.JTextField.LEFT); + LowerBoundTextField.setToolTipText("Lower bound of random value."); + LowerBoundTextField.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Lower bound")); + LowerBoundTextField.setMinimumSize(new java.awt.Dimension(20, 100)); + + UpperBoundTextField.setHorizontalAlignment(javax.swing.JTextField.LEFT); + UpperBoundTextField.setToolTipText("Upper bound of random value."); + UpperBoundTextField.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Upper bound")); + UpperBoundTextField.setMinimumSize(new java.awt.Dimension(20, 100)); + + HashedStringTextField.setToolTipText("String to be hashed."); + HashedStringTextField.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Hashed string")); + + ShowListButton.setText("jButton1"); + ShowListButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + ShowListButtonActionPerformed(evt); + } + }); + + stepTextField.setHorizontalAlignment(javax.swing.JTextField.LEFT); + stepTextField.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Step")); + stepTextField.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + stepTextFieldActionPerformed(evt); + } + }); + + javax.swing.GroupLayout ParamPanelLayout = new javax.swing.GroupLayout(ParamPanel); + ParamPanel.setLayout(ParamPanelLayout); + ParamPanelLayout.setHorizontalGroup( + ParamPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(ParamPanelLayout.createSequentialGroup() + .addContainerGap() + .addComponent(ParamIDTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 138, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(35, 35, 35) + .addComponent(OperationComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 160, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(18, 18, 18) + .addComponent(FileNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 234, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(ShowListButton, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(38, 38, 38) + .addComponent(SymbolTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 142, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(LowerBoundTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 109, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(UpperBoundTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 108, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(stepTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 111, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(HashedStringTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 223, javax.swing.GroupLayout.PREFERRED_SIZE) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + ParamPanelLayout.setVerticalGroup( + ParamPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(ParamPanelLayout.createSequentialGroup() + .addGroup(ParamPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(ParamPanelLayout.createSequentialGroup() + .addGap(1, 1, 1) + .addGroup(ParamPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addGroup(ParamPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(ParamIDTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(OperationComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(ParamPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(LowerBoundTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(SymbolTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(UpperBoundTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(stepTextField) + .addComponent(HashedStringTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))) + .addComponent(ShowListButton) + .addComponent(FileNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(0, 23, Short.MAX_VALUE)) + ); + + DocButton.setText("Doc"); + DocButton.setToolTipText("Document this parameter."); + DocButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + DocButtonActionPerformed(evt); + } + }); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(jLabel3) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGroup(layout.createSequentialGroup() + .addGap(72, 72, 72) + .addComponent(ParamPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGap(18, 18, 18))) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(DownButton, javax.swing.GroupLayout.PREFERRED_SIZE, 33, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(UpButton, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 33, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(DeleteButton) + .addComponent(DocButton, javax.swing.GroupLayout.PREFERRED_SIZE, 61, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(22, 22, 22)) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(ParamPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(38, 38, 38) + .addComponent(jLabel3)) + .addGroup(layout.createSequentialGroup() + .addGap(3, 3, 3) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(UpButton, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(DeleteButton)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(DownButton) + .addComponent(DocButton))) + ); + }// //GEN-END:initComponents + + private void UpButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_UpButtonActionPerformed + swapUpdate("UP", rowNum-1); //Subtract rowNum by one to get the proper index number + }//GEN-LAST:event_UpButtonActionPerformed + + private void DownButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_DownButtonActionPerformed + swapUpdate("DOWN", rowNum-1); //Subtract rowNum by one to get the proper index number + }//GEN-LAST:event_DownButtonActionPerformed + + private void OperationComboBoxItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_OperationComboBoxItemStateChanged + operatorListener(); + }//GEN-LAST:event_OperationComboBoxItemStateChanged + + private void DeleteButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_DeleteButtonActionPerformed + deleteButton(); + }//GEN-LAST:event_DeleteButtonActionPerformed + + private void OperationComboBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_OperationComboBoxActionPerformed + //operatorListener(); + }//GEN-LAST:event_OperationComboBoxActionPerformed + + private void DocButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_DocButtonActionPerformed + DocPanel panel = new DocPanel(); + + panel.setDoc(this.comments); + //panel.setVisible(true); + JDialog dialog = new JDialog(); + panel.setDialog(dialog); + //dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); + dialog.setModal(true); + dialog.add(panel); + dialog.pack(); + dialog.setLocation(200, 200); + dialog.setTitle("Documentation for "+ParamIDTextField.getText()); + dialog.setVisible(true); + if(panel.isOK()){ + this.comments = panel.getDoc(); + } + }//GEN-LAST:event_DocButtonActionPerformed + + private void ShowListButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ShowListButtonActionPerformed + String file_list = getFileTextField().getText(); + String fileArray[] = file_list.split(";"); + List list = new ArrayList(); + list = Arrays.asList(fileArray); + ArrayList fileList = new ArrayList(list); + ContainerFileDialog panel = new ContainerFileDialog(this.dataUI.getContainerList(), fileList); + + //panel.tableSetup(); + panel.setOpaque(true); + JDialog dialog = new JDialog(); + panel.setDialog(dialog); + //dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); + dialog.setModal(true); + dialog.add(panel); + dialog.pack(); + dialog.setLocation(200, 200); + dialog.setTitle("Files to modify"); + dialog.setVisible(true); + if(panel.isOK()){ + System.out.println("is ok "); + fileList = panel.getFileList(); + file_list = String.join(";", fileList); + setFileTextField(file_list); + } + dialog.dispose(); + }//GEN-LAST:event_ShowListButtonActionPerformed + + private void stepTextFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_stepTextFieldActionPerformed + // TODO add your handling code here: + }//GEN-LAST:event_stepTextFieldActionPerformed + + private void deleteButton(){ + JPanel panelOfParams = (JPanel)this.getParent(); + panelOfParams.remove(this); + uiParam.data.rowCount--; + uiParam.refresh(); + } + private void operatorListener(){ + ToolTipWrapper operator = (ToolTipWrapper)OperationComboBox.getSelectedItem(); + if(operator == null){ + return; + } + //adjustToolTip(operator.getItem()); + String op_string = operator.getItem(); + if(op_string.contains("RAND")){ + LowerBoundTextField.setVisible(true); + UpperBoundTextField.setVisible(true); + stepTextField.setVisible(true); + }else{ + LowerBoundTextField.setVisible(false); + UpperBoundTextField.setVisible(false); + } + if(op_string.contains("REPLACE")){ + SymbolTextField.setVisible(true); + }else{ + SymbolTextField.setVisible(false); + } + if(op_string.contains("HASH")){ + HashedStringTextField.setVisible(true); + }else{ + HashedStringTextField.setVisible(false); + } + ParamPanel.revalidate(); + ParamPanel.repaint(); + } + + + //Swaps artifact order in the list of artifacts and then redraws them + void swapUpdate(String type, int rowIndex){ + //System.out.println("RowCOUNT(swap): " +dataUI.rowCount); + dataUI.updateListofParams(uiParam.getPanelofParams()); + dataUI.swapParams(type, rowIndex); + uiParam.loadUI(); + } + + //Field Getters + public JTextField getParamIDTextField(){ + return ParamIDTextField; + } + public JTextField getFileTextField(){ + return FileNameTextField; + } + public JComboBox getOperatorComboBox(){ + return OperationComboBox; + } + public JTextField getSymbolTextField(){ + return SymbolTextField; + } + public JTextField getHashedStringTextField(){ + return HashedStringTextField; + } + public JTextField getLowerBoundTextField(){ + return LowerBoundTextField; + } + public JTextField getUpperBoundTextField(){ + return UpperBoundTextField; + } + public JTextField getStepTextField(){ + return stepTextField; + } + public String getComments(){ + return this.comments; + } + //Field SETTERS + private void setParamIDTextField(String v){ + ParamIDTextField.setText(v); + } + private void setFileTextField(String v){ + FileNameTextField.setText(v); + } + private void setSymbolTextField(String v){ + SymbolTextField.setText(v); + } + private void setHashedStringTextField(String v){ + HashedStringTextField.setText(v); + } + private void setLowerBoundTextField(String v){ + LowerBoundTextField.setText(v); + } + private void setUpperBoundTextField(String v){ + UpperBoundTextField.setText(v); + } + private void setStepTextField(String v){ + stepTextField.setText(v); + } + private void setOperatorComboBox(String v){ + ToolTipWrapper tip = ParamReferenceStorage.getWrapper(Operator_ITEMS, v); + OperationComboBox.setSelectedItem(tip); + } + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton DeleteButton; + private javax.swing.JButton DocButton; + private javax.swing.JButton DownButton; + private javax.swing.JTextField FileNameTextField; + private javax.swing.JTextField HashedStringTextField; + private javax.swing.JTextField LowerBoundTextField; + private javax.swing.JComboBox OperationComboBox; + private javax.swing.JTextField ParamIDTextField; + private javax.swing.JPanel ParamPanel; + private javax.swing.JButton ShowListButton; + private javax.swing.JTextField SymbolTextField; + private javax.swing.JButton UpButton; + private javax.swing.JTextField UpperBoundTextField; + private javax.swing.JLabel jLabel3; + private javax.swing.JTextField stepTextField; + // End of variables declaration//GEN-END:variables +} diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/paramsui/ParamValues.java b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/paramsui/ParamValues.java new file mode 100644 index 000000000..b9a9d44a1 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/paramsui/ParamValues.java @@ -0,0 +1,162 @@ +/* +This software was created by United States Government employees at +The Center for Cybersecurity and Cyber Operations (C3O) +at the Naval Postgraduate School NPS. Please note that within the +United States, copyright protection is not available for any works +created by United States Government employees, pursuant to Title 17 +United States Code Section 105. This software is in the public +domain and is not subject to copyright. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + */ +package labtainers.paramsui; +import java.util.ArrayList; +import java.util.Arrays; +import labtainers.mainui.ToolTipHandlers; +import static labtainers.resultsui.ParamReferenceStorage.FieldType_ITEMS; +import static labtainers.resultsui.ParamReferenceStorage.LineType_ITEMS; +import static labtainers.resultsui.ParamReferenceStorage.SpecialTimeStampType; +import static labtainers.resultsui.ParamReferenceStorage.TimestampType_ITEMS; +import static labtainers.resultsui.ParamReferenceStorage.justFieldType; +import static labtainers.resultsui.ParamReferenceStorage.lineParamAccessible; + +/** + * + * @author MFT + */ +public class ParamValues { + //Values to be obtained + String paramID, symbol, hashedString; + ArrayList fileList = new ArrayList(); + String upperBound, lowerBound, step; + String comments = ""; + String operator; + String inputLine = ""; + //Stores the values of an parameter fed into it (NO real value validation happening here) + ParamValues(String inputLine) { + this.inputLine = inputLine; + } + void load() throws java.lang.ArrayIndexOutOfBoundsException { + String paramLine; + if(this.inputLine.contains("\n")){ + String[] the_lines = this.inputLine.split("\n"); + paramLine = the_lines[the_lines.length-1]; + for(int i=0; i 6){ + step = paramParsedLine[6].trim(); + } + } + } + if(operator.equals("HASH_CREATE")){ + hashedString = paramParsedLine[3].trim(); + }else if(operator.equals("HASH_REPLACE")){ + hashedString = paramParsedLine[4].trim(); + } + } + + //Constructor for temporarily storing values of artifacts in the UI + ParamValues(String paramID, ArrayList fileList, String operator, + String symbol, String hashedString, + String lowerBound, String upperBound, String step, String comments){ + this.paramID = paramID; + this.fileList = fileList; + this.operator = operator; + this.symbol = symbol; + this.hashedString = hashedString; + this.lowerBound = lowerBound; + this.upperBound = upperBound; + this.step = step; + this.comments = comments; + } + + //Clones the original Params Values + ParamValues(ParamValues original){ + this.paramID = original.paramID; + for(String containerFile : original.fileList){ + this.fileList.add(containerFile); + } + this.operator = original.operator; + this.symbol = original.symbol; + this.hashedString = original.hashedString; + this.lowerBound = original.lowerBound; + this.upperBound = original.upperBound; + this.step = original.step; + this.comments = original.comments; + } + + private ToolTipHandlers.ToolTipWrapper itemFinder(ToolTipHandlers.ToolTipWrapper[] list,String desired){ + for(ToolTipHandlers.ToolTipWrapper item : list){ + if(item.getItem().equals(desired)){ + return item; + } + } + return null; + } + + private boolean itemExistCheck(ToolTipHandlers.ToolTipWrapper[] list,String desired){ + for(ToolTipHandlers.ToolTipWrapper item : list){ + if(item.getItem().equals(desired)){ + return true; + } + } + return false; + } + + private boolean isInteger(String s){ + try{ + Integer.parseInt(s); + + return true; + } + catch(NumberFormatException ex){ + return false; + } + } + +} diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/paramsui/ParamsData.java b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/paramsui/ParamsData.java new file mode 100644 index 000000000..c9f7b0f7f --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/paramsui/ParamsData.java @@ -0,0 +1,638 @@ +/* +This software was created by United States Government employees at +The Center for Cybersecurity and Cyber Operations (C3O) +at the Naval Postgraduate School NPS. Please note that within the +United States, copyright protection is not available for any works +created by United States Government employees, pursuant to Title 17 +United States Code Section 105. This software is in the public +domain and is not subject to copyright. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + */ +package labtainers.paramsui; + +import labtainers.resultsui.*; +import labtainers.mainui.ToolTipHandlers; +import labtainers.mainui.CompareTextFiles; +import java.awt.Component; +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import labtainers.mainui.MainWindow; +import labtainers.mainui.ToolTipHandlers.ToolTipWrapper; + +/** + * + * @author Daniel Liao + */ +public class ParamsData { + protected List listofParams; + static public ArrayList containerList = new ArrayList(); + protected int rowCount; + MainWindow mainUI; + public int test = 0; + + public ParamsData(MainWindow main, File labPath){ + listofParams = new ArrayList(); + rowCount = 0; + + this.mainUI = main; + } + + // Creates a deep copy of the original (shallow with containerList and mainUI) + public ParamsData(ParamsData original){ + listofParams = new ArrayList(); + //Deep copy the list of params + for(ParamValues param : original.listofParams){ + ParamValues pv = new ParamValues(param); + listofParams.add(pv); + } + + this.rowCount = original.getRowCount(); + + this.mainUI = original.getMainWindow(); + } +//Retrieving and Setting Data~~~~~~~~~~~~~~~~~~~~~~~~~ + + //Parses the parameter.config to obtain all the relevant param lines, + //extracts the values of each param line + //and then loads each param line's value into the list of Params + public void retrieveData(){ + ArrayList params = getParamLines(); + + if(params != null){ + //Fill the list of params + for(String paramLine : params){ + ParamValues pv = new ParamValues(paramLine); + try{ + //System.out.println("add parsed paramLine "+paramLine); + pv.load(); + listofParams.add(pv); + rowCount++; + }catch(java.lang.ArrayIndexOutOfBoundsException exa){ + System.out.println("ERROR: "+exa); + System.out.println("Error retrieveData parsing parameter line: "+paramLine+"\n"); + mainUI.output("Error parsing parameter line: "+paramLine+"\n"); + mainUI.output(exa.toString()); + } + } + } + } + + //Updates the containerlist (all parameter panels refer to this list to fill in the container combobox) + static public void setContainerList(ArrayList newContainerList){ + containerList = newContainerList; + } + + +//WRITING~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + //Update the parameter.config file with the user's input + // If usetmp return the path the temporary configuration file. + public String writeParamsConfig(boolean usetmp){ + File paramsConfigFile = null; + try { + String paramID, + containerFile, + symbol, + hashedString; + String upperBound, lowerBound, step; + String comments; + String paramsConfigText = ""; + + ErrorHandler error = new ErrorHandler(); + ArrayList paramTagList = new ArrayList(); //Used for duplication checking + + //Iterate through each param + for(int i=0;i < listofParams.size();i++){ + error.checkReset(); //Reset the error statuses for a new param line + + String paramConfigLine = listofParams.get(i).comments; + + paramID = listofParams.get(i).paramID; + paramTagList.add(paramID); + + //Checks if paramID is valid or inputted + if(paramID.matches("^[a-zA-Z0-9_]+$")) + paramConfigLine += (paramID + " : "); //add to param Config line + else if(paramID.isEmpty() || paramID.equals("")) + error.paramIDMissing = true; + else{ + System.out.println("Bad characters in Param ID"+ paramID); + System.out.println(paramConfigLine); + error.paramError = true; + } + String operator = listofParams.get(i).operator; + paramConfigLine += operator + " : "; + + + //FILEID CONFIG + containerFile = String.join(";", listofParams.get(i).fileList); + if(containerFile.length() == 0){ + System.out.println("Bad file for param ID "+ paramID); + error.fileIDMissing = true; + } + paramConfigLine += containerFile+" : "; + + if(operator.contains("REPLACE")){ + symbol = listofParams.get(i).symbol.trim(); + if(symbol.length() == 0){ + error.badSymbol = true; + System.out.println("Bad symbol: "+symbol); + } + paramConfigLine += symbol; + } + if(operator.contains("RAND")){ + String upper = listofParams.get(i).upperBound.trim(); + String lower = listofParams.get(i).lowerBound.trim(); + String step_str = listofParams.get(i).step.trim(); + if(upper.length() == 0 || lower.length() == 0){ + error.badRange = true; + System.out.println("Bad range for random values: "+lower+":"+upper); + } + if(step_str == "1"){ + paramConfigLine += " : "+lower+" : "+upper; + }else{ + paramConfigLine += " : "+lower+" : "+upper+" : "+step_str; + } + } + if(operator.contains("HASH")){ + paramConfigLine += " : "+listofParams.get(i).hashedString; + } + + //If there's no error, put the paramConfigLine in the paramsConfigText string, + //Otherwise the overallPass of the user input is false + if(error.userInputCheck(i+1)){ + if(i < listofParams.size()-1) + paramConfigLine+= "\n"; + //Add the param config line to the Params Config text + paramsConfigText += paramConfigLine; + } + else + error.fail(); + } // end for each param + + //Check for duplicate param IDs + error.checkDuplicateParamID(paramTagList); + /* + for(String rt : paramID) + System.out.println(rt); + */ + + if(error.passStatus()){ + //Resets the parameter.config file + paramsConfigFile = initializeParamConfig(usetmp); + + try ( //Write the paramConfigText to the params.config + BufferedWriter writer = new BufferedWriter(new FileWriter(paramsConfigFile, true))) { + writer.write(paramsConfigText+"\n"); + writer.close(); + } + /* + if(usetmp){ + String new_file = paramsConfigFile.getAbsolutePath(); + String old_file = getParamFileName(); + boolean same = CompareTextFiles.compare(old_file, new_file); + if(!same){ + retval = false; + System.out.println("files differ"); + } + } + */ + } + else + JOptionPane.showMessageDialog(null, error.toString(), "INPUT ERROR", JOptionPane.ERROR_MESSAGE); + } + catch (IOException ex) { + Logger.getLogger(ParamsUI.class.getName()).log(Level.SEVERE, null, ex); + } + if(paramsConfigFile != null){ + return paramsConfigFile.getAbsolutePath(); + }else{ + return null; + } + } + private String getParamFileName(){ + String retval = mainUI.getCurrentLab() + File.separator + "config" + File.separator + "parameter.config"; + return retval; + } + //Checks if the parameter.config file exists and prepares the parameter.config file for the lab + private File initializeParamConfig(boolean usetmp) throws IOException{ + //Get the filepath for the lab's parameter.config + File paramsConfigFile=null; + if(!usetmp){ + paramsConfigFile = new File(getParamFileName()); + }else{ + Path tempDir=null; + try{ + tempDir = Files.createTempDirectory(mainUI.getLabName()); + }catch(IOException ex){ + System.out.println("failed creating temporary directory" + ex); + System.exit(1); + } + String dir_s = tempDir.getFileName().toString(); + paramsConfigFile = new File(File.separator+"tmp"+File.separator+dir_s + File.separator + "parameter.config"); + } + if(paramsConfigFile.exists()){ + //Overwrite parameter.config file if it already exists + try (BufferedWriter writer = new BufferedWriter(new FileWriter(paramsConfigFile, false))) { + // writer.write(baseText); + } + return paramsConfigFile; + } + else if(paramsConfigFile.createNewFile()){ + //Create new parameter.config file otherwise(if it does not already exist) + try (BufferedWriter writer = new BufferedWriter(new FileWriter(paramsConfigFile))) { + //writer.write(baseText); + } + return paramsConfigFile; + } + else{ //File could not be created so return error message + System.out.println("Parameter Config File couldn't be initialzed."); + return null; + } + } + + //Handles all the error data and error checking before writing the parameter.config + private class ErrorHandler{ + private boolean overallPass; + private String errorMsg; + private boolean + paramError, + fileError, + + paramIDMissing, + fileIDMissing, + badRange, + badSymbol; + + + ErrorHandler(){ + overallPass = true; + errorMsg = ""; + checkReset(); + } + + void fail(){ + overallPass = false; + } + + //Resets the error status(used right before looking at new param line) + private void checkReset(){ + paramError = false; + fileError = false; + + paramIDMissing = false; + fileIDMissing = false; + badRange = false; + badSymbol = false; + + } + + //Builds error message detailing the errors that appear in the user input + boolean userInputCheck(int paramIndex){ + boolean rowPassed = true; + String infoMsg = "Parameter Line: " + paramIndex + System.lineSeparator(); + + if(paramIDMissing){ + rowPassed = false; + infoMsg+= "-Param ID input is missing." + System.lineSeparator(); + } + if(fileIDMissing){ + rowPassed = false; + infoMsg+= "-File ID input is missing." + System.lineSeparator(); + } + if(paramError){ + rowPassed = false; + infoMsg+= "-Make sure your Param ID has only alphanumeric characters or underscores." + System.lineSeparator(); + } + if(badRange){ + rowPassed = false; + infoMsg+= "-Make sure your random range values are set." + System.lineSeparator(); + } + if(badSymbol){ + rowPassed = false; + infoMsg+= "-Make sure your symbol to be replaced is set." + System.lineSeparator(); + } + //if(fileError){ + // rowPassed = false; + // infoMsg+= "-Make sure your File ID file's extentsion ends in \".stdin\", \".stdout\", or \".prgout\"." + System.lineSeparator() + " Or is a file path." + System.lineSeparator(); + //} + + + if(!rowPassed) + errorMsg += (infoMsg + System.lineSeparator()); + + return rowPassed; + } + + //Check for duplicate param ID + void checkDuplicateParamID(ArrayList paramIDs){ + ArrayList markedParamIDs = new ArrayList(); + + //Store all the indices for each unique param ID + for(int i=0;i 1){ + duplicateErrorMsg+= "Duplicate Param ID: \"" + rt.paramID + "\" on rows "; + + for(int i=0;i indices; + + ParamIDIndices(String paramID, int index){ + this.paramID = paramID; + indices = new ArrayList(); + indices.add(index); + } + + void addIndex(int index){ + indices.add(index); + } + } + + //Is the param ID already in the duplicate list? + boolean isDuplicate(ArrayList markedParamIDs, String paramID){ + for(ParamIDIndices rtIndices : markedParamIDs){ + if(rtIndices.paramID.equals(paramID)) + return true; + } + return false; + } + + //Get the duplicate object based on the duplicate string + ParamIDIndices getDuplicate(ArrayList markedParamIDs, String paramID){ + for(ParamIDIndices rtIndices : markedParamIDs){ + if(rtIndices.paramID.equals(paramID)) + return rtIndices; + } + return null; + } + + + @Override + public String toString(){ + return errorMsg; + } + + boolean passStatus(){ + return overallPass; + } + } + + +//GENERAL~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + //Gets the param lines in the parameter.config + protected ArrayList getParamLines(){ + ArrayList params = new ArrayList(); + + try { + File paramsConfig = new File(mainUI.getCurrentLab()+File.separator+"config"+File.separator+"parameter.config"); + + //Get the param lines + if(paramsConfig.exists()){ + try (FileReader fileReader = new FileReader(paramsConfig)) { + BufferedReader bufferedReader = new BufferedReader(fileReader); + String line = bufferedReader.readLine().trim(); + String param_line = ""; + while (line != null) { + param_line = param_line + line; + //if(!line.isEmpty() && line.charAt(0) != '#' && !Character.isWhitespace(line.charAt(0))){ + if(line.length() > 0 && line.charAt(0) != '#'){ + params.add(param_line); + param_line = ""; + }else{ + param_line=param_line+"\n"; + } + line = bufferedReader.readLine(); + } + } + return params; + } + else{ + System.out.println("No parameter.config file in the loaded lab!"); + //Create the missing parameter.config file + paramsConfig.createNewFile(); + return params; + } + } + catch (IOException e) { + System.out.println("Issue with getting parameter.config params"); + return null; + } + } + + //Updates the list of params + protected void updateListofParams(JPanel PanelofParams){ + Component[] params = PanelofParams.getComponents(); //Access the list of params + + List listofParamsTMP = new ArrayList(); + + //Iterate through each param and add it to the temp list of param values + for (Component param : params) { + //RESULTS TAG + String paramID = ((ParamPanels) param).getParamIDTextField().getText(); + String file = ((ParamPanels) param).getFileTextField().getText(); + ArrayList fileList = new ArrayList(); + String [] farray = file.split(";"); + for(String f : farray){ + fileList.add(f); + } + //String container = (String) (((ParamPanels) param).getContainerComboBox().getSelectedItem()); + ToolTipHandlers.ToolTipWrapper operatorTT = (ToolTipHandlers.ToolTipWrapper) (((ParamPanels) param).getOperatorComboBox().getSelectedItem()); + String operator = operatorTT.getItem(); + String symbol = ((ParamPanels) param).getSymbolTextField().getText(); + String hashedString = ((ParamPanels) param).getHashedStringTextField().getText(); + String lowerBound = ((ParamPanels) param).getLowerBoundTextField().getText(); + String upperBound = ((ParamPanels) param).getUpperBoundTextField().getText(); + String step = ((ParamPanels) param).getStepTextField().getText(); + String comments = ((ParamPanels) param).getComments(); + + listofParamsTMP.add(new ParamValues(paramID, fileList, operator, symbol, hashedString, lowerBound, upperBound, step, comments)); + } + + listofParams = listofParamsTMP; //overwrite the old listofParams with the temp listofParams + } + + //Swaps the position of params in a list + protected void swapParams(String type, int rowIndex){ + + switch(type){ + case "UP": + if(rowIndex > 0){ + //System.out.println("UP: "+listofParams.get(rowIndex).paramID+" Index: "+rowIndex); + Collections.swap(listofParams, rowIndex, rowIndex-1); + } + break; + case "DOWN": + //System.out.println(rowCount); + //System.out.println("RowINdex: " + rowIndex + " RowCount-1: "+ (rowCount-1)); + if(rowIndex < rowCount-1){ + //System.out.println("DOWN: "+listofParams.get(rowIndex).paramID); + Collections.swap(listofParams, rowIndex, rowIndex+1); + } + break; + default: + System.out.println("swap case no register"); + } + } + + //Gets a list of ParamValues from the the current state of the parameter.config file + protected List getParamValuesOfConfigFile(){ + List officialListofParams = new ArrayList(); + + ArrayList paramLines = getParamLines(); + + if(paramLines != null){ + + for(String paramLine : paramLines){ + ParamValues pv = new ParamValues(paramLine); + try{ + pv.load(); + officialListofParams.add(pv); + }catch(java.lang.ArrayIndexOutOfBoundsException exa){ + System.out.println("ERROR: "+exa); + System.out.println("Error getParamValuesOfConfigFile parsing parameter line: "+paramLine+"\n"); + mainUI.output("Error parsing parameter line: "+paramLine+"\n"); + mainUI.output(exa.toString()); + } + } + return officialListofParams; + } + else + return null; + } + + + // Param Value objects that reference the old Container to the new Container name + // TBD fix this + public void refactorContainerReference(String oldContainer, String newContainer){ + //Updates the listOfValues to reflect a change of a conainer name to a new name + for(ParamValues param : listofParams){ + //System.out.println(param.container + " " + oldContainer); + //if(param.container.equals(oldContainer)){ + // param.container = newContainer; + // System.out.println(param.container); + //} + } + + //Update the container list with the renamed container + ArrayList tmp = new ArrayList(); + for(String container : containerList){ + if(container.equals(oldContainer)) + tmp.add(newContainer); + else + tmp.add(container); + } + containerList = tmp; + } + + //Updates container list and removes Param Value objects that reference the container + public void removeContainerReference(String container){ + // Deletes all param lines that include the container + // TBD fix this + ArrayList toRemove = new ArrayList(); + for(ParamValues param : listofParams){ + //if(param.container.equals(container)) + // toRemove.add(param); + } + listofParams.removeAll(toRemove); + + //Update delete the container in the container list + containerList.remove(container); + } + + +//GETTERS~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + protected List getListofParams(){ + return listofParams; + } + + protected ArrayList getContainerList(){ + return containerList; + } + + protected int getRowCount(){ + return rowCount; + } + + protected MainWindow getMainWindow(){ + return mainUI; + } + public ArrayList getParamNames(){ + ArrayList paramTagList = new ArrayList(); //Used for duplication checking + + for(int i=0;i < listofParams.size();i++){ + String paramID = listofParams.get(i).paramID; + paramTagList.add(paramID); + } + return paramTagList; + } + +} diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/paramsui/ParamsUI.form b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/paramsui/ParamsUI.form new file mode 100644 index 000000000..dbf98d8f7 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/paramsui/ParamsUI.form @@ -0,0 +1,158 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/paramsui/ParamsUI.java b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/paramsui/ParamsUI.java new file mode 100644 index 000000000..c56bc1517 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/paramsui/ParamsUI.java @@ -0,0 +1,377 @@ +/* +This software was created by United States Government employees at +The Center for Cybersecurity and Cyber Operations (C3O) +at the Naval Postgraduate School NPS. Please note that within the +United States, copyright protection is not available for any works +created by United States Government employees, pursuant to Title 17 +United States Code Section 105. This software is in the public +domain and is not subject to copyright. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + */ +package labtainers.paramsui; + +import java.awt.Component; +import java.awt.Dimension; +import javax.swing.JFrame; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JScrollBar; +import labtainers.mainui.MainWindow; +import labtainers.goalsui.GoalsData; +import labtainers.goalsui.GoalsUI; + +/** + * + * @author Daniel Liao + */ +public class ParamsUI extends javax.swing.JFrame { + + /** + * Creates new form NewJDialog + */ + ParamsData data; + ParamsData saved; + MainWindow mainUI; + + public ParamsUI(java.awt.Frame parent, boolean modal) { + //super(parent); + initComponents(); + this.setVisible(true); + paramsScrollPaneBar = ScrollPaneOfParams.getVerticalScrollBar(); + + this.mainUI = (MainWindow)parent; + this.data = new ParamsData(this.mainUI.getCurrentData().getParamsData()); + this.saved = new ParamsData(this.data); + + loadUI(); + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + ScrollPaneOfParams = new javax.swing.JScrollPane(); + PanelofParams = new javax.swing.JPanel(); + CreateButton = new javax.swing.JButton(); + RemoveAllButton = new javax.swing.JButton(); + UpdateButton = new javax.swing.JButton(); + jLabel5 = new javax.swing.JLabel(); + jLabel1 = new javax.swing.JLabel(); + CancelButton = new javax.swing.JButton(); + + setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); + setTitle("Results Configuration"); + setMinimumSize(new java.awt.Dimension(1590, 500)); + setResizable(false); + addWindowListener(new java.awt.event.WindowAdapter() { + public void windowClosing(java.awt.event.WindowEvent evt) { + formWindowClosing(evt); + } + }); + + PanelofParams.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT)); + ScrollPaneOfParams.setViewportView(PanelofParams); + + CreateButton.setText("Create"); + CreateButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + CreateButtonActionPerformed(evt); + } + }); + + RemoveAllButton.setText("Remove All"); + RemoveAllButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + RemoveAllButtonActionPerformed(evt); + } + }); + + UpdateButton.setText("OK"); + UpdateButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + UpdateButtonActionPerformed(evt); + } + }); + + jLabel5.setFont(new java.awt.Font("Arial", 1, 12)); // NOI18N + jLabel5.setText("Operator"); + jLabel5.setToolTipText("File should either be a file path or a program/utility name with the \".stdin\", \".stdout\", or \".prgout\" extension.\n\n Ex. \"test.stdin\", \".local/result/sniff.txt\" "); + + jLabel1.setFont(new java.awt.Font("Arial", 1, 12)); // NOI18N + jLabel1.setText("Param ID"); + jLabel1.setToolTipText("The symbolic name of the result, which will be referenced in the goals configuration file. \n\n(It must be alphanumeric, underscores permitted) "); + + CancelButton.setText("Cancel"); + CancelButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + CancelButtonActionPerformed(evt); + } + }); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addGap(0, 12, Short.MAX_VALUE) + .addComponent(ScrollPaneOfParams, javax.swing.GroupLayout.PREFERRED_SIZE, 1566, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(CreateButton, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(RemoveAllButton, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(layout.createSequentialGroup() + .addGap(91, 91, 91) + .addComponent(jLabel1) + .addGap(104, 104, 104) + .addComponent(jLabel5))) + .addGap(0, 0, Short.MAX_VALUE))) + .addContainerGap()) + .addGroup(layout.createSequentialGroup() + .addGap(542, 542, 542) + .addComponent(UpdateButton, javax.swing.GroupLayout.PREFERRED_SIZE, 113, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(18, 18, 18) + .addComponent(CancelButton) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(CreateButton) + .addComponent(RemoveAllButton)) + .addGap(18, 18, 18) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel1) + .addComponent(jLabel5)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(ScrollPaneOfParams, javax.swing.GroupLayout.PREFERRED_SIZE, 397, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(UpdateButton) + .addComponent(CancelButton)) + .addContainerGap(39, Short.MAX_VALUE)) + ); + + pack(); + }// //GEN-END:initComponents + + private void CreateButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_CreateButtonActionPerformed + createButton(); + }//GEN-LAST:event_CreateButtonActionPerformed + + private void RemoveAllButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_RemoveAllButtonActionPerformed + removeAllButton(); + }//GEN-LAST:event_RemoveAllButtonActionPerformed + + private void UpdateButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_UpdateButtonActionPerformed + updateButton(); + }//GEN-LAST:event_UpdateButtonActionPerformed + + private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing + mainUI.setParamsClosed(); + }//GEN-LAST:event_formWindowClosing + + private void CancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_CancelButtonActionPerformed + mainUI.setParamsClosed(); + setVisible(false); + dispose(); + }//GEN-LAST:event_CancelButtonActionPerformed + + // BUTTONS // + + // Adds a new param panel + private void createButton(){ + addParamsPanel(new ParamPanels(this, data.rowCount+1)); + paramsScrollPaneBar.setValue(paramsScrollPaneBar.getMaximum()); + } + + // Updates the param data object basd on the current param configuration UI state + private void updateButton(){ + System.out.println("Update button"); + data.updateListofParams(PanelofParams); + if(data.writeParamsConfig(true) != null){ + saved = new ParamsData(data); + this.mainUI.getCurrentData().setParamsData(saved); + this.mainUI.updateParameters(); + } + mainUI.setParamsClosed(); + setVisible(false); + dispose(); + } + + // Removes all the param panels + private void removeAllButton(){ + if(JOptionPane.showConfirmDialog(null, "Are you sure you want to remove all?") == JOptionPane.YES_OPTION){ + removeAllParams(); + } + } + + + // CORE FUNCTIONS// + + // Adds param panel + public int paramsPanePanelLength = 0; + private JScrollBar paramsScrollPaneBar; + private void addParamsPanel(ParamPanels panel){ + //Resize the JPanel Holding all the ParamsPanels to fit another one (makes the scroll bar resize and should show all objects listed) + paramsPanePanelLength+=panel.getPreferredSize().height+5; + PanelofParams.setPreferredSize(new Dimension(0,paramsPanePanelLength)); + + // Create the Param Panel and add it + data.rowCount++; + PanelofParams.add(panel); //takes in parent(this), containerlist, rowcount + + // Redraw GUI with the new Panel + PanelofParams.revalidate(); + PanelofParams.repaint(); + } + + // Removes all the param lines for the lab *note: this doesn't update parameter.config or the paramsData until the user hits the update button + private void removeAllParams(){ + data.rowCount = 0; + paramsPanePanelLength = 0; + PanelofParams.setPreferredSize(new Dimension(0,paramsPanePanelLength)); + Component[] componentList = PanelofParams.getComponents(); + for(Component c: componentList){ + PanelofParams.remove(c); + } + + PanelofParams.revalidate(); + PanelofParams.repaint(); + } + + // loads the param panels based on the current data + protected void loadUI(){ + removeAllParams(); + //redraw the param + for(int i=0; i < data.listofParams.size(); i++) + loadParam(data.listofParams.get(i), i+1); + } + + // Load the param panel into GUI + private void loadParam(ParamValues paramVal, int rowNum){ + ParamPanels newParam = new ParamPanels(this, rowNum, + paramVal.paramID, + paramVal.fileList, + paramVal.operator, + paramVal.symbol, + paramVal.hashedString, + paramVal.upperBound, + paramVal.lowerBound, + paramVal.step, + paramVal.comments); + addParamsPanel(newParam); + } + + //Updates the list of params and redraws them on screen + public void refresh(){ + data.updateListofParams(PanelofParams); + loadUI(); + } + + + // OTHER // + + public void refactorContainerReferenceInUI(String oldName, String newName){ + data.updateListofParams(PanelofParams); + data.refactorContainerReference(oldName, newName); + saved.refactorContainerReference(oldName, newName); + loadUI(); + } + + + + // GETTERS // + + //Gets the panel holding the params + protected JPanel getPanelofParams(){ + return PanelofParams; + } + + + /** + * @param args the command line arguments + */ + public static void main(String args[]) { + /* Set the Nimbus look and feel */ + // + /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. + * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html + */ + try { + for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { + if ("Nimbus".equals(info.getName())) { + javax.swing.UIManager.setLookAndFeel(info.getClassName()); + break; + } + } + } catch (ClassNotFoundException ex) { + java.util.logging.Logger.getLogger(ParamsUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } catch (InstantiationException ex) { + java.util.logging.Logger.getLogger(ParamsUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } catch (IllegalAccessException ex) { + java.util.logging.Logger.getLogger(ParamsUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } catch (javax.swing.UnsupportedLookAndFeelException ex) { + java.util.logging.Logger.getLogger(ParamsUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } + // + // + // + // + + /* Create and display the dialog */ + java.awt.EventQueue.invokeLater(new Runnable() { + public void run() { + ParamsUI dialog = new ParamsUI(new javax.swing.JFrame(), true); + dialog.addWindowListener(new java.awt.event.WindowAdapter() { + @Override + public void windowClosing(java.awt.event.WindowEvent e) { + System.exit(0); + } + }); + dialog.setVisible(true); + } + }); + } + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton CancelButton; + private javax.swing.JButton CreateButton; + private javax.swing.JPanel PanelofParams; + private javax.swing.JButton RemoveAllButton; + private javax.swing.JScrollPane ScrollPaneOfParams; + private javax.swing.JButton UpdateButton; + private javax.swing.JLabel jLabel1; + private javax.swing.JLabel jLabel5; + // End of variables declaration//GEN-END:variables +} diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Results/src/ResultsUI/ArtifactPanels.form b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/resultsui/ArtifactPanels.form similarity index 65% rename from modules/utilities/unix/labtainers/files/Labtainers-master/UI/Results/src/ResultsUI/ArtifactPanels.form rename to modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/resultsui/ArtifactPanels.form index f2c6f5439..430ceb439 100644 --- a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Results/src/ResultsUI/ArtifactPanels.form +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/resultsui/ArtifactPanels.form @@ -2,8 +2,20 @@
+ + + + + + + + + + + + - + @@ -23,107 +35,157 @@ - - - - - - - + + + + + + + - - + + + + + - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - - - - - - - - + - - - + + + + + - - + + - + - - - + + + + + + + + + + - - - - - - - - + + + - - - - - - - - - + + + - + @@ -156,12 +218,25 @@ + + + + + + + + + + + + + - + @@ -179,19 +254,6 @@ - - - - - - - - - - - - - @@ -211,6 +273,7 @@ + @@ -247,36 +310,12 @@ - + - + - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Results/src/ResultsUI/ArtifactPanels.java b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/resultsui/ArtifactPanels.java similarity index 55% rename from modules/utilities/unix/labtainers/files/Labtainers-master/UI/Results/src/ResultsUI/ArtifactPanels.java rename to modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/resultsui/ArtifactPanels.java index 10d417cca..1f7e17601 100644 --- a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Results/src/ResultsUI/ArtifactPanels.java +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/resultsui/ArtifactPanels.java @@ -1,31 +1,58 @@ /* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package ResultsUI; +This software was created by United States Government employees at +The Center for Cybersecurity and Cyber Operations (C3O) +at the Naval Postgraduate School NPS. Please note that within the +United States, copyright protection is not available for any works +created by United States Government employees, pursuant to Title 17 +United States Code Section 105. This software is in the public +domain and is not subject to copyright. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + */ +package labtainers.resultsui; -import static ResultsUI.ParamReferenceStorage.FieldType_ITEMS; -import static ResultsUI.ParamReferenceStorage.LOG_ACCESIBLE_FieldType; -import static ResultsUI.ParamReferenceStorage.LOG_TS_ACCESSIBLE_LineType; -import static ResultsUI.ParamReferenceStorage.LineType_ITEMS; -import static ResultsUI.ParamReferenceStorage.SpecialTimeStampType; -import static ResultsUI.ParamReferenceStorage.TimestampType_ITEMS; -import static ResultsUI.ParamReferenceStorage.justFieldType; -import static ResultsUI.ParamReferenceStorage.lineParamAccessible; -import static ResultsUI.ParamReferenceStorage.timeStampDelimiterAccessible; -import ResultsUI.ToolTipHandlers.ToolTipWrapper; -import static ResultsUI.ToolTipHandlers.setComboItems; import java.awt.Dimension; import java.util.ArrayList; import javax.swing.DefaultComboBoxModel; import javax.swing.JComboBox; import javax.swing.JPanel; import javax.swing.JTextField; +import javax.swing.JDialog; +import static labtainers.resultsui.ParamReferenceStorage.FieldType_ITEMS; +import static labtainers.resultsui.ParamReferenceStorage.LOG_ACCESIBLE_FieldType; +import static labtainers.resultsui.ParamReferenceStorage.LOG_TS_ACCESSIBLE_LineType; +import static labtainers.resultsui.ParamReferenceStorage.LineType_ITEMS; +import static labtainers.resultsui.ParamReferenceStorage.SpecialTimeStampType; +import static labtainers.resultsui.ParamReferenceStorage.TimestampType_ITEMS; +import static labtainers.resultsui.ParamReferenceStorage.justFieldType; +import static labtainers.resultsui.ParamReferenceStorage.lineParamAccessible; +import static labtainers.resultsui.ParamReferenceStorage.timeStampDelimiterAccessible; +import labtainers.mainui.ToolTipHandlers.ToolTipWrapper; +import labtainers.mainui.ToolTipHandlers.ToolTipWrapper; +import labtainers.goalsui.DocPanel; +import static labtainers.mainui.ToolTipHandlers.setComboItems; /** * - * @author Dan + * @author Daniel Liao */ public class ArtifactPanels extends javax.swing.JPanel { @@ -33,37 +60,46 @@ public class ArtifactPanels extends javax.swing.JPanel { ResultsUI uiResult; ResultsData dataUI; int rowNum; - + String comments=""; + + /** + * Creates new form ArtifactsPanel + */ //Creating fresh artifact line public ArtifactPanels(ResultsUI ui, ArrayList containers, int rowNum) { initComponents(); this.uiResult = ui; - this.dataUI = ui.dataUI; + this.dataUI = ui.data; this.rowNum = rowNum; - rowLabel.setText(Integer.toString(rowNum)); + + jLabel3.setText(Integer.toString(rowNum)); TimeDelimiterTextField.setVisible(false); //Load ComboBox Items + if(containers.size() > 1 && !containers.contains("ALL")) + containers.add(0, "ALL"); ContainerComboBox.setModel(new javax.swing.DefaultComboBoxModel<>(containers.toArray(new String[containers.size()]))); setComboItems(FieldTypeComboBox, FieldType_ITEMS); setComboItems(LineTypeComboBox, LineType_ITEMS); setComboItems(TimeStampComboBox, TimestampType_ITEMS); - - this.revalidate(); - this.repaint(); } - + //Loading artifact line - public ArtifactPanels(ResultsUI ui, ArrayList containers, int rowNum, String resultTag, String container, String fileID, ToolTipWrapper fieldType, String fieldID, ToolTipWrapper lineType, String lineID, ToolTipWrapper timeStampType, String timeStampDelimiter) { + public ArtifactPanels(ResultsUI ui, ArrayList containers, int rowNum, String resultTag, String container, String fileID, ToolTipWrapper fieldType, String fieldID, ToolTipWrapper lineType, String lineID, ToolTipWrapper timeStampType, String timeStampDelimiter, String comments) { initComponents(); this.uiResult = ui; - this.dataUI = ui.dataUI; + this.dataUI = ui.data; this.rowNum = rowNum; - rowLabel.setText(Integer.toString(rowNum)); + this.comments = comments; + jLabel3.setText(Integer.toString(rowNum)); if(!timeStampDelimiterAccessible.contains(timeStampType.getItem())) TimeDelimiterTextField.setVisible(false); //Load ComboBox Items + if(containers.size() > 1 && !containers.contains("ALL")) + containers.add(0, "ALL"); + else if(containers.size() == 2 && containers.contains("ALL")) + containers.remove("ALL"); ContainerComboBox.setModel(new javax.swing.DefaultComboBoxModel<>(containers.toArray(new String[containers.size()]))); setComboItems(FieldTypeComboBox, FieldType_ITEMS); setComboItems(LineTypeComboBox, LineType_ITEMS); @@ -79,7 +115,7 @@ public class ArtifactPanels extends javax.swing.JPanel { setLineTypeComboBox(lineType); setTimeStampComboBox(timeStampType); setTimeDelimiterTextField(timeStampDelimiter); - + this.revalidate(); this.repaint(); } @@ -93,26 +129,59 @@ public class ArtifactPanels extends javax.swing.JPanel { // //GEN-BEGIN:initComponents private void initComponents() { + jLabel3 = new javax.swing.JLabel(); + jButton1 = new javax.swing.JButton(); + UpButton = new javax.swing.JButton(); + DownButton = new javax.swing.JButton(); ArtifactPanel = new javax.swing.JPanel(); TagTextField = new javax.swing.JTextField(); ContainerComboBox = new javax.swing.JComboBox<>(); FileTextField = new javax.swing.JTextField(); FieldTypeComboBox = new javax.swing.JComboBox<>(); - LineTypeComboBox = new javax.swing.JComboBox<>(); FieldIDTextField = new javax.swing.JTextField(); + LineTypeComboBox = new javax.swing.JComboBox<>(); LineIDTextField = new javax.swing.JTextField(); TimeStampComboBox = new javax.swing.JComboBox<>(); TimeDelimiterTextField = new javax.swing.JTextField(); - DeleteButton = new javax.swing.JButton(); - rowLabel = new javax.swing.JLabel(); - UpButton = new javax.swing.JButton(); - DownButton = new javax.swing.JButton(); + DocButton = new javax.swing.JButton(); - setPreferredSize(new java.awt.Dimension(1110, 69)); + setBorder(javax.swing.BorderFactory.createEtchedBorder()); + setMaximumSize(new java.awt.Dimension(1560, 86)); + setMinimumSize(new java.awt.Dimension(1560, 86)); + setName(""); // NOI18N + setPreferredSize(new java.awt.Dimension(1580, 86)); - ArtifactPanel.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED)); - ArtifactPanel.setMinimumSize(new java.awt.Dimension(1400, 0)); - ArtifactPanel.setPreferredSize(new java.awt.Dimension(1300, 34)); + jLabel3.setFont(new java.awt.Font("Ubuntu", 1, 48)); // NOI18N + jLabel3.setText("10"); + + jButton1.setText("Delete"); + jButton1.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jButton1ActionPerformed(evt); + } + }); + + UpButton.setFont(new java.awt.Font("Ubuntu Condensed", 0, 12)); // NOI18N + UpButton.setText("^"); + UpButton.setMaximumSize(new java.awt.Dimension(19, 50)); + UpButton.setMinimumSize(new java.awt.Dimension(19, 31)); + UpButton.setPreferredSize(new java.awt.Dimension(19, 31)); + UpButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + UpButtonActionPerformed(evt); + } + }); + + DownButton.setFont(new java.awt.Font("Ubuntu Condensed", 0, 12)); // NOI18N + DownButton.setText("v"); + DownButton.setToolTipText(""); + DownButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + DownButtonActionPerformed(evt); + } + }); + + ArtifactPanel.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1)); FieldTypeComboBox.addItemListener(new java.awt.event.ItemListener() { public void itemStateChanged(java.awt.event.ItemEvent evt) { @@ -120,7 +189,9 @@ public class ArtifactPanels extends javax.swing.JPanel { } }); - LineTypeComboBox.setToolTipText("Identifies how the line is to be identified"); + FieldIDTextField.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Field ID")); + + LineTypeComboBox.setToolTipText("Identifies how the line is to be located."); LineTypeComboBox.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Line Type")); LineTypeComboBox.addItemListener(new java.awt.event.ItemListener() { public void itemStateChanged(java.awt.event.ItemEvent evt) { @@ -128,11 +199,10 @@ public class ArtifactPanels extends javax.swing.JPanel { } }); - FieldIDTextField.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Field ID")); - LineIDTextField.setToolTipText("Parameter based on Line Type"); LineIDTextField.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Line ID")); + TimeStampComboBox.setToolTipText("Source of time stamps, e.g., from the file
or from log entries"); TimeStampComboBox.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Timestamp Type")); TimeStampComboBox.addItemListener(new java.awt.event.ItemListener() { public void itemStateChanged(java.awt.event.ItemEvent evt) { @@ -150,70 +220,48 @@ public class ArtifactPanels extends javax.swing.JPanel { ArtifactPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(ArtifactPanelLayout.createSequentialGroup() .addContainerGap() - .addComponent(TagTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 125, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(TagTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 138, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(ContainerComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 116, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(6, 6, 6) - .addComponent(FileTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 150, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(ContainerComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 134, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(FileTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 138, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(FieldTypeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 160, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(FieldIDTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 188, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(14, 14, 14) + .addComponent(FieldIDTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 146, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(LineTypeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 165, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(LineIDTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 135, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(LineIDTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 142, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(TimeStampComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 137, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(TimeDelimiterTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 125, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(TimeStampComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 143, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(TimeDelimiterTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 124, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); ArtifactPanelLayout.setVerticalGroup( ArtifactPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(ArtifactPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(TimeDelimiterTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(TimeStampComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(LineIDTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(LineTypeComboBox) + .addComponent(FieldIDTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(ArtifactPanelLayout.createSequentialGroup() .addGroup(ArtifactPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(ArtifactPanelLayout.createSequentialGroup() - .addGap(12, 12, 12) - .addGroup(ArtifactPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(TagTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(ContainerComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(FileTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(FieldTypeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) - .addGroup(ArtifactPanelLayout.createSequentialGroup() - .addContainerGap() - .addGroup(ArtifactPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE, false) - .addComponent(LineTypeComboBox) - .addComponent(LineIDTextField) - .addComponent(TimeStampComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(FieldIDTextField) - .addComponent(TimeDelimiterTextField, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))) - .addContainerGap(12, Short.MAX_VALUE)) + .addGroup(ArtifactPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(FileTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(FieldTypeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(ArtifactPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(TagTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(ContainerComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE))) + .addGap(0, 0, Short.MAX_VALUE)) ); - ArtifactPanelLayout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {TimeDelimiterTextField, TimeStampComboBox}); - - DeleteButton.setText("Delete"); - DeleteButton.addActionListener(new java.awt.event.ActionListener() { + DocButton.setText("Doc"); + DocButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { - DeleteButtonActionPerformed(evt); - } - }); - - rowLabel.setFont(new java.awt.Font("Arial", 1, 24)); // NOI18N - rowLabel.setText("10"); - - UpButton.setText("^"); - UpButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - UpButtonActionPerformed(evt); - } - }); - - DownButton.setText("v"); - DownButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - DownButtonActionPerformed(evt); + DocButtonActionPerformed(evt); } }); @@ -223,61 +271,107 @@ public class ArtifactPanels extends javax.swing.JPanel { layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addContainerGap() - .addComponent(rowLabel) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(ArtifactPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 1390, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel3) + .addGap(6, 6, 6) + .addComponent(ArtifactPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(DownButton, javax.swing.GroupLayout.PREFERRED_SIZE, 33, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(UpButton, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 33, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(UpButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(DownButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(DeleteButton) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jButton1) + .addComponent(DocButton)) + .addGap(23, 23, 23)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(ArtifactPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 69, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() - .addContainerGap() - .addComponent(rowLabel) - .addGap(19, 19, 19)) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) - .addGroup(layout.createSequentialGroup() - .addContainerGap() - .addComponent(UpButton) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(DownButton)) - .addComponent(DeleteButton, javax.swing.GroupLayout.PREFERRED_SIZE, 58, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(ArtifactPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel3))) + .addGroup(layout.createSequentialGroup() + .addGap(6, 6, 6) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(UpButton, javax.swing.GroupLayout.PREFERRED_SIZE, 31, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jButton1)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(DownButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(DocButton)))) + .addContainerGap()) ); }//
//GEN-END:initComponents - private void DeleteButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_DeleteButtonActionPerformed - JPanel container = (JPanel)this.getParent(); - container.remove(this); - uiResult.dataUI.rowCount--; - uiResult.refresh(); - }//GEN-LAST:event_DeleteButtonActionPerformed + private void UpButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_UpButtonActionPerformed + swapUpdate("UP", rowNum-1); //Subtract rowNum by one to get the proper index number + }//GEN-LAST:event_UpButtonActionPerformed - private void TimeStampComboBoxItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_TimeStampComboBoxItemStateChanged - timeStampListener(); - }//GEN-LAST:event_TimeStampComboBoxItemStateChanged - - private void LineTypeComboBoxItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_LineTypeComboBoxItemStateChanged - lineTypeListener(); - }//GEN-LAST:event_LineTypeComboBoxItemStateChanged + private void DownButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_DownButtonActionPerformed + swapUpdate("DOWN", rowNum-1); //Subtract rowNum by one to get the proper index number + }//GEN-LAST:event_DownButtonActionPerformed private void FieldTypeComboBoxItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_FieldTypeComboBoxItemStateChanged fieldTypeListener(); }//GEN-LAST:event_FieldTypeComboBoxItemStateChanged - private void UpButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_UpButtonActionPerformed - swapUpdate("UP", rowNum-1); //Subtract rowNum by one to get the proper index number - }//GEN-LAST:event_UpButtonActionPerformed + private void LineTypeComboBoxItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_LineTypeComboBoxItemStateChanged + lineTypeListener(); + }//GEN-LAST:event_LineTypeComboBoxItemStateChanged - private void DownButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_DownButtonActionPerformed - swapUpdate("DOWN", rowNum-1); //Subtract rowNum by one to get the proper index number - }//GEN-LAST:event_DownButtonActionPerformed + private void TimeStampComboBoxItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_TimeStampComboBoxItemStateChanged + timeStampListener(); + }//GEN-LAST:event_TimeStampComboBoxItemStateChanged + private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed + deleteButton(); + }//GEN-LAST:event_jButton1ActionPerformed + + private void DocButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_DocButtonActionPerformed + DocPanel panel = new DocPanel(); + + panel.setDoc(this.comments); + //panel.setVisible(true); + JDialog dialog = new JDialog(); + panel.setDialog(dialog); + //dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); + dialog.setModal(true); + dialog.add(panel); + dialog.pack(); + dialog.setLocation(200, 200); + dialog.setTitle("Documentation for "+TagTextField.getText()); + dialog.setVisible(true); + if(panel.isOK()){ + this.comments = panel.getDoc(); + } + }//GEN-LAST:event_DocButtonActionPerformed + + private void deleteButton(){ + JPanel panelOfArtifacts = (JPanel)this.getParent(); + panelOfArtifacts.remove(this); + uiResult.data.rowCount--; + uiResult.refresh(); + } + private void lineTypeTimeStamp(ToolTipWrapper lineType){ + if(LOG_TS_ACCESSIBLE_LineType.contains(lineType.getItem())){ + //Add "LOG_TS" to the timestampComboBox if it's not already + if(((DefaultComboBoxModel)TimeStampComboBox.getModel()).getIndexOf(SpecialTimeStampType[0]) == -1) { + TimeStampComboBox.addItem(SpecialTimeStampType[0]); + } + TimeStampComboBox.setVisible(true); + }else{ + ToolTipWrapper fieldTypeTTW = (ToolTipWrapper)FieldTypeComboBox.getSelectedItem(); + //Remove "LOG_TS" from the timestampComboBox if it's not already + if(((DefaultComboBoxModel)TimeStampComboBox.getModel()).getIndexOf(SpecialTimeStampType[0]) != -1 && !LOG_ACCESIBLE_FieldType.contains(fieldTypeTTW.getItem())) { + TimeStampComboBox.removeItem(SpecialTimeStampType[0]); + } + TimeStampComboBox.setVisible(false); + } + } + //The listeners sees what values are present in their respective fields and then changes the interface based on that(remove or adding other fields) private void lineTypeListener(){ ToolTipWrapper lineType = (ToolTipWrapper)LineTypeComboBox.getSelectedItem(); @@ -287,28 +381,69 @@ public class ArtifactPanels extends javax.swing.JPanel { } else LineIDTextField.setVisible(true); - - + //Does the line type allow for LOG_TS option in the TimeStampComboBox? - if(LOG_TS_ACCESSIBLE_LineType.contains(lineType.getItem())){ - //Add "LOG_TS" to the timestampComboBox if it's not already - if(((DefaultComboBoxModel)TimeStampComboBox.getModel()).getIndexOf(SpecialTimeStampType[0]) == -1) - TimeStampComboBox.addItem(SpecialTimeStampType[0]); - } - else{ - ToolTipWrapper fieldTypeTTW = (ToolTipWrapper)FieldTypeComboBox.getSelectedItem(); - //Remove "LOG_TS" from the timestampComboBox if it's not already - if(((DefaultComboBoxModel)TimeStampComboBox.getModel()).getIndexOf(SpecialTimeStampType[0]) != -1 && !LOG_ACCESIBLE_FieldType.contains(fieldTypeTTW.getItem())) - TimeStampComboBox.removeItem(SpecialTimeStampType[0]); - } + lineTypeTimeStamp(lineType); + this.revalidate(); this.repaint(); } - + + private void adjustFieldIDToolTip(String fieldType){ + //System.out.println("field type "+fieldType); + String tip = FieldIDTextField.getToolTipText(); + switch(fieldType){ + case "TOKEN": + tip = "Result is the Nth space-delimited token, where N is this integer."; + break; + case "QUOTES": + tip = "Result is the Nth quoted string, where N is this integer."; + break; + case "PARENS": + tip = "Result is the Nth string in parenthesis, where N is this integer."; + break; + case "SLASH": + tip = "Result is the Nth slash-delimited token, where N is this integer."; + break; + case "CONTAINS": + tip = "Result is true if the file contains this string."; + break; + case "FILE_REGEX": + tip = "Result is true if the file contains this regular expression."; + break; + case "LOG_TS": + tip = "Used with timestamped log files, results in a timestamped set of boolean results with a value of TRUE for each log line that contains this string."; + break; + case "FILE_REGEX_TS": + tip = "Used with timestamped log files, results in a timestamped set of boolean results with a value of TRUE for each log line that contains this regular expression."; + break; + case "LOG_RANGE": + tip = "Used with timestamped log files, results in a timestamped set of boolean results with a value of TRUE for each log line that contains this string, with timestamp ranges delimited by the matching log entries."; + break; + case "STRING_COUNT": + tip = "The result value is set to the quantity of occurances of this string in the file."; + break; + case "COMMAND_COUNT": + tip = "Intended for use with bash_history files, counts the occurances of this command. Commands are evaluated considering use of sudo, time, etc."; + break; + case "SEARCH": + tip = "Result is assigned the value of string, which is treated as an expression having the syntax of pythons parse.search function. E.g., 'frame.number=={:d}' would yield the frame number."; + break; + case "GROUP": + tip = "Intended for use with 'REGEX' line types, the result is set to the value of the regex group number named by this value. Regular expressions and their groups are processed using the python re.search semantics."; + break; + + + + default: + //System.out.println("adjustFieldIDToolTip no match"); + } + FieldIDTextField.setToolTipText(tip); + } private void fieldTypeListener(){ ToolTipWrapper fieldType = (ToolTipWrapper)FieldTypeComboBox.getSelectedItem(); - + adjustFieldIDToolTip(fieldType.getItem()); //Does the fieldType allow for certain user inputs if(!justFieldType.contains(fieldType.getItem())){ FieldIDTextField.setVisible(true); @@ -338,11 +473,14 @@ public class ArtifactPanels extends javax.swing.JPanel { */ if(LOG_ACCESIBLE_FieldType.contains(fieldType.getItem())){ //Add "LOG_TS" to the timestampComboBox if it's not already - if(((DefaultComboBoxModel)TimeStampComboBox.getModel()).getIndexOf(SpecialTimeStampType[0]) == -1) + if(((DefaultComboBoxModel)TimeStampComboBox.getModel()).getIndexOf(SpecialTimeStampType[0]) == -1){ TimeStampComboBox.addItem(SpecialTimeStampType[0]); + } //Add "LOG_RANGE" to the timestampComboBox if it's not already - if(((DefaultComboBoxModel)TimeStampComboBox.getModel()).getIndexOf(SpecialTimeStampType[1]) == -1) + if(((DefaultComboBoxModel)TimeStampComboBox.getModel()).getIndexOf(SpecialTimeStampType[1]) == -1){ TimeStampComboBox.addItem(SpecialTimeStampType[1]); + } + TimeStampComboBox.setVisible(true); } /* If the selcted Field Type doesn't allow for "LOG_TS" and "LOG_RANGE" in the timeStampComboBox, @@ -351,11 +489,14 @@ public class ArtifactPanels extends javax.swing.JPanel { else{ ToolTipWrapper lineType = (ToolTipWrapper)LineTypeComboBox.getSelectedItem(); //Remove "LOG_TS" from the timestampComboBox if it's not already - if(((DefaultComboBoxModel)TimeStampComboBox.getModel()).getIndexOf(SpecialTimeStampType[0]) != -1 && !LOG_TS_ACCESSIBLE_LineType.contains(lineType.getItem())) + if(((DefaultComboBoxModel)TimeStampComboBox.getModel()).getIndexOf(SpecialTimeStampType[0]) != -1 && !LOG_TS_ACCESSIBLE_LineType.contains(lineType.getItem())){ TimeStampComboBox.removeItem(SpecialTimeStampType[0]); + } //Remove "LOG_RANGE" from the timestampComboBox if it's there - if(((DefaultComboBoxModel)TimeStampComboBox.getModel()).getIndexOf(SpecialTimeStampType[1]) != -1) + if(((DefaultComboBoxModel)TimeStampComboBox.getModel()).getIndexOf(SpecialTimeStampType[1]) != -1){ TimeStampComboBox.removeItem(SpecialTimeStampType[1]); + } + TimeStampComboBox.setVisible(false); } ArtifactPanel.revalidate(); @@ -380,11 +521,10 @@ public class ArtifactPanels extends javax.swing.JPanel { //System.out.println("RowCOUNT(swap): " +dataUI.rowCount); dataUI.updateListofArtifacts(uiResult.getPanelofArtifacts()); dataUI.swapArtifacts(type, rowIndex); - uiResult.artifactsPanelRedraw(); + uiResult.loadUI(); } - - //Field Getters + //Field Getters public JComboBox getContainerComboBox(){ return ContainerComboBox; } @@ -412,6 +552,9 @@ public class ArtifactPanels extends javax.swing.JPanel { public JTextField getTimeStampTextField(){ return TimeDelimiterTextField; } + public String getComments(){ + return this.comments; + } //Field SETTERS private void setContainerComboBox(String v){ @@ -440,12 +583,12 @@ public class ArtifactPanels extends javax.swing.JPanel { } private void setTimeDelimiterTextField(String v){ TimeDelimiterTextField.setText(v); -} + } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JPanel ArtifactPanel; private javax.swing.JComboBox ContainerComboBox; - private javax.swing.JButton DeleteButton; + private javax.swing.JButton DocButton; private javax.swing.JButton DownButton; private javax.swing.JTextField FieldIDTextField; private javax.swing.JComboBox FieldTypeComboBox; @@ -456,6 +599,7 @@ public class ArtifactPanels extends javax.swing.JPanel { private javax.swing.JTextField TimeDelimiterTextField; private javax.swing.JComboBox TimeStampComboBox; private javax.swing.JButton UpButton; - private javax.swing.JLabel rowLabel; + private javax.swing.JButton jButton1; + private javax.swing.JLabel jLabel3; // End of variables declaration//GEN-END:variables } diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Results/src/ResultsUI/ArtifactValues.java b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/resultsui/ArtifactValues.java similarity index 74% rename from modules/utilities/unix/labtainers/files/Labtainers-master/UI/Results/src/ResultsUI/ArtifactValues.java rename to modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/resultsui/ArtifactValues.java index ad1ed3521..55be1ac8b 100644 --- a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Results/src/ResultsUI/ArtifactValues.java +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/resultsui/ArtifactValues.java @@ -1,269 +1,301 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package ResultsUI; - -import static ResultsUI.ParamReferenceStorage.FieldType_ITEMS; -import static ResultsUI.ParamReferenceStorage.LineType_ITEMS; -import static ResultsUI.ParamReferenceStorage.SpecialTimeStampType; -import static ResultsUI.ParamReferenceStorage.TimestampType_ITEMS; -import static ResultsUI.ParamReferenceStorage.justFieldType; -import static ResultsUI.ParamReferenceStorage.lineParamAccessible; - -/** - * - * @author Dan - */ - -/* -Errors that need to be fixed/Notes to consider: -****The param parsing in this class is critically dependent to where the param value's corresponding index is on the artifact line. - If at any point this alignment is modified with less or more params, this code will need to be revised - -****If the Line ID or the Field ID input contains a " : " in it, then the code will add everything after the " : " to the "line ID, or field ID". - For the Field ID, it adds all the " : " parsed values after the field type, until it hits a Line Type(excludes the line type value) - -****Currently this code will allow/read weird inputs like "CONTAINS : LINE : STUFF" in field ID or Line ID (which breaks the parsing) -*/ -public class ArtifactValues { - //Values to be obtained - String resultTag, container, fileID, fieldID, lineID, timeStampDelimiter; - - ToolTipHandlers.ToolTipWrapper fieldType, lineType, timeStampType; - - //Stores the values of an arifactline fed into it (NO real value validation happening here) - ArtifactValues(String artifactLine){ - resultTag = container = fileID = fieldID = lineID = timeStampDelimiter = ""; - - fieldType = lineType = timeStampType = null; - - //Parsing the artifactline - String[] paramParsedLine = artifactLine.split(" : "); - - //Get the resultTag - resultTag = paramParsedLine[0].split(" = ")[0]; - - //Get the container, fieldID, timeStampType, and timeStampDelimiter - handleFileRef(paramParsedLine[0].split(" = ")[1]); - - //Get Field Type and Field ID (and the lineType and lineID depending on if the field type allows it): - - //Case where "TOKEN" field Type is not explicitly stated and the paramParsedLine index is off by 1 for fieldID, lineType, lineID - if(paramParsedLine[1].equals("ALL") || paramParsedLine[1].equals("LAST") || isInteger(paramParsedLine[1])){ - fieldType = FieldType_ITEMS[0]; //TOKEN - fieldID = paramParsedLine[1]; - - /* - If the paramParsedLine isn't just the fileID and the fieldID (note fieldType is assumed to be "Token"), - then that means we need to consider the other parms which are certainly* line type and line ID. - *if the user enters a bad config file this may cause an error. - */ - if(paramParsedLine.length > 2){ - lineType = itemFinder(LineType_ITEMS, paramParsedLine[2]); - lineID = paramParsedLine[3]; - } - else{ - lineType = LineType_ITEMS[0]; //NONE - lineID =""; - } - } - - //Case where the field type IS EXPLICITY stated - else{ - fieldType = itemFinder(FieldType_ITEMS, paramParsedLine[1]); - //If the field type is null after looking through the field type items, then it may be under the SpecialTimeStampType array - if(fieldType == null) - fieldType = itemFinder(SpecialTimeStampType, paramParsedLine[1]); - - //Does the field type consider other fields, if so then continue parsing for these values - if(!justFieldType.contains(fieldType.getItem())){ - //If the field Type doesn't bother with line Params then execute these details - if(!lineParamAccessible.contains(fieldType.getItem())){ - //Everything after the field type is considered the field ID (this ensures that the fieldID potentially split by " : " will all be captured and stored) - fieldID = artifactLine.split(fieldType + " : ")[1]; - - //If the fieldType is equal "FILE_REGEX_TS", then overwrite the fieldType to be "FILE_REGEX" and make the timeStampType to be "LOG_TS" - //If the fieldType is equal "LOG_TS", then overwrite the fieldType to be "CONTAINS" and make the timeStampType to be "LOG_TS" - //If the fieldType is equal "LOG_RANGE", then overwrite the fieldType to be "CONTAINS" and make the timeStampType to be "LOG_RANGE" - switch (fieldType.getItem()) { - case "FILE_REGEX_TS": - fieldType = FieldType_ITEMS[7]; //FILE REGEX - timeStampType = SpecialTimeStampType[0]; //LOG_TS - break; - case "LOG_TS": - fieldType = FieldType_ITEMS[6]; //CONTAINS - timeStampType = SpecialTimeStampType[0]; // LOG_TS - break; - case "LOG_RANGE": - fieldType = FieldType_ITEMS[6]; //CONTAINS - timeStampType = SpecialTimeStampType[1]; //LOG_RANGE - break; - default: - break; - } - - lineType = LineType_ITEMS[0]; //NONE - lineID = ""; - } - //If the field Type does bother with line Params then execute these details - else{ - int properLineTypeIndex = 3; //This value may be changed if user's field ID includes " : ", offsetting the parsing indexes - - /*The Field ID may include " : ". But since the line parsing breaks the line up based on " : ", - the for block below makes sure to the include the pieces that were broken up - */ - for(int i=2; i.[stdin | stdout | prgout] or file_path - if(!fileRef.contains(":")){ - container = "ALL"; - fileID = fileRef; - timeStampType = TimestampType_ITEMS[0]; //File - } - //Case 2: [container_name:].[stdin | stdout | prguot] - else if(fileRef.contains(":") && !fileRef.contains("/")){ - container = fileRef.split(":")[0]; - fileID = fileRef.split(":")[1]; - timeStampType = TimestampType_ITEMS[0]; //File - } - else{ - String[] parsedFileRef = fileRef.split(":"); - - if(parsedFileRef.length == 2){ - //Case 3: [container_name:]file_path - if(fileRef.indexOf(":") < fileRef.indexOf('/')){ - container = parsedFileRef[0]; - fileID = parsedFileRef[1]; - timeStampType = TimestampType_ITEMS[0]; //File - } - //Case 4: file_path[:time_delimiter] - else{ - fileID = parsedFileRef[0]; - //Set the timeStamp Type either to be "Service" or "Program" - if(parsedFileRef[1].contains(".service")){ - timeStampType = TimestampType_ITEMS[1]; //Service - timeStampDelimiter = parsedFileRef[1].replace(".service", ""); - } - else{ - timeStampType = TimestampType_ITEMS[2]; //Program - timeStampDelimiter = parsedFileRef[1]; - } - } - } - //Case 5: [container_name:]file_path[:time_delimiter] - else { - container = parsedFileRef[0]; - fileID = parsedFileRef[1]; - if(parsedFileRef[2].contains(".service")){ - timeStampType = TimestampType_ITEMS[1]; //Serivce - timeStampDelimiter = parsedFileRef[2].replace(".service", ""); - } - else{ - timeStampType = TimestampType_ITEMS[2]; //Program - timeStampDelimiter = parsedFileRef[2]; - } - } - } - } - - private ToolTipHandlers.ToolTipWrapper itemFinder(ToolTipHandlers.ToolTipWrapper[] list,String desired){ - for(ToolTipHandlers.ToolTipWrapper item : list){ - if(item.getItem().equals(desired)){ - return item; - } - } - return null; - } - - private boolean itemExistCheck(ToolTipHandlers.ToolTipWrapper[] list,String desired){ - for(ToolTipHandlers.ToolTipWrapper item : list){ - if(item.getItem().equals(desired)){ - return true; - } - } - return false; - } - - private boolean isInteger(String s){ - try{ - Integer.parseInt(s); - - return true; - } - catch(NumberFormatException ex){ - return false; - } - } - -} +/* +This software was created by United States Government employees at +The Center for Cybersecurity and Cyber Operations (C3O) +at the Naval Postgraduate School NPS. Please note that within the +United States, copyright protection is not available for any works +created by United States Government employees, pursuant to Title 17 +United States Code Section 105. This software is in the public +domain and is not subject to copyright. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + */ +package labtainers.resultsui; +import java.util.Arrays; +import labtainers.mainui.ToolTipHandlers; +import static labtainers.resultsui.ParamReferenceStorage.FieldType_ITEMS; +import static labtainers.resultsui.ParamReferenceStorage.LineType_ITEMS; +import static labtainers.resultsui.ParamReferenceStorage.SpecialTimeStampType; +import static labtainers.resultsui.ParamReferenceStorage.TimestampType_ITEMS; +import static labtainers.resultsui.ParamReferenceStorage.justFieldType; +import static labtainers.resultsui.ParamReferenceStorage.lineParamAccessible; + +/** + * + * @author Daniel Liao + */ +public class ArtifactValues { + //Values to be obtained + String resultTag, container, fileID, fieldID, lineID, timeStampDelimiter; + String comments = ""; + + ToolTipHandlers.ToolTipWrapper fieldType, lineType, timeStampType; + + //Stores the values of an arifactline fed into it (NO real value validation happening here) + ArtifactValues(String inputLine){ + String artifactLine; + if(inputLine.contains("\n")){ + String[] the_lines = inputLine.split("\n"); + artifactLine = the_lines[the_lines.length-1]; + for(int i=0; i paramParsedLine); + + //Get the resultTag + resultTag = paramParsedLine[0].split(" = ")[0]; + + //Get the container, fieldID, timeStampType, and timeStampDelimiter + handleFileRef(paramParsedLine[0].split(" = ")[1]); + + //Get Field Type and Field ID (and the lineType and lineID depending on if the field type allows it): + + //Case where "TOKEN" field Type is not explicitly stated and the paramParsedLine index is off by 1 for fieldID, lineType, lineID + if(paramParsedLine[1].equals("ALL") || paramParsedLine[1].equals("LAST") || isInteger(paramParsedLine[1])){ + fieldType = FieldType_ITEMS[0]; //TOKEN + fieldID = paramParsedLine[1]; + + /* + If the paramParsedLine isn't just the fileID and the fieldID (note fieldType is assumed to be "Token"), + then that means we need to consider the other parms which are certainly* line type and line ID. + *if the user enters a bad config file this may cause an error. + */ + if(paramParsedLine.length > 2){ + lineType = itemFinder(LineType_ITEMS, paramParsedLine[2]); + lineID = paramParsedLine[3]; + } + else{ + lineType = LineType_ITEMS[0]; //NONE + lineID =""; + } + } + + //Case where the field type IS EXPLICITY stated + else{ + fieldType = itemFinder(FieldType_ITEMS, paramParsedLine[1]); + //If the field type is null after looking through the field type items, then it may be under the SpecialTimeStampType array + if(fieldType == null) + fieldType = itemFinder(SpecialTimeStampType, paramParsedLine[1]); + if(fieldType == null){ + System.out.println("could not get field type for "+paramParsedLine[1]); + return; + } + + //Does the field type consider other fields, if so then continue parsing for these values + if(!justFieldType.contains(fieldType.getItem())){ + //If the field Type doesn't bother with line Params then execute these details + if(!lineParamAccessible.contains(fieldType.getItem())){ + //Everything after the field type is considered the field ID (this ensures that the fieldID potentially split by " : " will all be captured and stored) + fieldID = artifactLine.split(fieldType + " : ")[1]; + + //If the fieldType is equal "FILE_REGEX_TS", then overwrite the fieldType to be "FILE_REGEX" and make the timeStampType to be "LOG_TS" + //If the fieldType is equal "LOG_TS", then overwrite the fieldType to be "CONTAINS" and make the timeStampType to be "LOG_TS" + //If the fieldType is equal "LOG_RANGE", then overwrite the fieldType to be "CONTAINS" and make the timeStampType to be "LOG_RANGE" + switch (fieldType.getItem()) { + case "FILE_REGEX_TS": + fieldType = FieldType_ITEMS[7]; //FILE REGEX + timeStampType = SpecialTimeStampType[0]; //LOG_TS + break; + case "LOG_TS": + fieldType = FieldType_ITEMS[6]; //CONTAINS + timeStampType = SpecialTimeStampType[0]; // LOG_TS + break; + case "LOG_RANGE": + fieldType = FieldType_ITEMS[6]; //CONTAINS + timeStampType = SpecialTimeStampType[1]; //LOG_RANGE + break; + case "RANGE_REGEX": + fieldType = FieldType_ITEMS[7]; //FILE_REGEX + timeStampType = SpecialTimeStampType[1]; //LOG_RANGE + break; + default: + break; + } + + lineType = LineType_ITEMS[0]; //NONE + lineID = ""; + } + //If the field Type does bother with line Params then execute these details + else{ + int properLineTypeIndex = 3; //This value may be changed if user's field ID includes " : ", offsetting the parsing indexes + + /*The Field ID may include " : ". But since the line parsing breaks the line up based on " : ", + the for block below makes sure to the include the pieces that were broken up + */ + for(int i=2; i.[stdin | stdout | prgout] or file_path + if(!fileRef.contains(":")){ + container = "ALL"; + fileID = fileRef; + timeStampType = TimestampType_ITEMS[0]; //File + } + //Case 2: [container_name:].[stdin | stdout | prguot] + else if(fileRef.contains(":") && !fileRef.contains("/")){ + container = fileRef.split(":")[0]; + fileID = fileRef.split(":")[1]; + timeStampType = TimestampType_ITEMS[0]; //File + } + else{ + String[] parsedFileRef = fileRef.split(":"); + + if(parsedFileRef.length == 2){ + //Case 3: [container_name:]file_path + if(fileRef.indexOf(":") < fileRef.indexOf('/')){ + container = parsedFileRef[0]; + fileID = parsedFileRef[1]; + timeStampType = TimestampType_ITEMS[0]; //File + } + //Case 4: file_path[:time_delimiter] + else{ + fileID = parsedFileRef[0]; + } + } + //Case 5: [container_name:]file_path[:time_delimiter] + else { + container = parsedFileRef[0]; + fileID = parsedFileRef[1]; + } + } + } + + private ToolTipHandlers.ToolTipWrapper itemFinder(ToolTipHandlers.ToolTipWrapper[] list,String desired){ + for(ToolTipHandlers.ToolTipWrapper item : list){ + if(item.getItem().equals(desired)){ + return item; + } + } + return null; + } + + private boolean itemExistCheck(ToolTipHandlers.ToolTipWrapper[] list,String desired){ + for(ToolTipHandlers.ToolTipWrapper item : list){ + if(item.getItem().equals(desired)){ + return true; + } + } + return false; + } + + private boolean isInteger(String s){ + try{ + Integer.parseInt(s); + + return true; + } + catch(NumberFormatException ex){ + return false; + } + } + +} diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Results/src/ResultsUI/ParamReferenceStorage.java b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/resultsui/ParamReferenceStorage.java similarity index 67% rename from modules/utilities/unix/labtainers/files/Labtainers-master/UI/Results/src/ResultsUI/ParamReferenceStorage.java rename to modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/resultsui/ParamReferenceStorage.java index 5fe6a6281..024f96d04 100644 --- a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Results/src/ResultsUI/ParamReferenceStorage.java +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/resultsui/ParamReferenceStorage.java @@ -1,144 +1,190 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package ResultsUI; - -import ResultsUI.ToolTipHandlers.ToolTipWrapper; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; - -/** - * - * @author Dan - */ -public class ParamReferenceStorage { - - public static final ToolTipWrapper[] FieldType_ITEMS = new ToolTipWrapper[] { - //0 - new ToolTipWrapper("TOKEN", "Treat the line as space-delimited tokens."), - // 1 - new ToolTipWrapper("PARENS", "The desired value is contained in parenthesis."), - // 2 - new ToolTipWrapper("QUOTES", "The desired value is contained in quotes."), - // 3 - new ToolTipWrapper("SLASH", "The desired value is contained within slashes
" + - "e.g., /foo/"), - // 4 - new ToolTipWrapper("LINE_COUNT", "The quantity of lines in the file. Remaining fields
" + - "are ignored."), - // 5 - new ToolTipWrapper("CHECKSUM", "The result value is set to the md5 checksum
" + - "of the file."), - // 6 - new ToolTipWrapper("CONTAINS", "The result value is set to TRUE if the file
" + - "contains the string represented in field_id."), - // 7 - new ToolTipWrapper("FILE_REGEX", "The result value is set to TRUE if the file
" + - "contains the regular expression represented in field_id.
" + - "The python findall function is used on the entire file.
" + - "See the acl lab for an example of multi-line expressions."), - // 8 - new ToolTipWrapper("STRING_COUNT", "The result value is set to the quantity of
" + - "occurances of the string represented in field_id."), - // 9 - new ToolTipWrapper("COMMAND_COUNT", "Intended for use with bash_history files, counts
" + - "the occurances of the command given in the field_id.
"), - // 10 - new ToolTipWrapper("PARAM", "The result value is set to nth parameter
" + - "(0 is the program name), provided in the
" + - "program invocation."), - // 11 - new ToolTipWrapper("SEARCH", "The result is assigned the value of the search
" + - "defined by the given field_id, which is treated as an
" + - "expression having the syntax of pythons parse.search
" + - "function. E.g., \"frame.number=={:d}\" would
" + - "yield the frame number."), - // 12 - new ToolTipWrapper("GROUP", "Intended for use with \"REGEX\" line types, the
" + - "result is set to the value of the regex group
" + - "number named by the field_id. Regular expressions
" + - "and their groups are processed using the python
" + - "re.search semantics." ), - // 13 - new ToolTipWrapper("TIME_DELIM", "" )}; - - - public static final ToolTipWrapper[] LineType_ITEMS = new ToolTipWrapper[] { - // 0 - new ToolTipWrapper("NONE", ""), - // 1 - new ToolTipWrapper("LINE", "The line_id is an integer line number
" + - "(starting at one). Use of this to identify
" + - "lines is discouraged since minor lab changes
" + - "might alter the count."), - // 2 - new ToolTipWrapper("STARTSWITH", "the line_id is a string. This names the
" + - "first occurrence of a line that starts with
" + - "this string." ), - // 3 - new ToolTipWrapper("HAVESTRING", "The line_id is a string. This names the
" + - "first occurrence of a line that contains the
" + - "string." ), - // 4 - new ToolTipWrapper("REGEX", "The line_id is a regular expression. This names the
" + - "first occurrence of a line that matches the regular
" + - "expression. Also see the \"GROUP\" field_type." ), - // 5 - new ToolTipWrapper("NEXT_STARTSWITH", "the line_id is a string. This names the
" + - "line preceeding the first occurrence of a line
" + - "that starts with this string.")}; - - - public static final ToolTipWrapper[] TimestampType_ITEMS = new ToolTipWrapper[] { - // 0 - new ToolTipWrapper("File", ""), - // 1 - new ToolTipWrapper("Service", ""), - // 2 - new ToolTipWrapper("Program", "")} ; - - - //****These items may need to be stored differently for better organization) - public static final ToolTipWrapper[] SpecialTimeStampType = new ToolTipWrapper[] { - //FIELDTYPES - // 0 - new ToolTipWrapper("LOG_TS", "Used with timestamped log files, this results in a
" + - "timestamped set of boolean results with a value
" + - "of TRUE for each log line that contains the string
" + - "represented in the field_id."), - // 1 - new ToolTipWrapper("LOG_RANGE", "Similar to LOG_TS, except the timestamped entries
" + - "are ranges delimited by the matching log entries."), - // 2 ***These items below do not appear in the comboboxes, they're here merely for reference - new ToolTipWrapper("FILE_REGEX_TS", ""), - //LINETYPES - new ToolTipWrapper("HAVESTRING_TS", ""), - - new ToolTipWrapper("REGEX_TS", "")}; - - - public static final Set LOG_ACCESIBLE_FieldType = new HashSet(Arrays.asList( - new String[] {"CONTAINS", "FILE_REGEX", "SEARCH"} - )); - - public static final Set LOG_TS_ACCESSIBLE_LineType = new HashSet(Arrays.asList( - new String[] {"HAVESTRING", "REGEX"} - )); - - public static final Set lineParamAccessible = new HashSet(Arrays.asList( - new String[] {"TOKEN", "PARENS", "QUOTES", "SLASH", "GROUP", "SEARCH"} - )); - - - public static final Set justFieldType = new HashSet(Arrays.asList( - new String[] {"LINE_COUNT", "CHECKSUM", "TIME_DELIM"} - )); - - - public static final Set timeStampDelimiterAccessible = new HashSet(Arrays.asList( - new String[] {"Service", "Program"} - )); -} +/* +This software was created by United States Government employees at +The Center for Cybersecurity and Cyber Operations (C3O) +at the Naval Postgraduate School NPS. Please note that within the +United States, copyright protection is not available for any works +created by United States Government employees, pursuant to Title 17 +United States Code Section 105. This software is in the public +domain and is not subject to copyright. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + */ +package labtainers.resultsui; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; +import labtainers.mainui.ToolTipHandlers.ToolTipWrapper; + +/** + * + * @author Daniel Liao + */ +public class ParamReferenceStorage { + public static ToolTipWrapper getWrapper(ToolTipWrapper[] tipList, String item){ + ToolTipWrapper retval = null; + + for(ToolTipWrapper tool_tip : tipList){ + if(tool_tip.getItem().equals(item)){ + retval = tool_tip; + break; + } + } + return retval; + } + public static final ToolTipWrapper[] FieldType_ITEMS = new ToolTipWrapper[] { + //0 + new ToolTipWrapper("TOKEN", "Treat the line as space-delimited tokens."), + // 1 + new ToolTipWrapper("PARENS", "The desired value is contained in parenthesis."), + // 2 + new ToolTipWrapper("QUOTES", "The desired value is contained in quotes."), + // 3 + new ToolTipWrapper("SLASH", "The desired value is contained within slashes
" + + "e.g., /foo/"), + // 4 + new ToolTipWrapper("LINE_COUNT", "The quantity of lines in the file. Remaining fields
" + + "are ignored."), + // 5 + new ToolTipWrapper("CHECKSUM", "The result value is set to the md5 checksum
" + + "of the file."), + // 6 + new ToolTipWrapper("CONTAINS", "The result value is set to TRUE if the file
" + + "contains the string represented in field_id."), + // 7 + new ToolTipWrapper("FILE_REGEX", "The result value is set to TRUE if the file
" + + "contains the regular expression represented in field_id.
" + + "The python findall function is used on the entire file.
" + + "See the acl lab for an example of multi-line expressions."), + // 8 + new ToolTipWrapper("STRING_COUNT", "The result value is set to the quantity of
" + + "occurances of the string represented in field_id."), + // 9 + new ToolTipWrapper("COMMAND_COUNT", "Intended for use with bash_history files, counts
" + + "the occurances of the command given in the field_id.
"), + // 10 + new ToolTipWrapper("PARAM", "The result value is set to nth parameter
" + + "(0 is the program name), provided in the
" + + "program invocation."), + // 11 + new ToolTipWrapper("SEARCH", "The result is assigned the value of the search
" + + "defined by the given field_id, which is treated as an
" + + "expression having the syntax of pythons parse.search
" + + "function. E.g., \"frame.number=={:d}\" would
" + + "yield the frame number."), + // 12 + new ToolTipWrapper("GROUP", "Intended for use with \"REGEX\" line types, the
" + + "result is set to the value of the regex group
" + + "number named by the field_id. Regular expressions
" + + "and their groups are processed using the python
" + + "re.search semantics." ), + // 13 + new ToolTipWrapper("SIZE", "The result value is set to the size of the file."), + // 14 + new ToolTipWrapper("TIME_DELIM", "" )}; + + + public static final ToolTipWrapper[] LineType_ITEMS = new ToolTipWrapper[] { + // 0 + new ToolTipWrapper("NONE", ""), + // 1 + new ToolTipWrapper("LINE", "The line_id is an integer line number
" + + "(starting at one). Use of this to identify
" + + "lines is discouraged since minor lab changes
" + + "might alter the count."), + // 2 + new ToolTipWrapper("STARTSWITH", "the line_id is a string. This names the
" + + "first occurrence of a line that starts with
" + + "this string." ), + // 3 + new ToolTipWrapper("HAVESTRING", "The line_id is a string. This names the
" + + "first occurrence of a line that contains the
" + + "string." ), + // 4 + new ToolTipWrapper("REGEX", "The line_id is a regular expression. This names the
" + + "first occurrence of a line that matches the regular
" + + "expression. Also see the \"GROUP\" field_type." ), + // 5 + new ToolTipWrapper("NEXT_STARTSWITH", "the line_id is a string. This names the
" + + "line preceeding the first occurrence of a line
" + + "that starts with this string.")}; + + + public static final ToolTipWrapper[] TimestampType_ITEMS = new ToolTipWrapper[] { + // 0 + new ToolTipWrapper("File", "Result time stamps are derived
"+"from the file time stamp."),} ; + + + //****These items may need to be stored differently for better organization) + public static final ToolTipWrapper[] SpecialTimeStampType = new ToolTipWrapper[] { + //FIELDTYPES + // 0 + new ToolTipWrapper("LOG_TS", "Used with timestamped log files, this results in a
" + + "timestamped set of boolean results with a value
" + + "of TRUE for each log line that contains the string
" + + "represented in the field_id."), + // 1 + new ToolTipWrapper("LOG_RANGE", "Similar to LOG_TS, except the timestamped entries
" + + "are ranges delimited by the matching log entries."), + new ToolTipWrapper("RANGE_REGEX", "Similar to LOG_RANGE, except the matching string
"+ + "is a regular expression."), + // 2 ***These items below do not appear in the comboboxes, they're here merely for reference + new ToolTipWrapper("FILE_REGEX_TS", ""), + //LINETYPES + new ToolTipWrapper("HAVESTRING_TS", ""), + + new ToolTipWrapper("REGEX_TS", "")}; + + public static final ToolTipWrapper[] Operator_ITEMS = new ToolTipWrapper[] { + //0 + new ToolTipWrapper("RAND_REPLACE", "Replace a symbol with a random integer within a range."), + // 1 + new ToolTipWrapper("RAND_REPLACE_UNIQUE", "Like RAND_REPLACE, but does not reuse value.
Intended for IP addressees."), + // 2 + new ToolTipWrapper("HASH_CREATE", "Hash a string and write it to a named file."), + // 3 + new ToolTipWrapper("HASH_REPLACE", "Replace a symbol with the hash of a string"), + new ToolTipWrapper("CLONE_REPLACE", "Replace a symbol with a Clone Instance number.
Intended for use with cloned workstations") + }; + + public static final Set LOG_ACCESIBLE_FieldType = new HashSet(Arrays.asList( + new String[] {"CONTAINS", "FILE_REGEX", "SEARCH"} + )); + + public static final Set LOG_TS_ACCESSIBLE_LineType = new HashSet(Arrays.asList( + new String[] {"HAVESTRING", "REGEX"} + )); + + public static final Set lineParamAccessible = new HashSet(Arrays.asList( + new String[] {"TOKEN", "PARENS", "QUOTES", "SLASH", "GROUP", "SEARCH"} + )); + + + public static final Set justFieldType = new HashSet(Arrays.asList( + new String[] {"LINE_COUNT", "CHECKSUM", "TIME_DELIM", "SIZE"} + )); + + + public static final Set timeStampDelimiterAccessible = new HashSet(Arrays.asList( + new String[] {"Service", "Program"} + )); + +} diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Results/src/ResultsUI/ResultsData.java b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/resultsui/ResultsData.java similarity index 72% rename from modules/utilities/unix/labtainers/files/Labtainers-master/UI/Results/src/ResultsUI/ResultsData.java rename to modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/resultsui/ResultsData.java index 5e0a325a2..a5e759b3c 100644 --- a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Results/src/ResultsUI/ResultsData.java +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/resultsui/ResultsData.java @@ -1,745 +1,834 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package ResultsUI; - -import static ResultsUI.ParamReferenceStorage.justFieldType; -import static ResultsUI.ParamReferenceStorage.lineParamAccessible; -import static ResultsUI.ParamReferenceStorage.timeStampDelimiterAccessible; -import ResultsUI.ToolTipHandlers.ToolTipWrapper; -import java.awt.Component; -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; -import javax.swing.JOptionPane; -import javax.swing.JPanel; - -/** - * - * @author Dan - */ -public class ResultsData { - List listofArtifacts; - ArrayList containerList; - boolean labloaded; - String labname; - int rowCount; - - ResultsData(){ - listofArtifacts = new ArrayList<>(); - containerList = new ArrayList<>(); - labloaded = false; - labname = ""; - rowCount = 0; - } - - ResultsData(String labname){ - listofArtifacts = new ArrayList<>(); - containerList = new ArrayList<>(); - labloaded = false; - this.labname = labname; - rowCount = 0; - - getData(); - } - -//LOADING~~~~~~~~~~~~~~~~~~~~~~~~~ - - //Checks if the lab exists and will get lab's result config data if it does - private void getData(){ - //Check if the Folder exists - String userHomeFolder = System.getProperty("user.home"); - File lab = new File(userHomeFolder + File.separator + "labtainer" + File.separator + "trunk" + File.separator + "labs" + File.separator+ labname); - - if(lab.isDirectory()){ - if(getContainers(lab) && getArtifacts()) - labloaded = true; - } - else - System.out.println("Lab does not exist!"); - } - - //Updates the containerlist (all artifct panels refer to this list to fill in the container combobox) - private boolean getContainers(File lab){ - File startConfig = new File(lab+"/config/start.config"); - - try { - if(startConfig.exists()){ - try (FileReader fileReader = new FileReader(startConfig)) { - BufferedReader bufferedReader = new BufferedReader(fileReader); - - String line = bufferedReader.readLine(); - while (line != null) { - if(line.startsWith("CONTAINER")){ - containerList.add(line.split("\\s+")[1]); - } - line = bufferedReader.readLine(); - } - } - - //Every list of containers should include "ALL" to signify when the container_name is not specified in the file ID - if(containerList.size() > 1) - containerList.add("ALL"); - - return true; - } - else{ - System.out.println("start.config is missing"); - return false; - } - } - catch (FileNotFoundException ex) { - Logger.getLogger(ResultsUI.class.getName()).log(Level.SEVERE, null, ex); - System.out.println("Issue with getting containers"); - return false; - } catch (IOException ex) { - Logger.getLogger(ResultsUI.class.getName()).log(Level.SEVERE, null, ex); - System.out.println("Issue with getting containers"); - return false; - } - - } - - //Parses the results.config to obtain all the relevant artifact lines, - //extracts the values of each artifact line - //and then loads each artifact line's value into the list of Artifacts - private boolean getArtifacts(){ - ArrayList artifacts = getArtifactLines(); - - if(artifacts != null){ - //Fill the list of artifacts - for(String artifactLine : artifacts){ - ArtifactValues values = new ArtifactValues(artifactLine); - listofArtifacts.add(values); - rowCount++; - } - return true; - } - else - return false; - - } - - -//WRITING~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - //Update the results.config file with the user's input - protected void writeResultsConfig(JPanel PanelofArtifacts){ - try { - updateListofArtifacts(PanelofArtifacts); - String resultTag, - container, - file, - fieldType, - fieldID, - lineType, - lineID, - timeStampType, - timeStampDelimiter; - String resultsConfigText = ""; - - ErrorHandler error = new ErrorHandler(); - ArrayList resultTagList = new ArrayList<>(); //Used for duplication checking - - - //Iterate through each artifact - for(int i=0;i < listofArtifacts.size();i++){ - error.checkReset(); //Reset the error statuses for a new artifact line - - String artifactConfigLine = ""; - - //RESULTS TAG - resultTag = listofArtifacts.get(i).resultTag; - resultTagList.add(resultTag); - - //Checks if resultTag is valid or inputted - if(resultTag.matches("^[a-zA-Z0-9_]+$")) - artifactConfigLine += (resultTag + " = "); //add to artifact Config line - else if(resultTag.isEmpty() || resultTag.equals("")) - error.resultTagMissing = true; - else - error.resultError = true; - - //FILEID CONFIG - file = listofArtifacts.get(i).fileID; - container = listofArtifacts.get(i).container; - ToolTipWrapper timeStampTypeTTW = listofArtifacts.get(i).timeStampType; - timeStampType = timeStampTypeTTW.getItem(); - timeStampDelimiter = listofArtifacts.get(i).timeStampDelimiter; - - if(file.isEmpty() || file.equals("")){ - error.fileIDMissing = true; - } - //Checks if non-file-path file input has .stdin | .stdout | .prgout dottag - //Note: most OS, but Windows use backslashes as a File seperator - else if(!file.contains("/")){ - if(!file.contains(".")) - error.fileError = true; - else{ - String dotTag = file.substring(file.indexOf("."),file.length()); - if(!(dotTag.equals(".stdin") || dotTag.equals(".stdout") || dotTag.equals(".prgout"))) - error.fileError = true; - } - } - - //CONTAINER (if a specific container is selected) - if(containerList.size() > 1 && !container.equals("ALL")){ - artifactConfigLine += (container); - artifactConfigLine += ":"; - } - - //TIMESTAMP DELIMITER (if Serivce or Program was selected in the Timestamp combobox) - if(timeStampDelimiterAccessible.contains(timeStampType)){ - //Checks if the file is a file path when a user inputs a time delimiter - if(file.contains("/") && !(timeStampDelimiter.isEmpty() || timeStampDelimiter.equals(""))){ - artifactConfigLine += (file+ ":" + timeStampDelimiter); - - if((timeStampType).equals("Service")) - artifactConfigLine += ".service"; - } - else{ - if(!file.contains("/")) - error.timeDelimiterError = true; - else - error.timeDelimiterMissing = true; - } - } - else - artifactConfigLine += file; //could be a .[stdin | stdout | prgout], file_path - - - //FIELD TYPE - /* - If the timeStampType is "LOG_TS" and the fieldType is "CONTAINS", then the fieldType will be "LOG_TS" - If the timeStampType is "LOG_TS" and the fieldType is "FILE_REGEX", then the fieldType will be "FILE_REGEX_TS" - If the timeStampType is "LOG_RANGE" and the fieldType is "CONTAINS", then the fieldType will be "LOG_RANGE" - */ - ToolTipWrapper fieldTypeTTW = listofArtifacts.get(i).fieldType; - fieldType = fieldTypeTTW.getItem(); - - if(timeStampType.equals("LOG_TS")){ - if(fieldType.equals("CONTAINS")) - fieldType = "LOG_TS"; - else if(fieldType.equals("FILE_REGEX")) - fieldType = "FILE_REGEX_TS"; - } - if(timeStampType.equals("LOG_RANGE")){ - if(fieldType.equals("CONTAINS")) - fieldType = "LOG_RANGE"; - } - artifactConfigLine += (" : " + fieldType); - - //FIELD ID - //if field type is "LINE_COUNT or CHECKSUM" then don't look into the Field TYPE and Line ID and Line Type - if(!justFieldType.contains(fieldType)){ - fieldID = listofArtifacts.get(i).fieldID; - - //If the field type is TOKEN, check if the field ID is a number 1-9 or ALL or LAST - if(fieldType.equals("TOKEN") && (fieldID.equals("0") || !(fieldID.matches("^[0-9]+$") || fieldID.equals("ALL") || fieldID.equals("LAST")))) - error.fieldTypeTokenError = true; - - //If the field type is PARAM, check if the value is a postive number or zero - else if(fieldType.equals("PARAM") && !(fieldID.matches("^[0-9]+$"))) - error.fieldTypeParamError = true; - - //Check if the user didn't inputted anthing in the Field ID - else if(fieldID.isEmpty() || fieldID.equals("")) - error.fieldIDMissing = true; - - //If all is good with the above checks, then concatenate the fieldID to the artifactLine - else - artifactConfigLine += (" : " + fieldID); - - //LINE_TYPE and LINE ID - //Is LineType and Line ID relevant based on field type? if so, then... - if(lineParamAccessible.contains(fieldType)){ - ToolTipWrapper lineTypeTTW = listofArtifacts.get(i).lineType; - lineType = lineTypeTTW.getItem(); - lineID = listofArtifacts.get(i).lineID; - - if(!lineType.equals("NONE")){ - //Check if there is a line ID input if the user has a line type - if(lineID.isEmpty() || lineID.equals("")) - error.lineIDMissing = true; - else if(lineType.equals("LINE") && (lineID.equals("0") || !(lineID.matches("^[0-9]+$")))){ - error.lineIDError = true; - } - else if(timeStampType.equals("LOG_TS") && lineType.equals("HAVESTRING")) - artifactConfigLine += (" : " + "HAVESTRING_TS" + " : " + lineID); - else if(timeStampType.equals("LOG_TS") && lineType.equals("REGEX")) - artifactConfigLine += (" : " + "REGEX_TS" + " : " + lineID); - else - artifactConfigLine += (" : " + lineType + " : " + lineID); - } - } - } - - //If there's no error, put the artifactConfigLine in the resultsConfigText string, - //Otherwise the overallPass of the user input is false - if(error.userInputCheck(i+1)){ - if(i < listofArtifacts.size()-1) - artifactConfigLine+= System.lineSeparator(); - //Add the artifact config line to the Results Config text - resultsConfigText += artifactConfigLine; - } - else - error.fail(); - } - - //Check for duplicate result tags - error.checkDuplicateResultTags(resultTagList); - /* - for(String rt : resultTagList) - System.out.println(rt); - */ - - if(error.passStatus()){ - //Resets the results.config file - File resultsConfigFile = initializeResultConfig(); - - try ( //Write the resultsConfigText to the results.config - BufferedWriter writer = new BufferedWriter(new FileWriter(resultsConfigFile, true))) { - writer.write(resultsConfigText); - } - } - else - JOptionPane.showMessageDialog(null, error.toString(), "INPUT ERROR", JOptionPane.ERROR_MESSAGE); - } - catch (IOException ex) { - Logger.getLogger(ResultsUI.class.getName()).log(Level.SEVERE, null, ex); - } - } - - //Checks if the results.config file exists and prepares the result.config file for the lab - private File initializeResultConfig() throws IOException{ - //Get the filepath for the lab's results.config - String userHomeFolder = System.getProperty("user.home"); - File resultsConfigFile = new File(userHomeFolder + File.separator + "labtainer" + File.separator + "trunk" + File.separator + "labs" + File.separator + labname + File.separator + "instr_config" + File.separator + "results.config"); - - //May not be necessary, subject to remove the base text, perhaps there is an option for the user to add their own comments - String baseText = - "# results.config" + System.lineSeparator() - + "#" + System.lineSeparator() - + "# Please see the Labtainer Lab Designer User Guide" + System.lineSeparator(); - - if(resultsConfigFile.exists()){ - //Overwrite results.config file if it already exists - try (BufferedWriter writer = new BufferedWriter(new FileWriter(resultsConfigFile, false))) { - writer.write(baseText); - } - return resultsConfigFile; - } - else if(resultsConfigFile.createNewFile()){ - //Create new results.config file otherwise(if it does not already exist) - try (BufferedWriter writer = new BufferedWriter(new FileWriter(resultsConfigFile))) { - writer.write(baseText); - } - return resultsConfigFile; - } - else{ //File could not be created so return error message - System.out.println("Results Config File couldn't be initialzed."); - return null; - } - } - - //Handles all the error data and error checking before writing the results.config - private class ErrorHandler{ - private boolean overallPass; - private String errorMsg; - private boolean - resultError, - fileError, - timeDelimiterError, - fieldTypeTokenError, - fieldTypeParamError, - lineIDError, - - resultTagMissing, - fileIDMissing, - timeDelimiterMissing, - fieldIDMissing, - lineIDMissing; - - - ErrorHandler(){ - overallPass = true; - errorMsg = ""; - checkReset(); - } - - void fail(){ - overallPass = false; - } - - //Resets the error status(used right before looking at new artifact line) - private void checkReset(){ - resultError = false; - fileError = false; - timeDelimiterError = false; - fieldTypeTokenError = false; - fieldTypeParamError = false; - lineIDError = false; - - resultTagMissing = false; - fileIDMissing = false; - timeDelimiterMissing = false; - fieldIDMissing = false; - lineIDMissing = false; - - } - - //Builds error message detailing the errors that appear in the user input - boolean userInputCheck(int artifactIndex){ - boolean rowPassed = true; - String infoMsg = "Artifact Line: " + artifactIndex + System.lineSeparator(); - - if(resultTagMissing){ - rowPassed = false; - infoMsg+= "-Result Tag input is missing." + System.lineSeparator(); - } - if(fileIDMissing){ - rowPassed = false; - infoMsg+= "-File ID input is missing." + System.lineSeparator(); - } - if(timeDelimiterMissing){ - rowPassed = false; - infoMsg+= "-Time Delimiter input is missing." + System.lineSeparator(); - } - if(fieldIDMissing){ - rowPassed = false; - infoMsg+= "-Field ID input is missing." + System.lineSeparator(); - } - if(lineIDMissing){ - rowPassed = false; - infoMsg+= "-Line ID input is missing)." + System.lineSeparator(); - } - if(resultError){ - rowPassed = false; - infoMsg+= "-Make sure your Results Tag has only alphanumeric characters or underscores." + System.lineSeparator(); - } - if(fileError){ - rowPassed = false; - infoMsg+= "-Make sure your File ID file's extentsion ends in \".stdin\", \".stdout\", or \".prgout\"." + System.lineSeparator() + " Or is a file path." + System.lineSeparator(); - } - if(timeDelimiterError){ - rowPassed = false; - infoMsg+= "-Timestamp Delimiter Option is only available if your File ID is a file path." + System.lineSeparator(); - } - if(fieldTypeTokenError){ - rowPassed = false; - infoMsg+= "-If your Field Type is TOKEN then make sure your Field ID is a positve number(zero exclusive), \"ALL\", or \"LAST\"." + System.lineSeparator(); - } - if(fieldTypeParamError){ - rowPassed = false; - infoMsg+= "-If your Field Type is PARAM then make sure your Field ID is a positve number(zero inclusive)." + System.lineSeparator(); - } - if(lineIDError){ - rowPassed = false; - infoMsg+= "-If your Line Type is LINE then make sure your Line ID is a positve number(zero exclusive)." + System.lineSeparator(); - } - - - if(!rowPassed) - errorMsg += (infoMsg + System.lineSeparator()); - - return rowPassed; - } - - //Check for duplicate results Taga - void checkDuplicateResultTags(ArrayList resultTags){ - ArrayList markedResultTags = new ArrayList<>(); - - //Store all the indices for each unique result tag - for(int i=0;i 1){ - duplicateErrorMsg+= "Duplicate Result Tag: \"" + rt.resultTag + "\" on rows "; - - for(int i=0;i indices; - - ResultTagIndices(String resultTag, int index){ - this.resultTag = resultTag; - indices = new ArrayList<>(); - indices.add(index); - } - - void addIndex(int index){ - indices.add(index); - } - } - - //Is the result tag already in the duplicate list? - boolean isDuplicate(ArrayList markedResultTags, String resultTag){ - for(ResultTagIndices rtIndices : markedResultTags){ - if(rtIndices.resultTag.equals(resultTag)) - return true; - } - return false; - } - - //Get the duplicate object based on the duplicate string - ResultTagIndices getDuplicate(ArrayList markedResultTags, String resultTag){ - for(ResultTagIndices rtIndices : markedResultTags){ - if(rtIndices.resultTag.equals(resultTag)) - return rtIndices; - } - return null; - } - - - @Override - public String toString(){ - return errorMsg; - } - - boolean passStatus(){ - return overallPass; - } - } - - -//GENERAL~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - //Gets the artifact lines in the goals.config - protected ArrayList getArtifactLines(){ - ArrayList artifacts = new ArrayList<>(); - - try { - String userHomeFolder = System.getProperty("user.home"); - File lab = new File(userHomeFolder + File.separator + "labtainer" + File.separator + "trunk" + File.separator + "labs" + File.separator+ labname); - File resultsConfig = new File(lab+"/instr_config/results.config"); - - //Get the artifact lines - if(resultsConfig.exists()){ - try (FileReader fileReader = new FileReader(resultsConfig)) { - BufferedReader bufferedReader = new BufferedReader(fileReader); - String line = bufferedReader.readLine(); - - while (line != null) { - //just checks if the first character is: not empty, not a hash, and not whitspace) - if(!line.isEmpty() && line.charAt(0) != '#' && !Character.isWhitespace(line.charAt(0))) - artifacts.add(line); - - line = bufferedReader.readLine(); - } - } - return artifacts; - } - else{ - System.out.println("No results.config file in the loaded lab!"); - return null; - } - } - catch (IOException e) { - System.out.println("Issue with getting result.config artifacts"); - return null; - } - } - - //Updates the list of artifacts - protected void updateListofArtifacts(JPanel PanelofArtifacts){ - Component[] artifacts = PanelofArtifacts.getComponents(); //Access the list of artifacts - - List listofArtifactsTMP = new ArrayList<>(); - - //Iterate through each artifact and add it to the temp list of artifact values - for (Component artifact : artifacts) { - //RESULTS TAG - String resultTag = ((ArtifactPanels) artifact).getTagTextField().getText(); - //FILEID CONFIG - String file = ((ArtifactPanels) artifact).getFileTextField().getText(); - String container = (String) (((ArtifactPanels) artifact).getContainerComboBox().getSelectedItem()); - ToolTipHandlers.ToolTipWrapper timeStampType = (ToolTipHandlers.ToolTipWrapper) (((ArtifactPanels) artifact).getTimeStampComboBox().getSelectedItem()); - String timeStampDelimiter = ((ArtifactPanels) artifact).getTimeStampTextField().getText(); - //FieldType - ToolTipHandlers.ToolTipWrapper fieldType = (ToolTipHandlers.ToolTipWrapper) (((ArtifactPanels) artifact).getFieldTypeComboBox().getSelectedItem()); - String fieldID = ((ArtifactPanels) artifact).getFieldIDTextField().getText(); - //LINE_TYPE and LINE ID - ToolTipHandlers.ToolTipWrapper lineType = (ToolTipHandlers.ToolTipWrapper) (((ArtifactPanels) artifact).getLineTypeComboBox().getSelectedItem()); - String lineID = ((ArtifactPanels) artifact).getLineIDTextField().getText(); - - listofArtifactsTMP.add(new ArtifactValues(resultTag, container, file, fieldType, fieldID, lineType, lineID, timeStampType, timeStampDelimiter)); - } - - listofArtifacts = listofArtifactsTMP; //overwrite the old listofArtifacts with the temp listofArtifacts - } - - //Swaps the position of artifacts in a list - protected void swapArtifacts(String type, int rowIndex){ - - switch(type){ - case "UP": - if(rowIndex > 0){ - //System.out.println("UP: "+listofArtifacts.get(rowIndex).resultTag+" Index: "+rowIndex); - Collections.swap(listofArtifacts, rowIndex, rowIndex-1); - } - break; - case "DOWN": - //System.out.println(rowCount); - //System.out.println("RowINdex: " + rowIndex + " RowCount-1: "+ (rowCount-1)); - if(rowIndex < rowCount-1){ - //System.out.println("DOWN: "+listofArtifacts.get(rowIndex).resultTag); - Collections.swap(listofArtifacts, rowIndex, rowIndex+1); - } - break; - default: - System.out.println("swap case no register"); - } - } - - //Gets a list of ArtifactValues from the the current state of the results.config file - protected List getArtifactValuesOfConfigFile(){ - List officialListofArtifacts = new ArrayList<>(); - - ArrayList artifactLines = getArtifactLines(); - - if(artifactLines != null){ - - for(String artifactLine : artifactLines){ - ArtifactValues values = new ArtifactValues(artifactLine); - officialListofArtifacts.add(values); - } - return officialListofArtifacts; - } - else - return null; - } - - //Compares the data of two lists of ArtifactValues. If there is a difference then return 'true', 'false' otherwise - static boolean artifactValuesDiffer(List list1, List list2){ - if(list1.size() != list2.size()){ - return true; - } - else{ - //This is a gross implemenation of comparing each individual value between two sets of Artifact Values (Maybe conisder implementing the ArtifactValues Class as a comparable) - for(int i=0;i list1, List list2) method - static private void printlistValues(List list1, List list2, int i){ - System.out.println("Result Tag: "); - System.out.println("UI: "+list1.get(i).resultTag); - System.out.println("Config: "+list2.get(i).resultTag); - System.out.println(); - - System.out.println("File ID: "); - System.out.println("UI: "+list1.get(i).fileID); - System.out.println("Config: "+list2.get(i).fileID); - System.out.println(); - - System.out.println("Field Type: "); - System.out.println("UI: "+list1.get(i).fieldType); - System.out.println("Config: "+list2.get(i).fieldType); - System.out.println(); - - System.out.println("Field ID: "); - System.out.println("UI: "+list1.get(i).fieldID); - System.out.println("Config: "+list2.get(i).fieldID); - System.out.println(); - - System.out.println("Line Type: "); - System.out.println("UI: "+list1.get(i).lineType); - System.out.println("Config: "+list2.get(i).lineType); - System.out.println(); - - System.out.println("Line ID: "); - System.out.println("UI: "+list1.get(i).lineID); - System.out.println("Config: "+list2.get(i).lineID); - System.out.println(); - - System.out.println("TimeStamp Type: "); - System.out.println("UI: "+list1.get(i).timeStampType); - System.out.println("Config: "+list2.get(i).timeStampType); - System.out.println(); - - System.out.println("TimeStamp Delim: "); - System.out.println("UI: "+list1.get(i).timeStampDelimiter); - System.out.println("Config: "+list2.get(i).timeStampDelimiter); - System.out.println(); - - System.out.println("CONTAINER: "); - System.out.println("UI: "+list1.get(i).container); - System.out.println("Config: "+list2.get(i).container); - System.out.println(); - - - - - - - } - -//GETTERS~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - protected List getListofArtifacts(){ - return listofArtifacts; - } -} +/* +This software was created by United States Government employees at +The Center for Cybersecurity and Cyber Operations (C3O) +at the Naval Postgraduate School NPS. Please note that within the +United States, copyright protection is not available for any works +created by United States Government employees, pursuant to Title 17 +United States Code Section 105. This software is in the public +domain and is not subject to copyright. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + */ +package labtainers.resultsui; + +import labtainers.mainui.ToolTipHandlers; +import labtainers.mainui.CompareTextFiles; +import java.awt.Component; +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import labtainers.mainui.MainWindow; +import static labtainers.resultsui.ParamReferenceStorage.justFieldType; +import static labtainers.resultsui.ParamReferenceStorage.lineParamAccessible; +import static labtainers.resultsui.ParamReferenceStorage.timeStampDelimiterAccessible; +import static labtainers.goalsui.ParamReferenceStorage.booleanResultTypes; +import labtainers.mainui.ToolTipHandlers.ToolTipWrapper; + +/** + * + * @author Daniel Liao + */ +public class ResultsData { + protected List listofArtifacts; + static public ArrayList containerList = new ArrayList(); + protected int rowCount; + MainWindow mainUI; + public int test = 0; + + public ResultsData(MainWindow main, File labPath){ + listofArtifacts = new ArrayList(); + rowCount = 0; + + this.mainUI = main; + } + + // Creates a deep copy of the original (shallow with containerList and mainUI) + public ResultsData(ResultsData original){ + listofArtifacts = new ArrayList(); + //Deep copy the list of artifacts + for(ArtifactValues artifact : original.listofArtifacts) + listofArtifacts.add(new ArtifactValues(artifact)); + + this.rowCount = original.getRowCount(); + + this.mainUI = original.getMainWindow(); + } +//Retrieving and Setting Data~~~~~~~~~~~~~~~~~~~~~~~~~ + + //Parses the results.config to obtain all the relevant artifact lines, + //extracts the values of each artifact line + //and then loads each artifact line's value into the list of Artifacts + public void retrieveData(){ + ArrayList artifacts = getArtifactLines(); + + if(artifacts != null){ + //Fill the list of artifacts + for(String artifactLine : artifacts){ + listofArtifacts.add(new ArtifactValues(artifactLine)); + rowCount++; + } + } + } + + //Updates the containerlist (all artifct panels refer to this list to fill in the container combobox) + static public void setContainerList(ArrayList newContainerList){ + containerList = newContainerList; + } + + +//WRITING~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + //Update the results.config file with the user's input + public String writeResultsConfig(boolean usetmp){ + File resultsConfigFile = null; + try { + String resultTag, + container, + file, + fieldType, + fieldID, + lineType, + lineID, + timeStampType, + timeStampDelimiter; + String comments; + String resultsConfigText = ""; + + ErrorHandler error = new ErrorHandler(); + ArrayList resultTagList = new ArrayList(); //Used for duplication checking + + //Iterate through each artifact + for(int i=0;i < listofArtifacts.size();i++){ + error.checkReset(); //Reset the error statuses for a new artifact line + + String artifactConfigLine = ""; + artifactConfigLine = listofArtifacts.get(i).comments; + if(artifactConfigLine == null){ + artifactConfigLine = ""; + } + + //RESULTS TAG + resultTag = listofArtifacts.get(i).resultTag; + resultTagList.add(resultTag); + + //Checks if resultTag is valid or inputted + if(resultTag.matches("^[a-zA-Z0-9_-]+$")) + artifactConfigLine += (resultTag + " = "); //add to artifact Config line + else if(resultTag.isEmpty() || resultTag.equals("")) + error.resultTagMissing = true; + else{ + System.out.println("Bad resultTag "+ resultTag); + error.resultError = true; + } + + //FILEID CONFIG + file = listofArtifacts.get(i).fileID; + container = listofArtifacts.get(i).container; + ToolTipWrapper timeStampTypeTTW = listofArtifacts.get(i).timeStampType; + timeStampType = timeStampTypeTTW.getItem(); + timeStampDelimiter = listofArtifacts.get(i).timeStampDelimiter; + + if(file.isEmpty() || file.equals("")){ + System.out.println("Bad file for resultTag "+ resultTag); + error.fileIDMissing = true; + } + //Checks if non-file-path file input has .stdin | .stdout | .prgout dottag + //Note: most OS, but Windows use backslashes as a File seperator + //else if(!file.contains("/")){ + // if(!file.contains(".")){ + // System.out.println("Bad file, missing dot for resultTag "+ resultTag); + // error.fileError = true; + // } + //} + + //CONTAINER (if a specific container is selected) + if(containerList.size() > 1 && !container.equals("ALL")){ + artifactConfigLine += (container); + artifactConfigLine += ":"; + } + + //TIMESTAMP DELIMITER (if Serivce or Program was selected in the Timestamp combobox) + if(timeStampDelimiterAccessible.contains(timeStampType)){ + //Checks if the file is a file path when a user inputs a time delimiter + if(file.contains("/") && !(timeStampDelimiter.isEmpty() || timeStampDelimiter.equals(""))){ + artifactConfigLine += (file+ ":" + timeStampDelimiter); + + if((timeStampType).equals("Service")) + artifactConfigLine += ".service"; + } + else{ + if(!file.contains("/")) + error.timeDelimiterError = true; + else + error.timeDelimiterMissing = true; + } + } + else + artifactConfigLine += file; //could be a .[stdin | stdout | prgout], file_path + + + //FIELD TYPE + /* + If the timeStampType is "LOG_TS" and the fieldType is "CONTAINS", then the fieldType will be "LOG_TS" + If the timeStampType is "LOG_TS" and the fieldType is "FILE_REGEX", then the fieldType will be "FILE_REGEX_TS" + If the timeStampType is "LOG_RANGE" and the fieldType is "CONTAINS", then the fieldType will be "LOG_RANGE" + If the timeStampType is "LOG_RANGE" and the fieldType is "FILE_REGEX", then the fieldType will be "RANGE_REGEX" + */ + ToolTipWrapper fieldTypeTTW = listofArtifacts.get(i).fieldType; + fieldType = fieldTypeTTW.getItem(); + + if(timeStampType.equals("LOG_TS")){ + if(fieldType.equals("CONTAINS")) + fieldType = "LOG_TS"; + else if(fieldType.equals("FILE_REGEX")) + fieldType = "FILE_REGEX_TS"; + } + if(timeStampType.equals("LOG_RANGE")){ + if(fieldType.equals("CONTAINS")) + fieldType = "LOG_RANGE"; + else if(fieldType.equals("FILE_REGEX")) + fieldType = "RANGE_REGEX"; + } + artifactConfigLine += (" : " + fieldType); + + //FIELD ID + //if field type is "LINE_COUNT or CHECKSUM" then don't look into the Field TYPE and Line ID and Line Type + if(!justFieldType.contains(fieldType)){ + fieldID = listofArtifacts.get(i).fieldID; + + //If the field type is TOKEN, check if the field ID is a number 1-9 or ALL or LAST + if(fieldType.equals("TOKEN") && (fieldID.equals("0") || !(fieldID.matches("^[0-9]+$") || fieldID.equals("ALL") || fieldID.equals("LAST")))) + error.fieldTypeTokenError = true; + + //If the field type is PARAM, check if the value is a postive number or zero + else if(fieldType.equals("PARAM") && !(fieldID.trim().matches("^[0-9]+$"))){ + System.out.println("PARAM field id is "+fieldID); + error.fieldTypeParamError = true; + + //Check if the user didn't inputted anthing in the Field ID + }else if(fieldID.isEmpty() || fieldID.equals("")) + error.fieldIDMissing = true; + + //If all is good with the above checks, then concatenate the fieldID to the artifactLine + else + artifactConfigLine += (" : " + fieldID); + + //LINE_TYPE and LINE ID + //Is LineType and Line ID relevant based on field type? if so, then... + if(lineParamAccessible.contains(fieldType)){ + ToolTipWrapper lineTypeTTW = listofArtifacts.get(i).lineType; + lineType = lineTypeTTW.getItem(); + lineID = listofArtifacts.get(i).lineID; + + if(!lineType.equals("NONE")){ + //Check if there is a line ID input if the user has a line type + if(lineID.isEmpty() || lineID.equals("")) + error.lineIDMissing = true; + else if(lineType.equals("LINE") && (lineID.equals("0") || !(lineID.matches("^[0-9]+$")))){ + error.lineIDError = true; + } + else if(timeStampType.equals("LOG_TS") && lineType.equals("HAVESTRING")) + artifactConfigLine += (" : " + "HAVESTRING_TS" + " : " + lineID); + else if(timeStampType.equals("LOG_TS") && lineType.equals("REGEX")) + artifactConfigLine += (" : " + "REGEX_TS" + " : " + lineID); + else + artifactConfigLine += (" : " + lineType + " : " + lineID); + } + } + } + + //If there's no error, put the artifactConfigLine in the resultsConfigText string, + //Otherwise the overallPass of the user input is false + if(error.userInputCheck(i+1)){ + if(i < listofArtifacts.size()-1) + artifactConfigLine+= "\n"; + //Add the artifact config line to the Results Config text + resultsConfigText += artifactConfigLine; + } + else + error.fail(); + } // end for each artifact + + //Check for duplicate result tags + error.checkDuplicateResultTags(resultTagList); + /* + for(String rt : resultTagList) + System.out.println(rt); + */ + + if(error.passStatus()){ + //Resets the results.config file + resultsConfigFile = initializeResultConfig(usetmp); + + try ( //Write the resultsConfigText to the results.config + BufferedWriter writer = new BufferedWriter(new FileWriter(resultsConfigFile, true))) { + writer.write(resultsConfigText+"\n"); + writer.close(); + } + /* + if(usetmp){ + String new_file = resultsConfigFile.getAbsolutePath(); + String old_file = getResultsPath(); + boolean same = CompareTextFiles.compare(old_file, new_file); + if(!same){ + retval = false; + System.out.println("files differ"); + } + } + */ + } + else + JOptionPane.showMessageDialog(null, error.toString(), "INPUT ERROR", JOptionPane.ERROR_MESSAGE); + } + catch (IOException ex) { + Logger.getLogger(ResultsUI.class.getName()).log(Level.SEVERE, null, ex); + } + if(resultsConfigFile != null){ + return resultsConfigFile.getAbsolutePath(); + }else{ + return null; + } + } + private String getResultsPath(){ + String retval = mainUI.getCurrentLab() + File.separator + "instr_config" + File.separator + "results.config"; + return retval; + } + //Checks if the results.config file exists and prepares the result.config file for the lab + private File initializeResultConfig(boolean usetmp) throws IOException{ + //Get the filepath for the lab's results.config + File resultsConfigFile; + if(!usetmp){ + resultsConfigFile = new File(getResultsPath()); + }else{ + Path tempDir=null; + try{ + tempDir = Files.createTempDirectory(mainUI.getLabName()); + }catch(IOException ex){ + System.out.println("failed creating temporary directory" + ex); + System.exit(1); + } + String dir_s = tempDir.getFileName().toString(); + resultsConfigFile = new File(File.separator+"tmp" +File.separator+dir_s+ File.separator + "results.config"); + } + //May not be necessary, subject to remove the base text, perhaps there is an option for the user to add their own comments + //String baseText = + // "# results.config" + System.lineSeparator() + // + "#" + System.lineSeparator() + // + "# Please see the Labtainer Lab Designer User Guide" + System.lineSeparator(); + + if(resultsConfigFile.exists()){ + //Overwrite results.config file if it already exists + try (BufferedWriter writer = new BufferedWriter(new FileWriter(resultsConfigFile, false))) { + // writer.write(baseText); + } + return resultsConfigFile; + } + else if(resultsConfigFile.createNewFile()){ + //Create new results.config file otherwise(if it does not already exist) + try (BufferedWriter writer = new BufferedWriter(new FileWriter(resultsConfigFile))) { + //writer.write(baseText); + } + return resultsConfigFile; + } + else{ //File could not be created so return error message + System.out.println("Results Config File couldn't be initialzed."); + return null; + } + } + + //Handles all the error data and error checking before writing the results.config + private class ErrorHandler{ + private boolean overallPass; + private String errorMsg; + private boolean + resultError, + fileError, + timeDelimiterError, + fieldTypeTokenError, + fieldTypeParamError, + lineIDError, + + resultTagMissing, + fileIDMissing, + timeDelimiterMissing, + fieldIDMissing, + lineIDMissing; + + + ErrorHandler(){ + overallPass = true; + errorMsg = ""; + checkReset(); + } + + void fail(){ + overallPass = false; + } + + //Resets the error status(used right before looking at new artifact line) + private void checkReset(){ + resultError = false; + fileError = false; + timeDelimiterError = false; + fieldTypeTokenError = false; + fieldTypeParamError = false; + lineIDError = false; + + resultTagMissing = false; + fileIDMissing = false; + timeDelimiterMissing = false; + fieldIDMissing = false; + lineIDMissing = false; + + } + + //Builds error message detailing the errors that appear in the user input + boolean userInputCheck(int artifactIndex){ + boolean rowPassed = true; + String infoMsg = "Results Line: " + artifactIndex + System.lineSeparator(); + + if(resultTagMissing){ + rowPassed = false; + infoMsg+= "-Result Tag input is missing." + System.lineSeparator(); + } + if(fileIDMissing){ + rowPassed = false; + infoMsg+= "-File ID input is missing." + System.lineSeparator(); + } + if(timeDelimiterMissing){ + rowPassed = false; + infoMsg+= "-Time Delimiter input is missing." + System.lineSeparator(); + } + if(fieldIDMissing){ + rowPassed = false; + infoMsg+= "-Field ID input is missing." + System.lineSeparator(); + } + if(lineIDMissing){ + rowPassed = false; + infoMsg+= "-Line ID input is missing)." + System.lineSeparator(); + } + if(resultError){ + rowPassed = false; + infoMsg+= "-Make sure your Results Tag has only alphanumeric characters or underscores." + System.lineSeparator(); + } + //if(fileError){ + // rowPassed = false; + // infoMsg+= "-Make sure your File ID file's extentsion ends in \".stdin\", \".stdout\", or \".prgout\"." + System.lineSeparator() + " Or is a file path." + System.lineSeparator(); + //} + if(timeDelimiterError){ + rowPassed = false; + infoMsg+= "-Timestamp Delimiter Option is only available if your File ID is a file path." + System.lineSeparator(); + } + if(fieldTypeTokenError){ + rowPassed = false; + infoMsg+= "-If your Field Type is TOKEN then make sure your Field ID is a positve number(zero exclusive), \"ALL\", or \"LAST\"." + System.lineSeparator(); + } + if(fieldTypeParamError){ + rowPassed = false; + infoMsg+= "-If your Field Type is PARAM then make sure your Field ID is a positve number(zero inclusive)." + System.lineSeparator(); + } + if(lineIDError){ + rowPassed = false; + infoMsg+= "-If your Line Type is LINE then make sure your Line ID is a positve number(zero exclusive)." + System.lineSeparator(); + } + + + if(!rowPassed) + errorMsg += (infoMsg + System.lineSeparator()); + + return rowPassed; + } + + //Check for duplicate results Taga + void checkDuplicateResultTags(ArrayList resultTags){ + ArrayList markedResultTags = new ArrayList(); + + //Store all the indices for each unique result tag + for(int i=0;i 1){ + duplicateErrorMsg+= "Duplicate Result Tag: \"" + rt.resultTag + "\" on rows "; + + for(int i=0;i indices; + + ResultTagIndices(String resultTag, int index){ + this.resultTag = resultTag; + indices = new ArrayList(); + indices.add(index); + } + + void addIndex(int index){ + indices.add(index); + } + } + + //Is the result tag already in the duplicate list? + boolean isDuplicate(ArrayList markedResultTags, String resultTag){ + for(ResultTagIndices rtIndices : markedResultTags){ + if(rtIndices.resultTag.equals(resultTag)) + return true; + } + return false; + } + + //Get the duplicate object based on the duplicate string + ResultTagIndices getDuplicate(ArrayList markedResultTags, String resultTag){ + for(ResultTagIndices rtIndices : markedResultTags){ + if(rtIndices.resultTag.equals(resultTag)) + return rtIndices; + } + return null; + } + + + @Override + public String toString(){ + return errorMsg; + } + + boolean passStatus(){ + return overallPass; + } + } + + +//GENERAL~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + //Gets the artifact lines in the results.config + protected ArrayList getArtifactLines(){ + ArrayList artifacts = new ArrayList(); + + try { + File resultsConfig = new File(mainUI.getCurrentLab()+File.separator+"instr_config"+File.separator+"results.config"); + + //Get the artifact lines + if(resultsConfig.exists()){ + try (FileReader fileReader = new FileReader(resultsConfig)) { + BufferedReader bufferedReader = new BufferedReader(fileReader); + String line = bufferedReader.readLine(); + String result_line = ""; + while (line != null) { + //just checks if the first character is: not empty, not a hash, and not whitspace) + result_line = result_line + line; + if(!line.isEmpty() && line.charAt(0) != '#' && !Character.isWhitespace(line.charAt(0))){ + artifacts.add(result_line); + result_line = ""; + }else{ + result_line=result_line+"\n"; + } + line = bufferedReader.readLine(); + } + } + return artifacts; + } + else{ + System.out.println("No results.config file in the loaded lab!"); + //Create the missing results.config file + resultsConfig.createNewFile(); + return artifacts; + } + } + catch (IOException e) { + System.out.println("Issue with getting result.config artifacts"); + return null; + } + } + + //Updates the list of artifacts + protected void updateListofArtifacts(JPanel PanelofArtifacts){ + Component[] artifacts = PanelofArtifacts.getComponents(); //Access the list of artifacts + + List listofArtifactsTMP = new ArrayList(); + + //Iterate through each artifact and add it to the temp list of artifact values + for (Component artifact : artifacts) { + //RESULTS TAG + String resultTag = ((ArtifactPanels) artifact).getTagTextField().getText(); + //FILEID CONFIG + String file = ((ArtifactPanels) artifact).getFileTextField().getText(); + String container = (String) (((ArtifactPanels) artifact).getContainerComboBox().getSelectedItem()); + System.out.println(container); + ToolTipHandlers.ToolTipWrapper timeStampType = (ToolTipHandlers.ToolTipWrapper) (((ArtifactPanels) artifact).getTimeStampComboBox().getSelectedItem()); + String timeStampDelimiter = ((ArtifactPanels) artifact).getTimeStampTextField().getText(); + //FieldType + ToolTipHandlers.ToolTipWrapper fieldType = (ToolTipHandlers.ToolTipWrapper) (((ArtifactPanels) artifact).getFieldTypeComboBox().getSelectedItem()); + String fieldID = ((ArtifactPanels) artifact).getFieldIDTextField().getText(); + //LINE_TYPE and LINE ID + ToolTipHandlers.ToolTipWrapper lineType = (ToolTipHandlers.ToolTipWrapper) (((ArtifactPanels) artifact).getLineTypeComboBox().getSelectedItem()); + String lineID = ((ArtifactPanels) artifact).getLineIDTextField().getText(); + String comments = ((ArtifactPanels) artifact).getComments(); + + listofArtifactsTMP.add(new ArtifactValues(resultTag, container, file, fieldType, fieldID, lineType, lineID, timeStampType, timeStampDelimiter, comments)); + } + + listofArtifacts = listofArtifactsTMP; //overwrite the old listofArtifacts with the temp listofArtifacts + } + + //Swaps the position of artifacts in a list + protected void swapArtifacts(String type, int rowIndex){ + + switch(type){ + case "UP": + if(rowIndex > 0){ + //System.out.println("UP: "+listofArtifacts.get(rowIndex).resultTag+" Index: "+rowIndex); + Collections.swap(listofArtifacts, rowIndex, rowIndex-1); + } + break; + case "DOWN": + //System.out.println(rowCount); + //System.out.println("RowINdex: " + rowIndex + " RowCount-1: "+ (rowCount-1)); + if(rowIndex < rowCount-1){ + //System.out.println("DOWN: "+listofArtifacts.get(rowIndex).resultTag); + Collections.swap(listofArtifacts, rowIndex, rowIndex+1); + } + break; + default: + System.out.println("swap case no register"); + } + } + + //Gets a list of ArtifactValues from the the current state of the results.config file + protected List getArtifactValuesOfConfigFile(){ + List officialListofArtifacts = new ArrayList(); + + ArrayList artifactLines = getArtifactLines(); + + if(artifactLines != null){ + + for(String artifactLine : artifactLines){ + ArtifactValues values = new ArtifactValues(artifactLine); + officialListofArtifacts.add(values); + } + return officialListofArtifacts; + } + else + return null; + } + + //Compares the data of two lists of ArtifactValues. If there is a difference then return 'true', 'false' otherwise + static boolean artifactValuesDiffer(List list1, List list2){ + if(list1.size() != list2.size()){ + return true; + } + else{ + //This is a gross implemenation of comparing each individual value between two sets of Artifact Values (Maybe conisder implementing the ArtifactValues Class as a comparable) + for(int i=0;i list1, List list2) method + static private void printlistValues(List list1, List list2, int i){ + System.out.println("Result Tag: "); + System.out.println("UI: "+list1.get(i).resultTag); + System.out.println("Config: "+list2.get(i).resultTag); + System.out.println(); + + System.out.println("File ID: "); + System.out.println("UI: "+list1.get(i).fileID); + System.out.println("Config: "+list2.get(i).fileID); + System.out.println(); + + System.out.println("Field Type: "); + System.out.println("UI: "+list1.get(i).fieldType); + System.out.println("Config: "+list2.get(i).fieldType); + System.out.println(); + + System.out.println("Field ID: "); + System.out.println("UI: "+list1.get(i).fieldID); + System.out.println("Config: "+list2.get(i).fieldID); + System.out.println(); + + System.out.println("Line Type: "); + System.out.println("UI: "+list1.get(i).lineType); + System.out.println("Config: "+list2.get(i).lineType); + System.out.println(); + + System.out.println("Line ID: "); + System.out.println("UI: "+list1.get(i).lineID); + System.out.println("Config: "+list2.get(i).lineID); + System.out.println(); + + System.out.println("TimeStamp Type: "); + System.out.println("UI: "+list1.get(i).timeStampType); + System.out.println("Config: "+list2.get(i).timeStampType); + System.out.println(); + + System.out.println("TimeStamp Delim: "); + System.out.println("UI: "+list1.get(i).timeStampDelimiter); + System.out.println("Config: "+list2.get(i).timeStampDelimiter); + System.out.println(); + + System.out.println("CONTAINER: "); + System.out.println("UI: "+list1.get(i).container); + System.out.println("Config: "+list2.get(i).container); + System.out.println(); + + + + + + + } + + // Artifact Value objects that reference the old Container to the new Container name + public void refactorContainerReference(String oldContainer, String newContainer){ + //Updates the listOfValues to reflect a change of a conainer name to a new name + for(ArtifactValues artifact : listofArtifacts){ + //System.out.println(artifact.container + " " + oldContainer); + if(artifact.container.equals(oldContainer)){ + artifact.container = newContainer; + System.out.println(artifact.container); + } + } + + //Update the container list with the renamed container + ArrayList tmp = new ArrayList(); + for(String container : containerList){ + if(container.equals(oldContainer)) + tmp.add(newContainer); + else + tmp.add(container); + } + containerList = tmp; + } + + //Updates container list and removes Artifact Value objects that reference the container + public void removeContainerReference(String container){ + // Deletes all artifact lines that include the container + ArrayList toRemove = new ArrayList(); + for(ArtifactValues artifact : listofArtifacts){ + if(artifact.container.equals(container)) + toRemove.add(artifact); + } + listofArtifacts.removeAll(toRemove); + + //Update delete the container in the container list + containerList.remove(container); + } + + +//GETTERS~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + protected List getListofArtifacts(){ + return listofArtifacts; + } + + protected ArrayList getContainerList(){ + return containerList; + } + + protected int getRowCount(){ + return rowCount; + } + + protected MainWindow getMainWindow(){ + return mainUI; + } + public ArrayList getResultNames(){ + ArrayList resultTagList = new ArrayList(); + String resultTag; + //Iterate through each artifact + for(int i=0;i < listofArtifacts.size();i++){ + resultTag = listofArtifacts.get(i).resultTag; + resultTagList.add(resultTag); + } + return resultTagList; + } + public List getBooleanResults(){ + List booleanResults = new ArrayList(); + for(int i=0;i < listofArtifacts.size();i++){ + if(booleanResultTypes.contains(listofArtifacts.get(i).fieldType.getItem())){ + String resultTag = listofArtifacts.get(i).resultTag; + booleanResults.add(resultTag); + } + } + return booleanResults; + } + +} diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Results/src/ResultsUI/ResultsUI.form b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/resultsui/ResultsUI.form similarity index 58% rename from modules/utilities/unix/labtainers/files/Labtainers-master/UI/Results/src/ResultsUI/ResultsUI.form rename to modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/resultsui/ResultsUI.form index 8fa23d5a7..3ec7f6c52 100644 --- a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Results/src/ResultsUI/ResultsUI.form +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/resultsui/ResultsUI.form @@ -1,17 +1,16 @@ - + - - - + + + + - - - + @@ -37,52 +36,52 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - + + + + - + - - - - - - - - - + + + - + @@ -90,77 +89,63 @@ - + + + + + + + - - - - - - - - + + - + - + - + - - - - - - - - - - - - - + - - - - - - - - - - - - + - + + + + + + + + + + @@ -170,13 +155,13 @@ - + - - + + @@ -188,23 +173,13 @@ - + - - - + - + - - - - - - - - diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/resultsui/ResultsUI.java b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/resultsui/ResultsUI.java new file mode 100644 index 000000000..4f809d0a0 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/java/labtainers/resultsui/ResultsUI.java @@ -0,0 +1,417 @@ +/* +This software was created by United States Government employees at +The Center for Cybersecurity and Cyber Operations (C3O) +at the Naval Postgraduate School NPS. Please note that within the +United States, copyright protection is not available for any works +created by United States Government employees, pursuant to Title 17 +United States Code Section 105. This software is in the public +domain and is not subject to copyright. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + */ +package labtainers.resultsui; + +import java.awt.Component; +import java.awt.Dimension; +import javax.swing.JFrame; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JScrollBar; +import labtainers.mainui.MainWindow; +import static labtainers.resultsui.ResultsData.artifactValuesDiffer; + +/** + * + * @author Daniel Liao + */ +public class ResultsUI extends javax.swing.JFrame { + + /** + * Creates new form NewJDialog + */ + ResultsData data; + ResultsData saved; + MainWindow mainUI; + + public ResultsUI(java.awt.Frame parent, boolean modal) { + //super(parent, modal); + initComponents(); + this.setVisible(true); + resultsScrollPaneBar = ScrollPaneOfArtifacts.getVerticalScrollBar(); + + this.mainUI = (MainWindow)parent; + this.data = new ResultsData(this.mainUI.getCurrentData().getResultsData()); + this.saved = new ResultsData(this.data); + + loadUI(); + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + ScrollPaneOfArtifacts = new javax.swing.JScrollPane(); + PanelofArtifacts = new javax.swing.JPanel(); + CreateButton = new javax.swing.JButton(); + RemoveAllButton = new javax.swing.JButton(); + UpdateButton = new javax.swing.JButton(); + jLabel5 = new javax.swing.JLabel(); + jLabel3 = new javax.swing.JLabel(); + jLabel2 = new javax.swing.JLabel(); + jLabel1 = new javax.swing.JLabel(); + CancelButton = new javax.swing.JButton(); + + setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); + setTitle("Results Configuration"); + setMaximumSize(new java.awt.Dimension(1590, 10000)); + setMinimumSize(new java.awt.Dimension(1590, 500)); + setResizable(false); + addWindowListener(new java.awt.event.WindowAdapter() { + public void windowClosing(java.awt.event.WindowEvent evt) { + formWindowClosing(evt); + } + }); + + PanelofArtifacts.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT)); + ScrollPaneOfArtifacts.setViewportView(PanelofArtifacts); + + CreateButton.setText("Create"); + CreateButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + CreateButtonActionPerformed(evt); + } + }); + + RemoveAllButton.setText("Remove All"); + RemoveAllButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + RemoveAllButtonActionPerformed(evt); + } + }); + + UpdateButton.setText("OK"); + UpdateButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + UpdateButtonActionPerformed(evt); + } + }); + + jLabel5.setFont(new java.awt.Font("Arial", 1, 12)); // NOI18N + jLabel5.setText("File"); + jLabel5.setToolTipText("File should either be a file path or a program/utility name with the \".stdin\", \".stdout\", or \".prgout\" extension.\n\n Ex. \"test.stdin\", \".local/result/sniff.txt\" "); + + jLabel3.setFont(new java.awt.Font("Arial", 1, 12)); // NOI18N + jLabel3.setText("Field Type"); + jLabel3.setToolTipText("The mode in which a value is found."); + + jLabel2.setFont(new java.awt.Font("Arial", 1, 12)); // NOI18N + jLabel2.setText("Container"); + jLabel2.setToolTipText("Identifies the container hosting the file. \nIf \"ALL\" is selected, then the file is across all the containers."); + + jLabel1.setFont(new java.awt.Font("Arial", 1, 12)); // NOI18N + jLabel1.setText("Result Tag"); + jLabel1.setToolTipText("The symbolic name of the result, which will be referenced in the goals configuration file. \n\n(It must be alphanumeric, underscores permitted) "); + + CancelButton.setText("Cancel"); + CancelButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + CancelButtonActionPerformed(evt); + } + }); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(CreateButton, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(RemoveAllButton, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(layout.createSequentialGroup() + .addGap(87, 87, 87) + .addComponent(jLabel1) + .addGap(79, 79, 79) + .addComponent(jLabel2) + .addGap(73, 73, 73) + .addComponent(jLabel5) + .addGap(111, 111, 111) + .addComponent(jLabel3))) + .addGap(0, 0, Short.MAX_VALUE)) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addGap(0, 12, Short.MAX_VALUE) + .addComponent(ScrollPaneOfArtifacts, javax.swing.GroupLayout.PREFERRED_SIZE, 1566, javax.swing.GroupLayout.PREFERRED_SIZE))) + .addContainerGap()) + .addGroup(layout.createSequentialGroup() + .addGap(452, 452, 452) + .addComponent(UpdateButton, javax.swing.GroupLayout.PREFERRED_SIZE, 95, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(18, 18, 18) + .addComponent(CancelButton) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(CreateButton) + .addComponent(RemoveAllButton)) + .addGap(37, 37, 37) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel1) + .addComponent(jLabel2) + .addComponent(jLabel5) + .addComponent(jLabel3)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(ScrollPaneOfArtifacts, javax.swing.GroupLayout.PREFERRED_SIZE, 397, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(UpdateButton) + .addComponent(CancelButton)) + .addContainerGap(58, Short.MAX_VALUE)) + ); + + pack(); + }// //GEN-END:initComponents + + private void CreateButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_CreateButtonActionPerformed + createButton(); + }//GEN-LAST:event_CreateButtonActionPerformed + + private void RemoveAllButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_RemoveAllButtonActionPerformed + removeAllButton(); + }//GEN-LAST:event_RemoveAllButtonActionPerformed + + private void UpdateButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_UpdateButtonActionPerformed + if(updateButon()){ + mainUI.setResultsClosed(); + setVisible(false); + dispose(); + } + }//GEN-LAST:event_UpdateButtonActionPerformed + + private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing + mainUI.setResultsClosed(); + }//GEN-LAST:event_formWindowClosing + + private void CancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_CancelButtonActionPerformed + mainUI.setResultsClosed(); + setVisible(false); + }//GEN-LAST:event_CancelButtonActionPerformed + + // BUTTONS // + + // Adds a new artifact panel + private void createButton(){ + addResultsPanel(new ArtifactPanels(this, ResultsData.containerList,data.rowCount+1)); + resultsScrollPaneBar.setValue(resultsScrollPaneBar.getMaximum()); + } + + // Updates the results data object basd on the current results configuration UI state + private boolean updateButon(){ + boolean retval = true; + data.updateListofArtifacts(PanelofArtifacts); + saved = new ResultsData(data); + String fname = saved.writeResultsConfig(true); + if(fname == null){ + retval = false; + }else{ + this.mainUI.getCurrentData().setResultsData(saved); + } + return retval; + } + + // Removes all the artifact panels + private void removeAllButton(){ + if(JOptionPane.showConfirmDialog(null, "Are you sure you want to remove all?") == JOptionPane.YES_OPTION){ + removeAllArtifacts(); + } + } + + + // CORE FUNCTIONS// + + // Adds artifact panel + public int resultsPanePanelLength = 0; + private JScrollBar resultsScrollPaneBar; + private void addResultsPanel(ArtifactPanels panel){ + //Resize the JPanel Holding all the ResultArtifactsPanels to fit another one (makes the scroll bar resize and should show all objects listed) + //as of 8/24/2020 the PanelofArtifacts uses a flow layout with a horizontal gap of 5, that's where the 5 comes from in the line below + resultsPanePanelLength+=panel.getPreferredSize().height+5; + PanelofArtifacts.setPreferredSize(new Dimension(0,resultsPanePanelLength)); + + // Create the Result Artifact Panel and add it + data.rowCount++; + PanelofArtifacts.add(panel); //takes in parent(this), containerlist, rowcount + + // Redraw GUI with the new Panel + PanelofArtifacts.revalidate(); + PanelofArtifacts.repaint(); + } + + // Removes all the artifact lines for the lab *note: this doesn't update results.config or the resultsData until the user hits the update button + private void removeAllArtifacts(){ + data.rowCount = 0; + resultsPanePanelLength = 0; + PanelofArtifacts.setPreferredSize(new Dimension(0,resultsPanePanelLength)); + Component[] componentList = PanelofArtifacts.getComponents(); + for(Component c: componentList){ + PanelofArtifacts.remove(c); + } + + PanelofArtifacts.revalidate(); + PanelofArtifacts.repaint(); + } + + // loads the artifact panels based on the current data + protected void loadUI(){ + removeAllArtifacts(); + //redraw the artifacts + for(int i=0; i < data.listofArtifacts.size(); i++) + loadArtifact(data.listofArtifacts.get(i), i+1); + } + + // Load the artifactlinePanel into GUI + private void loadArtifact(ArtifactValues artifactVal, int rowNum){ + ArtifactPanels newArtifact = new ArtifactPanels(this, ResultsData.containerList, rowNum, + artifactVal.resultTag, + artifactVal.container, + artifactVal.fileID, + artifactVal.fieldType, + artifactVal.fieldID, + artifactVal.lineType, + artifactVal.lineID, + artifactVal.timeStampType, + artifactVal.timeStampDelimiter, + artifactVal.comments); + addResultsPanel(newArtifact); + } + + //Updates the list of artifacts and redraws them on screen + public void refresh(){ + data.updateListofArtifacts(PanelofArtifacts); + loadUI(); + } + + + // OTHER // + + public void refactorContainerReferenceInUI(String oldName, String newName){ + data.updateListofArtifacts(PanelofArtifacts); + data.refactorContainerReference(oldName, newName); + saved.refactorContainerReference(oldName, newName); + loadUI(); + } + + //Check if the the current state of the UI matches with what's saved in the results.config + /* + void checkUnsavedChangesMade(){ + data.updateListofArtifacts(PanelofArtifacts); + + if(artifactValuesDiffer(data.listofArtifacts, data.getArtifactValuesOfConfigFile())){ + int confirmed = JOptionPane.showConfirmDialog(null, + "There are Unsaved Changes. Are you sure you want to exit the program?", "Unsaved Changes", + JOptionPane.YES_NO_OPTION); + + if (confirmed == JOptionPane.YES_OPTION) + dispose(); + else + setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); + } + else + dispose(); + } + */ + + + // GETTERS // + + //Gets the panel holding the artifacts + protected JPanel getPanelofArtifacts(){ + return PanelofArtifacts; + } + + + /** + * @param args the command line arguments + */ + public static void main(String args[]) { + /* Set the Nimbus look and feel */ + // + /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. + * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html + */ + try { + for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { + if ("Nimbus".equals(info.getName())) { + javax.swing.UIManager.setLookAndFeel(info.getClassName()); + break; + } + } + } catch (ClassNotFoundException ex) { + java.util.logging.Logger.getLogger(ResultsUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } catch (InstantiationException ex) { + java.util.logging.Logger.getLogger(ResultsUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } catch (IllegalAccessException ex) { + java.util.logging.Logger.getLogger(ResultsUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } catch (javax.swing.UnsupportedLookAndFeelException ex) { + java.util.logging.Logger.getLogger(ResultsUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } + // + // + + /* Create and display the dialog */ + java.awt.EventQueue.invokeLater(new Runnable() { + public void run() { + ResultsUI dialog = new ResultsUI(new javax.swing.JFrame(), true); + dialog.addWindowListener(new java.awt.event.WindowAdapter() { + @Override + public void windowClosing(java.awt.event.WindowEvent e) { + System.exit(0); + } + }); + dialog.setVisible(true); + } + }); + } + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton CancelButton; + private javax.swing.JButton CreateButton; + private javax.swing.JPanel PanelofArtifacts; + private javax.swing.JButton RemoveAllButton; + private javax.swing.JScrollPane ScrollPaneOfArtifacts; + private javax.swing.JButton UpdateButton; + private javax.swing.JLabel jLabel1; + private javax.swing.JLabel jLabel2; + private javax.swing.JLabel jLabel3; + private javax.swing.JLabel jLabel5; + // End of variables declaration//GEN-END:variables +} diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/resources/UI.ini b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/resources/UI.ini new file mode 100644 index 000000000..969417969 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/resources/UI.ini @@ -0,0 +1,3 @@ +labtainerPath= +prevLab= +textEditor= diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/resources/base.list b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/resources/base.list new file mode 100644 index 000000000..596248b5a --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/resources/base.list @@ -0,0 +1,9 @@ +base2 +network2 +network.ssh2 +firefox +wireshark2 +java +lamp.xtra +centos.xtra +bird diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/resources/labtainer5-sm.png b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/src/main/resources/labtainer5-sm.png new file mode 100644 index 0000000000000000000000000000000000000000..88708474179309733731a9deebb6537480823cdf GIT binary patch literal 67186 zcmXt916XA5_n$n~WZP}r?AmN^O}1^f*|s-xv)j$sY+KuAd-H$3|L6HVgL~&io9035JNP+N>wP_h0e8>XcL|$3~@bTZRpsPFuvIWse zM%xttK*sv-0R_nZ{@-B;ZnBD!2!COrp<&7Htb%qRn@FtHwcNxV?d{DS+#oLj0C5*{ zV>fd%a!+eFD{^UBMHREp<_G`)IY3rIRNZUsOyBdH-eSZ16!UtAhWjFO)lc0E6e7EN zYt&3KqfZIAy;WA8alG;>znISFXG9} zqm9hBUZF;D{x2!b``>*pr#vmXv-n&Q-(mJ|xiLOo&4e`!z(@eEo0R)l=~gTXY|*|E z=&eKK3gaZ>lxprd0-#z`-&ok|WKn;ncb=+xTe*DNeyEs4UF9KP`&lZdyZ%jNjsPZ~7^j1hqI?uL zw~yRSlUV~OJw5L&TehwJ1wSqPAqXfaDiRBL+RsqF^%7idWXi!0SDmnMy`3wS_uO({)+YsIa#*5r z+pVxx|N2BFvbCiV6;p;w_WW_mOk@vkG*z(VWuweiNd{~07mi?1mH*V1pDKy{`*)iy z^h!nDikDQ;{>zm_m_glOOkG#P6Y{~I7R{}JmD#MHCu60N!|F#|uu`Ovj7WdjW7<#T zylmR22$78X7AU`IAB1PPi!8)aX=}NWA`18;LXwIzpEIMOx5g!yHsp^H{xn3c#I^I+g2eu5?$yHMFedPQMw>e zY4XuP9{k}o$5xZE60zSjNF+(K`==s`If01|XcG9Ysh;PQ1nz*A3!;FIbrPNHqql`LVN6&ClU+cmx|F;cWBT_1dW{){R!_>e;HzF@d=|9`s?EyKQ-lRVq8!(;)kk%#%; zZe%x{22cjFKk@;I<=h&3JWWWV^n-i0XtD88KN+#h@gn{(5Yr+jpIhMH>qz`z7sJ4S zCqc#uWMQIY9u2b0_a*vPgkfpu#rJ;L9pQ9(uDMHg=_oCBwOjkqO=`~Q)VaQT<7YBQ##^MSjI&mo}k*cBzeh<=~PN@zy5h#?4pp(ePFXEOizJ5#SZ1)&g z5AY+u9?Lj&dLk$%ZHNE$>z5}FC+DlRj3F*X{i@yN(!v6hJAdwtN*zaODwK#X6DEM1 zg9EFs^9Bi*NsBc$*cAA9`Mnc?*lh6R#yl>!VYmqK^Pq!Ape2^oF;dW>+l;NEjC*#k z3$z_SGm}OzYESS%E%2NDB=6px^}px!E_}7rs5R8+p)MllmrWki{T$o+mjNC&%DvC{ z(ZeD|49)z|V46TN@-cQo9U&PdkKjX;9blMJm8hK0=OPSY&hPNYvh)C$Pz8-JBp3rEX|#lSC5YTHE73UjJ*JQrKPL-L)x5VPf??c9%V=Ze&$=z%$FgZg zzH{Y@@4IfR-7JgVPp2TIa%5nz5fQWqcDS+2P#h5tZtq2R-DIu+-sy530zl7gR#JAo z)t(41VK_!YRiSm&4qonuP19tC|J`kRR=qz@Q2jegS*)n4 z8b=Ki+vAJp7&K`}-P7mDI~<^riluw>65KDMBR%u$Zf?egM73`KP1vrsy1Fx9I!`D7 z2|lDJc6bjDa*i6DXlAYq^+9BjS35b-@^ZT;K-9;lT>u+tacOxOt$1hHLUilJ2S$ly zYDoI!q|Bifv1{ar{bwvT5vuxPQFkd$Wo1!e4M{YE>FooF3JngZ4$e4}G(Si*m`&88 zxuV)3xZ9qn= zIWm(|Ekg}S$w*r8R*vq)T`6G$c8!Mzt9kyH13Z-(Oz)C#0EO?oY&xo{yEDgbaR4bY zPcBn!uqt-IHhJHl!I2{C8gRzn{p1E$OKWs zz{9}Q2}2nSQ&G^fjxcowd02TvGr%SuAsN?oK!-Ba<9i)>lYZ|DzpKWO87G7b;Dwb; z+WG6}gpNiWrw?3mi0H33Qp8oM6x-*!lA_{-=iod-1*(LLz#)el8_#1@?qX|-ie5Zh z=J~pvxi4@1@xGgt7UIrP)KyWbA3XQSH|NeNoIgfK3PX<>?7bB{^AIr84krgfB4ZG ziW1Ok!GF@D`=+-$<+ndFJr$VH5k!%J8dH`uAjG%gp4`!F|?%@lsA&M-lRE>tmxd-tTOPKh^n%CpsR z+kh=FKtUbMm9_UXlxcj8BGJQ3kThk|qA3=i&E%_}-&=bOOE-R%Mh!IJyZe&%zq@(m zh}mm#n7_CB2=x_ioUO}grGDC@dL3=;1Z))X>Jg~avtgXM03Z}k(4BA0$;Wf7=V$BB z|Ikm2O!Z$!@KV^5QOE{ekmtG-!7}dqR6Ev^8hyY8jSK17Bg_R2o+6WJkCKuy3i{Dl z!3>m2Xg7G%f3IDh1spe4RDu;qPW&)h@nNF{$MA6m2qCLLNyb7tVKjP4rRHY$-d>rR zYml1{idPPd;BcV1wi6R_`ksh7+_e@^UA5lN5T+TPggsZsNdjKpOQuobo`3QfzW91I zE{EsUWGR*}A4AL{flQcGsT>QS0tUkYuAaVKy}Uv2U+bq6g-JuE@yo-xA!;Wsch00E zD?a7u=%^uBQ`69=`SjA|7pv_OlbM;B2zuyshsU{2)%@`Wpx$PYVZ&qHel7pw_0X(8 z6tQ0tPd~J6+yA8m0eCB})LPNJKDp)3>d`%#`p3@3alkr7nnF8Aq`U(cwYZ`rb0nS>Hw0l!e#ed=#(x$!5Q>L1VMsseF8B%aE5HE0qWOE4C4r%AS9T1ztf*Ev`0| z%k|>&`t0f~RK75vBS@rHL{a3>8Ux4N?Frh-!MV7*0Vi+C z!fW%sxoe+X@Pa$ifJf{?%B!+!R#gqgP@g1NQ4!eM+`GL1FqFrV2ms8Apd-|0=L>T)Guz82@q_{noFKpI+5~;hT_kAdL6r+Ug5lY%V5@p2WUC1fj377Tg(B0%K@H4 z9BNWl8M)lHsc6_E6JrIWZ3wmMSlC;z$-w^fq!<(;Zt-+%U@}M*E>?%R*@8%&28xYP zqHG*>$poGTgw2KunYRUjG}zjx%tP&*I~Bo7N#wu3{&ok!A}0XrD5a<+l0?*_D2N}Z z{+^4~H^D>|kQL_&{s|6F2ZU+ZhRbmQDE>XHPkKG9W~dl$d+n|<=X_W-t&TA=GA3nb zM>E#`gkIKjMfv=52U_rP!`18gxZIc(|EeFEMI~ks)8~2+4<_|%cXjm{O~NpT#eA9K zC_qJ1(-UlIX&E)JyON%qJohw0mC(C)z0>u$H87U8i9BwaAQV1K>I)K_4nc=b8U1~> z)%9{b7=xDp4d^n+X9D&|<~X$ffLxw)mSug<-0Rc29#Tkn>7#lz6m2azOB-7;bh=2L zv!EPVDH&vd!)b~Dr>D4OQrFn=gMMiLsO04pQQ_pYYR-{Is#yU2mb%rOC0SIYpDs<$?zbf<~)D zgqR8FYdK5W=Z+WHvKCBcLs&tuk})@^$Pb=c&NG%_cuI8XW~{gZyg4v-F6=An2-F=I z&LOyxPu7{Kj^dSR5vx|P<{+=9bH@>$Z3l#L)}Mdos;-w9S++R}-Tssh4h}wQ*DUD( zZtjlfAtThNZQZzSy>QlQ4H+4En^4&Q6>M#7y}WAIs*yjPG1X}I0>NprlhGuZ+}zxG zg7E9f?|ipSe69x~~aeg%&3@ zE$vOac$V6Ye=~$iI-W^hNh#eqc^pk?PPY_$3$OYQT$U&~cEprbAQe60`Q(eyloAI_ zFWjL)q~`nc2HWt{_{}K*pxoVqTkRkR-Kz`OdcGwx%&1+DgY$rK$Hg|w$3lgdllz2Q zWTywo|4dNMgPP4|=R8$-lrW@!7}(R}bG~>io3+HQX1S z?yJxtzcVt!KW*~UM~@re1V5dPvxmH0xdxdn^sc(fTIS;-WLy*7QUov;N+Ko6QN=2v zc5Fx`Z2Di$l6WQwk9I7znB?OT5D^nUDLFtsP((t6j<#qM4@R7>nUI_#s$gY5lyMYM zI|(BL2R$6lIM9g|NI@F0SsfupFPQ7!j8Ggo4m*lV!p@N#m5fdp;6A#zOmz1gwz|4H z_$A+wf#Nq|!f+uSQniL{2wgNEYQ$dqWDZZve+UH`Uo8)DGR!*7R(}uk0}PabNxnro zdu?{BH}uoD1X9HqqzMSzIVfpqXpVtZzSDkM8?t`xe|Xk3Jyly(^-@q)X7Ln> zLG^j1)qXvE>k4uyVw(qp<9S?qVfJvJ@%vcOgV1sw=4b7?*+u-uNQT-8?FO)h=X6`w2tho>n$?^ z7xDY9m`n-*{5k78$jFgWMUfJFSO2Jh(papgT=iLQ_(>L$7L5cyEKm+o&304S24}F~ zD~ke6@l|92zhNV(MW>qpr7ARtm6;;cpGBnAc~L<8A zlW1sYmag}Piy?vpvI-e+N*4Ix3VDLRs%vV_OS^Xffjrya=6?o!yuYNRq&$9io#Gn= z)ce0ZcR>y>=OvC8&Q>VHBS9U`2oe#|X?LUF^4ddT(y9l5!C-tYn+317^;{F~96V-& zPA@qY-v6SvKc4Z}(f!GG<#9V%tm`1FPV+axup*x}90(0cfZGqGWEEcJM5%|mH{NE* z`%~JZX2GH#7?QMB*cvxIj zg$x?#wd3Avn*JiLp|M0_P{-rINoXi^*?CI|Awd1&XhJ2asj28WlMfPf*v}}#&h(j8phPm6i*Frg?VDU%IKTLcn?0nFbZpxw zj`#rbHc%7%gSti-)16O$!qy#qpEv}+4Q6exciz^uqj`4!L-;NQ{2XBM(d8f1Q&riD zX#~7;L0=0cO0G7!IHUi$|JtC^r&6p0lfK{E$n-}H8c{a92#{Pvjvpl|2b{r#lPbog z4M9Z$&&)2tmv5rxEeDEFBss~XnPu(X`A7)bTUpx=RI+df&7Y?F>2ga|jWIS8#vSaP zot-5-UTk(i2X2})h+sc0Aa zAVZ{#F?$yGc%xmqIiDJOC^i@jVd<_%&GSm@6yrB(s1XB2i#9Fx_Vy7sl#NWqEiE{Z zyt&xg+}s>EeV9{A7mX+KiQ+d+bdl|9qdApkt)912X32-Jyk;+2`D8pc<0F?iwyG(s zEesn$*#c%Lm2>3pSk{cx1q^{JWVwdiM2?>2r{&sC*hLTf3P{RNkzAraxS?lrI_li4;UIXTb4 z&hFJ_FdFCXM|qwN#42#*i+8Q8BsA6bc=_qP_vQ6(iZZ6@aJ*j|WbS61pPzf4y0wp$ zm6a_I#gm*;guYrVR)U#B(SKY%z2D}4aCSqm2(@n6Hb#OH`RmuOv^fg2*tocq=)i)~ zQaD9L#g$*KpNLT-Sg5G>;#KI>>Be372Uu4tE2lKE2N&n&Oh{;th3oZh{0I))G3lzmf3Q6U6Xo}3_q@YrY<^fYa+Keh`^r79 zc8sA>;^L|3q=v|bDOIm)!(mbFOhk>+G0O#2ew8Vj)AuZ8KsQGe6Wbt@kMyU&wKhkz zPlWT97Q_$+*UjgRUccrRSrw&DNs=tG?G@x%ZC6Jd$`w7^C-nay3OG7hs980e(Xf0}PEO^pwgif@7a zX?KhRIaqR4))(fzx9i%fB+aThzN~fXf!i?S@St?OsB7=b{cDP>MT&Rm=<$YYU%#t_ z9KBDKx!Tv{+1Xh{fY;76nw1wyUC;fJZU`2wLN7!@007L)%s(OHBC3e)KiSu4hIk%F z`%CY0b8G9Lnzk+WAC+1rOHS2KO*B)#SPOhexA{kfq43=UUV%_@iF(aq+kJIam(0tS*}uo`{gL}}Img3z zYhq6PgXL|Wu_=n}_WT!zRJmn|)+`S8^+F}Hm5ogZ(?5#A;+aPE^w1gRUH3X6G&kz^ z{BE=+j#0L}{hubeN{7^;umgoE?sV8z&N^{5_FFP$6}7kjRH+o5qm*o{?fsO|VQE=- z9^2R2pL<|>&)eR)TbjnJ44>wzCWU^b81oT|Y&f*R1fqz9qEn(`!YctHOUujWFKy@c z6M7HI0MJIU^@XqW=dg~Ka;3KHQ zqJyF8jM>;X|B1HFH)^ZWdv4r^gZ$i!Qj^=Wqvx{6VC0Kt@c~GI5Jui_;p&Eqo%Ss) zDXmRf75hMI@2i|F?~!s$cnH<_<7F-$Qdo1A_Ue9~;0z=dg!7%euCnaNVjnn)F`&kWEhLqwrDtYh#kuwm0BT{haef`o(3b>k)Mrh_& zn-hRf+0&DR;>G=UmYYVG%}e6Zfn|-#@o>KWJUgKISqB6_>;A{!(DU4QX?_vl_m09` z#}ABIT&vRF?D5$Eg;N+2K;Qk8h7FX10+$L^`kE9JgmiK`fy99L>4Uu}3Jl;v2AhNz z4$k2~^gweh^l%X{m@azFQR$iF?R0AzV~(SiiBg#3n5atDbL~vKDZphZvbm*&=3WbZ z?QlIB`U*PHC+OO*Lkq3538$yWi7-!l`5S{{bHLcGPj0$#eVrY$nWU&`3?YRQCu(do-aGDF)c1Rgx07zc(1w z?Kqq6dDb2jV(Coq^>=^w%=3i!0A>dhS$FFwM5NW$R$W}8EuaDC85{QzX1ef23xwfY ztLiE#YE1Zn`hrw3RqTpN26MB6GpDi=Qo;AHO3xpg^X}!BO@uX4Iz7)#9OtOg6*s-z zl;OrNy$*@HKqxSHBHME)V=9$%T7?;L+*yu#CQGly_3b;`AQki8P(nlzT>(?f6y46X zRG+h6&+ap6NM&V3-H*_=CX!I&*t{fjJ1^z-CE7m&!0V>?|!7jLX^D(6CvC#m(z;` zY(J$|dJt2Tw0jl9!=>oVVTe@KwcQTI|9Sx=)%0=V5CqLG=$kIT9Da8tqYkBm=m|Oo zhJNMQ;GK^cOOWLI-2wOO^`RORpzWjh!MKa+MWcfKPXjAu;b(j=)WsGY^6&7)(u#mj zFN|4bbyL55pB!y2zg_6RKCK~l&vy!VUi^kgYybdKukv-%)P8bV$^^+`7A~Hs@Y*ne zq_6-5o139BymJG4^y=WCq6#PTeY@6G68B2E)#BRc5L*_EKWxQYRv#Id&yjJQxJ08|~qwFnX4>4apPLjD&& z$;+*$dFcpriN0D zRB>87$cJRfE_`2|9-~R)QqNP$S+u+L=TF$wuPWhT%7FG@L{=tO>Y``ocm~)ve*pHZ z3gC-p4ZrDHs(|H0X2YLyJ1&1W090Uktq|Tg**C1|k6q0mE$PL&G^h28;8&1BK0l&I z6{3C~{O^$5nHhZku3RAf5F)kp#A#d4)hs1|*LKQm2RB6UnA4nCbJr}zauHIaFZ|6zd(gc zkj2(3Zi2mf?3R#Cpw6gg(dLnaZe6IWre$^CiPqOlvM=1RXAr`e$z?Gc**W^yL7n>g zMg;I;f~b-jR{o;Sk~TgT>$@|nNrY23otP*dG@5oVC#kcNVQW#PrRZ3Q= zZmv#ZeDRv=x;Y&D0_*eYlIGRiIl_!>1xd!*e55faRb%5r?#*rc*y*ubieO1iHLxmB z&K()=bLjfH6eppiygVbMyt(7ifr0m@56&|8BZ@i-H0&HLN3Skv{NkS!YHY>%SFv{O zY4VPbqdcdvv9X{MsrT9nP3|gUpY)3>wqk*ZyEj3wKN)YHbVLVYU%b?JkCP4EgK5Jn ze2UOKrlmb;b5WoDi{)-;!0UeHd}Y-*L_m1ALu(TpAKgeM<>~{Or^P^?{WeRK6j2qG zHL_nxOfx==!K*wxLe1=t*F;mpFaf@g0+Vlj2xNii!N@G_M{yIJ!{FS>H1^?J86flt zn#RKk+8l>#?=7)}_DL%yF|r&`&9A@?9#~8hT6nEB(R{z|UVgsOZS7#{XYZ_Ls=xc* zxH;cr@OEutm@)ig{y5aRRISa@;&6#`c^TK0*w&4jPk{;7apk8>C6W*e^y z!(J9oaB(?3&&#P5=+;U~vcYseAQd6ZKUTICuyGM=esfm;_}B1$iYeI)xlrLz<%%Ho!sW|>JwDHnOj@Q03(M81srd*@sTR)usd8*d;L-u5;()Q z_vw;}K)_j<2~*Yt-vm{lm(SV1H;#h|-Hf~>{X=W}sf{l8 zy|WN7PBD$D1p+Ouq^wC}lj~hpR#rqFav0Uo35b+SXYo{rEmX4iGGhA>0&Y9E&9q86 z0*BGo^JPM6+N)h6*m!t*X31pk%YWoQu80jfK6EzjmJ_6YNhy8fqjgsEjw3apj88A~ z2^IS?kt;yvQ;fTKpNo#An%RuhEO)2;9%7sCa~Hp_54gG-Yjau$k1JVSK&rQB_rWPG zDIzW8^iMurP*~+t!Icc;p`vt0(z>=B_~CFOeXLA6Ij3wEuO%$w9*+4$F;XpW`UG>i zYZlrxJaq-1iBWZi(v&tK4hD#L+y&v`LU7WiCD>G(S^@)-WdeVve4i>nqI7fjI!mUr zp|2Qo&dw~7(`i~I%wxCR;@3__bw9>4Vaxl?ZxPEpHBDZUqa0eq#_1llbAMo3m(GOj z=?e2;w;fDfjAgPd*rnn7))IN0(4gp@?$+y~p0{!y%C-8e{lvl6ws9?p9a~6#h*D!M;Mn)pXjcKT?lwx%!LMLpn|bIpYStR2Hm7&q1s-`rwM%@)b7|g~*j>Q^3Kd}n_5~c}CMpvK3VLdK zcFYcM`;d7W`Ww6kF&@6rE~$FwNFsaxSz&{i@aQ-qRXj!Wr=oh$#6O-`wbf<_C@lI6 zd`|NlJxDs=uRWECJ`PGJgc5{N06+Ji-#3Xm+S?cUSkR7(Ibg-BxrN2x=u7LhJ91PK zAiYzj!?6_S_BB}zUh2cn)kSnjoI1ILNMQ?*xvFDmsQl(15L%gfw%TpoN*66yno3;D zQ(jPDHX{g65kibgaOIkcJyJN0y3O%d7@EAx<+ky*p=uTl;_A#1BmnbH3~6*Z9dfi2 zv;>1fC;Bhy3%h?1+%x-2U=bdHMvsnCXGoh4qkoiF*YNH4e0V&CTw+7@7Ap%!3~#ST zdkTBusg)`8#ghmu(5sb!+J{ivZyr`Z%_*M)`Tn?KW2b)oyMNek(h|rD%io1cJbrUt z!@R0bl9wtWHlvisZ~NAqb-RRzo3N_MX>)e5dW-9yl_gNbzVoQvW~b$A(Yu{S4P@)8 ztelvw7EK^g@zrOV8y*x0hdTCW^(zn!XM=vtxm5Kk`kHMzyjQifcMx;)XrN zVvFptWCCV*4sjGKYffzaszM~Pu{u|{5l4=31ApHLwnH6RsCMd^<(+g6+ixj&BWD=WWR+W0V1h)8z`EM{eI@p(UgzxVZU$ZGMM4}W?n zDVh2+yXTq3+`6OMMH@)`OE`?Ujkaff@WhcVf_Wq$bK~2!-s^MFG86#K!2OvA0qyKn zyI=Q(Cl8)HicNuTOiWb?{)R)Xu!3ETf(M@_uoHwp49@}bF)b`n45*l@H=4XT{GtmB zNFZizkb!qf^vB(kK@}5)fMD?EuZWA>K-?xcR^*kIGi}9 zpiWo|{BO~c>~rl8Ix-fZv+KxZ+YfbfJ5)={*@{_&MweS6t#okw#it-lm0#Q824eA- z1}G*35ym%U2PXGvF&3nA)*H=cQqa90dfp$W0-vTbpUjds`N!~XFsc@#*}}Xl%&=26 z)5Ql=Vn2_COWX|q5{B_~rI3!|de1M&f47 zDxsQbhk^Qe*<<|23Dmgj{&{_%EDOIregllSWMj+0yI!H`CUvu@fd`MSQ#|(nCREIv z++m~)8npOMldjFo1U^6e{5EyA+ipdPE;2G){em9{e{@HfYfyI>8d|`!Zr81*Bz&8~ zhdiaHCfMrcc)Y-u)95O_YslVryr$u!sspZvr5 z=I?pNPJfld5c9NOkmGj1RKO!#DUSy?$v+mtN7Bep7)bGx*KdkiA)lAfq6>EsfvBOb zosi@US+x}McWxr}u%P}-jzU*KHsgnWG%_#GWf({QCq*cjk*+B2IY=XJy%ic1wxsbK zd*f!-RC83A(*NiPAn;(^x$@-u16fCglXd)%3s7Vt-4!MF? z%}_>*elsNh9!(zkp>FI0qv|K(^pDL-6(_a(bx-AY9Pz2M8E?*93Mtvgug^;&-j@4& zy<@}IInp0NI6Ve;*J_vc8$@bHP0=Mny8GA)bW;+t4oK>f5@2znP6IM*)!@zA zFb&J_pm_=k>X{83;@lK9z3-{n?r{sPEzND?s5?WMxsH=z5>lUxtZDNyQ=D0BqisgvsB6|uA0pXk$q z`W%b+L5UwK-Y4m$fWS1e%UGr9IPZ)& z^yNq13gqhyMRa7>|Kud{)DwI;maoSc` zA5m7v&9Hztk^z4u1-(ue^}Q?x>pt#I+L!N_su^{u8W^=gNC*B7Edd zv}Gj1R?VOhT@ptC@@$FFASdGq3)>ZwmbPbp0d{HJgsr6PgPTmI^vFsNp6~~E_cDw9 z{pHd!ORf_X_@G11BFb?l0!%=>DH!#>xmfy)=hN`GN`#+CK#|WknHV22uZ!&qNn+3M z_D|kYvi>HeSywpEj8IVLJ*xy!^|=enKvFU+4V1;1!ZS zG*EN?1-2hiE6xXfjQq2zj9Y;RIx%z5(#v-qe1gKSV`Ua*zf$Je*XT<_JsdNkhn;O8 zX0A+}6l2-1#&sM?VPDZkY=X&}>zDC9x`%qI< zX$ToA)30>vXzLqrx7W1rP207?^5x;tsQyI_==7!5PUh84*J>$`5g4dX-Sf^m!O-VpG_zr6*`MN$ zLnk@a}}SBWx}tylq_%SQFQr;19MBd%&XbsQ4;W||)>F;WR*^u&Gl z1Zyl|f@Iu9x>UyYrF^{P0IqiOJ$9-K6AOVtS;6GRk&Nu*Q9TXcTQn1gbOq-za`U@t z_2t*>bw7=PEc6SrFHa^JD1iE^R+3VxIj0wvY2kVX7@nn?l?Hb7Xg%87XIsqbicfC} z!$#f*1JM=cvK-^&MPKJG*IWcyaB&lU000mPE(>0p4~lPO4W_O$}n~ z`htC@%fF`6v@sdi_lIrIqrAgKCoRu`R-Bz2M!sQ$js3XGBMG!@lB-VqSL-W3<@wAu zUPs|pgWC=1V$*$3Q%jI6zsB{wh6M`U7Ren;M^c@-uU=J9cXwrFEac8izq)Mc<8heo zsEim9%q>T+6%HjXGaYj5e`mKH7b?DVas#v1Us$mJ&r%ZY7HKE)WUH8>goTNY97}A$ zI1n_B!T!UlBy(bzP&*v)zKIm(CmX@eA19`$oZQw=x={-W#4W^jFbYhSs zQwUa+3f<1p$sO;Deqvn*DTN&3$QP7#K-YPwM9Uc z*G@EiA3u8T(8D%j9_{bXHd;Y-3g1{tQ7~M?+F7>~UG*{%sEB$z(Tt$cMT-STGKg9> z(VPH8fi&#QKJG#}&}g%r`rg0`-xsy9USo)Bz7h-?*zqFo!??hKS4qAo&!UQkP2h7- zUUZy_><@qI@LZXoZDKd>hb<{9gOo(RL7LQNth^Mm*s&n(!C&&pULG$a7A+n>(UiNn zxq|pZO@|6Feu}CJt-z1{7yN4scCA*Qoh4mdFv>@B{Y~Aowmo8R7$7DfHV<=_8A417sHfK3E+?_3+U+T zHu%5sKw=&wk~m6GnB?vgX~Ma|elnp9>Jn(1TJ5r5cSEU5`p?Ixtl->QT7u6Rj9yq! z*Q(Z7Awl(O&k>}KmQL8rPs*BaHNA}|$m!7*P?n=!S<4=Sm}kOK=wb;nGay_=0gaq3 zC_PCq*cx)#$DQ>`zP!x5KnJsiXr+p_KB7dTtEJ63W6_@f@m4IFpU=}V)YM;C+u)=W zaFn?JJv#46R?RSt2KQ#YxCp-T5=@jpJg%MK*0e|`Bkyl#`NAJjnL0VjSTQv*S(kx{ zSiEHvJsadl5RW-dSQN52OpOX-rWHRdI$|VL1}}d$Tc|!cm+Gd8Ot+(;_z=rPss>j3 z`V-#kWo@J-D}9)B)ihp*ZzeNBb87!bNuUPQ6L<8 z!HKc*juppzp`G;QKwCJK)&PKy0@dX#)_t2feAwy4nU4QAAdo4D0+b{_6t^zi=%t`& zYQMPR#rYlL>P1;`!q-TxZw3YRW5h`csabq)lr5$~)P`o1kLd0we4M8hFCY`r4++;z zKy^*TIwbd7KT7N_y@VmudW2EzA=-Rcjghc=gh@3IoQi)~P~ok{q4`nH+wkHlI8H%` z>Ixd5%_cf=!GRMT5TSuhMW6AH@TShe}PPAAjTX|qpR8QVE5Xhv}l6l zis@`*SY;|o7bsj7*emWIg_2w0r1e{|%MTV0rmKBL*LrSW zkYGKWZ?Z`ynNgRQdQRjD2h^01>Rv|Jh{13B3WE}j`932Md|UPm7`!BEpp;Jj=P$Gh zBvIw8+&Da!^Pr}2kImI;*DVc1kDz5_DX0G=TrP=D4Fgp$d(EbzA_-;6P9W~8l-u#% zyY*&zVp}ylrOO%+M~C8+5&;eUy1mT-`Gn)9)H$d}LcueeAY$*wAS(I42*0j~S@04F z+J@~K;LJ;PM-ida;i{1W51;S>bT_-ZU?izzk=q!#N<~~-_2idJSklHnDSKVz5sD~O z=J@2|2xB{vfqx}5cD}H%G8OZus0k#DWgPDWQ6r(po2SK2RMXCgI`+?)-aYHq7lt}S zK(T=mv4-IIEGBUX2suYozjHuWFwm%jWqGW$kl0g+oJdXMO|K%bY()7dM8lz6OvZwt zqBz-k5hy~I1yBI+X*gl$H_Zaj{&iFkZY%<*5*p3O%AGG-Jo)`Wq)PtDKmKiF(AWqB zV>UwFwQfz|<$G6buO^&VC5Ep;fxCRZ+G1Z+S2aKrgSq{pW2*)u0%k9&FL~%lwiip- z6;3K7ii5xlDDkrXH|a4YiRX()08R1ON8{s`vkO?W`_eOCkI!96jv0}fLgX(w`sm*y z;^95khZX<4>wl}Jz7}Ve33UkHE@QD!SMaeEh5~_NW~_bWp%N-0Ul}8&Hq!>8E)yzi zYfl{D>Mvu1w(j}#{VJ78U6&l|?saX?TZpB-@AvVP@y|}}vGyB<7eAS6KlG*u3R2ie z=o3FLSCynj(uWzo67;-m@|RH^NBkBotH1puL>`x8sK)98Re^L7&zy5WD;-XBs=%g7 zdp_%B$BT|+PHo+}eFkMp7~n9q5affcWNNAtLd-8_!{o~5Zu2j-FbT1fDrfYiY1PeC z5JOYmBFc_do({W6izzq}sX<~uglUUar#yDcOhgaJ#>aMz-seX5q%#l5BE5&+TfB{a z12cc;e>3~;2@K*96vP*>d+!YQVjAL@7L+#?ry3^l1VLIk%L1ItY;_M~h28_}cG_Q- z&k*(wOoWHFD5{exPtAEJMa!UEj%Y{xElivXZoZquYVMS%Wz{o{KWyc$qdop;x{o7T zN+BjGY-u5Yy|ddKOB&Amxp>HPBSy|(zqE}>!)wG=AZ~@m4tXQKk$lC)K`7AE8h>|m zY=`4?-b2R6-Pw;{3jBin?3jMu_cr_j0>|02gJqLBzdpJV>h;@r&^d1gzl}bgoGcD! zAi=#&W=bQ-{`GV9m^TbwSAhAu2@`c4jEt3?5(R^tMtv0?5nlY}``Db5ek@NTP4w0$ za#BBlCaqy6B_$0hk8q1o3y7J7b85s=%CS-AlSgYS(tY`_?1}eDdcE5 z`gomXn4Ph#Fd@?6#0)J>I!*}uIWjf8w%=5ru$*W1a z*=yIti;D-ft)|l;QFoTdJ+7eGdg3rvy7 z577Z-{jZ`a=BlFWrWEvoEaw7F6 zCiPAz7+3BHwQKv9!`iyKwl6(%=^qnKvB7X8l2KKKOgh8v-Mf)hZMQGrH(y=7>cng& z89UuR}bLuA^-I^b+9 z>dC9vPrr|fq$#FZplX^qW9F>wa}Jxc#WLUeH4_H` z$v6j@2F5f%-i!(n`&nB)LDD==kZ5e~Q&hP$wjxlHWxJzm=JxiEt{s)qqwegv^EPeY zwq@R)-8<*lwiRq?Yu{chm6S~z)-5qhC6y^!Jts$o8%IZm8jm^YgcodUvgQ|4c;4Qu zx#UfAkZFLtMFuiu*Vo!M%VQcwD(A0z6Xs!0$Wk?;q8Ub^qqA%K_N_g0cJ18JKG@&a zp3mp&Qr{;Dujh%qdv2+DY zl90p{MNK9GYsT#E9wABj;lY8fbSf1&5IDvJHlAomCP#)F&62fKQC0h(N?@Y-bg*13 zrYkB=lk~S@vmanh$P^~cly%!C66$zke0bsFqc*#)>(z6edeU9n#jTjn`BYW4GMRLs z@;M%rxTFxMLJ$xV{=bacoCe9X26Bi6z@Bsw9c4irx7k7*5ZNaLAR>!zGYC#PhIDIY&rP)?Nj zir3QC-Wv!8bKZW!=dvsl3WsTJZzmj$YHb~zb}$syfgqq)uA#)i%3e*>O6=eKt1%m= z8|X|!Vd}B;_(e1|Hu%G#a8MEg+p#7pl*wQaHDV?9Z@CCju6q?vB$C-oI@H|K+B+tk zhR;Vd79$W0l4xw?v}Mb<=;8}Gec9<8cG!HWR5CqHS4se;S@I1J4zx)U5&~Ta{8HJ( zdTXVFYAr-r#%CB!58ZpaJ`IrRQ8ylZay0;hBdJe~q|yzN1WqYim)R=`fvPHXwu$4| zb)qRI666V7Mb#v;xwUPd=Xpk3M@P1M?p#h;x|FleIfs_kRwPM~%Vil`KxNyGoJl2H z9LEdE3ck_dq1l52{c{WXe20J#;0IwKNk;7l*|v@AIQ#F;P>th2LqnWwCJ6}o2L>+N zxH~y(8X(i7IyP({;=(hIQ&XY6voqD*-Az+N98HtTebFVEfx#hm@7crf zXp-U4QB+O!fg8xAvMr+{BTb&?$)m#~3DJJHILVE4`)%sp&w-tkE7$D)yiASeWlKnw@~8X&iIcI_5ID(v02 z4^KcUQ$RBe7A#swXICf5REnLucH!8zmuPGp$!5~w-8*;82!+G>!xt^;Y3*nqkrg>8 zAS6p7?8u5R9k)34!G>X=dJeeuL46UX1@F1=LN>m>1|g~Bi{>{yRaavzGp7MEJ<8*z zyB@wg8cQtkTo21Oi6)wmRjDfW#X=6x^N=dRLrIoNr-q%*nR8x&YR;6XfWj{X@d_}4 zfK2@&K1B!u;b>GYluB&axS6e6dypiFU@$~D946rRBg--!U0p+(rfHdUy0g8bBil7| z#(*SAiV#As0i~q*1BH=HA?v#1_FhM8GkbRIKuA*%_6eFqHw9{XlGo%Vr4C}_~VU=D7j2Zv+ZBu7#RNv^W)TsA`@5iR-r z{uH1Jflmk`LXe=$4U`(-D1adZLD#Vprde$9JTDLog)-52e8ls-qO7R4EX$NiCGz2>M^hpv%<$qm(iiZ}6 zMoR-D>0IsaJMxG{Y}>d2RjW6vrV30(6EPYZ6F8>HNV?R1$KCf{0kGnsmD2!uH;(%r zeV%7tdOcCHtZxV*i7gvmP^mP#SVu{Fnbv_ifRbX`{znqyr~0 z27*2!u`s4(;tz(9RsZ(@E;#?ZX@I=j#+@tv$R+2TOduHiqAbbnvg8p8`{E+Wd_4Wsglg33qe!};$^pMO%P91IY~r7(9m@k4vRzf*Tnt8_`?s?bQSn|6a94~L! z&eib5`nt?1~6UTi;Y2jnH=In> z{^nU-ouvDFk)}w9tlcaZPCVrVhWht{kQhp4mkr5@6Q)h9cgeVW#S;MBeD7oDA><26 zW(l7zF=zffWJRt9`8>yCbU2BS#&bJ0O=JD5FLTZX=Vgi|>(9?&Rzc3i*<{PapLl zQt?cUfnqGc=3<0|ET-CHJT?m1$>!y$d2vi{nRg#1%2_XxR#RL%4 zE{7i@=M|nKm1{mANs>^|G%r^)bK}2BV5l;}G7q}i&~)MK^Uh=Ss^^eZjmCz=7Zx0G zRQ$T@Z<+?kyMmzaIpHIY;~cN33WNQ7IpL&}v1`gBxVA%bG=t}jcehnkjdg2Qx$imu zf{f!3tjywLvZgYwNpxz1f@Q#rxnt$(8Y@}G&^1?8RY^!y4Izp8&OKwdF%ZaOAed+& zO}xfJl|y;cDb!{RcXf6!yk`%t>rAaaYTiuoDIB(NK4z&z-*7hY`ua_O`>9WUoCj8{ zoCe4{dEC45sfNae#OEbh2{>k+a6CiwrN6VRKg^v|T#h@ctappwev>zadhbat?H{RT8~ zaIpD<1~X@LkjrM#{NeUjH}3ipz`y_Cs%e0{)5i68tl-OkdzlCZegAPw{QLPG(g^IzhpIisJ~JFt7%jMy z&dX5?4`+MNwmMJ4RGuxrp^<2e;Mf+9>nS5S>yy{~;%AX*fV@M-vf~a1Af3+suv9XA zrBadhju!M#q|T=I9GBt2QCy_D6;A=5&b~dnGP7rQx}IC*7P2UlZB3NTEUA*iC^60@ z#urabTo=9{-XKi~;7z4HY8Rs)DoFg%Fe9l<-FXRxLdcGTY1dabo%nhOSaSTaq>@7@ zih|{c1(q5;2jHPc9-jut+j%Ts`3wNJ-v87|iN=Nt^Z5drag4qe`|b-lmGesS|9NK&~hFXZJUIOB}dk^P3s| zfJ(AZzi>*HWdgcJ|E}E!1e`~Cbz(kRJLu|$XVx}Pc;LhBCOeDnrya+ zRFm$is4B0oeTj>%xJ)q}LRGdh1u$y0!$i|)f1ubOAjBbRjyD4k09li;CscBj6@_px zh*vZZ`k5wh(g{c6m<1dZW!LWBum17b=ap%IyiLbFE1%(k$DUVPTADu}jm27UibP^@ zqRp{t5nTbej>E`E8dubu79o&?hh-H>G$vfHoYKBuVAO)GZeQ#l0K7$@ycJVR0IDKm zBT+2Xg+-V-vx}`8-#|ME2tDAa6OU)0cPED7qq(*HW64x{<}^UwrsMMSmg2bH8HGaW zbSg_WSJoc2QM>*3%e06+Ta&!++Mb{fCB z>0SVA*Zq#=cCrMRlEbMgD8`2CSm?S;I1wKZ<@AsVO=jv%s3|Kf zPO*P5Gi!gE;?Ln9wZrGrDA*461kY7hXD55M@4z^SmXd{_sl6FR_ONUhPtrf~uiyH{ z%&&a;i_-vkyNvrDf056B{4#!d(>-TK!qJlz8FWJ?+}MOylW!#n$fU9qizbq+*4agN zseoZ6Wi1U8_KhSY+1st{eiYy@%h5Q6F3(9ek9Xoc{3CC3L*V5cX zYik3Ad=||Y;E3avUO8=Iy-mid)oZ!rtP{BZiB-PlrlxC?nJlT%Vdfn^AAi7K7ng8s zmuw~vLN2d+sCcg=Jgic|Yiemi(N(<`4AKPe6bBJvspej;xtD9q9(jUUHObWSJZ#6N z=vox8DS9@x>y+!5zDY32fMIA9Z3oAx4<05G2~r~?liqhKPSVg2Lz6vZMJC$Nde;5- zEuR5!?RD3`Bjo5ETiyNmV~++v*VOOXjyubj8<}XB+R(5)2W2(+b4ujkm*PXGpIO7G1*s%3WDXi*uq0{J#?W=2^`P$ za9jt|v9UcD&vQ|Pgeohjl7cKr)n0=h{S>zL&`t8YL`(ks!0@RSGdwW`4V5(zj=r7p-mlvf*WV-6Y4+L3_M`p;D5Yqi;wn zeLLhiqdrF(bPUrmcReh6Vs|*}gPl2pR$m+eY|jnysI-G^g&{gEKR#WrHl%S~m*ISh zS5v!rBD0BylN))c)Wf6ZcAhM3=eg1@UMlQmUA~tc`C*2NSxSzD@IXgFm&zHBilpEP z*lv#UXlXl7YXhv&hS^Z+hmu3P6vVG+ctWrzGsv%UtGU&`gIApa5=DhBC5j@+WX%FM zCD-t);)|sA^s+cIi;%9@fk2id(&;q5P^hd`55Q@H;Rvt4`WoSA0@Jd?r<`=cqbnY~ ze|TDh{FROimn|t@xM1XCd-?_r4+n$n+TO#*KJ{_(Ry}{nrt*XgKU=jld*T*LwkotX z#K;zMJZNv^p_V?5&O`~Mq>$-Yp`D?0^cwk9jdYPO`Ig{$Fi=eMtNbb+Rr`4F?glRJ zJ{-3)!zK$E{*>Cv3TrFtf?0-rCYCDj6bVmAHC5uvojoKMWDhh~!skjPiW;4+pLuSC z1td6JZ{%yCrTkrS2~Q-qal5>g7s5$a$!oYSxt!`8?rpsH!!f94z!|T)wl~ zTX@#WW9S+KspMg@FLDyFc^V*p#pAa7pPm^E1^&iy1*60JIA!TliY|2#?(|5KAO6?( zd1>owQ0Rl@`Jm?Nx} zhZvL!c$&b)Lk3LCWKD7hzjrq9N+L(mCn1E4@IbR5V0r{g5>ZPg>}dp1F(d^cWGu<0 zAUULDhaNT0S~Wvn?7*^Yq6LMcXkeMYgDb`9^rl9+mu>thlHy-N>$owwna}2q;60If zT$$DQx772z7R~eh>{`rGm&>AyIL_C>Olu2U8b-Ny)1PS4{9JtaNvQI;NHjGh`0{^z zn~k|)gj6>7Vj01Yzw;loR+c4ufCZd=-np!N@G)l2Ur1xr|E)hh`=O<5QbBJ9ap#qLMH| zG#33RZXOS>96)hA^ny!!QstOpl;e~(7W!Lh3&jZ-eq;fT>rt{zvZXwuxg3Lbo_;sS zUM0^qEzj#pif_eA#b|9UTTPJS-R z$#Z4?HN2GIBL6&2&Ns2SA;s{}5cibUajdz3E?=U0F8zT3OBO9;d2|ywzlV@zN{_DN z&U^0WD_{CTm791#Q)7&1G=Nz$QGNb-{e8R61#bDxZ?EICpZ?S|2l;Cmx8HOvcdUFi znn`CK35LSbj-K_LbJ0a8hEeB!F|#?o{lEV|He4LSJ7*@sr!sFOz{SQbhV9)^MrS;fIk=Q%;?BqIAsjgGRBA$lVYFS)&B(rIQBVNR%p zZaGf404Xy^TDEXhfu&1~`doGxc{WI+Y$^>fn$2LKplb#t&t_Y0fG0COtSI*IjM&Fk zHH+yvbmUY{&BZu57pE_urkKrh zqTR?#Rxi8bkoF1sawA;qKMbE-lWd~OM7EFecx!>8Y=Wea!^HQ{R?a!&G-~sLRZS&5 zI*Mt7khR!_=bqKK{GPjC9vMw>)m3lL5Xn0x4zm2Q7kSUANAuv5tB#FE!XLG42hX$U zn9)(mJFocvWfiIQkNQ{0Kfd%)ohw;!^!Ok+ryI}o>nl59#8pq zQ;h2fA@FhqN}Km`UvVvW&fQ0LU1zZ=B zd7>MWbnSy3&M5yo`waig)7;(C&qz!uSBEz(+`&<_*ZSyuW{6lp<~M;JzLr?aV>3&X zVqpw9fQE*GjD&)Mf{KbFbR56N_I5#PeiSsdy3~D-UZAJN!Bxt|Q*1@zX=^9DoD_KF z^}wS+xY^vmj^TZHu8V_<;g9g+>~oVl9Lj>P#ZDoTkt!yY$I#bK;Wt-bGbxF&wY3>T zDR<>X3(i^b$P*s{_|ea=oi?%lr^YS!J;fhxy`BdifAI<-DgRJ19aW*k{DlkfhXYlg zq%OhB&#mT%cmABrcTT_-ZW#y?%-e0C6kJ}IoyUuY$`?G9p@hlE5plex2r@D*F0O4O zk|mOHnb&4{?2QXNO#$KIxHew4fauSlI)cGAgXfxayb{fk4oJANz;hkELJ4;?hn%+1 zRD;5TX12~X7>;Vlx`8SbJUm=nyo$t1NXW=z^Efs(PC&+P4WY;e8d~{r#ldL_B6I_V za_poK5V(l|w!aKAA;~18f>KDq4QmKde&20!p7S#aTK)05bKDVY=GiyavbRmc!-1|C zsTD7A#;jvVG{mZy3g|k${rxzugzZUEAQ)(R;fY6XyZQGw*wY&1e`tK`O!fWb-+i+bTI%m7riYQ{c`!Z)M&&+f!oJd<=skdhx9VPa9l!9o%; zh8`l+*iK;X9K_sC?5H14cvuuEkRwNq0(neISXj7tRe%Vj@;8w@%zy&2f`*1vxtxw) z#rBnr9|?hi3b7!?m|Bfy$jHb6A5ME1Z>(wypa!Z!$!Baq)k!BFM|PwaMNt?Y%^vrtlbas^03ZNKL_t)w?_G5Pz_r)kJPnZl zsj+bGj1vll!g~}|;q|qD;@pcb!gA{zSFBsJhKG}{Q9QK;ud~6ZSy3rbq(}}669ttJVd69p z5ivB`kE3|x$&n>Zjtm9zSeV$@Wgu2=W%qDp0es~q#*4&PYX!+D6?3d?Zn=~LKV`E_ zL#h}IUIlC_YB?@bqn}(%UTRa>IIykm{0d3p6s?2B*--Vfi;EgrKDv&+-Mw|^S(79h z8=?r;A{Yu8jg8G8{qaw(j(p~mADsrsfA_fSp=Y>f<#Ya$?S9L0JfG(jm@{`Snju$R zkO28imYeUsoxXDuxB;~a4k+hkWjcJA&3+`c(io~(Y4>3m6~XcqT3fbu(<9TJ>Vt0Z}>529}+AGTS!2hODS)y8n`S3yzrm!>fKc4UqrN zvA2Ji_np5KBypT!_|7skl^t8RaQZoCV7oQMT!NRLe}RY0b(qIAgCwe+Ed=;fA2MnM z3`)5{XQ5aQ9qT^iih1Q#QU}ZMD92dcO5%lrf{uZVjD>}bRS{T&AR!EVxVYrWQ6!Ip zjX|CD#Ljg8Bx$)cI+vLvYE^rc&YjQoPcA2)FVtla zTfpMQ3rUR(p!ou_;q(9f*Z=wJ{P^d;o(9N&*Z9Vj*OVi^e&26Pmd)N>TRHjka!N^U zNgcaja?^viF?@OhBJLkw?1aD*peH@DyL%DQvO7`~ZS0Uh4u&f;aaqv3iuM>YSDcFe zsMQ`WPMM3~qM{NaM1TMe4mom^DB$9up%W%T1C2D%OaqN1NDwDMyz*%I@g|}~G0^ew zC{iF#4i~oyECU}NE+!@(9tOUOc9E-wS{cB4MdMJXwaT!Ns(M61X1h^hrL%p~Iq#m+ z%~|U`{P@b6sH2h9U3u=hdwHG9*8>(Ec?7xSP}x9K{h$5efBt0dKYsD=rUCNbF>d_B z!`$?vZ*k+@kNlHavgSCpMLZUwd8~CoMc)U28?U{ACq)m+x%2UCr)D{zN7xACz21*} z+Cm&0Y%KJl0?OSxaMtzVWYU-wQ%SAZ_YM{Xaus1TDgx?}B}0)C8ajcB*03;1k)%i- z6_qd%qQnRiL_xvCBtwQINs^2*$_PnDNs%N=7Q2SOBxoQ;3=N$UMY5!Eu<;WhN&-KA zENlwo5eR~WDrTL)q=bu$fu8_DB;+dB(JCgLRC6n75-Z(Z3>1=+&i&`RPRG|XK$)7` zsQ>sL{_A%?BU3QzdR*&@%#vdl)8D%n$CGKFHUGx|KmXNlrvdVRbNuG!`}o9r&jkV^ z7zqBLVA`049J9J-6A1dp%k~S{)U%U^-uNT=OS^Gwv!>o>xp|F9ITRBHo+=|MbF1AJ zLJb87T(cUl`}=6Ou0hydHO@dCL6&NWGSxX)K|!h^(_FOK=*=ReK&ulldIg{+CUBS1XQ zLkPjWkG}Ztx?z0NESa)nrZ{%#Nf-hDnCBMRgR6h^Q?AOdr1%d@AZJ#W{|Nz-qT*Yh zp?G*RZbP^t$YUP;vQTL&*JJ(jz4$(KJnlc8iPM(?(?*E~ks6~F3*W1;;-v%L*FPfF zL5#ZN#^6SEZ}KJc>i&8)f883V!r1>_l}Sx}#H;a_jUQp*@!>r_e$sJC<(rI;-MxD` zJ#{;Shs6LF)s>m^fjhYWXE)N)+JIB}UJ~%aOKV6KB@{&`m)!Tzo?oM+gST!Jz=_*S^MsdtbnM?|i)ccnK3xDO{!GU8Fz| zH)`Pj!#aXbZL5f_52?}+$~y08pM@t)*4>uw_7YPYVa_Rk>Bf0hWzpv9E05fNFVinSO2*R=E;~std zvBdz_TzBJNy}Z5c(%r8(_vA9S2!}s3oJ@7c<8juneU^`Y?lU;v`1{O^@LVe-1O_=#62NSP(B{AO{V!vln0#Vc|ZV*6w3*GI@rF zh8TEZkk@a$7O|+E*e^c~3%e>s<7A{AgQ%*G*WQZ2tTCNLovmNHFZOe**CF*YxmTk< zCjMWq6UOyKSxjNZR9wd**2J%NKF3v|E9y-TA^7Obleo9%K?dhW zkbumIt=#|Y>%4czUb<$sSC{3sH8o=9U!bwIi$bB)5NquCJK#&7`_w1?>gDZinQC&! zgHO-&`TSQ)vKrmDYYS(da}NG+u#x~+7NO1SH}b<5Z(;D<7Q8@(I*RewhvW&2ofd@! zaU|V`v2qjktGkJP;cTSy7b3bF5v>uFc!;>IF>h0e-Lnj$y#-_;p=c_tZLJ)+U=jA# z0S5oHp2%@?Q3i7;sUqrV5&fnY$o%jwA{U&1>+@CS=y6+LshQcw`Git8!z%~SJoPN1 zRufDFqS%iCI2nr6KyoZ%ve(P-QD-)~R^MJE=*bKxGpvi3a3l{YV36E5O!q#Q#fui! zl~3yE?Bq{>dVz4PkyJX<{Lznn?D1P}{N2E`2Kh?@gRZs z|HsNjxTIrIe!S-?z8$=z?z2OY2%!GjlWR|vZ(=VUoqVvxu5sOq^zL9{R zpdl0RskmNXMrJtk-v9LYym$~c%R}hSa zt3O5qo__opKEL8h2LApq+=v3+xaL5V>(I8p0y`J`QR3kV^JckqVBnDr6wdo8U1y(& z7c%I3Y!##F6uB)77 zW4rNn&p=dS54Cf?sI&aXVZ(mr_wmc-O#sQ%0CB5^m0N|z_jDwJV5uN;}{v( zo6L<49QKh9T-rZP(*FYE_6Pn5KrWa6iR}^^9Ufru5r-3ugsLJV0Lygv)x9?`azY$0 zp;IlsTRF(XBOy1iXLv74JYEIISe}!A?LMOSzK(q7t9<;rt5BAIgU}uS%zJ+Q9fTwp z8X98GoH=~^+uz3L_tUd!Gdo2dE?GkIpKqq{qq~uW4^Q_&bArf+E+p7JznU~yPr%g) zHw~@&pIS*h(JFiDgh%QhAKxawt6D?vRaE2}nqP0$)jNO33_=%|LMYB3a<5OiF8)}A ziw44U5Tu;1W}|#=89%z=mt;%z3A{dCW5MBbNR12-49B8F$<(I+uKYhgp5`Eb?zrog z-*Nq&k1lR+YreWz6B?kk~7=zr{| z_@224Rj$ku<#|GXW(VHqZ%3cm#PAJIGdtSE*=L^32E!z>s2g?pD(?Qn-MsO}8(e$s zwY>4h8{l{(S8qn1(?Z}g=P>f^TggBC5{b)BrT2R`G5qD9!YiAJoqIAu){raWDOY_> za^2o!p_S|WQgYoku8SsenK2=s>|&N`OgHM7hp3zfX@Wr~5EO)kV#6}830QEIOV2h!(FXhh-&wcbaP4;=dt~Lb2Kh^j z=9c&mQkkMK%>se2kEV{c@sj?)&RxCS`RXH>7j=^XUJ;GWjM?&|tOO7%-&?!9@uPMX0QoORTo`O~GVkJ|TA!w#v?3i#-0XUdlCh{f^Oe zzV6UiC`3zBoNOjVqOpYsA9>=hI%4=&50KmMe*%Et-}Bf>iX@*b$r7?xq^YgBs{RCk z>#_2Yhj^_kkF_|C@Fo|NcEz9(NVi7m|`nq~7DKagMF@$T9%a=$rw}0Zs8*fSg z{OBh?n>MlDv}twg4gB=Cw*@-dTE3GnIVT1JI?3T)PFZ?NwP1h*?B2SA|6Fkc+b?g# z4an7etFfS<5a72BNLpAk;|N8ri(l(Wlgw2QkXg5D%I{HI13jBeBkvd_o-t|D1B6SE zeR&h&D;J~8Zbd>Nc+w(*3+52{>}4S2{e<+?{p_oC=9F3&G@L47q~5@i>WIIzU+3=F zeyx*&nzJ&|1XCrQp2BV}Q)d&Bje2j7BoWUFo>0o=PF-x2+3gJ6`Xpx^c`}g-R|JSf zqrCCPMuO1>az)z+1cUtk`fDG1c;!RW0C_9ppT7RB;~h`@NRm~taosDt_e1Z)t8||o zYr1*=eGhO?a5IJD8}a0tOFLGGT9Szl2nrzsrzu$1lw2SnY@jXQK(Rl0(C?Ga<>+0# zo`Hv7V9%|Ovi+tNs3#qUrs>GX%q@$mq+-lyM;3D3Os&@Fk%@p%rvOg9X;dE&Yyfpa3tlGYjeXZq8Usn?pizc1x(;R)w zk##{vAqo2X`_cUop~zDFjMGkh_}+W&8J#w<-o&`|{-?NQ`D2DAP>j%HL{ zty>H=IxxsxYabl z|C-9HH5K_E+aF80lqw-hflQ1z*N6?{VUn5=4}`cZJP&C!TLzkt$S!GR`L4AL435+t zJ8#Zxl7stDWQknCTo6ihTnsQgGBOR2Lm5x4dW{cXyo_Kd+^MMgM=aZA{cA6C;YH_R z*MLI>?!NCq*0v_G=7sURv8A*X?NPykVQUn!1w?CNf`?{&RxMt*fY{GIf!-8-b6?hV z%l@L0jk+&Y=ckeI^K-;|2*3$#jXM+5XJw%X@3LaatWW-nyGv6;AWa zOOuaZddi6m?At~-8b?vI5B~0^TN+wtE|><$p^Rn6FD?hc9Op*YgMq%ioV@g8N;Sf* z0b4e1<+c~^qjY&Uwrx`1{;3QSS9m1)HBwzVQl0jw559Slg#CqOByRf>@e7VYKEybx z8VMphphz-OJW`h=qEu=5RA8B?KjcZEFaTd=n+S}l_QzhMBk&{RN5#t&$o1?%wwOTE zYt!V%_>N9#<4!hx=v%Bi?vre}@T+V&Aq=z9BlmV_6GpC@vapg z(p2TdOeRY}mzXtw?j!wAEPEwTXb$)!5~g zd1oAke&c6pzV#nyTDlnZAm7)@7U=oK9fXfL45_0Txe|1o7>rY^B3bWM8Y{C zWy2@FN%GMb>VBi$JIuh9x3KpUSCY;SlTNhq@W^XZxO^qv7hOPGzg;<_F6z8lyckb% z|H{WE9e&y=C$ek%7BpXo=H{lW0G@pMkAF3?_*a>W^|v3q2!O_hrXQCaf#;ZX%xK3S z@K+Nobl}Oyp5wXE*D&9EG?dJmh`FeeK~E7#YX&h-=tLST9$lw5m`vDlaS}nK4<3(t z$r3u(?8UzRS%x2cfkNN#Wb@myXgO;cP2c-FBvqdx`Fx@|Ge*2+R75$rRsp;YWQT@$ z>c9Sr*KfOx?7#rHE<%=>clOzQ{N|f6{N=R%u@(zs=Vb4O4Lo(#RqTB3IWoPyxR!-$ z+jyRbtSG21XsDId@B({+7fV8=@A+p*uU-#8^t5A`d(FQgHAfk|>k+np;VLpKUS!|L zet_@Zt9V)+5iglT6m4`pfF|ixxM&E}3OF=? ze4ZDtzM2~^ypSDFJ%wvoWd}l`fMc2rZr+ThX)HSZ^lHmCrLsAt5?9Wh%bwM%vGREo zUB?KADP^-|*Xo=(EcoCD(fol*zS+cBI!Ng3yzw>$pLh->=%@P!Um$j zBAql3;hFV~0>>`9A`#e>C%a?@RMwSKlRi5wo_pwA zvV=t!UBv8@P6FHJo^O7Wee2fYxi0(GuEi^r&?_CR#x_ZoIqzTog?uVS(}D%G9ep(U zY?hy&TwXupkH;}It!B-*TyrL<>gB@LavVsFMG4KHiwu=?MQHl)`J^6S#o+Z1GVq<> z(Rb--tZE8zl;a@D^>gi_1xIk^gU@sOg#jGEB2Vax7jg67+{C4qUPNOeJnkNj$B2ja z;yO02=4-j{!IfXSn4Vc@QdQGR1O(*}$=+VXtfmRBU9GZ>iKjG4v(&>xLneT|tDnqWPatp* zn1BgbNVqlYz%{mB`D<2P_!)Zs^EYIBcHlV=eq%)aWXlsYr3p_QfC0FpOW z0MDU#${g<7wT8aF!MbCY9CaikeLGPV6`|;}7oT#`#Q?vUkgD>o1;`yMp5n4|ml6tx z&QetUsG#3qWN45%^Si5^j0BJ#O>^Vpchi4L7*CgBFo$>ZtB@*|8=hAX;uC&kOCj&C zsXsoNrS$%5D1GtadQbd1**l&E)287c zF0ayCxdt8*GOvE@EA0FK**ov}sOoh8zfYN(ne;{qN$9`SE?E;2Xw|-b;J8pO(gYG;up-#9 zd>(RdZ3C{t5+n>^L5mUwlCBvEfV=o2@}X+xDreC2<^Yi;i5VGvNIF#(upPQvnK_ha zVAGcE=n>~6B_$vzjfk>2Mw87q|MB@h*dF@X-TxmT0MjOoWag5!21NP4Gz1PG+Q;PU zt|ruSZU$B^U(LqiooE;9&~E!0wcERBPp?O?8NgJZohi@HKsMRKG!zL5LDf0+)a#VaSw)*i z?qK+mIam@>5YegFwhMste*MVo-yg|Om=#Blvf|-~X{@N=nwMT;)b#1TsAB(O1gc9) zSnR6S8Fr9Fzhe;0vIXzC8ibA+2xy?Fc%NA0Bd+JC zVEXk0ZKXVI`$rKj&CnDoGewGst z|B1A#$I|%^PXvm<>8Kof`E`^=2VHKvjZTw&z8x#@?bA$dOp00K*XRE&*x1 z`UJ+M_V5Xm%9DRlLX#jOC4w z-oYK=jPKUD1GSYGkt7jaw%oXK)tX+n-aPd`7a$A#`5s1V%xfmIHMX&#fmpkloVIyk z&YGgaBI=xt2wjRGlts- z`@dBS1l&m-TOkNdk3z*frYEUup20SK1db)!F?PtrHm-j}i5?%h9GmtV3<+^`eD3F% z;u8FO4U{Zh$+?wluxDp8_T6`Vr8t3O-+aRluf2vTCWeVmJw;~QwgIuL$*Q$+@nYV( z_g(--+;9Vrz5Y5jizQ4Im@Ur$03ZNKL_t*iGKGYo;Ps-r-FO-rXsD=Q@9Ncf-EN<` z)?}jZxN!m9B-HZN1db+uiU_24?MiBY-^5Y9?;sW5Zx5^SC^Ts!X1_9D(}3=FlWfT3 z4SjFaF*e(6Oe?b!iyTN%Q&SQs=%2v62<{*NBS#G8+?fIpjU*(cz5(#%tU3RA0GYG& zTc%AJ&DJbbf0ALk!OBJ8>!;g^HJB7?(k{LPC8 z)yF+dMhmX(MHmKk_4}Gt)YmqES;jE^3WPXc1x0kwN_^4P@}RbUC!^ooD~X6kGoJlt zaP2rr+}-0aWT%924+#@RfBJ}qLj|3s0f|9l&_ z|5Zof^lQiZl*q)SJ8BzU83v<~k~2rRZS?do<^1H~<19J5h58$E!K;8KLZt&5d`F3G z5ZgR0G^s!HjKW8&cFRR_C8(F3KhKlCZ0(kIUR9fBGMPA4aFmgwhJ0X7E-{o_5uocZ_2*z4fI)fY}CmuA7 zSW7%r>rNuw*vqF3VnAJa5EKn*WCuihJOVytQTHf#S02DHtRqrZVuVlKfP2SLT;Cri z?w;|OyR`M!w2}f`=KL$OQ0p3K|LLDFniCLE5s`78FJ;efpC`6W8+twV7?Pi`YtNnI zD|A7pth|P0T3N{_MLaA zudPMXbqr=Rx-TmX6;K2Lud3qJG#oA$PLBtN+fAdxL8HTgM^&+;rD4m;!W$xDY5sK$ z=y3DRh_)EEKlvopM~`vn>6Z`<29QKFS8&Ep7&{PSN)jq6wX(`_lf(sAB^j2aW@CMA zpW(c*?Oo0cYlDgh4G+#K-B|I=2CgZ+mR7A&fE*N>ay;0m7~= zETpoazz2FwW6_gOvieVd!dY93qqde-ZQAg{^5tAHb}TlF1wDjtn?#?`)&d9uiShCN zI#|I)@!zGvU_b#(Rx9>^&p)`h{o6v%m;8(B|J^o|CzCR;Kc|;0;>71)P_b<{0oE>w zWZi!g*^k|h5NJ56bHL!@gu9jub5b)dBFQq3CG_Dpm1j_r>JMpa$y>YAV&sHsUEMr^Bni4g{%4m^im) zIp-FyBxA%ddOY$-02~sat16lr!aa ziIyX_OHq!Cwk}0*BIzeB0@mbII^TC6lecbSn(G1+PHkuO;q{EG+E3Sa|Aa9vF02iN z!)#@-=Oj+e9d+zS=JcdvaWJ$;7X+&NCbRtP0V*oOGj6XOJ(45)cOptMjUI*_J$8K9 ze}s~ro$8yhB}w`uJ}w@oqmkY{I-|+KfHxEH?fNZzb8#Eul+NfLH5f#vxfIioM6)Jw}){FF+y<`L$--O0SI!$HZh97qoqY`1|-pc=Q;*c z3~_Bc5Z|>Mrq~1oe*x1_K{5-ESBpVogNx$E9u;`TbNn5 zvbvtx3%;cMuC{nYPdK-BDp2YJh|n(+K?7qwD0VY~(GW1>>W9vQM?t!|e;D`ht~!X` z=tdsd3DIm1h))6nT3s!!{QbyzY1k$V@H+;B5nADC~?@@c~ zB>i7`k<_leLORp>mZYpKZvFgo9?Q??sf`k%yH8oYFrYB*Giw#qZ zzFoDJEh**bz0<)P!aV@Nsi2qC`ql?zf=fZH(@a6X zC?;GX3TT9g{bH2!#0X{n$AEA-fJx1MS7=r~NQ}}UtLc-9LRL&?KB?W+0@Vpz6_Z7` z+5~?nk*_bV^yC!YeE$tRYIqQ1+q@j=s>%^%BevM22WNdbGky9kH~;$qWMGdry!!q; zAuToOH#Kz*n<(lCcxj)P8z3H4)7iCc2U~J#XiN}-#iyIX*+l`pv>rSvLdRr;BrEFf z5`+P53D%+!z~MnJsX=U)>JLNlk&buGVf3R6 zM5b})Q6Gm(h()s7&^4VC&%Hs__I-4F_E*^3wh1|hW*j86e_tfgUk)r{3qXmsFH+Pp zL@^T!Er20%2?tSl?~!P=wwm&4WJHRoXIm1~)<>^1*0WnLdhNZ08&6MEaK#CXpL1iyF{;1IPATpJEyo!k$>Vv5K>lxW=L`(34~mWF-DIPugg6u$Z~Y2!wa zGh=F4x53Dl5CM*#vOOBWqHS;LXQC4DTUbyhz!w<4y>pqH#&&P<8@peI!&2CpCNy)J! zCne$vnX#6ySjB0`lownmXovVJdRuEpryv3*K5cRj0l26QGMoM zImD`UxCG_<ZkI#uJiXw4INu;%I zO>Vbt^q(||A=9Q|^7}(t66u)~a?s2j75=(Zhp?pMA5V~FsHl8I)!WuXgl=Ic-`%2K4 z9z=I}nv-Uo%SX7XhIjdX^b0kZ9vtN-=J0y7?r#quwMsy4odRJk0Q{qnZwdKbGT4k8~}&aW~2Aep|on< zn!>|}`DW%!{(R@1Jld}xd%pY57ys1)NW>`IEwb2!7@>Ux*MfS>1%rXj+PN0*<AQ2jYujhZw;r4FmngV`BO|Tf?$)N}%bD?hrU&}{m6^AssYoI53sPyk%e;7mi4CIVNbS<*DkA|UDc=$x_ z<9CsB=X5_fgv%0oG{SEJiK41#x*qk|mX^rxFdD-X#>`eLD~=pt_Qs7Y*u9(04hOHS zTuENnt`zLq!|%q7Vb1fx%eKG|31FR`k+Z+>_qIIq6OGY6pfJ`y(X81a%LW2d%6I zrML{`SP6pJh;!p%DxdxwwWcwsz@rj3+7|{cT1;d;Je|(3K7|%2ClT7MJUXX{BzzI5 zE-T}cC!b{FqD6Q-o`AsjQ-PuT!$z*Z?KZmi=@TZmqiMd_EWfBV@~W%&Y}YOxefM1w z)6<#%hd=Pz)TvYy6(RowE1DRhclZif82t54qLsk*k(LDuo5V_rmD;HEVKf-HA*CC( zGnIt44t0)d%a>c%(co}}OClqOQGDt!veAN5;fB>~*SG)gq~HJcx>%oo?DKlw^T1=@ zcr_uTwz`teo!XF=)e2GY=a^~m-e2Ef_0R^?UMUDoX1=BfTTKVI242;d8f!CS!iYAp z8{9n%aawQ0Zdv#O6#YZ%Qc+hOf(y0i7iyr!fnYad{@oO$j+wsibt*VsUxVYNWw_>U zK|NQ2a<-htd7E)NWBKPsTkYr;-U#HN<1VS?ho)}?W zIL0tj_)W(|*VhPVU~#@y(k#x?uyY`}HF+GZU}>*w94-yo$o9C5t)v z<(HJ?ucP|VA>6f9NJ()REODqP5pAb^>k0~r(Sp6Yf&nqDqtZwsCeBn>a4f+KqHl^2 zk`gKUVJAIFp<_sHP>j_|Vc{8MlNC`mBq?6cq3f@{YTtqd3;yo`WZkA+%=-Le7OmXy zggq|)&iY0NCP|}f@2(ilrhxTj-}b$HbZ9B%x3@!UGSvzpIzZDuf2Uf}r9hQ}H$5J~ zC?S}Pem_S@F*Ku$zPkv0e{s+vF}wq&Urs4{HG z!;lacl(Yqzxc)tf?bZoNlAE{tp7gv8v>B3bso;`!T ze|KcF9TiWrrlP7KQs}wF%|Z^c+`N#h$!tPBU%`%e1&1NnMpWvaO~JEYaND$7kV0-g zBO{$H+jo+lnM<5i?lF4g&^HDQ8OfYkGyiXiSXU13&-zU}lH%eM?x|^TV2d#$n?&Mb z?Sa9rt7~Nb!ucG#G6t_fyS#nW|1NtabX`WUSwrU02=XzTkgn|o@fP1{F(wQTk4A_M zHgeIb8qqFBXZ>P~8ADzxbeiiTzOWTN@VmiA%)zCJutGmK5p-2)DSw$bk&FK5UTbX7 z!c$pV%G$YexpUYst{F0f_3PH5`av7{osqw#09ko?ygqj>qx>npD`(B(j}JfGtW2o_ zq~+%F`|rNPV6jko^eA&4dWibU%BVwdbmmMnk0%IDO~X@FL*3!yoPOm4Hn$m0$?OG4 zVFieq1SXA&gm`9GZf}uRu4>XF6vxRy$;_P-o^@!oSjbLK#?e@ZXpYPI zX8q=SuNpV%|E7p_&D0t9m@L-mnl4I3XHPNVs&OGER5-ftFmIk%M%kn^1d~hz+X(mv zn^r_Y#CB1jG0lu%w>Gmhg?h2Yju{AvR;X&k@QW)k-7&%+OXQEcI$e%?=H{rNjD2J> z_VEKloMe%q7E+*(lhi^x&1i8^p2kN0I&2sfXU_OyjUIZ4mp5*t%YXsCILyXIAMv?d zl%6}s@>#Q3vv46Xb~`EQ>6k1QBvFhC65Y=wOlC6^r%&hP;lrFhdXyu(b|D#!bR9G( zkTcQ*C~I6C>0P_Beg1r^i;Gbeg%0D#HxscAeEczWMZwA?DZ>Vlch@b*32`X3^>{8- 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 E0E8Q9h5!Hn literal 0 HcmV?d00001 diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/staging/dist/mainui.jar b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/MainUI/staging/dist/mainui.jar new file mode 100644 index 0000000000000000000000000000000000000000..92ba7f7077d2b08138724db72f249170a6053746 GIT binary patch literal 359 zcmWIWW@h1HVBlb2u(W#}z<>le8CV#6T|*poJ^kGD|D9rB2!JZ(V6XrxHD&wtrW~le z4~Rv87_QXU(a+P(H8@1i*X^_KnbSVrx_TFRy>+$DojJcb$l!|cgQrDjoP`Q?Jbcc1 zgfet7s`B!F@u}Q7r#nd4J1Dqhu2!Q|gVmQaTX}g)xIZ{hHg(D?si{qw%Ff)j z%)+d^9V^uIr{^c7&0AOOmsGfMs*~P?*jX$2g}A;xdHU!n6VRcIOd`y - - - - - - - - - - Builds, tests, and runs the project ResultsUIAug30. - - - diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Results/manifest.mf b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Results/manifest.mf deleted file mode 100644 index 1574df4a2..000000000 --- a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Results/manifest.mf +++ /dev/null @@ -1,3 +0,0 @@ -Manifest-Version: 1.0 -X-COMMENT: Main-Class will be added automatically by build - diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Results/nbproject/build-impl.xml b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Results/nbproject/build-impl.xml deleted file mode 100644 index 89fe3d83d..000000000 --- a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Results/nbproject/build-impl.xml +++ /dev/null @@ -1,1420 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must set src.dir - Must set test.src.dir - Must set build.dir - Must set dist.dir - Must set build.classes.dir - Must set dist.javadoc.dir - Must set build.test.classes.dir - Must set build.test.results.dir - Must set build.classes.excludes - Must set dist.jar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must set javac.includes - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - No tests executed. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must set JVM to use for profiling in profiler.info.jvm - Must set profiler agent JVM arguments in profiler.info.jvmargs.agent - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must select some files in the IDE or set javac.includes - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - To run this application from the command line without Ant, try: - - java -jar "${dist.jar.resolved}" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must select one file in the IDE or set run.class - - - - Must select one file in the IDE or set run.class - - - - - - - - - - - - - - - - - - - - - - - Must select one file in the IDE or set debug.class - - - - - Must select one file in the IDE or set debug.class - - - - - Must set fix.includes - - - - - - - - - - This target only works when run from inside the NetBeans IDE. - - - - - - - - - Must select one file in the IDE or set profile.class - This target only works when run from inside the NetBeans IDE. - - - - - - - - - This target only works when run from inside the NetBeans IDE. - - - - - - - - - - - - - This target only works when run from inside the NetBeans IDE. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must select one file in the IDE or set run.class - - - - - - Must select some files in the IDE or set test.includes - - - - - Must select one file in the IDE or set run.class - - - - - Must select one file in the IDE or set applet.url - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must select some files in the IDE or set javac.includes - - - - - - - - - - - - - - - - - - - - Some tests failed; see details above. - - - - - - - - - Must select some files in the IDE or set test.includes - - - - Some tests failed; see details above. - - - - Must select some files in the IDE or set test.class - Must select some method in the IDE or set test.method - - - - Some tests failed; see details above. - - - - - Must select one file in the IDE or set test.class - - - - Must select one file in the IDE or set test.class - Must select some method in the IDE or set test.method - - - - - - - - - - - - - - Must select one file in the IDE or set applet.url - - - - - - - - - Must select one file in the IDE or set applet.url - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Results/nbproject/genfiles.properties b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Results/nbproject/genfiles.properties deleted file mode 100644 index 3236f5d57..000000000 --- a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Results/nbproject/genfiles.properties +++ /dev/null @@ -1,8 +0,0 @@ -build.xml.data.CRC32=06f40a7b -build.xml.script.CRC32=dc6ed3ed -build.xml.stylesheet.CRC32=8064a381@1.80.1.48 -# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. -# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. -nbproject/build-impl.xml.data.CRC32=06f40a7b -nbproject/build-impl.xml.script.CRC32=486037cd -nbproject/build-impl.xml.stylesheet.CRC32=830a3534@1.80.1.48 diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Results/nbproject/private/private.properties b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Results/nbproject/private/private.properties deleted file mode 100644 index 9436b19f6..000000000 --- a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Results/nbproject/private/private.properties +++ /dev/null @@ -1,2 +0,0 @@ -compile.on.save=true -user.properties.file=C:\\Users\\Dan\\AppData\\Roaming\\NetBeans\\8.2\\build.properties diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Results/nbproject/project.properties b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Results/nbproject/project.properties deleted file mode 100644 index a6e77a4fd..000000000 --- a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Results/nbproject/project.properties +++ /dev/null @@ -1,75 +0,0 @@ -annotation.processing.enabled=true -annotation.processing.enabled.in.editor=false -annotation.processing.processor.options= -annotation.processing.processors.list= -annotation.processing.run.all.processors=true -annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output -build.classes.dir=${build.dir}/classes -build.classes.excludes=**/*.java,**/*.form -# This directory is removed when the project is cleaned: -build.dir=build -build.generated.dir=${build.dir}/generated -build.generated.sources.dir=${build.dir}/generated-sources -# Only compile against the classpath explicitly listed here: -build.sysclasspath=ignore -build.test.classes.dir=${build.dir}/test/classes -build.test.results.dir=${build.dir}/test/results -# Uncomment to specify the preferred debugger connection transport: -#debug.transport=dt_socket -debug.classpath=\ - ${run.classpath} -debug.test.classpath=\ - ${run.test.classpath} -# Files in build.classes.dir which should be excluded from distribution jar -dist.archive.excludes= -# This directory is removed when the project is cleaned: -dist.dir=dist -dist.jar=${dist.dir}/ResultsUIAug30.jar -dist.javadoc.dir=${dist.dir}/javadoc -excludes= -includes=** -jar.compress=false -javac.classpath=\ - ${libs.absolutelayout.classpath} -# Space-separated list of extra javac options -javac.compilerargs= -javac.deprecation=false -javac.external.vm=true -javac.processorpath=\ - ${javac.classpath} -javac.source=1.8 -javac.target=1.8 -javac.test.classpath=\ - ${javac.classpath}:\ - ${build.classes.dir} -javac.test.processorpath=\ - ${javac.test.classpath} -javadoc.additionalparam= -javadoc.author=false -javadoc.encoding=${source.encoding} -javadoc.noindex=false -javadoc.nonavbar=false -javadoc.notree=false -javadoc.private=false -javadoc.splitindex=true -javadoc.use=true -javadoc.version=false -javadoc.windowtitle= -main.class=ResultsUI.ResultsUI -manifest.file=manifest.mf -meta.inf.dir=${src.dir}/META-INF -mkdist.disabled=false -platform.active=default_platform -run.classpath=\ - ${javac.classpath}:\ - ${build.classes.dir} -# Space-separated list of JVM arguments used when running the project. -# You may also define separate properties like run-sys-prop.name=value instead of -Dname=value. -# To set system properties for unit tests define test-sys-prop.name=value: -run.jvmargs= -run.test.classpath=\ - ${javac.test.classpath}:\ - ${build.test.classes.dir} -source.encoding=UTF-8 -src.dir=src -test.src.dir=test diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Results/nbproject/project.xml b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Results/nbproject/project.xml deleted file mode 100644 index 1f8e85a84..000000000 --- a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Results/nbproject/project.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - org.netbeans.modules.java.j2seproject - - - ResultsUIAug30 - - - - - - - - - diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Results/src/ResultsUI/ResultsUI.java b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Results/src/ResultsUI/ResultsUI.java deleted file mode 100644 index e121ba1e7..000000000 --- a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Results/src/ResultsUI/ResultsUI.java +++ /dev/null @@ -1,355 +0,0 @@ -package ResultsUI; - - -import static ResultsUI.ResultsData.artifactValuesDiffer; -import java.awt.Component; -import javax.swing.JFrame; -import javax.swing.JOptionPane; -import javax.swing.JPanel; - -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ - -/** - * - * @author Dan - */ -public class ResultsUI extends javax.swing.JFrame { - ResultsData dataUI; - - public ResultsUI() { - initComponents(); - LabNotExist.setVisible(false); - - dataUI = new ResultsData(); - } - - /** - * This method is called from within the constructor to initialize the form. - * WARNING: Do NOT modify this code. The content of this method is always - * regenerated by the Form Editor. - */ - @SuppressWarnings("unchecked") - // //GEN-BEGIN:initComponents - private void initComponents() { - - ScrollPaneOfArtifacts = new javax.swing.JScrollPane(); - PanelofArtifacts = new javax.swing.JPanel(); - UpdateButton = new javax.swing.JButton(); - jLabel2 = new javax.swing.JLabel(); - RemoveAllButton = new javax.swing.JButton(); - jLabel9 = new javax.swing.JLabel(); - CreateButton = new javax.swing.JButton(); - jLabel3 = new javax.swing.JLabel(); - jLabel5 = new javax.swing.JLabel(); - jLabel1 = new javax.swing.JLabel(); - LabNameTextField = new javax.swing.JTextField(); - LabNotExist = new javax.swing.JLabel(); - - setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); - setBackground(new java.awt.Color(255, 255, 255)); - setMinimumSize(new java.awt.Dimension(1590, 500)); - setPreferredSize(new java.awt.Dimension(1585, 389)); - addWindowListener(new java.awt.event.WindowAdapter() { - public void windowClosing(java.awt.event.WindowEvent evt) { - formWindowClosing(evt); - } - }); - - ScrollPaneOfArtifacts.setAutoscrolls(true); - ScrollPaneOfArtifacts.setMaximumSize(new java.awt.Dimension(1300, 800)); - - PanelofArtifacts.setLayout(new javax.swing.BoxLayout(PanelofArtifacts, javax.swing.BoxLayout.PAGE_AXIS)); - ScrollPaneOfArtifacts.setViewportView(PanelofArtifacts); - - UpdateButton.setText("Update"); - UpdateButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - UpdateButtonActionPerformed(evt); - } - }); - - jLabel2.setFont(new java.awt.Font("Arial", 1, 12)); // NOI18N - jLabel2.setText("Container"); - jLabel2.setToolTipText("Identifies the container hosting the file. \nIf \"ALL\" is selected, then the file is across all the containers."); - - RemoveAllButton.setFont(new java.awt.Font("Dialog", 1, 12)); // NOI18N - RemoveAllButton.setText("Remove All"); - RemoveAllButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - RemoveAllButtonActionPerformed(evt); - } - }); - - jLabel9.setFont(new java.awt.Font("Arial Black", 0, 12)); // NOI18N - jLabel9.setText("Lab Name: "); - - CreateButton.setFont(new java.awt.Font("Dialog", 1, 12)); // NOI18N - CreateButton.setText("Create"); - CreateButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - CreateButtonActionPerformed(evt); - } - }); - - jLabel3.setFont(new java.awt.Font("Arial", 1, 12)); // NOI18N - jLabel3.setText("Field Type"); - jLabel3.setToolTipText("The mode in which a value is found."); - - jLabel5.setFont(new java.awt.Font("Arial", 1, 12)); // NOI18N - jLabel5.setText("File"); - jLabel5.setToolTipText("File should either be a file path or a program/utility name with the \".stdin\", \".stdout\", or \".prgout\" extension.\n\n Ex. \"test.stdin\", \".local/result/sniff.txt\" "); - - jLabel1.setFont(new java.awt.Font("Arial", 1, 12)); // NOI18N - jLabel1.setText("Result Tag"); - jLabel1.setToolTipText("The symbolic name of the result, which will be referenced in the goals configuration file. \n\n(It must be alphanumeric, underscores permitted) "); - - LabNameTextField.setPreferredSize(new java.awt.Dimension(6, 25)); - LabNameTextField.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - LabNameTextFieldActionPerformed(evt); - } - }); - - LabNotExist.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N - LabNotExist.setText("Lab does not exist!"); - - javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); - getContentPane().setLayout(layout); - layout.setHorizontalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addContainerGap() - .addComponent(CreateButton) - .addGap(10, 10, 10) - .addComponent(RemoveAllButton) - .addGap(98, 98, 98) - .addComponent(jLabel9) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(LabNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 378, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(18, 18, 18) - .addComponent(LabNotExist) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 344, Short.MAX_VALUE) - .addComponent(UpdateButton)) - .addComponent(ScrollPaneOfArtifacts, javax.swing.GroupLayout.DEFAULT_SIZE, 1300, Short.MAX_VALUE)) - .addContainerGap()) - .addGroup(layout.createSequentialGroup() - .addGap(60, 60, 60) - .addComponent(jLabel1) - .addGap(74, 74, 74) - .addComponent(jLabel2) - .addGap(66, 66, 66) - .addComponent(jLabel5) - .addGap(131, 131, 131) - .addComponent(jLabel3) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - ); - layout.setVerticalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addContainerGap() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(CreateButton) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(RemoveAllButton) - .addComponent(jLabel9) - .addComponent(LabNameTextField, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(UpdateButton) - .addComponent(LabNotExist))) - .addGap(14, 14, 14) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(jLabel1) - .addComponent(jLabel2) - .addComponent(jLabel5) - .addComponent(jLabel3)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(ScrollPaneOfArtifacts, javax.swing.GroupLayout.DEFAULT_SIZE, 317, Short.MAX_VALUE)) - ); - - pack(); - }// //GEN-END:initComponents - - private void UpdateButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_UpdateButtonActionPerformed - update(); - }//GEN-LAST:event_UpdateButtonActionPerformed - - private void update(){ - if(dataUI.labloaded) - dataUI.writeResultsConfig(PanelofArtifacts); - } - - private void LabNameTextFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_LabNameTextFieldActionPerformed - loadLab(); - }//GEN-LAST:event_LabNameTextFieldActionPerformed - - //Checks if the lab exists and will load lab's result config if it does - private void loadLab(){ - dataUI = new ResultsData(getLabName()); - //System.out.println("RowCount(Load): " + dataUI.rowCount); - - if(dataUI.labloaded){ - LabNotExist.setVisible(false); - artifactsPanelRedraw(); - } - else - LabNotExist.setVisible(true); - } - - private void CreateButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_CreateButtonActionPerformed - createFreshArtifact(); - }//GEN-LAST:event_CreateButtonActionPerformed - - //Creates and loads a new artifact row - private void createFreshArtifact(){ - if(dataUI.labloaded){ - dataUI.rowCount++; - ArtifactPanels newArtifact = new ArtifactPanels(this, dataUI.containerList, dataUI.rowCount); - PanelofArtifacts.add(newArtifact); - PanelofArtifacts.revalidate(); - PanelofArtifacts.repaint(); - } - } - - private void RemoveAllButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_RemoveAllButtonActionPerformed - removeAllButton(); - }//GEN-LAST:event_RemoveAllButtonActionPerformed - - private void removeAllButton(){ - if(dataUI.labloaded){ - if(JOptionPane.showConfirmDialog(null, "Are you sure you want to remove all?") == JOptionPane.YES_OPTION){ - removeAllArtifacts(); - dataUI.rowCount = 0; - - } - } - } - - private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing - checkUnsavedChangesMade(); - }//GEN-LAST:event_formWindowClosing - - //Check if the the current state of the UI matches with what's saved in the goals.config - void checkUnsavedChangesMade(){ - if(dataUI.labloaded){ - dataUI.updateListofArtifacts(PanelofArtifacts); - - if(artifactValuesDiffer(dataUI.listofArtifacts, dataUI.getArtifactValuesOfConfigFile())){ - int confirmed = JOptionPane.showConfirmDialog(null, - "There are Unsaved Changes. Are you sure you want to exit the program?", "Unsaved Changes", - JOptionPane.YES_NO_OPTION); - - if (confirmed == JOptionPane.YES_OPTION) - dispose(); - else - setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); - } - else - dispose(); - } - } - -//General Methods - //Updates the list of artifacts and redraws them on screen - void refresh(){ - dataUI.updateListofArtifacts(PanelofArtifacts); - artifactsPanelRedraw(); - } - - //Redraws the artifacts Panel - void artifactsPanelRedraw(){ - removeAllArtifacts(); - //redraw the artifacts - for(int i=0; i < dataUI.listofArtifacts.size(); i++){ - loadArtifact(dataUI.listofArtifacts.get(i), i+1); - } - } - - //Removes all the artifact lines for the lab *note: this doesn't update results.config or the resultsData until the user hits the update button - private void removeAllArtifacts(){ - Component[] componentList = PanelofArtifacts.getComponents(); - for(Component c: componentList) - PanelofArtifacts.remove(c); - - PanelofArtifacts.revalidate(); - PanelofArtifacts.repaint(); - } - - //Load's the artifactlinePanel into GUI - private void loadArtifact(ArtifactValues artifactVal, int rowNum){ - ArtifactPanels newArtifact = new ArtifactPanels(this, dataUI.containerList, rowNum, - artifactVal.resultTag, - artifactVal.container, - artifactVal.fileID, - artifactVal.fieldType, - artifactVal.fieldID, - artifactVal.lineType, - artifactVal.lineID, - artifactVal.timeStampType, - artifactVal.timeStampDelimiter); - PanelofArtifacts.add(newArtifact); - PanelofArtifacts.revalidate(); - PanelofArtifacts.repaint(); - } - - //Gets the labname - private String getLabName(){ - return LabNameTextField.getText(); - } - - //Gets the panel holding the artifacts - protected JPanel getPanelofArtifacts(){ - return PanelofArtifacts; - } - - public static void main(String args[]) { - /* Set the Nimbus look and feel */ - // - /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. - * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html - */ - try { - for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { - if ("Nimbus".equals(info.getName())) { - javax.swing.UIManager.setLookAndFeel(info.getClassName()); - break; - } - } - } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) { - java.util.logging.Logger.getLogger(ResultsUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); - } - // - // - // - // - - // - - /* Create and display the form */ - java.awt.EventQueue.invokeLater(() -> { - ResultsUI newResultsUI = new ResultsUI(); - newResultsUI.setSize(1005, 1000); - newResultsUI.setVisible(true); - }); - } - - - // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JButton CreateButton; - private javax.swing.JTextField LabNameTextField; - private javax.swing.JLabel LabNotExist; - private javax.swing.JPanel PanelofArtifacts; - private javax.swing.JButton RemoveAllButton; - private javax.swing.JScrollPane ScrollPaneOfArtifacts; - private javax.swing.JButton UpdateButton; - private javax.swing.JLabel jLabel1; - private javax.swing.JLabel jLabel2; - private javax.swing.JLabel jLabel3; - private javax.swing.JLabel jLabel5; - private javax.swing.JLabel jLabel9; - // End of variables declaration//GEN-END:variables -} diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Results/src/ResultsUI/ToolTipHandlers.java b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Results/src/ResultsUI/ToolTipHandlers.java deleted file mode 100644 index a7990d374..000000000 --- a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/Results/src/ResultsUI/ToolTipHandlers.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package ResultsUI; - -import java.awt.Component; -import javax.swing.DefaultListCellRenderer; -import javax.swing.JComboBox; -import javax.swing.JComponent; -import javax.swing.JList; - -/** - * - * @author Dan - */ -public class ToolTipHandlers { - public static interface ToolTipProvider{ - public String getToolTip(); - } - - //Stores an item and its correspoinding tool tip. (Items put into a combobox) - public static class ToolTipWrapper implements ToolTipProvider{ - final String item; - final String toolTip; - - public ToolTipWrapper(String item, String toolTip){ - this.item = item; - this.toolTip = toolTip; - } - - @Override - public String getToolTip(){ - return toolTip; - } - - @Override - public String toString(){ - return item; - } - - public String getItem(){ - return item; - } - } - - //custom combobox renderer to handle ToolTipWrapper objects that contain an string item and string tool tip - public static class ComboBoxRenderer extends DefaultListCellRenderer { - - @Override - public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { - JComponent component = (JComponent) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); - String tip = null; - if (value instanceof ToolTipProvider) { - ToolTipProvider ttp = (ToolTipProvider) value; - tip = ttp.getToolTip(); - } - list.setToolTipText(tip); - return component; - } - } - - //Sets the combo items with associated tool tips (called in the constructors) - public static void setComboItems(JComboBox combobox, ToolTipWrapper[] items){ - ComboBoxRenderer renderer = new ComboBoxRenderer(); - combobox.setRenderer(renderer); - - for (ToolTipWrapper item : items) { - combobox.addItem(item); - } - } -} diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/bin/buildUI2.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/bin/buildUI2.sh new file mode 100755 index 000000000..0ec757e56 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/bin/buildUI2.sh @@ -0,0 +1,10 @@ +#!/bin/bash +# +# Rebuild the Labtianers Lab Editor UI +# Use -n to supress running the UI after rebuild. +# +/usr/bin/javac ../MainUI/src/main/java/labtainers/goalsui/*.java ../MainUI/src/main/java/labtainers/resultsui/*.java ../MainUI/src/main/java/labtainers/paramsui/*.java ../MainUI/src/main/java/labtainers/mainui/*.java -d . -Xlint:unchecked || exit +jar cmf mainUI.mf ./MainUI.jar labtainers/mainui/*.class labtainers/goalsui/*.class labtainers/resultsui/*.class labtainers/paramsui/*.class ../MainUI/src/main/resources/* || exit +if [[ "$1" != "-n" ]]; then + /usr/bin/java -jar MainUI.jar +fi diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/bin/mainUI.ini.backup b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/bin/mainUI.ini.backup new file mode 100644 index 000000000..969417969 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/bin/mainUI.ini.backup @@ -0,0 +1,3 @@ +labtainerPath= +prevLab= +textEditor= diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/UI/bin/mainUI.mf b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/bin/mainUI.mf new file mode 100644 index 000000000..384cf2bbc --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/UI/bin/mainUI.mf @@ -0,0 +1,2 @@ +Manifest-Version: 1.0 +Main-Class: labtainers/mainui/MainWindow diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/README-DEV.txt b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/README-DEV.txt new file mode 100644 index 000000000..901216eae --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/README-DEV.txt @@ -0,0 +1,12 @@ +README for creating Azure Labtainer VHD image and storing in Azure blob storage for use by Labtainers VMs + +Use the base_create_vm.sh script to create a base VM, provide the user name "base" + +Use generalize.sh to generalize and stop the VM + +Delete the existing blob if it exists with delete_blob.sh +Copy the base disk image to the blob using copy_to_blob.sh (after sourcing account_env.sh) +Remove the vm using delete_vm.sh + + + diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/README.txt b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/README.txt new file mode 100644 index 000000000..b5b8e812a --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/README.txt @@ -0,0 +1,82 @@ +Create a Labtainers VM within Azure, assuming the user +has an Azure account. Note that Azure Student accounts +(https://azure.microsoft.com/en-us/free/students/) are not +recommended for use at this time because they are subject to +unpredictable resource limitations. + + +This requires that the Azure CLI be installed on the Mac, Windows or Linux: + https://docs.microsoft.com/en-us/cli/azure/install-azure-cli + +Then open a terminal on Mac/Linux, or a PowerShell window on Windows. +Install the local scripts by getting this script (make it executable on Mac or Linux): + https://raw.githubusercontent.com/mfthomps/Labtainers/master/azure/install_labtainers.sh +Or on Windows: + https://raw.githubusercontent.com/mfthomps/Labtainers/master/azure/install_labtainers.ps1 + +On Mac or Linux: + curl -L https://raw.githubusercontent.com/mfthomps/Labtainers/master/azure/install_labtainers.sh --output install_labtainers.sh + chmod a+x install_labtainers.sh (only on Linux or Mac) +On Windows: + wget https://raw.githubusercontent.com/mfthomps/Labtainers/master/azure/install_labtainers.sh -OutFile install_labtainers.ps1 + +And then run it (Mac/Linux). + ./install_labtainers.sh +Windows: + ./install_labtainers.ps1 + +That will create a ~/labtainers_azure directory. + +Change to the ~/labtainers_azure directory + cd ~/labtainers_azure + +Log into your Azure account: + az login +NOTE: If your account has access to more than one Azure Subscription, you need to change these parameters to +specify the student subscription before running the install_labtainers script: + 1. Change the ~/.azure/clouds.config to show your student subscription number + 2. Change the entries in ~/.azureProfile.json so that only your student subscription shows + “isDefaultâ€= true, the rest being set to ‘false’. + +In the following command examples, use "ps1" instead of "sh" when using PowerShell. + +Once logged into Azure, run the create_vm.sh (or create_vm.ps1 for windows) script, passing in a user ID. +The ID can be any name, e.g., + ./create_vm.sh myname + +The create_vm script may take a while to run. The process is complete when you see “Labtainers is up. +Point a local browser to localhost:6901†and perform the labs. +When prompted for a password in the browser, just click submit or OK, i.e., leave the password blank. +The password for the labtainer user in the VM is labtainer. + +When done with labs, run the get_results.sh (or get_results.ps1) script: + ./get_results.sh +This will store your Labtainer results in ~/labtainer_xfer. Provide those +results to your instructor. + +If you become unable to reach the Labtainers via your browser, e.g., after +shutting down your computer, simple use the restart.sh script: + ./restart.sh + +The create_vm.sh script will create an SSH key pair named id_labtainers within your ~/.ssh directory. +The private key in id_labtainers is not passphrase protected, so you must protect it. +You may move the keys to a different computer and access your Labtainers from that computer's +browser. You must first run the install_labtainers.sh script on that computer, and then run +the restart.sh script. + +When done with a lab, use + ./deallocate_vm +to stop incurring most charges. Note however that any work you've performed on the Labtainers +might be lost (unless you've retrieved your results with get_results.sh), depending on how +long the VM is dormant. + +To restore a VM after you deallocated it, use: + ./restore_vm.sh + +When completely done with the VM, use the delete_vm.sh script to stop incurring all charges: + ./delete_vm.sh + +Shutting down the VM without deallocating or deleting it will not stop charges. + +Questions? mfthomps at nps.edu + diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/account_env.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/account_env.sh new file mode 100644 index 000000000..8494313d2 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/account_env.sh @@ -0,0 +1,5 @@ +# +# source this, passing in the key +# +export AZURE_STORAGE_ACCOUNT=labtainersblob +export AZURE_STORAGE_KEY=$1 diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/base_create_vm.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/base_create_vm.sh new file mode 100755 index 000000000..7f7622671 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/base_create_vm.sh @@ -0,0 +1,34 @@ +#!/bin/bash +# +# Create base Labtainers VM in Azure and provision it. +# Assumes you have an Azure account and the CLI installed. +# This base is intended to be generalized and used as an image for an Azure +# community gallery. +# +# This will create an ssh key pair and use it when creating the VM +# +if [ "$#" -ne 1 ]; then + echo "create_vm.sh " + exit +fi +user_id=$1 +vm_name=$user_id-labtainervm +rm -f ~/.ssh/id_labtainers* +ssh-keygen -b 2048 -t rsa -f ~/.ssh/id_labtainers -q -N "" +key=$(cat ~/.ssh/id_labtainers.pub) +echo "key generated" +cp cloud_init.template cloud_init.txt +./resourcecheck.sh || exit 1 +echo "Creating Azure VM $vm_name for $user_id" +az vm create \ + --public-ip-sku Standard \ + --resource-group labtainerResources \ + --name $vm_name \ + --image UbuntuLTS \ + --admin-username labtainer \ + --nic-delete-option delete \ + --generate-ssh-keys \ + --ssh-key-values ~/.ssh/id_labtainers.pub \ + --custom-data cloud_init.txt > $user_id.json + +./waitdone2.sh $user_id diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/checktunnel.ps1 b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/checktunnel.ps1 new file mode 100644 index 000000000..155cf8172 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/checktunnel.ps1 @@ -0,0 +1,23 @@ +If ($args.Count -ne 1){ + echo "checktunnel.ps1 " + exit +} +$user=$args[0] +$suffix = "-labtainervm" +$vm=$user+$suffix +echo "get the IP for $vm" +$ip=./getip.ps1 labtainerResources $vm +echo "getipi got $ip" + +if ($ip -eq "FAIL"){ + echo "Failed to get ip of $vm" + exit 1 +} +$result=netstat -an | findstr 6901 +If ($result -eq $null){ + echo "No tunnel, create one." + $fname=$HOME+"\.ssh\id_labtainers" + ./dotunnel.bat $fname $ip +}else{ + echo "Proper tunnel already exists." +} diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/checktunnel.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/checktunnel.sh new file mode 100755 index 000000000..afd2a8d0e --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/checktunnel.sh @@ -0,0 +1,35 @@ +#!/bin/bash +echo "in checktunnel" +if [ "$#" -ne 1 ]; then + echo "checktunnel.sh " + exit +fi +user=$1 +vm=$user-labtainervm +echo "get the IP" +ip=$(./getip.sh labtainerResources $vm) +if [[ $ip == "FAIL" ]]; then + echo "Failed to get ip of $vm" + exit 1 +fi +result=$(ps aux | grep ssh | grep 6901) +if [ -z "${result}" ]; then + echo "No tunnel, create one." + ssh -AfN -L 6901:127.0.0.1:6901 -oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/null -o "ServerAliveInterval 60" -i "~/.ssh/id_labtainers" labtainer@$ip + RESULT=$? + if [ $RESULT -ne 0 ]; then + echo "try again to create tunnel" + sleep 5 + ssh -AfN -L 6901:127.0.0.1:6901 -oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/null -o "ServerAliveInterval 60" -i "~/.ssh/id_labtainers" labtainer@$ip + fi +else + if [[ "$result" == *"$ip"* ]]; then + echo "Proper tunnel already exists." + echo $result + else + echo "Tunnel exists but has has wrong IP" + kill $(echo $result | awk '{print $2}') + ssh -AfN -L 6901:127.0.0.1:6901 -oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/null -o "ServerAliveInterval 60" -i "~/.ssh/id_labtainers" labtainer@$ip + fi +fi + diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/cloud_init.template b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/cloud_init.template new file mode 100644 index 000000000..1068bc9d5 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/cloud_init.template @@ -0,0 +1,67 @@ +#cloud-config +# +# Cloud Config file for Headless Labtainers. Provisions docker, docker-compose and headless labtainers +# +# + +system_info: + default_user: + name: labtainer + sudo: ALL=(ALL) NOPASSWD:ALL + +packages: + - net-tools + +write_files: +- content: | +- content: | + [Unit] + Description=Headless Labtainers + + [Service] + Type=simple + WorkingDirectory=/home/labtainer/headless-labtainers + User=labtainer + ExecStart=/home/labtainer/headless-labtainers/headless-labtainers.sh + + [Install] + WantedBy=multi-user.target + Alias=headless-labtainers.service + path: /etc/systemd/system/headless-labtainers.service + +runcmd: +- apt install -y apt-transport-https ca-certificates curl software-properties-common +- curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - +- add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable" +- apt update +- cache policy docker-ce +- apt install -y docker-ce +- curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose +- chmod +x /usr/local/bin/docker-compose + +- usermod -aG docker labtainer +- usermod -aG sudo labtainer +- usermod -aG docker ubuntu + +- mkdir /home/labtainer/headless-labtainers +- chown labtainer:labtainer /home/labtainer/headless-labtainers +- wget -P /home/labtainer/headless-labtainers https://raw.githubusercontent.com/mfthomps/Labtainers/master/headless-lite/headless-labtainers.sh +- chmod a+x /home/labtainer/headless-labtainers/headless-labtainers.sh +- systemctl enable headless-labtainers.service +- docker pull labtainers/labtainer.master.headless +- docker pull labtainers/labtainer.base +- docker pull labtainers/labtainer.network +- docker pull labtainers/labtainer.firefox +- docker pull labtainers/labtainer.wireshark +- docker pull labtainers/labtainer.java +- docker pull labtainers/labtainer.centos +- docker pull labtainers/labtainer.lamp +- docker pull labtainers/labtainer.netmon +- docker pull labtainers/labtainer.tap +- docker pull labtainers/labtainer.base2 +- docker pull labtainers/labtainer.network2 +- docker pull labtainers/labtainer.wireshark2 +- docker pull labtainers/labtainer.network.ssh2 + +power_state: + mode: reboot diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/cloud_init.txt b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/cloud_init.txt new file mode 100644 index 000000000..1068bc9d5 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/cloud_init.txt @@ -0,0 +1,67 @@ +#cloud-config +# +# Cloud Config file for Headless Labtainers. Provisions docker, docker-compose and headless labtainers +# +# + +system_info: + default_user: + name: labtainer + sudo: ALL=(ALL) NOPASSWD:ALL + +packages: + - net-tools + +write_files: +- content: | +- content: | + [Unit] + Description=Headless Labtainers + + [Service] + Type=simple + WorkingDirectory=/home/labtainer/headless-labtainers + User=labtainer + ExecStart=/home/labtainer/headless-labtainers/headless-labtainers.sh + + [Install] + WantedBy=multi-user.target + Alias=headless-labtainers.service + path: /etc/systemd/system/headless-labtainers.service + +runcmd: +- apt install -y apt-transport-https ca-certificates curl software-properties-common +- curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - +- add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable" +- apt update +- cache policy docker-ce +- apt install -y docker-ce +- curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose +- chmod +x /usr/local/bin/docker-compose + +- usermod -aG docker labtainer +- usermod -aG sudo labtainer +- usermod -aG docker ubuntu + +- mkdir /home/labtainer/headless-labtainers +- chown labtainer:labtainer /home/labtainer/headless-labtainers +- wget -P /home/labtainer/headless-labtainers https://raw.githubusercontent.com/mfthomps/Labtainers/master/headless-lite/headless-labtainers.sh +- chmod a+x /home/labtainer/headless-labtainers/headless-labtainers.sh +- systemctl enable headless-labtainers.service +- docker pull labtainers/labtainer.master.headless +- docker pull labtainers/labtainer.base +- docker pull labtainers/labtainer.network +- docker pull labtainers/labtainer.firefox +- docker pull labtainers/labtainer.wireshark +- docker pull labtainers/labtainer.java +- docker pull labtainers/labtainer.centos +- docker pull labtainers/labtainer.lamp +- docker pull labtainers/labtainer.netmon +- docker pull labtainers/labtainer.tap +- docker pull labtainers/labtainer.base2 +- docker pull labtainers/labtainer.network2 +- docker pull labtainers/labtainer.wireshark2 +- docker pull labtainers/labtainer.network.ssh2 + +power_state: + mode: reboot diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/copy_to_blob.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/copy_to_blob.sh new file mode 100755 index 000000000..a6e86f62a --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/copy_to_blob.sh @@ -0,0 +1,39 @@ +#!/bin/bash +if [ "$#" -ne 1 ]; then + echo "copy_to_blob.sh " + exit +fi +user=$1 +# +# Assumes AZURE account env variables set using account_env.sh +# +#Provide the name of your resource group where managed disk is created +resourceGroupName=labtainerResources + +#Provide the managed disk name +# source name from snapshot +#diskName=base-labtainervm_OsDisk_1_462b1f978221433e86c2e82b98d1a076 +diskName=$(./get_disk_id.sh $user) + +#Provide Shared Access Signature (SAS) expiry duration in seconds e.g. 3600. +#Know more about SAS here: https://docs.microsoft.com/en-us/azure/storage/storage-dotnet-shared-access-signature-part-1 +sasExpiryDuration=3600 + +#Provide storage account name where you want to copy the underlying VHD file of the managed disk. +storageAccountName=labtainersblob + +#Name of the storage container where the downloaded VHD will be stored +storageContainerName=labtainersblobcontainer + + +#Provide the name of the destination VHD file to which the VHD of the managed disk will be copied. +destinationVHDFileName=labtainersbase.vhd + +#Generate the SAS for the managed disk +sas=$(az disk grant-access --resource-group $resourceGroupName --name $diskName --duration-in-seconds $sasExpiryDuration --query [accessSas] -o tsv) + +#Copy the VHD of the managed disk to the storage account +az storage blob copy start --destination-blob $destinationVHDFileName --destination-container $storageContainerName --source-uri $sas + +# check copy status +az storage blob show -n $destinationVHDFileName -c $storageContainerName diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/create_disk.ps1 b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/create_disk.ps1 new file mode 100755 index 000000000..af343fa72 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/create_disk.ps1 @@ -0,0 +1,6 @@ +If ($args.Count -ne 1){ + echo "create_disk.ps1 " + exit +} +$disk=$args[0] +az disk create -g labtainerResources -n $disk --source https://labtainersblob.blob.core.windows.net/labtainersblobcontainer/labtainersbase.vhd --output none diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/create_disk.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/create_disk.sh new file mode 100755 index 000000000..826946b21 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/create_disk.sh @@ -0,0 +1,7 @@ +#!/bin/bash +if [ "$#" -ne 1 ]; then + echo "create_disk.sh " + exit +fi +disk=$1 +az disk create -g labtainerResources -n $disk --source https://labtainersblob.blob.core.windows.net/labtainersblobcontainer/labtainersbase.vhd --output none diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/create_gallery.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/create_gallery.sh new file mode 100755 index 000000000..f159b7a7c --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/create_gallery.sh @@ -0,0 +1,18 @@ +location=westus +galleryName=labtainersGallery +resourceGroup=labtainersGalleryResources +publisherUri=https://github.com/mfthomps/Labtainers +publisherEmail=mfthomps@nps.edu +prefix=LabtainersImages +eulaLink=https://github.com/mfthomps/Labtainers + +az group create --name $resourceGroup --location $location + +az sig create \ + --gallery-name $galleryName \ + --permissions community \ + --resource-group $resourceGroup \ + --publisher-uri $publisherUri \ + --publisher-email $publisherEmail \ + --eula $eulaLink \ + --public-name-prefix $prefix diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/create_vm.ps1 b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/create_vm.ps1 new file mode 100644 index 000000000..3fc66469d --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/create_vm.ps1 @@ -0,0 +1,32 @@ +# +# Create an Azure VM for a student, assuming the user has +# an Azure account and the CLI installed. +# +# This will create an ssh key pair and use it when creating the VM +# +If ($args.Count -ne 1){ + echo "checktunnel.sh " + exit +} +$ErrorActionPreference = "Stop" +$user_id=$args[0] +$vm_name=$user_id+"-labtainervm" +Remove-Item $HOME/.ssh/id_labtainers* +ssh-keygen -b 2048 -t rsa -f $HOME/.ssh/id_labtainers -q -N '""' +echo "key generated" +copy cloud_init.template cloud_init.txt +./resourcecheck.ps1 +echo "Creating Azure VM $vm_name for $user_id" +az vm create ` + --public-ip-sku Standard ` + --resource-group labtainerResources ` + --name $vm_name ` + --image UbuntuLTS ` + --admin-username labtainer ` + --nic-delete-option delete ` + --generate-ssh-keys ` + --ssh-key-values ~/.ssh/id_labtainers.pub ` + --custom-data cloud_init.txt > $user_id.json + +./waitdone.ps1 $user_id + diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/create_vm.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/create_vm.sh new file mode 100755 index 000000000..ac7b739e8 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/create_vm.sh @@ -0,0 +1,33 @@ +#!/bin/bash +# +# Create an Azure VM for a student, assuming the user has +# an Azure account and the CLI installed. +# +# This will create an ssh key pair and use it when creating the VM +# +if [ "$#" -ne 1 ]; then + echo "create_vm.sh " + exit +fi +user_id=$1 +vm_name=$user_id-labtainervm +rm -f ~/.ssh/id_labtainers* +ssh-keygen -b 2048 -t rsa -f ~/.ssh/id_labtainers -q -N "" +key=$(cat ~/.ssh/id_labtainers.pub) +echo "key generated" +cp cloud_init.template cloud_init.txt +./resourcecheck.sh || exit 1 +imgdef="/CommunityGalleries/LabtainersImages-fb345820-6f7a-4fbf-b106-7d50e3b601f2/Images/labtainersImageDefinition/Versions/latest" +echo "Creating Azure VM $vm_name for $user_id" +az vm create \ + --resource-group labtainerResources \ + --name $vm_name \ + --image $imgdef \ + --size Standard_B2s \ + --admin-username labtainer \ + --generate-ssh-keys \ + --verbose \ + --accept-term \ + --ssh-key-values ~/.ssh/id_labtainers.pub + +./waitdone.sh $user_id diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/deallocate_vm.ps1 b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/deallocate_vm.ps1 new file mode 100644 index 000000000..98a9d2708 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/deallocate_vm.ps1 @@ -0,0 +1,8 @@ +If ($args.Count -ne 1){ + echo "deallocate_vm.ps1 " + exit +} +$user=$args[0] +$vm=$user+"-labtainervm" +az vm deallocate -g labtainerResources -n $vm +echo "VM $vm has been deallocated" diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/deallocate_vm.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/deallocate_vm.sh new file mode 100755 index 000000000..a4d31b580 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/deallocate_vm.sh @@ -0,0 +1,10 @@ +#!/bin/bash +echo "in deallocate_vm" +if [ "$#" -ne 1 ]; then + echo "deallocate_vm.sh " + exit +fi +user=$1 +vm=$user-labtainervm +az vm deallocate -g labtainerResources -n $vm +echo "VM $vm has been deallocated" diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/delete_all.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/delete_all.sh new file mode 100755 index 000000000..29b8b1f5e --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/delete_all.sh @@ -0,0 +1 @@ +az vm delete --yes --ids $(az vm list -g labtainerResources --query "[].id" -o tsv) diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/delete_blob.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/delete_blob.sh new file mode 100755 index 000000000..c35d999a6 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/delete_blob.sh @@ -0,0 +1,7 @@ + +storageAccountName=labtainersblob + +#Name of the storage container where the downloaded VHD will be stored +storageContainerName=labtainersblobcontainer +destinationVHDFileName=labtainersbase.vhd +az storage blob delete -c $storageContainerName -n $destinationVHDFileName diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/delete_disk.ps1 b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/delete_disk.ps1 new file mode 100755 index 000000000..f3caab728 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/delete_disk.ps1 @@ -0,0 +1,8 @@ +If ($args.Count -ne 1){ + echo "delete_disk.ps1 " + exit +} +$ErrorActionPreference = "Stop" +$user_id=$args[0] +$disk=$user_id+"-labtainervm-disk" +az disk delete --yes -g labtainerResources -n $disk diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/delete_disk.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/delete_disk.sh new file mode 100755 index 000000000..d7a4b85f5 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/delete_disk.sh @@ -0,0 +1,8 @@ +#!/bin/bash +if [ "$#" -ne 1 ]; then + echo "delete_disk.sh " + exit +fi +user_id=$1 +disk=$user_id-labtainervm-disk +az disk delete --yes -g labtainerResources -n $disk diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/delete_resource_goup.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/delete_resource_goup.sh new file mode 100644 index 000000000..510e2cc70 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/delete_resource_goup.sh @@ -0,0 +1 @@ +az group delete --name labtainerResources diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/delete_vm.ps1 b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/delete_vm.ps1 new file mode 100644 index 000000000..ce33ee5bb --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/delete_vm.ps1 @@ -0,0 +1,9 @@ +If ($args.Count -ne 1){ + echo "delete_vm.ps1 " + exit +} +$user=$args[0] +$vm=$user+"-labtainervm" +az vm delete --yes -g labtainerResources -n $vm +./delete_disk.sh $user +echo "VM $vm has been deleted" diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/delete_vm.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/delete_vm.sh new file mode 100755 index 000000000..a8b691405 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/delete_vm.sh @@ -0,0 +1,11 @@ +#!/bin/bash +echo "in delete_vm" +if [ "$#" -ne 1 ]; then + echo "delete_vm.sh " + exit +fi +user=$1 +vm=$user-labtainervm +az vm delete --yes -g labtainerResources -n $vm +./delete_disk.sh $user +echo "VM $vm has been deleted" diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/do_newterm.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/do_newterm.sh new file mode 100755 index 000000000..00354987a --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/do_newterm.sh @@ -0,0 +1,4 @@ +#!/bin/bash +con=$(echo labtainer | sudo -S docker ps | grep entry | awk '{print $1}') +echo "con is $con" +echo labtainer | sudo -S docker exec $con /bin/bash -c 'export LABTAINER_DIR=/home/labtainer/labtainer/trunk;/home/labtainer/.doterm.sh' diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/dotunnel.bat b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/dotunnel.bat new file mode 100644 index 000000000..39bcd7a8d --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/dotunnel.bat @@ -0,0 +1,3 @@ +set fname=%1 +set ip=%2 +Start ssh -fN -L 6901:127.0.0.1:6901 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o "ServerAliveInterval 60" -i %fname% labtainer@%ip% diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/generalize.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/generalize.sh new file mode 100755 index 000000000..be4bf477d --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/generalize.sh @@ -0,0 +1,16 @@ + +#!/bin/bash +if [ "$#" -ne 1 ]; then + echo "generalize.sh " + exit +fi +user=$1 +vm=$user-labtainervm +ip=$(./getip.sh labtainerResources $vm) +if [[ $ip == "FAIL" ]]; then + echo "Failed to get ip of $vm" + exit 1 +fi +ssh -i "~/.ssh/id_labtainers" -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null labtainer@$ip "sudo waagent -deprovision" +./deallocate_vm.sh $user +az vm generalize --resource-group labtainerResources --name $vm diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/get_disk_id.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/get_disk_id.sh new file mode 100755 index 000000000..2cbdcd8f4 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/get_disk_id.sh @@ -0,0 +1,15 @@ +#!/bin/bash +if [ "$#" -ne 1 ]; then + echo "get_disk_id.sh " + exit +fi +user=$1 +vm=$user-labtainervm +osDiskId=$(az vm show \ + -g labtainerResources \ + -n $vm \ + --query "storageProfile.osDisk.managedDisk.id" \ + -o tsv) + +dbase=$(basename $osDiskId) +echo $dbase diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/get_headless.ps1 b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/get_headless.ps1 new file mode 100755 index 000000000..5670085cf --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/get_headless.ps1 @@ -0,0 +1,10 @@ +If ($args.Count -ne 1){ + echo "update_user.ps1 " + exit +} +$ErrorActionPreference = "Stop" +$user_id=$args[0] +$vm_name=$user_id+"-labtainervm" +$ip=./getip.ps1 labtainerResources $vm_name +ssh -i "$HOME/.ssh/id_labtainers" -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null labtainer@$ip "mkdir headless_labtainers;cd headless_labtainers;wget -P /home/labtainer/headless-labtainers https://raw.githubusercontent.com/mfthomps/Labtainers/master/headless-lite/headless-labtainers.sh;chmod a+x /home/labtainer/headless-labtainers/headless-labtainers.sh;sudo usermod -aG docker labtainer;sudo systemctl restart headless-labtainers.service;" + diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/get_headless.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/get_headless.sh new file mode 100755 index 000000000..b01b21950 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/get_headless.sh @@ -0,0 +1,14 @@ +#!/bin/bash +if [ "$#" -ne 1 ]; then + echo "get_headless.sh " + exit +fi +user=$1 +vm=$user-labtainervm +ip=$(./getip.sh labtainerResources $vm) +if [[ $ip == "FAIL" ]]; then + echo "Failed to get ip of $vm" + exit 1 +fi + +ssh -i "~/.ssh/id_labtainers" -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null labtainer@$ip "mkdir headless_labtainers;cd headless_labtainers;wget -P /home/labtainer/headless-labtainers https://raw.githubusercontent.com/mfthomps/Labtainers/master/headless-lite/headless-labtainers.sh;chmod a+x /home/labtainer/headless-labtainers/headless-labtainers.sh;sudo usermod -aG docker labtainer;sudo systemctl restart headless-labtainers.service;" diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/get_results.ps1 b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/get_results.ps1 new file mode 100755 index 000000000..27609aad8 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/get_results.ps1 @@ -0,0 +1,18 @@ +If ($args.Count -ne 1){ + echo "get_results.ps1 " + exit +} +$user=$args[0] +$vm=$user+"-labtainervm" +echo "Retrieving Labtainer results from $vm" +if (-not(test-path $HOME/labtainer_xfer)){ + mkdir -p $HOME/labtainer_xfer +} +$ip=./getip.ps1 labtainerResources $vm +if ($ip -eq "FAIL" ){ + echo "Failed to get ip of $vm" + exit 1 +} +echo "ip is $ip" +scp -i "$HOME/.ssh/id_labtainers" -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -r labtainer@"$ip":/home/labtainer/headless-labtainers/labtainer_xfer/* $HOME/labtainer_xfer/ +echo "Results stored in $HOME/labtainer_xfer" diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/get_results.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/get_results.sh new file mode 100755 index 000000000..8b47ad15f --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/get_results.sh @@ -0,0 +1,17 @@ +#!/bin/bash +if [ "$#" -ne 1 ]; then + echo "get_results.sh " + exit +fi +user=$1 +vm=$user-labtainervm +echo "Retrieving Labtainer results from $vm" +mkdir -p ~/labtainer_xfer +ip=$(./getip.sh labtainerResources $vm) +if [[ $ip == "FAIL" ]]; then + echo "Failed to get ip of $vm" + exit 1 +fi +scp -i "~/.ssh/id_labtainers" -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -r labtainer@$ip:~/headless-labtainers/labtainer_xfer/* ~/labtainer_xfer/ +echo "Results stored in $HOME/labtainer_xfer" + diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/getip.ps1 b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/getip.ps1 new file mode 100644 index 000000000..48318a660 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/getip.ps1 @@ -0,0 +1,9 @@ +$resource=$args[0] +$vm=$args[1] +$result=az vm show -d -g $resource -n $vm --query publicIps -o tsv +If ($result -eq $null){ + echo "FAIL" +}else{ + echo $result + echo $result > myip.txt +} diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/getip.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/getip.sh new file mode 100755 index 000000000..8151d1302 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/getip.sh @@ -0,0 +1,10 @@ +#!/bin/bash +resource=$1 +vm=$2 +result=$(az vm show -d -g $resource -n $vm --query publicIps -o tsv) +if [ -z "${result}" ]; then + echo "FAIL" +else + echo $result + echo $result > myip.txt +fi diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/image_create.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/image_create.sh new file mode 100755 index 000000000..d5dcd3e03 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/image_create.sh @@ -0,0 +1,9 @@ +galleryName=labtainersGallery +resourceGroup=labtainersGalleryResources +imageDefinition=labtainersImageDefinition +az sig image-version create \ + --resource-group $resourceGroup \ + --gallery-name $galleryName \ + --gallery-image-definition $imageDefinition \ + --gallery-image-version 1.0.0 \ + --virtual-machine "/subscriptions/4747feb2-6851-42cd-9ccf-e07f7fcb6560/resourceGroups/LABTAINERRESOURCES/providers/Microsoft.Compute/virtualMachines/base-labtainervm" diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/image_def.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/image_def.sh new file mode 100755 index 000000000..25345241e --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/image_def.sh @@ -0,0 +1,12 @@ +galleryName=labtainersGallery +resourceGroup=labtainersGalleryResources +imageDefinition=labtainersImageDefinition +az sig image-definition create \ + --resource-group $resourceGroup \ + --gallery-name $galleryName \ + --gallery-image-definition $imageDefinition \ + --publisher labtainers \ + --offer myOffer \ + --sku labtainersImage \ + --os-type Linux \ + --os-state generalized diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/install_labtainers.ps1 b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/install_labtainers.ps1 new file mode 100644 index 000000000..9ce0e54df --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/install_labtainers.ps1 @@ -0,0 +1,13 @@ +$azdir = "$HOME\labtainers_azure" +if(-Not test-path $azdir){ + mkdir -p "$azdir" +} +cd "$azdir" +wget https://github.com/mfthomps/Labtainers/releases/latest/download/azure.tar -OutFile $env:TEMP\azure.tar +tar -xf $env:TEMP\azure.tar +echo "" +echo "Labtainers for Azure scripts installed in $azdir" +echo "cd to that directory and run ./create_vm.ps1, passsing in a user name, e.g., " +echo " ./create_vm.ps1 myname" +echo "" + diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/install_labtainers.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/install_labtainers.sh new file mode 100755 index 000000000..5f159e693 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/install_labtainers.sh @@ -0,0 +1,12 @@ +#!/bin/bash +azdir=$HOME/labtainers_azure +mkdir -p "$azdir" +cd "$azdir" +curl -L https://github.com/mfthomps/Labtainers/releases/latest/download/azure.tar --output /tmp/azure.tar +tar -xf /tmp/azure.tar +echo "" +echo "Labtainers for Azure scripts installed in $azdir" +echo "cd to that directory and run ./create_vm.sh, passsing in a user name, e.g., " +echo " ./create_vm.sh myname" +echo "" + diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/list-gallery.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/list-gallery.sh new file mode 100644 index 000000000..47b895b33 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/list-gallery.sh @@ -0,0 +1 @@ +az sig image-definition list-community --public-gallery-name LabtainersImages-fb345820-6f7a-4fbf-b106-7d50e3b601f2 --location "westus" diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/newterm.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/newterm.sh new file mode 100755 index 000000000..583c97d2d --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/newterm.sh @@ -0,0 +1,16 @@ +#!/bin/bash +if [ "$#" -ne 1 ]; then + echo "newterm.sh " + echo "Create a new terminal on the VNC desktop." + exit +fi +user=$1 +vm=$user-labtainervm +echo "get the IP" +ip=$(./getip.sh labtainerResources $vm) +if [[ $ip == "FAIL" ]]; then + echo "Failed to get ip of $vm" + exit 1 +fi +scp do_newterm.sh labtainer@$ip:/tmp/ +ssh labtainer@$ip /tmp/do_newterm.sh diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/resourcecheck.ps1 b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/resourcecheck.ps1 new file mode 100644 index 000000000..2c0bcf9e7 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/resourcecheck.ps1 @@ -0,0 +1,6 @@ +$result=az group list | findstr labtainerResources +If ($result -eq $null){ + az group create -l westus3 -n labtainerResources --output none +}else{ + echo "Labtainer resource group exists." +} diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/resourcecheck.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/resourcecheck.sh new file mode 100755 index 000000000..6765cad5c --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/resourcecheck.sh @@ -0,0 +1,8 @@ +#!/bin/bash +result=$(az group list | grep labtainerResources) +if [ -z "${result}" ]; then + echo "Creating Labtainer resource group." + az group create -l westus3 -n labtainerResources --output none || exit 1 +else + echo "Labtainer resource group exists." +fi diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/restart.ps1 b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/restart.ps1 new file mode 100755 index 000000000..72c6feabf --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/restart.ps1 @@ -0,0 +1,8 @@ +If ($args.Count -ne 1){ + echo "delete_vm.ps1 " + exit +} +$ErrorActionPreference = "Stop" +$user=$args[0] +./checktunnel.sh $user +echo "Point your browser to http://localhost:6901" diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/restart.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/restart.sh new file mode 100755 index 000000000..d5826775c --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/restart.sh @@ -0,0 +1,8 @@ +#!/bin/bash +if [ "$#" -ne 1 ]; then + echo "restart.sh " + exit +fi +user=$1 +./checktunnel.sh $user || exit 1 +echo "Point your browser to http://localhost:6901" diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/restore_vm.ps1 b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/restore_vm.ps1 new file mode 100644 index 000000000..0b198b895 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/restore_vm.ps1 @@ -0,0 +1,9 @@ +If ($args.Count -ne 1){ + echo "restore_vm.ps1 " + exit +} +$user=$args[0] +$vm=$user+"-labtainervm" +az vm start -g labtainerResources -n $vm +Start-Sleep -s 2 +./waitdone.ps1 $user_id diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/restore_vm.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/restore_vm.sh new file mode 100755 index 000000000..2b15dfe0e --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/restore_vm.sh @@ -0,0 +1,11 @@ +#!/bin/bash +echo "in restore_vm.sh" +if [ "$#" -ne 1 ]; then + echo "restore_vm.sh " + exit +fi +user=$1 +vm=$user-labtainervm +az vm start -g labtainerResources -n $vm +sleep 2 +./waitweb.sh $user diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/share_gallery.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/share_gallery.sh new file mode 100755 index 000000000..cb44a6955 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/share_gallery.sh @@ -0,0 +1,3 @@ +galleryName=labtainersGallery +resourceGroup=labtainersGalleryResources +az sig share enable-community --gallery-name $galleryName --resource-group $resourceGroup diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/snapshot_disk.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/snapshot_disk.sh new file mode 100755 index 000000000..c4ad9164f --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/snapshot_disk.sh @@ -0,0 +1,18 @@ +#!/bin/bash +if [ "$#" -ne 1 ]; then + echo "get_disk_id.sh " + exit +fi +user=$1 +vm=$user-labtainervm +osDiskId=$(az vm show \ + -g labtainerResources \ + -n $vm \ + --query "storageProfile.osDisk.managedDisk.id" \ + -o tsv) + +snapname=$vm-snapshot +az snapshot create \ + --resource-group labtainerResources \ + --source "$osDiskId" \ + --name $snapname diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/stop_vm.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/stop_vm.sh new file mode 100755 index 000000000..9800c9faf --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/stop_vm.sh @@ -0,0 +1,9 @@ +#!/bin/bash +if [ "$#" -ne 1 ]; then + echo "stop.sh " + exit +fi +user=$1 +vm=$user-labtainervm +az vm stop -g labtainerResources -n $vm +echo "VM $vm has been stopoed." diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/update_user.ps1 b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/update_user.ps1 new file mode 100755 index 000000000..893f5feb9 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/update_user.ps1 @@ -0,0 +1,13 @@ +If ($args.Count -ne 1){ + echo "update_user.ps1 " + exit +} +$ErrorActionPreference = "Stop" +$user_id=$args[0] +$vm_name=$user_id+"-labtainervm" +if (-not(test-path $HOME/.ssh/id_labtainers)){ + ssh-keygen -b 2048 -t rsa -f $HOME/.ssh/id_labtainers -q -N '""' +} +$key = Get-Content $HOME/.ssh/id_labtainers.pub -Raw +echo "key is $key" +az vm user update -u labtainer -n $vm_name -g labtainerResources --output none --ssh-key-value "$key" diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/update_user.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/update_user.sh new file mode 100755 index 000000000..28db3559e --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/update_user.sh @@ -0,0 +1,10 @@ +if [ "$#" -ne 1 ]; then + echo "create_vm.sh " + exit +fi +user_id=$1 +vm_name=$user_id-labtainervm +if [ ! -f ~/.ssh/id_labtainers ]; then + ssh-keygen -b 2048 -t rsa -f ~/.ssh/id_labtainers -q -N "" +fi +az vm user update -u labtainer --ssh-key-value "$(< ~/.ssh/id_labtainers.pub)" -n $vm_name -g labtainerResources --output none diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/wait_tunnel.ps1 b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/wait_tunnel.ps1 new file mode 100644 index 000000000..7bfb06ce4 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/wait_tunnel.ps1 @@ -0,0 +1,17 @@ +If ($args.Count -ne 1){ + echo "wait_tunnel.ps1 " + exit +} +$user=$args[0] +$vm=$user+"-labtainervm" +Write-Host -NoNewLine "Waiting for VM to provision and reboot. This may take a few minutes..." +while($true){ + $result=netstat -an | findstr 6901 + If ($result -eq $null){ + echo "gone" + exit + }else{ + Write-Host -NoNewLine "." + Start-Sleep -s 5 + } +} diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/wait_tunnel.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/wait_tunnel.sh new file mode 100755 index 000000000..1bc9a8186 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/wait_tunnel.sh @@ -0,0 +1,19 @@ +#!/bin/bash +if [ "$#" -ne 1 ]; then + echo "wait_tunnel.sh " + exit +fi +user=$1 +vm=$user-labtainervm +echo -n "Waiting for VM to provision and reboot. This may take a few minutes..." +while : +do + result=$(ps aux | grep ssh | grep 6901) + if [ -z "${result}" ]; then + echo "gone" + exit + else + echo -n "." + sleep 20 + fi +done diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/waitdone.ps1 b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/waitdone.ps1 new file mode 100644 index 000000000..79463c4c1 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/waitdone.ps1 @@ -0,0 +1,14 @@ +If ($args.Count -ne 1){ + echo "waitdone.ps1 " + exit +} +$user=$args[0] +# start the tunnel and wait for it to die, reflecting reboot. +echo "start the tunnel" +Start-Sleep -s 5 +./checktunnel.ps1 $user +Start-Sleep -s 5 +./wait_tunnel.ps1 $user +echo "Tunnel gone, wait 20 for reboot" +Start-Sleep -s 20 +./waitweb.ps1 $user diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/waitdone.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/waitdone.sh new file mode 100755 index 000000000..2db3ed8c8 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/waitdone.sh @@ -0,0 +1,19 @@ +#!/bin/bash +if [ "$#" -ne 1 ]; then + echo "waitdone.sh " + exit +fi +user=$1 +./checktunnel.sh $user || exit 1 +rm -f index.html +echo "Waiting for remote Labtainers to become available. Please be patient." +while : +do + curl localhost:6901 --output index.html -s + if [ -f index.html ]; then + echo "Web server is up." + break + fi + sleep 20 +done +echo "Labtainers is up. Point a browser to http://localhost:6901" diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/waitdone2.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/waitdone2.sh new file mode 100755 index 000000000..1cce35681 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/waitdone2.sh @@ -0,0 +1,19 @@ +#!/bin/bash +# +# Used to create base VM. First waits for VM to die, reflecting that +# it has completed provisioning and has rebooted. Then waits for +# it to come back up. +# +if [ "$#" -ne 1 ]; then + echo "waitdone.sh " + exit +fi +user=$1 +# start the tunnel and wait for it to die, reflecting reboot. +echo "start the tunnel" +./checktunnel.sh $user || exit 1 +./wait_tunnel.sh $user || exit 1 +echo "Tunnel gone, wait 20 for reboot" +sleep 20 +./checktunnel.sh $user || exit 1 +./waitweb.sh $user diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/waitweb.ps1 b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/waitweb.ps1 new file mode 100755 index 000000000..f32475f14 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/waitweb.ps1 @@ -0,0 +1,23 @@ +If ($args.Count -ne 1){ + echo "waitweb.ps1 " + exit +} +$ErrorActionPreference = "Stop" +$user_id=$args[0] +$vm_name=$user_id+"-labtainervm" +echo "start the tunnel" +./checktunnel.ps1 $user_id +if(test-path index.html){ + remove-item index.html +} +Write-Host -NoNewLine "Waiting for remote Labtainers to become available..." +while($true){ + try{Invoke-WebRequest -Uri http://localhost:6901 -OutFile index.html} + catch{Write-Host -NoNewLine "."} + if (test-path index.html){ + echo "Web server is up." + break + } + Start-Sleep -s 20 +} +echo "Labtainers is up. Point browser to localhost:6901" diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/azure/waitweb.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/waitweb.sh new file mode 100755 index 000000000..95cd65990 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/azure/waitweb.sh @@ -0,0 +1,22 @@ +#!/bin/bash +if [ "$#" -ne 1 ]; then + echo "waitweb.sh " + exit +fi +user=$1 +echo "start the tunnel" +./checktunnel.sh $user || exit 1 +rm -f index.html +echo -n "Waiting for remote Labtainers to become available..." +while : +do + curl localhost:6901 --output index.html -s + if [ -f index.html ]; then + echo "" + echo "Web server is up." + break + fi + echo -n "." + sleep 5 +done +echo "Labtainers is up. Point a browser to http://localhost:6901" diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/config/gnome-terminal-profiles.dconf b/modules/utilities/unix/labtainers/files/Labtainers-master/config/gnome-terminal-profiles.dconf new file mode 100644 index 000000000..ed9176637 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/config/gnome-terminal-profiles.dconf @@ -0,0 +1,8 @@ +[/] +list=['b1dcc9dd-5262-4d8d-a863-c897e6d979b9', 'a6cfe45a-ac79-407b-9f30-b9d0dee71b79'] + +[:a6cfe45a-ac79-407b-9f30-b9d0dee71b79] +background-color='rgb(238,238,236)' +foreground-color='rgb(46,52,54)' +use-theme-colors=false +visible-name='labtainers' diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/config/labtainer.config b/modules/utilities/unix/labtainers/files/Labtainers-master/config/labtainer.config index 0123f9535..976a47682 100644 --- a/modules/utilities/unix/labtainers/files/Labtainers-master/config/labtainer.config +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/config/labtainer.config @@ -36,5 +36,6 @@ GLOBAL_SETTINGS CONSOLE_LOG_LEVEL WARNING # An alternate apt/sources.list hostname. Default is archive.ubuntu.com #APT_SOURCE mirror.picosecond.org - DEFAULT_REGISTRY mfthomps + DEFAULT_REGISTRY labtainers TEST_REGISTRY testregistry:5000 + LEGACY_REGISTRY mfthomps diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/config/registry.config b/modules/utilities/unix/labtainers/files/Labtainers-master/config/registry.config new file mode 100644 index 000000000..85ed16339 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/config/registry.config @@ -0,0 +1,10 @@ +# +# Map git branches to local test registry port numbers. +# NOTE: the premaster port must match that in the labtainer.config file. +# +premaster 5000 +none 5001 +imodule 5002 +gns3 5003 +none 5004 +none 5005 diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/LabtainerBase.py b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/LabtainerBase.py new file mode 100644 index 000000000..f578e670f --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/LabtainerBase.py @@ -0,0 +1,59 @@ +''' +This software was created by United States Government employees at +The Center for Cybersecurity and Cyber Operations (C3O) +at the Naval Postgraduate School NPS. Please note that within the +United States, copyright protection is not available for any works +created by United States Government employees, pursuant to Title 17 +United States Code Section 105. This software is in the public +domain and is not subject to copyright. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +''' +''' +Utilities for managing Labtainer bases +''' +import os +def getBaseList(skip_exempt=True): + retval = [] + labtainer_dir= os.getenv('LABTAINER_DIR') + if labtainer_dir is None: + print('LABTAINER_DIR not defined, exiting') + exit(1) + designer_path = os.path.join(labtainer_dir,'scripts','designer') + dfile = os.path.join(designer_path, 'base_dockerfiles') + base_list = os.listdir(dfile) + + exempt_file = os.path.join(designer_path, 'bin', 'exempt.txt') + exempt_list = [] + with open(exempt_file) as fh: + for line in fh: + exempt_list.append(line.strip()) + for base in base_list: + if base.startswith('Dockerfile'): + full = os.path.join(dfile, base) + + image_name = base.split('.',1)[1] + image_ext = image_name.split('.',1)[1] + #print(image_name) + if not skip_exempt or image_name not in exempt_list: + retval.append(image_name) + return retval + diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/check_tag.py b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/check_tag.py index 84b8c9017..8e432347f 100755 --- a/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/check_tag.py +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/check_tag.py @@ -1,4 +1,33 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 +''' +This software was created by United States Government employees at +The Center for Cybersecurity and Cyber Operations (C3O) +at the Naval Postgraduate School NPS. Please note that within the +United States, copyright protection is not available for any works +created by United States Government employees, pursuant to Title 17 +United States Code Section 105. This software is in the public +domain and is not subject to copyright. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +''' import os import sys import argparse @@ -41,7 +70,7 @@ def do_lab(lab_dir, lab, role, registry): if not base.startswith(image_base): cmd = './relabel.sh %s %s %s %s %s' % (registry, framework_version , image, image_base, base_id) print("MISMATCH") - print cmd + print(cmd) os.system(cmd) diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/cloneOrPull.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/cloneOrPull.sh new file mode 100755 index 000000000..ffc9a4172 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/cloneOrPull.sh @@ -0,0 +1,11 @@ +#!/bin/bash +if [[ ! -d Labtainers ]]; then + git clone https://github.com/mfthomps/Labtainers.git + cd Labtainers +else + cd Labtainers + # avoid conflicts + git checkout README.md + git pull +fi +git checkout premaster diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/cloneSimlab.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/cloneSimlab.sh new file mode 100755 index 000000000..8fcc82060 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/cloneSimlab.sh @@ -0,0 +1,16 @@ +#!/bin/bash +# +# Clone or pull latest SimLab +# +cd $LABTAINER_DIR +cd ../ +echo "in $(pwd)" +if [[ ! -d Labtainers-simlab ]]; then + echo "Labtainers-simlab does not exist, clone it" + git clone https://gitlab.nps.edu/mfthomps/Labtainers-simlab.git + ln -s Labtainers-simlab/simlab + cd simlab +else + cd simlab + git pull +fi diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/cpall2test.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/cpall2test.sh new file mode 100755 index 000000000..7b7919ae3 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/cpall2test.sh @@ -0,0 +1,13 @@ +#!/bin/bash +# +# copy the labtainer distribution tars to all the test vm directories +# Intended for ad-hoc testing. Normally, copy done as part of per-vm test suite +# +tlist="labtainer.tar labtainer-master.tar labtainer-tests.tar" +dlist=$(ls /media/sf_SEED/test_vms) +for d in $dlist; do + mkdir -p /media/sf_SEED/test_vms/$d + for t in $tlist; do + cp /media/sf_SEED/$t /media/sf_SEED/test_vms/$d/ + done +done diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/fix-git-dates.py b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/fix-git-dates.py index b01878c76..2d3a3bc78 100755 --- a/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/fix-git-dates.py +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/fix-git-dates.py @@ -1,10 +1,42 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 +''' +This software was created by United States Government employees at +The Center for Cybersecurity and Cyber Operations (C3O) +at the Naval Postgraduate School NPS. Please note that within the +United States, copyright protection is not available for any works +created by United States Government employees, pursuant to Title 17 +United States Code Section 105. This software is in the public +domain and is not subject to copyright. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +''' import subprocess, shlex import sys, os.path import logging as logger import argparse import time +from dateutil import parser +from dateutil.parser import parse +from datetime import datetime + parser = argparse.ArgumentParser( description='Use git archive and file times from the current repo to' @@ -21,6 +53,8 @@ parser.add_argument('pathspec', parser.add_argument('dist_path', help='directory of distribution tree') +parser.add_argument('branch', help='branch of the repo') + args = parser.parse_args() logger.basicConfig(level=logger.DEBUG if args.verbose else logger.ERROR, format='%(levelname)s:\t%(message)s') @@ -28,7 +62,7 @@ logger.basicConfig(level=logger.DEBUG if args.verbose else logger.ERROR, # Find repo's top level. try: workdir = os.path.abspath(subprocess.check_output(shlex.split( - 'git rev-parse --show-toplevel')).strip()) + 'git rev-parse --show-toplevel')).strip()).decode('utf-8') except subprocess.CalledProcessError as e: sys.exit(e.returncode) @@ -53,17 +87,30 @@ elif os.path.isdir(path): def fixtimes(filelist, dist_path, pathspec, workdir): + #print('fix times') for f in filelist: source = os.path.join(workdir, f) dest = os.path.join(dist_path, f) if os.path.isfile(dest): - mtime = int(os.path.getmtime(source)) - os.utime(dest, (mtime, mtime)) + #cmd = 'git log -1 --format="%%ad" %s' % source + cmd = 'git log -1 --format="%%at" %s' % source + child = subprocess.Popen(shlex.split(cmd), stdout=subprocess.PIPE, stderr=subprocess.PIPE) + output = child.communicate() + if len(output[0].decode('utf-8').strip()) > 0: + ts_string = output[0].decode('utf-8').strip() + parts = ts_string.split('.') + df_ts = int(parts[0]) + else: + print('No git log output from %s' % cmd) + exit(1) + + #mtime = int(os.path.getmtime(source)) + os.utime(dest, (df_ts, df_ts)) if args.pathspec.strip() == './': - cmd = 'git archive master | tar -x -C %s' % (args.dist_path) + cmd = 'git archive %s | tar -x -C %s' % (args.branch, args.dist_path) else: - cmd = 'git archive master %s | tar -x -C %s' % (args.pathspec, args.dist_path) + cmd = 'git archive %s %s | tar -x -C %s' % (args.branch, args.pathspec, args.dist_path) os.system(cmd) fixtimes(filelist, args.dist_path, args.pathspec, workdir) diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/full_build.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/full_build.sh new file mode 100755 index 000000000..abeaae314 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/full_build.sh @@ -0,0 +1,71 @@ +#!/bin/bash +# +# Perform all build steps needed to run tests, then start smoketests. +# NOTE: this script assumes pulls from github. +# +if [[ -z "$LABTAINER_DIR" ]]; then + export LABTAINER_DIR=/home/mike/git/Labtainers +fi +cd $LABTAINER_DIR/distrib +branch=$(git rev-parse --abbrev-ref HEAD) +if [[ "$branch" == "master" ]]; then + echo "Do not full_build as the master branch." + exit 1 +fi +git pull || exit 1 +./mkall.sh -q +result=$? +if [[ $result != 0 ]]; then + echo "mkall failed" + exit 1 +fi +# +# Clone local repo -- TBD do all building from same instance? +# +ddir=/tmp/labtainer-distrib +ldir=$ddir/labtainer +rm -fr $ldir +ltrunk=$ldir/trunk +mkdir -p $ltrunk +cd ../ +git archive $branch --prefix premaster/ -o distrib/labtainer-master.tar +cp distrib/labtainer-master.tar /media/sf_SEED/ +git clone --single-branch --branch $branch $LABTAINER_DIR $ltrunk + +# +# switch LABTAINER_DIR to new copy of repo +# +export LABTAINER_DIR=$ltrunk +# +# +cd $LABTAINER_DIR/distrib +# force current branch regsitry to match premaster +if [[ $branch != 'premaster' ]]; then + echo "Refresh the branch registry" + ./refresh_branch.py -q + result=$? + if [[ $result != 0 ]]; then + echo "refresh_branch failed" + exit 1 + fi +fi +#cd $LABTAINER_DIR/scripts/designer/bin +#echo "running mkbases from $LABTAINER_DIR" +#./mkbases.py +#result=$? +#if [[ $result != 0 ]]; then +# echo "mkbases failed" +# exit 1 +#fi +cd $LABTAINER_DIR/distrib +echo "Now rebuild lab images as needed and publish to branch registry" +./publish.py -q +result=$? +if [[ $result != 0 ]]; then + echo "publish failed" + exit 1 +fi +cd $LABTAINER_DIR/testsets/bin +./testVMs.sh +#./test-ubuntu16.sh +#./test-ubuntu18.sh diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/get_reg_dates.py b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/get_reg_dates.py new file mode 100755 index 000000000..e3009a34f --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/get_reg_dates.py @@ -0,0 +1,84 @@ +#!/usr/bin/python3 +import argparse +import os +import sys +import subprocess +sys.path.append('../scripts/labtainer-student/bin') +import LabtainerLogging +import labutils +import registry +import InspectLocalReg +import ParseLabtainerConfig +import InspectRemoteReg + +def getDates(image, reg, lab, logger): + if reg == 'mfthomps': + with_reg = '%s/%s' % (reg, image) + created, user, version, tag = InspectRemoteReg.inspectRemote(with_reg, logger, no_pull=True) + else: + created, user, version, tag, base = InspectLocalReg.inspectLocal(image, logger, reg, no_pull=True) + + if created is not None: + print('%s %s %s' % (lab, image, created)) + +def doLab(lab_dir, lab, role, reg, logger): + ''' use dockerfiles to determine the set of containers ''' + docker_dir = os.path.join(lab_dir, lab, 'dockerfiles') + if not os.path.isdir(docker_dir): + return + df_list = [f for f in os.listdir(docker_dir) if os.path.isfile(os.path.join(docker_dir, f))] + for df in df_list: + if df.endswith('.swp'): + continue + try: + parts = df.split('.') + image = '%s.%s.%s' % (parts[1], parts[2], role) + container = parts[2] + except: + print('could not get image from %s' % df); + continue + getDates(image, reg, lab, logger) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description='Retrieve creation dates of lab images.') + parser.add_argument('-l', '--lab', action='store', help='Get dates for just this lab') + parser.add_argument('-p', '--premaster', action='store_true', default=False, help='Get dates from premaster') + parser.add_argument('-d', '--dockerhub', action='store_true', default=False, help='Get dates from dockerhub') + args = parser.parse_args() + src_path = '../' + labtainer_config_file = os.path.join(src_path, 'config', 'labtainer.config') + logger = LabtainerLogging.LabtainerLogging("labtainer-publish.log", 'publish', labtainer_config_file) + labtainer_config = ParseLabtainerConfig.ParseLabtainerConfig(labtainer_config_file, logger) + labutils.logger = logger + labdir = os.path.join(os.getenv('LABTAINER_DIR'), 'labs') + mycwd = os.getcwd() + os.chdir(labdir) + cmd = 'git ls-files ./ | cut -d/ -f1 | uniq' + child = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE) + output = child.communicate() + lab_list = output[0].decode('utf-8').strip().splitlines() + os.chdir(mycwd) + if args.dockerhub: + registry = labtainer_config.default_registry + print('Get registry dates from Docker Hub') + elif not args.premaster: + branch, registry = registry.getBranchRegistry() + print('Get registry dates for branch %s from %s' % (branch, registry)) + else: + registry = labtainer_config.test_registry + print('Get registry dates for PREMASTER from %s' % (registry)) + if args.lab == None: + skip_labs = 'skip-labs' + skip = [] + with open(skip_labs) as fh: + for line in fh: + f = os.path.basename(line).strip() + skip.append(f) + for lab in sorted(lab_list): + lab = lab.strip() + if lab not in skip: + doLab(labdir, lab, 'student', registry, logger) + else: + doLab(labdir, args.lab, 'student', registry, logger) + diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/git-restore-mtime.py b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/git-restore-mtime.py index 0fa89e6b9..15b528190 100755 --- a/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/git-restore-mtime.py +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/git-restore-mtime.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # -*- coding: utf-8 -*- # # git-restore-mtime - Change mtime of files based on commit date of last change diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/justrelease.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/justrelease.sh new file mode 100755 index 000000000..20f20ea29 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/justrelease.sh @@ -0,0 +1,113 @@ +#!/bin/bash +# +# Create a Labtainers release. +# --Update the release information in the README file. +# --Tag the current commit and push the release artifacts. +# +# Assumes master repo is up to date. Will create a distribution +# from the ~/labtainerRelease directory, tag it and push +# the artifacts. +# +# +release_dir=$HOME/labtainerRelease/Labtainers +if [[ ! -d $release_dir ]]; then + echo "No $release_dir directory found" + exit +fi +if [[ -z "$1" ]]; then + tag=$(git tag | tail -n 1) + echo "Missing tag, most recent is "$tag" . Pick the next revision." + exit +fi +if [[ -z "$gitpat" ]]; then + echo "gitpat is not defined. Source the gitpat.sh file" + exit +fi +if [[ -z "$SSH_AGENT_PID" ]]; then + echo "No ssh-agent running. Source ~/agent.sh" + exit +fi +new_tag=$1 +here=`pwd` +# +# Make sure we are up to date with master +# +cd $release_dir +git checkout premaster || exit +git pull +git checkout master || exit +git pull || exit + +git tag $new_tag +git push --set-upstream origin master +git push --tags + +revision=$new_tag +commit=`git describe --always` +sed -i "s/^Distribution created:.*$/Distribution created: $(date '+%m\/%d\/%Y %H:%M') <\/br>/" README.md +sed -i "s/^Revision:.*$/Revision: $revision <\/br>/" README.md +sed -i "s/^Previous revision:.*$/Revision: $revision <\/br>/" README.md +sed -i "s/^Commit:.*$/Commit: $commit <\/br>/" README.md +sed -i "s/^Branch:.*$/Branch: master <\/br>/" README.md +git commit README.md -m "Update readme date/rev" +git push --set-upstream origin master + +# create the end-user distibution +# First return to starting directory so we use +# possibly modified mkdist.sh +# +cd $here +./mkdist.sh -r || exit 1 +# +# above mkdist occurred in a temporary directory, and the artificts were copied to the release directory +# artifacts directory +# +cd $release_dir + +echo "Build GUI Jar" +cd UI/bin +./buildUI2.sh -n || exit +cp MainUI.jar $release_dir/distrib/artifacts/ + +echo "Build MakepackUI Jar" +cd $release_dir +cd MakepackUI/bin +./buildUI2.sh -n || exit +cp makepackui.jar $release_dir/distrib/artifacts/ + +echo "Build Azure tar" +cd $release_dir +cd azure +rm -f azure.tar +tar -cf azure.tar * +mv azure.tar $release_dir/distrib/artifacts + +echo "Build Google tar" +cd $release_dir +cd google +rm -f google.tar +tar -cf google.tar * +mv google.tar $release_dir/distrib/artifacts + +cd $release_dir/distrib +echo "Now generate release" + +github-release release --security-token $gitpat --user mfthomps --repo Labtainers --tag $new_tag +echo "wait for github" +while [ -z "$(github-release info --security-token $gitpat --user mfthomps --repo Labtainers --tag $new_tag | grep releases:)" ]; do + echo "release not yet created, sleep 2" + sleep 2 +done +echo "Upload tar" +github-release upload --security-token $gitpat --user mfthomps --repo Labtainers --tag $new_tag --name labtainer.tar --file artifacts/labtainer.tar +echo "Upload PDF zip" +github-release upload --security-token $gitpat --user mfthomps --repo Labtainers --tag $new_tag --name labtainer_pdf.zip --file artifacts/labtainer_pdf.zip +echo "Upload UI" +github-release upload --security-token $gitpat --user mfthomps --repo Labtainers --tag $new_tag --name MainUI.jar --file artifacts/MainUI.jar +github-release upload --security-token $gitpat --user mfthomps --repo Labtainers --tag $new_tag --name makepackui.jar --file artifacts/makepackui.jar +echo "Upload Azure" +github-release upload --security-token $gitpat --user mfthomps --repo Labtainers --tag $new_tag --name azure.tar --file artifacts/azure.tar +echo "Upload Google" +github-release upload --security-token $gitpat --user mfthomps --repo Labtainers --tag $new_tag --name google.tar --file artifacts/google.tar +git checkout premaster +git fetch --tags diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/mac/READEME.md b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/mac/READEME.md new file mode 100644 index 000000000..9157d3a97 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/mac/READEME.md @@ -0,0 +1,5 @@ +Scripts for creating a Mac pkg for installation. +Copy ont a Mac for creation and testing. +When done, put the update pkg file here and commit it. +The pkg will be kept in the repo to ease creating +a release. diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/mac/labtainers-desktop.pkg b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/mac/labtainers-desktop.pkg new file mode 100755 index 0000000000000000000000000000000000000000..4713df837581fe626a20f143048bb514939d66ae GIT binary patch literal 1648 zcmV-$29No8VR9h=8~_0T0000000Kn-0000000oNx0004a+MHBPkDD+Mz3;C;+^IhR zgCmDMR9dOGN=+}l8QUb*28^&1W%t+D7?Nyu^HKHWnep>HGmmHXd}z1PUJX{8ZW*I* zFpg9wjMUwF8UJ3rBxU?uJ+T8Hs;7uKBm5FEF(~f*iNxtvRTyHFK$75ch2a8{MT!}? zgoHyIC0^~WjjVgys%3099L3{K#7xszXtFbiR0;#qrL(@3&fn4+Do}{jU2M9H9p{ zaN(3pu74=ZiJPJm!UL?KKN z!Tu(&plJf(3gZRN7SNwLTGi8CC1K*0-~V`Po=>-TVC@;k@4)yOwjRu`udL%u!@!hG zbuEMb;~EM(tA?s=+{U!MWgw)}hDYQu_oXAWHBwcOWSPIv7*0Q`+H0XYQz23m1;+mA zIF$lGcO$k;bBIXpcc=V;Uw(-}_s(ANiieKxDFfkk{R;p9|NjF3yI!eyMGfa=x9h~w zeuq^ToHXd~*psXWABzY80000000Zq*ZExBz5bo#viX%nh!$e*vFH&1NA(3g-=sE%Y zR8^}<9Ae?vmhJRK)BgMHBox+$PTS`h2`lI4?w)(@>|hkw-~Q?cqrt%Jqfux-d;Qv4 zuCN~rhyC7Qcv3m__8h&V;B~anglLKuHbx7FTQ~FR`GPA=n9_*SqvMvpBFtYQl{q-h zIJgNXYz-FU!Ugy`7d}O+ZtdVvzIO6WLL_trv_D^8MSg}+La|a^gVTsGES2*)noMWW zV)6akJi3}JmeG8CPf@|*EY=j(SY!48Z$bAp342PEiT?&+NL@6NA}QR0+vqU{cR9a_ zT(~>a8DyPX)T!@F z^ysaL&Wcr`u#7n~8fY)(xu2&x_tGoT?N|{muTE1wWl)Er-Pk1;Nl#E#0qP$ zN-GXTL&C8F#xB+9F~Lfi8xQ#*_jQ!psqtIbn#p zR+@xE4RYh;F!M8IB#be52TE`|HMtdvH>u<~ykvi;oF~(=zWnx6E=z+f7&Be^?WXUTmDSsTyB3|FccQP;PHD9>ZE{WtGPosv z(za3VW#x-B;S5qlOg0bT6&a%T)0^`vw85YXiS6|;r#q&IB|F^Gln7jyKa+S1s!|El zQMAT@)~4H@TQW?D5)?g~-BNr-c2#K2nSvkg^%wUiBsfJ@&dLnd=$KL~LG1*D_L(^} z3nxMI3Y)F_@a24RIg944R_o~h`iJ!k0j=&300;m8c-n1|&rZWI494$!ipZyNNV`r* zfYfdWF7Oy>;}&aa5;-pL_+)>&AVhBY`LjRgOMCpDo%%#h6nqCwwF8BI2$uZR!6Ku6 zhT~z=#?z$9k3og3{bCZ-5qYL`?n@mAF9?d!g~5pF9d /tmp/lab-install.log +mkdir -p $HOME/headless-labtainers +HEADLESS_PREMASTER=`launchctl getenv HEADLESS_PREMASTER` +echo "env is $HEADLESS_PREMASTER" >>/tmp/lab-install.log +if [ "$HEADLESS_PREMASTER" = "TRUE" ];then + branch=premaster + echo "Using premaster branch" >> /tmp/lab-install.log +else + branch=master +fi +curl https://raw.githubusercontent.com/mfthomps/Labtainers/$branch/headless-lite/headless-labtainers.sh > $HOME/headless-labtainers/headless-labtainers.sh +# reset env so it does not follow you to your grave +launchctl setenv HEADLESS_PREMASTER FALSE + +chown -R $USER:staff $HOME/headless-labtainers +chmod a+x $HOME/headless-labtainers/headless-labtainers.sh +echo "did copy" >> /tmp/lab-install.log +echo "doing osasript" >> /tmp/lab-install.log +osascript -e 'tell app "Terminal" to do script "cd $HOME/headless-labtainers;source ./headless-labtainers.sh"' +echo "backfrom osascript" >> /tmp/lab-install.log +exit 0 diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/mac/scripts/preinstall b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/mac/scripts/preinstall new file mode 100755 index 000000000..4dd587b0e --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/mac/scripts/preinstall @@ -0,0 +1,12 @@ +#!/bin/bash +/usr/local/bin/docker ps +result=$? +if [[ ! $result == 0 ]]; then + echo "Docker Desktop not installed or not running" >>/tmp/lab-preinstall.log + osascript <<'END' + set theDialogText to "Installation failed. Docker Desktop is not running. Make sure it is installed and running. Then open the installation package again." + display dialog theDialogText buttons {"OK"} default button "OK" +END + exit 1 +fi +exit 0 diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/mac/test-package.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/mac/test-package.sh new file mode 100755 index 000000000..1450f8d5d --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/mac/test-package.sh @@ -0,0 +1,4 @@ +#!/bin/bash +#open ./labtainers-desktop.pkg +launchctl setenv HEADLESS_PREMASTER TRUE && installer -pkg labtainers-desktop.pkg -target / + diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/mergePre.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/mergePre.sh new file mode 100755 index 000000000..ad6d206c2 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/mergePre.sh @@ -0,0 +1,31 @@ +#!/bin/bash +# +# Merge a branch repo and docker images into master +# -- Performs a git merge of the branch into master +# -- If the branch is premaster and $2 is not -n: +# -- Ensures the Docker Hub matches the premaster registry +# -- Pushes branch and master to github +# +branch=$1 +shift 1 +if [[ $1 == "-h" ]];then + echo "Merge premaster into master, update docker hub to match mirror." + echo "Use -n to skip docker hub update." + exit 1 +fi +cur_branch=$(git rev-parse --abbrev-ref HEAD) +if [[ "$cur_branch" != "$branch" ]]; then + echo "Current branch is not $branch." + exit 1 +fi +git pull +git checkout master || exit 1 +git merge $branch || exit 1 +if [[ "$branch" == premaster ]] && [[ $1 != "-n" ]];then + echo "Refresh docker hub with premaster images" + echo "Provide Docker Hub password below" + ./refresh_mirror.py -q || exit 1 + echo "Mirror refresh complete" +fi +git push --set-upstream origin master || exit 1 +git checkout $branch || exit 1 diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/mk-devel-dist.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/mk-devel-dist.sh index 046481d4d..66e530fae 100755 --- a/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/mk-devel-dist.sh +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/mk-devel-dist.sh @@ -3,52 +3,12 @@ # Create a distribution for lab designers # Expects a directory at /media/sf_SEED into which it # will copy the distribution tar. -# -revision=`git describe --long` -myshare=/media/sf_SEED/ +if [[ -z $myshare ]]; then + myshare=/media/sf_SEED/ +fi here=`pwd` +branch=$(git rev-parse --abbrev-ref HEAD) cd ../ -rootdir=`pwd` -git status -s | grep -E "^ M|^ D|^ A" | less -ddir=/tmp/labtainer-distrib -ldir=$ddir/labtainer -ltrunk=$ldir/trunk -scripts=$ltrunk/scripts -labs=$ltrunk/labs -rm -fr /$ddir -mkdir $ddir -mkdir $ldir -mkdir $ltrunk -mkdir $labs -$here/fix-git-dates.py ./ $ltrunk -cd $ltrunk -sed -i "s/mm\/dd\/yyyy/$(date '+%m\/%d\/%Y %H:%M')/" README.md -sed -i "s/^Revision:/Revision: $revision/" README.md -cp setup_scripts/install-labtainer.sh . -cp setup_scripts/update-labtainer.sh . -cd $ldir/trunk/docs/labdesigner -make -cp labdesigner.pdf ../../../ -cp labdesigner.pdf $myshare - -cd $ldir/trunk/docs/student -make -cp labtainer-student.pdf ../../../ -cp labtainer-student.pdf $myshare - -cd $ldir/trunk/docs/instructor -make -cp labtainer-instructor.pdf ../../../ -cp labtainer-instructor.pdf $myshare -$here/mkTars.sh $ldir/trunk/labs $here/skip-labs -cd $ldir/trunk/labs -mkdir -p /tmp/labtainer_pdf -cd $rootdir -distrib/mk-lab-pdf.sh $labs -cd $ddir -tar -cz -X $here/skip-labs -f $here/labtainer-developer.tar labtainer -cd /tmp/ -zip -r $here/labtainer_pdf.zip labtainer_pdf +git archive $branch --prefix $branch -o distrib/labtainer-master.tar +cp distrib/labtainer-master.tar $myshare/ cd $here -cp labtainer-developer.tar $myshare -cp labtainer_pdf.zip $myshare diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/mk-lab-pdf.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/mk-lab-pdf.sh index b3c59da7f..f0e72594b 100755 --- a/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/mk-lab-pdf.sh +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/mk-lab-pdf.sh @@ -13,7 +13,8 @@ function contains() { return 1 } rootdir=`pwd` -mkdir -p /tmp/labtainer_pdf +LABPDF=/tmp/labtainer_pdf_$USER/labtainer_pdf +mkdir -p $LABPDF skip="distrib/skip-labs" skiplist="" lines=`cat $skip` @@ -26,23 +27,14 @@ for lab in $llist; do if [ $(contains "${skiplist[@]}" $lab) != "y" ]; then echo "lab is $lab in dir `pwd`" mkdir -p $labs/$lab - mkdir -p /tmp/labtainer_pdf/$lab + mkdir -p $LABPDF/$lab cd $labs/$lab if [[ -d docs ]]; then echo "lab is $lab" cd docs - cp -p /tmp/labtainer_pdf/$lab/*.pdf . - if [[ -f Makefile ]]; then - make - else - doc=$lab.docx - if [[ -f $doc ]]; then - soffice --convert-to pdf $doc --headless - fi - fi - cp -p *pdf /tmp/labtainer_pdf/$lab/ + cp -p *pdf $LABPDF/$lab/ else - cp */instructions.txt /tmp/labtainer_pdf/$lab/ 2>/dev/null + cp */instructions.txt $LABPDF/$lab/ 2>/dev/null fi cd $rootdir fi diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/mkall.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/mkall.sh new file mode 100755 index 000000000..6ae09ac06 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/mkall.sh @@ -0,0 +1,20 @@ +#/bin/bash +# +# Make distributions of labtainers +# +if [ "$1" != "-q" ] && [ "$1" != "-r" ]; then + git status -s | grep -E "^ M|^ D|^ A" | less +fi +./mkdist.sh $@ +result=$? +if [[ $result != 0 ]]; then + echo "mkdist failed" + exit 1 +fi +./mktest.sh $@ +result=$? +if [[ $result != 0 ]]; then + echo "mktest failed" + exit 1 +fi +echo "Done building Labtainers dist tars" diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/mkdist.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/mkdist.sh index 12849f48f..bfecf295b 100755 --- a/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/mkdist.sh +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/mkdist.sh @@ -1,8 +1,13 @@ #!/bin/bash # # Create an end-user distribution of Labtainers. -# This uses git archive, basing the distribution on committed content of the local repo. +# This uses git archive, basing the distribution on committed content of the +# current branch of the local repo. +# use -t to force test registry +# use -r if this is a release (will force use of master and will not modify README) # +# NOTE even when making release, CWD is the directory from which the release script +# was executed. # function contains() { local n=$# @@ -16,7 +21,7 @@ function contains() { echo "n" return 1 } -revision=`git describe --always` +commit=`git describe --always` skip="skip-labs" skiplist="" lines=`cat $skip` @@ -24,49 +29,73 @@ for line in $lines; do lab=$(basename $line) skiplist+=($lab) done -mkdir -p /tmp/labtainer_pdf -#myshare=/home/mike/sf_SEED/ -myshare=/media/sf_SEED/ +mkdir -p /tmp/labtainer_pdf_$USER/labtainer_pdf here=`pwd` cd ../ -rootdir=`pwd` -git status -s | grep -E "^ M|^ D|^ A" | less -ddir=/tmp/labtainer-distrib +ddir=$(mktemp -d -t labtainer-distrib-XXXXXXXX) ldir=$ddir/labtainer ltrunk=$ldir/trunk scripts=$ltrunk/scripts labs=$ltrunk/labs +docs=$ltrunk/docs rm -fr /$ddir mkdir $ddir mkdir $ldir mkdir $ltrunk -git archive master README.md | tar -x -C $ltrunk -sed -i "s/mm\/dd\/yyyy/$(date '+%m\/%d\/%Y %H:%M')/" $ltrunk/README.md -sed -i "s/^Revision:/Revision: $revision/" $ltrunk/README.md -#git archive master config | tar -x -C $ltrunk -$here/fix-git-dates.py config $ltrunk -$here/fix-git-dates.py setup_scripts $ltrunk -$here/fix-git-dates.py docs $ltrunk -$here/fix-git-dates.py tool-src $ltrunk -$here/fix-git-dates.py distrib/skip-labs $ltrunk +if [[ "$1" != "-r" ]]; then + branch=$(git rev-parse --abbrev-ref HEAD) +else + release_dir=$HOME/labtainerRelease/Labtainers + if [[ ! -d $release_dir ]]; then + echo "No $release_dir directory found" + exit + fi + echo "Building master from $release_dir" + cd $release_dir + branch=master +fi +if [[ "$1" != "-t" ]]; then + registry=$(scripts/labtainer-student/bin/registry.py) + echo "Make distribution from branch: $branch registry: $registry" +else + echo "Make distribution from branch: $branch Using premaster registry OVERRIDE" +fi +if [[ "$1" != "-r" ]]; then + commit=`git describe --always` + branch=$(git rev-parse --abbrev-ref HEAD) + sed -i "s/^Distribution created:.*$/Distribution created: $(date '+%m\/%d\/%Y %H:%M') <\/br>/" README.md + sed -i "s/^Revision:/Previous revision:/" README.md + sed -i "s/^Commit:.*$/Commit: $commit <\/br>/" README.md + sed -i "s/^Branch:.*$/Branch: $branch <\/br>/" README.md +fi +cp README.md $ltrunk/ mkdir $scripts -$here/fix-git-dates.py scripts/labtainer-student $ltrunk -$here/fix-git-dates.py scripts/labtainer-instructor $ltrunk +dlist="config setup_scripts docs tool-src distrib/skip-labs scripts/labtainer-student scripts/labtainer-instructor labpacks" +#git archive master config | tar -x -C $ltrunk +for d in $dlist; do + $here/fix-git-dates.py $d $ltrunk $branch || exit 1 +done mkdir $labs llist=$(git ls-files labs | cut -d '/' -f 2 | uniq) for lab in $llist; do if [ $(contains "${skiplist[@]}" $lab) != "y" ]; then - $here/fix-git-dates.py labs/$lab/config $ltrunk - $here/fix-git-dates.py labs/$lab/instr_config $ltrunk - if [[ -d labs/$lab/docs ]]; then - $here/fix-git-dates.py labs/$lab/docs $ltrunk + $here/fix-git-dates.py labs/$lab/config $ltrunk $branch || exit 1 + $here/fix-git-dates.py labs/$lab/instr_config $ltrunk $branch || exit 1 + docdir=labs/$lab/docs + if [[ -d $docdir ]]; then + if [ "$(ls -A $docdir)" ]; then + $here/fix-git-dates.py labs/$lab/docs $ltrunk $branch || exit 1 + fi fi - if [[ -d labs/$lab/bin ]]; then - $here/fix-git-dates.py labs/$lab/bin $ltrunk + bindir=labs/$lab/bin + if [[ -d $bindir ]]; then + if [ "$(ls -A $bindir)" ]; then + $here/fix-git-dates.py labs/$lab/bin $ltrunk $branch || exit 1 + fi fi fi done -distrib/mk-lab-pdf.sh $labs +distrib/mk-lab-pdf.sh $labs &> /tmp/mk-lab-pdf_$USER.log result=$? echo "result of mk-lab-pdf is $result" if [ $result -ne 0 ]; then @@ -74,28 +103,36 @@ if [ $result -ne 0 ]; then exit fi cd $ldir +if [[ -z $myshare ]]; then + myshare=/media/sf_SEED/ + mkdir -p $myshare +fi + mv trunk/setup_scripts/install-labtainer.sh . ln -s trunk/setup_scripts/update-labtainer.sh . ln -s trunk/setup_scripts/update-designer.sh . -cd $ldir/trunk/docs/student -make -cp labtainer-student.pdf ../../../ -cp labtainer-student.pdf $myshare - -cd $ldir/trunk/docs/instructor -make -cp labtainer-instructor.pdf ../../../ -cp labtainer-instructor.pdf $myshare - cd $ldir/trunk/tool-src/capinout pwd -./mkit.sh +./mkit.sh &> /tmp/mkit_$USER.out +# put student and instructor guide at top of distribution. +cp $docs/student/labtainer-student.pdf $ldir/ +cp $docs/instructor/labtainer-instructor.pdf $ldir/ cd $ddir -tar -cz -X $here/skip-labs -f $here/labtainer.tar labtainer -cd /tmp/ -#tar -czf $here/labtainer_pdf.tar.gz labtainer_pdf -zip -r $here/labtainer_pdf.zip labtainer_pdf +if [[ "$1" != "-r" ]]; then + tar -cz -X $here/skip-labs -f $here/labtainer.tar labtainer + cd /tmp/labtainer_pdf_$USER + zip -qq -r $here/labtainer_pdf.zip labtainer_pdf +else + mkdir -p $release_dir/distrib/artifacts + tar -cz -X $here/skip-labs -f $release_dir/distrib/artifacts/labtainer.tar labtainer + cd /tmp/labtainer_pdf_$USER + zip -qq -r $release_dir/distrib/artifacts/labtainer_pdf.zip labtainer_pdf +fi cd $here -cp labtainer.tar $myshare -cp labtainer_pdf.zip $myshare +if [[ "$1" != "-r" ]]; then + cp labtainer.tar $myshare + cp labtainer_pdf.zip $myshare +fi +rm -fr $ddir +echo "DONE" diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/mkrelease.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/mkrelease.sh new file mode 100755 index 000000000..88e410f97 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/mkrelease.sh @@ -0,0 +1,74 @@ +#!/bin/bash +# +# Create a Labtainers release. +# --Merge a branch into master +# --Update the release information in the README file. +# --Tag the current commit and push the release artifacts. +# +# A merge into master is assumed to be a new release, and thus these steps are not +# separate. +# +# +# DO NOT USE +echo "DO NOT USE" +exit +# +# +if [[ -z "$1" ]]; then + tag=$(git tag | tail -n 1) + echo "Missing tag, most recent is "$tag" . Pick the next revision." + exit +fi +if [[ -z "$gitpat" ]]; then + echo "gitpat is not defined. Source the gitpat.sh file" + exit +fi +if [[ -z "$SSH_AGENT_PID" ]]; then + echo "No ssh-agent running. Source ~/agent.sh" + exit +fi +new_tag=$1 +branch=$2 +shift 2 +cur_branch=$(git rev-parse --abbrev-ref HEAD) +if [[ "$cur_branch" != "$branch" ]]; then + echo "Current branch is not $branch." + exit 1 +fi + +here=`pwd` +revision=$new_tag +commit=`git describe --always` +sed -i "s/^Distribution created:.*$/Distribution created: $(date '+%m\/%d\/%Y %H:%M') <\/br>/" ../README.md +sed -i "s/^Revision:.*$/Revision: $revision <\/br>/" ../README.md +sed -i "s/^Commit:.*$/Commit: $commit <\/br>/" ../README.md +sed -i "s/^Branch:.*$/Branch: master <\/br>/" ../README.md +git commit ../README.md -m "Update readme date/rev" +./mergePre.sh $branch $1 || exit 1 +git tag $new_tag +#git push --set-upstream origin master +git push --tags + +# create the end-user distibution +./mkdist.sh -r || exit 1 + +# copy end-user distribution files to artifacts +mkdir -p artifacts +cp labtainer.tar artifacts/ +cp labtainer_pdf.zip artifacts/ +echo "Artifacts for revision $revision" > artifacts/README.txt + +echo "Build GUI Jar" +cd $LABTAINER_DIR/UI/bin +./buildUI2.sh -n || exit +cp MainUI.jar $LABTAINER_DIR/distrib/artifacts/ +cd $here +echo "Now generate release" +github-release release --security-token $gitpat --user mfthomps --repo Labtainers --tag $new_tag + +echo "Upload tar" +github-release upload --security-token $gitpat --user mfthomps --repo Labtainers --tag $new_tag --name labtainer.tar --file artifacts/labtainer.tar +echo "Upload PDF zip" +github-release upload --security-token $gitpat --user mfthomps --repo Labtainers --tag $new_tag --name labtainer_pdf.zip --file artifacts/labtainer_pdf.zip +echo "Upload UI" +github-release upload --security-token $gitpat --user mfthomps --repo Labtainers --tag $new_tag --name MainUI.jar --file artifacts/MainUI.jar diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/mktest.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/mktest.sh index 92a992369..877ab8baf 100755 --- a/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/mktest.sh +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/mktest.sh @@ -6,19 +6,33 @@ # are not generally distributed. # Assumes the simlab files are in ../../Labtainers-simlab/simlab # -tmp_dir=/tmp/labtainer_tests +mkdir -p /tmp/$USER +exec &> >(tee -a "/tmp/$USER/mktest.log") 2>&1 +if [[ -z $myshare ]]; then + myshare=/media/sf_SEED +fi +tmp_dir=$(mktemp -d -t labtainer_tests-XXXXXXXX) rm -fr $tmp_dir mkdir $tmp_dir trunk=$tmp_dir/trunk mkdir $trunk here=`pwd` cd ../ -$here/fix-git-dates.py distrib $trunk -$here/fix-git-dates.py testsets $trunk -cd ../Labtainers-simlab -git status -s | grep -E "^ M|^ D|^ A" | less -$here/fix-git-dates.py simlab $tmp_dir +branch=$(git rev-parse --abbrev-ref HEAD) +echo "Make test set distribution from branch: $branch" +$here/fix-git-dates.py distrib $trunk $branch +$here/fix-git-dates.py testsets $trunk $branch +cd ../Labtainers-simlab/simlab +git pull +branch=$(git rev-parse --abbrev-ref HEAD) +echo "Make simlab distribution from branch: $branch" +cd ../ +$here/fix-git-dates.py simlab $tmp_dir $branch #git archive master simlab | tar -x -C $tmp_dir cd $tmp_dir -tar czf /tmp/labtainer-tests.tar trunk simlab -mv /tmp/labtainer-tests.tar /media/sf_SEED/ +tar --exclude *.zip -czf /tmp/$USER/labtainer-tests.tar trunk simlab +cp /tmp/$USER/labtainer-tests.tar $myshare +mv /tmp/$USER/labtainer-tests.tar $here/ +tar --exclude expected -czf /tmp/$USER/simlab-dist.tar simlab +cp /tmp/$USER/simlab-dist.tar $myshare +mv /tmp/$USER/simlab-dist.tar $here/ diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/move_base.py b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/move_base.py new file mode 100755 index 000000000..e54e0e1aa --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/move_base.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python3 +import sys +import os +sys.path.append('../scripts/labtainer-student/bin') +import RemoteBase +import LabtainerLogging +import ParseLabtainerConfig +import LabtainerBase +config_file = '../config/labtainer.config' +labtainer_config = ParseLabtainerConfig.ParseLabtainerConfig(config_file, None) +lgr = LabtainerLogging.LabtainerLogging("/tmp/move_base.log", 'none', config_file) +base_names = LabtainerBase.getBaseList(skip_exempt=False) + +old_reg = 'mfthomps' +new_reg = 'labtainers' +os.system('docker login -u mfthomps') +for base in base_names: + old = '%s/%s' % (old_reg, base) + new = '%s/%s' % (new_reg, base) + print(base) + new_created, new_user = RemoteBase.inspectRemote(new, lgr) + if new_created is not None: + old_created, old_user = RemoteBase.inspectRemote(old, lgr) + if new_created is None or old_created > new_created: + cmd = 'docker pull %s' % (old) + print(cmd) + os.system(cmd) + cmd = 'docker tag %s %s' % (old, new) + print(cmd) + os.system(cmd) + cmd = 'docker push %s' % (new) + print(cmd) + os.system(cmd) + else: + print('new registry for %s is up to date.' % new) diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/move_reg.py b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/move_reg.py new file mode 100755 index 000000000..b1bb32cef --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/move_reg.py @@ -0,0 +1,103 @@ +#!/usr/bin/env python3 +''' +This software was created by United States Government employees at +The Center for Cybersecurity and Cyber Operations (C3O) +at the Naval Postgraduate School NPS. Please note that within the +United States, copyright protection is not available for any works +created by United States Government employees, pursuant to Title 17 +United States Code Section 105. This software is in the public +domain and is not subject to copyright. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +''' +import os +import sys +import argparse +sys.path.append('../scripts/labtainer-student/bin') +import InspectLocalReg +import InspectRemoteReg +import LabtainerLogging +''' +Move repos from the mfthomps registry to the labtainers registry +''' + +def do_lab(lab_dir, lab, role, source_reg, dest_reg, force, logger): + docker_dir = os.path.join(labdir, lab, 'dockerfiles') + if not os.path.isdir(docker_dir): + return + df_list = [f for f in os.listdir(docker_dir) if os.path.isfile(os.path.join(docker_dir, f))] + for df in df_list: + if df.endswith('.swp'): + continue + try: + parts = df.split('.') + image = '%s.%s.%s' % (parts[1], parts[2], role) + except: + print('could not get image from %s' % df); + continue + with_new_reg = '%s/%s' % (dest_reg, image) + new_created, new_user, version, tag = InspectRemoteReg.inspectRemote(with_new_reg, logger, no_pull=True) + if new_created is not None: + with_reg = '%s/%s' % (source_reg, image) + remote_created, remote_user, version, tag = InspectRemoteReg.inspectRemote(with_reg, logger, no_pull=True) + if force or new_created is None or remote_created > new_created: + cmd = 'docker pull %s/%s' % (source_reg, image) + print(cmd) + os.system(cmd) + cmd = 'docker tag %s/%s %s/%s' % (source_reg, image, dest_reg, image) + print(cmd) + os.system(cmd) + cmd = 'docker push %s/%s' % (dest_reg, image) + print(cmd) + os.system(cmd) + else: + print('local registry for %s is up to date.' % image) + +parser = argparse.ArgumentParser(description='pull from the docker hub mfthomps and push to docker hub labtainers') +parser.add_argument('-l', '--lab', action='store', help='only pull/tag/push this lab') +parser.add_argument('-f', '--force', action='store_true', default=False, help='force pull/push') +args = parser.parse_args() +skip = [] +with open('skip-labs') as fh: + for line in fh: + f = os.path.basename(line).strip() + print('will skip [%s]' % f) + skip.append(f) + +logger = LabtainerLogging.LabtainerLogging("reg_image_dif.log", 'none', "../config/labtainer.config") +labdir = '../labs' +lab_list = os.listdir(labdir) +# +# test with a single lab. Then use loop below once it works. +# +new_registry = 'labtainers' +os.system('docker login -u mfthomps') +if args.lab is not None: + do_lab(labdir, args.lab, 'student', 'mfthomps', new_registry, args.force, logger) +else: + #print('commented out for now') + for lab in sorted(lab_list): + if lab not in skip: + start_config = os.path.join('../labs', lab, 'config', 'start.config') + cmd = 'git ls-files --error-unmatch %s > /dev/null 2>&1' % start_config + result = os.system(cmd) + if result == 0: + do_lab(labdir, lab, 'student', 'mfthomps', new_registry, args.force, logger) diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/publish.py b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/publish.py index 6a5a02895..f197da390 100755 --- a/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/publish.py +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/publish.py @@ -1,12 +1,32 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' This software was created by United States Government employees at -The Center for the Information Systems Studies and Research (CISR) +The Center for Cybersecurity and Cyber Operations (C3O) at the Naval Postgraduate School NPS. Please note that within the United States, copyright protection is not available for any works created by United States Government employees, pursuant to Title 17 United States Code Section 105. This software is in the public domain and is not subject to copyright. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. ''' import sys import os @@ -19,10 +39,13 @@ import ParseLabtainerConfig import labutils import VersionInfo import removelab +import registry +import InspectLocalReg +import rebuild ''' Build and publish labtainer images. Use -h option for help. ''' -def relabel(image, version, base_image, base_id, registry): +def relabel(image, version, base_image, base_id, registry, logger): with open('./dfile', 'w') as fh: fh.write('FROM %s\n' % image) fh.write('ARG version\n') @@ -31,35 +54,60 @@ def relabel(image, version, base_image, base_id, registry): cmd = 'docker build -f dfile -t %s.tmp .' % image os.system(cmd) + ''' + Do two pushes, one for the default image, the other with a base image tag for + retrieval by instances that do not have the appropriate base. + ''' cmd = 'docker tag %s.tmp %s/%s' % (image, registry, image) - print cmd + #print cmd os.system(cmd) cmd = 'docker push %s/%s' % (registry, image) - print cmd + #print cmd os.system(cmd) cmd = 'docker tag %s.tmp %s/%s:base_image%s' % (image, registry, image, base_id) - print cmd + #print cmd os.system(cmd) cmd = 'docker push %s/%s:base_image%s' % (registry, image, base_id) - print cmd + #print cmd os.system(cmd) -def rebuild(labname, labsdir, force, logger): +def doRebuild(labname, labsdir, force, no_build, logger): mycwd = os.getcwd() path = '../scripts/labtainer-student' os.chdir(path) #print('now at %s' % os.getcwd()) lab_dir = os.path.join(labsdir, labname) #print('cwd was %s now %s lab_dir is %s' % (mycwd, os.getcwd(), lab_dir)) - retval = labutils.DoRebuildLab(lab_dir, force_build=force) + retval = rebuild.DoRebuildLab(lab_dir, force_build=force, no_build=no_build, no_pull=True, use_cache=False) os.chdir(mycwd) return retval -def pushIt(lab, docker_dir, registry, logger): +def pushImage(lab, docker_dir, registry_info, logger): + ''' + Set the label and tags on any newly built image and push it to the given registry. + ''' + did_one = False + for ri in registry_info: + df = 'Dockerfile.%s.%s.student' % (lab, ri.name) + dfile_path = os.path.join(docker_dir,df) + image_base = VersionInfo.getFrom(dfile_path, ri.base_registry) + base_id = VersionInfo.getImageId(image_base, True) + framework_version = labutils.framework_version + relabel(ri.image_name, framework_version, image_base, base_id, ri.registry, logger) + logger.debug('Did relabel of %s using base_id %s' % (ri.image_name, base_id)) + did_one = True + + ''' Delete the lab images. Two reasons: 1) ensure we run registry or dockerHub copy, + 2) don't push on a rebuild if not rebuilt. ''' + if did_one: + removelab.removeLab(lab) + +def pushIt(lab, docker_dir, registry, base_registry, logger): ''' Set the label and tags on any newly built image and push it to the given registry. ''' df_list = [f for f in os.listdir(docker_dir) if os.path.isfile(os.path.join(docker_dir, f))] + did_one = False for df in df_list: if df.endswith('.swp'): continue @@ -73,63 +121,83 @@ def pushIt(lab, docker_dir, registry, logger): image_exists, dumb, dumb1 = labutils.ImageExists(image, None) if image_exists: dfile_path = os.path.join(docker_dir,df) - image_base = VersionInfo.getFrom(dfile_path, registry) + image_base = VersionInfo.getFrom(dfile_path, base_registry) base_id = VersionInfo.getImageId(image_base, True) framework_version = labutils.framework_version - relabel(image, framework_version, image_base, base_id, registry) - + relabel(image, framework_version, image_base, base_id, registry, logger) + logger.debug('Did relabel of %s using base_id %s' % (image, base_id)) + did_one = True else: logger.debug('Have not built %s, nothing to push' % image) - ''' Delete the lab images. Two reasons: 1) ensure we run authoritative copy, - which is from the dockerhub. 2) don't push on a rebuild if not rebuilt. ''' - removelab.removeLab(lab) + ''' Delete the lab images. Two reasons: 1) ensure we run registry or dockerHub copy, + 2) don't push on a rebuild if not rebuilt. ''' + if did_one: + removelab.removeLab(lab) -def DoLab(lab, labsdir, force, logger, do_login, test_registry, default_registry): +def DoLab(lab, labsdir, force, logger, do_login, use_default_registry, default_registry, no_build=False): logger.debug('DoLab for %s' % lab) + if not no_build: + removelab.removeLab(lab) lab_dir = os.path.join(labsdir, lab) - registry_set = rebuild(lab, labsdir, force, logger) - if len(registry_set) > 1: - logger.error('no current support for images from multiple registries') - exit(1) - else: - registry = list(registry_set)[0] - logger.debug('back from rebuild with registry of %s' % registry) - ''' should we login? Never if test registry ''' - if not test_registry: - if registry is not None and registry != default_registry: - print('registry %s not equal %s, login' % (registry, default_registry)) - os.system('docker login -u %s' % registry) + registry_info = doRebuild(lab, labsdir, force, no_build, logger) + registry = None + for ri in registry_info: + if registry is not None and ri.registry != registry: + logger.error('no current support for images from multiple registries, got %s and %s' % (ri.registry, registry)) + exit(1) else: - registry = default_registry - if do_login: - os.system('docker login -u %s' % registry) - docker_dir = os.path.join(labsdir, lab, 'dockerfiles') - pushIt(lab, docker_dir, registry, logger) + registry = ri.registry + logger.debug('Back from rebuild with registry of %s' % registry) + if not no_build and registry is not None: + ''' should we login? Never if test registry ''' + if use_default_registry: + if registry != default_registry: + print('registry %s not equal %s, login' % (registry, default_registry)) + os.system('docker login') + else: + registry = default_registry + if do_login: + os.system('docker login') + docker_dir = os.path.join(labsdir, lab, 'dockerfiles') + #pushIt(lab, docker_dir, registry, base_registry, logger) + pushImage(lab, docker_dir, registry_info, logger) def main(): + src_path = '../' + labtainer_config_file = os.path.join(src_path, 'config', 'labtainer.config') + logfile = os.path.join(os.getenv('LABTAINER_DIR'), 'logs', 'labtainer-publish.log') + logger = LabtainerLogging.LabtainerLogging(logfile, 'publish', labtainer_config_file) + logger.debug('Start publish log') + labutils.logger = logger + parser = argparse.ArgumentParser(description='Build the images labs and publish to a registry') parser.add_argument('-l', '--lab', action='store', help='build and publish just this lab') parser.add_argument('-s', '--start', action='store', help='all labs starting with this one') - parser.add_argument('-t', '--test_registry', action='store_true', default=False, help='build and publish with test registry') + parser.add_argument('-d', '--default_registry', action='store_true', default=False, help='build and publish with default registry -- instead of the typical test registry') parser.add_argument('-f', '--force', action='store_true', default=False, help='force rebuild of all images') + parser.add_argument('-n', '--no_build', action='store_true', default=False, help='Do not rebuild, just report on what would be built') + parser.add_argument('-q', '--quiet', action='store_true', default=False, help='Do not prompt user for ok') args = parser.parse_args() - if args.test_registry: + if not args.default_registry: if os.getenv('TEST_REGISTRY') is None: - print('use putenv to set it') + #print('use putenv to set it') os.putenv("TEST_REGISTRY", "TRUE") ''' why does putenv not set the value? ''' os.environ['TEST_REGISTRY'] = 'TRUE' else: - print('exists, set it true') + #print('exists, set it true') os.environ['TEST_REGISTRY'] = 'TRUE' - print('set TEST REG to %s' % os.getenv('TEST_REGISTRY')) + branch, test_registry = registry.getBranchRegistry() + print('Using test registry %s' % test_registry) + ok = InspectLocalReg.checkRegistryExists(test_registry, logger) + if not ok: + print('Default is to use a test registry, which does not seem to exist. Use -d option to force publishing directly to Docker Hub') + exit(1) + else: + if os.getenv('TEST_REGISTRY') is not None: + print('Request to use default registry, but TEST_REGISTRY is set. Unset that first.') + exit(1) - src_path = '../' - labtainer_config_file = os.path.join(src_path, 'config', 'labtainer.config') - logger = LabtainerLogging.LabtainerLogging("labtainer-publish.log", 'publish', labtainer_config_file) - labutils.logger = logger - - skip_labs = 'skip-labs' skip = [] @@ -146,10 +214,7 @@ def main(): if args.lab is not None: logger.debug('Doing just one lab %s labsdir %s' % (args.lab, labsdir)) - # Do login here and now so we don't wait for lab to build before prompt - if not args.test_registry: - os.system('docker login -u %s' % default_registry) - DoLab(args.lab, labsdir, args.force, logger, False, args.test_registry, default_registry) + DoLab(args.lab, labsdir, args.force, logger, False, args.default_registry, default_registry, no_build=args.no_build) else: # do them all. warn of incomplete git mycwd = os.getcwd() @@ -161,17 +226,19 @@ def main(): ps.stdout.close() output = ps_grep.communicate() if len(output[0]) > 0: - for line in output[0].splitlines(True): - print line.strip() - dumb = raw_input("any key to continue") + for line in output[0].decode('utf-8').splitlines(): + print(line.strip()) + if not args.quiet: + dumb = input("any key to continue") - if not args.test_registry: - os.system('docker login -u %s' % default_registry) + # Do login here and now so we don't wait for lab to build before prompt + if args.default_registry: + os.system('docker login') #cmd = 'svn ls https://tor.ern.nps.edu/svn/proj/labtainer/trunk/labs' cmd = 'git ls-files ./ | cut -d/ -f1 | uniq' child = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE) output = child.communicate() - lab_list = output[0].strip().splitlines(True) + lab_list = output[0].decode('utf-8').strip().splitlines() for lab in sorted(lab_list): #lab = lab[:len(lab)-1] lab = lab.strip() @@ -184,7 +251,7 @@ def main(): cmd = 'git checkout ./' os.system(cmd) os.chdir(mycwd) - DoLab(lab, labsdir, args.force, logger, False, args.test_registry, default_registry) + DoLab(lab, labsdir, args.force, logger, False, args.default_registry, default_registry, no_build=args.no_build) if __name__ == '__main__': sys.exit(main()) diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/publish_grader.py b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/publish_grader.py deleted file mode 100755 index 8abc828c3..000000000 --- a/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/publish_grader.py +++ /dev/null @@ -1,74 +0,0 @@ -#!/usr/bin/env python -import os -import sys -import argparse -sys.path.append('../scripts/labtainer-student/bin') -import labutils -import ParseLabtainerConfig -import LabtainerLogging -import VersionInfo -def relabel(image, version, base_image, base_id, registry): - with open('./dfile', 'w') as fh: - fh.write('FROM %s\n' % image) - fh.write('ARG version\n') - fh.write('LABEL version=%s\n' % version) - fh.write('LABEL base=%s.%s' % (base_image, base_id)) - - cmd = 'docker build -f dfile -t %s.tmp .' % image - os.system(cmd) - cmd = 'docker tag %s.tmp %s/%s' % (image, registry, image) - print cmd - os.system(cmd) - cmd = 'docker push %s/%s' % (registry, image) - print cmd - os.system(cmd) - cmd = 'docker tag %s.tmp %s/%s:base_image%s' % (image, registry, image, base_id) - print cmd - os.system(cmd) - cmd = 'docker push %s/%s:base_image%s' % (registry, image, base_id) - print cmd - os.system(cmd) - -def main(): - parser = argparse.ArgumentParser(description='Build and publish the grader') - parser.add_argument('-t', '--test_registry', action='store_true', help='Use image from test registry') - args = parser.parse_args() - if args.test_registry: - if os.getenv('TEST_REGISTRY') is None: - print('use putenv to set it') - os.putenv("TEST_REGISTRY", "TRUE") - ''' why does putenv not set the value? ''' - os.environ['TEST_REGISTRY'] = 'TRUE' - else: - print('exists, set it true') - os.environ['TEST_REGISTRY'] = 'TRUE' - print('set TEST REG to %s' % os.getenv('TEST_REGISTRY')) - here = os.getcwd() - os.chdir('../scripts/designer/bin') - test_registry = '' - if args.test_registry: - test_registry = '-t' - cmd = './create_image.sh grader %s' % test_registry - os.system(cmd) - os.chdir(here) - src_path = '../' - labtainer_config_file = os.path.join(src_path, 'config', 'labtainer.config') - logger = LabtainerLogging.LabtainerLogging("publish_grader.log", 'publish', labtainer_config_file) - labutils.logger = logger - - labtainer_config = ParseLabtainerConfig.ParseLabtainerConfig(labtainer_config_file, logger) - if args.test_registry: - registry = labtainer_config.test_registry - else: - registry = labtainer_config.default_registry - dfile_path = '../scripts/designer/base_dockerfiles/Dockerfile.labtainer.grader' - image_base = VersionInfo.getFrom(dfile_path, registry) - base_id = VersionInfo.getImageId(image_base, True) - framework_version = labutils.framework_version - relabel('labtainer.grader', framework_version, image_base, base_id, registry) - - - -if __name__ == '__main__': - sys.exit(main()) - diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/pull_tag_push.py b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/pull_tag_push.py index a3115dc64..31b332a4f 100755 --- a/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/pull_tag_push.py +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/pull_tag_push.py @@ -1,16 +1,46 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 +''' +This software was created by United States Government employees at +The Center for Cybersecurity and Cyber Operations (C3O) +at the Naval Postgraduate School NPS. Please note that within the +United States, copyright protection is not available for any works +created by United States Government employees, pursuant to Title 17 +United States Code Section 105. This software is in the public +domain and is not subject to copyright. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +''' import os import sys import argparse sys.path.append('../scripts/labtainer-student/bin') import InspectLocalReg import InspectRemoteReg +import LabtainerLogging ''' Pull all labtainer container images from the docker hub, retag them, and push to a local registry. Only replace the local registry if its image is older than the remote. ''' -def do_lab(lab_dir, lab, role, source_reg, dest_reg, force): +def do_lab(lab_dir, lab, role, source_reg, dest_reg, force, logger): docker_dir = os.path.join(labdir, lab, 'dockerfiles') if not os.path.isdir(docker_dir): return @@ -24,9 +54,10 @@ def do_lab(lab_dir, lab, role, source_reg, dest_reg, force): except: print('could not get image from %s' % df); continue - local_created, local_user, version, tag = InspectLocalReg.inspectLocal(image, dest_reg) + local_created, local_user, version, tag, base = InspectLocalReg.inspectLocal(image, logger, dest_reg) if local_created is not None: - remote_created, remote_user, version, tag = InspectRemoteReg.inspectRemote(image) + with_reg = '%s/%s' % (source_reg, image) + remote_created, remote_user, version, tag = InspectRemoteReg.inspectRemote(with_reg, logger) if force or local_created is None or remote_created > local_created: cmd = 'docker pull %s/%s' % (source_reg, image) #print cmd @@ -51,6 +82,7 @@ with open('skip-labs') as fh: print('will skip [%s]' % f) skip.append(f) +logger = LabtainerLogging.LabtainerLogging("reg_image_dif.log", 'none', "../config/labtainer.config") labdir = '../labs' lab_list = os.listdir(labdir) # @@ -58,12 +90,10 @@ lab_list = os.listdir(labdir) # testregistry = 'testregistry:5000' if args.lab is not None: - do_lab(labdir, args.lab, 'student', 'mfthomps', testregistry, args.force) - do_lab(labdir, args.lab, 'instructor', 'mfthomps', testregistry, args.force) + do_lab(labdir, args.lab, 'student', 'mfthomps', testregistry, args.force, logger) else: #print('commented out for now') testregistry = 'testregistry:5000' for lab in sorted(lab_list): if lab not in skip: - do_lab(labdir, lab, 'student', 'mfthomps', testregistry, args.force) - do_lab(labdir, lab, 'instructor', 'mfthomps', testregistry, args.force) + do_lab(labdir, lab, 'student', 'mfthomps', testregistry, args.force, logger) diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/push_base.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/push_base.sh index 2f34fe2eb..0c6e853be 100755 --- a/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/push_base.sh +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/push_base.sh @@ -1,6 +1,6 @@ #!/bin/bash pull_push(){ - registry=mfthomps + registry=labtainers test_registry=testregistry:5000 docker pull $registry/$1 docker tag $registry/$1 $test_registry/$1 diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/refresh_branch.py b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/refresh_branch.py new file mode 100755 index 000000000..fe4a74e1d --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/refresh_branch.py @@ -0,0 +1,165 @@ +#!/usr/bin/env python3 +''' +This software was created by United States Government employees at +The Center for Cybersecurity and Cyber Operations (C3O) +at the Naval Postgraduate School NPS. Please note that within the +United States, copyright protection is not available for any works +created by United States Government employees, pursuant to Title 17 +United States Code Section 105. This software is in the public +domain and is not subject to copyright. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +''' +import sys +import os +import argparse +import subprocess +sys.path.append('../scripts/labtainer-student/bin') +import LocalBase +import InspectLocalReg +import LabtainerLogging +import ParseLabtainerConfig +import registry +import LabtainerBase + +''' +Force the registry associated with the current git branch (see config/registry.config) +to match the premaster registry. Intended to be called from scripts, e.g., to establish +a new branch. +''' +def pull_push(image, source_registry, dest_registry): + with_registry = '%s/%s' % (source_registry, image) + cmd = 'docker pull %s' % with_registry + print(cmd) + os.system(cmd) + cmd = 'docker tag %s/%s %s/%s' % (source_registry, image, dest_registry, image) + print(cmd) + os.system(cmd) + cmd = 'docker push %s/%s' % (dest_registry, image) + print(cmd) + os.system(cmd) + +def checkDates(image, source_reg, dest_reg, no_copy, lab, logger): + dest_created, dest_user, dest_version, tag, base = InspectLocalReg.inspectLocal(image, logger, dest_reg, no_pull=True) + + if dest_created is not None: + with_reg = '%s/%s' % (source_reg, image) + source_created, source_user, source_version, tag, base = InspectLocalReg.inspectLocal(image, logger, source_reg, no_pull=True) + if source_created != dest_created: + print('DIFFERENT: %s:%s source created/version %s/%s destination: %s/%s' % (lab, image, source_created, + source_version, dest_created, dest_version)) + logger.debug('DIFFERENT: %s:%s source created/version %s/%s destination: %s/%s' % (lab, image, source_created, + source_version, dest_created, dest_version)) + if not no_copy: + pull_push(image, source_reg, dest_reg) + else: + print('%s not in %s, would add it' % (image, dest_reg)) + if not no_copy: + pull_push(image, source_reg, dest_reg) + +def doLab(lab_dir, lab, role, source_reg, dest_reg, logger, no_copy): + ''' use dockerfiles to determine the set of containers ''' + print('Lab: %s No_copy %r' % (lab, no_copy)) + docker_dir = os.path.join(lab_dir, lab, 'dockerfiles') + if not os.path.isdir(docker_dir): + return + df_list = [f for f in os.listdir(docker_dir) if os.path.isfile(os.path.join(docker_dir, f))] + for df in df_list: + if df.endswith('.swp'): + continue + try: + parts = df.split('.') + image = '%s.%s.%s' % (parts[1], parts[2], role) + container = parts[2] + except: + print('could not get image from %s' % df); + continue + checkDates(image, source_reg, dest_reg, no_copy, lab, logger) + +def doBases(source_registry, dest_registry, no_copy): + print('Comparing base images in %s to %s, and replacing content of %s if different' % (dest_registry, source_registry, dest_registry)) + base_names = LabtainerBase.getBaseList() + for base in base_names: + with_registry = '%s/%s' % (source_registry, base) + print(base) + source_created, local_user = LocalBase.inspectLocal(base, lgr, source_registry) + dest_created, local_user = LocalBase.inspectLocal(base, lgr, dest_registry) + if source_created != dest_created: + print('Difference in %s, source: %s destination: %s' % (base, source_created, dest_created)) + if not no_copy: + pull_push(base, source_registry, dest_registry) + + +def updateRegistry(source_registry, dest_registry, lgr, lab, no_copy, quiet=False): + + labdir = os.path.join(os.getenv('LABTAINER_DIR'), 'labs') + if lab is not None: + doLab(labdir, lab, 'student', source_registry, dest_registry, lgr, no_copy) + else: + if not quiet: + msg = 'Will modify registry %s to match %s. Continue? (y/n)' % (dest_registry, source_registry) + response = input(msg) + if response.lower() != 'y': + print('Exiting') + exit(0) + grader = 'labtainer.grader' + checkDates(grader, source_registry, dest_registry, no_copy, 'grader', lgr) + + doBases(source_registry, dest_registry, no_copy) + skip = [] + with open('skip-labs') as fh: + for line in fh: + f = os.path.basename(line).strip() + #print('will skip [%s]' % f) + skip.append(f) + + mycwd = os.getcwd() + os.chdir(labdir) + cmd = 'git ls-files ./ | cut -d/ -f1 | uniq' + child = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE) + output = child.communicate() + lab_list = output[0].decode('utf-8').strip().splitlines() + os.chdir(mycwd) + for lab in sorted(lab_list): + lab = lab.strip() + if lab not in skip: + doLab(labdir, lab, 'student', source_registry, dest_registry, lgr, no_copy) + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description='Compare a source registry with a destination registry, and update the destination so they match') + parser.add_argument('-n', '--no_copy', action='store_true', default=False, help='Do not modify registry, just report differences') + parser.add_argument('-l', '--lab', action='store', help='only check this lab') + parser.add_argument('-q', '--quiet', action='store_true', default=False, help='Do not prompt for confirmation.') + args = parser.parse_args() + + config_file = os.path.join(os.getenv('LABTAINER_DIR'), 'config', 'labtainer.config') + labtainer_config = ParseLabtainerConfig.ParseLabtainerConfig(config_file, None) + lgr = LabtainerLogging.LabtainerLogging("refresh_branch.log", 'none', config_file) + + ''' source is the premaster mirror ''' + source_registry = labtainer_config.test_registry + branch, dest_registry = registry.getBranchRegistry() + + if dest_registry is None: + print('No registry found for branch %s' % branch) + exit(1) + updateRegistry(source_registry, dest_registry, lgr, args.lab, args.no_copy, args.quiet) + diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/refresh_mirror.py b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/refresh_mirror.py new file mode 100755 index 000000000..a61dd83f7 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/refresh_mirror.py @@ -0,0 +1,301 @@ +#!/usr/bin/env python3 +''' +This software was created by United States Government employees at +The Center for Cybersecurity and Cyber Operations (C3O) +at the Naval Postgraduate School NPS. Please note that within the +United States, copyright protection is not available for any works +created by United States Government employees, pursuant to Title 17 +United States Code Section 105. This software is in the public +domain and is not subject to copyright. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +''' +import sys +import os +import argparse +import subprocess +sys.path.append('../scripts/labtainer-student/bin') +import RemoteBase +import LocalBase +import InspectLocalReg +import InspectRemoteReg +import LabtainerLogging +import ParseLabtainerConfig +import LabtainerBase +import datetime +import calendar +from dateutil import parser +from dateutil.parser import parse +import time + +''' +Update the Docker Hub registry to match what is in the registry named in the +labtainer.config file. Includes an option to go the other direct for use in +cases where the premaster registry becomes corrupt. +''' +def pull_push(image, remote_registry, local_registry): + with_registry = '%s/%s' % (remote_registry, image) + cmd = 'docker pull %s' % with_registry + print(cmd) + os.system(cmd) + cmd = 'docker tag %s/%s %s/%s' % (remote_registry, image, local_registry, image) + print(cmd) + os.system(cmd) + cmd = 'docker push %s/%s' % (local_registry, image) + print(cmd) + os.system(cmd) + +def refreshLab(labdir, lab, role, remote_reg, local_reg, logger, no_copy): + ''' force local to match remote ''' + logger.debug('Refresh containers for lab %s' % lab) + docker_dir = os.path.join(labdir, lab, 'dockerfiles') + if not os.path.isdir(docker_dir): + logger.debug('No docker file for %s, bail' % lab) + return + + df_list = [f for f in os.listdir(docker_dir) if os.path.isfile(os.path.join(docker_dir, f))] + for df in df_list: + if df.endswith('.swp'): + continue + try: + parts = df.split('.') + image = '%s.%s.%s' % (parts[1], parts[2], role) + container = parts[2] + except: + print('could not get image from %s' % df); + continue + local_created, local_user, local_version, tag, base = InspectLocalReg.inspectLocal(image, logger, local_reg, no_pull=True) + logger.debug('%s %s' % (image, local_created)) + + with_reg = '%s/%s' % (remote_reg, image) + remote_created, remote_user, remote_version, tag = InspectRemoteReg.inspectRemote(with_reg, logger, no_pull=True) + logger.debug('%s %s' % (with_reg, remote_created)) + if remote_created is not None: + if local_created != remote_created: + print('DIFFERENT: %s:%s local created/version %s/%s remote: %s/%s' % (lab, container, local_created, + local_version, remote_created, remote_version)) + logger.debug('DIFFERENT: %s:%s local created/version %s/%s remote: %s/%s' % (lab, container, local_created, + local_version, remote_created, remote_version)) + if not no_copy: + pull_push(image, remote_reg, local_reg) + else: + logger.debug('refreshLab, no diff for %s' % image) + else: + print('ERROR, no remote info for image %s' % image) + exit(1) + +def updateLab(labdir, lab, role, remote_reg, local_reg, logger, no_copy, release_date): + ''' push local lab containers to remote, i.e., as part of a release ''' + docker_dir = os.path.join(labdir, lab, 'dockerfiles') + if not os.path.isdir(docker_dir): + return + + df_list = [f for f in os.listdir(docker_dir) if os.path.isfile(os.path.join(docker_dir, f))] + for df in df_list: + if df.endswith('.swp'): + continue + try: + parts = df.split('.') + image = '%s.%s.%s' % (parts[1], parts[2], role) + container = parts[2] + except: + print('could not get image from %s' % df); + continue + local_created, local_user, local_version, tag, base = InspectLocalReg.inspectLocal(image, logger, local_reg, no_pull=True) + + x=parse(local_created) + image_date = calendar.timegm(x.timetuple()) + #print('%s' % image) + #print('\timage ts %s' % image_date) + #print('\trelease ts %s' % release_date) + + if image_date < release_date: + #print('image %s local: %s prior to release: %s' % (image, image_date, release_date)) + continue + else: + print('image %s local: %s NOT prior to release: %s WOULD check remote' % (image, image_date, release_date)) + + if local_created is not None: + with_reg = '%s/%s' % (remote_reg, image) + remote_created, remote_user, remote_version, tag = InspectRemoteReg.inspectRemote(with_reg, logger, no_pull=True) + if local_created != remote_created: + print('DIFFERENT: %s:%s local created/version %s/%s remote: %s/%s' % (lab, container, local_created, + local_version, remote_created, remote_version)) + logger.debug('DIFFERENT: %s:%s local created/version %s/%s remote: %s/%s' % (lab, container, local_created, + local_version, remote_created, remote_version)) + if not no_copy: + pull_push(image, local_reg, remote_reg) + else: + logger.debug('updateLab, no diff for %s' % image) + else: + print('ERROR, no local info for image %s' % image) + exit(1) + + + +def doUpdateOrRefresh(local_registry, remote_registry, args, lgr): + ''' either push local images to remote registry (an update, which is the default), or pull remote images into local registry (refresh). ''' + if not args.quiet and not args.no_copy: + if not args.refresh: + msg = 'The will push images from the %s registry to the %s registry. Continue? (y/n)' % (local_registry, remote_registry) + else: + msg = 'The will push images from the %s registry to the %s registry. Continue? (y/n)' % (remote_registry, local_registry) + confirm = str(input(msg)).lower().strip() + if confirm != 'y': + print('aborting') + exit(1) + + if not args.refresh and not args.no_copy: + os.system('docker login') + + ldir = os.getenv('LABTAINER_DIR') + if ldir is None: + print('LABTAINER_DIR not defined.') + exit(1) + labdir = os.path.join(ldir, 'labs') + + homedir = os.getenv('HOME') + release_file=os.path.join(homedir, 'labtainerRelease', 'latest_refresh') + if not os.path.isfile(release_file): + lgr.error('No release file found at %s, create that file to skip dockerhub queries.' % release_file) + exit(1) + release_date = None + with open(release_file) as fh: + for line in fh: + pass + try: + release_date = time.mktime(datetime.datetime.strptime(line.strip(), '%m/%d/%Y %H:%M:%S').timetuple()) + except: + print('Error parsing times in %s' % release_file) + exit(1) + release_string = time.strftime('%m/%d/%Y %H:%M:%S', time.gmtime(release_date)) + lgr.debug('Release date found: %s' % release_string) + + if args.lab is not None: + if not args.refresh: + updateLab(labdir, args.lab, 'student', remote_registry, local_registry, lgr, args.no_copy, release_date) + else: + refreshLab(labdir, args.lab, 'student', remote_registry, local_registry, lgr, args.no_copy) + else: + + lgr.debug('Do all images') + grader = 'labtainer.grader' + local_created, local_user, local_version, tag, base = InspectLocalReg.inspectLocal(grader, lgr, local_registry) + + if local_created is not None: + x=parse(local_created) + image_date = calendar.timegm(x.timetuple()) + + if image_date > release_date: + print('gradelab local: %s NOT prior to release: %s WOULD check remote' % (image_date, release_date)) + with_reg = '%s/%s' % (remote_registry, grader) + remote_created, remote_user, remote_version, tag = InspectRemoteReg.inspectRemote(with_reg, lgr, no_pull=True) + lgr.debug('%s local: %s remote: %s' % (grader, local_created, remote_created)) + if local_created != remote_created: + print('DIFFERENT: %s local created %s remote: %s' % (grader, local_created, remote_created)) + if not args.no_copy: + if not args.refresh: + pull_push(grader, local_registry, remote_registry) + else: + pull_push(grader, remote_registry, local_registry) + else: + print('No %s image on docker hub!' % grader) + lgr.debug('No %s image on docker hub!' % grader) + exit(1) + + skip = [] + with open('skip-labs') as fh: + for line in fh: + f = os.path.basename(line).strip() + print('will skip [%s]' % f) + skip.append(f) + + #lab_list = os.listdir(labdir) + mycwd = os.getcwd() + os.chdir(labdir) + cmd = 'git ls-files ./ | cut -d/ -f1 | uniq' + child = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE) + output = child.communicate() + lab_list = output[0].decode('utf-8').strip().splitlines() + os.chdir(mycwd) + #lab_list = [x[0] for x in os.walk(labdir)] + for lab in sorted(lab_list): + if lab not in skip: + if args.start is None or lab >= args.start: + if not args.refresh: + updateLab(labdir, lab, 'student', remote_registry, local_registry, lgr, args.no_copy, release_date) + else: + refreshLab(labdir, lab, 'student', remote_registry, local_registry, lgr, args.no_copy) + + if not args.no_copy: + with open(release_file, 'a') as fh: + ct = datetime.datetime.now() + ts = ct.strftime('%m/%d/%Y %H:%M:%S') + fh.write(ts+'\n') + if not args.refresh: + print('Comparing base images in %s to %s, and replacing content of %s if different' % (local_registry, remote_registry, remote_registry)) + else: + print('Comparing base images in %s to %s, and replacing content of %s if different' % (local_registry, remote_registry, local_registry)) + ''' + base_names = LabtainerBase.getBaseList() + for base in base_names: + with_registry = '%s/%s' % (remote_registry, base) + print(base) + remote_created, remote_user = RemoteBase.inspectRemote(with_registry, lgr) + local_created, local_user = LocalBase.inspectLocal(base, lgr, local_registry) + if remote_created != local_created: + print('Difference in %s, local: %s remote: %s' % (base, local_created, remote_created)) + if not args.no_copy: + if not args.refresh: + pull_push(base, local_registry, remote_registry) + else: + pull_push(base, remote_registry, local_registry) + headless_images = ['labtainer.master.base', 'labtainer.master.headless'] + for base in headless_images: + with_registry = '%s/%s' % (remote_registry, base) + print(base) + remote_created, remote_user = RemoteBase.inspectRemote(with_registry, lgr) + local_created, local_user = LocalBase.inspectLocal(base, lgr, local_registry) + if remote_created != local_created: + print('Difference in %s, local: %s remote: %s' % (base, local_created, remote_created)) + if not args.no_copy: + if not args.refresh: + pull_push(base, local_registry, remote_registry) + else: + pull_push(base, remote_registry, local_registry) + ''' + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description='Update the remote (Docker Hub) registry to match the local test registry (premaster).') + parser.add_argument('-n', '--no_copy', action='store_true', default=False, help='Do not modify registry, just report differences') + parser.add_argument('-r', '--refresh', action='store_true', default=False, help='Force mirror to match remote') + parser.add_argument('-q', '--quiet', action='store_true', default=False, help='Do not prompt for confirmation') + parser.add_argument('-l', '--lab', action='store', help='only check this lab') + parser.add_argument('-s', '--start', action='store', help='Start with this lab (Docker rate limits!)') + args = parser.parse_args() + + config_file = '../config/labtainer.config' + labtainer_config = ParseLabtainerConfig.ParseLabtainerConfig(config_file, None) + lgr = LabtainerLogging.LabtainerLogging("/tmp/refresh_mirror.log", 'none', config_file) + + local_registry = labtainer_config.test_registry + remote_registry = labtainer_config.default_registry + doUpdateOrRefresh(local_registry, remote_registry, args, lgr) diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/release/README.txt b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/release/README.txt new file mode 100644 index 000000000..6af59a1c1 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/release/README.txt @@ -0,0 +1,3 @@ +Temporary directory resulting from botched change in distribution strategy. +Had used github large files. Moving instead to github releases. This "update" +is just the update-add.sh script that will download from the proper url. diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/release/labtainer.tar b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/release/labtainer.tar new file mode 100644 index 000000000..49a128970 --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/release/labtainer.tar @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:19b851d0ead7f2639c23002d5b8e5a0539e6f52c5c4f50a7f51e2a6da578f3b3 +size 10240 diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/reset_premaster.sh b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/reset_premaster.sh new file mode 100755 index 000000000..aa35e89bc --- /dev/null +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/reset_premaster.sh @@ -0,0 +1,15 @@ +#!/bin/bash +# +# Revert the premaster branch to match master, and force +# the premaster registry to match DockerHub images. +# +branch=$(git rev-parse --abbrev-ref HEAD) +git checkout master +git push -d origin premaster +git branch -D premaster +git checkout -b premaster +git checkout $branch +# +# echo now refresh the mirror (premaster registry) to match GitHub +# +./refresh_mirror.py -r diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/retag_all.py b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/retag_all.py index 7594fb244..02b99127f 100755 --- a/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/retag_all.py +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/retag_all.py @@ -1,4 +1,33 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 +''' +This software was created by United States Government employees at +The Center for Cybersecurity and Cyber Operations (C3O) +at the Naval Postgraduate School NPS. Please note that within the +United States, copyright protection is not available for any works +created by United States Government employees, pursuant to Title 17 +United States Code Section 105. This software is in the public +domain and is not subject to copyright. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +''' import os import sys import argparse @@ -36,7 +65,7 @@ def do_lab(lab_dir, lab, role, registry): print('could not get image from %s' % df); continue cmd = './relabel.sh %s %s %s %s %s' % (registry, framework_version , image, image_base, base_id) - print cmd + #print cmd os.system(cmd) def main(): diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/skip-labs b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/skip-labs index 82050624d..d22c2d055 100644 --- a/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/skip-labs +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/distrib/skip-labs @@ -13,3 +13,12 @@ labtainer/trunk/labs/centos-log labtainer/trunk/labs/dhcp-test labtainer/trunk/labs/xlab labtainer/trunk/labs/softplc +labtainer/trunk/labs/iptables +labtainer/trunk/labs/grfics +labtainer/trunk/labs/usbtest +labtainer/trunk/labs/ida +labtainer/trunk/labs/centossix +labtainer/trunk/labs/routing-basics2 +labtainer/trunk/labs/shellbasics +labtainer/trunk/labs/ldaptst +labtainer/trunk/labs/mariadbtst diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/docs/development/Makefile b/modules/utilities/unix/labtainers/files/Labtainers-master/docs/development/Makefile index a06cd457a..861ea16f4 100644 --- a/modules/utilities/unix/labtainers/files/Labtainers-master/docs/development/Makefile +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/docs/development/Makefile @@ -1,6 +1,7 @@ +all: development.pdf development.pdf: development.tex - latex development + pdflatex development pdflatex development clean: rm -fr auto - rm -fr development.aux development.pdf + rm -fr *.aux *.pdf *.dvi *.log *.ps *.toc diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/docs/development/compat.tex b/modules/utilities/unix/labtainers/files/Labtainers-master/docs/development/compat.tex index e0d1b408b..0fe6e7f58 100644 --- a/modules/utilities/unix/labtainers/files/Labtainers-master/docs/development/compat.tex +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/docs/development/compat.tex @@ -1,5 +1,7 @@ Note on backward compatibility +SUPERCEEDED. Retain only for history. + A user may easily get a new container image that requires framework script support not present in the user's environment, e.g., has not yet done an update-labtainer.sh. diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/docs/development/dev.tex b/modules/utilities/unix/labtainers/files/Labtainers-master/docs/development/dev.tex deleted file mode 100644 index f58cde9d2..000000000 --- a/modules/utilities/unix/labtainers/files/Labtainers-master/docs/development/dev.tex +++ /dev/null @@ -1,93 +0,0 @@ -The framework has not yet been adapted to use Linux package managers. -Currently, scripts are run from a workspace directory and python -paths are managed relatively between scripts. - -Student scripts, e.g., start.py, run from the trunk/scripts/labtainer-student directory. -That directory also contains the labutils.py, which contains most of the framework -functions. - -When a student container is first started "docker exec" is used -to run parameterize.sh on the container. - -That script also invokes hookBash.sh, which adds the bash -sdtin/stout capturing hook, and adds the startup.sh call -into the .profile. - -The startup.sh scripts differ between instructor and student. The latter -displays instructions.txt. The former runs grading. -The startup.sh uses a lock to control which -terminal displays the instructions or grading. In practice instruction -display and the running of the instructor.py script is done by -an xterm that explicitly runs the startup.sh directly, and thus -the startup.sh invoked by profile.sh typically never does anything. -HOWEVER... the startup.sh invoked by student will source a student_startup.sh if present. - -Regression testing of grading functions is performed by labtainer-instructor/regress.py. -Expected results are stored in the labtainer/testsets directory. - -\section{Developer Software Prerequisits} -\begin {itemize} -\item Subversion -\item Latex (texlive-full) -\end {itemize} - - -\section{Getting Labtainers from Subversion} -svn co https://tor.ern.nps.edu/svn/proj/labtainer -Change directory to trunk/setup-scripts and run ./build-docs.sh to build the PDF lab -manuals so that you can reference the manuals while you test or otherwise reference -existing labs. (Please follow the lab manual and report discrepancies!) -Then run ./pull-all.sh to pull all the baseline images (so that your running of -existing labs is more akin to what students and instructors do so we can better test that). - -\section{Testing and Running Existing Labs} -There are situations where you will run an existing lab, e.g., to test it, or to -observe some example. When running labs, please refer to the lab manuals -so that they get reivewed and tested by different people. Also, please first delete -the lab using trunk/setup\_scripts/removelab.sh to ensure that you are running the latest -version of the published lab. If you find the lab to be broken, e.g., missing a file, please -attempt to run "rebuild.py" on the lab. Report these findings to the lab author. And always -run removelab.sh after you have run an existing lab via rebuild.py. Again, the goal is to -force ourselves to run the distributed labs unless we have specific reasons to do otherwise. - - -\section{Automation and Distributions} -The mkdist.sh script runs on a Linux VM hosted on windows, and creates the distribution tar -and copies it into a shared folder. From that folder, it is copied to the -\\my.nps.edu@SSL\DavWWWRoot\webdav\c30-staging\document\_library" and then "Publish to Live" is -performed on the Liferay site. -Two prepackaged VMs are maintained: one for VirtualBox, and one for VMWare. Each include -their respective guest additions. The VMs are maintained on a Linux system using command line -utilities, e.g., VBoxManage. The VMs are rigged to update labtainers, including a pull of -baseline images, on each boot until the first lab is commenced. Scripts named "export*" are -used to created the appliance files. The scripts re-import into test images, which must be -manually tested. The WinSCP script pushes new applicance images to the CyberCIEGE download -directory on the C3O web server. (Wine and WinSCP must be installed on the Linux host that -manages the VMs. - -\section {Race condition on checklocal.sh output} -If an mynotify.py event causes an output from checklocal.py, that may conflict with -concurrent output from checklocal.py resulting from some program/script running. In -theory, the program/script should complete its run of checklocal before the program/script -actually gets to access the file that triggers a mynotify watch. So, the latter's output -to the timestamped file is appended. Further, the mynotify.py looks for an existing timestamped -file, and if not found, looks for one from the previous second. This hack is an attempt to -keep the outputs merged. It will fail if the access does not happen within a second of the -program start. See the acl lab. - -\section {installation sizes} -An initial install, including the base images, requires about 4GB. Installing a larger lab, -e.g., snort, requires an additional 1GB. Running bufoverflow added 22M. - -\section {temporal logic considerations} -When evaluating results from logfiles containing timestamps use FILE\_TS or FILE\_TS\_REGEX -to ensure you get timestamped values for only matching records. Reliance on goals.config to -matchany can result in timestamped results that don't corrolate to the desired record. - -\section {parameterizing the start.config} -Is difficult. The current parameterization features only affect containers, and leave no -persistent trail. Thus, several students could share a computer and, via "redo.py", each -perform that same lab with parameterization maintained for each student. There is only one -start.config per Labtainers installation. But... the start.config is only used during -docker create container. So that could be driven from a copy that is parameterized as needed? -Except, the parameterized values are available for assessment. diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/docs/development/development.pdf b/modules/utilities/unix/labtainers/files/Labtainers-master/docs/development/development.pdf new file mode 100644 index 0000000000000000000000000000000000000000..210afb3bf39bb82d8fdfb6f44c91bc27e8f16e2f GIT binary patch literal 241020 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 z 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

_g{xZ1(`(Wc9JAiyei4|4hQLO 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

c=T4 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≦fYm( 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 +are not distributed, they are in {\tt labtainer/simlab/} Get simlab data sets using +\begin{verbatim} +git clone https://gitlab.nps.edu/mfthomps/Labtainers-simlab.git/ +\end{verbatim} + \end{itemize} \end{itemize} -\section {Control Flow} -Student scripts, e.g., start.py, run from the scripts/labtainer-student directory. +\subsection{Control flow} +Student scripts, e.g., {\tt labtainer}, run from the scripts/labtainer-student directory. That directory also contains the bin/labutils.py, which contains most of the framework functions. +The first time a given lab is run, the {\tt docker create} function is +used to create containers. The {\tt docker start} function is then used to start +the container, and is used for subsequent starts of the same lab. + When a student container is first started "docker exec" is used to run parameterize.sh on the container. @@ -150,11 +208,25 @@ sdtin/stout capturing hook, and adds the startup.sh call into the .profile. The startup.sh uses a lock to control which -terminal displays the instructions or grading. In practice most +terminal displays the instructions. In practice most instructions are now pdf files. The startup.sh invoked by student will source a student\_startup.sh if present. -\section{Automation and Distributions} +The Student.py script runs when a lab is stopped to collect artifacts and kill lingering +monitored processes. + +Grading is performed on a separate container built for each lab, derived from the +labtainer.grader image. + +The {\tt checkwork} function forces a collection of artifacts, and a grader container +is then run to perform grading. + +\subsection{mynotify} +The mynotify runs as a service. It is installed from the labtainer-student/lab\_bin directory. +It will exit silently if the lab has no notify file in .local/bin. See its log on each container +within /tmp/mynotify.log The service uses the Linux inotify service to detect and record access to files. + +\section{Distribution publishing} The Labtainer framework is distributed via the c3o website as a tar file, or, optionally a VM applicance (both VMWare and VirtualBox). The Docker images are distributed via the Docker Hub. @@ -167,18 +239,22 @@ From that shared folder, the two tar files are copied to the \noindent and then "Publish to Live" is performed on the Liferay site. -Two prepackaged VMs are maintained: one for VirtualBox, and one for VMWare. Each include +The distributions are created from a git repos, as described in section \ref{releases}. + +\subsection{VM Appliances} +Two prepackaged VM appliances are maintained: one for VirtualBox, and one for VMWare. Each include their respective guest additions. The VMs are maintained on a native Linux system using command line -utilities, e.g., VBoxManage. The VMs are rigged to update labtainers, including a pull of +utilities, e.g., VBoxManage. The VMs are rigged to update Labtainers, including a pull of baseline images, on each boot until the first lab is commenced. Scripts named "export*" are used to created the appliance files. The scripts re-import into test images, which must be manually tested. The WinSCP script pushes new applicance images to the CyberCIEGE download directory on the C3O web server. (Wine and WinSCP must be installed on the Linux host that manages the VMs. -New baseline images are created using scripts/designer/bin/create\_all.sh. Note its comment -about deleting all docker images first. When new baselines are created, use the labtainer-scripts -on the native Linux system to update the VM appliances so they contain the latest baseline images. +The VM appliances should be updated or recreated whenever changes are made to Labtairer base +images, otherwise, they are not expected to be changed. To revise the VM appliances, use the scripts +from host\_scripts on +on the Linux system that hosts VirtualBox and VMWare to update the VM appliances so they contain the latest baseline images. After the VM starts and updates the baseline images, use: \begin{verbatim} sudo dd if=/dev/zero of=/emptyfile bs=1M @@ -199,44 +275,337 @@ tests. Do the same for vmware. -Then push the images to the web server +Then push the images to the web server, in our case this is the nps.box.com account +pointed to by the Labtainers web server. The appliances automatically update the baselines and the Labtainer scripts on boot, so there is only really advantage to doing this for baseline changes, since they take a while to download. -After running the poweron/poweroff scripts, then run the exportVM.sh to -\section {installation sizes} +\subsubsection {Installation sizes} An initial install, including the base images, requires about 4GB. Installing a larger lab, e.g., snort, requires an additional 1GB. Running bufoverflow added 22M. -\section {Maintenance notes} -When working on a significant change, do so in a distinct branch: +\section {Source control and Configuration Management} +\label{releases} +This section describes Labtainers source control and mechanisms to support continuous +integration. Labtainers is managed using git, Docker registries, and a set of custom scripts that control +rebuilding and publishing of artifacts. Artifacts are published to test environments associated with each +development branch of the product. Publishing releases for public distribution occurs after development +branches are tested and merged into the master git branch. + +\subsection{Build artifacts} +Labtainers development creates the following artifacts: \begin{itemize} -\item Create a new branch: {\tt git checkout -b newbranch} -\item Make changes -\item Push changes in progress {\tt git push --set-upstream origin newbranch} -\item Pull new branch from other repo -- first checkin all local changes or stash. -\begin{itemize} -\item {\tt git pull} -\item {\tt git checkout newbranch} -\end{itemize} -\item After testing, merge to branch into master: -\begin{itemize} -\item Checkout master: {\tt git checkout master} -\item merge: {\tt git merge newbranch} -\end{itemize} +\item The distribution tar file for students, available as an artifact on GitHub +\item A distribution tar file for lab designers. This is simply the master tar file from GitHub. +\item A zip file of all the lab manuals, available as an artifact on GitHub. +\item A JAR file for the labedit UI, available as an artifact on GitHub. +\item A test script tar distribution containing SimLab scripts. (These come from a separately managed repo.) +\item The Docker container images for each lab. +\item The Docker container image for the grader. \end{itemize} +The tar distributions are created using scripts from the {\tt distrib} directory. The Docker images are built and published to +a Docker registry using the publish.py script, which includes file dependency logic to only rebuild images when one +of their sources change. By default, the publish.py script pushes to a local registry rather than to the DockerHub. +Updated images are pushed to the DockerHub as part of publishing a new revision of Labtainers. + +Currently, there is no attempt to archive Docker image artifacts, i.e., only the latest versions are available on publishing sites. +Code artifacts are managed within GitHub. + +\subsubsection{Build steps} +The following steps must be performed for each build to ensure testing is based on the latest file versions. +These steps are implemented with in the {\tt full\_build.sh} script. +\begin{enumerate} +\item Pull the latest git version of the current branch with {\tt git pull} +\item Refresh branch registry from the premaster (unless building premaster) using {\tt refresh\_branch.py} +\item Rebuild and publish Labtainer base images using {\tt scripts/labdesigner/bin/mkbases.py} +\item Rebuild and publish labs using {\tt publish.py} +\item Create distribution tar files with {\tt mkall.sh} +\item Run smoke test on Ubuntu16 and Ubuntu18 machines using scripts in {\tt testsets/bin} +\end{enumerate} + +\subsubsection{Base images} +Changes to base docker images referenced by the lab containers will trigger rebuilds. Base docker images are extended by creating +new dockerfiles with ``.xtra'' file extensions. +This lets us add features to a base without rebuilding all previous labs that use that base. +While these ``.xtra'' images are built with docker files managed within the +designer/base\_dockerfiles directory they are not true base images. +Only the true base images are included in the initial distribution. +In general, avoid changes to a base docker image because doing so could lead some installations +to include two copies of the base image, which are very much larger than most other Labtainer images. +Modifications to an xtra extension image will not affect existing installations that have run +some labs. Whenever a new lab is started, if it relies on a newer version of the xtra extension, that will be pulled as needed for the +lab container images. + +When a lab container image is created, it is labeled with the base image name and its image ID (a checksum generated by Docker). +This label is generated by a dockerfile that provides labeling veneer on top of newly created images (see the {\tt relabel} function +of the {\tt publish.py} script. + +When a lab is started, the framework confirms it contains the appropriate base image. If not, the user is prompted to download it. + +\subsubsection{Framework versions} +The ``framework version'' is a mechanism for providing compatability between new labs and the framework. This value is indpendent of +release identifiers. As a Labtainers lab evolves, it may require additional support from the framework. If a new lab image requires +an updated Labtainers framework, then the "framework\_version" must be incremented within the +bin/labutils.py script \textbf{before} the image is built and published. This will prompt users +to run update-labtainer.sh prior to running any newer lab image. +Also insure that these lines are present in the container dockerfile: +\begin{verbatim} +ARG version +LABEL version=$version +\end{verbatim} +\noindent And, be sure to publish the revised framework before publishing the revised lab(s). + + +\subsection{Releases and Container Images} +A Labtainers \textit{release} contains the set of artifacts described above. File versions within the tar files +of a release are all pulled from the git \textit{master} git branch on the development system. Docker container images within a release are built from a +\textit{premaster} git branch as described below, and then pushed to DockerHub via the {\tt refresh\_mirror.py} script. + +New releases are created as follows: +\begin{itemize} +\item The premaster branch is tested using {\tt full\_build.sh} to ensure container images reflect the latest code, and Jenkins builds which +ensure the premaster in github runs all regression tests. +\item Merge premaster into master. Do this manually (ignore automated scripts in distrib directory), and fix any merge conflicts. {git merge --no-ff premaster} +\item Use {\tt refresh\_mirror.py} to push premaster registry images to Docker Hub. +\item Determine the next git tag to use for the version ID, and pass that to {\tt justrelease.sh} (be sure to first activate an +ssh agent and get the github personal access token. +\end{itemize} + +\subsubsection{The premaster branch} +Labtainers source control management includes a \textit{premaster} branch which shall always be on the workflow of +creating new releases. All merges on the path to a release go through the premaster branch. No changes are made to the master +branch. The only way the master branch ever is updated is via a merge with the premaster branch, after all of its testing is +complete. This approach has two goals: 1) ensure that results of merge conflict resolution are tested prior to +inclusion within the master, and allow us to test container images before they are published in a new version. + +Container images on DockerHub are +pushed from a registry containing images build from the premaster branch. The push occurs during the final merge from the +premaster branch into the master branch during a release step. The images within the premaster registry are updated only through +a rebuild, i.e., {\tt full\_build.sh}. Images are not not pushed from development registries directly to the premaster registry. + +It is intended that no changes be made directly to the premaster branch, rather, changes are merged into the premaster from +other development branches. Once a merge into the premaster commences, no hotfixes affecting build images should occur until +the merge completes and the premaster is merged into the master. + +\subsection{Development branches} +Development of new features and fixes occur within development branches. +New branches are made off of the premaster branch, but not during a premaster merge. + +Remove local branches with: +\begin{verbatim} + git branch -d +\end{verbatim} +\noindent Or use the {\tt -D} option to force deletion. But, that not needed if the branch was properly merged. +Remove remote branches with +\begin{verbatim} + git push origin --delete +\end{verbatim} + +\subsection{Test registries} +The test registries are used to test the premaster and development branches of Labtainers. + +Test registries are named by their port numbers (currently, all test registries must reside on the same host). +These port numbers are mapped to git branch names. This mapping occurs in the +config/registry.config file. +The rebuild.py command pulls from the registry associated with the current branch. + +All development systems are intended to have the {\tt TEST\_REGISTRY} environment variable set to YES so that images are +pulled and pushed to the appropriate test registry, which is determined based on the current git branch. Test systems +will have a {\tt REGISTRY\_BRANCH} environment variable that explicitly identifies the branch for mapping to a regisitry +using the registry.config file. + +Within the test systems and the development host , i.e., the computer that builds distributions and docker images, update +the /etc/docker/daemon.json file to reflect new registries as "insecure". +\begin{verbatim} + "insecure-registries": [ + "testregistry:5000", + "testregistry:5001", + "testregistry:5002", + "testregistry:5003" + "testregistry:5004" + ] +\end{verbatim} +\noindent On the Linux system that hosts the development VMs, create the test registries using {\tt host\_scripts/start\_reg.sh}. + +\subsection{Testing} +Regression testing occurs within testing VMs that are provisioned from the Labtainer VBox appliance as follows: +\begin{itemize} +\item clone (as linked) a smoketest box +\item remove ~/.doupdate +\item echo "frank@beans.com" \textgreater ~/.local/share/labtainers/email.txt +\item add \$HOME/labtainer/trunk/testsets/bin to path in bashrc +\item visudo and change sudo etnry to: ALL=(ALL) NOPASSWD:ALL +\item apt-get install xdotool +\item apt-get install vim +\item setup\_scripts/prep-testregistry.sh +\item touch ~/labtainer/.dosmoke +\item run the {\tt setup\_scripts/smoke-profile-add.sh} +\item Add the vbox share group using {\tt setup\_scripts/vbox-share.sh} +\item Map the SEED directory on the Linux host as a shared folder. Accept defaults so its name is +\begin{verbatim} + /media/sf_SEED +\end{verbatim} +\item Edit the /etc/hosts and /etc/hostname to define a distinctive hostname, e.g., {\tt ubuntu16smoke}. +\item Create a directory at {\tt SEED/test\_vms/}. +\item On the development VM, create a script in {\tt testsets/bin} modeled after {\tt test-ubuntu18.sh} +\item Modify the {\tt setup\_scripts/full\_build.sh} script to invoke the new test script. +\end{itemize} + + +The {setup\_scripts/smoketest.py} scripts represents the test procedures for Labtainers. +It is expected that local repo development branches will be tested prior to pushing them to GitHub. Similarly, the +results of premaster branch merges are expected to be tested locally before it is pushed to GitHub. A test run +from a fresh pull from GitHub premaster branch is a prerequisite to publishing a new release. + +Local bench testing, e.g., using {\tt rebuild} for a small set of labs, depends on the git workspace and the test registry for the current branch. +Local branch testing, i.e., use of full\_build.sh, uses the local repo. It is up to the developer to ensure that is up to date. + +Integration testing pulls from the GitHub repo for the desired branch. + + +\subsection{Merging} +Development branches are merged into the premaster branch as part of creating a new release. +\begin{itemize} +\item Be sure that any and all new and changed files are commited in the development branch, and these have been tested. +\item Refresh the premaster registry to ensure it matches the DockerHub images: {\tt ./refresh\_mirror.py -r} +\item {\tt git checkout premaster} +\item {\tt git merge } +\item Fix any confilicts +\item Rebuild images using the premaster branch source: {\tt ./full\_rebuild.py} +\item Run smoketest. +\item Push premaster to GitHub: +\begin{verbatim} + git push --set-upstream origin premaster +\end{verbatim} +\end{itemize} + +Revert to premaster in case of merge issues or other failures using {\tt revert\_premaster.sh}. + +\subsection{Publish new release} +The steps for merging premaster into master and creating a new distrubtion are captured in the {\tt distrib/mergePre.sh} script. +Labtainer releases are managed as GitHub releases, using git tags and the {\tt github\_release} tool. + +\begin{verbatim} +git tag +git push +git push --tags +\end{verbatim} + +Use the {\tt mkrelease.sh} script to create the release files within GitHub. + +\subsection{Continuous integration with Jenkins} +A Jenkins pipeline automates periodic testing of {\tt premaster} branch of Labtainers. The pipeline script is backed up in +{\tt tesetsets/bin/jenkins\_pipeline.txt}. The pipeline pulls from the premaster branch of the GitHub repo. It builds any +changed lab images (**TBD flag those to remind to merge the premaster registry into the master). It then generates the +student and designer distributions and uses those to run the smoketest VMs. + +\subsubsection{Jenkins installation} +The stock Jenkins is installed on the development VM. +After installing Jenkins, add the jenkins user to the vboxfs and the docker groups +\begin{verbatim} + sudo usermod -a -G vboxsf jenkins + sudo usermod -a -G docker jenkins +\end{verbatim} + +Jenkins workspace is at /var/lib/jenkins/workspace/labtainer-build/Labtainers +Check logs to make sure Jenkins git repo is not falling behind. + +Manually go to the Jenkins labtainer-build directory and clone the Labtainer-simlab repo +\begin{verbatim} +git clone https://:@gitlab.nps.edu/mfthomps/Labtainers-simlab.git +\end{verbatim} + +\section{Developer guidelines} +\subsection{Testing and Running Existing Labs} +When running labs, the goal is to force ourselves to run the distributed labs unless we have specific reasons to do otherwise. +Labtainers will use locally-created container images if they are present -- and these may be stale. +\begin{enumerate}[label=\Alph*] + \item ) To ensure that you are running the latest version of the published lab (or version assocated with your current git branch), first delete the current version of the lab using setup\_scripts/removelab.sh. + + \item ) If you find the lab to be broken, e.g., missing a file, please attempt to run "rebuild.py" on the lab. rebuild.py will ouput a log of issues. Report these findings to the lab author. + + \item ) Always run removelab.sh after you have run an existing lab via rebuild.py. + + \item ) Please review the lab's manual very closely. This is so that both the lab itself and the lab's manual can receive feedback for improvement. +\end{enumerate} + +\section{GNS3 Support} +Please refer to the guide in {\tt docs/gns3} for information on integrating Labtainers with GNS3. + +\section{Dev Ops notes} +The Jenkins utility and test VMs all run on the Ubuntu18-150 VM (the ``development VM''), which runs on the +{\tt mike-Precision-Tower-7910} workstation, which is an Ubuntu 16 distribution. +The VM can be remotely started using the {\tt ~/startBigVM.sh} script (TBD make service). +The {\tt vbox-test-server} service on the workstation will start smoketest VMs in response +to scripts run on the development VM, e.g., started by Jenkins. + +Jenkins is configured to rebuild from GitHub every night. + +A cron job is configured to rebuild using the local repo each night. +An ssh tunnel to the workstation is created to access Jenkins web interface. + +Use {\tt vboxmanage list runningvms} to confirm the development VM is running. +Smoketest logs appear in a shared folder at ~/SEED/smokelogs. + +\subsection{Test VMs} +The host directory at {\tt SEED/test\_vms/} is used to communicate with test VMs. +The {\tt CURRENT\_BRANCH} environment variable is set to determine which test repo +will be used as found in the config/registry.config file. + +\section{Capturing stdin/stdout} +The user's {\tt .bashrc} sources two scripts to set up and manage functions that run prior to the +execution of the target command. If the target command is to be monitored (e.g., is not a system command), +then stdin and stdout are mirrored to timestamped files in the .local/result directory. This mirroring +is performed by the {\tt capinout} program whose source is in the {\tt tool-src/capinout} directory. +The {\tt capinout} program is designed to handle use of pipes and redirection within the command. The +{\tt capinout} process (or one if its children) will fork/exec the {\tt wrap\_exec.sh} shell, which sets +signal handling and uses {\tt eval} to run the target command. Commands +that simply use stdin and stdout without pipes are managed using a pty that allows the command to control the +terminal, e.g., to mask passwords or provide curses controls. This requires a number of processes, as follows: +\begin{itemize} +\item The first process, called the \textit{stage}, simply waits for its child to exit, or for its child to report +that the command process has orphaned a child, in which case the stage will exit, freeing up the terminal while the +orphan continues to run and potentially send output to stdout and the timestamped mirrored file. +\item The stage +process forks a child called \textit{capinout} that creates the master pty and performs the mirroring. +\item The capinout process creates a \textit{reaper} process that becomes the session leader and controller of the pty terminal. +\item The reaper then forks the command process which execs the wrap-exec.sh script. Any orphans of the command process are reparented to the +reaper, and if the reaper detects the command process exiting and leaving orphans, it signals the capinout process which +in turn signals the stage so that the stage can exit. +\end{itemize} +\includepdf[pages=-,pagecommand={},width=\textwidth]{../../tool-src/capinout/capinout.pdf} + +\section {Headless Labtainers} +See README files in the headless-lite; azure; and google directories for information about flavors of headless Labtainers (that run +on cloud servers or other platforms lacking standard X11 desktops. +\subsection{Gnome terminal issues} +If gnome termainals are created prior to completion of container initialization, the gnome terminal may start and then exit. This +might occur when the initial Labtainers terminal is created on the labtainers container in a headless environment. It may also occur +when starting a lab (but why then would it also kill the original Labtainers terminal?). + \section {Notes} -\subsection {Race condition on checklocal.sh output} -If an mynotify.py event causes an output from checklocal.py, that may conflict with -concurrent output from checklocal.py resulting from some program/script running. In -theory, the program/script should complete its run of checklocal before the program/script +\subsection {Race condition on precheck.sh output} +If an mynotify.py event causes an output to a timestamped file named precheck, that may conflict with +concurrent output from precheck.py resulting from some program/script running. In +theory, the program/script should complete its run of precheck before the program/script actually gets to access the file that triggers a mynotify watch. So, the latter's output to the timestamped file is appended. Further, the mynotify.py looks for an existing timestamped file, and if not found, looks for one from the previous second. This hack is an attempt to keep the outputs merged. It will fail if the access does not happen within a second of the -program start. See the acl lab. +program start. Consider the acl lab. We wish to know that alice has run the fun program, +and that opened the accounting.txt file. The precheck.sh script runs prior to the fun program, +and generates a timestamped file. The fun program opens the accounting.txt file, which triggers +mynotify to create a timestamped file named precheck. When mynotify is triggered to find a timestamped +output file, it looks for one of the current timestamp, and will also look for one from the previous second. +Thus, if the fun program takes more than 1 second before opening accounting.txt, the assessment will report +a false negative because the boolean conditions will exist in different timestamp buckets. + +An alternate implementation might be to somehow bind the initial precheck output to the specific instantiation of +the fun program, and then compare that to what triggered mynotify. However: 1) precheck completes before the target +program (fun) is started, and 2) inotify has absolutely no sequencing guarantees, e.g., the fun program may terminate +before the inotify callback occurs. \subsection {temporal logic considerations} When evaluating results from logfiles containing timestamps use FILE\_TS or FILE\_TS\_REGEX @@ -257,5 +626,169 @@ paths are managed relatively between scripts. Change smoke test to look for email in expected results and set that as the email before starting a lab. Validation should catch results.config naming of non-existent container. +The backups2 lab creates a loopback volume named myfs.img. The lab does not dismount it. +This device will go away on a reboot. + +Add latex template and makefile when new\_lab\_setup is run. + +Collect bash history from all users. + +Clean up the webtrack lab manual to clarify steps, and to clarify no login to the labadserver site +is necessary. + +\subsubsection{Docker problems} +The check\_nets.py tests for problems that sometimes crop up in Docker. These include Linux routes defined +on the host for container networks that no longer exist. And, loopback devices that are not properly deleted? +The file-deletion lab fails in a full smoketest, perhaps due to a lingering loopback device? +Lab must be completed prior to reboot of the host VM. Reflect that in Lab Manual. + +The backups2 lab consumed a loopback device, leaving it define (as seen when running check\_nets.sh). This +led the file-deletion lab to fail, being unable to get a loopback device. Altered file-deletion to create the +"next" loopback device if it does not exist. + +Metasploit lab now crashes the VM. g\_array\_unref: assertion 'array' failed. Leads to X server crash, loss of +desktop. Perhaps only occurs after reboot, once, then works ok? Created both containers with NO\_PRIVILEGE attribute +in start.config, seems to fix it? NO: that breaks it by keeping services from running. Disabled postgresql service +in attacker seems to keep the crash from happening? Also happened in a hackazon container derived from a dockerfile that +included multiple CMD entries (one in the latest file, one in the parent file). + +Sometimes (only see on testing), the container ID reverts from the labtainer name to its hash. This can be accompanied by an +inability to manually stop the container. Seems to be a Docker bug, but only appears every 6 months or so of daily regression testing. + +\subsubsection{Lab fixes} +These fixes were deferred to avoid unnecessary rebuilds. The problems are due to +files missed from git, or directories that are not created. + +ssl -- to fixlocal on ca: + mkdir ~/ca/private + mkdir ~/ca/certs + mkdir ~/ca/intermediate/private + mkdir ~/ca/intermediate/certs + +\subsubsection{Grader updates} +Automate detection of need to update a local grader image, e.g., in response to a fix to the grader. + +\subsubsection{UI fixes} +\begin{itemize} +\item Resize windows and potentially alter font size. +\item default buttons, e.g., so enter key makes default selection. +\item right click menu for copy/paste in text fields. +\item visual clue that lab needs saving. +\item keyboard shortcuts +\item UI for makepack +\item Visual clue that results/goals window is open, color button? +\item expand UI text area todo to flag goals/results without documentation +\end{itemize} + +\subsection{ongoing} +Updated framework and grader to use python3. Intent is to not affect existing labs. Need to publish centos-log2 and +backups2 due to changes in centos packages. Changed grader and centos.xtra base dockerfiles. +Publish along with new update? Will centos-log2 run with old framework? +This is begin done in the python3 branch of git. + +Python3 changed semantics of randint. Also changed random.seed to take a version number for compatable seeding. +Except version 3.5.2 is broken in that a string given as the seed causes a non-deterministic (time?) seed to be used. +This bug is fixed in 3.6. Our grader container naturally installs 3.5.2, so we also install 3.6 from dead.snakes ppa +and change the links in /usr/bin/python3. The broken 3.5.2 version is also what comes with the Ubuntu used in the original +Labtainer VMs. So, we will maintain support for python2 in the framework, and fall back to python2 if we detect 3.5.2. + +Some html, e.g., for the softplc, want to visit fonts.googleapis.com. If no gateway/dns is available, there is a long timeout. +add ADD-HOST fonts.googleapis.com:127.0.0.1 to start.config to shut it up. + +In the VM .profile, move the terminal creation functions to a seperate script run in background -- seems .profile must finish or VMWare Horizen +borks the Terminal Server startup. + +Smoketests still sometimes fail with bad routing tables and/or iptables. Run check\_nets.py to test. + +Use of Docker cache leads to build dependency errors in which a source file changes but has not actual effect on the image. If the image +checksum matches the cache, the date is not altered, and thus the next build will see a false dependency since the source will continue to +be newer than the image. Modified building of base images to default to --no-cache; modified building lab images to allow supressing use of cache, +though still defaults to use of cache. + +Dependence on LABTAINER\_DIR introduced with imodules, and will spread and backfill from there. However, current installations have an invalid +value for that env variable. An updated update-labtainer.sh fixes that. But update must run twice for it to take effect within the bashrc. +After the first run of update-labtainer, the imodule function will be available, but without the value being set. Add diagnostic to imodule to +prompt for re-run of update-labtainer. Or just hack around it? + +Validation of goals.config should catch answer fields that lack syntax, e.g., foo rather than answer=foo + +\subsection {UI} +Notes on UI development. +\subsection{UI Development} +See the {\tt UI/README.txt} file. Development uses Netbeans for UI construction. Manual make/run is performed by +{\tt UI/bin/buildUI2.sh}. Netbeans is not required for non-UI code changes. +\subsubsection{Warn of changes} +Detecting whether a user changed a configuration file, and thus should be prompted to save it before losing it, +is performed by saving the state into a file temporary directory and then comparing that to newly saved state based +on reconsuming the original file. This lets us avoid false positives due to manual changes. + +\subsubsection{Distribution} +The lab designer package is currently distributed by pulling the entire git repo tar ball. +That repo will include the jar file for the UI. This simplifies distribution. Should the tar grow large, we +can look at moving it into the release artifacts. The tar file is in UI/bin. It is run via the {\tt editlab} +script. + +\subsection {Mounts for software persistance} +Consider labs such as IDA. For licensing, we have the student perform the installation, which involves accepting +the license. It would be nice if subsequently performed IDA labs did not require the student to repeat +the installation. And with IDA, students may make configuration changes. To facilitate this, we define +one or more {\tt mounts} for containers in the start.config file. The installation package will be distributed +within each IDA container, but will be deleted by the fixlocal if it seems to have been installed? + + +\subsection {Build dependence} +The home\_tar and sys\_tar files as considered for build dependence. But the home.tar and sys.tar are skipped because they are remade +from a fresh pull. This is a problem when we add dated archives. Must rebuild with a -f. +\subsubsection {IModules} +The DoRebuild function defines a container\_registry, which is then used to query info about this image, but is also used to define the +registry within the Dockerfile, where the base is pulled, i.e.,the FROM statement. It seems there needs to be a BASE\_REGISTRY as well as +a REGISTRY, with the former defaulting to the default registry per LabtainerConfig. + +How do we manage name conflicts between labs? That works natrually by precidence. But between base images? Where a designer wants base +images from multiple registries, how are they named within the test registry since that collapses all registry designators into the one test? + +\subsubsection {Base images IDs} +The base image information placed in labels of lab container images include the registry name for which the image was built. Since we push +premaster registry images to DockerHub, the public lab images have a label reflecting the premaster test registry. +This is worked around with in the InspectRemoteReg.py. + +\subsection{Other bread crumbs} +If you get the dreaded "docker.service: Start request repeated too quickly.", then: +sudo systemctl daemon-reload +sudo systemctl restart docker + +\subsection{tap/netmon Boot synchronization} +Capturing network traffic using tap/netmon components may depend on those components being up with their respective +services prior to other components generating network traffic. Typical Unix-based synchronization is not possible +because the netmon component is not on other networks. No communication paths between components and the tap/netmon +components are visible to the student, and thus mechanisms that reflect such communication are an anachronism. + +That implies use of a hidden synchronziation scheme. Or sleep based hacks. This synchronization must(should?) occur on +each start, not just the first parameterization. Once a container starts, we cannot delay their services without adding +something new to each. +Delay start of other components until tap/netmon have started? +Add new service similar to wait\_param that will wait for tap/netmon to run? Automatically add to each component +on a tapped network? + +Add volume to tap and use subdirectory as a lock. Sleep docker start threads for components that attach to +tapped networks? Advantage is designer need not configure individual components. + +\subsection{IModule testing at NPS} +Labs having defined registries do not have test registry images. The ParseStartConfig.py does not insert a test registry +for these labs, thus any running of IModules on test or development systems will cause the Docker Hub instance of container +images to run. + +\subsection{Gradelab via browser} +The Flask web server is integrated with the grader container. The {\tt labtainer-instructor/flask/server.py} program implements +the server along with the flask/templates files. For debugging, use the {\tt -vd} option instead of {\tt -w} to cause the local repo +flask directory to be mounted and used within the container. When you get a terminal to the grader container, run the instructor.py command +and then start the server with {\tt .local/flask/server.py labname}. The templates files contain dynamic HTML for the various links displayed +on each page, and these have corresponding {\tt app.route} decorators in the server.py code. Review the Flask product documentation to understand the dynamic HTML syntax and how values are replaced. + +\subsection{Lab versions} +Some labs have multiple versions, reflecting substantive changes, e.g., changes to assessment artifacts, or introduction of new containers. +This introduces naming issues, such as {\tt somelab} and {\tt somelab2}. Lab listings will only show the latest version of a given lab, unless +an earlier version is already installed. While it may be tempting to hide version numbers from students and instructors, doing so can introduce +its own problems. For example, which xfer directory should the labs show up in, and what if they have different grading? \end{document} diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/docs/development/git.txt b/modules/utilities/unix/labtainers/files/Labtainers-master/docs/development/git.txt index a4936cf69..5649bdc07 100644 --- a/modules/utilities/unix/labtainers/files/Labtainers-master/docs/development/git.txt +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/docs/development/git.txt @@ -8,3 +8,29 @@ Branches git checkout -b some_branch git push -u origin some_branch + +Remote URL for GITLAB -- NOT github +Get token from github or gitlab +git remote set-url origin https://:@gitlab.nps.edu/mfthomps/Labtainers-simlab.git + + +change to ssh: +git remote set-url origin git@github.com:USERNAME/REPOSITORY.git + +change to https: +git remote set-url origin https://github.com/USERNAME/REPOSITORY.git + +git remote set-url origin https://github.com/mfthomps/Labtainers.git +git remote set-url --push origin git@github.com:mfthomps/Labtainers.git + + + + +git remote.origin.url https:// + +git stash +git stash apply + +git config --global user.name "mfthomps" +git config --global user.email "mfthomps@nps.edu" + diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/docs/development/labtainer5-sm.png b/modules/utilities/unix/labtainers/files/Labtainers-master/docs/development/labtainer5-sm.png new file mode 100755 index 0000000000000000000000000000000000000000..88708474179309733731a9deebb6537480823cdf GIT binary patch literal 67186 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%0D#HxscAeEczWMZwA?DZ>Vlch@b*32`X3^>{8- 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

!8`1D4KcY5j{-YheG(AzDm*Tb1vVZMJ)-J`QO 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

;VD!N*0p*^!cd)DDb<|xr!Pa zQr_2a8y7HpTMgx(i7tj?zn5NQA-?2IQE$gsqds`8JRCSPf0gN0-j4ieJd4&P<;4d0 z8IxLVXcXitNTiOnVY*arWn!X^CsX@_4|DU3uc(R(Y@I{wA*m#UiA0=O7}u0^ug_6p zYDY50Fj`!QZ035nHKIz2!y=3Gd4h8TIqXpSq#3EJ1+eN+O0PmQPLq1u+>JO}(FEbO zlSxaFL;t~NUyJRPO66b$mJEIz$sGBRb*M{ly=~nx-)+)vT%3jUnIGO#fHJaeqq5Sd zMuxz83K8exMuQTW!t^%TV^-Zm$cvCu_eDImz3b0OaaxPU>d&Cz6@7Oc4Igaig%_$y+4V;MDwpWAC7ryGv^Y#0ksEVliW zyEFXle3VJK>ujY<XmG$B%AZ7#G#x{KH7HPETBTQkUGG z?JX;KCL1j-o;tRchV{YkaPH~%NoI-aPZ?8vs-@?v*6co1iy!$ag?UM)g85ZF1SF3e z=ru^$qVK`zE*rO0o4Jr$Xe_7Za(?0R{qd-_ATo5?^>nxgs-+U`Z26_yY%YwbVR%mS z^*SCesPo>ukc!Gs9Mh5Bn<-12#gzBe&wT)$ab^wwjjFN!SE|Or_#ckOM8L+t#QC4E z|BI?|{(pqk+`(D2um83ZXfB&Cgq^vBo-KGi$%$YZF+^idpNZ5hctI0#K^DFeKop9@ z7m`as1VY@)KAiBLcAx&Pee|+gU2n|!=(&02UjAjaa;m?;grZm{v?-{R0MP^>fk+0T zu)xj?@&_PL5J7-IAv@S(2rSs2@4FVkAyaTefr*I!fDcaOMu{F>PaZIbQNWG>;JNb$ z79awMPe+l^hJpZr01im>15UX417K25J`I;o3*qiBBA_UOBPF4R@0K1!jHPsXs|COw z3=WW(jB@&m3#VWo&^bh)4{Ew_f26lQ0T?6!qft~s5m;+4XMZOa~2nX;M05o@jv-IEc)iC2RS;z7oLRq0IgeQ!6O;=|ehB0|9L z<#jm6W1I*9ZvB#d5a&}M1a|oU%sKz!KKvTJ|4Xbs*eNz~Kb>i&^UtAgq6awR@ z4Pux9M%O~WqfqzuE~DU=ERgg;zdFAvEU4#Dq3{#4c!YC?GBtziQ&uP#U7##tcj~H~ zg@_X$#X|Gh4Kv?Z&9@E9B-=x>W+HV;I3(xH2^;Ern)W5>v)ZBm4Dr@|TU4DFA~yWVTcGU# zQgRa-OPKQxP#!s5>+;hY8)^%}CvoG4c3oP=o){JwaXJS40V8>otz(NmuNrOPb6A?1 zo>`l_X@ri-zWD*kwA5@G8!NQ0a*#m2ln z#8nLbv=##*#({z3mh5SD#_h6tE)$BH89#WY#$nX3J4W|HCu~{B#kwBVP3Wr~mA4LY z;ZE|DqXnG49xO5d-(7H_*R__RtyYkIE9g4fX44Lc z1XuTm8?H)NVN)xG&1+L>6Pib6CojHBb1qGVP&K&C84G2aERqEJ$DxnG+fiKJlE$yq z?k?WG`z}!}tbQvNvl$sFJ{$Nf2)bUREC#eD9CJy5Hfhvf{X?Wg?j zN(gM5HQ#jb=T+ zMQlNNmx2>7&$Wqmp>>T3iYLP!H0KZ{oMOt`eg*l%eo=fz?Yb5|sIl60+E~|SYN;*E zB;ntG8=I3?RjD}QOiHL3DnW|1Ud}%!x z(fZLL$rZWUK$21DU+j^C89o2X6AQmzjolns-rh7VgJusLV-R*vDO&64s)J%F+i0k^ zi&)3^g{6dAsGh;ejW$_sMf$KlUyQxv*ny$&*DNTNE^6r9_L{=Ek2~$w2t4*umt=RE ze9^4U`F(G)e*@Hyms(=tkk>q_4`R1P0`{3BbTSkw^TwL{KS* zY@{<W@JJg2CGW%RzPkqtYebPiJeZ>N{;*--sXhu}9!;h3< z1QzrP6Bhl+P|><2xm~+u8A*LBlip5#PE#{ohzEgMUn`bMq*t6o zW9dSXh-TBQL2j^%1(^T3Kpz2Pvv3SqMP30EDQ_d|7$1rpT7ihJLxTOrSH{EF`g?`W zX)9WA^|pWXBUYfNx|(VD_ik3Ef8_G#ohP}TH*K+D?m;u=xqqr6?I9JxG$L6Oq^BKQ zjbeKhcBXvFYqpcA`IDde*en`w!UTWsOWIQ+g?y@6Yj*v%$z5^;a?73uP5u65mM&B5 zluwpds5L}=rjgxY)D{n4~r@8^A7&2uzo=F7dqyi0^ClOjx^eUvTG3jz_OH+t^c8ZcF)P4*E z2-usb>=XRtseH*JufcR^!cIF?n7_CVVo=oOvl4#UHuplxKLOB@kT0n-cjj$M8j*G^#bT!vW&Q6L$TF1#T?${AD*DO+Y1t8 zSU^<{&(G?QTC?Eo2pBWk8$+|}?Zpun_$7XqXFK;9DAb(U2lMC8>Z~tpNFJB*h4gnk&No( zPYwx&#$b&kDm|_$({X5@4_<3B@#SK%AKjVy_PdVnXXu2ceHK5&{zg7J*&--vTJ=Ts zG$O{=4T0~l4RjgqaZTV>;qudpW2eHRC2UO4u4F16{&5V;3=8e!bXsM!Vespz<8u2= zG8EAHFgxuW(fvXV^0^5)XQbZegmWZl9Xwvil~%`Ay`tDKYwwe$aJ;zIedp!+o>9F( zHvr|6r~FnzLgUe}#lPc~qnR}GO{!c3i17Qh#3R?}@^e!?8=*v=q4T7}IsJp1iOX15 zru@61bUMYBm8lNkFo8FL{`JK(1*Q-HWOH!2uFUs)jdc@)mULc6&1h+&VtjkDn zwQKU~ed&{dZ)xqTjrtl&JlzaPx~1dhxnxNUcjg_!x6C^GDQEf22lHqbq1rpJsR{l8?;sL5hxH7CFrM^M1Xufcc!Epqt`NW*KhJ4l-Ro{oQx|!*4bwGVCp!M- z%r9L6rSX!-Q5oC|SAD41J(p0UuEd^WxC4Fm1+jxqiRTf(lPGbv^t9-v9_ci54631+ z7z!~vEW(R>y-`ED$`s-2{qXYfuoV&v1&2r4aFqWS*_gUP(we%>w_+E>2&Q<~-pA)J z`W#PiT%6P>+A|^xv~0gYHjc-{qf1o7e7Qb;)zLCsafaTRw#GZ%s0C$xW4u2g;8RJB zg4aazL1`^xY1J~o@n=|EK~XA{xKARc0KDEyu5sgvMVMc0B48l_uQx=_k( zWjDN}t4odQaShFcVqR4 zaU3s__%?OMG^Cts;)&5iku9(o(nB;o1qt`ls`k8jz(%0%Jt zH%BhlD%-#1yeWn3)DDVP&LK|&HvK9V@H2zF)p`}FF~sy=PW6ko z2R`Vmkee-e46z#yOVDr}UD;1*9kDZ`UwP+4U5m>uiB_OJ!M4*K9C$w-2#_@B^_03&@w{z(+KU)4DgJbp%71rACu|%YF@6>l zOBqnh7ACathWOo)iiMym92$hfR*dsU`CTM(Pc7gRsIScYv@H4GUr zrKYS+A-`hX8Ko0PA&vF<>t1Z^ddRE0O!FJ9r_sAM?)WC%XLu=Ah%WwVE1MBNcnSTB z@6b%H6R=}udA0TqV=%&P6bJ}PThz8w!j`h&i*c!pJ0TUaylhGyGQQ=pU^6G>6%^vu zUL=GdZ@vkAE883(Lf!WD^_66;ha}+?=3NI@7Ah^av*@J3yxK-*F<&SAP-KtwXUVEn z5}EW_{#2fHhkHqme7pPBDYxoS5J+xhmy+)C44LMfzhCTf8NDwe5W0`Z&Q*23KKiI& zg^wKCnuTVolTAKPoMk?2cz@r7RK_XwUUP&Qmc&6v=%`_Q^+wx~4fbPK5A&LOlH<}i zH-ERT!>5N?Zy*hd&G7pK5Yu`!Z-E)R9{j}^-}KY&-Y7+9kwsM6s%6#DRs%(3Yam{t$Le)jo;1U=y!|yo?T%;L5-o&) zyJg~{m6(_7b$Kmgdn04}VaJx0^@eb`w_~p`vs)H&jYa3j{Ov7ld}#?r4Xxexxe4XF zrrKP4bA`#0aP1Hqc5DtK=Fb+F3OR{=jh`H~0*M=;E9LXuN`d1gHN`~Y1iEowlxHa=#b6s zuNTq3rkS2z(gxWAI+Z`iO)5?otl>7_Kt}BhN=NFTY z;$%;bwc>Al$e6Uso>MrLOg4nPz~7Mx?q!cWoZiRu#5O6W( z-f865kZq8+@+D=Xx?sEY9bxY(s(>>*dzO8gI)-hK3o7im?zEi^>zSqN&iKF04llgV<+}HWmB=x)*WTbEJuQ2$!ze=ClKfkKIPonApU9ototm$d-Ai1eQ0s} zgjP^I5iQ$jKx01~l{f%bxtJske1J#&IY&Kh;aw8FX1ybnvI1dCD5-H@` zk0Lapa<4cB_k$ILU9_ZX!E?CM!p+R9xuMRsi&ou2_-nUee@-sw#HmDE%Gvs#r8AH^M6kqggBS*yl0PO zmOO~vR?Ml#A9iGQ9v_YUVtP-~u(pQV6ek+kQ>y5w1lTo1`C`~e({w!Ey_5a+SsaK=t)?S7h2bR?%j&9`*x z7-CpW-Zywe@0j<(FR)U~;}*T@bX#quSbaA^&V?y#F zoz_~IRMeGZuut(XSXy=5`Xl%l=af)O!U&%+*xUmFNF?r1X{v$DElS&;2=o(Vr|_4j z+|-BqCHca8_cJ5e=gIL{+LD6~+FjQ++u&oI?!TYJY3XYVo#`9Yqz`l^vZgxToi`Gn zIJV#(^wOV5N!9y!Q91o%T@3^)w|N;g<0v9LRS@8-&Q3h!RhZZzcJ4^X@4D7ltn_*? zz^7^D*0;GQTlM4j&zRD=reh(2m1sF-qRdw?C@65OwVm9NtBr0~F z<95$FZ5VaB2w%P>^Hp@b0Qb`T-M2;N)VgqH$4_$Ryxo*~c<(<1F#`Ry0B#LKMn(yrTdXecE#-vO3oN^n^%2J+*eZ5hS;OcqW|r?Ve2ba9n!Mb}|E}~* zYh<-c;>q`dPriR-NNAFEyHQ}-xVJus22r}_ohHRs4fMZ1d|g7dau34diDXdC8!tHZ zvOltxFNTS0KY=K>(3b2n@!M{So%a>;b5=73@6NhiaD$R8E_@z%EgB@ygV*q$AQUe@ z`4kJQARxE;boh!DH3rS~!LcId7RN7?ivD>}fCS<9he`LQNz5!}&qdEQPsIfho#~Y| zAii8=xA8%%^m?`-I>)Q4y^T{9lz41FCTUsBesnw@+SK@`TKu4J?j>TpcEHEdLsq#2+X@Wd^!irixHyYC=rpA}6Rs{QS(%ms1!=>BU& zOd!Zjcp76=I!gpc{~hffrPYB`gqfK;i?3mQ8$%SXeX~sd3kV z8%VrNs42@An%?IMt@(&$Z{_s~5T2*`V6xt*Z)^RxQX`(@OM}I1C$VUJA`=G{(AZPu zasfH=EUd20$*zIP^2&yMxzDqrvg4KZU;&Au*dh^b0+WWBdhZgIf(ftfUs+fHvpTJW zYQ&r1!%E91*#b(e8Os)5;;EvMOhxiUmD`7D$oBa1Rg*w}k45UK@*@f(*;oRkckLk` zz1hr%vv4cNt~)V9cUCu>V~!P@Smv=uSyCpx#Gd|uu9f!oNWDC=<Bz+dacmCF25b6g$&h4R`j;%`1r3F$w;;(1He0yj$ebWemc`$N%8)|1 zQIk*=+U>cfm6M7x^u8$r3w->txRol{rAQS!tT>F~2fit&PXTSL4gX$JbI%-a**8QX zkTtFO8Vjbh0IpXq{5mIvZ}^m@5Rm_d?%4kux?|^H`VXvQB4A|X=H_OAwY{s0n^53x?}iQ%fq+B1 zHM{Bc-A`|&hgF67@p9$+>7u1`x1xYZX+{9S}(>)6x10Kvfma zR8`eggo;WwK8p5^-&Ld%UVz*zo;Uqh4-ZLB06C34t2kmRt0<8dgW%Q@TK^EB-r=$7 z{;sJJXkA0&{pZm9b{IaM#Q``2I5{2g;YB~6nJ6W=C#Vd0d~x!acFwOC$b9Auz}nlJ zC)zI*c=*a+j({1NL11Ed1j_t1bzyoKE#JTn45-unCk~`0KP4&(m>)Xo-(NLF!A*j`J&O_d%;^q^UK`1x?1pYdzeoX}+-o5Svtfz1MP`|o8;R_Mm5!82#;G3j(an+j#2*%b5a8C63?8t=wuG0k20nn+cs_MG(0n8%;JTWvGz7q$O zmI2?*iMH}j+p)fRa<6j((CkbCd<4??+u?`r%#zs(_(vsC&#!&%LjOvKTU!G-#b-eG zqnJYi5&snZn1X43jo7{3f;<3t8~a%CvjJS<*Zul3yI(RmdDYjP^56LBGDej)hUQkn z4DFKsx+!XJ?Evr13=hES8=e{h*Ecjc0=T!U1NQz_6ZSb_JpBGW`*jmv ztZi-et6lmzzWZ&mH3V;b{@OgOanjM*DHWLbu|ezqT~on+TRWoyoDr;b{dH5B9XYbW z8tzZE!<`u(otU0{Ps2T;fqekTtP0eguKu~m?7PzRo6e$zfKhI71N*)Y_J}ex`R2E> z6E-z{d_i&WwVL5i^S5Ju>hmb+H+?zrgTdxTXYU`Lm>5P*c&;g0?`Q|uv9?pPfO~pt z$^fL9*7r(lL+ICv=>>rHA|K|bOU(lBC%O+ir#}F#m-tC@Uk9LJ`bFUO7k$A$_{RbM zJ+cHq8}U1nRXWG_TvGlCdjp`M`X$|AM~(3dhwd+YhVQZPeWSncvB>-qw#zL2ozE)W z@H>xFGG_cm?^OZ(LhmhU{x^<6zM*#)*T0~5AJ%_@tnDWE{PwdNzx(d4{c(OmvH{S_ z{PwkoPX7%Ty5GUJ?%IDNa_e{ax5JuQjl8Uld^b<&eHHR|pC7+TARl}l#=&D?M}}ay zld$-*RxWz}Uuq*U2ifFI?T9t-B^RZ4vp_RGc<&ok++aCTeRoT6`5Wzo(rd%2Dh3X& zDrUb_-V=p?)=>$)I^>+LXwFThAWX?jRP6;gWJj0R2(G?^bk-y5gZiox+_*R~OE>Jl?jU`UdOXvtgqHk5lSYuP})}F}x)1 zb_slJy~8zBl?sDUaPvHvoSXs z*sdSt%SET}j-{K-C!GuXL2z3e=2SJnY1K*3lXFBBFP@~aV4v%NcCd2!6LO1-!3?w zhAdtkL^rkhV)8YgQowINX2%Jy6}gmZqcR1)lm`)*Kd~BmXd(*7dI%3k;HnTshTOxL zHCY((SoI+}v~Mswv2xWPBFCdLSmjJbjeM);0uh2cV!BrXf+#$+!+#?CeB7JrRIgPC z&V+l)_@OW|f%ZRHQQUb13o%s~2$O>2qNl{WA56edo!UmkJ(p;^{_?Z8-iCx|9Z&vJ zSMi6($-J&yfm9k<-P78S@v-_3VgAwgBP$3V4InpX>Mc7rnYrF&ilvgLC#=oz;e>Ai zjT!OS)g5?-IugECAWb6k!AF{70Y!>04K!wbsYRm-WPiK3yRZehq3WnhkCu9xP&*t? zFlFw>@z^R}=03c#$o@e6ONBA?W}7$-KIC!6;Az2`yb*VfKjcW}9dp|gsxaV3S?X(z z`Yz$+5}8vPfTvSP&~Y^<_r@uPpg$DUtMdt5D{XxeyhYQ?8~jGW>D(TLcEAVzsUiwT z>yaswpvcbG36->$TbRe}*Y1AtkvC2ogv33n5N3#aBo+SVz5Rgo2@~EYL0hZ~a(yO( z6k0>Vx};6GwQ{U5d!9+OC)-8dD0k#Uu8lnZ`^0*=1H*Wha zuQ?1M=(!>o{s!t0rETrbxU6E7GDW2aJJ@&DU%jN!oewXl8B#!e5j(OaujRP^2?j** zZtOD zrb`Z%+|_~GAMKY&lOQ^bVdAi8FlHG-*7^}jHt8cpdUYZzYZ~kP)fFMAm#l?imzOD} z@fBBVQ4<98Dt3Nv@!6C3N^4rs?Qdq&t5bKcA?eCqKG|q`u>(Ec^7Mp@$4HS@K(ORQ zg85_e3DDF7{_p}Y!fq)M14k_h@lYj2cdNiKps;+~2tfsCXG-`Jeyphn+)&ⅇBrE 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 z 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 UQwa(%L=Gw^M} option to view a summary +of labs having that keyword. + +Lab exercises are also organized into \textit{Labpacks}. These are ordered collections of multiple related labs that you may +wish to assign to students. Use this command: +\begin{verbatim} + labpack +\end{verbatim} +\noindent to view a list of Lab Packs, and provide the name of a Labpack as an argument to see a list of the labs +within a Labpack. You may also create your own Labpacks as described in \ref{labpacks}. + +Available labs are also summerized and organized into broad categories at \url{https://nps.edu/web/c3o/labtainer-lab-summary1}. + +Additional lab exercises created by instructors are available as IModules, which are listed at \url{https://nps.edu/web/c3o/imodules}. +Students can get access to those labs using: +\begin{verbatim} + imodule +\end{verbatim} +\noindent where {\tt url} is that provided on the IModules web page. + +\subsection{Try the Lab} +Start a lab by providing its name as an argument to the {\tt labtainer} command. This will typically display a link to a lab manual, or will display a lab manual in one of the resulting virtual terminals. You can interact with the resulting computers just as a student would. -\subsection{Assessing a Lab} +\section{Assessing Lab Performance} When the student stops a lab, i.e., using {\tt stoplab}, Labtainers creates a zip file of student artifacts (including lab reports) and then displays the path to this zip file to -the student. The easiest way for the student to forward this zip file to you is by starting +the student. This zip file has an extension of {\tt .lab} to confuse GUI-based file managers, +thus preventing click-happy students from opening the zip and submitting its internal files rather than the entire +zip (lab) file. The easiest way for the student to forward this zip file to you is by starting a browser on the Linux VM and either emailing you the zip file, or uploading the file -into an LMS, (e.g., Sakai). Alternately, the student can define a shared folder in the VM -and copy the zip to the host computer. +into an LMS, (e.g., Sakai). See the \textit{Labtainers Student Guide} for a discussion of +ways in which students can forward results to the instrutor. + +Collect all of the lab zip files from each student into the Labtainer transfer directory for +that lab. On +Linux systems, e.g., the Labtainer VM appliance, the transfer directory is located at: -Collect all of the lab zip files from each student into your Labtainer transfer directory, which -is typically at \begin{verbatim} - ~/labtainer_xfer/ + $HOME/labtainer_xfer/ \end{verbatim} -\noindent where labname is the name of the lab. Do not unzip the files. Alternately student +\noindent where labname is the name of the lab. Each lab has its own transfer directory. +Do not unzip the files. Alternately student assignments can be bulk-collected from a learning management system (LMS) per Appendix \ref{lms collection} and the resulting zip would be copied into the -Labtainer transfer directory. Again, do not unzip files and do not change the file names of zip files. +transfer directory for that lab. Again, do not unzip files and do not change the file names of zip files. +If you wish to manually review the content of the student artifact files, copy them to a different directory and +then use the {\tt unzip} command on the command line. That utility will not be confused by the {\tt .lab} extension +and the prepended text that is intended to prevent GUI file managers from unzipping the files. +\subsection{Moving student results onto your Linux VM} +There are several ways to move student results into your transfer directory: +\begin{itemize} +\item Use the VM's browser to access email or your school's LMS system, e.g., Blackboard or Sakai. +\item Enable \textit{drag and drop} on the VM and copy the files into the transfer directory. +\item Define a shared directory as described in Appendix \ref{shared-directory}. +\item Removable media, e.g., a USB drive alternately connected to the host and the VM. +\item Enable port forwarding on the host and use {\tt scp} to move the files. +\end{itemize} + +\subsection{Using gradelab} Instructor assessment of labs takes place from the {\tt labtainer-instructor} directory, i.e., \begin{verbatim} cd ~/labtainer/trunk/scripts/labtainer-instructor @@ -75,13 +139,22 @@ Instructor assessment of labs takes place from the {\tt labtainer-instructor} di \end{verbatim} \noindent A table of lab results with one row per student and a column for each goal will be displayed. A description of the goals follows the table. +A web-based display of that data is available as described in subsection \ref{review-artifacts}. + Note that not all labs include automated assessment. For those labs, you will see this -messsage: +message: \begin{verbatim} No automated assessment for this lab \end{verbatim} \noindent Even when no automated assessment is performed, you can still observe student performance -artifacts, e.g., the {\tt .bash\_history} file as described below in \ref{review-artifacts}. +artifacts, e.g., the {\tt .bash\_history} file and files created by the student as described below in \ref{review-artifacts}. + +By default, each time you run gradelab, a fresh grader container is created and is populated with files from the +{\tt labtainer\_xfer} directory. Use the {\tt -c} option to force reuse of the previous grader for that lab, in which case +any new files in the xfer directory will be added to the previous container content. +Sometimes zip files within the {\tt labtainer\_xfer} directory are corrupted. If error messages indicate a bad zip file, +try removing it from the directory and then run gradelab again. +Use the {\tt -u } option to update your gradelab to the latest image. Student reports (if any) are copied into \begin{verbatim} @@ -94,12 +167,36 @@ be looked for in \end{verbatim} \noindent which also includes reports separately uploaded into the LMS. -\subsubsection{Review artifact details} +\subsection{Review lab artifacts} +\label{review-artifacts} +An early release of a web-based tool for viewing details of student assessment +results and student artifacts is available by use of the {\tt -w} flag with the {\tt gradelab} command. That causes +the grader container to listen on port 8008 of the Labtainer VM. You can then open +a browser on that VM and go to {\tt localhost:8008}. Alternately, use your host machine's browser +by setting port forwarding on your VM, (e.g., in VirtualBox, use Machine / Settings / Network / Advanced / +Port Forwarding to set host IP 127.0.0.1:8008 to map to guest IP 0.0.0.0:8008). + +The table of goals displayed in the browser includes links to details of artifacts +created by the student when performing the lab. For example, clicking on the student name displays a table +of all timestamped result artifacts. That page includes a \textbf{History} heading with links to the +{\tt .bash\_history} files one each container. And it includes a table with links to files in the student home directory +and links to result files, e.g., stdout from selected commands issued by the student. + +Links within each goal table cell lead to pages whose content depends on the type of goals defined. For example, +a goal whose value is defined by a boolean expression will lead to a table of all boolean values for each timestamp +for which results are present. + +Definitions of different goal types and result types can be found in the \textit{Lab Designer Guide}. Note that you need +not understand all of the displayed data in order to gain useful insight into student progress. Some of the displayed information +requires an understanding of the Labtainers automated assessment configuration directives, and is made available in the displays +primarily in support of those developing automated assessment for labs. + +\subsubsection{Artifacts on the grader container} You can view all student results, including their original artifacts by using the {\tt -d} flag with the {\tt gradelab} command. This results in a virtual terminal connected to a grading container that contains all student artifacts and results. If you have not first run the {\tt gradelab} command without the ``-d'' option, run {\tt instructor.py} from within the -virtual terminal to cause the zip files to be extracted. A student's home directory can +virtual terminal to cause the zip files (with a {\tt .lab} extension) to be extracted. A student's home directory can then be found in \begin{verbatim} /..student @@ -114,9 +211,10 @@ Student artifacts collected by the framework are found in files. You can create additional virtual terminals into the grading container by reissuing the gradelab command with the {\tt -a} flag. When you are finished, or wish to stop working, type: \begin{verbatim} - stopgrade + stoplab \end{verbatim} + \section{Managing Labtainer Installations and Updates} Any given Labtainers installation can be brought up to date to the latest version by using the \begin{verbatim} @@ -139,7 +237,7 @@ using: \noindent \\If you want to update the labtainer.grader docker image (and delete the previous image and grader containers) use: \begin{verbatim} - update-gradelab + gradelab -u \end{verbatim} @@ -148,11 +246,100 @@ A student's work on any given lab is preserved until and unless the student rest option on the {\tt labtainer -r} command. When taking a break from work on a lab, the student can either stop the lab using {\tt stoplab}, or simply pause the VM. However, if the student wishes to perform other Labtainer-related work on the VM, (e.g., revisit a previous lab), they should first use {\tt stoplab} for the current -lab. When the restart the lab, none of their work will be lost. +lab. When they restart the lab, none of their work will be lost. + +If you are using automated assessment for labs, it may be helpful to remind students to run stoplab prior to +sending you their results archive from the {\tt labtainer\_xfer} directory. + +Students can review their own work on labs that include automated assessment using the {\tt checkwork} command. +A few labs include quiz questions. For example, the database-access lab includes a quiz that students should perform +to ensure they understand the desired security policy before making changes to database schema. + +\subsection{Networking} +You may wish to direct students to install additional packages within a lab. Please refer to the \textit{Networking} section +of the student guide for information on access to external networks, e.g., to use {\tt apt-get} or {\tt yum}. + +\subsection{Deploying without the Internet} +Labtainers pulls Docker images from Docker Hub when a student first runs any given lab. You can deploy +Labtainers within environments that have no Internet connection by first creating your own +VM template. Start with the standard Labtainers VM, and run the script at +\begin{verbatim} + $LABTAINER_DIR/setup_scripts/pull_lab.py +\end{verbatim} +\noindent to pull images for your desired labs onto the VM. Then replicate that VM for each user, e.g., by +exporting it as an appliance. + +Note that a few labs deliberately access the Internet, e.g., the public key lab. You can either avoid use +of those labs, or alter them to direct students to alternate network addresses. + +\subsection{Deploying on servers} +\label{servers} +Labtainers can be deployed on servers and accessed by students using a web browser. Labtainers includes +scripts for creating and accessing Labtainer VMs in the Azure and Google cloud platforms as described in +the Labtainers Student Guide. + +You can also create you own deployments, assuming you have access to suitable infrastructure and IT support. Two general approaches are: +\begin{enumerate} +\item Virtual Desktop Infrastructure -- Use VDI products such as VMWare Horizon +to run Labtainer VMs. In these environments, each student is allocated a VM, and that VM's desktop is seen +by the student in the browser. Students deliver their results to instructors by starting a browser +within the VM, e.g., to access an LMS or web-mail account. +\item \textit{Headless Labtainers} -- Labtainers are deployed as servers in a cloud and a \textit{NOVNC} desktop is +rendered using a web browser. Access to the Labtainer server instance is via HTTP through an SSH tunnel. +Please see \url{https://raw.githubusercontent.com/mfthomps/Labtainers/master/headless-lite/README.md} for additional information, +including a sample cloud-config file. +\end{enumerate} + +\section{Customizing Labtainers} +\label{customizing} +\subsection{New and custom lab exercises} +Creating new labs and modifying existing labs is described in the \textit{Labtainers Lab Designer User Guide}. +\url{https://github.com/mfthomps/Labtainers/raw/master/docs/labdesigner/labdesigner.pdf} + +That guide also describes how to use \textit{IModules} to provide your students with custom versions of the lab manuals, and how to +publish new labs so that they can be incorporated into your student's Labtainers instances, and shared +with other educators. + +\subsection{Create new Labpacks} +You can organize lab exercises into your own Labapcks using the {\tt makepack} command, or with the {\tt makepackui} GUI. +Each of these commands are run from this directory: +\begin{verbatim} + $LABTAINER_DIR/scripts/labtainer-instructor +\end{verbatim} +\subsubsection{Command line} +Use the {\tt makepack} command, providing the name of the Labpack that you wish +to create or modify.\footnote{Do not modify other Labpacks, only modify those that you've created.} +\begin{verbatim} + makepack mypack1 +\end{verbatim} + +\noindent This results in a shell that accepts makepack commands. Use either {\tt h} or {\tt ?} to get help. +Note that chages to Labpacks are stored immediately, there are no save/quit options. + +\subsubsection{GUI} +The {\tt makepackui} command is functionally similar to makepack, but it provides a GUI. + +\subsubsection{Distributing Labpacks} +Labpacks are stored in the {\tt \$LABTAINER\_DIR/labpacks} directory. To publish one or more Labpacks so that +they are available to your students, go to the {\tt labpacks} directory and use tar to create a tarball containing +each of your Labpacks. For example: +\begin{verbatim} + tar tf mypacks.tar mypack1 mypack2 +\end{verbatim} +\noindent Include only the names of your custom Labpacks that you wish your students to receive. +Then post the resulting tarball on a website and provide your students with the URL. Students will then +provide that URL to the {\tt labpack} command: +\begin{verbatim} + labpack -a +\end{verbatim} +\noindent to get access to your Labpacks. \newpage -\appendix +\begin{appendices} +%\appendix +\pagenumbering{Alph} +\setcounter{page}{3} \section{\\LMS Assignment Collection} \label{lms collection} \subsection{Sakai} @@ -172,4 +359,56 @@ In addition to the assessment summary, any student lab reports will be available \end{verbatim} \noindent Those reports will include any that the student separately uploaded into Sakai (it is important to remind students to NOT change the name of lab report documents.) + +\subsection{Moodle} +See the Moodle user guide at +\newline +\url{https://moodleuserguides.org/guides/bulk-download-assignment-submissions/} +for information on getting a bulk download, but DO NOT unzip the file. Copy the resulting zip into the lab transfer directory +on the Linux host, i.e., +\begin{verbatim} + ~/labtainer_xfer/ +\end{verbatim} +\noindent Do not unzip the file and do not change its file name. +You can then run the {\tt gradelab } command from the {\tt labtainer-instructor} directory. +In addition to the assessment summary, any student lab reports will be available in: +\begin{verbatim} + ~/labtainer_xfer//reports/ +\end{verbatim} +\noindent Those reports will include any that the student separately uploaded into Moodle (it is +important to remind students to NOT change the name of lab report documents.) + +\subsection{Other LMS} +Send me a sample of the bulk download file from other LMS systems and we'll roll it into a future Labtainers release. (mfthomps at nps.edu) + +\newpage +\section{Defining shared folders} +\label{shared-directory} +It is often more convenient for instructors to gather student zip files on the computer that hosts a Labtainers +VM rather than on the VM. For example, email clients and/or LMS interfaces may run more easily on the host than +they do on the VM. One way that this can be achieved is by defining a shared folder for use by the VM guest, as follows: +\begin{itemize} +\item Pick a directory on your host that you will share with the VM. Somewhere within that directory create a +{\tt labtainer\_xfer} subdirectory. +\item Make that directory accessible by anyone on your host machine. +\item Define a shared folder for your guest VM, e.g., on VirtualBox, use Machine / Settings / Shared folders, map it +to your selected directory. +\item On VirtualBox, ensure your user ID is within the vboxsf group, and reboot. +\begin{verbatim} + sudo usermod -G vboxsf -a $USER + sudo reboot +\end{verbatim} +\item On the virtual machine, identify the path to the {\tt labtainer\_xfer} directory in the shared folder. For example, +if you shared a directory called {\tt mydir} on VirtualBox, that might be found at {\tt /media/sf\_mdir/labtainer\_xfer}. +\item From the \$HOME directory on the virtual machine, remove the {\tt labtainer\_xfer} directory and replace it with +a symbolic link to the shared {\tt labtainer\_xfer} directory, e.g., +\begin{verbatim} + cd + ln -s /media/sf_mydir/labtainer_xfer +\end{verbatim} +\noindent depending on where you created the new {\tt labtainer\_xfer} directory within the shared folder. +\item Now place student zip files on the host within the {\tt labtainer\_xfer/} directory. Note +the lab subdirectory will be created when you start the lab to run it yourself -- or you can create it manually. +\end{itemize} +\end{appendices} \end{document} diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/docs/instructor/labtainer5-sm.png b/modules/utilities/unix/labtainers/files/Labtainers-master/docs/instructor/labtainer5-sm.png new file mode 100755 index 0000000000000000000000000000000000000000..88708474179309733731a9deebb6537480823cdf GIT binary patch literal 67186 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%0D#HxscAeEczWMZwA?DZ>Vlch@b*32`X3^>{8- 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⋙E~H5t(uOuTGN;U+dTUri6r1W4S4_ow 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ȺBhajUE01Vg7ECAl-Wo4$j7J#Vu~MzOqJ0i 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�Q}MV)L~4IM10)koaVP=Pmlh-1oQ8`j{*w9; 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%0AhvF*~y!*Zfxb4d`SZ*)jr{tQesefYMfV2*l` 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 \end{verbatim} -\noindent After the new lab directory is created, run the ``new\_lab\_setup.sh'' script. +\noindent After the new lab directory is created, run the ``new\_lab\_setup.py'' script. \footnote {The {\tt \$LABTAINER\_DIR} will have been defined in your .bashrc file when you installed Labtainers. It should point to the {\tt labtainers/trunk} directory. You may need to start a new {\tt bash} shell to inherit the environment @@ -246,7 +327,7 @@ The result of running {\tt new\_lab\_setup.py} is a new labtainer lab that can b While this new lab will initially only present you with a bash shell to an empty directory on a Linux computer, it is worth testing the lab to understand the workflow. -\subsection{Testing the new lab} +\subsubsection{Testing the new lab} Once a new lab directory is created, and the new\_lab\_setup.py has been run, then you can test the new, (currently empty) lab. All student labs are launched from the labtainer-student directory. Lab development workflow is easiest if at least two @@ -259,11 +340,11 @@ directory. So, open a new tab or window, and then: Then start the lab using the: \begin{verbatim} - rebuild.py [labname] + rebuild [labname] \end{verbatim} command, where labname is the name of the lab you just created. -The rebuild.py command will remove and recreate the lab containers +The {\tt rebuild} command \footnote{Previously named {\tt rebuild.py}} will remove and recreate the lab containers each time the script is run. And it will rebuild the container images if any of their configuration information has changed. \footnote{The build process may generate warnings in red text, some of which are expected. These include an unreferenced ``user'' variable and the lack of apt-utils if apt-get is used to install packages in @@ -277,15 +358,15 @@ a separate terminal: \end{verbatim} If the rebuild fails with a error reflecting a problem resolving hostnames, e.g., mirror.centos.com, please see \ref{DNS-rebuild}. -Note the ``rebuild.py'' command is not intended for use by students, they would use the ``start.py'' command. -The rebuild.py utility compares file modification dates to Docker image creation dates to determine if -a given image needs to be rebuilt. \footnote{rebuild.py will miss file deletion. Thus, if files are deleted, you must -force the rebuild using the {\tt -f} option at the end of the rebuild.py command. Also, addition of symbolic links will not -trigger a rebuild.} +Note the {\tt rebuild} command is not intended for use by students, they would use the ``labtainer'' command. +The rebuild utility compares file modification dates to Docker image creation dates to determine if +a given image needs to be rebuilt. The rebuild may miss file deletions. Thus, if files are deleted, you must +force the rebuild using the {\tt -f} option at the end of the rebuild command. Also, addition of symbolic links will not +trigger a rebuild. Rebuild references git modify dates (vice file modify dates). Stop the lab with \begin{verbatim} - stop.py + stoplab \end{verbatim} When you stop the lab, a path to saved results is displayed. This is the zip file that the student will forward to the instructor. @@ -294,12 +375,12 @@ To test adding a ``hello world'' program to the new labtainer, perform the follo \begin{itemize} \item From the new lab directory window, cd \verb!$LABTAINER_DIR/labs/[labname]/[labname]! \item Create a ``hello world'' program, e.g., in python or compiled C. -\item From the labtainer-student window, run rebuild.py [labname] +\item From the labtainer-student window, run {\tt rebuild [labname]} \end{itemize} You should see the new program in the container's home directory. If you run the program from the container, and then stop the lab -with stop.py, you will see the stdin and stdout results of the program within the +with stoplab, you will see the stdin and stdout results of the program within the saved zip file. The ``hello world'' program was placed in \verb!$LABTAINER_DIR/labs/[labname]/[labname]!. @@ -310,17 +391,17 @@ the lab has but one container, whose name defaults to the lab name. The following sections describe how to further alter the lab execution environment seen by the student. -\subsection {Multiple containers} -The {\tt new\_lab\_setup.sh} script can be used to create additional containers for use +\subsubsection {Multiple containers} +The {\tt new\_lab\_setup.py} script can be used to create additional containers for use in the lab. For example, from your new lab directory: \begin{verbatim} - new_lab_setup.sh -a joe_computer + new_lab_setup.py -a joe_computer \end{verbatim} \noindent will create a second container for your lab, -named ``joe\_computer''. If you again run the rebuild.py script, you will see two virtual +named ``joe\_computer''. If you again run the rebuild script, you will see two virtual terminals, each connected to one of your two independent computers. Use \begin{verbatim} - new_lab_setup.sh -h + new_lab_setup.py -h \end{verbatim} \noindent to view the operations available in that script. @@ -338,22 +419,28 @@ by the configuration of the associated container. Software packages are defined in each container's Dockerfile, described in the subsection below. That is followed by subsection \ref{start config} describing network definitions, -(and other computer attributes) in the start.config file. The remaining subsections then +(and other computer attributes) in the start.config file or GUI. The remaining subsections then described populating the user HOME directory and system directories, and methods for starting -system services and miscellanious envrionment settings. +system services and miscellaneous environment settings. Labtainer containers, by default, present students with a virtual terminal and a bash shell requiring no login. Alternate initial environments, including use of the login program, are described in section \ref{student start}. -\subsection {Docker files} -A default Labtainer-specific Dockerfile is placed in the new lab's ``Dockerfiles'' -directory when the new lab is created. And additional Dockerfiles are added when the -{\tt new\_lab\_setup.sh -a} script adds computers to the lab. We use standard Docker file syntax, which is described at -\url{https://docs.docker.com/engine/reference/builder/} +Section \ref{persistent} describes how to +allow students to share tools they've developed between different labs. -Simple labs should be able to use the default Dockerfile copied by the -new\_lab\_setup.py script. That Dockerfile refers to a base Labtainer +\subsection {Docker files} +A Labtainer-specific Dockerfile is placed in the new lab's ``Dockerfiles'' +directory when the new lab is created. And additional Dockerfiles are added when the +new computers are added via the GUI, or via {\tt new\_lab\_setup.py -a} script. +We use standard Docker file syntax, which is described at +\url{https://docs.docker.com/engine/reference/builder/} The Dockerfile for container +can be opened by clicking on the container and selecting the Docker tab. + +Dockerfiles vary depending on the base configuration selected for the computer in the GUI, +or using the {\tt --base\_name} option in the {\tt new\_lab\_setup.py} script. +The default {\tt base} Dockerfile refers to a Labtainer image that contains the minimum set of Linux packages necessary to host a lab within the framework. The default execution environment builds off of a recent Ubuntu image. @@ -368,13 +455,12 @@ execution environment builds off of a recent Ubuntu image. \end{verbatim} The first line of each Dockerfile identifies the baseline Labtainer image to be pulled from the Docker Hub. -The initial default image is a basic Ubuntu system with a minimal set of packages. To use an -alternate image having additional networking packges (e.g., tcpdump, xinetd, sshd), change the first line to: -\begin{verbatim} -FROM mfthomps/labtainer.network -\end{verbatim} -\noindent Other alternate images include: +\label{base-images} +\noindent Base images include: \begin{itemize} +\item labtainer.base -- Minimal Ubuntu system. +\item labtainer.network -- Networking packages installed and xinetd running, but network services not activated +\item labtainer.network.ssh -- Same as network, but with ssh active in the xinetd configuration. \item labtainer.centos -- A CentOS server with systemd and the true ``init'' initial process. \item labtainer.lamp -- A CentOS server with Apache, Mysql and PHP, (the LAMP stack) \item labtainer.firefox -- An Ubuntu container with the Firefox browser. @@ -382,6 +468,9 @@ FROM mfthomps/labtainer.network \item labtainer.java -- An Ubuntu container with the Firefox browser and the open JDK. \item labtainer.kali -- A Kali Linux system with the Metasploit framework. \item labtainer.metasploitable -- The Metasploitable-2 vulnerable server. +\item labtainer.bird -- The Bird router (See the bird labs). +\item labtainer.owasp -- The firefox base with the OWASP zap toolset. +\item labtainer.juiceshop -- The OWASP vulnerable Juice Shop web server. \end{itemize} Refer to the Dockerfiles in {\tt \$LABTAINER\_DIR/scripts/designer/base\_dockerfiles} to see which software packages are included within each baseline image. @@ -394,10 +483,12 @@ RUN apt-get update && apt-get install -y some_package You will also see ``ADD'' commands in the Docker file that populate the container directories with lab-specific files such as described in section \ref{home files}. -Next, you must also describe your containers within the \textit{start.config} file as described below. - \subsection{Container definitions in start.config} \label{start config} +This section is primarily for designers who use the command line, though GUI users may +find the descriptions below to be helpful. The GUI provides interfaces +for setting these configuration values, and includes tool-tip for most of them. + Most single container labs can use the automatically generated start.config file without modification. Adding networks to containers and defining users other than the default "ubuntu" user requires modification of the start.config file. @@ -408,27 +499,30 @@ entries can be left alone for most labs. \begin{itemize} \item GRADE\_CONTAINER -- Deprecated -\item HOST\_HOME\_XFER [dir name] -- Identifies the host directory via which to transfer student artifacts, relative to -the home directory. For students, this is where the zip files of their results end up. For instructors, this is -where zip files should be gathered for assessment. +\item HOST\_HOME\_XFER [dir name] -- Deprecated \item LAB\_MASTER\_SEED [seed] -- The master seed string for this lab. It is combined with the student email address to create an instance seed that controls parameterization of individual student labs. -\item REGISTRY [registry] -- The id of the Docker Hub registry that is to contain the lab images. +\item REGISTRY [registry] -- The id of the Docker Hub registry that is to contain the lab images. This defaults to the +registry value defined in the labtainers.config file. +\item BASE\_REGISTRY [base\_registry] -- The id of the Docker Hub registry that contains the base image for the container. This defaults +to the default registry per the labtainer.config file. See \ref{publishing} for details on the use of this keyword. \item COLLECT\_DOCS [yes/no] -- Optional directive to collect lab/docs content as part of student artifacts. These are then available to the instructor in the labtainer\_xfer/[lab]/docs directory. Also see \ref{instructions}. \item CHECKWORK [yes/no] -- Optional directive to disable (set to ``no'') ability of student to check their own work from the labtainer-student directory. \end{itemize} -\item NETWORK [network name] -- One of these sections is require for each network within the lab. In addition to -providing a name for the network, the following values are defined: +\item NETWORK [network name] -- One of these sections is required for each network within the lab. The name +is used within the start.config file to refer to the network. It is suggested that this name NOT be +used in lab guides since it is not visible to students\footnote{You may note several Labtainers labs +failed to heed this advise.}. Where possible, name networks with their subnet mask, e.g., 10.1.0.0/24. +In addition to providing a name for the network, the following values are defined for the NETOWRK: \begin{itemize} \item MASK [network address mask] -- The network mask, e.g., 172.25.0.0./24 \item GATEWAY [gateway address] -- The IP address of the network gateway used by Docker to communicate with the host. Please note that to define a different network gateway for the component, you should -use the {\tt set\_default\_gw.sh}. This GATEWAY field should not name the IP of any of your other components. -See the the {\tt routing\_basics2} lab for examples. +use the {\tt LAB\_GATEWAY} parameter for containers. This GATEWAY field should not name the IP of any of your other components. \item MACVLAN\_EXT [N] -- Optional, causes the Docker network driver to create and use a macvlan tied to the given Nth ethernet interface (in alphabetical order) that lacks an assigned IP address. The network device is expected to be on a ``host-only'' VM network. The VMM should disable the @@ -438,7 +532,7 @@ These types of interfaces can be used to communicate with external hosts, e.g., as described in \ref{external hosts} \item MACVLAN -- Similar to MACVALN\_EXT, except a macvlan will not be created unless the Labtainer lab is started as a multi-user lab as descrbed in \ref{multi user}. -\item IP\_RANGE [range] -- Optional, allocates an ip range to the network, e.g., 192.168.1.4/30 +\item IP\_RANGE [range] -- Deprecated \end{itemize} \item CONTAINER [container name] -- One of these sections is required for each container in the lab. @@ -458,8 +552,6 @@ script. The script should be placed in container \_bin directory, i.e., \begin{verbatim} $LABTAINER_DIR/labs/[labname]/[container]/_bin \end{verbatim} -\noindent If the title is ``INSTRUCTIONS'', no script is necessary and the instructions.txt file -in the container home directory will be displayed. \item USER [user name] -- The user name whose account will be accessed via the virtual terminals. This defaults to ``ubuntu.'' \item PASSWORD [password] -- The password for the user name whose account will be accessed via the virtual terminals. @@ -495,7 +587,49 @@ increasing integer starting with one, and this value can be used for the network parameterization as described in section \ref{parameterize}. This option is not intended for use in creating multi-user labs. \item NO\_PULL [YES/NO] -- Use a local instance of the container image rather than pulling it from the Docker hub. - +\item LAB\_GATEWAY -- Optional IP address of the component's default network gateway. If set, this will replace the +default Docker gateway. Students can toggle between gateways by using the togglegw.sh command, e.g., to enable communication +with the host VM or the internet\footnote{This replaces use of the set\_default\_gw.sh script from +within fixlocal.sh scripts}. This option will also cause the static route to the {\tt my\_host} address to be deleted. +\item NAME\_SERVER -- Optional IP address to provide with the {\tt nameserver} directive to replace the content of {\tt /etc/resolv.conf} +\item NO\_GW [YES/NO] -- Disable the Docker default gateway, preventing network communication with the host or external devices. +\item REGISTRY [registry] -- The id of the Docker Hub registry that is to contain the lab images. This overrides the value +set in the GLOBAL section. +\item BASE\_REGISTRY [base\_registry] -- The id of the Docker Hub registry that contains the base image for the container. This defaults +to the default registry per the labtainer.config file. +\item THUMB\_VOLUME -- Optional arguments to a mount command that will be executed in a GNS3 environment when the student selects +{\tt insert thumb drive} from a component menu. \textbf{NOTE:} Use of this option will cause the host {\tt /dev} directory to be shared +with the container. This allows the container to perform all kinds of mischief. +\item THUMB\_COMMAND -- Optional command that will run prior mounting the THUMB volume defined above. +\item THUMB\_STOP -- Optional command that will run when the container is stopped under GNS3. +\item PUBLISH [publish] -- Optional arguments to the Docker {\tt --publish} argument for making container ports visible at the +host interface. For example, a value of +\begin{verbatim} + 127.0.0.1:60022:22/tcp +\end{verbatim} +\noindent will bind host port 60022 to container port 22. +\item HIDE [hide] -- If YES, the associated node will be hidden in GNS3 environments when the {\tt --student} option if +\item NO\_PRIVILEGE -- If YES, the container runs without Docker privilege. +\item MYSTUFF -- if YES, the directory at {\tt labtainerstudent/mystuff} is shared with the container in {\tt /home//mystuff.} +used. +\item MOUNT [hostv:containerv] -- Intended for use with licensed software installations, e.g., IDA Free, will cause a directory +located at: +\begin{verbatim} + ~/.local/share/labtainers/[hostv] +\end{verbatim} +\noindent at a mount point on the container at: +\begin{verbatim} + ~/[containerv] +\end{verbatim} +\noindent The purpose is allow that host directory to be reused across labs to avoid re-installing licensed software, i.e., +something where the student takes a distinct action to acknowledge a license. +\item WAIT\_FOR -- Optional name of another container whose parameterization and fixlocal processing should complete +prior to this container starting its parameterization. +\item NUM\_CPUS -- Optional allocation of CPUs to this container. Note the container sees all CPUs, e.g., every +core allocated to the VM using {\tt lscpu}, but Docker will limit the container utilization of CPUs per this value, +which may be a decimal value. +\item CPU\_SET -- Optional allocation of specific CPU sets to this container. Format is either a comma separated list +or a range, e.g, 1-3. \end{itemize} \end{itemize} @@ -563,7 +697,7 @@ All files in the \begin{verbatim} $LABTAINER_DIR/labs/[labname]/[container name]/_system \end{verbatim} -directory will be copied to their corresponding paths relative to the root directory. +\noindent directory will be copied to their corresponding paths relative to the root directory. For example, configuration files for /etc should appear in \_system/etc/. The initial Dockerfile from the templates include this line: @@ -578,15 +712,19 @@ can be placed into the directory named: \end{verbatim} either as individual files, or in a ``sys.tar'' archive. In the former case, the framework will automatically create the sys.tar file. This technique -can save time in building lab images becauase the files do not need to be +can save time in building lab images because the files do not need to be archived for each build. In general, files modified and maintained by the designer should go into the \_system directory while static system files should go into the sys\_tar directory. +\textbf{NOTE:} CentOS systems do not have a {\tt /bin} directory, that is actually a link. If you +create a {\tt \_system/bin} directory for the lab, that will trash the {\tt /bin} link and result in +an obscure Docker build error. + \subsection {System services} -The Dockerfile ``ENTRYPOINT'' command can be used to start a system service. The general Docker -model is that a single Docker container runs a single service, with logging being forwarded to +The general Docker +model is that a single Docker container runs a single service started via the ENTRYPOINT command, with logging being forwarded to the host. Labtainers disregards this model because our goal is to make a container look more like a Linux system rather than a conformant Docker container. Labtainer Dockerfiles for Ubuntu and Centos containers use systemd based images that run the /usr/sbin/init process. \footnote {Now deprecated Ubuntu-based Labtainer Dockerfiles included an @@ -594,12 +732,27 @@ ENTRYPOINT command that launches a \textit{faux\_init} script that starts rsyslo appear in /var/log), and runs rc.local.} The labtainer.network configuration of the baseline Dockerfile also starts xinetd, which will then fork services, e.g., the sshd, per the /etc/xinet.d/ configuration files. +Services should be added using {\tt systemd} constructs. For those of us who often forget what those are, a simple web server +service can be added to a container by unpacking this tar from the witin the container's directory: +\begin{verbatim} + tar -xf $LABTAINER_DIR/scripts/designer/services/web-server.tar +\end{verbatim} +\noindent And enable the service in the {\tt \_bin/fixlocal.sh} file with: +\begin{verbatim} + echo $1 | sudo -S systemctl enable httpserver.service + echo $1 | sudo -S systemctl start httpserver.service +\end{verbatim} + + The centos-logs lab provides an example of forcing the student to login using the traditional login program, as described in section \ref{student start}. +See section \ref{suggestions} for guidance on including 3rd party applications within your labs (e.g., ones that are +not simply added to your container via package managers.) -\subsection {Lab Text and Instructions for Students} \label{instructions} -Create a 'docs' directory in the [labname] directory if there isn't one there. This is where most textual information about the lab, as well as the lab manual, should be stored and modified. The 'about.txt' is an exception to this. \\ + +\subsection {Lab Instructions for Students} \label{instructions} +Create a 'docs' directory in the [labname] directory if there isn't one there. This is where most textual information about the lab, as well as the lab manual, should be stored and modified. \\ \noindent Use LateX to write and create PDF files in the docs directory. Look at other lab's docs directory on how to create a Makefile for the LateX file. \\ @@ -618,16 +771,13 @@ to a [labname].pdf file within that same docs directory. And ``LAB\_DOCS'' is re \end{itemize} -\noindent An 'about.txt' file will be present in the 'config' directory of the lab. Any text inside will be displayed as a description to the lab when listed from running the 'labtainer' command in \$LABTAINER\_DIR/trunk/scripts/labtainer-student. This text will also appear when clicking on the logo in the GNS3 environment of Labtainers. \\ +\noindent An {\tt about.txt} file should be present in the 'config' directory of the lab. Any text inside will be displayed as a description to the lab when listed from running the {\tt labtainer} command. This text will also appear when clicking on the logo in the GNS3 environment of Labtainers. That directory should also include a {\tt keywords.txt} file that associates searchable keywords with the lab. Use +the {\tt labtainer -k} option to view a list of existing keywords. Do no create new keywords unless clearly needed.\\ \noindent If the start.config file includes ``COLLECT\_DOCS YES'', the content of the lab/docs directory will be -included with the student artifacts and available extracted into the intstrutor's +included with the student artifacts and available extracted into the instructor's labtainer\_xfer/[lab]/docs directory. \\ -\noindent A deprecated feature that still exists in a tiny handful of labs: "Lab instructions for students can be displayed in a virtual terminal by placing an -``instructions.txt'' file within the home directory of one of the containers. Refer to existing -labs for conventions." - \subsection {Running programs in Virtual Terminals} \label {student start} @@ -635,7 +785,7 @@ Programs can be started automatically within virtual terminals using two methods The first is the ``XTERM'' directive in the container section in the start.config file described in \ref{start config}. That is intended for programs whose results are displayed within the virtual terminal, (see the plc lab for examples). The second method is -intended for user authentiation and for starting GUI based programs +intended for user authentication and for starting GUI based programs that will use the Linux host Xserver. If a file exists at: \begin{verbatim} $LABTAINER_DIR/labs/[labname]/[container name]/_bin/student_startup.sh @@ -657,25 +807,6 @@ operations: # stuff to do as default user fi \end{verbatim} -it will be executed from each virtual terminal created for the container. -See the sql-inject lab and the centos-log lab examples, with the latter -running the login program to require students to login prior to getting a shell prompt. -\footnote{On CentOS systems, copy the login program from labs/centos-log/centos-log/\_system/sbin/login -to your container's \_system/sbin directory. The login program from Ubuntu works as is.} -Note that on CentOS systems, the student\_startup.sh script will be executed twice: first -as root and then as the default user. Use constructs such as the following to avoid repeating -operations: -\begin{verbatim} - id | grep root >>/dev/null - result=$? - if [[ $result -eq 0 ]]; then - # stuff to do as root - else - # stuff to do as default user - fi -\end{verbatim} - - \subsection{Final lab environment fixup} The initial environment encountered by the student is further refined using @@ -690,22 +821,32 @@ and reside at: \end{verbatim} \noindent Note the fixlocal.sh script runs as the user defined in the start.config for the container, regardless of whether root is set as the user in the Dockerfile. The {\tt fixlocal.sh} script is primarily -intended for parameterizing labs. Other initialization and synchronization between multiple components +intended for parameterizing labs. It only runs on the first start of the container, and thus will not catch configuration changes +imposed by Docker, such as default routing. Other initialization and synchronization between multiple components should be performed as within any Linux system, e.g., via services or rc.local. +Note that use of {\tt sed -i ...} to modify configuration files (e.g., in etc), might result in overwriting symbolic links. +Use {\tt sed -i --follow-symlinks ...} to avoid that pit. Also note that CentOS rc.local files are in {\tt /etc/rc.d/rc.local} -\footnote{Use of {\tt sed -i ...} to modify configuration files (e.g., in etc), might result in overwriting symbolic links. -Use {\tt sed -i --follow-symlinks ...} to avoid that pit.} +Synchronization between containers for purposes of sequencing the fixlocal processing can be achieved with the +{\tt WAIT\_FOR} start.config parameter. -\subsection{Automatic copying files from containers to the host} -This feature no longer has an intended use, but it is available if you have one. -Files are identified within +\subsection{Persistent storage} +\label{persistent} +Sequences of labs may benefit from a student's ability to employ tools they have developed within more than one lab. +For example, a set of data analysis scripts initially developed for one lab may be a useful starting point when +performing a subsequent, more advanced lab. You can provide students with persistent storage by defining the \begin{verbatim} - $LABTAINER_DIR/labs/[labname]/config/files_to_host.config + MYSTUFF YES \end{verbatim} -\noindent with a format of ``container:filename''. Any named files within the home directory of -the named container will be copied to the host computer into a directory named by the lab, relative -to the Labtainer working directory. +\noindent attribute for a container in the start.config file. That will cause the associated container to have +a directory at {\tt \$HOME/mystuff} which is mapped to the directory at {\tt labtainer-student/mystuff} +All labs that employ the {\tt MYSTUFF} attribute will share the same directory. It is intended that at most one +container in any given lab will use this directory. And it is suggested that these directories only be used for +labs that anticipate evolving development of tools by the student. + +Persistent storage is also provided for purposes of re-using licensed software across different labs. +See the use of the {\tt VOLUME} option in \ref{start config}. \section{Parameterizing a lab} \label{parameterize} @@ -738,7 +879,7 @@ Each line of that file must start with a \verb!" : "!, which is an is followed by one of the following operations: \begin{verbatim} - RAND_REPLACE : : : : + RAND_REPLACE : : : : : Replace a symbol within the named file with a random value within a given range. The random value generator is initialized with the lab instance seed. @@ -753,10 +894,12 @@ is followed by one of the following operations: to randomize IP addresses. - the string to be replaced and specifies the lower and upper bound - to be used by random generator + to be used by random generator, and + optionally ensures the value falls on a modulo boundary, + e.g., to ensure offsets are word-aligned. example: - some_parameter_id : RAND_REPLACE: client:/home/ubuntu/stack.c + some_parameter_id : RAND_REPLACE : client:/home/ubuntu/stack.c : BUFFER_SIZE : 200 : 2000 (all one line) will randomly replace the token string "BUFFER_SIZE" found in file stack.c on the mylab.client.student container with a number ranging from @@ -845,7 +988,7 @@ lines would achieve that: \subsection{Parameterizing start.config} Parameterizing of the start.config file occurs prior to Docker container creation. The framework modifies a copy of the file stored in {\tt /tmp/start.config} and uses that when assigning attributes to containers, -e.g., IP addresses. Currently only IP addresses within the start.config can parameteterized (e.g., not user names). +e.g., IP addresses. Currently only IP addresses within the start.config can be parameteterized (e.g., not user names). \subsection{Simple Parameterization for Checking Own-work} The simplest, though by no means robust, strategy for ensuring students @@ -855,6 +998,13 @@ and then check that file and the archive file names during grading. The framewo this automatically and reports on any student archive that does not seem to have originated from a Labtainer initiated with that student's email address. +\subsection{Debugging parameterizing} +The parameterization step occurs the first time each container is started. +It occurs by running the .local/bin/parameterize.sh script on the container. Debugging output from the execution +of this script can be found on the container in /tmp/parameterize* + +Within the labtainer.log, you can see the step occur following the log entry that reads: ``About to call parameterize.sh...''. +The parameterizing step is preceded by a copying of the files in the labtainer-student/lab\_bin directory into the container. \section{Automated assessment of student labs} \label{assessment} @@ -907,6 +1057,9 @@ These packages of artifacts are then transferred to the instructor, (e.g., via e ingested into the instructor's system where lab assessment occurs. Timestamped stdin and stdout files are captured in \texttt{\$HOME/.local/result} +Each container within a lab includes a default user, and it is only that user's stdin/stdout artificts that are +captured. + By default, stdin and stdout for all non-system programs is captured, e.g., the results of an ``ls'' command are not captured. The stdin and stdout of system programs\footnote{The ``source'' directive is not a system program, and should not be included in a treataslocal file.} will be captured if the program @@ -916,13 +1069,15 @@ names appear at the beginning of a line in the \textit{treataslocal} file at \end{verbatim} \noindent The basename of the treataslocal entries are compared to the basename of each command. \footnote{In other words, if the treataslocal entry is: \texttt{usr/bin/nmap}, the path leading to nmap is ignored.} -Starting of services can be monitored through use of treataslocal entries having a ``.service'' suffix, -e.g., {\tt httpd.service} would generate timestamped artifact files whenever httpd was started (or restarted) -using systemctl, service or /etc/init.d/... See section \ref{time delimeter} for the intended use of this feature. Non-system programs can be excluded from stdin/stdout capturing by including their names in a ``ignorelocal'' file in that same directory. \footnote{These should not include path information, just the program name.} +The student commands are parsed to first account for the use of {\tt sudo}, {\tt time}, {\tt python} or {\tt python3}. +The commands are also processed to account for the use of pipes and redirection. + +The stdout files truncate after about 1MB to avoid swamping the grading system (and the instructor's computer) with large files. + \subsubsection{Capturing program file output} \label{program output} Sometimes program file output is of interest to automated assessment, e.g., the program @@ -955,7 +1110,9 @@ program delim_type:delim_value \subsubsection{Bash History} The framework collects all student bash history into the \texttt{\$HOME/.bash\_history} and \newline \texttt{/root/.bash\_history} files. These files are -available for reference as an artifact file. +available for reference as an artifact file. The bash history for the default user is collected from each +container. If a container has users other than the default user, files created or modified by those users +beneath their home directories (e.g., their bash histories) are also collected. \subsubsection{System logs} All files referenced in the {\tt results.config} file, (described below in section \ref{results.config} @@ -1016,6 +1173,7 @@ one of the following: creation within the named directory. \item {\tt ACCESS} will capture any read of the file named by the path. \item {\tt MODIFY} will capture any write to the file named by the path. +\item {\tt OPEN} will capture any open of the file or directory named by the path. \end{itemize} \noindent The optional {\tt output file} will be used for the timestamped filename of the output from the event (instead of the default {\tt notify.stdout.YYMMDDHHMM} @@ -1039,7 +1197,9 @@ one timestamped file allows the designer to identify events that occured as part invocation. Again, see the {\tt acl} lab for an example. \subsubsection{Generating results upon stopping the lab} -The lab designer can cause a script to run on selected containers whenever the student stops a lab. +\label{prestop} +The lab designer can cause a script to run on selected containers whenever the student stops a lab, +or when a student issues the {\tt checkwork} command per \ref{checkwork}. This is achieved by creating an script or executable program at: \begin{verbatim} trunk/labtainers/lab//_bin/prestop @@ -1050,11 +1210,19 @@ shutting down any of the containers, and all the timestamps will be the same. Note the Labtainers framework generally allows students to acheive their goals at any point in their exploration, and the labs typically do not require the student to leave the system in any particular state. In other words, students should be free to continue experimenting subsequent to getting -the correct results. Thus, any use of the prestop feature should be accompanied by a lab manual entry +the correct results. Thus, any use of the prestop feature, (other than for \textit{current state assessment} +per \ref{current-state}), should be accompanied by a lab manual entry advising the student that they may restart a lab after issuing the {\tt stoplab} command. \footnote{Perhaps a {\tt goalsmet} type of command should be added that does nothing but record prestop results without actually stopping the lab?} +All {\tt prestop} scripts will timeout after 30 seconds with a SIGTERM. For debugging support, please consider +adding signal handling to your prestop scripts. For example, for a bash script, include: +\begin{verbatim} + trap "echo Timed out; exit" SIGTERM +\end{verbatim} + + \subsubsection{Artifact archives} Artifacts from student labs are combined into a zip file that is placed in the student transfer directory, typically at {\tt ~/labtainer/xfer/}. Students provide this file to their @@ -1072,7 +1240,7 @@ the cyberciege lab for an example of postzip processing. The automated assessment functions encourage labs to be organized into a set of distinct ``goals''. For each goal, the lab designer identifies one or more specific fields or attributes of artifact files that could be compared to ``expected'' values. These lab-specific artifacts are identified within the -file at: +configuration file at: \begin{verbatim} labtainer/trunk/labs//instr_config/results.config file \end{verbatim} @@ -1080,8 +1248,9 @@ file at: \begin{enumerate} \item The program that was invoked \item Whether the artifact is in stdin or stdout or is program output (prgout) as descrbed in section \ref{program output} -\item An explicit file name, either as an absolute path or relative to the user HOME directory. These are intended -to be persistent log files, e.g., syslogs. +\item An explicit file name, either as an absolute path or a path relative to the user HOME directory. These are intended +to be persistent files, e.g., syslogs. \textbf{Note} files relative to the HOME directory must be expressed as relative paths and +cannot be absolute paths. \end{enumerate} One or more properties of each artifact file are assigned symbolic names, referred to herein as \textit{results}, which @@ -1102,123 +1271,137 @@ sources depending on the nature of the results.config directive: program was invoked, (and its corresponding stdin file contains an entry reflecting when the program terminated). \item A timestamped entry from a log file, e.g., an entry in a web log, that matches criteria specified in the results.config directive. -\item The invocation times of {\tt time\_delimiter} programs, syntactically associated with system log artifact files. -This allows designers to temporally group syslog results that were generated between changes to system configurations -as defined by invocation of the {\tt time\_delimiter} program, e.g., a script that alters the routing table. See section -\ref{time delimeter} for additional information. \end{itemize} +\subsubsection{Result field values} Directives within the results.config file each have the following format: \begin{verbatim} = : : [: : ] - where: - result -- The symbolic name of the result, which will be referenced in - the goals configuration file. It must be alphanumeric, - underscores permitted. - file_id -- Identifies a single file, or the set of files to be parsed. - The format of this id is: - [container_name:].[stdin | stdout | prgout] | - [container_name:]file_path[:time_delimiter] - where is a program or utility name whose stdin, stdout, - or program output (prgout) artifacts will include timestamps. - The optional container_name identifies the container hosting - the file. Labs with a single container can omit this qualifier. - Alternately, an explicit - file_path is intended for log files of services that persist - across multiple student operations. If the given path is not - absolute, it is relative to the container user's home directory. - The wildcard character '*' can be used in place of , - i.e., *.stdin is for all stdin artifacts and *.stdout is for all - stdout artifacts. The optional time_delimiter qualifier is - explained further below. - field_type - Optional, defaults to "TOKEN", possible values include: - TOKEN -- Treat the line as space-delimited tokens - PARENS -- The desired value is contained in parenthesis - QUOTES -- The desired value is contained in quotes - SLASH -- The desired value is contained within slashes, - e.g., /foo/ - LINE_COUNT -- The quantity of lines in the file. Remaining fields - are ignored. - CHECKSUM -- The result value is set to the md5 checksum - of the file. - CONTAINS -- The result value is set to TRUE if the file - contains the string represented in field_id. - FILE_REGEX -- The result value is set to TRUE if the file - contains the regular expression represented in field_id. - The python findall function is used on the entire file. - See the acl lab for an example of multi-line expressions. - LOG_TS -- Used with timestamped log files, this results in a - timestamped set of boolean results with a value - of TRUE for each log line that contains the string - represented in the field_id. - FILE_REGEX_TS Like LOG_TS, but uses regular expressions. - LOG_RANGE -- Similar to LOG_TS, except the timestamped entries - are ranges delimited by the matching log entries. - STRING_COUNT--The result value is set to the quantity of - occurances of the string represented in field_id. - COMMAND_COUNT-Intended for use with bash_history files, counts - the occurances of the command given in the field_id. - Commands are evaluatd considering use of sudo, time, etc. - PARAM -- The result value is set to nth parameter - (0 is the program name), provided in the - program invocation. - - SEARCH -- The result is assigned the value of the search - defined by the given field_id, which is treated as an - expression having the syntax of pythons parse.search - function. E.g., "frame.number=={:d}" would - yield the frame number. - GROUP -- Intended for use with "REGEX" line types, the - result is set to the value of the regex group - number named by the field_id. Regular expressions - and their groups are processed using the python - re.search semantics. - TIME_DELIM -- The timestamps of the named files are used to create - a set of time ranges, e.g., for use in time_during - goal operators. - - - field_id -- An integer identifying the nth occurance of the field type. - Alternately may be "LAST" for the last occurance of the - field type, or "ALL" for the entire line (which causes the - field type to be ignored). Or if field_type is SEARCH, the - field_id is treated as the search expression. - If field_type is "CONTAINS", the - remainder of the line is treated as a string to be - searched for. If field_type is "PARAM", the field_id is - the 1-based index of the parameter whose value is to be - assigned, and no other fields should be present. - If field_type is "CHECKSUM", no other field is required. - line_type - Identifies how the line is to be identified, values include: - LINE -- The line_id is an integer line number +\end{verbatim} +\noindent Fields are defined below. +\begin{itemize} +\item \textbf{result} The symbolic name of the result, which will be referenced in the goals +configuration file. It must be alphanumeric, underscores permitted. +\item \textbf{file\_id} Identifies a single file, or the set of files to be parsed. The format of this id is: +\begin{verbatim} + [container_name:].[stdin | stdout | prgout] +\end{verbatim} +Where {\tt prog} is a program or utility name whose stdin, stdout, +or program output (prgout) artifacts will include timestamps. +The optional {\tt container\_name} identifies the container hosting +the file. Labs with a single container can omit this qualifier. +Alternately, an explicit {\tt file\_path} is intended for log files of services that persist +across multiple student operations. If the file of interest is +relative to the user's home directory, the path must be expressed as a relative +path. Otherwise, the path must be an absolute path. +The wildcard character '*' can be used in place of {\tt prog}, +i.e., *.stdin is for all stdin artifacts and *.stdout is for all +stdout artifacts. Note prestop files are excluded from wildcard +results. + +\item \textbf{field\_type} The following {\tt field\_type}'s are used to +identify fields within a selected line in the file, as determined by the {\tt line\_type} and {\tt line\_id} defined +further below. Once the line is found, the {\tt field\_type} and the {\tt field\_id} locate the value within the line. +\begin {itemize} +\item \textbf{TOKEN} Treat the line as space-delimited tokens +\item \textbf{PARENS} The desired value is contained in parenthesis +\item \textbf{QUOTES} The desired value is contained in quotes +\item \textbf{SLASH} The desired value is contained within slashes, e.g., /foo/ +\item \textbf{SEARCH} The result is assigned the value of the search +defined by the given {\tt field\_id}, which is treated as an +expression having the syntax of pythons parse.search +function. E.g., {\tt frame.number==\string{:d\string}} would +yield the frame number. +\item \textbf{GROUP} Intended for use with "REGEX" line types, the result is set to the value of the regex group +number named by the {\tt field\_id}. Regular expressions and their groups are processed using the python +re.search semantics. +\end{itemize} +\item \textbf{line\_type} Each of the above {\tt field\_type}'s require a {\tt line\_type} and {\tt line\_id} to locate the line within the file. +The {\tt line\_type} value is one of the following: +\begin{itemize} +\item \textbf{LINE} -- The {\tt line\_id} is an integer line number (starting at one). Use of this to identify lines is discouraged since minor lab changes might alter the count. - STARTSWITH -- the line_id is a string. This names the +\item \textbf{STARTSWITH} -- the {\tt line\_id} is a string. This names the first occurrence of a line that starts with this string. - HAVESTRING -- The line_id is a string. This names the +\item \textbf{HAVESTRING} -- The {\tt line\_id} is a string. This names the first occurrence of a line that contains the string. - REGEX -- The line_id is a regular expression. This names the +\item \textbf{REGEX} -- The {\tt line\_id} is a regular expression. This names the first occurrence of a line that matches the regular - expression. Also see the "GROUP" field_type. - NEXT_STARTSWITH -- the line_id is a string. This names the + expression. Also see the "GROUP" field\_type. +\item \textbf{NEXT\_STARTSWITH} -- the {\tt line\_id} is a string. This names the line preceeding the first occurrence of a line that starts with this string. - HAVESTRING_TS -- Intended for use with log files that have +\item \textbf{HAVESTRING\_TS} -- Intended for use with log files that have timestamped entries. Each entry containing - the string identified in line_id will have + the string identified in {\tt line\_id} will have its result stored as a timestamped value as if it came from a timestamped stdout or stdin file. See the snort lab for an example. - REGEX_TS -- Similar to HAVESTRING_TS, but with REGEX semantics, - including optional use of the GROUP field_type. - line_id - See line_type above. String values, e.g., for "STARTSWITH" - can be a parameterized value from the param.config file. - Preface these with a "$". -\end{verbatim} +\item \textbf{REGEX\_TS} -- Similar to HAVESTRING\_TS, but with REGEX semantics, + including optional use of the GROUP {\tt field\_type}. +\end{itemize} + +\item \textbf{line\_id} can be a parameterized value from the param.config file. Preface these with a "\$". + +\item \textbf{field\_type (without line\_id)} The following {\tt field\_types} operate on the entire file, not just on selected lines. These entries will have +no {\tt line\_type} or {\tt line\_id} fields. +\begin{itemize} +\item \textbf{LINE\_COUNT} -- The quantity of lines in the file. Remaining fields + are ignored. +\item \textbf{SIZE} -- The size of the file. Remaining fields + are ignored. +\item \textbf{CHECKSUM} -- The result value is set to the md5 checksum + of the file. +\item \textbf{CONTAINS} -- The result value is set to TRUE if the file + contains the string represented in field\_id. +\item \textbf{FILE\_REGEX} -- The result value is set to TRUE if the file + contains the regular expression represented in field\_id. + The python findall function is used on the entire file. + See the acl lab for an example of multi-line expressions. +\item \textbf{LOG\_TS} -- Used with timestamped log files, this results in a + timestamped set of boolean results with a value + of TRUE for each log line that contains the string + represented in the field\_id. +\item \textbf{FILE\_REGEX\_TS} Like LOG\_TS, but uses regular expressions. +\item \textbf{LOG\_RANGE} -- Similar to LOG\_TS, except the timestamped entries + are ranges delimited by the matching log entries. +\item \textbf{RANGE\_REGEX} -- Similar to LOG\_RANGE, except the string is treated + as a regular expression when looking for matches. +\item \textbf{STRING\_COUNT}--The result value is set to the quantity of + occurances of the string represented in field\_id. +\item \textbf{COMMAND\_COUNT}-Intended for use with bash\_history files, counts + the occurances of the command given in the field\_id. + Commands are evaluatd considering use of sudo, time, etc. +\item \textbf{PARAM} -- The result value is set to nth parameter + (0 is the program name), provided in the + program invocation. + +\item \textbf{TIME\_DELIM} -- The timestamps of the named files are used to create + a set of time ranges with periods between the + timestamps of each file, e.g., for use in time\_during + goal operators. File identifiers should not include + stdin or stdout qualifiers. The file identifier + may be a list of container:file pairs separated + by semicolons. + +\end{itemize} +\item \textbf{field\_id} -- An integer identifying the nth occurance of the field type. + Alternately may be "LAST" for the last occurance of the + field type, or "ALL" for the entire line (which causes the + field type to be ignored). Or if field\_type is SEARCH, the + field\_id is treated as the search expression. + If field\_type is "CONTAINS", the + remainder of the line is treated as a string to be + searched for. If field\_type is "PARAM", the field\_id is + the 1-based index of the parameter whose value is to be + assigned, and no other fields should be present. + If field\_type is "CHECKSUM", no other field is required. +\end{itemize} \subsubsection{Converting artifact file formats} Some artifact file formats are not easily referenced by results.config directives. @@ -1230,7 +1413,7 @@ can be processed into a more convenient form through use of a script at: \noindent Modify or expand on the default pregrade.sh script. In general, the pregrade.sh script is expected to extract or convert data from an artifact file, and write it into a new file in the .local/results -directory of the container. +directory of the container. The {\tt pubkey} lab has an example use of pregrade.sh. \subsection{Evaluating results} \label{goals.config} @@ -1240,7 +1423,7 @@ the student obtained expected results. Most lab goals defined in the goals.conf will evaluate to TRUE or FALSE, with TRUE reflecting that the student met the defined goal. In addition to these binary goals, the designer can capture and report on quantities of events, e.g., the number of times a student ran a specific program. -Once evaluated, a goal may determine the value of subsequent goals within the goals.config file, +Once evaluated, a goal value may affect the value of subsequent goals within the goals.config file, i.e., through use of boolean expressions and temporal comparisons between goals. The evaluated state of each goal can then contribute to an overall student assessment. @@ -1248,7 +1431,7 @@ Student results may derive from multiple invocations of the same program or syst The framework does not discourage students from continuing to experiment and explore aspects of the exercise subsequent to obtaining the desired results. In general, Labtainer assessment determines if the student obtained expected results during any invocation of a program or system utility, or during a time period -delineated by timestamp ranges described in section \ref{results.config}. \footnote{In those cases +delineated by timestamp ranges described in \ref{config-ranges}. \footnote{In those cases where the student is required to obtain the expected results during the final invocation of a program, the \textit{matchlast} goal type may be specified as described below.} @@ -1266,6 +1449,9 @@ A boolean goal\_id value is generated for each referenced result's timestamp. generated from the student email address as described in section \ref{parameterize}. A boolean goal\_id value is generated for each referenced result's timestamp. +\item A keyed hash of a specific result is compared to the keyed hash of an expected value -- to avoid +publishing the actual value of the expected result. See \ref{hash-goals}. + \item Timestamps and boolean values of two different goal\_id's are compared. For example, ``was a TRUE value for {\tt result A} generated while a TRUE value for {\tt result B} was being generated?'' A boolean goal\_id is generated for each @@ -1276,6 +1462,7 @@ A boolean goal\_id is generated for each timestamp range for which there is an i in the expression. \end{itemize} +\subsubsection{Goal definitions} The following syntax defines each goal within the goals.config file. While the syntax may appear complex, most goals can be expressed simply as can be seen in section \ref{examples} and in the Labtainer exercises distributed with the framework. @@ -1362,6 +1549,10 @@ in the Labtainer exercises distributed with the framework. - the following operators evaluate to TRUE as described below: string_equal - The strings derived from and are equal. + hash_equal - The resulttag value is hashed using the Lab Master Seed + defined in the start.config. That is compared with + the answertag, which should have been generated by + the hash-goals.py utility (see below). string_diff - The strings derived from and are not equal. string_start - The string derived from is at the start of @@ -1407,25 +1598,73 @@ in the Labtainer exercises distributed with the framework. Note that values derived from the parameters.config file are assigned the same values as were assigned when the lab was parameterized for the student. +\subsubsection{Distinguish between results generated before and after configuration changes} +\label{config-ranges} +Some labs direct students to configure a system so that it is ``secure'', or meeting some criteria +germane to lab learning objectives. Once the system is so configured, the student is then +directed to perform a specific set of actions to demonstrate the correctness of the +configuration. For purposes of automated assessment, we would like evidence that +the student performed all the prescribed demonstration steps without intervening +configuration changes. In other words, though the student may perform a myriad of +configuration changes and demonstrate steps (encourage experimentation!), +we'd like to know if there ever was a +single configuration in which all of the demonstration steps were performed. + +Labtainers provides the {LOG\_RANGE} and {TIME\_DELIM} result types to establish time +ranges over which we can assert that no configuration changes were made. Once those time ranges +are established, i.e., as a set of results with a single tag, the {\tt time\_during} and +{\tt time\_not\_during} goal operators bin \textbf{other results} into +those time ranges. Once so binned, the boolean operator can be used to determine if +the desired conditions were met within a single configuration state. See sections +\ref{log_range} and \ref{time_delim} for examples. + +\subsubsection{Replace answers with hashes} +\label{hash-goals} +Automated assessment files include expected results, which sometimes reflect ``answers'' to problems +that instructors would prefer not to publish, e.g., how many packets did source X send? +While automated assessment can help the instructor confirm that the student ran a program that generated the +desired output, not all instructors use automated assessment. For example, they may simply review lab reports. +Note this is not an issue when parameterization individualizes the expected result for each student. + +Labtainers allows designers to include keyed hashes of answers within the published files rather +than the answers themselves. The {\tt hash\_equal} operator used in a {\tt goals.config} file functions like +the {\tt string\_equal} operator, except the comparison is made on a hash of the named result value, generated +using the Lab Master SEED as the key. + +Instead of creating a {\tt goals.config} file directly, the designer creates a {\tt goals.answers} file that +contains the intended content of the {\tt goals.config} file, but with the actual answers, e.g.,: +\begin{verbatim} + ipv4_count = matchany : hash_equal : _ipv4_count : answer=2029121 +\end{verbatim} +\noindent The {\tt hash-goals.py} utility is then used to generate the {\tt goals.config} file, replacing +the plain text answers with the appropriate hashes. + +It is intended that the goals.answers files will not be distributed, e.g., they would be maintained with the +SimLab solutions repo. + \subsubsection{Assessment Report} -Evaluation of student results occurs on an instructor container, via a script named {\tt instructor.py}, which runs -automatically when the instructor runs the {\tt gradelab [lab]} command. The script can also be run manually, e.g., to -test changes and additions to grading configuaration files. It must be run from the HOME directory -on the container that results from running the gradelab command with the {\tt -d} option \footnote{Be sure to run -stopgrade after use of the {\tt -d} option to shut down the grading container when you are done with it}. +Evaluation of student results occurs on a \textit{grading} container +that starts when the instructor runs the {\tt gradelab } command. A report is generated +and displayed on the screen. A copy of the report is also placed in the {\tt latainer\_xfer} directory. +Debugging your assessment configuration an be aided by using {\tt gradelab -d }, which will start the +grading container and give you a shell into it. From there, run the script named {\tt instructor.py}. +There is a log in {\tt /tmp/instructor.log} in addition to diagnostics that might be generated on the terminal. +See section \ref{debug-grading} for additional information on debugging grading.\footnote{Be sure to run +stoplab after use of the {\tt -d} option to shut down the grading container when you are done with it}. By convention, all goals and boolean results whose symbolic names are not prefaced with an -underscore ({\tt\_}), will have corresponding entries in the assessment report, located in +underscore ({\tt\_}) or an {\tt cw\_}(see \ref{checkwork}), will have corresponding entries in the assessment report, located in the home directory in a file named {\tt .grades.txt>} \subsubsection{Document the meaning of goals} \label{document goals} -Instructors will see descriptions of lab goals when they start the lab using {\tt start.py}. -These descriptions are embedded within comments in the goals.config and results.config files. +Instructors will see descriptions of lab goals when they start the lab using {\tt gradelab}. +These descriptions are embedded within directives within the goals.config and results.config files. The descriptions are associated with symbolic names that immediately follow the documentation directives as described below: \begin{verbatim} # SUM: -- The remainder of the line and comment lines that immediately - follow are displayed independent of any goal symbols. + follow are displayed independent of any goal symbols. Terminate + summaries in SUM: directives with a blank line. # DOC: -- The remainder of the line and comment lines that immediately follow are displayed for the symbolic name that follows the comment lines. @@ -1435,15 +1674,87 @@ directives as described below: new comment. \end{verbatim} -\noindent See existing labs for examples. +\noindent You would include these directives in a results.config file for boolean results that appear as student goals, +e.g., a {\tt CONTAINS} result that does not have a leading underscore. And you would include directives in the goals.config +file for goals that appear in as student goals, i.e., those without leading underscores. +See existing labs for examples. Also see the \ref{checkwork} for additional directives. +\subsection {Student self-assessment} +\label{checkwork} +The {\tt checkwork} command allows students to assess their own work against +the criteria used by instructors for automated assessment of lab performance. +This can be disabled on a deployment-wide basis using the {\tt CHECKWORK no} directive +in the {\tt config/labtainers.config} file. Of course this assumes you have separately +provided access control over that file, e.g., through use of a custom VM appliance.\footnote{ +Disabling self-assessment might be useful if Labtainers was repurposed for skills assessment +testing.} + +\subsubsection {Current state assessment} +\label{current-state} +The lab designer can define a subset of goals and results that inform the student +whether the \textit{current} system state is as desired. This greatly differs +from typical Labtainer goal assessment, which measure whether the student ever +achieved expected results, regardless of the system's current state. These +\textit{current state} goals are intended to guide the student with potentially +more information than is found (or is practical) in the standard goals. The current state goals +are not intended to replace other goals, and they are not displayed to instructors. + +The current state goals and results must have a prefix of {\tt cw\_}, and they +are required to have documentation directives of {\tt CHECK\_TRUE} or {\tt CHECK\_FALSE}. +Text included within a directive will be displayed to students if the value +of the associated goals at the time {\tt checkwork} was run does not match the directive value. +In the example below the documentation directive will be displayed if the {\tt cw\_ssh\_open} +value is {\tt False}. +\begin{verbatim} + #CHECK_TRUE: The SSH port is not open. + cw_ssh_open = client:prestop.stdout : FILE_REGEX : 22/tcp.*open +\end{verbatim} +\noindent A {\tt CHECK\_OK} documentation directive can be added display to text in the event that +all of the {\tt cw\_} goals match their documentation directives. + +Current state goals +are expected to reflect the current state of the computers as described below. + +\subsection {Current state artifacts} +Results and goals used for current state assessment should primarily be derived from artifacts generated by {\tt prestop} scripts +described in \ref{prestop}. The system uses the most recent timestamp found for any files named by current state +results, i.e., those with the {\tt cw\_} prefix. The designer can name any file for a current state result -- but note it may +be difficult to divine current state solely from previous artifacts, e.g., the state may have changed. For this reason, we +suggest use of prestop scripts. + +To highlight the differences between current state assessment and standard Labtainers assessment, consider an example +lab that requires the student to enforce an access control policy on a database having several users with differing +authorizations. To support the instructor, we'd like to report on whether the student ever managed to configure the +database permissions within a single configuration such that all users were prevented from exceeding their authorization and +yet were able to access data to which they were authorized. Providing the instructor with point details of whether individual +modes of access were permitted or denied at any time in the lab might not be very helpful because the context of such access +would not be known. For example, a goal might reflect that John was denied access to some table at some point, but was it due to everyone being +denied access? Or due to John being denied access to everything? Such intermediate results can be presented to instructors +(or they can delve into intermediate results themselves on the grader container), but those results lack context within the +grading report. On the other hand, when the student runs {\tt checkwork}, the context is clear and we can provide feedback +to the student about the current state of the system relative to the goals. Now the questions are better formed, e.g., +does John currently have access to the expected table columns?. + +The above discussion is not intended to dissuade lab designers from informing instructors about partial success. If goals +can be defined to show the student was able to provide most of the desired access controls though unable to enforce the entire policy, +that is to be encouraged. But that can also be hard to do. It is often far easier to provide the student with information about partial +goal achievement because the context is \textit{now}. \subsection{Assessment examples} \label{examples} The following examples illustrate some typical assessment operations as they would be defined in the results.config and goals.config files. -\subsubsection{Do artifact files contain specific strings?} +\subsubsection{Did a program output an expected answer?} +Often, the easiest approach to such an assement is to simply use a {\tt FILE\_REGEX} field\_type +within the results.config -- and not bother with the goals.config. +\begin{verbatim} + got_x = *.stdout : FILE_REGEX : X is:.*347 +\end{verbatim} +The lab goals will include a boolean named {\tt got\_x}, which will be true if any stdout file +contained a string matching that REGEX. + +\subsubsection{Do artifact files contain one of two specific strings?} Consider the labs/formatstring/instr\_config/results.config file for a few examples. The first non-comment line defines a result having the symbolic name ``\_crash\_sig'': \begin{verbatim} @@ -1480,110 +1791,130 @@ modify_value = matchany : string_diff : newsecret1value : result.origsecret1valu \noindent , which will be TRUE if any of the vul\_prog stdout files include a ``newsecret1value'' that differs from its ``oldsecret1value``. +\subsubsection{Was a log entry written while some command executed?} +Consider these two entries in {\tt results.config}: +\begin{verbatim} + # Time stamp of log entry containing IP address + log-from-w1 = w3:/var/log/myhttplogfile.txt : LOG_TS : 202.25.4.2 + # Use of wget -- will result in time stamp range: start-finish + wget-w1 = w1:wget.stdin : CONTAINS : 202.25.4.2 +\end{verbatim} +\noindent The following {\tt goals.config} entry will be true if the log entry was +ever generated using wget from the w1 computer: +\begin{verbatim} + didit = time_during : log-from-w1 : wget-w1 +\end{verbatim} + + \subsubsection{My desired artifacts are not in stdin or stdout, the program outputs a file} See section \ref{program output} -\subsubsection{Distinguish log file entries generated before and after configuration changes} -\label{time delimeter} -When log files are named in results.config files, you can qualify the log file name -with the name of program whose invocation serves as a {\tt time\_delimiter} introduced -in section \ref{results.config}. -The {\tt time\_delimiter} identifies some -monitored program whose start times will be used to organize the log file into -a set of timestamped results. This differs from use of HAVESTRING\_TS and -REGEX\_TS in that those store results as descrete timestamped values for each -timestamp found in the log file. The {\tt time\_delimiter} timestamp values are -based on the start times of the monitored program. The intended use is to -group results from programs whose actions result in entries in the log file. -This can be useful for grouping system log entries based on system configuration -changes (i.e., accomplished via the {\tt time\_delimiter} program). -Consider a lab that directs students to alter iptables on a component using the -/etc/rc.local script. The student is required to demonstrate a desired iptables +\subsubsection{Delimiting time using log file entries} +\label{log_range} +The LOG\_RANGE result type generates a set of results having timestamp ranges that +cover the period between specified log entries. For example, a results.config directive of: +\begin{verbatim} + syslog_slices = server:/var/log/messages : \ + LOG_RANGE : Started System Logging Service +\end{verbatim} +\noindent would create a set of time ranges with periods between each start of +the system logging service. The use of {\tt time\_during} +and/or {\tt time\_not\_during} and {\tt boolean} in the goals.config could then assess whether +two or more events occurred during a given system log configuration. For example, assume the +results.config file also included these directives: +\begin{verbatim} + _did_first_thing = client1:did_this.stdout : CONTAINS : Did that thing + _did_second_thing = client2:did_other.stdout : CONTAINS : Did that other thing +\end{verbatim} +\noindent We'd like to know if the above two results were ever achieved within one configuration +of the logging system. This can be determined by first binning the above two results into the +time ranges established by the {\tt syslog\_slices} result through use of {\tt time\_during} within +the goals.config as follows. +\begin{verbatim} + _did_first_during = time_during : _did_first_thing : syslog_slices + _did_second_during = time_during : _did_second_thing : syslog_slices +\end{verbatim} +\noindent That yields two sets of goals having time ranges defined by the {\tt LOG\_RANGE} +results. We can then use a boolean operator to determine if those two goals were ever +achived within the same established time range\footnote{Recall that the use of the boolean operator +only makes sense for goals/results having matching timestamps}: +\begin{verbatim} + did_both = boolean : (_did_first_during and _did_second_during) +\end{verbatim} + +See the centos-log2 lab for an example. + +\subsubsection{Delimiting time via program invocations} +\label{time_delim} +The {\tt TIME\_DELIM} result type is intended to identify some +program whose invocation times will be used to create a set of time ranges. +These results, like those from {\tt LOG\_RANGE} differ from other result types +in that they define ranges between events. For example, a {\tt CONTAINS} result +set from {\tt stdout} files would have timestamps reflecting the corresponding program +start and stop time, while a {\tt TIME\_DELIM} result would have timestamps +reflecting the periods \textbf{between} invocations of the program named in the directive. + +Consider a lab that directs students to alter iptables on a component. +The student is required to demonstrate a desired iptables configuration by running nmap on various other components. The instructor wants to confirm that some set of expected stdout from nmap running on different components all occurred within a single -configuration of iptables, delimited by the running of rc.local. In other words, +configuration of iptables, delimited by the running of the iptables command. In other words, the student cannot succeed by altering iptables between invocations of nmap on -different components. In this example, the {\tt file\_path} would name the iptables -log, and the {\tt time\_delimiter} would name rc.local. In order to track invocations -of rc.local, we would add it to the {\tt treataslocal} file described in section \ref{stdin and stdout}. +different components. + +Note, that to be generally useful, we do not wish to simply look for invocations of iptables +by the student. +For example, using the command to view the configuration does not represent a change to +the configuration. Also, the iptables may be called from a script, e.g., rc.local, and +our typical use of stdout files would not see the running of iptables. It is therefore +suggested that {\tt TIME\_DELIM} results be tied to files created as an effect of +notify events described in \ref{notify}. In this example, the notify event would be execution +of /sbin/iptables, and the {\tt notify\_cb.sh} script would determine if a change were being +made to the configuration. Then, if the lab results.config were: \begin{verbatim} - _iplog = outer_gw:/var/log/ulog/syslogemu.log:rc.local : \ - CONTAINS : IPTABLES DROPPED + iptables = firewall:iptables : TIME_DELIM _remote_nmap_443 = remote_ws:nmap.stdout : CONTAINS : 443/tcp open https _remote_nmap_sql = remote_ws:nmap.stdout : CONTAINS : 3306/tcp open mysql _local_nmap_443 = ws1:nmap.stdout : CONTAINS : 443/tcp open https _local_nmap_sql = ws1:nmap.stdout : CONTAINS : 3306/tcp open mysql \end{verbatim} -\noindent The {\tt \_iplog} result would then have up to N+1 timestamped instances, -where N is the quantity of times that rc.local was executed. The first possible +\noindent The {\tt iptables} result set would then include up to N+1 timestamped instances, +where N is the quantity of times that iptables was executed to change the configuraion. The first possible timestamp would have a starting time of zero and an ending time of the very first -invocation of rc.local. The nmap results would each have timestamps corresponding +consequential invocation of iptables. The nmap results would each have timestamps corresponding to their times of execution. Note the nmap results include results from two different computers, ws1 and remote\_ws. A goals.config file of: \begin{verbatim} - remote_nmap_443 = time_during : _remote_nmap_443 : _iplog - remote_nmap_sql = time_during : _remote_nmap_sql : _iplog - local_nmap_443 = time_during : _local_nmap_443 : _iplog - local_nmap_sql = time_during : _local_nmap_sql : _iplog + remote_nmap_443 = time_during : _remote_nmap_443 : iptables + remote_nmap_sql = time_during : _remote_nmap_sql : iptables + local_nmap_443 = time_during : _local_nmap_443 : iptables + local_nmap_sql = time_during : _local_nmap_sql : iptables remote_correct = boolean : ((remote_nmap_443 and_not remote_nmap_sql) \ and local_nmap_443 and local_nmap_sql) \end{verbatim} -\noindent would generate sets of nmap goals grouped into timestamps corresponding to the -{\tt \_iplog} results. The {\tt remote\_correct} boolean expression could then be read as: +\noindent would generate sets of nmap goals with timestamp ranges corresponding to the +{\tt iptables} results. The {\tt remote\_correct} boolean expression could then be read as: ``Was there any single iptables configuration during which the student used nmap to demonstrate that: \begin{itemize} \item The remote workstation could reach the HTTPS port but not the SQL port, and, \item The local workstation could reach the HTTPS port and the SQL port. \end{itemize} +The file identifiers for {\tt TIME\_DELIM} commands can be lists of container:file +pairs separated by semicolons. This is useful when configuration changes are delimited +by modifications made on more than one component or by more than one program -\subsubsection{Delimiting logs by starting services} -\label{time delimiter services} -Another example of the use of {\tt time\_delimiter} log file qualifiers is a web server, -and its corresponding httpd log. It may be desired to group log entries generated during a -single configuration of the web server, delimited by the starting of the web server, e.g., via -{\tt sudo systemctl restart httpd}. Here, our {\tt time\_delimiter} program is the use of systemctl -to start or restart the httpd. Services are named in the {\tt treataslocal} file by giving them a -suffix of ``.service'', e.g., -\begin{verbatim} - httpd.service -\end{verbatim} -\noindent and that same name is used for our {\tt time\_delimiter}, e.g., -\begin{verbatim} - web_log = vuln-site:/var/www/csrflabelgg.com:httpd.service : CONTAINS : GET / HTTP/ -\end{verbatim} -\noindent will create time stamp ranges delimited by the starting of the web server. Results from -other programs, (or other results derived from the web log), could then be similarly group using -the {\tt time\_during} operation, e.g., -\begin{verbatim} - _some_goal = time_during : other_result : web_log - _some_other_goal = time_during : yet_another_result : web_log - success = boolean (_some_goal and _some_other_goal) -\end{verbatim} -The success goal would only then be TRUE if the two goals each occurred during a single instance -of the web server configuration, as delimited by use of {\tt systemctl restart httpd}. - -\subsubsection{Delimiting time using log file entries} -An alternate way to create groupings of log file entries is to use the log\_range -result type. For example, a result.config directive of: -\begin{verbatim} - syslog_slices = /var/log/messages : LOG_RANGE : Started System Logging Service -\end{verbatim} -\noindent would create a set of timestamped values whose ranges are based on occurrences -of the system logging service being started. The use of {\tt time\_during} -and/or {\tt time\_not\_during} and {\tt boolean} in the goals.config could then be used to assess whether -two or more events occurred during a given system log configuration. See the centos-log lab -for an example. \subsection{Debugging automated assessment in labs} +\label{debug-grading} Developing automated assessment for a new lab typically requires some amount of debugging. This section is intended to guide new developers through the process. @@ -1591,7 +1922,7 @@ through the process. When the {\tt gradelab} script is run from labtainers-instructor, the configuration files in labs/[lab name]/instr\_config are validated. If syntax errors are found, error messages are displayed at the terminal -and processing halts. The error messages identify the offending result.config +and processing halts. The error messages identify the offending results.config or goals.config entry. Refer to sections \ref{results.config} and \ref{goals.config} for the expected syntax of these files. @@ -1612,9 +1943,73 @@ From there, look in .local/result to find json files reflecting intermediate results of assessing the student results. The actual student result arifacts can be found in \verb!~/[student dir]/[lab].[container].student/.local/result!. +Another tool that may aid development and debugging of automated assessment for your lab is the web-based assessment interface. +Using the {\tt -w} switch to the {\tt gradelab} command will start a Flask-based web server on the grading container that listens +on port 8008 on the VM. Point a browser to {\tt localhost:8008} to view the assessment data, which includes links to intermediate and +raw result artifacts. + The mechanics of performing the lab (so that you can test grading for different outcomes) can be automated using the SimLab tool described in Appendix \ref{testing}. +\section{Quizzes} +Labs may include simple quizzes intended to re-enforce a student's understanding of concepts +necessary to perform the lab. The quizzes are not intended to be a primary source of +student assessment, rather, they are intended to help the student understand if they understand. +No attempt is made to protect quiz answers, or to randomize or parameterize quizzes. +An example application of quizzes is to allow the student to confirm his or her understanding +of a security policy prior to trying to implement enforcement of that policy. + +Quizzes are performed on the Labtainer host from within the {\tt labtainer-student} directory +using the {\tt quiz} command. Use the {\tt -h} option to see its usage. + +A lab may have multiple quizzes. Each is defined in a file in the lab {\tt config} directory +within a file having an extension of {\tt .quiz}. Each quiz includes a set of +questions. Each question is defined by a comma separated list. If a line terminates +without a comma or a backslash, it is treated as the end of the question, and the next line +is treated as the beginning of the next question. +Question types include the following: +\subsection{True or False} +A question whose answer is either true or false. +\begin{verbatim} +ID, TrueFalse, question, answer, right_response, wrong_response, prerequisit +\end{verbatim} +\noindent Where: +\begin{itemize} +\item ID -- any string identifier, must be unique. Currently only used to identify prerequisites as described below. +\item TrueFalse -- identifies this as a True or False question. +\item question -- The question, in double quotes. +\item answer -- Ether T or F. +\item right\_response -- Message to display if a correct response is provided. All correct responses cause the word +\textit{Correct} to be display in bold font. Use empty double quotes of if that should be the only message. +\item wrong\_response -- Message to display if a incorrect response is provided. All incorrect responses cause the word +\textit{Incorrect} to be display in bold font. Use empty double quotes of if that should be the only message. +\item prerequisite -- Optional ID of a another question. If provided, and that question was answered correctly, then +this question will be skipped. This is intended to re-enforce concepts that the student previously answered incorrectly. +\end{itemize} +\subsection{Preface} +Text to display, e.g., prior to a set of questions. +\begin{verbatim} +ID, preface, text +\end{verbatim} +\noindent Where: +\begin{itemize} +\item ID -- any string identifier, must be unique. +\item preface -- identifies this as a preface whose text will be displayed. +\item text -- The text to be displayed. This text is intended to provide context for whatever questions follow. +\end{itemize} +Here is an example quiz question and prefix: +\begin{verbatim} + 0, Preface, + "The following quiz is intended to help you determine if you are \ + ready to perform the lab." + 1, TrueFalse, + "In this lab, you will configure a firewall to use malware signatures to block \ + traffic destined for a server.", F, + "This lab will use iptables to filter network traffic destined for a server.", + "This lab will use iptables to filter network traffic destined for a \ + server based on IP packet addresses and port numbers." +\end{verbatim} + \section{Networking} \label{networking} Most networking is simply a matter of defining networks and assigning them to containers as described in \ref{start config}. @@ -1627,13 +2022,36 @@ It also allows the student to reach external networks, e.g., to fetch additional support of student exploration. In many instances, the lab designer will want to define a different default route for a -container. Each container includes a \textit{set\_default\_gw.sh} -script that can be added to the \textit{/etc/rc.local} file to redefine the default gateway. +container. The start.config definitions for each container include an optional {\tt LAB\_GATEWAY} parameter +that, if set, will replace the default Docker gateway with the given gateway, and it will replace the +resolv.conf entry and delete the route to the {\tt my\_host} address. +That configuration setting is implemented using a \textit{set\_default\_gw.sh}, which designers can +optionally chose to directly use instead of {\tt LAB\_GATEWAY} +in order to get more control over the setting of a default gateway, e.g., as part of parameterization. This script will automatically retain a route table entry so that the student can reach the ``my\_host'' address. Additionally, those baseline images include a \textit{togglegw.sh} script that the student can use to toggle the default gateway between one that leads to the host, and one defined for the lab. This allows students to add packages on components having lab-specific default gateways. +\subsection{Network Taps} +In general, Docker containers will only see network traffic addressed to the specific container, (or +broadcast traffic). The behavior is consistent with use of a layer 2 network switch to interconnect +containers on the same subnet. In some labs, the designer may wish to provide students with copies of +all network traffic that occurs on one or more subnets. Labtainers supports network taps through use of +two container base images: \textit{tap} and \textit{netmon}. The {\tt tap} component should not be visible +to the student, it exists to collect traffic off of all networks whose {\tt start.config} definitions include +the {\tt TAP YES} attribute. The {\tt netmon} component should be defined with a single network interface +to a network called {\tt TAP\_LAN}. The {\tt netmon} component should be the only one on the {\tt TAP\_LAN} +network, (do not add the {\tt tap} component to any network). The {\tt tap} component must have the {\tt TAP YES} +attribute. A service runs on the {\tt netmon} component +that will receive network traffic sent by the {\tt tap} component, and store it into the {\tt /taps} directory +within PCAP files named using the network name. See the {\tt plc-traffic} lab as an example. + +The {\tt netmon} base is derived from the wireshark base. You may add other tools to that container as needed. + +All containers attached to tapped networks will not be started until the tap and netmon containers are up +and ready. This ensures that all startup traffic is captured in the PCAPs. + \subsection{Realistic Network Routing and DNS} Some labs will strive to represent realistic networking environments, e.g., several networked components including gateways and DNS servers. @@ -1690,7 +2108,16 @@ NETWORK LAN Also see the description of Multi-user labs in \ref{multi user}. +\subsection{Network interface assignments} +Docker appears to assign network connections to containers in alphabetical order. E.g., connecting +networks LAN1 and LAN2 to a container would result in LAN1 being connected to device eth0 -- regardless +of the order in which LANs are defined within the start.config file. Understanding this ordering may +be helpful for networking labs, e.g., when defining routes. + \section{Building, Maintaining and Publishing Labs} \label{publishing} +This section describes how labs are built, maintained and published. Additional information +on tools and strategies intended for use by outside developers are described in section \ref{imodules} + Typically, when a Labtainer is started, the container's associated Docker images are pulled from the Docker Hub if they are not already local on the Linux host. When building and editing labs, the designer desires to run images reflecting recent changes that have been made. The framework @@ -1700,12 +2127,12 @@ rebuild those images that have changed. The designer can force the rebuild of a a lab by appending the ``-f'' switch to the end of the ``rebuild.py'' command. That switch is not intended for routine use because it wastes time and masks errors in our dependency logic. -If you build a new Labtainer exerciese, the container images will not be on the Docker Hub unless you put -them there. If they are not on the hub, each student's computer will rebuild your lab when they go to run it. -While this is fully functional, the build time may distract from performance of the lab. If you +If you build a new Labtainer exercise, the container images will not be on the Docker Hub unless you put +them there. If you create your own public repository on the Docker Hub (https://hub.docker.com/), you can populate that with your lab(s) by setting the ``REGISTRY\_ID'' value in the start.config file for the lab(s). You -would then use the distrib/publish.py script to build, tag and push your lab to your registry. +would then use the distrib/publish.py script to build, tag and push your lab container images to your registry. +Please refer to the section \ref{imodules}. \subsection{NPS Development Operations} When building lab images at NPS, please set the LABTAINER\_NPS environment variable to "YES", e.g., @@ -1721,37 +2148,18 @@ ENV APT_SOURCE $apt_source \end{verbatim} \noindent That will force use of the original apt-sources for that container. -Labs must be checked into the local Git repository in order to be distributed. After creating and testing +Labs must be checked into the Git repository in order to be distributed. After creating and testing a new lab, use the scripts/designer/bin/cleanlab4svn.py script to remove temporary files that do not belong in -git. Use the publish.py script (described above) to publish the lab containers. -The distrib/mkdist.sh script is used by NPS to create the distribution tar file. This script relies on -your local Git repository as the source to the Labtainer scripts and labs. Use the mk-devel-distrib.sh script -to publish the developer configuration of the tar file. +git. -The mkdist.sh and mk-devel-distrib.sh scripts include "myshare" variables that define a path to a directory -shared with the development VM's host. The scripts will place the resulting tar files in this directory. You -must then manually transfer the updated tar files (including the {\tt labtainer\_pdf.zip} file) to the Liferay -server at -\begin{verbatim} -davs://my.nps.edu/webdav/c3o-staging/document_library/labtainers -\end{verbatim} -After transfering the files, use the Liferay ``Publish to Live'' function to make the files available on the -Labtainers website (which is also where they are pulled from when a student runs update-labtainer.sh). - -Be sure to push your Git repository updates to the GitHub master. - -The distrib/publish.py script is used to rebuild and -publish individual labs, or optionally all of the Labtainer exercises managed by NPS. -The publish.py (without the {\tt -l} option) script will only rebuild labs that have changed. After pushing a new lab container -image to the Docker hub, the script deletes the image from the local system. The intent is to -ensure that future testing of the lab is done on the authoritative copy, i.e., from the hub. +See the \textit{Labtainers Framework Development Guide} for information on integration, testing and release management. Labtainer base images are built and published from the scripts/designer/bin directory. Prior to publishing baseline images, it is suggested that all local images be purged from the development machine, e,g., \begin{verbatim} /trunk/setup_scripts/destroy-docker.sh \end{verbatim} -\noindent This will ensure the new baseline images to not incorporate layer remnants. +\noindent This will ensure that new baseline images do not incorporate layer remnants. All new images should be first built and pushed onto the test registry, i.e., using the {\tt ./publish\_image.sh -t} @@ -1769,7 +2177,7 @@ LABEL version=$version \noindent And, be sure to publish the revised framework before publishing the revised lab(s). \subsection{Alternate registry for testing} -If the environment variable {\tt TEST\_REGISTRY}, is set to YES, labs to be pulled and pushed +If the environment variable {\tt TEST\_REGISTRY}, is set to TRUE, labs to be pulled and pushed into an alternate registry defined in the trunk/config/labtainer.config file test\_registry entry. Also, the {\tt build\_lab.py}, {\tt labtainer}, and {\tt publish.sh} scripts include {\tt -t} flags to force the system to reference the test registry instead of the Docker Hub. @@ -1790,7 +2198,10 @@ A file named {\tt /config/bigexternal.txt} with entries as follows: \end{verbatim} \noindent will cause a rebuild to look for a file at {\tt relative\_path} relative to the lab directory, and -fetch it from the {\tt url} if it is missing. +fetch it from the {\tt url} if it is missing. Note that the date/times of these files are not referenced for rebuild dependencies +due to limitations in product such as box.com which fails to provide file modification times. Instead, the modification time of the +bigexternal.txt file is used to control rebuilds. Thus, if you update one of the large files, you will want to make a gratuitous change +to the bigexternal.txt file to force a rebuild (for you and others who may extend your lab.) \subsubsection{Reuse of large file sets} \label{manifest} @@ -1850,6 +2261,10 @@ For example, \textbf{never} change container names for existing labs. If such a change is needed, create a new lab, and assign version numbers to it and the old lab. +Another cause for creating a new lab version is a change to automated assessment +criteria. If new criteria is not consistent with potentially old results, a new +version should be considered. + Lab version numbers are kept in the optional {\tt labs/[lab]/config/version} file. There is no need to have such a file until there are two or more versions of the same lab. (Note if you want two versions of a given lab to be runnable and to appear @@ -1874,6 +2289,16 @@ When the user types the {\tt labtainer} command with no arguments, the list will only include the latest version of that lab. An exception is if the old lab already has been run in this installation, in which case both lab versions will display. +\subsection{Creating new base images} +Labtainer base images are managed using scripts and configuration files in the {\tt scripts/designer} directory. +The {\tt bin} subdirectory includes a set of scripts that create various base images, and the +{\tt base\_dockerfiles} contain their Dockerfiles. Use those as a template. + +Typically, new base images are created to support a new lab. Proper Labtainer lab Dockerfiles have {\tt FROM} directives +that include the {\tt \$registry/} qualifier, however your new base image might not yet be published to a registry +as you test it, and tagging the new base image with the registry name may complicate your desired workflow. +Use the {\tt -L} option to the {\tt rebuild} command to direct the build to use unqualified image names if needed. + \subsection{Importing labs: Warning!} \label{warnings} Avoid the use of ``shared folders'' in VMWare and VirtualBox as a means of copying lab @@ -1881,6 +2306,317 @@ directories. Use tar and/or scp instead. Otherwise permissions of directories be changed, e.g., no x access to /etc for other. +\section {Labtainer Instructor Modules (IModules)} +\label{imodules} +This guide describes how instructors can add content to Labtainers. +Instructors extend Labtainers with new labs or customized versions of existing +labs by defining IModules and directing their students to enable the IModules within +their individual Labtainers instances.\footnote{Or, instructors can enable IModules in VMs, and direct students to use those.} +Students simply type: {\tt imodule } to add a given URL to their Labtainers instance. +The scope of instructor-generated extensions can range from modified lab manuals +to new Labtainer exercises. The Labtainers framework provides tools +to assist instructors in creating and publishing these extensions. + +\subsection{Labtainers distribution strategy} +To understand how IModules are distributed, it is helpful to first review the general +Labtainers distribution strategy. A Labtainers installation, (e.g., the initial content of a Labtainers VM +appliance, or the results of installing from the distribution), includes the scripts and configuration files +needed to run all Labtainers exercises. The installation initially only includes a small number of +Docker container images that provide the core of container images for each of the labs. +When a student first starts a given lab, the framework retrieves all Docker image layers +required for that lab. These layers are retrieved from the Docker Hub, and build upon the core images +present in the initial distribution. The scripts and configuration files are +published as a tar archive on the Labtainers website. Whenever a Labtainers installation is updated, +the archive is retrieved from the website and used to update the installation. + +Files needed to create Docker images are typically not distributed in Labtainers distributions, but are +installed when the user runs the update-designer script. These files are drawn from a separate +tar archive on the Labtainers website. + +\subsection{Imodule distribution strategy} +Instructors place archives on a web server and student +instances of Labtainers retrieve those archives from the web server while retrieving other +Labtainer updates. When creating new labs, instructors publish the lab Docker images to +DockerHub, where they'll be retrieved by the framework when students run that lab. +While the publishing of extensions does not depend on any particular +source control system, supporting tools that simplify archive creation are built around git. + +Archives published by instructors are tar files that include only changed and new files, +relative to the Labtainers baseline. Inclusion of unchanged (relative to the +Labtainers baseline) files is discouraged, as is publishing only deltas from previous +IModule publications. Put another way, an IModule will contain any +and all files +necessary for running, (not building), all new labs -- or to modify existing labs, +relative to the Labtainers baseline as defined by the GitHub master repository. + +Support tools simplify creation of IModule tar files through use of git attributes. +Instructors who chose not to use git are responsible for creating a tar of selected +files -- which may be trivial, e.g., if the IModule consists of lab manual modifications +or new lab guides. Paths within tar files will be relative to the labtainers/lab +directory. For example, a revised telnet-lab manual would have the path: +\begin{verbatim} + telnet-lab/docs/telnet-lab.pdf +\end{verbatim} +\noindent Note the modified source, e.g., docx files, need not be included in the IModule +archive, though the support tools do include them. + +Typically, each participating instructor will publish a single archive (i.e., a tar file) +at a publically accessible URL specific to the instructor or institution. The URL +is distributed to students and entered into their Labtainers +instance using the {\tt imodule} command \footnote{The full URL is published because many +web hosting systems, e.g., box.com make it impossible to construct URLs from relative paths}. +For example, if the instructor publishes +at \url{https://myschool/mystuff/labtainers/imodule.tar}, the students would each issue +this command to Labtainers: +\begin{verbatim} + imodule myschool/mystuff/labtainers/imodule.tar +\end{verbatim} + +The student labs will be updated to include those IModules. Student labs +will be updated whenever the student runs either {\tt update-labtainer.sh} or {\tt imodule -u}. + +IModule support tools rely on instructor contributions existing in local git repositories. +The tools do not reference remote repositories. IModule repositories have no relationship +to the main Labtainers repository, and should be managed within Labtainer +distributions rather than within local repo copies of the main Labtainer repository. \footnote{In general, +instructors and lab designers are encourage to work from Labtainer distributions rather +than repos pulled from the Labtainers repo at GitHub to avoid git repository conflicts.} + +\subsection{Testing IModules} +Use a separate VM to test your IModules, i.e., not the VM used to develop the lab. A separate +Labtainer VM is suggested. Use this independent VM to mimic what a student will see and do. If +you'd prefer to test an IModule prior to publishing the imodule.tar file, place the file on the +test system and use the {\tt file://} URL syntax, e.g., +\begin{verbatim} + imodule file://home/student/imodules/imodule.tar +\end{verbatim} +\noindent Use of SimLab, as described in \ref{testing} is encouraged to ensure the lab behaves as intended. + +\subsection {Custom lab manuals} +The easiest way to provide your students with a custom version of a lab manual that they can reference from Labtainers +is described below. This does not require that you use the Labtainer VM or git. The example assumes you are customizing +the telnet-lab manual. +\begin{itemize} +\item Create your version of the manual in the pdf format (if the manual source is docx, export it as pdf). +\item Put that manual in a file with the original name, in an otherwise empty directory structure that includes the name is the lab +and ``docs'', e.g., +\begin{verbatim} + telnet-lab/docs/telnet-lab.pdf +\end{verbatim} +\item Create a tar file of directory structures starting at the lab name. (Issue the tar file from the parent of the lab directory.) +\begin{verbatim} + tar cv imodule.tar telnet-lab +\end{verbatim} +\item Publish that tar file onto a web server, i.e., something that responds to {\tt http get} commands. +\item Instruct your students to provide that URL to the {\tt imodule} command. +\end{itemize} +If you wish to publish multiple custom lab manuals, put them all in the same tar file. +\subsection {Imodule examples} +These examples assume the instructor is working from a Labtainers distribution, e.g., one +of the VM appliance. +\subsubsection {Modify a lab manual for the telnet-lab} +In this example, the instructor wants his or her students to work with a customized version +of the telnet-lab manual. +\begin{itemize} +\item Change directory to {\tt \$LABTAINER\_DIR/labs} +\item Initialize the git archive: +\begin{verbatim} +git init +\end{verbatim} +\noindent (Do this only once, no need to repeat for each IModule.) +\item Add the original Labtainer file as the baseline: + +\begin{verbatim} +git add telnet-lab/docs/telnet-lab.docx +\end{verbatim} +\item Edit the telnet-lab/docs/telnet-lab.docx file +\item Commit your change: +\begin{verbatim} + git commit telnet-lab/docs/telnet-lab.docx +\end{verbatim} +\end{itemize} + +This change has no effect on any Docker container, so we need only generate the +updated tar: +\begin{verbatim} + create-imodules.sh +\end{verbatim} + +\noindent Then publish the imodule.tar to the website. + +\subsubsection{Create a new lab} +In this example, the instructor wants to create a new lab for use by his or her students. +This example assumes the instructor has created a DockerHub registry that is publicly accessible. +\begin{itemize} +\item Change directory to labtainer/labs +\item Initialize git archive: git init (Do this only once, no need to repeat for each IModule.) +\item Create the lab per the Lab Designer User Guide, for this example, we assume the lab is my-new-lab. +\item Include the name of your Docker Hub registry the lab config/start.config file {\tt REGISTRY} attribute. +\item Complete development and testing of the lab, e.g., build a SimLab test. +\item While in the my-new-lab directory, run {\tt cleanlab4svn.py} to remove temporary files that should not be under source control. +\item While in the lab directory (parent of my-new-lab), add the lab to source control: +\begin{verbatim} + git add my-new-lab + git commit my-new-lab -m "Adding an IModule" +\end{verbatim} +\item Publish the lab container images: +\begin{verbatim} + cd $LABTAINER_DIR/distrib + ./publish.py -d -l my-new-lab +\end{verbatim} +\noindent This will rebuild the lab container images and publish them to your DockerHub registry. Your {\tt start.config} files for +your labs name this registry, and that allows student Labtainer implementations to retrieve your lab images without having to rebuild them. +Note the {\tt -d} option directs the +function to publish to the DockerHub registry named in your lab start.config file. Otherwise, it will try to publish to a test registry. +Use of test registries is optional, and are described in the \textit{Lab Designer User Guide}. +\item Generate the updated IModule tar: +\begin{verbatim} + create-imodules.sh +\end{verbatim} +\noindent This creates a tar that contains all of your IModule labs, i.e., those you have added to your git repo. If you do not use git +to manage your lab source, you will have to create the IModule.tar yourself. +\item Then publish the imodule.tar to your website and distribute the URL to whoever you want to have access to your labs. +\end{itemize} + +\section {Remote access and control of Labtainer exercises} +This section describes features intended for use within structured environments in which one or more students are performing +a lab exercise under supervision of an instructor or red-team member. This does not apply to environments in which students +individualy run Labtainers on dedicated computers at their own pace. + +The environment may have one of two forms: + +\begin{enumerate} +\item Each student has a dedicated computer upon which a Labtainer VM resides, and the instrutor has network access to each computer; or, +\item Multiple Labtainer VMs (or custom-built VMs containing Labtainers) run on one or more servers that are networked together. +Students interact individually with their allocated VM using a tool such as VMWare Horizon or Apache Guacamole, +which presents the student with the Linux desktop of their allocated VM via a browser or client application. +\end{enumerate} +\noindent We assume that something within the infrastructure allows remote network access by an instructor to each VM, e.g., +via port forwarding. The instructor will use this network access to manage aspects of the lab exercise, and/or remotely access +selected containers, e.g., as a red-team activity. + +\subsection{Remote management} +Labtainer remote management functions allow instructors to query and change the state of the Labtainers exercise +currently running on each VM. The remote access functions available to instructors currently include: +\begin{itemize} +\item \textbf{status} -- Display the name of the lab running on a specific VM. +\item \textbf{copy} -- Copy files into a Labtainer container per a copy directive defined in: +\begin{verbatim} + /config/copy.config} +\end{verbatim} +\end{itemize} + +\subsubsection{File copying} +\noindent The {\tt copy.config} file contains one or more directives, one per line as follows: +\begin{verbatim} + +\end{verbatim} +\noindent Where: +\begin{itemize} +\item \textit{directive} is a arbitrary string identifier that names the directive. +\item \textit{container} is the name of the container into which the files are to be copied. +\item \textit{source} is a source path upon the VM. If this path starts with {\tt \$LAB}, the path is relative to +the lab directory. Otherwise, a full pathname is expected, e.g., the path to a folder shared with all VMs on a host. +\item \textit{destination} is the destination path upon the target container. Permissions are retained if possible, e.g, if the +source files are owned by {\tt root:root}, that will be maintained on the destination. +\end{itemize} +\noindent The semantics of source and destination are per the Unix {\tt cp -a} command. Please see the discussion of {\tt SRC\_PATH} +and {\tt DEST\_PATH} in \url{https://docs.docker.com/engine/reference/commandline/cp/} + +\subsubsection{Client and server setup} +The python service at {\tt scripts/remote/remote.py} should be started on each Labtainers VM with the {\tt --daemon} option. + +The python client at {\tt host\_scripts/remote/remote.py} should be copied to whatever host the instructor will work from. + +Port forwarding for each VM should be defined such that some host port is forwarded to port 60000 on the VM. You would assign +each VM on a given host a different host port number. That host port number will be how the instructor names different VMs on the same host. +For example, on VirtualBox, the port forwarding entry for one VM might look like: +\begin{verbatim} + Host IP Host Port Guest IP Guest Port + 0.0.0.0 60003 0.0.0.0 60000 +\end{verbatim} + +Then, if the instructor is working from the computer that hosts the VM, the following command would cause a copy +directive named {\tt one} to occur on that VM if it is +running a lab named {\tt tlab}: +\begin{verbatim} + ./remote.py -l tlab -c one -p 60003 +\end{verbatim} + +\subsection{Remote access to containers} +This section describes environments in which an instructor or red team member is to interact with containers within the lab, +e.g., to perform penetration testing. This interaction would occur via computers external to the lab exercise, e.g., networked +to a server hosting VMs. The strategy employed to achieve this depends on whether the lab utilizes GNS3, (which manages the virtual +networks without relying on Docker networking). + +\subsubsection{Remote access without GNS3} +Docker port publishing provides external network access to containers. +For example, remote ssh access to a specific container within the lab can be achieved as follows: +\begin{itemize} +\item Use the {\tt PUBLISH} directive in the start.config to bind a container port to a host VM port, e.g., +\begin{verbatim} + PUBLISH 0.0.0.0:60020:20/tcp +\end{verbatim} +\item Use port forwarding to bind the VM port to a server port. Here, the host port would differ for each VM on a server as a +means of naming the VM whose lab is to accessed. For example, on VirtualBox, a port forwarding entry might be: +\begin{verbatim} + Host IP Host Port Guest IP Guest Port + 0.0.0.0 61022 0.0.0.0 60022 +\end{verbatim} +\end{itemize} + +\noindent The above example would then allow an external computer to ssh into the selected container using port 60122, +assuming the container has SSH enabled (see the telnet-lab server container for an example). Authentication to control who can SSH +into a given container could be provided through use of SSH keys. This remotely accessed container can be hidden from the student, and provide +the instructor or red-team participant with a means to probe and attempt to compromise the other computers within the Labtainers exercise network. + +\subsubsection{Remote access with GNS3} +For labs that run in the GNS3 environment, remote network access is provided through use of the GNS3 \textit{cloud} +endpoint device, which interacts with an Ethernet network interface. In this example, access is provided from external to +the VM -- with no network access to the container from within the VM. + +The following assumes your VM has a virtual Ethernet interface named {\tt enp0s3}, with IP an address on the +{\tt 10.0.2.0/24} subnet. On your VM, find the Ethernet interface that has an assigned IP address. +Alternately you could define the VM to share a physical host network, but that is outside the scope of this example. + +Define a component within your Labtainers lab that is be remotely accessed, e.g., a workstation or router, and assign it an IP +address on the {\tt enp0s3} interface subnet, e.g., {\tt 10.0.2.100}. Within the start.config file, provide the container with +the {\tt KICK\_ME } attribute, where LAN is the name of the network intended to be connected to the cloud component. Then, +when defining the GNS3 network topology, i.e., creating and connecting links: + +\begin{itemize} +\item Select a {\tt Cloud} component from the {\tt Browse End Devices} menu, and drag it to the desktop. +(computer terminal icon). +\item Right click, select {\tt Configure} and confirm that the Ethernet interface that you selected (e.g., enp0s3) is in the list. +If it is not there, select the device from the pull-down list and click the {\tt Add} button. Then click {\tt OK}. +\item Use the network links to connect the cloud to the desired component. +\item Use port forwarding as described earlier to map host ports to ports on the VM. When defining port forwarding, enter +{\tt 0.0.0.0} as the ``Host IP'', and the container IP address, e.g., {\tt 10.0.2.100} as the ``Guest IP''. +\item You should now be able to ssh to the container from outside of the VM using the mapped port. +\end{itemize} + + +Alternately, to provide access from the VM (but not from external sources), pick virbr Ethernet interface and: + +\begin{itemize} +\item Select a {\tt Cloud} component from the {\tt Browse End Devices} menu, and drag it to the desktop. +(computer terminal icon). +\item Right click, select {\tt Configure} and delete the default Ethernet interface if any is selected. +\item Click the {\tt Show special Ethernet interfaces} checkbox in the lower left. That should add devices to the pull-down +list. +\item Select the {\tt virbr0} device from the pull-down list and click the {\tt Add} button. Then click {\tt OK}. +\item Use the network links to connect the cloud to the desired component. +\item When the lab is started, you should be able to ping the connected container from the VM. +\item Use port forwarding as described earlier to map host ports to ports on the VM. When defining port forwarding, enter the +container IP address as the ``Guest IP''. +\end{itemize} +Note that the subnet used for this remote access is defined by the VM's Ethernet device. Putting multiple lab computers +on that subnet as part of the lab network topology may be awkward and confusing to students since 192.168 addresses are +private. + +When a GNS3 Labtainer is run with the {\tt --student} option, the Cloud components are hidden, as are any Labtainer +components whose {\tt start.config} entries include {\tt HIDE YES}. Links to hidden devices are also hidden. + \section {Multi-user Labtainers} \label{multi user} Labtainer exercises can support multiple concurrent users, such as students collaborating or competing on a shared @@ -1930,11 +2666,11 @@ For example: sudo ifconfig ethx promisc \end{verbatim} -\item Start the lab on the server VM using start.py and the --server (-s) switch. This +\item Start the lab on the server VM using the labtainer command with the --server (-s) switch. This causes Labtainers to start each container in the lab that is not tagged as a ``CLIENT''. \item Students then -start the lab on their individual VMs using start.py with the --workstation switch, which will cause +start the lab on their individual VMs using the labtainer command with the --workstation switch, which will cause the student VM to only start the container identified as the ``CLIENT'' in the start.config file. \end{itemize} @@ -1958,7 +2694,7 @@ set the network interface to promisuous mode (within the Linux host as well). Labtainers workstation. Configure the network on the VM to use DHCP (the host-only DHCP server should be disabled, the VM will get an IP from a Labtainer DHCP server.) -\item Start the lab on the server VM using start.py and the --clone\_count (-n) switch, +\item Start the lab on the server VM using the labtainer command with the --clone\_count (-n) switch, specifying the quantity of per-student client containers to start. \item Students then ssh into their respective containers over the host-only network. @@ -2043,7 +2779,11 @@ PASSWD : CLONE_REPLACE : .local/bin/fixlocal.sh : CLONE_NUM : CLONE \end{itemize} \section{Limitations} \label{limitations} -The labtainers framework limits labs to the Linux execution environment. +This sections describes some limitations of Labtainers that may affect a +students perception of the computers and may limit some lab development. + +\begin{itemize} +\item The labtainers framework limits labs to the Linux execution environment. However, a lab designer could prescribe the inclusion of a separate VM, e.g., a Windows system, and that VM could be networked with the Linux VM that hosts the Docker containers as described in \ref{external hosts}. @@ -2051,32 +2791,40 @@ Future work would be necessary to include artifacts from the Windows system within the framework's automated assessment and parameterization. -The user does not see the /etc/fstab file. Only virtual file systems can be +\item The user does not see the /etc/fstab file. Only virtual file systems can be mounted (or those mounted when the container is created.) -Kernel logs do not appear in {\tt /var/log/kern.log}. For logging events +\item Kernel logs do not appear in {\tt /var/log/kern.log}. For logging events such as iptables, consider using ulogd and a ``NFLOG'' directive in place of a ``LOG'' directive. See the dmz-lab as an example. -The available Docker network drivers do not permit IP address overlap between virtual networks. +\item The available Docker network drivers do not permit IP address overlap between virtual networks. For example, you cannot define two 192.168.1.0/24 LANs. -Student use of the shell directive "source" will cause stdin/stdout to not be captured. +\item Student use of the shell directive "source" will cause stdin/stdout to not be captured. -Inquisitive students will see evidence of artifact collection. Home directories +\item Inquisitive students will see evidence of artifact collection. Home directories on containers includes a \texttt{.local} directory that includes Labtainer scripts that manage capturing and collection of artifacts, and that directory contains the stdin and stdout files generated by student actions. Additionally, when the student starts a process that will have stdin and stdout captured, the student will see extra processes within that process tree, e.g., the \texttt{tee} function that generates copies of those data streams. -All of the containers share the Linux kernel with the Linux host. Changes to + +\item All of the containers share the Linux kernel with the Linux host. Changes to kernel configuration settings, e.g., enabling ASLR, will be visible across all of the containers. +\item All processor and memory resources of the host (e.g., the Labtainers VM), are visible to the student, e.g., via +{\tt /proc/cpuinfo}. A lab designer can limit the processing available to a container using the +{\tt NUM\_CPUS} container value. And a specific set of CPUs can be allocated to a container using the +{\tt CPU\_SET} value. However, these values do not alter the content of {\tt /proc/cpuinfo}. +\end{itemize} + \section{Notes} \label{Notes} \label{Notes} \subsection{Firefox} +\subsubsection{Profile and configuration changes} The labtainer.firefox image includes a /var/tmp/home.tar which is expanded into the user home directory when parameterize.sh is run. This tar includes a profile in .mozilla that avoids firefox starting with its @@ -2084,9 +2832,20 @@ welcome pages and privacy statements. The labtainer.firefox image includes a customized /usr/bin/firefox that starts the browser in a new instance so it does not share existing browsers. The {\tt about:config} was altered to disabled insecure field warnings for the labs that do not use SSL connections to web servers. + +\subsubsection{Browser history} If you wish to assess places a browser has visited, e.g., use a pregrade.sh to extract sites from the firefox places.sqlite file, put {\tt places.sqlite} into the lab's /\_bin/noskip file. +\subsubsection{Slow browser startup} +Some html, e.g., for the softplc, want to visit fonts.googleapis.com. If no gateway/dns is available, there is a long timeout. +Try adding +\begin{verbatim} +ADD-HOST fonts.googleapis.com:127.0.0.1 +\end{verbatim} +\noindent to start.config to avoid the timeout. + +\subsubsection{Crashes in SimLab} See \ref{simlab_notes} for information on avoiding firefox crashes when it is restarted in SimLab. \subsection{Wireshark} @@ -2130,6 +2889,11 @@ ADD system/var/run/sshd /var/run/sshd RUN sudo chmod 0755 /var/run/sshd \end{verbatim} +For containers derived from the kali base, and others non-labtainer bases, use this line in your dockerfile +to enable ssh into the box. +\begin{verbatim} +RUN sed -i 's/UsePAM yes/UsePAM no/' /etc/ssh/sshd_config +\end{verbatim} \subsubsection{X11 over SSH} The scripts/designer/system/etc/ssh/sshd\_conf allows X11 tunneling over ssh, e.g., from a remote VM connected to the same host-only lan as a container running the GUI @@ -2169,6 +2933,20 @@ delete the Docker-generated route: \noindent And the fixlocal.sh also replaces the resolv.conf entry with either a local DNS component, or a gateway running the dnsmasq utility. The /etc/rc.local script generally sets the default gateway, and configures iptables. +\subsubsection{Move to network2 base} +Transitioning labs from using the network base to using the network2 base involves moving to Ubuntu20, which +does not have native ifconfig and requires installation of net-tools, which is done in the Dockerfile. However, +linux tool maintainer decided to fix the output of ifconfig. Therefore if you have {\tt ifconfig | grep} fu in your +iptables definitions or elsewhere, change {\tt inet addr:xxx} to {\tt inet.*xxx}. And use awk substr to remove +the new colon that follows network interface device names. See the routing-basics lab as an example. + +The move to network2 was motivated in part to get the latest QT GUI for wireshark to avoid black windows. +Note however that many packages will not install on Ubuntu 20. You must either install the snap package manager, +which drags a ton of extra stuff, or find an alternate package source (e.g., the .deb packages). + +\subsubsection{Ubuntu 22 base image} +The base3 and network3 base images are built using Ubuntu 22. Only minimal testing has been done and no labs as yet use these images. + \subsection{User management and sudo} The Dockerfile should make the initial user, i.e., the user named in the start.config file, a member of sudoers. Otherwise, the fixlocal.sh script will not be unable to modify the environment. If desired, that user can be @@ -2185,10 +2963,13 @@ host names. The script at {\tt setup\_scripts/dns-add.sh} will update those def DNS used by the host. \subsection{Suggestions for Developers} +\label{suggestions} +\subsubsection{Testing assessment directives} The result and goals configuration files can be revised and tested within a -running instructor container. This saves time because you do not need to rebuild +running grader container by starting grader with the {\tt -d} option. This saves time because you do not need to rebuild the container for each iteration of the development of configuration files. However, -be sure to scp the configuration files from the container to your host Linux system. +be sure to scp the configuration files from the container to your host Linux system. The files are in +{\tt .local/instr\_config}. See the {tt /tmp} directory for logs. Most result and goal assessment can occur once you have generated a suitable sample of expected student artifacts. In other words, adding new goal does not typically require @@ -2200,9 +2981,26 @@ that you go back and re-perform student actions. Exceptions to this are: file will not be collected unless that log file has been named in the results.config file. \end{enumerate} +\subsubsection{3rd party applications} +Some applications that you may wish to include in your lab may already have Docker container +instances. Bringing those into Labtainers can sometimes be challenging because such containers +often lack execution environment elements required by Labtainers for configuration steps, e.g., +{sudo}. Most such applications are traditional Docker images whose purpose is to package an +application. In contrast, Labtainer Docker containers are intended to look like computers running +applications -- not as applications packaged as containers. Is is therefore often easier, (and less +disruptive to what students see), to include the 3rd party installation procedures, (e.g., what they publish +to allow you to install their application on a Linux system), within your lab's Labtainer Docker file. + +\subsubsection{Msc} Use {\tt TERMINAL\_GROUPS} in the start.config file to organize terminals if you have more than a few. Otherwise the student will spend time trying to find each terminal. +\subsubsection {Docker cache} +By default, a {\tt rebuild} will make use of the Docker cache to speed up the image building process. +Use the {\tt -N} option to supress use of the cache. This may be needed if you expect the results of +a {\tt RUN} command within a Dockerfile to change between builds. When using the {\tt publish.py} command, +the cache is disabled by default. + \subsection {Container isolation} Docker provides namespace isolation between different containers, and between the containers and the host platform. Note however, that all @@ -2218,12 +3016,33 @@ scripts so that they happen on each boot. Note also, that the Docker group (in which containers execute) is root equivalent, and thus a hostile container can do damage to the Linux host. -\subsection {Student self assessment} -The {\tt checkwork} command allows students to assess their own work against -the criteria used by instructors for automated assessment of lab performance. -This can be disabled on deployment-wide basis using the {\tt CHECKWORK no} directive -in the {\tt config/labtainers.config} file. Of course this assumes you have separately -provided access control over that file, e.g., through use of a custom VM appliance. +\subsubsection{Kernel logging} +Since kernels are shared, system logs of a container may reflect kernel events occuring +elsewhere, e.g., the host VM. See the ossec lab web server component for an example +of the rsyslog.conf file that filters out aparmor logs entries. + +\subsection {Test registry setup} +The test registry is a Docker container that runs on the host, i.e., native OS +upon which the VMs run. The same test registry is shared by multiple development VMs. +The test registry is created via {\tt host\_scripts/registry/start\_reg.sh}. It listens +to port 5000 on the localhost. + +A VM is configured to use the test registry via {\tt setup\_scripts/./prep-testregistry.sh} + +The test registry is populated using publish.py -t + +\subsection {CentOS containers} +CentOS base containers do not run 32-bit binaries. Add the following to your dockerfile to do that: +\begin{verbatim} +RUN yum install -y compat-libstdc++-296.i686 compat-libstdc++-33.i686 +\end{verbatim} + +\subsection{Side effects of stdin/stdout mirroring} +Labtainers uses a ptty within the mytty2.cpp program, which manages stdin and stdout for any monitored program the +student starts. In order to know when all children are done with the pty, we reap (reparent) all the chidren of the monitored +program. In a normal system, if the command program forks and then exits, its child would be reparented to the init process. +In Labtainers, the reparenting is to a reaper process. While commands or their children are running, +a process list will reveal extra processes named {\tt capinout} that the student would not see on a typical Linux system. \newpage \appendix @@ -2236,7 +3055,9 @@ sequence of directives stored in a file at this location: \begin{verbatim} labtainer/simlab//simthis.txt \end{verbatim} -Note that simlab files are not in the svn trunk or in the github repository. These +The {\tt simlab} directory is at the same level as {\tt \$LABTAINER\_DIR}, i.e. at {\tt \$LABTAINER\_DIR/../simlab}. +Note that simlab files are not in the github repository. These +files essentially contain lab solutions, and thus should not be openly published. files essentially contain lab solutions, and thus should not be openly published. \footnote{If you require simlab files for existing labs, contact me and try to convince me you actually need them (mfthomps@nps.edu).} @@ -2255,7 +3076,6 @@ described below in \ref{smoketest} \item Ensure your system's \$PATH includes \$LABTAINERS\_DIR/testsets/bin - \item Ensure the saved email used for each lab is 'frank@beans.com'. You can do this by modifying {\tt \url{~}/.local/share/labtainers/email.txt} with only 'frank@beans.com' at the top. \end{itemize} \subsection {Running SimLab} @@ -2279,11 +3099,13 @@ The SimLab directives are as follows: \begin{itemize} \item \textbf{window} $<$text$>$ -- Selects the window having a title that contains. Note that tabs within windows are selected by first selecting the window, and then use {\tt key "ctrl+Next"} -to tab over to the desired terminal tab. +or {\tt ctrl+Prior} to tab over to the desired terminal tab. the given text. Will timeout and fail after 20 seconds. \item \textbf{window\_wait} $<$text$>$ -- Like window, but no timeout. Intended for use when the xterm title is changed by a program. -\item \textbf{type\_line} $<$text$>$ -- Types the given text. +\item \textbf{type\_line} $<$text$>$ -- Types the given text followed by a newline. +\item \textbf{type\_lit} $<$text$>$ -- Types a sequence of keys, replacing grave, minus and space with X11 keysims. +Followed by a newline. \item \textbf{key} $<$keysym$>$ -- Performs a keypress for the given X11 keysim, see \url{http://xahlee.info/linux/linux\_show\_keycode\_keysym.html} and \url{https://www.in-ulm.de/~mascheck/X11/keysyms.txt} @@ -2293,6 +3115,7 @@ use when the xterm title is changed by a program. Intended for use to wait for a command to complete. This runs on the Linux host, so do not be vauge, or it may never return. Note: If the command was added to the keyboard buffer, then wait\_proc may not catch a command. +\item \textbf{type\_command} $<$text$>$ -- Types the given text and uses wait\_proc to wait for the command to finish. \item \textbf{wait\_net} $<$container$>$:$<$text$>$ -- Delays until network connections to a given remote host have terminated. The given $<$text$>$ is searched for as a substring within the host name ouput from a {\tt netstat} command run on the given container. @@ -2305,9 +3128,10 @@ A {\tt wait\_proc} function is then automatically performed on the line. a keypress. The lines should contain X11 keysims. Blank lines cause a 2 second sleep. \item \textbf{replace\_file} $<$source file$>$ $<$container$>$:$<$dest file$>$ -- Copies content of a source file on the Linux host relative the simlab directory, to a destination path on the named selected container. -\item \textbf{add\_file} $<$source file$>$ $<$dest file$>$ -- Will append text from the source file to the +\item \textbf{add\_file} $<$source file$>$ $<$dest file$>$ [search] -- Will append text from the source file to the end of the destination file. The destination file will be accessed from the currently selected virtual -terminal. This uses a simple VI scheme to append text, and thus assumes the window and cwd are as needed. +terminal. This uses a simple VI scheme to append text, and thus assumes the window and cwd are as needed. The optional +search string will be issued to VI followed by an "O" for inserting above the target line. \item \textbf{include} $<$file$>$ Reads the named file and treats each line as a SimLab directive, and then continues processing the next directive in the source file. This is similar to the C include directive. @@ -2321,8 +3145,47 @@ Most GUI's have shortcut keys that can be used to automate their inclusion in a Firefox is brittle when it restarts. See the {\tt fixfirefox.txt} SimLab script for the snort lab for an example of avoiding errors when Firefox restarts. +\subsection{Common x11 keys} +Here's the common ones: -\subsection{Regression testing with smoketest.py} \label{smoketest} +\begin{verbatim} + Home → Home + End → End + PageUp → Prior + PageDown → Next + ↑ arrow → Up + ↓ arrow → Down + → arrow → Right + ↠arrow → Left + Return → Return + Space → space + Tab → Tab + Backspace ⌫ → Backspace + Delete ⌦ → Delete + Escape → Escape + F1 → F1 + F2 → F2 + F3 → F3 + ▤ Menu → Menu + PrintScreen → Print + ScrollLock → Scroll_Lock + Pause → Pause/Break + + NumLock → Num_Lock + keypad + → KP_Add + keypad - → KP_Subtract + keypad * → KP_Multiply + keypad / → KP_Divide + keypad enter → KP_Enter + keypad . → KP_Decimal + keypad 0 → KP_0 + keypad 1 → KP_1 + keypad 2 → KP_2 +\end{verbatim} + + +\subsection{Regression testing with smoketest.py} +\label{smoketest} The {\tt smoketest.py} utility automates regression testing of labs. It will automatically: \begin{itemize} \item Start a lab @@ -2334,7 +3197,13 @@ The {\tt smoketest.py} utility automates regression testing of labs. It will au labtainer/simlab//expected/ \end{verbatim} \end{itemize} +\noindent Populate the expected results with the results from the labtainer\_xfer directory after you've +manually determine the results you desire. If {\tt smoketest.py} is started with no parameters, it will iterate through each lab in the labs directory. The that lab lacks {\tt simthis.txt} file, then the lab is simply started and stopped (hence the tool's name). The tool will stop upon encountering the first error. +If a lab's simlab includes an expected directory it will compare the results and report on whether they match. +If no expected results are found, no status is displayed (unless an error is encountered.) + +If you are using smoketest to check against archived expected results from NPS, make sure the saved email used for each lab is 'frank@beans.com'. You can do this by modifying {\tt \url{~}/.local/share/labtainers/email.txt} with only 'frank@beans.com' at the top. \end{document} diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/docs/labdesigner/labtainer5-sm.png b/modules/utilities/unix/labtainers/files/Labtainers-master/docs/labdesigner/labtainer5-sm.png new file mode 100755 index 0000000000000000000000000000000000000000..88708474179309733731a9deebb6537480823cdf GIT binary patch literal 67186 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%0D#HxscAeEczWMZwA?DZ>Vlch@b*32`X3^>{8- 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 + +Apache web server and related software is under the Apache License per + + +The Firefox browser and related software are licensed per the Mozilla Public +License at + +A number of the labs are derived from SEED labs developed by Syracuse University +. These are identified within their corresponding +lab manuals, along with constraints on distribution. These labs include: +bufoverflow, capabilities, formatstring, local-dns, onewayhash, +retlibc, setuid-env, sql-inject, tcpip, webtrack, xforge and xsite. + +For other software packages included within Labtainer Docker containers, please +refer to their corresponding licenses. + +### Labtainers Licensing and Distribution +This software was created by United States Government employees at +The Center for Cybersecurity and Cyber Operations (C3O) +at the Naval Postgraduate School (NPS). Please note that within the +United States, copyright protection is not available for any works +created by United States Government employees, pursuant to Title 17 +United States Code Section 105. This software is in the public +domain and is not subject to copyright. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/docs/student/Makefile b/modules/utilities/unix/labtainers/files/Labtainers-master/docs/student/Makefile index cd52460d3..12bfd37f6 100644 --- a/modules/utilities/unix/labtainers/files/Labtainers-master/docs/student/Makefile +++ b/modules/utilities/unix/labtainers/files/Labtainers-master/docs/student/Makefile @@ -1,10 +1,8 @@ -all: InstallingVB-LinuxWin.pdf labtainer-student.pdf +all: labtainer-student.pdf -InstallingVB-LinuxWin.pdf: InstallingVB-LinuxWin.docx - soffice --convert-to pdf InstallingVB-LinuxWin.docx --headless labtainer-student.pdf: InstallingVB-LinuxWin.pdf labtainer-student.tex - latex labtainer-student + pdflatex labtainer-student pdflatex labtainer-student clean: rm -fr auto diff --git a/modules/utilities/unix/labtainers/files/Labtainers-master/docs/student/labtainer-student.pdf b/modules/utilities/unix/labtainers/files/Labtainers-master/docs/student/labtainer-student.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5c7f730ace69578aa420a31cfdd51e2098bfd623 GIT binary patch literal 162123 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

SJI>lI* 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≈#Vy2R$A_gW zKk_NLF7KH>bwK4n=#UD6h>Mk>YazAgkzZ*23tsMm(S&g!T0q%h4>)pmU?Qn5%CVwAj@L*}p6B&rl?RY79y>1cj8~_`ca~7R#!*$pf zi$BYN;@v!pHI<)iq;6&C9l5kXvHLV7W8n8$P@-eSIT?BWvgTNrLGx4I<(Yf#5)!yo z-~bPWXn&GHzyl-_%Sz&qNuRL)orrP-yvjibh;1wn>nkvy%Urz| zp}b?eNoFU11${jgs-wV#nyF&*($4+^fe|URqEg)?f7GQUMQOE^*!})c8^1<3I?k{; zE^Ztt*LPZN<7zdJw6r+!eU|Z5$*n(VU^9sOwg)kkdERpRD*ELHoD-I^2!J?CYfu}znN)C4-6Cs2KUde) zAzU=}wFCrlEz>jKv`mAvCJk1C#c+{>S9YtwrzSt%;CF5|>1YS3%O} znA+vVF<%zS3|Y#UHy-Yq|ICxP57X-`lE)iN5N*FPH?C;7=TU86IdnNDE*0Z)!HAvN zq3g*^Y{dd1OjWU)1N-a#4a_9Jyj^=pSl_p5gk7Cd$EF2jPiU)F3vh z35Zn{qMgbTa}rAsTVtcVZfePaC73qyp=Xr8(q^`3D|g$z3>JKgwz6&PsroBzit&95 zt`^5AXcEC2@o;gup|wm}a#;kl+-^CDx=eOnw(Fzkr?WKnxvGoatU5H&3Io0P(xd;; zUoaOsxmB<||H)jEptISCPQP7TL@6N9kE_6WQG_pFLMmGiWIpWiX5)d3vOIib7I3Kz zf+to&C3iq9vvTKC%VQsYY-(Sm8cav$!6q(0J{h7$Wtgh1>4Ft)(yT!6*T{N7nTgjN z95G(HyUNQ~L^t4m0W+_$ugcjaO2L-vh|N#=qsxs&Ni$6AaP_EtYIshr@wc;rAl}|C z$pppo=|e4@;>*o9c7JeNtP(LmG*6gBa9H@BP_vB2vMoC+1I=dBlwWOs{!-Bg#=Adc zIHZ~;{qx-~ByJya#cFnT@;+5SFjpR~F(GqmgMCNNCnKk^?jt!3`(F`UWIGi4cdc2f ztkHk8mN1%gCvx_!whJABe;-aTDzzk$jQ*M{f88JVT^2#QsAsx=s@>pWOmD|9@!ka)o7ZOP zjt{O=a&GWV#l815tlGrNraANzLP zAlQ3eXQ-<2=~0TmSbH&=izxaRgy+;mZM|*v@Ys6_Akt5)^8TEc-D6&~o zA*GAzG3H8wmzpRGzJ2+Z8#4|B5&NOd>1K(!>a9!p+FOn&JDs$ISTuRTUQXHt-hy~w zPRTMwn|IE`DdO{(X69aLzt`Bqb9g!XRU-YN@23YuW;e2$!@e2~!}&U&uvn;qt%sR{ zE!@W6C}0F);p%YZ%5)| zr#M8gR9gx2E3-QvPj;jfTFzQyN^b zmm5w&EKYOZ?G>JmV6nxf z68<_P-j%CUZLoQ@;X(ic-Pq~o z4q>#9<4k4Ikz5Jw{`zG_pANghbCY(&UC+drR5BS817iI#f2<&zj+=FP`i@@$&(9sV zNZw?aTn@54HmV^toSk9JcGD1L9$q^OR;Df{)>H&1u>tI@s9}Jz1%q;uFaa9;16Scn743TG^we4h>BA!H0eqS0rNv5gBg|Mj63>MlmG$=X z`Du-8I9_O!{{C_*{4K(`oJxBIaOX(4xVm5{M_hN+`A9SK z@@;c{PR5wDMo6u-JKVNwi#6OSCY%}8nqz%C9Xy?{_bU7-%(vlS%#q)WW{cqw>cTK% zATm3f>Tu|puDF_G#OE0leW~iz)$+_u%zl`tAP{Wg0rK zOY;<^O8r&3DSH0-HQaYRJm*%SY}CZm9ig0lKdYGl$sppb$(?B`+rgwM+t=JyDlj*M ze#!}`a-ZWlvD|5z4F(q1Y|qDroQNI2Ck?QNPI<#rCO_QeE5gu~8~0!BH9;?omynk# zxVek9g!|+*hw*A$61eveWW*r)Q;8GU%t2q>3L#pDgxKxB%FV&)raR-J!m{j!$jL)` zD)GCfyF;3yAdB>`g%x6slooLqHw@*?`A%20N$9#Xc7evcRR&;4xJ~7(Xj~LyY1CX< zWk2x{WnKNP6MI9F^Zet~-E2Q9laG#gpLYL-T^~@kR^v|tUy64Wq1ppI#A1k8Igs|l zY$2Mkny7$pQzz(8fn+<3`S9)(LN?phlvz<{VX{?`D7F+bl6%1_5rrtbM0C33Uca^N zz*P9Nmledr_K^ro0?{AeXOd&q-Z>WDPzE{l#bqd_5@N>3iJnJCz}8;}LqvJBLHh>Gz>iB3Bw-&Wz1b`u#dP=tSjaUZwqIX8)>>qGkLo(*yA~=CWy{`<|BHyR#jU3 zo;BkRQo6!Bi7AUk54+T3;EcPUvFhXi8}6W(%~p2O1OF>Kj_< zn*gZ*^7b}HPKH2xN?Rl2Z!$VYdKLzHMh+@~6wuAZ#@@(*k_zU(b~3ZE7S?wJ5>g6t zF)=VPFfcQ)FmST4v#`-Ia8NKXP<+$L*cko4NR;jMZEb-@gaA=}O9vnfKweoyonF+* z($YZR+8St2NU3aU=0Ny;{g*tngsMP$hi}$|%=C;bjI5kYY^-!l^lblI&TsnfXOlK_ z1`;wcFtP)Lfd*#!)>MQRw)&2y4nTcE=l`{wjh=~~nF@xF?>`E)F))W=WclwE7L>mg zLkN&FFjsQ4f&s`9vNFQ}M9u6S90^%iS^sy91wtk^HunD+>reQfSxd)nc>$u9-%1e% z8rm2E|FgS;EBekNt$E^G^P5uJ zPFf;7z+_ZwnLXC*1eb})su63u2|=(o3@9pv`Y^7}@`r?Z6KsdHUQn2jrJfq52(4aM zG6+Wi5ij(dt+h3* z?-uNYESwm$UX50Anu<3ArHASH+-ccABy%X%)Mf+!xo{mnBYJp7QsxZVRLn8wVPLPa zWIy({!6p_t?=Xk)kcowBd-{5L(?kX*Ju7W7FLTM0L+u(oq4W`3qx6w5HU?#KxX-`5 zYSx_R!VAk&b@K|MsBv?ScBV1ujYoo*fH!ieoL42%Ebtl$q~iDNHg(QVO7PmF9-2Vh zUcyJr@_3K9nCQd?u&;c_1@A`DxlEjIwm%M<3W>Rd3OG)uJIw5hEYCiv<}Py z*U*q&54CQEn~)ibH8U-lz~3~fU@^{80M|6=%tJb&QY9c+tV5*`7kZHeNbcl{LQt;! z!>i@$lOiC2lTXU!@PJj3fjL4VH-M7oBk6jF7BBFRstF$kf&bB^kxA4gj>)AGYv!2C zOVbdaA1h`A->Iv@Me&-T9(s2-xG-5N7OA4qR4ix@Z?npd{=pD*oD}|uEErlPI*vT= z(|Sav>Ub=5-Kz>q0D%_@>bWC=1=Y)%AG|qcx^_)=o||dTA^1C-aaW_rY4*Ybx?xd~ z?mIbzq+wzEhCkb&5!dIWx`)5qL32NtoS|kfrOv#JwVM#Y?a0TOi!6$q{x}&)Mu3j& zvX2{2mM|`%>Va%Tvbj$cq_*0T1cOHrYDwA>F4L!7nOlhUghP{>UsT&FdQor**)(c8 zUbsK;@l@!y3(CeNnF~th5G@j6Z3H~jA+IRVz~-JQu1ne7R+`2Y3frBjV-?{NK%OD= zTjh66pdWWQZ$%YHqaZ#QRThiS6+SY2I^Ak@L!6_CP=YHRgsyU({7M0%A8<{hcA92% z^o%F%;NPs|tR*u7Va^T%Rg1b+&p~T0q2@TbgO??p{1O@O94R zs)iv@z`VHt)>}f8!ysSk&;nAhT-HJLa|V<6*Te5V{5x_l%%2(EyAn(C*U{={?&JO*FzepdJ*!H)a=!K+d3rO`!0>(X9l(A@er@x=WDi=l z#b0w`3n9PwcT6#d81}~=Fxj$-_STd!}p^g z8*H?g*AYyO?0<=og&aKK>NynmW_DTdJV z)^GhK!CJXe7pM^z<-#o~@t!?hn64v&XR%K+GWF!S8&{6ABjC-R0Z&I~hIjU#u-$Hj z^wK>x4IA&xjo+)0&wrl@)($T=TonXwy>(CzJi+l7z%@SFQYOR4?ifcF<4I-fg^LEd z@d{&BY2>3ALq0{Gv#R=Tfi>po;I234&-)`6K{#PhlISN+La5^% zg7~V(xl|>4e<bC(?}618(c!>Y!I7Wd5;R1usun?ecrt3RT-MP)v?1 z3M=pvX!bgoxLkB-R^k2o_IW=SUJpK=#uEbt*B}hTZT0r#yP`dHXa1R|G_|FQ##?=K z)E~}|Oi7nxCG*vW8CC07?C!-&6C}^|CLbMMcfQ-1YwqF^sWM!fqK#gEYrsXrwxHcy zbOYtO?5&MR5|g~ zmXqaFg2H>YOk%tUG}f`U>0ENTuRJSUK3HAecwF=VbapwdHCuBp0>>-fE-Ih4_`L4C zsa(_3n^T?cVE;XBqI#W4nH>p2x-X+=)Sjdzx6&GL zWKP!$B52l=ixvvmPLc6+tP|;1j*;#Bt4z7e?qO8&CfsJm+=v{S2g=rwttMeRHMv&M z%j>ioH0awj@VONNCZScMlqo2=)ZEpaWCqBe^7YJeZe{5`FwzI2jZp?N8>*-1TQ#|L z-Kg2!SJxvc*;8O&ctdHbBrL5Z)Ey+^Opg`5TAj2dYHed!6vZjPP&vDdm}7HN{yw?8Bp3KL9ndaq<%y-ZIJa0hg>56HgZSs z!zumy4{touB*P*Tye8uE6rw{KgCKzR!xuRT{V4J%AXck3O8>RcDf+#1N9&+&OJi5p znR^S8W~izLG$d`jJj!t2UcEWg8$f2Tbtu_7G*<>@Hv*EnO86Shd%{cx{@I)b|I#%B z>gYk}^F?4<>c)-P_q2BMK*%a;rKiHqyMjmYyU<3LWohu{zHYlaQDj0oygKM;u*LH^ zCY#oJYzj0)$@}>@wjvbpC%e0ghWu@x#vqq4N@niB|1@C$YJ^&hgv^AD--C)aHjdwe--lcY75}rs*yg+UAIR~a zo-m;n4=1Mx8>a{>8#{xrFq;Smg9rmF6B`4oAOow&cO_&&c0R)YH_102X`r>qHzZ+U zX8JFa`v1eG#+z+bOb|c~+HufK(#QG z4+Tx>XF%zzC@zRqkb_I@qXK#sNL>;nmXmn5(I;p1nX+-;>~89VZW_pD8cZ<_u`vz# zaSbP`4>zO_bC`obtVez^guUN{pgw>;RCv5 zWa{LnF*Mh4C1Y+7<-$74*cB*Fq18L^3VQeGn@HTHoBcl(lIx+hggg7#&JiD&+H1t- zEiQzTN-*Aka1vwSAZ(M=hMpoug}CR-U8k0yKMMjczq}oAVxuDO&6Kkb1^A}(YNxFp zl)I%`GEG#_T0hzpRnB!CD$54E81u{KKdwbpWwYI{)<#BRzGSJPm(*^%b7)-QC@Ty9Sr#_us9p{kC1z zRbBnzy{;?go^$VOYE?;TCN^d+Wa_E8{v~7{a#nH&V{2qVL1Y$1GkXhHOLBHjUh@Ba zA+tzZ*}9rJle0+M8o8QDnwdD5njs4dBfGddn;F?5d#>oKj#~GMqPATC51YcIb*$Q3 z@3;z)=-aV<0YVS+#*U}%c6itK`XbPIhq(lD95CN5;gBc9?Ox*|UL%O(BxtZC?g+jI zW%B+hlg7d_#c3N|Y{S1P2ESsQ)p1H)o!s~y%`;WF#WL`EaZO2s6(hN+`U&gZ z?@L3>^dIQ&Yky~%`lkmbSNyiXyUIjD&QTTZvYk4H{f(dHtZL97D>^8jw)Yo`8Qg{2 z6VZ--p9<)%#&gJ<>jb_-%{b{CA)DEo{vQ*3JpE@r&i}`Z8eWcO|M!u zky#`hY#p4{9gR#r){``Iw=yyNCL{i_qLPt|4LKXf$DZH*uh+QQc=_1>$8G@_H$T-}qkACP8M3lffITU@kXfaC9iP`LZ!ZpYhI z&qN!eLel*}_X2JM&aeGfWR=i;DF*H)o~L!r}DwJ zlF&)MgvCZs4obH3<;M^QSvu&fXIMB^?Z;A;$SY5K%4cfDTaMKb;%p);Fq zN*Sn^=mw!GvI;y^)=J-jyPjGQoFTIKqjCZ8y%n7o8a%!bDr&v2Gg3(N*Gt=q0AYGx z-j6tuog;PL&L|v8ySUsiHLhK^U-(_|4R3Q$p$x5xbe#(T{*}-5edfQaPjVa-mWog){?Xya&}Dv-n2r9>RbM zMJie5oqEd4hxC3=vpK>lxPDhst~)C>Rj)4xBJUz)P_g1X!Z&G?Ag{gTs*WdyQ^%We z9t)K#TE0s(sHVMEAq#B(%!$OR%d?&4%|d>3#9+ReA$xaA79LO4wR_~@oRYMqZ`0S0 zdhXaqv=?ht{;?zs9AjH&PB9{4jx23jc7wl7DsZ>3OMGxc?2wwsOtQWICS6z52mlEu z65;Mu$6_<*U;h0*?huq<-b|C2C7~I<|10I(I(y_)N_1xJ65PN3+vW5!=iPZw#lFda z!ORO~95)x9n1YJe#XHTV3L; zj~0*1Sz^72*Tc|f>xUj9gH1U{|NFdhzy+ULe%8w%n_IQ{uT$+UPL@kOJnd}WR=x>) zrR)TEktE7;Zl#2bM2q^w*3#@o>q>_?u5)9zU0HE~;o?TN{Pqy%grC4mq^6m{$rF(yY-hCI=z_7-VAr$gvbHJdA-?9292TRMt zwt#3;>%z_uZ-&&-T3O+>ADz1dX&!*-Yv1S{67K^o=TVM%NN`XG@+|6b1|z59;tEz~ zgJ}_0hoPYNa*lI0FHP$sTK6O=|C^)14xEUuJFxO5mBod*>3G`XN{MUVw9+r|SSfBD zsRj_yIN7OX63{#o)JS{yCYk2NtRmngi7ou~q^h3QhA6TBsk+_t_1qa#2Xf=qAixi; zq~ARuYf)Ol#JOZr%V1~j^zL}l^?kN07cgUSkMK(dY#rdX**T-KVao3J4{R8U>=|Qt z*@ME;_K`eQEyv|!0s-&On*~I%!cTNVZGR&HU8Kav0K>ocEUl z#sqZEtr9nVkbEYs$AGTDg9ZmGbd_5sF_DwuTa(|Y+6@JHvmoqeG~sT*2-yBAU>epIzL zm(>r?|FvXAw8gdZ@Q`p_A|~OEMkOR7t}&*m3JIxu3N0F9yif^v!us*}wAkq%V|Y`W z^LjcN@OBf$+(PF!8O^hS*hs6A{c_jX`5MaNyUkGsWyN%c;my%R){!A~Ery^_DX~&s z93#Ydz`frkx4y|2o5H|WKC?9EI60c`7^aV;l2VY(k~$|`MEUpUQZ0=9oM6kRkU81r|GYLwTS~M>~id7(|KlBKMx(M{hsd}e0PWr;6I7mH*JU20qPc8 zP9Uwh7xH?#0-}UJ+nHv*nsIe>3X^^c*U>mR5LiweF<@F-7pxi7a=)B4mVm?ZMB zO_`=Kn{sB@);@XFf{sZf_>Eb$!M^2)<~K|a{Mef)O8MXGQI^i#1cfbyCOA@&x2sqV z1(ELp4#2z0xgUe(-M+bM6l`aOjc@LF_rnPTvm;kLC!p5hjdjUqsG2jxVb5Q5n}+>- z+Pxwnse9j|W$5;wW6S(+F>g3J{SQ`{3ad7}UY=EqJ6@hCMf^xTj)bH{d{-!b=`Vl>6deO6$LY*%j>%ce1+qd=#Je26x zpGw#&LA$yiRbT%y5l=Ya29VQXb`sjT@wB|^?zbK5)9F8%2PPA^NwiS#e}z9E@ZgP2 zZMnt~V)QHMvsBZwqlsPJnAx?z_ZE0%+7{I_{L@}Cj^*h2szscojC<{7E)^_g?Vzzj zh(nqKDHt`e6fJ-Jj}cs7JG*k<-_EM^3aLIwOG|H!N>V^QTFuXj%J zbUrFs?l;=4-hBkgrti&o!0UAM z|2x^iWf3Sg1kt4SW1wgsdv~Y-YB@_Q%n^%v^Xq=^J~PO&WDc;Iinpqp zxiAnj?+vSmqmwP~IJm%&4lyk1d*}xQh~P$rLL+=&+uLP$Rr{STBd$b=+u=3+8hR+^ ztJKuUZ-a**tF2&k;h%T!4($8!GX`#j7KZ|#Q9kCY-0y|X#ZkD-$rZ+8d&?-QvG zJ||$0)0V$)1)W}%&OT|DWXfK@$!UHrY0zgd9LyA<#%F3)?SXH_i!zHarZvPPmE~zU zj#NndcV}U<%`=MB4jjSft?%a!Ah)8XY!(Mr1DA2Gw5ZIYqN21DRhBjka&+$#3`xh)TY2Y{>j0f_&NbdAIMnFGrJB8?{ zZnR#k#_k&2D85Y^^xHCFkx-Q1EtcPJCHpu=zPgPNr?-I0_w`(nOAHRIrkY%>TS4Z# zqppH717@>ZyI}8F$>LO)0}oDCMJb5>esHE*P3bq{=)-Tomtevf=@c&gb=yVw!VU z;D1+}BeoD^3Rn9{6&XR$aZ6NddS#jo-}kg|_YI^|_EoEbXms1N0XIIXX^4Wm)4=I` z5VtzjW9V!7g=hHfkl6m2LxTUK?W4YrC-C*Guf5d@*5dl^zHZY8{yojG{Zd54|3Q6G z@Zn6P!*}+E*50fAq2qO_lZ;&0FU%*Yl)rx}8Bq}-qI{hfZfYfZ_MGw^$la z@T?~*7Vxq|mPfwfGAV>EbUP)5rw=Rmoy;;N_c>@LG(8ae*i7k7`dwK%aWe3j`ek#0Z-2#F^dQ`dyi$dvNTeL25` zhv|UC>^p|{&z9B`X1qjCn1^eCyKcPpY=za;9PHf*vx(fq%dr*jzuO}=A4UQoqCh5!_@O+Ba190=&hNSB z5wzJ4;|~5VM@6Z{hRyp|o;u=0(Swsi27R0ke3UCOwVk20FDI&ApY@e+$V=rTe%*V; zNfhB6oxN&zTe08w@5}}4v%aT|^3z57JD{9}vwW*+x>&OCzd9`mczUq#f4lAXIB$0X zoR5Dq_yRN>;rVN-B~?IXiKL`d^b$r9CVzHW?-8C!YGJ{Pe|&UX$NdOB{uYx`jN7AJ_kv z86inA_CW5p?sL(8DAf7T&+=UwNk-HnCihD@ZITG*b9bu8hS$MIjD(-tR%_?V7st|I zM%1LR4=NNLmyE7IhgSFY#6RCHyqWk+5aHzSxS~Dj6RJFYjd{HAvzT3V*dm_P@BqCE zp2<|zRJC0!;n{n?&Aj_vWdwK~3{EC5L@1dND+x>J_e|H+a~JSTkse(Tkdj0xsfE*b@qV-R|y=kEpI*n%g}c+gj4TpK=7gJL+BhXs@4zouAmTLu>eV=Mhe+ zei>akt-(J>FmMd%tX{ zs-ktK5MJ(Vg?D`DC>_}&HcrCORp_#d4bUUE)+yJ(%Sqi;cuW}?i@h&A(Mm8*z%5?i zxi6Ym{N8ip+YzgP#tEvP>;W=-&C2^^_kU&^jfmp$7MAKT$swXyl z)FB0rH7A6+Z&hvABM|*o_lpfQqN(h4*IA{wHBoF=<4>5*B;I>4s%;;7p(b-7rsP`l z8MgX$W_L6sJKW`g8AD{FT&DEo2MQ>c`bH<>3O`0Zr{qV+jm({Uo zt!8PR&`R##Zsg;p(|;pyVg;{;l7S#3Ce{5(u8eUnFE8woV;fbd-hUq%o1J}gHQ0?q z1sVMYbD7IR37x0s(9YGqdUv+E9WD+H8?Gajw!?|01K{mPC*DWTnx}QCM`>Mt?euzT z@9a>2@{Tsa(@K$%EEe>MA$zA2*;^(yZGJ2BGt-N7#UF*ubIKRx^3+)JSwC5G5R!UX zz|xE*HkYe7{~n-HuxV45L6n}Uq2nhUnkg*qB=sfxr-?k=q2TBCo9j`$s>tE-VW~|l zsAwK<6%P*{Q+ztTsm2luyHB6&hfUdCPY*mBrZS+YhGeIB#fl`VQUaa5deL}nmuskn zQbSgGHho?AI5xcw-c!Y&o}Pq9dQ~C?Mwud@d)EL`kq90suiN$N4)ZN{>clda;=6tE zIAl*l)&-R9uago@gDRt=Xnt*?6$9MfJFN+$q`m%UZ*45EdqdP7WF3dG7oSpM_o|$h zi&8;O{d@nBnp~{T+k_~Q8X z7Z;WH0N;4Uir6(DL51;Q@%6d(R-0`8?h)YK1?{mi(8MTQ z{5m{M=Kl7!t8(Ofz}fnJWc3)b;HzW(p{Uzyw>7=mbR9y0|96(hHxC<9&(_;+JE_=n zx^*91L$yKX{#q?~A3p2F*qWjruba!MF7Lf6Yfkqt9&3IgYa7p7Chy+o$-#ptfQXkG zU1gnhekd7UHH{mC^X2dy&pVd;H|ua)%pj@w$XqxpdD;RuoR zsmLvc9h8I~{XsXt9%+3@%`5H2RNEEyse$pB zOeMxY645rJt2{iws2=zU#z)gsOv*Z7H(R5SXM*T3dkZ;R`b!u?(#Svf*ZnHj1B`!a zmU}btC#mw9+YF;r5U0RX`SUWHrNCJc_ar$NC0uZi09g2?$Js$eMTZ(*nc(tAlGHZ9 zN|2Ax6p|lPK;@``;bu#%XI^--=h{Kx7G+Pz&b@#xZH}0P+L1u7${tDt4X;|jq>%1)wJWrbtdm8rn9jVF{zO~GpV!9iPfI(NkJ!If0twDL?EY0%m91prG!y8L19fiXunkIb^|WqIYrpWjw6F3v^# z%m1`BrK<*g-QQ2{@Y(7MR4+nMP9f%1tFgP^R)@nWiDF32NB*mL^&H)na7;-%K`Nl$ zb}?1$7ar??{fwT&tFK+X?G&j+e5t7RNTj#P$jsdHy&Mb%Gq7=mYSxD)*I(``uomK| zNrXM$lL|ZSx_ZGy1e7*FlD>BJ|HAEbbX2!_u$K#svF$7dNi%^U|(M1LQ?5%|LFSe zBMpA?f@Z`Vgkj78K=6&ORo zE{gG}i`dNd{Q|$fUMAHTJK{6d=}9OhFMOk;xs8rf_^M+3@hvDQHy`H5*>g(XL565j(yksH=CT zC|nu)e5E~g@*uBNS6BC~s)EY*v~Rb+j`|Av@IJa+u}3w$!Qi7ih8`L3m>(;! zEq2x;Zd)KTyu#(2$)e+(a`nvJwb!^h3Aj@}Bz~C4rcn(kBMSXG*IH&wDFtgpj#TFc z;wpt;oa!* zk}l8_r_hyLxrIh?d|g{Guf0+TH%duKso#7b`c?hXmr#Iq0iK)+#dS(`eu_#)CG|Yu z;?tbp?fv>osc>5LO_#s#vElM(=T)Bsf~kLVI_v7RRI$WZovIbjGLYRkx|Z<2%X-?u z=K)kzhr!3r%^=Ms-O{kB;og_^tur{m%Zseax|t$#d3n6}lCnKI&1f+nhA(z~NF6Ac z54ymwDd*=ge62J|cMUy+^1S?uY^*rMKld~-R8kg3e%Tj&EG;2m@T;nr+-+oyzplbk zX=w!>$+UcMmQzRw4MJ055!5?-xs$@=R*6`?^eG$;=w;@4SVl-lSd+gHvp5<*@lsTf z{CxN(c(x{{JP8x-<#C?drgyR&<{|7a-JXTHBI86>v7P%I<=Su`;1~|0Lx~e5m8>le z7pN|_)k6??3e^uO^GPqL`KqH}TPRPM%f8^GiR=?@0#_-eY{@H;2%Yup>a{*xv*N7) zF7be$Ov+&ZhbqE7B2OlXM``}Z<6ou7i|0cmmVlm@x4tg%G}YCe5KKuyjF7L@shm>% zI&5vujh$8P{tHqQ0xyV=vZf`6si7Y7h!f)Xyoq(`rK3RvNg|cmka=-Ox=;EOwWUm& zdMlVt>3N>CRn+rjp&XUXT`Xo%j(Nm!X*{Mozmnx8r4 zt9on8so0RNIz@0e<6I!%6Fl4(Z>FLG%H;Y1VuH-{7LzRu=(wpuG}iZ#s^SGb7~g0V z{+kzTWJxY5)xiWDlOyEB5)00a6^^hxM5am!RzvMEKENme=eD#8qM=NXw4ad?)bZx+ z8ffsc4o!^fNYa>sl4jfL4^9IzMQ0eZfOoO&;KaHj4dwI3{5^*|5OA}%KDYm1WbXqZ zzh&;eTGM$Q6JI2TSw0lhM6dK2NkWF^DtkA{OioHHyWy~?TQ(al3eLO;00tA+TuBoSOA;o{#? z0Vy*PE%&G?3=>Cr@N@qLN1f0iFy_=S5{WcEiCdrDNjx! zgd0zV@!_d4NzvixCvsMQIp*a&rbRBlJ6)$uU3@pRntPAhX&3^-cJ_cP)IgAabxRUp3>kiqX*P6`xukP2xpDnC{{r)QY<47UaT{04U zJ0d3urPXmp39OQ;!Nr!$BOOfQ|3=?`7$v$cXz)uwD?}>gOJv+!p}Tv_w*x}&H%wyn zQkS3^d5WryLvAiNcB-d>$N8Z*IQ*2Jl{t=`ql_ZCU*cIPKa1;^R%P%(YI@|X(J^Vu zcY(tLkSi%E01QUD?$fBX4t{wlzQjtsMb&cK!()nnr%2R6n~5Hq^J~}ag(mh1e2g6Y z1l@okGn=6M?|=7xzYe0%q|nq^<{vh8&@T$=iD|gn9`5Xy9<$Y@`NRMDf1WU<_)LJh zpSSZU%atcb?vpDgcXA$P8rot!r#GR2kqec$x-y}q=6nsFMNywhRF`@ZN7Xz#4I(@~ zO4D2sI5h6tPD7?Rg;y6@`oS=)E}#)}7q;);OszVo7Q`0Q^LbzfLiqBUB7HHIUw-t~ zZB*N6L82zB$mKREtN6C|a{Nv3#POUyO(Oy4pV;8+a~vF)2j!8re;vUqo_Kf(%6|7T zKTO6sr2mOP(Zre7W{b($Q3QNOw_g9MP5M-tIKO-E;)omN7FJmK^+w)iSygrGCEvv> z8UQ;SPQy0cl{^OB-Uuxw1+PJHk|{gFuNG7ii8`+lPt98B=xPblFREvx0E*$1+UV5C zQ{Z9ZsaqE+5Rp@hi-kxeZ!L#v6Q+C(?MsF?xkmp@LTWh|58~qBU==jBiTIS~1|uqN z=#h^IRKgw77_e3Or#7Is*F&keDfhT!uyL94?dHbpPF#Z6L}k~?T%~+}BQMk=PA_s# zNQNz{iYn#H0)5n>-t?@4Y`BqwEecOEbGz2SeXXp0;=bl!7calZ-MH zd>f9DRlldX0X5R~OxcWXQ%U+*mC5342x0M@D6VCQH~JXy*Bt`i_Nj29wsvQmPv!wu z45a{UoL}ABrIlRJ|LoT-kM&*Qu%H@b)7<`T4~)v-miUA_WeVZ{QSIMrLj5WkZC8ho-O3QWlf#tXoO;3k7TQZw0D4egXFX1Sl`e%Md;8_7iMouY~O+ zboagtDO(@@;?Azh320}2;I_H_@*-*k8ZAkv<=k7$JRykpIxnnne#*ZUGRz+8DxxumH*f#lO&TH5j)J|RIp0z1g93ej?` zYhKP#3dgBW2S_Hfkk8yvMG^Tnp zVDlv_KA4Vd&<~Mju)7NC@>pba$%Blj0k`Q*#psjV&7?uYUw~6GUmp=vi~_KYEC%a+Z|NbBe{=I!B$tdozbbhNh4 zid8r|hOvcw{GGw1b7PjVVpoSfA#ySW=0{f=E-B z7RAZ7k`TF(*1_i-x`8NEgWOhz_d*bwPG-mQa$57;Ctyt1r;0}}HrRSNnN|h76K=L6aG1w1yDOLN zVDo0IV@j{204elru^iS!jU@kDUPjxST!}bZnvZzgBtN7!HP5T-(;8;M)S-$L)2;b? zodgCs5y6{*!cgfi*zSz746k54u1Ps%4)?nyyb8;dxIuu%%6F6DnMiC{NQE+sDZ|{n zqpR(*=H&6GMg>UUS_Sxh$@7gaPkUO;npl{DfZ6(Ij@D#{>e=hMz-cP$oA|3@J(rr9 z{JEK%md-%bd_0z-0;$Dgfb7@WqI!Cur{g?{1h6(0q=V0nqF@i`W2Y0>=h9Tfv~)z3 z%k>}zalt?3+Cb~G7i5&wVH;c4k9i{->P!8_;$@)oN~RK4u!piWF2LJ^C1qzaD<((z zJJQ&rxhfh~gtLh2{k)H-KivnCYv_D>7$h1znTme*yWHzl9Aq=%m0@?);_$2R->t4i zdv8s=zXwS{n!>jfzn=}W?^t%UbdCsWX>Z2UUbeYodQ})$baAKxop~3xkZW-NBAW-5 z0z%Q8mDN2eHdaQGdWFo>Wx>^re@q8Oi2<#)<7XeF7weT4cq&H zO;sWrYn`9WY?ul)BZe^Xm0Qzua>ycLxEj#x9lMWzv9Pn$!YebijO>Hohdg&f?N&$e zM2L3J*oW2JN56;}R{PhiaNmC}dX1=kvWWU6VD*Oeua^oKw3S)Os+_5bx8q!-{zfofEh=sE8}z(vkrgVoks_96*tW;dY?35V2W~0KpuD|k^L*`fTI^Lf)XO%olMp0{}1Vxb@yK`|H0Cy zzfThkJE~c32}fC!ye2ZR+cFb}IYWyVMsO(qW|J2@b$VZzr4M{g$pcHue(?WnO4o6o z&u}&i{m#`c*_*|kGQLIuIJHYQPUZ>cy}gj3r)yp-DKW-v-i zVXuv=w_Dn`hF80q`;?ZFuMX-=`07mRJc>rU6;B8SD0074 zLC?-oqX`h`d$njA^)e2mFlxolv+gCs8ZarG%e8~y7=R-UzfC zMB>|kioC_I;9R?o4!(vS-OQHS%ppwyf$hRh5d}c0_Nuh)IV#WuYa$77QGO@^&CkR4 zx14#8K@UNsx%xx{r^N}eihtNjpyy~TIXY`$V1kYoxvt>3DQ{6{GJvMW{QQ%Y<)-GKCXR;sR~@mDYY9ElG>7w8lTr%Eijg%z z2!-2mfM>8JY#EwjE58NC&Ckk>y?S64u|Iz$oZNa^z?(B&USB{>gs2ieVZ zqq9PvUHI>}_O=d~9?LX7HKR0v%80CmF}x$Zaz+<7kP>y1G2jOjw%8A&%ex}bGC2lN zn|};J48;_ws2zqn5K=0E87xhLiTBAzBt^?CTZ3F9&Lgq;_3AYPB#= zEAsZZX5*DkzcjV3ZwN!NntrA@qmDd>_b%N@)K-J z@^TT)a*g+Xy|hveY6u_$KMUD!RzD3FT!;Fe^&|kOGjEH{fJ2dVurl-78WM?IDuk=F zZS4Sl>W%@gmdsCFb!K$U6?CCc$Hna?*ydhSaU~ly{Gka;bZ}oG=~^wwp9|1+i0FZ5 zrGOOHjHXd?A zt4x~r9|5fK!}M7{;}lLZbVW5NxTFV5K;7{-Ej=8Cig^?#$DP8&XJ1@{z31Tu=^C;; zpOq7;5*WY~D95~|V1hXum+54oy~sRU(wl#k%#Pzj&faTVXFAqCf2Z10zcj`5DJN~^ zUFgPO3bNACc7?DZ&bu(->{g1VL1?i00x3DD{G zosA&lx3h=zVx+DsS5n9k%rWw{=AEE@gV^@Mtfw=DLiz}B%bL`h_y-%eOdJk;C`k}l z8kD!#l38#S22IQEdBgDY#A)QGb5P$d0uk8x%k`V23d)lq<402`r~*9BYw61uj|K?| zkpd!SgzdlmXZT82$9V_^@ob{5<`P}567nx9IbXEe4d0qVcS;Q}oI-|33_>Q(W;6I} z;aoQmQ^lGcR77Ct!gk@z7eV!GxB4>uFLA!q6pncMkKZ8LWy#s&^q>wNlAc^TlCOk0~r73j6sr>iBD#WI=Qr^I{c z3l~o&d#2O}LZ2BEYgXCo4HZ%02e zVC*w&OL6}$#}8O}xX0UARNxL)bunZbO<#<})ins*QUO*vjqFR%WNC>kxhw?H$Kj~O zjC9X7MO`sE93Lk|Lz5zw5IK`bS$54(>B{65S*+njLYMat>Po1yPVpGsg|TXUQCUYs zxJRebQWM)i*tJqB)>q1hV2-ji5m!>mne8M1#1`hw-TG5B)pI|W&q5U6pj`KmgG!w2 zb{X{hKf!ySoMce{*$bW>-ncSdytFl-F2f(Rw2it|qM}Tci>Cba55SrkBBTe81=jb1 zNrMRHscEQLj!Ss0tl;weK2_n0D+l(P(Wh}l{2!REKCw;f7AiMlNQ~1LNTYL zG(B|)W*22=GTwj^q$*_Qm` z8whm+nxo#ODImA6kR@jZo)c@1&tc!$4D%qW+yIbOH;&60DsxsDXuHf8RdXKy6knmG z)ucq;2Jmx@-~IInIlsLKSm>q^|H$eTOo3=ty+MdLn2^$?Du$+Se%&jf$}r&uimpec ziO1I^`3a!?i|kApomv^3F`Jyw2QhT6|8puI(G)aHZg|4nUF&<&Bz_DWRn1T864KGl zFjO*H$asBqDjPP`9Srm-ABG;%^#%$^So7+9LqYg*xVAC(PZtiKVGMWln785Xi)9ZK z`gIxmMuVyIaxxyM2)iB<(Li?`2@9bk*14myR|c9Y3(;sI=)vQCtLk9-try;fldJ38 zKjBy}7$G5Xam3w-idc6}K@39^Jax>&Df4{;7-Ye~B+PE8Ihxd+Dz7JMWfNRxriK<= zP$%&vWc>$0B*LQx!6pN6r}89ET)zxYpZ)^}$^dymW0ixd)TMyBx->n6>16PpFHV}k zpfzUZ$=$T+sHk|Zo2Gg{baWy$hi1Y9-25CSaV_>_zQQl@%BU`N2`{)7)wkRfvBEO) zMZPN6JtT)Mwct3Z39 zjo89gL6obpKBa{57Qjw0IT>6xLnXaL%bSggT2)|H31Dd=ly)~Dx>TQoFgr>~g3O-p z#*gHs_J{EF(Wo(i!ALIO5l0AsJ3+&_q6hSqdz>Z5Ch4=~NQBlf6P^d2-!6`fhQ=fz z->e;j0f8el3)~4!@=faYcEOknr24yoG-RBhZ8@NePcgvIQ}9nb_`?gRkeZurrIW~> z_(fIft#UWIKnSDGH;88xBpn0z`f*N}rl{pSVqmLj0H-`3@djKr)%5|v7GS!f`U+=g zg!4dF&mOO2Q_G{hg&(yxV=LU)Kbh5?SX$)m53No4Rt6I;YrjE~bbuLi$+B|W!#0*P zTo6L9w8!!Qf2NXtsUO|2z&&0~Ere*!&ov31BAm$@JnqJpn7i*`U^AeaWJ@utDTA#1 zlyO!i4Q1+X^;4OCp%cwpz=p)ifQ7)UbEYGUE80A}h5`0T~*FBq%`E zFreG<5`K|6C4=_s>MBCCL{%my)4K_7by#rfDCR)9bDt@*YvC~QFqxJFV zDp^Z?@DIY5FH@o13RX;X!DG7chEE7Px*muRdBX_n7W%-bxO^}S$m$Ca8xxqUkGH-C zDcnL<_ET6%Zi(-lnQu{lbA_Gw0st?y(3e_G&pU5!tZ{T`VH2{JjkTSoBl%F>%-KEYVeaS1M9dk0&-H=XVugv3s*ZS3yL7dfrG;Fft{tlbBUQA}v zBbtMc`q9PwjS+MXfw2$kF!K^Dv^Iff8ah%A5L0H@l7p+ zyB0ujT<$iEqq2j|*m4bVPgdK~4f`vZeQZmOWNvXp7vw&^i}s6Z0*apFT~xHg`Wj&t zLPKNnwh8ETe{=N^stjZ@&JCI&KDQa5B}yp!VaBiy*z- zWy%(QRDO9pT}9r4)A7Fz4CwvL6!x7L$UsVgi}Ns!$cgoA%ghWc193q%#ay?XgVH~R zyU%mU2u@}o=lU8LnMmLyc5O!>Dr4GTV`7rYBn=Ec9I9;5#ly3xETV5MrFq*&S=QFW zj$Al5_e!R^Bfpp(_mFTt4EMJi3h3L1qgg0n*sSMXbT9fddVG%_m=^8vOxMD@e1wK} zuS8`@QK@P|^po1|El%~o_Viaz(%D*^)*i(LA&}{$8M&B(Gi}bNCv=_@*{~PGRNqb> zIMeSN+C->iR!H}kp}uG93&gp;&UY6%RwC@{m1fF5bC{%_-0mTv9(-{kc3ydN0O1pv zEdANZ<1(G#NplccoxQ7)S<5#wmA^C|^YPB}9j7BGU%8(~kzTqkjj=upC3oXN@*>8V z{HQ(6bx3AU(d2JqtQp88_OKozr!;0ZMS9is{QRnKoROJB8y%9tM=3*m`d+=E_=Hk% zZuM6BM~C8E+4Lomw?kkbdSJ{}0w5T;w#7or+!91`N+MD56y{7JV}56phM7EWVS^O^ z5E(>>97f|9KG@ctsF?QU_ajBMi=Mb~L}Zo2h>I{VOW{klJmCk%b^^pklC{xkNzSsm zl0Sh6w3?tb#^bHhB{$bZD7jmBk+E)r_N(W{_kuwZWj&mdH_axofVzh!v1cD?E z8j=WX^y{T*_&FHG?385aQs$m}r11GQbIp)H;_*YS;@;q(xh1D}@bSw`;iw_X1$RP& zqN!Hm?GjFeKax$4Ox+nQ}`){O@*5U4*oig z#HAI#z%Zx1Y*Q~x`-oD z3Nb4JMVEl0nVQ+3KI9J75Kt~{Sx;#nXS?*5H%yX9^@K83Su-+atAT_4Q6SRR^RNO@ z5qY2H2{JJ7Ednyv=4@x$G-IZ3XADf&O$nl5%Z*Y#X`(<$Z=nUq5nJYf^rvQ4C$+wS z=|N$V5?ivvzM=J%4wV26wZ*=$6!zZD&TR1TO;bLSTg3;VJCP4*nem8WF*x`b;08fJ zVzNq=n%MEGi*!>0-WG}LvvSekN_-h1Jvm-IDRLA|Vlx>0o4c<^aC@*sfAl6%ZE2w? zYtN>=9xz!e)E84qIqy}xfX#&3t~k0o$T8-&=gjax3KE6F;s1E4=Rf#49DU;-vuNWu zOO~gR%q`ZIDd~EEVd%upK@w7_*5W%$&;gROrg?LHvz@7dts|}m7M!jgZy4uy$5l2$ zAlFlwF;@(Ixe?+Y)UScSDwoE86VyENVka#@1(ihP4NxE>f)6vVCO4#1f?Shz5ghX& zgt+>eaUp@*59REOY%LhX3SAPq@Ww@Mx6Tw;n5n~L-&&z@Ox?f4d<&trkp37!sAqVa z1EY|OdPG?F&=_0OGt=!?mo)Ed0DcSe#cuuBRwrG_b4$tF@*x$VKtSghs&dHLbl)+J zFNM&B!sXmPG-@@50)(R0$RxScHR;QtwFQa>+uS#rWb|F+5vO1>Cn>z6Wn;Vl2`}kl z&*6Eh84y%5HP9casRou|xF=@rl}PCjlxNhj5NU#pVk1kG$1spkW^6g|i=@ECrmVtk zUYHk(+HL(up@lez?IR7&wno(7YP!0ob-euO6oN;n$xMIPf23X>IH<-}h~}8D24r>&tzi8D#!V|i1Hlb) z@KzqRYzN-OAf|L1+8{+!FqV~u{Vci(@wQRFztm-@l&Hpm7z6Z`C|$Z-Mc>gO@*g>W zGNmI3-5gJ?;~omZ`~h&X-b2pcn9)jhp09^upfc=Fh|YpBE`YIw%F`?zIkx02{_$0l zX-2 z)BXgPnX2EHuB}8iu{Q>Rohev&Q^r6=Adi@0w?^@2SUEZCI-dK_GR7#z!O;v_+Akz9 z9K(6bg@7eJ2dD62%ul@w8~P4zjnRs3EG_AG_2DxR=|S3+CmFGIWHpW`s8`Kr$5Tl) zGh&fE6c>`k&URzpBU2m&Co(5 z5}k4}BdJ#?r_<7O=H_p2UDe5#xY!Wt7NWZ)Ybs)taR|zw(PRoSe6Iem0_hD%Kr z6CVf}m8et+1O{oAeWOpxO2uZE_Q_BQPGu3;u9>$4G@$qU^PS7k@8BiD@$ZqfY!cvv5N?ARJ|-X9N*gvaw=$$`NBo=i1PN7zv()bbl$3uIaU5F{yoY-&=P~*|JOOFubfkCVu;J6jxFj zBn3CR7OjPOI_6f%I?#gAQS`HLVI~KAb6jkj!u%vL)Z}A_-e8PxH zgeD-eqg%gAJn-!o^TjX6sN2^mYh7H9lFS-bT4;)WcpTxjEidT%RIL)=vo*4WO5XoX zug^{bwM!|2MR$1Bzs-MkZk(xiXf5n8Q!#{6!V1X2!NCya$C~zZ zPK@aXC@|ra{yRJ@h!(?KRLy${j_6A`eSED#HE53?i|3$%PjA|`C73w95Holh7mW<0#)@23JEZz!(dKM}NNXYqaC=tH(0`2_}z;~(eqrw(IjL-|p% zbyTp3(q2vxDBl<1^+PHsu6Jn~#`=;7!4Y#CX?u|2S)q|d-jm8eZz>(Qx#%;`6i4#v ziAaxh^_DodL0obcvF9XZVJ3;4vuU}lIbn9B%&mn*GAXO>umDGFcSPl}+X))>GEuQp z#CvLvFhz&3@g9Eru15 zvx@e|;!h*qs!(Ibx-f{?u)j*=9}&kEq#vRAZto7H%)GiY#5KPw z<~ty1emBiGVT5N~l_}wuF5#y&7gu*_uSKyUvI&(;IX_A>I6NXVF!0IAtl?=yWh7s= zvb$xWT16=6=hDz>4;=w!kFktr|5b7RBRO<{kHP1x+#WHc8Nc**;QOXCKscF|+bzGH zKV$%Bq>92ldNLQVLBvE+nVmZx*be&urPh6ARoB(cgy|CD_O&twJGrA-a`6M!Uj&aC z;$`dVJm94VaKBbYShDMk?z-S`m#fNrN4)a%y>ksnFj;XPWBb1VXF!<0 zdURqcowB+@;kN$4{`FAxr&3n$)cpQq1q_*4sy102t{Plj_H=(@qn1@q;cKWOePt~z z&_9-*<%K5VCSO=)Zk5~Gm43X z|F^uzT9&=BZ!Qjm)(x0k5P1?3UyEnTYwBq5%L+u<1&2?ht&*t4S_e&JAaP_AkrLXK zkdt?A6hVabS zjrQS*;u;F8-pZ3|O~&j+@1Mjds9_@?nJ6~!Rrb8n>d0J1Hy%rv{oPU|Ss|!Yjh!r+ zp}`yI*`U&`va}Y`IqxGI(Q`a zME2DG=LU`@f|J5mn&}eb*>aq-v#)1%d5YIMIH^b_D}}9HVegQcTexyv>%eFxs`GGK zHz{poX^n@$4Pq#nZ0#M&bTu?MWNvPOiQ-24n|!S#u7WMMmeypi$ofP&E2fmp*Rku( zHDm@%{nE(_%ABRSTVg_9Uq(Y}^3lXfINclNsI{WbW9i(4k{bp%2~N!S4~=BfQt6GO z8$YCXdX~tR(8LC=!m85fv*-OkG}PAS3y>@KEE2s7ieNE@?C%*&XDX1>+CKrw3e8jy zN=J|@*E`xnpr!X5IckIKbbd?g;WBdf-O}A$1|>!i!C&GLP!N%N>=9P-ZC5s&Q4}_>RV|kvJz5% z8qz|BqBU#=*E92eA~Z2KJUX6s6_3Z={?`8a_(l!~=H|=m7(A7O!dDkpAzhYOmi>VD zk8^M(Is_G8Ei<~wd@YS9bF_6KOH3(Luo37Vhi)n*DhQcM?FwP3g68f>e|(*KmzkPY zmAS!cp@-JFCBEp7RWz-A zI#l{6!lP6TW|qXrl$k4VRIT2amGE&5wnQh88>RY2w%kG&C<$x{ob;aMD|q8ZPgng? zvQjp7>Y73|WcJ{~Iji1EQRm1`AHvVMqh~BOz4Vp}bm)xc$#Zfo$C8CwH%F@H39}3D zA8UUlGjQrnBAxS0QF-t5LgspuuWuCTtQohT zOByQhjKpGeEAh8Nq-{j2b zWNgLq`_Pa-7#d$MF-B7lQ8XY|&LG!iv4vR}A7xlLLf{cp{O;oJk9wk}J^8mT0*uyHw}k z^SJPrsjk6gk$mVOgLb{%L>KEx97#uXYWZ5<`J^vABrP0r(m{A~R^J%RHA=2&KYgdKn(uD* z_f5#WEswU7ZXLx_yWQrNu&cMfc--;Kq)0Z@4q0nBk+e??l+HC(Pc#K5#zvPi)yTp^ z`(#u)&|2JU*xM<7rH8*I!r#)%d$muvvrm4aPlt^-#DlGk<9*@jiShXbn9D(o%+BhE zgF7Pi*9}#Fd8Yh3(>3=EF>u4Ko*AUV0U^^s@b6*bH|J_@oum??o`LyU&=Q`R+#ONe z*ju{YO6(dN%S>3YSgf@pI65DnSg$vOJN?~#7&2F=bpfy9vZ^eS4?Sv`QX)^ySK3N2 zwPVR;RQ>bG=ANjlx&L`D?F-RkkJ)gx&WNoe@}`S((Nx~;ks5*5qjPuAdc8lL!v3_c z%sLtwTuAz+#$N0fd~c?DyN@$G7e|+g+GFE{zQ!j)jGv9*zBy5O`ApT<{?w*R+yW~d`%gSmgVu`28FK?sBK)Oy_U{*wg#aOPcNPa`lHWn z-+sdbcYdG0{o+XOA-mAuH&)$fx;mWy+4;OD+bB|pU(?*NH6-}LZ2qm0nx?4{=(S|g z;7vogFU=Lb-Nqf9n@3i^=Vs}>?z_UoE2k>ImZ-isiMb?!xpEfsgNd4-58-~_SNHc` z>f^nv=OVl<{lcdP`410s?i^*_JVpEQ9QnKRbyvl(*N@dbF($4YZ?aDG@dkWb1_VEz zC0;yR^_zY?X221iom38Y+&V(IXrb~)V_3|fV|aefI@bG#A>udNa{ekjz--da#h0t$ z)a2yzd*A-uwr6gA`I0DaX|A+61)c_QK@~(LDwhM6&ea8Lv)y+rAZmYSY=aHtm&(EIu;_TVy zd{n93FY@{R)=T_sJpcP6rNZF=xYCbx|8;c_*5_ZTN71Z zO;jPS=BvLuT6udX_ANh$)Mjz@h6g96V)Mz_crrGZh{k5Z(GmARSkc=;>UNxp=wBI; z{qH#al33L@X7LYB3X4Y_gdY3WLD{!wa2HQkJsRb!ro!@}!0)1@ixSn>Oya7C8Y8i( zJ$?08jh5bII{YtNX;*B;MGhro%w^&oU(me!Mg6W%AGkNCs3exr^TRfUE##>h6(%p8 zBZj|H6{aQ&=KT+vL|@C4iFK~xDturd8i_AohY%W_{Nv*fT}Xc9Q;~Q6r+3$HY$xQ+ zt$B9&cfzMXlg$5eEbloNxN5<=O}~m%em+t7g}H*KdKj%!;~lZ7BSHChhfBV^P zL!pvR{VVP4M?ZaX z!6IDP)-yLN7;61<827d5;x8x5FP<;EB~nurHg`?OLbKC?!PXbT{2xUzm(EvRlB~Hj ziM=?1xoo=PXTj2wK3T_D)E6E2f9$;lSk&9M|Ig6fje#I4wqkc;cXzkv*ot|~W49%dpFz{CUlU9Up}t{>A#v|q1LDmcJ>Qjm;!X3_ zpw0eNt3P{^NWe~3)k#+6Ny&l}ry{NQ$6LyLx-QCjEZX(3cjnbI-qt%~t<|a@h;yDw zfUy|+iB8#rXZaCP)g@<({0BF@lI?mf11}LRsrIL13!htmNG$l$=vSS;r^G|I-c+#* zxiVJ*3k8muYQ6FNl$W;Iv9?9Y>pwc`)W1^gvd{p#Uf|RRocn-FZ*bP&*!F5Nn-+Ly zh>MYGt66Vw(gKIEg|DW&UsG!}QwKY(cFWz#HdB+HDsjve!K#1bn?KWiW+xlVu~8o1 z2!6dET%W_w6?AdN23`@uS5C&uzJ_BzlznQaXnmz-J|nNd$v50LDl<4T;csUC`yX~* zA-)l*_Fkd>;Zgjn?-~G3p1Ul#f1Jpdi-Hv=1U{eam2&1{pw*zv>mu!U#o&oZ)1Rs? z`}CcU%hcRPrIG|=jDwQp*T(o=+>>BAy~13n<(U-cxh$BJ97aSA7PJtV;`AkN7@&c!Dvx1y?=(+yQ4KyY-D&caC|xkpf`1S?MpRGl0X zdU3P&eaZ4mC{|*e$0DCEi6$Nv`E*4bo=L%TL`$^efke?2*}|(*Umi(vOk}`R8eT}U zpGh{|lg_)Wo^e&X?3wDL?&M!v;FvFyGq`z1c9EWDQb@+7sUfS;?z)|R=+&m_TA9G**bJ{xspO?K{wb}m<# zK!(J``$eSsM!gG9d^bo}_iuRq@y8t#$H16Ox4^`Z*h~v24-_cg7QFK2)_q5gOTSr1 zofYM(`jmnH*+G6MMVf99AJzFlwDP?0=L_PUj|esD@Cx7gI5S4UXMS8o=UyTs#m8y>QXOo)&vJNuu%p}B4T8`Q3eZ2iz6!4 zK=2&^K6oWQ4hkLKB4fJXiCmE|3a?ecrZ;^Y{1(0dyau^a2YV&3#Pm}JUda=fUn_#m z$`7XeTyfa!H@RU_HTNXYV&SU_IC1a6({CIOudda~W;?n22E^sK2E@I#bs^I_7Pf!$ z^Ot4zka)CMUSX+^j9-5G*2PVW1NFbc$7dS|j+dbovR=j{5|d z=9{ABMq-UOC?SZ@Q%nyLE%Z^ygFL*FK=$A-5 zG~JO;MM4_>tc@l(qJqi88(H$0<_hGA-t_)vo?Z2UAFaHP1rv*2O2SJCFp;RZHTB}Y zqLK=xWQwB;AS@~d{{{nM-+Ki{J$n4?Z+L$B;o=|V{x-%fAl4-S(Ted746TFjOQ%Yj zzHIsZH*vdlf)(9R;Sj7kEuDKx^wUK|h=jcA%Od4Q;%)a4Bpk$U!9%=Xo(O_Da}R!r zGJ>%Txk6NsC{!xcBD75X!4siU2U`U$P7Fl|7=nZl@>C182romN5UODijCA4W2$c$0 zqEaDOgTM~~L)h>~sIrkqM(x5ls6rzn4n&SBl?7@SqJ@F=K&f31kHv<2$$pA$CWsaW zL(83RsH#WhEd2b_9{DLCx+`jWSML&F0RMp|Fdtj_zM4C@n%Hx+7 z&G3EcR6T%;e~|M2nSy!03sRzlK9eC;|A$=eIk5&5s25_KC*mbWBBe%XNN8L`)B6ay z!cXw+Mi?aF8HyD~Iz*y3d0Q=**oPW|Pz@v^N(g__L=;ULQ(_G(1g(l{P zMknDf@R70U-z@QeY&rHP-qMxENiQv(l5#(MUpj^9PiyB>Vw}X2pbDg;~{1O#L*FpUk-;5^yaaKlh%P%KkQ8r2c{+7b?7!Z@Q-7xlgqHo(Mb^g(q^QH^j|0h(!J_-b}nMqeF+8=JiTng?p=mT5aYVhI4Kb?jeg0JQ5y_WOx>UlI5AZz z4179-C{H~S{=5fu6Gh;`F%$w&i*R71`*{o{Baku{KrKB(8s?0?dW11=9ZFX}aA&du zN|!T+MTRa?&1iZP{q^Gyl4azF`GSQsLCajpbnn9l&wz5pjLMo?zmS-qgj{F8=%>#} zf4}RuANix%3*A@shpQjO!LREEIwC=oI zv{ItbU|SaxrvSM5fRkVLU>p zc$FxsQT#-CGXjOuG=ypqGBX^4N01RZ5<)RPaz{9KkS|A)5sKGftifr+G1eVV;Qc)eBs-NI?UWLUi9H=eKd50TIFRN%hbT6~=?8l#KDm zH;85*75v;C0TC+U>NApMXBAS;iFDqVbJ?d5c3c9CC5WdYLlP`x%5L_0xK(BUT=hAl zWexg^P8lG5aJH)3F^x_ORj@;-P^Ppv_O#ULLS@QL_eY`#PD3e93`nCP+yElbqK_dX z3XRq{h~|y4WJHZ2BNDF}4G{<%V#Y8w6oL`3!4xnqT|Nw5+QewN^MtE6xNFv%d~ELF z-Z>o3@n|a$R4b(Sth=X};J!DypjSR~HbQ6B73>D1@N(@{QHsbUFHjIs3I_09Qf;LC@rr25Nf9tswc9HsDJC>nLvs2+ z+2sZ@TPDjNn62viTmPF|=Pg~legEDqn>H_;H-F4%12F{|@u`C}-rvP=qe<%LE`5q# z=$60H0e{_|L}4tW>J)-FAxnq~LlHIbu@fO~BE(PX9tpgGcj7>MKOSOnjDr}2jmOvs z2%~@n4TeB{2tfJb(bbRAh1RPVNj8x#x6{S0KZL@R@&cXwM>1fJXvtPTo_TtANl`gL zj&g+`&hB2ZnMEN9xyhNie-kA@8)bWiBzlA-o7uYLm3^+`+r}Q1mZ^7gg~(;G1cI+5AbhzBSQM$QLbh4l57QE0)emLa(R*iY%hSfO@qz;Nl6r)ZIPRJ4> zG#L`6K;jfgng+?!AZ0oksr&=)oJvMAUNaezCPCr^h{rr}9LXXHV51;nB%v#G7?m%o zT?}35yS%8YN8!R;)oob4MbnoaP1u?n8_#5Ut9Dt*fjN3Db&Deww)Sk=Sdv3WW6M`7 zC;Ua``-Ug`2LDHIw|DX(vw`?~@D5A%i%2oHaA=0_`}?XpIu2aEBx}71LF$Hzij`2! z>Ap3Oq=FBln-YU3lI*9_@IssvrO~3lRC>Hwc8P(~w(0UaXGru@m6MSjIB?*|kt3Hb zUAley_5%kGj+-~L|J^;31A9sK*OJgy7u8Y{m5~~hYlfi;O%xwds7@$N3{FW1%nV4K z0ckTKeKuswhRiu+yyG8u=PWWZ@R}KrJ`Gawrzm3xSONkz7GlOg^k_m?IMOwg6jTET z!P^1grw6{e;Elq?pw$;Vu9SKHAX%Z=DLS<#@?_S@Lh8fq*(dkb);D$sN_y+&Y2ifx>X947LM;`BUydS@d*UW{i+3*fAL&l~<8UjWYEP={bi~&TAhDfAq7=#QV zbOj8gbYWOT;nF5+B)lip+c&oKC^&qrZ`}OePL}fq(NY9^*&FL^-M#oPXl-jZw{?xm zDD@1AvvczNPxVwptF2uFyuy-gJ%U4G;%nHP8s3i4_O3;TcS$&I7Op>wPziCNLb1|p zekkg)or)EKN`e%rOq5bDX}TX(-#zDm`GeuDzT>)r*Eu|339@e9ycrM>P*_+vWXKQ! zQK12swoLQ8qrPB5p9g#NNlBbI^Dz)N8sg9bjiDt_)Tk+hC={qPlqM7+4zZ2nrTL-h9ZN2RZn&bKpG!#wgenNS+9Z;~^e{ zBhrPDaX5q_U4zMsLA3n)Q{mDE&rzKLud5<|kSvE#pTQg_c`}7lJA{sYmna1IKN&F~0LcJd0!Dy!h_8*K$JerYLxdam4;n}SuR zP_MXRWhC5uR@LV>(bl_Sw6;LgKx2i-(+VSXdp+DHrm48`@ZMWrGR8vq8b}&BYNUjO z#Kegc2Mid%Jfo15xbC$bgAyMr4AxOvGI3<9ugZl@3PW`J?O8UdJz@g&;iyp<@@7+k znh#kE2u}IP5@NF)idI1JN+?+crK_QA4V15e3TEJ!tH>x_38gEbWEm78X$)fwV3e+R zGa-XZ7tt;n7E!n&hS9L7PlU^##zdcf9M4@10ZpyVJ;3VhS`lt0P39A=RKP|4_J-#s z=KSBUu5Z9!W_Zd6@6i9;4TkOqwq^nG0~|j7jFoA zv-!Q-xHXIL9<5VrhqZh6-ZW3aV36vHX_89vV-nt=&BjoLZhRKisCkgJkg5}d6J@Dv zEmW+7%JuMR1AN{H)tktuVFrG=0jk!+XZ$W+vl`0r`V~;R9Euqc!*Dqda_2x6(uLYJ z6;dZdGWxD@5N801Q^%!89GBmOX0MQ@+#e*%Jt{!6!%6{cP_;C>97fEU zR^Rmf#DUJvuE_WlpYYV!cg4PRz2ARO1oS5VUmN$}pqO;`;3QYyprrhQdTs=4U~?Y6 zdaZbCg-GLh8Uar;5fHf&YrLQsaa6qKPwK2l1QdrCYVWVfs3@v!nEJ!Bh;cuexpcw0 zuDF2^F#tm6R(cH^G+1lFBszZ=(*Mu>@$?eh4uHmZZ&Bhqm?yJiI4RscIiGO_5aYIX48-KYE) z*Ka!S{wkFdC|Ho#7)wo}oXV3dv}&sZ61d%EPFKI>QLmhHjkdwm}2(vlE(k!IwSo zbuYB;gKxaCmyFik@O2lo;5FN!X)83~Pi=&n^-#4IKCOaslrN-f5fsjcJVVHt4ezH@ z;hF?V=(xs0>}ZG@LCkz8gVrDjGN`qxY;XKQvOF_l`qrX#w?VYjn=PmA*-%na`F(K> zhvVrN7@77VFg_Zm4Jk zM5x5-&ueA>A(MYaj6n5_LiJn{OyoOW$Pe%LkDpFRfF&(0Ew8Dj*h@qIw{;^-jYdJ( z7>FDXv6I>H)3{J!Hb(>BM~r%CnbuRHP@Pbhc0n_;g#7G>wu8`d7`hGv`!`_!PRDO_ z;5`SS>i~4@hjzSj4`J*J1K1|0<N9*|bylMGf@bO;B9+&;VuesWmm=%; zUaEN=6A={p?>xJpu<(G3JC#T4kE!&;=)<^leyGq&q4!3EgnnsDH&I_uh!Cek(24LI z0nRai;{Ye7J-W`2CCcW7G3xbiRKQLN?34>0FTHTIs=AK<8aqdqsPrP= zh&1Nlv%32Fe`Bb^6EpGFD>N}MCet%C_4cFZU-+QHXn5P?we*d}qKy}Rh=3w>XB9qQ z#k^0HY=!6+D+VeVFqLD!QZ?QorYiqmb0sLKe{q+}5WR`XR+C8CoPp{+rfeAd7&nDh zYBSWJSwf9MDh@z9s?+ZjCnV=Iz!?A|fU^MS0M2vAIeL!~{VszU0)`MCq6)ST+IK_i zc4*!L^&6mO9ehUNS_UPIp-C2czW4RQp6D0Y4s8$AhmZjf;8&FN zgJflw78({?tAV{TSugFNerKnPZvg)VW##3rej!mAC0>Ei=GJzivg-f#lI0l`_cl87 zm7RA~N;(fJ1S}=HaMX@vBH2d;YY9|B)T;|qsD$c``e)n{EWRjCxMIZW1(&N=vSc-{ zrDo^_#f1h!|Hx_yh$+YpJ-16^*r3TDJ*Sd_C!m93 zC@@IQ1%N*Qt^i!+-ZG!yxJ6SBSJ=T6|gRACJzRillAYTd^{{L;^kWE+2vf&=?nl6#*{2Nkk-)ln($ z!GZ(3TG~4JFLCko4NJ}sO~~@{|95WrZth5Wk6XF;`G+St`^Vb3`j)qR<#E*taNy)w zY16erP3MSM)pUy$8FgpW+a5|e?GPjLHQ%9<>W0dU?sG9$1{;l96HWW0s#AxH{FPpb zh=|L}4BWnaYDfGGNMoQ{OrR=4s5TI&F!nVuGKI117!@BQipnK`8vuXem!Ccz$<97k zRrLS`7T^{gH|f9&t^r)9pCf4pKYm!~q-Bl}h)>c#D`nnC8Hbeb-s9p_~ zE1+x%G4n;TV}|_vf@KztAN0j{MrY*PPpLmhR!%|QgmN2Ia747!!CmqEDtiyV9<{96 zI!kBY=*-fD)OYw$VG;k%lZO7`$sQpoPCnt0$?3dq(k%eKLD9o^EfTG}z(6I$g$l(= zxaq8B>^YH=OJeX`f)1Wo$&zg{ujSzlU07wM3O4E-JFTx)I#D{=wHt|a&aR{{ds ztL9EE^_$)eRn9M=LYczA$3(qzRDuu{qnes&XU{71>n9>5B_bgqDlI*9`SROezdi!M zfsEY;xJSpatgKO6w<_xDibzTdiHNXRL_#&jkKb2a{TpyFEbf8U9q?rfG$2}Qh?)O9 zImU%~h4Rx3#^!j8uMgKTJ;xFzrcrj;fOes_q1t;Yif=Y zR}Yvr?uBnVpas#|Knf9!gRh?^KO!wT-1*^b$Vaa=8PfXOTon`}(yM-V{~QQUX(;@G zt9MzM!z-;+z)2Ok0#D5cyI#Gv<-ee~w9M5%G9s-gE;Z-h6{}k0Y}u$x|Q&ZPi>-PS2m3?9uX={58U|FNepL5Tg*<@*X zDl_v?Y!^>32H9ffqzv}`+TCZYUs+w-#CJw{OIUP#SaLy3W--(F z-NoJO-;68YkT|!%xWKrq`_Eq0c6IT35mz)cZ#a8gB4m$XPpE`30@j~ZXt^cpyHA`= zY71mXIf3f6G?>#BZe%f%0(YwvpIEtQgLi)j(k^+U<$Qi9T|8_6k>en4G9=On_34P)4=VIdJA;E&2M@+?%{zDQ&x(pS0OkNr0MmBwW+ZFO%9R!! z9o7IitN<(k@ES{c8DfUK&AWJ!dGLuxj$CSQzd#@SBt`2Guo<*=LRasViwReKG^f9N zy8u4SfgFm~`(cSzLh{mxmg>=UYrch7wm1C1RpIBdvAOsga8x79m|gUoE}1@m-D5#u zT6$zsc38@X(Acya7mofr5#E@4Hb1(jc1iJ&d3#A7yG^##zf3wo6!8hLSwW=f14#&_mtV!snRW04s`L7mqz>@ z>9tdY)D={3?;b&B-y+69^hAiCN~ZrZG5^xsxCCFAh`emS&1)okYca2L#?z-fsL+aU zc6XOjQ4tgt-ezU>g3UIgv>-efY4m5zAYn^HWXt{gZj>}f00#hj`dtRF*OW1JeSPM^ zmpy&TnE8wJDNgXAwHH8p{VI~Kswhqhwp#+F^C5pWWX~XIWl4=5gx``h7&Nrb)vq>- z({t&2XIIzpWG5AliyDcBj=d`^7aJY=^r@Qv8V_&(=#0{^#B6VWvPAj0>AyoCHYY#g z7~e)Dp|c8!&${=_>&9? zZiq2rRew)t^(g)am$20mpt*eB%KF@$&^hevar{zTNoh@Js1dCsU{1FqFi=Wa8AWNkt*tpF1ZlAWa7H9t zT_xqn;;ueJhdO@!>WOb0fI9#J=1MO>#_Z_05EsXIElCB1{cqpir+MPlo@gBe_5pyQ zCy$V{LR56L>7C{9X(45pI8V>HH0dj?cr0AVhlF?^G_D&;ju0cPgP74*XY0FV1{WeQfnEYvLDk7pH+G_f3 zzQZAOG;vn3lc=*AY;j$HC7^S3$0{=YSG65lmZe1tOGyfei?8tZzR1)(+uQZ#&Lwth z)25dkjyaVn2Z{ZT=u25k-!=3t>ZPPuAr@dv(%5Nphp?onEVZ5eBD_>k&lawG<%^24bwYAII%32LG%iPVDmMFprfMHS&4T(W9g|9t$MPK zmKWYg1)m@WY1UxnE=yIiz0_GL;GEd3p-N^46>n`N^&+#Q)Uk&dkaflJQy_J0j=PYQ zgxaz>iyGgpfyzx#vkjVb))8YfZ1?W7T(3U$1bJl5VZ&||7MfF~VxU57j$2wXuh($v z)_~U52!Kew5l%-aB@Hh&a&i)(r3qBFEl;1?QYZhM7Q61!`s!th)@iC*8{fZY9$8`3 z@TKJ$tKri!C|d|0=aC7-kE$CMkf1-j|FBZ8(H;KpD}O9Fd~5!)D8rIM<)R8My{fII ztz6#5mpfumw6t@H&nk~jFLZG6_}6w;be)x7Sb|?>E6ZvoD`x}s6XC!M}(l}}w= z3_vVE96&rk0zeYI4e#g(X>0TQ^2M#D#&G-gZWAaY^C&ORnd%;z`4?2R?$F}=AGGdz zimI0C*s;v@lWbnDh3XYhu>?xyL*YCqR^PFlxcWZoLkpY@A#-{B2^`}!fg zf55e)E675-@(ob6wyHpF+GMwK*i)$7Iyw%Sm262I zZJHol;u@_@@81iF6MYkrkuppQUd^st4i$@`WG*{bLZ=tuN=IwN2lvqsH@747V@>&w zV6}BD3pZ0GZE9Rpz^PxC*M#|Vn_Akw+py;5pzxU3ccl@@xt3No_<$y+|EjGc-$tYm zs3Ou|SlE8yJL)JZDPzc?6~Z5n3D%qztTz&LUMrv=L9CJE8sU};f{jM~if#)f9;KTj zUW&$?6c7<)=_pG!Kb8hF%D%?w1C(Cpw+0Rab z;6z9^_~0QVD=js!-~4aymqRHHf_3Ac+{R}de(>ONDjH~bW?Z*SwWK} z0%9b;6N=v>+H{g#~bE>W`B7{$s=_^ctCZQ-4hq`{I|y&&6a!cvnJnW?W-`vNmT zbqs=}#_p*RPf(HDHE%G4FhOt(#7u$|_5H*|jdXsz6e?Db!}6$UOhO8lR6%f#z6eO=IDx^rwK4eMNf%*qy=8; z#AP{YHQ6ovZFgnm_gYp{bMxD;GIk{XTv5eEAw9B+OJQtibkVJvE zze~d#5(L3qD)bcbE!S5ogDtHvIP@ZoJNzYAj>nX+Z@TdivZpw76v+hRhiBM|_EMFb zJZe7KqE&=Ja0`6xL+jg9A3r=slQIlOyTZc6WMr5ZFDWmt)Ta+qq|(sQx#r~+*xDM) zg(`zfR4zasKt6ZmQSHL}-vOjiO+)JyP0c)0j_{=Z-=0=YP3dIf16qK+$|qTefU~vc z(`3_U$`i-%EqE2|b#TL!#`vj_IT2FELgIvP!J&;GewHk!cahq)XyDz5WO1DI94}j0 z^q4X94+=@lE{n=2ewX|4UyG=+>Sj_~2#9tKi17+bz4`c6V`mpH0=A+zK5vFw=MSNGzBkBzfiNcL(KuZ5cF ze)c5en?CgryYmFqiYs)=MnqDQo1U@+g@iN*3^-2^rna1MQ|~E13{fBWMj^c? zmns;8RuV-k3LuP@Abe<1%aP`oJOh8Xr)2#OupijFp?y2Fu5GKFUl>2@eTZRG<~;Z~ z3v#BxyGf8X4w8mL?BQzv)~>c6xTMMX(aJ2fSDdP2iuo$RNvdWIL){|*m)08OvLXFDG zhAv;O+^=7sQKP2q*l{5+(34iBP--G*-j~!9ssezI07U@Bm}=46B6?2&{VqRRvGfr_ zXj17#CClz7$>O=JqeQY`FLZ2&ubZH09n`OcswGf{iQyc`oeu9OL;3_r84oF=8{P81 zeENYac4wDaZe*_}8})9N<)(Ifm*?9c{%d^v1EbRlV>3%*Q?l%At)Ch{|L4c)T|qgS zH1~@Rib?khOM7kSQ9{?lFcGk{zIol=y@J7*26Dv;xyt{YHC>z7iAys?zFt(!xgcKf zhbU>0ja)q!{$nA@ryTdt>1O20Qo@yFcH(CiserR;x4ClGYO)raqA%P}O^@`@3m6I^ zBT1P(roYn-QpA39)sU0D2tJ^>(!W4vOeUK?JxtdLGv?|l)s34C4Oa^ao;NqUP{-~? zNeHEa6Hg;xCIyBE6|z(cP{tjl6tE&HTnt*7)ZSzCjG>|zNF~diD_LgTa@HMM;o|2;`=DzleA@!e>!EfPd|paxS#!xchin=OQ!x~dgOpRHUOyKcvWp8Rm)g)8DJF(4 zDn%yq_HO^y(ZzR`1;^CFKBb^0A}QO;FYsSTtOBCbJwuYM+(W!Wqw3fko>;xHcJ6h4 zIjio>cc^O52xS};&{ZHN!e^66-C5;?b6l}97HfXMObCis+{Pd%O%}%33a>Q4Oi(uA zvNG6Ht{k<%RWQ+`RE3in3! zUiqGyF~(>y#d&|~vYhGkv^l^_`lR={WzzGsmPIEGIT#AJLCZ#HSOe9|p<)pf&x68Q zRI(;P`glkli;~si`nj>@N3htO8}Z(1o%ZTv{fx5;c&J_3V(;eNBQea%35ZIK&noi? z3?oG$dxw8!oG@hLt+iWVaNIk$pd@Qo|ICj?4P3FxEv;O2c#l-p305sl18cclMeQP! zeVE_p{-)XRP%!eKC~0L(xDqY@lQpUrsW5yqmI6~5^zHReSXv5#{neC6uUA`DV%il+NR7SkN3#K>-B92#(p4{V^cPY?lbtYpN=4{=$XoC=OL4*|aTVnig{ixt^&oT| z<(l>zbb93pmn)`h}DHp0w+)>Gg)(47T4vmI9$qM62mK%Kv zOIm?926#y8{MRVqT=$Nlu#<+u#&uA;5 z!@-grFQ{p^6t~@rVkLfli4s}Yja(7auGwTIK7W+hSUsI)XUY|t_OQ_qJ22!4KCu~O14EHS7iCR5%tV}Qm&p+t}MBgD_=fy#S4P@RE|pcp!&== zDtoF{KG$fa&B6aVhAYoC9 zUt@E_&uEH1x0%V$NNNN zytH;Lt*vX|u7@f7R6XzaouUZ`ShZ&eS9!m&ELX6eEMPrez*Q_jPNSi493+p1_*tCPr=P-p<|^l7ZoiMF%HV>Mr3_A* z9nP~iudS(R;6I~0I4UtRy*TmxhwuPz{N*^ixcn0m6&jmn?&#wan&=&#>KYL1;vdw? zg{m2|9#eDmduv$L1S(d=3D$0dANONP2n%Z|VAK=q#JO? zWtOJA@Dx1-(god`a)o;3q~w2|FynivKWT7{Tm@6El2i|`Ch35fsF)_1vlf<>o}KKE zk!2e+FrlV&siZ;dq2<33J(J8p`maiG_HY~%8|09nyzq^LChD5%#DLTb5+eZ@ZG)j;svurxx2(FEp0Gu+F%0%QD)nPgoK`f!Hv*R z&%dx(7kXH%uIf z@|Pd3hJ_wP_#QfuUp- zRBnJ;9#{XsU%62u^tP)joWqHuTxI;^uPP~8{Cb6dL=RrS=5Zx1DH&2y!X$FooB3moHm?`}WIf1G6aWFsU{$7VFD;s9yzDOQD=vtb&=4GnH$xFx(G;$O{dz z-#UJ*k+yeq97%ChB-I!a3YEcG%j9==FF*dJqz=w*$$6h5(>_GTr~R|x6qS@k7KJ+d zlT%1Sl8xWkeQs;#)fQsYb4IS4$0|CGX&~XMmYVi2=L9=13ASGnY&kDfa$MYJo5-;l ztYyPklllq!9zcslpn?}-c_i?WP%>7V)sHNs5&dnBT$`C9IiAK=<(q}d=a;Ib&sk!^ z5{9Ex-OkFNS=GP6bqML59&P|}`jIB&XC=gX9oo2noku5eDjB`nP2wQuSkHX$DPKN_ zanR=T=hY`pTyb`eXm3yLnGZ5Wh6*lMJb#6^#qI6G4Gg+tyOdN&QBfBC*(5s9V*O@p ztf--Z-yOAh@x$U`i(eJqnRTQG0CqvgR#I(fSqt@aeKN6Fv$z&(Jft93V<2f-lXre= z)z6X@S(?@7qls#_dv{XId%VKvSaVD3_xgNIjk|A9Y*r<{cYXo?jN78ULlQhgQ!HHq zqEj;JIGhIh$J@w;V<*mwTCNdjG-AYx#grH7Xg*kPB-CIe+;UOo{YkN!KZW7BaPvK$ zxguPZ-(rpF`#nU;h)caaAy1AdvQla_m%Oo7WXd3sas8PYwC>5-q^Cnj7pd^k5Iv3^ z+t2unzQgTV9hr1;u$V3rt=USsV)8+TtLyY_#W&Z4dTG?FyJ=}drjaG7Lc+pJ_w2Du zPG*W%x!h35FIfy-yicME3Py|@$Go2TYuCP`T9?GFj-tuF9~Y-RVg!D-_weBt5))tj zYC`95XQ!cy^YAk#2cJ4J>i+d9{`L#%vzJ2kJSdvQwOGg%W3dc4F;A>$@zXEF|IDI|16#=k{l!D>Ju6g_s+>b*2O2J ztf`rafM4*}7@IQs$ZFBb?@;~7RsC6!sxuPF$ArGz6(%P~7>kf(@HxYk__wD*J0|g- zOL)#;*{0|6T*B7o_-(9hmcnM;iE|F{`g6x1NOVwq|4^IHar*rE z-8*r%Z-2+fRUq~4FN=!QbacqX)8N4uGBSQh2~PnmbaWKtI)9d+ps1p}?9f5Fr}ock zNH>I%>7sNC} zuehwrly`XqGg>MAXZQ$-ObCuna}7%Hi%j(h3TviN;izb8IdJ^6gwM8asCZn}(NWLn z)me%1bK*&-guz&toWO;{_&Zl%D(ZPqK%OkkVo8ZfxF41y=eQBBWTP+r{7M9+#0PMg ze2~Xg@-)&JJ8M4VFNWe3WTj~JW@y|=S`T&oPL+X~$GJt#GjesWvQnPLDdM{Mmg=Ev z!W3`hq)BFhf%zOx5qBPkL92pWaxdl16{a>c%v?-XO$Z4ItvPrwflglYN~0KOpOut| zNRa=U&g98|*4FZKg|urgT=>i1wupl4V4J(Mpl}Mjn*eEJX|-WE#14UQv+~fNx$12B zHshVC3MsrhD}ti}xT)XXX=&}mU&{)Phz&{1O)L29|IgI;-PJE5C^pk8EX~-$sk*JB zfy-5RT#DYQl>#4+aH0AISHcbF6f@2XR$NA?dUExGa%Ca`uS8yM7M!Fj`eY;Bh-%Tz zRp_~&GD!isUSA0;h8jPfx zuZj8Y6^0iW1pk67Q%Q0F}h! z4$=x9M$V=oTumS?{nKZXzUz6&)pF7-v}zO7?|_!Qr0pIY@0k*g-MW?ee+@Gh&(7!--?r$swzlZ_NSCW$NS}lA1m&@!qpUVNW}ZOkhc&%EF)Zf-awj#Ht&XZUP^e8>eY5{ZzeFws;ON~N^<5_ z8v>~>il;Mu5lu}tNlE97jmOWP-7OtDI{QwaPOh&0^s7}^=-3n4?4u7K3X6zfK-~ZE zVHkI{j6JQv-YhKC96~x2De3C|(bB^6R~u7Oy4UoHiEU&zu7$c4q}1?vKKtW<`)9k8 zlm{m!Ko;dHZYVi$GiFVLH>a)rXS7_C!WEjWl)6KqgIc}SlH>dNYgswDxxulSF_~rl z;fbnZ|ECFHaGaZ8h)-yOUsUG37dG#UN*cLbHFIFi-rWKo>rs(@5Gxkfv9s#WD74=d za@;5cFN7#mlq=)^23JC%(DaIW={`x^>KNL!(chJC>HroFKDm^gS&vFq6)xco%JLMI|Ie#KgAUyy?%K z$FZbSgj>wbk!RGjiN}uJ;O2t|zI@T4{YLO(UQ+maXrc?T$`?TK?6&MaCwDP^eqg|} zv5-EJoYopW7$O(7#|PHG|Cy_f&d$j(Po&8?bQlU96gc+U_U9bzocXWu_79B8D2Yt_ zkeW$0ojLzsbO`YZjH0uFalYXxo?$7kZJq0BZJ~jlXZ_mRx$kfDguh+pb5?v@QLz$i zJ|_{mU#RLTLiPX3l^vZQbk+h_E?2&ktDqt5kP%(s2JGnZoCI!4n8TDBRzl@E(%-n- zy7Mg7Whz+@Xm!+tzTMVzLdTtkt+#Yx9<#QADZi)D3Or^|uIcFpQ>O|ElP$4JHgAru zs(MeAih(MLyBawTQ-gp2DLFYI5s_{8?m4j8HngT;N|Ob>S+nrRWwf+*CnulhZn0nJ z<;65d(%!sgBebm`TvaR}C9IE=KSj$-7*29zRmG9D!J{Anxf%kI1KGiUG)A#Ie&Mn# zQ-f8$*fM%0k7(sTUVY_sUH$iF%Q5ju5y^Qm@5*D+3(QPk{GXLWqobUCBYh*&O{_g~ zODlL&fge8C%~`uzAbyWP-7lcxaV6G#NyL8_vLpmg{+g?o;(x)FBG}UPSA;7~aqwnNPOc%Ph80k;mh|&)*iL$76N|+Q zh1ck0%0oJ_@`}3<%bDhGzSM7r&}p3*ib@g{t~4r5=%(&CI1Hq_oBItK^d>yqtDwLk zBf}~=*(onCqN4-33gK|@XP>2~Yth3mHr~GdroH_QW%xN7_@pGpHI3T4_jE@GQy1OU z*q}9c4igF&6{oL)I)qc5u;_&Uiv*CAI6MNP1EMpW{9|4H!z;hG zGGf&P@baa#($ysbO=ksuB~~n^ywG$`GVO>+*<}W*pSXJQS6s>V&?|d2a(pe}stB2y+YQ<3fNuFGC)jtu00k8l32EtGy1L5`9I*ZPF`ULz ze30h_1^Tq&I_J0FOxoH^X;BoPvF~KEnNdPnc}IFWvugAZz%+9+B3Ue!-jRK4pqa+b$J^bnv~i^p+ZT`E3Gs< zuvIkYC_*Lh3#hue5^g*%8h2Rm%bj0w_57Dy(RIiSSC)Kw<){u$7zZ_?Zi)}=^;fS} zL`-x_y4zgHUqDVrDq}3x7SiPZ8!r?ZaSQLaxrMAZ)B-Vj%SDUXNx{TKW|Pj5 zyLYwv^%E5r|K$r9JZaMF{Cs9h4(0+cK7ATWTR;ppH2kxof|++-aPJ;-@wA&akFwcx z2^Q?=`X)bwZ2OYY*PB<8vJ@)kL-8EKRo-+c>~D30`4Kgvt;4#a7_J6E^z6@$t?Z6p zEKx2g99e~bm4qufa$<$M{P`7*9{xQVbUV2x=6;SzD|Ghs|KB9aBQTb3w~2BKN^lEK zdST^U&+c|sb)8)gU%ZxkvP$6d$-m&rh;Y?lB$9trEa$u+A&Q?XV;)zcf6bL#H&-^w zBJk2eTqGVldXgC%h zzs=He)yu6T8xcq{$v4iBSXeD?E`aeR5n&Sa0wN{Pc?z4)}30)>)y`np!M-S+H0BVl{34 zf>yrzdsR)XjYlw|m5@$qS+C6g_YN`i42<;-O+vA<^^Wk1h-%@cfq7-0ChuP_5Wh>H z_B0 zb*}0ndBK`Gc8s$I+;mb(MMapF zIGB$;RaFNmS3AgtFHoIDIw>j7on}~@$;VaJWXM%J-2Djs!k==v3e|_0g_YJn?=HlT ztjvrd^)3h%S}a*|tbm8c!=08E4&M(kY;AS-3yIDwi%BoEq{r(#e)7L@yv{Q-2fv6E zuh0~qh|C-JpSE(LLb@Kmv68>LT%hg@1C_w9f*=l&`g7tT2N5bku2}tJt|WfNl>(P5 zRrFVPcj|61?7e7;)?mFKUae#wb?prchS~f%r7LwNIc_qKhQiX7gIToXE-o#-=FAz(qM~qapCbGu zsI&9n!-smKM{D-)KX1p5i!LrU<>h|d7Dm1_q%u%h(7XUG+~cmUnI}&QiHiR4)T^SR zkgMIm-VSY>;p?J;RACv?pKX-0$vh~Y4TUo(SCin~(Dd#t4~hp@@VL@}pkZCX(N({e ztiyqpQZyw*uB5?M^^47dZ5wOrzaL2VK06oF{OEV30bw!!J4)pq80#An?-Q2f7xnJJ zOS|0C@+R&Sb83FkxQ$C#S%(GcjTor9xvJ~QRilwu_Hn`dvx4x9kE>@4SHj=9G7%%= zrNpnfLX%*t1P;iRI>%Ax*qVvuuG1mPVDmCTA)%occCNm2cKGn&5~>Q?+n4Cw{(W3? z#AHaD4)14^qX01!mMkZsux3uQU#~^;#8rB985NO~9JO=j21m!Esi~JrO71l^J!@+- z`S#7EvGHDB-YIYI$?LltCJY!e=5AzUFijN$C_f08RZ-E)_wW6>x|rQJOs6$hE>t$$ z7LhM$)`^b&c1Opm*RRET_6(Wll5xIh0g<5}>`Z-$tdm1*e$XI`azbs9HzQToSxv zDA0VCCsqPK20_A=Q0pZzx9x&pj8OeQa3up4vXm?Nc5~&>i>mF`O4m2_9zSAkrB~mr z3s}NJYJ+sfLg*BTUTtz^$kUTUgP)Aj+M;DtZ*SYbh2z-L9A52KK%bd zVM)me7cLwsEj{1Xc8$(N-=}ZAF~xxCFoRCsrlZ5i*H@f2cvS7%_kKbG)2z>ruXmp} zEvoZ+_c{FvswcEu#m3(fYX-BU5LvTL`7}ph?Sd;xr$vWWsN(Nj}uW%q*vW1T~ z|8b_i{`+F);PA+V?6QdTqL{S**%`x}!Vd=( zRs%wHiU*azPhus|a7H@cNFe1XfvW3~Ap40B=gB|jia!oYak-M~Fjs!GT}o3~#qE^J znUy3VQcyZ}^yvQm`<41=&S`u*!Q*znr89sAr_xMdr*p) z;X#KRC5qQ>)S3^f=X4F>LuNB9t(*NpvxZGEF++Cm9)IP^-j0qv)LdZ@Tn|la$U5Y@ z2|*5`D&!f5dA*ncg_8+a>0=>P*ZV=YlUzSrAL8|hUJx4{w)D~*m zI!>OyEbO>Wpz#bpR6V$AIKwJC!Fs(+aOoh{IYXAw9M;u^tVgQ^ef9~#b0IEN|9~sW z?_60aBwdx*KU*Q}g507pqusB_PSjt&dQE6(=(f#U1XwIh?LN}FT7ARsqu&@-?>jis z#GpQS93)SIv}xolZ*=d43pquatG_Qq8L)Tf0a`Emoz6s`;i7e;Ct4=d7ro)O#xe>F zWQv({_U&UR;tgkRhh#f$hh+1gpt?sT@j7=CJ?}i7qqM@n4T3G}pm8RL11^Oo5#7l&b;JuUI0q+p3oGAc)n2Fovr>@OE~qe_``4YNYL*9S74LCD}IJ zT!Ecb%JrSsF17I$>OFn@dgK#Cv$Cbo)uFPdH8SF5p z2ZnlR+n-#rbK|&0vj_Con?7Z#+LRG`yO;I4x?Sth!QNJ9HE--zm^)5&@zl}PZ^uI7 zL~^il29>P*`J4~Ewy);Bj5&dxdr1DpK1APErkr)5r)oW-XuY5_FHFyElcuHtQ@hV; zy_1#YNMU0JgOd$kQ}ZAWe$Q}!6dSNfRH#Z3j>NWcffN+MZzVKGN!_&Mm71+PftdNpS_3{@o)M814 zjTG4RHd-HZ=A}yS?c?iYMfdxKW4DjsyU;ZL&iYD1W1`g4uvP~-4F^! zIUDm{hVHH{yGj1lxgR)(DOxAFjog{Zod?to8B;J!xM&%F{W^HgobJV1$B#Qwig<%L z9pDYU(v<#`@lQ})rN!9uR3T4rn||ygucT{xcMxn|Lsl|WFM-O1=n0{8az%`&8rjVx zF;H9A?&gS^V3i~5dH)feQb#??l{V$74+N~Q^{ek}`PCBT#?^WD(w)|nD_cnvu7dk( zw(j7+CMYaAC?O{?yF4U1$?5;^uA~_`#dKSQuX|veM@X`@dq`AT2G6mF#3uDIS}yS6 z_n)BZ$yMW7!MHsv-5`u-p$~uS+vTC%>8Zo^?az5TkP}2KR(r?@dXC9hNSa98dnO}UvuaaR z=1t@IEB)UOY;5?n2fFrC(KyDm{cLVt@9R7H)Tv?X)(u;|ddiU_D;_`I>E?DcGV)|x z+_IZDS=@q^?xaa}l%m)FA8}^^UDeUG;d9Q_xI#jLyL)kp6-uEoUgyA>z| z3vqXMcXvmUkPsjt5O<${X3jbH-Xu4He&4s&f7f1FA%u|RKKI@4?Af!24H~Bx><-`) z)~M4^-NaB`!cd*T|JPBmSV70${5xo%#cD11vI>+yv04h=Ek@IdawkMsG5;?~l0v?y zx1Xd)nybN>E0_oS0&lGb+xW@?sqWn_C9HQX)PGcMkOLNSz(MoqYG3~diCf5946R(E zvx>uF(<9BGx3NP0M9K4&#b7t53gsvE7X zS6W&wwYSp;=jpk%hgh-t6P2xySZzdNRSv~!B`97FKKzI(qIvYr;1K;wXw$jVi&V%T zTI&P-)nE{Sx$@}?ytIM;Umskga@AB(J>!+W9M&s2U?~f;;V0cSzin(`tM6@XZILkv zVM#gB=>;yHX!4A`qs#x0E1$3=x1dDNu(W&6Ei&^9s@X!QgLjbD(VvLIBTRw4qgY9D z#Vt9*OFTlh{zHOiFsL^dh#`0Y@~;!6a>eV0D|ujor$L%40drg(wd>PvtMT%o<|l)` zm6ozIM=H)4+dt*;z#6B)0RD#ka9eW7ICRx}6f0RNShBKzK%IUceke&ErgK1H^zi@k zSG4HF3HszR9gkU@9PA=B6ZQ4S7TG(EMC9M*)Q5BBHi96 zM&I1Ff!$*M(%7nE#4m&y^j3O^4XBx+tj8{5vr@hEJN{m zLNztz5hJwc%^Uj5FGE(W(3(D7L0g+3rQF9VP*l87SV$uz3dtJ@Z`Ri@zjkfFlqsEN zCJW`{CU4)qzqIrqJ}rndAY2BD$_wRdz?YTa6BMhZpb#g)obQ>6Xy!DKHZsOUdF?{B zRzhlf+!_wThk&3#AYg!)D-R9ev+upVRIXZT>!wCO7Q*!)=1La6S_>ZUIB}%5zEPA4 zL!;sXVqb-)i~^@r-~kJQv0E-ydu?%lSqu$2Y|vyL4bzI?gH zxN$?5EZG+qcNbSU|Hg0WxWnG2da0r{Hli(_1?3lski8^$D&{KuFd>6x?30_PQY=>-DO?%w zV$Y!4aOhX$tf4Xq7v)=x6j;f^Xd$lDfn9H!E8wgRT>Am{0l*Wc!l5`7c9JYy%SxRC zGUtPr(7^u)-a^&Fqmn=Uif);#*aB*{frcIEHu<(aI71y~o&0I`PTtGdcwfg3{5pF@ zuVma{Ki(f7LGA9LIePS%B};yP`xfs8(ssS}H&FE}S_XC!tK50u^&F55li+m3Rq|wz zFcEc%#*6_mqd>%P5IPKP4nouJ-yd_O4ZQjQPfg$kF+2CkLn>G801OYiCO}I<%oVVZ zkGg#J;XjQMeezBoe&MO_;xgaICZ+$EIK`)-0=|_?fM0l$lYhLSwfo!8UncD-A%f?OfA>dy;y(t2j{^}R$(jL@X#>9ip_Q`~-LPB; z(OQG9^Dc#GZ3fj_LH!PN9Wz3UE}7D$Et)R+GWzqFu}c`UD;;kVzl>`Xo9*m+{ynP> z8#ZF$!nJ*A`#~q{XV}Csbab#R?`tTCCEifmA3~lh6R$xUnF5G>9CD zb_PR-cHqieo6#$`UchBxop(v~7b#q|x9g?(39Aid7_Q6(jYdOHZ+?}VFZ!J5xWu5? ztcbM2u=uP;5B~li^sxs-dWI(3dPTYiMwGX<(a!4CyP`!$wsX?=cZN!mD-0D;afb8$ zI2i@S>PZK#eD*S!Y?#s=R|u^y_o+ovgqOQwqWru2ifHH5QkhAGkSj*AFjsEHH8u?rG$9@91Bk3R&0p3b)@^zT1((W0LnY`21@%}l|ng0|}`&_D*b z416aNE9}@auvn!`28k2VPZSHef?_oSgyAG8GFPa`fb|OcE4SXjb#RNDX?dd5ZJomM z&r`CXkF}(^5&|2c=dt70Zb*KPv4ve?PH99+ZbV%2e~eRD44N)tYVY9}k?azfVCfo= z{N|$u{i{VOI9^|rI@!sAb zhiORIT=6~goN0sQbN*HW)^sXVWm6$7SvVDX4g`VfMu$1-_yz|}RgJ&*j0I5>K-?q{ zOB?u^AayRtglH`SZx(~RrJ!Irc)tqW5idfk=66u{2Wb2gwCu#fwGY!pr^RC!uoJjc zPBTVhro+Au(VDh(>(AG&N&O}B2|`0zwST_>6F2;}DgX6mWUJsBuzD@3EzlY8Bg}wH z#A5YoHprdCa^+XH9!01$GcfZik(EkiAG($cl-q|nCJtW1@ z+F8_R^|G*N_Mt7fdGDmOT4)EZI3=g4sC_I{5?om@$3My6CPS_$mMcytu3lXgo2&7C zg$;T#WxCwG3mCM%8?5mDkwhxA!#8L-hG-1SbdWp? zq|L=f3!=3IgtGNdb^um4b zqVxFh?Z{sit@!Noq$YDqg4HU$N1GbT5mYT@Yu=`;u7hUp6Pp3w{eZ>ld*rO3SY=HI z>EDTyU@V&i!-p|RFlZnM=#RP5mf)%va8&~?1FNkP8$L>PS&6UHN0b_ixDr4cA9VWQ zkux36O#pY`9Is<3kl^bSk%3Qv1(;hOcnNYrO_N8d>H?sB5+>taPz>2M*KW`XqYLDqcmY7xj0p|ujDwHAD#(b@uPVNTqRu48Wb z3tgVuPHUG4utS(JI*v%Zf2_TI;CJ86)6tQUlbx~Um$k9xzZjuTs`2ZVPO9-70s^MJ zv7EGM{_6b9^`L4+LAut&@pC<`es2Bn6UuV!Gl2H0Bo-M zV$)7@)f@XOs8tb zFamMq`Y-z&Jp3a}ZQZ>>;=RIB9DHMqY@8d|E#@~xpC|vZns~X7C_mM$V`sUdzMSGD z93X4&bmpq{5&8FOHV=L$l`AgIRl!Yi40C9mtGf~Y$TGkPqh&4=e~B7_>U5m({pFLc zs{%(=bm$UF78-`H8g!Y{xAUHnaONn!=xhZ^D6N`1K>zIc*UmFR=3MX^TH-EfeWcM^ z2g){p%1y{_HT?nF;i`?MYbR*mjRD(>853b9iv2h?B__@|cxc&^%d^nAhM>8L#ys3| zKX%9JxydFIb&tV6{uJf69@I>Kcnf}O+G9p8eI2nBykCq8p?UL}nw4l7m^v9GO=KK< z3>GW65`;-GL?Q{|9UQzE)IeOh(p;$nw+W@@)lKzMB`f`9mf9yhA+Vsi;=^T8-1T#3 zFH7!3+j|6tr4~k|C>qe}^ zj{P(z{}`2dl0YnVSpE zak$;xne_<^KmoKd5G~qkEd%dYfTC64(;Dyv=ERMle%Z@}Sr!Hx8_KtWhV6(kF<`hI z0`0=V%Z<^VqggLx$<<>JIGNPotl-5*&n9f*q0|ZQ6SwbLFB2Uv9ur zvE9zDBo1`**cPluvU&wW*kUqCXKQBqE78g^IW5aOB0VhiU1V$``~^C@d44ld$d8#i zcsU2e8{7N32830z&3j?-X=B$fA&QSP&Z@LWuF6hxvkwy=uSnsl=^=TD8J0r+F|!j_ z97(R)pHs&cGyZDE5E)=CgKF=_Sh7syfrV`JMFQWwOKGVnL|jq@cC2JMX#!`>1_#YT zBaP&TeambHwRyv};V=+5ye(i*nz7vciIT^4C?TKUS3~Q_mT3h63(;)YTo$du72xA4 zP`nmY&GB>KD=P^#dN1&I-3%JGfV$s7!#2>k9UX0G{sXk^0Ih$bXp@W`I5rmMYfhOm zc+%K~zyHb?2(DbY;_K@h5P-_p{pQYEpAt4~-72A?!jfR8W#}Z=hsD@dEkJ9)H*;_X zqzmj*(K1kqSm8avpg~N9!LP5la^=xmf-4o^r~+K3e=q@U(z$x`E|1K+1D1zcv@jhTE5=hexPUmuCj`*EtIvi zA3J-QYqkb4^Hs4bM;qh&f$s}E`lGd>_aNXq z1fw+)gpLN$1A-sQOc_D)I`1s2uUY(En%ly**Nf3LxCK9fLTI69g*tPU&1Y356s@UAlDX z`t|GRrZygT(WxUp-@U3eb>fP*3ClnUE`b(^pqh)@%xz6on&nddO-kF0h0<%dBuDBfOl_YDe3%8N*Q7Zeur zuacmdqpxdlvZpIAqHJdUCI8dsHPsLTUI?l}THMtW6po&0Mi zxqUimuz`#_L4LSSEMsO&LE)mgqNH=B&kZ?F^j4sY3|xb)LTs^Qm{e#g-)^b^Yy~&g zF<(tlRx$FbIv%HqZe~YlxoR_Lc?|?UgMr^rbfzF^BnW}e%b2!s?H8xyW{mB$>j(2= zzmtE?DUSL9q4jR6pM^|+E&8vtH>_UWQnVJ7{R+z0gNolkB?JsE#W3 z3bab+D)mFIT>gC?%N2B43I@BZ-NYC1yw1r9j7o_>+d4U}Zm22C-l3<#@6J9b1De=) zIQhjo`^OpBxMvg;(n;`hedE>VPZa`o5uZ;oT$T2;5~La~kPe#&@C=F-dV6Q3_`iXW zEF4bsVX6n@vuU~z7zxE(A(w^bV$~UPS4?8kWgiuYRxjjK z9r2~KNV2qndq3bg0C*1szAzg?w1y+JplU^o2MMD~JhgR?@dtF?tyi8mZDwKEDC64# z&0dU@EuOo$C}kCHi24P5UWC8X%M1S4vHOU`iZ<;cu~NZYDFJ(}R@=bRbg5i5G&gNYHzV2% z_zYKOyyA!7@7Y>e*B~x9nA^s`DhW%@^AG#hf`hGB7<5+7f$@emPNL?$#H`m7FKr=m z5A`HgqVhuZ87kxt;>$ItRG6!$#6Q1u`~R(*MAbc@fFXsZ6+L5v;R>T=NG=}5HZAuP z z+HL=;@@{WxmWr0w+Z5#wk9iDNFl=ORtg~4~L#P;cg9G{T7r4K*8 zeFl|wmTG${jVlw*!}Ux{q>#t+JOsItkStSLvJ`ke2r%l%~@L@T+*SlyXI??b6D%fgt ziToFdDE$@GjXiZpeZ;V(A5vF?vX$@?s&dDzTDEHW&s(={U9)CQ|NiKp+2{+0e`w2H zT%A7C$7J;1r>7T3%tloONvP;GU_4#}#^4MXIh+wI+OgAO#Uw!qv2v4uis4ETh27{n z`?#8Xsa%zP{=6*DlGjEAZq`mQbB6mMt27YZruv&+T*g;g>5JQCmE(4#F)prT6-Nf$M z!~|`kmpr}i+`-k%97F{k;vl-jTycRuuks3q1P+?*S+q`r*TyK^Uztm=Gaa6VTwh1eu8)di;33RR`WW@_l>u zeDG!=szT(7=z<>mCv+VW0~m}I=;AFHpH?#QWm$H_x|WYC(1@W=ixPd+wE8SGebBM*AG?c3qamHR8n~RJ;c}Hem{rlPbs_II-41|)kamQ}L_E(}-=Ubc=S#pw!-a|A$ zkc5g3+|>7+1p072NJJbVZmb|yj3cx<&dTOd-s6Q$~nV;3>&v zAep(3%styltXQsSv>xN$2GosAR^B7ibV%bZBm|7d96%t~O~Rdil3cyuH9r$w5I~LU zBdB>MWI9O2lBEDF4+SA2u9B4M=>UvS%fK zsCd#5zrV%+qYIPDL#Cttfz+8GeHO^TbiMo@)3pHPEJU|!<%s~pff)M{U68~C+KXw- z8MJ#dmmnrRy8L4+{QQE&pm>768NaV46m6vi)2A1P&IPY&nVNzAJGlBwn}VU54ALfn zj0qr>wN((R2vG(cgzP#Lt4_;6NwIPjB|&ARS4IeeDo;t98|msF?&urk8J>RokwI}?16{K!ZEE{< z-6l@@LEOIHJy#;fUUGs=+)vcr{Tf#yx=>K{&DbLF z_6H{NC1Z-8*?_4NN1fR>zZE9ayzlEXRThZX2!o%TpM@)**ifZUMMZUN)LY}U|2ZnZ zaH_V+`7t0t0xFaN2aBQVBvziiB^9>R#Qv=@M|2n z9z+%kp(QN*=Z}-eYS?Q~zLb`F1;>P^6-K7y85>I9)-kj9_6SWgwDs|eh^L!Ep=4QE zxoBQqO??sB^^-k`6?E)HC&`2(1bEUFDv4CsnJW?(8F1*~T9zJ$O3W1(a|MHA^{1#+ zhMGE1ka0Rl_bzlnupbwR798BNR7RMcIZj8}h2gS;P6^30$%)uZciX`NmJh7M-L zDqw)Pz%Es+P!eRt3PQzjC6BnWkptF3VE5otV0V&b5amv^Jr{AsZPXw5U}s2hl*AZ^ zXrIW;h_rY9p|M?|vT^is4^DInh}XArd-<`Lc2@7os(#zIhZnzB3{}rbu<8sIwUem4 z#g-TT1FoLYA>xW7=88tkfcs!Qp&%4_EzYk~c~7_S9S`u$cX7AR?X=z$-rRt#g}oXY ziSH!JhBR8*&2CC}cW{UF;f)X|$P_eGsH8BiAyRdh_?|mbz}GZ8I}C(lsDdRjpnqR%*J-iRz+ClW#L5-#-AIa+ zy-2L&Fjr8rhEy5U*49Yns;;S_f7BHUm@`}fGk&p4hl|892rVRBxEnA53fB~L)lu?y=%NP^U>P&f?OIv0Fk`bB z#vny`bFdYsgZ?XM%fI^)sW|_;PT%b?zo$&@!%II1^QbR={2?7CTMDL*7+CByxU;SD zmCS$=V&yI=R@kvKT*i<~}K`qW2l6~WW(3RQ-+*BFc;j zlMr2ud`(4w(Tt@}sft!!J{L~}ndLwm<*1C6gRJ6gxL40e4$A6r&j z_5B2pI3C20Wh$RB+K$(|awVKMVPLBthAN<6C#c#zHQLOLeLZ`O>nkfk5+WD9hiHG;a}vaA)-6|L zN3JLdt~gS-V$edTR?)T&3=4LX&n8#g_>1O~Jf;o7OsFqqk5TFfwwdgIIb`M39Bht_NY@4qFyjZAcv9gn6 z9J`n+A?o6@q}q(1e~E2tZK@eEq43MRQPn}Cv5y)M_LRaoZqOU+5g-beJtGEJdeL7& z<=XavtpV7m2P$1;M#T4uexL;c*ae`clJi-qTtN|20?vxSkrgXDNwK225@N1kaDmnA zFDA|1b!7qYW5`{Cl`IHYFTI`a&Jwlv+L6JdEn5~X zhmL5uiqO&$qXolPBwT}7;bQ3u8-aqRD{4eTFt=YX`VbdKU74f8bnNg3YL2W5!0l3W z#BsIIr}etIXEcZ#h0gs&4~Wy}Xy7@eaeBi*)KJu^9?>_0na1DC_S^svgpGQTy5}`Y z1?5or<7>1)uqIorQccsP`bgZ~BH%I|wsHcwq&te}7>-o2>cABrSa6&4(?92T$5nVj zG+F+bVz@GqeR<>R+3TXeEw8G!au12kE((iDwDAnL_l|T8N_wDYRnf*wi79UZ%hvx! zyxxxoFMNIPhV$+O`SMK1TIg4}BBYDeSGbapEQ2nR#c(C;z!f7|lGzZWW!DLKF77I;at-+cUC%vJuUscDODiY6xmki0tif8GSt!d5w_!(52&@8h_0q zYc4)d#G5p@5Af4q3k&KEjxvXShAfeNRCueV$^5;I8ljD`<_K?ZRs?P|R9LJ!Bta2W zxS`#G0+z?$JA>{YV%mvP?RnWiBg5 z%Sr)7XSDDU9)y-Un-DcHT77_rgmC$=bopcL>O@ymACH?Pt`*4sFlA`DCj@3_HFL9! zaK`B2wE>tPC~Jvom(jKne?-3_W6%CbbSFxg@g24rrqsvS{T~l{lU5TPJ*Yzhi=06eywcP3983<1F>7K$Zz9{ z+mWj-XqmBSSxBH|jnT4Y(X#J~R_~5zX)(g((~&M{cmgnBK?A=y3+IlfwPoN3duWY@ zg0R6g3|I1N=M8NLp!pdNqJ(qM4JmS~=L`d}xXT4a-*`PvA9U1FE9UVa5IPV|8H!Zc zvmEKo#KD?x%`j2OrE7y=x#Mfld1(b1B}bj!zz0L+riS)wTvdUq3ff|JRt6q|OX~?P z>JOntYRSF+M;_SAiN%VBiss5vk}Dp38Mc`xmgIEDRbts&qVNVxf{-h!#bEUF!-+BC z^A{;uZ@eNhLK9zk1w?p;rRiI_zbyPD8t-pm<}CAY z$r4C#C4(gkqlLKY87(!O5ZRpQ2BS|qq{~wzT$nE3ek@%BFkNa-4>F}Hhl?B1=)tHV0ZLOypGaLw75Oo(WW50(q(Azy zkuoc0AZ431x=)F%7PIv8?gIjpERQ4a#HHk}ZldezEL4an43(1-aFz4FK*|c}GKJ9T zxQHt#Rx(n=3US3p0e@F^=ij+?$5l~%MgJ`5-jQBWZH7ag&x8kxhmpR_ediUK8J1cQ z9GTz|nsQ&yI_pEJXaLcpe++pR>%?63AXXJ;I2i|tPglO#Ts^_NhtJSEt-9aNRY$b+ zyGj<1ku2kGB+DEZOT}o>9$ti&ideN=Q6pT1rP}LfDxo)&98Rl7+}3P#?n6&g#AvZ} z`9Zq0-!GY$bc`LpjqWeL#2sUf4-{m4`?A0{ILk{0Ct87 zbLFH^XGy9vCsX)mf01joW;0+1t^^Wd1)+k$0p`og9lKi;Ry5Qs%QYovy#mI)Lod15 zx{AlIWxw(WOHF!R)%!g6E$lJ*9`^*R&hUJ;OM|K_SCFL_ zMBRNN{sdvVg}AbuNIH!XlFk*`g)2&eD~=SdXvs3>OGp-rmPoQhs%4E;ON^EZLdzLG zJ4z|{WdGjEUon*uox!I_g{QlrN!CPXhiUEd)h74kLolu?0@S*03(_!rI^ds<~HIpt@-bQ<6lN+6zW{Q;}M!_;~rX6RU^uSCr@AG zrtIy$m0cnU)?J|d|HLZvuzRQ=QF=t=QR47?V%h*gTM1naAj2b)PZOvo`9I`})4gP| zXqgI`=m{-6LCanlxGSXn&HsHKs#o=vQWWr6&kWdS^-by z)dNYf5_WX#EL6x}!RXs!8(ESieXFp!`SL4IqV5UJm3-=r=O(6YqNC6sixaX7LsJS4 zox0=}oap2o_OY7b3a$hWA3en_IR5pOVEJjP_8j59tz#EoN3Pl*5iWlb6Z@j;03=UI zsL2sc5XGlGa7A|EiefDm%N2ym5QlLm$?Axf$Y@#6MvERRO{0aH+^S9Ze=R`CrJMPm zoFSUM+Fg62X+J11T3&tHJUIQ)B91qCsAd7Q)@WCyFFL!2dJIThWs+Grvu~{%hRwgv zD`UDupm=^$e-PS_X+`kUZt{{pu@*1=G_`=g7TTKeff!S2$Z-i)OxI{}!$iS#pF0e7 z;6wIC4T03KK8l&T(5NeSfl2{5$OA{YFNWg6yUCs|P%&b~?s_6DUE$kpMK+;=Cwg)9D- zb42`+ZcTgT9b)OIZsxQOf?7)3t*>#VN3}kq8lO;gx>WTes^T9`=>tyj-<-EMIq8=; zLB~0U+cH#efpP6`%SUE)ob0uWCVl$v+C$WMd(`I_NI;uOa3_r&cW&hB6rJ48G%*COFy;7&R zq$DKaWq9hlEBBtmJZS44{IQ1NssZM~Qx|yej(@%Dxbh5@zLzMw){VJ(O59)FZOh$( z?+IYgg{x`4e3&`K6lRu9mXAL1nX`&O;Jn?-fJ_Q@yQlC?fW2*iT{d5gxW17CHtRD`Y`sfX&z zr<{K3SjzhJF114P#fCNrk^SpO^aYjW)qJl*=)_*K)=Q#ep-npZLbr z+gsFtml~RH;EVggp;MmxmCe18kAh#vTP@#^#BKb7^|RF(s8D$d_v!ia*34kO zF{>j==nlb7N@b6sLLrlWSDXsnPY8kCSH%jwLfg%DR|d4#ORtU^eMun78NHHEylQ4? zE&3~3ub{u$b6CeGD$Bu(@mH027}2Bq&-vb4nN6G?xT-$G4gHg7x!)~UtJzzU`zaGo z))W5wC9VfM&r};QSA=w~jEV1ueYM$`ytsnfF7{d-(K3-h%Zx?KS`c}j9LmltRS*ho z4#+o{$pc&3#-nJlriO^GAXh5X!%wJ_Dn?5=OP9h9hg6X1)#%s@oqS}DrwbWkr}`-5&w`(q;OEb-$g!u)rl8OIZa#C$|kh#DdeU-hup%?JNB`-HNJkUNJy-4)CssVhlj(MskF&E7% zIq9&i!gP2l2Q!OGrLdbg-@))wj=D_`_2O@utBSaC!G(0%qI(K&Z($^8|5C+9YXxaa zB}-SUnk=}xe-OWdu)pdKDiK$3g}AReqOn>ESIv!0XY;)YG^fRwYB%a1aM9O2Ks;3W zLs4vIL0IxzufTBch%{q+ue>kJkgG-je7r)Hum6n5>G4PxQLV!X`GaWfp`rZ=PIk|k zqUb~R!14f9HVKNkBBc5&U_ch#CUdS(wU6*%5Hsq_ePW9E=3H{eY)->7Nv8!XdUyCy}+1!)mP6Y7kBV;*FbH8Vd9YfEIX-_) z>k^VC!M26?`;k*AG*V@pxu?9V4!tnpZ=9!t9J9FW#KI~Qf82rHdN2ag9|QG#8s32tVc)kbHoR8vR>zU zhNs13zK@7WwD*a&_l`<=l_#3U@TH+;()>AeuR>2;Rh{8wO5MciW(Q{hJ51x)0xV+R z$Q2AdI;i@`+Yi#MA7dE^(qx#~}y8~4|o3RecQ{Ii?iucQOg%a*0NvpL}JDLyj9bbtE}nDIkaGl8>4m-}#pG1C=7j=mblVkT#!BB6pH~E|>buk!Hltp~GMdAHH zVa1c9dyj~xbhoudCujLYXZuH_`bB3t`^S2QrCK_9m9;TkwE*z=xvA{a)u;ul15};3 zI>oEML{j4!Itmq5#~3t9*& zuIFJwQHJ^5_EY62UdB7EW-MA3ELt|aOKa#|UFdQJPDgNxvB674d-;#gNmY3~YK<>r zc?ee|9B|NdxyaccXZX3jMWvl4#2GE$PBL{oS-m~1S)#*3-h=5M7MxwH+~T0jm?$^- zIL5bgCJ&Z>r>Dpk6R?$XlFiW-k9|wMBU=5*;&}@lp+a17Z4MChVSFydxxcArt~kI< zyV)+JAWbS)$C9mRu_A$KFYl8k&rBpoa0kbvhNpiBjZHDMa)Wy19g+UT*tW8b$%D|Y zC1k!HeP}hKS7p-lsscy#8E(j5-;@MDT0~cOXvNtB4vtuz97rYRw4l)HkVF{)hLg}+M|?~*>>}ifCCWyEC~E;ey@kV`oX6Z< zMUK+qy?wv~);uWAz=jKKxxiY)6@{uXwmWicq?)U+H_1c|T$r1Xa4A&tY~`=(J6QUP zYHN@1sEl`}7AU!Ug(SEJ#(73$SUI}YVyLR{s_==Kxsu@qqV}xxA_L16S#gFJeUPiHdHU}Ad#^=hW-jPR7w5 z6>YjmS%Iv}DJ8^}BTk)evd$-&WH)87!bg44zfwSNJvq~uZ=1JcfqcEC#G=oIe`URx z|LChStWtG>$_7^z?D)Wy`(TTxc*t=$$j!XP2|CR&-$gy#%!$6p1y&-l60{hlyvge3 zJkD)etVm#?X!NJPfvM!*M#LqDB7ES#nM;7jJoF-^E-1^ciX^**X)>mf5U5QS51+)E#E5$ogOj_T&e?OG z0cc8tPjHM+c#3;Sij|XF1Itx4QnsXtk9JeVC%fgU5^+UVpXKMDB#W=mR{%)k%82O4 z_M#kJNHjnCms}Z;J_p1N42wsR)sI-NI!hKM=E{_cIwNt1ggm!Ym&=wNBvi|c-)>6I zX2g&juF3!K2t#GTqGcrrJ1;JL{k>ThI%jmK6Sc|7wOjLVZ=zEqHKLDvqb1v;f&y_> z@RVeiqTG$M~SqNR$gIwtY)>7WT>QnTXc2-o2!N3#iU%u&Zw!*>9 zH#+NMNJ6%|x4-DCK6-2x8lT~cPUS?W=HyjluAqniP+oQD>SdLL<2`eQ(5liAq#Y)z zZ+AqCT@1E9A_Q!a;m#_eRrg!CBE(!76X$;tmD$OwE67&54lkW67A;G1_dN0Ianp2e zqdw${E5Q{GYtHpG1VzzG$Tj|pv0HeNh{Kw9TWsxkhC8wKvc_R6Ouk97L*4`)C$Xg1 ziUQg&xe60fSx(fq$ve7CV6=y`c$~PH_QN=N;3kpg#Axv?4s>|-W%=S?BmF}y9xJRd zW{DCTbw048)=mF+_iU}1ys^}!LfWXJriO-nxei1V{DniVOa&2VkKel9)Fke9sBdUA zvh|94`N<A9 z>I%_xPXaBPtEZ^QK(W$ow}XZ1>s+yD84%0Iij$!GK6+<|MN0}-6w)grXz#^O!M*j| zRs)(V95hsB+;AO&-7%zAOyoBh@>#Cv(**D-qqfWvr=)*=mjMoVtbvWN!cbI1rG6NP z*N--mT+w(?S}KwkYj&D0E_8!5I!h8Is&LAb8j$1r^}qu6<_2M_rJ%#o&kC2*ZMkko zCGVE~id+p)o8Wjd=cDut7+01jlXr(i&dP*S_hQ72?TIl7lAqw|7aW^i6q@wb(?6`! zSKfW>QhY`(Oog5S;RRnxX|7P&p{@PO^}9lst>|JnX{MctDimb>IVxc<)%c+EVld^A?jqN9|P6Mlyj0?k=<}bl{_GZihErsqwSn_LrJcnTj0LC zN6s9=<`iXK=1shDX4VlcYjW{e35ggdtT&OVHWDP?Acts(XqS0?UzRyXEDFR1vf1-S zcl(46?*sFlM5(-U@a>L>>&cz|t%edm{yJXtNfKqn?kU@IF0Uc_s*svWWM5Tsm?k-K z0JUf|xp5|WWC?ZmH_B``<$sdOyh(l19baMo>TRx6sHz)k=O#QPFjNpN`M68x&R%S3 z6<-EcS6A=i7ZsWD(K{^J)EIR>=jP_p-{Dged-ygY>7{o>hK)yPLPmCFdwVr2S#Ju9 zX0BaMW*=nGs_2$07@XSk!gpu!h*8l|K|R8F3)7aVEJMVc_?KM0AhR!_CK>uMcPRPg zo&;3gp=Ctn-6RHx@3o{JZRE5e5o5VB8?BUc$_&=`xFud z(c)G=oBijy*RMJd7!{u!nw%H^@{^BWkkp^i*ughC z*_ErpJ5b!j&%^fFoOUDJ{9ugM)P?uRA0<@i!b3}P8AAm{ zPle3PAL}k*CsU#)Rdcwz7s<3(iV^AX5NdAoW-r=Z58WbB8o9z~qWasKx&vFH$y0!K8(`Ukm ztEsAUQq7e}uOL@Y*2rod{+DyyCqW-%fX?LX zPb4r$Wl~g~Gr{jLT#+5PGNh^>6QeXGN32jbyU>iC76anb`Ye<>lA0T)}u(Qo8ZfK~B`pZ{dm# zs_vX1>nK@!hnUX#=fxw5vb)`E4oYy<`h=){Kos90USB3+P7(XQXS^#sc3P7&Pe}#3He;R0|H== zTW+kR1q(*IHP7ZC+6huuAjfD!^Dk^Rm&%V6qQqe(vgq9;zOO^YZAXJp7ANZF=jHY= zHzxgK&ajvFi8e$0;x*$ZU;b&=w%W!H9q&~&btaB}Nx5bAZhmobu{|#h!V|LmqcgoD zGYu@Ai)(5{XhHdkj!Bw*dK>lTFyf~>u4t(0&Jqphh^F&o+eKdP5poc_AX+sJ=~dok zBI`Ulm-_A+(f*_}SM`sGOUp&K6MlUyW4x7Y*OMk$=H!)?U-`%V)i@!ixZ>gD$jo;_ z3(-}j2OV$c|96-s&;6(XI0(ce4p4MYmje#yog9TIY`&Q#t1iyGJE$zWhsqM_yj+dp z>>_jXB){%wr=dr7Nx}3C`06&G3s#&jy5o;+N>1v~;n3XNY;5Be|K>|%N{*?84g7_K zhDyIJ?vAc8e0%P;URYd)M`)^BP@;=pNO^M$%~dT%%f-cO+=WdFWmkx*Q_{Jr(IM*3 z5y`s=hjoPh3gX@p;`D4nMTWg=O_`W8gc#cgwIZv@p|qHDxg%H438$U^s_sHQ-XO^p zDQU3^Zli{ zZ=LjiwR9}!)eSr?)0mCUXmLBBWzMTN;C^_>Equr;d&X}!=XW?MEDFnS2JBz4)E!RJ z6CcJ2W^fz0=#wpfx;fe0zcBqvb$NGpg^M1>QEnrO%!yWgyk7%l~m4Qe7;%K)Q5c9xW1IdU!2Alcx`AT z!IgBhxDu)*W()_rVC;;RWPCegeCc8NEkt#cDGR#3+V}ON(}}hP@85xMcr-URT}iN4 zEPp}aO+chnwaRRuRn4pB*;Do$K z&t4G!@?qzJJeaLVs7p|ye@wPdSi-xqiUtf-9gao-A|n&l9^9#Hw1IqojA%HE&DB}r z%KUHrKVXVHFpa7>!~J}U^Xd>c?-V!xET{M?C+7lr_QKF*M;|frmuqw3krI+w z7H+IEBY_oF^;Fqx-`XR4qQhf555KCc4vdHkNy?2#dv9#%aA5a#RH3rB|F?8KHn6mD z5Ah05_YO}Bj?4H`SKq*L1p|KX?@PWsF*Toddb7OycGLj~mw_H#YRmF`qOT$`UV~UP znD}ihvHv^b(mdkfPlW4l#HSNz+1Q9yj#SeHs#1sgbb=~5#VtF}E4{#ff1XotmS1?8 z%)LMqT_=lf;c}=E2@FwBG8*qdlk=h*vL>wwe(4MOH}}TmK3|-szdzqi_f?2faav?WZboT- zN%{{6~+2CokB#hrs2bXLy>KqtCm~r6RQIv5l{3ZOzIr+^2JXjom~4AE(py9Ic%Q>0MW5VqB(LM{6g~8#ittsBYc)&!9Sa0nzASZ*6Sn?H-aG zl#rum;g*#Brlzf}9&=UC($x$=NL=!nGgoHsTsP2hx3J(O2@$Ho{76QfD9-iF6;v=B z7f>{_(Rz_+Lm}IKOQ!v*eCtiQ%1a7a$7NFvD7-o&pLC3qdX$%ZlJoHj|K$~4(QSUS z9>3L)*J>bWHR81DlW>{Srcc4Q?FLfOqW%S1UFkyDh{_K1sRZ=LHgkTf8Nb!MU#sh& z7PlF#0qU)`8m(57+dZb{o6SmnF+Ah%Uo#E2CK_Cgx7JJb2+B@MPfDsN`2zl@kM{O< zh+<`9okK?G58=8>bx@$ps3t>R=@T{QqmwtUIDY7KYW6EB?yI%+b#A_sHyX?ykzQ!! z8hGLaI(BsX&OPG4cvw52`Kvqr+zH*glYgvFbhfd*zk_E$UU5lnTU(O^TCMniSXOS~ z;|KcN_UxN-Vngre8+e{usQ6t({$Vsi1d`Ko0n>6$f}Hb2GaVPu--@D@4hAG~v|nNZ zh~hE(g7{oZxv zV`>~{RJcs3ah_S{w7%AVbD`_5T-RNNu2%{??`3<~zX|crjn8?T_bDg8_1k>)fAgrR zt;w${&ZsT6ElS$`#%^H3Z9)D6D*v7!{)(pE@$YWz`Tfto3?A#he)Cr9KQI1N5)>Kl z>=&JwTjm#&ZD8(j>i8kZ!z4Q@uiuX?Pw~^V_fNcTnB?u#DrMYTidQ{m&};9Oe4%<9Z(u z_#ER!>F^V;@RP0zn7GD7GK}jmC-Yth0 z`tFvFUhY1w?xB7G>50i1i79D`$*D=n$w}xDpOg@nln|R39~~dtDWc%pr1;p>BsyY} z6VS)wVq@duva+&@K7K?|R8(AC{OJ=D=uuRZo0k`x5FeeA;2Pllf9>5_Pa8)Z0B~OV z*r$Ggs%q5_(dWLlYMLqsAt47P&=3yWc#VxOz=Uw*XcDNRI;0KZHa7UeyT-=1*Z9Eq z`X<3ZfDlLn0g~G3jCbwOh)AtU(}(7-pRC!P^{zDfYdqt%XMdLTiGICV-P3e_;L4YG zIG=W&`|x_nN0&-JX+QUcsH&uuBkJl>NR)nGXnTAA#fTObm-J>_sdwm{2}fjAhT5+8 zh|iam!k((Vqv$~6^UppOb>6r;Ad_Oa!ss8-;QbT2+kKv!aNp}4yHgW=?9iv}7MyozXuQ`s; zi`mR#4pMO9&q}~fgnpVqt3Z&7YDNvC0pT_^2t;gQE6^ZpWeG(90tj02L~jzlp@rAh zartHsjmxj)aOpgO=<1KnUDsJnqI!N4sAV^|GWkLVmk-o)1xy|QH|u#qrT`ouVhWmB zEv;v2>yA{EAFeE~YH#iAzkj*6w_hRGo9)rqTspn9zW(&Zi?`lxPNe3>Mq^QB4 zoL^j9Us~UI{A_b$dwV;RA=9RiIlt#yqmV+c-sj9aiA*NDv$M0gwYBl|H(=q>irMZ0 zQ@nu*%;HVD;%nC6B8C$qDnrM$TL_K%fxSc`DSC%dURHLsTiiRO9Fk9uPdRlnQIKHp zX*>57KlRCbN7N%~!?@NwX~d^-k8PIlMiTCD)D?=jb3CEQEG6m-L;kz~5ew#oNRc=Y zCPfn@A_gRZ2oO(2Nr_YpNJ8;sD)Am{hq<|j=?Cd0(6BCV$c%eT4nLUTNz^7O=CB7A zyr~U)cv9mfhC6IOyEAGS-TX@;%eJIgb?~SU4<=UR! z!HTN74-O(94)_}q*ug%3y!ONw2w{4Y1$U3ivA)qsFj19Eno&DpaK|;)5NeNra!v%r zBN!zLIigx92F*ZIGjWPD4(28l7o>M3DQ+M&UErAm45V4$0bnF~ACgSayvau~LuoLg zAX%UVOW-wYU=e&k>}3lsfkDU~j{rLme#0^e2Z(*G`~&-+vv5&(U1HTiEEDq^p4f_1 z>oB^AVdXSxa16^-E|1Ua53N1f*xcL#X=HS0 zATls83NJ`yX=iA3ATl^M3NJ!wbaPN;azk%zaBps9Zge0x3NJ%%Y;ST?aA9L*ATLB^ zc4=c}M{;3#3NK7$ZfA68AT&5QG$0@#ARr(LFGgu>bY*fNFGg%(bY(^BV2PEBnJ4q*<5E2ry5-=+v`@S~WlkQHZJH2<`u6OV4?RNTh*1k*S z@cj|Ut-4+HOVwBP)mK$tBgiNvFeqrsLm zRu0g<5<%u&Omb!Di}(Zakq`7>&L`T^&Fo-Is&f{JnN4P^Z8RJ<(2I|?sUNvARGq=W zkf379J6BTK>00mEi!)Xvo!q^1-)G+!jfTSpQh$y7@vtjH@sq?yKHO$>zf)AdkqwOb z?PO^kTNgRZkB2%(!(jutOOQ`p8EVOoSXy(QGKHqxhae$SnC93<{^_ji+)uWT1_SSg z(MX&tM|&7@e?EeokH~kwg>6TW^(FHe=7=E6N~At|NeOJD-~b=E+QU|jOuDX}i~l&; zOL=b<@{C4zbQ+TwlT*l&4thKcdHL*3>xd}qyz4(|B*(li(Yo!u?Tu$~P5+S6v#eW} zRml&(9Ks~WG`mf4bnx@v>^)XJ0t^xa8#wY+75;CVd>d zt?NOFWLar6Nh{vorWl?BCz1Wv$<%(r__DqEKct~}FK(Rty2JTmbpHO{M;RZl?D}E4 zhi*9)5dQHFVEbv|GOS z0HJ71+|QMr#P8Bg0m#M=PaS(c1X=YJs971jWD?oE7T$l|ku!PC3p8iJLN!9Cp9?tFP_tVSE<Z99rQb&IW{;=F3a0KCbJnE{;_}Cru(M5p9F_(QV;wcx9S%M`KzL{!tV&fW!5zM zW#(q5%{`YkdC#GPyWG}N+}?vUawyjBhKStndh%_G5mX&IaB%P5{eyFVuzqao-6g+S zzI5rba9{4HkOW5^6KIox|0R2DO*DIHc=*!!KD$4%(P000^LsRjYZ>5Z3m#j)S{A-A zbSMYn&yLUU*+i52jYk!%9kQE)rA1F&;CDEl%G&UpG6fySt7Gd|vloR8{o=z;JuY48 z?My*F$0$`W=SFzRe>!U^IWALD&Lyh7DX_z1)ch&K`eomAmT`RvjVbvlb@H?1qhb$1 z#eya`hry8TP8X(YXqfx_ozv(kcts`5k;jgV-hGem)wLYIvR|3 z8J$GLE|BFkso#3kB}YVQjq56rD9f!rovkshv;-rKZZM01grz$RDtVAbM_yG@>yqd0 zIk{$IMnsb<#aNf+OcGt9!N3kOJ*(gA@;OyKO_RJ;P93!DIwBGXBCZs7>N0ZO>JjhM z4q>XdZUEEaAf`Ex&<8Jq@~NGv4P2TdEG z>r`wwt{1u7&Dhn&-pMa|xKCrzgiZ{%;`J#av`XFB>Udl(5L6ZtATg~p7~9$LkS=qV z-SrpmDfb2H21!hso+NJ6CyOGoRm7jbCa=hh&uRfT2o9;-i^BLCTOR9G1@2NmoZ~f* zG*M?ehZ0-syW=j~eJ=X0mVSdyuIV7#qr=;(n$6k{!lFxV58Rc(uA0ymN~K)AUuW*O z+V>5t%7UEq#F)fPLO){Ky*PwZ+1m=4ddgj{=9p`63HIWk%xukvAwnR&9`V@3UTI1)nT z5N4H@yHIV`;tRNfP|SI8G*37Xec+Oi?H#9Jrc%-|MCD zIb<^w+f?=uS0as%kCTYeAvnI{!MW4brv};K_K`NWxPE|eoWx(3^%?Z))}l)y-yEm; zaDFy$&DVNrrRwa>AQD~1e2K%)kLtzMGvP!MBzY>fqIl2AI1Px#y(k=dzbMyw{Mi+I>sRcNwSCtZ=y zw#Uc3)(??L5M82ZRS^D$p3e5F7y;pefRBUdT!QEtyT`6QT7dc-uXxUZq9Q@I!&}u< z7%3$84j|-6OunYZTI`#%xjTL~!=2sPtHeo{&GIb0F0ZdV!H6GAb$(dJZ%y?M6dGK`i7PsI-OLyDEg6 z1C6%t?%IkXq2>^lkgb8qv!HGdRBAtdp{%Srnt9oVl#OgraCv z%!P}Pa3s1H=xG`%N7{u;X=&*h>2=U?q}I7_teC5>W{^U|!I%AyIn=8VN$yE6y3>6Y z(OQ+3kz14XOI~iR7srnw{NUINXgN?}QJecmzR2<7X=4-aZu(LYLy1;$H<}+Qqu`-a8=sYeiPF+G&Z+1 zHyXS+2Kdmi{zg5vWW9z@=Ft}}XJuw&WM*aOyAB=q_S)3VEx5=kye}4kecWTrD5O?M zmlzYDoROK4o|&CfSYB6ArZkY}kXy+UwU__9(Q3%K@{fJGy#$dld>rUpdXG#%DPnb3Lv*>GJRiA}hDJq_niOq@vB- zueazd_Io^LomSPaSN5sYni6l0O0GFR@TiXJO2#imWjI7>MSXM2O^du)*6FyvW+ref zdYw*ZX!gD(tbK`FjM*NSGi{Bzr8q@-MQxJ|*XT}@rdQc#uQaCD>Wv1SPOsM+^xjh; zkOpzek>F7o4c?ndt7;pGVX3X7ThS+%t1M;{X2UE7o!($Hn#>l9)r$4>dvWxw;}YX( z&tO;`Mdh`P#OT`A)hj1dT4Tg8g1|%o-~@zV7-pi0&~}W&!{Gs$p4w5_KtRYk2nHNN zt1|%1U@$uXa018JhIM#fdDe0mOZ63x>R_#eQnYvD49Y$YuF!ZxU;uLUVxo|&s zW9~K2`z)<3t(|hELa9<~^@KX$4S{ze%;tSp#MI**ovnQaSH0?a&x&X|dhia_ryd~2 zRuicXHk*(8E=s-kvjZG)1U7nJr|ri(luAo>>}{KXK8`s4*{kR$ zC=8@p+eRNu#-0u5WpEw6=>MAojJ1QT zR^03uM^o4(ayt8iRkUXnbp6)xQs5eLKkFRpx(3Y%*tjW(898>{~)jxr}L@aaU431#nuZU!eS;hGMpwhbr{KXN;CdSl3cgSsBW`A*vy<>AG zVAHi5J6CK@Fv)~hY}>YN+qUgwGO=yjPA0Z(>z$|S-FrV(_x^BKoxkDiqgVG@J&IK~ zdV9EYJ5NSmp=jg_$}vPZ%(J9hWaU}!^|?UYxZ9te5afKA^|92@Tpv=`3IP6cu@<3S z15Zz(z0eQVz&SEE4HJS%Pi0%_bx(Id7;%FE(wt5@sjJV%n>|iC`By|kn`U6nfI$Jd zM_L0$MV&y1O;+}iGpFI8YI#R#M)v*5UlTN9MVr}syQB>}Cvc&}4d<7QjN^jFYT#a0 z#z{uVhk=+Zwc(%#NWh^wq*^LzT6?UP+KC@VqY`g&z4hLsqp5EMxXm2O(HA?Bpy&OA zp}XL$PaGiN_!0Q}K;#!Q8zL-xIKK}6;+$hJaQ&}X<_5z3U~uKv=XJx9a1gQji5mQ8 z#}LrFqn9MoI3~ai7N23~AOTeA6R8+m82*k&kAXFt!`R$mOWQu@j`D{K+zBFl3;y9( zL?mxZuol8^AC$MgaXN=Dc1Y&35GOzZUpKBR){ZXOzTOU<{JsAG5^ozNufD(4{*d}o zA3WgZg`J~&2YT2Y&sYOqj{PBPI0&T???!}de>Z&$4`G%k_xdpQ5DEIl^kP{%^&STN zWVm}SwT}W|?^%g02e^p@pCsBh)#vO14xf?v{Ox4|EP#CxlHsI$Fk{Awxrc#jj?~|0 zjPU{Nogc8N-NQl8#Q4I{Zxg^jw#|D8o^*5#K~^alOx13az(0(f@wq0s4`-vNA5+0! zs0v^!8D6$%@(K;m^@cFjhx7pZ%?VDO0CyTSvsiSa`s^9}R4mbP2mBk&#Nrr){aiX< zCw~;e3C_^l?EU^xZ95hJ>${4CNdhj9I8aBiUIw9IKY%sFIt(&1bge|#P%A+%u?}A7 zK07=lG&_T|b|(fDJ9{P;VCqNxzbaUX6Pl=s%IO_-!d2D$ZZ_J0<$yY=3%lb+ z_Ay6jJAx_hP9b*P%>(U&x6+ZZhmre&cUrMu{s!-?#8@-SLBytv?(M<)&vAmova^A* zha;nFHQqRVq_AtR0(eBn4FCNQ5BL;gpQRlJ&&n0K^>)a){@J8cID=x~Y$Ld_{S)sR z8!b1Oi-OSx`PmBILtykHvg2(J+YR^oH|eLQmbRgEfxrndg(^*)=f<;x$d@O zX6RSryVpUyCN7uzwn>SLe~`mp6Ql5YzVP}^BBF9fj~^=j_4$_c{Cv48rM2zzjU)!2 zfcKv&9wX!bQt|$;#>U9Z{9kKqMH(7$2hAwHd3rw%BoM7DLO z`qq%}BNk|*V`C|8yguT$bE#AnXdj>O1M-A1$IdvrIY$9qU09xWc7k7DuTQ4WYzZDD z@FWR8w=TQV#`!Vp(o7tX$rIePJo0?%R^d>JzB+8t;QjF5rZBsglw)1CZG5{vxquQp zKLSZ)NR3fF*Tta}a_3*yg=}`j(cdmbU&_~oGx*9v#a$)PeQm}HuBdcS4!eoWCybd9 zuUHkX`0m=Kqrt;xktTPXPb@@ml&-l*%B$BnSli+~Ij;Md>ii&#{H66Q_we5%c}=!6*8EvpIZrIi;5 zY^F>Zo6IO;BKw9JLrD6`tw(Li}WJ8Ko`*>xG*2f&m5EAra=g^5w z@qHDk+5)4K_E%0(TJl&`>!6C0>9Jn*>TsyAJ!E|IglDgMZ9D1yz5n_8ArivD zU`R*eJK-G5%gaY_r=N3{2*h2WE41#kvZMG-rycMGsth-T>*TfviI6g3@Cji(;9;bQ z?ULAU`7EdYgy!BrC1XMJ^>p3xt|y&JqDeWkN28)%TcLm)20@j_5Uq%wfH_vIJl-5G zg~%^|a0We}j&_K+pus3rNmosYC!r0;_Y--Mf%Sv+cujGoqD0-V`QCdJG!X)5;_dD6 zAD(Q>@l0<{!F^H?mu280|M~}p#{Jr2P4s>Z`J=W!8>qdV;kh_t$cQ448<9qQ+Asd1 z6;BLyp9cNnllkv{?>Ux#=7<1jTc#frFll_{Ta1sSlFTxcb1z)+nN(&gDXC=J+>-Fe zW>fSoCE}fObxLtInnYe=+K_eVQB8OyfP_zIZ@CMS5~b5-DyyMKn&uF>@I9@ z{b@<0dG!j2%5u6n($x!6k6ci(%qPo^J)yhQ*^`&B9+}VxcVhevF3Z+)dYUHQbKu^V zZA1S~uQ}D4tDxTQH_6@sJtCn?=d{2*#hRuYR`fJwOSMCBks)+&3tFmh@TQ)f-Io(7 z`ym+#09?7$;tJQe~B~m{&66@ATmY-uoy&xSMwFQ7{ z!9Bwah2^}GoWsh5_W`zfR{akx=}k@-ywq>J6~i(@k7Y*kes_O@&ds+Si^Z;i%Ir|; z>QM3KX9-G+-4A>mixU#?)T$kR1?EHXhQhDtKj>XTwTIThg(8eXoIjboY+F~%Qrv^~ z7l~TO6OH9e8R+=${`pVIa^p5@mb#cLtVr%`yIEJdZ}2lQ@+R-#l=A0k+LpLH2%apR;;0U_?-Lv?{%w%S7wrIVccTS}i+p5?!Zpv-H zSz!q{I3UZorq#C=LXVOYzpdsbwpnWG)i!YHV`sTtK`L%JYNH5`N z|NA8_b`4Zi6q{DvjtT{xAMGN#1K^gc=(!94WsGzv^m>iriQGoI)y?8D0Qf| za`1VrWqDd2wt_*6CrorIQCbS3yF{dl^B$HbIN6zkJCI{B)A}($Oa<{9Ga1I|$`ORD zO#Jivs+Xccp3C0jxt8fro=B|0OHv)Cn9RSI{Hs?LOe_3=U$Q$=ETALWZxJ!{!YU9B zFcv-iZEvfu(9Ja5)~%7Pf$GY}9~>EST0}ynvzhx85pO}f|3F=$orIw1oZOaUoMESH z_ChH+Meub#5nRp?$TlBt$ z@~xKuV}Nne=CQ3Lf6kJU!4S#0t~X|Jn%7ZTx!Dz_&*H?Qj1&hv_>abgSO0zsQt!BH z*pk~a`dB^juUr*~g@T3P_K!a>f+$s7%1ljFxa=kKAq*DXI@EMNxxlc0c{5y&K{&MDnf$0r^uq%I(ZA*q_o(G2o?NZ%l_N)e>Jm#Tod=gxWeyp1_-lq%+h5DB#86Y53 zaa}Dl-MreL8uvFGO-8e+)Ujj@zZzr7g~=KdcAfV}AwJEMn&lJuqDHCz(s`gOhW~Lq zPoRk&L9HrxFC!_6=u?wSdphceKDis2fN#?XPV~L-#?DMIqvr|{&e+TNZ1H6oUgNi zw1P0Q!fgn{r4|{V@OXBXP6n+L^*k&cM%9!K6HTSwu0g^i{i{N(cgW_ip7d1=)3+<| zE>mTt0vq!{6S=T8!&m!0M5Dttt4XQ2j#<@^RVgG3mvt?T+$K8J2yY7=JSQwUDQtsC zqtR~RwG(P7n@P_1*s!ff4Xi%8Q_h?5RPh5w@gntOslU*8{)6AHxS7|wvQ62Ua?q4& z%WF~Wq58SBu-r9u!LdxTW*;4%yJt$xlO5Td8+cRM_b~Vz0YO$+U77O-rB9sdJ(~X{ z)dN^!{7m`XuQtsq|Mi(~5QP9xo&RJzCf5HSwqs#u`ETc^UH{l_zx99EZZ`}hA)rnZ zRfIqQS^p;&SH=(m>&n$C@d^a!y6L*)#GfByn+qPJc5*t4yMOUlK|B~M#8V?x^au(I zmV7a)wz|U)o*$>8Dz5jvF-r0!8;o6?TIMywFUB+@I{9I{V#Om&I{ z-W#_{wV^-z?smG`biO~2pplEz9Pm>$lS<8-Bocwsj;W5DSzeSc`)eosqsT??y!1)R_laUjc=`HQ8q+`q}5G z4`iSGSzF36Hfhs|A_fUqzNdc);)+*8&Smn)caG#ESmRW5_OCF~$zhpNYFPExn5W#e z;@Wv~%B#w(8VwYnI?B10LSH697D^f6&dS@&pa{V@LM7^P=6{3Oa%H`ddvnhRSb0GH z5|HAh&Nc?&8P{*ObPuqiVcH;IT3PBfw{ffXdO#p#%FMgYxAaO)F&3~}H(E+>2d6HQ zg!a?Ha@d*XZWHO*{cY&C`q$d)h+Fj&RIJS#U4387qk$`Ty0*yZF7LSd7*UixbgY{1 znx?m32+SicoY}3q&+Wnl#ESLmhMBfE2419_vPGSzURTFd|hclOH5;QG83%*v}TnP7UXCs1?E+L1^ zqI6+p0Apxrf+4dUIG(IW>A3waj!e*8#nN@DjyBNgr$SNujX7jN3oX!!0F6s4hmv6I zkuGwI&k&DN&SlTTNk_$>8e49vmB;ayjv5+P|ags4067g{=Y14$FkkuPx~EHRi_tMZI)s|04A>+ z&VGIq7zJs-pWCt~B=P;zK45mXg0GHEf?tmT-$)za-tp=vh$Dv#v1l&b4S9j#xY|XG zkmJD-RBsna_}4liwDlaNNlDW0`%8zI$9y7HHQj@F4ctlb(cOh{XLxykWqLhgH|ZX7 z-fGQ`8I4FNnD4f^OhGMwNQz|J9xNxy#Zc`JC4TmFD-idM#!QVJ+ zG(`xen!!Gxa09nE{UV$yQpDV=|C~f|uss7^*PA3B0Xw7aS*{KWE3i&#e48BOXKNQ?=z>s+A<^Gh!fKG+n#bZC)tJq(Vu=>W#RF%&5d?RyRt)p(;s!v@jFrKd6zt;8@ty(0TA?~IAMn-kkqQ#{R>>_-X1Izq+chT=!`JQ z$13w`T8V2EQj2{M%}$U{ygLhjgv}E=$d(pvG5t&!^?! za`1vr0u3~3XzoWvKxY}c%KuFaQt6<8JR>wf1c=ve4uFHCG(ZA-Bautw;j*oJ+nS@W zc9B%hkaYhF+t<=cldfJ|035!^ua%effeAtR1>v-sbTn1_DZZ}?#{f{OMv8iT zvXns?^J7?qQLI>I#2`5nUf#D8SvQ8LYdpy6!@Jm>|1Dx}oJO ziLv(+q*qg1xC@4KC5Yx#nK1y1>P5CVj3i2mu;Qu~Mqv@!)_O$~5lgtA9GDMZc|jUm zBuR?qDSdV%+6$JXoLQaO=reh<$yb9GGZ#%IcKwPOVS?|0L@oAALgpr)WE7%S=K6F? z|CUIbXZke{LV6Y-(zFfxCuW#mMe^7$ zw_`s5ViOcdRQp!rmDgEE>V;$rjfN9-;Xjj9Ew_xceex!`wz;KMBy$ADDZu0ou(aqh z57}uJZ?0|=g4Xo5m8^4p*BPu_Q~G`>;{Tj{e#kpoZ~|R&5bK*tuF!A~ zV1vyl`4jO=hI)Hr_r_%k@$8d!)0JSWt1RP)p7wyIJ&1p8U_$mqq`_to#<)fNn`)xV zV$!C|y(Zr(Mz7iGR5J)W)nlw(`QcSlPLZ^>Cpq+ZnCB6WzYOH(^i-9RLG!lV#F%lmln#L+Sf7>qhTu@ zILF-GBofvU^}H8!{)Q9%(}~aT#m+kZlYUNU8;_7yBW?^l7CrNW5k~a$o&lkjPs96! zwqKZhKCL{_2NfzQW;4fCl%(ujYgE!T7i>cYU-J915 zK^Lk%`-^$6*zc<@e z%oIiD7qlJ;AY)H8B({(K?Y6=s6)qI(VNT9>&{9%;#4wS9jtzgIthT-Mk20fOOLQ9F zzkYh|Js);t9dDNzmME(imTh%$T}8v~i(lSx16;te9iOG_&#X@^y;^!?R8T)~N{4ed z^`3gV-?^ma(iZGoP)!r^x5=p7zoI^EvVZpJUt5kCdkt>0{}xG@YxAuP%f&-lvZvq2 z&6sWSvI&H?)qZN>MA9Cq^2L@~z6f9f4zLy>e>j<+cfk!i4NMtPqvi1I(5#*%y&1`L%0x9`Z#RPDQ;w0e2_<3*EC43!UwFlP+q{a)kK}`JZ}_g$<5 zq{K34C4FvQ1>lPiTLqV!od-;7+V@F*jC=K4`&F~a~(l)Bm4=1Hffgx#3#PyV-!@TURO=kB@2 zkB)frY)g*bFI7l0>@Hw;`VzcvS4{uvbhUTrq+u#$Ec;5R+Bq~sE4#Ts3MVgsX|&ZK z?htdL$i~TD%hbFhpL1=1-wyW9e)ktTYD|9h+pM zMh3HT*{TUA5`5An;5bXqH^!CRxgVv!71#ld>$x>#pt{rO`TTT5q$OSv4J#ulb@=nx zX7@9+`MvScS%NTA{QdruOA$81IstYIqYdbFM94{j1Qo-D1mI_C?X^eB4uyb6pjIN% z;ChgdvX2~5k<;W>7Y3#1VT|~O2i5I&Xc8df(X>arac`H8UWH=N3i<>rt=^VOG}O+; zAU=DI{7b8UfF9)uY-l@9VE%3NHd~*#T7FBTY?{q5hMGZUd*E1u>SIlBBojnP8t7lz z%927$D0yg~{WN(|!pww}L~~D%w46Z7J1<-HN8ap|j%6n}X%ESwM3rF{r|OXY=61A0 zx1yM}w)qa4rUI}5YRNDPGs_y`aw8Y4)_I|%COv>}FQ?kdV}1Fj9tg&jz)-k zim8delf2v?l&-{aXMl)MzG>#+YHZ6L`P9`(Pk+S0Ej>cV1Nj_uI%f`R`GAXwZ6IOx zsFPBXk7xcC!X*$AhnLz>w6N?ho%8ro&p(xIcG8vBVbg^|fDqtRxB=%JB(+k>F4PZv z)m*GT7tfGBDgYOZM_2w`32?RFFnc|oPTi0)6a_?O^df9vTR=LyT}l7`$hVZ`uEuQ* zOMv94)Z%~XxWM>TG{&7hmoBPm{4sgd>o+lwyE8S~sl;ISNfvncQ~DuTzh%F8^arEF z6zTn6!!7&1gn(u;0fR7q-;pW~DGgb}3TUW6CqD5LPpH*~^8kI|BBu`NxP_M&7uD?4UDQx4?+M5nZQ#7r( zI#npeCftbA*~d=IQ3RFJO*~^qZByngZqVFeoaG#HB~<}~=puHTsHtFCDjC7m^fxy9 zFeHrtxk%$<%aL4U+|oR;pS0iH^4WYQ^`j)mkZCn-W8GLV+;{_7bi^dVVtpGKsVOXK zDj;jdDUY|4W#jzdnRmB~GexMS&UKWojE6I)*?dMVag7czA;hDFLYXhW+?6>-9b$b6 zSqq46C`3A8zLmW8L^vu3KXcW2C;AkMea}!AYS<)LPHgtX2-lbn)X4Mw;kF!JjDYO{ zQIGdA=60|dE3YE)71&+Fi|6d%U}p20FI7Lzch!S3t3GsB#<>Rd(I9_DMkBC~d(XQP z>&l=&u=x2BFy7Kj-ig`TcaJT6$R?w7ZP!z{RieCp}Yt z;j!8OO5lI`{38cRFG&~90v)P$vEqJBL87K6%5A{YOO=tddxzZnwkvkj zI}wWVQD!GRRB{8kC+w9_6zqUoLK%8|EFj!Kni&H+y1?w}NRogfytw&GMr zAq!Ji=T4c;ECv_l3>%1rCZqAW&8w6V_`sJ7wZ%mZg^Z_n2LdN`^9QL8DWFe@U$)rr z^F^j5ahP)Q?m`N(eKZ(K5S2!cY>0?DfL~iUgQOb6PsWFi!BQu0VBIvtduX)a5DQwr zhMNTA6)pUaBw-{6K0vcmSvCQUu`BZcWf?+zboK@_Oi0tT3LuD?EvDN~{6slCYft;# zgj)ea9JQ!krb1O&h#pG%F)W$Q`5~)WRxCv9Jkz93_MZO_x+q>au~k)59MM3oL-K za?b3N#exhu4(Xv)baW+K<@;N}{0m#u{l3D<2`(_8Iaeg0EBF~;#IW@W7CG;<7Ov&s zQ*kpd9GM6vC~cc~!Pc8ZCQzm_73*Lmcae8R44Zlo`TD0-no#Y=RW5|wqii!XFIGx#-S{gJHFUzsU<()dEs6GW~gohO23LpJ)DPL z$4hXZKPrZVs@oAdM^7x#+v4$Mfw`d~ls7>_L6r38H!E1+^9Bi|zlkY_MC7HL{5?P^ zv`Irq*OyTFwO|p?1H`lRw4|<~+deOftL!C+s3WYODx$gG&aF1kou4&aXvFyTivg_pmHF zkFW4T?6_xJEr!Rq2I3e1wQ|9}lAhB|1663DcH7$rN|!t2@$$)2!@DmVj3o;opC-JO zo1)HfDGAJQ=4+MUbK!O$5|v1WPw_Xrezj(5f?5(M)O$BUaZJ<%suTrcuUN4qgYg%-Mw!SX0S;L zQ))mYMx!AI^@84GD92CUT~}v^zF8mp%|gpof~J7XkU8N3w+x)MlDsU_(_hBgqM<5v zTFv0hu<2XehX8Oi#a&5@Juxn9{&2hAV`fQ{H(qW84BUw;#5zdwLdybi^B`w&(#?T~ zL^+kvUe4=OFg%Qv3ac}ndth0jJkIpkr#D-&;YRqZ#xg|J$J5qrtKB83P!?g7qUIQdUB*^t#~jcFN6|LAU^% zP;Z$=x;QoVa91B4MepoKFret-pu-D}jw{CKi8ayaD2{Q$pGh-^I-BG4ig|L4vPBN` z$?Nw!m@(Af7VpryRPUJ)rs`!6Rke}dMEqT7Rhuc7T!10Fpk?x2N>bhx4uML-?+m5 zGf z#LT29c+92$G9Gi*V$44#`}siuEv>%;jx2yLe31h!4`UfBq_YVux-{Dj1y7Q94#R)} zrFf2!Jtx|Evt1T1=WtN}I+_w-Ul_t%95osf#350U7?l@Ca{e_d0()>I%+%$o@>Eh! zjT56T_N~74`UYFPE%X+e8LodkZr==w@D-pIhyW>%tLwxmZ+`{0J2D-Hf^mgM7si?E zSq(mug`uUpD_y)u<+oedvhW4OI<5ugyrf~&h__xw!s}C6E7-Qggq%XpT-lPJYv)nx z<@qh~Gh(e3YQ0NSp#QWyu7H~sJ=Tn3^@?)37;&sl(0_oupgwfCtp(4ynnnZmr`Uos?a+jscX z+Pu!}yWAW81?mUAq* z8rB?3Sb6lsyl53jL*UV%XUp-;c6mf6D`c)$m$pyx6%8yEj;Ancq2Zl7GQ|oR@Z%@h z*^|MM>;Z25QoD;9n)cUjQb=eoCQiS8(ryCMXk8Hn?c9dV8lxbz_c#LB(scUuJPE&k zQ??R~0c$tdaT9ZWW~64yVhXpF!z|p-&PRr2ryb0sI@0`y4JmizAT&~@pTbbqv3Us` zmYFA7Bj43UnwpFc#aia<2xPwo?uE$X;spd=FXQyNA z|HTrP8%7slhbPf}Hj4VY5b*n9jMzp-}M`P8uBjiN$Y)kQU zm_=%V&_-B9e}lYE37dAKgKB{R=LCYS#wm|L(ml;N^zA0{MhYh6RasnN*`&-ze{w@sNR31y!WXKl{m-&6IG}EuUB|^aXSez9$GF=~q zBPCrj$;n+^)`(+4d^|+#hS8s!$*DndP3l%nb zT|PV_?7SPLPGu>I*2c{#tOmR7NyZ9`G)Z;G5~>#lKio<<^bVh^d+}>BN#ekn9?A#!)8R8pbbu*a+^^Uze;6 zhw&^8z(2`YgN5q@S2|k#0ip9;507YT+8iTn#+CNox-$CVXQBG}QZ$)4b0}&RreMv; z|2t885LN3;_`o!F4lnb6Di8b{BuwXjqTD~}_y6;T|34_l%JE;LT#AN<-MTpHKa`st z0FwemnR-uWlS`D~uI*~58;%ljMV>X5BIy?z7>KO*^F6nWG(G`+5~;kZuKxFGVpE&e zYATn)sHM93>}sn0>ONC!vg)q6DlTm?Jd44VvD=IH1>~CFtT(Ry;!!lm+^@mLv>%Jk zQHX^k*4BI+jJ24pM0gxAJ=Px>j+Ec8|HO0vQ0c#+wTU%YF}e}1ce zUTuPxO~6s83HV z^>lddOt|uJoFxdm1fyc4!f#whPW6$WJmET_5{Q}Ny?$HoG+*!*rS%Ef+n<3ZlM3Td%XAeI7dhPD*8W+iHd0%Z{{`z zkM)^=5EnMspP2s|AJ6aU)vZwQxAOX-%Tl6$?+awp6bRV*TWa!%AZV!eL;?70HqB|` zaiK~Unau9sfTXureb<9q8tN^xehRJk>_fj})D5Qt10sFm`B*b1xuCJkM80K-cZfK?sE&BHW3 z>*XJ*Pa4TJesB(AENZTJnc|s??~uQN0;S}^zLwsXgU?tUG8bhOeIVQW^GCfUnAZ#(A7 z)99xT_C4H#7Wzhpu}17uGCH@r^oh6LGA~GQV}N!^C)WXn6WIpj6Y0+vt$cAV_7%zp zjHE*-{It9~f3GBffcJPd?M^j?SeH{Lsen z$nm0y2VMdZq+#|T8abB25`fYr)*a5dUlB}utr&RY8(FCR`c%78PrQ9<+jMW3Ba8%Q z?52(vtX}G-0z|s{!}^B(>TFW|vy@fx_u21`67d8XxqL91jVChr;2jjMmsTCFL)F`5 zMhXQAc{tMfa(@+{3D~fE`8QNYLoBs<7bYLBoqL7&HB%ifq5{R&-PO>VhvZQf5s?na zvuN(5{2?P(NR8v-dGJ^Go@OQ;I7=hTg2hB_W4OMIRta0lO#?p!ToaWq{7UOaK#=A| z79olK4e=DXpAP*e{A2Iv!(3|k=mgD4h`Vsiz5?8Cd4!ftEMq;Ok@0q5cNwmu}YF1IF+R04ePIkyqyV-+@2D39Pm z{$CwM-nr7n9};tArv3sPQa1WNV>py`8O4qTiD8Ax)<0$|i}U5&>k%Re#Y?{#sd4{= zJ$pV7e}n4*Yq0PIqQCui`yB}88qQ-QMa|_Enb|cjX41PbZ8eiGgbw2Q`cPO=r)m)K zPBrpjJKMj8UN@Zn03T_zELRx%4b4g7%eNI`%aCe83Z(?EL{K~!xy31L1SwI2tU^^s zy+&-e-e>tvBE|BqM5JYLNE3{=#W%c5$b3kyz(=+{^2(m8m2DrM2>f*-B0tiSHEXsZy<>I(BuOs()fWNpUf(;&f?SVvH8ont6DEq-mN1A zWSIyWODcbftvOneaGP45{HS)%5U;gC)4M&H@ zcmAgDJSs$iB|8849qT>}MTMJY;aP9Ph>qkvTDe8=qaV_iAL3*t46nPY6CjM-^o9kk{@ip5Vula{YS*O@ez{8$haLiR2=5Zxp=Iz-P);QyDBU*bS zg6}T}MQtd-FgFKH;3z0U+s{K(*_xmDgdG*;_G+%oJMlu0clyRYb7kzVqvwclxP$}Z zmQ`v$wEo4b`?1O5Yf2-9N%9zQ5!gg>g+h2_-$`h)2VY6Oz|*-4SENO_J;!b2Gtm(o zFWwgmPfW9T&Np6ZSTRvrH~MhoT5tqnnT<2ogqTDs8xSq6g-Jrt5%EHr{j`5}TjT zY`ccw*L!-piDMD|E(vRiTCy?soa-&O$>RQF7KBxAw#2+k)xRv{%}v5Cl2+0=N}3hn z?US^T4z=6c9F1p#oWOn}u2#bz%_B@U7E#SjnzyY?tdWu`?lER^7`J|DCuO=tklDUn z&=YRRDrjF27e~}qa9$ya(aJTO;%m|upjwu}Gc}Pq+Gr?dbu;TS@>Ftu{*xoa%U|L< zx{WK@JEt57%d*hkN#_(Zo;;zo3=Bd;^ZSQ5&E-TU_>9?qokUztH;Cb zdyA&w6|=-{#8>}q%YIDTXl3D<()wNqv1=aL*G3|Q>}=TD#-BBT&1a(ISl(k-$Y`@S zzb+L+FVHw&6vrxj_)sC^Xb|~|KNl}6pIV}rUgLbd`|^zOoA;p7%}IN@K`$ON^lm%C zZfziIC*ruF0-A(;O!~eDnZMM|UW?=4uU`uEM8dW%BY)`}m3A+lrBESzRFGgz@=NCR zGjdrB5RlR{hY1v{IP`?HDvF_V*r>V20TiXMI_^A4 z9K@5DO=q{wI@uD;yk7PiHQfFxGk&*@w@Tsa<6 zZ+BfrRUH|qHnYSOb}ZR!q2o!Ts&inkf*ktS6aQ#$OBRi{1d=_ar zR@f5K6E9j%*n>{>&7W$wh-zoFWT)l}Min@zG$sxt-g`gaJd_+_cdhY|H^n2wXLQm- zs>~Hi^t4sA@vuPBK@$`kim3As9`RMeyv(IY=_ZP^@>u*kAaj81bqpToxM2cy08=`Z z^k@A1$ehe2$;Fc^91-x;ib7F8mxaeBaEW8FD|WSRy#3)x*i_l zn#Zyhi(`emG~2eDTznjrrNHWGK`?(shs&@c$N4ivUKy|s6OF$k`Z|?f;RW(?sn$^3~(3{oSG#TrEs@e-UfY+-AI6U{3;^1*QDddl!6 zKaS^jLb)%zWNGGCl78wMqJaNA0HoY-I3{4np$ZrCtMs8oga^GKtgBFhKi}{hwLv_L zf(z9cQ)Y(N2pq7sUrtQRMn?AF_{7gWx6^1C<`*_`FOTd(n;VSJLOk!FvxPT+gfm(Y zFNcg(OZ_585J@HjCwP(y6_|hiJ~pn6m(K-SkaaAvDy0j3x|13AkEN8$87WCcl@gT8Ik2DDfP$s!r#R;! z{SraS8ktmDdb*w*gwCm~;e8evnRu)#u;r&I0>54t1}f7S4^k`^K9YK{gJgewOANlI z`@w+2&jQ+1{-t6kq#T07ukXnxYcN4RYn^GVuy(nOgN(;Z|H~Vw=|k!qSqv=N$S5Qc z2ZPtJ50usz)x{9+g1p*;c-*G`AX5`4B9>Sk18uJjz-2D>FB}q^uM)1w7$p5u^2gwA z;{0*w7~Wzbk%*iG^aa#6O_JkvcW<9!X4MeICPm(2ZzHP;S}bC8P~)_-=VhUJ*C}rV z2D;2Xl|s>EH=j`jw;~lZTnS~!C>Y6P{%B4GPJVgtD-)40OGYrinpvvMgt!kBW;K@$ zvgG$W4de07n}wyP(wpPtUAU(bF3!%BzXxilEmXUWB=yxrPf}=(Y&P?SFb}=G-T5n0 zT$9{RfaIe8;4={32PIE&3zkVW%`gn=!Fm^-Nvnfjd|=(9yFP#kvqK4gXGF$SvFp@x zg~oYq(suO0u;PIqHau&h!CDMQS>y_DVPvg$Nv~m`Zc)xEGG3Jgy+UJ-iw}MZhvi>hx6Tb-d@oeD`0Ua==@@UVW)f1EE9@@R z+PWFJj{2H%D5NR)n7gjphuLtRm(yu6ZMtyZO(EQooi?hpE>U_8j*!@@+j1#JW=K{` zpx8B5b5H?1rmJz=?n(xf(KZ+kAQvls#L*Hv;zha0+MSN~fiyvMSA)aLaE3ks(8ZpE z=G{7h?2*C{=69BLcTBGEU76Vp%T@ z*6WY?D*r5H8Ey9`|MuheuZZSCC?qk!gY~7fwuwSu@!=_2If6;~!*XD6VLR6zn z4_hW3vDh#ydW`)IPx&}M{GYY-U)B5%k%)nr`M=&8yi}KpTW3Y?K30QiONRPeU)mD* zn?JKrB$69&E;WY^x%|h*fLsB&%ywSL&&!Oxkd{NXmfwrYQ3Ek7d$*I%vtS2VxNk;| zmFS;YK}|ybKtw&oqP8k%dnL+1y$WsGSdWdXOs&Vxugm=#JDIks?1IH^s5i~9dNHw8Pa9_Jep5uG}^fza&o#P?rLXFre{8_Q- z|1kEAv7$uHmd7^kv2EM7ZQHhO+qP}nw#|EN%>D8*lgYeEW;*Fg@A}=TU0AhN&31<9 z^O@BWy~HDWolYLAs)54r?MHmwYW5gL7wT&jw`rlnpho|}A$3&Fj05&VH-5z$&o+A6 zG&TuR2>+l8=`=8D6KqiDV=9%$~8q`@PR!N?g(hK(C1N0Biz2j(jL!wGCb9{k+1$n19pmUrA;y~$%)99_=nKTyIVfOuKNes_Sd6mq(j;N3+w53{ zCr@~ejzf)|X!);5Ne;7B3}x5ht8ibTkFq%D|IWCu`HE7`(YTT(TZ&H$;04N_6pu;MRe z<@RxPoR7e2ajI=`>CSYoxd6iz7QGdT3ILl8ms*?M#FC~igk1cPQvIE&bOv7Ma8+)* zVV0={+bA`-nq`lL>MJHLDE*9%*uh{R&ma~gUK-k~X2FqKaFL_cX zCUcF;Vwd8ht?{Y8Gbz?>V|!AvU^jvAq4k-V-HdJVOV83`1l2^oH1*IOe!Gw^z_(@1 zS;9|4*<9&dK00&?P-3B$)m71>M7nrsc$l}y z@Lww8a9SF`*F=vl>l%0}p-mFq%fKZrbRI4(fXAHadWG?{D}N7oyI7(2_ri(_95RfE z{7jR;fnQ&NGpFF`aQgZtbSf!PNl)A3tpjAv@(yHO*?$e+Qx)x(gIDbrH*d=B?F%-q z@8GeqfSZ?Wf`k`%?0`w$%sX@hBQI(A$mviqXc#Fkfnm%{eeQ1KlJ|hAnpX_vI9DHY zj_c|tjedqlnhdUVZ)k?-8yWa_=pH@3)ixEQDRfY6pUgzlS?EfA^=0vw9ypL5l47`c z@fW)pn{Ot*bU!-ndrYCXq z+qiTA^e5&oY$cYqZ^)E5-?{v1(%fJLMiBeNP$00f{dr=c zV_UB__J_mgG2TPvH}QXu_#FS2g+vB+diww0>ZwIt<3ADqA5Od=jC-74`Vol)RU`n6 zBa<+zdB;X~5r1FvNi!TyE%DX-*E zaRe|5(kuanR!yKdTv7yKEYN-;Xo~s`;ir9L`ZO@4bn<~K|B&39HH&Gq=&s{Eh*9HY zh2^EqY9}4$LPf{8)WQsp&M#D_(4Qeu6tS&qUVj$#Kq45c`_|M6cZuHapl-2V*QIo@ zw$T>GmG;VV^yqHXS2|?~BsbXipwgB*%yLw4e^5U-WX5%4MJ7r}C+61*mS|`54b`S? zCi-amfY9jpCavzO)rnJ!B!gIyQdu!bWs%*xsE#v7 zZI!(DuHcuHe%sB<8+W9g)nUe3&EqHsQ$lg?gW<0w;42scJV{4?m&kr&QyjBm<>)*>#jh8V!5evIJ?6YfMqJ&Ep`z;;&n?;xVgxChi1yx9JGLVRQV5EQd{Xn4u6i@~Pn2_xU-TUJ06NYQ7Vj1pNV>bh9 zz-_}tH}J0)SJN)*x@M6Xsz^_>-L{t2nwItUsYpOm&PaUsOc#sdxh?+u4!`ztNk@n? zy7UZH-_+*G-{i;8hrsXDn1!6Sz8CUjIGK2;#L+@Ffd#Tsrmd){Cce395A%K?T9g7o zP)UhIN(}0$CU`uH_yK$f0pU!LHd{*!2!FY*Y6#j{-)8`>&E%-$VQz z&ImH%LJK;Bt`Ya$D@X+XUQA4$HGen_rdeP#*Mt zA+T8NDR^!NAio0a0#jkg&M7{H1FOtKU>pMKLTIB zaN$QUS}GXdt^nLW3z{8lVrjChE1KB_au$_$h35Xa%kDl6^j5A_Vgs|`*cT}_SmH|4(b-_EG+4{qw;u10kD z{R{F3LcmoI6c{n$gLpfC+rUR;2X+$q18h1lZai*MxqbTKVm^QahHHiutkNKBYh~KB zB(;&k2h^?+&2HdAIXM2;_PYxy!#NE><6==S6Vo8KRZ6EenThl%l+RZ-LaEzYwblT% z92l(Gg4FWqn_@POVa}sChq6OjxDce^(z1dyd3z{@hNFyP_yM$b-^N-_qBo`;@wHVQ zsMnJeh4wm}RMhI)-&cYc8r_Y72#RbMdKC}Pw^54rD2ZvUHDSYCm*BiRaAc z!Gv;5zsg0CBWh(iQUHL;jnJONycmT9;f1>b$N0*~E51O9)ZlqYdA zF=p4j%}z#;8u0oMA1(Gy-1n8h??=5KT;M3J)pm9ZMxX7vXrrIRvdn9V4o>1Ap5BQ6 zc-K7_(J1bXRJW{94K=B)DPY+P$69YasqoWwUfd}^ z`4@2eq$|dMzgPeFY5RXMvHv4tS8}$2qLamE_z&s2sD-1`KX!F`mjA`0&PdPt|J}4) zQQxxtH;wmMQ+qOc*f-syiy8osWSm7$zXoeG)U=_EmxW}?Y3Srq@19-S&u+H4j}5l1$`jA@a+Vov=yNPnR|?|{#f z1XM@dDN&UnSk=;xPLFb4XK=x-M1QYHe=?tlBkk=ht+cj3-h-qF*Br=&ydO`23bO<# zL_X(?6|WB_gkF&mkkfE(Ha|KJbDhJVkG?q+(Eu^B5fC8_U63IXJGjr&8IF*lVjodV ztxb-X-f|u(Y$1LVPoa%@kTDVumV={NHP}zcJULbX3;1GBLnts9E!qoLps^o75FOIc zWG~@x&?PhtgwmNdT>#6!K0w>wF~*K4ae%Bp{Pu^y2>b6m<`B1_65w6} z&;bsJW*xWy0ZAsIB?Fu^0+=c4H;#Sba*;gsATJOxu(=@wH6ciVL^y;(zsIt;MkiqD zs048Y3JwDyp$ot;LLiZ%aI>fZx1g|IlSVPZ+( z68c2|X~a1s>i{qhNWWCCe_on?DhL4X6EPI9fP@`Di=yY<6dg5((ZtzdxBdi~Ye9p# ztcD|Z4c$gv-{B)ZN1v84^?RmlqrgMM_!V^>)#-$7e732|LUK{{V4|g-_r&PZ(?1$_ z9SBh+gO0&vFd~oeG~j5(LN3AUYQ8j)rv8s&zM8hxjRzOU)a*11U7GT_^H>tRxkR~* zxC?Tw@2>z7vTE8aYm6hIW51uPJ$*2@^z(dXwDhCyj2T++EE*lFi=Y!E6n8_9Xl;xG zr|myMB=pM2#-A`v$8&z#-(*-WresbN)8A=zCJdZYmac&3yf{tA+@Bgru=-!)w?5Xx zsueEwDeIs+2DxbHw}F({AtW|y?X~wh$eW@run=N1n%+13LB~Q0u}zIGG_*;3NlC{< zKmOZkC{*(8@{{&rSA?Rt6~yLKJwy)_xF-HP8cr%pD8CFdePlx`!SG_w&EpIQd$Mxp zueYVOXe)b(#CpoySZotEt|`&Z3Db*JoH?f&8a-mcS%KP|`ZZxQ3{x+2KGUT3QYL`d z5Xu7skU=8XhWq3u^;nH9Di5`joBka>bFIPmoT>{>QI=7ZLni&asLWy}MVo^qt)D{A zMw+WKoLre@MOgT*%p{jMaI6%9&`BzY#LLQI?WL5}_kK*~Gb>PRLo>MJ7-b$>96|eF zENR-Bo8v{No4AQ4V(y%kneW^*e~&+NfNif3EyJ7CQ4v69gDmLp0ILMQpAVk{p%Vo+ zodRIBJN(^&A@OM85N@4yqq8=UX$vW-HtMMDSVwSYP=)2-m2gPb;&JULU);eEOy8qp zRNm91zNbiZyPlEiW^_q(-3%WYo(V9X=I0mdr+R6DJpgI1uJ_3r`KrF<@WUnYeBA zPFudAruOZPb#KAoP@%=>h5K>fgk>pcqdkp?^TY3ZF207HCA#q&O53RR#Hu|8OU0yn`x4coaL=%8{}vLnn7VHf|wmy&^~jpxM$#Ya>-@eaH&Mficd_zX|zk*ycuikGOJ1_Cl$g#@lYR)eRcLw9z{~V z9Q+c+Pc2l;OdOL+jLH))%~@-jj-T2N%INy;-`(9XP+^X93%&5kjXJ|3wn0T+1>)6y z+cXm9%dm*U)sbYgi1!08jVuY7^{-L=8Nf>EG(CrM3bC|g zUr%}5pVeLXHg56mWgy4nPMXXNR#@uuUk!BKOBaH+qC5s}TlVOnX?HvzI|tAJZ5xCN zAHsE56Fe03lZtd47Nr#gJrraUZy7o)P50tPM{Ibh7Vi}_6?}4tDu~K2-%nxn@e3dZc5{e1$Z&^&|1xdZ=T-G8bMLLZ(M*@A}Y6?l+#rn7Qum3EI|w zrSWbIYJc(Ya`u2GPP2|{eS5hkt{TzVZvJ&OVpPnytvk49$Y4GSH}!w)t(B?3%{HQS zpRbypoOE{^K1hpjw~Q8F83e3p$ISGa9y-a-EO;k%olDdXd?^&Df zQU>f-zy;dMTXv;H9eYyzw+NV}U>3P^s1dI_>yx@Gmo}(Lnj%Zy(|xp}mpHvVfM&jn z*^(qwU2+)kUhj7QoV;FXIDAf$OVR)4t}Fv4^cd~|zU!T_fg}F+6ola)tGEFyKt_B97DhI<|9Skk?D0Q8@flcI{&5xk=lOq&y2QMj$ZK1zg+?9P4zMua z-hx2L+Pm502aN9Q;2>@90E4)>xxpfF59|PEwdhWG_BmC)&{pQxnVo-6GnoGRM@mbi zNDME}q7z$~T}=;f!06)pmBa0c91zyBT( zoI(I`_T@wX=j>sh+*kuL(yjuq!U15h@nOO9QBnElq@?`ii*=3t0&vKuT1Ua3gNbiw z0_7l3h}hWhVh^05$=6KW4w(IepVbyg%5UXg znFEP_e0|SHVGc^2opbZ9p}xJnogTm{JM9{KD(D;yz*gS`$`5)B;^+*T0rZmyBM-3Y z|3edl5doEN3h4TgCa^L)y#ad;0o0A79wfuxDr-kT+gge**01H_U)hY!zkqA}NoUsK z$3YMDZgCjtL^4oNVOk>ShW8U?cPE z2%^cg(K7<96QFOEf1fq9SMyKajBpZQKWotM%8AhdWQ&W7fh(ZqcX9kdEwjxkwVnmF zsi^^QgOiKkdnJ#39ntu~^)D{n#8sDJ>iTG8Y<_e@sje zeE-l0)ZP0Yw3dJGL?;$Dfs@UT9@7HQ(mghFAs3@uPy>-|L>_{y;qhtg8$20 z{#AoxLuU84;pZ>+tzX#JZ`MO!<5wTt$M22!;>hNQ9oJ1C_K)8+KURIqSRcDtJ< z4fOHNuIs?dZ>MG8PfKT^>uTxm8tDy;_ZBFkmebX*F44LK(ls2T3J_P8`j?gVk4x>( zTA@aejew-9?0%mv4FD;t>gunN*A^{uRohzF(w6j(4Nwow+;3`fJxc@Ax7E~oM>`kI($yAugOdYb_xkSY0?P5vD+;iBy3I}Yo*;nTp*Mi3Ypl2*kAf{NK-9RN*e{_i zK-4+jAz*#@H-Rod)SF*K7-~P^d)PVvwW41*PXEINyaRxG@$bAAXb0bus=yC?kBa=8 zkT<}ekzb_0T0ABHai09g`7M+U@TZ0EsZ{R!-*N4Y?!HF_{HLJpa@6mgj2ac^yK*)-S!ewDqjoKa0#JA6R9Ae~>pdmx=Zzktqz*~x6sUVE-W%40^X03LWvwp{Z1(Ben0dLMjm!8gR(JJYq<1JWy_z|THF z-d}2&?=&^OgSn~eQIFY99$kL7zRWA%4sz!0`bDebPRHhsryWs3|hJ7HQtbGqNMz|Dlni=_(5`czEtex7wy0_ znJE_mriP2uFGikLdZR|U1eEK__dRFiIIu?H7zVyrzmzbTX6V|J3R+Mg=p>>C3y7?t z={l*~Wbrq$E3-+{p#;AS)u>G0``iTDJYLv$@ zdA*m32BRmsm6>FS;wnV(cpRj52vDxWWh8Hv2<*X0Inj+c!U+V+#YP)WRtbEI{qdDQ zhpOM64M9)Zau|JEY&|t?B^CYDs=`$aRc@vAeRA1b3tQ9oaImhr$44bC1ffcD8Q$fJ zOFA5mX4PRCm0}mGhH3Y4Zpc2O-n7Io4MA;^TSNDIDB9R)7sntv)RTs2KxSbhWNHtZ zUdg9LFp}PPS(y?BU0r7ht{IYKJS!Juy?tkIp8H;1j}_yvbmLBP8F-ckAiXgtHV#&S z91dV(!#yq7ZT+ZxCE4+;JP1nsV)%((963@ipWdE0$Jjw4mdfPDsNuZ}EwT8zq13RsNq9|kVYjN;baGI!U3LzaiYqCh3j z)`F<`f<87&Nbs++^0rQp>dz3qSrY}u?1R*FgTyW11IYG^e;2*(Q@PZU$yQEO)G4n9 z2x|tFvbPnIS!>!UGOc#yq8u}Jw$qO)P90R7|H{8gqoMb&lxqV2b+mMWnIR2yX8^2k zE1Om;fLw+86oYDQA*4CuJR|?3E%X6|x)p%Nkp_Zm$ZQv^*?@2w!7oyJpE`p23)KQI z2$$ZdU+y|#wirjkv1C6?>%gXT(|4_FiCmvG^X#bxN!r`UJ^;VATKl(qF_W|4zj0_u z+S4Q+M8k`Ci0a0s-l2k$VJo~4i6JI!DT4J=pB3s7F%@@S5ZRD7#NE00-gAKiIcH);K9z6vSVz#vLmv0wp17Vn_tmkMfHFYR629TX`xPSNItUO`&6!|&GF}~ z%Y`^k;qWT$av^0WMARJpOedNs<9qXm)L}M9gM?9BVhc!9{-31xx~HtIg-wt`b{@KV zRPb1REbl%(Dx;5)EIyB4?1+7=4!}tW4c`!RHvhm1S4!XWjj}KC>2^Eu&oe_aYvR+a zOU$icLmb?AVWDXGOcETUp7-LFl?4u1Dd2(Ez!WIO zVZcMHz9XQQ)zUtRdEPlJ}G@o*7HU^r)NO(I|-UNl4YW_kc>jkej5 za3%gCwdO8-( z$L&F#-ha7@#$gJvkU4tId%OQh67*B#bFe)}>wJ4>}WLsPh?1i3L_(3hedA(g;WA?r?m{c_mzf zaNn|F&IC+>vN4I-L;ZgTMBA{&~rH_ zg~1%5!KYP2xg9v-*=#HX!o^@g_^!zpX15ZMFI#L%COW;&hV!5<)H3WL1F_WX3~VTTdLBgQ|wTgK$&f$(aqTy`i&02z=523Y{1ioM+TS>)oTjJ7=LmQc^fVq&YK*saBqH zDt1$r#E}f!o55cy+!3_C>@&(L^l4Uw!k(Dm-A}R z9qiI&-=yDnM_k!J!s(cr`@Q_B8x(gtof%xK-%^U2nFk+?escP*)HPhXW4+f*F zd0G8h{o6sE0vDY-ke4Eje+Wc|*`L`Y@UfQL@+MYjvP>K{ao?ZRhlOsoHOp|FAA-`B z)h&TEjiLx+)Nja7=Am~D2mqiKJ7HEX91jQsn8xP4bXrw1%o6`$%v%qDmAnn;Bu^9Snz zhP6>BNFvotCl zWJnp}S0^TI3(xf?3dHMzc*^e>Vjs-7u8DoO1IYKTT^3yt5Fw|VwGRKM?3yckNyCGu zIWXl51fbWg*x9Nf!e4?DBQ#JB2m?(7r-4Y2jN?J;A!>Fy4q8q#m=35W>Uvy}i5T(1 zfVyMTNW}sgcNP3!w+k!wj*>stS*gfRb{=AbCqfaIA4k=o9cB-C#$!*WZ!j3f@t1^% zd1ayn^5}ey`mTT5ABpwsl@MHdfF^1QL5JMPLmP5^iQ2 z)O)~*dzSHf*K&#Ny@rgxY1lq4;w_R$(r`SnraHuwMLG#V(*VK4~ z9N*rEpHQ0;L99K%pKAE|VA})TKK^K5BwOaJgfm-prFyL8wyk<7Gtr_9Igecg+6kA!rqw`ex{tphfjL{8p}s?IJT119w267b*GYRo zJ>O79<|FsnC?(+#IQdO~^z0aVr|nR$vr*l0u!6kJ!JFUCdgVCTN$Z+?)Tm;tN0HHWMWq81iDeA}OI7kfF}52@Nry0sP)W z<(`6|zwfd%XBHdiYcbGSVg!Vwh&R2;>P1E-$}Be|gMOG8hK&+H0EaaDem3wdT8%f) z=`tRD;gJmQch-F;^&~2$=t?GZ(S;hcaz0HP#K`Y;sugFbtM!nfqxbX&+c++A{vkNu zZcR!1oQZOfTGv$UU!u;7T3WONF(lR2JH-|2(l=gNz_I0fHa)!8ERscmy3UgG<~A|M zfId%OTA1UA)#$zU)To||&VgkRkuJf9-Ns$6^qk?tkpTH9oa+D;qiwz&v#r@YEJVFi z{`fo{|LBOY5G0?`l3yHk_^K?QlA!g9-^x6GD~J6dxCns3C;pZD55B+Yrl|_9338?o zfyzpYAS(*FmZmzMW|!4jXFk+owzZ#vO#soFR7)fsb>%NU52R_pics#~psgi}It13$ za}G7uYI^%|-=CM%6-&0ibYr$n)Ryem- zoA&AA#fG+QrmJQ<*$Km$z^M0tlbL|7*&3WM=W1<@!A5gpLo!{gU>z@|QY>D%VnBJ- zvQX*awe%NN@JO8wPY)MTa`YJzCh@dz?mRK9 zy~$9hd+R+W+qLNE1QmVBtw&%IJ37vBkc(A#sXR!1kI4X{n2}B7+2%2dZTFp`ibKz# zIQI&}6Vf9KkEJpmHPdg395x*+ClC=nzd8gn51z73+7(K$%K$^YTExlByP<$b=r;Yu zDS-=BpNYkxo>^uS`>3?RH$-?}#P8{9MW6XOY`N%5{%a*eU8W=pN-MWb>}$QwLz8w) zVv9j8V8qntB?Y7 z^YNTXUJ%G8CaJqho&VMTxC)*+jt_pt(P}fG4;8x0xkv>>#v}r(xuL(^9O<;?bsqfY zW^P*pleL;C)*H+As@iqOb~9_4C8Cat;67vdxzTvKdbaPp_s@t?dd?p8 zwB9}Oz=-DDdg)ZxjRmAJp;uhK>&_WVo?ZJvlTvfcgIAnPo0Hu!jf1b}n<}&2iTeQ+ z4h#XJma!9$U&5^>hJwxXdR5k~E-rdKOLPGa;db)JP=Y#KT}9SuLb6fxUb%R%81<}L z)POx-i&BW7rJ8Wjo(7+y_Yg`;Q!b1{!irxOZ@&rhOV?S;J?(B=|FWI17;5Y$6WK@$ zRKlJkW<{+j#55v4Z5ZTAOF0ecV8>A!Di?e$uHUqkY~vbw_2IuRPN9dSN**_GKU7Ck z5^A5HSGo&&Wp82~1P?m80!;VkZ`W&>jn#RF#I_O?%L(| z&1`jo3KV+Oca|IWR-Z}^M@iinb)Qv=jZe*4n4;gsqPR3V{?%|J0XDev$65NN?_ed{ zo+%8~EYU>}aDzlZ(IUm8NGhZ`&{umdGixF;bh2C-)i>HyA%}@phDR{m?%& zx{MRbaDKIQfaLI$=kaa5>&K}{P@dV`iB*Umkup2Ui) zp`cBYx_2+N!Y5C3hK>aEq}0&a79d`B@;sD+lZj2{SkPgaJ|o^O!P}(vpM+ndhD{s|IK-JPh_;|NFbs;AgwC#r0X*HJz_HYh^_H~zxCqKlW_pED^pOC zp}4KoglBa>g0gm}kyY2IDAbJnQOeB#js+zZ(}szj%RX)`Pa>RPRHI54wwKTHiv?6vG zo~XxeM!(;ymD|}gj(bjArS_ckLr}J=9gX%jev3G69N-VC$E!D^4USxEr+sqyR$vrG zb=YazwZcT3TmGDOXlp7I1uOdbgeVpZOcO*1$>n(A;%vXU$g-ml%KM@ejBM$MqDBcr z%$bwj;KJY89Z<_6+w?n}7SFp+YfA=0p)Jq{KlS5A!~KTX27ZO}$8jN?5>MTDb68YG z?d-dF3J@3;G3z0(pQo~t>HG2zDXC9LyutNI)2O?$46oNCuMbv-_T`@5l^lMg=@)zq z6pW+$vPI)C;q_24koUh)#uxiK+*s@BY=uhq!gvASQ}?acT)b{_d;ANRKKRg;vSK7T zNbNXX zXj}Lb^eQh$)T6=_DV4ERagvUrp(qYw;#ez3ri6=gn8jG%dToc-Ipj+rC!Z?=F~mrH zosRzk$pF8l`Pc#F9m^rRA#&p$Hz2NxCU3@Og$x`{sRG^A@3~<70*>!{YwhQfo_l#z zreGpkcaV91+5&kz0xZTgD=@s_xDjQ8?Ipqt)6BH}2q*F;Dos$FS=*jxom6a?SBPB) z2zIq>jZO{_hX!bmedC~kiZ6_CUoEqyX5$oXfA%}ISv^3cxEESvH9GbzaE7GFZ5y#3 zjghv-a6Ef#7ECy#Bo0g58rd|QxYe>~B*AT3CcyCXqK^*ZJ2t4|7IzuKPfz%B2@^2O z$iEGsHuaoEEeak;kJi6e%j?NQR%{;z=JNx!#1x`VY|Xc9ae%u@F&;L)i;3ogrrZf) zpD&p>=_h98CVxzKb;2ZilODZ1Or*4Bf|xHLlm5yZ@}xzi+I;hiC#vkshny;A-xs(g zpMZZ^M8a|?1%FLawE0$sioLrXDO^`z4FNf$RgPRZZ)p>TqR~oGq^<(-`u)rfAEU{dCc2HYMI50{aw~*WwX=6R~O< zKT`F?w>ZH)@oEn>j`xz&YSRA8yeD+Rjc{{WWVWULa^sFhXEb(n#WcDO2epr3qQC&5 znDq&ceedVQZ{UeKn` zQBwAKg^@icN<6l|d?TMXT8_G*Euh74mBxjDSA-jH%FC>=-DLPw`%1rND-7oTGvLw` zFq;Yj+}ns=#v-Jdj}866-i$xYA6JRlIE{>OHv=&U$;Q&wD48YIg61{{G?w-D$U|u8 zqrTAi)J9wvj$REuME`~TUH-BdR2?1G+gM+dZKu#4NRfKyq~aqE0wFVTz<6o!#J7?< z1@CJZORKGPq*Sq)O_VaT&0c}Q6Yi8BPQx*O z7doEooDmaWyUrWplles)=O?E2}PqK-8iG%B2=is#H zKq+XAL<1a{DKM`-eLW8&Rxn?D_;~J^LGp&+C0NDWHZ>W|rIW{VBdsQTYvPjh!5Wu&OLx+JZh#9iw^d1rAF5*GB=5 z9Y#%WSO4)sLtN=UV3GrVELEGv%m4%NdB6TF{5RDrOWZH$xF;fjzAr)Tl{_cN*l1Fo zWPyWUyg9Yqlgk+k@9~jMM*gfkhb~V1c~7R^@P7fz0?oJNDrDV9L1i_AE{~ovj&Hv9 z;R4y_ho8TAPLs8=Vo!*DU}a-QnZ1dYTQxcc5m+S;j$O%lhZ2ona7jN)JbVQ{KK?pE z9c~e+SAF*rOTaH$RprX3EJznTeB9|@Y%b0Xesqvr-0&-mtL7J2NGVO);tEGwJ20x4 zY2VkA8HSQ?-=!>A?$Hq)_78t50Y- za7|K^r}DFUSzA2GN6+)d{`*dH*BViGb;tHye%Fk1HEegH0A%1^x0Gu1ZOO9A2n+w~`_DGKUiNsHDaYUoh+BUg0T-%nr6J&NYUlU=` zYWo`Bv``<{7TROO)4E0^2$cdGLKKaW)baAc)R`#fHyhGTD(hPoY3god-Oq3PH{(y= zwOJiGh7!>b!Q=N>Btmm_=xfv;+ZzHgxdK~6qQS<>syHq4yK4*7tfF$^l}k7m_Bq?T z7YeX?1q%85QPBn$$vraQD&BO{Gp`L02`{PU*x&#k#E~2H6Y@%09EL3263^zq1?;Cj zKTulh8a|>rd;xhuABu{KF80v+UmApG5`pu;*=39ZC#J;0KDlOr}BHm1h|mE--+}%XbH3RRL0b8J@o= zuiK|a&*NI_VGy~0v$V&7Y+FfK_D0|rx`#I`fCtqZ#o9nLMZ>691|$RWq@@ughZnbf z+v;UNh*8e2Mp=uhanz14jLt_~<+Rh9mcRe_Q)m$%VHe-x+@#OzH+$T!jlYwlv>#g)=06e|XK?&dCvE^}HJ9Wm$L?snhhO;st`s*lXqtZ@nrRi0g_P zejz$R!Hv#fh!P8X!2mVug{O!{UzV_BKZlH>8!A*MT90yEcgK%@Orts zpnVJR^Zx-=I+q&E?Feqo)n@Bhe7wpr9sa&o8M+O-*9#S?$rHf|Z|)@Wn@}(Pg@I9) zz3zIuu9Aw%(p1a_g5c^48w494TA|}Sdy8acGwvCeua&Tc`m?QMg(7OhF^y;=!U5ru zx3GJpi8oF(6gb7UR!db=042rJ_>Mz(l0Mz#-iZ=`)j@$3Ib9eU`!fU1Rux}XpH^hd zn)ydBD+ZoqjQcu|8#2@gUV7^kyolP}9bA@@5NjA#nIe-XAEv*&qqm-iUe6d3_vq1L z_Qc5kGsq0j?gT~Ca)U2RDkx%}kqFfLd!^N+*}!v&-FZmlHH)*U#i@TlLYBhZQ|~Qe zhyFui$&aGx?cY_MOISP?dA+Nh`C}~L;k}OQzfelA0>e0|XIPink1-!|s7t`j;H9sG zpVAbtfp`vAZJ(9>s`pA%w5$;LE5Dp zsbW|O|9+6YW}Ud^tNi_vdXV?9AAw_BJ{L#J_oUG%-FNE=VOCx0%a~Uh6@{EM$DklK zV2y6}t?l3>JGd2~x#jc}`>J6{D8OarXx&AF1(l3{hs_6iA?JT!oa|ezN@&3iFJ_7u zZMbW6g@k6GN{Bltqln3+k2G@eb$IBbJ;jX#@iN+m`k+?Di(*za4IksaVYV=ou%j$- z?#O=Uk}@86Xg;;529-lLp4Z}mrlo~_)6zGlY`JMoAi`tPo6)F@Lxz4tEjyO?Zgs4~ z1jP-2br8sF#=t1LbU1mF4W~irN=u=$s#T24K%SkrDmWD|CTFMf6u-FRDZJUO+X98x z#ji6q+R@m_{(dCd#1r$cT%X_>HR=NFmaf))8wCc>*x`K?j$$rL#0psdaC)n}SWA#( zRz-6aWIY&&KLFTvn^JIzVa$04_D^_ep!~X*VfhV+d|t;B2s?*Zh(~J-UZK-p*eB=y zkT8n4oZ646uD(qxHHBD;Nk|P(8R{g^-myOA#=wc>QuwgH<8_obJ!vU`NtyE@*;Z20 zDNcSm6a(cJX7IK&(Cs2bS-a=72{a32W(+^A(h}HY*2(I4|2QTia7OC*{Iiaw&W7x` z%@OK?%(?8zC%ZzJ;9BA#A#5o=OIYM}`=`(b; zy{^hJM^9po_)xE+3~RQOLG2U&@-rhJ@90pB(Ogk^g`rXtf8#4_k^(ZI0*~`XfyaVL zVRGEtorsTOZ)q?y5USAG`SrtgOtQ`mH=>u}OYUrdb@^Fo3C;Bw|-5+dXYposqvI9;k^`|ARuW$J`kA8yt+ht`ulPJ_;xQ?X^w99-`_gM5ES4~+rY15 z%l;Vs)?oKD1^2<-2DECl@VJ3Rk!gzT6_Nmnts!;w3TSypDn5;fQxPDh+R<7R#dw7{`Wq8Mmm&`J<={#{3y8(Rhz~5 z$Pd@3cOHO$e|$M-`6cYFbb$|TC{}RX5;u1L%?FP_B4A|mjA)~W?v3=vH_5fHgah+J z-8nVJdtN;;6s#0&>j6_>a59+JS6fa6rp!macsj!Tl5Bf{A$cO*IE{jRo?ASgVRY~h zq-sac(9W|Z=tlXi|Kh=TPbjkvh{L61@amM3!j9Rp0v6(_GE?)XfTS@5rUiP-rO9P8uY@L3Tz%i(&82b4tr#U~S)6AR~NhQi?O zl>T`3#?fW1Uh!RiGt|7b=clxSGk_On^&5_G!zb65J4GPcp3K7}nr>qYh^gqqG2xQW z$&gGBNZg5+z&qZ)n;lxjGlq%H(_-*b1*lKl;)u|AVVrC!0CEOf&jG64&(DOge#{t1 z0J%jYcoqX@)>{oh+SJ|U>P{G3uV?I8Ck2PK&OB!3mzC*8%T%CMDRTgCC5vH@HK)k$kiNxHw)kkkXu=N3Y z!HRKlLyQyug-IFe!S^G#>FPg7%9-gqPD<#C#9G}?5&5-vZSe26$IBdR{ls0s?AF6^14g@yVIg*z`O-fn;lz-8Rzs;&-G9K|( z_PX#PN6jJpTTweu`962IBVFaT0TcB=y={V}f`Zk~3=UC^KJ-yI>23z22+YU4pVEz+ z17GyR;;NwB7Uq@yhAGSKT-);3>V+wuH+E;q6{jKYua`K%;6)~*UXS%Sa{EjTNEL=Q zd!KRfwP-<0j^qHbr%oTVj8ff%D-8Yjj7HeijIpd{6;0CM9OCCD&gX8k3M{wqR=I6t!ptpD_?7fwi@DikMtBZ@mzD47UXi~cf;U3Rb5R`C#uevmY&lV z#2?+PuDJ)qb7UPAZIuh=`sAxMe4gA#b+-sv4%b;XIkvy}d!&!4bk@b)wl!{<1JUhC zmXvE|IdF_@#0Q#Iyhm2LHg!giQ8y$s)zcxMvjoT79^3mG9dfY9WQT!0T(T`)lnW|8 z(BNQ(T*m#3`fHOX$Ro+RTN;}FCBFcsd{KNHrDWvHEin+FJ$<|&1}vHdVT>Kn5~Q?1doA79 z^G4YP*7qck8IRi#)JmA~vAfauUAx^9Y$8HRl`m|qMp&*TM(c1pB8n1Xlz`^v#u?Bf zLgiA)%Jer}xQ?IH5WY`Kg+spu993ZwU7)n%hF=?an=v_p&%YlINTgrqXK^H_ASa1( zGnjxHG{Dx|h+p@T4C4DfT)IASBzaLIY5y1h##61;To~QYvqaWrKyqA*wV?J6@Kj~-cb-^TyZ;mK0N%l^zBNDvzVr1ll#WkLuL{?yJqW;Ej z235A4$T2r-R=l`Cj6g^e4Fn=xY)`UN=CdRCqQu`%gv8hmYcub@c^OVv={>(ENNm*Lg;8{ZB;l!UZ2jeYP_lHm;li`RyM)FQQRpo_W|Kf#YtTheZf4!o*ERx_eI z&XBB50rNydEJ{W03a2VYLzEcN6tR*`=y|W-w^^z+zSCh?a91sVCVdQ&+KLOG=Xx}C zKghJOtk~8tOSn;cn4QC7TGD(cCbxpVj+SnL#o@x-dVvGWvMv`I8;g)k8xSJKW2D*og zw!aN??_VZo@k>AT*0ig~(S{74-|9u9=4}p%-HcGt50Y0RrYK_d1JX@)0U1Fw6 z>(@s|4;P)dwe#p#4TFURH^Z%jeb!9qAuZqI{)6qhmX#PD%exN8& z>Akl}x2j9E7p)Iy!#FHfjSz#~9+}gLjE3Hkz!&NAYOPCO&s+%Sn=x`+INatNcWUF- zh2-@N3r<~NOfo{TA=dAz0K6mfZ-&E6t+8+BY}q_IXpnC2xIa24T@j5VjWW5C98{ld zWs}zpw;0Z^A)8INvOo4zyNhOxnoKX9x+UeSyy9mYUI_QAaX*kN%NBlq|D`OU7D(5|;Y(Gk|%hjs_JiHW2>&V;ekoUE* zT?kOHIM;N7@$FCf-nVQ}II!c)30^nl5<|;~a=zU}J=p>2;Q9#={}ne# zLEUAU|CJ;>d>uNmYh1N<@gaIboxgt^kbM*Hfr;Z5$zYXH5I%lqfD!9p1O+ zFucVXlqKipRv5!Z(VZlbP7Ppdsa#^QvgVvJ{4eo+Deiditvbcr!6D4eN#~Q+fU9-d z2_QrE{6-#!FJ7O%LJhHn-0@@5jCR_D%Y=xo9zjKv6)gmr0}>On4pz@nM+!5XX)ooG z%LV5Gq_-+oMJ!!`jMswm1KzrHgT;A-9|okW)qW!vIjaPmr=!rVSR{1OODaesV#s<& z=OS-l?^2~!h&=lUqDRheh0*pCl>5qTk_HnpOfyxa7=D*k?Sq1UMs8>_Dad*7T523I zQDeyv>WZyKDYFqc8KoK|*2q$s=scMLf*)?mpr{2AWlDGFu=2^cfb(kKmD7SykjbVh zf87ZC;w$T78*BMd)=C22jHpDohua;MdvSB-V3HTa%ID)6Lz-iFtC}%*O1QGB6B~DO zs~x^P<%(9-0J~>m2>q|$rJ_Q{2&!6y9Nz+vGK8zD1qwI^&X1$XzpPGG%k-xZfeFh! z=@!P1J#pt8PEWzOSn^$_Z>Rn*#MCGIBdo63RZ!-&lgx{gwSA zMw_yl-5r4dSDF%Ok9-E#|E5T_c$tpGk>AP$Ug_ot@2jB8ZqT)&QsBR|lzHbuy#T`z zyPK`&@`(XjBt;Ie)-5P0r+iT7l&2n2HtFQ8WQWArBxiVY+Q0s=wUcHSGd8dRaC)r~ zFO9Q#AvlTl7w?EcPY+_E8WNI=@Xu3C2PvLwbnxaG@Vch@#6BN~>k;HqcU>JSfc->R zf07vJNN!tHRfDK4&amkn&K!w7xE@O3!MUKy1%3QOJo-pn2P+*_(K+~u4}#`wCfHH3 z3wl6^Z;#O1QDYM6Daf9Dv;1t%p{>%{IeS>gSoOjgxwPQ9PW>+M>Q5vu7`}0MDU*6V zeJ6$~-ZV*OuM|cZ4dR@oq}3K0Zgc!c zrkT0y8~GRgc&@)elV(|k0JUbBp_K>bXY~4>vZ2Yh3x##sV>nGi){txloY@w5rT5ut z1b!uco;uS~j}ihUmcM)Dzk90PD3Z-D)NkSCeyI^{LR%3z8){miYQfMd!d{aM^4WJb zt1>b(Hx`8Zhg{86UVVpvY(SZax3K-ywYaSBAlgP0H{2pVQ0dQUDjR*mMM}VtA!h9l zxgL9zYk9#tl|j zESiU3bP}u6FV1oAUicjBE-@3*iCK7Pog*bh%1lo;vp}KQBdN%LW!EMq92<^yIeie7{M20y z_Q@-%=&08}^K*}$jyzA(*)t1~lT{p`TlHitkP+O9Sb`RrDebMN+1h9uN53&jrZ5Ih zfAh85tE6zSLQ(?4Ygv(_|9apE66S9OtKSB*p|1`kL7h)0lVt5wn~Ckbk^#$%_?MTsKuXgkkD#wdHB`U-FINId<> zMVAA12Wqb8I6yu(UOEUuumNxGGWM1#GPonrNz>A72Rl5>GOC5Z)FHKLI3dVRPwN!_ zZ9s1#>)!(48$1(%C-EWt!BEkr9Z=o&kLG|f$%dBvvCvf0sjT-s;P*KGs|Ng>oHCFi zO^V8g85ojpMC03EfaPw${4v|%;NW4?JbrR+;{IZDb+GQ7m8>K!%2gED!_>=>@~U>R|5 zU&Le2l$c{-QEb>f`!++52D#@~10ZD0LK)sQrdf7?O1`sE3r+`NatM&!R6 z%)rc94mdHv9sq6H0QC7IE7|)>HF+Eo6Bf|}3({&q?%@&9b4X1^N>^_2O)v5)J%CXL z<|)O565>})6VT32gN6L{7!Z=D^%BjZSaDAUBa2)%h%B6Vj;#b1qx>`z>AQ`9nO!q; zPv;~a#OE>N$BHG<$dvVIpMajqz4U|N(iMdxWHb4MFzyC*1hsJH6X@2ZMH4za_*D>v zareVysaZf$y)ccv(0g}D6q)M~lk63(#`hW4GWGb#PT(rkOAV5_=n;a zo?krF!k>|dJEDawTy0jT+{jQ%Gcyy1AewE2@O9&ttRMJHRNV3y7kLF1MVrA;CyQ5B zpEezCO0cej%_baXepu*9`9$VXRpC4&o}C^IM#T4FOq;vTC?Akeu{|^XynLNVLNOVn zt(mpNMHlF_cFvjHJ$<_YL3c@^hlDk@iz#^-i`DVhOoI2N&WvV017}I1*=_qb<%}QA zX4@(T_vW<`xiy&EnIb|dk^WtL58>5^Uy~nAnE;`OLMjcWmbpzp+vBA~WbJ~2<0`PBdHJ}6e7(c%#z87HReD%y zbY&ey3kE?l^55!K{7>G*Lj zmK(*?^^jEaz76Z`mOraW6>yFzq1K1CRd3$n?JL8dI&SrnkYulCXj?)0CHkEU^I}qN zVvb{n8aPm^O#^#sesd9LI_qJVDLM>^H&&ml{8|3_Xf+IhZ3Sd>sh3FalKs8mRhML( zJ)F5Pk~l!SDxjZBc)9*k9|d#M@ii! zuod6T%L(e!cPh&n2C8_*5(E>cLI`v0k&3RYNy>lGYo~DcAj7&_T~{4?arenR=@#>CMM$juCp=fYDFDK@yzeGnBsusOSS1mRLi@#Tlp+N`jxudh~y zNb(PdQ_-`Y!MCkm)m-n%3EEBo8Qw^9KVUWAhW4~fRZyxDepssp?0BhLW!2WVlBvsD zDT3d!bsIp&QlZDrBj=2mkh!$k$OG5n!atf!BG1)|Y3 zx1cogRN=*^BYndr+~QyO=!31LM}oO3J@4mbfg_h+BHk0|W&|eXY;TN83QkO*&S`w7 z{;D*!C|(t1Ax)uN-|PE?RuFCUJ)Exq6=133Fee5g{qpFRWds=c?moIo5+pB-?r1!ggs6ydA$B_fk`3BZBLOF6 zD{QQfMGtrqY9|LD{CKgpXL{ger9-u5%)%|D33Ao!>A*|{A zTU7R(623H7*@iko@hfrPA+zMWs7X30YP#_Du;7xI`$@;~tF($H*9I+DiZ5*Blp!{8Cq&lk(IFNF-?VK!_B41y}0R8V! z?nrRP7FI=$v^SHHkBUOf!(M~UJN<#I$0;3_wwxx*SUlb-Qcd0WQkM_Ku%3FS2N_Y% zy$t7xqYUM61Wugr5Emi+$Iu)`H^9ZPmSw|os0|Ly$7tq-ohd_h5vdOAmHTKQGximp zxapcnq%NqK?(_e4D%OkijN0(Bi@|^3QT4=x{~L(F{=a|-jO@%T|HB^q2O=;rGc*3r z^Zx-6m|2)P|9?S*c2I?!tv1>i5O}0*OPrwYZf+20q@F;s`Pgpnd4hqRogi%oNThAr zj_xbtDPHgVuRqm0RdrW?<4r8*8OFYzn z2ZrBFID}@v&0v|>0RU2Cap{7YtH`p^RRGrrN{I9GSAEiR5L#SZ+y6ua9UYyFSX-P7 z!dJAx=NJI=gksWt;CVocI~W$=?*#^djdiehb@S=*WdK;|gdu%5*ND#I=tf?Id#eVp zOrQa{dQ3S3<^taR7l(kZ93p`cG>BhnjfZ*wvHm@GU;|^bFZs^C=06G$pubET8!M>B zMpm%yz+{QT2nMk1A4ChA8vxH4b~iRKP3-I*u;79y#62Vu2r8R4J;}7em`~d{? zhOxbV91u3 zG684=jF0@wdb5HL{dd>*R|53_ysPTh|LY<6{60NjsOp&^G_-EeBXiV8&? z)W`iDA)|+P0P$pSXadSy>(l_W@r#T;eeS>PnX1GJ`Y*k!*Ws+=0PTN8-(0c&z#E_S zfeO66In4wAcBe5NtF{UN?C=wQF$Z{FMms4sAF_R<9)9lOHz|8c8ezppJ)0nP}>vHfjPpILl&K^Pf8U;XJ2 zj|*ZQL$N4>a%O4$mZtSxXZhP?vO>V9gmMJ@dej1B=!rk|`P5gNetx{H9Nbe)@ay)k z&3xPum-d$-H1n&)?QG4l*`WOA3hmKt9 zC&2ateWROzH)Q-l_nvD1LOTI!2>b=r^YH!mMr!;;_c1kkg7-<~gMQb)f6*E5+rR2; z`QQTU4(fs0pX2;XexIEG)xS?I9O~P*F7yZQLvs5>_aVLhhBxsq zJ$@zsu9wW>+Suyro&Mc!U1R)%|9zT)1nB~jO*}IvC<6*qV-2irS2Yr$lhG~~N?z99 zlzf)KdwR8%d$WMpJEvayR==qq>4kMOq_LG)(2b-^;Pu2|Ss@Bx8LMpN@!-Q6^}*P) z63oLMy7@|VCwTpr4)R}?MA&8PX<}A+>WNXTb{C^BwViw}3U#Rl(2HC~ZJIZ~W3`xWtqrC1yd0ibjBeVa%go!Z*0&iR~ zr(^H)x<>IG*>3uD%LZ;21O>$N!{mNFL%8@QkBB?6@uL|ploR@wnNBvy(`3^kCNerk zLx#JiafG?Ntqr#3UO*tr$j=70qpE1^2G|=)6$dJ9n4w0TYEC|2Nw=+; zk#z0)R<4;^q)7C4vfe&`G6h!}cpq$TUOcOtG;se{#vKrHwmmqu@9p#FMLLuVRKhj~ zLvMQ1O7ymt@qDQy2=zk_pru0Cl%Y`r9f#l1F9>rSlJf(9GC%q8w!E>)swwC-SY8>Q z>C_WXv=dc5_p0q)wimnAP0%OherbUA$LNXp;iV-WAZa+t;ueFhYn94b`VH!Z7Aqju z{;tXZq_m}0Cmpj1BX*{db=SJiX1^*QInK=6+Ks3I248>nYVKa0Q{!5vnY4PHPOIbW z@BpWp1=+LP5yT?H;xLDsff@a zlx-Uscj8P1Jj)2~FppXPtmNrCvWiF4 zksqg({VBbrGAC*97dBX9&L}QhZ^X342HOU~tLsdK90}bcw(vz?*eY)~Ba>hs3!mW0 zp)Q@igywQYf_~IQ7;9W%VZQEzY^O#lk^e3vZSYn*iY|!Mx&?G{xmLh+cyTcNh~*;Z zM+c&4dAul~$EnL?wH2q$`~5N_ry8`}<Q)U`5phJaUM`5*Mi;BlS)AnuY;&6%?+C;%*7E?Hwho8UYVBkbZ?Kp6_Up@z<-{{ zTXcQV;UHQGJ7l4G7m#rsTmz?3g{!c65+M7(aBsR>&lww8Jf5dcJ3R5SB0Ux>JjRhK zu ziyPKlirk-*;6(IW@^9>p*b+cBO`D35cWa%h_2yH>o=qZ5???ETjYk0hjKt zPI9HK#mIZ3uz@^TkrcYQ1laV@Vmk2{E7r@?{sT<}lOV#YBDVG*C`K@=;Tbo1;X)j&%^Jf6X z!G!I-A`>A|z|1W+C~FUAt8|5LkHaIAFmnm^q)x7T-|wjB7$r9gm38cuxAf2p+}sG! z;`$$aF>19?EhbkZ#9K?n^FLpmw*OX&mKk%#N<4@y*XK=vGxUrGN^5VsQLCn9HuZ`a zTkW0)O}sth{xh31ZSE}AFD1G$0jT$S1 zA_t@mgH@l~aM=a}gI7_X7ho1BaBa6=AllC7!O@M)QMYR{6`JMB2YLJ3r#J=7C*!tb zjT!l^tqj$b_(!XbUtHH!ns+bt=4p^S=LZ-@^d7ljx_urg;>{Mfx@a+JZY*eYAT zg>JR8RBsmCjIJ{V!zikR-VkJy;!1tS(DddF#ilTM4x#8uTDr-UslQoj!mpNHmu~#1 zhqS=+AeFgJ=u(QN_c(yw&*Y?ew6t+FuEnAKtg%a90!I@7jb0=7r4A;;XLQ7NeAv=1 zCjK;#+E!gmciTqUkNWD`@1g8tU&i_^L-~fU`8!sosYX^6emb4tB)Epdd{1ClfAt7p z7~C0Sy6<6}g?PWRG7LrxYz8AdfK|9LKdmS%$qJ>oReTtnT0|%OO0YhG^VDv zyM(dqH*j-|6DdpRTgavedEMvn{XL= zN&LMnA-MkwTUCy((9*JK>X z-BVufSVrXowKiJZNYMh;8AL6mEP(o09sxN zxRS_|O3A?dl{-7+%uR;4!p+F-)XuKj(B6Dgq`VHUs{zQ0!&T=4?Pmgzhk}NHWaT>u zF-;I$CkdS1+&Q8r&*aY@2Z*^D^Q}!e*=p&#nIJn;(M$SUQ@=)Q#xtw?#_bG~<_)0i zYvj1sz>o~LlceF)X^LHxN|2Gi?9!kb>^H8=IXjZ}FKea?vT2+qRbgmu#tsdT%(CcM zNhMTvfB1HtNsCjxu66-he`m~CM6N}C3`QP!80Q`S3Tf=8ER6X!xaDABE-H0qoj`H- zXC3eV*_j0ZC}+!VzN|eg+Z|H%A8wG5HO;C{-Bj5f?09gEkW0DSe-8_3pFPPfyCm&r z9A9IzhI5;f*2vcR7_!q*u{6H%X{`0Hr#wnGDp4`=#u->bLmj za!=umIEiiuIuB&s_cW6?)rA*VU_8Z$r@q%72KkC=;=gr10yRt(=z31Ek6e=+DVCbR z1hu$1)u>~QeO)-J7>%7e8(z`&QWM_?eP2lRu_?wlJFwtYJjp)gUV(klj}9bj-J&QL z-V;5$~2lkd;5&)~U&zb8NjWsi5yHWMJ?%^4Avy9C<2zKLs^Z55^a1yVg~%2{!z z5IT2E>K-jrN`QQI7UA~hZ82<~5bZY5JZik=rdZqG zL#S&e3S3N+xe>O>K|z+O*a&N_uMQ_ys#FoB<>vvc8F2^es@6Q&-HP_^miNg(UWhmN z!=kTSJJA_n!+r?M@hvK!FmoXNnrK$JHsYS)3%yponQ#ZcFxGj(6SC~dCIJ~u_?}kh zbOJE}(cZJIB+*4=XPMtKAJlY^Bz;d)c-Z`P@-Sf>X)$*~^Ue)>u;l1xkFI_fA6>c@ z>nij!d#|d?>2ngy^uXhm*n)o*ie@rl*1-7OK+z#W|G#=#9=pBYw3YG};~<-O<`0JQZ<-Q=Sg<71vr_l)CjN!R>(K;Eu+Zc;L0WFwJJJi*HsPsnAq=wf1=Q zM)^U6h9a%Wg{ugkC_Igt$DmcOv*w9^YB7iL@FbQkk-p$kZ05^+Y>ER@b^rBzz;jQY zq_z`%z{oJqT_NO0&IUS4-5@i-(8CW%`{_nh+)%}1#~DpJ$V64_hun)GatxvB01p+2 zLSL_Q-N9`4S_DcEFIF`c6M;S?q$=AP$orllX`0FqH#vOQy}+|>Wf%-D;^a$y#_fMT zcXxd|r%3>UxB_jqgUPCYXUEweSJ#TXHR?+DflDkjPJW|c*p6zdGzUjg-Nygb2yVG# z1rjC@zOTeV@U&kXpIOvW44}O=g7>ouWklGZGjAEQC*F}aVe*~Mk`>O*3+7Z$uHMK( z;e;rf;|m^8q{=I3y<@)5WZl{{#X%*uU~*KnjTjkMPnY%s*ZzROJeAz(W-#VH5;gZF*C+qx}zM6^@%Ow#C9xGD6(Q|i3Fm* zuVoy+2ar3U(4*mZvG_auiLJFlit`VB^u*}c&aM{w+dLU&9kcAXv##6$@|UbHCC|L~ z+l=w;P(xON7lZ12uONX^&O^Od*t+hRA&x=xRZ;tC;_9KRu28YOoNf_d#N8@w)2bw2 zr|pMCNAwlc(Samt`o4}&$AG=W?0K8qOt*J|6T5cwZV8E$X@y4!@{_1Gq%;Cwy~&_} z>layaYC%EuEYm`V(~nCj%2BhH9@(uaBi>TuK95xdyGt$dmIrGWuc|P?X~Dt`rsl}7 z)nfR-681<&$#7YQ+C2B=xLHlMSM@8ym$h>9gy@wB-&nX{8X>ZZ3jjt*KYS%ek#9g=`PZa8*YIGbE0H`)a?OaQfy7s;~r)x4Y0L+600e5VzU4D)w>&z$!b5L2+Ssq1rj zAxnJL8CRjC!uS>&?A==UFwt(gcM|I=_60}i9TgvbRYc3S;l$Y9F_VlF$X-GKySb@I zTK{L-AC$+}?z`V7!RzH%=4#7+C`OXIsCR*MgNeuf=2aqW4mmvgN$t!^?9kiuKUz6g z(6=-OIlWMZYS4CvM|%Lci&%OXW%5bu`2Lgf5$i17s?Euv;vl%BA)S_IsLeAHG@lf8 z!dH?0nS24cl)IQSIFbxA)Ecl(>76J2H#m(w+v(Mf+(;DX)abXG>rOzkw`h zGE%SXoBxzYbr!hcq35Pg%~ocL&jjqYla;HZs9xV9UHI^X9#A;P2q`1bKJh1k>K3#G zTDLxkzgJ{toeszFw}|O9Nyi*Bf;YfdkpT$|0~KwN9n+Kq=bmrl`9hJB4bO_wIf1{2 zsV|M3O!C(JzUUO$>0k^r?Jad6W&#w6#HY|KiQ3yEbhIxt;?ZnH{amZk=Fw!(?nb`d zZd&%Vl-PmoKKoG2h7P|2l#lV>$}4K~M4L$oxyx(MD8aLgTp|Ref!CX?tDrf zrdv!<%rP+C9B>^bP4b>rVKlI!Z>+laVDyBw#h#1OcXlq4(mKJV(72;|PdWgN%1X>` zsb(Ufv=^YQw6ScdTEn3FrcYsdJ^uddwz8C*l=miMWA_(%!=g`VfXD8?TEalUUKeE? z^AD1ojEz-)K?;B_&ahGK$Sc8#T^P3#Nbc=i+avVpV$6sNCM66JMU)V`yx;xL5_YKc#PE@^o*J*g2=b5AG-WX4XDA;fNj9 zvmU9B?tf8MMfRy?`1zDHGv6WCzk24@pp)PZ+m(CGXaN8#W|BpuMXTVD>C@7zRle16 zvpRN)sSy?l{*!Q#`vkEU{{RIQ{4qXbvTilN^o>5rdWGrH$1e9wZZQcqeI|O^c8A6A z0(R|iBwHkCh+ab`ma3?8Dn^;j0C_e&fsKNbItJ%3$n{=ZexVe<3gL75$vIkhYM!;H zE4JXVv>#Ggn;i$xn1Pvd*o<#<{UHowDmu?%#@KeE_%xXaa z=rXs1%M<+l&&eC5+t89V;LL3N_ptppI+~~qW?ki4RbpI zE5X*X8`nEq4e8*$5^V3Ga8$WJ~eku2~+#XG|7>e0el0M9| z>?mivog_3qfvo_3%Q-c}73qQz6aegEH{uY4=SX`MX|d~5qeRp23DcPz;;EN{I-n;W zhyDgtOnsi;0QELpVD50#@>VAq`=$qB%ZI0>6H^)V>oV0hia_gVn5qS9G`D|YX4H&V zAohs)%>iPF_n-Eibk|&mo)D3;BHC3^f`xdvL)PNu^{g8&(dRb@2`jQ2AarPD-8zLz zZH?1oC}f3?smqr@eu|mC{g0o+OTWq2cOd>I9tm`l^!K&&7-%*L?(3&esBnL_z^O~2 zoBLTB;2V2%riSV%L3n?D!}}jWW_g1dDpf>ZmT{r@UvOBWGfu~CpXh$!P1yw`2 ztjMp)7?37EEA1C0$le2nnZ=Ffb9BS|*__Ko>X-X;KC-D^E<&;{Dbrsnga!-e*?agK zXQ0pfnBdXfam$&cEn;C_(?64bhAE-mFw7{%li4T4o}zo2cc<{%ytjhJi5AtQGNfp` zLQ=&?@Mf14#n^mEt~Nua@gqyd(p@&IQoxSF`H@9fzI04IBFCyg!ZeBBA=H-TjmK&Q zYrZdiZ&8<4&n*GRN*jm<1hhsLv6 zOJBA?x?f;`T%mP*AJmBdozmc%Pq>i|^q~5i_nC)|@1~ zLOcThrr>L^kMOF2x~J@ly8p6oVMRsak{ zBI&PA#~IOdZokxEC0oJZCvMS;c8$f&C_=eK+`W!`wrl-2SgYfNfGX37c?5148kOO} ztBR`REvi!6NMmi(ePf{79^O0;w6laOfVs((pI@T3E4&uY=wbEk7{^**P(MYfX9wnz zc4PWW!OXwblQ@-l8x6kO_1XyF!|_kL^%CuR*iwD~0+pvafk=ElUgI2lZ@_vkxfBkM zqAEqMEVJ?o~JFojlL&j8K1?dHqDElj>kmzo- zUsD4OmbjJQZf8X9>^)og6MS`Pb!gE-jH}!QleP1AXSjW#IpH;!CL3R74MEW!*cbF< znD(RHv!5^a_81iJe0>%PYNbd{z48de#`fsr4TJXK&Z+tcn+On5!izhntP;tTTEd?C z^n8&4M*y!Fo3;xXhpiPO4`(7r&)8!YVhkD~!|o7JA)y}Wmo+{Ssa~(yG0U4Pj8V*~ z0z~2YU9tVr%3HQSJ}L{f+y0lwH5lfc+;x}4^a%tG0gCpn*27e_*8;&(NSr%-!Pr8`trR_R%#ak6f`0$hS50u-;@2Fm} zs{v=ZjPf-hn5BMIB^kALdjG|^Ty``|9CjFB9@&#{tG5QZTiVr)tU|fq7425XZzdL7 z$sfqw>CB(KQc|cM_z%W&)DCbJx(DuYHo)cJ`sJ=&Rvk6BrfcQiGQ}}$SK(1SmbxPU zYCJPo%?Z{f*+T5NPSHqx>JOJ_S8nG$otH()R{o30GSDm^ zTmvu(i3k*3es<51WeHX#1*svKg;kP(E6qj#%dk*|%(D<{009E;DhAd(@Du_2dRvI1 z|D_SyF=xO=J? zdo0UGb)_Dj#(wl8o@!0g<2<(7JSlRp3Tgk@B}bk z>E5DiuY@F#`9rG6CASCMpvGLkTFF)G7wVkR)h@+c6!&yTKpr7 zB5!l-KZ@Ikvag;Ct+@wbE%#VnHH>AVHyr{s65a`Eyul}PA`FSi-LYTE6GE9am@yFi zX)MMx1C2X>+lr&MtvYDmJKN3hdpN+se!_oO^2W6RllDG8d7}I!%;#NzW`cXh%Me?_ z4)-XM`fh{fX&~{J@vSzPkH8-~Jv33LahrA{bD#WAxQTEy->%fJlE>5J2T&(dPI4S#fI4|*dE4&*ijf9$~ zf8bb3I7GwJ<;>N>kG**|r5x+Ku}G+X>58+IP+ZVbPmJ)1!}Mj9F=a5MWh1TPO-xS= zeMjj|!(kZ|BSbA{i-RcrcJlg~xFBzpG|D3>yha#rS-NLtpEsLNSLl0qAs*Me_NueI zJ7(Q);4uGGqvB+6TJ~LjJ&L38>Ag);Lo4CPkf^WyH*f&OuDK=Yo;5Q#Uc+in8 zKnqFr9_JcDZ-AM)Lx|=)trOR?lhycC$9n;e32tV4p)^B}UT)8UIAiF9^$EMT}0@q@&;1<}$iev?!=$6CBsrhf?+IZ*A4U zJ@bOSdyJl=9^pXz#FURLc1V-Uq;&ldt(msFU9)%$#i*Q$PfdH;%svlciLm9^H%*pQ zNw34`w=KBYph@$MlaZY1Hv80J(~EL8Z80};v+*39-dK5DxXkr}>|@S!gm=ZryXraq zc7QYWxGy`k7t9G{EH;Lg#6#{KlYPR;){^-^&#I-Q``lb9FhH;JrJoh)Pv%2s{Ld=m z#@gD;t@IHcPa?@HOxsP$g;VH6u%7pW46o}{G2}s}k#4aqw%woa+joVQkSEcjIN`uC z(MBtNnzRzMZP`TSbC4#STEF^22MLg*Fvp7wDM=cP`rt;Ai9s|FtKv{jsQQ57)%a#@ z;%xVnCv;OftSm(#N^vq^<@GbC+qs7gsMO4bqqit({=96d9mp*A>(@3(iJvaR)IU34 zL*+JtYc0vWxjUh2=v8IN+Jf-g;k@#V(}BJkQft_nUA8CMuQ8eT&$U;@SIzwdpr62+ z9JxHsT;X!P&wCP{N>u;(>EvIR$LqLXie~q3OrXC3Rh8D3C|t(u#jEM~_kZTBbInzH zD$^OhDyjd7txzwP*Mr%kCMED4iX>q`8F!`PU!X#r5=uzDumG=&uoLlLFL+4zxv=Sw zojw`W)Li7GfIh$S#(;c?dJAf74p%g~lXtWP$3^ZG$I-xd?isO1mjVa8Q6NbrAMWfd z?c>0(3#_efJXU;{>HGeO#U{7V;Fi}#o=E+*pS;oPsV$<9hL?+~oxj(KN_NVT9LZ<)Gal#jF>1?Z}XR zRjwnBR%1p=X3pdd7 zda@FWT4!2NfzFJ?0*PDp^;A;wei+ES~sd zJn1PJgJ;S8dT(ErcKAEKP8pJa&h)6iY{3^UfpG2tQUgPq$Si@MaLi0}7L+u656Pg- zRaeTBYRoigrk8JyEZg0WFZWa?;&8w9TRuf&tBt3-g7XQ(f*${^(&Mc9u&cQFCj?#c z=0G(elvaexDohpR(D>Oj2OcmE&(-d5gyz8Ix;aE#Ie^Dm_pqx=S8=4T)I`$8e(s2b z)vQ@DZAkfrYGF$GNutSckcw!>GE@g_<8w@rv==07F-fZOJQ8aY-Xwc1|1cpf4lcwD zFoZOAp;A*aW*?QIo#r;@m;wm-t~*eiJ*&GGMfb`_reeGqljsJi*fC{&fX@Q7OKJKv z+51~$q{>)}fp$ia=n~`F%x!yF#_XM8#=0gr@t4;6M?w8)EOL-nBj!W&W9dGC* zx>7RqgC^;sajX@j?;<5@xSb{}A?Ya9D$P-J_-JGmtL*ClvJUi3W$s%q z@zz`_;OydofeWZRney78_x${aacS8DTV;1tFwL@CoaK~2jqL8empNf8 zAWk1wqV$<+??N0>ddQ@;`952@Yy{SgJqe7a}dkf@b*}B{7Y# zi6eZm)x|L!5^^6||1j2E3ImIoa`8`j;t(@`s!KQcJ;4BLGIrZEwyhU$K<{kGXD5GS zD6r^n?LvhxVq*SYfw1Y%x>@%8rvJ2eRKn2Tb#AE3F@o56^)px3by`D(8ViXuJoudR z?*em8Ad$Mgb@uYyfYiY(68F#Iwl9$;cJNi7+%Vqn>7pZGWY?jc_j}s!((L*UFcQV7 zq&x+;ZPdr-NJjsYBfm@8#4nPH&~I3C?c+lC+Y0PwGgOeZ6h|!#tRYuVBUJ&m&{pi% zN0~}GcqjbZ1v)T{<2q|jlo{4qnM*tcJj``X+QwJ1iqyNS9E~I>&30I()p^IlW2BXE zvJu8NmzC1n2HPii3SVADSuw)#?i)5A3@6<-Tt)(Wm8?d=4!vT}_kuQvj(l>8s;{l2 z&v(sVDr*4VFV22MNfvpLEhcRB?lYo9|KuxFc><|LdYJQu7hBLoOvH=3K5^^xM!6k8 z+FB2{-(^)8UpV8jW3IEhb??AV0EBf^4z8TRR@%&>Gwh5uCe3k6cgdNPP=o9 zB}u`iRNV<1umcCZs`D^4`BC;3b)Px0%Z2OxJvvgM1V$D#Jg8q+q@yP~_;16R9EH7` z!Uh0oV8ogH%|F1j)t>Y%O*~XFMaaInVJC308cQ!?ugzr|M1$_B0p_MeqX-R)+eyqDSVfd6*kTZLrdkDT&zvApwg z<+vA1%+Cx9o008 zG@EfGrWS9N2|lG$Q0i~fti-apU{zVcS|kz9$#t_n>)-QAIZb@Y$IvB$4lC)iLDimi zX?XzNxl?Q~og8er9a_KdmBLd~D3rPRNL>b;BNBG@ay$rpH+9zO`rl_hw=t-q z>ICtrpSXal);1t-_$i70uy3x>idk;{#8?y z!8h`#H?bo$zqV34=qZH4Muu02c3uBlVqBl+JE)jUCHDQtGZ=^on>@M-iqoG$-b6Dr`B|t zm&36mN!lLMIkF#7(7xIxfXp*c>wgjgvIZp}6!ulmkfF`UZ6Mr^2E`o-c&os7#v9b) zrX#UvGe}V1J|RzEu-ru+lcU`dr^;T6T)-nQl_bbA830&ZCL~b<%ww!Saec=wi6gfy zeE!n9L5}MKsv#EBRvycE>;q^5G~5yUJT#{Cv{6Fl$k{P2-9tW^x$QBPic(ceL)jKG zPr$+c7Z=f`0jIT1yQ2yF(Yv7ML`2^ocElLp!s-3KBc0`$gh^l-Zr3$BA;l`UEI?(9 zFrf1CDpd)&pryvoB(5q=kRb;$PbYVi4=;Pg;IGt+VdPWFAjD^ut<-;Gj7Qs)8C@ut zIbmPiNbn+=v<$gzRtxC~pCDo|or)-SahS}!+1(5JdgcV)i@!z%|4Onc|`j*b|GsYUf!V|LFd|3Yv0orUWJ4Q4#pKspQ)|w(_H@K(9R~Fim8sbn zLE(RpRcBh84ACRKx9*hgTUZRu_uN!K5yel%-S+AU7=DuuIqIDEOiD9?3iUmj@=XI< zTyDTw-i_~h{&PP6WbUmA0cYYV-pSuu0^)^U(*w0$X|DcPL~?}UZ;v=-uVhE9XBtmX zhH@fs5vhuF+cU*E9zFoE(m+V?Fkg zd7WXFYgnE>qvfBW4tI>Qeh4RYnBx)bZSQC;b3c~vYKZCl12AnDVI&*G!`s=aY+y5d zQv-Dg5E_n<>yZjQ%O-vqI2)I(g-r>|;xjnW1Q)Y70<>LXID}l@gtvD+RFnJHW2`w{uIo``QANJ~ zHBi(xXFY6Nnu$_LO&V`>C3jm)3&XzWZ+5 z`gky@P9wwD`h!@t)XZ5r;1J-p&O{HOYTsgYDJ1IP>AlB+ugDF*UZO(LRr(l(Pl_W*nAF!amwyJOozW&K(J6Y~ld8U&{&A_;r?tFsbY)H-{G9ndYwcn=iu~|05#(@z)E5|+#dZ3sn(OWt^9|!6FjQB!5u4bL|Eh7 zwieQ{N9#GKq}J4PQHWT)Xc}J-g8FJ)gT@(I=w2_1?rRI>;ux4V(B@r}3YHZ{p|DqY z``N^9!(!WnBGdDLNiQ&=Zrf}Qa~kEvERAdJ!TvE`T+FOx)U*;W-#s)`H)y{%SnArT z8+is*q;!u=YN@HX`z~pY-ku`~#>Y@b`GNlqmdpN6+!N=2;GURR{@48ak9*=^W%?fs z>i=+0oSdxe|4;5I`oFoSuC7H8x7WR!n*odL(QTbTD|{^v%tU%&6y7(9<%5!2BBAo12*oL^6PjH1%oUvE|DN-OZ?+Kz~>N$|MSeqwlLd zXa-;o!0iN}CDQ`{DLBEIozZ(AEC#^u30VK+@JF8g@5>K$JnEU=>}YA}i!0nHfjo6Q zX#dtE8iYb(vYF$(y#WA5(DV-zORGz(-z&Q-b890jn+N-w+VLoWBqFN+y;sn$?cDm( z#N@z8#>D#MOC4IqFVy2~BgnYS^v*0CgrkGlTNR%JHF^Fy_jT^HpZp4#@h#lL4?9B} zP)5e@a&Sf!a1+@0#Q04^YZywcQZzYw)oXMi8+ ziI23m9$-B?a4&HGcQ0fCJ!+@DPw>FDrUq<;y@MmDr{|xtgFZwcYU=*!$t6&IpyqlY z!mo%QIX=wX&Q>kQZgDjKew^J zMaZZvuK@1MjZOd<|Ik3dZXO;0TRAlUTR(9{w$=|fR2n~R6M>T#fStZ5AG32mDA&)| zFN+@^HgmvVT)a_r|+2OUysG#k2JwMU+zU#MNI*Enll@~qB zOuzGAeoG^6YOOgx?C#s@s;SQ(>b1T+pufLt%l~Y>rl|g=sc z(xBe_9KShAK*pAKFRPG7hetpd+?<$RMD^YDNZ91${aMf76q$g$KP^K5reyIwQ(e$| zJ-mAU9X-f{ddSBIAPiAoq#xK0fa#*Y1hxQ8Yxu*!`e?sF?ts%szk*vd0HzcC;i&yI z&)^M!>HnIlT>+Y=@t<<#f8agm%I?5>PL;ocb{;9e!SB0Im4AYEn9F|zZ!wpC2;cyk zKJcG*YDWJ}>pcFOu6_PDz4#7);IoSPD|nld@g;bhTKX%PeaofnwfXAs6BitGNFR~2 zjsM$sGHv~WKmMZ|n$c5J)3C@-vqK5;1NmWl|GM)%=6~HY^=iW4+WHl?$PItux90`% z=-1zutm-G!_zSxIbEN+*t^X+xH`Wzbm-z z@muq5$4GtIHO3EN>T^2vJ_qn4B+%xEF!^qK^YtV1CSP+4!?pRd3Rd5n_DeqSX)|?Y zcnn4Tai;mO#@Oz0G$y%4)bNpxfG0hl`N`r#3L_WpYlFFy zzO-pL2Tmg}M$uwVW&I1Blio>J9^LQ^bkW21&KT%;WwyZdy)24g;PyJl(fjg&;vL3?ApujK8!_>KcxW(QLRsb){*#$(&P zKcYw5mtNC0cU=A@1GTHA&}uEiaux)ju=b(IL8ojA1tKUn8qqvsd$oR8j5?pKq038? zQHCUfTPvvbHVG=Xc<$|`a%?Y)Mt@9ilvb?B2CwbIX3;JWMp+hp+s*t2*Qeoj0eC_h zD<~!Q_N=_5YB`8__sz0HtqoUqyKRF1f-oLYYG8WUT**#`6Ni30dyR!RXS9Ih3g1Ay zA_|LhtD|C}+7Y!Zd+=zSiQX;LJ2b%4BJ67+*K#N+Yk41BV(e=*A~w{q7=W&7E`P5g zZ?B$yghbQeXHd~Bi6|zZ*d#H!I3*t(&zU_MaYDknV}sZ0zDpf%oag(@k{|{O?R0|^ z0aEV+qCz9VV83z7$L1ik2kNZQfLY*;RXkG(*DY-Thn4+=6(r=SzDXE;z2$ZqO}5e1 zC~$)!a0J@9Nb}?RCe(vfTKIy##$fMLpX<~y^s*T>;AlU+y#AVlGtZs)a^+@yV1(jY z4sc$9V-Mnik62-1spCBu@Zk&>YU@L9ZFUS2W zL@~3apKMA6Ji^y78Bc+E&0dY<0uv{_rP1z#yUIRDx7Ms%=;{yN?jt2V(c>XJ-Jn!k z@KoTx8CGm?@WAFwr&li&JJ^xsD;gM87wl2jMxy>B=X;?LT+=DmK~jOdFinv)@SHxe z1eTkD#HF6%og{oAEzT=*__I!5{15^~o&;>D;AS7ocHI)5ORykk5|5RXW@RNAie1{D zZWgD>18w*LT)`&2f84eb4gOIi*~IEIKlG;>)3_i(BudF>?!+k}@xvl$I~9sJyZxKVCpb6w zY+922#^>PFPks?aVoTx~_7y_dji4aNn(4b6&cBRWQ8+}Z4-|aG&Dg2%Uy#_s$=ACA zW)(X)?7Vz%l3*nq2f;nyg(q&{uzSQ+qSstyX1U#}XRsK{;M|&iC>p*{&SYzvrtWk= zCc`zs1NlB5o4$CB=+i>55-NfmHy=#w&qUou8Ki4v1ExKZh^ZD*QN1?njA=lHbNys6 zY9-%zPVnp66<@}YJoOTo1`SwSLRzIo;D}AVO;U!kFZGn3Nn~{XT9%AkOg9d(=#rLF zbH`Ou1_!$UQi0-=DVJiCqP;(pswwwrU&=76QN{ph4ftGZ_dH7qw!Bbf*LkT!QiIKA z#g(vR73aVI8n^l0e=Rf70fYj}7SVTAP^V&SuKn-Q;e-zR?mmWG&1TiVOaXCimI{I} ztNKQ>Z7lQ69JW>&+(2srTX+8R^wt(2^suAq33DaM5_WpQ9h?XuyZ!ZX9Og(7Tp1w! za{$Q2Vw}vWOK>X8+)sFvw#Xa32G2ryWAi0wYx5%!?+bx2nTMGVW=@Ca)X_ldf4PM2DtzcjbhrQG@(Xriw*NfQwZ7%Nnow2J(Yu#vh z6mB6DWhBZpJFq6!ncLZMY&^L2Enk$VTf_^~k|DG>7M0Ws?zq|8%T0g`&|X-wYf&(X zB7Dfs{6R&+1dLUM(UPw?M2dHTsLS!CPvhm41&oIgFQF7)J}0+V6oeqlU1T=Bwgb3a z9ihI*e1XT73dmYjY+X&#?k8ed-s6#EjEk0-Pd;{}iu0bg!jV?b{ zTGFgOqt*t^qyh7OapT+vjua@9NgK z*4KEg8Lk*(SJp1JBImHjulzvGG7y2BgKG@`KrnMxXZ?!5FtJ;>30c0mvVc^oS zs_<99$M79GG|jT@kH$lPW^$qax<`JOCBWuzDKX2+cKFT$P@$JyAQkE2$A~;fgwtSl zG2^qu%N6gPneB5RHQ!i`lm|N%9XL1Z6rKMWAw^!i2qI8&_Zz-aNzIp%=TN~mxCj@Y z*|~SmLO+9+k{3yjQD0Yc5~m$KPEOOO8i+NTfd)`J7so%8k2CkHPvd``5(5~w&u%`Tk z*x9-7fCp<|h6k)P7fr|8=j${E6E5GrK^l!ZabY$yqE&UZ(_qBG37#fnjkF_Q0y*y^ zJXZZ&f9?EBUk7&yM4duIZXznSz>LKO3M<9vzU^ps$a@Z9P+@YVt!ZZUHjOedw-^YO zbZiFs8l%Gd05&d^H#6S(2XP>Y`J0$2^Nj9MAIQtqJE3cYcm8@jR~2r&FjWdb|-gP|wS)3Mg4vF|`r z>^hb#1g_p}k56=lqKIHX_+U|^q=YjDaXAIySN#eom116Z1&8C>N}#1RntG~gjAy*% zphYOBY#9mQ9A=z$S%K|)c%SLz%Fw2uxdikNLm0o@K0#^*qqj`77{Am|i`@y+u{E zuQ1Rzpj0vJa#Ke(!4r}YHJ;+ETIctEJWHIcLK=fb-Y{}-`$Lw#7hXJ&^oi^9a6W4D zmQ{4QGGVw+o}RvNuf`$W(kVmz@*7(M%U$E~LUN37_lC6TIMi7-E{jv;E1fT!u+)}; zL?&YILYbbW+*u@&mguu(7ifW(Fm7XcuKCi_xQ-Yyqr$%mLmZ?;-)|8HZQNfcw@QB% z-6yMK60nXdTVD4?(c9ou*K8WH12P(Ei;cJ8Vzt?^l^I)00{=7A%cY z|H>Lw`%QmdBEG?U3y2a&yy%~RKSL$5Z03S+Oj$6i(vIT0u#h10!RfSPrR#I+NjoW6 zp}8cRO$Arp+Lz`2Vd3S(Sb{ggAq0@G3gKzzi~?t!6)Qyy$ZGrxIs#q-nV9u>*6T1* zjSq^3AEX19wuNBxH#{Uzm#BR$@r)Z1E6D?<4uFcychMs%p{*TU20&I9Pa)0MmaKwN z{-`5*M?+u|UHV^%Es)(o#3;!K6yjTDB%|R)6iU6M{ZUo}l=hV-dyI^7z}JXt9B-|O z#QX9OEp{Uz;OH}IjIXAGWU60U5{?IHSD2B;}X+t$l`GM+=WYx<<0dytdQvaminr&yYbWtY~a#a z>5B_3GKfG4uj)yu98SE*?pP2R2^;A8ESqkY(srrRn_#s-L5=fgFeE;Z5)&cu$&jx` zTEG|vxpUu2kXK+|)%1x?Nc$w);VfZ*#R-n+(lX}tdF3upzVKr^XJDeohNB4LVl;18 zMt4dBrY^7r)mhvQMYgQq<<1`gnizl&*$Gq_US-psiU>L)?w*o@fKrvU{YqPA1H2Uj zlEa4d^<$b=$G0soE1G>kNe+M1EVVnZaTDaZZfdTr5eEyI)|@7Mb@v{*NJDXuht&u0 z3o$$39^#jsln_|bg;IFU&5QY|eGXqAb!dfcMEls0VIr_d{XavQazFfKEa!J%pbc_rZbK!*w@En1!NIKAy387CF?})oKl&8Nkwvm5@#(5Hr z>~hRa11473eAbVUNy^=i(F_OG1FyZ?mQ)`O-I{+}D>03xp_YsCrPWqKMIyG?QDD6B zU4&&!M0K_rn(1=4 zcfBA?xBj%0?^+H}=6PXpMJJX6ED~FK1{S4%K2pxTrY^?&ciznd$zk_-^sd%gJGh0x zr+lrX>51m!Rqgv>R8;s{t^^2G7-c%BZ4LV%R!P^dKMq$vX}P74@fYt4X8bv_1!ym@ zWtiGaB+$IWCuyKaM|P(t<&$hg9wHwBsp^mp!toxtRF^ZrkF(>kbBmdY3Iv{P6j=)) z@%`r}DLjrW^tThZ1uYfKlCylH&`FtZvp`U0;gW@>2@@Y(MF>35!}4>$iYY^3vbJTM z)4|}lcY;E^^VRAUK>ahJq@BFb5(rzn(LNWfgBK z2$`tT{?}G8zPjAQ9MAWKvB44&q&nrbmc@fOjFd>0!X2+*BwmjkNS^&r=;}bxd=(`1 zjyL93l5EH6h%eR?Et;!PNK-Z3(M2bIzGFyRq&GpW`IXwmR5ch}>4=lfM~rCDZ7a?U zUk44@1C=@TbCliMq&VVnCA$e6WHu+DTyLyxtiayy6TM;br<|fJO5~=zy8Fn?%;-jyY_#dc285Xe1~Wr#TTqQ-7J%2?8>5khWG-^Epd_(|lT<>qw=tlr zcf0_-19VL04ZWt)cQ>o#Z)C1cc@V;Tgt!3~G;s1~Z+ws1kc#P)JV%C&ny8}1p9|!> z&?xmSLfIOqD|05BT2B2?*D=08E9P3Jbk6=2!H6fzURncgfU;AT*{j1SuA><$4+K~}Y-7i+cU zQ%*SMXA12c%tN?nl#U3IEZmWq#n{ti!6U?wbb%d+HVu{|U3Ram~xtxD0z=G87ejtPNNq$+oIRsZLKf)ZCviCvofVx}e$@0ozs2me+OX z*WBp(2BtwZ5sEjZ@^jnCTbf^Jga3kyd~$E4*RYsx8jeI*btM|29!U_kCZyL>3IJ3k zyb_)JM@7A2t5#NR;PKcHfmNO+L(_m}F-Hp_ zJH{AIrt~emX(&^z2Dikh|wL^V41fEN9e z+XKQE2}Hp~W)yixAG3ZJM?VQho(yp<{B<1}nzB(|TY-F1x5HPRguzNzqd-w~w#E7m zE8YeeRIN@~*@K#~IWK=2-bDQ>#ZawC+2Xc{E4RU2niYQjh{%{^v_Ewp1q5#~PoLy# z2>sv@=L;r~(A9;{r;P5ssBTMB$2E5EiZ4^@+5lSQ`!40`m~Wa7BNZU{s+Sc?h0T&E z-NQpwtQY*=0PL+?ZT9E%JTjoV?g?ob*FWpJ`nYMgJDEdYKf;#N(-5B<)s=U&QBeH&q955ZjZ{6-E>DVK+MSh;mPO&n+5q(rt(F!sX)r zmlgeykq>KbVSY#JjZB|E!{p^6W#Zg-Bnqf*Po6LPQdLnNh=AUS2HNI2sa@y+lZfBc z#dVSro-iJM`h;39VTT-mxOH6OCpz78Gr|dXnM3l2ddSoTtu(a*ix0xPa&1^i=@sgx z3)}B_?V|2jpp4xrTJ!fv7c(jAvp}1DzE_oe<$mxs!KTg>G3%pwb8u-n&p zA~+d#dww>dU?1ILcPcujB(x&+!WoR zcdcJ^zI=?e%=-%no*VTS6mWrE+_@lQR$&?q5E2q)52bjIO)XYCzm9XWq{|_&w;?~j ztH)%(u@h4pKb>6h6oNqBA9t!U7fb3P<;By|f`oAT7@ zZ8RWHF7oc-C0mx>oCFA6b+(#Ukz|f}V@ASUK)F88QYNBJTxY@q%@)u3!`e783*y8+ z)D%9|N8&=@#&Hd+AIpnB*+Sj{HcLTYr!zV4I0x?gymJ*=iHl^?bu){T;io;5^-<9~ zh4*U+BFA6T4+h~-70Tl~tc^(k1DaL4R~=lThiC;U`LcIzE1y7+5&#E5nlsU-rKdS;oq!wDWgs;@!q>ixrt{y(uI&@w&( z&(#76OUIT3fm=uTF_4&KAJj00Ccsi_^e@lrz`lbXK$5eDd}UIk~=pZMyq{nIpuQaj|bAoavjyBK#* z5;~IMikCLd!zKr#@{pPrSCssu*1>^!tuD#B*9#(7_9AH1y4u4HZ#poMmo=@TB& zz|zSeQ3&r<(y@jkl2Cz@=W6JK)OtEFDa2YabydrfZy3Xz2^P$J`f*+;dOVOV=-3kC zwQ%ICe*MRy+pz$QjvlIuUl$smiDKSP-^g;H#E;>P3JQ-kcMpGl{}k;RvM0i-rbbXH zy;t2z2-=|@B&+b)ddr|nO7epM>VuJN^CvF#)HfpL%Oo>) zD>KqzocGh|a{|RVUd`aupp4pxM zMLDN%O-+l#F>{Sn;-K*7p^^OChB4)G2OHnEtkWBEBrNFI))*U2ai%;w*7F@TCb+Pa zP}|TiU>u>;Pj>XW+i47kC6=YO%a@;O;HF`fOxv=A&=7G#K=;!f-@Y4P=DzS(k^c@~ z=u=D?Gwyh$MJRZ$R?*=uwb0PnA_&{9%X%bH3n*p@oxE=o`Y!74p}BdK<{ca`gTu+dbHf&qf6+nPy4LruheuiiRIyCd5u7;fY!U@AFH%&AT2sJg)qJXpJA%e$K z)>jo?8A(h3tjMGvV?*-+n^#zQ$WN<59c)KUxnnU@Do+UA`;Vf4 zv>a3R9H?iSDU?I&ZU(=S3UflN;2zlN4pmJ>t8 zm0@!H!WhfIvke-k1pq4ZjBBr>HJ_m}>fk(wIO^35;6`_Pk-uxF3rMZO%1joSGsDYuW8VhKG^nMLhf_l`ZB2x_pM_jA6OF1sZ-i zW90&g-Ni8AGOtfXhpP%;DAKVw65&{Mh%{|RAJeix4$OO(70*wFFckVA=lYxbo#2vA z>t5Sr~pBZaP#L%oq;njC0fn)g(G_n>xW{ru3ejAA=>($)4pos4o zf$)RKP9oUy;fAqo#)lH1&Fhm?r-NrsvYSqjsXu^$iz`CJ6 z22}!A3t{w;;Xb-nA{G^Le9PY(IG8egcUHd z7pPriGgCy|V>ySmabXsr#P+8%mR7KE-`I9$_n7cwO8&FN3sU7OvZB}~LNh0_H?)uv zUUpEnCLvZS(*;@U6xXwRiL`ClI>Fi0X;m>74%9rD#SB8_rhM zg4!puOs|`!<9N8+Qk_$Pw~7U?ZoMkL11ZQ|VcWLv;@xRafEd*0fM$v@HRVwb?qffD znnLI)@VV8?VQCezLVyE7)1K(5v6I4F^eRewu25vUgkT;V2(x0#=ZCJ|gGkK`G){@? zsNMg|Z8FZkW*irq4?8<@t`2wEy8^O zW{7cv1KZu5Q-n}3bUSvd9y}M1AKeTwZnRI)StD~0;!xBT9O!os8g;YKLCaD=GS_c- zcP_h=#rs91@B3?10&-IM4$%VdvLquioyVK#={4qK+BnGn$?T>qq==!5e?KH}| zJRvOB-qnIOO1!M8r8bh~`T9NCpouKE2EjII)_e$ASr}+-9P*V(&9f7)vr8sm0^Trv zRdWLD^BcbvhYAEGqZOr(96OObGRdIBYiBIR3Zou+N!eI#h@VSIDX8LxpIV@&hX5~T5a{AQwyI#!0dcV2&`=9#APC4xoV^VbF2XT$2a+nWs#SJZJ{r$zeND$Y-z zuA0YxvCLnsZLLW=shTJtTNGSw9Kcmi4x>hJ_t`*Yh5ExW%Y0BOJn0YbW3@P&PO6P3 zi13w%PpIzbxy50J4d6z9c=n4)!M_PIxVHl9?sNC@eP-FY*mT~2(SY( za9_)jgGz0AYUPzz8l9RUWv+N?Kh&2s$nu!#6Kjw;ssH*_=umdRpoLIyPCq1CuwR!@ z(p%D@6tEzYqa3_hT0(COIS63zAYmr*NV9_`qF+IAIb>&8G3uPzT8*%@?)zkQ zxTI`JlIiEfFm1Vcxwu7TgFss5)m;k2 zUG?4VtqI_{RCK-a@tkVj#aa=BM^;vm!gUSCRXgN>d{o~HdI|*Zga-(J%V2aYvY~4? zFt}cfm^ZA%2S|qqqUiMwffk+1LKS5(v*(XGL)qgtPkd$WO5~o)JR}NJrvRoHdkD7o zTt#AAf5m>yEF|?{tgDy@(6f-AD&SY-XgNSs!WY$T9bFpYMstA@LOcevwO?VsBu+X{ z{DxJO zJOVP)zGFDnQgk0?U!$GZl(THV`QCrpT`w>ctm{aR;11gN0u7#mDsdd%HN-wHf(P@w z;xeEdSWc{Ma&mYfQ%?hdJ5!DDaO+6@{j0ck5j!%w9dmEHcY24QSJxz5mD!xAYjq%y zQ}+)`TDI@G@?a~VqQQR866}L6!4aG(|H1w^^UUZ`#zuF20Zlu#HEJ};E-w^phEvYH zq_3-^&tnjV#m{^Ol$&*mGI*r;TLn;#dT!4|gN3+(Ld6tCUy#K51EsHfqF4EGT<@U@ z`VF@7n1}XBE^#T2)X&k}+-btA-e*q*Lnz0kylt1O0%^l}u;m8Rrb_cNcJR`mEWvt~ z;ZYzFW}Ju&!xg>jjtaUCD)Yol!Q|u~=AIzgo`*oK8Av>k&Lx{6LgfIp(6RKFLX#O> zii9rhst*l_!X?Nrt%f=bV;SO{k`cX|4U;#-()IXyYz70$>>`u#>JuUbM~MgqU)OI> zR_X1ExOdlxJ-rR@N`J5nBkrROtLzFgJAUY=#E>f zv0Ap*8SWD5peiHo1p)G&c^bs4U^Hhd0D*GLjJWlb$?+R5QU@hILW!|?-O zOpi>g#jk>m-I}mkypllrJ-snaHg|s)`LrzOd-5Y2F-|W3h-=dKPKkPAgs6U0hfIv$ z^+Hla@4b4WX{-f}k2$8`=CwqbD7zI{n++0p8K#1*1&Wp?)Po{nxZ|Te-APb8h4KDx zk0Ou!Z|a1bg==Jjf7o#_=Ap`)Hf-i==xLjCd{}RYqKd_!ooENnScV)b=Ny!<3{DP{ z8%nr8R5VzPwoUaw?+kfs;ve`Ji1d(POj26p^;W=eFb1TC{)fMrHggD*Dj_aU*Muc6 zR!^e=^U(>%Wr9r4Ftq)ikTGF$;>1el2K&B@+?3;>Hv1Fi+t;X?%c`?au8F&!PnBtk z7iLV)%?jp0L1T&|qeS1=8(&N#N#UJcF;Gje!0g97)H`gD(H~0GtzNfNELN7vsWcx7 zZCK8;Ju5`#jGJRoDL{c$G8`i@bw(F?jxu9~S2ovCui@@&P8n0^+ZE1WX4Y^)6!05K z9=P0|v|Fq`@966?ip%toriqHJG!tH4-)qaUomx$IskEc0JsHWhCv3B&)9U$d?ep`Q zsu}F0E4D1w5LYG19^HGHVeo$``;Uf@EhyacvMJWar-n`-*cii-ys+ajg8m9UY$bG9 z_oR@1tk5hZ8O91Ul8%b40ICVz^TY=yOX6%#1e2D50U~m0#`UIN$V9c?LE{XBFPxPA z#WZ$|fLCmwo8=VlgyKCmsxTYmijZjW&1>vGN{IQB70AR;PUmCuc72hNW*b5SP@hMQ zJGdWfY#SVWGjswq{yff(+L`LOxjT63H;jFd)ddpjM=(}84K;a6*c2WOe(WYfTKxJ* zj+J_yu(MXLm$bHh-glez(D;^ZYeU1M?KOnM?*0Wk7v>#wOk+F-Q<)W=)x;% zGK)%}`w#}RtS}N~ryqEC(EUP=x9z}*w`lVPg*mVDO->RRLP@*9cfONY?mK(d& zwR{-lMgoKx_vIkRKf|W-oom1Q3h>N~^NCUh0dfgO$Bq~I!(Q)y*`2r%VmyY=R)2>n zRZp|NGdh3h?RcQ@Wb!Cj*%-PbU#IB^laRw=zNo~~l=s4j=Gq!1lA}N4((4Q#<{(^+ zyUa3^vxKx&?0Fejak|BtqadiYl&i}r6P1)t$l5(^5jou83{KThOH^t(n=e<)r?>k$ zI^7#@e_n(qFr>s`&&>e9O7&O~GF(5_>37vw-rw4WSIPA8xFO;=mPn4PpdwEqzs_9R zETK91jw;#gguWbZ>WM{ZpL;Y#Eldbwj^amC<8!FM?S<={Y5!%IzOZXRED;oRB6R0k zYRU(4Q?W7Jjn^9BQq!onwF65`1$(RGs$im>8jrTIwDv(M@Fx||qbRLPYgeM(mFLxd z>3bTNZqXst+rf;ze2gfVU8Ut@bsL>49Jlx{Ps6)ciKQyH5LI3#DW&|MSK!l4HRzG;sQbIk0U9iyBOA$2OVyv+*3qms%RI(Z zY){L4t3H8!nfJv@ivnjv8_(@8`YU_X2z<)1g=!_IUF<||CbE!Bno+n*Gy6-b{lgDQ zD0HTd#PD@~^$N9umhl({Xm#yv5m+1sFKKS-toWoD96x?#ot({konG9GcicT03jX7? z_$(Rb3LE}u$kdim`EO6o>6+T~OuN3`DU5Zde;s~~GbhHDFPM*m6A}BZfCgUT?+smu zU?zc%K1H7JjHKz4WhUnk%D9hBqs9AeN&(?D4$shWcNMqZK`?1N_zVe#o4{=#g>o